aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--about.php2
-rw-r--r--action.php2
-rw-r--r--admin.php33
-rw-r--r--admin/album.php2
-rw-r--r--admin/album_notification.php43
-rw-r--r--admin/batch_manager.php207
-rw-r--r--admin/batch_manager_global.php111
-rw-r--r--admin/batch_manager_unit.php8
-rw-r--r--admin/cat_list.php111
-rw-r--r--admin/cat_modify.php41
-rw-r--r--admin/cat_move.php7
-rw-r--r--admin/cat_options.php2
-rw-r--r--admin/cat_perm.php61
-rw-r--r--admin/comments.php118
-rw-r--r--admin/configuration.php39
-rw-r--r--admin/element_set_ranks.php38
-rw-r--r--admin/extend_for_templates.php31
-rw-r--r--admin/group_list.php70
-rw-r--r--admin/group_perm.php25
-rw-r--r--admin/help.php2
-rw-r--r--admin/history.php18
-rw-r--r--admin/include/add_core_tabs.inc.php66
-rw-r--r--admin/include/albums_tab.inc.php2
-rw-r--r--admin/include/c13y_internal.class.php2
-rw-r--r--admin/include/check_integrity.class.php30
-rw-r--r--admin/include/configuration_sizes_process.inc.php7
-rw-r--r--admin/include/configuration_watermark_process.inc.php7
-rw-r--r--admin/include/functions.php741
-rw-r--r--admin/include/functions_history.inc.php40
-rw-r--r--admin/include/functions_install.inc.php6
-rw-r--r--admin/include/functions_metadata.php16
-rw-r--r--admin/include/functions_notification_by_mail.inc.php100
-rw-r--r--admin/include/functions_permalinks.php2
-rw-r--r--admin/include/functions_plugins.inc.php4
-rw-r--r--admin/include/functions_upgrade.php22
-rw-r--r--admin/include/functions_upload.inc.php78
-rw-r--r--admin/include/image.class.php2
-rw-r--r--admin/include/index.php2
-rw-r--r--admin/include/languages.class.php77
-rw-r--r--admin/include/photos_add_direct_prepare.inc.php103
-rw-r--r--admin/include/photos_add_direct_process.inc.php80
-rw-r--r--admin/include/plugins.class.php247
-rw-r--r--admin/include/tabsheet.class.php2
-rw-r--r--admin/include/themes.class.php185
-rw-r--r--admin/include/updates.class.php103
-rw-r--r--admin/include/uploadify/uploadify.php37
-rw-r--r--admin/index.php2
-rw-r--r--admin/intro.php59
-rw-r--r--admin/languages.php2
-rw-r--r--admin/languages_installed.php4
-rw-r--r--admin/languages_new.php29
-rw-r--r--admin/maintenance.php2
-rw-r--r--admin/menubar.php4
-rw-r--r--admin/notification_by_mail.php104
-rw-r--r--admin/permalinks.php10
-rw-r--r--admin/photo.php2
-rw-r--r--admin/photos_add.php10
-rw-r--r--admin/photos_add_applications.php4
-rw-r--r--admin/photos_add_direct.php13
-rw-r--r--admin/photos_add_ftp.php4
-rw-r--r--admin/picture_coi.php2
-rw-r--r--admin/picture_modify.php46
-rw-r--r--admin/plugin.php2
-rw-r--r--admin/plugins.php2
-rw-r--r--admin/plugins_installed.php25
-rw-r--r--admin/plugins_new.php22
-rw-r--r--admin/popuphelp.php2
-rw-r--r--admin/profile.php2
-rw-r--r--admin/rating.php4
-rw-r--r--admin/rating_user.php2
-rw-r--r--admin/site_manager.php20
-rw-r--r--admin/site_reader_local.php15
-rw-r--r--admin/site_update.php205
-rw-r--r--admin/stats.php43
-rw-r--r--admin/tags.php182
-rw-r--r--admin/theme.php2
-rw-r--r--admin/themes.php2
-rw-r--r--admin/themes/clear/icon/index.php2
-rw-r--r--admin/themes/clear/icon/plug_activate.pngbin410 -> 0 bytes
-rw-r--r--admin/themes/clear/icon/plug_activate_grey.pngbin364 -> 0 bytes
-rw-r--r--admin/themes/clear/icon/plug_deactivate.pngbin441 -> 0 bytes
-rw-r--r--admin/themes/clear/icon/plug_deactivate_grey.pngbin371 -> 0 bytes
-rw-r--r--admin/themes/clear/icon/plug_delete.pngbin386 -> 0 bytes
-rw-r--r--admin/themes/clear/icon/plug_delete_grey.pngbin386 -> 0 bytes
-rw-r--r--admin/themes/clear/icon/plug_install.pngbin386 -> 0 bytes
-rw-r--r--admin/themes/clear/icon/plug_install_grey.pngbin344 -> 0 bytes
-rw-r--r--admin/themes/clear/icon/plug_uninstall.pngbin406 -> 0 bytes
-rw-r--r--admin/themes/clear/icon/plug_uninstall_grey.pngbin363 -> 0 bytes
-rw-r--r--admin/themes/clear/icon/ranks.pngbin682 -> 0 bytes
-rw-r--r--admin/themes/clear/icon/ranks_grey.pngbin421 -> 0 bytes
-rw-r--r--admin/themes/clear/icon/sync_metadata.pngbin1530 -> 0 bytes
-rw-r--r--admin/themes/clear/icon/sync_metadata_pink.pngbin1639 -> 0 bytes
-rw-r--r--admin/themes/clear/icon/synchronize.pngbin1758 -> 0 bytes
-rw-r--r--admin/themes/clear/index.php2
-rw-r--r--admin/themes/clear/theme.css109
-rw-r--r--admin/themes/default/fix-ie7.css3
-rw-r--r--admin/themes/default/fontello/LICENSE.txt66
-rw-r--r--admin/themes/default/fontello/README.txt75
-rw-r--r--admin/themes/default/fontello/config.json364
-rw-r--r--admin/themes/default/fontello/css/animation.css85
-rw-r--r--admin/themes/default/fontello/css/fontello-codes.css62
-rw-r--r--admin/themes/default/fontello/css/fontello-embedded.css115
-rw-r--r--admin/themes/default/fontello/css/fontello-ie7-codes.css60
-rw-r--r--admin/themes/default/fontello/css/fontello-ie7.css71
-rw-r--r--admin/themes/default/fontello/css/fontello.css113
-rw-r--r--admin/themes/default/fontello/demo.html355
-rw-r--r--admin/themes/default/fontello/font/fontello.eotbin0 -> 21572 bytes
-rw-r--r--admin/themes/default/fontello/font/fontello.svg70
-rw-r--r--admin/themes/default/fontello/font/fontello.ttfbin0 -> 21404 bytes
-rw-r--r--admin/themes/default/fontello/font/fontello.woffbin0 -> 13968 bytes
-rw-r--r--admin/themes/default/icon/index.php2
-rw-r--r--admin/themes/default/icon/plug_activate.pngbin432 -> 0 bytes
-rw-r--r--admin/themes/default/icon/plug_activate_grey.pngbin388 -> 0 bytes
-rw-r--r--admin/themes/default/icon/plug_deactivate.pngbin475 -> 0 bytes
-rw-r--r--admin/themes/default/icon/plug_deactivate_grey.pngbin399 -> 0 bytes
-rw-r--r--admin/themes/default/icon/plug_delete.pngbin425 -> 0 bytes
-rw-r--r--admin/themes/default/icon/plug_delete_grey.pngbin436 -> 0 bytes
-rw-r--r--admin/themes/default/icon/plug_install.pngbin417 -> 0 bytes
-rw-r--r--admin/themes/default/icon/plug_install_grey.pngbin376 -> 0 bytes
-rw-r--r--admin/themes/default/icon/plug_uninstall.pngbin429 -> 0 bytes
-rw-r--r--admin/themes/default/icon/plug_uninstall_grey.pngbin387 -> 0 bytes
-rw-r--r--admin/themes/default/icon/ranks.pngbin772 -> 0 bytes
-rw-r--r--admin/themes/default/icon/ranks_grey.pngbin762 -> 0 bytes
-rw-r--r--admin/themes/default/icon/sync_metadata.pngbin1877 -> 0 bytes
-rw-r--r--admin/themes/default/icon/sync_metadata_pink.pngbin1949 -> 0 bytes
-rw-r--r--admin/themes/default/icon/synchronize.pngbin782 -> 0 bytes
-rw-r--r--admin/themes/default/images/jgrowl-alert.pngbin2596 -> 0 bytes
-rw-r--r--admin/themes/default/images/jgrowl-check.pngbin2412 -> 0 bytes
-rw-r--r--admin/themes/default/images/jgrowl-error.pngbin2446 -> 0 bytes
-rw-r--r--admin/themes/default/index.php2
-rw-r--r--admin/themes/default/js/common.js55
-rw-r--r--admin/themes/default/js/jquery.geoip.js62
-rw-r--r--admin/themes/default/js/menu_icons.js11
-rw-r--r--admin/themes/default/template/admin.tpl109
-rw-r--r--admin/themes/default/template/batch_manager_global.tpl73
-rw-r--r--admin/themes/default/template/batch_manager_unit.tpl3
-rw-r--r--admin/themes/default/template/cat_list.tpl28
-rw-r--r--admin/themes/default/template/cat_modify.tpl18
-rw-r--r--admin/themes/default/template/cat_perm.tpl4
-rw-r--r--admin/themes/default/template/comments.tpl24
-rw-r--r--admin/themes/default/template/configuration.tpl490
-rw-r--r--admin/themes/default/template/element_set_ranks.tpl6
-rw-r--r--admin/themes/default/template/extend_for_templates.tpl8
-rw-r--r--admin/themes/default/template/group_list.tpl100
-rw-r--r--admin/themes/default/template/header.tpl15
-rw-r--r--admin/themes/default/template/history.tpl64
-rw-r--r--admin/themes/default/template/include/add_album.inc.tpl110
-rw-r--r--admin/themes/default/template/install.tpl29
-rw-r--r--admin/themes/default/template/intro.tpl9
-rw-r--r--admin/themes/default/template/menubar.tpl2
-rw-r--r--admin/themes/default/template/notification_by_mail.tpl14
-rw-r--r--admin/themes/default/template/photos_add_direct.tpl24
-rw-r--r--admin/themes/default/template/picture_modify.tpl13
-rw-r--r--admin/themes/default/template/plugins_installed.tpl4
-rw-r--r--admin/themes/default/template/plugins_new.tpl2
-rw-r--r--admin/themes/default/template/profile_content.tpl2
-rw-r--r--admin/themes/default/template/tags.tpl151
-rw-r--r--admin/themes/default/template/themes_installed.tpl120
-rw-r--r--admin/themes/default/template/updates_ext.tpl8
-rw-r--r--admin/themes/default/template/updates_pwg.tpl14
-rw-r--r--admin/themes/default/template/upgrade.tpl9
-rw-r--r--admin/themes/default/template/user_list.tpl1327
-rw-r--r--admin/themes/default/theme.css191
-rw-r--r--admin/themes/roma/index.php2
-rw-r--r--admin/themes/roma/theme.css124
-rw-r--r--admin/themes_installed.php84
-rw-r--r--admin/themes_new.php31
-rw-r--r--admin/updates.php4
-rw-r--r--admin/updates_ext.php8
-rw-r--r--admin/updates_pwg.php6
-rw-r--r--admin/user_list.php725
-rw-r--r--admin/user_list_backend.php182
-rw-r--r--admin/user_perm.php21
-rw-r--r--category.php2
-rw-r--r--comments.php123
-rw-r--r--doc/index.php2
-rw-r--r--feed.php4
-rw-r--r--galleries/index.php2
-rw-r--r--i.php34
-rw-r--r--identification.php11
-rw-r--r--include/block.class.php201
-rw-r--r--include/calendar_base.class.php88
-rw-r--r--include/calendar_monthly.class.php717
-rw-r--r--include/calendar_weekly.class.php135
-rw-r--r--include/category_cats.inc.php91
-rw-r--r--include/category_default.inc.php4
-rw-r--r--include/class_smtp_mail.inc.php185
-rw-r--r--include/common.inc.php5
-rw-r--r--include/config_default.inc.php92
-rw-r--r--include/constants.php4
-rw-r--r--include/cssmin.class.php2
-rw-r--r--include/dblayer/functions_mysql.inc.php48
-rw-r--r--include/dblayer/functions_mysqli.inc.php71
-rw-r--r--include/derivative.inc.php187
-rw-r--r--include/derivative_params.inc.php181
-rw-r--r--include/derivative_std_params.inc.php85
-rw-r--r--include/emogrifier.class.php404
-rw-r--r--include/filter.inc.php7
-rw-r--r--include/functions.inc.php1029
-rw-r--r--include/functions_calendar.inc.php18
-rw-r--r--include/functions_category.inc.php254
-rw-r--r--include/functions_comment.inc.php173
-rw-r--r--include/functions_cookie.inc.php38
-rw-r--r--include/functions_filter.inc.php12
-rw-r--r--include/functions_html.inc.php218
-rw-r--r--include/functions_mail.inc.php1032
-rw-r--r--include/functions_metadata.inc.php117
-rw-r--r--include/functions_notification.inc.php447
-rw-r--r--include/functions_picture.inc.php51
-rw-r--r--include/functions_plugins.inc.php275
-rw-r--r--include/functions_rate.inc.php30
-rw-r--r--include/functions_search.inc.php184
-rw-r--r--include/functions_session.inc.php135
-rw-r--r--include/functions_tag.inc.php142
-rw-r--r--include/functions_url.inc.php64
-rw-r--r--include/functions_user.inc.php761
-rw-r--r--include/index.php2
-rw-r--r--include/menubar.inc.php26
-rw-r--r--include/no_photo_yet.inc.php6
-rw-r--r--include/page_header.php2
-rw-r--r--include/page_tail.php2
-rw-r--r--include/passwordhash.class.php2
-rw-r--r--include/php_compat/index.php2
-rw-r--r--include/php_compat/json_encode.php2
-rw-r--r--include/php_compat/preg_last_error.php2
-rw-r--r--include/phpmailer/PHPMailerAutoload.php33
-rw-r--r--include/phpmailer/class.phpmailer.php3268
-rw-r--r--include/phpmailer/class.smtp.php943
-rw-r--r--include/picture_comment.inc.php8
-rw-r--r--include/picture_metadata.inc.php2
-rw-r--r--include/picture_rate.inc.php2
-rw-r--r--include/section_init.inc.php29
-rw-r--r--include/smarty/COPYING.lib615
-rw-r--r--include/smarty/NEWS1067
-rw-r--r--include/smarty/README618
-rw-r--r--include/smarty/SMARTY_2_BC_NOTES.txt109
-rw-r--r--include/smarty/SMARTY_3.0_BC_NOTES.txt24
-rw-r--r--include/smarty/SMARTY_3.1_NOTES.txt306
-rw-r--r--include/smarty/change_log.txt2153
-rw-r--r--include/smarty/libs/Config_File.class.php393
-rw-r--r--include/smarty/libs/Smarty.class.php2458
-rw-r--r--include/smarty/libs/SmartyBC.class.php460
-rw-r--r--include/smarty/libs/Smarty_Compiler.class.php2365
-rw-r--r--include/smarty/libs/debug.tpl78
-rw-r--r--include/smarty/libs/internals/core.assemble_plugin_filepath.php67
-rw-r--r--include/smarty/libs/internals/core.assign_smarty_interface.php43
-rw-r--r--include/smarty/libs/internals/core.create_dir_structure.php79
-rw-r--r--include/smarty/libs/internals/core.display_debug_console.php61
-rw-r--r--include/smarty/libs/internals/core.get_include_path.php44
-rw-r--r--include/smarty/libs/internals/core.get_microtime.php23
-rw-r--r--include/smarty/libs/internals/core.get_php_resource.php80
-rw-r--r--include/smarty/libs/internals/core.is_secure.php59
-rw-r--r--include/smarty/libs/internals/core.is_trusted.php47
-rw-r--r--include/smarty/libs/internals/core.load_plugins.php125
-rw-r--r--include/smarty/libs/internals/core.load_resource_plugin.php74
-rw-r--r--include/smarty/libs/internals/core.process_cached_inserts.php71
-rw-r--r--include/smarty/libs/internals/core.process_compiled_include.php37
-rw-r--r--include/smarty/libs/internals/core.read_cache_file.php101
-rw-r--r--include/smarty/libs/internals/core.rm_auto.php71
-rw-r--r--include/smarty/libs/internals/core.rmdir.php54
-rw-r--r--include/smarty/libs/internals/core.run_insert_handler.php71
-rw-r--r--include/smarty/libs/internals/core.smarty_include_php.php50
-rw-r--r--include/smarty/libs/internals/core.write_cache_file.php96
-rw-r--r--include/smarty/libs/internals/core.write_compiled_include.php91
-rw-r--r--include/smarty/libs/internals/core.write_compiled_resource.php35
-rw-r--r--include/smarty/libs/internals/core.write_file.php54
-rw-r--r--include/smarty/libs/plugins/block.textformat.php76
-rw-r--r--include/smarty/libs/plugins/compiler.assign.php40
-rw-r--r--include/smarty/libs/plugins/function.assign_debug_info.php40
-rw-r--r--include/smarty/libs/plugins/function.config_load.php142
-rw-r--r--include/smarty/libs/plugins/function.counter.php18
-rw-r--r--include/smarty/libs/plugins/function.cycle.php66
-rw-r--r--include/smarty/libs/plugins/function.debug.php35
-rw-r--r--include/smarty/libs/plugins/function.eval.php49
-rw-r--r--include/smarty/libs/plugins/function.fetch.php345
-rw-r--r--include/smarty/libs/plugins/function.html_checkboxes.php180
-rw-r--r--include/smarty/libs/plugins/function.html_image.php157
-rw-r--r--include/smarty/libs/plugins/function.html_options.php201
-rw-r--r--include/smarty/libs/plugins/function.html_radios.php209
-rw-r--r--include/smarty/libs/plugins/function.html_select_date.php537
-rw-r--r--include/smarty/libs/plugins/function.html_select_time.php430
-rw-r--r--include/smarty/libs/plugins/function.html_table.php92
-rw-r--r--include/smarty/libs/plugins/function.mailto.php145
-rw-r--r--include/smarty/libs/plugins/function.math.php54
-rw-r--r--include/smarty/libs/plugins/function.popup.php119
-rw-r--r--include/smarty/libs/plugins/function.popup_init.php40
-rw-r--r--include/smarty/libs/plugins/modifier.capitalize.php76
-rw-r--r--include/smarty/libs/plugins/modifier.cat.php33
-rw-r--r--include/smarty/libs/plugins/modifier.count_characters.php32
-rw-r--r--include/smarty/libs/plugins/modifier.count_paragraphs.php29
-rw-r--r--include/smarty/libs/plugins/modifier.count_sentences.php29
-rw-r--r--include/smarty/libs/plugins/modifier.count_words.php33
-rw-r--r--include/smarty/libs/plugins/modifier.date_format.php79
-rw-r--r--include/smarty/libs/plugins/modifier.debug_print_var.php79
-rw-r--r--include/smarty/libs/plugins/modifier.default.php32
-rw-r--r--include/smarty/libs/plugins/modifier.escape.php175
-rw-r--r--include/smarty/libs/plugins/modifier.indent.php28
-rw-r--r--include/smarty/libs/plugins/modifier.lower.php26
-rw-r--r--include/smarty/libs/plugins/modifier.nl2br.php35
-rw-r--r--include/smarty/libs/plugins/modifier.regex_replace.php41
-rw-r--r--include/smarty/libs/plugins/modifier.replace.php31
-rw-r--r--include/smarty/libs/plugins/modifier.spacify.php25
-rw-r--r--include/smarty/libs/plugins/modifier.string_format.php29
-rw-r--r--include/smarty/libs/plugins/modifier.strip.php33
-rw-r--r--include/smarty/libs/plugins/modifier.strip_tags.php32
-rw-r--r--include/smarty/libs/plugins/modifier.truncate.php69
-rw-r--r--include/smarty/libs/plugins/modifier.upper.php26
-rw-r--r--include/smarty/libs/plugins/modifier.wordwrap.php29
-rw-r--r--include/smarty/libs/plugins/modifiercompiler.cat.php30
-rw-r--r--include/smarty/libs/plugins/modifiercompiler.count_characters.php33
-rw-r--r--include/smarty/libs/plugins/modifiercompiler.count_paragraphs.php28
-rw-r--r--include/smarty/libs/plugins/modifiercompiler.count_sentences.php28
-rw-r--r--include/smarty/libs/plugins/modifiercompiler.count_words.php32
-rw-r--r--include/smarty/libs/plugins/modifiercompiler.default.php35
-rw-r--r--include/smarty/libs/plugins/modifiercompiler.escape.php125
-rw-r--r--include/smarty/libs/plugins/modifiercompiler.from_charset.php34
-rw-r--r--include/smarty/libs/plugins/modifiercompiler.indent.php32
-rw-r--r--include/smarty/libs/plugins/modifiercompiler.lower.php31
-rw-r--r--include/smarty/libs/plugins/modifiercompiler.noprint.php25
-rw-r--r--include/smarty/libs/plugins/modifiercompiler.string_format.php26
-rw-r--r--include/smarty/libs/plugins/modifiercompiler.strip.php33
-rw-r--r--include/smarty/libs/plugins/modifiercompiler.strip_tags.php33
-rw-r--r--include/smarty/libs/plugins/modifiercompiler.to_charset.php34
-rw-r--r--include/smarty/libs/plugins/modifiercompiler.unescape.php51
-rw-r--r--include/smarty/libs/plugins/modifiercompiler.upper.php30
-rw-r--r--include/smarty/libs/plugins/modifiercompiler.wordwrap.php46
-rw-r--r--include/smarty/libs/plugins/outputfilter.trimwhitespace.php127
-rw-r--r--include/smarty/libs/plugins/shared.escape_special_chars.php68
-rw-r--r--include/smarty/libs/plugins/shared.literal_compiler_param.php33
-rw-r--r--include/smarty/libs/plugins/shared.make_timestamp.php36
-rw-r--r--include/smarty/libs/plugins/shared.mb_str_replace.php55
-rw-r--r--include/smarty/libs/plugins/shared.mb_unicode.php48
-rw-r--r--include/smarty/libs/plugins/shared.mb_wordwrap.php83
-rw-r--r--include/smarty/libs/plugins/variablefilter.htmlspecialchars.php21
-rw-r--r--include/smarty/libs/sysplugins/smarty_cacheresource.php381
-rw-r--r--include/smarty/libs/sysplugins/smarty_cacheresource_custom.php237
-rw-r--r--include/smarty/libs/sysplugins/smarty_cacheresource_keyvaluestore.php463
-rw-r--r--include/smarty/libs/sysplugins/smarty_config_source.php95
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_cacheresource_file.php266
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_append.php53
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_assign.php88
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_block.php282
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_break.php77
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_call.php130
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_capture.php98
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_config_load.php85
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_continue.php78
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_debug.php43
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_eval.php73
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_extends.php133
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_for.php151
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_foreach.php231
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_function.php166
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_if.php207
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_include.php215
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_include_php.php108
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_insert.php142
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_ldelim.php41
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_nocache.php73
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_private_block_plugin.php87
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_private_function_plugin.php73
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_private_modifier.php140
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_private_object_block_function.php88
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_private_object_function.php79
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_private_print_expression.php156
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_private_registered_block.php113
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_private_registered_function.php81
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_private_special_variable.php111
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_rdelim.php41
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_section.php203
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_setfilter.php72
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compile_while.php94
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_compilebase.php176
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_config.php302
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_config_file_compiler.php144
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_configfilelexer.php622
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_configfileparser.php921
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_data.php556
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_debug.php206
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_filter_handler.php70
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_function_call_handler.php55
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_get_include_path.php48
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_nocache_insert.php53
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_parsetree.php395
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_resource_eval.php94
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_resource_extends.php162
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_resource_file.php90
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_resource_php.php114
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_resource_registered.php95
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_resource_stream.php78
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_resource_string.php96
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php127
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_template.php692
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_templatebase.php811
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php670
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_templatelexer.php1203
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_templateparser.php3254
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_utility.php830
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_write_file.php88
-rw-r--r--include/smarty/libs/sysplugins/smarty_resource.php857
-rw-r--r--include/smarty/libs/sysplugins/smarty_resource_custom.php96
-rw-r--r--include/smarty/libs/sysplugins/smarty_resource_recompiled.php36
-rw-r--r--include/smarty/libs/sysplugins/smarty_resource_uncompiled.php44
-rw-r--r--include/smarty/libs/sysplugins/smarty_security.php459
-rw-r--r--include/template.class.php1275
-rw-r--r--include/user.inc.php5
-rw-r--r--include/ws_core.inc.php399
-rw-r--r--include/ws_functions.inc.php3278
-rw-r--r--include/ws_functions/index.php30
-rw-r--r--include/ws_functions/pwg.categories.php838
-rw-r--r--include/ws_functions/pwg.extensions.php343
-rw-r--r--include/ws_functions/pwg.groups.php293
-rw-r--r--include/ws_functions/pwg.images.php1582
-rw-r--r--include/ws_functions/pwg.permissions.php235
-rw-r--r--include/ws_functions/pwg.php338
-rw-r--r--include/ws_functions/pwg.tags.php244
-rw-r--r--include/ws_functions/pwg.users.php571
-rw-r--r--include/ws_protocols/index.php2
-rw-r--r--include/ws_protocols/json_encoder.php2
-rw-r--r--include/ws_protocols/php_encoder.php2
-rw-r--r--include/ws_protocols/rest_encoder.php12
-rw-r--r--include/ws_protocols/rest_handler.php4
-rw-r--r--include/ws_protocols/xmlrpc_encoder.php2
-rw-r--r--index.php364
-rw-r--r--install.php57
-rw-r--r--install/config.sql1
-rw-r--r--install/db/100-database.php2
-rw-r--r--install/db/101-database.php2
-rw-r--r--install/db/102-database.php2
-rw-r--r--install/db/103-database.php2
-rw-r--r--install/db/104-database.php2
-rw-r--r--install/db/105-database.php2
-rw-r--r--install/db/106-database.php2
-rw-r--r--install/db/107-database.php2
-rw-r--r--install/db/108-database.php2
-rw-r--r--install/db/109-database.php2
-rw-r--r--install/db/110-database.php2
-rw-r--r--install/db/111-database.php2
-rw-r--r--install/db/112-database.php2
-rw-r--r--install/db/113-database.php2
-rw-r--r--install/db/114-database.php2
-rw-r--r--install/db/115-database.php2
-rw-r--r--install/db/116-database.php2
-rw-r--r--install/db/117-database.php2
-rw-r--r--install/db/118-database.php2
-rw-r--r--install/db/119-database.php2
-rw-r--r--install/db/120-database.php2
-rw-r--r--install/db/121-database.php2
-rw-r--r--install/db/122-database.php2
-rw-r--r--install/db/123-database.php2
-rw-r--r--install/db/124-database.php2
-rw-r--r--install/db/125-database.php2
-rw-r--r--install/db/126-database.php2
-rw-r--r--install/db/127-database.php2
-rw-r--r--install/db/128-database.php2
-rw-r--r--install/db/129-database.php2
-rw-r--r--install/db/130-database.php2
-rw-r--r--install/db/131-database.php2
-rw-r--r--install/db/132-database.php2
-rw-r--r--install/db/133-database.php2
-rw-r--r--install/db/134-database.php2
-rw-r--r--install/db/135-database.php47
-rw-r--r--install/db/136-database.php37
-rw-r--r--install/db/137-database.php62
-rw-r--r--install/db/138-database.php35
-rw-r--r--install/db/139-database.php64
-rw-r--r--install/db/61-database.php2
-rw-r--r--install/db/62-database.php2
-rw-r--r--install/db/63-database.php2
-rw-r--r--install/db/64-database.php2
-rw-r--r--install/db/65-database.php2
-rw-r--r--install/db/66-database.php2
-rw-r--r--install/db/67-database.php2
-rw-r--r--install/db/68-database.php2
-rw-r--r--install/db/69-database.php2
-rw-r--r--install/db/70-database.php2
-rw-r--r--install/db/71-database.php2
-rw-r--r--install/db/72-database.php2
-rw-r--r--install/db/73-database.php2
-rw-r--r--install/db/74-database.php2
-rw-r--r--install/db/75-database.php2
-rw-r--r--install/db/76-database.php2
-rw-r--r--install/db/77-database.php2
-rw-r--r--install/db/78-database.php2
-rw-r--r--install/db/79-database.php2
-rw-r--r--install/db/80-database.php2
-rw-r--r--install/db/81-database.php2
-rw-r--r--install/db/82-database.php2
-rw-r--r--install/db/83-database.php2
-rw-r--r--install/db/84-database.php2
-rw-r--r--install/db/85-database.php2
-rw-r--r--install/db/86-database.php2
-rw-r--r--install/db/87-database.php2
-rw-r--r--install/db/88-database.php2
-rw-r--r--install/db/89-database.php2
-rw-r--r--install/db/90-database.php2
-rw-r--r--install/db/91-database.php2
-rw-r--r--install/db/92-database.php2
-rw-r--r--install/db/93-database.php2
-rw-r--r--install/db/94-database.php2
-rw-r--r--install/db/95-database.php2
-rw-r--r--install/db/96-database.php2
-rw-r--r--install/db/97-database.php2
-rw-r--r--install/db/98-database.php2
-rw-r--r--install/db/99-database.php2
-rw-r--r--install/db/index.php2
-rw-r--r--install/hosting.php2
-rw-r--r--install/index.php2
-rw-r--r--install/php5_apache_configuration.php2
-rw-r--r--install/piwigo_structure-mysql.sql13
-rw-r--r--install/upgrade_1.3.0.php2
-rw-r--r--install/upgrade_1.3.1.php2
-rw-r--r--install/upgrade_1.4.0.php2
-rw-r--r--install/upgrade_1.5.0.php2
-rw-r--r--install/upgrade_1.6.0.php2
-rw-r--r--install/upgrade_1.6.2.php2
-rw-r--r--install/upgrade_1.7.0.php2
-rw-r--r--install/upgrade_2.0.0.php2
-rw-r--r--install/upgrade_2.1.0.php2
-rw-r--r--install/upgrade_2.2.0.php2
-rw-r--r--install/upgrade_2.3.0.php2
-rw-r--r--install/upgrade_2.4.0.php4
-rw-r--r--install/upgrade_2.5.0.php125
-rw-r--r--language/af_ZA/admin.lang.php5
-rw-r--r--language/af_ZA/common.lang.php16
-rwxr-xr-xlanguage/af_ZA/help/search.html19
-rw-r--r--language/af_ZA/index.php2
-rw-r--r--language/af_ZA/install.lang.php10
-rw-r--r--language/af_ZA/upgrade.lang.php2
-rw-r--r--language/ar_MA/ar_MA.jpgbin0 -> 684 bytes
-rw-r--r--language/ar_MA/common.lang.php39
-rw-r--r--language/ar_MA/index.php30
-rw-r--r--language/ar_MA/iso.txt1
-rw-r--r--language/ar_SA/admin.lang.php34
-rw-r--r--language/ar_SA/common.lang.php14
-rw-r--r--language/ar_SA/index.php2
-rw-r--r--language/ar_SA/install.lang.php10
-rw-r--r--language/ar_SA/upgrade.lang.php2
-rw-r--r--language/az_AZ/common.lang.php17
-rw-r--r--language/bg_BG/admin.lang.php32
-rw-r--r--language/bg_BG/common.lang.php16
-rwxr-xr-xlanguage/bg_BG/help/cat_modify.html106
-rwxr-xr-xlanguage/bg_BG/help/cat_move.html14
-rwxr-xr-xlanguage/bg_BG/help/cat_options.html21
-rwxr-xr-xlanguage/bg_BG/help/synchronize.html14
-rwxr-xr-xlanguage/bg_BG/help/user_list.html23
-rw-r--r--language/bg_BG/index.php2
-rw-r--r--language/bg_BG/install.lang.php12
-rw-r--r--language/bg_BG/upgrade.lang.php2
-rw-r--r--language/bn_IN/common.lang.php2
-rw-r--r--language/br_FR/about.html5
-rwxr-xr-xlanguage/br_FR/admin.lang.php156
-rw-r--r--language/br_FR/br_FR.jpgbin0 -> 827 bytes
-rw-r--r--language/br_FR/common.lang.php421
-rwxr-xr-xlanguage/br_FR/install.lang.php67
-rw-r--r--language/br_FR/iso.txt1
-rwxr-xr-xlanguage/br_FR/upgrade.lang.php40
-rw-r--r--language/ca_ES/admin.lang.php52
-rw-r--r--language/ca_ES/common.lang.php24
-rwxr-xr-xlanguage/ca_ES/help/search.html46
-rw-r--r--language/ca_ES/install.lang.php11
-rw-r--r--language/ca_ES/upgrade.lang.php2
-rw-r--r--language/cs_CZ/admin.lang.php107
-rw-r--r--language/cs_CZ/common.lang.php46
-rw-r--r--language/cs_CZ/help/index.php2
-rw-r--r--language/cs_CZ/index.php2
-rw-r--r--language/cs_CZ/install.lang.php8
-rw-r--r--language/cs_CZ/upgrade.lang.php2
-rw-r--r--language/da_DK/about.html11
-rw-r--r--language/da_DK/admin.lang.php96
-rw-r--r--language/da_DK/common.lang.php18
-rwxr-xr-xlanguage/da_DK/help/photos_add_ftp.html8
-rw-r--r--language/da_DK/index.php2
-rw-r--r--language/da_DK/install.lang.php12
-rw-r--r--language/da_DK/upgrade.lang.php2
-rw-r--r--language/de_DE/admin.lang.php39
-rw-r--r--language/de_DE/common.lang.php14
-rw-r--r--language/de_DE/help/index.php2
-rw-r--r--language/de_DE/index.php2
-rw-r--r--language/de_DE/install.lang.php15
-rw-r--r--language/de_DE/upgrade.lang.php2
-rw-r--r--language/dv_MV/common.lang.php4
-rw-r--r--language/dv_MV/index.php4
-rw-r--r--language/el_GR/admin.lang.php36
-rw-r--r--language/el_GR/common.lang.php14
-rw-r--r--language/el_GR/index.php4
-rw-r--r--language/el_GR/install.lang.php14
-rwxr-xr-xlanguage/el_GR/upgrade.lang.php2
-rw-r--r--language/en_GB/about.html5
-rw-r--r--language/en_GB/admin.lang.php148
-rw-r--r--language/en_GB/common.lang.php70
-rw-r--r--language/en_GB/en_GB.jpgbin0 -> 1278 bytes
-rw-r--r--language/en_GB/index.php30
-rw-r--r--language/en_GB/iso.txt1
-rw-r--r--language/en_UK/admin.lang.php54
-rw-r--r--language/en_UK/common.lang.php16
-rw-r--r--language/en_UK/help/index.php2
-rw-r--r--language/en_UK/index.php2
-rw-r--r--language/en_UK/install.lang.php16
-rw-r--r--language/en_UK/upgrade.lang.php2
-rw-r--r--language/en_US/common.lang.php39
-rw-r--r--language/en_US/en_US.jpgbin0 -> 1068 bytes
-rw-r--r--language/en_US/index.php30
-rw-r--r--language/en_US/iso.txt1
-rw-r--r--language/eo_EO/admin.lang.php918
-rw-r--r--language/eo_EO/common.lang.php112
-rwxr-xr-xlanguage/eo_EO/help/cat_modify.html132
-rwxr-xr-xlanguage/eo_EO/help/cat_move.html16
-rwxr-xr-xlanguage/eo_EO/help/cat_options.html22
-rwxr-xr-xlanguage/eo_EO/help/cat_perm.html13
-rwxr-xr-xlanguage/eo_EO/help/group_list.html22
-rwxr-xr-xlanguage/eo_EO/help/help_groups.html11
-rwxr-xr-xlanguage/eo_EO/help/user_list.html23
-rwxr-xr-xlanguage/eo_EO/install.lang.php68
-rwxr-xr-xlanguage/eo_EO/upgrade.lang.php40
-rw-r--r--language/es_AR/common.lang.php15
-rw-r--r--language/es_AR/index.php2
-rw-r--r--language/es_ES/about.html20
-rw-r--r--language/es_ES/admin.lang.php64
-rw-r--r--language/es_ES/common.lang.php26
-rw-r--r--language/es_ES/help/configuration.html93
-rw-r--r--language/es_ES/help/index.php2
-rw-r--r--language/es_ES/help/photos_add_ftp.html98
-rw-r--r--language/es_ES/index.php2
-rw-r--r--language/es_ES/install.lang.php17
-rw-r--r--language/es_ES/upgrade.lang.php29
-rw-r--r--language/et_EE/admin.lang.php36
-rw-r--r--language/et_EE/common.lang.php20
-rwxr-xr-xlanguage/et_EE/help/group_list.html22
-rwxr-xr-xlanguage/et_EE/install.lang.php10
-rwxr-xr-xlanguage/et_EE/upgrade.lang.php2
-rw-r--r--language/fa_IR/admin.lang.php34
-rw-r--r--language/fa_IR/common.lang.php71
-rwxr-xr-xlanguage/fa_IR/help/cat_modify.html133
-rwxr-xr-xlanguage/fa_IR/help/cat_move.html14
-rwxr-xr-xlanguage/fa_IR/help/cat_options.html22
-rw-r--r--language/fa_IR/index.php2
-rw-r--r--language/fa_IR/install.lang.php11
-rw-r--r--language/fa_IR/iso.txt2
-rw-r--r--language/fa_IR/upgrade.lang.php16
-rwxr-xr-xlanguage/fi_FI/admin.lang.php323
-rw-r--r--language/fi_FI/common.lang.php16
-rwxr-xr-xlanguage/fi_FI/install.lang.php10
-rwxr-xr-xlanguage/fi_FI/upgrade.lang.php2
-rw-r--r--language/fr_CA/admin.lang.php33
-rw-r--r--language/fr_CA/common.lang.php16
-rw-r--r--language/fr_CA/help/index.php2
-rw-r--r--language/fr_CA/index.php2
-rw-r--r--language/fr_CA/install.lang.php12
-rw-r--r--language/fr_CA/upgrade.lang.php2
-rw-r--r--language/fr_FR/admin.lang.php34
-rw-r--r--language/fr_FR/common.lang.php18
-rw-r--r--language/fr_FR/help/index.php2
-rw-r--r--language/fr_FR/index.php2
-rw-r--r--language/fr_FR/install.lang.php15
-rw-r--r--language/fr_FR/upgrade.lang.php2
-rw-r--r--language/ga_IE/common.lang.php83
-rw-r--r--language/ga_IE/ga_IE.jpgbin0 -> 1040 bytes
-rw-r--r--language/ga_IE/iso.txt1
-rwxr-xr-xlanguage/gl_ES/admin.lang.php42
-rw-r--r--language/gl_ES/common.lang.php16
-rwxr-xr-xlanguage/gl_ES/help/configuration.html96
-rwxr-xr-xlanguage/gl_ES/help/extend_for_templates.html51
-rwxr-xr-xlanguage/gl_ES/install.lang.php48
-rwxr-xr-xlanguage/gl_ES/upgrade.lang.php42
-rw-r--r--language/he_IL/admin.lang.php12
-rw-r--r--language/he_IL/common.lang.php8
-rw-r--r--language/he_IL/install.lang.php10
-rw-r--r--language/he_IL/upgrade.lang.php9
-rw-r--r--language/hr_HR/admin.lang.php4
-rw-r--r--language/hr_HR/common.lang.php8
-rw-r--r--language/hr_HR/help/index.php2
-rw-r--r--language/hr_HR/index.php2
-rw-r--r--language/hr_HR/install.lang.php9
-rw-r--r--language/hr_HR/upgrade.lang.php2
-rw-r--r--language/hu_HU/admin.lang.php28
-rw-r--r--language/hu_HU/common.lang.php14
-rw-r--r--language/hu_HU/help/index.php2
-rw-r--r--language/hu_HU/index.php2
-rw-r--r--language/hu_HU/install.lang.php11
-rw-r--r--language/hu_HU/upgrade.lang.php2
-rw-r--r--language/id_ID/common.lang.php419
-rw-r--r--language/id_ID/id_ID.jpgbin0 -> 998 bytes
-rw-r--r--language/id_ID/index.php30
-rw-r--r--language/id_ID/iso.txt1
-rw-r--r--language/index.php2
-rw-r--r--language/is_IS/common.lang.php8
-rw-r--r--language/is_IS/index.php2
-rw-r--r--language/it_IT/admin.lang.php39
-rw-r--r--language/it_IT/common.lang.php124
-rw-r--r--language/it_IT/help/index.php2
-rw-r--r--language/it_IT/index.php2
-rw-r--r--language/it_IT/install.lang.php13
-rw-r--r--language/it_IT/upgrade.lang.php5
-rw-r--r--language/ja_JP/admin.lang.php20
-rw-r--r--language/ja_JP/common.lang.php23
-rw-r--r--language/ja_JP/index.php2
-rw-r--r--language/ja_JP/install.lang.php11
-rw-r--r--language/ja_JP/upgrade.lang.php2
-rw-r--r--language/ka_GE/admin.lang.php4
-rw-r--r--language/ka_GE/common.lang.php8
-rw-r--r--language/ka_GE/index.php2
-rw-r--r--language/ka_GE/install.lang.php12
-rw-r--r--language/ka_GE/upgrade.lang.php2
-rw-r--r--language/km_KH/admin.lang.php2
-rw-r--r--language/km_KH/common.lang.php6
-rw-r--r--language/km_KH/index.php2
-rw-r--r--language/kn_IN/about.html5
-rwxr-xr-xlanguage/kn_IN/admin.lang.php264
-rw-r--r--language/kn_IN/common.lang.php421
-rwxr-xr-xlanguage/kn_IN/install.lang.php68
-rw-r--r--language/kn_IN/iso.txt1
-rw-r--r--language/kn_IN/kn_IN.jpgbin0 -> 1094 bytes
-rwxr-xr-xlanguage/kn_IN/upgrade.lang.php40
-rwxr-xr-xlanguage/ko_KR/admin.lang.php62
-rw-r--r--language/ko_KR/common.lang.php189
-rw-r--r--language/ko_KR/index.php2
-rwxr-xr-xlanguage/ko_KR/install.lang.php60
-rwxr-xr-xlanguage/ko_KR/upgrade.lang.php32
-rw-r--r--language/kok_IN/common.lang.php2
-rw-r--r--language/lb_LU/common.lang.php269
-rw-r--r--language/lb_LU/iso.txt1
-rw-r--r--language/lb_LU/lb_LU.jpgbin0 -> 1044 bytes
-rw-r--r--language/lt_LT/about.html1
-rwxr-xr-xlanguage/lt_LT/admin.lang.php972
-rw-r--r--language/lt_LT/common.lang.php341
-rwxr-xr-xlanguage/lt_LT/help/cat_move.html14
-rwxr-xr-xlanguage/lt_LT/help/cat_options.html22
-rw-r--r--language/lt_LT/help/index.php7
-rwxr-xr-xlanguage/lt_LT/install.lang.php68
-rwxr-xr-xlanguage/lt_LT/upgrade.lang.php40
-rw-r--r--language/lv_LV/admin.lang.php36
-rw-r--r--language/lv_LV/common.lang.php14
-rw-r--r--language/lv_LV/index.php2
-rw-r--r--language/lv_LV/install.lang.php9
-rw-r--r--language/lv_LV/upgrade.lang.php2
-rw-r--r--language/mk_MK/admin.lang.php2
-rw-r--r--language/mk_MK/common.lang.php15
-rw-r--r--language/mk_MK/index.php11
-rwxr-xr-xlanguage/mk_MK/install.lang.php42
-rw-r--r--language/mn_MN/about.html16
-rwxr-xr-xlanguage/mn_MN/admin.lang.php703
-rw-r--r--language/mn_MN/common.lang.php420
-rwxr-xr-xlanguage/mn_MN/install.lang.php61
-rw-r--r--language/mn_MN/iso.txt1
-rw-r--r--language/mn_MN/mn_MN.jpgbin0 -> 481 bytes
-rwxr-xr-xlanguage/mn_MN/upgrade.lang.php40
-rw-r--r--language/ms_MY/common.lang.php100
-rw-r--r--language/nb_NO/admin.lang.php43
-rw-r--r--language/nb_NO/common.lang.php102
-rw-r--r--language/nb_NO/index.php2
-rw-r--r--language/nb_NO/install.lang.php10
-rw-r--r--language/nb_NO/iso.txt2
-rw-r--r--language/nb_NO/upgrade.lang.php2
-rw-r--r--language/nl_NL/admin.lang.php207
-rw-r--r--language/nl_NL/common.lang.php97
-rw-r--r--language/nl_NL/help/index.php2
-rw-r--r--language/nl_NL/index.php2
-rw-r--r--language/nl_NL/install.lang.php13
-rw-r--r--language/nl_NL/upgrade.lang.php2
-rw-r--r--language/nn_NO/about.html12
-rwxr-xr-xlanguage/nn_NO/admin.lang.php972
-rw-r--r--language/nn_NO/common.lang.php421
-rwxr-xr-xlanguage/nn_NO/help/cat_modify.html118
-rwxr-xr-xlanguage/nn_NO/help/cat_move.html14
-rwxr-xr-xlanguage/nn_NO/help/cat_options.html22
-rwxr-xr-xlanguage/nn_NO/help/cat_perm.html11
-rwxr-xr-xlanguage/nn_NO/help/help_add_photos.html20
-rwxr-xr-xlanguage/nn_NO/help/help_groups.html11
-rwxr-xr-xlanguage/nn_NO/help/help_misc.html9
-rwxr-xr-xlanguage/nn_NO/help/help_virtual_links.html12
-rwxr-xr-xlanguage/nn_NO/help/history.html22
-rwxr-xr-xlanguage/nn_NO/help/notification_by_mail.html14
-rwxr-xr-xlanguage/nn_NO/help/permalinks.html7
-rwxr-xr-xlanguage/nn_NO/help/photos_add_ftp.html66
-rwxr-xr-xlanguage/nn_NO/help/search.html23
-rwxr-xr-xlanguage/nn_NO/help/synchronize.html14
-rwxr-xr-xlanguage/nn_NO/help/user_list.html23
-rwxr-xr-xlanguage/nn_NO/install.lang.php68
-rw-r--r--language/nn_NO/iso.txt1
-rw-r--r--language/nn_NO/nn_NO.jpgbin0 -> 1276 bytes
-rwxr-xr-xlanguage/nn_NO/upgrade.lang.php40
-rw-r--r--language/pl_PL/admin.lang.php36
-rw-r--r--language/pl_PL/common.lang.php14
-rw-r--r--language/pl_PL/index.php2
-rw-r--r--language/pl_PL/install.lang.php10
-rw-r--r--language/pl_PL/upgrade.lang.php2
-rw-r--r--language/pt_BR/about.html2
-rw-r--r--language/pt_BR/admin.lang.php294
-rw-r--r--language/pt_BR/common.lang.php75
-rwxr-xr-xlanguage/pt_BR/help/cat_modify.html46
-rwxr-xr-xlanguage/pt_BR/help/cat_options.html18
-rwxr-xr-xlanguage/pt_BR/help/help_add_photos.html6
-rw-r--r--language/pt_BR/help/help_misc.html2
-rwxr-xr-xlanguage/pt_BR/help/maintenance.html12
-rwxr-xr-xlanguage/pt_BR/help/search.html4
-rwxr-xr-xlanguage/pt_BR/help/user_list.html14
-rw-r--r--language/pt_BR/index.php2
-rw-r--r--language/pt_BR/install.lang.php13
-rw-r--r--language/pt_BR/upgrade.lang.php12
-rw-r--r--language/pt_PT/admin.lang.php138
-rw-r--r--language/pt_PT/common.lang.php46
-rw-r--r--language/pt_PT/index.php2
-rw-r--r--language/pt_PT/install.lang.php10
-rw-r--r--language/pt_PT/upgrade.lang.php2
-rw-r--r--language/ro_RO/admin.lang.php154
-rw-r--r--language/ro_RO/common.lang.php14
-rw-r--r--language/ro_RO/index.php2
-rwxr-xr-xlanguage/ro_RO/install.lang.php51
-rwxr-xr-xlanguage/ro_RO/upgrade.lang.php2
-rw-r--r--language/ru_RU/about.html1
-rw-r--r--language/ru_RU/admin.lang.php138
-rw-r--r--language/ru_RU/common.lang.php46
-rw-r--r--language/ru_RU/index.php2
-rw-r--r--language/ru_RU/install.lang.php15
-rw-r--r--language/ru_RU/upgrade.lang.php6
-rw-r--r--language/sh_RS/admin.lang.php4
-rw-r--r--language/sh_RS/common.lang.php8
-rw-r--r--language/sh_RS/help/index.php2
-rw-r--r--language/sh_RS/index.php2
-rw-r--r--language/sh_RS/install.lang.php10
-rw-r--r--language/sh_RS/upgrade.lang.php2
-rw-r--r--language/sk_SK/admin.lang.php36
-rw-r--r--language/sk_SK/common.lang.php14
-rwxr-xr-xlanguage/sk_SK/help/cat_modify.html117
-rwxr-xr-xlanguage/sk_SK/help/cat_move.html14
-rwxr-xr-xlanguage/sk_SK/help/cat_options.html22
-rwxr-xr-xlanguage/sk_SK/help/cat_perm.html11
-rwxr-xr-xlanguage/sk_SK/help/configuration.html100
-rwxr-xr-xlanguage/sk_SK/help/extend_for_templates.html55
-rwxr-xr-xlanguage/sk_SK/help/group_list.html21
-rw-r--r--language/sk_SK/help/help_add_photos.html8
-rw-r--r--language/sk_SK/help/help_groups.html4
-rwxr-xr-xlanguage/sk_SK/help/history.html31
-rw-r--r--language/sk_SK/help/index.php2
-rwxr-xr-xlanguage/sk_SK/help/maintenance.html32
-rwxr-xr-xlanguage/sk_SK/help/notification_by_mail.html14
-rwxr-xr-xlanguage/sk_SK/help/permalinks.html8
-rwxr-xr-xlanguage/sk_SK/help/search.html19
-rwxr-xr-xlanguage/sk_SK/help/synchronize.html14
-rwxr-xr-xlanguage/sk_SK/help/user_list.html26
-rw-r--r--language/sk_SK/index.php2
-rw-r--r--language/sk_SK/install.lang.php8
-rw-r--r--language/sk_SK/upgrade.lang.php5
-rw-r--r--language/sl_SI/about.html17
-rw-r--r--language/sl_SI/admin.lang.php891
-rw-r--r--language/sl_SI/common.lang.php288
-rwxr-xr-xlanguage/sl_SI/help/cat_move.html14
-rwxr-xr-xlanguage/sl_SI/help/search.html24
-rwxr-xr-xlanguage/sl_SI/help/synchronize.html14
-rwxr-xr-xlanguage/sl_SI/help/user_list.html23
-rwxr-xr-xlanguage/sl_SI/install.lang.php68
-rwxr-xr-xlanguage/sl_SI/upgrade.lang.php40
-rw-r--r--language/sr_RS/admin.lang.php43
-rw-r--r--language/sr_RS/common.lang.php14
-rw-r--r--language/sr_RS/index.php2
-rw-r--r--language/sr_RS/install.lang.php9
-rw-r--r--language/sr_RS/upgrade.lang.php2
-rw-r--r--language/sv_SE/admin.lang.php32
-rw-r--r--language/sv_SE/common.lang.php18
-rw-r--r--language/sv_SE/help/cat_modify.html2
-rw-r--r--language/sv_SE/help/index.php2
-rwxr-xr-xlanguage/sv_SE/help/photos_add_ftp.html71
-rwxr-xr-xlanguage/sv_SE/help/synchronize.html14
-rw-r--r--language/sv_SE/install.lang.php13
-rw-r--r--language/sv_SE/upgrade.lang.php2
-rwxr-xr-xlanguage/ta_IN/admin.lang.php199
-rw-r--r--language/ta_IN/common.lang.php19
-rwxr-xr-xlanguage/ta_IN/install.lang.php72
-rwxr-xr-xlanguage/ta_IN/upgrade.lang.php43
-rw-r--r--language/th_TH/admin.lang.php16
-rw-r--r--language/th_TH/common.lang.php16
-rw-r--r--language/th_TH/install.lang.php13
-rw-r--r--language/th_TH/upgrade.lang.php2
-rw-r--r--language/tr_TR/admin.lang.php42
-rw-r--r--language/tr_TR/common.lang.php14
-rwxr-xr-xlanguage/tr_TR/help/cat_modify.html126
-rwxr-xr-xlanguage/tr_TR/help/extend_for_templates.html55
-rwxr-xr-xlanguage/tr_TR/help/help_virtual_links.html9
-rwxr-xr-xlanguage/tr_TR/help/maintenance.html25
-rwxr-xr-xlanguage/tr_TR/help/permalinks.html7
-rw-r--r--language/tr_TR/install.lang.php11
-rw-r--r--language/tr_TR/upgrade.lang.php2
-rw-r--r--language/uk_UA/admin.lang.php36
-rw-r--r--language/uk_UA/common.lang.php20
-rw-r--r--language/uk_UA/install.lang.php10
-rw-r--r--language/uk_UA/upgrade.lang.php2
-rw-r--r--language/vi_VN/admin.lang.php104
-rw-r--r--language/vi_VN/common.lang.php14
-rw-r--r--language/vi_VN/help/index.php2
-rw-r--r--language/vi_VN/install.lang.php10
-rw-r--r--language/vi_VN/upgrade.lang.php2
-rw-r--r--language/zh_CN/admin.lang.php36
-rw-r--r--language/zh_CN/common.lang.php14
-rw-r--r--language/zh_CN/install.lang.php9
-rw-r--r--language/zh_CN/upgrade.lang.php2
-rw-r--r--language/zh_HK/about.html3
-rwxr-xr-xlanguage/zh_HK/admin.lang.php972
-rw-r--r--language/zh_HK/common.lang.php23
-rwxr-xr-xlanguage/zh_HK/help/cat_move.html14
-rwxr-xr-xlanguage/zh_HK/help/cat_options.html20
-rwxr-xr-xlanguage/zh_HK/help/cat_perm.html11
-rw-r--r--language/zh_HK/help/index.php7
-rw-r--r--language/zh_HK/index.php2
-rwxr-xr-xlanguage/zh_HK/install.lang.php68
-rwxr-xr-xlanguage/zh_HK/upgrade.lang.php40
-rw-r--r--language/zh_TW/admin.lang.php596
-rw-r--r--language/zh_TW/common.lang.php212
-rwxr-xr-xlanguage/zh_TW/help/cat_modify.html127
-rwxr-xr-xlanguage/zh_TW/help/cat_move.html14
-rwxr-xr-xlanguage/zh_TW/help/cat_options.html22
-rwxr-xr-xlanguage/zh_TW/help/cat_perm.html14
-rwxr-xr-xlanguage/zh_TW/help/configuration.html107
-rwxr-xr-xlanguage/zh_TW/help/extend_for_templates.html71
-rwxr-xr-xlanguage/zh_TW/help/group_list.html21
-rwxr-xr-xlanguage/zh_TW/help/help_add_photos.html25
-rwxr-xr-xlanguage/zh_TW/help/help_groups.html12
-rwxr-xr-xlanguage/zh_TW/help/help_misc.html9
-rwxr-xr-xlanguage/zh_TW/help/help_permissions.html56
-rwxr-xr-xlanguage/zh_TW/help/help_virtual_links.html7
-rwxr-xr-xlanguage/zh_TW/help/history.html23
-rwxr-xr-xlanguage/zh_TW/help/maintenance.html32
-rwxr-xr-xlanguage/zh_TW/help/notification_by_mail.html14
-rwxr-xr-xlanguage/zh_TW/help/permalinks.html7
-rwxr-xr-xlanguage/zh_TW/help/photos_add_ftp.html85
-rwxr-xr-xlanguage/zh_TW/help/search.html21
-rwxr-xr-xlanguage/zh_TW/help/synchronize.html14
-rwxr-xr-xlanguage/zh_TW/help/user_list.html23
-rw-r--r--language/zh_TW/install.lang.php11
-rw-r--r--language/zh_TW/upgrade.lang.php2
-rw-r--r--local/config/index.php2
-rw-r--r--local/css/index.php2
-rw-r--r--local/index.php2
-rw-r--r--local/language/index.php2
-rw-r--r--nbm.php7
-rw-r--r--notification.php2
-rw-r--r--password.php43
-rw-r--r--picture.php38
-rw-r--r--plugins/LocalFilesEditor/admin.php17
-rw-r--r--plugins/LocalFilesEditor/include/css.inc.php6
-rw-r--r--plugins/LocalFilesEditor/include/functions.inc.php2
-rw-r--r--plugins/LocalFilesEditor/include/tpl.inc.php8
-rw-r--r--plugins/LocalFilesEditor/index.php2
-rwxr-xr-xplugins/LocalFilesEditor/language/af_ZA/plugin.lang.php2
-rw-r--r--plugins/LocalFilesEditor/language/ar_SA/index.php2
-rw-r--r--plugins/LocalFilesEditor/language/ar_SA/plugin.lang.php2
-rwxr-xr-xplugins/LocalFilesEditor/language/bg_BG/plugin.lang.php2
-rwxr-xr-xplugins/LocalFilesEditor/language/br_FR/description.txt1
-rw-r--r--plugins/LocalFilesEditor/language/br_FR/index.php7
-rwxr-xr-xplugins/LocalFilesEditor/language/br_FR/plugin.lang.php53
-rwxr-xr-xplugins/LocalFilesEditor/language/ca_ES/plugin.lang.php2
-rw-r--r--plugins/LocalFilesEditor/language/cs_CZ/index.php2
-rw-r--r--plugins/LocalFilesEditor/language/cs_CZ/plugin.lang.php2
-rwxr-xr-xplugins/LocalFilesEditor/language/da_DK/plugin.lang.php2
-rw-r--r--plugins/LocalFilesEditor/language/de_DE/index.php2
-rw-r--r--plugins/LocalFilesEditor/language/de_DE/plugin.lang.php2
-rwxr-xr-xplugins/LocalFilesEditor/language/el_GR/plugin.lang.php2
-rw-r--r--plugins/LocalFilesEditor/language/en_UK/index.php2
-rw-r--r--plugins/LocalFilesEditor/language/en_UK/plugin.lang.php2
-rwxr-xr-xplugins/LocalFilesEditor/language/eo_EO/description.txt1
-rwxr-xr-xplugins/LocalFilesEditor/language/eo_EO/plugin.lang.php53
-rw-r--r--plugins/LocalFilesEditor/language/es_ES/index.php2
-rw-r--r--plugins/LocalFilesEditor/language/es_ES/plugin.lang.php2
-rwxr-xr-xplugins/LocalFilesEditor/language/et_EE/plugin.lang.php2
-rwxr-xr-xplugins/LocalFilesEditor/language/fa_IR/plugin.lang.php2
-rwxr-xr-xplugins/LocalFilesEditor/language/fi_FI/plugin.lang.php2
-rw-r--r--plugins/LocalFilesEditor/language/fr_CA/index.php2
-rw-r--r--plugins/LocalFilesEditor/language/fr_CA/plugin.lang.php2
-rw-r--r--plugins/LocalFilesEditor/language/fr_FR/index.php2
-rw-r--r--plugins/LocalFilesEditor/language/fr_FR/plugin.lang.php2
-rwxr-xr-xplugins/LocalFilesEditor/language/gl_ES/plugin.lang.php2
-rw-r--r--plugins/LocalFilesEditor/language/he_IL/index.php2
-rw-r--r--plugins/LocalFilesEditor/language/he_IL/plugin.lang.php2
-rw-r--r--plugins/LocalFilesEditor/language/hr_HR/index.php2
-rw-r--r--plugins/LocalFilesEditor/language/hr_HR/plugin.lang.php2
-rw-r--r--plugins/LocalFilesEditor/language/hu_HU/index.php2
-rw-r--r--plugins/LocalFilesEditor/language/hu_HU/plugin.lang.php2
-rw-r--r--plugins/LocalFilesEditor/language/index.php2
-rw-r--r--plugins/LocalFilesEditor/language/it_IT/index.php2
-rw-r--r--plugins/LocalFilesEditor/language/it_IT/plugin.lang.php18
-rw-r--r--plugins/LocalFilesEditor/language/ja_JP/index.php2
-rw-r--r--plugins/LocalFilesEditor/language/ja_JP/plugin.lang.php2
-rw-r--r--plugins/LocalFilesEditor/language/ka_GE/index.php2
-rw-r--r--plugins/LocalFilesEditor/language/ka_GE/plugin.lang.php2
-rwxr-xr-xplugins/LocalFilesEditor/language/kn_IN/description.txt1
-rwxr-xr-xplugins/LocalFilesEditor/language/kn_IN/plugin.lang.php52
-rwxr-xr-xplugins/LocalFilesEditor/language/lt_LT/description.txt1
-rwxr-xr-xplugins/LocalFilesEditor/language/lt_LT/plugin.lang.php53
-rw-r--r--plugins/LocalFilesEditor/language/lv_LV/index.php2
-rw-r--r--plugins/LocalFilesEditor/language/lv_LV/plugin.lang.php2
-rwxr-xr-xplugins/LocalFilesEditor/language/mn_MN/description.txt1
-rw-r--r--plugins/LocalFilesEditor/language/mn_MN/index.php7
-rwxr-xr-xplugins/LocalFilesEditor/language/mn_MN/plugin.lang.php52
-rw-r--r--plugins/LocalFilesEditor/language/nb_NO/index.php2
-rw-r--r--plugins/LocalFilesEditor/language/nb_NO/plugin.lang.php2
-rw-r--r--plugins/LocalFilesEditor/language/nl_NL/index.php2
-rw-r--r--plugins/LocalFilesEditor/language/nl_NL/plugin.lang.php12
-rwxr-xr-xplugins/LocalFilesEditor/language/nn_NO/description.txt1
-rwxr-xr-xplugins/LocalFilesEditor/language/nn_NO/plugin.lang.php53
-rw-r--r--plugins/LocalFilesEditor/language/pl_PL/index.php2
-rw-r--r--plugins/LocalFilesEditor/language/pl_PL/plugin.lang.php2
-rwxr-xr-xplugins/LocalFilesEditor/language/pt_BR/plugin.lang.php54
-rw-r--r--plugins/LocalFilesEditor/language/pt_PT/index.php2
-rw-r--r--plugins/LocalFilesEditor/language/pt_PT/plugin.lang.php2
-rwxr-xr-xplugins/LocalFilesEditor/language/ro_RO/description.txt1
-rwxr-xr-xplugins/LocalFilesEditor/language/ro_RO/plugin.lang.php53
-rw-r--r--plugins/LocalFilesEditor/language/ru_RU/index.php2
-rw-r--r--plugins/LocalFilesEditor/language/ru_RU/plugin.lang.php4
-rwxr-xr-xplugins/LocalFilesEditor/language/sh_RS/plugin.lang.php2
-rw-r--r--plugins/LocalFilesEditor/language/sk_SK/index.php2
-rw-r--r--plugins/LocalFilesEditor/language/sk_SK/plugin.lang.php2
-rwxr-xr-xplugins/LocalFilesEditor/language/sl_SI/description.txt1
-rwxr-xr-xplugins/LocalFilesEditor/language/sl_SI/plugin.lang.php53
-rw-r--r--plugins/LocalFilesEditor/language/sr_RS/index.php2
-rw-r--r--plugins/LocalFilesEditor/language/sr_RS/plugin.lang.php2
-rw-r--r--plugins/LocalFilesEditor/language/sv_SE/index.php2
-rw-r--r--plugins/LocalFilesEditor/language/sv_SE/plugin.lang.php2
-rwxr-xr-xplugins/LocalFilesEditor/language/ta_IN/description.txt2
-rwxr-xr-xplugins/LocalFilesEditor/language/ta_IN/plugin.lang.php41
-rw-r--r--plugins/LocalFilesEditor/language/th_TH/index.php2
-rw-r--r--plugins/LocalFilesEditor/language/th_TH/plugin.lang.php2
-rw-r--r--plugins/LocalFilesEditor/language/tr_TR/index.php2
-rw-r--r--plugins/LocalFilesEditor/language/tr_TR/plugin.lang.php8
-rw-r--r--plugins/LocalFilesEditor/language/uk_UA/plugin.lang.php2
-rw-r--r--plugins/LocalFilesEditor/language/vi_VN/index.php2
-rw-r--r--plugins/LocalFilesEditor/language/vi_VN/plugin.lang.php2
-rw-r--r--plugins/LocalFilesEditor/language/zh_CN/index.php2
-rw-r--r--plugins/LocalFilesEditor/language/zh_CN/plugin.lang.php2
-rwxr-xr-xplugins/LocalFilesEditor/language/zh_HK/description.txt1
-rwxr-xr-xplugins/LocalFilesEditor/language/zh_HK/plugin.lang.php53
-rw-r--r--plugins/LocalFilesEditor/language/zh_TW/index.php2
-rw-r--r--plugins/LocalFilesEditor/language/zh_TW/plugin.lang.php2
-rw-r--r--plugins/LocalFilesEditor/main.inc.php13
-rw-r--r--plugins/LocalFilesEditor/maintain.inc.php2
-rw-r--r--plugins/LocalFilesEditor/show_default.php2
-rw-r--r--plugins/admin_multi_view/index.php2
-rw-r--r--plugins/admin_multi_view/language/ar_SA/index.php2
-rwxr-xr-xplugins/admin_multi_view/language/br_FR/description.txt1
-rw-r--r--plugins/admin_multi_view/language/br_FR/index.php7
-rw-r--r--plugins/admin_multi_view/language/cs_CZ/index.php2
-rw-r--r--plugins/admin_multi_view/language/de_DE/index.php2
-rw-r--r--plugins/admin_multi_view/language/en_UK/index.php2
-rwxr-xr-xplugins/admin_multi_view/language/eo_EO/description.txt1
-rw-r--r--plugins/admin_multi_view/language/es_ES/description.txt2
-rw-r--r--plugins/admin_multi_view/language/es_ES/index.php2
-rw-r--r--plugins/admin_multi_view/language/fr_CA/index.php2
-rw-r--r--plugins/admin_multi_view/language/fr_FR/index.php2
-rw-r--r--plugins/admin_multi_view/language/he_IL/index.php2
-rw-r--r--plugins/admin_multi_view/language/hr_HR/index.php2
-rw-r--r--plugins/admin_multi_view/language/hu_HU/index.php2
-rw-r--r--plugins/admin_multi_view/language/index.php2
-rw-r--r--plugins/admin_multi_view/language/it_IT/index.php2
-rw-r--r--plugins/admin_multi_view/language/ja_JP/index.php2
-rw-r--r--plugins/admin_multi_view/language/ka_GE/index.php2
-rwxr-xr-xplugins/admin_multi_view/language/kn_IN/description.txt1
-rwxr-xr-xplugins/admin_multi_view/language/lt_LT/description.txt1
-rw-r--r--plugins/admin_multi_view/language/lv_LV/index.php2
-rwxr-xr-xplugins/admin_multi_view/language/mn_MN/description.txt1
-rw-r--r--plugins/admin_multi_view/language/mn_MN/index.php7
-rw-r--r--plugins/admin_multi_view/language/nb_NO/index.php2
-rw-r--r--plugins/admin_multi_view/language/nl_NL/index.php2
-rwxr-xr-xplugins/admin_multi_view/language/nn_NO/description.txt1
-rw-r--r--plugins/admin_multi_view/language/pl_PL/index.php2
-rwxr-xr-xplugins/admin_multi_view/language/pt_BR/description.txt2
-rw-r--r--plugins/admin_multi_view/language/pt_PT/index.php2
-rw-r--r--plugins/admin_multi_view/language/ru_RU/description.txt2
-rw-r--r--plugins/admin_multi_view/language/ru_RU/index.php2
-rw-r--r--plugins/admin_multi_view/language/sk_SK/index.php2
-rwxr-xr-xplugins/admin_multi_view/language/sl_SI/description.txt1
-rw-r--r--plugins/admin_multi_view/language/sr_RS/index.php2
-rw-r--r--plugins/admin_multi_view/language/sv_SE/index.php2
-rwxr-xr-xplugins/admin_multi_view/language/ta_IN/description.txt1
-rw-r--r--plugins/admin_multi_view/language/tr_TR/index.php2
-rw-r--r--plugins/admin_multi_view/language/vi_VN/index.php2
-rw-r--r--plugins/admin_multi_view/language/zh_CN/index.php2
-rwxr-xr-xplugins/admin_multi_view/language/zh_HK/description.txt1
-rw-r--r--plugins/admin_multi_view/language/zh_HK/index.php7
-rw-r--r--plugins/admin_multi_view/language/zh_TW/index.php2
-rw-r--r--plugins/admin_multi_view/main.inc.php4
-rw-r--r--plugins/c13y_upgrade/index.php2
-rw-r--r--plugins/c13y_upgrade/initialize.inc.php2
-rw-r--r--plugins/c13y_upgrade/language/ar_SA/index.php2
-rw-r--r--plugins/c13y_upgrade/language/ar_SA/plugin.lang.php2
-rwxr-xr-xplugins/c13y_upgrade/language/bg_BG/plugin.lang.php2
-rwxr-xr-xplugins/c13y_upgrade/language/br_FR/description.txt1
-rw-r--r--plugins/c13y_upgrade/language/br_FR/index.php7
-rwxr-xr-xplugins/c13y_upgrade/language/br_FR/plugin.lang.php28
-rwxr-xr-xplugins/c13y_upgrade/language/ca_ES/plugin.lang.php2
-rw-r--r--plugins/c13y_upgrade/language/cs_CZ/index.php2
-rw-r--r--plugins/c13y_upgrade/language/cs_CZ/plugin.lang.php2
-rwxr-xr-xplugins/c13y_upgrade/language/da_DK/plugin.lang.php2
-rw-r--r--plugins/c13y_upgrade/language/de_DE/index.php2
-rw-r--r--plugins/c13y_upgrade/language/de_DE/plugin.lang.php2
-rwxr-xr-xplugins/c13y_upgrade/language/el_GR/plugin.lang.php2
-rw-r--r--plugins/c13y_upgrade/language/en_UK/index.php2
-rw-r--r--plugins/c13y_upgrade/language/en_UK/plugin.lang.php2
-rwxr-xr-xplugins/c13y_upgrade/language/eo_EO/description.txt1
-rwxr-xr-xplugins/c13y_upgrade/language/eo_EO/plugin.lang.php28
-rw-r--r--plugins/c13y_upgrade/language/es_ES/index.php2
-rw-r--r--plugins/c13y_upgrade/language/es_ES/plugin.lang.php2
-rwxr-xr-xplugins/c13y_upgrade/language/et_EE/description.txt1
-rwxr-xr-xplugins/c13y_upgrade/language/et_EE/plugin.lang.php28
-rwxr-xr-xplugins/c13y_upgrade/language/fa_IR/plugin.lang.php2
-rwxr-xr-xplugins/c13y_upgrade/language/fi_FI/plugin.lang.php2
-rw-r--r--plugins/c13y_upgrade/language/fr_CA/index.php2
-rw-r--r--plugins/c13y_upgrade/language/fr_CA/plugin.lang.php2
-rw-r--r--plugins/c13y_upgrade/language/fr_FR/index.php2
-rw-r--r--plugins/c13y_upgrade/language/fr_FR/plugin.lang.php2
-rwxr-xr-xplugins/c13y_upgrade/language/gl_ES/plugin.lang.php2
-rw-r--r--plugins/c13y_upgrade/language/he_IL/index.php2
-rw-r--r--plugins/c13y_upgrade/language/he_IL/plugin.lang.php2
-rw-r--r--plugins/c13y_upgrade/language/hr_HR/index.php2
-rw-r--r--plugins/c13y_upgrade/language/hr_HR/plugin.lang.php2
-rw-r--r--plugins/c13y_upgrade/language/hu_HU/index.php2
-rw-r--r--plugins/c13y_upgrade/language/hu_HU/plugin.lang.php2
-rw-r--r--plugins/c13y_upgrade/language/index.php2
-rw-r--r--plugins/c13y_upgrade/language/it_IT/index.php2
-rw-r--r--plugins/c13y_upgrade/language/it_IT/plugin.lang.php6
-rw-r--r--plugins/c13y_upgrade/language/ja_JP/index.php2
-rw-r--r--plugins/c13y_upgrade/language/ja_JP/plugin.lang.php2
-rw-r--r--plugins/c13y_upgrade/language/ka_GE/index.php2
-rw-r--r--plugins/c13y_upgrade/language/ka_GE/plugin.lang.php2
-rwxr-xr-xplugins/c13y_upgrade/language/kn_IN/description.txt1
-rwxr-xr-xplugins/c13y_upgrade/language/kn_IN/plugin.lang.php28
-rwxr-xr-xplugins/c13y_upgrade/language/ko_KR/plugin.lang.php26
-rwxr-xr-xplugins/c13y_upgrade/language/lt_LT/description.txt1
-rwxr-xr-xplugins/c13y_upgrade/language/lt_LT/plugin.lang.php28
-rw-r--r--plugins/c13y_upgrade/language/lv_LV/index.php2
-rw-r--r--plugins/c13y_upgrade/language/lv_LV/plugin.lang.php2
-rw-r--r--plugins/c13y_upgrade/language/nb_NO/index.php2
-rw-r--r--plugins/c13y_upgrade/language/nb_NO/plugin.lang.php2
-rw-r--r--plugins/c13y_upgrade/language/nl_NL/index.php2
-rw-r--r--plugins/c13y_upgrade/language/nl_NL/plugin.lang.php2
-rwxr-xr-xplugins/c13y_upgrade/language/nn_NO/description.txt1
-rwxr-xr-xplugins/c13y_upgrade/language/nn_NO/plugin.lang.php28
-rw-r--r--plugins/c13y_upgrade/language/pl_PL/index.php2
-rw-r--r--plugins/c13y_upgrade/language/pl_PL/plugin.lang.php2
-rwxr-xr-xplugins/c13y_upgrade/language/pt_BR/plugin.lang.php42
-rw-r--r--plugins/c13y_upgrade/language/pt_PT/index.php2
-rw-r--r--plugins/c13y_upgrade/language/pt_PT/plugin.lang.php2
-rwxr-xr-xplugins/c13y_upgrade/language/ro_RO/description.txt1
-rwxr-xr-xplugins/c13y_upgrade/language/ro_RO/plugin.lang.php28
-rw-r--r--plugins/c13y_upgrade/language/ru_RU/description.txt2
-rw-r--r--plugins/c13y_upgrade/language/ru_RU/index.php2
-rw-r--r--plugins/c13y_upgrade/language/ru_RU/plugin.lang.php6
-rw-r--r--plugins/c13y_upgrade/language/sk_SK/index.php2
-rw-r--r--plugins/c13y_upgrade/language/sk_SK/plugin.lang.php2
-rwxr-xr-xplugins/c13y_upgrade/language/sl_SI/description.txt1
-rwxr-xr-xplugins/c13y_upgrade/language/sl_SI/plugin.lang.php28
-rw-r--r--plugins/c13y_upgrade/language/sr_RS/index.php2
-rw-r--r--plugins/c13y_upgrade/language/sr_RS/plugin.lang.php2
-rw-r--r--plugins/c13y_upgrade/language/sv_SE/index.php2
-rw-r--r--plugins/c13y_upgrade/language/sv_SE/plugin.lang.php2
-rwxr-xr-xplugins/c13y_upgrade/language/ta_IN/description.txt1
-rwxr-xr-xplugins/c13y_upgrade/language/ta_IN/plugin.lang.php28
-rwxr-xr-xplugins/c13y_upgrade/language/th_TH/description.txt1
-rwxr-xr-xplugins/c13y_upgrade/language/th_TH/plugin.lang.php28
-rw-r--r--plugins/c13y_upgrade/language/tr_TR/index.php2
-rw-r--r--plugins/c13y_upgrade/language/tr_TR/plugin.lang.php2
-rwxr-xr-xplugins/c13y_upgrade/language/uk_UA/plugin.lang.php2
-rw-r--r--plugins/c13y_upgrade/language/vi_VN/index.php2
-rw-r--r--plugins/c13y_upgrade/language/vi_VN/plugin.lang.php2
-rw-r--r--plugins/c13y_upgrade/language/zh_CN/index.php2
-rw-r--r--plugins/c13y_upgrade/language/zh_CN/plugin.lang.php2
-rwxr-xr-xplugins/c13y_upgrade/language/zh_HK/description.txt1
-rwxr-xr-xplugins/c13y_upgrade/language/zh_HK/plugin.lang.php28
-rw-r--r--plugins/c13y_upgrade/language/zh_TW/index.php2
-rw-r--r--plugins/c13y_upgrade/language/zh_TW/plugin.lang.php2
-rw-r--r--plugins/c13y_upgrade/main.inc.php4
-rw-r--r--plugins/index.php2
-rw-r--r--plugins/language_switch/default.css14
-rw-r--r--plugins/language_switch/flag_sprite.jpgbin124776 -> 119988 bytes
-rw-r--r--plugins/language_switch/flag_sprite_original.pngbin146132 -> 146415 bytes
-rw-r--r--plugins/language_switch/flags.tpl13
-rw-r--r--plugins/language_switch/index.php2
-rw-r--r--plugins/language_switch/language/ar_SA/index.php2
-rwxr-xr-xplugins/language_switch/language/br_FR/description.txt1
-rw-r--r--plugins/language_switch/language/cs_CZ/index.php2
-rw-r--r--plugins/language_switch/language/de_DE/index.php2
-rw-r--r--plugins/language_switch/language/en_UK/index.php2
-rwxr-xr-xplugins/language_switch/language/eo_EO/description.txt1
-rw-r--r--plugins/language_switch/language/es_ES/index.php2
-rw-r--r--plugins/language_switch/language/fr_CA/index.php2
-rw-r--r--plugins/language_switch/language/fr_FR/index.php2
-rwxr-xr-xplugins/language_switch/language/gl_ES/description.txt1
-rw-r--r--plugins/language_switch/language/he_IL/index.php2
-rw-r--r--plugins/language_switch/language/hr_HR/index.php2
-rw-r--r--plugins/language_switch/language/hu_HU/index.php2
-rw-r--r--plugins/language_switch/language/index.php2
-rw-r--r--plugins/language_switch/language/it_IT/index.php2
-rw-r--r--plugins/language_switch/language/ja_JP/index.php2
-rw-r--r--plugins/language_switch/language/ka_GE/index.php2
-rwxr-xr-xplugins/language_switch/language/kn_IN/description.txt1
-rwxr-xr-xplugins/language_switch/language/lt_LT/description.txt1
-rw-r--r--plugins/language_switch/language/lv_LV/index.php2
-rwxr-xr-xplugins/language_switch/language/mn_MN/description.txt1
-rw-r--r--plugins/language_switch/language/mn_MN/index.php7
-rw-r--r--plugins/language_switch/language/nb_NO/index.php2
-rw-r--r--plugins/language_switch/language/nl_NL/index.php2
-rwxr-xr-xplugins/language_switch/language/nn_NO/description.txt1
-rw-r--r--plugins/language_switch/language/pl_PL/index.php2
-rwxr-xr-xplugins/language_switch/language/pt_BR/description.txt2
-rw-r--r--plugins/language_switch/language/pt_PT/index.php2
-rw-r--r--plugins/language_switch/language/ru_RU/description.txt2
-rw-r--r--plugins/language_switch/language/ru_RU/index.php2
-rw-r--r--plugins/language_switch/language/sk_SK/index.php2
-rwxr-xr-xplugins/language_switch/language/sl_SI/description.txt1
-rw-r--r--plugins/language_switch/language/sr_RS/index.php2
-rw-r--r--plugins/language_switch/language/sv_SE/index.php2
-rwxr-xr-xplugins/language_switch/language/ta_IN/description.txt1
-rw-r--r--plugins/language_switch/language/th_TH/index.php2
-rw-r--r--plugins/language_switch/language/tr_TR/index.php2
-rw-r--r--plugins/language_switch/language/vi_VN/index.php2
-rw-r--r--plugins/language_switch/language/zh_CN/index.php2
-rwxr-xr-xplugins/language_switch/language/zh_HK/description.txt1
-rw-r--r--plugins/language_switch/language/zh_TW/description.txt2
-rw-r--r--plugins/language_switch/language/zh_TW/index.php2
-rw-r--r--plugins/language_switch/language_switch.css504
-rw-r--r--plugins/language_switch/language_switch.inc.php12
-rw-r--r--plugins/language_switch/main.inc.php4
-rw-r--r--plugins/language_switch/style.css9
-rw-r--r--popuphelp.php2
-rw-r--r--profile.php14
-rw-r--r--qsearch.php2
-rw-r--r--random.php2
-rw-r--r--register.php55
-rw-r--r--search.php25
-rw-r--r--search_rules.php22
-rw-r--r--tags.php17
-rw-r--r--template-extension/index.php2
-rw-r--r--template-extension/yoga/index.php2
-rw-r--r--template-extension/yoga/local/index.php2
-rw-r--r--themes/Sylvia/icon/index.php2
-rw-r--r--themes/Sylvia/icon/mimetypes/index.php2
-rw-r--r--themes/Sylvia/index.php2
-rw-r--r--themes/Sylvia/mail-css.tpl13
-rw-r--r--themes/Sylvia/theme.css2
-rw-r--r--themes/Sylvia/themeconf.inc.php2
-rw-r--r--themes/clear/index.php2
-rw-r--r--themes/clear/mail-css.tpl9
-rw-r--r--themes/clear/theme.css2
-rw-r--r--themes/clear/themeconf.inc.php2
-rw-r--r--themes/dark/images/index.php2
-rw-r--r--themes/dark/index.php2
-rw-r--r--themes/dark/mail-css.tpl9
-rw-r--r--themes/dark/themeconf.inc.php2
-rw-r--r--themes/default/fix-ie5-ie6.css1
-rw-r--r--themes/default/fix-ie7.css1
-rw-r--r--themes/default/icon/index.php2
-rw-r--r--themes/default/icon/mimetypes/index.php2
-rw-r--r--themes/default/iconset.css1
-rw-r--r--themes/default/images/index.php2
-rw-r--r--themes/default/index.php2
-rw-r--r--themes/default/js/datepicker.js33
-rw-r--r--themes/default/js/image.loader.js84
-rw-r--r--themes/default/js/jquery.js8577
-rw-r--r--themes/default/js/jquery.min.js8
-rw-r--r--themes/default/js/plugins/chosen-sprite@2x.pngbin0 -> 872 bytes
-rw-r--r--themes/default/js/plugins/chosen.css573
-rw-r--r--themes/default/js/plugins/chosen.jquery.min.js12
-rw-r--r--themes/default/js/plugins/datatables/css/demo_page.css122
-rw-r--r--themes/default/js/plugins/datatables/css/demo_table.css577
-rw-r--r--themes/default/js/plugins/datatables/css/demo_table_jui.css501
-rw-r--r--themes/default/js/plugins/datatables/css/jquery.dataTables.css221
-rw-r--r--themes/default/js/plugins/datatables/css/jquery.dataTables_themeroller.css244
-rw-r--r--themes/default/js/plugins/datatables/images/Sorting icons.psdbin0 -> 27490 bytes
-rw-r--r--themes/default/js/plugins/datatables/images/back_disabled.pngbin0 -> 1361 bytes
-rw-r--r--themes/default/js/plugins/datatables/images/back_enabled.pngbin0 -> 1379 bytes
-rw-r--r--themes/default/js/plugins/datatables/images/back_enabled_hover.pngbin0 -> 1375 bytes
-rw-r--r--themes/default/js/plugins/datatables/images/favicon.icobin0 -> 894 bytes
-rw-r--r--themes/default/js/plugins/datatables/images/forward_disabled.pngbin0 -> 1363 bytes
-rw-r--r--themes/default/js/plugins/datatables/images/forward_enabled.pngbin0 -> 1380 bytes
-rw-r--r--themes/default/js/plugins/datatables/images/forward_enabled_hover.pngbin0 -> 1379 bytes
-rw-r--r--themes/default/js/plugins/datatables/images/sort_asc.pngbin0 -> 1118 bytes
-rw-r--r--themes/default/js/plugins/datatables/images/sort_asc_disabled.pngbin0 -> 1050 bytes
-rw-r--r--themes/default/js/plugins/datatables/images/sort_both.pngbin0 -> 1136 bytes
-rw-r--r--themes/default/js/plugins/datatables/images/sort_desc.pngbin0 -> 1127 bytes
-rw-r--r--themes/default/js/plugins/datatables/images/sort_desc_disabled.pngbin0 -> 1045 bytes
-rw-r--r--themes/default/js/plugins/jgrowl-alert.pngbin0 -> 2511 bytes
-rw-r--r--themes/default/js/plugins/jgrowl-check.pngbin0 -> 2359 bytes
-rw-r--r--themes/default/js/plugins/jgrowl-error.pngbin0 -> 2276 bytes
-rw-r--r--themes/default/js/plugins/jquery.dataTables.js12099
-rw-r--r--themes/default/js/plugins/jquery.jgrowl.css (renamed from admin/themes/default/uploadify.jGrowl.css)114
-rw-r--r--themes/default/js/plugins/jquery.jgrowl_minimized.js13
-rw-r--r--themes/default/js/plugins/jquery.tokeninput.css16
-rw-r--r--themes/default/js/plugins/jquery.tokeninput.js701
-rw-r--r--themes/default/js/plugins/underscore.js1276
-rw-r--r--themes/default/js/raphael.js5501
-rw-r--r--themes/default/js/switchbox.js23
-rw-r--r--themes/default/s26/outline_005e89.pngbin2042 -> 1935 bytes
-rw-r--r--themes/default/s26/outline_808060.pngbin2042 -> 1935 bytes
-rw-r--r--themes/default/s26/outline_808080.pngbin2556 -> 2555 bytes
-rw-r--r--themes/default/s26/outline_ff3363.pngbin2042 -> 1935 bytes
-rw-r--r--themes/default/s26/outline_ff7700.pngbin2042 -> 1935 bytes
-rw-r--r--themes/default/s26/outline_ffff80.pngbin2042 -> 1935 bytes
-rw-r--r--themes/default/s26/outline_ffffff.pngbin1886 -> 2230 bytes
-rw-r--r--themes/default/template/comment_list.tpl12
-rw-r--r--themes/default/template/index.tpl77
-rw-r--r--themes/default/template/mail/index.php2
-rw-r--r--themes/default/template/mail/screenshot-clear.pngbin0 -> 70946 bytes
-rw-r--r--themes/default/template/mail/screenshot-dark.pngbin0 -> 72394 bytes
-rw-r--r--themes/default/template/mail/text/html/footer.tpl41
-rw-r--r--themes/default/template/mail/text/html/global-mail-css.tpl116
-rw-r--r--themes/default/template/mail/text/html/header.tpl44
-rw-r--r--themes/default/template/mail/text/html/index.php2
-rw-r--r--themes/default/template/mail/text/html/mail-css-clear.tpl73
-rw-r--r--themes/default/template/mail/text/html/mail-css-dark.tpl87
-rw-r--r--themes/default/template/mail/text/html/notification_admin.tpl9
-rw-r--r--themes/default/template/mail/text/html/notification_by_mail.tpl4
-rw-r--r--themes/default/template/mail/text/index.php2
-rw-r--r--themes/default/template/mail/text/plain/footer.tpl8
-rw-r--r--themes/default/template/mail/text/plain/header.tpl11
-rw-r--r--themes/default/template/mail/text/plain/index.php2
-rw-r--r--themes/default/template/mail/text/plain/notification_admin.tpl8
-rw-r--r--themes/default/template/menubar_categories.tpl4
-rw-r--r--themes/default/template/menubar_menu.tpl2
-rw-r--r--themes/default/template/menubar_tags.tpl2
-rw-r--r--themes/default/template/month_calendar.tpl35
-rw-r--r--themes/default/template/password.tpl4
-rw-r--r--themes/default/template/picture.tpl114
-rw-r--r--themes/default/template/picture_content.tpl8
-rw-r--r--themes/default/template/picture_nav_buttons.tpl30
-rw-r--r--themes/default/template/profile_content.tpl2
-rw-r--r--themes/default/template/redirect.tpl8
-rw-r--r--themes/default/template/search.tpl8
-rw-r--r--themes/default/template/tags.tpl8
-rw-r--r--themes/default/theme.css47
-rw-r--r--themes/elegant/admin/admin.inc.php30
-rw-r--r--themes/elegant/admin/admin.tpl44
-rw-r--r--themes/elegant/admin/index.php30
-rw-r--r--themes/elegant/admin/jquery.ui.button.css571
-rw-r--r--themes/elegant/admin/upgrade.inc.php31
-rw-r--r--themes/elegant/icon/icons_sprite-hover.pngbin5699 -> 6427 bytes
-rw-r--r--themes/elegant/icon/icons_sprite.pngbin4650 -> 4928 bytes
-rw-r--r--themes/elegant/icon/icons_sprite.xcfbin24868 -> 25153 bytes
-rw-r--r--themes/elegant/index.php2
-rwxr-xr-xthemes/elegant/language/ar_SA/theme.lang.php32
-rwxr-xr-xthemes/elegant/language/bg_BG/theme.lang.php32
-rwxr-xr-xthemes/elegant/language/br_FR/theme.lang.php32
-rwxr-xr-xthemes/elegant/language/ca_ES/theme.lang.php32
-rw-r--r--themes/elegant/language/cs_CZ/index.php30
-rw-r--r--themes/elegant/language/cs_CZ/theme.lang.php11
-rwxr-xr-xthemes/elegant/language/da_DK/theme.lang.php32
-rwxr-xr-xthemes/elegant/language/de_DE/theme.lang.php32
-rwxr-xr-xthemes/elegant/language/el_GR/theme.lang.php32
-rw-r--r--themes/elegant/language/en_UK/index.php30
-rw-r--r--themes/elegant/language/en_UK/theme.lang.php11
-rwxr-xr-xthemes/elegant/language/eo_EO/theme.lang.php32
-rwxr-xr-xthemes/elegant/language/es_ES/theme.lang.php32
-rwxr-xr-xthemes/elegant/language/et_EE/theme.lang.php32
-rwxr-xr-xthemes/elegant/language/fa_IR/theme.lang.php32
-rwxr-xr-xthemes/elegant/language/fi_FI/theme.lang.php32
-rw-r--r--themes/elegant/language/fr_CA/index.php30
-rw-r--r--themes/elegant/language/fr_CA/theme.lang.php12
-rw-r--r--themes/elegant/language/fr_FR/index.php30
-rw-r--r--themes/elegant/language/fr_FR/theme.lang.php12
-rwxr-xr-xthemes/elegant/language/hu_HU/theme.lang.php32
-rw-r--r--themes/elegant/language/index.php30
-rwxr-xr-xthemes/elegant/language/it_IT/theme.lang.php32
-rw-r--r--themes/elegant/language/ja_JP/index.php7
-rwxr-xr-xthemes/elegant/language/ja_JP/theme.lang.php30
-rwxr-xr-xthemes/elegant/language/kn_IN/theme.lang.php32
-rwxr-xr-xthemes/elegant/language/ko_KR/theme.lang.php32
-rwxr-xr-xthemes/elegant/language/lt_LT/theme.lang.php32
-rwxr-xr-xthemes/elegant/language/lv_LV/theme.lang.php32
-rw-r--r--themes/elegant/language/mn_MN/index.php7
-rwxr-xr-xthemes/elegant/language/mn_MN/theme.lang.php32
-rwxr-xr-xthemes/elegant/language/nb_NO/theme.lang.php32
-rwxr-xr-xthemes/elegant/language/nl_NL/theme.lang.php32
-rwxr-xr-xthemes/elegant/language/nn_NO/theme.lang.php32
-rwxr-xr-xthemes/elegant/language/pl_PL/theme.lang.php32
-rwxr-xr-xthemes/elegant/language/pt_BR/theme.lang.php32
-rwxr-xr-xthemes/elegant/language/pt_PT/theme.lang.php32
-rwxr-xr-xthemes/elegant/language/ro_RO/theme.lang.php32
-rwxr-xr-xthemes/elegant/language/ru_RU/theme.lang.php32
-rwxr-xr-xthemes/elegant/language/sk_SK/theme.lang.php32
-rwxr-xr-xthemes/elegant/language/sl_SI/theme.lang.php32
-rwxr-xr-xthemes/elegant/language/sv_SE/theme.lang.php32
-rwxr-xr-xthemes/elegant/language/ta_IN/theme.lang.php33
-rwxr-xr-xthemes/elegant/language/th_TH/theme.lang.php33
-rwxr-xr-xthemes/elegant/language/tr_TR/theme.lang.php32
-rwxr-xr-xthemes/elegant/language/uk_UA/theme.lang.php32
-rwxr-xr-xthemes/elegant/language/vi_VN/theme.lang.php32
-rwxr-xr-xthemes/elegant/language/zh_CN/theme.lang.php32
-rwxr-xr-xthemes/elegant/language/zh_HK/theme.lang.php32
-rwxr-xr-xthemes/elegant/language/zh_TW/theme.lang.php32
-rw-r--r--themes/elegant/local_head.tpl3
-rw-r--r--themes/elegant/mail-css.tpl9
-rw-r--r--themes/elegant/scripts.js132
-rw-r--r--themes/elegant/scripts_pp.js351
-rw-r--r--themes/elegant/theme.css8
-rw-r--r--themes/elegant/themeconf.inc.php16
-rw-r--r--themes/index.php2
-rw-r--r--themes/smartpocket/admin/admin.inc.php29
-rw-r--r--themes/smartpocket/admin/admin.tpl47
-rw-r--r--themes/smartpocket/admin/index.php30
-rw-r--r--themes/smartpocket/admin/maintain.inc.php45
-rw-r--r--themes/smartpocket/admin/upgrade.inc.php29
-rw-r--r--themes/smartpocket/images/ajax-loader.gifbin0 -> 7825 bytes
-rw-r--r--themes/smartpocket/images/icons-18-black.pngbin1948 -> 1968 bytes
-rw-r--r--themes/smartpocket/images/icons-18-white.pngbin1958 -> 1988 bytes
-rw-r--r--themes/smartpocket/images/icons-36-black.pngbin3748 -> 3859 bytes
-rw-r--r--themes/smartpocket/images/icons-36-white.pngbin3746 -> 3861 bytes
-rw-r--r--themes/smartpocket/jquery.mobile.css3847
-rw-r--r--themes/smartpocket/js/code.photoswipe.min.js14
-rw-r--r--themes/smartpocket/js/jquery.mobile.min.js184
-rw-r--r--themes/smartpocket/js/smartpocket.js34
-rw-r--r--themes/smartpocket/js/thumb.arrange.js170
-rw-r--r--themes/smartpocket/language/bg_BG/index.php7
-rwxr-xr-xthemes/smartpocket/language/bg_BG/theme.lang.php28
-rw-r--r--themes/smartpocket/language/cs_CZ/index.php30
-rw-r--r--themes/smartpocket/language/cs_CZ/theme.lang.php7
-rw-r--r--themes/smartpocket/language/da_DK/index.php7
-rwxr-xr-xthemes/smartpocket/language/da_DK/theme.lang.php28
-rw-r--r--themes/smartpocket/language/de_DE/index.php7
-rwxr-xr-xthemes/smartpocket/language/de_DE/theme.lang.php27
-rw-r--r--themes/smartpocket/language/el_GR/index.php7
-rwxr-xr-xthemes/smartpocket/language/el_GR/theme.lang.php28
-rw-r--r--themes/smartpocket/language/en_UK/index.php30
-rw-r--r--themes/smartpocket/language/en_UK/theme.lang.php7
-rw-r--r--themes/smartpocket/language/eo_EO/index.php7
-rwxr-xr-xthemes/smartpocket/language/eo_EO/theme.lang.php28
-rw-r--r--themes/smartpocket/language/es_ES/index.php7
-rwxr-xr-xthemes/smartpocket/language/es_ES/theme.lang.php28
-rw-r--r--themes/smartpocket/language/et_EE/index.php7
-rwxr-xr-xthemes/smartpocket/language/et_EE/theme.lang.php28
-rw-r--r--themes/smartpocket/language/fa_IR/index.php7
-rwxr-xr-xthemes/smartpocket/language/fa_IR/theme.lang.php28
-rw-r--r--themes/smartpocket/language/fi_FI/index.php7
-rwxr-xr-xthemes/smartpocket/language/fi_FI/theme.lang.php28
-rw-r--r--themes/smartpocket/language/fr_CA/index.php30
-rw-r--r--themes/smartpocket/language/fr_CA/theme.lang.php7
-rw-r--r--themes/smartpocket/language/fr_FR/index.php30
-rw-r--r--themes/smartpocket/language/fr_FR/theme.lang.php7
-rw-r--r--themes/smartpocket/language/it_IT/index.php7
-rwxr-xr-xthemes/smartpocket/language/it_IT/theme.lang.php28
-rw-r--r--themes/smartpocket/language/lv_LV/index.php7
-rwxr-xr-xthemes/smartpocket/language/lv_LV/theme.lang.php28
-rw-r--r--themes/smartpocket/language/mn_MN/index.php7
-rwxr-xr-xthemes/smartpocket/language/mn_MN/theme.lang.php28
-rw-r--r--themes/smartpocket/language/nb_NO/index.php7
-rwxr-xr-xthemes/smartpocket/language/nb_NO/theme.lang.php28
-rw-r--r--themes/smartpocket/language/nl_NL/index.php7
-rwxr-xr-xthemes/smartpocket/language/nl_NL/theme.lang.php28
-rw-r--r--themes/smartpocket/language/pt_BR/index.php7
-rwxr-xr-xthemes/smartpocket/language/pt_BR/theme.lang.php28
-rw-r--r--themes/smartpocket/language/pt_PT/index.php7
-rwxr-xr-xthemes/smartpocket/language/pt_PT/theme.lang.php28
-rw-r--r--themes/smartpocket/language/ru_RU/index.php7
-rwxr-xr-xthemes/smartpocket/language/ru_RU/theme.lang.php28
-rw-r--r--themes/smartpocket/language/sk_SK/index.php7
-rwxr-xr-xthemes/smartpocket/language/sk_SK/theme.lang.php28
-rw-r--r--themes/smartpocket/language/ta_IN/index.php7
-rwxr-xr-xthemes/smartpocket/language/ta_IN/theme.lang.php28
-rw-r--r--themes/smartpocket/language/tr_TR/index.php7
-rwxr-xr-xthemes/smartpocket/language/tr_TR/theme.lang.php28
-rw-r--r--themes/smartpocket/language/vi_VN/index.php7
-rwxr-xr-xthemes/smartpocket/language/vi_VN/theme.lang.php28
-rw-r--r--themes/smartpocket/language/zh_HK/index.php7
-rwxr-xr-xthemes/smartpocket/language/zh_HK/theme.lang.php28
-rw-r--r--themes/smartpocket/template/about.tpl15
-rw-r--r--themes/smartpocket/template/add_menu_on_public_pages.tpl3
-rw-r--r--themes/smartpocket/template/comment_list.tpl12
-rw-r--r--themes/smartpocket/template/comments.tpl9
-rw-r--r--themes/smartpocket/template/footer.tpl4
-rw-r--r--themes/smartpocket/template/header.tpl7
-rw-r--r--themes/smartpocket/template/index.tpl8
-rw-r--r--themes/smartpocket/template/menubar.tpl55
-rw-r--r--themes/smartpocket/template/menubar_categories.tpl8
-rw-r--r--themes/smartpocket/template/menubar_identification.tpl8
-rw-r--r--themes/smartpocket/template/menubar_links.tpl11
-rw-r--r--themes/smartpocket/template/menubar_menu.tpl8
-rw-r--r--themes/smartpocket/template/menubar_specials.tpl8
-rw-r--r--themes/smartpocket/template/menubar_tags.tpl12
-rw-r--r--themes/smartpocket/template/navigation_bar.tpl2
-rw-r--r--themes/smartpocket/template/notification.tpl13
-rw-r--r--themes/smartpocket/template/picture.tpl175
-rw-r--r--themes/smartpocket/template/picture_content.tpl2
-rw-r--r--themes/smartpocket/template/picture_nav_buttons.tpl13
-rw-r--r--themes/smartpocket/template/register.tpl4
-rw-r--r--themes/smartpocket/template/search.tpl65
-rw-r--r--themes/smartpocket/template/tags.tpl15
-rw-r--r--themes/smartpocket/template/thumbnails.tpl39
-rw-r--r--themes/smartpocket/theme.css48
-rw-r--r--themes/smartpocket/themeconf.inc.php105
-rw-r--r--tools/config.inc.php8
-rw-r--r--tools/convert_language_to_2.1.pl184
-rw-r--r--tools/convert_template_to_2.1.pl48
-rw-r--r--tools/index.php2
-rwxr-xr-xtools/key2value.php126
-rw-r--r--tools/metadata.php2
-rw-r--r--tools/release_creation.readme50
-rwxr-xr-xtools/replace.php53
-rw-r--r--tools/replace_language_keys.pl60
-rw-r--r--tools/replace_language_values.pl61
-rw-r--r--tools/translation_analysis.php2
-rw-r--r--tools/triggers_list.php99
-rw-r--r--tools/ws.htm251
-rw-r--r--upgrade.php41
-rw-r--r--upgrade_feed.php2
-rw-r--r--ws.php749
1501 files changed, 95029 insertions, 36971 deletions
diff --git a/about.php b/about.php
index be6f4892f..e4f04bf84 100644
--- a/about.php
+++ b/about.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/action.php b/action.php
index c200fe677..4b92e056c 100644
--- a/action.php
+++ b/action.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/admin.php b/admin.php
index a49b45375..cf36ce516 100644
--- a/admin.php
+++ b/admin.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -103,7 +103,7 @@ $test_get = $_GET;
unset($test_get['page']);
unset($test_get['section']);
unset($test_get['tag']);
-if (count($test_get) == 0)
+if (count($test_get) == 0 and !empty($_SERVER['QUERY_STRING']))
{
$change_theme_url.= str_replace('&', '&', $_SERVER['QUERY_STRING']).'&';
}
@@ -189,7 +189,7 @@ $template->assign(
'U_CAT_OPTIONS'=> $link_start.'cat_options',
'U_CAT_UPDATE'=> $link_start.'site_update&site=1',
'U_RATING'=> $link_start.'rating',
- 'U_RECENT_SET'=> $link_start.'batch_manager&cat=recent',
+ 'U_RECENT_SET'=> $link_start.'batch_manager&filter=prefilter-last_import',
'U_BATCH'=> $link_start.'batch_manager',
'U_TAGS'=> $link_start.'tags',
'U_USERS'=> $link_start.'user_list',
@@ -206,7 +206,20 @@ $template->assign(
if ($conf['activate_comments'])
{
- $template->assign('U_PENDING_COMMENTS', $link_start.'comments');
+ $template->assign('U_COMMENTS', $link_start.'comments');
+
+ // pending comments
+ $query = '
+SELECT COUNT(*)
+ FROM '.COMMENTS_TABLE.'
+ WHERE validated=\'false\'
+;';
+ list($nb_comments) = pwg_db_fetch_row(pwg_query($query));
+
+ if ($nb_comments > 0)
+ {
+ $template->assign('NB_PENDING_COMMENTS', $nb_comments);
+ }
}
// any photo in the caddie?
@@ -222,7 +235,7 @@ if ($nb_photos_in_caddie > 0)
$template->assign(
array(
'NB_PHOTOS_IN_CADDIE' => $nb_photos_in_caddie,
- 'U_CADDIE' => $link_start.'batch_manager&cat=caddie',
+ 'U_CADDIE' => $link_start.'batch_manager&filter=prefilter-caddie',
)
);
}
@@ -250,20 +263,16 @@ if (
array(
'site_manager', // delete site
'site_update', // ?only POST
- 'cat_list', // delete cat
- 'cat_move', // ?only POST
- 'cat_options', // ?only POST; public/private; lock/unlock
- 'user_perm',
- 'group_perm',
- 'group_list', // delete group
)
)
or ( !empty($_POST) and in_array($page['page'],
array(
- 'photo',
'album', // public/private; lock/unlock, permissions
+ 'cat_move',
+ 'cat_options', // public/private; lock/unlock
'batch_manager', // associate/dissociate; delete; set level
'user_list', // group assoc; user level
+ 'user_perm',
)
)
)
diff --git a/admin/album.php b/admin/album.php
index 02517629c..d1186aae1 100644
--- a/admin/album.php
+++ b/admin/album.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/admin/album_notification.php b/admin/album_notification.php
index 322776302..19d5d5f01 100644
--- a/admin/album_notification.php
+++ b/admin/album_notification.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -80,28 +80,29 @@ SELECT id, file, path, representative_ext
$img_url = '';
}
- // TODO Mettre un array pour traduction subjet
pwg_mail_group(
$_POST['group'],
- get_str_email_format(true), /* TODO add a checkbox in order to choose format*/
- get_l10n_args('[%s] Visit album %s',
- array($conf['gallery_title'], $category['name'])),
- 'cat_group_info',
- array
- (
- 'IMG_URL' => $img_url,
- 'CAT_NAME' => $category['name'],
- 'LINK' => make_index_url(
- array(
+ array(
+ 'subject' => l10n('[%s] Visit album %s', $conf['gallery_title'], $category['name']),
+ // TODO : change this language variable to 'Visit album %s'
+ // TODO : 'language_selected' => ....
+ ),
+ array(
+ 'filename' => 'cat_group_info',
+ 'assign' => array(
+ 'IMG_URL' => $img_url,
+ 'CAT_NAME' => $category['name'],
+ 'LINK' => make_index_url(array(
'category' => array(
'id' => $category['id'],
'name' => $category['name'],
'permalink' => $category['permalink']
- ))),
- 'CPL_CONTENT' => empty($_POST['mail_content'])
- ? '' : stripslashes($_POST['mail_content'])
- ),
- '' /* TODO Add listbox in order to choose Language selected */);
+ )
+ )),
+ 'CPL_CONTENT' => empty($_POST['mail_content']) ? '' : stripslashes($_POST['mail_content']),
+ )
+ )
+ );
unset_make_full_url();
@@ -113,13 +114,7 @@ SELECT
;';
list($group_name) = pwg_db_fetch_row(pwg_query($query));
- array_push(
- $page['infos'],
- sprintf(
- l10n('An information email was sent to group "%s"'),
- $group_name
- )
- );
+ $page['infos'][] = l10n('An information email was sent to group "%s"', $group_name);
}
// +-----------------------------------------------------------------------+
diff --git a/admin/batch_manager.php b/admin/batch_manager.php
index a5c82d061..2cb76f7e1 100644
--- a/admin/batch_manager.php
+++ b/admin/batch_manager.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -43,10 +43,12 @@ check_status(ACCESS_ADMINISTRATOR);
check_input_parameter('selection', $_POST, true, PATTERN_ID);
+
// +-----------------------------------------------------------------------+
// | initialize current set |
// +-----------------------------------------------------------------------+
+// filters from form
if (isset($_POST['submitFilter']))
{
// echo '<pre>'; print_r($_POST); echo '</pre>';
@@ -109,39 +111,52 @@ if (isset($_POST['submitFilter']))
}
}
}
-else if (isset($_GET['cat']))
+// filters from url
+else if (isset($_GET['filter']))
{
- if ('caddie' == $_GET['cat'])
+ if (!is_array($_GET['filter']))
{
- $_SESSION['bulk_manager_filter'] = array(
- 'prefilter' => 'caddie'
- );
- }
- else if ('recent' == $_GET['cat'])
- {
- $_SESSION['bulk_manager_filter'] = array(
- 'prefilter' => 'last import'
- );
+ $_GET['filter'] = explode(',', $_GET['filter']);
}
- else if (is_numeric($_GET['cat']))
- {
- $_SESSION['bulk_manager_filter'] = array(
- 'category' => $_GET['cat']
- );
- }
-}
-else if (isset($_GET['tag']))
-{
- if (is_numeric($_GET['tag']))
+
+ $_SESSION['bulk_manager_filter'] = array();
+
+ foreach ($_GET['filter'] as $filter)
{
- $_SESSION['bulk_manager_filter'] = array(
- 'tags' => array($_GET['tag']),
- 'tag_mode' => 'AND',
- );
+ list($type, $value) = explode('-', $filter);
+
+ switch ($type)
+ {
+ case 'prefilter':
+ $_SESSION['bulk_manager_filter']['prefilter'] = $value;
+ break;
+
+ case 'album':
+ if (is_numeric($value))
+ {
+ $_SESSION['bulk_manager_filter']['category'] = $value;
+ }
+ break;
+
+ case 'tag':
+ if (is_numeric($value))
+ {
+ $_SESSION['bulk_manager_filter']['tags'] = array($value);
+ $_SESSION['bulk_manager_filter']['tag_mode'] = 'AND';
+ }
+ break;
+
+ case 'level':
+ if (is_numeric($value) && in_array($value, $conf['available_permission_levels']))
+ {
+ $_SESSION['bulk_manager_filter']['level'] = $value;
+ }
+ break;
+ }
}
}
-if (!isset($_SESSION['bulk_manager_filter']))
+if (empty($_SESSION['bulk_manager_filter']))
{
$_SESSION['bulk_manager_filter'] = array(
'prefilter' => 'caddie'
@@ -150,26 +165,33 @@ if (!isset($_SESSION['bulk_manager_filter']))
// echo '<pre>'; print_r($_SESSION['bulk_manager_filter']); echo '</pre>';
-// depending on the current filter (in session), we find the appropriate
-// photos
+// depending on the current filter (in session), we find the appropriate photos
$filter_sets = array();
if (isset($_SESSION['bulk_manager_filter']['prefilter']))
{
- if ('caddie' == $_SESSION['bulk_manager_filter']['prefilter'])
+ switch ($_SESSION['bulk_manager_filter']['prefilter'])
{
+ case 'caddie':
$query = '
SELECT element_id
FROM '.CADDIE_TABLE.'
WHERE user_id = '.$user['id'].'
;';
- array_push(
- $filter_sets,
- array_from_query($query, 'element_id')
- );
- }
+ $filter_sets[] = array_from_query($query, 'element_id');
+
+ break;
- if ('last import'== $_SESSION['bulk_manager_filter']['prefilter'])
- {
+ case 'favorites':
+ $query = '
+SELECT image_id
+ FROM '.FAVORITES_TABLE.'
+ WHERE user_id = '.$user['id'].'
+;';
+ $filter_sets[] = array_from_query($query, 'image_id');
+
+ break;
+
+ case 'last_import':
$query = '
SELECT MAX(date_available) AS date
FROM '.IMAGES_TABLE.'
@@ -182,15 +204,12 @@ SELECT id
FROM '.IMAGES_TABLE.'
WHERE date_available BETWEEN '.pwg_db_get_recent_period_expression(1, $row['date']).' AND \''.$row['date'].'\'
;';
- array_push(
- $filter_sets,
- array_from_query($query, 'id')
- );
+ $filter_sets[] = array_from_query($query, 'id');
}
- }
+
+ break;
- if ('with no virtual album' == $_SESSION['bulk_manager_filter']['prefilter'])
- {
+ case 'no_virtual_album':
// we are searching elements not linked to any virtual category
$query = '
SELECT id
@@ -214,14 +233,11 @@ SELECT id
$linked_to_virtual = array_from_query($query, 'image_id');
}
- array_push(
- $filter_sets,
- array_diff($all_elements, $linked_to_virtual)
- );
- }
+ $filter_sets[] = array_diff($all_elements, $linked_to_virtual);
+
+ break;
- if ('with no album' == $_SESSION['bulk_manager_filter']['prefilter'])
- {
+ case 'no_album':
$query = '
SELECT
id
@@ -229,14 +245,11 @@ SELECT
LEFT JOIN '.IMAGE_CATEGORY_TABLE.' ON id = image_id
WHERE category_id is null
;';
- array_push(
- $filter_sets,
- array_from_query($query, 'id')
- );
- }
+ $filter_sets[] = array_from_query($query, 'id');
+
+ break;
- if ('with no tag' == $_SESSION['bulk_manager_filter']['prefilter'])
- {
+ case 'no_tag':
$query = '
SELECT
id
@@ -244,19 +257,15 @@ SELECT
LEFT JOIN '.IMAGE_TAG_TABLE.' ON id = image_id
WHERE tag_id is null
;';
- array_push(
- $filter_sets,
- array_from_query($query, 'id')
- );
- }
+ $filter_sets[] = array_from_query($query, 'id');
+
+ break;
- if ('duplicates' == $_SESSION['bulk_manager_filter']['prefilter'])
- {
+ case 'duplicates':
// we could use the group_concat MySQL function to retrieve the list of
// image_ids but it would not be compatible with PostgreSQL, so let's
// perform 2 queries instead. We hope there are not too many duplicates.
-
$query = '
SELECT file
FROM '.IMAGES_TABLE.'
@@ -268,23 +277,21 @@ SELECT file
$query = '
SELECT id
FROM '.IMAGES_TABLE.'
- WHERE file IN (\''.implode("','", $duplicate_files).'\')
+ WHERE file IN (\''.implode("','", array_map('pwg_db_real_escape_string', $duplicate_files)).'\')
;';
+ $filter_sets[] = array_from_query($query, 'id');
+
+ break;
- array_push(
- $filter_sets,
- array_from_query($query, 'id')
- );
- }
-
- if ('all photos' == $_SESSION['bulk_manager_filter']['prefilter'])
- {
+ case 'all_photos':
$query = '
SELECT id
FROM '.IMAGES_TABLE.'
'.$conf['order_by'];
$filter_sets[] = array_from_query($query, 'id');
+
+ break;
}
$filter_sets = trigger_event('perform_batch_manager_prefilters', $filter_sets, $_SESSION['bulk_manager_filter']['prefilter']);
@@ -308,10 +315,7 @@ if (isset($_SESSION['bulk_manager_filter']['category']))
FROM '.IMAGE_CATEGORY_TABLE.'
WHERE category_id IN ('.implode(',', $categories).')
;';
- array_push(
- $filter_sets,
- array_from_query($query, 'image_id')
- );
+ $filter_sets[] = array_from_query($query, 'image_id');
}
if (isset($_SESSION['bulk_manager_filter']['level']))
@@ -333,15 +337,12 @@ SELECT id
if (!empty($_SESSION['bulk_manager_filter']['tags']))
{
- array_push(
- $filter_sets,
- get_image_ids_for_tags(
- $_SESSION['bulk_manager_filter']['tags'],
- $_SESSION['bulk_manager_filter']['tag_mode'],
- null,
- null,
- false // we don't apply permissions in administration screens
- )
+ $filter_sets[] = get_image_ids_for_tags(
+ $_SESSION['bulk_manager_filter']['tags'],
+ $_SESSION['bulk_manager_filter']['tag_mode'],
+ null,
+ null,
+ false // we don't apply permissions in administration screens
);
}
@@ -390,6 +391,7 @@ foreach ($filter_sets as $set)
}
$page['cat_elements_id'] = $current_set;
+
// +-----------------------------------------------------------------------+
// | first element to display |
// +-----------------------------------------------------------------------+
@@ -410,6 +412,7 @@ else
$page['start'] = $_REQUEST['start'];
}
+
// +-----------------------------------------------------------------------+
// | Tabs |
// +-----------------------------------------------------------------------+
@@ -429,6 +432,7 @@ $tabsheet->set_id('batch_manager');
$tabsheet->select($page['tab']);
$tabsheet->assign();
+
// +-----------------------------------------------------------------------+
// | tags |
// +-----------------------------------------------------------------------+
@@ -439,6 +443,7 @@ SELECT id, name
;';
$template->assign('tags', get_taglist($query, false));
+
// +-----------------------------------------------------------------------+
// | dimensions |
// +-----------------------------------------------------------------------+
@@ -457,21 +462,25 @@ SELECT
;';
$result = pwg_query($query);
-if (!pwg_db_num_rows($result))
-{ // arbitrary values, only used when no photos on the gallery
- $widths = array(600, 1920, 3500);
- $heights = array(480, 1080, 2300);
- $ratios = array(1.25, 1.52, 1.78);
-}
-else
+if (pwg_db_num_rows($result))
{
while ($row = pwg_db_fetch_assoc($result))
{
- $widths[] = $row['width'];
- $heights[] = $row['height'];
- $ratios[] = floor($row['width'] * 100 / $row['height']) / 100;
+ if ($row['width']>0 && $row['height']>0)
+ {
+ $widths[] = $row['width'];
+ $heights[] = $row['height'];
+ $ratios[] = floor($row['width'] / $row['height'] * 100) / 100;
+ }
}
}
+if (empty($widths))
+{ // arbitrary values, only used when no photos on the gallery
+ $widths = array(600, 1920, 3500);
+ $heights = array(480, 1080, 2300);
+ $ratios = array(1.25, 1.52, 1.78);
+}
+
$widths = array_unique($widths);
@@ -530,7 +539,7 @@ foreach (array_keys($ratio_categories) as $ratio_category)
{
$dimensions['ratio_'.$ratio_category] = array(
'min' => $ratio_categories[$ratio_category][0],
- 'max' => $ratio_categories[$ratio_category][count($ratio_categories[$ratio_category]) - 1]
+ 'max' => array_pop($ratio_categories[$ratio_category]),
);
}
}
diff --git a/admin/batch_manager_global.php b/admin/batch_manager_global.php
index e74a6dd9d..2828d8b9b 100644
--- a/admin/batch_manager_global.php
+++ b/admin/batch_manager_global.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -82,7 +82,7 @@ if (isset($_POST['submit']))
// photo in the selection
if (count($collection) == 0)
{
- array_push($page['errors'], l10n('Select at least one photo'));
+ $page['errors'][] = l10n('Select at least one photo');
}
$action = $_POST['selectAction'];
@@ -105,14 +105,14 @@ DELETE
{
if (empty($_POST['add_tags']))
{
- array_push($page['errors'], l10n('Select at least one tag'));
+ $page['errors'][] = l10n('Select at least one tag');
}
else
{
$tag_ids = get_tag_ids($_POST['add_tags']);
add_tags($tag_ids, $collection);
- if ('with no tag' == $page['prefilter'])
+ if ('no_tag' == $page['prefilter'])
{
redirect($redirect_url);
}
@@ -121,11 +121,8 @@ DELETE
if ('del_tags' == $action)
{
- if (count($_POST['del_tags']) == 0)
- {
- array_push($page['errors'], l10n('Select at least one tag'));
- }
-
+ if (isset($_POST['del_tags']) and count($_POST['del_tags']) > 0)
+ {
$query = '
DELETE
FROM '.IMAGE_TAG_TABLE.'
@@ -133,6 +130,11 @@ DELETE
AND tag_id IN ('.implode(',', $_POST['del_tags']).')
;';
pwg_query($query);
+ }
+ else
+ {
+ $page['errors'][] = l10n('Select at least one tag');
+ }
}
if ('associate' == $action)
@@ -147,12 +149,12 @@ DELETE
);
// let's refresh the page because we the current set might be modified
- if ('with no album' == $page['prefilter'])
+ if ('no_album' == $page['prefilter'])
{
redirect($redirect_url);
}
- if ('with no virtual album' == $page['prefilter'])
+ if ('no_virtual_album' == $page['prefilter'])
{
$category_info = get_cat_info($_POST['associate']);
if (empty($category_info['dir']))
@@ -171,12 +173,12 @@ DELETE
);
// let's refresh the page because we the current set might be modified
- if ('with no album' == $page['prefilter'])
+ if ('no_album' == $page['prefilter'])
{
redirect($redirect_url);
}
- if ('with no virtual album' == $page['prefilter'])
+ if ('no_virtual_album' == $page['prefilter'])
{
$category_info = get_cat_info($_POST['move']);
if (empty($category_info['dir']))
@@ -239,12 +241,9 @@ DELETE
$datas = array();
foreach ($collection as $image_id)
{
- array_push(
- $datas,
- array(
- 'id' => $image_id,
- 'author' => $_POST['author']
- )
+ $datas[] = array(
+ 'id' => $image_id,
+ 'author' => $_POST['author']
);
}
@@ -266,12 +265,9 @@ DELETE
$datas = array();
foreach ($collection as $image_id)
{
- array_push(
- $datas,
- array(
- 'id' => $image_id,
- 'name' => $_POST['title']
- )
+ $datas[] = array(
+ 'id' => $image_id,
+ 'name' => $_POST['title']
);
}
@@ -300,12 +296,9 @@ DELETE
$datas = array();
foreach ($collection as $image_id)
{
- array_push(
- $datas,
- array(
- 'id' => $image_id,
- 'date_creation' => $date_creation
- )
+ $datas[] = array(
+ 'id' => $image_id,
+ 'date_creation' => $date_creation
);
}
@@ -322,12 +315,9 @@ DELETE
$datas = array();
foreach ($collection as $image_id)
{
- array_push(
- $datas,
- array(
- 'id' => $image_id,
- 'level' => $_POST['level']
- )
+ $datas[] = array(
+ 'id' => $image_id,
+ 'level' => $_POST['level']
);
}
@@ -360,15 +350,9 @@ DELETE
$deleted_count = delete_elements($collection, true);
if ($deleted_count > 0)
{
- $_SESSION['page_infos'] = array(
- sprintf(
- l10n_dec(
- '%d photo was deleted',
- '%d photos were deleted',
- $deleted_count
- ),
- $deleted_count
- )
+ $_SESSION['page_infos'][] = l10n_dec(
+ '%d photo was deleted', '%d photos were deleted',
+ $deleted_count
);
$redirect_url = get_root_url().'admin.php?page='.$_GET['page'];
@@ -376,12 +360,12 @@ DELETE
}
else
{
- array_push($page['errors'], l10n('No photo can be deleted'));
+ $page['errors'][] = l10n('No photo can be deleted');
}
}
else
{
- array_push($page['errors'], l10n('You need to confirm deletion'));
+ $page['errors'][] = l10n('You need to confirm deletion');
}
}
@@ -389,11 +373,7 @@ DELETE
if ('metadata' == $action)
{
sync_metadata($collection);
-
- array_push(
- $page['infos'],
- l10n('Metadata synchronized from file')
- );
+ $page['infos'][] = l10n('Metadata synchronized from file');
}
if ('delete_derivatives' == $action)
@@ -413,11 +393,13 @@ DELETE
if ('generate_derivatives' == $action)
{
if ($_POST['regenerateSuccess'] != '0')
- array_push($page['infos'], sprintf(l10n('%s photos have been regenerated'), $_POST['regenerateSuccess']));
-
+ {
+ $page['infos'][] = l10n('%s photos have been regenerated', $_POST['regenerateSuccess']);
+ }
if ($_POST['regenerateError'] != '0')
- array_push($page['warnings'], sprintf(l10n('%s photos can not be regenerated'), $_POST['regenerateError']));
-
+ {
+ $page['warnings'][] = l10n('%s photos can not be regenerated', $_POST['regenerateError']);
+ }
}
trigger_action('element_set_global_action', $action, $collection);
@@ -432,18 +414,17 @@ $base_url = get_root_url().'admin.php';
$prefilters = array(
array('ID' => 'caddie', 'NAME' => l10n('Caddie')),
- array('ID' => 'last import', 'NAME' => l10n('Last import')),
- array('ID' => 'with no album', 'NAME' => l10n('With no album')),
- array('ID' => 'with no tag', 'NAME' => l10n('With no tag')),
+ array('ID' => 'favorites', 'NAME' => l10n('Your favorites')),
+ array('ID' => 'last_import', 'NAME' => l10n('Last import')),
+ array('ID' => 'no_album', 'NAME' => l10n('With no album')),
+ array('ID' => 'no_tag', 'NAME' => l10n('With no tag')),
array('ID' => 'duplicates', 'NAME' => l10n('Duplicates')),
- array('ID' => 'all photos', 'NAME' => l10n('All'))
+ array('ID' => 'all_photos', 'NAME' => l10n('All'))
);
if ($conf['enable_synchronization'])
{
- array_push($prefilters,
- array('ID' => 'with no virtual album', 'NAME' => l10n('With no virtual album'))
- );
+ $prefilters[] = array('ID' => 'no_virtual_album', 'NAME' => l10n('With no virtual album'));
}
$prefilters = trigger_event('get_batch_manager_prefilters', $prefilters);
@@ -457,7 +438,7 @@ $template->assign(
'all_elements' => $page['cat_elements_id'],
'START' => $page['start'],
'U_DISPLAY'=>$base_url.get_query_string_diff(array('display')),
- 'F_ACTION'=>$base_url.get_query_string_diff(array('cat','start','tag')),
+ 'F_ACTION'=>$base_url.get_query_string_diff(array('cat','start','tag','filter')),
)
);
diff --git a/admin/batch_manager_unit.php b/admin/batch_manager_unit.php
index 41edd350d..550235929 100644
--- a/admin/batch_manager_unit.php
+++ b/admin/batch_manager_unit.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -103,7 +103,7 @@ SELECT id, date_creation
$data['date_creation'] = $row['date_creation'];
}
- array_push($datas, $data);
+ $datas[] = $data;
// tags management
$tag_ids = array();
@@ -123,7 +123,7 @@ SELECT id, date_creation
$datas
);
- array_push($page['infos'], l10n('Photo informations updated'));
+ $page['infos'][] = l10n('Photo informations updated');
}
// +-----------------------------------------------------------------------+
@@ -232,7 +232,7 @@ SELECT *
while ($row = pwg_db_fetch_assoc($result))
{
- array_push($element_ids, $row['id']);
+ $element_ids[] = $row['id'];
$src_image = new SrcImage($row);
diff --git a/admin/cat_list.php b/admin/cat_list.php
index be359e5be..729fe845f 100644
--- a/admin/cat_list.php
+++ b/admin/cat_list.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -78,7 +78,7 @@ function save_categories_order($categories)
$current_rank++;
}
- array_push($datas, array('id' => $id, 'rank' => $current_rank));
+ $datas[] = array('id' => $id, 'rank' => $current_rank);
}
$fields = array('primary' => array('id'), 'update' => array('rank'));
mass_updates(CATEGORIES_TABLE, $fields, $datas);
@@ -115,43 +115,42 @@ if (isset($_GET['delete']) and is_numeric($_GET['delete']))
delete_categories(array($_GET['delete']));
$_SESSION['page_infos'] = array(l10n('Virtual album deleted'));
update_global_rank();
+ invalidate_user_cache();
$redirect_url = get_root_url().'admin.php?page=cat_list';
if (isset($_GET['parent_id']))
{
$redirect_url.= '&parent_id='.$_GET['parent_id'];
- }
+ }
redirect($redirect_url);
}
// request to add a virtual category
-else if (isset($_POST['submitAdd']))
+elseif (isset($_POST['submitAdd']))
{
$output_create = create_virtual_category(
$_POST['virtual_name'],
@$_GET['parent_id']
);
+ invalidate_user_cache();
if (isset($output_create['error']))
{
- array_push($page['errors'], $output_create['error']);
+ $page['errors'][] = $output_create['error'];
}
else
{
- array_push($page['infos'], $output_create['info']);
+ $page['infos'][] = $output_create['info'];
}
}
// save manual category ordering
-else if (isset($_POST['submitManualOrder']))
+elseif (isset($_POST['submitManualOrder']))
{
asort($_POST['catOrd'], SORT_NUMERIC);
save_categories_order(array_keys($_POST['catOrd']));
- array_push(
- $page['infos'],
- l10n('Album manual order was saved')
- );
+ $page['infos'][] = l10n('Album manual order was saved');
}
-else if (isset($_POST['submitAutoOrder']))
+elseif (isset($_POST['submitAutoOrder']))
{
$query = '
SELECT id
@@ -178,17 +177,11 @@ SELECT id, name, id_uppercat
$result = pwg_query($query);
while ($row = pwg_db_fetch_assoc($result))
{
- array_push(
- $categories,
- array(
- 'id' => $row['id'],
- 'id_uppercat' => $row['id_uppercat'],
- )
- );
- array_push(
- $names,
- $row['name']
+ $categories[] = array(
+ 'id' => $row['id'],
+ 'id_uppercat' => $row['id_uppercat'],
);
+ $names[] = $row['name'];
}
array_multisort(
@@ -199,10 +192,7 @@ SELECT id, name, id_uppercat
);
save_categories_order($categories);
- array_push(
- $page['infos'],
- l10n('Albums automatically sorted')
- );
+ $page['infos'][] = l10n('Albums automatically sorted');
}
// +-----------------------------------------------------------------------+
@@ -215,8 +205,7 @@ if (isset($_GET['parent_id']))
$navigation.= get_cat_display_name_from_id(
$_GET['parent_id'],
- $base_url.'&amp;parent_id=',
- false
+ $base_url.'&amp;parent_id='
);
}
// +-----------------------------------------------------------------------+
@@ -262,17 +251,66 @@ $categories = hash_from_query($query, 'id');
// get the categories containing images directly
$categories_with_images = array();
-if ( count($categories) )
+if (count($categories))
{
$query = '
-SELECT DISTINCT category_id
+SELECT
+ category_id,
+ COUNT(*) AS nb_photos
FROM '.IMAGE_CATEGORY_TABLE.'
- WHERE category_id IN ('.implode(',', array_keys($categories)).')';
- $categories_with_images = array_flip( array_from_query($query, 'category_id') );
+ GROUP BY category_id
+;';
+ // WHERE category_id IN ('.implode(',', array_keys($categories)).')
+
+ $nb_photos_in = query2array($query, 'category_id', 'nb_photos');
+
+ $query = '
+SELECT
+ id,
+ uppercats
+ FROM '.CATEGORIES_TABLE.'
+;';
+ $all_categories = query2array($query, 'id', 'uppercats');
+ $subcats_of = array();
+
+ foreach (array_keys($categories) as $cat_id)
+ {
+ foreach ($all_categories as $id => $uppercats)
+ {
+ if (preg_match('/(^|,)'.$cat_id.',/', $uppercats))
+ {
+ @$subcats_of[$cat_id][] = $id;
+ }
+ }
+ }
+
+ $nb_sub_photos = array();
+ foreach ($subcats_of as $cat_id => $subcat_ids)
+ {
+ $nb_photos = 0;
+ foreach ($subcat_ids as $id)
+ {
+ if (isset($nb_photos_in[$id]))
+ {
+ $nb_photos+= $nb_photos_in[$id];
+ }
+ }
+
+ $nb_sub_photos[$cat_id] = $nb_photos;
+ }
}
$template->assign('categories', array());
$base_url = get_root_url().'admin.php?page=';
+
+if (isset($_GET['parent_id']))
+{
+ $template->assign(
+ 'PARENT_EDIT',
+ $base_url.'album-'.$_GET['parent_id']
+ );
+}
+
foreach ($categories as $category)
{
$cat_list_url = $base_url.'cat_list';
@@ -291,6 +329,9 @@ foreach ($categories as $category)
$category['name'],
'admin_cat_list'
),
+ 'NB_PHOTOS' => isset($nb_photos_in[$category['id']]) ? $nb_photos_in[$category['id']] : 0,
+ 'NB_SUB_PHOTOS' => isset($nb_sub_photos[$category['id']]) ? $nb_sub_photos[$category['id']] : 0,
+ 'NB_SUB_ALBUMS' => isset($subcats_of[$category['id']]) ? count($subcats_of[$category['id']]) : 0,
'ID' => $category['id'],
'RANK' => $category['rank']*10,
@@ -319,12 +360,6 @@ foreach ($categories as $category)
}
}
- if ( array_key_exists($category['id'], $categories_with_images) )
- {
- $tpl_cat['U_MANAGE_ELEMENTS']=
- $base_url.'batch_manager&amp;cat='.$category['id'];
- }
-
$template->append('categories', $tpl_cat);
}
diff --git a/admin/cat_modify.php b/admin/cat_modify.php
index ff05946d9..4eeeffe42 100644
--- a/admin/cat_modify.php
+++ b/admin/cat_modify.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -114,27 +114,23 @@ if ( !isset( $_GET['cat_id'] ) || !is_numeric( $_GET['cat_id'] ) )
//--------------------------------------------------------- form criteria check
if (isset($_POST['submit']))
{
- $data =
- array(
- 'id' => $_GET['cat_id'],
- 'name' => @$_POST['name'],
- 'comment' =>
- $conf['allow_html_descriptions'] ?
- @$_POST['comment'] : strip_tags(@$_POST['comment']),
- );
+ $data = array(
+ 'id' => $_GET['cat_id'],
+ 'name' => @$_POST['name'],
+ 'comment' =>
+ $conf['allow_html_descriptions'] ?
+ @$_POST['comment'] : strip_tags(@$_POST['comment']),
+ );
if ($conf['activate_comments'])
{
$data['commentable'] = isset($_POST['commentable'])?$_POST['commentable']:'false';
}
-
- mass_updates(
+
+ single_update(
CATEGORIES_TABLE,
- array(
- 'primary' => array('id'),
- 'update' => array_diff(array_keys($data), array('id'))
- ),
- array($data)
+ $data,
+ array('id' => $data['id'])
);
// retrieve cat infos before continuing (following updates are expensive)
@@ -235,6 +231,7 @@ $template->assign(
)
),
+ 'U_ADD_PHOTOS_ALBUM' => $base_url.'photos_add&amp;album='.$category['id'],
'U_CHILDREN' => $cat_list_url.'&amp;parent_id='.$category['id'],
'U_HELP' => get_root_url().'admin/popuphelp.php?page=cat_modify',
@@ -252,7 +249,7 @@ if ($category['has_images'])
{
$template->assign(
'U_MANAGE_ELEMENTS',
- $base_url.'batch_manager&amp;cat='.$category['id']
+ $base_url.'batch_manager&amp;filter=album-'.$category['id']
);
$query = '
@@ -268,16 +265,16 @@ SELECT
if ($min_date == $max_date)
{
- $intro = sprintf(
- l10n('This album contains %d photos, added on %s.'),
+ $intro = l10n(
+ 'This album contains %d photos, added on %s.',
$image_count,
format_date($min_date)
);
}
else
{
- $intro = sprintf(
- l10n('This album contains %d photos, added between %s and %s.'),
+ $intro = l10n(
+ 'This album contains %d photos, added between %s and %s.',
$image_count,
format_date($min_date),
format_date($max_date)
@@ -289,7 +286,7 @@ else
$intro = l10n('This album contains no photo.');
}
-$intro.= '<br>'.sprintf(l10n('Numeric identifier : %d'), $category['id']);
+$intro.= '<br>'.l10n('Numeric identifier : %d', $category['id']);
$template->assign('INTRO', $intro);
diff --git a/admin/cat_move.php b/admin/cat_move.php
index 5ea86cdce..d596d4e67 100644
--- a/admin/cat_move.php
+++ b/admin/cat_move.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -51,10 +51,7 @@ if (isset($_POST['submit']))
}
else
{
- array_push(
- $page['errors'],
- l10n('Select at least one album')
- );
+ $page['errors'][] = l10n('Select at least one album');
}
}
diff --git a/admin/cat_options.php b/admin/cat_options.php
index 6887d48a6..f191095b6 100644
--- a/admin/cat_options.php
+++ b/admin/cat_options.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/admin/cat_perm.php b/admin/cat_perm.php
index ad9ff1a05..71653d9ec 100644
--- a/admin/cat_perm.php
+++ b/admin/cat_perm.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -98,7 +98,7 @@ DELETE
{
$cat_ids = array_merge($cat_ids, get_subcat_ids(array($page['cat'])));
}
-
+
$query = '
SELECT id
FROM '.CATEGORIES_TABLE.'
@@ -106,46 +106,25 @@ SELECT id
AND status = \'private\'
;';
$private_cats = array_from_query($query, 'id');
-
- // We must not reinsert already existing lines in group_access table
- $granteds = array();
- foreach ($private_cats as $cat_id)
- {
- $granteds[$cat_id] = array();
- }
-
- $query = '
-SELECT
- group_id,
- cat_id
- FROM '.GROUP_ACCESS_TABLE.'
- WHERE cat_id IN ('.implode(',', $private_cats).')
- AND group_id IN ('.implode(',', $grant_groups).')
-;';
- $result = pwg_query($query);
- while ($row = pwg_db_fetch_assoc($result))
- {
- array_push($granteds[$row['cat_id']], $row['group_id']);
- }
-
- $inserts = array();
+ $inserts = array();
foreach ($private_cats as $cat_id)
{
- $group_ids = array_diff($grant_groups, $granteds[$cat_id]);
- foreach ($group_ids as $group_id)
+ foreach ($grant_groups as $group_id)
{
- array_push(
- $inserts,
- array(
- 'group_id' => $group_id,
- 'cat_id' => $cat_id
- )
+ $inserts[] = array(
+ 'group_id' => $group_id,
+ 'cat_id' => $cat_id
);
}
}
-
- mass_inserts(GROUP_ACCESS_TABLE, array('group_id','cat_id'), $inserts);
+
+ mass_inserts(
+ GROUP_ACCESS_TABLE,
+ array('group_id','cat_id'),
+ $inserts,
+ array('ignore'=>true)
+ );
}
//
@@ -190,7 +169,7 @@ DELETE
}
}
- array_push($page['infos'], l10n('Album updated successfully'));
+ $page['infos'][] = l10n('Album updated successfully');
}
// +-----------------------------------------------------------------------+
@@ -272,11 +251,11 @@ SELECT user_id, group_id
$result = pwg_query($query);
while ($row = pwg_db_fetch_assoc($result))
{
- if (!isset($granted_groups[$row['group_id']]))
+ if (!isset($granted_groups[ $row['group_id'] ]))
{
- $granted_groups[$row['group_id']] = array();
+ $granted_groups[ $row['group_id'] ] = array();
}
- array_push($granted_groups[$row['group_id']], $row['user_id']);
+ $granted_groups[ $row['group_id'] ][] = $row['user_id'];
}
$user_granted_by_group_ids = array();
@@ -302,7 +281,7 @@ SELECT user_id, group_id
{
if (in_array($user_id, $user_granted_indirect_ids))
{
- array_push($group_usernames, $users[$user_id]);
+ $group_usernames[] = $users[$user_id];
}
}
@@ -319,7 +298,7 @@ SELECT user_id, group_id
// +-----------------------------------------------------------------------+
// | sending html code |
// +-----------------------------------------------------------------------+
-$template->assign(array('PWG_TOKEN' => get_pwg_token()));
+$template->assign(array('PWG_TOKEN' => get_pwg_token(), 'INHERIT' => $conf['inheritance_by_default']));
$template->assign_var_from_handle('ADMIN_CONTENT', 'cat_perm');
?>
diff --git a/admin/comments.php b/admin/comments.php
index 6d3fcc507..2740d772a 100644
--- a/admin/comments.php
+++ b/admin/comments.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -28,9 +28,19 @@ if (!defined('PHPWG_ROOT_PATH'))
include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+if (isset($_GET['start']) and is_numeric($_GET['start']))
+{
+ $page['start'] = $_GET['start'];
+}
+else
+{
+ $page['start'] = 0;
+}
+
// +-----------------------------------------------------------------------+
// | Check Access and exit when user status is not ok |
// +-----------------------------------------------------------------------+
+
check_status(ACCESS_ADMINISTRATOR);
// +-----------------------------------------------------------------------+
@@ -41,10 +51,7 @@ if (!empty($_POST))
{
if (empty($_POST['comments']))
{
- array_push(
- $page['errors'],
- l10n('Select at least one comment')
- );
+ $page['errors'][] = l10n('Select at least one comment');
}
else
{
@@ -55,12 +62,9 @@ if (!empty($_POST))
{
validate_user_comment($_POST['comments']);
- array_push(
- $page['infos'],
- l10n_dec(
- '%d user comment validated', '%d user comments validated',
- count($_POST['comments'])
- )
+ $page['infos'][] = l10n_dec(
+ '%d user comment validated', '%d user comments validated',
+ count($_POST['comments'])
);
}
@@ -68,12 +72,9 @@ if (!empty($_POST))
{
delete_user_comment($_POST['comments']);
- array_push(
- $page['infos'],
- l10n_dec(
- '%d user comment rejected', '%d user comments rejected',
- count($_POST['comments'])
- )
+ $page['infos'][] = l10n_dec(
+ '%d user comment rejected', '%d user comments rejected',
+ count($_POST['comments'])
);
}
}
@@ -106,18 +107,75 @@ $tabsheet->assign();
// | comments display |
// +-----------------------------------------------------------------------+
-$list = array();
+$nb_total = 0;
+$nb_pending = 0;
+
+$query = '
+SELECT
+ COUNT(*) AS counter,
+ validated
+ FROM '.COMMENTS_TABLE.'
+ GROUP BY validated
+;';
+$result = pwg_query($query);
+while ($row = pwg_db_fetch_assoc($result))
+{
+ $nb_total+= $row['counter'];
+
+ if ('false' == $row['validated'])
+ {
+ $nb_pending = $row['counter'];
+ }
+}
+
+if (!isset($_GET['filter']) and $nb_pending > 0)
+{
+ $page['filter'] = 'pending';
+}
+else
+{
+ $page['filter'] = 'all';
+}
+
+if (isset($_GET['filter']) and 'pending' == $_GET['filter'])
+{
+ $page['filter'] = $_GET['filter'];
+}
+
+$template->assign(
+ array(
+ 'nb_total' => $nb_total,
+ 'nb_pending' => $nb_pending,
+ 'filter' => $page['filter'],
+ )
+ );
+
+$where_clauses = array('1=1');
+
+if ('pending' == $page['filter'])
+{
+ $where_clauses[] = 'validated=\'false\'';
+}
$query = '
-SELECT c.id, c.image_id, c.date, c.author, '.
-$conf['user_fields']['username'].' AS username, c.content, i.path, i.representative_ext
+SELECT
+ c.id,
+ c.image_id,
+ c.date,
+ c.author,
+ '.$conf['user_fields']['username'].' AS username,
+ c.content,
+ i.path,
+ i.representative_ext,
+ validated
FROM '.COMMENTS_TABLE.' AS c
INNER JOIN '.IMAGES_TABLE.' AS i
ON i.id = c.image_id
LEFT JOIN '.USERS_TABLE.' AS u
ON u.'.$conf['user_fields']['id'].' = c.author_id
- WHERE validated = \'false\'
+ WHERE '.implode(' AND ', $where_clauses).'
ORDER BY c.date DESC
+ LIMIT '.$page['start'].', '.$conf['comments_page_nb_comments'].'
;';
$result = pwg_query($query);
while ($row = pwg_db_fetch_assoc($result))
@@ -144,14 +202,26 @@ while ($row = pwg_db_fetch_assoc($result))
'TN_SRC' => $thumb,
'AUTHOR' => trigger_event('render_comment_author', $author_name),
'DATE' => format_date($row['date'], true),
- 'CONTENT' => trigger_event('render_comment_content',$row['content'])
+ 'CONTENT' => trigger_event('render_comment_content',$row['content']),
+ 'IS_PENDING' => ('false' == $row['validated']),
)
);
- array_push($list, $row['id']);
+ $list[] = $row['id'];
}
-$template->assign('LIST', implode(',', $list) );
+// +-----------------------------------------------------------------------+
+// | navigation bar |
+// +-----------------------------------------------------------------------+
+
+$navbar = create_navigation_bar(
+ get_root_url().'admin.php'.get_query_string_diff(array('start')),
+ ('pending' == $page['filter'] ? $nb_pending : $nb_total),
+ $page['start'],
+ $conf['comments_page_nb_comments']
+ );
+
+$template->assign('navbar', $navbar);
// +-----------------------------------------------------------------------+
// | sending html code |
diff --git a/admin/configuration.php b/admin/configuration.php
index f0267ea44..f1b943cfd 100644
--- a/admin/configuration.php
+++ b/admin/configuration.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -134,6 +134,10 @@ $comments_order = array(
'DESC' => l10n('Show latest comments first'),
);
+$mail_themes = array(
+ 'clear' => 'Clear',
+ 'dark' => 'Dark',
+ );
//------------------------------ verification and registration of modifications
if (isset($_POST['submit']))
@@ -148,13 +152,21 @@ if (isset($_POST['submit']))
{
if ( !empty($_POST['order_by']) )
{
+ $used = array();
foreach ($_POST['order_by'] as $i => $val)
{
- if (empty($val)) unset($_POST['order_by'][$i]);
+ if (empty($val) or isset($used[$val]))
+ {
+ unset($_POST['order_by'][$i]);
+ }
+ else
+ {
+ $used[$val] = true;
+ }
}
if ( !count($_POST['order_by']) )
{
- array_push($page['errors'], l10n('No order field selected'));
+ $page['errors'][] = l10n('No order field selected');
}
else
{
@@ -179,7 +191,7 @@ if (isset($_POST['submit']))
}
else
{
- array_push($page['errors'], l10n('No order field selected'));
+ $page['errors'][] = l10n('No order field selected');
}
}
@@ -207,7 +219,7 @@ if (isset($_POST['submit']))
or $_POST['nb_comment_page'] < 5
or $_POST['nb_comment_page'] > 50)
{
- array_push($page['errors'], l10n('The number of comments a page must be between 5 and 50 included.'));
+ $page['errors'][] = l10n('The number of comments a page must be between 5 and 50 included.');
}
foreach( $comments_checkboxes as $checkbox)
{
@@ -225,7 +237,7 @@ if (isset($_POST['submit']))
if (!preg_match($int_pattern, $_POST['nb_categories_page'])
or $_POST['nb_categories_page'] < 4)
{
- array_push($page['errors'], l10n('The number of albums a page must be above 4.'));
+ $page['errors'][] = l10n('The number of albums a page must be above 4.');
}
foreach( $display_checkboxes as $checkbox)
{
@@ -268,7 +280,7 @@ WHERE param = \''.$row['param'].'\'
pwg_query($query);
}
}
- array_push($page['infos'], l10n('Information data registered in database'));
+ $page['infos'][] = l10n('Information data registered in database');
}
//------------------------------------------------------ $conf reinitialization
@@ -282,10 +294,7 @@ if ('sizes' == $page['section'] and isset($_GET['action']) and 'restore_settings
pwg_query('DELETE FROM '.CONFIG_TABLE.' WHERE param = \'disabled_derivatives\'');
clear_derivative_cache();
- array_push(
- $page['infos'],
- l10n('Your configuration settings are saved')
- );
+ $page['infos'][] = l10n('Your configuration settings are saved');
}
//----------------------------------------------------- template initialization
@@ -324,7 +333,7 @@ switch ($page['section'])
if (order_by_is_local())
{
- array_push($page['warnings'], l10n('You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'));
+ $page['warnings'][] = l10n('You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !');
}
if ( isset($conf['order_by_custom']) or isset($conf['order_by_inside_category_custom']) )
@@ -350,6 +359,8 @@ switch ($page['section'])
'monday' => $lang['day'][1],
),
'week_starts_on_options_selected' => $conf['week_starts_on'],
+ 'mail_theme' => $conf['mail_theme'],
+ 'mail_theme_options' => $mail_themes,
'order_by' => $order_by,
'order_by_options' => $sort_fields,
)
@@ -400,7 +411,7 @@ switch ($page['section'])
{
// Reload user
$edit_user = build_user($conf['guest_id'], false);
- array_push($page['infos'], l10n('Information data registered in database'));
+ $page['infos'][] = l10n('Information data registered in database');
}
$page['errors'] = array_merge($page['errors'], $errors);
@@ -440,6 +451,8 @@ switch ($page['section'])
// when submitting the form and an error remains
if (!isset($page['sizes_loaded_in_tpl']))
{
+ $is_gd = (pwg_image::get_library()=='gd')? true : false;
+ $template->assign('is_gd', $is_gd);
$template->assign(
'sizes',
array(
diff --git a/admin/element_set_ranks.php b/admin/element_set_ranks.php
index d9a917136..289cc2aba 100644
--- a/admin/element_set_ranks.php
+++ b/admin/element_set_ranks.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -64,13 +64,10 @@ function save_images_order($category_id, $images)
$datas = array();
foreach ($images as $id)
{
- array_push(
- $datas,
- array(
- 'category_id' => $category_id,
- 'image_id' => $id,
- 'rank' => ++$current_rank,
- )
+ $datas[] = array(
+ 'category_id' => $category_id,
+ 'image_id' => $id,
+ 'rank' => ++$current_rank,
);
}
$fields = array(
@@ -98,10 +95,7 @@ if (isset($_POST['submit']))
array_keys($_POST['rank_of_image'])
);
- array_push(
- $page['infos'],
- l10n('Images manual order was saved')
- );
+ $page['infos'][] = l10n('Images manual order was saved');
}
if (!empty($_POST['image_order_choice'])
@@ -124,7 +118,7 @@ if (isset($_POST['submit']))
}
elseif ($image_order_choice=='rank')
{
- $image_order = 'rank';
+ $image_order = 'rank ASC';
}
$query = '
UPDATE '.CATEGORIES_TABLE.'
@@ -143,7 +137,7 @@ UPDATE '.CATEGORIES_TABLE.'
pwg_query($query);
}
- array_push($page['infos'], l10n('Your configuration settings are saved'));
+ $page['infos'][] = l10n('Your configuration settings are saved');
}
// +-----------------------------------------------------------------------+
@@ -237,21 +231,21 @@ if (pwg_db_num_rows($result) > 0)
// image order management
$sort_fields = array(
'' => '',
- 'file' => l10n('File name, A &rarr; Z'),
+ 'file ASC' => l10n('File name, A &rarr; Z'),
'file DESC' => l10n('File name, Z &rarr; A'),
- 'name' => l10n('Photo title, A &rarr; Z'),
+ 'name ASC' => l10n('Photo title, A &rarr; Z'),
'name DESC' => l10n('Photo title, Z &rarr; A'),
'date_creation DESC' => l10n('Date created, new &rarr; old'),
- 'date_creation' => l10n('Date created, old &rarr; new'),
+ 'date_creation ASC' => l10n('Date created, old &rarr; new'),
'date_available DESC' => l10n('Date posted, new &rarr; old'),
- 'date_available' => l10n('Date posted, old &rarr; new'),
+ 'date_available ASC' => l10n('Date posted, old &rarr; new'),
'rating_score DESC' => l10n('Rating score, high &rarr; low'),
- 'rating_score' => l10n('Rating score, low &rarr; high'),
+ 'rating_score ASC' => l10n('Rating score, low &rarr; high'),
'hit DESC' => l10n('Visits, high &rarr; low'),
- 'hit' => l10n('Visits, low &rarr; high'),
- 'id' => l10n('Numeric identifier, 1 &rarr; 9'),
+ 'hit ASC' => l10n('Visits, low &rarr; high'),
+ 'id ASC' => l10n('Numeric identifier, 1 &rarr; 9'),
'id DESC' => l10n('Numeric identifier, 9 &rarr; 1'),
- 'rank' => l10n('Manual sort order'),
+ 'rank ASC' => l10n('Manual sort order'),
);
$template->assign('image_order_options', $sort_fields);
diff --git a/admin/extend_for_templates.php b/admin/extend_for_templates.php
index cb2845adc..0bab1215e 100644
--- a/admin/extend_for_templates.php
+++ b/admin/extend_for_templates.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -113,32 +113,6 @@ $eligible_templates = array(
$flip_templates = array_flip($eligible_templates);
-/**
- * returns an array contening sub-directories, excluding ".svn"
- *
- * @param string $dir
- * @return array
- */
-function get_dirs($directory)
-{
- $sub_dirs = array();
- if ($opendir = opendir($directory))
- {
- while ($file = readdir($opendir))
- {
- if ($file != '.'
- and $file != '..'
- and is_dir($directory.'/'.$file)
- and $file != '.svn')
- {
- array_push($sub_dirs, $file);
- }
- }
- closedir($opendir);
- }
- return $sub_dirs;
-}
-
$available_templates = array_merge(
array('N/A' => '----------'),
get_dirs(PHPWG_ROOT_PATH.'themes'));
@@ -175,8 +149,7 @@ UPDATE '.CONFIG_TABLE.'
WHERE param = \'extents_for_templates\';';
if (pwg_query($query))
{
- array_push($page['infos'],
- l10n('Templates configuration has been recorded.'));
+ $page['infos'][] = l10n('Templates configuration has been recorded.');
}
}
diff --git a/admin/group_list.php b/admin/group_list.php
index 390107613..4912458f7 100644
--- a/admin/group_list.php
+++ b/admin/group_list.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -29,6 +29,19 @@ if( !defined("PHPWG_ROOT_PATH") )
include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
// +-----------------------------------------------------------------------+
+// | tabs |
+// +-----------------------------------------------------------------------+
+
+include_once(PHPWG_ROOT_PATH.'admin/include/tabsheet.class.php');
+
+$my_base_url = get_root_url().'admin.php?page=';
+
+$tabsheet = new tabsheet();
+$tabsheet->set_id('groups');
+$tabsheet->select('group_list');
+$tabsheet->assign();
+
+// +-----------------------------------------------------------------------+
// | Check Access and exit when user status is not ok |
// +-----------------------------------------------------------------------+
check_status(ACCESS_ADMINISTRATOR);
@@ -45,7 +58,7 @@ if (isset($_POST['submit_add']))
{
if (empty($_POST['groupname']))
{
- array_push($page['errors'], l10n('The name of a group must not contain " or \' or be empty.'));
+ $page['errors'][] = l10n('The name of a group must not contain " or \' or be empty.');
}
if (count($page['errors']) == 0)
{
@@ -58,7 +71,7 @@ SELECT COUNT(*)
list($count) = pwg_db_fetch_row(pwg_query($query));
if ($count != 0)
{
- array_push($page['errors'], l10n('This name is already used by another group.'));
+ $page['errors'][] = l10n('This name is already used by another group.');
}
}
if (count($page['errors']) == 0)
@@ -72,10 +85,7 @@ INSERT INTO '.GROUPS_TABLE.'
;';
pwg_query($query);
- array_push(
- $page['infos'],
- sprintf(l10n('group "%s" added'), $_POST['groupname'])
- );
+ $page['infos'][] = l10n('group "%s" added', $_POST['groupname']);
}
}
@@ -89,7 +99,7 @@ if (isset($_POST['submit']) and isset($_POST['selectAction']) and isset($_POST['
$groups = $_POST['group_selection'];
if (count($groups) == 0)
{
- array_push($page['errors'], l10n('Select at least one group'));
+ $page['errors'][] = l10n('Select at least one group');
}
$action = $_POST['selectAction'];
@@ -100,13 +110,23 @@ if (isset($_POST['submit']) and isset($_POST['selectAction']) and isset($_POST['
if ($action=="rename")
{
+ // is the group not already existing ?
+ $query = '
+SELECT name
+ FROM '.GROUPS_TABLE.'
+;';
+ $group_names = array_from_query($query, 'name');
foreach($groups as $group)
{
- if ( !empty($_POST['rename_'.$group.'']) )
+ if ( in_array($_POST['rename_'.$group.''], $group_names))
+ {
+ $page['errors'][] = $_POST['rename_'.$group.''].' | '.l10n('This name is already used by another group.');
+ }
+ elseif ( !empty($_POST['rename_'.$group.'']))
{
$query = '
UPDATE '.GROUPS_TABLE.'
- SET name = \''.$_POST['rename_'.$group.''].'\'
+ SET name = \''.pwg_db_real_escape_string($_POST['rename_'.$group.'']).'\'
WHERE id = '.$group.'
;';
pwg_query($query);
@@ -153,10 +173,7 @@ if (isset($_POST['submit']) and isset($_POST['selectAction']) and isset($_POST['
;';
pwg_query($query);
- array_push(
- $page['infos'],
- sprintf(l10n('group "%s" deleted'), $groupname)
- );
+ $page['infos'][] = l10n('group "%s" deleted', $groupname);
}
}
@@ -175,7 +192,7 @@ SELECT COUNT(*)
list($count) = pwg_db_fetch_row(pwg_query($query));
if ($count != 0)
{
- array_push($page['errors'], l10n('This name is already used by another group.'));
+ $page['errors'][] = l10n('This name is already used by another group.');
}
else
{
@@ -236,10 +253,8 @@ SELECT COUNT(*)
}
mass_inserts(USER_GROUP_TABLE, array('user_id','group_id'), $usr_grp);
mass_inserts(GROUP_ACCESS_TABLE, array('group_id','cat_id'), $grp_access);
- array_push(
- $page['infos'],
- sprintf(l10n('group "%s" added'), $_POST['merge'])
- );
+
+ $page['infos'][] = l10n('group "%s" added', $_POST['merge']);
}
// +
@@ -263,7 +278,7 @@ SELECT COUNT(*)
list($count) = pwg_db_fetch_row(pwg_query($query));
if ($count != 0)
{
- array_push($page['errors'], l10n('This name is already used by another group.'));
+ $page['errors'][] = l10n('This name is already used by another group.');
break;
}
// creating the group
@@ -313,10 +328,7 @@ SELECT COUNT(*)
}
mass_inserts(USER_GROUP_TABLE, array('user_id','group_id'), $usr_grp);
- array_push(
- $page['infos'],
- sprintf(l10n('group "%s" added'), $_POST['duplicate_'.$group.''])
- );
+ $page['infos'][] = l10n('group "%s" added', $_POST['duplicate_'.$group.'']);
}
}
@@ -344,12 +356,10 @@ SELECT COUNT(*)
;';
pwg_query($query);
- array_push(
- $page['infos'],
- sprintf(l10n('group "%s" updated'), $groupname)
- );
+ $page['infos'][] = l10n('group "%s" updated', $groupname);
}
}
+ invalidate_user_cache();
}
// +-----------------------------------------------------------------------+
// | template init |
@@ -379,7 +389,6 @@ $result = pwg_query($query);
$admin_url = get_root_url().'admin.php?page=';
$perm_url = $admin_url.'group_perm&amp;group_id=';
$del_url = $admin_url.'group_list&amp;delete=';
-$members_url = $admin_url.'user_list&amp;group=';
$toggle_is_default_url = $admin_url.'group_list&amp;toggle_is_default=';
while ($row = pwg_db_fetch_assoc($result))
@@ -404,9 +413,8 @@ SELECT username
'ID' => $row['id'],
'IS_DEFAULT' => (get_boolean($row['is_default']) ? ' ['.l10n('default').']' : ''),
'NB_MEMBERS' => count($members),
- 'L_MEMBERS' => implode(' - ', $members),
+ 'L_MEMBERS' => implode(' <span class="userSeparator">&middot;</span> ', $members),
'MEMBERS' => l10n_dec('%d member', '%d members', count($members)),
- 'U_MEMBERS' => $members_url.$row['id'],
'U_DELETE' => $del_url.$row['id'].'&amp;pwg_token='.get_pwg_token(),
'U_PERM' => $perm_url.$row['id'],
'U_ISDEFAULT' => $toggle_is_default_url.$row['id'].'&amp;pwg_token='.get_pwg_token(),
diff --git a/admin/group_perm.php b/admin/group_perm.php
index 1be0c80b7..28ea48111 100644
--- a/admin/group_perm.php
+++ b/admin/group_perm.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -81,7 +81,7 @@ SELECT id
$result = pwg_query($query);
while ($row = pwg_db_fetch_assoc($result))
{
- array_push($private_uppercats, $row['id']);
+ $private_uppercats[] = $row['id'];
}
// retrying to authorize a category which is already authorized may cause
@@ -98,23 +98,21 @@ SELECT cat_id
while ($row = pwg_db_fetch_assoc($result))
{
- array_push($authorized_ids, $row['cat_id']);
+ $authorized_ids[] = $row['cat_id'];
}
$inserts = array();
$to_autorize_ids = array_diff($private_uppercats, $authorized_ids);
foreach ($to_autorize_ids as $to_autorize_id)
{
- array_push(
- $inserts,
- array(
- 'group_id' => $page['group'],
- 'cat_id' => $to_autorize_id
- )
+ $inserts[] = array(
+ 'group_id' => $page['group'],
+ 'cat_id' => $to_autorize_id
);
}
mass_inserts(GROUP_ACCESS_TABLE, array('group_id','cat_id'), $inserts);
+ invalidate_user_cache();
}
// +-----------------------------------------------------------------------+
@@ -131,10 +129,9 @@ $template->set_filenames(
$template->assign(
array(
'TITLE' =>
- sprintf(
- l10n('Manage permissions for group "%s"'),
- get_groupname($page['group']
- )
+ l10n(
+ 'Manage permissions for group "%s"',
+ get_groupname($page['group'])
),
'L_CAT_OPTIONS_TRUE'=>l10n('Authorized'),
'L_CAT_OPTIONS_FALSE'=>l10n('Forbidden'),
@@ -159,7 +156,7 @@ $result = pwg_query($query_true);
$authorized_ids = array();
while ($row = pwg_db_fetch_assoc($result))
{
- array_push($authorized_ids, $row['id']);
+ $authorized_ids[] = $row['id'];
}
$query_false = '
diff --git a/admin/help.php b/admin/help.php
index c7b8cf560..97d8d0514 100644
--- a/admin/help.php
+++ b/admin/help.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/admin/history.php b/admin/history.php
index 76db53c59..8307d5e32 100644
--- a/admin/history.php
+++ b/admin/history.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -164,7 +164,7 @@ INSERT INTO '.SEARCH_TABLE.'
}
else
{
- array_push($page['errors'], l10n('Empty query. No criteria has been entered.'));
+ $page['errors'][] = l10n('Empty query. No criteria has been entered.');
}
}
@@ -337,9 +337,14 @@ SELECT
$query = '
SELECT
id,
- name
+ name, url_name
FROM '.TAGS_TABLE;
- $name_of_tag = simple_hash_from_query($query, 'id', 'name');
+ $name_of_tag = array();
+ $result = pwg_query($query);
+ while ($row=pwg_db_fetch_assoc($result))
+ {
+ $name_of_tag[ $row['id'] ] = '<a href="'.make_index_url( array('tags'=>array($row))).'">'.trigger_event("render_tag_name", $row['name'], $row).'</a>';
+ }
}
$i = 0;
@@ -528,10 +533,7 @@ SELECT
),
'MEMBERS' => sprintf(
l10n_dec('%d member', '%d members', $summary['nb_members']).': %s',
- implode(
- ', ',
- $member_strings
- )
+ implode(', ', $member_strings)
),
'GUESTS' => l10n_dec(
'%d guest', '%d guests',
diff --git a/admin/include/add_core_tabs.inc.php b/admin/include/add_core_tabs.inc.php
index a1ac2a0ce..efc9cd0db 100644
--- a/admin/include/add_core_tabs.inc.php
+++ b/admin/include/add_core_tabs.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -29,17 +29,17 @@ function add_core_tabs($sheets, $tab_id)
{
case 'album':
global $admin_album_base_url;
- $sheets['properties'] = array('caption' => l10n('Properties'), 'url' => $admin_album_base_url.'-properties');
- $sheets['sort_order'] = array('caption' => l10n('Manage photo ranks'), 'url' => $admin_album_base_url.'-sort_order');
- $sheets['permissions'] = array('caption' => l10n('Permissions'), 'url' => $admin_album_base_url.'-permissions');
- $sheets['notification'] = array('caption' => l10n('Notification'), 'url' => $admin_album_base_url.'-notification');
+ $sheets['properties'] = array('caption' => '<span class="icon-pencil"></span>'.l10n('Properties'), 'url' => $admin_album_base_url.'-properties');
+ $sheets['sort_order'] = array('caption' => '<span class="icon-shuffle"></span>'.l10n('Manage photo ranks'), 'url' => $admin_album_base_url.'-sort_order');
+ $sheets['permissions'] = array('caption' => '<span class="icon-lock"></span>'.l10n('Permissions'), 'url' => $admin_album_base_url.'-permissions');
+ $sheets['notification'] = array('caption' => '<span class="icon-mail-alt"></span>'.l10n('Notification'), 'url' => $admin_album_base_url.'-notification');
break;
case 'albums':
global $my_base_url;
- $sheets['list'] = array('caption' => l10n('List'), 'url' => $my_base_url.'cat_list');
- $sheets['move'] = array('caption' => l10n('Move'), 'url' => $my_base_url.'cat_move');
- $sheets['permalinks'] = array('caption' => l10n('Permalinks'), 'url' => $my_base_url.'permalinks');
+ $sheets['list'] = array('caption' => '<span class="icon-menu"></span>'.l10n('List'), 'url' => $my_base_url.'cat_list');
+ $sheets['move'] = array('caption' => '<span class="icon-move"></span>'.l10n('Move'), 'url' => $my_base_url.'cat_move');
+ $sheets['permalinks'] = array('caption' => '<span class="icon-link"></span>'.l10n('Permalinks'), 'url' => $my_base_url.'permalinks');
break;
case 'batch_manager':
@@ -50,21 +50,29 @@ function add_core_tabs($sheets, $tab_id)
case 'cat_options':
global $link_start, $conf;
- $sheets['status'] = array('caption' => l10n('Public / Private'), 'url' => $link_start.'cat_options&amp;section=status');
- $sheets['visible'] = array('caption' => l10n('Lock'), 'url' => $link_start.'cat_options&amp;section=visible');
+ $sheets['status'] = array('caption' => '<span class="icon-lock"></span>'.l10n('Public / Private'), 'url' => $link_start.'cat_options&amp;section=status');
+ $sheets['visible'] = array('caption' => '<span class="icon-block"></span>'.l10n('Lock'), 'url' => $link_start.'cat_options&amp;section=visible');
if ($conf['activate_comments'])
- $sheets['comments'] = array('caption' => l10n('Comments'), 'url' => $link_start.'cat_options&amp;section=comments');
+ $sheets['comments'] = array('caption' => '<span class="icon-chat"></span>'.l10n('Comments'), 'url' => $link_start.'cat_options&amp;section=comments');
if ($conf['allow_random_representative'])
$sheets['representative'] = array('caption' => l10n('Representative'), 'url' => $link_start.'cat_options&amp;section=representative');
break;
case 'comments':
- $sheets[''] = array('caption' => l10n('User comments validation'), 'url' => '');
+ $sheets[''] = array('caption' => l10n('User comments'), 'url' => '');
break;
-
+
+ case 'users':
+ $sheets[''] = array('caption' => '<span class="icon-users"> </span>'.l10n('User list'), 'url' => '');
+ break;
+
+ case 'groups':
+ $sheets[''] = array('caption' => '<span class="icon-group"> </span>'.l10n('Groups'), 'url' => '');
+ break;
+
case 'configuration':
global $conf_link;
- $sheets['main'] = array('caption' => l10n('Main'), 'url' => $conf_link.'main');
+ $sheets['main'] = array('caption' => l10n('General'), 'url' => $conf_link.'main');
$sheets['sizes'] = array('caption' => l10n('Photo sizes'), 'url' => $conf_link.'sizes');
$sheets['watermark'] = array('caption' => l10n('Watermark'), 'url' => $conf_link.'watermark');
$sheets['display'] = array('caption' => l10n('Display'), 'url' => $conf_link.'display');
@@ -83,15 +91,15 @@ function add_core_tabs($sheets, $tab_id)
case 'history':
global $link_start;
- $sheets['stats'] = array('caption' => l10n('Statistics'), 'url' => $link_start.'stats');
- $sheets['history'] = array('caption' => l10n('Search'), 'url' => $link_start.'history');
+ $sheets['stats'] = array('caption' => '<span class="icon-signal"></span>'.l10n('Statistics'), 'url' => $link_start.'stats');
+ $sheets['history'] = array('caption' => '<span class="icon-search"></span>'.l10n('Search'), 'url' => $link_start.'history');
break;
case 'languages':
global $my_base_url;
- $sheets['installed'] = array('caption' => l10n('Installed Languages'), 'url' => $my_base_url.'&amp;tab=installed');
- $sheets['update'] = array('caption' => l10n('Check for updates'), 'url' => $my_base_url.'&amp;tab=update');
- $sheets['new'] = array('caption' => l10n('Add New Language'), 'url' => $my_base_url.'&amp;tab=new');
+ $sheets['installed'] = array('caption' => '<span class="icon-language"></span>'.l10n('Installed Languages'), 'url' => $my_base_url.'&amp;tab=installed');
+ $sheets['update'] = array('caption' => '<span class="icon-arrows-cw"></span>'.l10n('Check for updates'), 'url' => $my_base_url.'&amp;tab=update');
+ $sheets['new'] = array('caption' => '<span class="icon-plus-circled"></span>'.l10n('Add New Language'), 'url' => $my_base_url.'&amp;tab=new');
break;
case 'nbm':
@@ -104,22 +112,22 @@ function add_core_tabs($sheets, $tab_id)
case 'photo':
global $admin_photo_base_url;
$sheets['properties'] = array('caption' => l10n('Properties'), 'url' => $admin_photo_base_url.'-properties');
- $sheets['coi'] = array('caption' => l10n('Center of interest'), 'url' => $admin_photo_base_url.'-coi');
+ $sheets['coi'] = array('caption' => '<span class="icon-crop"></span>'.l10n('Center of interest'), 'url' => $admin_photo_base_url.'-coi');
break;
case 'photos_add':
global $conf;
- $sheets['direct'] = array('caption' => l10n('Web Form'), 'url' => PHOTOS_ADD_BASE_URL.'&amp;section=direct');
- $sheets['applications'] = array('caption' => l10n('Applications'), 'url' => PHOTOS_ADD_BASE_URL.'&amp;section=applications');
+ $sheets['direct'] = array('caption' => '<span class="icon-upload"></span>'.l10n('Web Form'), 'url' => PHOTOS_ADD_BASE_URL.'&amp;section=direct');
+ $sheets['applications'] = array('caption' => '<span class="icon-network"></span>'.l10n('Applications'), 'url' => PHOTOS_ADD_BASE_URL.'&amp;section=applications');
if ($conf['enable_synchronization'])
- $sheets['ftp'] = array('caption' => l10n('FTP + Synchronization'), 'url' => PHOTOS_ADD_BASE_URL.'&amp;section=ftp');
+ $sheets['ftp'] = array('caption' => '<span class="icon-exchange"></span>'.l10n('FTP + Synchronization'), 'url' => PHOTOS_ADD_BASE_URL.'&amp;section=ftp');
break;
case 'plugins':
global $my_base_url;
- $sheets['installed'] = array('caption' => l10n('Plugin list'), 'url' => $my_base_url.'&amp;tab=installed');
- $sheets['update'] = array('caption' => l10n('Check for updates'), 'url' => $my_base_url.'&amp;tab=update');
- $sheets['new'] = array('caption' => l10n('Other plugins'), 'url' => $my_base_url.'&amp;tab=new');
+ $sheets['installed'] = array('caption' => '<span class="icon-equalizer"></span>'.l10n('Plugin list'), 'url' => $my_base_url.'&amp;tab=installed');
+ $sheets['update'] = array('caption' => '<span class="icon-arrows-cw"></span>'.l10n('Check for updates'), 'url' => $my_base_url.'&amp;tab=update');
+ $sheets['new'] = array('caption' => '<span class="icon-plus-circled"></span>'.l10n('Other plugins'), 'url' => $my_base_url.'&amp;tab=new');
break;
case 'rating':
@@ -129,9 +137,9 @@ function add_core_tabs($sheets, $tab_id)
case 'themes':
global $my_base_url;
- $sheets['installed'] = array('caption' => l10n('Installed Themes'), 'url' => $my_base_url.'&amp;tab=installed');
- $sheets['update'] = array('caption' => l10n('Check for updates'), 'url' => $my_base_url.'&amp;tab=update');
- $sheets['new'] = array('caption' => l10n('Add New Theme'), 'url' => $my_base_url.'&amp;tab=new');
+ $sheets['installed'] = array('caption' => '<span class="icon-brush"></span>'.l10n('Installed Themes'), 'url' => $my_base_url.'&amp;tab=installed');
+ $sheets['update'] = array('caption' => '<span class="icon-arrows-cw"></span>'.l10n('Check for updates'), 'url' => $my_base_url.'&amp;tab=update');
+ $sheets['new'] = array('caption' => '<span class="icon-plus-circled"></span>'.l10n('Add New Theme'), 'url' => $my_base_url.'&amp;tab=new');
break;
case 'updates':
diff --git a/admin/include/albums_tab.inc.php b/admin/include/albums_tab.inc.php
index 88a0e9be5..399778d01 100644
--- a/admin/include/albums_tab.inc.php
+++ b/admin/include/albums_tab.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/admin/include/c13y_internal.class.php b/admin/include/c13y_internal.class.php
index 27df84246..10375095a 100644
--- a/admin/include/c13y_internal.class.php
+++ b/admin/include/c13y_internal.class.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/admin/include/check_integrity.class.php b/admin/include/check_integrity.class.php
index 62372e214..da549d777 100644
--- a/admin/include/check_integrity.class.php
+++ b/admin/include/check_integrity.class.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -71,9 +71,10 @@ class check_integrity
// Information
if (count($this->retrieve_list) > 0)
{
- $header_notes[] =
- l10n_dec('%d anomaly has been detected.', '%d anomalies have been detected.',
- count($this->retrieve_list));
+ $header_notes[] = l10n_dec(
+ '%d anomaly has been detected.', '%d anomalies have been detected.',
+ count($this->retrieve_list)
+ );
}
// Treatments
@@ -116,15 +117,17 @@ class check_integrity
if ($corrected_count > 0)
{
- $page['infos'][] =
- l10n_dec('%d anomaly has been corrected.', '%d anomalies have been detected corrected.',
- $corrected_count);
+ $page['infos'][] = l10n_dec(
+ '%d anomaly has been corrected.', '%d anomalies have been detected corrected.',
+ $corrected_count
+ );
}
if ($not_corrected_count > 0)
{
- $page['errors'][] =
- l10n_dec('%d anomaly has not been corrected.', '%d anomalies have not been corrected.',
- $not_corrected_count);
+ $page['errors'][] = l10n_dec(
+ '%d anomaly has not been corrected.', '%d anomalies have not been corrected.',
+ $not_corrected_count
+ );
}
}
else
@@ -145,9 +148,10 @@ class check_integrity
if ($ignored_count > 0)
{
- $page['infos'][] =
- l10n_dec('%d anomaly has been ignored.', '%d anomalies have been ignored.',
- $ignored_count);
+ $page['infos'][] = l10n_dec(
+ '%d anomaly has been ignored.', '%d anomalies have been ignored.',
+ $ignored_count
+ );
}
}
}
diff --git a/admin/include/configuration_sizes_process.inc.php b/admin/include/configuration_sizes_process.inc.php
index e6fa870d6..47cfaf388 100644
--- a/admin/include/configuration_sizes_process.inc.php
+++ b/admin/include/configuration_sizes_process.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -254,10 +254,7 @@ if (count($errors) == 0)
clear_derivative_cache($changed_types);
}
- array_push(
- $page['infos'],
- l10n('Your configuration settings are saved')
- );
+ $page['infos'][] = l10n('Your configuration settings are saved');
}
else
{
diff --git a/admin/include/configuration_watermark_process.inc.php b/admin/include/configuration_watermark_process.inc.php
index 0d28e32a8..ad23d92a2 100644
--- a/admin/include/configuration_watermark_process.inc.php
+++ b/admin/include/configuration_watermark_process.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -174,10 +174,7 @@ if (count($errors) == 0)
clear_derivative_cache($changed_types);
}
- array_push(
- $page['infos'],
- l10n('Your configuration settings are saved')
- );
+ $page['infos'][] = l10n('Your configuration settings are saved');
}
else
{
diff --git a/admin/include/functions.php b/admin/include/functions.php
index 957ef086e..71c164822 100644
--- a/admin/include/functions.php
+++ b/admin/include/functions.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,11 +21,19 @@
// | USA. |
// +-----------------------------------------------------------------------+
-include(PHPWG_ROOT_PATH.'admin/include/functions_metadata.php');
+/**
+ * @package functions\admin\___
+ */
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions_metadata.php');
+
-// The function delete_site deletes a site and call the function
-// delete_categories for each primary category of the site
-function delete_site( $id )
+/**
+ * Deletes a site and call delete_categories for each primary category of the site
+ *
+ * @param int $id
+ */
+function delete_site($id)
{
// destruction of the categories of the site
$query = '
@@ -44,18 +52,19 @@ DELETE FROM '.SITES_TABLE.'
pwg_query($query);
}
-
-// The function delete_categories deletes the categories identified by the
-// (numeric) key of the array $ids. It also deletes (in the database) :
-// - all the elements physically linked to the category (delete_elements, see further)
-// - all the links between elements and this category
-// - all the restrictions linked to the category
-// The function works recursively.
-//
-// the $photo_deletion_mode is for photos virtually linked to the categorty
-// * no_delete : delete no photo, may create orphans
-// * delete_orphans : delete photos that are no longer linked to any category
-// * force_delete : delete photos even if they are linked to another category
+/**
+ * Recursively deletes one or more categories.
+ * It also deletes :
+ * - all the elements physically linked to the category (with delete_elements)
+ * - all the links between elements and this category
+ * - all the restrictions linked to the category
+ *
+ * @param int[] $ids
+ * @param string $photo_deletion_mode
+ * - no_delete : delete no photo, may create orphans
+ * - delete_orphans : delete photos that are no longer linked to any category
+ * - force_delete : delete photos even if they are linked to another category
+ */
function delete_categories($ids, $photo_deletion_mode='no_delete')
{
if (count($ids) == 0)
@@ -156,8 +165,12 @@ DELETE FROM '.USER_CACHE_CATEGORIES_TABLE.'
trigger_action('delete_categories', $ids);
}
-// Deletes all files (on disk) related to given image ids
-// @return image ids where files are deleted successfully
+/**
+ * Deletes all files (on disk) related to given image ids.
+ *
+ * @param int[] $ids
+ * @return 0|int[] image ids where files were successfully deleted
+ */
function delete_element_files($ids)
{
global $conf;
@@ -219,12 +232,18 @@ SELECT
return $new_ids;
}
-// The function delete_elements deletes the elements identified by the
-// (numeric) values of the array $ids. It also deletes (in the database) :
-// - all the comments related to elements
-// - all the links between categories and elements
-// - all the favorites associated to elements
-// @return number of deleted elements
+/**
+ * Deletes elements from database.
+ * It also deletes :
+ * - all the comments related to elements
+ * - all the links between categories/tags and elements
+ * - all the favorites/rates associated to elements
+ * - removes elements from caddie
+ *
+ * @param int[] $ids
+ * @param bool $physical_deletion
+ * @return int number of deleted elements
+ */
function delete_elements($ids, $physical_deletion=false)
{
if (count($ids) == 0)
@@ -241,60 +260,55 @@ function delete_elements($ids, $physical_deletion=false)
return 0;
}
}
+
+ $ids_str = wordwrap(implode(', ', $ids), 80, "\n");
// destruction of the comments on the image
$query = '
DELETE FROM '.COMMENTS_TABLE.'
- WHERE image_id IN (
-'.wordwrap(implode(', ', $ids), 80, "\n").')
+ WHERE image_id IN ('. $ids_str .')
;';
pwg_query($query);
- // destruction of the links between images and this category
+ // destruction of the links between images and categories
$query = '
DELETE FROM '.IMAGE_CATEGORY_TABLE.'
- WHERE image_id IN (
-'.wordwrap(implode(', ', $ids), 80, "\n").')
+ WHERE image_id IN ('. $ids_str .')
;';
pwg_query($query);
// destruction of the links between images and tags
$query = '
DELETE FROM '.IMAGE_TAG_TABLE.'
- WHERE image_id IN (
-'.wordwrap(implode(', ', $ids), 80, "\n").')
+ WHERE image_id IN ('. $ids_str .')
;';
pwg_query($query);
// destruction of the favorites associated with the picture
$query = '
DELETE FROM '.FAVORITES_TABLE.'
- WHERE image_id IN (
-'.wordwrap(implode(', ', $ids), 80, "\n").')
+ WHERE image_id IN ('. $ids_str .')
;';
pwg_query($query);
// destruction of the rates associated to this element
$query = '
DELETE FROM '.RATE_TABLE.'
- WHERE element_id IN (
-'.wordwrap(implode(', ', $ids), 80, "\n").')
+ WHERE element_id IN ('. $ids_str .')
;';
pwg_query($query);
- // destruction of the rates associated to this element
+ // destruction of the caddie associated to this element
$query = '
DELETE FROM '.CADDIE_TABLE.'
- WHERE element_id IN (
-'.wordwrap(implode(', ', $ids), 80, "\n").')
+ WHERE element_id IN ('. $ids_str .')
;';
pwg_query($query);
// destruction of the image
$query = '
DELETE FROM '.IMAGES_TABLE.'
- WHERE id IN (
-'.wordwrap(implode(', ', $ids), 80, "\n").')
+ WHERE id IN ('. $ids_str .')
;';
pwg_query($query);
@@ -303,8 +317,7 @@ DELETE FROM '.IMAGES_TABLE.'
SELECT
id
FROM '.CATEGORIES_TABLE.'
- WHERE representative_picture_id IN (
-'.wordwrap(implode(', ', $ids), 80, "\n").')
+ WHERE representative_picture_id IN ('. $ids_str .')
;';
$category_ids = array_from_query($query, 'id');
if (count($category_ids) > 0)
@@ -316,13 +329,13 @@ SELECT
return count($ids);
}
-// The delete_user function delete a user identified by the $user_id
-// It also deletes :
-// - all the access linked to this user
-// - all the links to any group
-// - all the favorites linked to this user
-// - calculated permissions linked to the user
-// - all datas about notifications for the user
+/**
+ * Deletes an user.
+ * It also deletes all related data (accesses, favorites, permissions, etc.)
+ * @todo : accept array input
+ *
+ * @param int $user_id
+ */
function delete_user($user_id)
{
global $conf;
@@ -356,7 +369,7 @@ DELETE FROM '.$table.'
pwg_query($query);
}
- // destruction of the user
+ // purge of sessions
$query = '
DELETE FROM '.SESSIONS_TABLE.'
WHERE data LIKE \'pwg_uid|i:'.(int)$user_id.';%\'
@@ -415,10 +428,9 @@ SELECT
/**
* Verifies that the representative picture really exists in the db and
- * picks up a random represantive if possible and based on config.
+ * picks up a random representative if possible and based on config.
*
- * @param mixed category id
- * @returns void
+ * @param 'all'|int|int[] $ids
*/
function update_category($ids = 'all')
{
@@ -485,9 +497,8 @@ SELECT DISTINCT id
}
/**
- * check and repair images integrity
- *
- * TODO see delete_elements function to check all linked tables
+ * Checks and repairs IMAGE_CATEGORY_TABLE integrity.
+ * Removes all entries from the table which correspond to a deleted image.
*/
function images_integrity()
{
@@ -513,18 +524,18 @@ DELETE
}
/**
- * returns an array containing sub-directories which can be a category,
- * recursive by default
- *
- * directories nammed "thumbnail", "pwg_high" or "pwg_representative" are
- * omitted
+ * Returns an array containing sub-directories which are potentially
+ * a category.
+ * Directories named ".svn", "thumbnail", "pwg_high" or "pwg_representative"
+ * are omitted.
*
- * @param string $basedir
- * @return array
+ * @param string $basedir (eg: ./galleries)
+ * @return string[]
*/
function get_fs_directories($path, $recursive = true)
{
$dirs = array();
+ $path = rtrim($path, '/');
if (is_dir($path))
{
@@ -540,7 +551,7 @@ function get_fs_directories($path, $recursive = true)
and $node != 'pwg_representative'
and is_dir($path.'/'.$node))
{
- array_push($dirs, $path.'/'.$node);
+ $dirs[] = $path.'/'.$node;
if ($recursive)
{
$dirs = array_merge($dirs, get_fs_directories($path.'/'.$node));
@@ -555,9 +566,8 @@ function get_fs_directories($path, $recursive = true)
}
/**
- * order categories (update categories.rank and global_rank database fields)
- * so that rank field are consecutive integers starting at 1 for each child
- * @return void
+ * Orders categories (update categories.rank and global_rank database fields)
+ * so that rank field are consecutive integers starting at 1 for each child.
*/
function update_global_rank()
{
@@ -623,22 +633,21 @@ SELECT id, id_uppercat, uppercats, rank, global_rank
}
/**
- * change the visible property on a set of categories
+ * Change the **visible** property on a set of categories.
*
- * @param array categories
- * @param string value
- * @return void
+ * @param int[] $categories
+ * @param boolean|string $value
*/
function set_cat_visible($categories, $value)
{
- if (!in_array($value, array('true', 'false')))
+ if ( ($value = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)) === null )
{
trigger_error("set_cat_visible invalid param $value", E_USER_WARNING);
return false;
}
// unlocking a category => all its parent categories become unlocked
- if ($value == 'true')
+ if ($value)
{
$uppercats = get_uppercat_ids($categories);
$query = '
@@ -648,7 +657,7 @@ UPDATE '.CATEGORIES_TABLE.'
pwg_query($query);
}
// locking a category => all its child categories become locked
- if ($value == 'false')
+ else
{
$subcats = get_subcat_ids($categories);
$query = '
@@ -660,11 +669,10 @@ UPDATE '.CATEGORIES_TABLE.'
}
/**
- * change the status property on a set of categories : private or public
+ * Change the **status** property on a set of categories : private or public.
*
- * @param array categories
- * @param string value
- * @return void
+ * @param int[] $categories
+ * @param string $value
*/
function set_cat_status($categories, $value)
{
@@ -698,10 +706,10 @@ UPDATE '.CATEGORIES_TABLE.'
}
/**
- * returns all uppercats category ids of the given category ids
+ * Returns all uppercats category ids of the given category ids.
*
- * @param array cat_ids
- * @return array
+ * @param int[] $cat_ids
+ * @return int[]
*/
function get_uppercat_ids($cat_ids)
{
@@ -729,9 +737,9 @@ SELECT uppercats
}
/**
- * set a new random representant to the categories
+ * Set a new random representant to the categories.
*
- * @param array categories
+ * @param int[] $categories
*/
function set_random_representant($categories)
{
@@ -747,12 +755,9 @@ SELECT image_id
;';
list($representative) = pwg_db_fetch_row(pwg_query($query));
- array_push(
- $datas,
- array(
- 'id' => $category_id,
- 'representative_picture_id' => $representative,
- )
+ $datas[] = array(
+ 'id' => $category_id,
+ 'representative_picture_id' => $representative,
);
}
@@ -767,10 +772,10 @@ SELECT image_id
}
/**
- * returns the fulldir for each given category id
+ * Returns the fulldir for each given category id.
*
- * @param array cat_ids
- * @return array
+ * @param int[] intcat_ids
+ * @return string[]
*/
function get_fulldirs($cat_ids)
{
@@ -819,11 +824,10 @@ SELECT id, uppercats, site_id
}
/**
- * returns an array with all file system files according to
- * $conf['file_ext']
+ * Returns an array with all file system files according to $conf['file_ext']
*
* @param string $path
- * @param bool recursive
+ * @param bool $recursive
* @return array
*/
function get_fs($path, $recursive = true)
@@ -862,26 +866,26 @@ function get_fs($path, $recursive = true)
{
if (basename($path) == 'thumbnail')
{
- array_push($fs['thumbnails'], $path.'/'.$node);
+ $fs['thumbnails'][] = $path.'/'.$node;
}
else if (basename($path) == 'pwg_representative')
{
- array_push($fs['representatives'], $path.'/'.$node);
+ $fs['representatives'][] = $path.'/'.$node;
}
else
{
- array_push($fs['elements'], $path.'/'.$node);
+ $fs['elements'][] = $path.'/'.$node;
}
}
// else if (in_array($extension, $conf['file_ext']))
else if (isset($conf['flip_file_ext'][$extension]))
{
- array_push($fs['elements'], $path.'/'.$node);
+ $fs['elements'][] = $path.'/'.$node;
}
}
else if (is_dir($path.'/'.$node) and $node != 'pwg_high' and $recursive)
{
- array_push($subdirs, $node);
+ $subdirs[] = $node;
}
}
}
@@ -905,14 +909,12 @@ function get_fs($path, $recursive = true)
}
/**
- * synchronize base users list and related users list
+ * Synchronize base users list and related users list.
*
- * compares and synchronizes base users table (USERS_TABLE) with its child
+ * Compares and synchronizes base users table (USERS_TABLE) with its child
* tables (USER_INFOS_TABLE, USER_ACCESS, USER_CACHE, USER_GROUP) : each
* base user must be present in child tables, users in child tables not
* present in base table must be deleted.
- *
- * @return void
*/
function sync_users()
{
@@ -974,10 +976,7 @@ DELETE
}
/**
- * updates categories.uppercats field based on categories.id +
- * categories.id_uppercat
- *
- * @return void
+ * Updates categories.uppercats field based on categories.id + categories.id_uppercat
*/
function update_uppercats()
{
@@ -995,19 +994,16 @@ SELECT id, id_uppercat, uppercats
$uppercat = $id;
while ($uppercat)
{
- array_push($upper_list, $uppercat);
+ $upper_list[] = $uppercat;
$uppercat = $cat_map[$uppercat]['id_uppercat'];
}
$new_uppercats = implode(',', array_reverse($upper_list));
if ($new_uppercats != $cat['uppercats'])
{
- array_push(
- $datas,
- array(
- 'id' => $id,
- 'uppercats' => $new_uppercats
- )
+ $datas[] = array(
+ 'id' => $id,
+ 'uppercats' => $new_uppercats
);
}
}
@@ -1016,9 +1012,7 @@ SELECT id, id_uppercat, uppercats
}
/**
- * update images.path field
- *
- * @return void
+ * Update images.path field base on images.file and storage categories fulldirs.
*/
function update_path()
{
@@ -1042,12 +1036,11 @@ UPDATE '.IMAGES_TABLE.'
}
/**
- * change the parent category of the given categories. The categories are
+ * Change the parent category of the given categories. The categories are
* supposed virtual.
*
- * @param array category identifiers
- * @param int parent category identifier
- * @return void
+ * @param int[] $category_ids
+ * @param int $new_parent (-1 for root)
*/
function move_categories($category_ids, $new_parent = -1)
{
@@ -1095,20 +1088,16 @@ SELECT uppercats
// into a new parent category with uppercats 12,125,13,14,24
if (preg_match('/^'.$category['uppercats'].'(,|$)/', $new_parent_uppercats))
{
- array_push(
- $page['errors'],
- l10n('You cannot move an album in its own sub album')
- );
+ $page['errors'][] = l10n('You cannot move an album in its own sub album');
return;
}
}
}
- $tables =
- array(
- USER_ACCESS_TABLE => 'user_id',
- GROUP_ACCESS_TABLE => 'group_id'
- );
+ $tables = array(
+ USER_ACCESS_TABLE => 'user_id',
+ GROUP_ACCESS_TABLE => 'group_id'
+ );
$query = '
UPDATE '.CATEGORIES_TABLE.'
@@ -1139,66 +1128,62 @@ SELECT status
{
foreach ($categories as $cat_id => $category)
{
- switch ($category['status'])
+ if ('public' == $category['status'])
{
- case 'public' :
- {
- set_cat_status(array($cat_id), 'private');
- break;
- }
- case 'private' :
- {
- $subcats = get_subcat_ids(array($cat_id));
+ set_cat_status(array($cat_id), 'private');
+ }
+
+ $subcats = get_subcat_ids(array($cat_id));
- foreach ($tables as $table => $field)
- {
- $query = '
+ foreach ($tables as $table => $field)
+ {
+ $query = '
SELECT '.$field.'
FROM '.$table.'
WHERE cat_id = '.$cat_id.'
;';
- $category_access = array_from_query($query, $field);
+ $category_access = array_from_query($query, $field);
- $query = '
+ $query = '
SELECT '.$field.'
FROM '.$table.'
WHERE cat_id = '.$new_parent.'
;';
- $parent_access = array_from_query($query, $field);
+ $parent_access = array_from_query($query, $field);
- $to_delete = array_diff($parent_access, $category_access);
+ $to_delete = array_diff($category_access, $parent_access);
- if (count($to_delete) > 0)
- {
- $query = '
+ if (count($to_delete) > 0)
+ {
+ $query = '
DELETE FROM '.$table.'
WHERE '.$field.' IN ('.implode(',', $to_delete).')
AND cat_id IN ('.implode(',', $subcats).')
;';
- pwg_query($query);
- }
- }
- break;
+ pwg_query($query);
}
}
}
}
- array_push(
- $page['infos'],
- l10n_dec(
- '%d album moved', '%d albums moved',
- count($categories)
- )
+ $page['infos'][] = l10n_dec(
+ '%d album moved', '%d albums moved',
+ count($categories)
);
}
/**
- * create a virtual category
+ * Create a virtual category.
*
- * @param string category name
- * @param int parent category id
- * @return array with ('info' and 'id') or ('error') key
+ * @param string $category_name
+ * @param int $parent_id
+ * @param array $options
+ * - boolean commentable
+ * - boolean visible
+ * - string status
+ * - string comment
+ * - boolean inherit
+ * @return array ('info', 'id') or ('error')
*/
function create_virtual_category($category_name, $parent_id=null, $options=array())
{
@@ -1303,7 +1288,33 @@ SELECT id, uppercats, global_rank, visible, status
update_global_rank();
- if ('private' == $insert['status'])
+ if ('private' == $insert['status'] and !empty($insert['id_uppercat']) and ((isset($options['inherit']) and $options['inherit']) or $conf['inheritance_by_default']) )
+ {
+ $query = '
+ SELECT group_id
+ FROM '.GROUP_ACCESS_TABLE.'
+ WHERE cat_id = '.$insert['id_uppercat'].'
+ ;';
+ $granted_grps = array_from_query($query, 'group_id');
+ $inserts = array();
+ foreach ($granted_grps as $granted_grp)
+ {
+ $inserts[] = array(
+ 'group_id' => $granted_grp,
+ 'cat_id' => $inserted_id
+ );
+ }
+ mass_inserts(GROUP_ACCESS_TABLE, array('group_id','cat_id'), $inserts);
+
+ $query = '
+ SELECT user_id
+ FROM '.USER_ACCESS_TABLE.'
+ WHERE cat_id = '.$insert['id_uppercat'].'
+ ;';
+ $granted_users = array_from_query($query, 'user_id');
+ add_permission_on_category($inserted_id, array_unique(array_merge(get_admins(), array($user['id']), $granted_users)));
+ }
+ else if ('private' == $insert['status'])
{
add_permission_on_category($inserted_id, array_unique(array_merge(get_admins(), array($user['id']))));
}
@@ -1315,12 +1326,11 @@ SELECT id, uppercats, global_rank, visible, status
}
/**
- * Set tags to an image. Warning: given tags are all tags associated to the
- * image, not additionnal tags.
+ * Set tags to an image.
+ * Warning: given tags are all tags associated to the image, not additionnal tags.
*
- * @param array tag ids
- * @param int image id
- * @return void
+ * @param int[] $tags
+ * @param int $image_id
*/
function set_tags($tags, $image_id)
{
@@ -1330,9 +1340,8 @@ function set_tags($tags, $image_id)
/**
* Add new tags to a set of images.
*
- * @param array tag ids
- * @param array image ids
- * @return void
+ * @param int[] $tags
+ * @param int[] $images
*/
function add_tags($tags, $images)
{
@@ -1367,10 +1376,13 @@ DELETE
array_keys($inserts[0]),
$inserts
);
+ invalidate_user_cache_nb_tags();
}
/**
+ * Delete tags and tags associations.
*
+ * @param int[] $tag_ids
*/
function delete_tags($tag_ids)
{
@@ -1397,9 +1409,17 @@ DELETE
WHERE id IN ('.implode(',', $tag_ids).')
;';
pwg_query($query);
+
+ invalidate_user_cache_nb_tags();
}
-function tag_id_from_tag_name($tag_name)
+/**
+ * Returns a tag id from its name. If nothing found, create a new tag.
+ *
+ * @param string $tag_name
+ * @return int
+ */
+function tag_id_from_tag_name($tag_name, $create=true)
{
global $page;
@@ -1444,6 +1464,9 @@ SELECT id
)
)
);
+
+ invalidate_user_cache_nb_tags();
+
$page['tag_id_from_tag_name_cache'][$tag_name] = pwg_db_insert_id(TAGS_TABLE);
return $page['tag_id_from_tag_name_cache'][$tag_name];
}
@@ -1454,6 +1477,11 @@ SELECT id
return $page['tag_id_from_tag_name_cache'][$tag_name];
}
+/**
+ * Set tags of images. Overwrites all existing associations.
+ *
+ * @param array $tags_of - keys are image ids, values are array of tag ids
+ */
function set_tags_of($tags_of)
{
if (count($tags_of) > 0)
@@ -1486,17 +1514,17 @@ DELETE
$inserts
);
}
+
+ invalidate_user_cache_nb_tags();
}
}
/**
* Associate a list of images to a list of categories.
+ * The function will not duplicate links and will preserve ranks.
*
- * The function will not duplicate links and will preserve ranks
- *
- * @param array images
- * @param array categories
- * @return void
+ * @param int[] $images
+ * @param int[] $categories
*/
function associate_images_to_categories($images, $categories)
{
@@ -1559,13 +1587,10 @@ SELECT
{
$rank = ++$current_rank_of[$category_id];
- array_push(
- $inserts,
- array(
- 'image_id' => $image_id,
- 'category_id' => $category_id,
- 'rank' => $rank,
- )
+ $inserts[] = array(
+ 'image_id' => $image_id,
+ 'category_id' => $category_id,
+ 'rank' => $rank,
);
}
}
@@ -1586,12 +1611,10 @@ SELECT
/**
* Dissociate images from all old categories except their storage category and
* associate to new categories.
+ * This function will preserve ranks.
*
- * This function will preserve ranks
- *
- * @param array images
- * @param array categories
- * @return void
+ * @param int[] $images
+ * @param int[] $categories
*/
function move_images_to_categories($images, $categories)
{
@@ -1630,9 +1653,8 @@ DELETE '.IMAGE_CATEGORY_TABLE.'.*
* Associate images associated to a list of source categories to a list of
* destination categories.
*
- * @param array sources
- * @param array destinations
- * @return void
+ * @param int[] $sources
+ * @param int[] $destinations
*/
function associate_categories_to_categories($sources, $destinations)
{
@@ -1654,8 +1676,7 @@ SELECT image_id
/**
* Refer main Piwigo URLs (currently PHPWG_DOMAIN domain)
*
- * @param void
- * @return array like $conf['links']
+ * @return string[]
*/
function pwg_URL()
{
@@ -1671,7 +1692,7 @@ function pwg_URL()
}
/**
- * Invalidates cahed data (permissions and category counts) for all users.
+ * Invalidates cached data (permissions and category counts) for all users.
*/
function invalidate_user_cache($full = true)
{
@@ -1695,9 +1716,25 @@ UPDATE '.USER_CACHE_TABLE.'
}
/**
- * adds the caracter set to a create table sql query.
- * all CREATE TABLE queries must call this function
- * @param string query - the sql query
+ * Invalidates cached tags counter for all users.
+ */
+function invalidate_user_cache_nb_tags()
+{
+ global $user;
+ unset($user['nb_available_tags']);
+
+ $query = '
+UPDATE '.USER_CACHE_TABLE.'
+ SET nb_available_tags = NULL';
+ pwg_query($query);
+}
+
+/**
+ * Adds the caracter set to a create table sql query.
+ * All CREATE TABLE queries must call this function
+ *
+ * @param string $query
+ * @return string
*/
function create_table_add_character_set($query)
{
@@ -1742,9 +1779,11 @@ function create_table_add_character_set($query)
}
/**
- * Returns array use on template with html_options method
- * @param Min and Max access to use
- * @return array of user access level
+ * Returns access levels as array used on template with html_options functions.
+ *
+ * @param int $MinLevelAccess
+ * @param int $MaxLevelAccess
+ * @return array
*/
function get_user_access_level_html_options($MinLevelAccess = ACCESS_FREE, $MaxLevelAccess = ACCESS_CLOSED)
{
@@ -1757,9 +1796,11 @@ function get_user_access_level_html_options($MinLevelAccess = ACCESS_FREE, $MaxL
}
/**
- * returns a list of templates currently available in template-extension
+ * returns a list of templates currently available in template-extension.
* Each .tpl file is extracted from template-extension.
- * @return array
+ *
+ * @param string $start (internal use)
+ * @return string[]
*/
function get_extents($start='')
{
@@ -1784,6 +1825,12 @@ function get_extents($start='')
return $extents;
}
+/**
+ * Create a new tag.
+ *
+ * @param string $tag_name
+ * @return array ('id', info') or ('error')
+ */
function create_tag($tag_name)
{
// does the tag already exists?
@@ -1796,45 +1843,35 @@ SELECT id
if (count($existing_tags) == 0)
{
- mass_inserts(
+ single_insert(
TAGS_TABLE,
- array('name', 'url_name'),
array(
- array(
- 'name' => $tag_name,
- 'url_name' => trigger_event('render_tag_url', $tag_name),
- )
+ 'name' => $tag_name,
+ 'url_name' => trigger_event('render_tag_url', $tag_name),
)
);
$inserted_id = pwg_db_insert_id(TAGS_TABLE);
return array(
- 'info' => sprintf(
- l10n('Tag "%s" was added'),
- stripslashes($tag_name)
- ),
+ 'info' => l10n('Tag "%s" was added', stripslashes($tag_name)),
'id' => $inserted_id,
);
}
else
{
return array(
- 'error' => sprintf(
- l10n('Tag "%s" already exists'),
- stripslashes($tag_name)
- )
+ 'error' => l10n('Tag "%s" already exists', stripslashes($tag_name))
);
}
}
/**
* Is the category accessible to the (Admin) user ?
- *
* Note : if the user is not authorized to see this category, category jump
* will be replaced by admin cat_modify page
*
- * @param int category id to verify
+ * @param int $category_id
* @return bool
*/
function cat_admin_access($category_id)
@@ -1851,10 +1888,14 @@ function cat_admin_access($category_id)
}
/**
- * Retrieve data from external URL
+ * Retrieve data from external URL.
*
- * @param string $src: URL
- * @param global $dest: can be a file ressource or string
+ * @param string $src
+ * @param string|Ressource $dest - can be a file ressource or string
+ * @param array $get_data - data added to request url
+ * @param array $post_data - data transmitted with POST
+ * @param string $user_agent
+ * @param int $step (internal use)
* @return bool
*/
function fetchRemote($src, &$dest, $get_data=array(), $post_data=array(), $user_agent='Piwigo', $step=0)
@@ -2008,13 +2049,11 @@ function fetchRemote($src, &$dest, $get_data=array(), $post_data=array(), $user_
return true;
}
-
/**
- * returns the groupname corresponding to the given group identifier if
- * exists
+ * Returns the groupname corresponding to the given group identifier if exists.
*
- * @param int group_id
- * @return mixed
+ * @param int $group_id
+ * @return string|false
*/
function get_groupname($group_id)
{
@@ -2037,10 +2076,10 @@ SELECT name
}
/**
- * returns the username corresponding to the given user identifier if exists
+ * Returns the username corresponding to the given user identifier if exists.
*
- * @param int user_id
- * @return mixed
+ * @param int $user_id
+ * @return string|false
*/
function get_username($user_id)
{
@@ -2064,13 +2103,22 @@ SELECT '.$conf['user_fields']['username'].'
return stripslashes($username);
}
-function get_newsletter_subscribe_base_url($language) {
+/**
+ * Get url on piwigo.org for newsletter subscription
+ *
+ * @param string $language (unused)
+ * @return string
+ */
+function get_newsletter_subscribe_base_url($language='en_UK')
+{
return PHPWG_URL.'/announcement/subscribe/';
}
/**
- * Accordion menus need to know which section to open by default when
- * loading the page
+ * Return admin menu id for accordion.
+ *
+ * @param string $menu_page
+ * @return int
*/
function get_active_menu($menu_page)
{
@@ -2125,14 +2173,19 @@ function get_active_menu($menu_page)
case 'theme':
case 'languages':
return 5;
+
+ default:
+ return 0;
}
- return 0;
}
-/*
- * get tags list from SQL query (ids are surrounded by ~~, for get_tag_ids())
- * @param string: query
- * @param boolean: only_user_language, if true, only local name is returned for multilingual tags
+/**
+ * Get tags list from SQL query (ids are surrounded by ~~, for get_tag_ids()).
+ *
+ * @param string $query
+ * @param boolean $only_user_language - if true, only local name is returned for
+ * multilingual tags (if ExtendedDescription plugin is active)
+ * @return array[] ('id', 'name')
*/
function get_taglist($query, $only_user_language=true)
{
@@ -2143,7 +2196,7 @@ function get_taglist($query, $only_user_language=true)
while ($row = pwg_db_fetch_assoc($result))
{
$raw_name = $row['name'];
- $name = trigger_event('render_tag_name', $raw_name);
+ $name = trigger_event('render_tag_name', $raw_name, $row);
$taglist[] = array(
'name' => $name,
@@ -2174,18 +2227,20 @@ function get_taglist($query, $only_user_language=true)
return $taglist;
}
-/*
- * get tags ids from a list of raw tags (existing tags or new tags)
- * @param mixed: raw_tags, array or comma separated string
- * @param boolean: allow_create
+/**
+ * Get tags ids from a list of raw tags (existing tags or new tags).
+ *
+ * In $raw_tags we receive something like array('~~6~~', '~~59~~', 'New
+ * tag', 'Another new tag') The ~~34~~ means that it is an existing
+ * tag. We added the surrounding ~~ to permit creation of tags like "10"
+ * or "1234" (numeric characters only)
+ *
+ * @param string|string[] $raw_tags - array or comma separated string
+ * @param boolean $allow_create
+ * @return int[]
*/
function get_tag_ids($raw_tags, $allow_create=true)
{
- // In $raw_tags we receive something like array('~~6~~', '~~59~~', 'New
- // tag', 'Another new tag') The ~~34~~ means that it is an existing
- // tag. I've added the surrounding ~~ to permit creation of tags like "10"
- // or "1234" (numeric characters only)
-
$tag_ids = array();
if (!is_array($raw_tags))
{
@@ -2208,11 +2263,16 @@ function get_tag_ids($raw_tags, $allow_create=true)
return $tag_ids;
}
-/** returns the argument_ids array with new sequenced keys based on related
+/**
+ * Returns the argument_ids array with new sequenced keys based on related
* names. Sequence is not case sensitive.
- * Warning: By definition, this function breaks original keys
+ * Warning: By definition, this function breaks original keys.
+ *
+ * @param int[] $elements_ids
+ * @param string[] $name - names of elements, indexed by ids
+ * @return int[]
*/
-function order_by_name($element_ids,$name)
+function order_by_name($element_ids, $name)
{
$ordered_element_ids = array();
foreach ($element_ids as $k_id => $element_id)
@@ -2224,14 +2284,18 @@ function order_by_name($element_ids,$name)
return $ordered_element_ids;
}
+/**
+ * Grant access to a list of categories for a list of users.
+ *
+ * @param int[] $category_ids
+ * @param int[] $user_ids
+ */
function add_permission_on_category($category_ids, $user_ids)
{
- // array-ify categories and users
if (!is_array($category_ids))
{
$category_ids = array($category_ids);
}
-
if (!is_array($user_ids))
{
$user_ids = array($user_ids);
@@ -2244,12 +2308,16 @@ function add_permission_on_category($category_ids, $user_ids)
}
// make sure categories are private and select uppercats or subcats
- $cat_ids = (isset($_POST['apply_on_sub'])) ? implode(',', get_subcat_ids($category_ids)).",".implode(',', get_uppercat_ids($category_ids)) : implode(',', get_uppercat_ids($category_ids));
+ $cat_ids = get_uppercat_ids($category_ids);
+ if (isset($_POST['apply_on_sub']))
+ {
+ $cat_ids = array_merge($cat_ids, get_subcat_ids($category_ids));
+ }
+
$query = '
-SELECT
- id
+SELECT id
FROM '.CATEGORIES_TABLE.'
- WHERE id IN ('.$cat_ids.')
+ WHERE id IN ('.implode(',', $cat_ids).')
AND status = \'private\'
;';
$private_cats = array_from_query($query, 'id');
@@ -2258,53 +2326,33 @@ SELECT
{
return;
}
-
- // We must not reinsert already existing lines in user_access table
- $granteds = array();
- foreach ($private_cats as $cat_id)
- {
- $granteds[$cat_id] = array();
- }
-
- $query = '
-SELECT
- user_id,
- cat_id
- FROM '.USER_ACCESS_TABLE.'
- WHERE cat_id IN ('.implode(',', $private_cats).')
- AND user_id IN ('.implode(',', $user_ids).')
-;';
- $result = pwg_query($query);
- while ($row = pwg_db_fetch_assoc($result))
- {
- array_push($granteds[$row['cat_id']], $row['user_id']);
- }
-
+
$inserts = array();
-
foreach ($private_cats as $cat_id)
{
- $grant_to_users = array_diff($user_ids, $granteds[$cat_id]);
-
- foreach ($grant_to_users as $user_id)
+ foreach ($user_ids as $user_id)
{
- array_push(
- $inserts,
- array(
- 'user_id' => $user_id,
- 'cat_id' => $cat_id
- )
+ $inserts[] = array(
+ 'user_id' => $user_id,
+ 'cat_id' => $cat_id
);
}
}
-
- if (count($inserts) > 0)
- {
- mass_inserts(USER_ACCESS_TABLE, array_keys($inserts[0]), $inserts);
- }
+
+ mass_inserts(
+ USER_ACCESS_TABLE,
+ array('user_id','cat_id'),
+ $inserts,
+ array('ignore'=>true)
+ );
}
-
+/**
+ * Returns the list of admin users.
+ *
+ * @param boolean $include_webmaster
+ * @return int[]
+ */
function get_admins($include_webmaster=true)
{
$status_list = array('admin');
@@ -2324,7 +2372,11 @@ SELECT
return array_from_query($query, 'user_id');
}
-/** delete all derivative files for one or several types */
+/**
+ * Delete all derivative files for one or several types
+ *
+ * @param 'all'|int[] $types
+ */
function clear_derivative_cache($types='all')
{
if ($types === 'all')
@@ -2381,6 +2433,10 @@ function clear_derivative_cache($types='all')
}
}
+/**
+ * Used by clear_derivative_cache()
+ * @ignore
+ */
function clear_derivative_cache_rec($path, $pattern)
{
$rmdir = true;
@@ -2427,6 +2483,12 @@ function clear_derivative_cache_rec($path, $pattern)
}
}
+/**
+ * Deletes derivatives of a particular element
+ *
+ * @param array $infos ('path'[, 'representative_ext'])
+ * @param 'all'|int $type
+ */
function delete_element_derivatives($infos, $type='all')
{
$path = $infos['path'];
@@ -2456,4 +2518,85 @@ function delete_element_derivatives($infos, $type='all')
}
}
}
+
+/**
+ * Returns an array containing sub-directories, excluding ".svn"
+ *
+ * @param string $directory
+ * @return string[]
+ */
+function get_dirs($directory)
+{
+ $sub_dirs = array();
+ if ($opendir = opendir($directory))
+ {
+ while ($file = readdir($opendir))
+ {
+ if ($file != '.'
+ and $file != '..'
+ and is_dir($directory.'/'.$file)
+ and $file != '.svn')
+ {
+ $sub_dirs[] = $file;
+ }
+ }
+ closedir($opendir);
+ }
+ return $sub_dirs;
+}
+
+/**
+ * Recursively delete a directory.
+ *
+ * @param string $path
+ * @param string $trash_path, try to move the directory to this path if it cannot be delete
+ */
+function deltree($path, $trash_path=null)
+{
+ if (is_dir($path))
+ {
+ $fh = opendir($path);
+ while ($file = readdir($fh))
+ {
+ if ($file != '.' and $file != '..')
+ {
+ $pathfile = $path . '/' . $file;
+ if (is_dir($pathfile))
+ {
+ deltree($pathfile, $trash_path);
+ }
+ else
+ {
+ @unlink($pathfile);
+ }
+ }
+ }
+ closedir($fh);
+
+ if (@rmdir($path))
+ {
+ return true;
+ }
+ elseif (!empty($trash_path))
+ {
+ if (!is_dir($trash_path))
+ {
+ @mkgetdir($trash_path, MKGETDIR_RECURSIVE|MKGETDIR_DIE_ON_ERROR|MKGETDIR_PROTECT_HTACCESS);
+ }
+ while ($r = $trash_path . '/' . md5(uniqid(rand(), true)))
+ {
+ if (!is_dir($r))
+ {
+ @rename($path, $r);
+ break;
+ }
+ }
+ }
+ else
+ {
+ return false;
+ }
+ }
+}
+
?> \ No newline at end of file
diff --git a/admin/include/functions_history.inc.php b/admin/include/functions_history.inc.php
index 2b18547dc..61d676503 100644
--- a/admin/include/functions_history.inc.php
+++ b/admin/include/functions_history.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -58,18 +58,12 @@ SELECT
if (isset($search['fields']['date-after']))
{
- array_push(
- $clauses,
- "date >= '".$search['fields']['date-after']."'"
- );
+ $clauses[] = "date >= '".$search['fields']['date-after']."'";
}
if (isset($search['fields']['date-before']))
{
- array_push(
- $clauses,
- "date <= '".$search['fields']['date-before']."'"
- );
+ $clauses[] = "date <= '".$search['fields']['date-before']."'";
}
if (isset($search['fields']['types']))
@@ -88,34 +82,25 @@ SELECT
$clause.= "= '".$type."'";
}
- array_push($local_clauses, $clause);
+ $local_clauses[] = $clause;
}
}
if (count($local_clauses) > 0)
{
- array_push(
- $clauses,
- implode(' OR ', $local_clauses)
- );
+ $clauses[] = implode(' OR ', $local_clauses);
}
}
if (isset($search['fields']['user'])
and $search['fields']['user'] != -1)
{
- array_push(
- $clauses,
- 'user_id = '.$search['fields']['user']
- );
+ $clauses[] = 'user_id = '.$search['fields']['user'];
}
if (isset($search['fields']['image_id']))
{
- array_push(
- $clauses,
- 'image_id = '.$search['fields']['image_id']
- );
+ $clauses[] = 'image_id = '.$search['fields']['image_id'];
}
if (isset($search['fields']['filename']))
@@ -123,14 +108,11 @@ SELECT
if (count($search['image_ids']) == 0)
{
// a clause that is always false
- array_push($clauses, '1 = 2 ');
+ $clauses[] = '1 = 2 ';
}
else
{
- array_push(
- $clauses,
- 'image_id IN ('.implode(', ', $search['image_ids']).')'
- );
+ $clauses[] = 'image_id IN ('.implode(', ', $search['image_ids']).')';
}
}
@@ -168,7 +150,7 @@ SELECT
while ($row = pwg_db_fetch_assoc($result))
{
- array_push($data, $row);
+ $data[] = $row;
}
return $data;
@@ -177,4 +159,4 @@ SELECT
add_event_handler('get_history', 'get_history', EVENT_HANDLER_PRIORITY_NEUTRAL, 3);
trigger_action('functions_history_included');
-?>
+?> \ No newline at end of file
diff --git a/admin/include/functions_install.inc.php b/admin/include/functions_install.inc.php
index d9643e721..9e479f54b 100644
--- a/admin/include/functions_install.inc.php
+++ b/admin/include/functions_install.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -79,7 +79,7 @@ function activate_core_themes()
$themes = new themes();
foreach ($themes->fs_themes as $theme_id => $fs_theme)
{
- if (in_array($theme_id, array('elegant', 'Sylvia', 'clear', 'dark', 'smartpocket')))
+ if (in_array($theme_id, array('elegant', 'smartpocket')))
{
$themes->perform_action('activate', $theme_id);
}
@@ -96,7 +96,7 @@ function install_db_connect(&$infos, &$errors)
}
catch (Exception $e)
{
- array_push( $errors, l10n($e->getMessage()));
+ $errors[] = l10n($e->getMessage());
}
}
?> \ No newline at end of file
diff --git a/admin/include/functions_metadata.php b/admin/include/functions_metadata.php
index e3fc84d96..5bcbb12bf 100644
--- a/admin/include/functions_metadata.php
+++ b/admin/include/functions_metadata.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -122,7 +122,8 @@ function get_sync_metadata_attributes()
$update_fields =
array_merge(
$update_fields,
- array_keys($conf['use_exif_mapping'])
+ array_keys($conf['use_exif_mapping']),
+ array('latitude', 'longitude')
);
}
@@ -219,23 +220,20 @@ SELECT id, path, representative_ext
foreach (explode(',', $data[$key]) as $tag_name)
{
- array_push(
- $tags_of[$id],
- tag_id_from_tag_name($tag_name)
- );
+ $tags_of[$id][] = tag_id_from_tag_name($tag_name);
}
}
}
$data['date_metadata_update'] = CURRENT_DATE;
- array_push($datas, $data);
+ $datas[] = $data;
}
if (count($datas) > 0)
{
$update_fields = get_sync_metadata_attributes();
- array_push($update_fields, 'date_metadata_update');
+ $update_fields[] = 'date_metadata_update';
$update_fields = array_diff(
$update_fields,
@@ -297,7 +295,7 @@ SELECT id
$result = pwg_query($query);
while ($row = pwg_db_fetch_assoc($result))
{
- array_push($cat_ids, $row['id']);
+ $cat_ids[] = $row['id'];
}
if (count($cat_ids) == 0)
diff --git a/admin/include/functions_notification_by_mail.inc.php b/admin/include/functions_notification_by_mail.inc.php
index e727e9e6f..8d0fe2621 100644
--- a/admin/include/functions_notification_by_mail.inc.php
+++ b/admin/include/functions_notification_by_mail.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -169,7 +169,7 @@ order by';
{
while ($nbm_user = pwg_db_fetch_assoc($result))
{
- array_push($data_users, $nbm_user);
+ $data_users[] = $nbm_user;
}
}
}
@@ -256,8 +256,7 @@ function set_user_on_env_nbm(&$nbm_user, $is_action_send)
if ($is_action_send)
{
- $nbm_user['theme'] = $user['theme'];
- $env_nbm['mail_template'] = get_mail_template($env_nbm['email_format'], $nbm_user['theme']);
+ $env_nbm['mail_template'] = get_mail_template($env_nbm['email_format']);
$env_nbm['mail_template']->set_filename('notification_by_mail', 'notification_by_mail.tpl');
}
}
@@ -285,7 +284,7 @@ function inc_mail_sent_success($nbm_user)
global $page, $env_nbm;
$env_nbm['sent_mail_count'] += 1;
- array_push($page['infos'], sprintf($env_nbm['msg_info'], stripslashes($nbm_user['username']), $nbm_user['mail_address']));
+ $page['infos'][] = sprintf($env_nbm['msg_info'], stripslashes($nbm_user['username']), $nbm_user['mail_address']);
}
/*
@@ -298,7 +297,7 @@ function inc_mail_sent_failed($nbm_user)
global $page, $env_nbm;
$env_nbm['error_on_mail_count'] += 1;
- array_push($page['errors'], sprintf($env_nbm['msg_error'], stripslashes($nbm_user['username']), $nbm_user['mail_address']));
+ $page['errors'][] = sprintf($env_nbm['msg_error'], stripslashes($nbm_user['username']), $nbm_user['mail_address']);
}
/*
@@ -312,16 +311,32 @@ function display_counter_info()
if ($env_nbm['error_on_mail_count'] != 0)
{
- array_push($page['errors'], l10n_dec('%d mail was not sent.', '%d mails were not sent.', $env_nbm['error_on_mail_count']));
+ $page['errors'][] = l10n_dec(
+ '%d mail was not sent.', '%d mails were not sent.',
+ $env_nbm['error_on_mail_count']
+ );
+
if ($env_nbm['sent_mail_count'] != 0)
- array_push($page['infos'], l10n_dec('%d mail was sent.', '%d mails were sent.', $env_nbm['sent_mail_count']));
+ {
+ $page['infos'][] = l10n_dec(
+ '%d mail was sent.', '%d mails were sent.',
+ $env_nbm['sent_mail_count']
+ );
+ }
}
else
{
if ($env_nbm['sent_mail_count'] == 0)
- array_push($page['infos'], l10n('No mail to send.'));
+ {
+ $page['infos'][] = l10n('No mail to send.');
+ }
else
- array_push($page['infos'], l10n_dec('%d mail was sent.', '%d mails were sent.', $env_nbm['sent_mail_count']));
+ {
+ $page['infos'][] = l10n_dec(
+ '%d mail was sent.', '%d mails were sent.',
+ $env_nbm['sent_mail_count']
+ );
+ }
}
}
@@ -394,12 +409,12 @@ function do_subscribe_unsubscribe_notification_by_mail($is_admin_request, $is_su
if (check_sendmail_timeout())
{
// Stop fill list on 'send', if the quota is override
- array_push($page['errors'], $msg_break_timeout);
+ $page['errors'][] = $msg_break_timeout;
break;
}
// Fill return list
- array_push($check_key_treated, $nbm_user['check_key']);
+ $check_key_treated[] = $nbm_user['check_key'];
$do_update = true;
if ($nbm_user['mail_address'] != '')
@@ -407,7 +422,7 @@ function do_subscribe_unsubscribe_notification_by_mail($is_admin_request, $is_su
// set env nbm user
set_user_on_env_nbm($nbm_user, true);
- $subject = '['.$conf['gallery_title'].']: '.($is_subscribe ? l10n('Subscribe to notification by mail'): l10n('Unsubscribe from notification by mail'));
+ $subject = '['.$conf['gallery_title'].'] '.($is_subscribe ? l10n('Subscribe to notification by mail'): l10n('Unsubscribe from notification by mail'));
// Assign current var for nbm mail
assign_vars_nbm_mail_content($nbm_user);
@@ -423,20 +438,22 @@ function do_subscribe_unsubscribe_notification_by_mail($is_admin_request, $is_su
'GOTO_GALLERY_URL' => get_gallery_home_url(),
)
);
+
+ $ret = pwg_mail(
+ array(
+ 'name' => stripslashes($nbm_user['username']),
+ 'email' => $nbm_user['mail_address'],
+ ),
+ array(
+ 'from' => $env_nbm['send_as_mail_formated'],
+ 'subject' => $subject,
+ 'email_format' => $env_nbm['email_format'],
+ 'content' => $env_nbm['mail_template']->parse('notification_by_mail', true),
+ 'content_format' => $env_nbm['email_format'],
+ )
+ );
- if (pwg_mail
- (
- format_email(stripslashes($nbm_user['username']), $nbm_user['mail_address']),
- array
- (
- 'from' => $env_nbm['send_as_mail_formated'],
- 'subject' => $subject,
- 'email_format' => $env_nbm['email_format'],
- 'content' => $env_nbm['mail_template']->parse('notification_by_mail', true),
- 'content_format' => $env_nbm['email_format'],
- 'theme' => $nbm_user['theme']
- )
- ))
+ if ($ret)
{
inc_mail_sent_success($nbm_user);
}
@@ -453,22 +470,17 @@ function do_subscribe_unsubscribe_notification_by_mail($is_admin_request, $is_su
if ($do_update)
{
- array_push
- (
- $updates,
- array
- (
- 'check_key' => $nbm_user['check_key'],
- 'enabled' => $enabled_value
- )
- );
+ $updates[] = array(
+ 'check_key' => $nbm_user['check_key'],
+ 'enabled' => $enabled_value
+ );
$updated_data_count += 1;
- array_push($page['infos'], sprintf($msg_info, stripslashes($nbm_user['username']), $nbm_user['mail_address']));
+ $page['infos'][] = sprintf($msg_info, stripslashes($nbm_user['username']), $nbm_user['mail_address']);
}
else
{
$error_on_updated_data_count += 1;
- array_push($page['errors'], sprintf($msg_error, stripslashes($nbm_user['username']), $nbm_user['mail_address']));
+ $page['errors'][] = sprintf($msg_error, stripslashes($nbm_user['username']), $nbm_user['mail_address']);
}
}
@@ -489,13 +501,17 @@ function do_subscribe_unsubscribe_notification_by_mail($is_admin_request, $is_su
}
- array_push($page['infos'], l10n_dec('%d user was updated.', '%d users were updated.', $updated_data_count));
+ $page['infos'][] = l10n_dec(
+ '%d user was updated.', '%d users were updated.',
+ $updated_data_count
+ );
+
if ($error_on_updated_data_count != 0)
{
- array_push($page['errors'],
- l10n_dec('%d user was not updated.',
- '%d users were not updated.',
- $error_on_updated_data_count));
+ $page['errors'][] = l10n_dec(
+ '%d user was not updated.', '%d users were not updated.',
+ $error_on_updated_data_count
+ );
}
unset_make_full_url();
diff --git a/admin/include/functions_permalinks.php b/admin/include/functions_permalinks.php
index 5c5541af8..6c8ae4aac 100644
--- a/admin/include/functions_permalinks.php
+++ b/admin/include/functions_permalinks.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/admin/include/functions_plugins.inc.php b/admin/include/functions_plugins.inc.php
index 682e05d06..fb98c799c 100644
--- a/admin/include/functions_plugins.inc.php
+++ b/admin/include/functions_plugins.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -39,7 +39,7 @@ function get_admin_plugin_menu_link($file)
}
else if (isset($page['errors']))
{
- array_push($page['errors'], 'PLUGIN ERROR: "'.$file.'" is not a valid file');
+ $page['errors'][] = 'PLUGIN ERROR: "'.$file.'" is not a valid file';
}
return $url;
}
diff --git a/admin/include/functions_upgrade.php b/admin/include/functions_upgrade.php
index ed4b0f410..4bd639f85 100644
--- a/admin/include/functions_upgrade.php
+++ b/admin/include/functions_upgrade.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -93,7 +93,7 @@ AND id NOT IN (\'' . implode('\',\'', $standard_plugins) . '\')
$plugins = array();
while ($row = pwg_db_fetch_assoc($result))
{
- array_push($plugins, $row['id']);
+ $plugins[] = $row['id'];
}
if (!empty($plugins))
@@ -105,8 +105,8 @@ WHERE id IN (\'' . implode('\',\'', $plugins) . '\')
;';
pwg_query($query);
- array_push($page['infos'],
- l10n('As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:').'<p><i>'.implode(', ', $plugins).'</i></p>');
+ $page['infos'][] = l10n('As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:')
+ .'<p><i>'.implode(', ', $plugins).'</i></p>';
}
}
@@ -135,8 +135,8 @@ SELECT
$theme_names = array();
while ($row = pwg_db_fetch_assoc($result))
{
- array_push($theme_ids, $row['id']);
- array_push($theme_names, $row['name']);
+ $theme_ids[] = $row['id'];
+ $theme_names[] = $row['name'];
}
if (!empty($theme_ids))
@@ -148,8 +148,8 @@ DELETE
;';
pwg_query($query);
- array_push($page['infos'],
- l10n('As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:').'<p><i>'.implode(', ', $theme_names).'</i></p>');
+ $page['infos'][] = l10n('As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:')
+ .'<p><i>'.implode(', ', $theme_names).'</i></p>';
// what is the default theme?
$query = '
@@ -249,11 +249,11 @@ WHERE '.$conf['user_fields']['username'].'=\''.$username.'\'
if (!$conf['password_verify']($password, $row['password']))
{
- array_push($page['errors'], l10n('Invalid password!'));
+ $page['errors'][] = l10n('Invalid password!');
}
elseif ($row['status'] != 'admin' and $row['status'] != 'webmaster')
{
- array_push($page['errors'], l10n('You do not have access rights to run upgrade'));
+ $page['errors'][] = l10n('You do not have access rights to run upgrade');
}
else
{
@@ -279,7 +279,7 @@ function get_available_upgrade_ids()
if (is_file($upgrades_path.'/'.$node)
and preg_match('/^(.*?)-database\.php$/', $node, $match))
{
- array_push($available_upgrade_ids, $match[1]);
+ $available_upgrade_ids[] = $match[1];
}
}
}
diff --git a/admin/include/functions_upload.inc.php b/admin/include/functions_upload.inc.php
index a23977910..40a53adf9 100644
--- a/admin/include/functions_upload.inc.php
+++ b/admin/include/functions_upload.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -122,13 +122,9 @@ function save_upload_form_config($data, &$errors=array(), &$form_errors=array())
}
else
{
- array_push(
- $errors,
- sprintf(
- $upload_form_config[$field]['error_message'],
- $min,
- $max
- )
+ $errors[] = sprintf(
+ $upload_form_config[$field]['error_message'],
+ $min, $max
);
$form_errors[$field] = '['.$min.' .. '.$max.']';
@@ -175,6 +171,7 @@ function add_uploaded_file($source_filepath, $original_filename=null, $categorie
}
$file_path = null;
+ $is_tiff = false;
if (isset($image_id))
{
@@ -230,6 +227,11 @@ SELECT
{
$file_path.= 'gif';
}
+ elseif (IMAGETYPE_TIFF_MM == $type or IMAGETYPE_TIFF_II == $type)
+ {
+ $is_tiff = true;
+ $file_path.= 'tif';
+ }
else
{
$file_path.= 'jpg';
@@ -248,6 +250,50 @@ SELECT
}
@chmod($file_path, 0644);
+ if ($is_tiff and pwg_image::get_library() == 'ext_imagick')
+ {
+ // move the uploaded file to pwg_representative sub-directory
+ $representative_file_path = dirname($file_path).'/pwg_representative/';
+ $representative_file_path.= get_filename_wo_extension(basename($file_path)).'.';
+
+ $representative_ext = $conf['tiff_representative_ext'];
+ $representative_file_path.= $representative_ext;
+
+ prepare_directory(dirname($representative_file_path));
+
+ $exec = $conf['ext_imagick_dir'].'convert';
+
+ if ('jpg' == $conf['tiff_representative_ext'])
+ {
+ $exec .= ' -quality 98';
+ }
+
+ $exec .= ' "'.realpath($file_path).'"';
+
+ $dest = pathinfo($representative_file_path);
+ $exec .= ' "'.realpath($dest['dirname']).'/'.$dest['basename'].'"';
+
+ $exec .= ' 2>&1';
+ @exec($exec, $returnarray);
+
+ // sometimes ImageMagick creates file-0.jpg (full size) + file-1.jpg
+ // (thumbnail). I don't know how to avoid it.
+ $representative_file_abspath = realpath($dest['dirname']).'/'.$dest['basename'];
+ if (!file_exists($representative_file_abspath))
+ {
+ $first_file_abspath = preg_replace(
+ '/\.'.$representative_ext.'$/',
+ '-0.'.$representative_ext,
+ $representative_file_abspath
+ );
+
+ if (file_exists($first_file_abspath))
+ {
+ rename($first_file_abspath, $representative_file_abspath);
+ }
+ }
+ }
+
if (pwg_image::get_library() != 'gd')
{
if ($conf['original_resize'])
@@ -324,6 +370,11 @@ SELECT
$insert['level'] = $level;
}
+ if (isset($representative_ext))
+ {
+ $insert['representative_ext'] = $representative_ext;
+ }
+
single_insert(IMAGES_TABLE, $insert);
$image_id = pwg_db_insert_id(IMAGES_TABLE);
@@ -494,16 +545,7 @@ function convert_shorthand_notation_to_bytes($value)
function add_upload_error($upload_id, $error_message)
{
- if (!isset($_SESSION['uploads_error']))
- {
- $_SESSION['uploads_error'] = array();
- }
- if (!isset($_SESSION['uploads_error'][$upload_id]))
- {
- $_SESSION['uploads_error'][$upload_id] = array();
- }
-
- array_push($_SESSION['uploads_error'][$upload_id], $error_message);
+ $_SESSION['uploads_error'][$upload_id][] = $error_message;
}
function ready_for_upload_message()
diff --git a/admin/include/image.class.php b/admin/include/image.class.php
index 02e45a209..101309911 100644
--- a/admin/include/image.class.php
+++ b/admin/include/image.class.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/admin/include/index.php b/admin/include/index.php
index 41732f2fd..c8de97f60 100644
--- a/admin/include/index.php
+++ b/admin/include/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/admin/include/languages.class.php b/admin/include/languages.class.php
index 6a7262bb0..bb9487bec 100644
--- a/admin/include/languages.class.php
+++ b/admin/include/languages.class.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -57,7 +57,7 @@ class languages
case 'activate':
if (isset($crt_db_language))
{
- array_push($errors, 'CANNOT ACTIVATE - LANGUAGE IS ALREADY ACTIVATED');
+ $errors[] = 'CANNOT ACTIVATE - LANGUAGE IS ALREADY ACTIVATED';
break;
}
@@ -74,13 +74,13 @@ INSERT INTO '.LANGUAGES_TABLE.'
case 'deactivate':
if (!isset($crt_db_language))
{
- array_push($errors, 'CANNOT DEACTIVATE - LANGUAGE IS ALREADY DEACTIVATED');
+ $errors[] = 'CANNOT DEACTIVATE - LANGUAGE IS ALREADY DEACTIVATED';
break;
}
if ($language_id == get_default_language())
{
- array_push($errors, 'CANNOT DEACTIVATE - LANGUAGE IS DEFAULT LANGUAGE');
+ $errors[] = 'CANNOT DEACTIVATE - LANGUAGE IS DEFAULT LANGUAGE';
break;
}
@@ -95,12 +95,12 @@ DELETE
case 'delete':
if (!empty($crt_db_language))
{
- array_push($errors, 'CANNOT DELETE - LANGUAGE IS ACTIVATED');
+ $errors[] = 'CANNOT DELETE - LANGUAGE IS ACTIVATED';
break;
}
if (!isset($this->fs_languages[$language_id]))
{
- array_push($errors, 'CANNOT DELETE - LANGUAGE DOES NOT EXIST');
+ $errors[] = 'CANNOT DELETE - LANGUAGE DOES NOT EXIST';
break;
}
@@ -112,10 +112,7 @@ UPDATE '.USER_INFOS_TABLE.'
;';
pwg_query($query);
- if (!$this->deltree(PHPWG_ROOT_PATH.'language/'.$language_id))
- {
- $this->send_to_trash(PHPWG_ROOT_PATH.'language/'.$language_id);
- }
+ deltree(PHPWG_ROOT_PATH.'language/'.$language_id, PHPWG_ROOT_PATH.'language/trash');
break;
case 'set_default':
@@ -371,7 +368,7 @@ UPDATE '.USER_INFOS_TABLE.'
and $old_files = file($extract_path.'/obsolete.list', FILE_IGNORE_NEW_LINES)
and !empty($old_files))
{
- array_push($old_files, 'obsolete.list');
+ $old_files[] = 'obsolete.list';
foreach($old_files as $old_file)
{
$path = $extract_path.'/'.$old_file;
@@ -381,10 +378,7 @@ UPDATE '.USER_INFOS_TABLE.'
}
elseif (is_dir($path))
{
- if (!$this->deltree($path))
- {
- $this->send_to_trash($path);
- }
+ deltree($path, PHPWG_ROOT_PATH.'language/trash');
}
}
}
@@ -406,59 +400,6 @@ UPDATE '.USER_INFOS_TABLE.'
}
/**
- * delete $path directory
- * @param string - path
- */
- function deltree($path)
- {
- if (is_dir($path))
- {
- $fh = opendir($path);
- while ($file = readdir($fh))
- {
- if ($file != '.' and $file != '..')
- {
- $pathfile = $path . '/' . $file;
- if (is_dir($pathfile))
- {
- $this->deltree($pathfile);
- }
- else
- {
- @unlink($pathfile);
- }
- }
- }
- closedir($fh);
- return @rmdir($path);
- }
- }
-
- /**
- * send $path to trash directory
- * @param string - path
- */
- function send_to_trash($path)
- {
- $trash_path = PHPWG_ROOT_PATH . 'language/trash';
- if (!is_dir($trash_path))
- {
- @mkdir($trash_path);
- $file = @fopen($trash_path . '/.htaccess', 'w');
- @fwrite($file, 'deny from all');
- @fclose($file);
- }
- while ($r = $trash_path . '/' . md5(uniqid(rand(), true)))
- {
- if (!is_dir($r))
- {
- @rename($path, $r);
- break;
- }
- }
- }
-
- /**
* Sort functions
*/
function language_version_compare($a, $b)
diff --git a/admin/include/photos_add_direct_prepare.inc.php b/admin/include/photos_add_direct_prepare.inc.php
index f9443553d..117abb802 100644
--- a/admin/include/photos_add_direct_prepare.inc.php
+++ b/admin/include/photos_add_direct_prepare.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -105,6 +105,18 @@ if (pwg_image::get_library() == 'gd')
}
}
+//warn the user if the picture will be resized after upload
+if ($conf['original_resize'])
+{
+ $template->assign(
+ array(
+ 'original_resize_maxwidth' => $conf['original_resize_maxwidth'],
+ 'original_resize_maxheight' => $conf['original_resize_maxheight'],
+ )
+ );
+}
+
+
$upload_modes = array('html', 'multiple');
$upload_mode = isset($conf['upload_mode']) ? $conf['upload_mode'] : 'multiple';
@@ -132,6 +144,13 @@ $template->assign(
);
$upload_file_types = 'jpeg, png, gif';
+
+if (pwg_image::get_library() == 'ext_imagick')
+{
+ $upload_file_types.= ', tiff';
+ $template->assign('tif_enabled', true);
+}
+
if ('html' == $upload_mode)
{
$upload_file_types.= ', zip';
@@ -148,28 +167,52 @@ $template->assign(
// we need to know the category in which the last photo was added
$selected_category = array();
-$selected_parent = array();
-$query = '
-SELECT
- category_id,
- id_uppercat
+if (isset($_GET['album']))
+{
+ // set the category from get url or ...
+ check_input_parameter('album', $_GET, false, PATTERN_ID);
+
+ // test if album really exists
+ $query = '
+SELECT id
+ FROM '.CATEGORIES_TABLE.'
+ WHERE id = '.$_GET['album'].'
+;';
+ $result = pwg_query($query);
+ if (pwg_db_num_rows($result) == 1)
+ {
+ $selected_category = array($_GET['album']);
+
+ // lets put in the session to persist in case of upload method switch
+ $_SESSION['selected_category'] = $selected_category;
+ }
+ else
+ {
+ fatal_error('[Hacking attempt] the album id = "'.$_GET['album'].'" is not valid');
+ }
+}
+else if (isset($_SESSION['selected_category']))
+{
+ $selected_category = $_SESSION['selected_category'];
+}
+else
+{
+ // we need to know the category in which the last photo was added
+ $query = '
+SELECT category_id
FROM '.IMAGES_TABLE.' AS i
JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON image_id = i.id
JOIN '.CATEGORIES_TABLE.' AS c ON category_id = c.id
ORDER BY i.id DESC
LIMIT 1
-;';
-$result = pwg_query($query);
-if (pwg_db_num_rows($result) > 0)
-{
- $row = pwg_db_fetch_assoc($result);
-
- $selected_category = array($row['category_id']);
-
- if (!empty($row['id_uppercat']))
+;
+';
+ $result = pwg_query($query);
+ if (pwg_db_num_rows($result) > 0)
{
- $selected_parent = array($row['id_uppercat']);
+ $row = pwg_db_fetch_assoc($result);
+ $selected_category = array($row['category_id']);
}
}
@@ -185,13 +228,6 @@ display_select_cat_wrapper(
'category_options'
);
-// new category
-display_select_cat_wrapper(
- $query,
- $selected_parent,
- 'category_parent_options'
- );
-
// image level options
$selected_level = isset($_POST['level']) ? $_POST['level'] : 0;
@@ -212,12 +248,12 @@ $setup_errors = array();
$error_message = ready_for_upload_message();
if (!empty($error_message))
{
- array_push($setup_errors, $error_message);
+ $setup_errors[] = $error_message;
}
if (!function_exists('gd_info'))
{
- array_push($setup_errors, l10n('GD library is missing'));
+ $setup_errors[] = l10n('GD library is missing');
}
$template->assign(
@@ -238,24 +274,17 @@ if (!isset($_SESSION['upload_hide_warnings']))
if ($conf['use_exif'] and !function_exists('read_exif_data'))
{
- array_push(
- $setup_warnings,
- l10n('Exif extension not available, admin should disable exif use')
- );
+ $setup_warnings[] = l10n('Exif extension not available, admin should disable exif use');
}
if (get_ini_size('upload_max_filesize') > get_ini_size('post_max_size'))
{
- array_push(
- $setup_warnings,
- sprintf(
- l10n('In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'),
- get_ini_size('upload_max_filesize', false),
- get_ini_size('post_max_size', false)
- )
+ $setup_warnings[] = l10n(
+ 'In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting',
+ get_ini_size('upload_max_filesize', false),
+ get_ini_size('post_max_size', false)
);
}
-
$template->assign(
array(
'setup_warnings' => $setup_warnings,
diff --git a/admin/include/photos_add_direct_process.inc.php b/admin/include/photos_add_direct_process.inc.php
index eb5536342..e0a6cba22 100644
--- a/admin/include/photos_add_direct_process.inc.php
+++ b/admin/include/photos_add_direct_process.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -34,12 +34,9 @@ if (isset($_GET['processed']))
// exceeded the post_max_size (but not the upload_max_size)
if (!isset($_POST['submit_upload']))
{
- array_push(
- $page['errors'],
- sprintf(
- l10n('The uploaded files exceed the post_max_size directive in php.ini: %sB'),
- ini_get('post_max_size')
- )
+ $page['errors'][] = l10n(
+ 'The uploaded files exceed the post_max_size directive in php.ini: %sB',
+ ini_get('post_max_size')
);
}
else
@@ -51,7 +48,7 @@ if (isset($_GET['processed']))
{
foreach ($_POST['onUploadError'] as $error)
{
- array_push($page['errors'], $error);
+ $page['errors'][] = $error;
}
}
@@ -97,14 +94,11 @@ if (isset($_GET['processed']))
if (is_valid_image_extension(pathinfo($node['filename'], PATHINFO_EXTENSION)))
{
- array_push($indexes_to_extract, $node['index']);
+ $indexes_to_extract[] = $node['index'];
- array_push(
- $images_to_add,
- array(
- 'source_filepath' => $upload_dir.'/'.$temporary_archive_name.'/'.$node['filename'],
- 'original_filename' => basename($node['filename']),
- )
+ $images_to_add[] = array(
+ 'source_filepath' => $upload_dir.'/'.$temporary_archive_name.'/'.$node['filename'],
+ 'original_filename' => basename($node['filename']),
);
}
}
@@ -121,12 +115,9 @@ if (isset($_GET['processed']))
}
elseif (is_valid_image_extension($extension))
{
- array_push(
- $images_to_add,
- array(
- 'source_filepath' => $_FILES['image_upload']['tmp_name'][$idx],
- 'original_filename' => $_FILES['image_upload']['name'][$idx],
- )
+ $images_to_add[] = array(
+ 'source_filepath' => $_FILES['image_upload']['tmp_name'][$idx],
+ 'original_filename' => $_FILES['image_upload']['name'][$idx],
);
}
@@ -139,7 +130,7 @@ if (isset($_GET['processed']))
$_POST['level']
);
- array_push($image_ids, $image_id);
+ $image_ids[] = $image_id;
// TODO: if $image_id is not an integer, something went wrong
}
@@ -148,13 +139,10 @@ if (isset($_GET['processed']))
{
$error_message = file_upload_error_message($error);
- array_push(
- $page['errors'],
- sprintf(
- l10n('Error on file "%s" : %s'),
- $_FILES['image_upload']['name'][$idx],
- $error_message
- )
+ $page['errors'][] = l10n(
+ 'Error on file "%s" : %s',
+ $_FILES['image_upload']['name'][$idx],
+ $error_message
);
}
}
@@ -172,7 +160,7 @@ if (isset($_GET['processed']))
{
foreach ($_SESSION['uploads_error'][ $_POST['upload_id'] ] as $error)
{
- array_push($page['errors'], $error);
+ $page['errors'][] = $error;
}
}
@@ -216,29 +204,18 @@ SELECT
$thumbnail['link'] = get_root_url().'admin.php?page=photo-'.$image_id.'&amp;cat_id='.$category_id;
- array_push($page['thumbnails'], $thumbnail);
+ $page['thumbnails'][] = $thumbnail;
}
if (!empty($page['thumbnails']))
{
- array_push(
- $page['infos'],
- sprintf(
- l10n('%d photos uploaded'),
- count($page['thumbnails'])
- )
- );
+ $page['infos'][] = l10n('%d photos uploaded', count($page['thumbnails']));
if (0 != $_POST['level'])
{
- array_push(
- $page['infos'],
- sprintf(
- l10n('Privacy level set to "%s"'),
- l10n(
- sprintf('Level %d', $_POST['level'])
- )
- )
+ $page['infos'][] = l10n(
+ 'Privacy level set to "%s"',
+ l10n(sprintf('Level %d', $_POST['level']))
);
}
@@ -252,13 +229,10 @@ SELECT
$category_name = get_cat_display_name_from_id($category_id, 'admin.php?page=album-');
// information
- array_push(
- $page['infos'],
- sprintf(
- l10n('Album "%s" now contains %d photos'),
- '<em>'.$category_name.'</em>',
- $count
- )
+ $page['infos'][] = l10n(
+ 'Album "%s" now contains %d photos',
+ '<em>'.$category_name.'</em>',
+ $count
);
$page['batch_link'] = PHOTOS_ADD_BASE_URL.'&batch='.implode(',', $image_ids);
diff --git a/admin/include/plugins.class.php b/admin/include/plugins.class.php
index 3c0cb6ffa..0ddc85b50 100644
--- a/admin/include/plugins.class.php
+++ b/admin/include/plugins.class.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,6 +21,43 @@
// | USA. |
// +-----------------------------------------------------------------------+
+/**
+ * class DummyPlugin_maintain
+ * used when a plugin uses the old procedural declaration of maintenance methods
+ */
+class DummyPlugin_maintain extends PluginMaintain
+{
+ function install($plugin_version, &$errors=array())
+ {
+ if (is_callable('plugin_install'))
+ {
+ return plugin_install($this->plugin_id, $plugin_version, $errors);
+ }
+ }
+ function activate($plugin_version, &$errors=array())
+ {
+ if (is_callable('plugin_activate'))
+ {
+ return plugin_activate($this->plugin_id, $plugin_version, $errors);
+ }
+ }
+ function deactivate()
+ {
+ if (is_callable('plugin_deactivate'))
+ {
+ return plugin_deactivate($this->plugin_id);
+ }
+ }
+ function uninstall()
+ {
+ if (is_callable('plugin_uninstall'))
+ {
+ return plugin_uninstall($this->plugin_id);
+ }
+ }
+}
+
+
class plugins
{
var $fs_plugins = array();
@@ -30,7 +67,7 @@ class plugins
/**
* Initialize $fs_plugins and $db_plugins_by_id
- */
+ */
function plugins()
{
$this->get_fs_plugins();
@@ -41,19 +78,51 @@ class plugins
}
}
- /**
+ /**
+ * Returns the maintain class of a plugin
+ * or build a new class with the procedural methods
+ * @param string $plugin_id
+ */
+ private static function build_maintain_class($plugin_id)
+ {
+ $file_to_include = PHPWG_PLUGINS_PATH . $plugin_id . '/maintain.inc.php';
+ $classname = $plugin_id.'_maintain';
+
+ if (file_exists($file_to_include))
+ {
+ include_once($file_to_include);
+
+ if (class_exists($classname))
+ {
+ $plugin_maintain = new $classname($plugin_id);
+ }
+ else
+ {
+ $plugin_maintain = new DummyPlugin_maintain($plugin_id);
+ }
+ }
+ else
+ {
+ $plugin_maintain = new DummyPlugin_maintain($plugin_id);
+ }
+
+ return $plugin_maintain;
+ }
+
+ /**
* Perform requested actions
- * @param string - action
- * @param string - plugin id
- * @param array - errors
- */
+ * @param string - action
+ * @param string - plugin id
+ * @param array - errors
+ */
function perform_action($action, $plugin_id)
{
if (isset($this->db_plugins_by_id[$plugin_id]))
{
$crt_db_plugin = $this->db_plugins_by_id[$plugin_id];
}
- $file_to_include = PHPWG_PLUGINS_PATH . $plugin_id . '/maintain.inc.php';
+
+ $plugin_maintain = self::build_maintain_class($plugin_id);
$errors = array();
@@ -64,20 +133,15 @@ class plugins
{
break;
}
- if (file_exists($file_to_include))
- {
- include_once($file_to_include);
- if (function_exists('plugin_install'))
- {
- plugin_install($plugin_id, $this->fs_plugins[$plugin_id]['version'], $errors);
- }
- }
+
+ $plugin_maintain->install($this->fs_plugins[$plugin_id]['version'], $errors);
+
if (empty($errors))
{
$query = '
-INSERT INTO ' . PLUGINS_TABLE . ' (id,version) VALUES (\''
-. $plugin_id . '\',\'' . $this->fs_plugins[$plugin_id]['version'] . '\'
-)';
+INSERT INTO '. PLUGINS_TABLE .' (id,version)
+ VALUES (\''. $plugin_id .'\', \''. $this->fs_plugins[$plugin_id]['version'] .'\')
+;';
pwg_query($query);
}
break;
@@ -93,20 +157,20 @@ INSERT INTO ' . PLUGINS_TABLE . ' (id,version) VALUES (\''
{
break;
}
- if (empty($errors) and file_exists($file_to_include))
+
+ if (empty($errors))
{
- include_once($file_to_include);
- if (function_exists('plugin_activate'))
- {
- plugin_activate($plugin_id, $crt_db_plugin['version'], $errors);
- }
+ $plugin_maintain->activate($crt_db_plugin['version'], $errors);
}
+
if (empty($errors))
{
$query = '
-UPDATE ' . PLUGINS_TABLE . '
-SET state=\'active\', version=\''.$this->fs_plugins[$plugin_id]['version'].'\'
-WHERE id=\'' . $plugin_id . '\'';
+UPDATE '. PLUGINS_TABLE .'
+ SET state=\'active\',
+ version=\''. $this->fs_plugins[$plugin_id]['version'] .'\'
+ WHERE id=\''. $plugin_id .'\'
+;';
pwg_query($query);
}
break;
@@ -116,17 +180,15 @@ WHERE id=\'' . $plugin_id . '\'';
{
break;
}
+
$query = '
-UPDATE ' . PLUGINS_TABLE . ' SET state=\'inactive\' WHERE id=\'' . $plugin_id . '\'';
+UPDATE '. PLUGINS_TABLE .'
+ SET state=\'inactive\'
+ WHERE id=\''. $plugin_id .'\'
+;';
pwg_query($query);
- if (file_exists($file_to_include))
- {
- include_once($file_to_include);
- if (function_exists('plugin_deactivate'))
- {
- plugin_deactivate($plugin_id);
- }
- }
+
+ $plugin_maintain->deactivate();
break;
case 'uninstall':
@@ -138,17 +200,14 @@ UPDATE ' . PLUGINS_TABLE . ' SET state=\'inactive\' WHERE id=\'' . $plugin_id .
{
$this->perform_action('deactivate', $plugin_id);
}
+
$query = '
-DELETE FROM ' . PLUGINS_TABLE . ' WHERE id=\'' . $plugin_id . '\'';
+DELETE FROM '. PLUGINS_TABLE .'
+ WHERE id=\''. $plugin_id .'\'
+;';
pwg_query($query);
- if (file_exists($file_to_include))
- {
- include_once($file_to_include);
- if (function_exists('plugin_uninstall'))
- {
- plugin_uninstall($plugin_id);
- }
- }
+
+ $plugin_maintain->uninstall();
break;
case 'restore':
@@ -166,18 +225,17 @@ DELETE FROM ' . PLUGINS_TABLE . ' WHERE id=\'' . $plugin_id . '\'';
{
break;
}
- if (!$this->deltree(PHPWG_PLUGINS_PATH . $plugin_id))
- {
- $this->send_to_trash(PHPWG_PLUGINS_PATH . $plugin_id);
- }
+
+ deltree(PHPWG_PLUGINS_PATH . $plugin_id, PHPWG_PLUGINS_PATH . 'trash');
break;
}
+
return $errors;
}
/**
- * Get plugins defined in the plugin directory
- */
+ * Get plugins defined in the plugin directory
+ */
function get_fs_plugins()
{
$dir = opendir(PHPWG_PLUGINS_PATH);
@@ -267,8 +325,10 @@ DELETE FROM ' . PLUGINS_TABLE . ' WHERE id=\'' . $plugin_id . '\'';
// Retrieve PEM versions
function get_versions_to_check($version=PHPWG_VERSION)
{
+ global $conf;
+
$versions_to_check = array();
- $url = PEM_URL . '/api/get_version_list.php?category=12&format=php';
+ $url = PEM_URL . '/api/get_version_list.php?category_id='. $conf['pem_plugins_category'] .'&format=php';
if (fetchRemote($url, $result) and $pem_versions = @unserialize($result))
{
if (!preg_match('/^\d+\.\d+\.\d+$/', $version))
@@ -400,7 +460,7 @@ DELETE FROM ' . PLUGINS_TABLE . ' WHERE id=\'' . $plugin_id . '\'';
{
$server_plugins[$plugin['extension_id']] = array();
}
- array_push($server_plugins[$plugin['extension_id']], $plugin['revision_name']);
+ $server_plugins[$plugin['extension_id']][] = $plugin['revision_name'];
}
foreach ($this->fs_plugins as $plugin_id => $fs_plugin)
@@ -504,7 +564,7 @@ DELETE FROM ' . PLUGINS_TABLE . ' WHERE id=\'' . $plugin_id . '\'';
and $old_files = file($extract_path.'/obsolete.list', FILE_IGNORE_NEW_LINES)
and !empty($old_files))
{
- array_push($old_files, 'obsolete.list');
+ $old_files[] = 'obsolete.list';
foreach($old_files as $old_file)
{
$path = $extract_path.'/'.$old_file;
@@ -514,10 +574,7 @@ DELETE FROM ' . PLUGINS_TABLE . ' WHERE id=\'' . $plugin_id . '\'';
}
elseif (is_dir($path))
{
- if (!$this->deltree($path))
- {
- $this->send_to_trash($path);
- }
+ deltree($path, PHPWG_PLUGINS_PATH . 'trash');
}
}
}
@@ -553,59 +610,6 @@ DELETE FROM ' . PLUGINS_TABLE . ' WHERE id=\'' . $plugin_id . '\'';
}
return $merged_extensions;
}
-
- /**
- * delete $path directory
- * @param string - path
- */
- function deltree($path)
- {
- if (is_dir($path))
- {
- $fh = opendir($path);
- while ($file = readdir($fh))
- {
- if ($file != '.' and $file != '..')
- {
- $pathfile = $path . '/' . $file;
- if (is_dir($pathfile))
- {
- $this->deltree($pathfile);
- }
- else
- {
- @unlink($pathfile);
- }
- }
- }
- closedir($fh);
- return @rmdir($path);
- }
- }
-
- /**
- * send $path to trash directory
- * @param string - path
- */
- function send_to_trash($path)
- {
- $trash_path = PHPWG_PLUGINS_PATH . 'trash';
- if (!is_dir($trash_path))
- {
- @mkdir($trash_path);
- $file = @fopen($trash_path . '/.htaccess', 'w');
- @fwrite($file, 'deny from all');
- @fclose($file);
- }
- while ($r = $trash_path . '/' . md5(uniqid(rand(), true)))
- {
- if (!is_dir($r))
- {
- @rename($path, $r);
- break;
- }
- }
- }
/**
* Sort functions
@@ -613,12 +617,19 @@ DELETE FROM ' . PLUGINS_TABLE . ' WHERE id=\'' . $plugin_id . '\'';
function plugin_version_compare($a, $b)
{
if (strtolower($a) == 'auto') return false;
-
- $pattern = array('/([a-z])/ei', '/\.+/', '/\.\Z|\A\./');
- $replacement = array( "'.'.intval('\\1', 36).'.'", '.', '');
-
- $array = preg_replace($pattern, $replacement, array($a, $b));
-
+
+ $array = preg_replace(
+ array('/\.+/', '/\.\Z|\A\./'),
+ array('.', ''),
+ array($a, $b)
+ );
+
+ $array = preg_replace_callback(
+ '/([a-z])/i',
+ create_function('$m', 'return intval($m[1], 36);'),
+ $array
+ );
+
return version_compare($array[0], $array[1], '>=');
}
diff --git a/admin/include/tabsheet.class.php b/admin/include/tabsheet.class.php
index 693d87f82..9dc441a7e 100644
--- a/admin/include/tabsheet.class.php
+++ b/admin/include/tabsheet.class.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/admin/include/themes.class.php b/admin/include/themes.class.php
index 654d220ef..7832c42e0 100644
--- a/admin/include/themes.class.php
+++ b/admin/include/themes.class.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,6 +21,36 @@
// | USA. |
// +-----------------------------------------------------------------------+
+/**
+ * class DummyTheme_maintain
+ * used when a theme uses the old procedural declaration of maintenance methods
+ */
+class DummyTheme_maintain extends ThemeMaintain
+{
+ function activate($theme_version, &$errors=array())
+ {
+ if (is_callable('theme_activate'))
+ {
+ return theme_activate($this->theme_id, $theme_version, $errors);
+ }
+ }
+ function deactivate()
+ {
+ if (is_callable('theme_deactivate'))
+ {
+ return theme_deactivate($this->theme_id);
+ }
+ }
+ function delete()
+ {
+ if (is_callable('theme_delete'))
+ {
+ return theme_delete($this->theme_id);
+ }
+ }
+}
+
+
class themes
{
var $fs_themes = array();
@@ -41,6 +71,37 @@ class themes
}
/**
+ * Returns the maintain class of a theme
+ * or build a new class with the procedural methods
+ * @param string $theme_id
+ */
+ private static function build_maintain_class($theme_id)
+ {
+ $file_to_include = PHPWG_THEMES_PATH.'/'.$theme_id.'/admin/maintain.inc.php';
+ $classname = $theme_id.'_maintain';
+
+ if (file_exists($file_to_include))
+ {
+ include_once($file_to_include);
+
+ if (class_exists($classname))
+ {
+ $theme_maintain = new $classname($theme_id);
+ }
+ else
+ {
+ $theme_maintain = new DummyTheme_maintain($theme_id);
+ }
+ }
+ else
+ {
+ $theme_maintain = new DummyTheme_maintain($theme_id);
+ }
+
+ return $theme_maintain;
+ }
+
+ /**
* Perform requested actions
* @param string - action
* @param string - theme id
@@ -55,7 +116,7 @@ class themes
$crt_db_theme = $this->db_themes_by_id[$theme_id];
}
- $file_to_include = PHPWG_THEMES_PATH.'/'.$theme_id.'/admin/maintain.inc.php';
+ $theme_maintain = self::build_maintain_class($theme_id);
$errors = array();
@@ -77,34 +138,23 @@ class themes
$missing_parent = $this->missing_parent_theme($theme_id);
if (isset($missing_parent))
{
- array_push(
- $errors,
- sprintf(
- l10n('Impossible to activate this theme, the parent theme is missing: %s'),
- $missing_parent
- )
+ $errors[] = l10n(
+ 'Impossible to activate this theme, the parent theme is missing: %s',
+ $missing_parent
);
break;
}
-
if ($this->fs_themes[$theme_id]['mobile']
and !empty($conf['mobile_theme'])
and $conf['mobile_theme'] != $theme_id)
{
- array_push($errors, l10n('You can activate only one mobile theme.'));
+ $errors[] = l10n('You can activate only one mobile theme.');
break;
}
- if (file_exists($file_to_include))
- {
- include($file_to_include);
- if (function_exists('theme_activate'))
- {
- theme_activate($theme_id, $this->fs_themes[$theme_id]['version'], $errors);
- }
- }
+ $theme_maintain->activate($this->fs_themes[$theme_id]['version'], $errors);
if (empty($errors))
{
@@ -134,10 +184,7 @@ INSERT INTO '.THEMES_TABLE.'
// you can't deactivate the last theme
if (count($this->db_themes_by_id) <= 1)
{
- array_push(
- $errors,
- l10n('Impossible to deactivate this theme, you need at least one theme.')
- );
+ $errors[] = l10n('Impossible to deactivate this theme, you need at least one theme.');
break;
}
@@ -147,8 +194,7 @@ INSERT INTO '.THEMES_TABLE.'
$new_theme = null;
$query = '
-SELECT
- id
+SELECT id
FROM '.THEMES_TABLE.'
WHERE id != \''.$theme_id.'\'
;';
@@ -165,14 +211,7 @@ SELECT
$this->set_default_theme($new_theme);
}
- if (file_exists($file_to_include))
- {
- include($file_to_include);
- if (function_exists('theme_deactivate'))
- {
- theme_deactivate($theme_id);
- }
- }
+ $theme_maintain->deactivate();
$query = '
DELETE
@@ -190,7 +229,7 @@ DELETE
case 'delete':
if (!empty($crt_db_theme))
{
- array_push($errors, 'CANNOT DELETE - THEME IS INSTALLED');
+ $errors[] = 'CANNOT DELETE - THEME IS INSTALLED';
break;
}
if (!isset($this->fs_themes[$theme_id]))
@@ -202,20 +241,16 @@ DELETE
$children = $this->get_children_themes($theme_id);
if (count($children) > 0)
{
- array_push(
- $errors,
- sprintf(
- l10n('Impossible to delete this theme. Other themes depends on it: %s'),
- implode(', ', $children)
- )
+ $errors[] = l10n(
+ 'Impossible to delete this theme. Other themes depends on it: %s',
+ implode(', ', $children)
);
break;
}
- if (!$this->deltree(PHPWG_THEMES_PATH.$theme_id))
- {
- $this->send_to_trash(PHPWG_THEMES_PATH.$theme_id);
- }
+ $theme_maintain->delete();
+
+ deltree(PHPWG_THEMES_PATH.$theme_id, PHPWG_THEMES_PATH . 'trash');
break;
case 'set_default':
@@ -256,7 +291,7 @@ DELETE
{
if (isset($test_child['parent']) and $test_child['parent'] == $theme_id)
{
- array_push($children, $test_child['name']);
+ $children[] = $test_child['name'];
}
}
@@ -316,7 +351,7 @@ SELECT
$themes = array();
while ($row = pwg_db_fetch_assoc($result))
{
- array_push($themes, $row);
+ $themes[] = $row;
}
return $themes;
}
@@ -622,7 +657,7 @@ SELECT
and $old_files = file($extract_path.'/obsolete.list', FILE_IGNORE_NEW_LINES)
and !empty($old_files))
{
- array_push($old_files, 'obsolete.list');
+ $old_files[] = 'obsolete.list';
foreach($old_files as $old_file)
{
$path = $extract_path.'/'.$old_file;
@@ -632,10 +667,7 @@ SELECT
}
elseif (is_dir($path))
{
- if (!$this->deltree($path))
- {
- $this->send_to_trash($path);
- }
+ deltree($path, PHPWG_THEMES_PATH . 'trash');
}
}
}
@@ -655,59 +687,6 @@ SELECT
}
/**
- * delete $path directory
- * @param string - path
- */
- function deltree($path)
- {
- if (is_dir($path))
- {
- $fh = opendir($path);
- while ($file = readdir($fh))
- {
- if ($file != '.' and $file != '..')
- {
- $pathfile = $path . '/' . $file;
- if (is_dir($pathfile))
- {
- $this->deltree($pathfile);
- }
- else
- {
- @unlink($pathfile);
- }
- }
- }
- closedir($fh);
- return @rmdir($path);
- }
- }
-
- /**
- * send $path to trash directory
- * @param string - path
- */
- function send_to_trash($path)
- {
- $trash_path = PHPWG_THEMES_PATH . 'trash';
- if (!is_dir($trash_path))
- {
- @mkdir($trash_path);
- $file = @fopen($trash_path . '/.htaccess', 'w');
- @fwrite($file, 'deny from all');
- @fclose($file);
- }
- while ($r = $trash_path . '/' . md5(uniqid(rand(), true)))
- {
- if (!is_dir($r))
- {
- @rename($path, $r);
- break;
- }
- }
- }
-
- /**
* Sort functions
*/
function theme_version_compare($a, $b)
diff --git a/admin/include/updates.class.php b/admin/include/updates.class.php
index 0ec0e0c40..2ab70d2be 100644
--- a/admin/include/updates.class.php
+++ b/admin/include/updates.class.php
@@ -1,4 +1,25 @@
<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
if (!defined('PHPWG_ROOT_PATH')) die('Hacking attempt!');
@@ -33,7 +54,7 @@ class updates
}
}
- function check_piwigo_upgrade()
+ static function check_piwigo_upgrade()
{
$_SESSION['need_update'] = null;
@@ -161,7 +182,7 @@ class updates
{
if (in_array($ext_id, $conf['updates_ignored'][$type]))
{
- array_push($ignore_list, $ext_id);
+ $ignore_list[] = $ext_id;
}
else
{
@@ -242,54 +263,13 @@ class updates
return $this->$type->$version_compare($a, $b);
}
- function deltree($path, $move_to_trash=false)
- {
- if (is_dir($path))
- {
- $fh = opendir($path);
- while ($file = readdir($fh))
- {
- if ($file != '.' and $file != '..')
- {
- $pathfile = $path . '/' . $file;
- if (is_dir($pathfile))
- {
- self::deltree($pathfile, $move_to_trash);
- }
- else
- {
- @unlink($pathfile);
- }
- }
- }
- closedir($fh);
- if (@rmdir($path))
- {
- return true;
- }
- elseif ($move_to_trash)
- {
- $trash = PHPWG_ROOT_PATH.'_trash';
- if (!is_dir($trash))
- {
- @mkgetdir($trash);
- }
- return @rename($path, $trash . '/'.md5(uniqid(rand(), true)));
- }
- else
- {
- return false;
- }
- }
- }
-
- function process_obsolete_list($file)
+ static function process_obsolete_list($file)
{
if (file_exists(PHPWG_ROOT_PATH.$file)
and $old_files = file(PHPWG_ROOT_PATH.$file, FILE_IGNORE_NEW_LINES)
and !empty($old_files))
{
- array_push($old_files, $file);
+ $old_files[] = $file;
foreach($old_files as $old_file)
{
$path = PHPWG_ROOT_PATH.$old_file;
@@ -299,13 +279,13 @@ class updates
}
elseif (is_dir($path))
{
- self::deltree($path, true);
+ deltree($path, PHPWG_ROOT_PATH.'_trash');
}
}
}
}
- function dump_database($include_history=false)
+ static function dump_database($include_history=false)
{
global $page, $conf, $cfgBase;
@@ -350,16 +330,16 @@ class updates
}
@readfile($backupFile);
- self::deltree(PHPWG_ROOT_PATH.$conf['data_location'].'update');
+ deltree(PHPWG_ROOT_PATH.$conf['data_location'].'update');
exit();
}
else
{
- array_push($page['errors'], l10n('Unable to dump database.'));
+ $page['errors'][] = l10n('Unable to dump database.');
}
}
- function upgrade_to($upgrade_to, &$step, $check_current_version=true)
+ static function upgrade_to($upgrade_to, &$step, $check_current_version=true)
{
global $page, $conf, $template;
@@ -449,13 +429,14 @@ class updates
if (empty($error))
{
self::process_obsolete_list($obsolete_list);
- self::deltree(PHPWG_ROOT_PATH.$conf['data_location'].'update');
+ deltree(PHPWG_ROOT_PATH.$conf['data_location'].'update');
invalidate_user_cache(true);
$template->delete_compiled_templates();
unset($_SESSION['need_update']);
if ($step == 2)
{
- array_push($page['infos'], l10n('Update Complete'), $upgrade_to);
+ $page['infos'][] = l10n('Update Complete');
+ $page['infos'][] = $upgrade_to;
$step = -1;
}
else
@@ -466,24 +447,22 @@ class updates
else
{
file_put_contents(PHPWG_ROOT_PATH.$conf['data_location'].'update/log_error.txt', $error);
- array_push(
- $page['errors'],
- sprintf(
- l10n('An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'),
- get_root_url().$conf['data_location'].'update/log_error.txt'
- )
- );
+
+ $page['errors'][] = l10n(
+ 'An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.',
+ get_root_url().$conf['data_location'].'update/log_error.txt'
+ );
}
}
else
{
- self::deltree(PHPWG_ROOT_PATH.$conf['data_location'].'update');
- array_push($page['errors'], l10n('An error has occured during upgrade.'));
+ deltree(PHPWG_ROOT_PATH.$conf['data_location'].'update');
+ $page['errors'][] = l10n('An error has occured during upgrade.');
}
}
else
{
- array_push($page['errors'], l10n('Piwigo cannot retrieve upgrade file from server'));
+ $page['errors'][] = l10n('Piwigo cannot retrieve upgrade file from server');
}
}
}
diff --git a/admin/include/uploadify/uploadify.php b/admin/include/uploadify/uploadify.php
index 1e36f3268..a4ba4db36 100644
--- a/admin/include/uploadify/uploadify.php
+++ b/admin/include/uploadify/uploadify.php
@@ -1,4 +1,26 @@
<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
define('PHPWG_ROOT_PATH','../../../');
define('IN_ADMIN', true);
@@ -47,20 +69,7 @@ $image_id = add_uploaded_file(
$_POST['level']
);
-if (!isset($_SESSION['uploads']))
-{
- $_SESSION['uploads'] = array();
-}
-
-if (!isset($_SESSION['uploads'][ $_POST['upload_id'] ]))
-{
- $_SESSION['uploads'][ $_POST['upload_id'] ] = array();
-}
-
-array_push(
- $_SESSION['uploads'][ $_POST['upload_id'] ],
- $image_id
- );
+$_SESSION['uploads'][ $_POST['upload_id'] ][] = $image_id;
$query = '
SELECT
diff --git a/admin/index.php b/admin/index.php
index 41732f2fd..c8de97f60 100644
--- a/admin/index.php
+++ b/admin/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/admin/intro.php b/admin/intro.php
index c454e50b4..ee0149841 100644
--- a/admin/intro.php
+++ b/admin/intro.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -45,7 +45,7 @@ if (isset($_GET['action']) and 'check_upgrade' == $_GET['action'])
{
if (!fetchRemote(PHPWG_URL.'/download/latest_version', $result))
{
- array_push($page['errors'], l10n('Unable to check for upgrade.'));
+ $page['errors'][] = l10n('Unable to check for upgrade.');
}
else
{
@@ -73,33 +73,21 @@ if (isset($_GET['action']) and 'check_upgrade' == $_GET['action'])
if ('' == $versions['latest'])
{
- array_push(
- $page['errors'],
- l10n('Check for upgrade failed for unknown reasons.')
- );
+ $page['errors'][] = l10n('Check for upgrade failed for unknown reasons.');
}
// concatenation needed to avoid automatic transformation by release
// script generator
else if ('%'.'PWGVERSION'.'%' == $versions['current'])
{
- array_push(
- $page['infos'],
- l10n('You are running on development sources, no check possible.')
- );
+ $page['infos'][] = l10n('You are running on development sources, no check possible.');
}
else if (version_compare($versions['current'], $versions['latest']) < 0)
{
- array_push(
- $page['infos'],
- l10n('A new version of Piwigo is available.')
- );
+ $page['infos'][] = l10n('A new version of Piwigo is available.');
}
else
{
- array_push(
- $page['infos'],
- l10n('You are running the latest version of Piwigo.')
- );
+ $page['infos'][] = l10n('You are running the latest version of Piwigo.');
}
}
}
@@ -201,18 +189,15 @@ $template->assign(
'DB_VERSION' => $db_version,
'DB_ELEMENTS' => l10n_dec('%d photo', '%d photos', $nb_elements),
'DB_CATEGORIES' =>
- l10n_dec('%d album including', '%d albums including',
- $nb_categories).
- l10n_dec('%d physical', '%d physicals',
- $nb_physical).
- l10n_dec(' and %d virtual', ' and %d virtuals',
- $nb_virtual),
+ l10n_dec('%d album including', '%d albums including', $nb_categories).
+ l10n_dec('%d physical', '%d physicals', $nb_physical).
+ l10n_dec(' and %d virtual', ' and %d virtuals', $nb_virtual),
'DB_IMAGE_CATEGORY' => l10n_dec('%d association', '%d associations', $nb_image_category),
'DB_TAGS' => l10n_dec('%d tag', '%d tags', $nb_tags),
'DB_IMAGE_TAG' => l10n_dec('%d association', '%d associations', $nb_image_tag),
'DB_USERS' => l10n_dec('%d user', '%d users', $nb_users),
'DB_GROUPS' => l10n_dec('%d group', '%d groups', $nb_groups),
- 'DB_RATES' => ($nb_rates == 0) ? l10n('no rate') : sprintf(l10n('%d rates'), $nb_rates),
+ 'DB_RATES' => ($nb_rates == 0) ? l10n('no rate') : l10n('%d rates', $nb_rates),
'U_CHECK_UPGRADE' => PHPWG_ROOT_PATH.'admin.php?action=check_upgrade',
'U_PHPINFO' => PHPWG_ROOT_PATH.'admin.php?action=phpinfo',
'PHP_DATATIME' => $php_current_timestamp,
@@ -228,25 +213,6 @@ SELECT COUNT(*)
;';
list($nb_comments) = pwg_db_fetch_row(pwg_query($query));
$template->assign('DB_COMMENTS', l10n_dec('%d comment', '%d comments', $nb_comments));
-
- // unvalidated comments
- $query = '
-SELECT COUNT(*)
- FROM '.COMMENTS_TABLE.'
- WHERE validated=\'false\'
-;';
- list($nb_comments) = pwg_db_fetch_row(pwg_query($query));
-
- if ($nb_comments > 0)
- {
- $template->assign(
- 'unvalidated',
- array(
- 'URL' => PHPWG_ROOT_PATH.'admin.php?page=comments',
- 'INFO' => sprintf(l10n('%d waiting for validation'), $nb_comments)
- )
- );
- }
}
if ($nb_elements > 0)
@@ -261,10 +227,7 @@ SELECT MIN(date_available)
'first_added',
array(
'DB_DATE' =>
- sprintf(
- l10n('first photo added on %s'),
- format_date($first_date)
- )
+ l10n('first photo added on %s', format_date($first_date))
)
);
}
diff --git a/admin/languages.php b/admin/languages.php
index cbd4d6668..c901d923c 100644
--- a/admin/languages.php
+++ b/admin/languages.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/admin/languages_installed.php b/admin/languages_installed.php
index 93e719491..eb0a89578 100644
--- a/admin/languages_installed.php
+++ b/admin/languages_installed.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2009 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -87,7 +87,7 @@ foreach($languages->fs_languages as $language_id => $language)
else
{
$language['is_default'] = false;
- array_push($tpl_languages, $language);
+ $tpl_languages[] = $language;
}
}
diff --git a/admin/languages_new.php b/admin/languages_new.php
index da0d31bfd..bf46cbb71 100644
--- a/admin/languages_new.php
+++ b/admin/languages_new.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2009 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -42,13 +42,7 @@ $languages->get_db_languages();
$languages_dir = PHPWG_ROOT_PATH.'language';
if (!is_writable($languages_dir))
{
- array_push(
- $page['errors'],
- sprintf(
- l10n('Add write access to the "%s" directory'),
- 'language'
- )
- );
+ $page['errors'][] = l10n('Add write access to the "%s" directory', 'language');
}
// +-----------------------------------------------------------------------+
@@ -59,7 +53,7 @@ if (isset($_GET['revision']))
{
if (!is_webmaster())
{
- array_push($page['errors'], l10n('Webmaster status is required.'));
+ $page['errors'][] = l10n('Webmaster status is required.');
}
else
{
@@ -79,28 +73,23 @@ if (isset($_GET['installstatus']))
switch ($_GET['installstatus'])
{
case 'ok':
- array_push($page['infos'],
- l10n('Language has been successfully installed')
- );
+ $page['infos'][] = l10n('Language has been successfully installed');
break;
case 'temp_path_error':
- array_push($page['errors'], l10n('Can\'t create temporary file.'));
+ $page['errors'][] = l10n('Can\'t create temporary file.');
break;
case 'dl_archive_error':
- array_push($page['errors'], l10n('Can\'t download archive.'));
+ $page['errors'][] = l10n('Can\'t download archive.');
break;
case 'archive_error':
- array_push($page['errors'], l10n('Can\'t read or extract archive.'));
+ $page['errors'][] = l10n('Can\'t read or extract archive.');
break;
default:
- array_push(
- $page['errors'],
- sprintf(l10n('An error occured during extraction (%s).'), htmlspecialchars($_GET['installstatus']))
- );
+ $page['errors'][] = l10n('An error occured during extraction (%s).', htmlspecialchars($_GET['installstatus']));
}
}
@@ -132,7 +121,7 @@ if ($languages->get_server_languages(true))
}
else
{
- array_push($page['errors'], l10n('Can\'t connect to server.'));
+ $page['errors'][] = l10n('Can\'t connect to server.');
}
$template->assign_var_from_handle('ADMIN_CONTENT', 'languages');
diff --git a/admin/maintenance.php b/admin/maintenance.php
index 5b99bf969..0b3e1424a 100644
--- a/admin/maintenance.php
+++ b/admin/maintenance.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/admin/menubar.php b/admin/menubar.php
index 9e254216f..69e363ccc 100644
--- a/admin/menubar.php
+++ b/admin/menubar.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -148,7 +148,7 @@ UPDATE '.CONFIG_TABLE.'
';
pwg_query($query);
- array_push($page['infos'], l10n('Order of menubar items has been updated successfully.'));
+ $page['infos'][] = l10n('Order of menubar items has been updated successfully.');
}
make_consecutive( $mb_conf );
diff --git a/admin/notification_by_mail.php b/admin/notification_by_mail.php
index 9b773d870..51b284680 100644
--- a/admin/notification_by_mail.php
+++ b/admin/notification_by_mail.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -80,10 +80,11 @@ function do_timeout_treatment($post_keyname, $check_key_treated = array())
$_POST[$post_keyname] = array_diff($_POST[$post_keyname], $check_key_treated);
$must_repost = true;
- array_push($page['errors'],
- l10n_dec('Execution time is out, treatment must be continue [Estimated time: %d second].',
- 'Execution time is out, treatment must be continue [Estimated time: %d seconds].',
- $time_refresh));
+ $page['errors'][] = l10n_dec(
+ 'Execution time is out, treatment must be continue [Estimated time: %d second].',
+ 'Execution time is out, treatment must be continue [Estimated time: %d seconds].',
+ $time_refresh
+ );
}
}
@@ -156,29 +157,20 @@ order by
$nbm_user['check_key'] = find_available_check_key();
// Save key
- array_push($check_key_list, $nbm_user['check_key']);
+ $check_key_list[] = $nbm_user['check_key'];
// Insert new nbm_users
- array_push
- (
- $inserts,
- array
- (
- 'user_id' => $nbm_user['user_id'],
- 'check_key' => $nbm_user['check_key'],
- 'enabled' => 'false' // By default if false, set to true with specific functions
- )
- );
-
- array_push
- (
- $page['infos'],
- sprintf(
- l10n('User %s [%s] added.'),
- stripslashes($nbm_user['username']),
- get_email_address_as_display_text($nbm_user['mail_address'])
- )
- );
+ $inserts[] = array(
+ 'user_id' => $nbm_user['user_id'],
+ 'check_key' => $nbm_user['check_key'],
+ 'enabled' => 'false' // By default if false, set to true with specific functions
+ );
+
+ $page['infos'][] = l10n(
+ 'User %s [%s] added.',
+ stripslashes($nbm_user['username']),
+ $nbm_user['mail_address']
+ );
}
// Insert new nbm_users
@@ -282,13 +274,13 @@ function do_action_send_mail_notification($action = 'list_to_send', $check_key_l
if ((!$is_action_send) and check_sendmail_timeout())
{
// Stop fill list on 'list_to_send', if the quota is override
- array_push($page['infos'], $msg_break_timeout);
+ $page['infos'][] = $msg_break_timeout;
break;
}
if (($is_action_send) and check_sendmail_timeout())
{
// Stop fill list on 'send', if the quota is override
- array_push($page['errors'], $msg_break_timeout);
+ $page['errors'][] = $msg_break_timeout;
break;
}
@@ -299,7 +291,7 @@ function do_action_send_mail_notification($action = 'list_to_send', $check_key_l
{
set_make_full_url();
// Fill return list of "treated" check_key for 'send'
- array_push($return_list, $nbm_user['check_key']);
+ $return_list[] = $nbm_user['check_key'];
if ($conf['nbm_send_detailed_content'])
{
@@ -313,7 +305,7 @@ function do_action_send_mail_notification($action = 'list_to_send', $check_key_l
if ($exist_data)
{
- $subject = '['.$conf['gallery_title'].']: '.l10n('New photos added');
+ $subject = '['.$conf['gallery_title'].'] '.l10n('New photos added');
// Assign current var for nbm mail
assign_vars_nbm_mail_content($nbm_user);
@@ -385,26 +377,29 @@ function do_action_send_mail_notification($action = 'list_to_send', $check_key_l
'SEND_AS_NAME' => $env_nbm['send_as_name'],
)
);
+
+ $ret = pwg_mail(
+ array(
+ 'name' => stripslashes($nbm_user['username']),
+ 'email' => $nbm_user['mail_address'],
+ ),
+ array(
+ 'from' => $env_nbm['send_as_mail_formated'],
+ 'subject' => $subject,
+ 'email_format' => $env_nbm['email_format'],
+ 'content' => $env_nbm['mail_template']->parse('notification_by_mail', true),
+ 'content_format' => $env_nbm['email_format'],
+ )
+ );
- if (pwg_mail
- (
- format_email(stripslashes($nbm_user['username']), $nbm_user['mail_address']),
- array
- (
- 'from' => $env_nbm['send_as_mail_formated'],
- 'subject' => $subject,
- 'email_format' => $env_nbm['email_format'],
- 'content' => $env_nbm['mail_template']->parse('notification_by_mail', true),
- 'content_format' => $env_nbm['email_format'],
- 'theme' => $nbm_user['theme']
- )
- ))
+ if ($ret)
{
inc_mail_sent_success($nbm_user);
- $data = array('user_id' => $nbm_user['user_id'],
- 'last_send' => $dbnow);
- array_push($datas, $data);
+ $datas[] = array(
+ 'user_id' => $nbm_user['user_id'],
+ 'last_send' => $dbnow
+ );
}
else
{
@@ -419,7 +414,7 @@ function do_action_send_mail_notification($action = 'list_to_send', $check_key_l
if (news_exists($nbm_user['last_send'], $dbnow))
{
// Fill return list of "selected" users for 'list_to_send'
- array_push($return_list, $nbm_user);
+ $return_list[] = $nbm_user;
}
}
@@ -448,7 +443,7 @@ function do_action_send_mail_notification($action = 'list_to_send', $check_key_l
{
if ($is_action_send)
{
- array_push($page['errors'], l10n('No user to send notifications by mail.'));
+ $page['errors'][] = l10n('No user to send notifications by mail.');
}
}
}
@@ -529,9 +524,10 @@ where
}
}
- array_push($page['infos'],
- l10n_dec('%d parameter was updated.', '%d parameters were updated.',
- $updated_param_count));
+ $page['infos'][] = l10n_dec(
+ '%d parameter was updated.', '%d parameters were updated.',
+ $updated_param_count
+ );
// Reload conf with new values
load_conf_from_db('param like \'nbm\\_%\'');
@@ -650,7 +646,7 @@ switch ($page['mode'])
{
if (get_boolean($nbm_user['enabled']))
{
- $opt_true[ $nbm_user['check_key'] ] = stripslashes($nbm_user['username']).'['.get_email_address_as_display_text($nbm_user['mail_address']).']';
+ $opt_true[ $nbm_user['check_key'] ] = stripslashes($nbm_user['username']).'['.$nbm_user['mail_address'].']';
if ((isset($_POST['falsify']) and isset($_POST['cat_true']) and in_array($nbm_user['check_key'], $_POST['cat_true'])))
{
$opt_true_selected[] = $nbm_user['check_key'];
@@ -658,7 +654,7 @@ switch ($page['mode'])
}
else
{
- $opt_false[ $nbm_user['check_key'] ] = stripslashes($nbm_user['username']).'['.get_email_address_as_display_text($nbm_user['mail_address']).']';
+ $opt_false[ $nbm_user['check_key'] ] = stripslashes($nbm_user['username']).'['.$nbm_user['mail_address'].']';
if (isset($_POST['trueify']) and isset($_POST['cat_false']) and in_array($nbm_user['check_key'], $_POST['cat_false']))
{
$opt_false_selected[] = $nbm_user['check_key'];
@@ -704,7 +700,7 @@ switch ($page['mode'])
!in_array($nbm_user['check_key'], $_POST['send_selection']) // not selected
) ? '' : 'checked="checked"',
'USERNAME'=> stripslashes($nbm_user['username']),
- 'EMAIL' => get_email_address_as_display_text($nbm_user['mail_address']),
+ 'EMAIL' => $nbm_user['mail_address'],
'LAST_SEND'=> $nbm_user['last_send']
);
}
diff --git a/admin/permalinks.php b/admin/permalinks.php
index f673e3659..72f951322 100644
--- a/admin/permalinks.php
+++ b/admin/permalinks.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -59,13 +59,13 @@ function parse_sort_variables(
}
elseif (isset($default_field) and !isset($_GET[$get_param]) )
{
- array_push($ret, $field);
+ $ret[] = $field;
$disp = '<em>'.$disp.'</em>';
}
}
else
{
- array_push($ret, $field);
+ $ret[] = $field;
$disp = '<em>'.$disp.'</em>';
}
if ( isset($template_var) )
@@ -100,7 +100,9 @@ DELETE FROM '.OLD_PERMALINKS_TABLE.'
LIMIT 1';
$result = pwg_query($query);
if (pwg_db_changes($result)==0)
- array_push($page['errors'], l10n('Cannot delete the old permalink !'));
+ {
+ $page['errors'][] = l10n('Cannot delete the old permalink !');
+ }
}
diff --git a/admin/photo.php b/admin/photo.php
index 9beafb402..b99a76cfd 100644
--- a/admin/photo.php
+++ b/admin/photo.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/admin/photos_add.php b/admin/photos_add.php
index fbc7deeab..72bf99158 100644
--- a/admin/photos_add.php
+++ b/admin/photos_add.php
@@ -2,7 +2,9 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2010 Pierrick LE GALL http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
// | 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 |
@@ -52,6 +54,12 @@ $upload_form_config = get_upload_form_config();
if (isset($_GET['section']))
{
$page['tab'] = $_GET['section'];
+
+ // backward compatibility
+ if ('ploader' == $page['tab'])
+ {
+ $page['tab'] = 'applications';
+ }
}
else
{
diff --git a/admin/photos_add_applications.php b/admin/photos_add_applications.php
index bf0509ec5..82c95fddf 100644
--- a/admin/photos_add_applications.php
+++ b/admin/photos_add_applications.php
@@ -2,7 +2,9 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2010 Pierrick LE GALL http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
// | 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 |
diff --git a/admin/photos_add_direct.php b/admin/photos_add_direct.php
index 352c27aa2..10f71e082 100644
--- a/admin/photos_add_direct.php
+++ b/admin/photos_add_direct.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -43,12 +43,9 @@ DELETE FROM '.CADDIE_TABLE.'
$inserts = array();
foreach (explode(',', $_GET['batch']) as $image_id)
{
- array_push(
- $inserts,
- array(
- 'user_id' => $user['id'],
- 'element_id' => $image_id,
- )
+ $inserts[] = array(
+ 'user_id' => $user['id'],
+ 'element_id' => $image_id,
);
}
mass_inserts(
@@ -57,7 +54,7 @@ DELETE FROM '.CADDIE_TABLE.'
$inserts
);
- redirect(get_root_url().'admin.php?page=batch_manager&cat=caddie');
+ redirect(get_root_url().'admin.php?page=batch_manager&filter=prefilter-caddie');
}
// +-----------------------------------------------------------------------+
diff --git a/admin/photos_add_ftp.php b/admin/photos_add_ftp.php
index 1386209f5..5655d0f6e 100644
--- a/admin/photos_add_ftp.php
+++ b/admin/photos_add_ftp.php
@@ -2,7 +2,9 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2010 Pierrick LE GALL http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
// | 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 |
diff --git a/admin/picture_coi.php b/admin/picture_coi.php
index 96f167c2a..6ad8fa98c 100644
--- a/admin/picture_coi.php
+++ b/admin/picture_coi.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/admin/picture_modify.php b/admin/picture_modify.php
index 033e52139..25c74a8c1 100644
--- a/admin/picture_modify.php
+++ b/admin/picture_modify.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -82,7 +82,7 @@ SELECT category_id
array_from_query($query, 'category_id'),
explode(',', calculate_permissions($user['id'], $user['status']))
);
-
+
foreach ($authorizeds as $category_id)
{
redirect(
@@ -104,7 +104,7 @@ SELECT category_id
if (isset($_GET['sync_metadata']))
{
sync_metadata(array( intval($_GET['image_id'])));
- array_push($page['infos'], l10n('Metadata synchronized from file'));
+ $page['infos'][] = l10n('Metadata synchronized from file');
}
//--------------------------------------------------------- update informations
@@ -120,7 +120,7 @@ if (isset($_POST['date_creation_action'])
$_POST['date_creation_year'])
)
{
- array_push($page['errors'], l10n('wrong date'));
+ $page['errors'][] = l10n('wrong date');
}
}
@@ -154,13 +154,10 @@ if (isset($_POST['submit']) and count($page['errors']) == 0)
$data{'date_creation'} = null;
}
- mass_updates(
+ single_update(
IMAGES_TABLE,
- array(
- 'primary' => array('id'),
- 'update' => array_diff(array_keys($data), array('id'))
- ),
- array($data)
+ $data,
+ array('id' => $data['id'])
);
// time to deal with tags
@@ -178,12 +175,14 @@ if (isset($_POST['submit']) and count($page['errors']) == 0)
}
move_images_to_categories(array($_GET['image_id']), $_POST['associate']);
+ invalidate_user_cache();
+
// thumbnail for albums
if (!isset($_POST['represent']))
{
$_POST['represent'] = array();
}
-
+
$no_longer_thumbnail_for = array_diff($represent_options_selected, $_POST['represent']);
if (count($no_longer_thumbnail_for) > 0)
{
@@ -202,8 +201,8 @@ UPDATE '.CATEGORIES_TABLE.'
}
$represent_options_selected = $_POST['represent'];
-
- array_push($page['infos'], l10n('Photo informations updated'));
+
+ $page['infos'][] = l10n('Photo informations updated');
}
// tags
@@ -306,12 +305,12 @@ while ($user_row = pwg_db_fetch_assoc($result))
}
$intro_vars = array(
- 'file' => sprintf(l10n('Original file : %s'), $row['file']),
- 'add_date' => sprintf(l10n('Posted %s on %s'), time_since($row['date_available'], 'year'), format_date($row['date_available'], false, false)),
- 'added_by' => sprintf(l10n('Added by %s'), $row['added_by']),
+ 'file' => l10n('Original file : %s', $row['file']),
+ 'add_date' => l10n('Posted %s on %s', time_since($row['date_available'], 'year'), format_date($row['date_available'], false, false)),
+ 'added_by' => l10n('Added by %s', $row['added_by']),
'size' => $row['width'].'&times;'.$row['height'].' pixels, '.sprintf('%.2f', $row['filesize']/1024).'MB',
- 'stats' => sprintf(l10n('Visited %d times'), $row['hit']),
- 'id' => sprintf(l10n('Numeric identifier : %d'), $row['id']),
+ 'stats' => l10n('Visited %d times', $row['hit']),
+ 'id' => l10n('Numeric identifier : %d', $row['id']),
);
if ($conf['rate'] and !empty($row['rating_score']))
@@ -323,12 +322,12 @@ SELECT
WHERE element_id = '.$_GET['image_id'].'
;';
list($row['nb_rates']) = pwg_db_fetch_row(pwg_query($query));
-
+
$intro_vars['stats'].= ', '.sprintf(l10n('Rated %d times, score : %.2f'), $row['nb_rates'], $row['rating_score']);
}
$template->assign('INTRO', $intro_vars);
-
+
if (in_array(get_extension($row['path']),$conf['picture_ext']))
{
@@ -373,8 +372,8 @@ ksort($month_list);
$template->assign(
array(
- 'DATE_CREATION_DAY_VALUE' => $day,
- 'DATE_CREATION_MONTH_VALUE' => $month,
+ 'DATE_CREATION_DAY_VALUE' => (int)$day,
+ 'DATE_CREATION_MONTH_VALUE' => (int)$month,
'DATE_CREATION_YEAR_VALUE' => $year,
'DATE_CREATION_TIME_VALUE' => $time,
'month_list' => $month_list,
@@ -395,8 +394,7 @@ while ($row = pwg_db_fetch_assoc($result))
$name =
get_cat_display_name_cache(
$row['uppercats'],
- get_root_url().'admin.php?page=album-',
- false
+ get_root_url().'admin.php?page=album-'
);
if ($row['category_id'] == $storage_category_id)
diff --git a/admin/plugin.php b/admin/plugin.php
index ee44d67c3..b636608ef 100644
--- a/admin/plugin.php
+++ b/admin/plugin.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/admin/plugins.php b/admin/plugins.php
index 55b715dfc..efe3bd833 100644
--- a/admin/plugins.php
+++ b/admin/plugins.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/admin/plugins_installed.php b/admin/plugins_installed.php
index 53a2ea110..d23e51ca4 100644
--- a/admin/plugins_installed.php
+++ b/admin/plugins_installed.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -64,7 +64,7 @@ if (isset($_GET['action']) and isset($_GET['plugin']))
{
if (!is_webmaster())
{
- array_push($page['errors'], l10n('Webmaster status is required.'));
+ $page['errors'][] = l10n('Webmaster status is required.');
}
else
{
@@ -90,7 +90,7 @@ if (isset($_GET['incompatible_plugins']))
foreach ($plugins->get_incompatible_plugins() as $plugin => $version)
{
if ($plugin == '~~expire~~') continue;
- array_push($incompatible_plugins, $plugin);
+ $incompatible_plugins[] = $plugin;
}
echo json_encode($incompatible_plugins);
@@ -152,7 +152,7 @@ foreach($plugins->fs_plugins as $plugin_id => $fs_plugin)
$active_plugins++;
}
- array_push($tpl_plugins, $tpl_plugin);
+ $tpl_plugins[] = $tpl_plugin;
}
$template->append('plugin_states', 'active');
@@ -170,17 +170,14 @@ $missing_plugin_ids = array_diff(
if (count($missing_plugin_ids) > 0)
{
- foreach($missing_plugin_ids as $plugin_id)
+ foreach ($missing_plugin_ids as $plugin_id)
{
- array_push(
- $tpl_plugins,
- array(
- 'NAME' => $plugin_id,
- 'VERSION' => $plugins->db_plugins_by_id[$plugin_id]['version'],
- 'DESC' => l10n('ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'),
- 'U_ACTION' => sprintf($action_url, $plugin_id),
- 'STATE' => 'missing',
- )
+ $tpl_plugins[] = array(
+ 'NAME' => $plugin_id,
+ 'VERSION' => $plugins->db_plugins_by_id[$plugin_id]['version'],
+ 'DESC' => l10n('ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'),
+ 'U_ACTION' => sprintf($action_url, $plugin_id),
+ 'STATE' => 'missing',
);
}
$template->append('plugin_states', 'missing');
diff --git a/admin/plugins_new.php b/admin/plugins_new.php
index 57b05ce57..379077410 100644
--- a/admin/plugins_new.php
+++ b/admin/plugins_new.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -39,7 +39,7 @@ if (isset($_GET['revision']) and isset($_GET['extension']))
{
if (!is_webmaster())
{
- array_push($page['errors'], l10n('Webmaster status is required.'));
+ $page['errors'][] = l10n('Webmaster status is required.');
}
else
{
@@ -57,27 +57,25 @@ if (isset($_GET['installstatus']))
switch ($_GET['installstatus'])
{
case 'ok':
- array_push($page['infos'],
- l10n('Plugin has been successfully copied'),
- l10n('You might go to plugin list to install and activate it.'));
+ $page['infos'][] = l10n('Plugin has been successfully copied');
+ $page['infos'][] = l10n('You might go to plugin list to install and activate it.');
break;
case 'temp_path_error':
- array_push($page['errors'], l10n('Can\'t create temporary file.'));
+ $page['errors'][] = l10n('Can\'t create temporary file.');
break;
case 'dl_archive_error':
- array_push($page['errors'], l10n('Can\'t download archive.'));
+ $page['errors'][] = l10n('Can\'t download archive.');
break;
case 'archive_error':
- array_push($page['errors'], l10n('Can\'t read or extract archive.'));
+ $page['errors'][] = l10n('Can\'t read or extract archive.');
break;
default:
- array_push($page['errors'],
- sprintf(l10n('An error occured during extraction (%s).'), htmlspecialchars($_GET['installstatus'])),
- l10n('Please check "plugins" folder and sub-folders permissions (CHMOD).'));
+ $page['errors'][] = l10n('An error occured during extraction (%s).', htmlspecialchars($_GET['installstatus']));
+ $page['errors'][] = l10n('Please check "plugins" folder and sub-folders permissions (CHMOD).');
}
}
@@ -135,7 +133,7 @@ if ($plugins->get_server_plugins(true))
}
else
{
- array_push($page['errors'], l10n('Can\'t connect to server.'));
+ $page['errors'][] = l10n('Can\'t connect to server.');
}
$template->assign_var_from_handle('ADMIN_CONTENT', 'plugins');
diff --git a/admin/popuphelp.php b/admin/popuphelp.php
index 263223f46..dc7290b4e 100644
--- a/admin/popuphelp.php
+++ b/admin/popuphelp.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/admin/profile.php b/admin/profile.php
index f094cd576..5554fe1cd 100644
--- a/admin/profile.php
+++ b/admin/profile.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/admin/rating.php b/admin/rating.php
index ec9fe9ec6..0edd1369b 100644
--- a/admin/rating.php
+++ b/admin/rating.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -194,7 +194,7 @@ $images = array();
$result = pwg_query($query);
while ($row = pwg_db_fetch_assoc($result))
{
- array_push($images, $row);
+ $images[] = $row;
}
$template->assign( 'images', array() );
diff --git a/admin/rating_user.php b/admin/rating_user.php
index 906e5552f..5781903a7 100644
--- a/admin/rating_user.php
+++ b/admin/rating_user.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/admin/site_manager.php b/admin/site_manager.php
index 4730b3c77..2d75feaec 100644
--- a/admin/site_manager.php
+++ b/admin/site_manager.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -31,6 +31,12 @@ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
// +-----------------------------------------------------------------------+
// | Check Access and exit when user status is not ok |
// +-----------------------------------------------------------------------+
+
+if (!$conf['enable_synchronization'])
+{
+ die('synchronization is disabled');
+}
+
check_status(ACCESS_ADMINISTRATOR);
if (!empty($_POST) or isset($_GET['action']))
@@ -69,15 +75,13 @@ SELECT COUNT(id) AS count
$row = pwg_db_fetch_assoc(pwg_query($query));
if ($row['count'] > 0)
{
- array_push($page['errors'],
- l10n('This site already exists').' ['.$url.']');
+ $page['errors'][] = l10n('This site already exists').' ['.$url.']';
}
if (count($page['errors']) == 0)
{
if ( ! file_exists($url) )
{
- array_push($page['errors'],
- l10n('Directory does not exist').' ['.$url.']');
+ $page['errors'][] = l10n('Directory does not exist').' ['.$url.']';
}
}
@@ -90,8 +94,7 @@ INSERT INTO '.SITES_TABLE.'
(\''.$url.'\')
;';
pwg_query($query);
- array_push($page['infos'],
- $url.' '.l10n('created'));
+ $page['infos'][] = $url.' '.l10n('created');
}
}
@@ -115,8 +118,7 @@ SELECT galleries_url
case 'delete' :
{
delete_site($page['site']);
- array_push($page['infos'],
- $galleries_url.' '.l10n('deleted'));
+ $page['infos'][] = $galleries_url.' '.l10n('deleted');
break;
}
}
diff --git a/admin/site_reader_local.php b/admin/site_reader_local.php
index d6110d579..7e618ca17 100644
--- a/admin/site_reader_local.php
+++ b/admin/site_reader_local.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -52,12 +52,9 @@ function open()
if (!is_dir($this->site_url))
{
- array_push(
- $errors,
- array(
- 'path' => $this->site_url,
- 'type' => 'PWG-ERROR-NO-FS'
- )
+ $errors[] = array(
+ 'path' => $this->site_url,
+ 'type' => 'PWG-ERROR-NO-FS'
);
return false;
@@ -108,12 +105,12 @@ function get_elements($path)
);
}
}
- elseif (is_dir($path.'/'.$node)
+ else if (is_dir($path.'/'.$node)
and $node != 'pwg_high'
and $node != 'pwg_representative'
and $node != 'thumbnail' )
{
- array_push($subdirs, $node);
+ $subdirs[] = $node;
}
} //end while readdir
closedir($contents);
diff --git a/admin/site_update.php b/admin/site_update.php
index 764aecab9..5bcaea12a 100644
--- a/admin/site_update.php
+++ b/admin/site_update.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -31,6 +31,12 @@ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
// +-----------------------------------------------------------------------+
// | Check Access and exit when user status is not ok |
// +-----------------------------------------------------------------------+
+
+if (!$conf['enable_synchronization'])
+{
+ die('synchronization is disabled');
+}
+
check_status(ACCESS_ADMINISTRATOR);
if (!is_numeric($_GET['site']))
@@ -193,7 +199,7 @@ SELECT id_uppercat, MAX(rank)+1 AS next_rank
// category directory, we need to include it in our array
if (isset($_POST['cat']))
{
- array_push($fs_fulldirs, $basedir);
+ $fs_fulldirs[] = $basedir;
}
// If $_POST['subcats-included'] != 1 ("Search in sub-albums" is unchecked)
// $db_fulldirs doesn't include any subdirectories and $fs_fulldirs does
@@ -247,19 +253,17 @@ SELECT id_uppercat, MAX(rank)+1 AS next_rank
$insert['global_rank'] = $insert['rank'];
}
- array_push($inserts, $insert);
- array_push(
- $infos,
- array(
+ $inserts[] = $insert;
+ $infos[] = array(
'path' => $fulldir,
- 'info' => l10n('added')
- )
- );
+ 'info' => l10n('added'),
+ );
// add the new category to $db_categories and $db_fulldirs array
$db_categories[$insert{'id'}] =
array(
'id' => $insert['id'],
+ 'parent' => (isset($parent)) ? $parent : Null,
'status' => $insert['status'],
'visible' => $insert['visible'],
'uppercats' => $insert['uppercats'],
@@ -270,12 +274,9 @@ SELECT id_uppercat, MAX(rank)+1 AS next_rank
}
else
{
- array_push(
- $errors,
- array(
- 'path' => $fulldir,
- 'type' => 'PWG-UPDATE-1'
- )
+ $errors[] = array(
+ 'path' => $fulldir,
+ 'type' => 'PWG-UPDATE-1'
);
}
}
@@ -292,30 +293,140 @@ SELECT id_uppercat, MAX(rank)+1 AS next_rank
// add default permissions to categories
$category_ids = array();
+ $category_up = array();
foreach ($inserts as $category)
{
$category_ids[] = $category['id'];
+ if (!empty($category['id_uppercat']))
+ {
+ $category_up[] = $category['id_uppercat'];
+ }
+ }
+ $category_up=implode(',',array_unique($category_up));
+ if ($conf['inheritance_by_default'])
+ {
+ $query = '
+ SELECT *
+ FROM '.GROUP_ACCESS_TABLE.'
+ WHERE cat_id IN ('.$category_up.')
+ ;';
+ $result = pwg_query($query);
+ if (!empty($result))
+ {
+ $granted_grps = array();
+ while ($row = pwg_db_fetch_assoc($result))
+ {
+ if (!isset($granted_grps[$row['cat_id']]))
+ {
+ $granted_grps[$row['cat_id']]=array();
+ }
+ // TODO: explanaition
+ array_push(
+ $granted_grps,
+ array(
+ $row['cat_id'] => array_push($granted_grps[$row['cat_id']],$row['group_id'])
+ )
+ );
+ }
+ }
+ $query = '
+ SELECT *
+ FROM '.USER_ACCESS_TABLE.'
+ WHERE cat_id IN ('.$category_up.')
+ ;';
+ $result = pwg_query($query);
+ if (!empty($result))
+ {
+ $granted_users = array();
+ while ($row = pwg_db_fetch_assoc($result))
+ {
+ if (!isset($granted_users[$row['cat_id']]))
+ {
+ $granted_users[$row['cat_id']]=array();
+ }
+ // TODO: explanaition
+ array_push(
+ $granted_users,
+ array(
+ $row['cat_id'] => array_push($granted_users[$row['cat_id']],$row['user_id'])
+ )
+ );
+ }
+ }
+ $insert_granted_users=array();
+ $insert_granted_grps=array();
+ foreach ($category_ids as $ids)
+ {
+ $parent_id=$db_categories[$ids]['parent'];
+ while (in_array($parent_id, $category_ids))
+ {
+ $parent_id= $db_categories[$parent_id]['parent'];
+ }
+ if ($db_categories[$ids]['status']=='private' and !is_null($parent_id))
+ {
+ if (isset($granted_grps[$parent_id]))
+ {
+ foreach ($granted_grps[$parent_id] as $granted_grp)
+ {
+ $insert_granted_grps[] = array(
+ 'group_id' => $granted_grp,
+ 'cat_id' => $ids
+ );
+ }
+ }
+ if (isset($granted_users[$parent_id]))
+ {
+ foreach ($granted_users[$parent_id] as $granted_user)
+ {
+ $insert_granted_users[] = array(
+ 'user_id' => $granted_user,
+ 'cat_id' => $ids
+ );
+ }
+ }
+ foreach (get_admins() as $granted_user)
+ {
+ $insert_granted_users[] = array(
+ 'user_id' => $granted_user,
+ 'cat_id' => $ids
+ );
+ }
+ }
+ }
+ mass_inserts(GROUP_ACCESS_TABLE, array('group_id','cat_id'), $insert_granted_grps);
+ $insert_granted_users=array_unique($insert_granted_users, SORT_REGULAR);
+ mass_inserts(USER_ACCESS_TABLE, array('user_id','cat_id'), $insert_granted_users);
+ }
+ else
+ {
+ add_permission_on_category($category_ids, get_admins());
}
- add_permission_on_category($category_ids, get_admins());
}
$counts['new_categories'] = count($inserts);
}
// to delete categories
- $to_delete = array(); $to_delete_derivative_dirs = array();
+ $to_delete = array();
+ $to_delete_derivative_dirs = array();
+
foreach (array_diff(array_keys($db_fulldirs), $fs_fulldirs) as $fulldir)
{
- array_push($to_delete, $db_fulldirs[$fulldir]);
+ $to_delete[] = $db_fulldirs[$fulldir];
unset($db_fulldirs[$fulldir]);
- array_push($infos, array('path' => $fulldir,
- 'info' => l10n('deleted')));
+
+ $infos[] = array(
+ 'path' => $fulldir,
+ 'info' => l10n('deleted')
+ );
+
if (substr_compare($fulldir, '../', 0, 3)==0)
{
$fulldir = substr($fulldir, 3);
}
$to_delete_derivative_dirs[] = PHPWG_ROOT_PATH.PWG_DERIVATIVE_DIR.$fulldir;
}
+
if (count($to_delete) > 0)
{
if (!$simulate)
@@ -388,12 +499,9 @@ SELECT id, path
$filename = basename($path);
if (!preg_match($conf['sync_chars_regex'], $filename))
{
- array_push(
- $errors,
- array(
- 'path' => $path,
- 'type' => 'PWG-UPDATE-1'
- )
+ $errors[] = array(
+ 'path' => $path,
+ 'type' => 'PWG-UPDATE-1'
);
continue;
@@ -415,25 +523,16 @@ SELECT id, path
$insert['level'] = $_POST['privacy_level'];
}
- array_push(
- $inserts,
- $insert
- );
+ $inserts[] = $insert;
- array_push(
- $insert_links,
- array(
- 'image_id' => $insert['id'],
- 'category_id' => $insert['storage_category_id'],
- )
+ $insert_links[] = array(
+ 'image_id' => $insert['id'],
+ 'category_id' => $insert['storage_category_id'],
);
- array_push(
- $infos,
- array(
- 'path' => $insert['path'],
- 'info' => l10n('added')
- )
+ $infos[] = array(
+ 'path' => $insert['path'],
+ 'info' => l10n('added')
);
$caddiables[] = $insert['id'];
@@ -470,9 +569,11 @@ SELECT id, path
$to_delete_elements = array();
foreach (array_diff($db_elements, array_keys($fs)) as $path)
{
- array_push($to_delete_elements, array_search($path, $db_elements));
- array_push($infos, array('path' => $path,
- 'info' => l10n('deleted')));
+ $to_delete_elements[] = array_search($path, $db_elements);
+ $infos[] = array(
+ 'path' => $path,
+ 'info' => l10n('deleted')
+ );
}
if (count($to_delete_elements) > 0)
{
@@ -541,7 +642,7 @@ if (isset($_POST['submit'])
}
$data['id']=$id;
- array_push($datas, $data);
+ $datas[] = $data;
} // end foreach file
$counts['upd_elements'] = count($datas);
@@ -622,7 +723,7 @@ if (isset($_POST['submit']) and isset($_POST['sync_meta'])
{
$data['date_metadata_update'] = CURRENT_DATE;
$data['id']=$id;
- array_push($datas, $data);
+ $datas[] = $data;
foreach (array('keywords', 'tags') as $key)
{
@@ -635,17 +736,17 @@ if (isset($_POST['submit']) and isset($_POST['sync_meta'])
foreach (explode(',', $data[$key]) as $tag_name)
{
- array_push(
- $tags_of[$id],
- tag_id_from_tag_name($tag_name)
- );
+ $tags_of[$id][] = tag_id_from_tag_name($tag_name);
}
}
}
}
else
{
- array_push($errors, array('path' => $element_infos['path'], 'type' => 'PWG-ERROR-NO-FS'));
+ $errors[] = array(
+ 'path' => $element_infos['path'],
+ 'type' => 'PWG-ERROR-NO-FS'
+ );
}
}
diff --git a/admin/stats.php b/admin/stats.php
index d6fd0235a..e103c2ea9 100644
--- a/admin/stats.php
+++ b/admin/stats.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -97,7 +97,7 @@ SELECT
$output = array();
while ($row = pwg_db_fetch_assoc($result))
{
- array_push($output, $row);
+ $output[] = $row;
}
return $output;
@@ -226,7 +226,7 @@ SELECT *
if (isset($need_update[$key]))
{
$row['nb_pages'] += $need_update[$key];
- array_push($updates, $row);
+ $updates[] = $row;
unset($need_update[$key]);
}
}
@@ -236,16 +236,13 @@ foreach ($need_update as $time_key => $nb_pages)
{
$time_tokens = explode('-', $time_key);
- array_push(
- $inserts,
- array(
- 'year' => $time_tokens[0],
- 'month' => @$time_tokens[1],
- 'day' => @$time_tokens[2],
- 'hour' => @$time_tokens[3],
- 'nb_pages' => $nb_pages,
- )
- );
+ $inserts[] = array(
+ 'year' => $time_tokens[0],
+ 'month' => @$time_tokens[1],
+ 'day' => @$time_tokens[2],
+ 'hour' => @$time_tokens[3],
+ 'nb_pages' => $nb_pages,
+ );
}
if (count($updates) > 0)
@@ -323,10 +320,7 @@ $title_parts = array();
$url = PHPWG_ROOT_PATH.'admin.php?page=stats';
-array_push(
- $title_parts,
- '<a href="'.$url.'">'.l10n('Overall').'</a>'
- );
+$title_parts[] = '<a href="'.$url.'">'.l10n('Overall').'</a>';
$period_label = l10n('Year');
@@ -334,10 +328,7 @@ if (isset($page['year']))
{
$url.= '&amp;year='.$page['year'];
- array_push(
- $title_parts,
- '<a href="'.$url.'">'.$page['year'].'</a>'
- );
+ $title_parts[] = '<a href="'.$url.'">'.$page['year'].'</a>';
$period_label = l10n('Month');
}
@@ -346,10 +337,7 @@ if (isset($page['month']))
{
$url.= '&amp;month='.$page['month'];
- array_push(
- $title_parts,
- '<a href="'.$url.'">'.$lang['month'][$page['month']].'</a>'
- );
+ $title_parts[] = '<a href="'.$url.'">'.$lang['month'][$page['month']].'</a>';
$period_label = l10n('Day');
}
@@ -366,10 +354,7 @@ if (isset($page['day']))
$lang['day'][date('w', $time)]
);
- array_push(
- $title_parts,
- '<a href="'.$url.'">'.$day_title.'</a>'
- );
+ $title_parts[] = '<a href="'.$url.'">'.$day_title.'</a>';
$period_label = l10n('Hour');
}
diff --git a/admin/tags.php b/admin/tags.php
index 008bba667..a7c58f796 100644
--- a/admin/tags.php
+++ b/admin/tags.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -38,7 +38,7 @@ if (!empty($_POST))
// | edit tags |
// +-----------------------------------------------------------------------+
-if (isset($_POST['submit']))
+if (isset($_POST['edit_submit']))
{
$query = '
SELECT name
@@ -69,23 +69,14 @@ SELECT id, name
{
if (in_array($tag_name, $existing_names))
{
- array_push(
- $page['errors'],
- sprintf(
- l10n('Tag "%s" already exists'),
- $tag_name
- )
- );
+ $page['errors'][] = l10n('Tag "%s" already exists', $tag_name);
}
else if (!empty($tag_name))
{
- array_push(
- $updates,
- array(
- 'id' => $tag_id,
- 'name' => addslashes($tag_name),
- 'url_name' => trigger_event('render_tag_url', $tag_name),
- )
+ $updates[] = array(
+ 'id' => $tag_id,
+ 'name' => addslashes($tag_name),
+ 'url_name' => trigger_event('render_tag_url', $tag_name),
);
}
}
@@ -134,26 +125,18 @@ SELECT id, name
{
if (in_array($tag_name, $existing_names))
{
- array_push(
- $page['errors'],
- sprintf(
- l10n('Tag "%s" already exists'),
- $tag_name
- )
- );
+ $page['errors'][] = l10n('Tag "%s" already exists', $tag_name);
}
else if (!empty($tag_name))
{
- mass_inserts(
+ single_insert(
TAGS_TABLE,
- array('name', 'url_name'),
array(
- array(
- 'name' => $tag_name,
- 'url_name' => trigger_event('render_tag_url', $tag_name),
- )
+ 'name' => $tag_name,
+ 'url_name' => trigger_event('render_tag_url', $tag_name),
)
);
+
$query = '
SELECT id
FROM '.TAGS_TABLE.'
@@ -161,6 +144,7 @@ SELECT id, name
;';
$destination_tag = array_from_query($query, 'id');
$destination_tag_id = $destination_tag[0];
+
$query = '
SELECT
image_id
@@ -168,15 +152,13 @@ SELECT id, name
WHERE tag_id = '.$tag_id.'
;';
$destination_tag_image_ids = array_from_query($query, 'image_id');
+
$inserts = array();
foreach ($destination_tag_image_ids as $image_id)
{
- array_push(
- $inserts,
- array(
- 'tag_id' => $destination_tag_id,
- 'image_id' => $image_id
- )
+ $inserts[] = array(
+ 'tag_id' => $destination_tag_id,
+ 'image_id' => $image_id
);
}
@@ -188,17 +170,16 @@ SELECT id, name
$inserts
);
}
- array_push(
- $page['infos'],
- sprintf(
- l10n('Tag "%s" is now a duplicate of "%s"'),
- stripslashes($tag_name),
- $current_name_of[$tag_id]
- )
+
+ $page['infos'][] = l10n(
+ 'Tag "%s" is now a duplicate of "%s"',
+ stripslashes($tag_name),
+ $current_name_of[$tag_id]
);
}
}
}
+
mass_updates(
TAGS_TABLE,
array(
@@ -213,14 +194,11 @@ SELECT id, name
// | merge tags |
// +-----------------------------------------------------------------------+
-if (isset($_POST['confirm_merge']))
+if (isset($_POST['merge_submit']))
{
if (!isset($_POST['destination_tag']))
{
- array_push(
- $page['errors'],
- l10n('No destination tag selected')
- );
+ $page['errors'][] = l10n('No destination tag selected');
}
else
{
@@ -240,7 +218,7 @@ SELECT
$result = pwg_query($query);
while ($row = pwg_db_fetch_assoc($result))
{
- $name_of_tag[ $row['id'] ] = trigger_event('render_tag_name', $row['name']);
+ $name_of_tag[ $row['id'] ] = trigger_event('render_tag_name', $row['name'], $row);
}
$tag_ids_to_delete = array_diff(
@@ -274,12 +252,9 @@ SELECT
$inserts = array();
foreach ($image_ids_to_link as $image_id)
{
- array_push(
- $inserts,
- array(
- 'tag_id' => $destination_tag_id,
- 'image_id' => $image_id
- )
+ $inserts[] = array(
+ 'tag_id' => $destination_tag_id,
+ 'image_id' => $image_id
);
}
@@ -298,13 +273,10 @@ SELECT
$tags_deleted[] = $name_of_tag[$tag_id];
}
- array_push(
- $page['infos'],
- sprintf(
- l10n('Tags <em>%s</em> merged into tag <em>%s</em>'),
- implode(', ', $tags_deleted),
- $name_of_tag[$destination_tag_id]
- )
+ $page['infos'][] = l10n(
+ 'Tags <em>%s</em> merged into tag <em>%s</em>',
+ implode(', ', $tags_deleted),
+ $name_of_tag[$destination_tag_id]
);
}
}
@@ -326,14 +298,11 @@ SELECT name
delete_tags($_POST['tags']);
- array_push(
- $page['infos'],
- l10n_dec(
- 'The following tag was deleted',
- 'The %d following tags were deleted',
- count($tag_names)).' : '.
- implode(', ', $tag_names)
- );
+ $page['infos'][] = l10n_dec(
+ 'The following tag was deleted', 'The %d following tags were deleted',
+ count($tag_names)
+ )
+ .' : '.implode(', ', $tag_names);
}
// +-----------------------------------------------------------------------+
@@ -355,46 +324,15 @@ if (isset($_GET['action']) and 'delete_orphans' == $_GET['action'])
if (isset($_POST['add']) and !empty($_POST['add_tag']))
{
- $tag_name = $_POST['add_tag'];
-
- // does the tag already exists?
- $query = '
-SELECT id
- FROM '.TAGS_TABLE.'
- WHERE name = \''.$tag_name.'\'
-;';
- $existing_tags = array_from_query($query, 'id');
-
- if (count($existing_tags) == 0)
+ $ret = create_tag($_POST['add_tag']);
+
+ if (isset($ret['error']))
{
- mass_inserts(
- TAGS_TABLE,
- array('name', 'url_name'),
- array(
- array(
- 'name' => $tag_name,
- 'url_name' => trigger_event('render_tag_url', $tag_name),
- )
- )
- );
-
- array_push(
- $page['infos'],
- sprintf(
- l10n('Tag "%s" was added'),
- stripslashes($tag_name)
- )
- );
+ $page['errors'][] = $ret['error'];
}
else
{
- array_push(
- $page['errors'],
- sprintf(
- l10n('Tag "%s" already exists'),
- stripslashes($tag_name)
- )
- );
+ $page['infos'][] = $ret['info'];
}
}
@@ -420,19 +358,16 @@ $orphan_tags = get_orphan_tags();
$orphan_tag_names = array();
foreach ($orphan_tags as $tag)
{
- array_push($orphan_tag_names, trigger_event('render_tag_name', $tag['name']));
+ $orphan_tag_names[] = trigger_event('render_tag_name', $tag['name'], $tag);
}
if (count($orphan_tag_names) > 0)
{
- array_push(
- $page['warnings'],
- sprintf(
- l10n('You have %d orphan tags: %s.').' <a href="%s">'.l10n('Delete orphan tags').'</a>',
- count($orphan_tag_names),
- implode(', ', $orphan_tag_names),
- get_root_url().'admin.php?page=tags&amp;action=delete_orphans&amp;pwg_token='.get_pwg_token()
- )
+ $page['warnings'][] = sprintf(
+ l10n('You have %d orphan tags: %s.').' <a href="%s">'.l10n('Delete orphan tags').'</a>',
+ count($orphan_tag_names),
+ implode(', ', $orphan_tag_names),
+ get_root_url().'admin.php?page=tags&amp;action=delete_orphans&amp;pwg_token='.get_pwg_token()
);
}
@@ -458,10 +393,10 @@ $all_tags = array();
while ($tag = pwg_db_fetch_assoc($result))
{
$raw_name = $tag['name'];
- $tag['name'] = trigger_event('render_tag_name', $raw_name);
+ $tag['name'] = trigger_event('render_tag_name', $raw_name, $tag);
$tag['counter'] = intval(@$tag_counters[ $tag['id'] ]);
$tag['U_VIEW'] = make_index_url(array('tags'=>array($tag)));
- $tag['U_EDIT'] = 'admin.php?page=batch_manager&amp;tag='.$tag['id'];
+ $tag['U_EDIT'] = 'admin.php?page=batch_manager&amp;filter=tag-'.$tag['id'];
$alt_names = trigger_event('get_tag_alt_names', array(), $raw_name);
$alt_names = array_diff( array_unique($alt_names), array($tag['name']) );
@@ -493,11 +428,7 @@ if ((isset($_POST['edit']) or isset($_POST['duplicate']) or isset($_POST['merge'
$list_name = 'MERGE_TAGS_LIST';
}
- $template->assign(
- array(
- $list_name => implode(',', $_POST['tags']),
- )
- );
+ $template->assign($list_name, implode(',', $_POST['tags']));
$query = '
SELECT id, name
@@ -507,16 +438,11 @@ SELECT id, name
$result = pwg_query($query);
while ($row = pwg_db_fetch_assoc($result))
{
- $name_of[ $row['id'] ] = $row['name'];
- }
-
- foreach ($_POST['tags'] as $tag_id)
- {
$template->append(
'tags',
array(
- 'ID' => $tag_id,
- 'NAME' => $name_of[$tag_id],
+ 'ID' => $row['id'],
+ 'NAME' => $row['name'],
)
);
}
diff --git a/admin/theme.php b/admin/theme.php
index 7b820555b..984ac451b 100644
--- a/admin/theme.php
+++ b/admin/theme.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/admin/themes.php b/admin/themes.php
index 8c8e556ff..5359974f4 100644
--- a/admin/themes.php
+++ b/admin/themes.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/admin/themes/clear/icon/index.php b/admin/themes/clear/icon/index.php
index b0c469804..e3365959c 100644
--- a/admin/themes/clear/icon/index.php
+++ b/admin/themes/clear/icon/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/admin/themes/clear/icon/plug_activate.png b/admin/themes/clear/icon/plug_activate.png
deleted file mode 100644
index 4505e0f48..000000000
--- a/admin/themes/clear/icon/plug_activate.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/clear/icon/plug_activate_grey.png b/admin/themes/clear/icon/plug_activate_grey.png
deleted file mode 100644
index 05a2d4e45..000000000
--- a/admin/themes/clear/icon/plug_activate_grey.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/clear/icon/plug_deactivate.png b/admin/themes/clear/icon/plug_deactivate.png
deleted file mode 100644
index 579b87355..000000000
--- a/admin/themes/clear/icon/plug_deactivate.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/clear/icon/plug_deactivate_grey.png b/admin/themes/clear/icon/plug_deactivate_grey.png
deleted file mode 100644
index 87d5f6b14..000000000
--- a/admin/themes/clear/icon/plug_deactivate_grey.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/clear/icon/plug_delete.png b/admin/themes/clear/icon/plug_delete.png
deleted file mode 100644
index dd9bb1b4a..000000000
--- a/admin/themes/clear/icon/plug_delete.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/clear/icon/plug_delete_grey.png b/admin/themes/clear/icon/plug_delete_grey.png
deleted file mode 100644
index 3706aadc5..000000000
--- a/admin/themes/clear/icon/plug_delete_grey.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/clear/icon/plug_install.png b/admin/themes/clear/icon/plug_install.png
deleted file mode 100644
index e5fb66000..000000000
--- a/admin/themes/clear/icon/plug_install.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/clear/icon/plug_install_grey.png b/admin/themes/clear/icon/plug_install_grey.png
deleted file mode 100644
index d0fd9565d..000000000
--- a/admin/themes/clear/icon/plug_install_grey.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/clear/icon/plug_uninstall.png b/admin/themes/clear/icon/plug_uninstall.png
deleted file mode 100644
index 37a45feb0..000000000
--- a/admin/themes/clear/icon/plug_uninstall.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/clear/icon/plug_uninstall_grey.png b/admin/themes/clear/icon/plug_uninstall_grey.png
deleted file mode 100644
index c51cb754b..000000000
--- a/admin/themes/clear/icon/plug_uninstall_grey.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/clear/icon/ranks.png b/admin/themes/clear/icon/ranks.png
deleted file mode 100644
index e0a308f2b..000000000
--- a/admin/themes/clear/icon/ranks.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/clear/icon/ranks_grey.png b/admin/themes/clear/icon/ranks_grey.png
deleted file mode 100644
index 18478fc1f..000000000
--- a/admin/themes/clear/icon/ranks_grey.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/clear/icon/sync_metadata.png b/admin/themes/clear/icon/sync_metadata.png
deleted file mode 100644
index cb62824a3..000000000
--- a/admin/themes/clear/icon/sync_metadata.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/clear/icon/sync_metadata_pink.png b/admin/themes/clear/icon/sync_metadata_pink.png
deleted file mode 100644
index 6597ef254..000000000
--- a/admin/themes/clear/icon/sync_metadata_pink.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/clear/icon/synchronize.png b/admin/themes/clear/icon/synchronize.png
deleted file mode 100644
index 72a8c0ec5..000000000
--- a/admin/themes/clear/icon/synchronize.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/clear/index.php b/admin/themes/clear/index.php
index 38760bdff..d959f2c09 100644
--- a/admin/themes/clear/index.php
+++ b/admin/themes/clear/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/admin/themes/clear/theme.css b/admin/themes/clear/theme.css
index 174d9a8dd..c481771b1 100644
--- a/admin/themes/clear/theme.css
+++ b/admin/themes/clear/theme.css
@@ -42,6 +42,8 @@ INPUT:focus, SELECT:focus, TEXTAREA:focus {
INPUT, SELECT, TEXTAREA { border: 1px solid #999; }
+.showInfo { color:#999; }
+.showInfo:hover { color:#333; }
#copyright { color:#777; margin:5px auto 0px 240px; text-align:center;
@@ -62,15 +64,13 @@ html, body {
/* #the_page { margin: 0; padding: 0; z-index: 1; top:0px; */
/* padding-top: 0; min-height: 100%; width:100%; position:absolute; left:0px; } */
-#headbranch { width: 233px; height: 240px; margin: 0; padding: 0;
-position:absolute; left:0px; top:0px; z-index: 0;
-background:transparent }
-h3, .content, .throw, .row1 { background-color: #ddd; }
+h3, .throw, .row1 { background-color: #ddd; }
.row2 { background-color:#eeeeee; }
-#content { background: #f1f1f1; min-height: 467px;}
-.content {
+#content {
+ background: #f1f1f1;
border: 1px solid #aaa;
+ min-height: 467px;
margin-left:217px;
margin-top: 7px;
}
@@ -98,7 +98,6 @@ TEXTAREA { cursor:text; font-size: 13px; }
.tagSelected LABEL {color:black;}
ul.thumbnails input { color:#666; font-size:10px; margin:0; background-color:#bbb; text-align: center;}
-INPUT.bigbutton:hover { background-color: #ddd; color:#0cc; border: 0; }
.throw { font-size: 120%; line-height: 26px; padding-top: 10px; font-weight: bold; }
label { cursor:pointer }
.categoryLi, .menuLi { background: #ddd }
@@ -117,8 +116,15 @@ TABLE.table2 { border: 2px solid #dddddd; }
}
*, *:focus, *:active, input:active, a:active, input:focus, a:focus { outline: none; -moz-outline-width: 0px; }
-a { color:#005E89; border-width: 0; }
-a:hover, a:active { color: #d54e21; border-bottom: 1px dotted #d54e21; cursor: pointer; }
+A{
+ color:#005E89;
+}
+
+A:hover, A:active {
+ color: #d54e21;
+ cursor: pointer;
+}
+
.content .navigationBar {color:#999;}
ul.actions, .content form#waiting {text-align:center;}
@@ -151,7 +157,7 @@ margin-top:4px; padding-bottom:3px; padding-top:3px; top:1px;
}
/* .tabsheet a:hover */
.tabsheet li.selected_tab a { color: #555; }
-.tabsheet a span { display:block; font-size:10px; margin-right:2px; padding:0 3px 0 1px; }
+.tabsheet a span { font-size:10px; margin-right:2px; padding:0 3px 0 1px; }
.sort { clear: none; }
/* menubar is on all admin pages => No specific css file */
@@ -170,12 +176,14 @@ margin-top:4px; padding-bottom:3px; padding-top:3px; top:1px;
#menubar dl.first {border-top:none;border-radius:0 6px 0 0;}
#menubar dl.first dt {border-radius:0 6px 0 0;}
#menubar dl.last {border-bottom:1px solid #ddd; border-radius:0 0 6px 0;}
-#menubar dt { background-color: #ddd; margin: 0; display: block; font-weight:bold;
-position:relative; padding: 5px 1px 4px 5px; font-size: 13px; color: #777; }
-#menubar dt span { cursor:pointer; }
+#menubar dt {
+ background-color: #ddd; margin: 0; display: block; font-weight:bold;
+ position:relative; padding: 5px 1px 4px 5px; font-size: 13px; color: #777;
+ cursor:pointer;
+}
#menubar li { margin: 0; padding-left:10px; }
#menubar li A { display:block; }
-#menubar li A:hover { border:none; color:black;}
+#menubar li A:hover {color:black; text-decoration:none}
#menubar li:hover {background-color:#dbe8f3;}
#menubar ul { color: #ccc; margin:0; line-height: 25px;
list-style-type: none; list-style-position: inside; padding: 0; }
@@ -183,6 +191,10 @@ position:relative; padding: 5px 1px 4px 5px; font-size: 13px; color: #777; }
#adminHome:hover {background-color:#d0d0d0;}
/* jQuery tooltips */
+.ui-tooltip {
+ color: #000;
+ background-color: #eee;
+}
.cluetip-outer { border-color:#999; color: #777; background-color: #eee; }
.cluetip-title { background-color: #ddd; }
/* jQuery ui resizable */
@@ -206,14 +218,18 @@ body .ui-resizable-autohide .ui-resizable-handle { display: none; } /* use 'body
.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: 0px; top: 0px; background: transparent url(images/resizable-nw.gif); }
.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: 0px; top: 0px; background: transparent url(images/resizable-ne.gif); }
-#ui-datepicker-div {background-color: #fff; border:2px solid #aaa;}
+#ui-datepicker-div {background-color: #f1f1f1; border:2px solid #aaa;}
#ui-datepicker-div .ui-datepicker-title {color:black;}
#ui-datepicker-div .ui-icon-circle-triangle-w {background: transparent url(icon/prev.png) no-repeat;}
#ui-datepicker-div .ui-icon-circle-triangle-e {background: transparent url(icon/next.png) no-repeat;}
+#ui-datepicker-div .ui-datepicker-control, #ui-datepicker-div a {background-color: #FFFFFF !important;}
+#ui-datepicker-div A.ui-datepicker-prev, #ui-datepicker-div A.ui-datepicker-next {
+ background-color:transparent !important;
+}
#ui-datepicker-div A.ui-datepicker-prev:hover,
#ui-datepicker-div A.ui-datepicker-next:hover
{
- background-color:#eee;border:1px solid #aaa;
+ background-color:#eee !important;border:1px solid #aaa;
}
#ui-datepicker-div .ui-datepicker-control, #ui-datepicker-div a { background-color: #eee; color: #08f !important;}
@@ -221,7 +237,7 @@ body .ui-resizable-autohide .ui-resizable-handle { display: none; } /* use 'body
#ui-datepicker-div .ui-datepicker-week-end-cell, #ui-datepicker-div .ui-datepicker-week-end-cell a { background-color: #ddd; color: #0cc; border-color: #bbb; border-top-color: #ddd; border-left-color: #ddd;}
#ui-datepicker-div .ui-datepicker-title-row { background-color: #eee;}
#ui-datepicker-div .ui-datepicker-title-row .ui-datepicker-week-end-cell a { color: #0cc;}
-#ui-datepicker-div a:hover { color: #0cccc !important; border: 0; background-color: #eee !important;}
+#ui-datepicker-div a:hover { color: #0cccc !important; background-color: #eee !important;}
#ui-datepicker-div .ui-datepicker-header select { background-color:#bbb; color:#666; font-weight:normal;}
#ui-datepicker-div .ui-datepicker-links { background-color:#ddd;}
#ui-datepicker-div .ui-datepicker-header { background-color:#bbb;}
@@ -259,9 +275,6 @@ INPUT[type="text"].large { width: 317px; }
#pluginsMenuSeparator {border:1px solid #ddd;}
-#helpContent A {border-bottom:1px dotted #005E89;}
-#helpContent A:hover {border-bottom:1px solid #d54e21;}
-
#pwgHead, #footer {
background-color: #ddd;
color: #666;
@@ -269,15 +282,13 @@ INPUT[type="text"].large { width: 317px; }
#pwgHead A, #footer A {color:#444;}
-#pwgHead A:hover, #footer A:hover {color:black; border-color:black;}
+#pwgHead A:hover, #footer A:hover {color:black;}
#footer { background-image: url(images/piwigo_logo_small.png);}
-.pluginBox, .pluginMiniBox {background-color:#ddd;color:#353535;border-color:#ddd;}
+.pluginBox, .pluginMiniBox, .groups li {background-color:#ddd;color:#353535;border-color:#ddd;}
.pluginBoxNameCell, .pluginMiniBoxNameCell {color:#111;}
.pluginBox.incompatible, .pluginMiniBox.incompatible {border-color:#a00 !important;}
.pluginBoxes .merged, .pluginBoxes .missing {background-color:#d99;border:1px solid #a00;}
-.showInfo {color:#fff;background-color:#999; }
-.showInfo:hover {color:#fff;border:none;background-color:#333}
.languageBox {background-color:#ddd;}
.languageName {color:black;}
@@ -293,7 +304,7 @@ UL.thumbnails li.rank-of-image {background-color: #ddd;}
#pwgMain {padding-left:0}
-input[type="submit"], input[type="button"], input[type="reset"], a.bigButton {
+.buttonLike, input[type="submit"], input[type="button"], input[type="reset"] {
font-size:12px;
font-weight:bold;
letter-spacing:1px;
@@ -307,10 +318,50 @@ input[type="submit"], input[type="button"], input[type="reset"], a.bigButton {
margin-left:0;
}
-input[type="submit"]:hover, input[type="button"]:hover, input[type="reset"]:hover, a.bigButton:hover {
+.buttonLike:hover, input[type="submit"]:hover, input[type="button"]:hover, input[type="reset"]:hover {
cursor: pointer;
- background-color:#ff7700;
- color:white;
+ background-color: #ff7700;
+ color: white;
+ text-decoration: none;
+}
+
+p.albumTitle img {margin-bottom:-3px;}
+
+.groups label>p {
+ font-size: 1.2em;
+ color: #111;
+ background-color:#ccc;
+}
+label>p.group_select {
+ color: #000;
+ background-color:#C2F5C2;
+}
+
+.userSeparator {
+ color:#999;
+}
+
+table.dataTable tr.even {
+ background-color: #ddd !important;
+}
+
+table.dataTable tr.even td.sorting_1 {
+ background-color: #ccc !important;
+ color:#333;
+}
+
+table.dataTable tr.odd {
+ background-color: #eee !important;
+}
+
+table.dataTable tr.odd td.sorting_1 {
+ background-color: #ddd !important;
+ color:#333;
+}
+
+table.dataTable thead th {
+ border-color: #aaa !important;
}
-p.albumTitle img {margin-bottom:-3px;} \ No newline at end of file
+.userPropertiesContainer {border-color:#ddd;}
+.userPrefs {border-color:#ddd;}
diff --git a/admin/themes/default/fix-ie7.css b/admin/themes/default/fix-ie7.css
index a9e5a21a2..d61e0294a 100644
--- a/admin/themes/default/fix-ie7.css
+++ b/admin/themes/default/fix-ie7.css
@@ -5,4 +5,7 @@
UL.thumbnails li.rank-of-image {
text-align:left;
+}
+.groups li {
+ display: inline;
} \ No newline at end of file
diff --git a/admin/themes/default/fontello/LICENSE.txt b/admin/themes/default/fontello/LICENSE.txt
new file mode 100644
index 000000000..8d0e89fff
--- /dev/null
+++ b/admin/themes/default/fontello/LICENSE.txt
@@ -0,0 +1,66 @@
+Font license info
+
+
+## Fontelico
+
+ Copyright (C) 2012 by Fontello project
+
+ Author: Crowdsourced, for Fontello project
+ License: SIL (http://scripts.sil.org/OFL)
+ Homepage: http://fontello.com
+
+
+## Elusive
+
+ Copyright (C) 2013 by Aristeides Stathopoulos
+
+ Author: Aristeides Stathopoulos
+ License: SIL (http://scripts.sil.org/OFL)
+ Homepage: http://aristeides.com/
+
+
+## Font Awesome
+
+ Copyright (C) 2012 by Dave Gandy
+
+ Author: Dave Gandy
+ License: SIL ()
+ Homepage: http://fortawesome.github.com/Font-Awesome/
+
+
+## Entypo
+
+ Copyright (C) 2012 by Daniel Bruce
+
+ Author: Daniel Bruce
+ License: CC BY-SA (http://creativecommons.org/licenses/by-sa/2.0/)
+ Homepage: http://www.entypo.com
+
+
+## Typicons
+
+ (c) Stephen Hutchings 2012
+
+ Author: Stephen Hutchings
+ License: CC BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/)
+ Homepage: http://typicons.com/
+
+
+## Iconic
+
+ Copyright (C) 2012 by P.J. Onori
+
+ Author: P.J. Onori
+ License: SIL (http://scripts.sil.org/OFL)
+ Homepage: http://somerandomdude.com/work/iconic/
+
+
+## MFG Labs
+
+ Copyright (C) 2012 by Daniel Bruce
+
+ Author: MFG Labs
+ License: SIL (http://scripts.sil.org/OFL)
+ Homepage: http://www.mfglabs.com/
+
+
diff --git a/admin/themes/default/fontello/README.txt b/admin/themes/default/fontello/README.txt
new file mode 100644
index 000000000..43e23f283
--- /dev/null
+++ b/admin/themes/default/fontello/README.txt
@@ -0,0 +1,75 @@
+This webfont is generated by http://fontello.com open source project.
+
+
+================================================================================
+Please, note, that you should obey original font licences, used to make this
+webfont pack. Details available in LICENSE.txt file.
+
+- Usually, it's enough to publish content of LICENSE.txt file somewhere on your
+ site in "About" section.
+
+- If your project is open-source, usually, it will be ok to make LICENSE.txt
+ file publically available in your repository.
+
+- Fonts, used in Fontello, don't require to make clickable links on your site.
+ But any kind of additional authors crediting is welcome.
+================================================================================
+
+
+Comments on archive content
+---------------------------
+
+- /font/* - fonts in different formats
+
+- /css/* - different kinds of css, for all situations. Should be ok with
+ twitter bootstrap. Also, you can skip <i> style and assign icon classes
+ directly to text elements, if you don't mind about IE7.
+
+- demo.html - demo file, to show your webfont content
+
+- LICENSE.txt - license info about source fonts, used to build your one.
+
+- config.json - keeps your settings. You can import it back to fontello anytime,
+ to continue your work
+
+
+Why so many CSS files ?
+-----------------------
+
+Because we like to fit all your needs :)
+
+- basic file, <your_font_name>.css - is usually enougth, in contains @font-face
+ and character codes definition
+
+- *-ie7.css - if you need IE7 support, but still don't wish to put char codes
+ directly into html
+
+- *-codes.css and *-ie7-codes.css - if you like to use your own @font-face
+ rules, but still wish to benefit of css generation. That can be very
+ convenient for automated assets build systems. When you need to update font -
+ no needs to manually edit files, just override old version with archive
+ content. See fontello source codes for example.
+
+- *-embedded.css - basic css file, but with embedded WOFF font, to avoid
+ CORS issues in Firefox and IE9+, when fonts are hosted on the separate domain.
+ We strongly recommend to resolve this issue by `Access-Control-Allow-Origin`
+ server headers. But if you ok with dirty hack - this file is for you. Note,
+ that data url moved to separate @font-face to avoid problems with <IE9, when
+ string is too long.
+
+- animate.css - use it to get ideas about spinner rotation animation.
+
+
+Attention for server setup
+--------------------------
+
+You MUST setup server to reply with proper `mime-types` for font files. In other
+case, some browsers will fail to show fonts.
+
+Usually, `apache` already has necessary settings, but `nginx` and other
+webservers should be tuned. Here is list of mime types for our file extentions:
+
+- `application/vnd.ms-fontobject` - eot
+- `application/x-font-woff` - woff
+- `application/x-font-ttf` - ttf
+- `image/svg+xml` - svg
diff --git a/admin/themes/default/fontello/config.json b/admin/themes/default/fontello/config.json
new file mode 100644
index 000000000..1387aa0d6
--- /dev/null
+++ b/admin/themes/default/fontello/config.json
@@ -0,0 +1,364 @@
+{
+ "name": "",
+ "css_prefix_text": "icon-",
+ "css_use_suffix": false,
+ "hinting": true,
+ "units_per_em": 1000,
+ "ascent": 850,
+ "glyphs": [
+ {
+ "uid": "9bc2902722abb366a213a052ade360bc",
+ "css": "spin6",
+ "code": 59421,
+ "src": "fontelico"
+ },
+ {
+ "uid": "bf882b30900da12fca090d9796bc3030",
+ "css": "mail",
+ "code": 9993,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "ccc2329632396dc096bb638d4b46fb98",
+ "css": "mail-alt",
+ "code": 61664,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "474656633f79ea2f1dad59ff63f6bf07",
+ "css": "star",
+ "code": 9733,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "d17030afaecc1e1c22349b99f3c4992a",
+ "css": "star-empty",
+ "code": 9734,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "8b80d36d4ef43889db10bc1f0dc9a862",
+ "css": "user",
+ "code": 128100,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "381da2c2f7fd51f8de877c044d7f439d",
+ "css": "picture",
+ "code": 127748,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "0f4cae16f34ae243a6144c18a003f2d8",
+ "css": "cancel-circled",
+ "code": 59425,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "4ba33d2607902cf690dd45df09774cb0",
+ "css": "plus-circled",
+ "code": 10133,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "0ddd3e8201ccc7d41f7b7c9d27eca6c1",
+ "css": "link",
+ "code": 128279,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "c1f1975c885aa9f3dad7810c53b82074",
+ "css": "lock",
+ "code": 128274,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "c5fd349cbd3d23e4ade333789c29c729",
+ "css": "eye",
+ "code": 59146,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "a3f89e106175a5c5c4e9738870b12e55",
+ "css": "tags",
+ "code": 59149,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "7034e4d22866af82bef811f52fb1ba46",
+ "css": "code",
+ "code": 59402,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "d35a1d35efeb784d1dc9ac18b9b6c2b6",
+ "css": "pencil",
+ "code": 9998,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "dcedf50ab1ede3283d7a6c70e2fe32f3",
+ "css": "chat",
+ "code": 59168,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "f48ae54adfb27d8ada53d0fd9e34ee10",
+ "css": "trash",
+ "code": 59177,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "c95735c17a10af81448c7fed98a04546",
+ "css": "folder-open",
+ "code": 59398,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "559647a6f430b3aeadbecd67194451dd",
+ "css": "menu",
+ "code": 59401,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "e99461abfef3923546da8d745372c995",
+ "css": "cog",
+ "code": 9881,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "98687378abd1faf8f6af97c254eb6cd6",
+ "css": "cog-alt",
+ "code": 9967,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "5bb103cd29de77e0e06a52638527b575",
+ "css": "wrench",
+ "code": 128295,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "9affc98d652b86628d650ee58dbf0357",
+ "css": "basket",
+ "code": 59197,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "0d20938846444af8deb1920dc85a29fb",
+ "css": "logout",
+ "code": 59419,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "598a5f2bcf3521d1615de8e1881ccd17",
+ "css": "clock",
+ "code": 128340,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "98d9c83c1ee7c2c25af784b518c522c5",
+ "css": "block",
+ "code": 128683,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "6605ee6441bf499ffa3c63d3c7409471",
+ "css": "move",
+ "code": 59410,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "bc71f4c6e53394d5ba46b063040014f1",
+ "css": "cw",
+ "code": 59404,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "a73c5deb486c8d66249811642e5d719a",
+ "css": "arrows-cw",
+ "code": 59396,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "37c5ab63f10d7ad0b84d0978dcd0c7a8",
+ "css": "shuffle",
+ "code": 128256,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "6020aff067fc3c119cdd75daa5249220",
+ "css": "exchange",
+ "code": 59397,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "d407a4707f719b042ed2ad28d2619d7e",
+ "css": "signal",
+ "code": 59393,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "09bdae120f85e79f2db16145a9e1f6d8",
+ "css": "crop",
+ "code": 61733,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "dd6c6b221a1088ff8a9b9cd32d0b3dd5",
+ "css": "check",
+ "code": 59423,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "4b900d04e8ab8c82f080c1cfbac5772c",
+ "css": "check-empty",
+ "code": 59424,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "9396b2d8849e0213a0f11c5fd7fcc522",
+ "css": "tasks",
+ "code": 61614,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "4109c474ff99cad28fd5a2c38af2ec6f",
+ "css": "filter",
+ "code": 61616,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "6fe95ffc3c807e62647d4f814a96e0d7",
+ "css": "sitemap",
+ "code": 61672,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "7222571caa5c15f83dcfd447c58d68d9",
+ "css": "search",
+ "code": 59409,
+ "src": "entypo"
+ },
+ {
+ "uid": "6274e0601f2feef7eced89146e708de0",
+ "css": "user-add",
+ "code": 59403,
+ "src": "entypo"
+ },
+ {
+ "uid": "de9a631a7d18106aea1c89ba51b1990a",
+ "css": "help-circled",
+ "code": 59418,
+ "src": "entypo"
+ },
+ {
+ "uid": "7e4164950ffa4990961958b2d6318658",
+ "css": "info-circled-1",
+ "code": 59415,
+ "src": "entypo"
+ },
+ {
+ "uid": "513ac180ff85bd275f2b736720cbbf5e",
+ "css": "home",
+ "code": 59406,
+ "src": "entypo"
+ },
+ {
+ "uid": "1d2a6c3d9236b88b0f185c7c4530fa52",
+ "css": "flag",
+ "code": 59420,
+ "src": "entypo"
+ },
+ {
+ "uid": "44199a54057e6e264fde61a49b034171",
+ "css": "upload",
+ "code": 59411,
+ "src": "entypo"
+ },
+ {
+ "uid": "5d595124cecf472869d1cdc020da0ccc",
+ "css": "upload-cloud",
+ "code": 59412,
+ "src": "entypo"
+ },
+ {
+ "uid": "6a7b9d4863bb7e6c79e9457a72d689b6",
+ "css": "tools",
+ "code": 59395,
+ "src": "entypo"
+ },
+ {
+ "uid": "7f6916533c0842b6cec699fd773693d3",
+ "css": "hourglass",
+ "code": 59422,
+ "src": "entypo"
+ },
+ {
+ "uid": "414fe97e4af5215a06d29be0f2cecdf5",
+ "css": "network",
+ "code": 59414,
+ "src": "entypo"
+ },
+ {
+ "uid": "39c4d0e225a1263a398a47523cb5b9bd",
+ "css": "brush",
+ "code": 59399,
+ "src": "entypo"
+ },
+ {
+ "uid": "ddecf5ad7935e3fb1b70dac6ed00d06a",
+ "css": "language",
+ "code": 59392,
+ "src": "entypo"
+ },
+ {
+ "uid": "8beac4a5fd5bed9f82ca7a96cc8ba218",
+ "css": "key",
+ "code": 59413,
+ "src": "entypo"
+ },
+ {
+ "uid": "4bcb3aaa98736be3027bef7c76c55021",
+ "css": "flow-branch",
+ "code": 59400,
+ "src": "entypo"
+ },
+ {
+ "uid": "xoidjr6q3rzi7tpw6hci1k6srz15g11l",
+ "css": "puzzle",
+ "code": 59318,
+ "src": "typicons"
+ },
+ {
+ "uid": "937f4db8b6ff3348a1d9fcd5e12fd2fe",
+ "css": "mail-1",
+ "code": 59408,
+ "src": "iconic"
+ },
+ {
+ "uid": "e3699d145bd628d2a35d4a508b616f0c",
+ "css": "equalizer",
+ "code": 59407,
+ "src": "iconic"
+ },
+ {
+ "uid": "05ef9b5e8742971aa85b23cfcbe71594",
+ "css": "users",
+ "code": 59394,
+ "src": "mfglabs"
+ },
+ {
+ "uid": "e36d581e4f2844db345bddc205d15dda",
+ "css": "group",
+ "code": 59405,
+ "src": "elusive"
+ },
+ {
+ "uid": "10fdd98fb50c590b805a3ad6ff9c55f5",
+ "css": "asl",
+ "code": 57517,
+ "src": "elusive"
+ }
+ ]
+} \ No newline at end of file
diff --git a/admin/themes/default/fontello/css/animation.css b/admin/themes/default/fontello/css/animation.css
new file mode 100644
index 000000000..ac5a9562f
--- /dev/null
+++ b/admin/themes/default/fontello/css/animation.css
@@ -0,0 +1,85 @@
+/*
+ Animation example, for spinners
+*/
+.animate-spin {
+ -moz-animation: spin 2s infinite linear;
+ -o-animation: spin 2s infinite linear;
+ -webkit-animation: spin 2s infinite linear;
+ animation: spin 2s infinite linear;
+ display: inline-block;
+}
+@-moz-keyframes spin {
+ 0% {
+ -moz-transform: rotate(0deg);
+ -o-transform: rotate(0deg);
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+
+ 100% {
+ -moz-transform: rotate(359deg);
+ -o-transform: rotate(359deg);
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+@-webkit-keyframes spin {
+ 0% {
+ -moz-transform: rotate(0deg);
+ -o-transform: rotate(0deg);
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+
+ 100% {
+ -moz-transform: rotate(359deg);
+ -o-transform: rotate(359deg);
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+@-o-keyframes spin {
+ 0% {
+ -moz-transform: rotate(0deg);
+ -o-transform: rotate(0deg);
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+
+ 100% {
+ -moz-transform: rotate(359deg);
+ -o-transform: rotate(359deg);
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+@-ms-keyframes spin {
+ 0% {
+ -moz-transform: rotate(0deg);
+ -o-transform: rotate(0deg);
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+
+ 100% {
+ -moz-transform: rotate(359deg);
+ -o-transform: rotate(359deg);
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+@keyframes spin {
+ 0% {
+ -moz-transform: rotate(0deg);
+ -o-transform: rotate(0deg);
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+
+ 100% {
+ -moz-transform: rotate(359deg);
+ -o-transform: rotate(359deg);
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
diff --git a/admin/themes/default/fontello/css/fontello-codes.css b/admin/themes/default/fontello/css/fontello-codes.css
new file mode 100644
index 000000000..25bfdd80e
--- /dev/null
+++ b/admin/themes/default/fontello/css/fontello-codes.css
@@ -0,0 +1,62 @@
+@charset "UTF-8";
+
+
+.icon-spin6:before { content: '\e81d'; } /* 'î ' */
+.icon-asl:before { content: '\e0ad'; } /* 'î‚­' */
+.icon-mail-alt:before { content: '\f0e0'; } /* '' */
+.icon-star:before { content: '\2605'; } /* '★' */
+.icon-star-empty:before { content: '\2606'; } /* '☆' */
+.icon-user:before { content: '👤'; } /* '\1f464' */
+.icon-picture:before { content: '🌄'; } /* '\1f304' */
+.icon-cancel-circled:before { content: '\e821'; } /* 'î ¡' */
+.icon-plus-circled:before { content: '\2795'; } /* 'âž•' */
+.icon-link:before { content: '🔗'; } /* '\1f517' */
+.icon-lock:before { content: '🔒'; } /* '\1f512' */
+.icon-eye:before { content: '\e70a'; } /* '' */
+.icon-tags:before { content: '\e70d'; } /* 'îœ' */
+.icon-code:before { content: '\e80a'; } /* 'î Š' */
+.icon-pencil:before { content: '\270e'; } /* '✎' */
+.icon-chat:before { content: '\e720'; } /* '' */
+.icon-trash:before { content: '\e729'; } /* '' */
+.icon-folder-open:before { content: '\e806'; } /* 'î †' */
+.icon-menu:before { content: '\e809'; } /* 'î ‰' */
+.icon-cog:before { content: '\2699'; } /* 'âš™' */
+.icon-cog-alt:before { content: '\26ef'; } /* '⛯' */
+.icon-wrench:before { content: '🔧'; } /* '\1f527' */
+.icon-basket:before { content: '\e73d'; } /* '' */
+.icon-logout:before { content: '\e81b'; } /* 'î ›' */
+.icon-clock:before { content: '🕔'; } /* '\1f554' */
+.icon-block:before { content: '🚫'; } /* '\1f6ab' */
+.icon-move:before { content: '\e812'; } /* 'î ’' */
+.icon-cw:before { content: '\e80c'; } /* '' */
+.icon-arrows-cw:before { content: '\e804'; } /* 'î „' */
+.icon-mail:before { content: '\2709'; } /* '✉' */
+.icon-exchange:before { content: '\e805'; } /* 'î …' */
+.icon-signal:before { content: '\e801'; } /* 'î ' */
+.icon-crop:before { content: '\f125'; } /* 'ï„¥' */
+.icon-check:before { content: '\e81f'; } /* 'î Ÿ' */
+.icon-check-empty:before { content: '\e820'; } /* 'î  ' */
+.icon-tasks:before { content: '\f0ae'; } /* 'ï‚®' */
+.icon-filter:before { content: '\f0b0'; } /* 'ï‚°' */
+.icon-sitemap:before { content: '\f0e8'; } /* '' */
+.icon-search:before { content: '\e811'; } /* 'î ‘' */
+.icon-user-add:before { content: '\e80b'; } /* 'î ‹' */
+.icon-help-circled:before { content: '\e81a'; } /* 'î š' */
+.icon-info-circled-1:before { content: '\e817'; } /* 'î —' */
+.icon-home:before { content: '\e80e'; } /* 'î Ž' */
+.icon-flag:before { content: '\e81c'; } /* '' */
+.icon-upload:before { content: '\e813'; } /* 'î “' */
+.icon-upload-cloud:before { content: '\e814'; } /* 'î ”' */
+.icon-tools:before { content: '\e803'; } /* 'î ƒ' */
+.icon-hourglass:before { content: '\e81e'; } /* 'î ž' */
+.icon-network:before { content: '\e816'; } /* 'î –' */
+.icon-brush:before { content: '\e807'; } /* 'î ‡' */
+.icon-language:before { content: '\e800'; } /* 'î €' */
+.icon-key:before { content: '\e815'; } /* 'î •' */
+.icon-flow-branch:before { content: '\e808'; } /* 'î ˆ' */
+.icon-puzzle:before { content: '\e7b6'; } /* '' */
+.icon-mail-1:before { content: '\e810'; } /* 'î ' */
+.icon-equalizer:before { content: '\e80f'; } /* 'î ' */
+.icon-users:before { content: '\e802'; } /* 'î ‚' */
+.icon-group:before { content: '\e80d'; } /* 'î ' */
+.icon-shuffle:before { content: '🔀'; } /* '\1f500' */ \ No newline at end of file
diff --git a/admin/themes/default/fontello/css/fontello-embedded.css b/admin/themes/default/fontello/css/fontello-embedded.css
new file mode 100644
index 000000000..75b9ada75
--- /dev/null
+++ b/admin/themes/default/fontello/css/fontello-embedded.css
@@ -0,0 +1,115 @@
+@charset "UTF-8";
+
+ @font-face {
+ font-family: 'fontello';
+ src: url('../font/fontello.eot?13698858');
+ src: url('../font/fontello.eot?13698858#iefix') format('embedded-opentype'),
+ url('../font/fontello.svg?13698858#fontello') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'fontello';
+ src: url('data:application/octet-stream;base64,d09GRgABAAAAADaQAA4AAAAAU5wAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABRAAAAEQAAABWfC1hLWNtYXAAAAGIAAABSAAAA1adDutiY3Z0IAAAAtAAAAAUAAAAHAbj/wZmcGdtAAAC5AAABPkAAAmRigp4O2dhc3AAAAfgAAAACAAAAAgAAAAQZ2x5ZgAAB+gAACnkAAA95hHNpUtoZWFkAAAxzAAAADYAAAA2AYwVSWhoZWEAADIEAAAAHgAAACQIYAQ+aG10eAAAMiQAAABdAAAA8NfwAABsb2NhAAAyhAAAAHoAAAB68Erh0G1heHAAADMAAAAAIAAAACABqgrEbmFtZQAAMyAAAAF2AAACzcydGRtwb3N0AAA0mAAAAZ8AAAJQkCwxaXByZXAAADY4AAAAVgAAAFaSoZr/eJxjYGSeyTiBgZWBg6mKaQ8DA0MPhGZ8wGDIyMTAwMTAysyAFQSkuaYwOKix/v/PHPQ/iyGKOYJhGlCYESQHAPfhDC14nN3Su0oDQRQG4H/IRROzGRAkQ0BMwOwQELzfyQvYCRaCrZVY+QT6ECnyDJKQKrWPkHLTLSjMoEU2eMEiEs/MSZNC0NaBb/457JndgR0AaQApsgoBN56oEr5OIQ+IZ+p4oHoNFVoVgDAbtsKhzumibsZtkzeBqZi6aZieLdlq0km6SZzYUW0yca8LMz92w5ZnuwfjwdVgKRpHn9HNyoWaqC/1oh5VX50rqQJ5J2/lqTyRxelJfz1E9m/9/3IU3CSup9Xy7MMw4/6ra6BsMXcrwiFzt0TnGKhXFxloj24yzAFxm2EeMHkG2mMC5m6UqTAsUNaZO51pMLjeHgN9w1LYEk2SskyqtNZA0mFYp+wybFDGDJuUlmELGNUYtiFe0x6wA/F26QG7EO/wgD3KRQ/Ypyx5wAGl9oBDyjMPOIL4uPeA429IhISyeJxjYEADRgxGzBH/s0AYABIMA+14nJ1V2XbTVhSVPGRwEjpkoKAO19w4UOvKhCkYMGkqxXYhHRwIrQQdpAx05J3HPutrjkK7Vh/5tO59PSS0dK22LJbPvkdbZ9g650YcIyp9Gohr1KGSlwOprD2WSvdJXNd1L4+VDAZxXbYST0mbqJ0kSmrd7FAu8VjrKlknWCfj5SBWT1WeZ6AM4hQeZUlEG0QbqZcmSeKJ4yeJFmcQHyVJICWjEKfSyFBCNRrEUtWhTOnQq9cTcdNAykajHnVYVPdDxSfHNafUrANGKlc5whXr1Ua+G6cDL3uQxDrBs62HMR54rH6UKpCKkenIP3ZKTpSGgVRx1KFW4ugwk1/3kUwqzUCmjGJFpe6BuN39dNsWMT10Or4uSpVGqrq5ziia7dHxqIMoD9nG6aTc0Nn28OUZU1SrXXGz7UBmDVxKyWx0n0QAHSZS4+kBTjWcAqkZ9UfF2efPARLJXJSqPFUyh3oDmTM7e3Ex7W4nq7JwpJ8HMm92duOdh0OnV4d/0foXTOHMR4/iYn4+QvpQan4iTiSlRljM8qeGH3FXIEK5MYgLF8rgU4Q5dEXa2WZd47Ux9obP+UqpYT0J2uij+H4K/U4kKxxnUaP1SJzNY9d1rdxnUEu1uxc7Mq9DlSLu7wsLrjPnhGGeFgtVX5753gU0/waIZ/xA3jSFS/uWKUq0b5uiTLtoigrtElSlXTbFFO2KKaZpz5pihvYdU8zSnjMy4//L3OeR+xze8ZCb9l3kpn0PuWnfR27aD5CbViE3bR25aS8gN61GbtpVozp2BBoGaRdSFUHQNLL6YdxWm/VA1ow0fGlg8i5iyPrqREedtbXKH8V/deILB3Jpoqe7Iheb4i6v2xY+PN3uq4+aRt2w1fjGkfIwHkZ6HJrQWfnN4b/tTd0umu4yqjLoARVMCsAAZe1AAtM62wmk9Zqn+PIHYFyGeM5KQ7VUnzuGpu/leV/3sTnxvsftxi63XHd5CVnWDXJj9vDfUmSq6x/lLa1UJ0esKyePVWsYQyq8KLq+kpR7tLUbvyipsvJelNbK55OQmz2DG0Jbtu5hsCNMacolHl5TpSg91FKOskMsbynKPOCUiwtahsS4DnUPamvE6aF6GBsLIYahtL0QcEgpXRXftMp38R6ra9jo+MUV4el6chIRn+Iq+1HwVNdG/egO2rxm3TKDKVWqp/uMT7Gv2/ZRWWmkjrMXt1QH1zTrGjkV00/ka+B0bzho3QM9VHw0QSNVNcfoxihjNJY15d8EdDFWfsNo1WL7PdxPnaRVrLlLmOybE/fgtLv9Kvu1nFtG1v3XBr1t5IqfIzG/LQr8Owdit2QN1DuTgRgLyFnQGMYWJncYroNtxG32Pyan/9+GhUVyVzsau3nqw9WTUSV32fK4y012WdejNkfVThr7CI0tDzfm2OFyLLbEYEG2/sH/Me4Bd2lRAuDQyGWYiNp0oZ7q4eoeq7FtOFcSAXbNseN0AHoALkHfHLvW8wmA9dwj5y7AfXIIdsgh+JQcgs/IuQXwOTkEX5BDMCCHYJecOwAPyCF4SA7BHjkEj8jZBPiSHIKvyCGIySFIyLkN8JgcgifkEHxNDsE3Rq5OZP6WB9kA+s6im0CpnRoc2jhkRq5N2Ps8WPaBRWQfWkTqkZHrE+pTHiz1e4tI/cEiUn80cmNC/YkHS/3ZIlJ/sYjUZ8aXmSMprw6e844O/gSX6q1eAAAAAAEAAf//AA94nMV7e3hbx3XnzNy5D1xcXFwA9wEC4CWIN0EIhEA8KIqCIJAiaYqiaJJmRJFmFEVSGEpRHEWrT+vaXr/WUVzH8qqp6qj5HDsbO948XFlW4zR11W7iZLuO23WSre3G6X7+0mxWbtKk2/rLOl4J2jMXoCzLcZPu/rEScXFn5swFZuac3/mdMwOEEbr8HPcIV0dRdMfTATfHIYIb2864pnfWFYwRQQcQITIZCW87I0OdDDVkFRrQ+6BG/RVS3ndIGe+Qulpggf0716kHOX8v1r04YBq6ivuwKMRS5VI1kGbXZLVS7MK8yT3i/XYBK4byv9/0GAoufFvtwsHb3FHlVhyM4tcU7zebr1HJrWHx7rtFv0wlbH3Tqxh8pmlZzQyP4GPXxutCWfSJutZpeFySKPAcRu7/L0N/OpUMWgEf5+3F1T7sxZZYtQLteYjH3mUeyM1f/MnqB3/6xZ7vfa/JZsSSf/WMxB6N/9VfxR/9yYc/jM+2JyfyblPjzM2T3C5ORhJaQVP1be9fmNxCET/oIhiVMmGNEpzEHKENJCCEBbSIMOHwDhHzFG54AmXMzSIOc2NLi3PXT4z3ZuPRjmDAL/l6cSkVU7FZrCQNXfBiQTQtUxdVnIYhCiL878UwznQqDeOFa6pUreFqqg/ncbpcqmzGlWq7sh8moFKF/xtx0ezCpgVTYrGHeTEUbUw2zhybIfNH5nFEEldkdyAj8N5pjyhu7wi5RKrdIila2NohaMKoSXkpI3ul/aKEZX5FUq1kS1baHgy5JM53i6hgb8Sc5r3iuE7pRtW1X5Tx8sa5uaNzc8dYq2Yb4aKgCsY05oc80mREk8UPuJQhXqjbvCooRW8k7MWK6Mh2hKLrREXUp1uiXklyRPnhCIhudwRhGdjkXj5M+7jrYB38KIx+Cz2N/gkb9f5/+B8/+j6l5oFlwru+85+/9SewNkdniR+Nxgn2nvsMIXhjnghkAHTm1Cfu4DycC9S5G1Rwzoe9fuz34hVkIiqbdBHJLiTvQHwAIz8PC0kETHa4sUuCxXAJixrop8hhcRFxyKNwnkUd+/3GrIUNQx5WsaK4FVDlmV/3WJCHjl7D/+s/oP3QhXruJ3/34//+w1ef//af/6dnv/4HT3zxP3z+0X/3wH2/ffyeQx/a//6lXbVNlf5cNqDresAfNBy1EnRQK76UUrHF7jhWZeNiRXy7psV/paaV31K0Tfg3UDRDdx7JNA0GB48z2dV5diytYrH1SHgEPA06QwEe2V+E3hY83HkA+0K+q/um0k7fd+0Kn3t1X/w6U7+jc/jLuYEczg7mcPv9ZYmfF5RAF6Wehlvg64YpiNSzIsiegNWgHmGa8gnJI97ASyAoupmgMiILQj0QFESOCWJPwGzwHv56GvRJHgEk8b5ZQY6QEcwbnW7FLeY4PMJ1yuLsrCh3ciUN06zk80UsSoZJxAXVbems5EjTdwgrsvKW9Jot/W1njmS6OrNZsgCXjdnsX3wAvowasMJJQaG+Bi26haGwRxJuAJOidJuX56WcEjQ9WBKvlZSloZAj6V7fkrQNTzigEKn5X6ZcklfdrBKSCScxdpdwhhAoeyXXlMuleViL7SoBYGcsnGZNHs1F+qGt1SvNmpRSutXJBZ2ktzrBQ690khB3+TJg6QXyDdSBqmgMDdTLibAfU44g5g4aiEctxOQASTmGpJTiHdBGZxHFdKw81JsZHBCM3qSP6axKmNL2YVCOtE83+7uLlUAZikK6OyaIOmgjtfqLNW4zBmX26YLYHUtVfaUKCILP9Bu/uxBJDIVJqObL7zxl+BWBqwCQEY6jwsXn4G7mVRr1R4MKcYds3eZftUtjpeTF5xIVXEpylWTJjb+k+w5PBCOhkJqaOOzTm3OSLJMZVeV5winC8pYnSUQ1AUZ1LcQ9GZwpX3okWcKVBHlvslQCTKOOb9lOLgO66TAnCXR33bQNQvhOk3CkgyMc+A2YGgqQ5QfISiOe8KswSWQV5ohbRWzelgXM5mk7vGE6wyZqNFxPvVMSrb5TcKHuQ6g7GrR8XlmCbyHootZrVdOi0W/gUjwmYsHQ+4tVXElbOF5mVCTteFvz28W7+sfxexWeNr9DPeDr+jj7QrNwgduu33jhRn2jeZcu9t/VPzRGQAOb36VwxXn6kQvNvtfw6U7jxteWDOMuE/zr5UswB+/l3CiOCqhe3+TBCHcxnWiAg8XAQLgVHnMU/vYjEUYh4kVEBYHuQJQKc0igwrhhxBPJeEKXrF5cLqXEOFzScdABAy6WoZsbAZVM0IVKtcwuQKVieVLDRXCMnzfVE6Y65tXxCdWE8b1VOHv4Wxf+/JBw8zOvf+02PDgOrSegAcR1LxTud+7vN4v/6tkjR579O3ZBFMbyde6v4DuvA/3egrahnnpq21hjy9BA2KeKvBvVmZ4TtIMxHTLLSM9Yb4+/l/P1BlIVwE8BnLaNq8WqWanCew0D2KXLJtxYAFsqB8DYnUq3ZE0B7mrMv+vtOwsAPZXGNFVylQGQbbGY6QvH9nSEd3YqGhgWDsXXH0t10+5N84WRnLGu+dk5oyFUBiWDZovKMTJUp9LAIH6QNgaxwA8WKXkmGTXDX+2M20+UhnAyTdNJqUuLGt1KJCXH1jU6gqN6x+FDt3T5hZvw6XWZYOI7PTk1hbt67Gj3Gxtj2R6MeoOp7mZfKtOHmFlf/iXY/63Ih2KoH1XrJTcBFfXARHC/3vwts8cImmD+MEhA/RYFFEQbR8EiU2IMVNXGFSBGsMY8+BAaTTCnVclhaoHB33B77OQLJ2O337DtVUxfbf6R5h7dq5naSAGY8V+7p5pvNL/ffGPK7Z7CEk5hacqNB+/eMji8cvLkyvDglrsPHz+OrwPRvVsVlfjlwoj2fCBwx+nTdwRS+u2nyUO36c74/oQmQJcl1IlKKFfvSSGmxQ1ECV3lMZBJeC3CDcGzYNkEj0U7egZCfhhUgPlqm1SwLjKv2Xa9VebqYGVZJfOJuFJiTfFW9Zvg30imliI36M2fmRv15kcMO9v5Wue4gU/oLxlQ16mHNLBhA1rGO291Ggyy086SVD0hFJp/bYOQwSrHOy90ZrHNBDudSs0H/TayJtupbXPhMw5+J0G3x+tbr4sIEBpttoyAXxUw2thDOMo1SkXCbQZLpbCAK6g9ZkQBV5nNMi5MubFGvTYUjyXjPLBgnfGQNIN0GGI5VaqUN5OKWK2RKhDdkmOnls4WGpS+i3MIMsN8mJC0yey5BlJpG3P+1XMHCsXRG4wwgA5MLnwkBhap0q1TePXci+dWX5we4RUp7KI85TCRpbBxw2ix8Hs3RX27PtfYOok943P40e13T7rWWzyVRaZ/nAAPsfmgX8scGZ66e3Ly7h8MH02rptzt5nhwskSSMeWt9a4JrthXumeiN5s+tsZXn+T8oAte1IX60EY0jD6AJuvXIRW5JNW14PUQcPvAACVhkefgywIuiBgmSnS7xR1IFN2zyC26x/bvfd/y4sLczI7J68a21AOlQJn969eCvRh8mkPbwKcxOmb9mnLA1+0DCwH3V8O4HyYwLoi8wWRAMA7OMe2D+Wdat5FBD1O9LiB8JrZlKQGejV1OvHV7vyy2bkV5vKlIEsEvEElqfvzNMOWfFCj+iSxVSslmAVxemcl9Ke3KmWfNnJT+MszZ080/ZZV4C7u+y31zL/Fd+rmiy7JO9m3hMeZn4RMv/Tw/0siTgPMlbjQi2NZvlNvc4hHyLNieDw2hkfqWLKaSC/QPA7RI4Cck0EYRCRDYgjYiHpZtiWNAjHc4TnaWWSoaSyXS/bkAEGlXsJdnIFMj5tp7gLEIHhBaF4FDgNZ2Mwyq4TIXj+VxBTyMzXVhaML72paJf9G+mfCrl/6II8QDUYlJ/L5L31RNxdxz2KuToOeES5UEhoQPqaZoZ7NDGZKLtN/JcPOHHp2MKJKqhs2IaapSJEXw87ptYkHRVJdqMn3DMP7nyGPkf6IdaLhed0G4I8PQRYY2EJ4CjgL/IhLHipjMQmyKyRhG41s31wbK+VxPOtppmZpHoOCcdrgh7mYRBDiiimkZLTWqArSmGLECV5RmWARIazH7A2cbE4VUteyoWYUR9krRFAGBTaZDneCf0ikykaxUkqYRMnGh6wR8bWNkzwj2+GT9RHcO+81gOFWppAwjFMT56ImA4lNHd49iQ9a8J7oKuh7EJ0d2jxOPT/E/0JX3mx2hVKmUMk14XL7rAU2V9ZG9dcIet9id18N6kDWHOiDSyncvsmY2RxDPX/4h9yb5PtrgeOf3o/3onvpdCbC9Yl9vDHyMjd14/2Q5HOR5twU+cJObKEIDu5Qbd84NgTZJDcANCpwKZFcRCK8iN+9elTEomoslCBD6IOIBqxUelExxuZTtSFFcM8iluEb37X3/7qWF+Rtmp7dNXDc2UFmX68mkk93RgEfrBW8uQriUYlimcuk88BiIdiD+SZcAESv91VK6BDys2AnBTwUiOsP0YgMmlzerDDh1AMt0CthOPGn6TR2Wq8ys27mpBNiycP0c9wN7elkmUULna1ktP753oFQfKtbJfQoFHKKfJlJekB8SJCJR6Ywyf0vzsUiMxkK5xyNDtpQYIhJp1uT5aTovFM8UiDBP5ceItFu+84FxXJx5pkFSAh366kBqci4vCaODc/WitjcIkXcFfF/kEIXHrpjwQVl42fvHXxWUF5VI7k4zuHNU8JOzkebP3hDoY58jlPqJKTWfwZKzXhAvXMHQzaDbQ/UNyCUiFyAkjwAneQ7xOxCjicAUmC0zSjwL5k4os+apbeX2v3452Fttq3IL44rmO8rXIOa15cA1ZUDDAwyt4PLi1bfiQVF2Li/9SoH82o1cf4rdscvHmucd3GvA9S8vXWD3JAhXbF58jhW4ClzbPvjj9EmuiNajfahY71ucvm7zpkqpU0PgjIBpgATwfrDxHcA08YzDMkZnrh/csL5gGdTbW3bCeYD3EnOirdgaSkWbrMXeosDYsk0A5wyrG7clrmpXidUSMIBp5wloaxqwoRWIpfTM1k4jmcFdAXWdylO+trqhd64W4yhV13l90Uyq87a9ml/HF0+S/6jwhBZ3Ls2XKDjshOJ1gWOI2b7iqLcpSKZiDa0P8xLnUj3J9aI35HYHJtLhpJH2D/b6073V1RpO1Way1XAgO+jvCSTD6YmAN5/x+4aA0XwvpkXj63YOkNJSbzyqxQpqt08GVxId0lx6UPyYW0zFskpHyh/LybImyN6YBvz9zcunuX/iQqgX+Ps8WkbJemxhZ30zRZuBCRCOTSwYP/gJCKjQ+3xGIBLg9d6AivU4m7eWAUOAxCaU3VSLVpE1sFwcMHKYKWBt7AanYBWSpgjIyEIqGAlLqphMFkSdh5i4ajmP/H3wDT4v1ZRRt4dEqZC1oUJNmfeUbg4p+rHodC5GJXlSpdnBN/Bpv14wteYeSRpXSFGLFlcGcjMjI0EVZvh2RaFKTKWpwZSQIdR/8fHm5C90f97Eb0oR0+uhqn9SUUiQCpGCoNraLoFIpeDAYJ6AQUu0ECw2E6aWVf34ZUmpSX+2UtsZUnJTU6PBwXFzYEDwC8qIXIxkasogGPmlkTfm/1HX8v52DnUR7DgBUf90fftwkgiuTUN9wKAs5vYkcFEUnDQSeGBDYN+YJy5+sWXW4KpgxgmEfRyHZlkUMTa6NVlOlsupsp4Aq8a6wQikk7u6YsqCFwPVKV7JVQXapg7az3ByLeVVLbOclpPGMrltiR996voHh8bdzMu+qZrEtT2ztzpxZ1qweAXMVdW1Vu3MTdtalR8WFZz48aeuP806BTHP4VNfq20YdzvdzYh7ezIzUZMHPAr+artie6ss0LYg80sEfPc3uNfIkygIVr25PpTEvABjZjGRAIG8AFNBKLNoEWi0SNcipAVm4bOIhRGBZNyMWzoLgVkuWexmF+ZQWLqM+WCW82BZOjZDLA/CwqRu5qiBU3MXZOkSkiVBPMvzT/FemUMwLufuErsD9EGyCo1/ckCUMXsJZ3mNP8sDiMk4I4GkIhyAP0mGP6hvj+mXtAPW3I960M6nO8MhDqC5vZVgQwxAuWWgYYz4Ll2F3CxRMRaud7IgYfXd2he+Eh+MV8pgeiwj4fCwPGZpHpbaSRvdMcEL7rDaRmln8LTD/8fB+dSlRwIR7HsmOJ8k7w3Yf9YslA/HnwG0xBP9T/VP4D54bfYH/iaSUWM6u/7BrlLP33AiT0iwf2Ki3z/RWq+Ll2/jXuYmkAf8kvSHXbqESaa3WnEwUqiyRCk2Ebt3AhXHttHR1PKMkpi/f44KpSB3MNT83NHUvCT57WhMk+qZo/jZL8Tk6eXEnF8JUWHoC+TxUHPkSKohqDE7Cgg1lzqC552c0dfI7RxBOVRGNbCnHfXJaJdpAOPgcAOGIkHcg+miLBIO7IkTFl0YFoTfAW88mz8ejdU3Vysjw5vH6mMbByu1aq3UX+jrzYZDPo0xP50lGuDvSoztazE6wH6jwqKyVpFneWXGCAOtN93Eazfk9gkhNzWYz2ZLQTo6und0fJxdMnsGS0WnfOlcZiCbHciMRNg1g7/Ueif3TtuD86WgqmrRQsKeLo6OFqdi+ObYJLubjD1v235zKB91ipFMZjCTuTTKroMZsrP1ztanlWfYBbFAizdU6v0ZYPtSOxbgwYh4x4gIgPritcoFfKuc6mdZRqOVM2REt8rsB8rpdtlql8Wrywu6dvHnTl6I83lN/M+U9o45t84Va+NO5sm5YnWtBQprY/kjapKvIR3QcwPzSHkfy5c2fkXsUi5l0paf+nqTLI0Pxl/FjoGDkVimjjm2hZjH1UANs1S9C9CghRDpFkyAb9LxTrbv0rwoCDBjGo0IwiuvCHjkBaIKMUnAL3CKGBclfBAkVCHC86+8wvMRuAXprVDE1LkXoEmjP3hFUMnUpT4RfDinSOQFeIBM1Ob9zYutTq/8AD4LPgLKWpvbfBr4XhRlUAmN1oftiB7QeCLyGFFYOCwyv0vRASQSKm4XMGGZQcItQLRMr0dUpFuBJK8v9OXX5XqzPR3BgKT1Jpn9lxnjYVlBllBgLiCdAg32YtNgqs6yg8l+Iw50Jl7uL/eTg+cuvprIL4/mJUZXKZWosPSjJXCPRFVVIufH8cipU3vh7/b64OpzqhIbHTJLBSVU0HQgNKnKkSOVnVIsYlNFyVfModGfMdlTEKM1wQ8uACYWGI9dBwGtCzsq2U50AuKDRu4HDcUQnzLQpw6NYwkwQsfS6UA6wTQTt52Z48tUYnOtLAhbVJFtt+RJjWt5NUcp37QCPvBZg6uTBZqZ21NrHO2hPmESHMvQE+99z8M3jdP6sQcXZx7cNK6tI98AR7VO2749P7l6ZHUyP1gWML+dqsLENB458tATDx0ZAb/lD7R1Ey4XyFeQCSMaQ/vqno3961MRVaESy3ptOxMArO9m60qWIe6EDphboSyti8CtQ98ZlpweDdejzv7vPyOy8HQ4FQ739MDgwcOzBSw57EqwnN0sIx6zyqXNBJS7jVSg9Z3Q0J3HuJJmkqzSYsEoSw+D2vu/2CDxZLkrun5c8Rwu0MMdf2o+uCGZx0u375radDJI4pf+VtXxX4/ku+Lre+JbHveHjxYPeVfvCQnT6aWBvh4SuPUmt1S1Np3oeDwsj0as+f7JgwcnV0v2qBx+PElJEC+s3hogvT21mfXTsnlPlJzYEC5LLFa/ePl57jj5RxRC2XoahskTHpEVh6sfYGlQCGl4nlwPN2SrHu/2JWJs1U0nVaNiuMZZqqbMLszELe6YJptzRNWef/7rEXXOlDX8gJbT8LRmNp9TVQVXms/pOq6YGj6paWu48hnuBGcDrmTQEPpQfTWNXRQ3NJlQF6Y7Am7C9iW9LmFB9xGvihXOqyz4eaBrzuosMEGKZz0iuGg81tNjGAj1DPUMbRgogxX25XuzRsbIJBPd0S47HLJM+CA97gsEfIYO0Bp3nMsmDAYHbrpaNEUfNuI+x+P4mBWWatgUDb5dl/Y5glBn+Ei9GsvFBgZiRjCG8T3VaCE6MBDNJ8ilT1WjfVEMhUL05zd93orFrM/fhP9X0MZRq+nCO25qyqwO/+Kmx4M2iZmP3/Th5r92aj72YRx0qpoXWjgEE3SCfBmwxoVi9S6XwMMiCU4mlzmK7Szhcj2LA7bqfuLrxclyt4GTvm4f/l5zM3drcwQ/c/EufOi7H/pQ86nvNrfhrzjY9nUuRv4O+WDVe+sZHyacwHYDGg7Tw9yiYyfM3JkjImgsYAXSNAAABhre56R/tUqUqXFyzfNy1A7mE9HzEzO3nz+H0Z/lm8HjZ26Dv6lYJB+Nns+ex+gr52/fOfGFncdvO3vPbexrw/dYBYydQSPouvqoG7tkUXaJK4xlg0PkVhQsMTuU8IIHi+wLimgRybI8DPTbzY1sqW8a2rih1J/PwdfzJY3ugK4GHRrWWk6WlHAKzLMA/So7C30VEe0vw0CcAnNMoNFG/xUa6r7fbesvgSN0n5Bt+QTQ6PGXdBtqr2pwR9xXNeBl1f2byF39ZOBvb1z+CvdTju14xdGHnoJJqW874wasyhCWtl4FCuXkd3i8CqGIIPDLSOA4YTsSBG4OcQI3Hq6nf6Uov3qt5ELd7Yv5u82qz+dzwUzxcWa8gNRt4so2MDfjfpHtrHezWCXdj1/H9HPnHyMv+/1ChCbMiy+YCRqRsw/t+cJZiWZwLiPRs1/Yw0mvX4av3jwr5/yn9VBIP10IHrxTOnRIutNZZwebP4c60dZ6I+IChNHBYTohhQDfFWBm1dkk5DDLFmzn2KbEHGUQNI5RKBjwqYpblkSBok7cKQEvLDrLVe5Pi+ArYQ0r/UUr5Wy3mFaFvLH3vvv2nl8988TKGxMHVydVgXz60K77ghH8s+PPHj//4x+fXzm5QpTQwQdXZqjDod+8fBMX4uZRB1qHvHXFj9FmFlT3ZrHXSYcJaS9h4M4mqOp4bBYgV/KA6qrj6uBFIMrmBH33/kb96OiKGp1UdKJJMM6g6r//8OrZg7Z/bq8tSRxPTHFYU4MQwpG9R77lV+SvK49FqEo1dY8dwncWR1c/q+t3PpNbrek5xXRpos6vVySNqPCdALIvn+Qe5LLAJ8MojaqogabQjeiD6N/W70xEgXeTpYUdpULKDioSdXN4ez7kh4BbQDcMD1UyPOVXlse21gZ0oCl8A1wj6AUSVhx2zoO3Z3R0P9AXjor7EXE5+VpGT0VuBxidOAs34lhnBKMP7HvP/OTExsH+9fHuSLozjbzYK3t7AzExBT7OtARDtwQxJTpXIO5Qg502WCmoCaRYnoZJ9hdZm8WiY0Fked200HoEa8CtLA+LXCqbcIUzrfaRjHTlVVMv5CoTS0MCrVW0Q/qQ3iim8hKejpiDA3NTxw5NzodWH76TqqmhkK0GlzPa0ZQ2WMwfE8ip84d3jSgjgmqb9+Pdp2i9EawX9sp7Q4xVzR8crBzCb8ilyYlcKqdpglYYoHtiocNHV+88tLtWDOKCmo3YNTURapaCO3U5GMnldeng3eopNU/Vk/OFopyY3H0mMfHAnUTdg797/Hkz5xcG6MmjuilnL/1Ulvyx6XpWedgxC/C/D3CnuRysbACi0/fVlxWY83gsaFFeBAsRBV4Q+RVYGQD+/bBgLgBr5OxMCiJEVDIYPbhImW0QzSEojBu6DFQulYja4Q69x+jRVFdADvAUcFRiMVUFwmAIZpEFjlxgSfNyiQPOxvawAApZQsKCRQJtx986jzWh+Yvm3c2fCVj5x2yexKKp/Dn7YMlfCKpyNlSwjw5oJVNREiEuS5pvtCRlfAv2nyqEItFcdPDSE6VSMJF6ePdgPhSLPbhyzZhNsLQb6jMBdlAN4ICyYcJgQTlFNlhEBQThkQheSeSWXA48QPTI4IHlGsbZSAeq6VSsuzPsU12mbLbGKV81TogJy5UU20UQddMKMBWLx0CpGNi3jwyJzLi9zumjVi1MxDWjf8ZOkZRNInCNPB5analnRughTZtSNE1STFk23IJKD1LBjOSvnYpLdipipxLwgm8cy01NhrIrlIYiQV0P+k1F8oqSzyXpgxJVNF3zx1A7/vgld4B8A2y8jgbr1QAbewPCRcRRtMKyUBBzLLKcDMdyMlDpWGg7K2XGg+Weclo0e8FBM3R3tjPbSQjDcqqcYwk+5zCCTVpbvcxrtvJWVeYJ2b4u3kfgkyXp7PDy8vBZSWZbNqzonB45JxCBEMHd/I47YrKskvqmGXHjPnee+HkVKNzyMD4+vCxLbpfggVCtkmgeg46USDinupsvyLr3EVN9EcLMR1gyCypQmxd8hTvO+UE7QnXLjVmIqWJcv5LtDEYY0wEIVkmeCGIgzkHIYXMVblXVpN3H52qDI0end+396tKuW8YHRnY9TlYEVbn3lB0qRDON5sPkhVgjExuZKMrAf395+be4N7idKMmQ3+4kMN0sn4ohXBMS6RRpJUAtCGdAPYhlJti+SCohlivUMokocO/5vebqJ0+od0g+OVLvMCVVkD8ofOBmPHBwel1huPmjzzyNx6ZKPbOa6xPqfb+L735I9gs+0QoORRT5aPO/HfxI59Hlnx89dXMRb7z3y/+meXHVbHPiVVIAbhQGTryHRaDlIiFcBSZvAgv8zu0ErKXBYIHyAtvapjxhiQSOZeEwUCSAfNAF5EYjszOhcCLdGRINZ39btzHbB3PWuYZLrc190Aqe5YYBdCts9yZQqhEwgnIVgndL7+LMlBnXVQJuMCWUhU5cI+VSkR1ygFinjzjH80hh9549u7/08pfY2xP/9Ymm7afS0i1371Tt3avHHpAiSkfnEtn7+l66a13A51NshciCpHi9JLZLOjJSatwsLPX6PbwiUnIot7I8tLQ/fzQ2NRU7mt+/NLS8kjsanZqKCqoklIqyXmlO+O2EGows2cVKpRjd1RswDFKQ/X5V9moaieFd0QZNFWK2HSukaMNe6gmokq6Ya7b1MMS+eTSMXv7DIcyLLEJkh4iHAD04LEH8SziRI7uRyHMic4wCxwv7Yco5AfzjGksG9uAcJEBzLBcwHm4xtyo8A2yErCCRsIwB4JlAWr2J0xuctMiM99ru/2+fvgD0TreMdLmYKvczeme0ttKZ2Ve7ixajecxzpuLdbcPvLlacCJb5ZDOA3+LGXbjNiTn/8nCzwEwfvxC3XZwYFkTCeRRnK72SwC8kS3wC/BB139Hc4Emo/6Cqm9SE+jv4g1CoefC2J1t9G8tYpQEhwmOuvQ9fSXxC4uMCoZhvDqrqPzjyHtbRA09or1Ggvd8GkSkgHG4fxSHEyZGxQ0uYjBFkh82ALCIv8fIA+1cNDkaesnxvmwWTfOSq71665a3hNXaTb1z5bqxx4UrLMt7dyrWunQ9LoPWor56zDYWjhEViLEwBVrvItmQp2cEIbDtRYlh6RO9gKTyI9KsVFu7HvAAgcBH0LgAVuJjFzdhil7efB7tD3rdPlvsh/Ni3z23LRbcb3t1F2YZ3qOyXX77qWNirKmvtdK9Jwe3by5+46nRY60zIL539TOB2ABJh1Is2ouX6Yg7z7hKWaQRzLh2D921AK0/d/ALomOyi8iLEoRxxcQuwRpJIpMX2UbgFxCCHhaPCLOP1Y4PVYiGbSaWSPvZPU4K9ye5ydxpeSQi88DUZy8BVGc1qu7zWzlLpZCPe3zz9Ihm69Cze99JL2DbVi7tbScyHnbd3LdXHXxx7aezShfYxOa+T2myfsGslPduH6cB/Of7gSS4IfldHdj2sOudBG9fmZQfSzP+YIva1zxaDeuEU+56c1+Vr/r0pil75hNz8e38gSJ6zyJctrfn3zT2WzEHMB0QZB7R1rX2JtTOoFabjLgi4GQ16l2wwGHZisJ/6nEMyrROkJjukR6r9rR0+UB+BURmVpNkhEMDlVpLROWV6oX1gtKPrucloaiRMIo1M13ufjgYrPd8tlZVY1E0UO+Eu/85uf3wI53u5SqKEv9Xc2rKHP44YH68GQxEcilgjt5h/mpvuPBlPu/wKlnUpva+hWjOJ3sGS47tb++Q3oG31caR4sFtW3IsqloGvYJkseF0AarwztPYt2yRnZoTG5mZ2bJ+c2NrYtHFwoNxf7vYl2YsdMEpetT1uQQuL7ddOgzgq1K5jnu2qOqZb5fYBEeccEtOyuAHzITJp7kLUPGtGo2a5+bdlAEgoOVdWZNXtUhY85tuacWdnDkPN6aeYFFzwgQO29S4FEH1bOWsfsFv+nXsE5olA9FtFm+qD/RgLHHH2BdiRGRHieYFNjoCB5CPq0P6lVuYDYCQf6E/G4/2JgOZmhuVz4e5WKvbKRHW3s3KtbcjylQ0otr+oe7GPHaeq4snm78PrHLlLlm51DgI0bUm+lW3zt4r4lY/zmszfC1XHQfAv4PXxA29J4B86UreyQwa33su7VeHjzSSwOMp0m/Y55w9bOx/X1Ud1CCe9gOKqR3HBgkeAywC8EMbSKYSgiIMJcLSesMNnlOcd98bPAv7wY+UN5WQg4AdKy0hMilEWbHSXqxZOtiGfnbpOtyF/7YB11TkBVdtVgz8ydPFnZ3cB+bEv3iXKWBG4W9mO4vVgGHe1TlLfmiwR37oaaczX683mmweeWsCdj8jSpV3OGYjHRCVwaVfr2PRj7O3Kb3ICnAJjzKD5bWc0IABRDmOeEvAaPPgAtr9zJZ02x7qAp+92RHh2KvFdZBaeDnTEAz1F5jraLqxU460iSzQQoOw855wEw+yw4cxwMzg8QxW/nRrs5lO5yYmJQkyMDWQiuiycu+3M7fTYV482hqemhu2BRmUgFiJBOwh/Zqo0WBvCL+68DWTILW3e+Q2w3zoET1X0Ebyj7mWsu4cAgUljdqSytWuagkBAdPKQiy5MJfarI1g6li4m7wE/wA4MumVh7adZubekwZsIvFsAWRj1jqv78syh82Ss/eOt3/wTvP8Xn2D8Cz7hX/Zw50djdfPQh1ZXFnfOTjfqm4bYnma/Uc4ogV6IMdN5Ln3FLItvpStjArBoPl2p2rS6lof0vdWqEue4Sxvd17rXCAtWa/yVHvhIrFeX7FDebJnob5O/dHbPC7YdSnvywUwo4enuVTQ7lAuecHbSneYT4Vw0pPg7tGDC32NVGqlW73A2oWu+UERJJPKVeqbVgYyW9vVoqRDwd2b7l77Z3nVnzkuWTTOll/Z22FldJ60tePzTtoAWS3TENiWLI0ZfKGhip7c/muiIb6qF6oVcVMNv7dkzfkLuAvwQwbLS9QQ7wgsgyM6nOsfW2fvaufV4IFkJaOzgcnfZ+ZkR30YAQIOWF2jj/VO4k/0uB78QNS+95kC575PPnyJ+uH304MY5Mr3pkeZ5E+oN3ACoPrj/k5/cf9Be26P4Gvcgdx2KoA1oF/p+PTSAXfwNWwG9Am6CRa4x10tcIwIRyZaW0hcgNHdRfjfCIoD6bqBNSHQxXAOyRMUl+OYQPb8HAF2aRZIkc0yV2Y/Biqwfx7tWWEeIE1Z+g571gXd0khDHS9ziOzsLggMzjKURAdS17nnPvGWFMlawI6PLQYeopmKixbKa7OQGEAm8xlIBJVsEtlVRTecJ87FFJlvBV5Lt1fTVsYSpi1Yrq57zHtHymskpmEQhUFapGdA+6l2nzXibx7wf1XLajKYd8eZ9FidT23KpKmf58euFmfzH8h/Nr19f+Fjfkb6+mb57+g73tUtftOCRfpPTBC98YSpT05f3HvF6r9fwZ0zto5p3xpuDR8ITVdUFS0plzvI17x/OX99X+Gjfxwrr18ND7snP5PuO5I+3Ss5aH3XiQwlYYB4drespAOu04ec4tkvKDo84v4PJwmrFWc6U8hCysd9VIrwCE80hhgitCIW42Y9KM+8u9fZoZuHpSHydHmCn8KvOKXxcrCTXZhVKydZvMlPOPpXzo0qD/fYMFPxF3TaJP6bh1eZdxqC50TDwLeYcflAJ37mD/XAgOtrhcv37gyS7rdsrd6ogG9X1N5t36fomfaOJb6nO/Y2Z3LaMT77wANE1wS8u3zpEOtbp7DzzWtyjo26Yj1J9PcSnLDPsOG3SdtoQny1d67QN0zD6k/3Mab/tfOMaHSvlscrZEO9cHfjg12XpbItfsGPdF2bufey+aTJ3/Av3zP/WVREPib3JWAdIPAvCz8/eC/Z7/2fvB8l7Z98W67Dz2Ge4BU4DW/CjOGPabpljhzIdrg0LiheRAyroCqRYHakEBbgupbEJ7JrwzvY2FvWkrpI8V6M2IT8oNBcnd9Vumi5e+i5+dNvS7H3TmPxg5PDDX/rsTaOkceShM58+Wse7d000l4rF6cMfxI8Wpx+YXlzc+fBhaD766XOnj9WEiYOPof8DZB3f4AABAAAAAQAABW5g+l8PPPUACwPoAAAAAM7iBPEAAAAAzuHMsf/4/2oEsQNYAAAACAACAAAAAAAAeJxjYGRgYA76n8UQxbKRgeH/MyAJFEEBNgCGMAWmAAB4nGN+wcDAvACKIxkYWPSB9AsIG4wvQ/hwcUGIWqZlQPolVG4jkh6Y2kNANQ1YzATRLUh2ikLFYJgHiGcg4QVQ9UA5JgMoXxDJLEEkvQugdkHFmJpQ/QbCAO88IqcAAAAAAAAAAHgBBgHKA6wENAS2BRwFrAYcBowHIgfaCFoI7AnECk4K/AuoDDgMog0QDU4N4A5GDrwPLA+UEDAQchEAESoRbhHwEmISshMIE/AUahT8FXoVsBX8FqoXfBfGGCwYuBjuGVgZ7BpcGtAbOBx8HMQduh5CHqIe8wAAAAEAAAA8APQACAAAAAAAAgAwAD0AbgAAAMcJkQAAAAB4nHWQy2rCQBSG//HSi0JbWui2sypKabzRjSAIFt20GyluS4wxicSMTEbB1+g79GH6En2W/iZjKUoTJvOdb86cORkA1/iGQP48ceQscMYo5wJO0bNcpH+2XCK/WC6jijfLJ/Tvlit4QGC5iht8sIIonTNa4NOywJW4tFzAhbizXKR/tFwi9yyXcSteLZ/Qe5YrmIjUchX34mugVlsdBaGRtUFdtputjpxupaKKEjeW7tqESqeyL+cqMX4cK8dTyz2P/WAdu3of7ueJr9NIJbLlNPdq5Ce+do0/21VPN0HbmLmca7WUQ5shV1otfM84oTGrbqPx9zwMoLDCFhoRryqEgUSNts65jSZa6JCmzJDMzLMiJHAR07hYc0eYraSM+xxzRgmtz4yY7MDjd3nkx6SA+2NW0Uerh/GEtDsjyrxkXw67O8wakZIs083s7Lf3FBue1qY13LXrUmddSQwPakjex25tQePRO9mtGNouGnz/+b8f2lqESQAAeJxtUdeO2zAQ1NgU5ZZL771XJXHKpd3P0NRKIrQWFZYo9tdHOsNvWYCzIIGdnRkmk+RQi+T/dZYkmGAKgRQSGWaYY4ElVriAE1zEJVzGFVzFNVzHDdzELdzGHdzFPdzHAzzEIzzGEzzFMzzHC7zEK7zGG7zFO+R4jw/4iDU+4TO+4CtO8Q3f8QM/8QtnwgflFiPktO3CbqptlQ0nVxzEVhmWHbXa8Krj6HNtnGYqpsrzlHYkgqq80LUKaXDK13KjfENBdnG/Z5qxaquoKpLeVK3iNHpyPg3Wsp8r52w/EPYz+jsQtBUtS8sFudwOC9ONi75elmz7fONUq2uxpTYKbQuajTS5KoqJ7tPK2diJ2m5pTr+jYrMnJ0fZ+Vp6Um4ctH9Ixo6tKlaHlmu2sZg2tMtaCr11zYlpS3t0l69XNXF3vEq2lY1BlKyq1HemPZ3XNrqKlfeprkk3y3M85HeiB7XEx+E0DIl4WRoO5GbnwoZgM28CbVUntLNd1hkdoiMx+sp8HcuSSbDVjWDTNrJ3wwfUqR5f0s2ISfIPpG+i2wBLuADIUlixAQGOWbkIAAgAYyCwASNEsAMjcLIEKAlFUkSyCgIHKrEGAUSxJAGIUViwQIhYsQYDRLEmAYhRWLgEAIhYsQYBRFlZWVm4Af+FsASNsQUARAAA') format('woff'),
+ url('data:application/octet-stream;base64,AAEAAAAOAIAAAwBgT1MvMnwtYS0AAADsAAAAVmNtYXCdDutiAAABRAAAA1ZjdnQgBuP/BgAASZQAAAAcZnBnbYoKeDsAAEmwAAAJkWdhc3AAAAAQAABJjAAAAAhnbHlmEc2lSwAABJwAAD3maGVhZAGMFUkAAEKEAAAANmhoZWEIYAQ+AABCvAAAACRobXR41/AAAAAAQuAAAADwbG9jYfBK4dAAAEPQAAAAem1heHABqgrEAABETAAAACBuYW1lzJ0ZGwAARGwAAALNcG9zdJAsMWkAAEc8AAACUHByZXCSoZr/AABTRAAAAFYAAQOZAZAABQAIAnoCvAAAAIwCegK8AAAB4AAxAQIAAAIABQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGZFZABAJgX//wNS/2oAWgNYAJYAAAABAAAAAAAAAAAABAAAAAMAAAAkAAEAAAAAAOQAAwABAAAAJAADAAoAAAHqAAQAwAAAACwAIAAEAAwAACYGJpkm7ycJJw4nleCt5wrnDecg5ynnPee26BfoIfCu8LDw4PDo8SX//wAAAAAmBSaZJu8nCScOJ5XgrecK5w3nIOcp5z3ntugA6BrwrvCw8ODw6PEl//8AANn82WrZFdj82PjYch9bGP8Y/RjrGOMY0BhYGA8YDQ+BD4APUQ9KDw4AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAFsAAAAAAAAAB0AAAAAAAAAAAAAAAAAACYFAAAmBgAAAAEAACaZAAAmmQAAAAMAACbvAAAm7wAAAAQAACcJAAAnCQAAAAUAACcOAAAnDgAAAAYAACeVAAAnlQAAAAcAAOCtAADgrQAAAAgAAOcKAADnCgAAAAkAAOcNAADnDQAAAAoAAOcgAADnIAAAAAsAAOcpAADnKQAAAAwAAOc9AADnPQAAAA0AAOe2AADntgAAAA4AAOgAAADoFwAAAA8AAOgaAADoIQAAACcAAPCuAADwrgAAAC8AAPCwAADwsAAAADAAAPDgAADw4AAAADEAAPDoAADw6AAAADIAAPElAADxJQAAADMAAfMEAAHzBAAAADQAAfRkAAH0ZAAAADUAAfUAAAH1AAAAADYAAfUSAAH1EgAAADcAAfUXAAH1FwAAADgAAfUnAAH1JwAAADkAAfVUAAH1VAAAADoAAfarAAH2qwAAADsAAAABAAD/ygOhA0AAIACBtxMLAwMAAgFCS7AJUFhADAEBAAIAawACAgoCRBtLsApQWEAKAAIAAmoBAQAAYRtLsA5QWEAMAQEAAgBrAAICCgJEG0uwD1BYQAoAAgACagEBAABhG0uwFVBYQAwBAQACAGsAAgIKAkQbQAoAAgACagEBAABhWVlZWVm0HRQYAxIrARQPARMWFRQOAS8BBwYiJjU0NxMnJjU0NyU3NjIfAQUWA6EPyzABDBUM+/oNFQwBMMsOHwEYfgsgDH0BGCAB6QwPxf7pBAgLEAEHhIQHEgoECAEXxQ8MFQUo/hcX/igFAAACAAD/ygOhA0AACQAqAI1AEB0VDQkIBwYFAwEACwACAUJLsAlQWEAMAQEAAgBrAAICCgJEG0uwClBYQAoAAgACagEBAABhG0uwDlBYQAwBAQACAGsAAgIKAkQbS7APUFhACgACAAJqAQEAAGEbS7AVUFhADAEBAAIAawACAgoCRBtACgACAAJqAQEAAGFZWVlZWbcmJRgXExEDDysBNy8BDwEXBzcXExQPARMWFRQjIi8BBwYiJjU0NxMnJjU0NyU3NjIfAQUWAnqr62pp7Ksp09P+D8swARcKDPv6DRUMATDLDh8BGH4LIAx9ARggASKlI9XVI6Xrb28BsgwPxf7pBAgcB4SEBxIKBAgBF8UPDBUFKP4XF/4oBQAAAAIAAP+xA1oDCgAIAGgATkBLY1lMQQQABToJAgEANCgbEAQCASUBAwIEQgAGAAABBgBbAAECAwFPBwEFBAECAwUCWwABAQNTAAMBA0dcW1RRSkgrKiMgGRgTEggRKwE0JiIOARYyNiUVFAYPAQYHFhcWFAcOASciLwEGBwYHBisBIiY1JyYnBwYiJyYnJjQ3PgE3Ji8BLgEnNTQ2PwE2NyYnJjQ3PgEzMh8BNjc2NzY7ATIWHwEWFzc2MhcWFxYUDwEWHwEeAQI7UnhSAlZ0VgEcCAdoCgsTKAYFD1ANBwdNGRoJBwQQfAgMEBsXTwYQBkYWBAUIKAoPCGYHCAEKBWgIDhclBgUPUA0HCE0YGgkIAxF8BwwBDxwWUAUPB0gUBAQ7DglmBwoBXjtUVHZUVHh8BwwBEB4VGzIGDgYVUAEFPA0ITBwQCgdnCQw8BQZAHgUOBgwyDxwbDwEMB3wHDAEQGRogLQcMBxRQBTwNCEwcDwgIZwkMPAUFQxwFDgZNHBsPAQwAAAAABgAA/3IELwNJAAgAEgAbAHsAtwDzARVAM/Dn5NoEBBZrXgIFCdHJxr0EAAV2UwISAEYjAgEPtJ8CAgE7LgIGAjgBBwaWjYEDDQMJQkuwIVBYQFQRAQ8SARIPAWgAFgAEChYEWwAKCQAKTwAFEwEAEgUAWwACBgECTwsBCQgBBgcJBlsQAQEABwMBB1sAAwANDAMNWxQBEhIVUxcBFRUKQw4BDAwLDEQbQFIRAQ8SARIPAWgAFgAEChYEWwAKCQAKTwAFEwEAEgUAWxcBFRQBEg8VElsAAgYBAk8LAQkIAQYHCQZbEAEBAAcDAQdbAAMADQwDDVsOAQwMCwxEWUAs6+rm5eLgzMvIx8TCr66rqaelkZCMi4iGbm1mY1xaPj02MywqExQUFBMSGBUrATQmIgYUFjI2BTQmDgEXFBYyNgM0JiIGHgEyNgcVFAYPAQYHFhcWFAcOASMiLwEGBwYHBisBIiY1JyYnBwYiJyY1NDc+ATcmLwEuAT0BNDY/ATY3JicmNDc+ATMyHwE2NzY3NjsBMhYfARYXNzYyFxYVFA8BBgcWHwEeAQEVFAcGBxYVFAcGIyIvAQYiJw4BByInJjU0NyYnJj0BNDc2NyY1ND8BNjMyFhc3FzY/ATIXFhUUBxYXFhEVFAcGBxYVFAcGIyImJwYiJw4BIicmNTQ3JicmPQE0NzY3JjU0PwE2MzIWFzYyFzY/ATIXFhUUBxYXFgH0VHZUVHZUAa0sOCwBKjosASw4LAEqOizYCAVWBgwTHwQEDUILBgVAFRYGBwQNaAYKDRMXQgQNBlAEBSQIDQdVBQgIBVYHCxMfBAQMRAoGBkATGAYHAw1oBgoBDRMWQgUNBVEEGBEIDQZVBQgBZVMGChwCRAEFFR0LDAsHLAMBRAMdCgdTUwcKHQM0EAEEKggRERwXBAJDAhwJB1NTBgocAkQBBSoICwwLBywERAMdCgdTUwcKHQM0EAEEKggMCgwcFwQCQwIcCQdTAV47VFR2VFTjHSwCKB8dKioCWR0qKjsqKs1nBgoBDhMXGyUGDAQRQgQyCwY8Gw0IBlUGDDIEBEsPBQUILAwYFg0BCAdnBgoBDhMXGyUGDAQRQgQyCgg8Gg0IBlUGCzEEBEsPBQUeFQ0bEwwCCP7PTgkIDw4/DgICKBslAQELNAEoAgIOPw4PCAlOCQkQDT8OAgIeCTQMAQEoFwEnAgIOPw0QCQIzTgkJDw4/DgICJzQMAQEMNCcCAg4/Dg8JCU4JCBANPw4CAh4JNAwCAigXAScCAg4/DRAIAAP///+xA+gCwwAZADcARwA4QDUkGxIBBAMCAAEBAAJCAAUAAgMFAlsAAwAAAQMAWwABBAQBTwABAQRTAAQBBEc1PCsoOjgGFSslEQYHBgcOAisBIiYvASYnJicRFBYzITI2EzUvASYGJyEiBgcUHwEeBBczMj4DPwE+ATcRFAYHISImNxE0NjMhMhYDoRIVlVkcJDwbAho+ES5YlhUSDAYDNgcKAQIDAwQG/MoHCgFS4AQgEiAYDAILGh4UHgXgHjRHNCX8yiQ2ATQlAzYlNAsBrBQRckoYHBoaDiZKchEU/lQICgoCUg4OBQUCAwwGXkGxAhwOFggBChQQGgOxGFI1/aElNAE2JAJfJTQ0AAAABAAA/7EDTQL/AAYAFAAZACQAhEAWHhUCAgUdFgIDAhkDAgMAAwEBAQAEQkuwElBYQCcABQIFagACAwJqAAMAA2oAAAEBAF4GAQEEBAFNBgEBAQRSAAQBBEYbQCYABQIFagACAwJqAAMAA2oAAAEAagYBAQQEAU0GAQEBBFIABAEERllAEQAAISAYFxEPCggABgAGFAcQKxc3JwcVMxUBNCMiBwEGFRQzMjcBNicXASM1ARQPASc3NjIfARbLMoMzSAFfDAUE/tEEDQUEAS8DHuj+MOgDTRRd6F0UOxaDFAczgzM8RwIGDAT+0gQGDAQBLgRx6P4v6QGaHRVd6VwVFYMWAAAC//3/sQNfAwsAIwAwAEBAPQ0BAAEfAQQDAkICAQABAwEAA2gFAQMEAQMEZgAHAAEABwFbAAQGBgRPAAQEBlQABgQGSBUVIyQlIyQUCBcrATU0JgcjNTQmJyMiBgcVIyIGFxUUFjsBFRQWFzMyNjc1MzI2NxQOASIuAj4BMh4BAqcWDo8WDkcPFAGPDhYBFA+PFg5HDxQBjw4WsnLG6MhuBnq89Lp+ATpIDhYBjw8UARYOjxQPSA4Wjg8UARYOjhYydcR0dMTqxHR0xAAE//3/wgPVAwEALQA3AEEASwApQCZLR0JBPDgbEQ4HBQsAQAEBAAICAE8BAQAAAlMAAgACRyspEisDESsTJjYWHwEGFxYXHgE3MjcWNjceATc+AT8BNic1Fjc+ARcWBgcOAwcGIyEmJxMmNhYfARYGJicTPgEWHwEUBiYnEz4BFhcHDgEmJwEEJjQJNQ8BBh4HMigvGyJiGRtYHQwQAwUCARojMXgmIQQhPVYwRCwVLf6iVBVCBjY6CBUEKjIMeAI8QAQIODoBmARCOgEGBToyBAK8JSAWG7gdIx6uNDwBJScEJyUIHxAgFSEMHCYKIi1CGRhGFBlybnwfEgZwAZotKBgk0SksDiYBHykeICH4OyIqKQEAKxgmIf4vJigvAAADAAD/+QPoAn0AEQAiADMAN0A0CwICAwINAAIAAwJCAAUAAgMFAlsAAwAAAQMAWwABBAQBTwABAQRTAAQBBEcXFikVGBYGFSsBJicWFRQGIiY1NDcGBx4BIDYBNCYHIgYVFB4BNjU0NjMyNgUUBwYEICQnJjQ3NiwBBBcWA6FVgCKS0JIigFVL4AEE4P65EAtGZBAWEEQwCxAB2QtO/vj+2v74TgsLTgEIASYBCE4LATqEQTpDaJKSaEM6QYRyiIgBSQsQAWRFDA4CEgowRBDMExOBmpqBEyYUgJoCnn4UAAMAAP+9BCQDCwAIAB0ANAAsQCkmAAIBAAFCAAQCBGoFAQIAAAECAFsFAQICAVMDAQECAUcgGSk4GhIGFSsTNCYOAR4CNgEUBwEGIicBLgE9ATQ2NzMyFhcBFhcUBwEGIyImJwE2NCcBLgEjMzIWFwEW+io6LAIoPiYCVRT+7hY7FP5xFR4qHekdSBUBjxTXFf7uFh0UGhABBhUV/nEVSB19HUgVAY8VAlgeKgImQCQGMP7ZHhX+7hUVAY8VSB3oHSoBHhX+cRUdHhX+7hUQEQEGFTsVAY8VHh4V/nEVAAAAAgAA/7AD6ALDACUASwBIQEVJHAYDAAI/FxUTEg4GAQA7KQIDBANCNDICAz8AAQAEAAEEaAACAAABAgBbAAQDAwRPAAQEA1MAAwQDR0JAPjwjIiUjBRErARQOASMiJwYHBgcjIiY1JjQ2NT8CNgc3PgI3LgEnND4BMh4BFxQGBx4BHwEWHwMUBw4BJyYnJicGIyInFjMyNjc+ASc0Jx4BAxJqtGswMkZVFRsCBgwBAgEEAwMBHAUODgRFTgFqtNa0atZQRAUMCBsJBAUEAwECCggbFVVGMjCXcCARWqRCRUwBDUhUAaVNhEwJMRcFBAoHAQQEAQMGAwMBHgUYEhAodENOhExMhNxDdicOFgohCwMFBgoBAggKAQQFFzEJSgMyLzSGSisqJ3gAAAAABgAA/7EDEgMLAA8AHwAvADsAQwBnAExASQAOAAkIDglZDw0CCAwKAgYBCAZbBQMCAQQCAgAHAQBbAAcLCwdPAAcHC1MACwcLR2ZkYV5bWVRST0xJR0FAEzQTNTU1NTUzEBgrAREUBisBIiY1ETQ2OwEyFhcRFAYrASImNRE0NjsBMhYXERQGKwEiJjURNDY7ATIWExEhERQeATMhMj4BATMnJicjBgcFFRQGKwERFAYjISImJxEjIiY9ATQ2OwE3PgE3MzIWHwEzMhYBHgoIJAgKCggkCAqPCggkCAoKCCQICo4KByQICgoIJAcKSP4MCAgCAdACCAj+ifobBAWxBgQB6woINjQl/jAlNAE1CAoKCKwnCSwWshYsCCetCAoBt/6/CAoKCAFBCAoKCP6/CAoKCAFBCAoKCP6/CAoKCAFBCAoK/mQCEf3vDBQKChQCZUEFAQEFUyQICv3vLkRCLgITCggkCApdFRwBHhRdCgAD////sQOhAsQACAARADwAREBBKgEECAkAAgABAkIACAYEBggEaAAHAAYIBwZbAAQABQEEBVwDAQEAAAFPAwEBAQBTAgEAAQBHJiQnMywTFBMSCRgrBRQGIiY+AhYFFAYiJj4CFhMRFAYHBRceARQHITIWDgEjISImNTQ+ATUDIyIuATYXMzIeAx8BITIWAWUqOiwCKD4mAfYqOiwCKD4mShIO/bkDAgINAgEPFgISEf3FDhYMFmJyDxQCGA2PCQ4IBgICAwKeDhYHHioqPCgCLBweKio8KAIsAkP+4g0UAkQMCA4OGxYcFhYOCBwmAgHMFB4WAQYMEA4JDhYAAAAAAf///8oCpgLxAE8AQ0BACQEHBgoCAAEHAFsFAQEDAgFPAAgAAwIIA1sFAQEBAlMEAQIBAkcBAEhFPz44NS4sKScgHRcWEA0GBABPAU8LDysBIgYUFjcyNzYWFxUUBisBIiY3NjU0JiIGBxQXFgYnIyImJzU0NhcWMzI2NCYnIgcGJjc1NDY7ATI2JyY1NDYyFgcUBwYWNzMyFh0BFAYnJgJKJTY2JRYVGhYBMB+PEA4JFURiRAENEQoUjyEsARIWGBsmNjYmFRUaGAEuII8TDBEORmBGARUKEA+PHzAUFBgBkkRgSAINEQwSkB8uEhYZGiY0NCYWFhoWAS4fkBAOChREZEACDREKFFshLhQbFBgmNDQmGhkVFAEuIVsQDgoUAAAAAAUAAP/iA/oC2gA5AEEASwBjAGYAhkCDJAEEAjIvKyIEAQQeAQsBZkw1GxgFBQsXAQYFPQsCDAZCAQkMXVhUPAQICQhCAwECBAJqAAQBBGoAAQsBagALBQtqCgEICQAJCABoAAAAaQAFBwEGDAUGWwAMCQkMTQAMDAlSAAkMCUZlZGNgXFlWVVNQS0pJRzg2LSwpKCclISATDRArARYGByIvASY3PgEnDgMnLgE1NDc2NycOASc0JjUmNjM3NCc0MzI3Mh0BNjM2FxQWFRYPARUzMhYFFjcnBgcGFDc+AicmIyIGIyUWEhYUKwEiNScjBgcUKwEiNTYTNjsBMgMzAwPcHlBeCgIgAgRWPioQLkhkODRAPDJAAowMBAoCBgScAgguBgqeBggCCAQIsAxWfP6mHCIEIhosqBw8HggkPAIIAv4+ClZQBFYGMrAwAgZWBAqmAghgCoKQSAEyUrxCAiYGBDy4OCZMVC4IBkY6VEAyEGQYAgYCNgQCBBxuBAgCCGgWBAoCKgQKAh5mSOAGDNYMHCyCFhhYRgYSArIc/u74BgSmpAIEBBICFgj+vAEIAAUAAP+xA+gDCwAPAB8ALwA/AE8APEA5AAkHAAlPAAcFAAdPAAUDAAVPAAMBAANPAAEAAAFPAAEBAFMIBgQCBAABAEdOSzU1NTU1NTU1MwoYKzcVFAYrASImPQE0NjsBMhY3FRQGKwEiJj0BNDY7ATIWNxEUBisBIiY1ETQ2OwEyFjcRFAYrASImNRE0NjsBMhYTERQGKwEiJjURNDY7ATIWjwoIawgKCghrCArWCghrCAoKCGsICtYKB2wHCgoHbAcK1woIawgKCghrCArWCghrCAoKCGsICi5rCAoKCGsICgpAswgKCgizCAoKh/6+CAoKCAFCCAoKzv3oCAoKCAIYCAoKARb8yggKCggDNggKCgAAAAIAAP+JBLEDMgAxAGUAMkAvW1BJPz02NB0QAAoBAgFCAAACAGoAAgEBAk8AAgIBUgMBAQIBRlJROjkxMBcVBA8rNTY/ATY3PgE3NCcmJyY1NDcmJyY+ATcyHgIHBgcWFRQHBgcGFRQWFx4CFx4BFRchATQ3JicmPgEeAgcGBxYVFAcGBw4CFxQWFx4CFxUjNTQuAicuASc2NTQvASYnJicmFChFHRUlKAEfEw4tDgUEBT5qOStUPiIDBAQOLQ8RICgmHX5kEBIUAfySAsEMBQIEMlhcVjQEAgYMJAwPCQgKASIeETJGD/4GCBYMFzwxGwUIAwkODSUxBw8aCwsTSicbJRUnEjorEicrN2o+ASY+Uio3GxMqOhIpEyUbJ0oTDy4oEhE8FRUB0yIQICMtWDgCNFwrIyAQIjAOIREKDBQKIDwQCRQYB4cLByYiKgwZJhIiLAoKEAYKDyIQAAT/+v+aA/MDGgArADcAVgBeACVAIllYQD8EAD8EAQMCA2oAAgECagABAAFqAAAAYREVExwTBRQrEw4BFCMHBgcGLwEmNz4BNzYyPgE3Mj4BNzY3MhcyBwYHBhcWFxYPAQYnLgEXARYPAQYnASY/ATYlFgcGJyYPASc3PgEmNzY3NhYHBgcGFhcWNz4BNzYWATcXBwYvASabCAYCEQ8EEAxGCw0CIAQGKh4IBgIOJhaGNHoaDBR4IFAsIgQICkwOBCo6+AGaEhQwFhD+YggISAwCMhAgMmg4LFJERBgOAgYMgAwMBAwiDgQmOiYGKAIEEvyo/kz2FBIuFgH6CBwWDw0EDhJMDAwCGAQGHDAGDh4QWgYCCDQYODouAggGRggEMBgy/iQWECoOEgHYCAw+CMBoPlgaDCxOTkYYOkgWODgGEgYMRAoyHCg+DDoECgL9RPhW8hQQLhIAAgAA/7EDWwMLACQARwBQQE1DJQIGCT08LwMFBhcCAgMCCAEBAwRCAAgABgUIBlsACQcBBQIJBVsAAwEAA08EAQIAAQACAVsAAwMAUwAAAwBHRkUlNSU1NSY1FCQKGCsBFBUOASMiJicHBiImPQE0NjsBMhYGDwEeATMyNjc2NzY7ATIWExUUBisBIiY2PwEmIyIGBwYHBisBIiY3NT4BMzIWFzc2MhYDSyTkmVGYPEgLHBYWDvoOFgIJTShkN0qCJwYXBQxrCAoOFBD6DhYCCU1ScEuCJwYXBQxvBwwBJOaZUZo8SAscGAEFAwGWuj45SAsWDvoOFhYcC00lKEo+CjgNDAG4+g4WFhwLTU1KPgo4DQwGBJa6PjlICxYAAAAAAv///8MD6QKxABgAMQA/QDwlAQUGAAEAAwJCAAYABQIGBVsAAgQBAk8ABwAEAwcEWwADAAABAwBZAAICAVMAAQIBRxMlIxYjFxQUCBcrJRUUBgchFRQGByIvASY0PwE2MhYdASEyFgMUDwEGIiY9ASEiJjc1NDYzITU0NjIfARYD6AoI/QAKCAYHsgUFswUPCgMABwwBBbMFDwr9AAcMAQoIAwAKDgeyBb1rBwoBawcKAQayBRAFsgUKCGsKASgIBbMFDAZrDAZrCAprCAoFsgUAAAAC////+QQZAwsAEgApAFi3HRsaAwABAUJLsAlQWEAeAAMEBANeAAQAAgEEAlwAAQAAAU8AAQEAUwAAAQBHG0AdAAMEA2oABAACAQQCXAABAAABTwABAQBTAAABAEdZtiM6IzY1BRQrARQPAQ4BIyEiLgE/AT4BMyEyFicVISIGDwInJjcRNDY7ATIWHQEhMhYEGRK7GFYm/aETHAERvBhWJQJfEx7A/jA1ciO8AgEBAUozszNKAS8zSgE/EhPdHCgOIhTdHCgOr1o0Kd0DBwUCAhgzSkozEkoAAAAAAv/8/34D2ANKAA0AHwAItR8UCAECKCs3Nh4CBwYHBjc0Nz4BARYABwYHBicmJyYnJjc2NzYAdiZeUgwkVo5UBAY0GANsGv6kdiZWCAgSHiAiEAhAKHYBxKoiClBeJFQSDBoEBjyqAqga/kR0JkIGDiIeIBAGClQmdAFWAAQAAP+6AoADAgAsADUAPgBHAE9ATCAfFhUMBQYDAUICAQEIAQQDAQRbCgcCAwAGBQMGWwkBBQAABU8JAQUFAFMAAAUAR0A/NzZEQz9HQEc7OjY+Nz40MzAvKyobGhEQCw8rARQHDgMHDgMHFhUUBiImNTQ3ESY1NDYyFhUUBxU2Nz4CNyY1NDYyFgUUFjI2NCYiBhMyNjQmIgYUFgEyNjQmIgYUFgKASgYsTjouKio0GARGRmRGSEhGZEZIKGI6NDIERkZkRv20KDgqKjgoRBwqKjgoKAGsHCoqOCgoAopQHjpWNBgODhAgMCQeUDJGRjJOIgF6IkwyRkYyTCLMHh4SFjwuIEwyRkYyHCgoOigo/UYoOigoOigCWCg6KCg6KAAAAAADAAD/+QNaAsQADwAfAC8ANkAzKAEEBQgAAgABAkIABQAEAwUEWwADAAIBAwJbAAEAAAFPAAEBAFMAAAEARyY1JjUmMwYVKyUVFAYHISImJzU0NjchMhYDFRQGJyEiJic1NDYXITIWAxUUBgchIiYnNTQ2FyEyFgNZFBD87w8UARYOAxEPFgEUEPzvDxQBFg4DEQ8WARQQ/O8PFAEWDgMRDxZkRw8UARYORw8UARYBEEgOFgEUD0gOFgEUAQ5HDxQBFg5HDxYBFAAAAAADAAD/uQQWAroAFAAkADkAJUAiLhECAAEBQgMBAQAAAU8DAQEBAFMCAQABAEc1NCgnFxIEESslBwYiJwEmNDcBNjIfARYUDwEXFhQBAw4BLwEuATcTPgEfAR4BCQEGIi8BJjQ/AScmND8BNjIXARYUAVgcBQ4G/vwGBgEEBRAEHAYG29sGAUTQAg4GIggGAdADDAcjBwgBbP78Bg4GHAUF29sFBRwGDgYBBAVFHAUFAQQGDgYBBAYGHAUQBNzbBg4CTv0vBwgDCQMMCALQCAYBCgIO/o7+/AUFHAYOBtvcBQ4GHAYG/vwFEAAAAAIAAP+cA+gDIAAoADQARkBDHhwUExAFAgcFAQAEAkIAAQcBagAABABrAAcCBAdNBgECBQEDBAIDWQAHBwRRAAQHBEU0MzIxMC8uLSwrKikZGBMIECslFh0BITU2Nz4BNTQmJy4BJzQ2PwEmJyY2MhYPARYVDgMHDgEVFBYlMxUjFSM1IzUzNTMCbLT84CQuXkYuCAIqBAoEBAgEBlzkXAQOEgIODg4CCi5IAUSWlmSWlmSAQDpqyg4MIkY8FjQwDBowEBQCBDImNnR0NlgIIhweBAwMLjYWPEbuZJaWZJYAAf/+/7EDWQMLADAAPEA5LQEBBQkBAAECQgAAAQMBAANoAAMCAQMCZgAFAAEABQFbAAIEBAJPAAICBFMABAIERycnEyckMwYVKwEVFAYrASImPwEmIyIOAh4DMzI2Nz4BHwEeAQcOAQciLgI+AzMyFhc3NhYDWRQQ+hcTEU1ScDpqTDAEKFRiPkJ2KQQRBkwFAgY8rl9XoHBIBEB4mFtSmD1IEC0Cw/oOFi0QTU0uTGp0akwuOjUGAQVNBA4GSlABRHSerp50RD45SBITAAAAAAMAAAAAA+gCtgAWADAARwBlQA07MzEmHA4MBAgBAAFCS7ATUFhAIQACAAACXgUBAQADAAEDaAQBAAEDAE8EAQAAA1IAAwADRhtAIAACAAJqBQEBAAMAAQNoBAEAAQMATwQBAAADUgADAANGWbcbJhsbKSkGFSs9ATQ/ASYnNDc2NzIXBhcGDwEGBxUjIhc1ND8CLgE3NDYyFhUUBx8BFh0BBgchLgEBNic2NzIXFhUUBxcWHQEUByM1NC8BJhKrQgIjJTUfIDFIDA1yMARyGb8WmDklLgFcgFpOPZIYAiP94w4UAdlELh8jMSkjQagSG3Yybg9qhhoGUCdcOC8pAhN9cAsINxc9jxmoGwpGHBdWM0xsbExqNB5GChuoJQQCGAFZan0TAispPlIxUAoWhiACjzkbNQgAAAH//P/MA4gC8gAaACpAJwQBAAUCBQACaAMBAQIBawAFAAIFTwAFBQJRAAIFAkUUIyERJCIGFSsBFgYrAREUDgErAREjESMiJjURIyImNwE2MhcDeBAKFlQCDhDMzMIcDlQWChABkBAsEAFQEBb+yg4ODAE2/soUFAE2FhABkhAQAAAAAAMAAP+fA48DHgAUACgAPABtQGonAQkEAUIQCgIECQEETxMLAgkIAQYPCQZZFBECDw4BDAMPDFkSBQIDAgEAAQMAWRAKAgQEAVMNBwIBBAFHKSkVFQAAKTwpPDk4NTQzMi8uKyoVKBUoJSQhIB8eGxoXFgAUABQjERMTERUUKyUVIxUUBiImPQEjNTMRNDY3MhYHEQEVIxEUBiImNREjNTM1ND4BFgcVBRUjERQGIiYnESM1MxE0PgEWFRECQDciLCI4OCIVGCIBAYY3IDAgODggLiQC/Zk3IC8gATg4IDAg73CnFyIiF6dwAfcYHgEgF/4JAU9w/goXIiIXAfZwqBgeAiIWqHBv/nkXIiIXAYdvARgYHgIiFv7oAAAAAgAAAAADjwKtAAQACQAiQB8JBgUEAQAGAQABQgAAAQEATQAAAAFRAAEAAUUUEgIRKwElNSEVASURIREB0/4/A33+RAG8/IMBbtJtbf6z0v5LAbYAAgAA/8IDIgLqABEAGgArQCgRAQIDBgEAAgJCAAEAAwIBA1sAAgAAAk8AAgIAUwAAAgBHExcTJwQTKyUWDwEGLwEGIyImEDYgFhUUByUUFjI2NCYiBgMEHhguJCC+SlKAvrQBAMAu/hiIsH6IsH5OIhwuICC+Kr4BALa+gFhKqliIfrKGfgAAAAEAAP9qA+gDUgBEAElARgsBCQoHCgkHaAQBAgADAAIDaAwBCAUBAQAIAVkNAQcGAQACBwBbAAoKCkMAAwMLA0RBQD08Ozk0My4sExcTESUVIRMUDhgrARQPAQYiJj0BIxUzMhYUDwEGIi8BJjQ2OwE1IxUUBiIvASY0PwE2MhYdATM1IyImND8BNjIfARYUBisBFTM1NDYyHwEWA+gLjgseFNdIDhYLjwoeCo8LFg5I1xQeC44LC44LHhTXSA4WC48LHAuPCxYOSNcUHguOCwFeDguPCxYOSNcUHguOCwuOCx4U10gOFguPCxwLjwsWDkjXFB4LjgsLjgseFNdIDhYLjwoAAv/4/7YD7AMIAAYAIwBtswABAEBLsAtQWEAoAgEABABqCAEEAQRqAAEFAWoHAQUGBgVeAAYDAwZNAAYGA1QAAwYDSBtAJwIBAAQAaggBBAEEagABBQFqBwEFBgVqAAYDAwZNAAYGA1QAAwYDSFlACxEiEiEWNxEREQkYKwEFIxEjESMBHgEPAQ4BIyEiJi8BJj8BMwczMh8BITc2OwEnMwH0AQSkvqYC2BISBhwEJBb80BYkBBwKKp5iqrIIBCgBLCgIBLKqYgMI9P8AAQD+sgosEpoUGhoUmjAYbIIIbm4IggAAAQAAAAAD6AKkAB0ARUBCHAkCBQAUAQIFAkIABgAGagcBAAUAagAFAgVqAwECAQECTQMBAgIBVAQBAQIBSAEAGhgTEQ4MCwoIBwYEAB0BHQgPKwEyFhQGKwE1MycHMxUjIiY0NjMyFyY1NDYzMhYXNgL4ZIyMZL5qsK5o+EpsakwOBgKcblqMGBwB7ojEiL7m5r5okmgCDBpsmGhSBAAAAAL/+v9wAxoDVgAZAC0AD0AMEgEAPwAAAGErKgEPKwEWBgcGJw8CBg8BBiYvASY3ASYnJjY3NhYHNi4BBgcOAR8BHgEfAR4CMj4BAwYUYGZCQHZGaA4gTAwUAhAIFAECGA4SjnJqsmweElRkHggIAwUCFgdDEA4YDhQQAmR0xhIMCsIMphwEDgQQDmIeGgGCMkZqohQUgrwsaj4ULAwWCRAHFAUxDAgQAg4AAAAIAAD/kgOYAyoADwAbACcANwBCAE4AXQBpAIVAgiQgBgMBAlxZTzQwJh4YDAgECwMBTS4aEg4CBgYAVUM8NigFBAVoXkdFPjgUBwcEBUIIAQADBgMABmgABgUDBgVmAAUEAwUEZgAEBwMEB2YAAgkBAQMCAVsAAwAHA08AAwMHUwAHAwdHHRwBAGdlV1ZMSjs6MzEjIRwnHScADwEPCg8rEyIHJic2NxYXBhUUFwYHJgcUFwYHJjU0NxYXBgEiByYnNjMyFwYHJhMmJzY1NCc2NxYzMjcWFwYXNjc2NwYHNjU0JicGByYnNjcWMzI3FgEWFRQHBgcmJyYnNj0BNgMWFxYVFAcGIyInNuAWFDAsNkpcPAYEPjYQbhQ8FEIyJi4IAVAcFjo4VE54bkxWGmqgggQOJjwaHg4YXigQdiYQOjIueAYClr5yWkQMRAYOHhaOAWCWBEBCGEAwZApkGg4SAg5WbDo2bgH4CjRMSiwmLBAQBhAwOARiIhpydmqCbmA+MhgBMA4qHB4+DiQa/jQYWBQKGBwsLhQIbIQOlg4uBA6SVjAyCiRMYLAkSpCCAg5iAdKIzBYsEgY4BJJ2FBYKKv3sCggSIlBAKgygAAAAAAP//P+QA5oDLAAIABMAKQBhQF4MAQMCIyIYFwQFBwJCAAcGBQYHBWgABQQGBQRmCAEACQECAwACWwADAAYHAwZbCgEEAQEETwoBBAQBVAABBAFIFRQKCQEAJiQgHhsZFCkVKRAOCRMKEwUEAAgBCAsPKwE2ABIABAACABciBhUGFjMyNjU0AzI2NycGIyI/ATYjIgYHFzYzMg8BBgHGvgEQBv72/oT+7gYBDPIqLgIiICYutB5sNBIwGA4KKhowHnY4EDQWDAwkGgMqAv74/oT+7gYBCgF8ARKWMBocICwgOv2uNDQYJCagYDouGiIimGgAAAAD//z/kAOaAywACAAWAD8AVUBSEwECAwFCAAYEBQQGBWgABQcEBQdmCAEAAAQGAARbAAcAAwIHA1wJAQIBAQJPCQECAgFUAAECAUgKCQEAODcnJiIhHRsRDgkWChYFBAAIAQgKDysBNgASAAQAAgATMjY1NiYrASIGBxQWFxM2NTQmIyIHBgcVMzU0NzYyFxYVFAcGDwEGDwEGBwYHFTM1NDc2PwE2Aca+ARAG/vb+hP7uBgEMvB4mAiYeAhwmAiYcqBpqUkAoRARuEBBODBAQCAwWCgoVCwYOBGwEBhYcLgMqAv74/oT+7gYBCgF8ARL9HiYcHiYkHB4mAgFIIixOTBoqaAQEGhwYFBQYEhYMCA8HCBEJCBQ6CAQMEBQQEiIAAAAAAgAA//kDawLDACcAQAA6QDcTAQIBAUIABAMAAwQAaAABAAIGAQJbAAYABQMGBVsAAwQAA08AAwMAUwAAAwBHFiMYNSk1JwcWKyUUFg8BDgEHIyImNRE0NjsBMhYVFxYPAQ4BJyMiBgcRFBYXMzIeAgEUBwEGIiY9ASMiJj0BNDY3MzU0NhYXARYBZQIBAgEICLJDXl5DsggKAQEBAgEICLIlNAE2JLQGAgYCAgYL/tELHBb6DhYWDvoWHAsBLwsuAhIFDgkEAV5DAYhDXgoICwkGDQcIATYk/nglNAEEAggBLA4L/tAKFA+hFg7WDxQBoQ4WAgn+0AoAAAAAAQAA/7YDiAMSABYAGkAXCwEAAQFCDgEBQAABAAFqAAAAYRgcAhErATYWBw4CLgIGBxMjAzc+AR4DNgNqDhAIYIhUPjpEdlBaZLhcWnxIOERaqAJoBg4MipYeGjAgKEL+oALQIkIoIkRKMgoAAf/5/3sD+ANYACUAD0AMHh0CAEAAAABhEQEQKyUGJCcmAjc+ATc2FhceAQcGBwYCFxYkNz4BJyYkBzU2BBcWAgcGA1eX/mqUjw6BCBEKHEAZFggOBgppBmd6AThsUC0wQ/7kn7cBR040KVMQCY0OjJUBhJ4KEgYRBxcYPBwMCnb+3mxxHXZe73aWejIBO4qtf/78ahYAAAADAAD/agIwA1IAGwAoAGIARkBDNTICAgM2AQQCSgEGBVhNAgAGBEIABQQGBAUGaAACAAQFAgRbAAMDAVMAAQEKQwAGBgBTAAAACwBEU1IaGyQnHRoHFSsBFA4BFB4BHQEUBiImPQE0PgE0LgE9ATQ2MhYVBQcGFxYzMjc2JyYjIhM0PgI/ATY1NwYiJxcUHwMWJhYjFA4CDwIGJgY1Bh0BPgI1NDIVFB4BFzU0LwImLwEuAQIwYGJiYKzYrGBiYmCu1K7+HhIECFx8hFgOHmBqeJAIHAwZHVwCZPRkBFotExERDB4MAgoGCAwPDwIiWgh0RDRCegZcKxINBQwHBAJuLGhePFxmLnYiTk4idi5mXDxeaCx2IE5OIAYOCAY0MgoUNv5KEh4kDhgcXB4yNjYyIForExUVAjAKEhIOCg8QEAIiAVogQgQmMCIeHiIwJgRCHlwpEw4IFAwWAAACAAD/+QOgAwsALgBDANi1PAEFBwFCS7AKUFhAPAAIAQMBCANoAAIDBwMCYAAHBQMHBWYABQYDBQZmAAYEAwYEZgABAAMCAQNbAAQAAARPAAQEAFQAAAQASBtLsAtQWEA3AAgBAgEIAmgABwIFAgcFaAAFBgIFBmYABgQCBgRmAAEDAQIHAQJbAAQAAARPAAQEAFQAAAQASBtAPAAIAQMBCANoAAIDBwMCYAAHBQMHBWYABQYDBQZmAAYEAwYEZgABAAMCAQNbAAQAAARPAAQEAFQAAAQASFlZQAsUFxUnNTImNTMJGCsBFRQGIyEiJjURNDY3ITIXHgEPAQYjIicmIyEiBgcRFBYXITI2PQE0PwE2MzIXFhMBBiIvASY0PwE2Mh8BATYyHwEWFAMSXkP+MENeXkMB0CMeCQMHGwYHAgMNDP4wJTQBNiQB0CU0BSQGBwMEC4H+OQ0kDvAODj0OJA6TAWkNJA4+DQFLsUNeXkMB0EJeAQ4EEwYcBQEDNCX+MCU0ATYkjQgFIwYCBAEF/joODvANJA4+DQ2TAWkNDT0OJAACAAD/+QMTAwsADwAfACpAJwADBAEAAQMAWwABAgIBTwABAQJTAAIBAkcCAB4bFhMKBwAPAg8FDysBISIGBxEUFhchMjY1ETQmFxEUBiMhIiY1ETQ2NyEyFgJx/jAlNAE2JAHQJTQ0fF5D/jBDXl5DAdBCYALDNCX+MCU0ATYkAdAlNFn+MENeXkMB0EJeAWAAAAAAAv/9/7EDXwMLACQAMQAvQCweFQwDBAIAAUIABQEBAAIFAFsDAQIEBAJPAwECAgRTAAQCBEcVFxQcFBkGFSslNC8BNzY0LwEmIg8BJyYiDwEGFB8BBwYUHwEWMj8BFxYyPwE2NxQOASIuAj4BMh4BAoEKZWUKCjMKHgplZQseCjILC2VlCwsyCh4LZWUKHgozCthyxujIbgZ6vPS6fuAOC2VlCx0LMgsLZWULCzILHQtlZQsdCzILC2VlCwsyC411xHR0xOrEdHTEAAAABgAA//kD6AMLAAMABwALABsAKwA7AF5AWywBBQs0AQoEHAEDCRQBBgAEQgALAAUECwVZAAQACgkEClsACQADAgkDWQACAAgHAghbAAcAAQAHAVkAAAYGAE0AAAAGUwAGAAZHOjcyMCooJiYlEREREREQDBgrJSE1ISchNSElMzUjARUUBgchIiYnNTQ2FyEyFhMVFAYnISImJzU0NjchMhYTFRQGByEiJic1NDYzITIWAjsBZv6a1gI8/cQBZdfXAR4WDvxgDxQBFg4DoA8UARYO/GAPFAEWDgOgDxQBFg78YA8UARYOA6APFEBI1kfXR/3ojg8UARYOjg8WARQBDo8OFgEUD48PFAEWARCPDxQBFg6PDhYWAAH/+f+xAxgCwwAUAB5AGw4DAgABAUIAAQAAAU8AAQEAUwAAAQBHOCcCESsBFgcBERQHBiMiLwEmNREBJjYzITIDDwkR/u0WBwcPCo8K/u0SExgCyhcCrRcQ/u3+YhcKAwuPCg8BDwETEC0AAAL///+xA+gCwwAZADYAKkAnCQACAgMBQgADAAIBAwJbAAEAAAFPAAEBAFMAAAEARzUyJiQ6MwQRKwERFAYHISImNxEWFxYXHgI3MzI+ATc2NzY3FAYHBg8BDgInIyIuAS8CJicuASc0NjMhMhYD6DQl/MokNgEZH8pMICZEGwIcQigfX7cgGDYp0jQ1DCIgCwIMHiQLNZNgEiM8AS4rAzYkNAHG/kUlNAE2JAG7HBWJNxgaHAEaHBdEfBa/LFAdkiMnCRIMAQoUCCdlQg4XUiQrOjQAAQAA/7ED6AMLAFUAS0BIAAwNAQsKDAtbDgEKBgECAQoCWQ8JBwUDBQEAAAFPDwkHBQMFAQEAUwgEAgABAEdUUk9NTEpFQj07Ojg1MzUhESU1IRElMxAYKyUVFAYrASImPQE0NhczNSEVMzIWFxUUBisBIiYnNTQ2FzM1IRUzMhYdARQGKwEiJic1NDYXMzU0NhchNSMiJic1NDY7ATIWFxUUBicjFSEyFgcVMzIWA+ggFrIWICAWNf7jNRceASAWshceASAWNf7jNRYgIBayFx4BIBY1Kh4BHTUXHgEgFrIXHgEgFjUBHR0sATUXHpqzFiAgFrMWIAFrax4XsxYgIBazFiABa2seF7MWICAWsxYgAWsdLAFrHhezFiAgFrMWIAFrKh5rHgADAAD/agOhAwsAAgAFADcAPUA6MwEBBgMCAgABAkIJAQcGB2oIAQYFAQEABgFbCgEABAECAwACXAADAwsDRDY0Ly4TMyUjIzMkExALGCslIREJASEBFRQGKwEVFAYrASImPQEhIiY1ESMiJj0BNDY7ATU0NjsBMhYdASE3NjIWFA8BETMyFgE3AUz+mwFM/rQCgwoIfQoIawgK/h4ICn0ICgoIfQoIawgKAduJBRAKBYp9CAqIAUz+zQFM/olrCAp9CAoKCH0KCAHiCghrCAp9BwoKB32KBQsOBon+JQoAAAT///+xBC8DCwAIAA8AHwAvAElARhQBAQMPAQABDg0MCQQCABwBBAIEQgACAAQAAgRoAAYAAwEGA1sAAQAAAgEAWwAEBQUETwAEBAVTAAUEBUc1OTUlExMSBxYrARQOASY0NjIWARUhNTcXASUhIgYHERQWMyEyNicRNCYXERQGByEiJjcRNDY3ITIWAWU+Wj4+Wj4CPPzusloBHQEe/IMHCgEMBgN9BwwBClE0JfyDJDYBNCUDfSU0AhEtPgJCVkBA/v76a7NZAR2hCgj9WggKCggCpgcME/1aJTQBNiQCpiU0ATYAAAACAAD/sQMTAwwAHwAoAFZLsBBQWEAgAwEBBQQCAWAABQAEAgUEWwACAAACTwACAgBUAAACAEgbQCEDAQEFBAUBBGgABQAEAgUEWwACAAACTwACAgBUAAACAEhZtxMZIxMpMgYVKyUUBiMhIiY1ND4FFzIeAjI+AjMyHgUDFAYiJj4BHgEDElJD/hhDUgQMEh4mOiEFJixMSkowIgciOCgcFAoGtH6wgAR4uHZCQ05OQx44QjY4IhoCGB4YGB4YFiY0Oj48AdZYfn6wgAJ8AAAAAwAA/8MD6ANAABIANwBxAU9ADwABAAEpAgIFBicBAwQDQkuwCVBYQCYKAQEHAQAGAQBbCQEECAEDAgQDWwAFAAIFAlcABgYLUwALCwoGRBtLsApQWEAsCgEBBwEABgEAWwALAAYFCwZbAAUEAgVPCQEECAEDAgQDWwAFBQJTAAIFAkcbS7AOUFhAJgoBAQcBAAYBAFsJAQQIAQMCBANbAAUAAgUCVwAGBgtTAAsLCgZEG0uwD1BYQCwKAQEHAQAGAQBbAAsABgULBlsABQQCBU8JAQQIAQMCBANbAAUFAlMAAgUCRxtLsBVQWEAmCgEBBwEABgEAWwkBBAgBAwIEA1sABQACBQJXAAYGC1MACwsKBkQbQCwKAQEHAQAGAQBbAAsABgULBlsABQQCBU8JAQQIAQMCBANbAAUFAlMAAgUCR1lZWVlZQBZubWpoW1hTUEJAPTw0MzAvMxU1KAwTKwEGBycuAycjIiY9ATQ2OwEyARQPAQYiJj0BIyIGLwEuBSc2Nx4ENzM1NDYyHwEWERQPAQYiJj0BIyIOAgcGBw4CDwEOAicjIiY9ATQ2OwEyPgI3Nj8BPgU3MzU0NjIfARYBdCIrFAgeGi4WfQgKCgh9iwLOBbMFDwowHh4aJw0uGCgaJA0hKwwQHhosGI8KDgeyBQWzBQ8KjxssIBoMEhkQGCQSKRc2QiZ9CAoKCH0bKiQUEBEaHAwkJC42QCiPCg4HsgUCRjRlKRAmGgwCCghrCAr9xQgFswUMBmsCAgMBCgoWFiYUNGQZHioUFAJrCAoFsgUB7AgFswUMBmsQIiQZIj0lMkQVLxoYFgEKCGsIChIgJBkjPT4aQDAsIBABawgKBbIFAAAAAgAA//kCgwMLAAcAHwAnQCQABAABAAQBWwUDAgACAgBPBQMCAAACUwACAAJHIxMlNhMQBhUrEyE1NCYOARcFERQGByEiJicRNDYXMzU0NjIWBxUzMhazAR1UdlQBAdAgFv3pFx4BIBYRlMyWAhIXHgGlbDtUAlA9of6+Fh4BIBUBQhYgAWxmlJRmbB4AAAAAAwAA/7oDmANJABwAOQBaANpAGjgBCQVVRQIABBMLAgEHA0JUKwIJRAYCBwJBS7AKUFhAMAAFAwkEBWAAAQcCAAFgAAkAAAcJAFsABAAHAQQHXAACAAYCBlcAAwMIUwAICAoDRBtLsCFQWEAyAAUDCQMFCWgAAQcCBwECaAAJAAAHCQBbAAQABwEEB1wAAgAGAgZXAAMDCFMACAgKA0QbQDgABQMJAwUJaAABBwIHAQJoAAgAAwUIA1sACQAABwkAWwAEAAcBBAdcAAIGBgJPAAICBlMABgIGR1lZQA1XVhcXGigXGBkoFAoYKyU0LwEmIgcXHgEfARQGByIuAS8BBhQfARYyPwE2ATQvASYiDwEGFB8BFjI3Jy4CNTQ2FzIeAR8BNgEUDwEGIi8BJjQ3JwYiLwEmND8BNjIfARYUBxc2Mh8BFgMsD3QQLhAWAwwBAiAWCA4OBBYTEHMPLRBSD/54D3MQLBBSEBB0Dy4RFwMKBB4XCQ4OAxcSAfQwUi6HLnMuMTEwhy90Ly9SL4Yvci8xMTCHL3QvqxcPdBASFgMQBg8XHgEECgQWES4PdA8PURABnxYQcxAPUg8sEHQPERcDDg4JFiABBAoDFxH+jkMuUS8wcy+HMDExL3Qvhi5SLi90LogwMTEvdC8AAwAA/3YDoAMLAAgAFAAuAHZAFCYBBQQnFRIDAwUJAQADAAEBAARCS7AqUFhAIwAFBAMEBQNoAAADAQMAAWgABAADAAQDWwABAQJTAAICCwJEG0AoAAUEAwQFA2gAAAMBAwABaAAEAAMABANbAAECAgFPAAEBAlMAAgECR1m3HCMtFBMSBhUrNzQmDgEeATI2JQEGIi8BJjQ3AR4BJRQHDgEnIiY0NjcyFhcWFA8BFRc2PwE2MhbWFB4WAhIiEAFq/oMVOhY7FRUBfBZUAZgMG4JPaJKSaCBGGQkJo2wCKkshDwodDhYCEiAUFPr+gxQUPRQ7FgF8N1TdFiVLXgGS0JACFBAGEgdefTwCGS0UCgAD//3/sQNfAwsAFAAhAC4ANEAxAAIDAQMCAWgABgADAgYDWwABAAAEAQBcAAQFBQRPAAQEBVMABQQFRxUWFRUzJTMHFisBFRQGKwEiJj0BNDY7ATU0NjsBMhYXNC4BDgMeAj4BNxQOASIuAj4BMh4BAfQKCLIICgoIfQoHJAgK6FKKpoxQAlSIqoZWe3LG6MhuBnq89Lp+AiL6BwoKByQICsQICgrMU4pUAlCOoo5QAlSKU3XEdHTE6sR0dMQAAAAD////sANZAxAACQASACMAKkAnCwoDAgQAAQFCAAMAAQADAVsAAAICAE8AAAACUwACAAJHFxkmJAQTKwE0JwEWMzI+AgUBJiMiDgEHFCUUDgIuAz4EHgIC3DD+W0xaPnBQMv3SAaVLXFOMUAEC3ERyoKyicEYCQnSesJx2QAFgWkr+XDIyUHJpAaUyUJBQW1tYoHJGAkJ2nLSaeD4GSmymAAAAAAEAAAABAAAFbmD6Xw889QALA+gAAAAAzuIE8QAAAADO4cyx//j/agSxA1gAAAAIAAIAAAAAAAAAAQAAA1L/agBaBLEAAP/mBLEAAQAAAAAAAAAAAAAAAAAAADwD6AAAA6AAAAOgAAADWQAABC8AAAPoAAADWQAAA1kAAAPTAAAD6AAABC8AAAPoAAADEQAAA6AAAAKmAAAD6QAAA+gAAASxAAAD6AAAA1kAAAPoAAAELwAAA8IAAAKAAAADWQAABC8AAAPoAAADWQAAA+gAAAOEAAADoAAAA6AAAAMVAAAD6AAAA+gAAAPoAAADDAAAA5gAAAOYAAADmAAAA6AAAAOEAAAD6AAAAjAAAAOgAAADEQAAA1kAAAPoAAADEQAAA+gAAAPoAAADoAAABC8AAAMRAAAD6AAAAoIAAAOgAAADoAAAA1kAAANZAAAAAAAAAHgBBgHKA6wENAS2BRwFrAYcBowHIgfaCFoI7AnECk4K/AuoDDgMog0QDU4N4A5GDrwPLA+UEDAQchEAESoRbhHwEmISshMIE/AUahT8FXoVsBX8FqoXfBfGGCwYuBjuGVgZ7BpcGtAbOBx8HMQduh5CHqIe8wAAAAEAAAA8APQACAAAAAAAAgAwAD0AbgAAAMcJkQAAAAAAAAASAN4AAQAAAAAAAAA1AAAAAQAAAAAAAQAIADUAAQAAAAAAAgAHAD0AAQAAAAAAAwAIAEQAAQAAAAAABAAIAEwAAQAAAAAABQALAFQAAQAAAAAABgAIAF8AAQAAAAAACgArAGcAAQAAAAAACwATAJIAAwABBAkAAABqAKUAAwABBAkAAQAQAQ8AAwABBAkAAgAOAR8AAwABBAkAAwAQAS0AAwABBAkABAAQAT0AAwABBAkABQAWAU0AAwABBAkABgAQAWMAAwABBAkACgBWAXMAAwABBAkACwAmAclDb3B5cmlnaHQgKEMpIDIwMTMgYnkgb3JpZ2luYWwgYXV0aG9ycyBAIGZvbnRlbGxvLmNvbWZvbnRlbGxvUmVndWxhcmZvbnRlbGxvZm9udGVsbG9WZXJzaW9uIDEuMGZvbnRlbGxvR2VuZXJhdGVkIGJ5IHN2ZzJ0dGYgZnJvbSBGb250ZWxsbyBwcm9qZWN0Lmh0dHA6Ly9mb250ZWxsby5jb20AQwBvAHAAeQByAGkAZwBoAHQAIAAoAEMAKQAgADIAMAAxADMAIABiAHkAIABvAHIAaQBnAGkAbgBhAGwAIABhAHUAdABoAG8AcgBzACAAQAAgAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAGYAbwBuAHQAZQBsAGwAbwBSAGUAZwB1AGwAYQByAGYAbwBuAHQAZQBsAGwAbwBmAG8AbgB0AGUAbABsAG8AVgBlAHIAcwBpAG8AbgAgADEALgAwAGYAbwBuAHQAZQBsAGwAbwBHAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAHMAdgBnADIAdAB0AGYAIABmAHIAbwBtACAARgBvAG4AdABlAGwAbABvACAAcAByAG8AagBlAGMAdAAuAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABlAGwAbABvAC4AYwBvAG0AAAAAAgAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAABAgEDAQQBBQEGAQcBCAEJAQoBCwEMAQ0BDgEPARABEQESARMBFAEVARYBFwEYARkBGgEbARwBHQEeAR8BIAEhASIBIwEkASUBJgEnASgBKQEqASsBLAEtAS4BLwEwATEBMgEzATQBNQE2ATcBOAE5AToBOwE8BHN0YXIKc3Rhci1lbXB0eQNjb2cHY29nLWFsdARtYWlsBnBlbmNpbAxwbHVzLWNpcmNsZWQDYXNsA2V5ZQR0YWdzBGNoYXQFdHJhc2gGYmFza2V0BnB1enpsZQhsYW5ndWFnZQZzaWduYWwFdXNlcnMFdG9vbHMJYXJyb3dzLWN3CGV4Y2hhbmdlC2ZvbGRlci1vcGVuBWJydXNoC2Zsb3ctYnJhbmNoBG1lbnUEY29kZQh1c2VyLWFkZAJjdwVncm91cARob21lCWVxdWFsaXplcgZtYWlsLTEGc2VhcmNoBG1vdmUGdXBsb2FkDHVwbG9hZC1jbG91ZANrZXkHbmV0d29yaw5pbmZvLWNpcmNsZWQtMQxoZWxwLWNpcmNsZWQGbG9nb3V0BGZsYWcFc3BpbjYJaG91cmdsYXNzBWNoZWNrC2NoZWNrLWVtcHR5DmNhbmNlbC1jaXJjbGVkBXRhc2tzBmZpbHRlcghtYWlsLWFsdAdzaXRlbWFwBGNyb3AHcGljdHVyZQR1c2VyB3NodWZmbGUEbG9jawRsaW5rBndyZW5jaAVjbG9jawVibG9jawAAAAEAAf//AA8AAAAAAAAAAAAAAAAAAAAAADIAMgNY/2oDWP9qsAAssCBgZi2wASwgZCCwwFCwBCZasARFW1ghIyEbilggsFBQWCGwQFkbILA4UFghsDhZWSCwCkVhZLAoUFghsApFILAwUFghsDBZGyCwwFBYIGYgiophILAKUFhgGyCwIFBYIbAKYBsgsDZQWCGwNmAbYFlZWRuwACtZWSOwAFBYZVlZLbACLCBFILAEJWFkILAFQ1BYsAUjQrAGI0IbISFZsAFgLbADLCMhIyEgZLEFYkIgsAYjQrIKAAIqISCwBkMgiiCKsAArsTAFJYpRWGBQG2FSWVgjWSEgsEBTWLAAKxshsEBZI7AAUFhlWS2wBCywB0MrsgACAENgQi2wBSywByNCIyCwACNCYbCAYrABYLAEKi2wBiwgIEUgsAJFY7ABRWJgRLABYC2wBywgIEUgsAArI7ECBCVgIEWKI2EgZCCwIFBYIbAAG7AwUFiwIBuwQFlZI7AAUFhlWbADJSNhRESwAWAtsAgssQUFRbABYUQtsAkssAFgICCwCUNKsABQWCCwCSNCWbAKQ0qwAFJYILAKI0JZLbAKLCC4BABiILgEAGOKI2GwC0NgIIpgILALI0IjLbALLEtUWLEHAURZJLANZSN4LbAMLEtRWEtTWLEHAURZGyFZJLATZSN4LbANLLEADENVWLEMDEOwAWFCsAorWbAAQ7ACJUKxCQIlQrEKAiVCsAEWIyCwAyVQWLEBAENgsAQlQoqKIIojYbAJKiEjsAFhIIojYbAJKiEbsQEAQ2CwAiVCsAIlYbAJKiFZsAlDR7AKQ0dgsIBiILACRWOwAUViYLEAABMjRLABQ7AAPrIBAQFDYEItsA4ssQAFRVRYALAMI0IgYLABYbUNDQEACwBCQopgsQ0FK7BtKxsiWS2wDyyxAA4rLbAQLLEBDistsBEssQIOKy2wEiyxAw4rLbATLLEEDistsBQssQUOKy2wFSyxBg4rLbAWLLEHDistsBcssQgOKy2wGCyxCQ4rLbAZLLAIK7EABUVUWACwDCNCIGCwAWG1DQ0BAAsAQkKKYLENBSuwbSsbIlktsBossQAZKy2wGyyxARkrLbAcLLECGSstsB0ssQMZKy2wHiyxBBkrLbAfLLEFGSstsCAssQYZKy2wISyxBxkrLbAiLLEIGSstsCMssQkZKy2wJCwgPLABYC2wJSwgYLANYCBDI7ABYEOwAiVhsAFgsCQqIS2wJiywJSuwJSotsCcsICBHICCwAkVjsAFFYmAjYTgjIIpVWCBHICCwAkVjsAFFYmAjYTgbIVktsCgssQAFRVRYALABFrAnKrABFTAbIlktsCkssAgrsQAFRVRYALABFrAnKrABFTAbIlktsCosIDWwAWAtsCssALADRWOwAUVisAArsAJFY7ABRWKwACuwABa0AAAAAABEPiM4sSoBFSotsCwsIDwgRyCwAkVjsAFFYmCwAENhOC2wLSwuFzwtsC4sIDwgRyCwAkVjsAFFYmCwAENhsAFDYzgtsC8ssQIAFiUgLiBHsAAjQrACJUmKikcjRyNhIFhiGyFZsAEjQrIuAQEVFCotsDAssAAWsAQlsAQlRyNHI2GwBkUrZYouIyAgPIo4LbAxLLAAFrAEJbAEJSAuRyNHI2EgsAQjQrAGRSsgsGBQWCCwQFFYswIgAyAbswImAxpZQkIjILAIQyCKI0cjRyNhI0ZgsARDsIBiYCCwACsgiophILACQ2BkI7ADQ2FkUFiwAkNhG7ADQ2BZsAMlsIBiYSMgILAEJiNGYTgbI7AIQ0awAiWwCENHI0cjYWAgsARDsIBiYCMgsAArI7AEQ2CwACuwBSVhsAUlsIBisAQmYSCwBCVgZCOwAyVgZFBYIRsjIVkjICCwBCYjRmE4WS2wMiywABYgICCwBSYgLkcjRyNhIzw4LbAzLLAAFiCwCCNCICAgRiNHsAArI2E4LbA0LLAAFrADJbACJUcjRyNhsABUWC4gPCMhG7ACJbACJUcjRyNhILAFJbAEJUcjRyNhsAYlsAUlSbACJWGwAUVjIyBYYhshWWOwAUViYCMuIyAgPIo4IyFZLbA1LLAAFiCwCEMgLkcjRyNhIGCwIGBmsIBiIyAgPIo4LbA2LCMgLkawAiVGUlggPFkusSYBFCstsDcsIyAuRrACJUZQWCA8WS6xJgEUKy2wOCwjIC5GsAIlRlJYIDxZIyAuRrACJUZQWCA8WS6xJgEUKy2wOSywMCsjIC5GsAIlRlJYIDxZLrEmARQrLbA6LLAxK4ogIDywBCNCijgjIC5GsAIlRlJYIDxZLrEmARQrsARDLrAmKy2wOyywABawBCWwBCYgLkcjRyNhsAZFKyMgPCAuIzixJgEUKy2wPCyxCAQlQrAAFrAEJbAEJSAuRyNHI2EgsAQjQrAGRSsgsGBQWCCwQFFYswIgAyAbswImAxpZQkIjIEewBEOwgGJgILAAKyCKimEgsAJDYGQjsANDYWRQWLACQ2EbsANDYFmwAyWwgGJhsAIlRmE4IyA8IzgbISAgRiNHsAArI2E4IVmxJgEUKy2wPSywMCsusSYBFCstsD4ssDErISMgIDywBCNCIzixJgEUK7AEQy6wJistsD8ssAAVIEewACNCsgABARUUEy6wLCotsEAssAAVIEewACNCsgABARUUEy6wLCotsEEssQABFBOwLSotsEIssC8qLbBDLLAAFkUjIC4gRoojYTixJgEUKy2wRCywCCNCsEMrLbBFLLIAADwrLbBGLLIAATwrLbBHLLIBADwrLbBILLIBATwrLbBJLLIAAD0rLbBKLLIAAT0rLbBLLLIBAD0rLbBMLLIBAT0rLbBNLLIAADkrLbBOLLIAATkrLbBPLLIBADkrLbBQLLIBATkrLbBRLLIAADsrLbBSLLIAATsrLbBTLLIBADsrLbBULLIBATsrLbBVLLIAAD4rLbBWLLIAAT4rLbBXLLIBAD4rLbBYLLIBAT4rLbBZLLIAADorLbBaLLIAATorLbBbLLIBADorLbBcLLIBATorLbBdLLAyKy6xJgEUKy2wXiywMiuwNistsF8ssDIrsDcrLbBgLLAAFrAyK7A4Ky2wYSywMysusSYBFCstsGIssDMrsDYrLbBjLLAzK7A3Ky2wZCywMyuwOCstsGUssDQrLrEmARQrLbBmLLA0K7A2Ky2wZyywNCuwNystsGgssDQrsDgrLbBpLLA1Ky6xJgEUKy2waiywNSuwNistsGsssDUrsDcrLbBsLLA1K7A4Ky2wbSwrsAhlsAMkUHiwARUwLQAAAEu4AMhSWLEBAY5ZuQgACABjILABI0SwAyNwsgQoCUVSRLIKAgcqsQYBRLEkAYhRWLBAiFixBgNEsSYBiFFYuAQAiFixBgFEWVlZWbgB/4WwBI2xBQBEAAA=') format('truetype');
+}
+/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */
+/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */
+/*
+@media screen and (-webkit-min-device-pixel-ratio:0) {
+ @font-face {
+ font-family: 'fontello';
+ src: url('../font/fontello.svg?13698858#fontello') format('svg');
+ }
+}
+*/
+
+ [class^="icon-"]:before, [class*=" icon-"]:before {
+ font-family: "fontello";
+ font-style: normal;
+ font-weight: normal;
+ speak: none;
+
+ display: inline-block;
+ text-decoration: inherit;
+ width: 1em;
+ margin-right: .2em;
+ text-align: center;
+ /* opacity: .8; */
+
+ /* For safety - reset parent styles, that can break glyph codes*/
+ font-variant: normal;
+ text-transform: none;
+
+ /* fix buttons height, for twitter bootstrap */
+ line-height: 1em;
+
+ /* Animation center compensation - margins should be symmetric */
+ /* remove if not needed */
+ margin-left: .2em;
+
+ /* you can be more comfortable with increased icons size */
+ /* font-size: 120%; */
+
+ /* Uncomment for 3D effect */
+ /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
+}
+.icon-spin6:before { content: '\e81d'; } /* 'î ' */
+.icon-asl:before { content: '\e0ad'; } /* 'î‚­' */
+.icon-mail-alt:before { content: '\f0e0'; } /* '' */
+.icon-star:before { content: '\2605'; } /* '★' */
+.icon-star-empty:before { content: '\2606'; } /* '☆' */
+.icon-user:before { content: '👤'; } /* '\1f464' */
+.icon-picture:before { content: '🌄'; } /* '\1f304' */
+.icon-cancel-circled:before { content: '\e821'; } /* 'î ¡' */
+.icon-plus-circled:before { content: '\2795'; } /* 'âž•' */
+.icon-link:before { content: '🔗'; } /* '\1f517' */
+.icon-lock:before { content: '🔒'; } /* '\1f512' */
+.icon-eye:before { content: '\e70a'; } /* '' */
+.icon-tags:before { content: '\e70d'; } /* 'îœ' */
+.icon-code:before { content: '\e80a'; } /* 'î Š' */
+.icon-pencil:before { content: '\270e'; } /* '✎' */
+.icon-chat:before { content: '\e720'; } /* '' */
+.icon-trash:before { content: '\e729'; } /* '' */
+.icon-folder-open:before { content: '\e806'; } /* 'î †' */
+.icon-menu:before { content: '\e809'; } /* 'î ‰' */
+.icon-cog:before { content: '\2699'; } /* 'âš™' */
+.icon-cog-alt:before { content: '\26ef'; } /* '⛯' */
+.icon-wrench:before { content: '🔧'; } /* '\1f527' */
+.icon-basket:before { content: '\e73d'; } /* '' */
+.icon-logout:before { content: '\e81b'; } /* 'î ›' */
+.icon-clock:before { content: '🕔'; } /* '\1f554' */
+.icon-block:before { content: '🚫'; } /* '\1f6ab' */
+.icon-move:before { content: '\e812'; } /* 'î ’' */
+.icon-cw:before { content: '\e80c'; } /* '' */
+.icon-arrows-cw:before { content: '\e804'; } /* 'î „' */
+.icon-mail:before { content: '\2709'; } /* '✉' */
+.icon-exchange:before { content: '\e805'; } /* 'î …' */
+.icon-signal:before { content: '\e801'; } /* 'î ' */
+.icon-crop:before { content: '\f125'; } /* 'ï„¥' */
+.icon-check:before { content: '\e81f'; } /* 'î Ÿ' */
+.icon-check-empty:before { content: '\e820'; } /* 'î  ' */
+.icon-tasks:before { content: '\f0ae'; } /* 'ï‚®' */
+.icon-filter:before { content: '\f0b0'; } /* 'ï‚°' */
+.icon-sitemap:before { content: '\f0e8'; } /* '' */
+.icon-search:before { content: '\e811'; } /* 'î ‘' */
+.icon-user-add:before { content: '\e80b'; } /* 'î ‹' */
+.icon-help-circled:before { content: '\e81a'; } /* 'î š' */
+.icon-info-circled-1:before { content: '\e817'; } /* 'î —' */
+.icon-home:before { content: '\e80e'; } /* 'î Ž' */
+.icon-flag:before { content: '\e81c'; } /* '' */
+.icon-upload:before { content: '\e813'; } /* 'î “' */
+.icon-upload-cloud:before { content: '\e814'; } /* 'î ”' */
+.icon-tools:before { content: '\e803'; } /* 'î ƒ' */
+.icon-hourglass:before { content: '\e81e'; } /* 'î ž' */
+.icon-network:before { content: '\e816'; } /* 'î –' */
+.icon-brush:before { content: '\e807'; } /* 'î ‡' */
+.icon-language:before { content: '\e800'; } /* 'î €' */
+.icon-key:before { content: '\e815'; } /* 'î •' */
+.icon-flow-branch:before { content: '\e808'; } /* 'î ˆ' */
+.icon-puzzle:before { content: '\e7b6'; } /* '' */
+.icon-mail-1:before { content: '\e810'; } /* 'î ' */
+.icon-equalizer:before { content: '\e80f'; } /* 'î ' */
+.icon-users:before { content: '\e802'; } /* 'î ‚' */
+.icon-group:before { content: '\e80d'; } /* 'î ' */
+.icon-shuffle:before { content: '🔀'; } /* '\1f500' */ \ No newline at end of file
diff --git a/admin/themes/default/fontello/css/fontello-ie7-codes.css b/admin/themes/default/fontello/css/fontello-ie7-codes.css
new file mode 100644
index 000000000..26478aa0c
--- /dev/null
+++ b/admin/themes/default/fontello/css/fontello-ie7-codes.css
@@ -0,0 +1,60 @@
+
+.icon-spin6 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81d;&nbsp;'); }
+.icon-asl { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe0ad;&nbsp;'); }
+.icon-mail-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e0;&nbsp;'); }
+.icon-star { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x2605;&nbsp;'); }
+.icon-star-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x2606;&nbsp;'); }
+.icon-user { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x1f464;&nbsp;'); }
+.icon-picture { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x1f304;&nbsp;'); }
+.icon-cancel-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe821;&nbsp;'); }
+.icon-plus-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x2795;&nbsp;'); }
+.icon-link { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x1f517;&nbsp;'); }
+.icon-lock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x1f512;&nbsp;'); }
+.icon-eye { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe70a;&nbsp;'); }
+.icon-tags { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe70d;&nbsp;'); }
+.icon-code { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80a;&nbsp;'); }
+.icon-pencil { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x270e;&nbsp;'); }
+.icon-chat { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe720;&nbsp;'); }
+.icon-trash { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe729;&nbsp;'); }
+.icon-folder-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe806;&nbsp;'); }
+.icon-menu { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe809;&nbsp;'); }
+.icon-cog { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x2699;&nbsp;'); }
+.icon-cog-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x26ef;&nbsp;'); }
+.icon-wrench { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x1f527;&nbsp;'); }
+.icon-basket { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe73d;&nbsp;'); }
+.icon-logout { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81b;&nbsp;'); }
+.icon-clock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x1f554;&nbsp;'); }
+.icon-block { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x1f6ab;&nbsp;'); }
+.icon-move { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe812;&nbsp;'); }
+.icon-cw { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80c;&nbsp;'); }
+.icon-arrows-cw { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe804;&nbsp;'); }
+.icon-mail { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x2709;&nbsp;'); }
+.icon-exchange { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe805;&nbsp;'); }
+.icon-signal { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe801;&nbsp;'); }
+.icon-crop { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf125;&nbsp;'); }
+.icon-check { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81f;&nbsp;'); }
+.icon-check-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe820;&nbsp;'); }
+.icon-tasks { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ae;&nbsp;'); }
+.icon-filter { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0b0;&nbsp;'); }
+.icon-sitemap { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e8;&nbsp;'); }
+.icon-search { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe811;&nbsp;'); }
+.icon-user-add { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80b;&nbsp;'); }
+.icon-help-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81a;&nbsp;'); }
+.icon-info-circled-1 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe817;&nbsp;'); }
+.icon-home { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80e;&nbsp;'); }
+.icon-flag { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81c;&nbsp;'); }
+.icon-upload { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe813;&nbsp;'); }
+.icon-upload-cloud { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe814;&nbsp;'); }
+.icon-tools { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe803;&nbsp;'); }
+.icon-hourglass { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81e;&nbsp;'); }
+.icon-network { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe816;&nbsp;'); }
+.icon-brush { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe807;&nbsp;'); }
+.icon-language { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe800;&nbsp;'); }
+.icon-key { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe815;&nbsp;'); }
+.icon-flow-branch { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe808;&nbsp;'); }
+.icon-puzzle { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe7b6;&nbsp;'); }
+.icon-mail-1 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe810;&nbsp;'); }
+.icon-equalizer { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80f;&nbsp;'); }
+.icon-users { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe802;&nbsp;'); }
+.icon-group { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80d;&nbsp;'); }
+.icon-shuffle { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x1f500;&nbsp;'); } \ No newline at end of file
diff --git a/admin/themes/default/fontello/css/fontello-ie7.css b/admin/themes/default/fontello/css/fontello-ie7.css
new file mode 100644
index 000000000..376909e86
--- /dev/null
+++ b/admin/themes/default/fontello/css/fontello-ie7.css
@@ -0,0 +1,71 @@
+[class^="icon-"], [class*=" icon-"] {
+ font-family: 'fontello';
+ font-style: normal;
+ font-weight: normal;
+
+ /* fix buttons height */
+ line-height: 1em;
+
+ /* you can be more comfortable with increased icons size */
+ /* font-size: 120%; */
+}
+
+.icon-spin6 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81d;&nbsp;'); }
+.icon-asl { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe0ad;&nbsp;'); }
+.icon-mail-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e0;&nbsp;'); }
+.icon-star { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x2605;&nbsp;'); }
+.icon-star-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x2606;&nbsp;'); }
+.icon-user { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x1f464;&nbsp;'); }
+.icon-picture { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x1f304;&nbsp;'); }
+.icon-cancel-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe821;&nbsp;'); }
+.icon-plus-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x2795;&nbsp;'); }
+.icon-link { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x1f517;&nbsp;'); }
+.icon-lock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x1f512;&nbsp;'); }
+.icon-eye { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe70a;&nbsp;'); }
+.icon-tags { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe70d;&nbsp;'); }
+.icon-code { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80a;&nbsp;'); }
+.icon-pencil { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x270e;&nbsp;'); }
+.icon-chat { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe720;&nbsp;'); }
+.icon-trash { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe729;&nbsp;'); }
+.icon-folder-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe806;&nbsp;'); }
+.icon-menu { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe809;&nbsp;'); }
+.icon-cog { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x2699;&nbsp;'); }
+.icon-cog-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x26ef;&nbsp;'); }
+.icon-wrench { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x1f527;&nbsp;'); }
+.icon-basket { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe73d;&nbsp;'); }
+.icon-logout { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81b;&nbsp;'); }
+.icon-clock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x1f554;&nbsp;'); }
+.icon-block { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x1f6ab;&nbsp;'); }
+.icon-move { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe812;&nbsp;'); }
+.icon-cw { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80c;&nbsp;'); }
+.icon-arrows-cw { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe804;&nbsp;'); }
+.icon-mail { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x2709;&nbsp;'); }
+.icon-exchange { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe805;&nbsp;'); }
+.icon-signal { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe801;&nbsp;'); }
+.icon-crop { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf125;&nbsp;'); }
+.icon-check { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81f;&nbsp;'); }
+.icon-check-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe820;&nbsp;'); }
+.icon-tasks { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ae;&nbsp;'); }
+.icon-filter { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0b0;&nbsp;'); }
+.icon-sitemap { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e8;&nbsp;'); }
+.icon-search { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe811;&nbsp;'); }
+.icon-user-add { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80b;&nbsp;'); }
+.icon-help-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81a;&nbsp;'); }
+.icon-info-circled-1 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe817;&nbsp;'); }
+.icon-home { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80e;&nbsp;'); }
+.icon-flag { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81c;&nbsp;'); }
+.icon-upload { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe813;&nbsp;'); }
+.icon-upload-cloud { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe814;&nbsp;'); }
+.icon-tools { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe803;&nbsp;'); }
+.icon-hourglass { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81e;&nbsp;'); }
+.icon-network { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe816;&nbsp;'); }
+.icon-brush { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe807;&nbsp;'); }
+.icon-language { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe800;&nbsp;'); }
+.icon-key { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe815;&nbsp;'); }
+.icon-flow-branch { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe808;&nbsp;'); }
+.icon-puzzle { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe7b6;&nbsp;'); }
+.icon-mail-1 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe810;&nbsp;'); }
+.icon-equalizer { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80f;&nbsp;'); }
+.icon-users { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe802;&nbsp;'); }
+.icon-group { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80d;&nbsp;'); }
+.icon-shuffle { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x1f500;&nbsp;'); } \ No newline at end of file
diff --git a/admin/themes/default/fontello/css/fontello.css b/admin/themes/default/fontello/css/fontello.css
new file mode 100644
index 000000000..f1b6f8422
--- /dev/null
+++ b/admin/themes/default/fontello/css/fontello.css
@@ -0,0 +1,113 @@
+@charset "UTF-8";
+
+ @font-face {
+ font-family: 'fontello';
+ src: url('../font/fontello.eot?27476867');
+ src: url('../font/fontello.eot?27476867#iefix') format('embedded-opentype'),
+ url('../font/fontello.woff?27476867') format('woff'),
+ url('../font/fontello.ttf?27476867') format('truetype'),
+ url('../font/fontello.svg?27476867#fontello') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */
+/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */
+/*
+@media screen and (-webkit-min-device-pixel-ratio:0) {
+ @font-face {
+ font-family: 'fontello';
+ src: url('../font/fontello.svg?27476867#fontello') format('svg');
+ }
+}
+*/
+
+ [class^="icon-"]:before, [class*=" icon-"]:before {
+ font-family: "fontello";
+ font-style: normal;
+ font-weight: normal;
+ speak: none;
+
+ display: inline-block;
+ text-decoration: inherit;
+ width: 1em;
+ margin-right: .2em;
+ text-align: center;
+ /* opacity: .8; */
+
+ /* For safety - reset parent styles, that can break glyph codes*/
+ font-variant: normal;
+ text-transform: none;
+
+ /* fix buttons height, for twitter bootstrap */
+ line-height: 1em;
+
+ /* Animation center compensation - margins should be symmetric */
+ /* remove if not needed */
+ margin-left: .2em;
+
+ /* you can be more comfortable with increased icons size */
+ /* font-size: 120%; */
+
+ /* Uncomment for 3D effect */
+ /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
+}
+
+.icon-spin6:before { content: '\e81d'; } /* 'î ' */
+.icon-asl:before { content: '\e0ad'; } /* 'î‚­' */
+.icon-mail-alt:before { content: '\f0e0'; } /* '' */
+.icon-star:before { content: '\2605'; } /* '★' */
+.icon-star-empty:before { content: '\2606'; } /* '☆' */
+.icon-user:before { content: '👤'; } /* '\1f464' */
+.icon-picture:before { content: '🌄'; } /* '\1f304' */
+.icon-cancel-circled:before { content: '\e821'; } /* 'î ¡' */
+.icon-plus-circled:before { content: '\2795'; } /* 'âž•' */
+.icon-link:before { content: '🔗'; } /* '\1f517' */
+.icon-lock:before { content: '🔒'; } /* '\1f512' */
+.icon-eye:before { content: '\e70a'; } /* '' */
+.icon-tags:before { content: '\e70d'; } /* 'îœ' */
+.icon-code:before { content: '\e80a'; } /* 'î Š' */
+.icon-pencil:before { content: '\270e'; } /* '✎' */
+.icon-chat:before { content: '\e720'; } /* '' */
+.icon-trash:before { content: '\e729'; } /* '' */
+.icon-folder-open:before { content: '\e806'; } /* 'î †' */
+.icon-menu:before { content: '\e809'; } /* 'î ‰' */
+.icon-cog:before { content: '\2699'; } /* 'âš™' */
+.icon-cog-alt:before { content: '\26ef'; } /* '⛯' */
+.icon-wrench:before { content: '🔧'; } /* '\1f527' */
+.icon-basket:before { content: '\e73d'; } /* '' */
+.icon-logout:before { content: '\e81b'; } /* 'î ›' */
+.icon-clock:before { content: '🕔'; } /* '\1f554' */
+.icon-block:before { content: '🚫'; } /* '\1f6ab' */
+.icon-move:before { content: '\e812'; } /* 'î ’' */
+.icon-cw:before { content: '\e80c'; } /* '' */
+.icon-arrows-cw:before { content: '\e804'; } /* 'î „' */
+.icon-mail:before { content: '\2709'; } /* '✉' */
+.icon-exchange:before { content: '\e805'; } /* 'î …' */
+.icon-signal:before { content: '\e801'; } /* 'î ' */
+.icon-crop:before { content: '\f125'; } /* 'ï„¥' */
+.icon-check:before { content: '\e81f'; } /* 'î Ÿ' */
+.icon-check-empty:before { content: '\e820'; } /* 'î  ' */
+.icon-tasks:before { content: '\f0ae'; } /* 'ï‚®' */
+.icon-filter:before { content: '\f0b0'; } /* 'ï‚°' */
+.icon-sitemap:before { content: '\f0e8'; } /* '' */
+.icon-search:before { content: '\e811'; } /* 'î ‘' */
+.icon-user-add:before { content: '\e80b'; } /* 'î ‹' */
+.icon-help-circled:before { content: '\e81a'; } /* 'î š' */
+.icon-info-circled-1:before { content: '\e817'; } /* 'î —' */
+.icon-home:before { content: '\e80e'; } /* 'î Ž' */
+.icon-flag:before { content: '\e81c'; } /* '' */
+.icon-upload:before { content: '\e813'; } /* 'î “' */
+.icon-upload-cloud:before { content: '\e814'; } /* 'î ”' */
+.icon-tools:before { content: '\e803'; } /* 'î ƒ' */
+.icon-hourglass:before { content: '\e81e'; } /* 'î ž' */
+.icon-network:before { content: '\e816'; } /* 'î –' */
+.icon-brush:before { content: '\e807'; } /* 'î ‡' */
+.icon-language:before { content: '\e800'; } /* 'î €' */
+.icon-key:before { content: '\e815'; } /* 'î •' */
+.icon-flow-branch:before { content: '\e808'; } /* 'î ˆ' */
+.icon-puzzle:before { content: '\e7b6'; } /* '' */
+.icon-mail-1:before { content: '\e810'; } /* 'î ' */
+.icon-equalizer:before { content: '\e80f'; } /* 'î ' */
+.icon-users:before { content: '\e802'; } /* 'î ‚' */
+.icon-group:before { content: '\e80d'; } /* 'î ' */
+.icon-shuffle:before { content: '🔀'; } /* '\1f500' */ \ No newline at end of file
diff --git a/admin/themes/default/fontello/demo.html b/admin/themes/default/fontello/demo.html
new file mode 100644
index 000000000..52cc3cc46
--- /dev/null
+++ b/admin/themes/default/fontello/demo.html
@@ -0,0 +1,355 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <!--[if lt IE 9]>
+ <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+ <![endif]-->
+ <meta charset="UTF-8"><style type="text/css">/*
+ * Bootstrap v2.2.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+.clearfix {
+ *zoom: 1;
+}
+.clearfix:before,
+.clearfix:after {
+ display: table;
+ content: "";
+ line-height: 0;
+}
+.clearfix:after {
+ clear: both;
+}
+html {
+ font-size: 100%;
+ -webkit-text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+}
+a:focus {
+ outline: thin dotted #333;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+a:hover,
+a:active {
+ outline: 0;
+}
+button,
+input,
+select,
+textarea {
+ margin: 0;
+ font-size: 100%;
+ vertical-align: middle;
+}
+button,
+input {
+ *overflow: visible;
+ line-height: normal;
+}
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ padding: 0;
+ border: 0;
+}
+body {
+ margin: 0;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 14px;
+ line-height: 20px;
+ color: #333;
+ background-color: #fff;
+}
+a {
+ color: #08c;
+ text-decoration: none;
+}
+a:hover {
+ color: #005580;
+ text-decoration: underline;
+}
+.row {
+ margin-left: -20px;
+ *zoom: 1;
+}
+.row:before,
+.row:after {
+ display: table;
+ content: "";
+ line-height: 0;
+}
+.row:after {
+ clear: both;
+}
+[class*="span"] {
+ float: left;
+ min-height: 1px;
+ margin-left: 20px;
+}
+.container,
+.navbar-static-top .container,
+.navbar-fixed-top .container,
+.navbar-fixed-bottom .container {
+ width: 940px;
+}
+.span12 {
+ width: 940px;
+}
+.span11 {
+ width: 860px;
+}
+.span10 {
+ width: 780px;
+}
+.span9 {
+ width: 700px;
+}
+.span8 {
+ width: 620px;
+}
+.span7 {
+ width: 540px;
+}
+.span6 {
+ width: 460px;
+}
+.span5 {
+ width: 380px;
+}
+.span4 {
+ width: 300px;
+}
+.span3 {
+ width: 220px;
+}
+.span2 {
+ width: 140px;
+}
+.span1 {
+ width: 60px;
+}
+[class*="span"].pull-right,
+.row-fluid [class*="span"].pull-right {
+ float: right;
+}
+.container {
+ margin-right: auto;
+ margin-left: auto;
+ *zoom: 1;
+}
+.container:before,
+.container:after {
+ display: table;
+ content: "";
+ line-height: 0;
+}
+.container:after {
+ clear: both;
+}
+p {
+ margin: 0 0 10px;
+}
+.lead {
+ margin-bottom: 20px;
+ font-size: 21px;
+ font-weight: 200;
+ line-height: 30px;
+}
+small {
+ font-size: 85%;
+}
+h1 {
+ margin: 10px 0;
+ font-family: inherit;
+ font-weight: bold;
+ line-height: 20px;
+ color: inherit;
+ text-rendering: optimizelegibility;
+}
+h1 small {
+ font-weight: normal;
+ line-height: 1;
+ color: #999;
+}
+h1 {
+ line-height: 40px;
+}
+h1 {
+ font-size: 38.5px;
+}
+h1 small {
+ font-size: 24.5px;
+}
+body {
+ margin-top: 90px;
+}
+.header {
+ position: fixed;
+ top: 0;
+ left: 50%;
+ margin-left: -480px;
+ background-color: #fff;
+ border-bottom: 1px solid #ddd;
+ padding-top: 10px;
+ z-index: 10;
+}
+.footer {
+ color: #ddd;
+ font-size: 12px;
+ text-align: center;
+ margin-top: 20px;
+}
+.footer a {
+ color: #ccc;
+ text-decoration: underline;
+}
+.the-icons {
+ font-size: 14px;
+ line-height: 24px;
+}
+.switch {
+ position: absolute;
+ right: 0;
+ bottom: 10px;
+ color: #666;
+}
+.switch input {
+ margin-right: 0.3em;
+}
+.codesOn .i-name {
+ display: none;
+}
+.codesOn .i-code {
+ display: inline;
+}
+.i-code {
+ display: none;
+}
+</style>
+ <link rel="stylesheet" href="css/fontello.css">
+ <link rel="stylesheet" href="css/animation.css">
+ <!--[if IE 7]>
+ <link rel="stylesheet" href="css/fontello-ie7.css">
+ <![endif]-->
+ <script>
+ function toggleCodes(on) {
+ var obj = document.getElementById('icons');
+
+ if (on) {
+ obj.className += ' codesOn';
+ } else {
+ obj.className = obj.className.replace(' codesOn', '');
+ }
+ }
+
+ </script>
+ </head>
+ <body>
+ <div class="container header">
+ <h1>
+ fontello
+ <small>font demo</small>
+ </h1>
+ <label class="switch">
+ <input type="checkbox" onclick="toggleCodes(this.checked)">show codes
+ </label>
+ </div>
+ <div id="icons" class="container">
+ <div class="row">
+ <div title="Code: 0xe81d" class="the-icons span3"><i class="icon-spin6 animate-spin"></i> <span class="i-name">icon-spin6</span><span class="i-code">0xe81d</span></div>
+ <div title="Code: 0xe0ad" class="the-icons span3"><i class="icon-asl"></i> <span class="i-name">icon-asl</span><span class="i-code">0xe0ad</span></div>
+ <div title="Code: 0xf0e0" class="the-icons span3"><i class="icon-mail-alt"></i> <span class="i-name">icon-mail-alt</span><span class="i-code">0xf0e0</span></div>
+ <div title="Code: 0x2605" class="the-icons span3"><i class="icon-star"></i> <span class="i-name">icon-star</span><span class="i-code">0x2605</span></div>
+ </div>
+ <div class="row">
+ <div title="Code: 0x2606" class="the-icons span3"><i class="icon-star-empty"></i> <span class="i-name">icon-star-empty</span><span class="i-code">0x2606</span></div>
+ <div title="Code: 0x1f464" class="the-icons span3"><i class="icon-user"></i> <span class="i-name">icon-user</span><span class="i-code">0x1f464</span></div>
+ <div title="Code: 0x1f304" class="the-icons span3"><i class="icon-picture"></i> <span class="i-name">icon-picture</span><span class="i-code">0x1f304</span></div>
+ <div title="Code: 0xe821" class="the-icons span3"><i class="icon-cancel-circled"></i> <span class="i-name">icon-cancel-circled</span><span class="i-code">0xe821</span></div>
+ </div>
+ <div class="row">
+ <div title="Code: 0x2795" class="the-icons span3"><i class="icon-plus-circled"></i> <span class="i-name">icon-plus-circled</span><span class="i-code">0x2795</span></div>
+ <div title="Code: 0x1f517" class="the-icons span3"><i class="icon-link"></i> <span class="i-name">icon-link</span><span class="i-code">0x1f517</span></div>
+ <div title="Code: 0x1f512" class="the-icons span3"><i class="icon-lock"></i> <span class="i-name">icon-lock</span><span class="i-code">0x1f512</span></div>
+ <div title="Code: 0xe70a" class="the-icons span3"><i class="icon-eye"></i> <span class="i-name">icon-eye</span><span class="i-code">0xe70a</span></div>
+ </div>
+ <div class="row">
+ <div title="Code: 0xe70d" class="the-icons span3"><i class="icon-tags"></i> <span class="i-name">icon-tags</span><span class="i-code">0xe70d</span></div>
+ <div title="Code: 0xe80a" class="the-icons span3"><i class="icon-code"></i> <span class="i-name">icon-code</span><span class="i-code">0xe80a</span></div>
+ <div title="Code: 0x270e" class="the-icons span3"><i class="icon-pencil"></i> <span class="i-name">icon-pencil</span><span class="i-code">0x270e</span></div>
+ <div title="Code: 0xe720" class="the-icons span3"><i class="icon-chat"></i> <span class="i-name">icon-chat</span><span class="i-code">0xe720</span></div>
+ </div>
+ <div class="row">
+ <div title="Code: 0xe729" class="the-icons span3"><i class="icon-trash"></i> <span class="i-name">icon-trash</span><span class="i-code">0xe729</span></div>
+ <div title="Code: 0xe806" class="the-icons span3"><i class="icon-folder-open"></i> <span class="i-name">icon-folder-open</span><span class="i-code">0xe806</span></div>
+ <div title="Code: 0xe809" class="the-icons span3"><i class="icon-menu"></i> <span class="i-name">icon-menu</span><span class="i-code">0xe809</span></div>
+ <div title="Code: 0x2699" class="the-icons span3"><i class="icon-cog"></i> <span class="i-name">icon-cog</span><span class="i-code">0x2699</span></div>
+ </div>
+ <div class="row">
+ <div title="Code: 0x26ef" class="the-icons span3"><i class="icon-cog-alt"></i> <span class="i-name">icon-cog-alt</span><span class="i-code">0x26ef</span></div>
+ <div title="Code: 0x1f527" class="the-icons span3"><i class="icon-wrench"></i> <span class="i-name">icon-wrench</span><span class="i-code">0x1f527</span></div>
+ <div title="Code: 0xe73d" class="the-icons span3"><i class="icon-basket"></i> <span class="i-name">icon-basket</span><span class="i-code">0xe73d</span></div>
+ <div title="Code: 0xe81b" class="the-icons span3"><i class="icon-logout"></i> <span class="i-name">icon-logout</span><span class="i-code">0xe81b</span></div>
+ </div>
+ <div class="row">
+ <div title="Code: 0x1f554" class="the-icons span3"><i class="icon-clock"></i> <span class="i-name">icon-clock</span><span class="i-code">0x1f554</span></div>
+ <div title="Code: 0x1f6ab" class="the-icons span3"><i class="icon-block"></i> <span class="i-name">icon-block</span><span class="i-code">0x1f6ab</span></div>
+ <div title="Code: 0xe812" class="the-icons span3"><i class="icon-move"></i> <span class="i-name">icon-move</span><span class="i-code">0xe812</span></div>
+ <div title="Code: 0xe80c" class="the-icons span3"><i class="icon-cw"></i> <span class="i-name">icon-cw</span><span class="i-code">0xe80c</span></div>
+ </div>
+ <div class="row">
+ <div title="Code: 0xe804" class="the-icons span3"><i class="icon-arrows-cw"></i> <span class="i-name">icon-arrows-cw</span><span class="i-code">0xe804</span></div>
+ <div title="Code: 0x2709" class="the-icons span3"><i class="icon-mail"></i> <span class="i-name">icon-mail</span><span class="i-code">0x2709</span></div>
+ <div title="Code: 0xe805" class="the-icons span3"><i class="icon-exchange"></i> <span class="i-name">icon-exchange</span><span class="i-code">0xe805</span></div>
+ <div title="Code: 0xe801" class="the-icons span3"><i class="icon-signal"></i> <span class="i-name">icon-signal</span><span class="i-code">0xe801</span></div>
+ </div>
+ <div class="row">
+ <div title="Code: 0xf125" class="the-icons span3"><i class="icon-crop"></i> <span class="i-name">icon-crop</span><span class="i-code">0xf125</span></div>
+ <div title="Code: 0xe81f" class="the-icons span3"><i class="icon-check"></i> <span class="i-name">icon-check</span><span class="i-code">0xe81f</span></div>
+ <div title="Code: 0xe820" class="the-icons span3"><i class="icon-check-empty"></i> <span class="i-name">icon-check-empty</span><span class="i-code">0xe820</span></div>
+ <div title="Code: 0xf0ae" class="the-icons span3"><i class="icon-tasks"></i> <span class="i-name">icon-tasks</span><span class="i-code">0xf0ae</span></div>
+ </div>
+ <div class="row">
+ <div title="Code: 0xf0b0" class="the-icons span3"><i class="icon-filter"></i> <span class="i-name">icon-filter</span><span class="i-code">0xf0b0</span></div>
+ <div title="Code: 0xf0e8" class="the-icons span3"><i class="icon-sitemap"></i> <span class="i-name">icon-sitemap</span><span class="i-code">0xf0e8</span></div>
+ <div title="Code: 0xe811" class="the-icons span3"><i class="icon-search"></i> <span class="i-name">icon-search</span><span class="i-code">0xe811</span></div>
+ <div title="Code: 0xe80b" class="the-icons span3"><i class="icon-user-add"></i> <span class="i-name">icon-user-add</span><span class="i-code">0xe80b</span></div>
+ </div>
+ <div class="row">
+ <div title="Code: 0xe81a" class="the-icons span3"><i class="icon-help-circled"></i> <span class="i-name">icon-help-circled</span><span class="i-code">0xe81a</span></div>
+ <div title="Code: 0xe817" class="the-icons span3"><i class="icon-info-circled-1"></i> <span class="i-name">icon-info-circled-1</span><span class="i-code">0xe817</span></div>
+ <div title="Code: 0xe80e" class="the-icons span3"><i class="icon-home"></i> <span class="i-name">icon-home</span><span class="i-code">0xe80e</span></div>
+ <div title="Code: 0xe81c" class="the-icons span3"><i class="icon-flag"></i> <span class="i-name">icon-flag</span><span class="i-code">0xe81c</span></div>
+ </div>
+ <div class="row">
+ <div title="Code: 0xe813" class="the-icons span3"><i class="icon-upload"></i> <span class="i-name">icon-upload</span><span class="i-code">0xe813</span></div>
+ <div title="Code: 0xe814" class="the-icons span3"><i class="icon-upload-cloud"></i> <span class="i-name">icon-upload-cloud</span><span class="i-code">0xe814</span></div>
+ <div title="Code: 0xe803" class="the-icons span3"><i class="icon-tools"></i> <span class="i-name">icon-tools</span><span class="i-code">0xe803</span></div>
+ <div title="Code: 0xe81e" class="the-icons span3"><i class="icon-hourglass"></i> <span class="i-name">icon-hourglass</span><span class="i-code">0xe81e</span></div>
+ </div>
+ <div class="row">
+ <div title="Code: 0xe816" class="the-icons span3"><i class="icon-network"></i> <span class="i-name">icon-network</span><span class="i-code">0xe816</span></div>
+ <div title="Code: 0xe807" class="the-icons span3"><i class="icon-brush"></i> <span class="i-name">icon-brush</span><span class="i-code">0xe807</span></div>
+ <div title="Code: 0xe800" class="the-icons span3"><i class="icon-language"></i> <span class="i-name">icon-language</span><span class="i-code">0xe800</span></div>
+ <div title="Code: 0xe815" class="the-icons span3"><i class="icon-key"></i> <span class="i-name">icon-key</span><span class="i-code">0xe815</span></div>
+ </div>
+ <div class="row">
+ <div title="Code: 0xe808" class="the-icons span3"><i class="icon-flow-branch"></i> <span class="i-name">icon-flow-branch</span><span class="i-code">0xe808</span></div>
+ <div title="Code: 0xe7b6" class="the-icons span3"><i class="icon-puzzle"></i> <span class="i-name">icon-puzzle</span><span class="i-code">0xe7b6</span></div>
+ <div title="Code: 0xe810" class="the-icons span3"><i class="icon-mail-1"></i> <span class="i-name">icon-mail-1</span><span class="i-code">0xe810</span></div>
+ <div title="Code: 0xe80f" class="the-icons span3"><i class="icon-equalizer"></i> <span class="i-name">icon-equalizer</span><span class="i-code">0xe80f</span></div>
+ </div>
+ <div class="row">
+ <div title="Code: 0xe802" class="the-icons span3"><i class="icon-users"></i> <span class="i-name">icon-users</span><span class="i-code">0xe802</span></div>
+ <div title="Code: 0xe80d" class="the-icons span3"><i class="icon-group"></i> <span class="i-name">icon-group</span><span class="i-code">0xe80d</span></div>
+ <div title="Code: 0x1f500" class="the-icons span3"><i class="icon-shuffle"></i> <span class="i-name">icon-shuffle</span><span class="i-code">0x1f500</span></div>
+ </div>
+ </div>
+ <div class="container footer">Generated by <a href="http://fontello.com">fontello.com</a></div>
+ </body>
+</html> \ No newline at end of file
diff --git a/admin/themes/default/fontello/font/fontello.eot b/admin/themes/default/fontello/font/fontello.eot
new file mode 100644
index 000000000..030da1c23
--- /dev/null
+++ b/admin/themes/default/fontello/font/fontello.eot
Binary files differ
diff --git a/admin/themes/default/fontello/font/fontello.svg b/admin/themes/default/fontello/font/fontello.svg
new file mode 100644
index 000000000..00f80b839
--- /dev/null
+++ b/admin/themes/default/fontello/font/fontello.svg
@@ -0,0 +1,70 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>Copyright (C) 2013 by original authors @ fontello.com</metadata>
+<defs>
+<font id="fontello" horiz-adv-x="1000" >
+<font-face font-family="fontello" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
+<missing-glyph horiz-adv-x="1000" />
+<glyph glyph-name="spin6" unicode="&#xe81d;" d="m855 9c-189-190-520-172-705 13c-190 190-200 494-28 695c11 13 21 26 35 34c36 23 85 18 117-13c30-31 35-76 16-112c-5-9-9-15-16-22c-140-151-145-379-8-516c153-153 407-121 542 34c106 122 142 297 77 451c-83 198-305 291-510 222l0 1c236 82 492-24 588-252c71-167 37-355-72-493c-11-15-23-29-36-42z" horiz-adv-x="1000" />
+<glyph glyph-name="asl" unicode="&#xe0ad;" d="m1 700q-4 37 15 53t45 5t35-38l53-184q-15-29-14-64q6-30 36-204q7-52 32-82t65-29q47 0 74 37q34-39 83-37t74 41q27-37 71-41t73 27q12 16 20 32t11 37t5 33t1 40l0 38q26-10 61 24q49 45 109 78t98 8q33-24 31-59t-35-55q-61-25-104-82t-67-112t-58-117t-78-93q-21-18-66-18l-350 0q-84 6-105 118z m181-234q-6 45 21 65t56 8t37-48l21-209q4-41-17-63t-46-15t-37 45z m155 70q2 41 32 56t62-1t36-49l8-248q0-59-28-76t-57 4t-30 62z m175 4q4 43 37 55t62-7t30-52l-6-254q-5-47-34-66t-54 1t-29 67z" horiz-adv-x="979" />
+<glyph glyph-name="mail-alt" unicode="&#xf0e0;" d="m1000 454v-443q0-37-26-63t-63-27h-822q-36 0-63 27t-26 63v443q25-28 56-49q202-137 278-192q32-24 51-37t53-27t61-13h2q28 0 61 13t53 27t51 37q95 68 278 192q32 22 56 49z m0 164q0-44-27-84t-68-69q-210-146-262-181q-5-4-23-17t-30-22t-29-18t-33-15t-27-5h-2q-12 0-27 5t-33 15t-29 18t-30 22t-23 17q-51 35-147 101t-114 80q-35 23-65 64t-31 77q0 43 23 72t66 29h822q36 0 62-26t27-63z" horiz-adv-x="1000" />
+<glyph glyph-name="star" unicode="&#x2605;" d="m929 489q0-12-15-27l-203-197l48-279q1-4 1-12q0-11-6-19t-17-9q-10 0-22 7l-251 132l-250-132q-13-7-23-7q-11 0-17 9t-6 19q0 4 1 12l48 279l-203 197q-14 15-14 27q0 21 31 26l280 40l126 254q11 23 27 23t28-23l125-254l280-40q32-5 32-26z" horiz-adv-x="928.6" />
+<glyph glyph-name="star-empty" unicode="&#x2606;" d="m634 290l171 165l-235 35l-106 213l-105-213l-236-35l171-165l-41-235l211 111l211-111z m295 199q0-12-15-27l-203-197l48-279q1-4 1-12q0-28-23-28q-10 0-22 7l-251 132l-250-132q-13-7-23-7q-11 0-17 9t-6 19q0 4 1 12l48 279l-203 197q-14 15-14 27q0 21 31 26l280 40l126 254q11 23 27 23t28-23l125-254l280-40q32-5 32-26z" horiz-adv-x="928.6" />
+<glyph glyph-name="user" unicode="&#x1f464;" d="m786 66q0-67-41-106t-108-39h-488q-67 0-108 39t-41 106q0 30 2 58t8 61t15 60t24 55t34 45t48 30t62 11q5 0 24-12t41-27t60-27t75-12t74 12t61 27t41 27t24 12q34 0 62-11t48-30t34-45t24-55t15-60t8-61t2-58z m-179 498q0-88-63-151t-151-63t-152 63t-62 151t62 152t152 63t151-63t63-152z" horiz-adv-x="785.7" />
+<glyph glyph-name="picture" unicode="&#x1f304;" d="m357 529q0-45-31-76t-76-32t-76 32t-31 76t31 75t76 32t76-32t31-75z m572-215v-250h-786v107l178 179l90-89l285 285z m53 393h-893q-7 0-12-5t-6-13v-678q0-8 6-13t12-5h893q7 0 13 5t5 13v678q0 7-5 13t-13 5z m89-18v-678q0-37-26-63t-63-27h-893q-36 0-63 27t-26 63v678q0 37 26 63t63 27h893q37 0 63-27t26-63z" horiz-adv-x="1071.4" />
+<glyph glyph-name="cancel-circled" unicode="&#xe821;" d="m641 224q0 14-10 25l-101 101l101 101q10 11 10 25q0 15-10 26l-51 50q-10 11-25 11q-15 0-25-11l-101-101l-101 101q-11 11-26 11q-15 0-25-11l-50-50q-11-11-11-26q0-14 11-25l101-101l-101-101q-11-11-11-25q0-15 11-26l50-50q10-11 25-11q15 0 26 11l101 101l101-101q10-11 25-11q15 0 25 11l51 50q10 11 10 26z m216 126q0-117-57-215t-156-156t-215-58t-216 58t-155 156t-58 215t58 215t155 156t216 58t215-58t156-156t57-215z" horiz-adv-x="857.1" />
+<glyph glyph-name="plus-circled" unicode="&#x2795;" d="m679 314v72q0 14-11 25t-25 10h-143v143q0 15-11 25t-25 11h-71q-15 0-25-11t-11-25v-143h-143q-14 0-25-10t-10-25v-72q0-14 10-25t25-11h143v-142q0-15 11-25t25-11h71q15 0 25 11t11 25v142h143q14 0 25 11t11 25z m178 36q0-117-57-215t-156-156t-215-58t-216 58t-155 156t-58 215t58 215t155 156t216 58t215-58t156-156t57-215z" horiz-adv-x="857.1" />
+<glyph glyph-name="link" unicode="&#x1f517;" d="m812 171q0 23-15 38l-116 116q-16 16-38 16q-24 0-40-18q1-1 10-10t12-12t9-11t7-14t2-15q0-23-16-38t-38-16q-8 0-15 2t-14 7t-11 9t-12 12t-10 10q-19-17-19-40q0-23 16-38l115-116q15-15 38-15q22 0 38 15l82 81q15 16 15 37z m-392 394q0 22-15 38l-115 115q-16 16-38 16q-22 0-38-15l-82-82q-16-15-16-37q0-22 16-38l116-116q15-15 38-15q23 0 40 17q-2 2-11 11t-12 12t-8 10t-7 14t-2 16q0 22 15 38t38 15q9 0 16-2t14-7t10-8t12-12t11-11q18 17 18 41z m500-394q0-67-48-113l-82-81q-46-47-113-47q-68 0-114 48l-115 115q-46 47-46 114q0 68 49 116l-49 49q-48-49-116-49q-67 0-114 47l-116 116q-47 47-47 114t47 113l82 82q47 46 114 46q67 0 114-47l114-116q47-46 47-113q0-69-49-117l49-49q48 49 116 49q67 0 114-47l116-116q47-47 47-114z" horiz-adv-x="928.6" />
+<glyph glyph-name="lock" unicode="&#x1f512;" d="m179 421h285v108q0 59-42 101t-101 41t-101-41t-41-101v-108z m464-53v-322q0-22-16-37t-38-16h-535q-23 0-38 16t-16 37v322q0 22 16 38t38 15h17v108q0 102 74 176t176 74t177-74t73-176v-108h18q23 0 38-15t16-38z" horiz-adv-x="642.9" />
+<glyph glyph-name="eye" unicode="&#xe70a;" d="m929 314q-85 132-213 197q34-58 34-125q0-104-73-177t-177-73t-177 73t-73 177q0 67 34 125q-128-65-213-197q75-114 187-182t242-68t242 68t187 182z m-402 215q0 11-8 19t-19 7q-70 0-120-50t-50-119q0-12 8-19t19-8t19 8t8 19q0 48 34 82t82 34q11 0 19 8t8 19z m473-215q0-19-11-38q-78-129-210-206t-279-77t-279 77t-210 206q-11 19-11 38t11 39q78 128 210 205t279 78t279-78t210-205q11-20 11-39z" horiz-adv-x="1000" />
+<glyph glyph-name="tags" unicode="&#xe70d;" d="m250 600q0 30-21 51t-50 20t-51-20t-21-51t21-50t51-21t50 21t21 50z m595-321q0-30-20-51l-274-274q-22-21-51-21q-30 0-50 21l-399 399q-21 21-36 57t-15 65v232q0 29 21 50t50 22h233q29 0 65-15t57-36l399-399q20-21 20-50z m215 0q0-30-21-51l-274-274q-22-21-51-21q-20 0-33 8t-29 25l262 262q21 21 21 51q0 29-21 50l-399 399q-21 21-57 36t-65 15h125q29 0 65-15t57-36l399-399q21-21 21-50z" horiz-adv-x="1071.4" />
+<glyph glyph-name="code" unicode="&#xe80a;" d="m344 69l-28-28q-5-5-12-5t-13 5l-260 260q-6 6-6 13t6 13l260 260q5 6 13 6t12-6l28-28q6-5 6-13t-6-12l-219-220l219-219q6-6 6-13t-6-13z m330 596l-208-721q-2-7-9-11t-13-1l-34 9q-8 3-11 9t-2 14l208 720q3 8 9 11t13 2l35-10q7-2 11-9t1-13z m367-364l-260-260q-6-5-13-5t-13 5l-28 28q-5 6-5 13t5 13l219 219l-219 220q-5 5-5 12t5 13l28 28q6 6 13 6t13-6l260-260q5-5 5-13t-5-13z" horiz-adv-x="1071.4" />
+<glyph glyph-name="pencil" unicode="&#x270e;" d="m203-7l50 51l-131 131l-51-51v-60h72v-71h60z m291 518q0 12-12 12q-5 0-9-4l-303-302q-4-4-4-10q0-12 13-12q5 0 9 4l303 302q3 4 3 10z m-30 107l232-232l-464-465h-232v233z m381-54q0-29-20-50l-93-93l-232 233l93 92q20 21 50 21q29 0 51-21l131-131q20-22 20-51z" horiz-adv-x="857.1" />
+<glyph glyph-name="chat" unicode="&#xe720;" d="m786 421q0-77-53-143t-143-104t-197-38q-48 0-98 9q-70-49-155-72q-21-5-48-9h-2q-6 0-12 5t-6 12q-1 1-1 3t1 4t1 3l1 3t2 3t2 3t3 3t2 2q3 3 13 14t15 16t12 17t14 21t11 25q-69 40-108 98t-40 125q0 78 53 144t143 104t197 38t197-38t143-104t53-144z m214-142q0-67-40-126t-108-98q5-14 11-25t14-21t13-16t14-17t13-14q0 0 2-2t3-3t2-3t2-3l1-3t1-3t1-4t-1-3q-2-8-7-13t-13-4q-27 4-48 9q-85 23-155 72q-50-9-98-9q-151 0-263 74q32-3 49-3q90 0 172 25t148 72q69 52 107 119t37 141q0 43-13 85q72-39 114-99t42-128z" horiz-adv-x="1000" />
+<glyph glyph-name="trash" unicode="&#xe729;" d="m286 439v-321q0-8-5-13t-13-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q8 0 13-5t5-13z m143 0v-321q0-8-5-13t-13-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q8 0 13-5t5-13z m142 0v-321q0-8-5-13t-12-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q7 0 12-5t5-13z m72-404v529h-500v-529q0-12 4-22t8-15t6-5h464q2 0 6 5t8 15t4 22z m-375 601h250l-27 65q-4 5-9 6h-177q-6-1-10-6z m518-18v-36q0-8-5-13t-13-5h-54v-529q0-46-26-80t-63-34h-464q-37 0-63 33t-27 79v531h-53q-8 0-13 5t-5 13v36q0 8 5 13t13 5h172l39 93q9 21 31 35t44 15h178q22 0 44-15t30-35l39-93h173q8 0 13-5t5-13z" horiz-adv-x="785.7" />
+<glyph glyph-name="folder-open" unicode="&#xe806;" d="m1049 319q0-18-18-37l-187-221q-24-28-67-48t-81-20h-607q-19 0-33 7t-15 24q0 17 17 37l188 221q24 28 67 48t80 20h607q19 0 34-7t15-24z m-192 192v-90h-464q-53 0-110-26t-92-67l-188-221l-2-3q0 2-1 7t0 7v536q0 51 37 88t88 37h179q51 0 88-37t37-88v-18h303q51 0 88-37t37-88z" horiz-adv-x="1071.4" />
+<glyph glyph-name="menu" unicode="&#xe809;" d="m857 100v-71q0-15-10-25t-26-11h-785q-15 0-25 11t-11 25v71q0 15 11 25t25 11h785q15 0 26-11t10-25z m0 286v-72q0-14-10-25t-26-10h-785q-15 0-25 10t-11 25v72q0 14 11 25t25 10h785q15 0 26-10t10-25z m0 285v-71q0-15-10-25t-26-11h-785q-15 0-25 11t-11 25v71q0 15 11 26t25 10h785q15 0 26-10t10-26z" horiz-adv-x="857.1" />
+<glyph glyph-name="cog" unicode="&#x2699;" d="m571 350q0 59-41 101t-101 42t-101-42t-42-101t42-101t101-42t101 42t41 101z m286 61v-124q0-7-4-13t-11-7l-104-16q-10-30-21-51q19-27 59-77q6-6 6-13t-5-13q-15-21-55-61t-53-39q-7 0-14 5l-77 60q-25-13-51-21q-9-76-16-104q-4-16-20-16h-124q-8 0-14 5t-6 12l-16 103q-27 9-50 21l-79-60q-6-5-14-5q-8 0-14 6q-70 64-92 94q-4 5-4 13q0 6 5 12q8 12 28 37t30 40q-15 28-23 55l-102 15q-7 1-11 7t-5 13v124q0 7 5 13t10 7l104 16q8 25 22 51q-23 32-60 77q-6 7-6 14q0 5 5 12q15 20 55 60t53 40q7 0 15-5l77-60q24 13 50 21q9 76 17 104q3 15 20 15h124q7 0 13-4t7-12l15-103q28-9 50-21l80 60q5 5 13 5q7 0 14-5q72-67 92-95q4-5 4-13q0-6-4-12q-9-12-29-38t-30-39q14-28 23-55l102-15q7-1 12-7t4-13z" horiz-adv-x="857.1" />
+<glyph glyph-name="cog-alt" unicode="&#x26ef;" d="m500 350q0 59-42 101t-101 42t-101-42t-42-101t42-101t101-42t101 42t42 101z m429-286q0 29-22 51t-50 21t-50-21t-21-51q0-29 21-50t50-21t51 21t21 50z m0 572q0 29-22 50t-50 21t-50-21t-21-50q0-30 21-51t50-21t51 21t21 51z m-215-235v-103q0-6-4-11t-9-6l-86-14q-6-19-18-42q19-27 50-64q4-6 4-11q0-7-4-11q-13-17-46-50t-44-33q-6 0-11 4l-64 50q-21-11-43-17q-6-60-13-87q-4-13-17-13h-104q-6 0-11 4t-5 10l-13 85q-19 6-42 18l-66-50q-4-4-11-4q-6 0-12 4q-80 75-80 90q0 5 4 10q5 8 23 30t26 34q-13 24-20 46l-85 13q-5 1-9 5t-4 11v103q0 6 4 11t9 6l86 14q7 19 18 42q-19 27-50 64q-4 6-4 11q0 7 4 11q12 17 46 50t44 33q6 0 12-4l64-50q19 10 43 18q6 60 13 86q3 13 16 13h104q6 0 11-4t6-10l13-85q19-6 41-17l66 49q5 4 11 4q7 0 12-4q81-75 81-90q0-5-4-10q-7-9-24-30t-25-34q13-27 19-46l85-12q5-2 9-6t4-11z m357-298v-78q0-9-83-17q-6-15-16-29q28-63 28-77q0-2-2-4q-68-40-69-40q-5 0-26 27t-29 37q-11-1-17-1t-17 1q-7-11-29-37t-25-27q-1 0-69 40q-3 2-3 4q0 14 29 77q-10 14-17 29q-83 8-83 17v78q0 9 83 18q7 16 17 29q-29 63-29 77q0 2 3 4q2 1 19 11t33 19t17 9q4 0 25-26t29-38q12 1 17 1t17-1q28 40 51 63l4 1q2 0 69-39q2-2 2-4q0-14-28-77q9-13 16-29q83-9 83-18z m0 572v-78q0-9-83-18q-6-15-16-29q28-63 28-77q0-2-2-4q-68-39-69-39q-5 0-26 26t-29 38q-11-1-17-1t-17 1q-7-12-29-38t-25-26q-1 0-69 39q-3 2-3 4q0 14 29 77q-10 14-17 29q-83 9-83 18v78q0 9 83 17q7 16 17 29q-29 63-29 77q0 2 3 4q2 1 19 11t33 19t17 9q4 0 25-26t29-38q12 2 17 2t17-2q28 40 51 63l4 1q2 0 69-39q2-2 2-4q0-14-28-77q9-13 16-29q83-8 83-17z" horiz-adv-x="1071.4" />
+<glyph glyph-name="wrench" unicode="&#x1f527;" d="m214 29q0 14-10 25t-25 10t-26-10t-10-25t10-26t26-10t25 10t10 26z m360 234l-381-381q-21-20-50-20q-29 0-51 20l-59 61q-21 20-21 50q0 29 21 51l380 380q22-55 64-97t97-64z m353 243q0-22-12-59q-27-75-92-122t-144-46q-104 0-177 73t-73 177t73 176t177 74q32 0 67-10t60-26q9-6 9-15t-9-16l-163-94v-125l108-60q2 2 44 27t75 45t40 20q8 0 13-5t4-14z" horiz-adv-x="928.6" />
+<glyph glyph-name="basket" unicode="&#xe73d;" d="m357-7q0-30-21-51t-50-21t-51 21t-21 51t21 50t51 21t50-21t21-50z m500 0q0-30-21-51t-50-21t-51 21t-21 51t21 50t51 21t50-21t21-50z m72 607v-286q0-13-9-23t-23-12l-583-68q1-4 3-12t3-15t1-13q0-8-13-35h513q15 0 26-11t10-25t-10-25t-26-11h-571q-14 0-25 11t-11 25q0 8 6 22t17 33t11 21l-98 460h-114q-15 0-25 10t-11 25t11 26t25 10h143q9 0 16-3t11-9t7-14t4-15t3-16t3-14h670q14 0 25-11t11-25z" horiz-adv-x="928.6" />
+<glyph glyph-name="logout" unicode="&#xe81b;" d="m357 46q0-2 1-11t0-14t-2-14t-5-11t-12-3h-178q-67 0-114 47t-47 114v392q0 67 47 114t114 47h178q8 0 13-5t5-13q0-2 1-11t0-15t-2-13t-5-11t-12-3h-178q-37 0-63-27t-27-63v-392q0-37 27-63t63-27h174t6 0t7-2t4-3t4-5t1-8z m518 304q0-14-11-25l-303-304q-11-10-25-10t-25 10t-11 25v161h-250q-14 0-25 11t-11 25v214q0 15 11 25t25 11h250v161q0 14 11 25t25 10t25-10l303-304q11-10 11-25z" horiz-adv-x="928.6" />
+<glyph glyph-name="clock" unicode="&#x1f554;" d="m500 546v-250q0-7-5-12t-13-5h-178q-8 0-13 5t-5 12v36q0 8 5 13t13 5h125v196q0 8 5 13t12 5h36q8 0 13-5t5-13z m232-196q0 83-41 152t-110 111t-152 41t-153-41t-110-111t-41-152t41-152t110-111t153-41t152 41t110 111t41 152z m125 0q0-117-57-215t-156-156t-215-58t-216 58t-155 156t-58 215t58 215t155 156t216 58t215-58t156-156t57-215z" horiz-adv-x="857.1" />
+<glyph glyph-name="block" unicode="&#x1f6ab;" d="m732 352q0 90-48 164l-421-420q76-50 166-50q62 0 118 25t96 65t65 97t24 119z m-557-167l421 421q-75 50-167 50q-83 0-153-40t-110-112t-41-152q0-91 50-167z m682 167q0-88-34-168t-91-137t-137-92t-166-34t-167 34t-137 92t-91 137t-34 168t34 167t91 137t137 91t167 34t166-34t137-91t91-137t34-167z" horiz-adv-x="857.1" />
+<glyph glyph-name="move" unicode="&#xe812;" d="m1000 350q0-14-11-25l-142-143q-11-11-26-11t-25 11t-10 25v72h-215v-215h72q14 0 25-10t11-25t-11-26l-143-142q-10-11-25-11t-25 11l-143 142q-11 11-11 26t11 25t25 10h72v215h-215v-72q0-14-10-25t-25-11t-26 11l-142 143q-11 11-11 25t11 25l142 143q11 11 26 11t25-11t10-25v-72h215v215h-72q-14 0-25 10t-11 25t11 26l143 142q11 11 25 11t25-11l143-142q11-11 11-26t-11-25t-25-10h-72v-215h215v72q0 14 10 25t25 11t26-11l142-143q11-10 11-25z" horiz-adv-x="1000" />
+<glyph glyph-name="cw" unicode="&#xe80c;" d="m857 707v-250q0-14-10-25t-26-11h-250q-23 0-32 23q-10 22 7 38l77 77q-82 77-194 77q-58 0-111-23t-91-61t-62-91t-22-111t22-111t62-91t91-61t111-23q66 0 125 29t100 82q4 6 13 7q8 0 14-5l76-77q5-4 6-11t-5-13q-60-74-147-114t-182-41q-87 0-167 34t-136 92t-92 137t-34 166t34 166t92 137t136 92t167 34q82 0 158-31t137-88l72 72q16 18 39 8q22-9 22-33z" horiz-adv-x="857.1" />
+<glyph glyph-name="arrows-cw" unicode="&#xe804;" d="m843 261q0-3 0-4q-36-150-150-243t-267-93q-81 0-157 31t-136 88l-72-72q-11-11-25-11t-25 11t-11 25v250q0 14 11 25t25 11h250q14 0 25-11t10-25t-10-25l-77-77q40-37 90-57t105-20q74 0 139 37t104 99q6 10 29 66q5 13 17 13h107q8 0 13-6t5-12z m14 446v-250q0-14-10-25t-26-11h-250q-14 0-25 11t-10 25t10 25l77 77q-82 77-194 77q-75 0-140-37t-104-99q-6-10-29-66q-5-13-17-13h-111q-7 0-13 6t-5 12v4q36 150 151 243t268 93q81 0 158-31t137-88l72 72q11 11 25 11t26-11t10-25z" horiz-adv-x="857.1" />
+<glyph glyph-name="mail" unicode="&#x2709;" d="m929 11v428q-18-20-39-37q-149-114-238-188q-28-24-46-38t-48-27t-57-13h-2q-26 0-57 13t-48 27t-46 38q-88 74-238 188q-21 17-39 37v-428q0-8 6-13t12-5h822q7 0 12 5t6 13z m0 586v14t-1 7t-1 7t-3 5t-5 4t-8 2h-822q-7 0-12-6t-6-12q0-94 82-159q108-85 224-177q4-2 20-16t25-21t25-18t28-15t24-5h2q11 0 24 5t28 15t25 18t25 21t20 16q116 92 224 177q30 24 56 65t26 73z m71 21v-607q0-37-26-63t-63-27h-822q-36 0-63 27t-26 63v607q0 37 26 63t63 26h822q37 0 63-26t26-63z" horiz-adv-x="1000" />
+<glyph glyph-name="exchange" unicode="&#xe805;" d="m1000 189v-107q0-7-5-12t-13-6h-768v-107q0-7-5-12t-13-6q-6 0-13 6l-178 178q-5 5-5 13q0 8 5 13l179 178q5 5 12 5q8 0 13-5t5-13v-107h768q7 0 13-5t5-13z m0 304q0-8-5-13l-179-179q-5-5-12-5q-8 0-13 6t-5 12v107h-768q-7 0-13 6t-5 12v107q0 8 5 13t13 5h768v107q0 8 5 13t13 5q6 0 13-5l178-178q5-5 5-13z" horiz-adv-x="1000" />
+<glyph glyph-name="signal" unicode="&#xe801;" d="m143 46v-107q0-8-5-13t-13-5h-107q-8 0-13 5t-5 13v107q0 8 5 13t13 5h107q8 0 13-5t5-13z m214 72v-179q0-8-5-13t-13-5h-107q-8 0-13 5t-5 13v179q0 8 5 13t13 5h107q8 0 13-5t5-13z m214 143v-322q0-8-5-13t-12-5h-108q-7 0-12 5t-5 13v322q0 8 5 13t12 5h108q7 0 12-5t5-13z m215 214v-536q0-8-5-13t-13-5h-107q-8 0-13 5t-5 13v536q0 8 5 13t13 5h107q8 0 13-5t5-13z m214 286v-822q0-8-5-13t-13-5h-107q-8 0-13 5t-5 13v822q0 8 5 13t13 5h107q8 0 13-5t5-13z" horiz-adv-x="1000" />
+<glyph glyph-name="crop" unicode="&#xf125;" d="m311 136h332v332z m-25 25l332 332h-332v-332z m643-43v-107q0-8-5-13t-13-5h-125v-125q0-8-5-13t-13-5h-107q-8 0-13 5t-5 13v125h-482q-8 0-13 5t-5 13v482h-125q-8 0-13 5t-5 13v107q0 8 5 13t13 5h125v125q0 7 5 12t13 5h107q8 0 13-5t5-12v-125h475l137 138q5 5 13 5t13-5q5-6 5-13t-5-13l-138-137v-475h125q8 0 13-5t5-13z" horiz-adv-x="928.6" />
+<glyph glyph-name="check" unicode="&#xe81f;" d="m786 331v-177q0-67-47-114t-114-47h-464q-67 0-114 47t-47 114v464q0 66 47 113t114 48h464q35 0 65-14q9-4 10-13q2-10-5-16l-27-28q-6-5-13-5q-2 0-5 1q-13 3-25 3h-464q-37 0-63-26t-27-63v-464q0-37 27-63t63-27h464q37 0 63 27t26 63v141q0 8 5 13l36 35q6 6 13 6q3 0 7-2q11-4 11-16z m129 273l-455-454q-13-14-31-14t-32 14l-240 240q-14 13-14 31t14 32l61 62q14 13 32 13t32-13l147-147l361 361q13 13 31 13t32-13l62-61q13-14 13-32t-13-32z" horiz-adv-x="928.6" />
+<glyph glyph-name="check-empty" unicode="&#xe820;" d="m625 707h-464q-37 0-63-26t-27-63v-464q0-37 27-63t63-27h464q37 0 63 27t26 63v464q0 37-26 63t-63 26z m161-89v-464q0-67-47-114t-114-47h-464q-67 0-114 47t-47 114v464q0 66 47 113t114 48h464q66 0 114-48t47-113z" horiz-adv-x="785.7" />
+<glyph glyph-name="tasks" unicode="&#xf0ae;" d="m571 64h358v72h-358v-72z m-214 286h572v71h-572v-71z m357 286h215v71h-215v-71z m286-465v-142q0-15-11-25t-25-11h-928q-15 0-25 11t-11 25v142q0 15 11 26t25 10h928q15 0 25-10t11-26z m0 286v-143q0-14-11-25t-25-10h-928q-15 0-25 10t-11 25v143q0 15 11 25t25 11h928q15 0 25-11t11-25z m0 286v-143q0-15-11-25t-25-11h-928q-15 0-25 11t-11 25v143q0 14 11 25t25 11h928q15 0 25-11t11-25z" horiz-adv-x="1000" />
+<glyph glyph-name="filter" unicode="&#xf0b0;" d="m783 685q9-23-8-39l-275-275v-414q0-23-22-33q-7-3-14-3q-15 0-25 11l-143 143q-10 10-10 25v271l-275 275q-18 16-8 39q9 22 33 22h714q23 0 33-22z" horiz-adv-x="785.7" />
+<glyph glyph-name="sitemap" unicode="&#xf0e8;" d="m1000 154v-179q0-22-16-38t-38-16h-178q-22 0-38 16t-16 38v179q0 22 16 38t38 15h53v107h-285v-107h53q23 0 38-15t16-38v-179q0-22-16-38t-38-16h-178q-23 0-38 16t-16 38v179q0 22 16 38t38 15h53v107h-285v-107h53q22 0 38-15t16-38v-179q0-22-16-38t-38-16h-178q-23 0-38 16t-16 38v179q0 22 16 38t38 15h53v107q0 29 21 51t51 21h285v107h-53q-23 0-38 15t-16 38v179q0 22 16 38t38 16h178q23 0 38-16t16-38v-179q0-22-16-38t-38-15h-53v-107h285q29 0 51-21t21-51v-107h53q23 0 38-15t16-38z" horiz-adv-x="1000" />
+<glyph glyph-name="search" unicode="&#xe811;" d="m772 78q30-34 6-62l-46-46q-36-32-68 0l-190 190q-74-42-156-42q-128 0-223 95t-95 223t90 219t218 91t224-95t96-223q0-88-46-162z m-678 358q0-88 68-156t156-68t151 63t63 153q0 88-68 155t-156 67t-151-63t-63-151z" horiz-adv-x="789" />
+<glyph glyph-name="user-add" unicode="&#xe80b;" d="m620 128q180-64 180-122l0-106l-800 0l0 202q36 14 82 26q94 34 129 69t35 95q0 22-23 48t-31 74q-2 12-23 25t-25 61q0 16 5 26t9 12l4 4q-8 50-12 88q-6 54 40 112t160 58t160-58t42-112l-14-88q18-8 18-42q-2-28-9-43t-14-17t-14-8t-9-18q-10-46-33-73t-23-49q0-60 36-95t130-69z m230 272l150 0l0-100l-150 0l0-150l-100 0l0 150l-150 0l0 100l150 0l0 150l100 0l0-150z" horiz-adv-x="1000" />
+<glyph glyph-name="help-circled" unicode="&#xe81a;" d="m454 810q190 2 326-130t140-322q2-190-131-327t-323-141q-190-2-327 131t-139 323q-4 190 130 327t324 139z m-2-740q30 0 49 19t19 47q2 30-17 49t-49 19l-2 0q-28 0-47-18t-21-46q0-30 19-49t47-21l2 0z m166 328q26 34 26 78q0 78-54 116q-52 38-134 38q-64 0-104-26q-68-42-72-146l0-4l110 0l0 4q0 26 16 54q16 24 54 24q40 0 52-20q16-20 16-44q0-18-16-40q-8-12-20-20l-6-4q-6-4-16-11t-20-15t-21-17t-17-17q-14-20-18-78l0-8l108 0l0 4q0 12 4 28q6 20 28 36l28 18q46 34 56 50z" horiz-adv-x="920" />
+<glyph glyph-name="info-circled-1" unicode="&#xe817;" d="m454 810q190 2 326-130t140-322q2-190-131-327t-323-141q-190-2-327 131t-139 323q-4 190 130 327t324 139z m52-152q-42 0-65-24t-23-50q-2-28 15-44t49-16q38 0 61 22t23 54q0 58-60 58z m-120-594q30 0 84 26t106 78l-18 24q-48-36-72-36q-14 0-4 38l42 160q26 96-22 96q-30 0-89-29t-115-75l16-26q52 34 74 34q12 0 0-34l-36-152q-26-104 34-104z" horiz-adv-x="920" />
+<glyph glyph-name="home" unicode="&#xe80e;" d="m888 336q16-16 11-27t-27-11l-84 0l0-310q0-14-1-21t-8-13t-23-6l-204 0l0 310l-204 0l0-310l-194 0q-28 0-35 10t-7 30l0 310l-84 0q-22 0-27 11t11 27l400 402q16 16 38 16t38-16z" horiz-adv-x="900" />
+<glyph glyph-name="flag" unicode="&#xe81c;" d="m874 616q14 6 22-1t0-19q-96-138-164-213t-110-90t-73-2t-60 37t-63 40t-93-4t-139-86l90-352l-100 0l-184 720l92 34q90 66 152 86t98 3t64-51t62-71t79-62t129-20t198 51z" horiz-adv-x="900" />
+<glyph glyph-name="upload" unicode="&#xe813;" d="m500 776l260-244l-164 0l0-256l-190 0l0 256l-166 0z m468-578q18-10 27-32t3-40l-28-154q-4-20-22-33t-40-13l-816 0q-22 0-40 13t-22 33l-28 154q-10 48 32 72l158 108l98 0l-170-130l178 0q8 0 12-8l40-110l300 0l40 110q8 8 12 8l178 0l-170 130l98 0z" horiz-adv-x="1000" />
+<glyph glyph-name="upload-cloud" unicode="&#xe814;" d="m760 494q100 0 170-68t70-166t-70-166t-170-68l-190 0l0 190l106 0l-176 230l-174-230l104 0l0-190l-248 0q-74 0-128 52t-54 124q0 74 53 126t129 52q14 0 20-2q-2 12-2 38q0 108 78 184t188 76q90 0 160-52t94-134q28 4 40 4z" horiz-adv-x="1000" />
+<glyph glyph-name="tools" unicode="&#xe803;" d="m155 506q-8-8-11-22t-3-25t-2-11q-2-2-17-15t-19-17q-16-14-28 4l-70 76q-11 12 2 24q2 2 18 14t20 16q6 6 27 6t37 14q14 14 18 38t10 30q2 0 9 7t26 22t41 31q134 90 186 96q122 0 148-2q12 0-8-8q-120-52-152-76q-80-56-36-114q34-46 38-48q8-8-2-14q-2-2-38-35t-38-35q-14-8-18-4q-42 48-71 60t-67-12z m286-26l410-476q18-22-2-38l-48-42q-22-14-38 4l-414 472q-8 8 0 20l72 62q12 8 20-2z m554 202q16-104-16-166q-50-88-154-62q-56 12-100-32l-82-78l-68 78l68 70q24 24 31 53t6 65t5 58q12 56 140 112q12 6 18-3t2-15q-12-12-46-80q-14-10-12-35t40-53q58-40 96 22q6 12 26 41t22 33q4 10 13 9t11-17z m-858-684l254 248l76-86l-246-242q-20-20-38-4l-46 46q-22 18 0 38z" horiz-adv-x="1000" />
+<glyph glyph-name="hourglass" unicode="&#xe81e;" d="m560 622q0-44-48-96t-97-99t-49-77t49-76t97-97t48-97l0-118q0-34-86-73t-194-39t-194 39t-86 73l0 118q0 46 48 97t97 97t49 76t-49 77t-97 99t-48 96l0 118q0 32 87 71t193 39t193-39t87-71l0-118z m-482 112l-18-14q-4-8 4-14q92-52 216-52q132 0 220 50q14 10-16 30q-96 54-202 54q-120 0-204-54z m228-384q0 18 4 33t18 33t20 25t31 31t29 28q92 92 92 122l2 50q-100-54-222-54t-222 54l4-50q0-32 90-122q6-6 22-21t23-22l19-19t17-21t11-20t9-23t3-24q0-10-1-19t-6-18t-8-16t-11-17l-12-15t-15-16t-16-15t-18-16t-17-16q-90-90-90-122l0-66q8 4 66 23t92 43t34 58q0 30 26 30t26-30q0-34 33-58t94-43t67-23l0 66q0 30-92 122q-4 4-21 20t-22 21t-18 19t-18 22t-12 20t-9 23t-2 23z" horiz-adv-x="560" />
+<glyph glyph-name="network" unicode="&#xe816;" d="m224 504q-22 0-42-10q-48 52-92 128q54 74 128 118q92-38 152-82q-6-16-6-32q0-6 4-22q-62-48-116-104q-16 4-28 4z m-98-98q0-34 20-60q-60-114-80-232q-66 106-66 236q0 110 50 206q38-62 84-112q-8-24-8-38z m336 318q-28 0-50-14q-58 42-114 70q84 30 162 30q120 0 230-62q-76-14-162-50q-26 26-66 26z m146-460q-160 24-290 112q4 20 4 30q0 24-14 52q38 44 98 90q26-20 56-20q14 0 38 8q94-108 134-240q-16-14-26-32z m128-132q38 14 54 60q58 4 108 18q-46-146-166-232q6 48 6 98q0 10-1 28t-1 28z m-150 66q-190-96-304-272q-90 36-158 110q12 144 80 274q6-2 20-2q30 0 52 14q142-98 310-124z m184 492q150-136 150-340q0-22-4-66q-64-18-130-24q-24 56-88 60q-48 146-148 264q10 20 10 42l0 10q100 42 210 54z m-136-544q14-10 32-18q2-18 2-52q0-80-14-144q-86-42-194-42q-58 0-112 12q110 160 286 244z" horiz-adv-x="920" />
+<glyph glyph-name="brush" unicode="&#xe807;" d="m118 170q38 34 85 29t87-45q42-40 48-87t-30-83q-86-84-228-102q-84-12-80 14q0 4 6 10q52 60 64 145t48 119z m840 646q26-26-148-248t-292-338q-38-38-124-104q-8-6-16 8q-18 34-48 64q-32 32-66 48q-16 6-8 16q64 84 104 122q118 116 344 287t254 145z" horiz-adv-x="962" />
+<glyph glyph-name="language" unicode="&#xe800;" d="m988 306q30-82-10-176t-134-160q-10 0-12 2t-16 19t-16 19q-2 6 2 10q86 60 117 152t-11 148q-16-38-39-76t-59-80t-86-65t-106-15q-52 6-84 41t-32 93q0 84 60 148q50 50 114 66l-2 100q-140-24-146-24q-6-2-10 4q0 2-5 29t-5 31q-2 2 1 4t7 2l156 28q0 110-2 114q0 8 8 8q46 0 52 2q10 0 10-8l0-104q158 22 164 22q8 4 10-6q0-2 4-23t4-25q4-10-4-12l-176-30l0-102l12 0q86 0 148-36t86-100z m-370-160q28-6 62 6l-4 214q-34-12-60-40q-44-44-44-108q0-66 46-72z m122 28q28 24 58 68t45 79t7 41q-36 18-96 18q-2 0-6-1t-6-1z m-448 382q10-28 53-165t83-261t40-126q0-4-4-4l-86 0q-6 0-6 4l-50 166l-176 0q-48-164-50-166q0-4-6-4l-86 0q-4 0-4 4q10 18 176 552q2 8 10 8l96 0q10 0 10-8z m-130-316l144 0l-72 264z" horiz-adv-x="1001" />
+<glyph glyph-name="key" unicode="&#xe815;" d="m774 612q20-116-28-215t-150-117q-66-12-130-2l-118-194l-70-12l-104-166q-14-28-46-32l-76-14q-12-4-22 4t-12 22l-16 98q-8 30 12 56l258 386q-24 50-38 120q-18 106 53 187t185 101q106 20 195-45t107-177z m-126-76q30 44 21 97t-51 83q-42 32-92 22t-80-54q-8-12-12-23t-1-20t5-16t13-17t18-15t22-16t23-17q6-4 22-16t23-16t19-12t19-8t17 1t18 8t16 19z" horiz-adv-x="780" />
+<glyph glyph-name="flow-branch" unicode="&#xe808;" d="m640 650q0-80-74-110q-6-58-28-101t-61-69t-68-38t-75-26q-42-14-63-22t-47-24t-38-40t-16-60q70-30 70-110q0-50-35-85t-85-35t-85 35t-35 85q0 78 72 112l0 378q-72 34-72 110q0 50 35 85t85 35t85-35t35-85q0-76-72-110l0-204q40 30 138 60q58 18 84 29t51 41t29 76q-70 32-70 108q0 50 35 85t85 35t85-35t35-85z m-588 0q0-28 20-48t48-20t49 20t21 48q0 30-21 50t-49 20t-48-20t-20-50z m68-668q28 0 49 20t21 48q0 30-21 50t-49 20t-48-20t-20-50q0-28 20-48t48-20z m400 600q28 0 49 20t21 48q0 30-21 50t-49 20t-48-20t-20-50q0-28 20-48t48-20z" horiz-adv-x="640" />
+<glyph glyph-name="puzzle" unicode="&#xe7b6;" d="m586 402q-37 0-64-34t-27-82t27-84t64-34q22 0 43 13q26 17 37 11t12-24l0-144q0-31-24-54t-55-23l-143 0q-16 0-23 9t2 31q21 25 21 51q0 38-34 64t-83 26t-83-26t-35-64q0-22 13-44q17-26 12-37t-25-10l-143 0q-33 0-55 23t-23 54l0 144q0 16 9 23t31-3q24-20 51-20q38 0 65 34t27 84t-27 82t-65 34q-21 0-42-13q-26-17-38-12t-11 25l0 91q0 33 23 56t55 23l143 0q19 0 25 10t-11 37q-14 20-14 44q0 38 35 64t83 26t83-26t34-64q0-26-21-51q-10-21-2-31t23-9l143 0q31 0 55-23t24-56l0-91q0-16-10-23t-30 3q-24 20-52 20z" horiz-adv-x="678" />
+<glyph glyph-name="mail-1" unicode="&#xe810;" d="m467 366l-449 210l0 109l893 0l0-109z m0-123l444 210l0-437l-893 0l0 438z" horiz-adv-x="928" />
+<glyph glyph-name="equalizer" unicode="&#xe80f;" d="m576 239l0-112l-55 0l0-167q0-23-17-40t-39-17t-39 17t-17 40l0 167l-56 0l0 112l56 0l0 503q0 24 17 39t38 16q24 0 41-16t16-39l0-503l55 0z m335 335l0-112l-55 0l0-502q0-23-16-40t-41-17q-23 0-39 17t-16 40l0 502l-56 0l0 112l56 0l0 168q0 24 16 39t39 16t41-16t16-39l0-168l55 0z m-670-112l0-111l-55 0l0-391q0-23-16-40t-40-17q-23 0-39 17t-17 40l0 391l-56 0l0 111l56 0l0 280q0 24 16 39t40 16t40-16t16-39l0-280l55 0z" horiz-adv-x="928" />
+<glyph glyph-name="users" unicode="&#xe802;" d="m0 49q20 7 60 22t69 26t50 22q37 19 57 56t21 76q0 27-31 64q-19 21-33 60q-45 18-45 76q0 43 14 61q-5 39-9 82q-5 55 26 108t84 84t110 32q43 0 85-19t73-50t48-72t14-83q-4-55-8-82q14-19 14-61q0-58-45-76q-15-41-32-60q-32-37-32-64q0-39 20-76t58-56q29-15 92-38t113-43t66-38q18-17 28-47t10-51l1-21h-878v168z m705 299q0 34 12 50q-5 32-7 67q-4 45 21 89t69 72t90 27t89-27t69-72t22-89q-2-35-8-67q12-16 12-50q0-48-36-62q-12-33-27-50q-9-10-13-16t-9-16t-4-20q0-32 17-62t47-46q17-9 42-19t60-22t50-19v-135h-254q0 4 0 11t-3 26t-7 36t-15 38t-23 33q-23 25-53 44t-79 37q27 34 27 78q0 10-5 20t-8 16t-12 16q-14 15-27 49q-37 16-37 63z" horiz-adv-x="1201.2" />
+<glyph glyph-name="group" unicode="&#xe80d;" d="m0 106l0 134q0 26 18 32l171 80q-66 39-68 131q0 56 35 103q37 41 90 43q31 0 63-19q-49-125 23-237q-12-11-25-19l-114-55q-48-23-52-84l0-143l-114 0q-25 0-27 34z m193-59l0 168q0 27 22 37l152 70l57 28q-37 23-60 66t-22 94q0 76 46 130t110 54t109-54t45-130q0-106-78-158l61-30l146-70q24-10 24-37l0-168q-2-37-37-41l-541 0q-14 2-24 14t-10 27z m473 330q68 106 22 231q31 19 66 21q49 0 90-43q35-41 35-103q0-82-65-131l168-80q18-10 18-32l0-134q0-32-27-34l-118 0l0 143q0 57-50 84l-110 53q-15 8-29 25z" horiz-adv-x="1000" />
+<glyph glyph-name="shuffle" unicode="&#x1f500;" d="m372 582q-34-52-77-153q-12 25-20 41t-23 35t-28 32t-36 19t-45 8h-125q-8 0-13 5t-5 13v107q0 8 5 13t13 5h125q139 0 229-125z m628-446q0-8-5-13l-179-179q-5-5-12-5q-8 0-13 6t-5 12v107q-18 0-48 0t-45-1t-41 1t-39 3t-36 6t-35 10t-32 16t-33 22t-31 30t-31 39q33 52 76 152q12-25 20-40t23-36t28-31t35-20t46-8h143v107q0 8 5 13t13 5q6 0 13-5l178-178q5-5 5-13z m0 500q0-8-5-13l-179-179q-5-5-12-5q-8 0-13 6t-5 12v107h-143q-27 0-49-8t-38-25t-29-35t-25-43q-18-34-43-95q-16-37-28-62t-30-59t-36-55t-41-47t-50-38t-60-23t-71-10h-125q-8 0-13 5t-5 13v107q0 8 5 13t13 5h125q27 0 48 9t39 25t28 34t26 43q17 35 43 96q16 36 28 62t30 58t36 56t41 46t50 38t59 24t72 9h143v107q0 8 5 13t13 5q6 0 13-5l178-178q5-5 5-13z" horiz-adv-x="1000" />
+</font>
+</defs>
+</svg> \ No newline at end of file
diff --git a/admin/themes/default/fontello/font/fontello.ttf b/admin/themes/default/fontello/font/fontello.ttf
new file mode 100644
index 000000000..328a9c5f9
--- /dev/null
+++ b/admin/themes/default/fontello/font/fontello.ttf
Binary files differ
diff --git a/admin/themes/default/fontello/font/fontello.woff b/admin/themes/default/fontello/font/fontello.woff
new file mode 100644
index 000000000..9e17f2e50
--- /dev/null
+++ b/admin/themes/default/fontello/font/fontello.woff
Binary files differ
diff --git a/admin/themes/default/icon/index.php b/admin/themes/default/icon/index.php
index 41732f2fd..c8de97f60 100644
--- a/admin/themes/default/icon/index.php
+++ b/admin/themes/default/icon/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/admin/themes/default/icon/plug_activate.png b/admin/themes/default/icon/plug_activate.png
deleted file mode 100644
index feb97a1c9..000000000
--- a/admin/themes/default/icon/plug_activate.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/default/icon/plug_activate_grey.png b/admin/themes/default/icon/plug_activate_grey.png
deleted file mode 100644
index bf2a9be53..000000000
--- a/admin/themes/default/icon/plug_activate_grey.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/default/icon/plug_deactivate.png b/admin/themes/default/icon/plug_deactivate.png
deleted file mode 100644
index 8401ad8b9..000000000
--- a/admin/themes/default/icon/plug_deactivate.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/default/icon/plug_deactivate_grey.png b/admin/themes/default/icon/plug_deactivate_grey.png
deleted file mode 100644
index a7e55e669..000000000
--- a/admin/themes/default/icon/plug_deactivate_grey.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/default/icon/plug_delete.png b/admin/themes/default/icon/plug_delete.png
deleted file mode 100644
index 285e53e19..000000000
--- a/admin/themes/default/icon/plug_delete.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/default/icon/plug_delete_grey.png b/admin/themes/default/icon/plug_delete_grey.png
deleted file mode 100644
index d3d070bfc..000000000
--- a/admin/themes/default/icon/plug_delete_grey.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/default/icon/plug_install.png b/admin/themes/default/icon/plug_install.png
deleted file mode 100644
index bef78e171..000000000
--- a/admin/themes/default/icon/plug_install.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/default/icon/plug_install_grey.png b/admin/themes/default/icon/plug_install_grey.png
deleted file mode 100644
index 3bd56be3c..000000000
--- a/admin/themes/default/icon/plug_install_grey.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/default/icon/plug_uninstall.png b/admin/themes/default/icon/plug_uninstall.png
deleted file mode 100644
index 9fd420ad7..000000000
--- a/admin/themes/default/icon/plug_uninstall.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/default/icon/plug_uninstall_grey.png b/admin/themes/default/icon/plug_uninstall_grey.png
deleted file mode 100644
index 4d6291cee..000000000
--- a/admin/themes/default/icon/plug_uninstall_grey.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/default/icon/ranks.png b/admin/themes/default/icon/ranks.png
deleted file mode 100644
index 47710e87f..000000000
--- a/admin/themes/default/icon/ranks.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/default/icon/ranks_grey.png b/admin/themes/default/icon/ranks_grey.png
deleted file mode 100644
index f9757b998..000000000
--- a/admin/themes/default/icon/ranks_grey.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/default/icon/sync_metadata.png b/admin/themes/default/icon/sync_metadata.png
deleted file mode 100644
index c527e2b04..000000000
--- a/admin/themes/default/icon/sync_metadata.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/default/icon/sync_metadata_pink.png b/admin/themes/default/icon/sync_metadata_pink.png
deleted file mode 100644
index 954c69612..000000000
--- a/admin/themes/default/icon/sync_metadata_pink.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/default/icon/synchronize.png b/admin/themes/default/icon/synchronize.png
deleted file mode 100644
index 767bb3b6d..000000000
--- a/admin/themes/default/icon/synchronize.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/default/images/jgrowl-alert.png b/admin/themes/default/images/jgrowl-alert.png
deleted file mode 100644
index 388fcbb81..000000000
--- a/admin/themes/default/images/jgrowl-alert.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/default/images/jgrowl-check.png b/admin/themes/default/images/jgrowl-check.png
deleted file mode 100644
index b6a649a1b..000000000
--- a/admin/themes/default/images/jgrowl-check.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/default/images/jgrowl-error.png b/admin/themes/default/images/jgrowl-error.png
deleted file mode 100644
index 48ef138c7..000000000
--- a/admin/themes/default/images/jgrowl-error.png
+++ /dev/null
Binary files differ
diff --git a/admin/themes/default/index.php b/admin/themes/default/index.php
index 41732f2fd..c8de97f60 100644
--- a/admin/themes/default/index.php
+++ b/admin/themes/default/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/admin/themes/default/js/common.js b/admin/themes/default/js/common.js
new file mode 100644
index 000000000..a017115db
--- /dev/null
+++ b/admin/themes/default/js/common.js
@@ -0,0 +1,55 @@
+function array_delete(arr, item) {
+ var i = arr.indexOf(item);
+ if (i != -1) arr.splice(i, 1);
+}
+
+function str_repeat(i, m) {
+ for (var o = []; m > 0; o[--m] = i);
+ return o.join('');
+}
+
+function sprintf() {
+ var i = 0, a, f = arguments[i++], o = [], m, p, c, x, s = '';
+ while (f) {
+ if (m = /^[^\x25]+/.exec(f)) {
+ o.push(m[0]);
+ }
+ else if (m = /^\x25{2}/.exec(f)) {
+ o.push('%');
+ }
+ else if (m = /^\x25(?:(\d+)\$)?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(f)) {
+ if (((a = arguments[m[1] || i++]) == null) || (a == undefined)) {
+ throw('Too few arguments.');
+ }
+ if (/[^s]/.test(m[7]) && (typeof(a) != 'number')) {
+ throw('Expecting number but found ' + typeof(a));
+ }
+
+ switch (m[7]) {
+ case 'b': a = a.toString(2); break;
+ case 'c': a = String.fromCharCode(a); break;
+ case 'd': a = parseInt(a); break;
+ case 'e': a = m[6] ? a.toExponential(m[6]) : a.toExponential(); break;
+ case 'f': a = m[6] ? parseFloat(a).toFixed(m[6]) : parseFloat(a); break;
+ case 'o': a = a.toString(8); break;
+ case 's': a = ((a = String(a)) && m[6] ? a.substring(0, m[6]) : a); break;
+ case 'u': a = Math.abs(a); break;
+ case 'x': a = a.toString(16); break;
+ case 'X': a = a.toString(16).toUpperCase(); break;
+ }
+
+ a = (/[def]/.test(m[7]) && m[2] && a >= 0 ? '+'+ a : a);
+ c = m[3] ? m[3] == '0' ? '0' : m[3].charAt(1) : ' ';
+ x = m[5] - String(a).length - s.length;
+ p = m[5] ? str_repeat(c, x) : '';
+ o.push(s + (m[4] ? a + p : p + a));
+ }
+ else {
+ throw('Huh ?!');
+ }
+
+ f = f.substring(m[0].length);
+ }
+
+ return o.join('');
+} \ No newline at end of file
diff --git a/admin/themes/default/js/jquery.geoip.js b/admin/themes/default/js/jquery.geoip.js
new file mode 100644
index 000000000..cba374ba5
--- /dev/null
+++ b/admin/themes/default/js/jquery.geoip.js
@@ -0,0 +1,62 @@
+
+GeoIp = {
+ cache: {},
+ pending: {},
+
+ get: function(ip, callback){
+ if (!GeoIp.storageInit && window.localStorage) {
+ GeoIp.storageInit = true;
+ var cache = localStorage.getItem("freegeoip");
+ if (cache) {
+ cache = JSON.parse(cache);
+ for (var key in cache) {
+ var data = cache[key];
+ if ( (new Date()).getTime() - data.reqTime > 36 * 3600000)
+ delete cache[key];
+ }
+ GeoIp.cache = cache;
+ }
+ jQuery(window).on("unload", function() {
+ localStorage.setItem("freegeoip", JSON.stringify(GeoIp.cache) );
+ } );
+ }
+
+ if (GeoIp.cache.hasOwnProperty(ip))
+ callback(GeoIp.cache[ip]);
+ else if (GeoIp.pending[ip])
+ GeoIp.pending[ip].push(callback);
+ else {
+ GeoIp.pending[ip] = [callback];
+ jQuery.ajax( {
+ url: "http://freegeoip.net/json/" + ip,
+ dataType: "jsonp",
+ cache: true,
+ timeout: 5000,
+ success: function(data) {
+ data.reqTime = (new Date()).getTime();
+ var res=[];
+ if (data.city) res.push(data.city);
+ if (data.region_name) res.push(data.region_name);
+ if (data.country_name) res.push(data.country_name);
+ data.fullName = res.join(", ");
+
+ GeoIp.cache[ip] = data;
+ var callbacks = GeoIp.pending[ip];
+ delete GeoIp.pending[ip];
+ for (var i=0; i<callbacks.length; i++)
+ callbacks[i].call(null, data);
+ },
+
+ error: function() {
+ var data = {ip:ip, reqTime: (new Date()).getTime()};
+
+ GeoIp.cache[ip] = data;
+ var callbacks = GeoIp.pending[ip];
+ delete GeoIp.pending[ip];
+ for (var i=0; i<callbacks.length; i++)
+ callbacks[i].call(null, data);
+ }
+ });
+ }
+ }
+} \ No newline at end of file
diff --git a/admin/themes/default/js/menu_icons.js b/admin/themes/default/js/menu_icons.js
deleted file mode 100644
index 1b77d03a2..000000000
--- a/admin/themes/default/js/menu_icons.js
+++ /dev/null
@@ -1,11 +0,0 @@
-Raphael("menubarUsers", 20, 16).path("M21.053,20.8c-1.132-0.453-1.584-1.698-1.584-1.698s-0.51,0.282-0.51-0.51s0.51,0.51,1.02-2.548c0,0,1.414-0.397,1.132-3.68h-0.34c0,0,0.849-3.51,0-4.699c-0.85-1.189-1.189-1.981-3.058-2.548s-1.188-0.454-2.547-0.396c-1.359,0.057-2.492,0.792-2.492,1.188c0,0-0.849,0.057-1.188,0.397c-0.34,0.34-0.906,1.924-0.906,2.321s0.283,3.058,0.566,3.624l-0.337,0.113c-0.283,3.283,1.132,3.68,1.132,3.68c0.509,3.058,1.019,1.756,1.019,2.548s-0.51,0.51-0.51,0.51s-0.452,1.245-1.584,1.698c-1.132,0.452-7.416,2.886-7.927,3.396c-0.511,0.511-0.453,2.888-0.453,2.888h26.947c0,0,0.059-2.377-0.452-2.888C28.469,23.686,22.185,21.252,21.053,20.8zM8.583,20.628c-0.099-0.18-0.148-0.31-0.148-0.31s-0.432,0.239-0.432-0.432s0.432,0.432,0.864-2.159c0,0,1.199-0.336,0.959-3.119H9.538c0,0,0.143-0.591,0.237-1.334c-0.004-0.308,0.006-0.636,0.037-0.996l0.038-0.426c-0.021-0.492-0.107-0.939-0.312-1.226C8.818,9.619,8.53,8.947,6.947,8.467c-1.583-0.48-1.008-0.385-2.159-0.336C3.636,8.179,2.676,8.802,2.676,9.139c0,0-0.72,0.048-1.008,0.336c-0.271,0.271-0.705,1.462-0.757,1.885v0.281c0.047,0.653,0.258,2.449,0.469,2.872l-0.286,0.096c-0.239,2.783,0.959,3.119,0.959,3.119c0.432,2.591,0.864,1.488,0.864,2.159s-0.432,0.432-0.432,0.432s-0.383,1.057-1.343,1.439c-0.061,0.024-0.139,0.056-0.232,0.092v5.234h0.575c-0.029-1.278,0.077-2.927,0.746-3.594C2.587,23.135,3.754,22.551,8.583,20.628zM30.913,11.572c-0.04-0.378-0.127-0.715-0.292-0.946c-0.719-1.008-1.008-1.679-2.59-2.159c-1.584-0.48-1.008-0.385-2.16-0.336C24.72,8.179,23.76,8.802,23.76,9.139c0,0-0.719,0.048-1.008,0.336c-0.271,0.272-0.709,1.472-0.758,1.891h0.033l0.08,0.913c0.02,0.231,0.022,0.436,0.027,0.645c0.09,0.666,0.21,1.35,0.33,1.589l-0.286,0.096c-0.239,2.783,0.96,3.119,0.96,3.119c0.432,2.591,0.863,1.488,0.863,2.159s-0.432,0.432-0.432,0.432s-0.053,0.142-0.163,0.338c4.77,1.9,5.927,2.48,6.279,2.834c0.67,0.667,0.775,2.315,0.746,3.594h0.48v-5.306c-0.016-0.006-0.038-0.015-0.052-0.021c-0.959-0.383-1.343-1.439-1.343-1.439s-0.433,0.239-0.433-0.432s0.433,0.432,0.864-2.159c0,0,0.804-0.229,0.963-1.841v-1.227c-0.001-0.018-0.001-0.033-0.003-0.051h-0.289c0,0,0.215-0.89,0.292-1.861V11.572z").scale(0.6, 0.6, 0, 0).attr({fill: "#464646", stroke: "none"});
-
-Raphael("menubarAlbums", 20, 16).path("M6.812,17.202l7.396-3.665v-2.164h-0.834c-0.414,0-0.808-0.084-1.167-0.237v1.159l-7.396,3.667v2.912h2V17.202zM26.561,18.875v-2.913l-7.396-3.666v-1.158c-0.358,0.152-0.753,0.236-1.166,0.236h-0.832l-0.001,2.164l7.396,3.666v1.672H26.561zM16.688,18.875v-7.501h-2v7.501H16.688zM27.875,19.875H23.25c-1.104,0-2,0.896-2,2V26.5c0,1.104,0.896,2,2,2h4.625c1.104,0,2-0.896,2-2v-4.625C29.875,20.771,28.979,19.875,27.875,19.875zM8.125,19.875H3.5c-1.104,0-2,0.896-2,2V26.5c0,1.104,0.896,2,2,2h4.625c1.104,0,2-0.896,2-2v-4.625C10.125,20.771,9.229,19.875,8.125,19.875zM13.375,10.375H18c1.104,0,2-0.896,2-2V3.75c0-1.104-0.896-2-2-2h-4.625c-1.104,0-2,0.896-2,2v4.625C11.375,9.479,12.271,10.375,13.375,10.375zM18,19.875h-4.625c-1.104,0-2,0.896-2,2V26.5c0,1.104,0.896,2,2,2H18c1.104,0,2-0.896,2-2v-4.625C20,20.771,19.104,19.875,18,19.875z").scale(0.6, 0.6, 0, 0).attr({fill: "#464646", stroke: "none"});
-
-Raphael("menubarPhotos", 20, 16).path("M2.5,4.833v22.334h27V4.833H2.5zM25.25,25.25H6.75V6.75h18.5V25.25zM11.25,14c1.426,0,2.583-1.157,2.583-2.583c0-1.427-1.157-2.583-2.583-2.583c-1.427,0-2.583,1.157-2.583,2.583C8.667,12.843,9.823,14,11.25,14zM24.251,16.25l-4.917-4.917l-6.917,6.917L10.5,16.333l-2.752,2.752v5.165h16.503V16.25z").scale(0.6, 0.6, 0, 0).attr({fill: "#464646", stroke: "none"});
-
-Raphael("menubarPlugins", 20, 16).path("M3.739,13.619c0,0,3.516-4.669,5.592-3.642c2.077,1.027-0.414,2.795,1.598,3.719c2.011,0.924,5.048-0.229,4.376-2.899c-0.672-2.67-1.866-0.776-2.798-2.208c-0.934-1.432,4.586-4.59,4.586-4.59s3.361,6.651,4.316,4.911c1.157-2.105,3.193-4.265,5.305-1.025c0,0,1.814,2.412,0.246,3.434s-2.917,0.443-3.506,1.553c-0.586,1.112,3.784,4.093,3.784,4.093s-2.987,4.81-4.926,3.548c-1.939-1.262,0.356-3.364-2.599-3.989c-1.288-0.23-3.438,0.538-3.818,2.34c-0.13,2.709,1.604,2.016,2.797,3.475c1.191,1.457-4.484,4.522-4.484,4.522s-1.584-3.923-3.811-4.657c-2.227-0.735-0.893,2.135-2.917,2.531c-2.024,0.396-4.816-2.399-3.46-4.789c1.358-2.391,3.275-0.044,3.441-1.951C7.629,16.087,3.739,13.619,3.739,13.619z").scale(0.6, 0.6, 0, 0).attr({fill: "#464646", stroke: "none"});
-
-Raphael("menubarTools", 20, 16).path("M26.834,14.693c1.816-2.088,2.181-4.938,1.193-7.334l-3.646,4.252l-3.594-0.699L19.596,7.45l3.637-4.242c-2.502-0.63-5.258,0.13-7.066,2.21c-1.907,2.193-2.219,5.229-1.039,7.693L5.624,24.04c-1.011,1.162-0.888,2.924,0.274,3.935c1.162,1.01,2.924,0.888,3.935-0.274l9.493-10.918C21.939,17.625,24.918,16.896,26.834,14.693z").scale(0.5, 0.5, 0, 0).attr({fill: "#464646", stroke: "none"});
-
-Raphael("menubarConfiguration", 20, 16).path("M26.974,16.514l3.765-1.991c-0.074-0.738-0.217-1.454-0.396-2.157l-4.182-0.579c-0.362-0.872-0.84-1.681-1.402-2.423l1.594-3.921c-0.524-0.511-1.09-0.977-1.686-1.406l-3.551,2.229c-0.833-0.438-1.73-0.77-2.672-0.984l-1.283-3.976c-0.364-0.027-0.728-0.056-1.099-0.056s-0.734,0.028-1.099,0.056l-1.271,3.941c-0.967,0.207-1.884,0.543-2.738,0.986L7.458,4.037C6.863,4.466,6.297,4.932,5.773,5.443l1.55,3.812c-0.604,0.775-1.11,1.629-1.49,2.55l-4.05,0.56c-0.178,0.703-0.322,1.418-0.395,2.157l3.635,1.923c0.041,1.013,0.209,1.994,0.506,2.918l-2.742,3.032c0.319,0.661,0.674,1.303,1.085,1.905l4.037-0.867c0.662,0.72,1.416,1.351,2.248,1.873l-0.153,4.131c0.663,0.299,1.352,0.549,2.062,0.749l2.554-3.283C15.073,26.961,15.532,27,16,27c0.507,0,1.003-0.046,1.491-0.113l2.567,3.301c0.711-0.2,1.399-0.45,2.062-0.749l-0.156-4.205c0.793-0.513,1.512-1.127,2.146-1.821l4.142,0.889c0.411-0.602,0.766-1.243,1.085-1.905l-2.831-3.131C26.778,18.391,26.93,17.467,26.974,16.514zM20.717,21.297l-1.785,1.162l-1.098-1.687c-0.571,0.22-1.186,0.353-1.834,0.353c-2.831,0-5.125-2.295-5.125-5.125c0-2.831,2.294-5.125,5.125-5.125c2.83,0,5.125,2.294,5.125,5.125c0,1.414-0.573,2.693-1.499,3.621L20.717,21.297z").scale(0.5, 0.5, 0, 0).attr({fill: "#464646", stroke: "none"});
diff --git a/admin/themes/default/template/admin.tpl b/admin/themes/default/template/admin.tpl
index 9e929d449..7fc9dc179 100644
--- a/admin/themes/default/template/admin.tpl
+++ b/admin/themes/default/template/admin.tpl
@@ -10,50 +10,47 @@ jQuery(document).ready(function(){ldelim}
});
{/footer_script}
-{combine_script id='raphael' load='async' path='themes/default/js/raphael.js'}
-{combine_script id='raphael.menu_icons' require='raphael' load='async' path='admin/themes/default/js/menu_icons.js'}
-
<div id="menubar">
<div id="adminHome"><a href="{$U_ADMIN}">{'Administration Home'|@translate}</a></div>
- <dl class="first">
- <dt class="rdion"><span id="menubarPhotos">&nbsp;{'Photos'|@translate}&nbsp;</span></dt>
- <dd>
- <ul>
- <li><a href="{$U_ADD_PHOTOS}">{'Add'|@translate}</a></li>
- <li><a href="{$U_RATING}">{'Rating'|@translate}</a></li>
- <li><a href="{$U_TAGS}">{'Tags'|@translate}</a></li>
- <li><a href="{$U_RECENT_SET}">{'Recent photos'|@translate}</a></li>
- <li><a href="{$U_BATCH}">{'Batch Manager'|@translate}</a></li>
+ <dl class="first">
+ <dt class="rdion"><span class="icon-picture"> </span><span>{'Photos'|@translate}&nbsp;</span></dt>
+ <dd>
+ <ul>
+ <li><a class="icon-plus-circled" href="{$U_ADD_PHOTOS}">{'Add'|@translate}</a></li>
+ <li><a class="icon-star" href="{$U_RATING}">{'Rating'|@translate}</a></li>
+ <li><a class="icon-tags" href="{$U_TAGS}">{'Tags'|@translate}</a></li>
+ <li><a class="icon-clock" href="{$U_RECENT_SET}">{'Recent photos'|@translate}</a></li>
+ <li><a class="icon-pencil" href="{$U_BATCH}">{'Batch Manager'|@translate}</a></li>
{if $NB_PHOTOS_IN_CADDIE > 0}
- <li><a href="{$U_CADDIE}">{'Caddie'|@translate}<span class="adminMenubarCounter">{$NB_PHOTOS_IN_CADDIE}</span></a></li>
+ <li><a class="icon-flag" href="{$U_CADDIE}">{'Caddie'|@translate}<span class="adminMenubarCounter">{$NB_PHOTOS_IN_CADDIE}</span></a></li>
{/if}
- </ul>
- </dd>
- </dl>
- <dl>
- <dt class="rdion"><span id="menubarAlbums">&nbsp;{'Albums'|@translate}&nbsp;</span></dt>
+ </ul>
+ </dd>
+ </dl>
+ <dl>
+ <dt class="rdion"><span class="icon-sitemap"> </span><span>{'Albums'|@translate}&nbsp;</span></dt>
<dd>
<ul>
- <li><a href="{$U_CATEGORIES}">{'Manage'|@translate}</a></li>
- <li><a href="{$U_CAT_OPTIONS}">{'Properties'|@translate}</a></li>
+ <li><a class="icon-folder-open" href="{$U_CATEGORIES}">{'Manage'|@translate}</a></li>
+ <li><a class="icon-pencil" href="{$U_CAT_OPTIONS}">{'Properties'|@translate}</a></li>
</ul>
</dd>
- </dl>
- <dl>
- <dt class="rdion"><span id="menubarUsers">&nbsp;{'Users'|@translate}&nbsp;</span></dt>
- <dd>
+ </dl>
+ <dl>
+ <dt class="rdion"><span class="icon-users"> </span><span>{'Users'|@translate}&nbsp;</span></dt>
+ <dd>
<ul>
- <li><a href="{$U_USERS}">{'Manage'|@translate}</a></li>
- <li><a href="{$U_GROUPS}">{'Groups'|@translate}</a></li>
- <li><a href="{$U_NOTIFICATION_BY_MAIL}">{'Notification'|@translate}</a></li>
+ <li><a class="icon-user-add" href="{$U_USERS}">{'Manage'|@translate}</a></li>
+ <li><a class="icon-group" href="{$U_GROUPS}">{'Groups'|@translate}</a></li>
+ <li><a class="icon-mail-1" href="{$U_NOTIFICATION_BY_MAIL}">{'Notification'|@translate}</a></li>
</ul>
- </dd>
- </dl>
- <dl>
- <dt class="rdion"><span id="menubarPlugins">&nbsp;{'Plugins'|@translate}&nbsp;</span></dt>
- <dd>
+ </dd>
+ </dl>
+ <dl>
+ <dt class="rdion"><span class="icon-puzzle"> </span><span>{'Plugins'|@translate}&nbsp;</span></dt>
+ <dd>
<ul>
- <li><a href="{$U_PLUGINS}">{'Manage'|@translate}</a></li>
+ <li><a class="icon-equalizer" href="{$U_PLUGINS}">{'Manage'|@translate}</a></li>
</ul>
<div id="pluginsMenuSeparator"></div>
{if !empty($plugin_menu_items)}
@@ -63,34 +60,34 @@ jQuery(document).ready(function(){ldelim}
{/foreach}
</ul>
{/if}
- </dd>
- </dl>
- <dl>
- <dt class="rdion"><span id="menubarTools">&nbsp;{'Tools'|@translate}&nbsp;</span></dt>
- <dd>
+ </dd>
+ </dl>
+ <dl>
+ <dt class="rdion"><span class="icon-wrench"> </span><span>{'Tools'|@translate}&nbsp;</span></dt>
+ <dd>
<ul>
{if $ENABLE_SYNCHRONIZATION}
- <li><a href="{$U_CAT_UPDATE}">{'Synchronize'|@translate}</a></li>
- <li><a href="{$U_SITE_MANAGER}">{'Site manager'|@translate}</a></li>
+ <li><a class="icon-exchange" href="{$U_CAT_UPDATE}">{'Synchronize'|@translate}</a></li>
+ <li><a class="icon-flow-branch" href="{$U_SITE_MANAGER}">{'Site manager'|@translate}</a></li>
{/if}
- <li><a href="{$U_HISTORY_STAT}">{'History'|@translate}</a></li>
- <li><a href="{$U_MAINTENANCE}">{'Maintenance'|@translate}</a></li>
-{if isset($U_PENDING_COMMENTS)}
- <li><a href="{$U_PENDING_COMMENTS}">{'Pending Comments'|@translate}</a></li>
+ <li><a class="icon-signal" href="{$U_HISTORY_STAT}">{'History'|@translate}</a></li>
+ <li><a class="icon-tools" href="{$U_MAINTENANCE}">{'Maintenance'|@translate}</a></li>
+{if isset($U_COMMENTS)}
+ <li><a class="icon-chat" href="{$U_COMMENTS}">{'Comments'|@translate}{if $NB_PENDING_COMMENTS > 0}<span class="adminMenubarCounter" title="{'%d waiting for validation'|translate:$NB_PENDING_COMMENTS}">{$NB_PENDING_COMMENTS}</span>{/if}</a></li>
{/if}
- <li><a href="{$U_UPDATES}">{'Updates'|@translate}</a></li>
+ <li><a class="icon-arrows-cw" href="{$U_UPDATES}">{'Updates'|@translate}</a></li>
</ul>
- </dd>
- </dl>
- <dl class="last">
- <dt class="rdion"><span id="menubarConfiguration">&nbsp;{'Configuration'|@translate}&nbsp;</span></dt>
- <dd>
+ </dd>
+ </dl>
+ <dl class="last">
+ <dt class="rdion"><span class="icon-cog"> </span><span>{'Configuration'|@translate}&nbsp;</span></dt>
+ <dd>
<ul>
- <li><a href="{$U_CONFIG_GENERAL}">{'Options'|@translate}</a></li>
- <li><a href="{$U_CONFIG_MENUBAR}">{'Menu Management'|@translate}</a></li>
- <li><a href="{$U_CONFIG_EXTENTS}">{'Templates'|@translate}</a></li>
- <li><a href="{$U_CONFIG_LANGUAGES}">{'Languages'|@translate}</a></li>
- <li><a href="{$U_CONFIG_THEMES}">{'Themes'|@translate}</a></li>
+ <li><a class="icon-cog-alt" href="{$U_CONFIG_GENERAL}">{'Options'|@translate}</a></li>
+ <li><a class="icon-menu" href="{$U_CONFIG_MENUBAR}">{'Menu Management'|@translate}</a></li>
+ <li><a class="icon-code" href="{$U_CONFIG_EXTENTS}">{'Templates'|@translate}</a></li>
+ <li><a class="icon-language" href="{$U_CONFIG_LANGUAGES}">{'Languages'|@translate}</a></li>
+ <li><a class="icon-brush" href="{$U_CONFIG_THEMES}">{'Themes'|@translate}</a></li>
</ul>
</dd>
</dl>
@@ -107,7 +104,7 @@ jQuery(document).ready(function(){ldelim}
<li><a href="{$U_HELP}" onclick="popuphelp(this.href); return false;" title="{'Help'|@translate}"><img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/help.png" alt="(?)"></a></li>
</ul>
{/if}
-
+
{if isset($errors)}
<div class="errors">
<ul>
diff --git a/admin/themes/default/template/batch_manager_global.tpl b/admin/themes/default/template/batch_manager_global.tpl
index bb1311097..46e2aa77c 100644
--- a/admin/themes/default/template/batch_manager_global.tpl
+++ b/admin/themes/default/template/batch_manager_global.tpl
@@ -2,6 +2,8 @@
{include file='include/datepicker.inc.tpl'}
{include file='include/colorbox.inc.tpl'}
{include file='include/add_album.inc.tpl'}
+
+{combine_script id='common' load='footer' path='admin/themes/default/js/common.js'}
{combine_script id='jquery.ui.slider' require='jquery.ui' load='footer' path='themes/default/js/ui/minified/jquery.ui.slider.min.js'}
{combine_css path="themes/default/js/ui/theme/jquery.ui.slider.css"}
@@ -48,13 +50,14 @@ jQuery(document).ready(function() {
}
return true;
});
- $(this).click(function(event) {console.log(event.shiftKey);$(this).triggerHandler("shclick",event)});
+ $(this).click(function(event) { $(this).triggerHandler("shclick",event)});
});
}
$('ul.thumbnails').enableShiftClick();
});
{/literal}{/footer_script}
+{combine_css path='themes/default/js/plugins/jquery.tokeninput.css'}
{combine_script id='jquery.tokeninput' load='footer' require='jquery' path='themes/default/js/plugins/jquery.tokeninput.js'}
{combine_script id='jquery.progressBar' load='footer' path='themes/default/js/plugins/jquery.progressbar.min.js'}
{combine_script id='jquery.ajaxmanager' load='footer' path='themes/default/js/plugins/jquery.ajaxmanager.js'}
@@ -73,7 +76,7 @@ jQuery(document).ready(function() {ldelim}
newText: ' ({'new'|@translate})',
animateDropdown: false,
preventDuplicates: true,
- allowCreation: true
+ allowFreeTagging: true
}
);
@@ -85,7 +88,7 @@ jQuery(document).ready(function() {ldelim}
searchingText: '{'Searching...'|@translate}',
animateDropdown: false,
preventDuplicates: true,
- allowCreation: false
+ allowFreeTagging: false
}
);
@@ -117,52 +120,6 @@ var height_str = '{'Height'|@translate}';
var max_width_str = '{'Maximum width'|@translate}';
var max_height_str = '{'Maximum height'|@translate}';
{literal}
-function str_repeat(i, m) {
- for (var o = []; m > 0; o[--m] = i);
- return o.join('');
-}
-
-function sprintf() {
- var i = 0, a, f = arguments[i++], o = [], m, p, c, x, s = '';
- while (f) {
- if (m = /^[^\x25]+/.exec(f)) {
- o.push(m[0]);
- }
- else if (m = /^\x25{2}/.exec(f)) {
- o.push('%');
- }
- else if (m = /^\x25(?:(\d+)\$)?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(f)) {
- if (((a = arguments[m[1] || i++]) == null) || (a == undefined)) {
- throw('Too few arguments.');
- }
- if (/[^s]/.test(m[7]) && (typeof(a) != 'number')) {
- throw('Expecting number but found ' + typeof(a));
- }
- switch (m[7]) {
- case 'b': a = a.toString(2); break;
- case 'c': a = String.fromCharCode(a); break;
- case 'd': a = parseInt(a); break;
- case 'e': a = m[6] ? a.toExponential(m[6]) : a.toExponential(); break;
- case 'f': a = m[6] ? parseFloat(a).toFixed(m[6]) : parseFloat(a); break;
- case 'o': a = a.toString(8); break;
- case 's': a = ((a = String(a)) && m[6] ? a.substring(0, m[6]) : a); break;
- case 'u': a = Math.abs(a); break;
- case 'x': a = a.toString(16); break;
- case 'X': a = a.toString(16).toUpperCase(); break;
- }
- a = (/[def]/.test(m[7]) && m[2] && a >= 0 ? '+'+ a : a);
- c = m[3] ? m[3] == '0' ? '0' : m[3].charAt(1) : ' ';
- x = m[5] - String(a).length - s.length;
- p = m[5] ? str_repeat(c, x) : '';
- o.push(s + (m[4] ? a + p : p + a));
- }
- else {
- throw('Huh ?!');
- }
- f = f.substring(m[0].length);
- }
- return o.join('');
-}
function progress(success) {
jQuery('#progressBar').progressBar(derivatives.done, {
@@ -676,15 +633,15 @@ $(document).ready(function() {
{'Dimensions'|@translate}
<blockquote>
- {'Width'|@translate} <span id="filter_dimension_width_info">{'between %d and %d pixels'|@translate|sprintf:$dimensions.selected.min_width:$dimensions.selected.max_width}</span>
+ {'Width'|@translate} <span id="filter_dimension_width_info">{'between %d and %d pixels'|@translate:$dimensions.selected.min_width:$dimensions.selected.max_width}</span>
| <a class="dimensions-choice" data-type="width" data-min="{$dimensions.bounds.min_width}" data-max="{$dimensions.bounds.max_width}">{'Reset'|@translate}</a>
<div id="filter_dimension_width_slider"></div>
- {'Height'|@translate} <span id="filter_dimension_height_info">{'between %d and %d pixels'|@translate|sprintf:$dimensions.selected.min_height:$dimensions.selected.max_height}</span>
+ {'Height'|@translate} <span id="filter_dimension_height_info">{'between %d and %d pixels'|@translate:$dimensions.selected.min_height:$dimensions.selected.max_height}</span>
| <a class="dimensions-choice" data-type="height" data-min="{$dimensions.bounds.min_height}" data-max="{$dimensions.bounds.max_height}">{'Reset'|@translate}</a>
<div id="filter_dimension_height_slider"></div>
- {'Ratio'|@translate} ({'Width'|@translate}/{'Height'|@translate}) <span id="filter_dimension_ratio_info">{'between %.2f and %.2f'|@translate|sprintf:$dimensions.selected.min_ratio:$dimensions.selected.max_ratio}</span>
+ {'Ratio'|@translate} ({'Width'|@translate}/{'Height'|@translate}) <span id="filter_dimension_ratio_info">{'between %.2f and %.2f'|@translate:$dimensions.selected.min_ratio:$dimensions.selected.max_ratio}</span>
{if isset($dimensions.ratio_portrait)}
| <a class="dimensions-choice" data-type="ratio" data-min="{$dimensions.ratio_portrait.min}" data-max="{$dimensions.ratio_portrait.max}">{'Portrait'|@translate}</a>
{/if}
@@ -768,8 +725,8 @@ UL.thumbnails SPAN.wrap2 {ldelim}
<span class="wrap2{if $isSelected} thumbSelected{/if}">
<div class="actions"><a href="{$thumbnail.FILE_SRC}" class="preview-box">{'Zoom'|@translate}</a> &middot; <a href="{$thumbnail.U_EDIT}" target="_blank">{'Edit'|@translate}</a></div>
{if $thumbnail.level > 0}
- <em class="levelIndicatorB">{$pwg->l10n($pwg->sprintf('Level %d',$thumbnail.level))}</em>
- <em class="levelIndicatorF" title="{'Who can see these photos?'|@translate} : ">{$pwg->l10n($pwg->sprintf('Level %d',$thumbnail.level))}</em>
+ <em class="levelIndicatorB">{'Level %d'|@sprintf:$thumbnail.level|@translate}</em>
+ <em class="levelIndicatorF" title="{'Who can see these photos?'|@translate} : ">{'Level %d'|@sprintf:$thumbnail.level|@translate}</em>
{/if}
<img src="{$thumbnail.thumb->get_url()}" alt="{$thumbnail.file}" title="{$thumbnail.TITLE|@escape:'html'}" {$thumbnail.thumb->get_size_htm()}>
</span>
@@ -810,7 +767,7 @@ UL.thumbnails SPAN.wrap2 {ldelim}
<select name="selectAction">
<option value="-1">{'Choose an action'|@translate}</option>
<option disabled="disabled">------------------</option>
- <option value="delete">{'Delete selected photos'|@translate}</option>
+ <option value="delete" class="icon-trash">{'Delete selected photos'|@translate}</option>
<option value="associate">{'Associate to album'|@translate}</option>
<option value="move">{'Move to album'|@translate}</option>
{if !empty($dissociate_options)}
@@ -823,7 +780,7 @@ UL.thumbnails SPAN.wrap2 {ldelim}
<option value="author">{'Set author'|@translate}</option>
<option value="title">{'Set title'|@translate}</option>
<option value="date_creation">{'Set creation date'|@translate}</option>
- <option value="level">{'Who can see these photos?'|@translate}</option>
+ <option value="level" class="icon-lock">{'Who can see these photos?'|@translate}</option>
<option value="metadata">{'Synchronize metadata'|@translate}</option>
{if ($IN_CADDIE)}
<option value="remove_from_caddie">{'Remove from caddie'|@translate}</option>
@@ -884,14 +841,14 @@ UL.thumbnails SPAN.wrap2 {ldelim}
<div id="action_author" class="bulkAction">
<label><input type="checkbox" name="remove_author"> {'remove author'|@translate}</label><br>
{assign var='authorDefaultValue' value='Type here the author name'|@translate}
-<input type="text" class="large" name="author" value="{$authorDefaultValue}" onfocus="this.value=(this.value=='{$authorDefaultValue}') ? '' : this.value;" onblur="this.value=(this.value=='') ? '{$authorDefaultValue}' : this.value;">
+<input type="text" class="large" name="author" value="{$authorDefaultValue}" onfocus="this.value=(this.value=='{$authorDefaultValue|@escape:javascript}') ? '' : this.value;" onblur="this.value=(this.value=='') ? '{$authorDefaultValue|@escape:javascript}' : this.value;">
</div>
<!-- title -->
<div id="action_title" class="bulkAction">
<label><input type="checkbox" name="remove_title"> {'remove title'|@translate}</label><br>
{assign var='titleDefaultValue' value='Type here the title'|@translate}
-<input type="text" class="large" name="title" value="{$titleDefaultValue}" onfocus="this.value=(this.value=='{$titleDefaultValue}') ? '' : this.value;" onblur="this.value=(this.value=='') ? '{$titleDefaultValue}' : this.value;">
+<input type="text" class="large" name="title" value="{$titleDefaultValue}" onfocus="this.value=(this.value=='{$titleDefaultValue|@escape:javascript}') ? '' : this.value;" onblur="this.value=(this.value=='') ? '{$titleDefaultValue|@escape:javascript}' : this.value;">
</div>
<!-- date_creation -->
diff --git a/admin/themes/default/template/batch_manager_unit.tpl b/admin/themes/default/template/batch_manager_unit.tpl
index 7dee4fa51..859a9b6a0 100644
--- a/admin/themes/default/template/batch_manager_unit.tpl
+++ b/admin/themes/default/template/batch_manager_unit.tpl
@@ -2,6 +2,7 @@
{include file='include/datepicker.inc.tpl'}
{include file='include/colorbox.inc.tpl'}
+{combine_css path='themes/default/js/plugins/jquery.tokeninput.css'}
{combine_script id='jquery.tokeninput' load='async' require='jquery' path='themes/default/js/plugins/jquery.tokeninput.js'}
{footer_script require='jquery.tokeninput'}
jQuery(document).ready(function() {ldelim}
@@ -14,7 +15,7 @@ jQuery(document).ready(function() {ldelim}
newText: ' ({'new'|@translate})',
animateDropdown: false,
preventDuplicates: true,
- allowCreation: true
+ allowFreeTagging: true
}
);
diff --git a/admin/themes/default/template/cat_list.tpl b/admin/themes/default/template/cat_list.tpl
index 859034a77..5fe54b9eb 100644
--- a/admin/themes/default/template/cat_list.tpl
+++ b/admin/themes/default/template/cat_list.tpl
@@ -1,8 +1,6 @@
{footer_script require='jquery.ui.sortable'}{literal}
jQuery(document).ready(function(){
- jQuery(".catPos").hide();
jQuery(".drag_button").show();
- jQuery("#manualOrder").hide();
jQuery(".categoryLi").css("cursor","move");
jQuery(".categoryUl").sortable({
axis: "y",
@@ -12,7 +10,7 @@ jQuery(document).ready(function(){
jQuery("#notManualOrder").hide();
jQuery("#formAutoOrder").hide();
jQuery("#formCreateAlbum").hide();
- },
+ }
});
jQuery("#categoryOrdering").submit(function(){
@@ -62,6 +60,7 @@ jQuery(document).ready(function(){
<p class="showCreateAlbum" id="notManualOrder">
<a href="#" id="addAlbumOpen">{'create a new album'|@translate}</a>
{if count($categories)}| <a href="#" id="autoOrderOpen">{'apply automatic sort order'|@translate}</a>{/if}
+ {if ($PARENT_EDIT)}| <a href="{$PARENT_EDIT}"></span>{'edit'|@translate}</a>{/if}
</p>
<form id="formCreateAlbum" action="{$F_ACTION}" method="post" style="display:none;">
<fieldset>
@@ -104,7 +103,7 @@ jQuery(document).ready(function(){
<form id="categoryOrdering" action="{$F_ACTION}" method="post">
<input type="hidden" name="pwg_token" value="{$PWG_TOKEN}">
- <p id="manualOrder">
+ <p id="manualOrder" style="display:none">
<input class="submit" name="submitManualOrder" type="submit" value="{'Save manual order'|@translate}">
{'... or '|@translate} <a href="#" id="cancelManualOrder">{'cancel manual order'|@translate}</a>
</p>
@@ -115,28 +114,21 @@ jQuery(document).ready(function(){
<li class="categoryLi{if $category.IS_VIRTUAL} virtual_cat{/if}" id="cat_{$category.ID}">
<!-- category {$category.ID} -->
<p class="albumTitle">
- <img src="{$themeconf.admin_icon_dir}/cat_move.png" class="button drag_button" style="display:none;" alt="{'Drag to re-order'|@translate}" title="{'Drag to re-order'|@translate}">
+ <img src="{$themeconf.admin_icon_dir}/cat_move.png" class="drag_button" style="display:none;" alt="{'Drag to re-order'|@translate}" title="{'Drag to re-order'|@translate}">
<strong><a href="{$category.U_CHILDREN}" title="{'manage sub-albums'|@translate}">{$category.NAME}</a></strong>
+ <span class="albumInfos"><span class="userSeparator">&middot;</span> {$category.NB_PHOTOS|translate_dec:'%d photo':'%d photos'} <span class="userSeparator">&middot;</span> {$category.NB_SUB_PHOTOS|translate_dec:'%d photo':'%d photos'} {$category.NB_SUB_ALBUMS|translate_dec:'in %d sub-album':'in %d sub-albums'}</span>
</p>
- <p class="catPos">
- <label>
- {'Position'|@translate} :
- <input type="text" size="4" name="catOrd[{$category.ID}]" maxlength="4" value="{$category.RANK}">
- </label>
- </p>
+ <input type="hidden" name="catOrd[{$category.ID}]" value="{$category.RANK}">
<p class="albumActions">
- <a href="{$category.U_EDIT}">{'Edit'|@translate}</a>
- {if isset($category.U_MANAGE_ELEMENTS) }
- | <a href="{$category.U_MANAGE_ELEMENTS}">{'manage album photos'|@translate}</a>
- {/if}
- | <a href="{$category.U_CHILDREN}">{'manage sub-albums'|@translate}</a>
+ <a href="{$category.U_EDIT}"><span class="icon-pencil"></span>{'Edit'|@translate}</a>
+ | <a href="{$category.U_CHILDREN}"><span class="icon-sitemap"></span>{'manage sub-albums'|@translate}</a>
{if isset($category.U_SYNC) }
- | <a href="{$category.U_SYNC}">{'Synchronize'|@translate}</a>
+ | <a href="{$category.U_SYNC}"><span class="icon-exchange"></span>{'Synchronize'|@translate}</a>
{/if}
{if isset($category.U_DELETE) }
- | <a href="{$category.U_DELETE}" onclick="return confirm('{'Are you sure?'|@translate|@escape:javascript}');">{'delete album'|@translate}</a>
+ | <a href="{$category.U_DELETE}" onclick="return confirm('{'Are you sure?'|@translate|@escape:javascript}');"><span class="icon-trash"></span>{'delete album'|@translate}</a>
{/if}
{if cat_admin_access($category.ID)}
| <a href="{$category.U_JUMPTO}">{'jump to album'|@translate} →</a>
diff --git a/admin/themes/default/template/cat_modify.tpl b/admin/themes/default/template/cat_modify.tpl
index e953ea322..52632ae92 100644
--- a/admin/themes/default/template/cat_modify.tpl
+++ b/admin/themes/default/template/cat_modify.tpl
@@ -29,23 +29,25 @@
<td id="albumLinks">
<p>{$INTRO}</p>
-<ul style="padding-left:15px;">
+<ul>
{if cat_admin_access($CAT_ID)}
- <li><a href="{$U_JUMPTO}">{'jump to album'|@translate} →</a></li>
+ <li><a class="icon-eye" href="{$U_JUMPTO}">{'jump to album'|@translate} →</a></li>
{/if}
{if isset($U_MANAGE_ELEMENTS) }
- <li><a href="{$U_MANAGE_ELEMENTS}">{'manage album photos'|@translate}</a></li>
+ <li><a class="icon-picture" href="{$U_MANAGE_ELEMENTS}">{'manage album photos'|@translate}</a></li>
{/if}
- <li><a href="{$U_CHILDREN}">{'manage sub-albums'|@translate}</a></li>
+ <li style="text-transform:lowercase;"><a class="icon-plus-circled" href="{$U_ADD_PHOTOS_ALBUM}">{'Add Photos'|translate}</a></li>
+
+ <li><a class="icon-sitemap" href="{$U_CHILDREN}">{'manage sub-albums'|@translate}</a></li>
{if isset($U_SYNC) }
- <li><a href="{$U_SYNC}">{'Synchronize'|@translate}</a> ({'Directory'|@translate} = {$CAT_FULL_DIR})</li>
+ <li><a class="icon-exchange" href="{$U_SYNC}">{'Synchronize'|@translate}</a> ({'Directory'|@translate} = {$CAT_FULL_DIR})</li>
{/if}
{if isset($U_DELETE) }
- <li><a href="{$U_DELETE}" onclick="return confirm('{'Are you sure?'|@translate|@escape:javascript}');">{'delete album'|@translate}</a></li>
+ <li><a class="icon-trash" href="{$U_DELETE}" onclick="return confirm('{'Are you sure?'|@translate|@escape:javascript}');">{'delete album'|@translate}</a></li>
{/if}
</ul>
@@ -83,14 +85,14 @@
<p>
<strong>{'Lock'|@translate}</strong>
<br>
- {html_radios name='visible' values='true,false'|@explode output='No,Yes'|@explode|translate selected=$CAT_VISIBLE}
+ {html_radios name='visible' values=['true','false'] output=['No'|translate,'Yes'|translate] selected=$CAT_VISIBLE}
</p>
{if isset($CAT_COMMENTABLE)}
<p>
<strong>{'Comments'|@translate}</strong>
<br>
- {html_radios name='commentable' values='false,true'|@explode output='No,Yes'|@explode|translate selected=$CAT_COMMENTABLE}
+ {html_radios name='commentable' values=['false','true'] output=['No'|translate,'Yes'|translate] selected=$CAT_COMMENTABLE}
</p>
{/if}
diff --git a/admin/themes/default/template/cat_perm.tpl b/admin/themes/default/template/cat_perm.tpl
index 718c7ba47..0415c87a4 100644
--- a/admin/themes/default/template/cat_perm.tpl
+++ b/admin/themes/default/template/cat_perm.tpl
@@ -76,7 +76,7 @@ jQuery(document).ready(function() {
{if isset($nb_users_granted_indirect)}
<p>
- {'%u users have automatic permission because they belong to a granted group.'|@translate|@sprintf:$nb_users_granted_indirect}
+ {'%u users have automatic permission because they belong to a granted group.'|@translate:$nb_users_granted_indirect}
<a href="#" id="indirectPermissionsDetailsHide" style="display:none">{'hide details'|@translate}</a>
<a href="#" id="indirectPermissionsDetailsShow">{'show details'|@translate}</a>
@@ -150,7 +150,7 @@ jQuery(document).ready(function() {
<p style="margin:12px;text-align:left;">
<input class="submit" type="submit" value="{'Save Settings'|@translate}" name="submit">
- <label id="applytoSubAction" style="display:none;"><input type="checkbox" name="apply_on_sub">{'Apply to sub-albums'|@translate}</label>
+ <label id="applytoSubAction" style="display:none;"><input type="checkbox" name="apply_on_sub" {if $INHERIT}checked="checked"{/if}>{'Apply to sub-albums'|@translate}</label>
</p>
<input type="hidden" name="pwg_token" value="{$PWG_TOKEN}">
diff --git a/admin/themes/default/template/comments.tpl b/admin/themes/default/template/comments.tpl
index 67a392db7..3b3a40422 100644
--- a/admin/themes/default/template/comments.tpl
+++ b/admin/themes/default/template/comments.tpl
@@ -15,26 +15,26 @@ jQuery(document).ready(function(){
jQuery(".checkComment").click(function(event) {
var checkbox = jQuery(this).children("input[type=checkbox]");
if (event.target.type !== 'checkbox') {
- jQuery(checkbox).attr('checked', !jQuery(checkbox).is(':checked'));
+ jQuery(checkbox).prop('checked', !jQuery(checkbox).prop('checked'));
}
highlighComments();
});
jQuery("#commentSelectAll").click(function () {
- jQuery(".checkComment input[type=checkbox]").attr('checked', true);
+ jQuery(".checkComment input[type=checkbox]").prop('checked', true);
highlighComments();
return false;
});
jQuery("#commentSelectNone").click(function () {
- jQuery(".checkComment input[type=checkbox]").attr('checked', false);
+ jQuery(".checkComment input[type=checkbox]").prop('checked', false);
highlighComments();
return false;
});
jQuery("#commentSelectInvert").click(function () {
jQuery(".checkComment input[type=checkbox]").each(function() {
- jQuery(this).attr('checked', !$(this).is(':checked'));
+ jQuery(this).prop('checked', !$(this).prop('checked'));
});
highlighComments();
return false;
@@ -43,10 +43,16 @@ jQuery(document).ready(function(){
});
{/literal}{/footer_script}
-<div class="titrePage">
- <h2>{'Pending Comments'|@translate} {$TABSHEET_TITLE}</h2>
+<h2>{'User comments'|@translate} {$TABSHEET_TITLE}</h2>
+
+<div class="commentFilter">
+ <a href="{$F_ACTION}&amp;filter=all" class="{if $filter == 'all'}commentFilterSelected{/if}">{'All'|@translate}</a> ({$nb_total})
+ | <a href="{$F_ACTION}&amp;filter=pending" class="{if $filter == 'pending'}commentFilterSelected{/if}">{'Waiting'|@translate}</a> ({$nb_pending})
+{if !empty($navbar) }{include file='navigation_bar.tpl'|@get_extent:'navbar'}{/if}
</div>
+
+
{if !empty($comments) }
<form method="post" action="{$F_ACTION}" id="pendingComments">
@@ -59,7 +65,7 @@ jQuery(document).ready(function(){
<td>
<div class="comment">
<a class="illustration" href="{$comment.U_PICTURE}"><img src="{$comment.TN_SRC}"></a>
- <p class="commentHeader"><strong>{$comment.AUTHOR}</strong> - <em>{$comment.DATE}</em></p>
+ <p class="commentHeader">{if $comment.IS_PENDING}<span class="pendingFlag">{'Waiting'|@translate}</span> - {/if}<strong>{$comment.AUTHOR}</strong> - <em>{$comment.DATE}</em></p>
<blockquote>{$comment.CONTENT}</blockquote>
</div>
</td>
@@ -75,8 +81,8 @@ jQuery(document).ready(function(){
</p>
<p class="bottomButtons">
- <input class="submit" type="submit" name="validate" value="{'Validate'|@translate}">
- <input class="submit" type="submit" name="reject" value="{'Reject'|@translate}">
+ <input type="submit" name="validate" value="{'Validate'|@translate}">
+ <input type="submit" name="reject" value="{'Reject'|@translate}">
</p>
</form>
diff --git a/admin/themes/default/template/configuration.tpl b/admin/themes/default/template/configuration.tpl
index a2520b0c3..d3309e8a7 100644
--- a/admin/themes/default/template/configuration.tpl
+++ b/admin/themes/default/template/configuration.tpl
@@ -1,13 +1,5 @@
-{footer_script}{literal}
-jQuery(document).ready(function(){
- jQuery("#activate_comments").change(function(){
- if ($(this).is(':checked')) {
- jQuery("#comments_param_warp").show();
- } else {
- jQuery("#comments_param_warp").hide();
- }
- });
-
+{footer_script}
+(function(){
var targets = {
'input[name="rate"]' : '#rate_anonymous',
'input[name="allow_user_registration"]' : '#email_admin_on_new_user',
@@ -22,47 +14,103 @@ jQuery(document).ready(function(){
jQuery(target).toggle(jQuery(selector).is(':checked'));
(function(target){
- jQuery(selector).bind('change', function() {
+ jQuery(selector).on('change', function() {
jQuery(target).toggle($(this).is(':checked'));
});
})(target);
};
-});
-{/literal}{/footer_script}
+}());
+{/footer_script}
<h2>{'Piwigo configuration'|@translate} {$TABSHEET_TITLE}</h2>
{if !isset($default)}
<form method="post" action="{$F_ACTION}" class="properties"{if isset($watermark)} enctype="multipart/form-data"{/if}>
{/if}
+
<div id="configContent">
{if isset($main)}
-<fieldset id="mainConf">
- <legend></legend>
+<fieldset class="mainConf">
+ <legend>{'Basic settings'|translate}</legend>
<ul>
<li>
-
- <label for="gallery_title">{'Gallery title'|@translate}</label>
+ <label for="gallery_title">{'Gallery title'|@translate}</label>
<br>
<input type="text" maxlength="255" size="50" name="gallery_title" id="gallery_title" value="{$main.CONF_GALLERY_TITLE}">
</li>
<li>
-
- <label for="page_banner">{'Page banner'|@translate}</label>
+ <label for="page_banner">{'Page banner'|@translate}</label>
<br>
<textarea rows="5" cols="50" class="description" name="page_banner" id="page_banner">{$main.CONF_PAGE_BANNER}</textarea>
</li>
+
+ <li id="order_filters">
+ <label>{'Default photos order'|@translate}</label>
+
+ {foreach from=$main.order_by item=order}
+ <span class="filter {if isset($ORDER_BY_IS_CUSTOM)}transparent{/if}">
+ <select name="order_by[]" {if isset($ORDER_BY_IS_CUSTOM)}disabled{/if}>
+ {html_options options=$main.order_by_options selected=$order}
+ </select>
+ <a class="removeFilter">{'delete'|@translate}</a>
+ </span>
+ {/foreach}
+ {if !isset($ORDER_BY_IS_CUSTOM)}
+ <a class="addFilter">{'Add a criteria'|@translate}</a>
+ {else}
+ <span class="order_by_is_custom">{'You can\'t define a default photo order because you have a custom setting in your local configuration.'|@translate}</span>
+ {/if}
+ </li>
+ </ul>
+
+{if !isset($ORDER_BY_IS_CUSTOM)}
+{footer_script require='jquery'}
+(function(){
+var max_fields = Math.ceil({$main.order_by_options|@count}/2);
+
+function updateFilters() {
+ var $selects = jQuery('#order_filters select');
+
+ jQuery('#order_filters .addFilter').toggle($selects.length <= max_fields);
+ jQuery('#order_filters .removeFilter').css('display', '').filter(':first').css('display', 'none');
+
+ $selects.find('option').removeAttr('disabled');
+ $selects.each(function() {
+ $selects.not(this).find('option[value="'+ jQuery(this).val() +'"]').attr('disabled', 'disabled');
+ });
+}
+
+jQuery('#order_filters').on('click', '.removeFilter', function() {
+ jQuery(this).parent('span.filter').remove();
+ updateFilters();
+});
+
+jQuery('#order_filters').on('change', 'select', updateFilters);
+
+jQuery('#order_filters .addFilter').click(function() {
+ jQuery(this).prev('span.filter').clone().insertBefore(jQuery(this));
+ jQuery(this).prev('span.filter').children('select').val('');
+ updateFilters();
+});
+
+updateFilters();
+}());
+{/footer_script}
+{/if}
+</fieldset>
+
+<fieldset class="mainConf">
+ <legend>{'Permissions'|translate}</legend>
+ <ul>
<li>
<label>
<input type="checkbox" name="rate" {if ($main.rate)}checked="checked"{/if}>
{'Allow rating'|@translate}
</label>
- </li>
- <li id="rate_anonymous">
- <label>
+ <label id="rate_anonymous" class="no-bold">
<input type="checkbox" name="rate_anonymous" {if ($main.rate_anonymous)}checked="checked"{/if}>
{'Rating by guests'|@translate}
</label>
@@ -73,10 +121,8 @@ jQuery(document).ready(function(){
<input type="checkbox" name="allow_user_registration" {if ($main.allow_user_registration)}checked="checked"{/if}>
{'Allow user registration'|@translate}
</label>
- </li>
- <li id="email_admin_on_new_user">
- <label>
+ <label id="email_admin_on_new_user" class="no-bold">
<input type="checkbox" name="email_admin_on_new_user" {if ($main.email_admin_on_new_user)}checked="checked"{/if}>
{'Email admins when a new user registers'|@translate}
</label>
@@ -95,108 +141,92 @@ jQuery(document).ready(function(){
{'Mail address is obligatory for all users'|@translate}
</label>
</li>
+ </ul>
- <li>
- <label>{'Week starts on'|@translate}
- {html_options name="week_starts_on" options=$main.week_starts_on_options selected=$main.week_starts_on_options_selected}</label>
- </li>
-
- <li>
- <label>{'Default photos order'|@translate}</label>
-
- {foreach from=$main.order_by item=order}
- <span class="filter {if $ORDER_BY_IS_CUSTOM}transparent{/if}">
- <select name="order_by[]" {if $ORDER_BY_IS_CUSTOM}disabled{/if}>
- {html_options options=$main.order_by_options selected=$order}
- </select>
- <a class="removeFilter">{'delete'|@translate}</a>
- </span>
- {/foreach}
-
- {if !$ORDER_BY_IS_CUSTOM}
- <a class="addFilter">{'Add a criteria'|@translate}</a>
- {else}
- <span class="order_by_is_custom">{'You can\'t define a default photo order because you have a custom setting in your local configuration.'|@translate}</span>
- {/if}
- </li>
-
-{if !$ORDER_BY_IS_CUSTOM}
{footer_script require='jquery'}
-// counters for displaying of addFilter link
-fields = {$main.order_by|@count}; max_fields = Math.ceil({$main.order_by_options|@count}/2);
-
-{literal}
-function updateAddFilterLink() {
- if (fields >= max_fields) {
- $('.addFilter').css('display', 'none');
+jQuery("#activate_comments").change(function(){
+ if ($(this).is(':checked')) {
+ jQuery("#comments_param_warp").show();
} else {
- $('.addFilter').css('display', '');
+ jQuery("#comments_param_warp").hide();
}
-}
-
-function updateRemoveFilterTrigger() {
- $(".removeFilter").click(function () {
- $(this).parent('span.filter').remove();
- fields--;
- updateAddFilterLink();
- });
-
- $(".removeFilter").css('display', '');
- $(".filter:first .removeFilter").css('display', 'none');
-}
-
-jQuery(document).ready(function () {
- $('.addFilter').click(function() {
- $(this).prev('span.filter').clone().insertBefore($(this));
- $(this).prev('span.filter').children('select[name="order_by[]"]').val('');
-
- fields++;
- updateRemoveFilterTrigger();
- updateAddFilterLink();
- });
-
- updateRemoveFilterTrigger();
- updateAddFilterLink();
});
-{/literal}
{/footer_script}
-{/if}
+</fieldset>
+
+<fieldset class="mainConf">
+ <legend>{'Miscellaneous'|translate}</legend>
+ <ul>
+ <li>
+ <label>{'Week starts on'|@translate}
+ {html_options name="week_starts_on" options=$main.week_starts_on_options selected=$main.week_starts_on_options_selected}</label>
+ </li>
<li>
<strong>{'Save visits in history for'|@translate}</strong>
- <label>
+ <label class="no-bold">
<input type="checkbox" name="history_guest" {if ($main.history_guest)}checked="checked"{/if}>
{'simple visitors'|@translate}
</label>
- <label>
+ <label class="no-bold">
<input type="checkbox" name="log" {if ($main.log)}checked="checked"{/if}>
{'registered users'|@translate}
</label>
- <label>
+ <label class="no-bold">
<input type="checkbox" name="history_admin" {if ($main.history_admin)}checked="checked"{/if}>
{'administrators'|@translate}
</label>
+ </li>
+ <li>
+ <label>{'Mail theme'|@translate}</label>
+
+ <div class="themeBoxes">
+ {foreach from=$main.mail_theme_options item=name key=theme}
+ <div class="themeBox {if $main.mail_theme==$theme}themeDefault{/if}">
+ <label>
+ <div class="themeName">
+ <input type="radio" name="mail_theme" value="{$theme}" {if $main.mail_theme==$theme}checked{/if}>
+ {$name}
+ </div>
+ <div class="themeShot">
+ <img src="{$ROOT_URL}themes/default/template/mail/screenshot-{$theme}.png" width="150"/>
+ </div>
+ </label>
+ <a href="{$ROOT_URL}themes/default/template/mail/screenshot-{$theme}.png">{'Preview'|translate}</a>
+ </div>
+ {/foreach}
+ </div>
</li>
+
+{include file='include/colorbox.inc.tpl'}
+{footer_script require='jquery'}
+jQuery(".themeBoxes a").colorbox();
+
+jQuery("input[name='mail_theme']").change(function() {
+ jQuery("input[name='mail_theme']").parents(".themeBox").removeClass("themeDefault");
+ jQuery(this).parents(".themeBox").addClass("themeDefault");
+});
+{/footer_script}
</ul>
</fieldset>
{/if}
{if isset($comments)}
-<fieldset id="commentsConf">
+<fieldset id="commentsConf" class="no-border">
<legend></legend>
<ul>
<li>
<label>
- <input type="checkbox" name="activate_comments" id="activate_comments"{if ($comments.activate_comments)}checked="checked"{/if}>
+ <input type="checkbox" name="activate_comments" id="activate_comments"{if ($comments.activate_comments)} checked="checked"{/if}>
{'Activate comments'|@translate}
</label>
</li>
</ul>
-
+
<ul id="comments_param_warp"{if not ($comments.activate_comments)} style="display:none;"{/if}>
<li>
<label>
@@ -211,7 +241,7 @@ jQuery(document).ready(function () {
<input type="text" size="3" maxlength="4" name="nb_comment_page" id="nb_comment_page" value="{$comments.NB_COMMENTS_PAGE}">
</label>
</li>
-
+
<li>
<label>
{'Default comments order'|@translate}
@@ -227,14 +257,14 @@ jQuery(document).ready(function () {
{'Validation'|@translate}
</label>
</li>
-
+
<li>
<label>
<input type="checkbox" name="comments_author_mandatory" {if ($comments.comments_author_mandatory)}checked="checked"{/if}>
{'Username is mandatory'|@translate}
</label>
</li>
-
+
<li>
<label>
<input type="checkbox" name="comments_email_mandatory" {if ($comments.comments_email_mandatory)}checked="checked"{/if}>
@@ -248,6 +278,7 @@ jQuery(document).ready(function () {
{'Allow users to edit their own comments'|@translate}
</label>
</li>
+
<li>
<label>
<input type="checkbox" name="user_can_delete_comment" {if ($comments.user_can_delete_comment)}checked="checked"{/if}>
@@ -258,19 +289,19 @@ jQuery(document).ready(function () {
<li id="notifyAdmin">
<strong>{'Notify administrators when a comment is'|@translate}</strong>
- <label id="email_admin_on_comment_validation">
+ <label id="email_admin_on_comment_validation" class="no-bold">
<input type="checkbox" name="email_admin_on_comment_validation" {if ($comments.email_admin_on_comment_validation)}checked="checked"{/if}> {'pending validation'|@translate}
</label>
- <label>
+ <label class="no-bold">
<input type="checkbox" name="email_admin_on_comment" {if ($comments.email_admin_on_comment)}checked="checked"{/if}> {'added'|@translate}
</label>
- <label id="email_admin_on_comment_edition">
+ <label id="email_admin_on_comment_edition" class="no-bold">
<input type="checkbox" name="email_admin_on_comment_edition" {if ($comments.email_admin_on_comment_edition)}checked="checked"{/if}> {'modified'|@translate}
</label>
- <label id="email_admin_on_comment_deletion">
+ <label id="email_admin_on_comment_deletion" class="no-bold">
<input type="checkbox" name="email_admin_on_comment_deletion" {if ($comments.email_admin_on_comment_deletion)}checked="checked"{/if}> {'deleted'|@translate}
</label>
</li>
@@ -281,13 +312,12 @@ jQuery(document).ready(function () {
{if isset($sizes)}
{footer_script}
-var labelMaxWidth = "{'Maximum width'|@translate}";
-var labelWidth = "{'Width'|@translate}";
+(function(){
+ var labelMaxWidth = "{'Maximum width'|@translate}",
+ labelWidth = "{'Width'|@translate}",
+ labelMaxHeight = "{'Maximum height'|@translate}",
+ labelHeight = "{'Height'|@translate}";
-var labelMaxHeight = "{'Maximum height'|@translate}";
-var labelHeight = "{'Height'|@translate}";
-{literal}
-jQuery(document).ready(function(){
function toggleResizeFields(size) {
var checkbox = jQuery("#original_resize");
var needToggle = jQuery("#sizeEdit-original");
@@ -301,7 +331,9 @@ jQuery(document).ready(function(){
}
toggleResizeFields("original");
- jQuery("#original_resize").click(function () {toggleResizeFields("original")});
+ jQuery("#original_resize").click(function () {
+ toggleResizeFields("original");
+ });
jQuery("a[id^='sizeEditOpen-']").click(function(){
var sizeName = jQuery(this).attr("id").split("-")[1];
@@ -329,9 +361,8 @@ jQuery(document).ready(function(){
jQuery(this).css("visibility", "hidden");
return false;
});
-
-});
-{/literal}{/footer_script}
+}());
+{/footer_script}
{html_style}{literal}
.sizeEnable {width:50px;}
@@ -345,7 +376,15 @@ jQuery(document).ready(function(){
<fieldset id="sizesConf">
<legend>{'Original Size'|@translate}</legend>
-
+{if $is_gd}
+ <div>
+ {'Resize after upload disabled due to the use of GD as graphic library'|@translate}
+ <input type="checkbox" name="original_resize" id="original_resize" disabled="disabled" style="visibility: hidden">
+ <input type="hidden" name="original_resize_maxwidth" value="{$sizes.original_resize_maxwidth}">
+ <input type="hidden" name="original_resize_maxheight" value="{$sizes.original_resize_maxheight}">
+ <input type="hidden" name="original_resize_quality" value="{$sizes.original_resize_quality}">
+ </div>
+{else}
<div>
<label for="original_resize">
<input type="checkbox" name="original_resize" id="original_resize" {if ($sizes.original_resize)}checked="checked"{/if}>
@@ -376,105 +415,108 @@ jQuery(document).ready(function(){
</td>
</tr>
</table>
-
+{/if}
</fieldset>
<fieldset id="multiSizesConf">
<legend>{'Multiple Size'|@translate}</legend>
-<div class="showDetails">
- <a href="#" id="showDetails"{if $show_details or isset($ferrors)} style="display:none"{/if}>{'show details'|@translate}</a>
-</div>
+ <div class="showDetails">
+ <a href="#" id="showDetails"{if isset($ferrors)} style="display:none"{/if}>{'show details'|@translate}</a>
+ </div>
-<table style="margin:0">
-{foreach from=$derivatives item=d key=type}
- <tr>
- <td>
- <label>
- <span class="sizeEnable">
- {if $d.must_enable}
- &#x2714;
- {else}
- <input type="checkbox" name="d[{$type}][enabled]" {if $d.enabled}checked="checked"{/if}>
- {/if}
- </span>
- {$type|@translate}
- </label>
- </td>
+ <table style="margin:0">
+ {foreach from=$derivatives item=d key=type}
+ <tr>
+ <td>
+ <label>
+ <span class="sizeEnable">
+ {if $d.must_enable}
+ &#x2714;
+ {else}
+ <input type="checkbox" name="d[{$type}][enabled]" {if $d.enabled}checked="checked"{/if}>
+ {/if}
+ </span>
+ {$type|@translate}
+ </label>
+ </td>
- <td>
- <span class="sizeDetails"{if isset($ferrors)} style="display:inline"{/if}>{$d.w} x {$d.h} {'pixels'|@translate}{if $d.crop}, {'Crop'|@translate|lower}{/if}</span>
- </td>
+ <td>
+ <span class="sizeDetails"{if isset($ferrors)} style="display:inline"{/if}>{$d.w} x {$d.h} {'pixels'|@translate}{if $d.crop}, {'Crop'|@translate|lower}{/if}</span>
+ </td>
- <td>
- <span class="sizeDetails"{if isset($ferrors) and !isset($ferrors.$type)} style="display:inline"{/if}>
- <a href="#" id="sizeEditOpen-{$type}" class="sizeEditOpen">{'edit'|@translate}</a>
- </span>
- </td>
- </tr>
-
- <tr id="sizeEdit-{$type}" class="sizeEdit" {if isset($ferrors.$type)} style="display:block"{/if}>
- <td colspan="3">
- <table class="sizeEditForm">
- {if !$d.must_square}
- <tr>
- <td colspan="2">
- <label>
- <input type="checkbox" class="cropToggle" name="d[{$type}][crop]" {if $d.crop}checked="checked"{/if}>
- {'Crop'|@translate}
- </label>
- </td>
- </tr>
- {/if}
+ <td>
+ <span class="sizeDetails"{if isset($ferrors) and !isset($ferrors.$type)} style="display:inline"{/if}>
+ <a href="#" id="sizeEditOpen-{$type}" class="sizeEditOpen">{'edit'|@translate}</a>
+ </span>
+ </td>
+ </tr>
- <tr>
- <td class="sizeEditWidth">{if $d.must_square or $d.crop}{'Width'|@translate}{else}{'Maximum width'|@translate}{/if}</td>
+ <tr id="sizeEdit-{$type}" class="sizeEdit" {if isset($ferrors.$type)} style="display:block"{/if}>
+ <td colspan="3">
+ <table class="sizeEditForm">
+ {if !$d.must_square}
+ <tr>
+ <td colspan="2">
+ <label>
+ <input type="checkbox" class="cropToggle" name="d[{$type}][crop]" {if $d.crop}checked="checked"{/if}>
+ {'Crop'|@translate}
+ </label>
+ </td>
+ </tr>
+ {/if}
+
+ <tr>
+ <td class="sizeEditWidth">{if $d.must_square or $d.crop}{'Width'|@translate}{else}{'Maximum width'|@translate}{/if}</td>
+ <td>
+ <input type="text" name="d[{$type}][w]" maxlength="4" size="4" value="{$d.w}"{if isset($ferrors.$type.w)} class="dError"{/if}>
+ {'pixels'|@translate}
+ {if isset($ferrors.$type.w)}<span class="dErrorDesc" title="{$ferrors.$type.w}">!</span>{/if}
+ </td>
+ </tr>
+
+ {if !$d.must_square}
+ <tr>
+ <td class="sizeEditHeight">{if $d.crop}{'Height'|@translate}{else}{'Maximum height'|@translate}{/if}</td>
+ <td>
+ <input type="text" name="d[{$type}][h]" maxlength="4" size="4" value="{$d.h}"{if isset($ferrors.$type.h)} class="dError"{/if}>
+ {'pixels'|@translate}
+ {if isset($ferrors.$type.h)}<span class="dErrorDesc" title="{$ferrors.$type.h}">!</span>{/if}
+ </td>
+ </tr>
+ {/if}
+ <tr>
+ <td>{'Sharpen'|@translate}</td>
<td>
- <input type="text" name="d[{$type}][w]" maxlength="4" size="4" value="{$d.w}"{if isset($ferrors.$type.w)} class="dError"{/if}>
- {'pixels'|@translate}
- {if isset($ferrors.$type.w)}<span class="dErrorDesc" title="{$ferrors.$type.w}">!</span>{/if}
+ <input type="text" name="d[{$type}][sharpen]" maxlength="4" size="4" value="{$d.sharpen}"{if isset($ferrors.$type.sharpen)} class="dError"{/if}>
+ %
+ {if isset($ferrors.$type.sharpen)}<span class="dErrorDesc" title="{$ferrors.$type.sharpen}">!</span>{/if}
</td>
- </tr>
+ </tr>
+ </table> {* #sizeEdit *}
+ </td>
+ </tr>
+ {/foreach}
+ </table>
- {if !$d.must_square}
- <tr>
- <td class="sizeEditHeight">{if $d.crop}{'Height'|@translate}{else}{'Maximum height'|@translate}{/if}</td>
- <td>
- <input type="text" name="d[{$type}][h]" maxlength="4" size="4" value="{$d.h}"{if isset($ferrors.$type.h)} class="dError"{/if}>
- {'pixels'|@translate}
- {if isset($ferrors.$type.h)}<span class="dErrorDesc" title="{$ferrors.$type.h}">!</span>{/if}
- </td>
- </tr>
- {/if}
- <tr>
- <td>{'Sharpen'|@translate}</td>
- <td>
- <input type="text" name="d[{$type}][sharpen]" maxlength="4" size="4" value="{$d.sharpen}"{if isset($ferrors.$type.sharpen)} class="dError"{/if}>
- %
- {if isset($ferrors.$type.sharpen)}<span class="dErrorDesc" title="{$ferrors.$type.sharpen}">!</span>{/if}
- </td>
- </tr>
- </table> {* #sizeEdit *}
- </td>
- </tr>
-{/foreach}
-</table>
-
-<p style="margin:10px 0 0 0;{if isset($ferrors)} display:block;{/if}" class="sizeDetails">
- {'Image Quality'|@translate}
- <input type="text" name="resize_quality" value="{$resize_quality}" size="3" maxlength="3"{if isset($ferrors.resize_quality)} class="dError"{/if}> %
- {if isset($ferrors.resize_quality)}<span class="dErrorDesc" title="{$ferrors.resize_quality}">!</span>{/if}
-</p>
-<p style="margin:10px 0 0 0;{if isset($ferrors)} display:block;{/if}" class="sizeDetails">
- <a href="{$F_ACTION}&action=restore_settings" onclick="return confirm('{'Are you sure?'|@translate|@escape:javascript}');">{'Reset to default values'|@translate}</a>
-</p>
+ <p style="margin:10px 0 0 0;{if isset($ferrors)} display:block;{/if}" class="sizeDetails">
+ {'Image Quality'|@translate}
+ <input type="text" name="resize_quality" value="{$resize_quality}" size="3" maxlength="3"{if isset($ferrors.resize_quality)} class="dError"{/if}> %
+ {if isset($ferrors.resize_quality)}<span class="dErrorDesc" title="{$ferrors.resize_quality}">!</span>{/if}
+ </p>
+ <p style="margin:10px 0 0 0;{if isset($ferrors)} display:block;{/if}" class="sizeDetails">
+ <a href="{$F_ACTION}&action=restore_settings" onclick="return confirm('{'Are you sure?'|@translate|@escape:javascript}');">{'Reset to default values'|@translate}</a>
+ </p>
{if !empty($custom_derivatives)}
-<fieldset class="sizeDetails"><legend>{'custom'|@translate}</legend><table style="margin:0">
-{foreach from=$custom_derivatives item=time key=custom}
-<tr><td><label><input type="checkbox" name="delete_custom_derivative_{$custom}"> {'Delete'|@translate} {$custom} ({'Last hit'|@translate}: {$time})</label></td></tr>
-{/foreach}
-</table></fieldset>
+ <fieldset class="sizeDetails">
+ <legend>{'custom'|@translate}</legend>
+ <table style="margin:0">
+ {foreach from=$custom_derivatives item=time key=custom}
+ <tr><td><label><input type="checkbox" name="delete_custom_derivative_{$custom}"> {'Delete'|@translate} {$custom} ({'Last hit'|@translate}: {$time})</label></td></tr>
+ {/foreach}
+ </table>
+ </fieldset>
{/if}
</fieldset>
@@ -482,13 +524,12 @@ jQuery(document).ready(function(){
{if isset($watermark)}
-{footer_script}{literal}
-jQuery(document).ready(function() {
-
+{footer_script}
+(function(){
function onWatermarkChange() {
var val = jQuery("#wSelect").val();
if (val.length) {
- jQuery("#wImg").attr('src', {/literal}'{$ROOT_URL}'{literal}+val).show();
+ jQuery("#wImg").attr('src', '{$ROOT_URL}'+val).show();
}
else {
jQuery("#wImg").hide();
@@ -516,22 +557,24 @@ jQuery(document).ready(function() {
jQuery("#addWatermark, #selectWatermark").toggle();
return false;
});
-});
-{/literal}{/footer_script}
+}());
+{/footer_script}
-<fieldset id="watermarkConf">
+<fieldset id="watermarkConf" class="no-border">
<legend></legend>
<ul>
<li>
<span id="selectWatermark"{if isset($ferrors.watermarkImage)} style="display:none"{/if}><label>{'Select a file'|@translate}</label>
<select name="w[file]" id="wSelect">
- {html_options options=$watermark_files selected=$watermark.file}
+ {html_options options=$watermark_files selected=$watermark.file}
</select>
{'... or '|@translate}<a href="#" class="addWatermarkOpen">{'add a new watermark'|@translate}</a>
- <br><img id="wImg"></img></span>{* #selectWatermark *}
+ <br>
+ <img id="wImg"></img></span>{* #selectWatermark *}
<span id="addWatermark"{if isset($ferrors.watermarkImage)} style="display:inline"{/if}>
{'add a new watermark'|@translate} {'... or '|@translate}<a href="#" class="addWatermarkOpen">{'Select a file'|@translate}</a>
- <br><input type="file" size="60" id="watermarkImage" name="watermarkImage"{if isset($ferrors.watermarkImage)} class="dError"{/if}> (png)
+ <br>
+ <input type="file" size="60" id="watermarkImage" name="watermarkImage"{if isset($ferrors.watermarkImage)} class="dError"{/if}> (png)
{if isset($ferrors.watermarkImage)}<span class="dErrorDesc" title="{$ferrors.watermarkImage|@htmlspecialchars}">!</span>{/if}
</span>{* #addWatermark *}
</li>
@@ -547,7 +590,7 @@ jQuery(document).ready(function() {
<li>
<label>
{'Apply watermark if height is bigger than'|@translate}
- <input size="4" maxlength="4" type="text" name="w[minh]" value="{$watermark.minh}"{if isset($ferrors.watermark.minh)} class="dError"{/if}>
+ <input size="4" maxlength="4" type="text" name="w[minh]" value="{$watermark.minh}"{if isset($ferrors.watermark.minh)} class="dError"{/if}>
</label>
{'pixels'|@translate}
</li>
@@ -562,10 +605,11 @@ jQuery(document).ready(function() {
<label class="right">{'bottom right corner'|@translate} <input name="w[position]" type="radio" value="bottomright"{if $watermark.position eq 'bottomright'} checked="checked"{/if}></label>
<label><input name="w[position]" type="radio" value="bottomleft"{if $watermark.position eq 'bottomleft'} checked="checked"{/if}> {'bottom left corner'|@translate}</label>
</div>
+
<label style="display:block;margin-top:10px;font-weight:normal;"><input name="w[position]" type="radio" value="custom"{if $watermark.position eq 'custom'} checked="checked"{/if}> {'custom'|@translate}</label>
<div id="positionCustomDetails">
<label>{'X Position'|@translate}
- <input size="3" maxlength="3" type="text" name="w[xpos]" value="{$watermark.xpos}"{if isset($ferrors.watermark.xpos)} class="dError"{/if}>%
+ <input size="3" maxlength="3" type="text" name="w[xpos]" value="{$watermark.xpos}"{if isset($ferrors.watermark.xpos)} class="dError"{/if}>%
{if isset($ferrors.watermark.xpos)}<span class="dErrorDesc" title="{$ferrors.watermark.xpos}">!</span>{/if}
</label>
@@ -600,10 +644,10 @@ jQuery(document).ready(function() {
<li>
<label>
<input type="checkbox" name="menubar_filter_icon" {if ($display.menubar_filter_icon)}checked="checked"{/if}>
- {'display only recently posted photos'|@translate|@ucfirst|@string_format:$pwg->l10n('Activate icon "%s"')}
+ {'Activate icon "%s"'|@translate:('display only recently posted photos'|@translate|@ucfirst)}
</label>
- </li>
-
+ </li>
+
<li>
<label>
<input type="checkbox" name="index_new_icon" {if ($display.index_new_icon)}checked="checked"{/if}>
@@ -614,38 +658,38 @@ jQuery(document).ready(function() {
<li>
<label>
<input type="checkbox" name="index_sort_order_input" {if ($display.index_sort_order_input)}checked="checked"{/if}>
- {'Sort order'|@translate|@string_format:$pwg->l10n('Activate icon "%s"')}
+ {'Activate icon "%s"'|@translate:('Sort order'|@translate)}
</label>
</li>
<li>
<label>
<input type="checkbox" name="index_flat_icon" {if ($display.index_flat_icon)}checked="checked"{/if}>
- {'display all photos in all sub-albums'|@translate|@ucfirst|@string_format:$pwg->l10n('Activate icon "%s"')}
+ {'Activate icon "%s"'|@translate:('display all photos in all sub-albums'|@translate|@ucfirst)}
</label>
</li>
<li>
<label>
<input type="checkbox" name="index_posted_date_icon" {if ($display.index_posted_date_icon)}checked="checked"{/if}>
- {'display a calendar by posted date'|@translate|@ucfirst|@string_format:$pwg->l10n('Activate icon "%s"')}
+ {'Activate icon "%s"'|@translate:('display a calendar by posted date'|@translate|@ucfirst)}
</label>
</li>
<li>
<label>
<input type="checkbox" name="index_created_date_icon" {if ($display.index_created_date_icon)}checked="checked"{/if}>
- {'display a calendar by creation date'|@translate|@ucfirst|@string_format:$pwg->l10n('Activate icon "%s"')}
+ {'Activate icon "%s"'|@translate:('display a calendar by creation date'|@translate|@ucfirst)}
</label>
</li>
<li>
<label>
<input type="checkbox" name="index_slideshow_icon" {if ($display.index_slideshow_icon)}checked="checked"{/if}>
- {'slideshow'|@translate|@ucfirst|@string_format:$pwg->l10n('Activate icon "%s"')}
+ {'Activate icon "%s"'|@translate:('slideshow'|@translate|@ucfirst)}
</label>
</li>
-
+
<li>
<label>
{'Number of albums per page'|@translate}
@@ -661,28 +705,28 @@ jQuery(document).ready(function() {
<li>
<label>
<input type="checkbox" name="picture_slideshow_icon" {if ($display.picture_slideshow_icon)}checked="checked"{/if}>
- {'slideshow'|@translate|@ucfirst|@string_format:$pwg->l10n('Activate icon "%s"')}
+ {'Activate icon "%s"'|@translate:('slideshow'|@translate|@ucfirst)}
</label>
</li>
<li>
<label>
<input type="checkbox" name="picture_metadata_icon" {if ($display.picture_metadata_icon)}checked="checked"{/if}>
- {'Show file metadata'|@translate|@string_format:$pwg->l10n('Activate icon "%s"')}
+ {'Activate icon "%s"'|@translate:('Show file metadata'|@translate)}
</label>
</li>
<li>
<label>
<input type="checkbox" name="picture_download_icon" {if ($display.picture_download_icon)}checked="checked"{/if}>
- {'Download this file'|@translate|@ucfirst|@string_format:$pwg->l10n('Activate icon "%s"')}
+ {'Activate icon "%s"'|@translate:('Download this file'|@translate|@ucfirst)}
</label>
</li>
<li>
<label>
<input type="checkbox" name="picture_favorite_icon" {if ($display.picture_favorite_icon)}checked="checked"{/if}>
- {'add this photo to your favorites'|@translate|@ucfirst|@string_format:$pwg->l10n('Activate icon "%s"')}
+ {'Activate icon "%s"'|@translate:('add this photo to your favorites'|@translate|@ucfirst)}
</label>
</li>
@@ -699,7 +743,7 @@ jQuery(document).ready(function() {
{'Activate Navigation Thumbnails'|@translate}
</label>
</li>
-
+
<li>
<label>
<input type="checkbox" name="picture_menu" {if ($display.picture_menu)}checked="checked"{/if}>
@@ -792,6 +836,8 @@ jQuery(document).ready(function() {
</fieldset>
{/if}
+</div> <!-- configContent -->
+
{if !isset($default)}
<p class="formButtons">
<input type="submit" name="submit" value="{'Save Settings'|@translate}">
@@ -799,8 +845,8 @@ jQuery(document).ready(function() {
</form>
{/if}
-</div> <!-- configContent -->
-
{if isset($default)}
+<div id="configContent">
{$PROFILE_CONTENT}
+</div>
{/if}
diff --git a/admin/themes/default/template/element_set_ranks.tpl b/admin/themes/default/template/element_set_ranks.tpl
index be5019e24..dfdafdc2e 100644
--- a/admin/themes/default/template/element_set_ranks.tpl
+++ b/admin/themes/default/template/element_set_ranks.tpl
@@ -17,7 +17,7 @@ jQuery(document).ready(function() {
});
});
- jQuery('#image_order_rank').attr('checked', true);
+ jQuery('#image_order_rank').prop('checked', true);
checkOrderOptions();
}
});
@@ -43,7 +43,7 @@ jQuery('.thumbnail').tipTip({
<form action="{$F_ACTION}" method="post">
{if !empty($thumbnails)}
- <p><input class="submit" type="submit" value="{'Submit'|@translate}" name="submit"></p>
+ <p><input type="submit" value="{'Submit'|@translate}" name="submit"></p>
<fieldset>
<legend>{'Manual order'|@translate}</legend>
{if !empty($thumbnails)}
@@ -84,7 +84,7 @@ jQuery('.thumbnail').tipTip({
</div>
</fieldset>
<p>
- <input class="submit" type="submit" value="{'Submit'|@translate}" name="submit">
+ <input type="submit" value="{'Submit'|@translate}" name="submit">
<label>
<input type="checkbox" name="image_order_subcats" id="image_order_subcats">
diff --git a/admin/themes/default/template/extend_for_templates.tpl b/admin/themes/default/template/extend_for_templates.tpl
index 07998128a..818096ba4 100644
--- a/admin/themes/default/template/extend_for_templates.tpl
+++ b/admin/themes/default/template/extend_for_templates.tpl
@@ -17,19 +17,19 @@
{$tpl.replacer}
</td>
<td>
- {html_options name=original[] output=$tpl.original_tpl values=$tpl.original_tpl selected=$tpl.selected_tpl}
+ {html_options name='original[]' output=$tpl.original_tpl values=$tpl.original_tpl selected=$tpl.selected_tpl}
</td>
<td>
- {html_options name=url[] output=$tpl.url_parameter values=$tpl.url_parameter selected=$tpl.selected_url}
+ {html_options name='url[]' output=$tpl.url_parameter values=$tpl.url_parameter selected=$tpl.selected_url}
</td>
<td>
- {html_options name=bound[] output=$tpl.bound_tpl values=$tpl.bound_tpl selected=$tpl.selected_bound}
+ {html_options name='bound[]' output=$tpl.bound_tpl values=$tpl.bound_tpl selected=$tpl.selected_bound}
</td>
</tr>
{/foreach}
</table>
<p>
- <input class="submit" type="submit" value="{'Submit'|@translate}" name="submit">
+ <input type="submit" value="{'Submit'|@translate}" name="submit">
</p>
</form>
{/if}
diff --git a/admin/themes/default/template/group_list.tpl b/admin/themes/default/template/group_list.tpl
index c11b6369a..0d2d727d1 100644
--- a/admin/themes/default/template/group_list.tpl
+++ b/admin/themes/default/template/group_list.tpl
@@ -1,7 +1,21 @@
{footer_script}
{literal}
$(document).ready(function() {
+ /**
+ * Add group
+ */
+ jQuery("#addGroup").click(function() {
+ jQuery("#addGroupForm").toggle();
+ jQuery("input[name=groupname]").focus();
+ return false;
+ });
+
+ jQuery("#addGroupClose").click(function() {
+ jQuery("#addGroupForm").hide();
+ return false;
+ });
+ $('.groups input').change(function () { $(this).parent('p').toggleClass('group_select'); });
$(".grp_action").hide();
$("input.group_selection").click(function() {
@@ -16,10 +30,10 @@ $(document).ready(function() {
$("#permitAction").show();
$("#forbidAction").hide();
}
- $("p[group_id="+$(this).attr("value")+"]").each(function () {
+ $("p[group_id="+$(this).prop("value")+"]").each(function () {
$(this).toggle();
});
-
+
if (nbSelected<2) {
$("#two_to_select").show();
$("#two_atleast").hide();
@@ -32,8 +46,8 @@ $(document).ready(function() {
$("[id^=action_]").hide();
$("select[name=selectAction]").change(function () {
$("[id^=action_]").hide();
- $("#action_"+$(this).attr("value")).show();
- if ($(this).val() != -1) {
+ $("#action_"+$(this).prop("value")).show();
+ if ($(this).val() != -1 ) {
$("#applyActionBlock").show();
}
else {
@@ -51,38 +65,44 @@ $(document).ready(function() {
<h2>{'Group management'|@translate}</h2>
</div>
-<form method="post" name="add_user" action="{$F_ADD_ACTION}" class="properties">
+<p class="showCreateAlbum" id="showAddGroup">
+ <a class="icon-plus-circled" href="#" id="addGroup">{'Add group'|translate}</a>
+</p>
+
+<form method="post" style="display:none" id="addGroupForm" name="add_user" action="{$F_ADD_ACTION}" class="properties">
<fieldset>
<legend>{'Add group'|@translate}</legend>
- <span class="property">
- <label for="groupname">{'Group name'|@translate}</label>
- </span>
- <input type="text" id="groupname" name="groupname" maxlength="50" size="20">
- <input type="submit" name="submit_add" value="{'Add'|@translate}">
- <input type="hidden" name="pwg_token" value="{$PWG_TOKEN}">
+
+ <p>
+ <strong>{'Group name'|translate}</strong><br>
+ <input type="text" name="groupname" maxlength="50" size="20">
+ </p>
+
+ <p class="actionButtons">
+ <input class="submit" name="submit_add" type="submit" value="{'Add'|translate}">
+ <a href="#" id="addGroupClose">{'Cancel'|@translate}</a>
+ </p>
+
+ <input type="hidden" name="pwg_token" value="{$PWG_TOKEN}">
</fieldset>
</form>
+
<form method="post" name="add_user" action="{$F_ADD_ACTION}" class="properties">
<input type="hidden" name="pwg_token" value="{$PWG_TOKEN}">
-
- <table class="table2">
- <tr class="throw">
- <th></th>
- <th>{'Group name'|@translate}</th>
- <th>{'Members'|@translate}</th>
- </tr>
+
+ <ul class="groups">
{if not empty($groups)}
{foreach from=$groups item=group name=group_loop}
- <tr class="{if $smarty.foreach.group_loop.index is odd}row1{else}row2{/if}">
- <td><input class="group_selection" name="group_selection[]" type="checkbox" value="{$group.ID}"></td>
- <td>{$group.NAME}<i><small>{$group.IS_DEFAULT}</small></i></td>
- <td>{if $group.MEMBERS>0}<a href="{$group.U_MEMBERS}" title="{'Manage the members'|@translate}">{$group.MEMBERS}</a><br>{$group.L_MEMBERS}{else}{$group.MEMBERS}{/if}</td>
- </tr>
+ <li>
+ <label><p>{$group.NAME}<i><small>{$group.IS_DEFAULT}</small></i><input class="group_selection" name="group_selection[]" type="checkbox" value="{$group.ID}"></p></label>
+ <p class="list_user">{if $group.MEMBERS>0}{$group.MEMBERS}<br>{$group.L_MEMBERS}{else}{$group.MEMBERS}{/if}</p>
+ <a class="icon-lock group_perm" href="{$group.U_PERM}" title="{'Permissions'|@translate}">{'Permissions'|translate}</a>
+ </li>
{/foreach}
{/if}
- </table>
-
+ </ul>
+
<fieldset id="action">
<legend>{'Action'|@translate}</legend>
<div id="forbidAction">{'No group selected, no action possible.'|@translate}</div>
@@ -95,8 +115,6 @@ $(document).ready(function() {
<option value="delete">{'Delete'|@translate}</option>
<option value="merge">{'Merge selected groups'|@translate}</option>
<option value="duplicate">{'Duplicate'|@translate}</option>
- <option value="manage_members">{'Manage the members'|@translate}</option>
- <option value="manage_pemissions">{'Manage Permissions'|@translate}</option>
<option value="toggle_default">{'Toggle \'default group\' property'|@translate}</option>
{if !empty($element_set_groupe_plugins_actions)}
{foreach from=$element_set_groupe_plugins_actions item=action}
@@ -142,28 +160,6 @@ $(document).ready(function() {
{/if}
</div>
- <!-- manage_members -->
- <div id="action_manage_members" class="bulkAction">
- {if not empty($groups)}
- {foreach from=$groups item=group}
- <p group_id="{$group.ID}" class="grp_action">
- {$group.NAME} > {if $group.NB_MEMBERS!=0}<a href="{$group.U_MEMBERS}" title="{'Manage the members'|@translate}">{'Manage the members'|@translate}</a>{else}{'No members to manage'|@translate}{/if}
- </p>
- {/foreach}
- {/if}
- </div>
-
- <!-- manage_pemissions -->
- <div id="action_manage_pemissions" class="bulkAction">
- {if not empty($groups)}
- {foreach from=$groups item=group}
- <p group_id="{$group.ID}" class="grp_action">
- {$group.NAME} > <a href="{$group.U_PERM}" title="{'Permissions'|@translate}">{'Manage Permissions'|@translate}</a>
- </p>
- {/foreach}
- {/if}
- </div>
-
<!-- toggle_default -->
<div id="action_toggle_default" class="bulkAction">
{if not empty($groups)}
@@ -174,8 +170,8 @@ $(document).ready(function() {
{/foreach}
{/if}
</div>
-
-
+
+
<!-- plugins -->
{if !empty($element_set_groupe_plugins_actions)}
{foreach from=$element_set_groupe_plugins_actions item=action}
@@ -184,7 +180,7 @@ $(document).ready(function() {
</div>
{/foreach}
{/if}
-
+
<p id="applyActionBlock" style="display:none" class="actionButtons">
<input id="applyAction" class="submit" type="submit" value="{'Apply action'|@translate}" name="submit"> <span id="applyOnDetails"></span></p>
</div> <!-- #permitAction -->
diff --git a/admin/themes/default/template/header.tpl b/admin/themes/default/template/header.tpl
index f8fff5750..c95b759ad 100644
--- a/admin/themes/default/template/header.tpl
+++ b/admin/themes/default/template/header.tpl
@@ -19,6 +19,7 @@
{/if}
{if !empty($theme.local_head)}{include file=$theme.local_head load_css=$theme.load_css}{/if}
{/foreach}
+{combine_css path="admin/themes/default/fontello/css/fontello.css"}
<!-- BEGIN get_combined_scripts -->
{get_combined_scripts load='header'}
@@ -53,17 +54,17 @@
<div id="pwgHead">
<h1>
<a href="{$U_RETURN}" title="{'Visit Gallery'|@translate}">
- <img src="{$ROOT_URL}admin/themes/{$theme.id}/icon/home.png" alt="{'Home'|@translate}">
- {$GALLERY_TITLE}
+ <span class="icon-home" style="font-size:larger"></span>
+ {$GALLERY_TITLE}
</a>
</h1>
<div id="headActions">
- {'Hello'|@translate} {$USERNAME} :
- <a href="{$U_RETURN}">{'Visit Gallery'|@translate}</a> |
- <a href="{$U_CHANGE_THEME}" title="{'Switch to clear or dark colors for administration'|@translate}">{'Change Admin Colors'|@translate}</a> |
- <a href="{$U_FAQ}" title="{'Instructions to use Piwigo'|@translate}">{'Help Me'|@translate}</a> |
- <a href="{$U_LOGOUT}">{'Logout'|@translate}</a>
+ {'Hello'|@translate} {$USERNAME} |
+ <a class="icon-eye" href="{$U_RETURN}">{'Visit Gallery'|@translate}</a> |
+ <a class="icon-brush" href="{$U_CHANGE_THEME}" title="{'Switch to clear or dark colors for administration'|@translate}">{'Change Admin Colors'|@translate}</a> |
+ <a class="icon-help-circled" href="{$U_FAQ}" title="{'Instructions to use Piwigo'|@translate}">{'Help Me'|@translate}</a> |
+ <a class="icon-logout" href="{$U_LOGOUT}">{'Logout'|@translate}</a>
</div>
</div>
diff --git a/admin/themes/default/template/history.tpl b/admin/themes/default/template/history.tpl
index 4cc5e93c6..3fe4e738d 100644
--- a/admin/themes/default/template/history.tpl
+++ b/admin/themes/default/template/history.tpl
@@ -6,9 +6,7 @@
pwg_initialization_datepicker("#end_day", "#end_month", "#end_year", "#end_linked_date", null, "#start_linked_date", null);
{/literal}{/footer_script}
-<div class="titrePage">
- <h2>{'History'|@translate} {$TABSHEET_TITLE}</h2>
-</div>
+<h2>{'History'|@translate} {$TABSHEET_TITLE}</h2>
<form class="filter" method="post" name="filter" action="{$F_ACTION}">
<fieldset>
@@ -83,7 +81,7 @@
</select>
</label>
- <input class="submit" type="submit" name="submit" value="{'Submit'|@translate}">
+ <input type="submit" name="submit" value="{'Submit'|@translate}">
</fieldset>
</form>
@@ -107,6 +105,7 @@
{if !empty($navbar) }{include file='navigation_bar.tpl'|@get_extent:'navbar'}{/if}
<table class="table2" id="detailedStats">
+<thead>
<tr class="throw">
<th>{'Date'|@translate}</th>
<th>{'Time'|@translate}</th>
@@ -115,24 +114,69 @@
<th>{'Element'|@translate}</th>
<th>{'Element type'|@translate}</th>
<th>{'Section'|@translate}</th>
- <th>{'Album'|@translate}</th>
- <th>{'Tags'|@translate}</th>
+ <th>{'Album'|@translate} / {'Tags'|@translate}</th>
</tr>
-{if !empty($search_results) }
+</thead>
+{if !empty($search_results)}
{foreach from=$search_results item=detail name=res_loop}
<tr class="{if $smarty.foreach.res_loop.index is odd}row1{else}row2{/if}">
<td class="hour">{$detail.DATE}</td>
<td class="hour">{$detail.TIME}</td>
<td>{$detail.USER}</td>
- <td>{$detail.IP}</td>
+ <td class="IP">{$detail.IP}</td>
<td>{$detail.IMAGE}</td>
<td>{$detail.TYPE}</td>
<td>{$detail.SECTION}</td>
- <td>{$detail.CATEGORY}</td>
- <td>{$detail.TAGS}</td>
+ <td>{$detail.CATEGORY}{$detail.TAGS}</td>
</tr>
{/foreach}
{/if}
</table>
{if !empty($navbar) }{include file='navigation_bar.tpl'|@get_extent:'navbar'}{/if}
+
+{combine_script id='jquery.geoip' load='async' path='admin/themes/default/js/jquery.geoip.js'}
+
+{footer_script}{literal}
+jQuery(document).ready( function() {
+ jQuery(".IP").one( "mouseenter", function(){
+ var that = $(this);
+ that
+ .data("isOver", true)
+ .one("mouseleave", function() {
+ that.removeData("isOver");
+ });
+ GeoIp.get( that.text(), function(data) {
+ if (!data.fullName) return;
+
+ var content = data.fullName;
+ if (data.latitude && data.region_name) {
+ content += '<br><a class="ipGeoOpen" data-lat="'+data.latitude+'" data-lon="'+data.longitude+'"';
+ content += ' href="#">show on a Google Map</a>';
+ }
+
+ that.tipTip( {
+ content: content,
+ keepAlive: true,
+ defaultPosition: "right",
+ maxWidth: 320,
+ } );
+ if (that.data("isOver"))
+ that.trigger("mouseenter");
+ });
+ } );
+
+ jQuery(document).on('click', '.ipGeoOpen', function() {
+ var lat = jQuery(this).data("lat");
+ var lon = jQuery(this).data("lon");
+ var parent = jQuery(this).parent();
+ jQuery(this).remove();
+
+ var append = '<br><img width=300 height=220 src="http://maps.googleapis.com/maps/api/staticmap';
+ append += '?sensor=false&size=300x220&zoom=6&markers=size:tiny%7C' + lat + ',' + lon + '">';
+
+ jQuery(parent).append(append);
+ return false;
+ });
+});
+{/literal}{/footer_script} \ No newline at end of file
diff --git a/admin/themes/default/template/include/add_album.inc.tpl b/admin/themes/default/template/include/add_album.inc.tpl
index 1fe8cea21..08ada07a4 100644
--- a/admin/themes/default/template/include/add_album.inc.tpl
+++ b/admin/themes/default/template/include/add_album.inc.tpl
@@ -1,81 +1,70 @@
{footer_script}{literal}
jQuery(document).ready(function(){
- function fillCategoryListbox(selectId, selectedValue) {
- jQuery.getJSON(
- "ws.php?format=json&method=pwg.categories.getList",
- {
- recursive: true,
- fullname: true,
- format: "json",
- },
- function(data) {
- jQuery.each(
- data.result.categories,
- function(i,category) {
- var selected = null;
- if (category.id == selectedValue) {
- selected = "selected";
- }
-
- jQuery("<option/>")
- .attr("value", category.id)
- .attr("selected", selected)
- .text(category.name)
- .appendTo("#"+selectId)
- ;
- }
- );
- }
- );
- }
-
jQuery(".addAlbumOpen").colorbox({
- inline:true,
- href:"#addAlbumForm",
- onComplete:function(){
+ inline: true,
+ href: "#addAlbumForm",
+ onComplete: function() {
+ var $albumSelect = jQuery("#albumSelect");
+
jQuery("input[name=category_name]").focus();
+
+ jQuery("#category_parent").html('<option value="0">------------</option>')
+ .append($albumSelect.html())
+ .val($albumSelect.val() || 0);
}
});
- jQuery("#addAlbumForm form").submit(function(){
+ jQuery("#addAlbumForm form").submit(function() {
jQuery("#categoryNameError").text("");
+
+ var parent_id = jQuery("select[name=category_parent] option:selected").val(),
+ name = jQuery("input[name=category_name]").val();
jQuery.ajax({
- url: "ws.php?format=json&method=pwg.categories.add",
+ url: "ws.php",
+ dataType: 'json',
data: {
- parent: jQuery("select[name=category_parent] option:selected").val(),
- name: jQuery("input[name=category_name]").val(),
+ format: 'json',
+ method: 'pwg.categories.add',
+ parent: parent_id,
+ name: name
},
beforeSend: function() {
jQuery("#albumCreationLoading").show();
},
- success:function(html) {
+ success: function(data) {
jQuery("#albumCreationLoading").hide();
-
- var newAlbum = jQuery.parseJSON(html).result.id;
jQuery(".addAlbumOpen").colorbox.close();
- jQuery("#albumSelect").find("option").remove();
- fillCategoryListbox("albumSelect", newAlbum);
-
- /* we refresh the album creation form, in case the user wants to create another album */
- jQuery("#category_parent").find("option").remove();
-
- jQuery("<option/>")
- .attr("value", 0)
- .text("------------")
- .appendTo("#category_parent")
- ;
+ var newAlbum = data.result.id,
+ newAlbum_name = '';
+
+ if (parent_id!=0) {
+ newAlbum_name = jQuery("#category_parent").find("option[value="+ parent_id +"]").text() +' / ';
+ }
+ newAlbum_name+= name;
+
+ var new_option = jQuery("<option/>")
+ .attr("value", newAlbum)
+ .attr("selected", "selected")
+ .text(newAlbum_name);
- fillCategoryListbox("category_parent", newAlbum);
+ var $albumSelect = jQuery("#albumSelect");
+ $albumSelect.find("option").removeAttr('selected');
+
+ if (parent_id==0) {
+ $albumSelect.prepend(new_option);
+ }
+ else {
+ $albumSelect.find("option[value="+ parent_id +"]").after(new_option);
+ }
jQuery("#addAlbumForm form input[name=category_name]").val('');
-
jQuery("#albumSelection").show();
return true;
},
- error:function(XMLHttpRequest, textStatus, errorThrows) {
+ error: function(XMLHttpRequest, textStatus, errorThrows) {
jQuery("#albumCreationLoading").hide();
jQuery("#categoryNameError").text(errorThrows).css("color", "red");
}
@@ -90,13 +79,16 @@ jQuery(document).ready(function(){
<div id="addAlbumForm" style="text-align:left;padding:1em;">
<form>
{'Parent album'|@translate}<br>
- <select id ="category_parent" name="category_parent">
- <option value="0">------------</option>
- {html_options options=$category_parent_options selected=$category_parent_options_selected}
+ <select id="category_parent" name="category_parent">
</select>
-
- <br><br>{'Album name'|@translate}<br><input name="category_name" type="text" maxlength="255"> <span id="categoryNameError"></span>
- <br><br><br><input type="submit" value="{'Create'|@translate}"> <span id="albumCreationLoading" style="display:none"><img src="themes/default/images/ajax-loader-small.gif"></span>
+ <br><br>
+
+ {'Album name'|@translate}<br>
+ <input name="category_name" type="text" maxlength="255"> <span id="categoryNameError"></span>
+ <br><br><br>
+
+ <input type="submit" value="{'Create'|@translate}">
+ <span id="albumCreationLoading" style="display:none"><img src="themes/default/images/ajax-loader-small.gif"></span>
</form>
</div>
</div>
diff --git a/admin/themes/default/template/install.tpl b/admin/themes/default/template/install.tpl
index 58928fb45..6af851c8a 100644
--- a/admin/themes/default/template/install.tpl
+++ b/admin/themes/default/template/install.tpl
@@ -1,5 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
-"http://www.w3.org/TR/html4/strict.dtd">
+<!DOCTYPE html>
<html lang="{$lang_info.code}" dir="{$lang_info.direction}">
<head>
<meta http-equiv="Content-Type" content="text/html; charset={$T_CONTENT_ENCODING}">
@@ -25,7 +24,6 @@
{combine_script id='jquery' path='themes/default/js/jquery.min.js'}
{literal}
<script type="text/javascript">
-$(function() {
$(document).ready(function() {
$("a.externalLink").click(function() {
window.open($(this).attr("href"));
@@ -36,7 +34,6 @@ $(document).ready(function() {
$(".adminEmail").text($(this).val());
});
});
-
</script>
<style type="text/css">
@@ -44,13 +41,13 @@ body {
font-size:12px;
}
-.content {
- width: 800px;
- margin: auto;
- text-align: center;
- padding:0;
- background-color:transparent !important;
- border:none;
+#content {
+ width: 800px;
+ margin: auto;
+ text-align: center;
+ padding:0;
+ background-color:transparent !important;
+ border:none;
}
#theHeader {
@@ -226,7 +223,7 @@ jQuery().ready(function(){ldelim}
<tr>
<td style="width: 30%;" class="fieldname">{'Host'|@translate}</td>
<td><input type="text" name="dbhost" value="{$F_DB_HOST}"></td>
- <td class="fielddesc">{'localhost, sql.multimania.com, toto.freesurf.fr'|@translate}</td>
+ <td class="fielddesc">{'localhost or other, supplied by your host provider'|@translate}</td>
</tr>
<tr>
<td class="fieldname">{'User'|@translate}</td>
@@ -256,12 +253,12 @@ jQuery().ready(function(){ldelim}
<table class="table2">
<tr>
- <td style="width: 30%;" class="fieldname">{'Webmaster login'|@translate}</td>
+ <td style="width: 30%;" class="fieldname">{'Username'|@translate}</td>
<td><input type="text" name="admin_name" value="{$F_ADMIN}"></td>
<td class="fielddesc">{'It will be shown to the visitors. It is necessary for website administration'|@translate}</td>
</tr>
<tr>
- <td class="fieldname">{'Webmaster password'|@translate}</td>
+ <td class="fieldname">{'Password'|@translate}</td>
<td><input type="password" name="admin_pass1" value=""></td>
<td class="fielddesc">{'Keep it confidential, it enables you to access administration panel'|@translate}</td>
</tr>
@@ -271,7 +268,7 @@ jQuery().ready(function(){ldelim}
<td class="fielddesc">{'verification'|@translate}</td>
</tr>
<tr>
- <td class="fieldname">{'Webmaster mail address'|@translate}</td>
+ <td class="fieldname">{'Email address'|@translate}</td>
<td><input type="text" name="admin_mail" id="admin_mail" value="{$F_ADMIN_EMAIL}"></td>
<td class="fielddesc">{'Visitors will be able to contact site administrator with this mail'|@translate}</td>
</tr>
@@ -280,7 +277,7 @@ jQuery().ready(function(){ldelim}
<td colspan="2">
<label>
<input type="checkbox" name="newsletter_subscribe"{if $F_NEWSLETTER_SUBSCRIBE} checked="checked"{/if}>
- <span class="cluetip" title="{'Piwigo Announcements Newsletter'|@translate}|{'Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'|@translate|@htmlspecialchars|@nl2br}">{'Subscribe %s to Piwigo Announcements Newsletter'|@translate|@sprintf:$EMAIL}</span>
+ <span class="cluetip" title="{'Piwigo Announcements Newsletter'|@translate}|{'Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'|@translate|@htmlspecialchars|@nl2br}">{'Subscribe %s to Piwigo Announcements Newsletter'|@translate:$EMAIL}</span>
</label>
<br>
<label>
diff --git a/admin/themes/default/template/intro.tpl b/admin/themes/default/template/intro.tpl
index fc460c115..a3c56c214 100644
--- a/admin/themes/default/template/intro.tpl
+++ b/admin/themes/default/template/intro.tpl
@@ -29,7 +29,7 @@ jQuery().ready(function(){
if (ext_update)
jQuery(".warnings ul").append('<li>'+ext_need_update_msg+'</li>');
}
- });
+ });
});
{/literal}
{/footer_script}
@@ -42,7 +42,7 @@ jQuery().ready(function(){
<li><a href="{$PHPWG_URL}" class="externalLink">Piwigo</a> {$PWG_VERSION}</li>
<li><a href="{$U_CHECK_UPGRADE}">{'Check for upgrade'|@translate}</a></li>
{if isset($SUBSCRIBE_BASE_URL)}
- <li><a href="{$SUBSCRIBE_BASE_URL}{$EMAIL}" class="externalLink cluetip" title="{'Piwigo Announcements Newsletter'|@translate}|{'Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'|@translate|@htmlspecialchars|@nl2br}">{'Subscribe %s to Piwigo Announcements Newsletter'|@translate|@sprintf:$EMAIL}</a></li>
+ <li><a href="{$SUBSCRIBE_BASE_URL}{$EMAIL}" class="externalLink cluetip" title="{'Piwigo Announcements Newsletter'|@translate}|{'Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'|@translate|@htmlspecialchars|@nl2br}">{'Subscribe %s to Piwigo Announcements Newsletter'|@translate:$EMAIL}</a></li>
{/if}
</ul>
</dd>
@@ -74,10 +74,7 @@ jQuery().ready(function(){
<li>{$DB_GROUPS}</li>
{if isset($DB_COMMENTS)}
<li>
- {$DB_COMMENTS}
- {if isset($unvalidated)}
- (<a href="{$unvalidated.URL}">{$unvalidated.INFO}</a>)
- {/if}
+ {$DB_COMMENTS}{if $NB_PENDING_COMMENTS > 0} (<a href="{$U_COMMENTS}">{'%d waiting for validation'|translate:$NB_PENDING_COMMENTS}</a>){/if}
</li>
{/if}
<li>{$DB_RATES}</li>
diff --git a/admin/themes/default/template/menubar.tpl b/admin/themes/default/template/menubar.tpl
index 4d65c0858..f3bd1f45b 100644
--- a/admin/themes/default/template/menubar.tpl
+++ b/admin/themes/default/template/menubar.tpl
@@ -38,7 +38,7 @@ jQuery(document).ready(function(){
<strong>{'Hide'|@translate} <input type="checkbox" name="hide_{$block.reg->get_id()}" {if $block.pos<0}checked="checked"{/if}></strong>
</span>
- <img src="{$themeconf.admin_icon_dir}/cat_move.png" class="button drag_button" style="display:none;" alt="{'Drag to re-order'|@translate}" title="{'Drag to re-order'|@translate}">
+ <img src="{$themeconf.admin_icon_dir}/cat_move.png" class="drag_button" style="display:none;" alt="{'Drag to re-order'|@translate}" title="{'Drag to re-order'|@translate}">
<strong>{$block.reg->get_name()|@translate}</strong> ({$block.reg->get_id()})
</p>
diff --git a/admin/themes/default/template/notification_by_mail.tpl b/admin/themes/default/template/notification_by_mail.tpl
index 69acaaca5..0be49bdd1 100644
--- a/admin/themes/default/template/notification_by_mail.tpl
+++ b/admin/themes/default/template/notification_by_mail.tpl
@@ -4,12 +4,12 @@
jQuery(document).ready(function(){
jQuery("#checkAllLink").click(function () {
- jQuery("#notification_by_mail input[type=checkbox]").attr('checked', true);
+ jQuery("#notification_by_mail input[type=checkbox]").prop('checked', true);
return false;
});
jQuery("#uncheckAllLink").click(function () {
- jQuery("#notification_by_mail input[type=checkbox]").attr('checked', false);
+ jQuery("#notification_by_mail input[type=checkbox]").prop('checked', false);
return false;
});
@@ -24,7 +24,7 @@ jQuery(document).ready(function(){
{if isset($REPOST_SUBMIT_NAME)}
<fieldset>
<div class="infos">
- <input class="submit" type="submit" value="{'Continue processing treatment'|@translate}" name="{$REPOST_SUBMIT_NAME}">
+ <input type="submit" value="{'Continue processing treatment'|@translate}" name="{$REPOST_SUBMIT_NAME}">
</div>
</fieldset>
{/if}
@@ -72,8 +72,8 @@ jQuery(document).ready(function(){
</fieldset>
<p>
- <input class="submit" type="submit" value="{'Submit'|@translate}" name="param_submit">
- <input class="submit" type="reset" value="{'Reset'|@translate}" name="param_reset">
+ <input type="submit" value="{'Submit'|@translate}" name="param_submit">
+ <input type="reset" value="{'Reset'|@translate}" name="param_reset">
</p>
{/if}{* isset $param*}
@@ -98,7 +98,7 @@ jQuery(document).ready(function(){
<table class="table2">
<tr class="throw">
<th>{'User'|@translate}</th>
- <th>{'email'|@translate}</th>
+ <th>{'Email'|@translate}</th>
<th>{'Last send'|@translate}</th>
<th>{'To send ?'|@translate}</th>
</tr>
@@ -128,7 +128,7 @@ jQuery(document).ready(function(){
</fieldset>
<p>
- <input class="submit" type="submit" value="{'Send'|@translate}" name="send_submit">
+ <input type="submit" value="{'Send'|@translate}" name="send_submit">
</p>
{/if}
{/if}{* isset $send*}
diff --git a/admin/themes/default/template/photos_add_direct.tpl b/admin/themes/default/template/photos_add_direct.tpl
index 6794e0407..c63f9dec7 100644
--- a/admin/themes/default/template/photos_add_direct.tpl
+++ b/admin/themes/default/template/photos_add_direct.tpl
@@ -2,7 +2,7 @@
{combine_script id='jquery.jgrowl' load='footer' require='jquery' path='themes/default/js/plugins/jquery.jgrowl_minimized.js' }
{combine_script id='jquery.uploadify' load='footer' require='jquery' path='admin/include/uploadify/jquery.uploadify.v3.0.0.min.js' }
{combine_script id='jquery.ui.progressbar' load='footer'}
-{combine_css path="admin/themes/default/uploadify.jGrowl.css"}
+{combine_css path="themes/default/js/plugins/jquery.jgrowl.css"}
{combine_css path="admin/include/uploadify/uploadify.css"}
{/if}
@@ -127,7 +127,7 @@ var sizeLimit = Math.round({$upload_max_filesize} / 1024); /* in KBytes */
'auto' : false,
'multi' : true,
'fileTypeDesc' : 'Photo files',
- 'fileTypeExts' : '*.jpg;*.JPG;*.jpeg;*.JPEG;*.png;*.PNG;*.gif;*.GIF',
+ 'fileTypeExts' : '*.jpg;*.JPG;*.jpeg;*.JPEG;*.png;*.PNG;*.gif;*.GIF;{/literal}{if $tif_enabled}*.tif;*.TIF;*.tiff;*.TIFF{/if}{literal}',
'fileSizeLimit' : sizeLimit,
'progressData' : 'percentage',
requeueErrors : false,
@@ -200,7 +200,7 @@ var sizeLimit = Math.round({$upload_max_filesize} / 1024); /* in KBytes */
'level' : jQuery("select[name=level] option:selected").val(),
'upload_id' : upload_id,
'session_id' : session_id,
- 'pwg_token' : pwg_token,
+ 'pwg_token' : pwg_token
}
);
@@ -289,31 +289,35 @@ var sizeLimit = Math.round({$upload_max_filesize} / 1024); /* in KBytes */
<fieldset>
<legend>{'Select files'|@translate}</legend>
+
+ {if isset($original_resize_maxheight)}<p class="uploadInfo">{'The picture dimensions will be reduced to %dx%d pixels.'|@translate:$original_resize_maxwidth:$original_resize_maxheight}</p>{/if}
- <p id="uploadWarningsSummary">{$upload_max_filesize_shorthand}B. {$upload_file_types}. {if isset($max_upload_resolution)}{$max_upload_resolution}Mpx{/if} <a class="showInfo" title="{'Learn more'|@translate}">i</a></p>
+ <p id="uploadWarningsSummary">{$upload_max_filesize_shorthand}B. {$upload_file_types}. {if isset($max_upload_resolution)}{$max_upload_resolution}Mpx{/if} <a class="icon-info-circled-1 showInfo" title="{'Learn more'|@translate}"></a></p>
<p id="uploadWarnings">
-{'Maximum file size: %sB.'|@translate|@sprintf:$upload_max_filesize_shorthand}
-{'Allowed file types: %s.'|@translate|@sprintf:$upload_file_types}
+{'Maximum file size: %sB.'|@translate:$upload_max_filesize_shorthand}
+{'Allowed file types: %s.'|@translate:$upload_file_types}
{if isset($max_upload_resolution)}
-{'Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'|@translate|@sprintf:$max_upload_resolution:$max_upload_width:$max_upload_height}
+{'Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'|@translate:$max_upload_resolution:$max_upload_width:$max_upload_height}
{/if}
</p>
+
+
{if $upload_mode eq 'html'}
<div id="uploadBoxes"></div>
<div id="addUploadBox">
<a href="javascript:">{'+ Add an upload box'|@translate}</a>
</div>
- <p id="uploadModeInfos">{'You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'|@translate|@sprintf:$switch_url}</p>
+ <p id="uploadModeInfos">{'You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'|@translate:$switch_url}</p>
{elseif $upload_mode eq 'multiple'}
<div id="uploadify">You've got a problem with your JavaScript</div>
<div id="fileQueue" style="display:none"></div>
- <p id="uploadModeInfos">{'You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'|@translate|@sprintf:$switch_url}</p>
+ <p id="uploadModeInfos">{'You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'|@translate:$switch_url}</p>
{/if}
</fieldset>
@@ -341,7 +345,7 @@ var sizeLimit = Math.round({$upload_max_filesize} / 1024); /* in KBytes */
</form>
<div id="uploadProgress" style="display:none">
-{'Photo %s of %s'|@translate|@sprintf:'<span id="progressCurrent">1</span>':'<span id="progressMax">10</span>'}
+{'Photo %s of %s'|@translate:'<span id="progressCurrent">1</span>':'<span id="progressMax">10</span>'}
<br>
<div id="progressbar"></div>
</div>
diff --git a/admin/themes/default/template/picture_modify.tpl b/admin/themes/default/template/picture_modify.tpl
index 5d2238eea..9fbd81daf 100644
--- a/admin/themes/default/template/picture_modify.tpl
+++ b/admin/themes/default/template/picture_modify.tpl
@@ -11,6 +11,7 @@ jQuery(document).ready(function() {
});
{/literal}{/footer_script}
+{combine_css path='themes/default/js/plugins/jquery.tokeninput.css'}
{combine_script id='jquery.tokeninput' load='async' require='jquery' path='themes/default/js/plugins/jquery.tokeninput.js'}
{footer_script require='jquery.tokeninput'}
jQuery(document).ready(function() {ldelim}
@@ -23,7 +24,7 @@ jQuery(document).ready(function() {ldelim}
newText: ' ({'new'|@translate})',
animateDropdown: false,
preventDuplicates: true,
- allowCreation: true
+ allowFreeTagging: true
}
);
});
@@ -56,15 +57,15 @@ pwg_initialization_datepicker("#date_creation_day", "#date_creation_month", "#da
<li>{$INTRO.id}</li>
</ul>
</td>
- <td style="vertical-align:top;">
- <ul style="padding-left:15px;margin:0;">
+ <td class="photoLinks">
+ <ul>
{if isset($U_JUMPTO) }
- <li><a href="{$U_JUMPTO}">{'jump to photo'|@translate} →</a></li>
+ <li><a class="icon-eye" href="{$U_JUMPTO}">{'jump to photo'|@translate} →</a></li>
{/if}
{if !url_is_remote($PATH)}
- <li><a href="{$U_SYNC}">{'Synchronize metadata'|@translate}</a></li>
+ <li><a class="icon-arrows-cw" href="{$U_SYNC}">{'Synchronize metadata'|@translate}</a></li>
- <li><a href="{$U_DELETE}" onclick="return confirm('{'Are you sure?'|@translate|@escape:javascript}');">{'delete photo'|@translate}</a></li>
+ <li><a class="icon-trash" href="{$U_DELETE}" onclick="return confirm('{'Are you sure?'|@translate|@escape:javascript}');">{'delete photo'|@translate}</a></li>
{/if}
</ul>
</td>
diff --git a/admin/themes/default/template/plugins_installed.tpl b/admin/themes/default/template/plugins_installed.tpl
index b10be0401..9864abd9d 100644
--- a/admin/themes/default/template/plugins_installed.tpl
+++ b/admin/themes/default/template/plugins_installed.tpl
@@ -162,7 +162,7 @@ jQuery(document).ready(function() {
{'Version'|@translate} {$plugin.VERSION}
{if not empty($author)}
- | {'By %s'|@translate|@sprintf:$author}
+ | {'By %s'|@translate:$author}
{/if}
{if not empty($plugin.VISIT_URL)}
@@ -183,7 +183,7 @@ jQuery(document).ready(function() {
<div id="{$plugin.ID}" class="pluginMiniBox {$plugin.STATE}">
<div class="pluginMiniBoxNameCell">
{$plugin.NAME}
- <a class="showInfo" title="{if !empty($author)}{'By %s'|@translate|@sprintf:$author} | {/if}{'Version'|@translate} {$version}<br/>{$plugin.DESC|@escape:'html'}">i</a>
+ <a class="icon-info-circled-1 showInfo" title="{if !empty($author)}{'By %s'|@translate:$author} | {/if}{'Version'|@translate} {$version}<br/>{$plugin.DESC|@escape:'html'}"></a>
</div>
<div class="pluginActions">
<div>
diff --git a/admin/themes/default/template/plugins_new.tpl b/admin/themes/default/template/plugins_new.tpl
index ad406fed0..3ccfcaeec 100644
--- a/admin/themes/default/template/plugins_new.tpl
+++ b/admin/themes/default/template/plugins_new.tpl
@@ -77,7 +77,7 @@ jQuery(document).ready(function(){
<td>
<em>{'Downloads'|@translate}: {$plugin.DOWNLOADS}</em>
{'Version'|@translate} {$plugin.VERSION}
- | {'By %s'|@translate|@sprintf:$plugin.AUTHOR}
+ | {'By %s'|@translate:$plugin.AUTHOR}
| <a class="externalLink" href="{$plugin.EXT_URL}">{'Visit plugin site'|@translate}</a>
</td>
</tr>
diff --git a/admin/themes/default/template/profile_content.tpl b/admin/themes/default/template/profile_content.tpl
index 33727f7aa..3c22dd386 100644
--- a/admin/themes/default/template/profile_content.tpl
+++ b/admin/themes/default/template/profile_content.tpl
@@ -50,7 +50,7 @@
{if not $SPECIAL_USER}
<li>
<span class="property">
- <label for="template">{'Interface theme'|@translate}</label>
+ <label for="template">{'Theme'|@translate}</label>
</span>
{html_options id=template name=theme options=$template_options selected=$template_selection}
</li>
diff --git a/admin/themes/default/template/tags.tpl b/admin/themes/default/template/tags.tpl
index 4f4542032..e54362637 100644
--- a/admin/themes/default/template/tags.tpl
+++ b/admin/themes/default/template/tags.tpl
@@ -1,26 +1,68 @@
{include file='include/tag_selection.inc.tpl'}
-{footer_script}{literal}
-jQuery(document).ready(function(){
- function displayDeletionWarnings() {
- jQuery(".warningDeletion").show();
- jQuery("input[name=destination_tag]:checked").parent("label").children(".warningDeletion").hide();
- }
+{html_style}
+.showInfo { text-indent:5px; }
+{/html_style}
+{footer_script require='jquery'}
+jQuery('.showInfo').tipTip({
+ 'delay' : 0,
+ 'fadeIn' : 200,
+ 'fadeOut' : 200,
+ 'maxWidth':'300px',
+ 'keepAlive':true,
+ 'activation':'click'
+});
+
+function displayDeletionWarnings() {
+ jQuery(".warningDeletion").show();
+ jQuery("input[name=destination_tag]:checked").parent("label").children(".warningDeletion").hide();
+}
+
+displayDeletionWarnings();
+
+jQuery("#mergeTags label").click(function() {
displayDeletionWarnings();
+});
- jQuery("#mergeTags label").click(function() {
- displayDeletionWarnings();
- });
+jQuery("input[name=merge]").click(function() {
+ if (jQuery("ul.tagSelection input[type=checkbox]:checked").length < 2) {
+ alert("{'Select at least two tags for merging'|@translate}");
+ return false;
+ }
+});
+
+$("#searchInput").on("keydown", function(e) {
+ var $this = $(this),
+ timer = $this.data("timer");
+
+ if (timer) {
+ clearTimeout(timer);
+ }
- jQuery("input[name=merge]").click(function() {
- if (jQuery("ul.tagSelection input[type=checkbox]:checked").length < 2) {
- alert("{/literal}{'Select at least two tags for merging'|@translate}{literal}");
- return false;
+ $this.data("timer", setTimeout(function() {
+ var val = $this.val();
+ if (!val) {
+ $(".tagSelection>li").show();
+ $("#filterIcon").css("visibility","hidden");
+ }
+ else {
+ $("#filterIcon").css("visibility","visible");
+ var regex = new RegExp( val.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"), "i" );
+ $(".tagSelection>li").each(function() {
+ var $li = $(this),
+ text = $.trim( $("label", $li).text() );
+ $li.toggle(regex.test(text));
+ });
}
- });
+
+ }, 300) );
+
+ if (e.keyCode == 13) { // Enter
+ e.preventDefault();
+ }
});
-{/literal}{/footer_script}
+{/footer_script}
<div class="titrePage">
@@ -46,12 +88,12 @@ jQuery(document).ready(function(){
</table>
<p>
- <input type="hidden" name="pwg_token" value="{$PWG_TOKEN}">
- <input class="submit" type="submit" name="submit" value="{'Submit'|@translate}">
- <input class="submit" type="reset" value="{'Reset'|@translate}">
+ <input type="submit" name="edit_submit" value="{'Submit'|@translate}">
+ <input type="submit" name="edit_cancel" value="{'Cancel'|@translate}">
</p>
</fieldset>
{/if}
+
{if isset($DUPLIC_TAGS_LIST)}
<fieldset>
<legend>{'Edit tags'|@translate}</legend>
@@ -70,23 +112,28 @@ jQuery(document).ready(function(){
</table>
<p>
- <input type="hidden" name="pwg_token" value="{$PWG_TOKEN}">
- <input class="submit" type="submit" name="duplic_submit" value="{'Submit'|@translate}">
- <input class="submit" type="reset" value="{'Reset'|@translate}">
+ <input type="submit" name="duplic_submit" value="{'Submit'|@translate}">
+ <input type="submit" name="duplic_cancel" value="{'Cancel'|@translate}">
</p>
</fieldset>
{/if}
{if isset($MERGE_TAGS_LIST)}
- <input type="hidden" name="merge_list" value="{$MERGE_TAGS_LIST}">
-
<fieldset id="mergeTags">
<legend>{'Merge tags'|@translate}</legend>
- {'Select the destination tag'|@translate}<br><br>
+ {'Select the destination tag'|@translate}
+
+ <p>
{foreach from=$tags item=tag name=tagloop}
<label><input type="radio" name="destination_tag" value="{$tag.ID}"{if $smarty.foreach.tagloop.index == 0} checked="checked"{/if}> {$tag.NAME}<span class="warningDeletion"> {'(this tag will be deleted)'|@translate}</span></label><br>
{/foreach}
- <br><input type="submit" name="confirm_merge" value="{'Confirm merge'|@translate}">
+ </p>
+
+ <p>
+ <input type="hidden" name="merge_list" value="{$MERGE_TAGS_LIST}">
+ <input type="submit" name="merge_submit" value="{'Confirm merge'|@translate}">
+ <input type="submit" name="merge_cancel" value="{'Cancel'|@translate}">
+ </p>
</fieldset>
{/if}
@@ -97,42 +144,40 @@ jQuery(document).ready(function(){
{'New tag'|@translate}
<input type="text" name="add_tag" size="50">
</label>
-
+
<p><input class="submit" type="submit" name="add" value="{'Submit'|@translate}"></p>
</fieldset>
<fieldset>
<legend>{'Tag selection'|@translate}</legend>
-{html_style}
-.showInfo{ldelim}position:static; display:inline-block; text-indent:6px}
-{/html_style}
-{footer_script}{literal}
-jQuery('.showInfo').tipTip({
- 'delay' : 0,
- 'fadeIn' : 200,
- 'fadeOut' : 200,
- 'maxWidth':'300px',
- 'keepAlive':true,
- 'activation':'click'
- });
-{/literal}{/footer_script}
-<ul class="tagSelection">
-{foreach from=$all_tags item=tag}
- <li>{capture name='showInfo'}<b>{$tag.name}</b> ({$pwg->l10n_dec('%d photo', '%d photos', $tag.counter)}) <br> <a href="{$tag.U_VIEW}">{'View in gallery'|@translate}</a> | <a href="{$tag.U_EDIT}">{'Manage photos'|@translate}</a>{if !empty($tag.alt_names)}<br>{$tag.alt_names}{/if}{/capture}
- <a class="showInfo" title="{$smarty.capture.showInfo|@htmlspecialchars}">i</a>
- <label>
- <input type="checkbox" name="tags[]" value="{$tag.id}"> {$tag.name}
- </label>
- </li>
-{/foreach}
-</ul>
+
+ {if count($all_tags)}
+ <div><label><span class="icon-filter" style="visibility:hidden" id="filterIcon"></span>{'Search'|@translate}: <input id="searchInput" type="text" size="12"></label></div>
+ {/if}
+
+ <ul class="tagSelection">
+ {foreach from=$all_tags item=tag}
+ <li>
+ {capture name='showInfo'}{strip}
+ <b>{$tag.name}</b> ({$tag.counter|@translate_dec:'%d photo':'%d photos'})<br>
+ <a href="{$tag.U_VIEW}">{'View in gallery'|@translate}</a> |
+ <a href="{$tag.U_EDIT}">{'Manage photos'|@translate}</a>
+ {if !empty($tag.alt_names)}<br>{$tag.alt_names}{/if}
+ {/strip}{/capture}
+ <a class="icon-info-circled-1 showInfo" title="{$smarty.capture.showInfo|@htmlspecialchars}"></a>
+ <label>
+ <input type="checkbox" name="tags[]" value="{$tag.id}"> {$tag.name}
+ </label>
+ </li>
+ {/foreach}
+ </ul>
<p>
<input type="hidden" name="pwg_token" value="{$PWG_TOKEN}">
- <input class="submit" type="submit" name="edit" value="{'Edit selected tags'|@translate}">
- <input class="submit" type="submit" name="duplicate" value="{'Duplicate selected tags'|@translate}">
- <input class="submit" type="submit" name="merge" value="{'Merge selected tags'|@translate}">
- <input class="submit" type="submit" name="delete" value="{'Delete selected tags'|@translate}" onclick="return confirm('{'Are you sure?'|@translate}');">
+ <input type="submit" name="edit" value="{'Edit selected tags'|@translate}">
+ <input type="submit" name="duplicate" value="{'Duplicate selected tags'|@translate}">
+ <input type="submit" name="merge" value="{'Merge selected tags'|@translate}">
+ <input type="submit" name="delete" value="{'Delete selected tags'|@translate}" onclick="return confirm('{'Are you sure?'|@translate}');">
</p>
</fieldset>
diff --git a/admin/themes/default/template/themes_installed.tpl b/admin/themes/default/template/themes_installed.tpl
index c1c5eb66b..47495df7c 100644
--- a/admin/themes/default/template/themes_installed.tpl
+++ b/admin/themes/default/template/themes_installed.tpl
@@ -1,8 +1,18 @@
{include file='include/colorbox.inc.tpl'}
+
{footer_script}{literal}
jQuery(document).ready(function() {
- $("a.preview-box").colorbox();
-});
+ $("a.preview-box").colorbox();
+
+ jQuery('.showInfo').tipTip({
+ 'delay' : 0,
+ 'fadeIn' : 200,
+ 'fadeOut' : 200,
+ 'maxWidth':'300px',
+ 'keepAlive':true,
+ 'activation':'click'
+ });
+});
{/literal}{/footer_script}
<div class="titrePage">
@@ -11,66 +21,80 @@ jQuery(document).ready(function() {
<div id="themesContent">
-<fieldset>
-<legend>{'Active Themes'|@translate}</legend>
-{if isset($active_themes)}
-<div class="themeBoxes">
-{foreach from=$active_themes item=theme}
- <div class="themeBox{if $theme.is_default} themeDefault{/if}">
- <div class="themeName">{$theme.name}{if $theme.is_default} <em>({'default'|@translate})</em>{/if} {if $theme.mobile} <em>({'Mobile'|@translate})</em>{/if}</div>
- <div class="themeShot"><a href="{$theme.screenshot}" class="preview-box" title="{$theme.name}"><img src="{$theme.screenshot}" alt=""></a></div>
- <div class="themeActions">
- <div>
-{if $theme.deactivable}
- <a href="{$deactivate_baseurl}{$theme.id}" class="tiptip" title="{'Forbid this theme to users'|@translate}">{'Deactivate'|@translate}</a>
-{else}
- <span title="{$theme.deactivate_tooltip}" class="tiptip">{'Deactivate'|@translate}</span>
-{/if}
-
-{if not $theme.is_default}
- | <a href="{$set_default_baseurl}{$theme.id}" class="tiptip" title="{'Set as default theme for unregistered and new users'|@translate}">{'Default'|@translate}</a>
-{/if}
-{if isset($theme.admin_uri)}
- <br><a href="{$theme.admin_uri}" class="tiptip" title="{'Configuration'|@translate}">{'Configuration'|@translate}</a>
-{/if}
- </div>
- </div> <!-- themeActions -->
- </div>
-{/foreach}
-</div> <!-- themeBoxes -->
+{assign var='field_name' value='null'} {* <!-- 'counter' for fieldset management --> *}
+{foreach from=$tpl_themes item=theme}
+
+{if $field_name != $theme.STATE}
+ {if $field_name != 'null'}
+ </div>
+ </fieldset>
+ {/if}
+
+ <fieldset>
+ <legend>
+ {if $theme.STATE == 'active'}
+ {'Active Themes'|@translate}
+ {else}
+ {'Inactive Themes'|@translate}
+ {/if}
+ </legend>
+ <div class="themeBoxes">
+ {assign var='field_name' value=$theme.STATE}
{/if}
-</fieldset>
-{if isset($inactive_themes)}
-<fieldset>
-<legend>{'Inactive Themes'|@translate}</legend>
-<div class="themeBoxes">
-{foreach from=$inactive_themes item=theme}
- <div class="themeBox">
- <div class="themeName">{$theme.name}{if $theme.mobile} <em>({'Mobile'|@translate})</em>{/if}</div>
- <div class="themeShot"><a href="{$theme.screenshot}" class="preview-box" title="{$theme.name}"><img src="{$theme.screenshot}" alt=""></a></div>
+ {if not empty($theme.AUTHOR)}
+ {if not empty($theme.AUTHOR_URL)}
+ {assign var='author' value="<a href='%s'>%s</a>"|@sprintf:$theme.AUTHOR_URL:$theme.AUTHOR}
+ {else}
+ {assign var='author' value='<u>'|cat:$theme.AUTHOR|cat:'</u>'}
+ {/if}
+ {/if}
+ {if not empty($theme.VISIT_URL)}
+ {assign var='version' value="<a class='externalLink' href='"|cat:$theme.VISIT_URL|cat:"'>"|cat:$theme.VERSION|cat:"</a>"}
+ {else}
+ {assign var='version' value=$theme.VERSION}
+ {/if}
+
+ <div class="themeBox{if $theme.IS_DEFAULT} themeDefault{/if}">
+ <div class="themeName">
+ {$theme.NAME} {if $theme.IS_DEFAULT}<em>({'default'|@translate})</em>{/if} {if $theme.IS_MOBILE}<em>({'Mobile'|@translate})</em>{/if}
+ <a class="icon-info-circled-1 showInfo" title="{if !empty($author)}{'By %s'|@translate:$author} | {/if}{'Version'|@translate} {$version}<br/>{$theme.DESC|@escape:'html'}"></a>
+ </div>
+ <div class="themeShot"><a href="{$theme.SCREENSHOT}" class="preview-box" title="{$theme.NAME}"><img src="{$theme.SCREENSHOT}" alt=""></a></div>
<div class="themeActions">
<div>
- {if $theme.activable}
- <a href="{$activate_baseurl}{$theme.id}" title="{'Make this theme available to users'|@translate}" class="tiptip">{'Activate'|@translate}</a>
+{if $theme.STATE == 'active'}
+ {if $theme.DEACTIVABLE}
+ <a href="{$deactivate_baseurl}{$theme.ID}" class="tiptip" title="{'Forbid this theme to users'|@translate}">{'Deactivate'|@translate}</a>
{else}
- <span title="{$theme.activate_tooltip}" class="tiptip">{'Activate'|@translate}</span>
+ <span title="{$theme.DEACTIVATE_TOOLTIP}" class="tiptip">{'Deactivate'|@translate}</span>
{/if}
+ {if not $theme.IS_DEFAULT}
+ | <a href="{$set_default_baseurl}{$theme.ID}" class="tiptip" title="{'Set as default theme for unregistered and new users'|@translate}">{'Default'|@translate}</a>
+ {/if}
+ {if $theme.ADMIN_URI}
+ <br><a href="{$theme.ADMIN_URI}" class="tiptip" title="{'Configuration'|@translate}">{'Configuration'|@translate}</a>
+ {/if}
+{else}
+ {if $theme.ACTIVABLE}
+ <a href="{$activate_baseurl}{$theme.ID}" title="{'Make this theme available to users'|@translate}" class="tiptip">{'Activate'|@translate}</a>
+ {else}
+ <span title="{$theme.ACTIVATE_TOOLTIP}" class="tiptip">{'Activate'|@translate}</span>
+ {/if}
|
-
- {if $theme.deletable}
- <a href="{$delete_baseurl}{$theme.id}" onclick="return confirm('{'Are you sure?'|@translate|@escape:javascript}');" title="{'Delete this theme'|@translate}">{'Delete'|@translate}</a>
+ {if $theme.DELETABLE}
+ <a href="{$delete_baseurl}{$theme.ID}" onclick="return confirm('{'Are you sure?'|@translate|@escape:javascript}');" title="{'Delete this theme'|@translate}">{'Delete'|@translate}</a>
{else}
- <span title="{$theme.delete_tooltip}" class="tiptip">{'Delete'|@translate}</span>
+ <span title="{$theme.DELETE_TOOLTIP}" class="tiptip">{'Delete'|@translate}</span>
{/if}
+{/if}
</div>
- </div>
-
+ </div> <!-- themeActions -->
</div>
+
{/foreach}
</div> <!-- themeBoxes -->
</fieldset>
-{/if}
</div> <!-- themesContent -->
diff --git a/admin/themes/default/template/updates_ext.tpl b/admin/themes/default/template/updates_ext.tpl
index 9946d824f..7d65c254a 100644
--- a/admin/themes/default/template/updates_ext.tpl
+++ b/admin/themes/default/template/updates_ext.tpl
@@ -1,6 +1,6 @@
{combine_script id='jquery.ajaxmanager' load='footer' require='jquery' path='themes/default/js/plugins/jquery.ajaxmanager.js'}
{combine_script id='jquery.jgrowl' load='footer' require='jquery' path='themes/default/js/plugins/jquery.jgrowl_minimized.js'}
-{combine_css path="admin/themes/default/uploadify.jGrowl.css"}
+{combine_css path="themes/default/js/plugins/jquery.jgrowl.css"}
{footer_script require='jquery.ui.effect-blind,jquery.ajaxmanager,jquery.jgrowl'}
var pwg_token = '{$PWG_TOKEN}';
@@ -180,7 +180,7 @@ checkFieldsets();
<img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/plus.gif" alt="" class="button_{$plugin.ID}">
<img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/minus.gif" alt="" class="button_{$plugin.ID}" style="display:none;">
{'New Version'|@translate} : {$plugin.NEW_VERSION}
- | {'By %s'|@translate|@sprintf:$plugin.AUTHOR}
+ | {'By %s'|@translate:$plugin.AUTHOR}
</td>
</tr>
<tr>
@@ -222,7 +222,7 @@ checkFieldsets();
<img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/plus.gif" alt="" class="button_{$theme.ID}">
<img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/minus.gif" alt="" class="button_{$theme.ID}" style="display:none;">
{'New Version'|@translate} : {$theme.NEW_VERSION}
- | {'By %s'|@translate|@sprintf:$theme.AUTHOR}
+ | {'By %s'|@translate:$theme.AUTHOR}
</td>
</tr>
<tr>
@@ -264,7 +264,7 @@ checkFieldsets();
<img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/plus.gif" alt="" class="button_{$language.ID}">
<img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/minus.gif" alt="" class="button_{$language.ID}" style="display:none;">
{'New Version'|@translate} : {$language.NEW_VERSION}
- | {'By %s'|@translate|@sprintf:$language.AUTHOR}
+ | {'By %s'|@translate:$language.AUTHOR}
</td>
</tr>
<tr>
diff --git a/admin/themes/default/template/updates_pwg.tpl b/admin/themes/default/template/updates_pwg.tpl
index 5b1bf3238..8205d9f25 100644
--- a/admin/themes/default/template/updates_pwg.tpl
+++ b/admin/themes/default/template/updates_pwg.tpl
@@ -41,11 +41,11 @@ li { margin: 5px; }
<h4>{'Two updates are available'|@translate}:</h4>
<p>
<ul>
- <li><a href="admin.php?page=updates&amp;step=2&amp;to={$MINOR_VERSION}"><strong>{'Update to Piwigo %s'|@translate|@sprintf:$MINOR_VERSION}</strong></a>: {'This is a minor update, with only bug corrections.'|@translate}</li>
- <li><a href="admin.php?page=updates&amp;step=3&amp;to={$MAJOR_VERSION}"><strong>{'Update to Piwigo %s'|@translate|@sprintf:$MAJOR_VERSION}</strong></a>: {'This is a major update, with <a href="%s">new exciting features</a>.'|@translate|@sprintf:$RELEASE_URL} {'Some themes and plugins may be not available yet.'|@translate}</li>
+ <li><a href="admin.php?page=updates&amp;step=2&amp;to={$MINOR_VERSION}"><strong>{'Update to Piwigo %s'|@translate:$MINOR_VERSION}</strong></a>: {'This is a minor update, with only bug corrections.'|@translate}</li>
+ <li><a href="admin.php?page=updates&amp;step=3&amp;to={$MAJOR_VERSION}"><strong>{'Update to Piwigo %s'|@translate:$MAJOR_VERSION}</strong></a>: {'This is a major update, with <a href="%s">new exciting features</a>.'|@translate:$RELEASE_URL} {'Some themes and plugins may be not available yet.'|@translate}</li>
</ul>
</p>
-<p>{'You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'|@translate|@sprintf:$MAJOR_VERSION:$MINOR_VERSION}</p>
+<p>{'You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'|@translate:$MAJOR_VERSION:$MINOR_VERSION}</p>
{/if}
{if $STEP == 2}
@@ -54,7 +54,7 @@ li { margin: 5px; }
{'This is a minor update, with only bug corrections.'|@translate}
</p>
<form action="" method="post">
-<p><input type="submit" name="submit" value="{'Update to Piwigo %s'|@translate|@sprintf:$UPGRADE_TO}"></p>
+<p><input type="submit" name="submit" value="{'Update to Piwigo %s'|@translate:$UPGRADE_TO}"></p>
<p class="autoupdate_bar" style="display:none;">&nbsp; {'Update in progress...'|@translate}<br><img src="admin/themes/default/images/ajax-loader-bar.gif"></p>
<p><input type="hidden" name="upgrade_to" value="{$UPGRADE_TO}"></p>
</form>
@@ -63,7 +63,7 @@ li { margin: 5px; }
{if $STEP == 3}
<p>
{'A new version of Piwigo is available.'|@translate}<br>
- {'This is a major update, with <a href="%s">new exciting features</a>.'|@translate|@sprintf:$RELEASE_URL} {'Some themes and plugins may be not available yet.'|@translate}
+ {'This is a major update, with <a href="%s">new exciting features</a>.'|@translate:$RELEASE_URL} {'Some themes and plugins may be not available yet.'|@translate}
</p>
<form action="" method="post">
@@ -76,7 +76,7 @@ li { margin: 5px; }
{counter assign=i}
<fieldset>
- <legend>{'Update to Piwigo %s'|@translate|@sprintf:$UPGRADE_TO}</legend>
+ <legend>{'Update to Piwigo %s'|@translate:$UPGRADE_TO}</legend>
{if !empty($missing.plugins)}
<p><i>{'Following plugins may not be compatible with the new version of Piwigo:'|@translate}</i></p>
<p><ul>{foreach from=$missing.plugins item=plugin}<li><a href="{$plugin.uri}" class="externalLink">{$plugin.name}</a></li>{/foreach}</ul><br></p>
@@ -89,7 +89,7 @@ li { margin: 5px; }
{if !empty($missing.plugins) or !empty($missing.themes)}
<p><label><input type="checkbox" name="understand"> &nbsp;{'I decide to update anyway'|@translate}</label></p>
{/if}
- <p><input type="submit" name="submit" value="{'Update to Piwigo %s'|@translate|@sprintf:$UPGRADE_TO}" {if !empty($missing.plugins) or !empty($missing.themes)}disabled="disabled"{/if}>
+ <p><input type="submit" name="submit" value="{'Update to Piwigo %s'|@translate:$UPGRADE_TO}" {if !empty($missing.plugins) or !empty($missing.themes)}disabled="disabled"{/if}>
</p>
<p class="autoupdate_bar" style="display:none;">&nbsp; {'Update in progress...'|@translate}<br><img src="admin/themes/default/images/ajax-loader-bar.gif"></p>
</fieldset>
diff --git a/admin/themes/default/template/upgrade.tpl b/admin/themes/default/template/upgrade.tpl
index f859ed56e..f126d06a6 100644
--- a/admin/themes/default/template/upgrade.tpl
+++ b/admin/themes/default/template/upgrade.tpl
@@ -39,6 +39,7 @@ body {
#content {
min-height:0;
+ border:none;
}
#theHeader {
@@ -161,7 +162,7 @@ input[type="text"]:focus, input[type="password"]:focus, select:focus {
</tr>
</table>
-<p>{'This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'|@translate|@sprintf:$introduction.CURRENT_RELEASE}</p>
+<p>{'This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'|@translate:$introduction.CURRENT_RELEASE}</p>
{if isset($login)}
<p>{'Only administrator can run upgrade: please sign in below.'|@translate}</p>
{/if}
@@ -180,19 +181,19 @@ input[type="text"]:focus, input[type="password"]:focus, select:focus {
{/if}
</fieldset>
<p style="text-align: center;">
-<input class="submit" type="submit" name="submit" value="{'Upgrade from version %s to %s'|@translate|@sprintf:$introduction.CURRENT_RELEASE:$RELEASE}">
+<input class="submit" type="submit" name="submit" value="{'Upgrade from version %s to %s'|@translate:$introduction.CURRENT_RELEASE:$RELEASE}">
</p>
</form>
<!--
<p style="text-align: center;">
-<a href="{$introduction.RUN_UPGRADE_URL}">{'Upgrade from version %s to %s'|@translate|@sprintf:$introduction.CURRENT_RELEASE:$RELEASE}</a>
+<a href="{$introduction.RUN_UPGRADE_URL}">{'Upgrade from version %s to %s'|@translate:$introduction.CURRENT_RELEASE:$RELEASE}</a>
</p>
-->
{/if}
{if isset($upgrade)}
-<h2>{'Upgrade from version %s to %s'|@translate|@sprintf:$upgrade.VERSION:$RELEASE}</h2>
+<h2>{'Upgrade from version %s to %s'|@translate:$upgrade.VERSION:$RELEASE}</h2>
<fieldset>
<legend>{'Statistics'|@translate}</legend>
diff --git a/admin/themes/default/template/user_list.tpl b/admin/themes/default/template/user_list.tpl
index 5bb3f18ed..a491cae17 100644
--- a/admin/themes/default/template/user_list.tpl
+++ b/admin/themes/default/template/user_list.tpl
@@ -1,290 +1,1137 @@
+{combine_script id='common' load='footer' path='admin/themes/default/js/common.js'}
+
+{combine_script id='jquery.dataTables' load='footer' path='themes/default/js/plugins/jquery.dataTables.js'}
+{combine_css path="themes/default/js/plugins/datatables/css/jquery.dataTables.css"}
+
+{combine_script id='jquery.chosen' load='footer' path='themes/default/js/plugins/chosen.jquery.min.js'}
+{combine_css path="themes/default/js/plugins/chosen.css"}
+
+{combine_script id='jquery.underscore' load='footer' path='themes/default/js/plugins/underscore.js'}
+
+{combine_script id='jquery.ui.slider' require='jquery.ui' load='footer' path='themes/default/js/ui/minified/jquery.ui.slider.min.js'}
+{combine_css path="themes/default/js/ui/theme/jquery.ui.slider.css"}
+
+{footer_script}
+var selectedMessage_pattern = "{'%d of %d users selected'|translate|escape:javascript}";
+var selectedMessage_none = "{'No user selected of %d users'|translate|escape:javascript}";
+var selectedMessage_all = "{'All %d users are selected'|translate|escape:javascript}";
+var applyOnDetails_pattern = "{'on the %d selected users'|translate|escape:javascript}";
+var newUser_pattern = "&#x2714; {'User %s added'|translate|escape:javascript}";
+var registeredOn_pattern = "{'Registered on %s, %s.'|translate|escape:javascript}";
+var lastVisit_pattern = "{'Last visit on %s, %s.'|translate|escape:javascript}";
+var missingConfirm = "{'You need to confirm deletion'|translate|escape:javascript}";
+var missingUsername = "{'Please, enter a login'|translate|escape:javascript}";
+
+var allUsers = [{$all_users}];
+var selection = [{$selection}];
+var pwg_token = "{$PWG_TOKEN}";
+
+var protectedUsers = [{$protected_users}];
+var guestUser = {$guest_user};
+
+var truefalse = {
+ true:"{'Yes'|translate}",
+ false:"{'No'|translate}",
+};
+{/footer_script}
+
+{footer_script}{literal}
+jQuery(document).ready(function() {
+ /**
+ * Add user
+ */
+ jQuery("#addUser").click(function() {
+ jQuery("#addUserForm").toggle();
+ jQuery("#showAddUser .infos").hide();
+ jQuery("input[name=username]").focus();
+ return false;
+ });
+
+ jQuery("#addUserClose").click(function() {
+ jQuery("#addUserForm").hide();
+ return false;
+ });
+
+ jQuery("#addUserForm").submit(function() {
+ jQuery.ajax({
+ url: "ws.php?format=json&method=pwg.users.add",
+ type:"POST",
+ data: jQuery(this).serialize(),
+ beforeSend: function() {
+ jQuery("#addUserForm .errors").hide();
+
+ if (jQuery("input[name=username]").val() == "") {
+ jQuery("#addUserForm .errors").html('&#x2718; '+missingUsername).show();
+ return false;
+ }
+
+ jQuery("#addUserForm .loading").show();
+ },
+ success:function(data) {
+ oTable.fnDraw();
+ jQuery("#addUserForm .loading").hide();
+
+ var data = jQuery.parseJSON(data);
+ if (data.stat == 'ok') {
+ jQuery("#addUserForm input[type=text], #addUserForm input[type=password]").val("");
+
+ var new_user = data.result.users[0];
+ allUsers.push(parseInt(new_user.id));
+ jQuery("#showAddUser .infos").html(sprintf(newUser_pattern, new_user.username)).show();
+ checkSelection();
+
+ jQuery("#addUserForm").hide();
+ }
+ else {
+ jQuery("#addUserForm .errors").html('&#x2718; '+data.message).show();
+ }
+ },
+ error:function(XMLHttpRequest, textStatus, errorThrows) {
+ jQuery("#addUserForm .loading").hide();
+ }
+ });
+
+ return false;
+ });
+
+ /**
+ * Table with users
+ */
+ /**
+ * find the key from a value in the startStopValues array
+ */
+ function getSliderKeyFromValue(value, values) {
+ for (var key in values) {
+ if (values[key] >= value) {
+ return key;
+ }
+ }
+ return 0;
+ }
+
+ var recent_period_values = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,25,30,40,50,60,80,99];
+
+ function getRecentPeriodInfoFromIdx(idx) {
+ return sprintf(
+ "{/literal}{'%d days'|@translate}{literal}",
+ recent_period_values[idx]
+ );
+ }
+
+ var nb_image_page_values = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,35,40,45,50,60,70,80,90,100,200,300,500,999];
+
+ function getNbImagePageInfoFromIdx(idx) {
+ return sprintf(
+ "{/literal}{'%d photos per page'|@translate}{literal}",
+ nb_image_page_values[idx]
+ );
+ }
+
+ /* nb_image_page slider */
+ var nb_image_page_init = getSliderKeyFromValue(jQuery('#action_nb_image_page input[name=nb_image_page]').val(), nb_image_page_values);
+
+ jQuery('#action_nb_image_page .nb_image_page_infos').html(getNbImagePageInfoFromIdx(nb_image_page_init));
+
+ jQuery('#action_nb_image_page .nb_image_page').slider({
+ range: "min",
+ min: 0,
+ max: nb_image_page_values.length - 1,
+ value: nb_image_page_init,
+ slide: function( event, ui ) {
+ jQuery('#action_nb_image_page .nb_image_page_infos').html(getNbImagePageInfoFromIdx(ui.value));
+ },
+ stop: function( event, ui ) {
+ jQuery('#action_nb_image_page input[name=nb_image_page]').val(nb_image_page_values[ui.value]).trigger('change');
+ }
+ });
+
+ /* recent_period slider */
+ var recent_period_init = getSliderKeyFromValue(jQuery('#action_recent_period input[name=recent_period]').val(), recent_period_values);
+ jQuery('#action_recent_period .recent_period_infos').html(getRecentPeriodInfoFromIdx(recent_period_init));
+
+ jQuery('#action_recent_period .recent_period').slider({
+ range: "min",
+ min: 0,
+ max: recent_period_values.length - 1,
+ value: recent_period_init,
+ slide: function( event, ui ) {
+ jQuery('#action_recent_period .recent_period_infos').html(getRecentPeriodInfoFromIdx(ui.value));
+ },
+ stop: function( event, ui ) {
+ jQuery('#action_recent_period input[name=recent_period]').val(recent_period_values[ui.value]).trigger('change');
+ }
+ });
+
+ /* Formating function for row details */
+ function fnFormatDetails(oTable, nTr) {
+ var userId = oTable.fnGetData(nTr)[0];
+ console.log("userId = "+userId);
+ var sOut = null;
+
+ jQuery.ajax({
+ url: "ws.php?format=json&method=pwg.users.getList",
+ type:"POST",
+ data: {
+ user_id: userId,
+ display: "all",
+ },
+ success:function(data) {
+ jQuery("#user"+userId+" .loading").hide();
+
+ var data = jQuery.parseJSON(data);
+ if (data.stat == 'ok') {
+ var user = data.result.users[0];
+
+ /* Prepare data for template */
+ user.statusOptions = [];
+ jQuery("#action select[name=status] option").each(function() {
+ var option = {value:jQuery(this).val(), label:jQuery(this).html(), isSelected:false};
+
+ if (user.status == jQuery(this).val()) {
+ option.isSelected = true;
+ }
+
+ user.statusOptions.push(option);
+ });
+
+ user.levelOptions = [];
+ jQuery("#action select[name=level] option").each(function() {
+ var option = {value:jQuery(this).val(), label:jQuery(this).html(), isSelected:false};
+
+ if (user.level == jQuery(this).val()) {
+ option.isSelected = true;
+ }
+
+ user.levelOptions.push(option);
+ });
+
+ user.groupOptions = [];
+ jQuery("#action select[name=associate] option").each(function() {
+ var option = {value:jQuery(this).val(), label:jQuery(this).html(), isSelected:false};
+
+ if (user.groups.indexOf( parseInt(jQuery(this).val()) ) != -1) {
+ option.isSelected = true;
+ }
+
+ user.groupOptions.push(option);
+ });
+
+ user.themeOptions = [];
+ jQuery("#action select[name=theme] option").each(function() {
+ var option = {value:jQuery(this).val(), label:jQuery(this).html(), isSelected:false};
+
+ if (user.theme == jQuery(this).val()) {
+ option.isSelected = true;
+ }
+
+ user.themeOptions.push(option);
+ });
+
+ user.languageOptions = [];
+ jQuery("#action select[name=language] option").each(function() {
+ var option = {value:jQuery(this).val(), label:jQuery(this).html(), isSelected:false};
+
+ if (user.language == jQuery(this).val()) {
+ option.isSelected = true;
+ }
+
+ user.languageOptions.push(option);
+ });
+
+ user.isGuest = (parseInt(userId) == guestUser);
+ user.isProtected = (protectedUsers.indexOf(parseInt(userId)) != -1);
+
+ user.registeredOn_string = sprintf(
+ registeredOn_pattern,
+ user.registration_date_string,
+ user.registration_date_since
+ );
+
+ user.lastVisit_string = "";
+ if (typeof user.last_visit != 'undefined') {
+ user.lastVisit_string = sprintf(lastVisit_pattern, user.last_visit_string, user.last_visit_since);
+ }
+
+ user.updateString = sprintf(
+ "{/literal}{'User %s updated'|translate|escape:javascript}{literal}",
+ user.username
+ );
+
+ user.email = user.email || '';
+
+ jQuery("#action select[name=status] option").each(function() {
+ if (user.status == jQuery(this).val()) {
+ user.statusLabel = jQuery(this).html();
+ }
+ });
+
+ /* Render the underscore template */
+ _.templateSettings.variable = "user";
+
+ var template = _.template(
+ jQuery("script.userDetails").html()
+ );
+
+ jQuery("#user"+userId).append(template(user));
+
+ jQuery(".chzn-select").chosen();
+
+ /* nb_image_page slider */
+ var nb_image_page_init = getSliderKeyFromValue(jQuery('#user'+userId+' input[name=nb_image_page]').val(), nb_image_page_values);
+
+ jQuery('#user'+userId+' .nb_image_page_infos').html(getNbImagePageInfoFromIdx(nb_image_page_init));
+
+ jQuery('#user'+userId+' .nb_image_page').slider({
+ range: "min",
+ min: 0,
+ max: nb_image_page_values.length - 1,
+ value: nb_image_page_init,
+ slide: function( event, ui ) {
+ jQuery('#user'+userId+' .nb_image_page_infos').html(getNbImagePageInfoFromIdx(ui.value));
+ },
+ stop: function( event, ui ) {
+ jQuery('#user'+userId+' input[name=nb_image_page]').val(nb_image_page_values[ui.value]).trigger('change');
+ }
+ });
+
+ /* recent_period slider */
+ var recent_period_init = getSliderKeyFromValue(jQuery('#user'+userId+' input[name=recent_period]').val(), recent_period_values);
+ jQuery('#user'+userId+' .recent_period_infos').html(getRecentPeriodInfoFromIdx(recent_period_init));
+
+ jQuery('#user'+userId+' .recent_period').slider({
+ range: "min",
+ min: 0,
+ max: recent_period_values.length - 1,
+ value: recent_period_init,
+ slide: function( event, ui ) {
+ jQuery('#user'+userId+' .recent_period_infos').html(getRecentPeriodInfoFromIdx(ui.value));
+ },
+ stop: function( event, ui ) {
+ jQuery('#user'+userId+' input[name=recent_period]').val(recent_period_values[ui.value]).trigger('change');
+ }
+ });
+ }
+ else {
+ console.log('error loading user details');
+ }
+ },
+ error:function(XMLHttpRequest, textStatus, errorThrows) {
+ console.log('technical error loading user details');
+ }
+ });
+
+ return '<div id="user'+userId+'" class="userProperties"><img class="loading" src="themes/default/images/ajax-loader-small.gif"></div>';
+ }
+
+ /* change password */
+ jQuery(document).on('click', '.changePasswordOpen', function() {
+ var userId = jQuery(this).parentsUntil('form').parent().find('input[name=user_id]').val();
+
+ jQuery(this).hide();
+ jQuery('#user'+userId+' .changePasswordDone').hide();
+ jQuery('#user'+userId+' .changePassword').show();
+ jQuery('#user'+userId+' .changePassword input[type=text]').focus();
+
+ return false;
+ });
+
+ jQuery(document).on('click', '.changePassword a.updatePassword', function() {
+ var userId = jQuery(this).parentsUntil('form').parent().find('input[name=user_id]').val();
+
+ jQuery('#user'+userId+' .changePassword a .text').hide();
+ jQuery('#user'+userId+' .changePassword a img').show();
+
+ jQuery.ajax({
+ url: "ws.php?format=json&method=pwg.users.setInfo",
+ type:"POST",
+ data: {
+ user_id:userId,
+ password: jQuery('#user'+userId+' .changePassword input[type=text]').val()
+ },
+ beforeSend: function() {
+ jQuery('#user'+userId+' .changePassword input[type=text]').val("");
+ },
+ success:function(data) {
+ jQuery('#user'+userId+' .changePassword a .text').show();
+ jQuery('#user'+userId+' .changePassword a img').hide();
+ jQuery('#user'+userId+' .changePassword').hide();
+ jQuery('#user'+userId+' .changePasswordOpen').show();
+ jQuery('#user'+userId+' .changePasswordDone').show();
+ },
+ error:function(XMLHttpRequest, textStatus, errorThrows) {
+ }
+ });
+
+ return false;
+ });
+
+ jQuery(document).on('click', '.changePassword a.cancel', function() {
+ var userId = jQuery(this).parentsUntil('form').parent().find('input[name=user_id]').val();
+
+ jQuery('#user'+userId+' .changePassword').hide();
+ jQuery('#user'+userId+' .changePasswordOpen').show();
+
+ return false;
+ });
+
+ /* change username */
+ jQuery(document).on('click', '.changeUsernameOpen a', function() {
+ var userId = jQuery(this).parentsUntil('form').parent().find('input[name=user_id]').val();
+ var username = jQuery('#user'+userId+' .username').html();
+
+ jQuery('#user'+userId+' .changeUsernameOpen').hide();
+ jQuery('#user'+userId+' .changeUsername').show();
+ jQuery('#user'+userId+' .changeUsername input[type=text]').val(username).focus();
+
+ return false;
+ });
+
+ jQuery(document).on('click', 'a.updateUsername', function() {
+ var userId = jQuery(this).parentsUntil('form').parent().find('input[name=user_id]').val();
+
+ jQuery('#user'+userId+' .changeUsername a .text').hide();
+ jQuery('#user'+userId+' .changeUsername a img').show();
+
+ jQuery.ajax({
+ url: "ws.php?format=json&method=pwg.users.setInfo",
+ type:"POST",
+ data: {
+ user_id:userId,
+ username: jQuery('#user'+userId+' .changeUsername input[type=text]').val()
+ },
+ success:function(data) {
+ jQuery('#user'+userId+' .changeUsername a .text').show();
+ jQuery('#user'+userId+' .changeUsername a img').hide();
+ jQuery('#user'+userId+' .changeUsername').hide();
+ jQuery('#user'+userId+' .changeUsernameOpen').show();
+
+ var data = jQuery.parseJSON(data);
+ jQuery('#user'+userId+' .username').html(data.result.users[0].username);
+ },
+ error:function(XMLHttpRequest, textStatus, errorThrows) {
+ }
+ });
+
+ return false;
+ });
+
+ jQuery(document).on('click', '.changeUsername a.cancel', function() {
+ var userId = jQuery(this).parentsUntil('form').parent().find('input[name=user_id]').val();
+
+ jQuery('#user'+userId+' .changeUsername').hide();
+ jQuery('#user'+userId+' .changeUsernameOpen').show();
+
+ return false;
+ });
+
+ /* display the "save" button when a field changes */
+ jQuery(document).on('change', '.userProperties input, .userProperties select', function() {
+ var userId = jQuery(this).parentsUntil('form').parent().find('input[name=user_id]').val();
+
+ jQuery('#user'+userId+' input[type=submit]').show();
+ jQuery('#user'+userId+' .propertiesUpdateDone').hide();
+ });
+
+ /* delete user */
+ jQuery(document).on('click', '.userDelete a', function() {
+ if (!confirm("{/literal}{'Are you sure?'|translate|escape:javascript}{literal}")) {
+ return false;
+ }
+
+ var userId = jQuery(this).data('user_id');
+ var username = jQuery('#user'+userId+' .username').html();
+
+ jQuery.ajax({
+ url: "ws.php?format=json&method=pwg.users.delete",
+ type:"POST",
+ data: {
+ user_id:userId,
+ pwg_token:pwg_token
+ },
+ beforeSend: function() {
+ jQuery('#user'+userId+' .userDelete .loading').show();
+ },
+ success:function(data) {
+ oTable.fnDraw();
+ jQuery('#showAddUser .infos').html('&#x2714; User '+username+' deleted').show();
+ },
+ error:function(XMLHttpRequest, textStatus, errorThrows) {
+ jQuery('#user'+userId+' .userDelete .loading').hide();
+ }
+ });
+
+ return false;
+ });
+
+ jQuery(document).on('click', '.userProperties input[type=submit]', function() {
+ var userId = jQuery(this).data('user_id');
+
+ var formData = jQuery('#user'+userId+' form').serialize();
+
+ if (jQuery('#user'+userId+' form select[name="group_id[]"] option:selected').length == 0) {
+ formData += '&group_id=-1';
+ }
+
+ if (!jQuery('#user'+userId+' form input[name=enabled_high]').is(':checked')) {
+ formData += '&enabled_high=false';
+ }
+
+ if (!jQuery('#user'+userId+' form input[name=expand]').is(':checked')) {
+ formData += '&expand=false';
+ }
+
+ if (!jQuery('#user'+userId+' form input[name=show_nb_hits]').is(':checked')) {
+ formData += '&show_nb_hits=false';
+ }
+
+ if (!jQuery('#user'+userId+' form input[name=show_nb_comments]').is(':checked')) {
+ formData += '&show_nb_comments=false';
+ }
+
+ jQuery.ajax({
+ url: "ws.php?format=json&method=pwg.users.setInfo",
+ type:"POST",
+ data: formData,
+ beforeSend: function() {
+ jQuery('#user'+userId+' .submitWait').show();
+ },
+ success:function(data) {
+ jQuery('#user'+userId+' .submitWait').hide();
+ jQuery('#user'+userId+' input[type=submit]').hide();
+ jQuery('#user'+userId+' .propertiesUpdateDone').show();
+ },
+ error:function(XMLHttpRequest, textStatus, errorThrows) {
+ jQuery('#user'+userId+' .submitWait').hide();
+ }
+ });
+
+ return false;
+ });
+
+ /* Add event listener for opening and closing details
+ * Note that the indicator for showing which row is open is not controlled by DataTables,
+ * rather it is done here
+ */
+ jQuery(document).on('click', '#userList tbody td .openUserDetails', function() {
+ var nTr = this.parentNode.parentNode;
+ if (jQuery(this).hasClass('icon-cancel-circled')) {
+ /* This row is already open - close it */
+ jQuery(this)
+ .removeClass('icon-cancel-circled')
+ .addClass('icon-pencil')
+ .attr('title', "{/literal}{'Open user details'|translate|escape:'javascript'}{literal}")
+ .html("{/literal}{'edit'|translate|escape:'javascript'}{literal}")
+ ;
+
+ oTable.fnClose( nTr );
+ }
+ else {
+ /* Open this row */
+ jQuery(this)
+ .removeClass('icon-pencil')
+ .addClass('icon-cancel-circled')
+ .attr('title', "{/literal}{'Close user details'|translate|escape:'javascript'}{literal}")
+ .html("{/literal}{'close'|translate|escape:'javascript'}{literal}")
+ ;
+
+ oTable.fnOpen( nTr, fnFormatDetails(oTable, nTr), 'details' );
+ }
+ });
+
+
+ /* first column must be prefixed with the open/close icon */
+ var aoColumns = [
+ {
+ 'bVisible':false
+ },
+ {
+ "mRender": function(data, type, full) {
+ return '<label><input type="checkbox" data-user_id="'+full[0]+'"> '+data+'</label> <a title="{/literal}{'Open user details'|translate|escape:'javascript'}{literal}" class="icon-pencil openUserDetails">{/literal}{'edit'|translate}{literal}</a>';
+ }
+ }
+ ];
+
+ for (i=2; i<jQuery("#userList thead tr th").length; i++) {
+ aoColumns.push(null);
+ }
+
+ var oTable = jQuery('#userList').dataTable({
+ "iDisplayLength": 10,
+ "bDeferRender": true,
+ "bProcessing": true,
+ "bServerSide": true,
+ "sServerMethod": "POST",
+ "sAjaxSource": "admin/user_list_backend.php",
+ "oLanguage": {
+ "sProcessing": "{/literal}{'Loading...'|translate|escape:'javascript'}{literal}",
+ "sLengthMenu": sprintf("{/literal}{'Show %s users'|translate|escape:'javascript'}{literal}", '_MENU_'),
+ "sZeroRecords": "{/literal}{'No matching user found'|translate|escape:'javascript'}{literal}",
+ "sInfo": sprintf("{/literal}{'Showing %s to %s of %s users'|translate|escape:'javascript'}{literal}", '_START_', '_END_', '_TOTAL_'),
+ "sInfoEmpty": "{/literal}{'No matching user found'|translate|escape:'javascript'}{literal}",
+ "sInfoFiltered": sprintf("{/literal}{'(filtered from %s total users)'|translate|escape:'javascript'}{literal}", '_MAX_'),
+ "sSearch": '<span class="icon-search"></span>'+"{/literal}{'Search'|translate|escape:'javascript'}{literal}",
+ "sLoadingRecords": "{/literal}{'Loading...'|translate|escape:'javascript'}{literal}",
+ "oPaginate": {
+ "sFirst": "{/literal}{'First'|translate|escape:'javascript'}{literal}",
+ "sPrevious": '↠'+"{/literal}{'Previous'|translate|escape:'javascript'}{literal}",
+ "sNext": "{/literal}{'Next'|translate|escape:'javascript'}{literal}"+' →',
+ "sLast": "{/literal}{'Last'|translate|escape:'javascript'}{literal}",
+ }
+ },
+ "fnDrawCallback": function( oSettings ) {
+ jQuery("#userList input[type=checkbox]").each(function() {
+ var user_id = jQuery(this).data("user_id");
+ jQuery(this).prop('checked', (selection.indexOf(user_id) != -1));
+ });
+ },
+ "aoColumns": aoColumns
+ });
+
+ /**
+ * Selection management
+ */
+ function checkSelection() {
+ if (selection.length > 0) {
+ jQuery("#forbidAction").hide();
+ jQuery("#permitAction").show();
+
+ jQuery("#applyOnDetails").text(
+ sprintf(
+ applyOnDetails_pattern,
+ selection.length
+ )
+ );
+
+ if (selection.length == allUsers.length) {
+ jQuery("#selectedMessage").text(
+ sprintf(
+ selectedMessage_all,
+ allUsers.length
+ )
+ );
+ }
+ else {
+ jQuery("#selectedMessage").text(
+ sprintf(
+ selectedMessage_pattern,
+ selection.length,
+ allUsers.length
+ )
+ );
+ }
+ }
+ else {
+ jQuery("#forbidAction").show();
+ jQuery("#permitAction").hide();
+
+ jQuery("#selectedMessage").text(
+ sprintf(
+ selectedMessage_none,
+ allUsers.length
+ )
+ );
+ }
+
+ jQuery("#applyActionBlock .infos").hide();
+ }
+
+ jQuery(document).on('change', '#userList input[type=checkbox]', function() {
+ var user_id = jQuery(this).data("user_id");
+
+ array_delete(selection, user_id);
+
+ if (jQuery(this).is(":checked")) {
+ selection.push(user_id);
+ }
+
+ checkSelection();
+ });
+
+ jQuery("#selectAll").click(function () {
+ selection = allUsers;
+ jQuery("#userList input[type=checkbox]").prop('checked', true);
+ checkSelection();
+ return false;
+ });
+
+ jQuery("#selectNone").click(function () {
+ selection = [];
+ jQuery("#userList input[type=checkbox]").prop('checked', false);
+ checkSelection();
+ return false;
+ });
+
+ jQuery("#selectInvert").click(function () {
+ var newSelection = [];
+ for(var i in allUsers)
+ {
+ if (selection.indexOf(allUsers[i]) == -1) {
+ newSelection.push(allUsers[i]);
+ }
+ }
+ selection = newSelection;
+
+ jQuery("#userList input[type=checkbox]").each(function() {
+ var user_id = jQuery(this).data("user_id");
+ jQuery(this).prop('checked', (selection.indexOf(user_id) != -1));
+ });
+
+ checkSelection();
+ return false;
+ });
+
+ /**
+ * Action management
+ */
+ jQuery("[id^=action_]").hide();
+
+ jQuery("select[name=selectAction]").change(function () {
+ jQuery("#applyActionBlock .infos").hide();
+
+ jQuery("[id^=action_]").hide();
+
+ jQuery("#action_"+$(this).prop("value")).show();
+
+ if (jQuery(this).val() != -1) {
+ jQuery("#applyActionBlock").show();
+ }
+ else {
+ jQuery("#applyActionBlock").hide();
+ }
+ });
+
+ jQuery("#permitAction input, #permitAction select").click(function() {
+ jQuery("#applyActionBlock .infos").hide();
+ });
+
+ jQuery("#applyAction").click(function() {
+ var action = jQuery("select[name=selectAction]").prop("value");
+ var method = 'pwg.users.setInfo';
+ var data = {
+ user_id: selection
+ };
+
+ switch (action) {
+ case 'delete':
+ if (!jQuery("input[name=confirm_deletion]").is(':checked')) {
+ alert(missingConfirm);
+ return false;
+ }
+ method = 'pwg.users.delete';
+ data.pwg_token = pwg_token;
+ break;
+ case 'group_associate':
+ method = 'pwg.groups.addUser';
+ data.group_id = jQuery("select[name=associate]").prop("value");
+ break;
+ case 'group_dissociate':
+ method = 'pwg.groups.deleteUser';
+ data.group_id = jQuery("select[name=dissociate]").prop("value");
+ break;
+ case 'status':
+ data.status = jQuery("select[name=status]").prop("value");
+ break;
+ case 'enabled_high':
+ data.enabled_high = jQuery("input[name=enabled_high]:checked").val();
+ break;
+ case 'level':
+ data.level = jQuery("select[name=level]").val();
+ break;
+ case 'nb_image_page':
+ data.nb_image_page = jQuery("input[name=nb_image_page]").val();
+ break;
+ case 'theme':
+ data.theme = jQuery("select[name=theme]").val();
+ break;
+ case 'language':
+ data.language = jQuery("select[name=language]").val();
+ break;
+ case 'recent_period':
+ data.recent_period = jQuery("input[name=recent_period]").val();
+ break;
+ case 'expand':
+ data.expand = jQuery("input[name=expand]:checked").val();
+ break;
+ case 'show_nb_comments':
+ data.show_nb_comments = jQuery("input[name=show_nb_comments]:checked").val();
+ break;
+ case 'show_nb_hits':
+ data.show_nb_hits = jQuery("input[name=show_nb_hits]:checked").val();
+ break;
+ default:
+ alert("Unexpected action");
+ return false;
+ }
+
+ jQuery.ajax({
+ url: "ws.php?format=json&method="+method,
+ type:"POST",
+ data: data,
+ beforeSend: function() {
+ jQuery("#applyActionLoading").show();
+ },
+ success:function(data) {
+ oTable.fnDraw();
+ jQuery("#applyActionLoading").hide();
+ jQuery("#applyActionBlock .infos").show();
+
+ if (action == 'delete') {
+ var allUsers_new = [];
+ for(var i in allUsers)
+ {
+ if (selection.indexOf(allUsers[i]) == -1) {
+ allUsers_new.push(allUsers[i]);
+ }
+ }
+ allUsers = allUsers_new;
+ console.log('allUsers_new.length = '+allUsers_new.length);
+ selection = [];
+ checkSelection();
+ }
+ },
+ error:function(XMLHttpRequest, textStatus, errorThrows) {
+ jQuery("#applyActionLoading").hide();
+ }
+ });
+
+ return false;
+ });
+
+});
+{/literal}{/footer_script}
+
+{html_style}{literal}
+.dataTables_wrapper, .dataTables_info {clear:none;}
+table.dataTable {clear:right;padding-top:10px;}
+.dataTable td img {margin-bottom: -6px;margin-left: -6px;}
+.paginate_enabled_previous, .paginate_enabled_previous:hover, .paginate_disabled_previous, .paginate_enabled_next, .paginate_enabled_next:hover, .paginate_disabled_next {background:none;}
+.paginate_enabled_previous, .paginate_enabled_next {color:#005E89 !important;}
+.paginate_enabled_previous:hover, .paginate_enabled_next:hover {color:#D54E21 !important; text-decoration:underline !important;}
+
+.paginate_disabled_next, .paginate_enabled_next {padding-right:3px;}
+.bulkAction {margin-top:10px;}
+#addUserForm p {margin-left:0;}
+#applyActionBlock .actionButtons {margin-left:0;}
+span.infos, span.errors {background-image:none; padding:2px 5px; margin:0;border-radius:5px;}
+
+.userStats {margin-top:10px;}
+.recent_period_infos {margin-left:10px;}
+.nb_image_page, .recent_period {width:340px;margin-top:5px;}
+#action_recent_period .recent_period {display:inline-block;}
+{/literal}{/html_style}
+
<div class="titrePage">
<h2>{'User list'|@translate}</h2>
</div>
-<form class="filter" method="post" name="add_user" action="{$F_ADD_ACTION}">
+<p class="showCreateAlbum" id="showAddUser">
+ <a href="#" id="addUser" class="icon-plus-circled">{'Add a user'|translate}</a>
+ <span class="infos" style="display:none"></span>
+</p>
+
+<form id="addUserForm" style="display:none" method="post" name="add_user" action="{$F_ADD_ACTION}">
<fieldset>
<legend>{'Add a user'|@translate}</legend>
- <label>{'Username'|@translate} <input type="text" name="login" maxlength="50" size="20"></label>
- {if $Double_Password}
- <label>{'Password'|@translate} <input type="password" name="password"></label>
- <label>{'Confirm Password'|@translate} <input type="password" name="password_conf" id="password_conf"></label>
- {else}
- <label>{'Password'|@translate} <input type="text" name="password"></label>
- {/if}
- <label>{'Email address'|@translate} <input type="text" name="email"></label>
- <label>{'Send connection settings by email'|@translate} <input type="checkbox" name="send_password_by_mail" value="1" checked="checked"></label>
- <label>&nbsp; <input class="submit" type="submit" name="submit_add" value="{'Submit'|@translate}"></label>
- </fieldset>
-</form>
-
-<form class="filter" method="get" name="filter" action="{$F_FILTER_ACTION}">
-<fieldset>
- <legend>{'Filter'|@translate}</legend>
- <input type="hidden" name="page" value="user_list">
-
- <label>{'Username'|@translate} <input type="text" name="username" value="{$F_USERNAME}"></label>
-
- <label>
- {'status'|@translate}
- {html_options name=status options=$status_options selected=$status_selected}
- </label>
-
- <label>
- {'Group'|@translate}
- {html_options name=group options=$group_options selected=$group_selected}
- </label>
- <label>
- {'Sort by'|@translate}
- {html_options name=order_by options=$order_options selected=$order_selected}
- </label>
+ <p>
+ <strong>{'Username'|translate}</strong><br>
+ <input type="text" name="username" maxlength="50" size="20">
+ </p>
- <label>
- {'Sort order'|@translate}
- {html_options name=direction options=$direction_options selected=$direction_selected}
- </label>
+ <p>
+ <strong>{'Password'|translate}</strong><br>
+ <input type="{if $Double_Password}password{else}text{/if}" name="password">
+ </p>
+
+{if $Double_Password}
+ <p>
+ <strong>{'Confirm Password'|@translate}</strong><br>
+ <input type="password" name="password_confirm">
+ </p>
+{/if}
- <label>
- &nbsp;
- <input class="submit" type="submit" value="{'Submit'|@translate}">
- </label>
+ <p>
+ <strong>{'Email address'|@translate}</strong><br>
+ <input type="text" name="email">
+ </p>
-</fieldset>
+ <p>
+ <label><input type="checkbox" name="send_password_by_mail"> <strong>{'Send connection settings by email'|@translate}</strong></label>
+ </p>
+ <p class="actionButtons">
+ <input class="submit" name="submit_add" type="submit" value="{'Submit'|@translate}">
+ <a href="#" id="addUserClose">{'Cancel'|@translate}</a>
+ <span class="loading" style="display:none"><img src="themes/default/images/ajax-loader-small.gif"></span>
+ <span class="errors" style="display:none"></span>
+ </p>
+ </fieldset>
</form>
<form method="post" name="preferences" action="">
-{if !empty($navbar) }{include file='navigation_bar.tpl'|@get_extent:'navbar'}{/if}
-
-<table class="table2" width="97%">
+<table id="userList">
<thead>
- <tr class="throw">
- <td>&nbsp;</td>
- <td>{'Username'|@translate}</td>
- <td>{'User status'|@translate}</td>
- <td>{'Email address'|@translate}</td>
- <td>{'Groups'|@translate}</td>
- <td>{'Properties'|@translate}</td>
- {if not empty($plugin_user_list_column_titles)}
- {foreach from=$plugin_user_list_column_titles item=title}
- <td>{$title}</td>
- {/foreach}
- {/if}
- <td>{'Actions'|@translate}</td>
+ <tr>
+ <th>id</th>
+ <th>{'Username'|@translate}</th>
+ <th>{'Status'|@translate}</th>
+ <th>{'Email address'|@translate}</th>
+ <th>{'registration date'|@translate}</th>
</tr>
</thead>
-
- {foreach from=$users item=user name=users_loop}
- <tr class="{if $smarty.foreach.users_loop.index is odd}row1{else}row2{/if}">
- <td><input type="checkbox" name="selection[]" value="{$user.ID}" {$user.CHECKED} id="selection-{$user.ID}"></td>
- <td><label for="selection-{$user.ID}">{$user.USERNAME}</label></td>
- <td>{$user.STATUS}</td>
- <td>{$user.EMAIL}</td>
- <td>{$user.GROUPS}</td>
- <td>{$user.PROPERTIES}</td>
- {foreach from=$user.plugin_columns item=data}
- <td>{$data}</td>
- {/foreach}
- <td style="text-align:center;">
- <a href="{$user.U_PERM}"><img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/permissions.png" style="border:none" alt="{'Permissions'|@translate}" title="{'Permissions'|@translate}"></a>
- <a href="{$user.U_PROFILE}"><img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/edit_s.png" style="border:none" alt="{'Profile'|@translate}" title="{'Profile'|@translate}"></a>
- {foreach from=$user.plugin_actions item=data}
- {$data}
- {/foreach}
- </td>
- </tr>
- {/foreach}
</table>
-{if !empty($navbar) }{include file='navigation_bar.tpl'|@get_extent:'navbar'}{/if}
+<div style="clear:right"></div>
-{* delete the selected users ? *}
-<fieldset>
- <legend>{'Deletions'|@translate}</legend>
- <label><input type="checkbox" name="confirm_deletion" value="1"> {'confirm'|@translate}</label>
- <input class="submit" type="submit" value="{'Delete selected users'|@translate}" name="delete">
-</fieldset>
-
-<fieldset>
- <legend>{'Status'|@translate}</legend>
-
- <table>
- <tr>
- <td>{'Status'|@translate}</td>
- <td>
- <label><input type="radio" name="status_action" value="leave" checked="checked"> {'leave'|@translate}</label>
- <label><input type="radio" name="status_action" value="set" id="status_action_set"> {'set to'|@translate}</label>
- <select onchange="document.getElementById('status_action_set').checked = true;" name="status" size="1">
- {html_options options=$pref_status_options selected=$pref_status_selected}
- </select>
- </td>
- </tr>
- </table>
-</fieldset>
+<p class="checkActions">
+ {'Select:'|@translate}
+ <a href="#" id="selectAll">{'All'|@translate}</a>,
+ <a href="#" id="selectNone">{'None'|@translate}</a>,
+ <a href="#" id="selectInvert">{'Invert'|@translate}</a>
-{* form to set properties for many users at once *}
-<fieldset>
- <legend>{'Groups'|@translate}</legend>
+ <span id="selectedMessage"></span>
+</p>
-<table>
+<fieldset id="action">
+ <legend>{'Action'|@translate}</legend>
- <tr>
- <td>{'associate to group'|@translate}</td>
- <td>
- {html_options name=associate options=$association_options selected=$associate_selected}
- </td>
- </tr>
+ <div id="forbidAction"{if count($selection) != 0} style="display:none"{/if}>{'No user selected, no action possible.'|@translate}</div>
+ <div id="permitAction"{if count($selection) == 0} style="display:none"{/if}>
- <tr>
- <td>{'dissociate from group'|@translate}</td>
- <td>
- {html_options name=dissociate options=$association_options selected=$dissociate_selected}
- </td>
- </tr>
+ <select name="selectAction">
+ <option value="-1">{'Choose an action'|@translate}</option>
+ <option disabled="disabled">------------------</option>
+ <option value="delete" class="icon-trash">{'Delete selected users'|@translate}</option>
+ <option value="status">{'Status'|@translate}</option>
+ <option value="group_associate">{'associate to group'|translate}</option>
+ <option value="group_dissociate">{'dissociate from group'|@translate}</option>
+ <option value="enabled_high">{'High definition enabled'|@translate}</option>
+ <option value="level">{'Privacy level'|@translate}</option>
+ <option value="nb_image_page">{'Number of photos per page'|@translate}</option>
+ <option value="theme">{'Theme'|@translate}</option>
+ <option value="language">{'Language'|@translate}</option>
+ <option value="recent_period">{'Recent period'|@translate}</option>
+ <option value="expand">{'Expand all albums'|@translate}</option>
+{if $ACTIVATE_COMMENTS}
+ <option value="show_nb_comments">{'Show number of comments'|@translate}</option>
+{/if}
+ <option value="show_nb_hits">{'Show number of hits'|@translate}</option>
+ </select>
-</table>
+ {* delete *}
+ <div id="action_delete" class="bulkAction">
+ <p><label><input type="checkbox" name="confirm_deletion" value="1"> {'Are you sure?'|@translate}</label></p>
+ </div>
-</fieldset>
+ {* status *}
+ <div id="action_status" class="bulkAction">
+ <select name="status">
+ {html_options options=$pref_status_options selected=$pref_status_selected}
+ </select>
+ </div>
-{* Properties *}
-<fieldset>
- <legend>{'Properties'|@translate}</legend>
+ {* group_associate *}
+ <div id="action_group_associate" class="bulkAction">
+ {html_options name=associate options=$association_options selected=$associate_selected}
+ </div>
- <table>
+ {* group_dissociate *}
+ <div id="action_group_dissociate" class="bulkAction">
+ {html_options name=dissociate options=$association_options selected=$dissociate_selected}
+ </div>
- <tr>
- <td>{'High definition enabled'|@translate}</td>
- <td>
- <label><input type="radio" name="enabled_high" value="leave" checked="checked"> {'leave'|@translate}</label>
- / {'set to'|@translate}
- <label><input type="radio" name="enabled_high" value="true">{'Yes'|@translate}</label>
- <label><input type="radio" name="enabled_high" value="false">{'No'|@translate}</label>
- </td>
- </tr>
+ {* enabled_high *}
+ <div id="action_enabled_high" class="bulkAction">
+ <label><input type="radio" name="enabled_high" value="true">{'Yes'|@translate}</label>
+ <label><input type="radio" name="enabled_high" value="false" checked="checked">{'No'|@translate}</label>
+ </div>
- <tr>
- <td>{'Privacy level'|@translate}</td>
- <td>
- <label><input type="radio" name="level_action" value="leave" checked="checked">{'leave'|@translate}</label>
- <label><input type="radio" name="level_action" value="set" id="level_action_set">{'set to'|@translate}</label>
- <select onchange="document.getElementById('level_action_set').checked = true;" name="level" size="1">
- {html_options options=$level_options selected=$level_selected}
- </select>
- </td>
- </tr>
- </table>
+ {* level *}
+ <div id="action_level" class="bulkAction">
+ <select name="level" size="1">
+ {html_options options=$level_options selected=$level_selected}
+ </select>
+ </div>
-</fieldset>
+ {* nb_image_page *}
+ <div id="action_nb_image_page" class="bulkAction">
+ <strong class="nb_image_page_infos"></strong>
+ <div class="nb_image_page"></div>
+ <input type="hidden" name="nb_image_page" value="{$NB_IMAGE_PAGE}">
+ </div>
-{* preference *}
-<fieldset>
- <legend>{'Preferences'|@translate}</legend>
-
-<table>
- <tr>
- <td>{'Number of photos per page'|@translate}</td>
- <td>
- <label><input type="radio" name="nb_image_page_action" value="leave" checked="checked"> {'leave'|@translate}</label>
- <label><input type="radio" name="nb_image_page_action" value="set" id="nb_image_page_action_set"> {'set to'|@translate}</label>
- <input onmousedown="document.getElementById('nb_image_page_action_set').checked = true;"
- size="4" maxlength="3" type="text" name="nb_image_page" value="{$NB_IMAGE_PAGE}">
- </td>
- </tr>
-
- <tr>
- <td>{'Interface theme'|@translate}</td>
- <td>
- <label><input type="radio" name="theme_action" value="leave" checked="checked"> {'leave'|@translate}</label>
- <label><input type="radio" name="theme_action" value="set" id="theme_action_set"> {'set to'|@translate}</label>
- <select onchange="document.getElementById('theme_action_set').checked = true;" name="theme" size="1">
+ {* theme *}
+ <div id="action_theme" class="bulkAction">
+ <select name="theme" size="1">
{html_options options=$theme_options selected=$theme_selected}
</select>
- </td>
- </tr>
-
- <tr>
- <td>{'Language'|@translate}</td>
- <td>
- <label><input type="radio" name="language_action" value="leave" checked="checked"> {'leave'|@translate}</label>
- <label><input type="radio" name="language_action" value="set" id="language_action_set"> {'set to'|@translate}</label>
- <select onchange="document.getElementById('language_action_set').checked = true;" name="language" size="1">
+ </div>
+
+ {* language *}
+ <div id="action_language" class="bulkAction">
+ <select name="language" size="1">
{html_options options=$language_options selected=$language_selected}
</select>
- </td>
- </tr>
-
- <tr>
- <td>{'Recent period'|@translate}</td>
- <td>
- <label><input type="radio" name="recent_period_action" value="leave" checked="checked"> {'leave'|@translate}</label>
- <label><input type="radio" name="recent_period_action" value="set" id="recent_period_action_set"> {'set to'|@translate}</label>
- <input onmousedown="document.getElementById('recent_period_action_set').checked = true;"
- type="text" size="3" maxlength="2" name="recent_period" value="{$RECENT_PERIOD}">
- </td>
- </tr>
-
- <tr>
- <td>{'Expand all albums'|@translate}</td>
- <td>
- <label><input type="radio" name="expand" value="leave" checked="checked"> {'leave'|@translate}</label>
- / {'set to'|@translate}
+ </div>
+
+ {* recent_period *}
+ <div id="action_recent_period" class="bulkAction">
+ <div class="recent_period"></div>
+ <span class="recent_period_infos"></span>
+ <input type="hidden" name="recent_period" value="{$RECENT_PERIOD}">
+ </div>
+
+ {* expand *}
+ <div id="action_expand" class="bulkAction">
<label><input type="radio" name="expand" value="true">{'Yes'|@translate}</label>
- <label><input type="radio" name="expand" value="false">{'No'|@translate}</label>
- </td>
- </tr>
+ <label><input type="radio" name="expand" value="false" checked="checked">{'No'|@translate}</label>
+ </div>
-{if $ACTIVATE_COMMENTS}
- <tr>
- <td>{'Show number of comments'|@translate}</td>
- <td>
- <label><input type="radio" name="show_nb_comments" value="leave" checked="checked"> {'leave'|@translate}</label>
- / {'set to'|@translate}
+ {* show_nb_comments *}
+ <div id="action_show_nb_comments" class="bulkAction">
<label><input type="radio" name="show_nb_comments" value="true">{'Yes'|@translate}</label>
- <label><input type="radio" name="show_nb_comments" value="false">{'No'|@translate}</label>
- </td>
- </tr>
-{/if}
+ <label><input type="radio" name="show_nb_comments" value="false" checked="checked">{'No'|@translate}</label>
+ </div>
- <tr>
- <td>{'Show number of hits'|@translate}</td>
- <td>
- <label><input type="radio" name="show_nb_hits" value="leave" checked="checked"> {'leave'|@translate}</label>
- / {'set to'|@translate}
+ {* show_nb_hits *}
+ <div id="action_show_nb_hits" class="bulkAction">
<label><input type="radio" name="show_nb_hits" value="true">{'Yes'|@translate}</label>
- <label><input type="radio" name="show_nb_hits" value="false">{'No'|@translate}</label>
- </td>
- </tr>
+ <label><input type="radio" name="show_nb_hits" value="false" checked="checked">{'No'|@translate}</label>
+ </div>
-</table>
+ <p id="applyActionBlock" style="display:none" class="actionButtons">
+ <input id="applyAction" class="submit" type="submit" value="{'Apply action'|@translate}" name="submit"> <span id="applyOnDetails"></span>
+ <span id="applyActionLoading" style="display:none"><img src="themes/default/images/ajax-loader-small.gif"></span>
+ <span class="infos" style="display:none">&#x2714; {'Users modified'|translate}</span>
+ </p>
+ </div> {* #permitAction *}
</fieldset>
-<p>
- {'target'|@translate}
- <label><input type="radio" name="target" value="all"> {'all'|@translate}</label>
- <label><input type="radio" name="target" value="selection" checked="checked"> {'selection'|@translate}</label>
-</p>
+</form>
-<p>
- <input class="submit" type="submit" value="{'Submit'|@translate}" name="pref_submit">
- <input class="submit" type="reset" value="{'Reset'|@translate}" name="pref_reset">
-</p>
+{* Underscore Template Definition *}
+<script type="text/template" class="userDetails">
+<form>
+ <div class="userActions">
+<% if (!user.isGuest) { %>
+ <span class="changePasswordDone infos" style="display:none">&#x2714; {'Password updated'|translate}</span>
+ <span class="changePassword" style="display:none">{'New password'|translate} <input type="text"> <a href="#" class="buttonLike updatePassword"><img src="themes/default/images/ajax-loader-small.gif" style="margin-bottom:-1px;margin-left:1px;display:none;"><span class="text">{'Submit'|translate}</span></a> <a href="#" class="cancel">{'Cancel'|translate}</a></span>
+ <a class="icon-key changePasswordOpen" href="#">{'Change password'|translate}</a>
+ <br>
+<% } %>
-</form>
+ <a target="_blank" href="admin.php?page=user_perm&amp;user_id=<%- user.id %>" class="icon-lock">{'Permissions'|translate}</a>
+
+<% if (!user.isProtected) { %>
+ <br><span class="userDelete"><img class="loading" src="themes/default/images/ajax-loader-small.gif" style="display:none;"><a href="#" class="icon-trash" data-user_id="<%- user.id %>">{'Delete'|translate}</a></span>
+<% } %>
+
+ </div>
+
+ <span class="changeUsernameOpen"><strong class="username"><%- user.username %></strong>
+
+<% if (!user.isGuest) { %>
+ <a href="#" class="icon-pencil">{'Change username'|translate}</a></span>
+ <span class="changeUsername" style="display:none">
+ <input type="text"> <a href="#" class="buttonLike updateUsername"><img src="themes/default/images/ajax-loader-small.gif" style="margin-bottom:-1px;margin-left:1px;display:none;"><span class="text">{'Submit'|translate}</span></a> <a href="#" class="cancel">{'Cancel'|translate}</a>
+<% } %>
+
+ </span>
+
+ <div class="userStats"><%- user.registeredOn_string %><br><%- user.lastVisit_string %></div>
-<script type="text/javascript">// <![CDATA[{literal}
-jQuery("form:last").submit( function() {
- if ( jQuery("input[name=target][value=selection]:checked", this).length > 0 )
- if ( jQuery("input[name='selection[]']:checked", this).length == 0)
- {
- alert( {/literal}"{'Select at least one user'|@translate|escape:javascript}"{literal} );
- return false;
- }
- return true;
-}
-);{/literal}
-// ]]>
+ <div class="userPropertiesContainer">
+ <input type="hidden" name="user_id" value="<%- user.id %>">
+ <div class="userPropertiesSet">
+ <div class="userPropertiesSetTitle">{'Properties'|translate}</div>
+
+ <div class="userProperty"><strong>{'Email address'|translate}</strong>
+ <br>
+<% if (!user.isGuest) { %>
+ <input name="email" type="text" value="<%- user.email %>">
+<% } else { %>
+ {'N/A'|translate}
+<% } %>
+ </div>
+
+ <div class="userProperty"><strong>{'Status'|translate}</strong>
+ <br>
+<% if (!user.isProtected) { %>
+ <select name="status">
+ <% _.each( user.statusOptions, function( option ){ %>
+ <option value="<%- option.value%>" <% if (option.isSelected) { %>selected="selected"<% } %>><%- option.label %></option>
+ <% }); %>
+ </select>
+<% } else { %>
+ <%- user.statusLabel %>
+<% } %>
+ </div>
+
+ <div class="userProperty"><strong>{'Privacy level'|translate}</strong>
+ <br>
+ <select name="level">
+<% _.each( user.levelOptions, function( option ){ %>
+ <option value="<%- option.value%>" <% if (option.isSelected) { %>selected="selected"<% } %>><%- option.label %></option>
+<% }); %>
+ </select>
+ </div>
+
+ <div class="userProperty"><label><input type="checkbox" name="enabled_high"<% if (user.enabled_high == 'true') { %> checked="checked"<% } %>> <strong>{'High definition enabled'|translate}</strong></label></div>
+
+ <div class="userProperty"><strong>{'Groups'|translate}</strong><br>
+ <select multiple class="chzn-select" style="width:340px;" name="group_id[]">
+<% _.each( user.groupOptions, function( option ){ %>
+ <option value="<%- option.value%>" <% if (option.isSelected) { %>selected="selected"<% } %>><%- option.label %></option>
+<% }); %>
+ </select>
+ </div>
+ </div>
+
+ <div class="userPropertiesSet userPrefs">
+ <div class="userPropertiesSetTitle">{'Preferences'|translate}</div>
+
+ <div class="userProperty"><strong class="nb_image_page_infos"></strong>
+ <div class="nb_image_page"></div>
+ <input type="hidden" name="nb_image_page" value="<%- user.nb_image_page %>">
+ </div>
+
+ <div class="userProperty"><strong>{'Theme'|translate}</strong><br>
+ <select name="theme">
+<% _.each( user.themeOptions, function( option ){ %>
+ <option value="<%- option.value%>" <% if (option.isSelected) { %>selected="selected"<% } %>><%- option.label %></option>
+<% }); %>
+ </select>
+ </div>
+
+ <div class="userProperty"><strong>{'Language'|translate}</strong><br>
+ <select name="language">
+<% _.each( user.languageOptions, function( option ){ %>
+ <option value="<%- option.value%>" <% if (option.isSelected) { %>selected="selected"<% } %>><%- option.label %></option>
+<% }); %>
+ </select>
+ </div>
+
+ <div class="userProperty"><strong>{'Recent period'|translate}</strong> <span class="recent_period_infos"></span>
+ <div class="recent_period"></div>
+ <input type="hidden" name="recent_period" value="<%- user.recent_period %>">
+ </div>
+
+ <div class="userProperty"><label><input type="checkbox" name="expand"<% if (user.expand == 'true') { %> checked="checked"<% }%>> <strong>{'Expand all albums'|translate}</strong></label></div>
+
+ <div class="userProperty"><label><input type="checkbox" name="show_nb_comments"<% if (user.show_nb_comments == 'true') { %> checked="checked"<% }%>> <strong>{'Show number of comments'|translate}</strong></label></div>
+
+ <div class="userProperty"><label><input type="checkbox" name="show_nb_hits"<% if (user.show_nb_hits == 'true') { %> checked="checked"<% }%>> <strong>{'Show number of hits'|translate}</strong></label></div>
+
+ </div>
+
+ <div style="clear:both"></div>
+ </div> {* userPropertiesContainer *}
+
+ <span class="infos propertiesUpdateDone" style="display:none">&#x2714; <%- user.updateString %></span>
+
+ <input type="submit" value="{'Update user'|translate|escape:html}" style="display:none;" data-user_id="<%- user.id %>">
+ <img class="submitWait" src="themes/default/images/ajax-loader-small.gif" style="display:none">
+</form>
</script>
-
diff --git a/admin/themes/default/theme.css b/admin/themes/default/theme.css
index dd4a63385..654685563 100644
--- a/admin/themes/default/theme.css
+++ b/admin/themes/default/theme.css
@@ -1,4 +1,7 @@
/* content.css */
+[class*="icon-"]:before { text-decoration:none !important; }
+
+.showInfo { font-size:15px;cursor:pointer;line-height:15px; }
/* .Content is on every pages so it is common and it will no longer be a specific css */
.content h2 {margin: 0; padding: 5px 0.5em 5px 0.5em; text-align: right; font-size: 120%;}
@@ -24,6 +27,9 @@ ul.categoryActions { margin: 0 2px; width: auto; list-style-position:outside;
.content div.comment blockquote {
margin-right: 0.5em; overflow: visible; /*avoid a very strange margin behaviour (all browsers) */ }
+.commentFilterSelected {color:#666;text-decoration:underline;}
+.comment .pendingFlag {font-style:italic;color:red;}
+
/* not used but should be */
#thePopuphelpPage .content { margin: 1em; }
@@ -96,7 +102,7 @@ display:block; position:absolute; z-index:101; padding:8px 0 0 3px; color:white;
/* History tables */
TABLE.table2 {
border: 1px solid #111;
- margin: 1em auto;
+ margin: 0 auto;
padding: 0;
}
@@ -110,7 +116,6 @@ TABLE.table2 TR {
TABLE.table2 THEAD TD { padding:7px 10px 3px 10px; }
TABLE.table2 TR.throw { text-align: center; }
-TABLE.table2 { margin:0pt auto; }
.sort { display:block; padding:8px 5px 0px 1px; clear: right; float:left; }
@@ -301,19 +306,15 @@ float:left;
}
#pwgHead A {color:#ccc;}
-#pwgHead A:hover {color:#fff;border-bottom:1px solid #fff}
+#pwgHead A:hover {color:#fff}
#headActions {float:right; height:36px; line-height:36px; margin-right:10px;}
A {
- text-decoration:none;
- border-bottom: 0;
+ text-decoration: none;
}
A:hover {
- border-bottom: 1px solid #FF3363;
-}
-A.button, A.button:hover {
- border: 0;
+ text-decoration: underline;
}
IMG {
border: none;
@@ -468,9 +469,18 @@ FORM.properties SPAN.property {
padding: 0 0.5em 0 0;
}
-#mainConf, #historyConf, #commentsConf, #watermarkConf {border:none}
-
-#configContent label {
+#configContent fieldset {
+ border:none;
+ padding-left:20px;
+}
+#configContent fieldset:not(.no-border) {
+ border-top:1px solid #bbb;
+}
+#configContent legend {
+ padding-left:0;
+ margin-left:-20px;
+}
+#configContent label:not(.no-bold) {
font-weight: bold;
}
@@ -478,10 +488,6 @@ FORM.properties SPAN.property {
white-space:nowrap;
}
-#mainConf li {
- margin-bottom: 1em;
-}
-
#theHeader H1 {
margin-bottom: 0.5em;
}
@@ -494,9 +500,6 @@ UL.actions {
UL.actions LI {
display: inline;
}
-UL.actions A {
- border: none;
-}
UL.tagSelection {
width: 99%;
@@ -512,6 +515,15 @@ UL.tagSelection LI {
}
/* jQuery tooltips */
+.ui-tooltip {
+ padding: 8px;
+ position: absolute;
+ z-index: 9999;
+ max-width: 300px;
+ -webkit-box-shadow: 0 0 5px #aaa;
+ box-shadow: 0 0 5px #aaa;
+}
+
.cluetip-outer {
position: relative;
border: 1px solid #111111;
@@ -604,7 +616,7 @@ html, body {height:100%; margin:0; padding:0;}
}
#footer A {color:#ccc;}
-#footer A:hover {color:#fff;border-bottom:1px solid #fff;}
+#footer A:hover {color:#fff}
#adminHome {
text-align:center;
@@ -616,7 +628,7 @@ html, body {height:100%; margin:0; padding:0;}
}
#adminHome A {display:block; font-size:1.1em; font-weight:bold;}
-#adminHome A {border:none;}
+#adminHome A {text-decoration:none;}
#piwigoInfos {float:left; margin-left:140px;}
#pageInfos {float:right; margin-right:10px;}
@@ -744,6 +756,14 @@ html, body {height:100%; margin:0; padding:0;}
left: 0;
}
+#menubar dt [class^=icon-] {
+ font-size:120%;
+}
+
+#menubar dd [class^="icon-"]:before {
+ margin-right: 0.5em;
+}
+
.content {
padding:0 5px 0 0;
margin: 0 5px 0 227px;
@@ -757,10 +777,10 @@ html, body {height:100%; margin:0; padding:0;}
#thePopuphelpPage #pwgHead {display:none}
#thePopuphelpPage #footer {display:none}
-.themeBox {display:inline-table; text-align:center; height:192px; background-color:#eee; margin:5px; -moz-border-radius:5px; overflow:hidden; }
+.themeBox {display:inline-table; text-align:center; height:192px; background-color:#eee; margin:5px; border-radius:5px; overflow:hidden; }
.themeBox IMG {border:1px solid white; margin:0 15px;}
-.themeName {font-size:1.1em; margin:5px 0;}
+.themeName {font-size:1em; margin:5px 0; position:relative; }
.themeActions {display: table-row; font-size:12px; height: 43px; }
.themeActions DIV {display: table-cell; vertical-align: middle; line-height:18px; }
.themeActions A {}
@@ -816,7 +836,6 @@ h2:lang(en) { text-transform:capitalize; }
.infos .submit {margin-left:30px;}
.checkActions {text-align:left;padding:0;margin:0;}
-.comment A:hover {border:none;}
.pluginBoxes {
text-align:left;
@@ -851,8 +870,7 @@ h2:lang(en) { text-transform:capitalize; }
.pluginMiniBoxNameCell {font-size:1.05em; margin:5px 0;position:relative;}
.pluginActions {display: table-row; font-size:0.95em; color:#777;}
.pluginActions DIV {display: table-cell; vertical-align: middle; line-height:18px; }
-.showInfo {display:block;position:absolute;top:0;right:5px;width:15px;font-style:italic;font-family:"Georgia",serif;background-color:#464646;font-size:0.9em;border-radius:10px;-moz-border-radius:10px;}
-.showInfo:hover {cursor:pointer;border:none;}
+.pluginMiniBox .showInfo, .themeBox .showInfo { display:block;position:absolute;top:0;right:5px;width:15px; }
.warning:before {content:url(icon/warning.png);vertical-align:top;}
.deactivate_all {text-align:right;font-size:0.95em;}
@@ -864,7 +882,7 @@ h2:lang(en) { text-transform:capitalize; }
.languageActions {display: table-row; font-size:12px; }
.languageActions DIV {display: table-cell; vertical-align: middle; line-height:18px; }
-#ui-datepicker-div {-moz-border-radius:5px;}
+#ui-datepicker-div {-moz-border-radius:5px; border-radius:5px;}
#ui-datepicker-div .ui-icon-circle-triangle-w, #ui-datepicker-div .ui-icon-circle-triangle-e {color:transparent;}
#ui-datepicker-div A.ui-datepicker-prev, #ui-datepicker-div A.ui-datepicker-next {background-color:transparent;}
#ui-datepicker-div A.ui-datepicker-prev:hover, #ui-datepicker-div A.ui-datepicker-next:hover {-moz-border-radius:5px;}
@@ -878,7 +896,6 @@ h2:lang(en) { text-transform:capitalize; }
}
.HelpActions a { border:0; margin:0; }
-.HelpActions a:hover {border:0;}
.HelpActions li {list-style-image:none; list-style-position:outside; list-style-type:none; text-align:center; text-indent:0pt; }
legend {text-align:left;}
@@ -948,16 +965,14 @@ LEGEND {
#batchManagerGlobal #checkActions {text-align:left; margin:0 0 20px 0;}
#batchManagerGlobal ul.thumbnails div.actions {display:none;position:absolute;top:0;right:5px;color:#fff}
#batchManagerGlobal ul.thumbnails div.actions a {color:#fff;}
-#batchManagerGlobal ul.thumbnails div.actions a:hover {border-color:#fff;}
#batchManagerGlobal ul.thumbnails span.wrap1:hover div.actions {display:block;}
#batchManagerGlobal #selectedMessage {padding:5px; border-radius:5px;}
-#batchManagerGlobal #selectSet a {border-bottom:1px dotted;}
#batchManagerGlobal #applyOnDetails {font-style:italic;}
#batchManagerGlobal .actionButtons {text-align:left;}
#batchManagerGlobal #filterList {padding-left:5px;}
#batchManagerGlobal #filterList li {margin-bottom:5px; list-style-type:none;}
#batchManagerGlobal a.removeFilter {background: url(icon/remove_filter.png) no-repeat top left;width:7px;height:7px;display:inline-block;}
-#batchManagerGlobal a.removeFilter:hover {background: url(icon/remove_filter_hover.png); border:none;}
+#batchManagerGlobal a.removeFilter:hover {background: url(icon/remove_filter_hover.png);}
#batchManagerGlobal .removeFilter span {display:none}
#batchManagerGlobal #applyFilterBlock {margin-top:20px;}
#batchManagerGlobal .useFilterCheckbox {display:none;}
@@ -965,38 +980,21 @@ LEGEND {
#batchManagerGlobal #filter_dimension blockquote {margin:5px 0 20px 15px;}
#batchManagerGlobal #filter_dimension .ui-slider-horizontal {width:650px;margin:5px 0 10px 0;}
-
-/* TokenInput (with Facebook style) */
-ul.token-input-list {overflow: hidden; height: auto !important; height: 1%;width: 400px;border: 1px solid #8496ba;cursor: text;font-size: 12px;font-family: Verdana;min-height: 1px;z-index: 999;margin: 0;padding: 0;background-color: #fff;list-style-type: none;clear: left;}
-ul.token-input-list li input {border: 0;width: 100px;padding: 3px 8px;background-color: white;margin: 2px 0;-webkit-appearance: caret;}
-li.token-input-token {overflow: hidden; height: auto !important; height: 15px;margin: 3px;padding: 1px 3px;background-color: #eff2f7;color: #000;cursor: default;border: 1px solid #ccd5e4;font-size: 11px;border-radius: 5px;-moz-border-radius: 5px;-webkit-border-radius: 5px;float: left;white-space: nowrap;}
-li.token-input-token p {display: inline;padding: 0;margin: 0;}
-li.token-input-token span {color: #a6b3cf;margin-left: 5px;font-weight: bold;cursor: pointer;}
-li.token-input-selected-token {background-color: #5670a6;border: 1px solid #3b5998;color: #fff;}
-li.token-input-input-token {float: left;margin: 0;padding: 0;list-style-type: none;width:10px;}
-div.token-input-dropdown {position: absolute;width: 400px;background-color: #fff;overflow: hidden;border-left: 1px solid #ccc;border-right: 1px solid #ccc;border-bottom: 1px solid #ccc;cursor: default;font-size: 11px;font-family: Verdana;z-index: 1;}
-div.token-input-dropdown p {margin: 0;padding: 5px;font-weight: bold;color: #777;}
-div.token-input-dropdown ul {margin: 0;padding: 0;}
-div.token-input-dropdown ul li {background-color: #fff;padding: 3px;margin: 0;list-style-type: none;}
-div.token-input-dropdown ul li.token-input-dropdown-item {background-color: #fff;}
-div.token-input-dropdown ul li.token-input-dropdown-item2 {background-color: #fff;}
-div.token-input-dropdown ul li em {font-weight: bold;font-style: normal;}
-div.token-input-dropdown ul li.token-input-selected-dropdown-item {background-color: #3b5998;color: #fff;}
-
-#mainConf a.addFilter {font-weight:normal;margin-left:20px;}
-#mainConf a.removeFilter {font-weight:normal;}
-#mainConf span.property span.filter:first-child a.removeFilter {display:none;} /* can't delete the first field */
-#mainConf span.filter {display:block;margin-left:20px;}
-#mainConf .transparent {opacity:0.5;filter:alpha(opacity=50);}
-#mainConf .order_by_is_custom {display:block;font-weight:normal;font-style:italic;margin-left:20px;}
+#order_filters a.addFilter {font-weight:normal;margin-left:20px;}
+#order_filters a.removeFilter {font-weight:normal;}
+#order_filters span.property span.filter:first-child a.removeFilter {display:none;} /* can't delete the first field */
+#order_filters span.filter {display:block;margin-left:20px;}
+#order_filters .transparent {opacity:0.5;filter:alpha(opacity=50);}
+#order_filters .order_by_is_custom {display:block;font-weight:normal;font-style:italic;margin-left:20px;}
/* Upload Form */
#uploadBoxes .file {margin-bottom:5px;text-align:left;}
#uploadBoxes {margin-top:20px;}
#addUploadBox {margin-bottom:2em;}
+p.uploadInfo {text-align:left;font-size:90%;color:#999;}
p#uploadWarningsSummary {text-align:left;margin-bottom:1em;font-size:90%;color:#999;}
-p#uploadWarningsSummary .showInfo {position:static;display:inline;padding:1px 6px;margin-left:3px;}
+p#uploadWarningsSummary .showInfo {margin-left:3px;}
p#uploadWarnings {display:none;text-align:left;margin-bottom:1em;font-size:90%;color:#999;}
p#uploadModeInfos {text-align:left;margin-top:1em;font-size:90%;color:#999;}
@@ -1028,6 +1026,27 @@ p#uploadModeInfos {text-align:left;margin-top:1em;font-size:90%;color:#999;}
padding-left:10px;
}
+#albumLinks ul, .photoLinks ul {
+ padding-left:0;
+}
+
+#albumLinks li, .photoLinks li {
+ list-style:none;
+}
+
+.photoLinks {
+ vertical-align:top;
+}
+
+.photoLinks ul {
+ margin:0;
+}
+
+/* Album Manager */
+#addAlbumForm input[name="category_name"], #formCreateAlbum input[name="virtual_name"] {
+ width:300px;
+}
+
/* Pending Comments */
#pendingComments {
padding:0 5px 0 10px;
@@ -1041,9 +1060,12 @@ p#uploadModeInfos {text-align:left;margin-top:1em;font-size:90%;color:#999;}
text-align:left;
}
+.commentFilter {text-align:left;margin:5px 1em;}
+.commentFilter .navigationBar {float:right; margin:0;}
+
FORM#categoryOrdering p.albumTitle {margin:0;}
-FORM#categoryOrdering p.albumActions {visibility:hidden; margin:0}
-FORM#categoryOrdering .categoryLi:hover p.albumActions {visibility:visible;}
+FORM#categoryOrdering p.albumActions, FORM#categoryOrdering span.albumInfos {visibility:hidden; margin:0}
+FORM#categoryOrdering .categoryLi:hover p.albumActions, FORM#categoryOrdering .categoryLi:hover span.albumInfos {visibility:visible;}
.showCreateAlbum {text-align:left; margin:0 1em 1em 1em;line-height:22px;}
#autoOrder p, #createAlbum p {text-align:left; margin:0 0 1em 0;}
@@ -1097,6 +1119,55 @@ input[type="text"].dError {border-color:#ff7070; background-color:#FFe5e5;}
border-radius:10px;
-moz-border-radius:10px;
-webkit-border-radius:10px;
- -border-radius:10px;
margin-left:5px;
-} \ No newline at end of file
+}
+
+.groups {
+ text-align:center;
+}
+.groups li {
+ vertical-align: middle;
+ position: relative;
+ display: inline-block;
+ text-align: left;
+ height: 300px;
+ width: 250px;
+ margin: 5px;
+ border-radius: 5px;
+}
+.groups p {
+ text-align:left;
+}
+.groups label>p {
+ margin: 0;
+ border-radius: 5px 5px 0 0;
+ padding: 2px;
+ text-align: center;
+}
+
+.groups input {
+ float: right;
+}
+p.list_user {
+ text-align: left;
+ max-height: 200px;
+ overflow: auto;
+}
+a.group_perm {
+ position: absolute;
+ bottom: 5px;
+ right: 5px;
+}
+
+#userList .openUserDetails {visibility:hidden;}
+#userList tr:hover .openUserDetails {visibility:visible;}
+#userList .icon-cancel-circled {visibility:visible;}
+
+.userProperties {max-width:730px;}
+.userPropertiesContainer {border-top:1px solid #ddd;margin-top:1em;}
+.userPropertiesSet {width:350px;float:left;padding-top:5px}
+.userPropertiesSetTitle {font-weight:bold;margin-bottom:1em;}
+.userPrefs {border-left:1px solid #ddd;padding-left:10px;}
+.userProperty {width:340px;float:left;margin-bottom:15px;}
+.userActions {float:right;text-align:right;}
+
diff --git a/admin/themes/roma/index.php b/admin/themes/roma/index.php
index 41732f2fd..c8de97f60 100644
--- a/admin/themes/roma/index.php
+++ b/admin/themes/roma/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/admin/themes/roma/theme.css b/admin/themes/roma/theme.css
index 6622fdd2b..a25965380 100644
--- a/admin/themes/roma/theme.css
+++ b/admin/themes/roma/theme.css
@@ -22,9 +22,10 @@ body, h3, dt, .throw, .content, label, LEGEND {
INPUT, select, textarea { color:#999; background-color: #444; }
option[disabled] { background-color: #999; color: #444; }
input[type="radio"], input[type="checkbox"] { background-color: transparent; }
-/* INPUT[type="checkbox"], INPUT[type="radio"]
-{ color:#999; background-color: #eee; } */
-INPUT[type="submit"], INPUT[type="reset"] { color:#999; border: 1px solid #666; background-color: #444; padding: 1px 15px; }
+
+
+.showInfo { color:#666; }
+.showInfo:hover { color:#999; }
h2 { color: #ccc; }
@@ -44,17 +45,14 @@ body {
/* #the_page { margin: 0; padding: 0; z-index: 1; top:0px; */
/* padding-top: 0; min-height: 100%; width:100%; position:absolute; left:0px; } */
-#headbranch { width: 233px; height: 240px; margin: 0; padding: 0;
-position:absolute; left:0px; top:0px; z-index: 0;
-}
h3, .row2, .content { background-color: #222; }
.throw, .row1 { background-color:#111; }
.throw em { font-style: normal; color: #ff3363; }
-#content { min-height: 466px; margin-top: 15px; }
-
-.content {
- border: 1px solid #222;
+#content {
+ border: 1px solid #222;
+ min-height: 466px;
+ margin-top: 15px;
}
.content h3 { font-size:20px; letter-spacing:-0.4px; margin:0 20px 12px 0; text-align:center; background:none; border: 0; }
@@ -73,7 +71,10 @@ UL.thumbnails span.wrap2 {
background-image: url(images/fillet.png); background-repeat: repeat-x; }
/* borders */
fieldset { border: 2px solid #333; }
-INPUT, SELECT, TEXTAREA { border: 1px solid #666; }
+
+.buttonLike, INPUT, SELECT, TEXTAREA {
+ border: 1px solid #666;
+}
input:focus, select:focus, textarea:focus {
background-color: #444;
color: #999;
@@ -106,8 +107,8 @@ a.Piwigo:hover span.Piwigo {
*, *:focus, *:active, input:active, a:active, input:focus, a:focus { outline: none; -moz-outline-width: 0px; }
*/
-a { color:#f70; border-width: 0; }
-a:hover, a:active { color: #f33; border-bottom: 1px solid #FF3363; cursor: pointer; }
+a { color:#f70; }
+a:hover, a:active { color: #f33; cursor: pointer; }
.content .navigationBar {color:#666;}
ul.actions, .content form#waiting {text-align:center;}
@@ -134,7 +135,7 @@ text-align:right; text-decoration:none; margin: 0; }
margin-top:4px; padding-bottom:3px; padding-top:3px; top:1px;
}
.tabsheet a:hover, .tabsheet li.selected_tab a { color: #F36; }
-.tabsheet a span { background-color:#222; display:block; font-size:10px; margin-right:2px; padding:0 3px 0 1px; }
+.tabsheet a span { background-color:#222; font-size:10px; margin-right:2px; padding:0 3px 0 1px; }
/* menubar is on all admin pages => No specific css file */
#menubar {
background:transparent url(images/menuBoxBottom_new.png) no-repeat scroll left bottom;
@@ -151,17 +152,28 @@ width: 207px; border:0; margin: 0; padding: 0; display: block; min-height:35px;
#menubar dl.first {
background:transparent url(images/menubar-top.png) no-repeat scroll left 1px; }
#menubar dl.last { padding: 0 0 24px 0;}
-#menubar dt { margin: 0; display: block; background: none; left:10px; font-weight:bold;
-position:relative; padding: 5px 1px 4px 5px; top:-8px; font-size: 13px; color: #666; outline:none;}
-#menubar dt span { background-color: #111; cursor:pointer; }
-#menubar li { margin: 0 0 0 6px; }
+#menubar dt {
+ margin: 0; display: block; background: none; left:10px; font-weight:bold;
+ position:relative; padding: 5px 1px 4px 5px; top:-8px; font-size: 13px; color: #666; outline:none;
+ cursor:pointer;
+}
+#menubar dt span { background-color: #111; }
+#menubar li { margin: 0 0 0 12px; }
#menubar li.external { list-style-image:url(images/external_inactive.png); padding:10px 0px 0pt 10px; }
#menubar li.external:hover { list-style-image:url(images/external_active.png); }
#menubar ul { color: #333; margin:0 9px 0 9px; line-height: 16px;
- list-style-type: square; list-style-position: inside; padding: 0; }
+ list-style-type: none; list-style-position: inside; padding: 0; }
#menubar ul.scroll { overflow-y:auto; max-height:500px;}
+#menubar dd [class^="icon-"]:before {
+ color: #666;
+}
+
/* jQuery tooltips */
+.ui-tooltip {
+ color: #eee;
+ background-color: #000;
+}
.cluetip-outer { border-color: #666; color: #666; background-color: #222; }
.cluetip-title { color: #ff3363; background-color: #111; }
/* jQuery ui resizable */
@@ -194,6 +206,7 @@ body .ui-resizable-autohide .ui-resizable-handle { display: none; } /* use 'body
}
.ui-datepicker th {color:#ccc;}
.ui-state-disabled {color:#aaa;}
+.ui-timepicker-div, .ui-timepicker-div dt {color:#ccc;}
.ui-slider { background:#444;border-radius:2px;border:1px solid #666; }
.ui-slider .ui-slider-handle { border:1px solid #f36;background:#222;border-radius:0.6em; }
@@ -211,10 +224,20 @@ body .ui-resizable-autohide .ui-resizable-handle { display: none; } /* use 'body
#ui-datepicker-div .ui-datepicker-current-day { background-color: #111 !important; border-color: #444; border-top-color: #111; border-left-color: #111;}
#ui-datepicker-div .ui-datepicker-days-cell { background-color:#444; border:1px solid #222; border-top-color: #444; border-left-color: #444;}
INPUT[type="text"].large { width: 317px; }
-input[type="button"], input[type="submit"], input[type="reset"] {
-color:#ff3363; background-color:#222; border-color: #ff3363; }
-input[type="button"]:hover, input[type="submit"]:hover, input[type="reset"]:hover {
-color:#999; border-color: #666; }
+
+.buttonLike, input[type="button"], input[type="submit"], input[type="reset"] {
+ color:#ff3363;
+ background-color:#222;
+ border-color: #ff3363;
+ padding: 1px 15px;
+}
+
+.buttonLike:hover, input[type="button"]:hover, input[type="submit"]:hover, input[type="reset"]:hover {
+ color:#999;
+ border-color: #666;
+ text-decoration: none;
+}
+
.bigbutton { background:transparent url(images/quickLocalSync_inactiv.png) no-repeat scroll left top; display: block;
color:#111; font-size:28px; height:161px; margin: 0 20px 0 auto; padding:0 18px 0; text-align:center; width:625px;
position:relative; z-index: 50;}
@@ -247,7 +270,7 @@ color:transparent;}
#pwgHead, #footer {background-color:#222;}
#footer {background-image: url(images/piwigo_logo_small.png);}
-.pluginBox, .pluginMiniBox {background-color:#333;color:#999;border-color:#333;}
+.pluginBox, .pluginMiniBox, .groups li {background-color:#333;color:#999;border-color:#333;}
.pluginBoxNameCell, .pluginMiniBoxNameCell {color:#ddd;}
.pluginBox.incompatible, .pluginMiniBox.incompatible {border-color:#800 !important;}
.pluginBoxes .merged, .pluginBoxes .missing {background-color:#422;border:1px solid #800;}
@@ -259,12 +282,12 @@ color:transparent;}
#batchManagerGlobal #selectedMessage {background-color:#555; color:#ddd;}
/* TokenInput (with Facebook style for ROMA) */
-ul.token-input-list {border-color:#666;background-color:#444;}
-ul.token-input-list li input {background-color:#444;}
-li.token-input-token span {color:#878787;}
-div.token-input-dropdown {background-color:#eee;border-color:#666;}
-div.token-input-dropdown ul li {background-color:#eee;}
-div.token-input-dropdown ul li.token-input-selected-dropdown-item {background-color:#FF7800;}
+ul.token-input-list {border-color:#666 !important;background-color:#444 !important;}
+ul.token-input-list li input {background-color:#444 !important;}
+li.token-input-token span {color:#878787 !important;}
+div.token-input-dropdown {background-color:#eee !important;border-color:#666 !important;}
+div.token-input-dropdown ul li {background-color:#eee !important;}
+div.token-input-dropdown ul li.token-input-selected-dropdown-item {background-color:#FF7800 !important;}
#progressbar {border:1px solid #666; background-color:#666;}
@@ -274,3 +297,44 @@ div.token-input-dropdown ul li.token-input-selected-dropdown-item {background-co
}
.selectedComment {background-color:#555; color:#fff;}
+
+.groups label>p {
+ color: #ccc;
+ font-size: 1.2em;
+ background-color:#111;
+}
+label>p.group_select {
+ color: #fff;
+ background-color:#555;
+}
+
+.userSeparator {
+ color:#666;
+}
+
+#configContent fieldset:not(.no-border) {
+ border-top-color:#444;
+}
+
+table.dataTable tr.even {
+ background-color: #111 !important;
+}
+
+table.dataTable tr.even td.sorting_1 {
+ background-color: #181818 !important;
+}
+
+table.dataTable tr.odd {
+ background-color: #222 !important;
+}
+
+table.dataTable tr.odd td.sorting_1 {
+ background-color: #282828 !important;
+}
+
+table.dataTable thead th {
+ border-color: #333 !important;
+}
+
+.userPropertiesContainer {border-color:#333;}
+.userPrefs {border-color:#333;}
diff --git a/admin/themes_installed.php b/admin/themes_installed.php
index c1dcdaf52..d699956ae 100644
--- a/admin/themes_installed.php
+++ b/admin/themes_installed.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -62,11 +62,10 @@ $db_themes = $themes->get_db_themes();
$db_theme_ids = array();
foreach ($db_themes as $db_theme)
{
- array_push($db_theme_ids, $db_theme['id']);
+ $db_theme_ids[] = $db_theme['id'];
}
-$active_themes = array();
-$inactive_themes = array();
+$tpl_themes = array();
foreach ($themes->fs_themes as $theme_id => $fs_theme)
{
@@ -74,47 +73,56 @@ foreach ($themes->fs_themes as $theme_id => $fs_theme)
{
continue;
}
+
+ $tpl_theme = array(
+ 'ID' => $theme_id,
+ 'NAME' => $fs_theme['name'],
+ 'VISIT_URL' => $fs_theme['uri'],
+ 'VERSION' => $fs_theme['version'],
+ 'DESC' => $fs_theme['description'],
+ 'AUTHOR' => $fs_theme['author'],
+ 'AUTHOR_URL' => @$fs_theme['author uri'],
+ 'PARENT' => @$fs_theme['parent'],
+ 'SCREENSHOT' => $fs_theme['screenshot'],
+ 'IS_MOBILE' => $fs_theme['mobile'],
+ 'ADMIN_URI' => @$fs_theme['admin_uri'],
+ );
if (in_array($theme_id, $db_theme_ids))
{
- $fs_theme['deactivable'] = true;
+ $tpl_theme['STATE'] = 'active';
+ $tpl_theme['DEACTIVABLE'] = true;
if (count($db_theme_ids) <= 1)
{
- $fs_theme['deactivable'] = false;
- $fs_theme['deactivate_tooltip'] = l10n('Impossible to deactivate this theme, you need at least one theme.');
- }
-
- if ($theme_id == $default_theme)
- {
- $fs_theme['is_default'] = true;
- array_unshift($active_themes, $fs_theme);
- }
- else
- {
- $fs_theme['is_default'] = false;
- array_push($active_themes, $fs_theme);
+ $tpl_theme['DEACTIVABLE'] = false;
+ $tpl_theme['DEACTIVATE_TOOLTIP'] = l10n('Impossible to deactivate this theme, you need at least one theme.');
}
+
+ $tpl_theme['IS_DEFAULT'] = ($theme_id == $default_theme);
}
else
{
+ $tpl_theme['STATE'] = 'inactive';
+
// is the theme "activable" ?
if (isset($fs_theme['activable']) and !$fs_theme['activable'])
{
- $fs_theme['activate_tooltip'] = l10n('This theme was not designed to be directly activated');
+ $tpl_theme['ACTIVABLE'] = false;
+ $tpl_theme['ACTIVABLE_TOOLTIP'] = l10n('This theme was not designed to be directly activated');
}
else
{
- $fs_theme['activable'] = true;
+ $tpl_theme['ACTIVABLE'] = true;
}
$missing_parent = $themes->missing_parent_theme($theme_id);
if (isset($missing_parent))
{
- $fs_theme['activable'] = false;
+ $tpl_theme['ACTIVABLE'] = false;
- $fs_theme['activate_tooltip'] = sprintf(
- l10n('Impossible to activate this theme, the parent theme is missing: %s'),
+ $tpl_theme['ACTIVABLE_TOOLTIP'] = l10n(
+ 'Impossible to activate this theme, the parent theme is missing: %s',
$missing_parent
);
}
@@ -122,21 +130,36 @@ foreach ($themes->fs_themes as $theme_id => $fs_theme)
// is the theme "deletable" ?
$children = $themes->get_children_themes($theme_id);
- $fs_theme['deletable'] = true;
+ $tpl_theme['DELETABLE'] = true;
if (count($children) > 0)
{
- $fs_theme['deletable'] = false;
+ $tpl_theme['DELETABLE'] = false;
- $fs_theme['delete_tooltip'] = sprintf(
- l10n('Impossible to delete this theme. Other themes depends on it: %s'),
+ $tpl_theme['DELETE_TOOLTIP'] = l10n(
+ 'Impossible to delete this theme. Other themes depends on it: %s',
implode(', ', $children)
);
}
-
- array_push($inactive_themes, $fs_theme);
}
+
+ $tpl_themes[] = $tpl_theme;
+}
+
+// sort themes by state then by name
+function cmp($a, $b)
+{
+ $s = array('active' => 0, 'inactive' => 1);
+
+ if (@$a['IS_DEFAULT']) return -1;
+ if (@$b['IS_DEFAULT']) return 1;
+
+ if($a['STATE'] == $b['STATE'])
+ return strcasecmp($a['NAME'], $b['NAME']);
+ else
+ return $s[$a['STATE']] >= $s[$b['STATE']];
}
+usort($tpl_themes, 'cmp');
$template->assign(
array(
@@ -145,8 +168,7 @@ $template->assign(
'set_default_baseurl' => $base_url.'&amp;action=set_default&amp;theme=',
'delete_baseurl' => $base_url.'&amp;action=delete&amp;theme=',
- 'active_themes' => $active_themes,
- 'inactive_themes' => $inactive_themes,
+ 'tpl_themes' => $tpl_themes,
)
);
diff --git a/admin/themes_new.php b/admin/themes_new.php
index 406b24587..803327e8d 100644
--- a/admin/themes_new.php
+++ b/admin/themes_new.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -39,13 +39,7 @@ $themes = new themes();
$themes_dir = PHPWG_ROOT_PATH.'themes';
if (!is_writable($themes_dir))
{
- array_push(
- $page['errors'],
- sprintf(
- l10n('Add write access to the "%s" directory'),
- 'themes'
- )
- );
+ $page['errors'][] = l10n('Add write access to the "%s" directory', 'themes');
}
// +-----------------------------------------------------------------------+
@@ -56,7 +50,7 @@ if (isset($_GET['revision']) and isset($_GET['extension']))
{
if (!is_webmaster())
{
- array_push($page['errors'], l10n('Webmaster status is required.'));
+ $page['errors'][] = l10n('Webmaster status is required.');
}
else
{
@@ -81,28 +75,25 @@ if (isset($_GET['installstatus']))
switch ($_GET['installstatus'])
{
case 'ok':
- array_push(
- $page['infos'],
- l10n('Theme has been successfully installed')
- );
+ $page['infos'][] = l10n('Theme has been successfully installed');
break;
case 'temp_path_error':
- array_push($page['errors'], l10n('Can\'t create temporary file.'));
+ $page['errors'][] = l10n('Can\'t create temporary file.');
break;
case 'dl_archive_error':
- array_push($page['errors'], l10n('Can\'t download archive.'));
+ $page['errors'][] = l10n('Can\'t download archive.');
break;
case 'archive_error':
- array_push($page['errors'], l10n('Can\'t read or extract archive.'));
+ $page['errors'][] = l10n('Can\'t read or extract archive.');
break;
default:
- array_push(
- $page['errors'],
- sprintf(l10n('An error occured during extraction (%s).'), htmlspecialchars($_GET['installstatus']))
+ $page['errors'][] = l10n(
+ 'An error occured during extraction (%s).',
+ htmlspecialchars($_GET['installstatus'])
);
}
}
@@ -136,7 +127,7 @@ if ($themes->get_server_themes(true)) // only new themes
}
else
{
- array_push($page['errors'], l10n('Can\'t connect to server.'));
+ $page['errors'][] = l10n('Can\'t connect to server.');
}
$template->assign('default_screenshot',
diff --git a/admin/updates.php b/admin/updates.php
index bb0337d47..bfd6b6a1f 100644
--- a/admin/updates.php
+++ b/admin/updates.php
@@ -2,7 +2,9 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2010 Pierrick LE GALL http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
// | 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 |
diff --git a/admin/updates_ext.php b/admin/updates_ext.php
index fcbd729ca..3d1467fad 100644
--- a/admin/updates_ext.php
+++ b/admin/updates_ext.php
@@ -2,7 +2,9 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2010 Pierrick LE GALL http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
// | 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 |
@@ -32,8 +34,8 @@ $autoupdate = new updates($page['page']);
$show_reset = false;
if (!$autoupdate->get_server_extensions())
{
- array_push($page['errors'], l10n('Can\'t connect to server.'));
- return;
+ $page['errors'][] = l10n('Can\'t connect to server.');
+ return; // TODO: remove this return and add a proper "page killer"
}
foreach ($autoupdate->types as $type)
diff --git a/admin/updates_pwg.php b/admin/updates_pwg.php
index 016deeecd..4619ad3bd 100644
--- a/admin/updates_pwg.php
+++ b/admin/updates_pwg.php
@@ -2,7 +2,9 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2010 Pierrick LE GALL http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
// | 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 |
@@ -149,7 +151,7 @@ if ($step == 3 and is_webmaster())
if (!is_webmaster())
{
- array_push($page['errors'], l10n('Webmaster status is required.'));
+ $page['errors'][] = l10n('Webmaster status is required.');
}
$template->assign(array(
diff --git a/admin/user_list.php b/admin/user_list.php
index 900f43756..cda20a002 100644
--- a/admin/user_list.php
+++ b/admin/user_list.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -26,505 +26,23 @@
*/
// +-----------------------------------------------------------------------+
-// | functions |
+// | tabs |
// +-----------------------------------------------------------------------+
-/**
- * returns a list of users depending on page filters (in $_GET)
- *
- * Each user comes with his related informations : id, username, mail
- * address, list of groups.
- *
- * @return array
- */
-function get_filtered_user_list()
-{
- global $conf, $page;
-
- $users = array();
-
- // filter
- $filter = array();
-
- if (isset($_GET['username']) and !empty($_GET['username']))
- {
- $username = str_replace('*', '%', $_GET['username']);
- $filter['username'] = pwg_db_real_escape_string($username);
- }
-
- if (isset($_GET['group'])
- and -1 != $_GET['group']
- and is_numeric($_GET['group']))
- {
- $filter['group'] = $_GET['group'];
- }
-
- if (isset($_GET['status'])
- and in_array($_GET['status'], get_enums(USER_INFOS_TABLE, 'status')))
- {
- $filter['status'] = $_GET['status'];
- }
-
- // how to order the list?
- $order_by = 'id';
- if (isset($_GET['order_by'])
- and in_array($_GET['order_by'], array_keys($page['order_by_items'])))
- {
- $order_by = $_GET['order_by'];
- }
-
- $direction = 'ASC';
- if (isset($_GET['direction'])
- and in_array($_GET['direction'], array_keys($page['direction_items'])))
- {
- $direction = strtoupper($_GET['direction']);
- }
-
- // search users depending on filters and order
- $query = '
-SELECT DISTINCT u.'.$conf['user_fields']['id'].' AS id,
- u.'.$conf['user_fields']['username'].' AS username,
- u.'.$conf['user_fields']['email'].' AS email,
- ui.status,
- ui.enabled_high,
- ui.level
- FROM '.USERS_TABLE.' AS u
- INNER JOIN '.USER_INFOS_TABLE.' AS ui
- ON u.'.$conf['user_fields']['id'].' = ui.user_id
- LEFT JOIN '.USER_GROUP_TABLE.' AS ug
- ON u.'.$conf['user_fields']['id'].' = ug.user_id
- WHERE u.'.$conf['user_fields']['id'].' > 0';
- if (isset($filter['username']))
- {
- $query.= '
- AND u.'.$conf['user_fields']['username'].' LIKE \''.$filter['username'].'\'';
- }
- if (isset($filter['group']))
- {
- $query.= '
- AND ug.group_id = '.$filter['group'];
- }
- if (isset($filter['status']))
- {
- $query.= '
- AND ui.status = \''.$filter['status']."'";
- }
- $query.= '
- ORDER BY '.$order_by.' '.$direction.'
-;';
-
- $result = pwg_query($query);
- while ($row = pwg_db_fetch_assoc($result))
- {
- $user = $row;
- $user['groups'] = array();
-
- array_push($users, $user);
- }
-
- // add group lists
- $user_ids = array();
- foreach ($users as $i => $user)
- {
- $user_ids[$i] = $user['id'];
- }
- $user_nums = array_flip($user_ids);
-
- if (count($user_ids) > 0)
- {
- $query = '
-SELECT user_id, group_id
- FROM '.USER_GROUP_TABLE.'
- WHERE user_id IN ('.implode(',', $user_ids).')
-;';
- $result = pwg_query($query);
- while ($row = pwg_db_fetch_assoc($result))
- {
- array_push(
- $users[$user_nums[$row['user_id']]]['groups'],
- $row['group_id']
- );
- }
- }
-
- return $users;
-}
-
-// +-----------------------------------------------------------------------+
-// | initialization |
-// +-----------------------------------------------------------------------+
-
-if (!defined('PHPWG_ROOT_PATH'))
-{
- die('Hacking attempt!');
-}
-
-include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
-
-// +-----------------------------------------------------------------------+
-// | Check Access and exit when user status is not ok |
-// +-----------------------------------------------------------------------+
-check_status(ACCESS_ADMINISTRATOR);
-
-$page['order_by_items'] = array(
- 'id' => l10n('registration date'),
- 'username' => l10n('Username'),
- 'level' => l10n('Privacy level'),
- 'Language' => l10n('Language'),
- 'email' => l10n('Email address'),
- );
-
-$page['direction_items'] = array(
- 'asc' => l10n('ascending'),
- 'desc' => l10n('descending')
- );
-
-// +-----------------------------------------------------------------------+
-// | add a user |
-// +-----------------------------------------------------------------------+
-
-// Check for config_default var - If True : Using double password type else single password type
-// This feature is discussed on Piwigo's english forum
-if ($conf['double_password_type_in_admin'] == true)
-{
- if (isset($_POST['submit_add']))
- {
- if(empty($_POST['password']))
- {
- array_push($page['errors'], l10n('Password is missing. Please enter the password.'));
- }
- else if(empty($_POST['password_conf']))
- {
- array_push($page['errors'], l10n('Password confirmation is missing. Please confirm the chosen password.'));
- }
- else if(empty($_POST['email']))
- {
- array_push($page['errors'], l10n('Email address is missing. Please specify an email address.'));
- }
- else if ($_POST['password'] != $_POST['password_conf'])
- {
- array_push($page['errors'], l10n('The passwords do not match'));
- }
- else
- {
- $page['errors'] = register_user(
- $_POST['login'], $_POST['password'], $_POST['email'], false);
-
- if (count($page['errors']) == 0)
- {
- array_push(
- $page['infos'],
- sprintf(
- l10n('user "%s" added'),
- $_POST['login']
- )
- );
- }
- }
- }
-}
-else if ($conf['double_password_type_in_admin'] == false)
-{
- if (isset($_POST['submit_add']))
- {
- $page['errors'] = register_user(
- $_POST['login'], $_POST['password'], $_POST['email'], false);
-
- if (count($page['errors']) == 0)
- {
- array_push(
- $page['infos'],
- sprintf(
- l10n('user "%s" added'),
- stripslashes($_POST['login'])
- )
- );
- }
- }
-}
-
-// email notification
-if (
- isset($_POST['submit_add'])
- and count($page['errors']) == 0
- and !empty($_POST['email'])
- and isset($_POST['send_password_by_mail'])
- )
-{
- include_once(PHPWG_ROOT_PATH.'include/functions_mail.inc.php');
-
- $keyargs_content = array(
- get_l10n_args('Hello %s,', $_POST['login']),
- get_l10n_args('Thank you for registering at %s!', $conf['gallery_title']),
- get_l10n_args('', ''),
- get_l10n_args('Here are your connection settings', ''),
- get_l10n_args('Username: %s', $_POST['login']),
- get_l10n_args('Password: %s', $_POST['password']),
- get_l10n_args('Email: %s', $_POST['email']),
- get_l10n_args('', ''),
- get_l10n_args('If you think you\'ve received this email in error, please contact us at %s', get_webmaster_mail_address()),
- );
-
- pwg_mail(
- $_POST['email'],
- array(
- 'subject' => '['.$conf['gallery_title'].'] '.l10n('Registration'),
- 'content' => l10n_args($keyargs_content),
- 'content_format' => 'text/plain',
- )
- );
-}
-
-// +-----------------------------------------------------------------------+
-// | user list |
-// +-----------------------------------------------------------------------+
-
-$page['filtered_users'] = get_filtered_user_list();
-
-// +-----------------------------------------------------------------------+
-// | selected users |
-// +-----------------------------------------------------------------------+
-
-if (isset($_POST['delete']) or isset($_POST['pref_submit']))
-{
- $collection = array();
-
- switch ($_POST['target'])
- {
- case 'all' :
- {
- foreach($page['filtered_users'] as $local_user)
- {
- array_push($collection, $local_user['id']);
- }
- break;
- }
- case 'selection' :
- {
- if (isset($_POST['selection']))
- {
- $collection = $_POST['selection'];
- }
- break;
- }
- }
-
- if (count($collection) == 0)
- {
- array_push($page['errors'], l10n('Select at least one user'));
- }
-}
-
-// +-----------------------------------------------------------------------+
-// | delete users |
-// +-----------------------------------------------------------------------+
-if (isset($_POST['delete']) and count($collection) > 0)
-{
- if (in_array($conf['guest_id'], $collection))
- {
- array_push($page['errors'], l10n('Guest cannot be deleted'));
- }
- if (($conf['guest_id'] != $conf['default_user_id']) and
- in_array($conf['default_user_id'], $collection))
- {
- array_push($page['errors'], l10n('Default user cannot be deleted'));
- }
- if (in_array($conf['webmaster_id'], $collection))
- {
- array_push($page['errors'], l10n('Webmaster cannot be deleted'));
- }
- if (in_array($user['id'], $collection))
- {
- array_push($page['errors'], l10n('You cannot delete your account'));
- }
+include_once(PHPWG_ROOT_PATH.'admin/include/tabsheet.class.php');
- if (count($page['errors']) == 0)
- {
- if (isset($_POST['confirm_deletion']) and 1 == $_POST['confirm_deletion'])
- {
- foreach ($collection as $user_id)
- {
- delete_user($user_id);
- }
- array_push(
- $page['infos'],
- l10n_dec(
- '%d user deleted', '%d users deleted',
- count($collection)
- )
- );
- foreach ($page['filtered_users'] as $filter_key => $filter_user)
- {
- if (in_array($filter_user['id'], $collection))
- {
- unset($page['filtered_users'][$filter_key]);
- }
- }
- }
- else
- {
- array_push($page['errors'], l10n('You need to confirm deletion'));
- }
- }
-}
+$my_base_url = get_root_url().'admin.php?page=';
-// +-----------------------------------------------------------------------+
-// | preferences form submission |
-// +-----------------------------------------------------------------------+
-
-if (isset($_POST['pref_submit']) and count($collection) > 0)
-{
- if (-1 != $_POST['associate'])
- {
- $datas = array();
-
- $query = '
-SELECT user_id
- FROM '.USER_GROUP_TABLE.'
- WHERE group_id = '.$_POST['associate'].'
-;';
- $associated = array_from_query($query, 'user_id');
-
- $associable = array_diff($collection, $associated);
-
- if (count($associable) > 0)
- {
- foreach ($associable as $item)
- {
- array_push($datas,
- array('group_id'=>$_POST['associate'],
- 'user_id'=>$item));
- }
-
- mass_inserts(USER_GROUP_TABLE,
- array('group_id', 'user_id'),
- $datas);
- }
- }
-
- if (-1 != $_POST['dissociate'])
- {
- $query = '
-DELETE FROM '.USER_GROUP_TABLE.'
- WHERE group_id = '.$_POST['dissociate'].'
- AND user_id IN ('.implode(',', $collection).')
-';
- pwg_query($query);
- }
-
- // properties to set for the collection (a user list)
- $datas = array();
- $dbfields = array('primary' => array('user_id'), 'update' => array());
-
- $formfields = array(
- 'nb_image_page', 'theme', 'language',
- 'recent_period', 'expand', 'show_nb_hits',
- 'status', 'enabled_high', 'level'
- );
-
- $true_false_fields = array('expand', 'show_nb_hits', 'enabled_high');
-
- if ($conf['activate_comments'])
- {
- array_push($formfields, 'show_nb_comments');
- array_push($true_false_fields, 'show_nb_comments');
- }
-
- foreach ($formfields as $formfield)
- {
- // special for true/false fields
- if (in_array($formfield, $true_false_fields))
- {
- $test = $formfield;
- }
- else
- {
- $test = $formfield.'_action';
- }
-
- if ($_POST[$test] != 'leave')
- {
- array_push($dbfields['update'], $formfield);
- }
- }
-
- // updating elements is useful only if needed...
- if (count($dbfields['update']) > 0)
- {
- $datas = array();
-
- foreach ($collection as $user_id)
- {
- $data = array();
- $data['user_id'] = $user_id;
-
- // TODO : verify if submited values are semanticaly correct
- foreach ($dbfields['update'] as $dbfield)
- {
- // if the action is 'unset', the key won't be in row and
- // mass_updates function will set this field to NULL
- if (in_array($dbfield, $true_false_fields)
- or 'set' == $_POST[$dbfield.'_action'])
- {
- $data[$dbfield] = $_POST[$dbfield];
- }
- }
-
- // if the status is getting greater or equal to "admin", then level
- // automatically switches to "admin" (8), unless the level is also
- // defined in the same batch action.
- if (isset($data['status']) and in_array($data['status'], array('webmaster', 'admin')))
- {
- if (!isset($data['level']))
- {
- $data['level'] = 8;
- if (!in_array('level', $dbfields['update']))
- {
- array_push($dbfields['update'], 'level');
- }
- }
- }
-
- // special users checks
- if
- (
- ($conf['webmaster_id'] == $user_id) or
- ($conf['guest_id'] == $user_id) or
- ($conf['default_user_id'] == $user_id)
- )
- {
- // status must not be changed
- if (isset($data['status']))
- {
- if ($conf['webmaster_id'] == $user_id)
- {
- $data['status'] = 'webmaster';
- }
- else
- {
- $data['status'] = 'guest';
- }
- }
- }
-
- array_push($datas, $data);
- }
-
- mass_updates(USER_INFOS_TABLE, $dbfields, $datas);
- }
-
- redirect(
- get_root_url().
- 'admin.php'.
- get_query_string_diff(array(), false)
- );
-}
+$tabsheet = new tabsheet();
+$tabsheet->set_id('users');
+$tabsheet->select('user_list');
+$tabsheet->assign();
// +-----------------------------------------------------------------------+
// | groups list |
// +-----------------------------------------------------------------------+
-$groups[-1] = '------------';
+$groups = array();
$query = '
SELECT id, name
@@ -539,89 +57,62 @@ while ($row = pwg_db_fetch_assoc($result))
}
// +-----------------------------------------------------------------------+
-// | template init |
+// | template |
// +-----------------------------------------------------------------------+
$template->set_filenames(array('user_list'=>'user_list.tpl'));
-$base_url = PHPWG_ROOT_PATH.'admin.php?page=user_list';
+$query = '
+SELECT
+ DISTINCT u.'.$conf['user_fields']['id'].' AS id,
+ u.'.$conf['user_fields']['username'].' AS username,
+ u.'.$conf['user_fields']['email'].' AS email,
+ ui.status,
+ ui.enabled_high,
+ ui.level
+ FROM '.USERS_TABLE.' AS u
+ INNER JOIN '.USER_INFOS_TABLE.' AS ui ON u.'.$conf['user_fields']['id'].' = ui.user_id
+ WHERE u.'.$conf['user_fields']['id'].' > 0
+;';
-if (isset($_GET['start']) and is_numeric($_GET['start']))
-{
- $start = $_GET['start'];
-}
-else
+$result = pwg_query($query);
+while ($row = pwg_db_fetch_assoc($result))
{
- $start = 0;
+ $users[] = $row;
+ $user_ids[] = $row['id'];
}
$template->assign(
array(
- 'U_HELP' => get_root_url().'admin/popuphelp.php?page=user_list',
-
- 'F_ADD_ACTION' => $base_url,
- 'F_USERNAME' => @htmlentities($_GET['username'], ENT_COMPAT, 'UTF-8'),
- 'F_FILTER_ACTION' => get_root_url().'admin.php',
-
- 'ACTIVATE_COMMENTS' => $conf['activate_comments'],
- ));
-
-// Display or Hide double password type
-$template->assign('Double_Password', $conf['double_password_type_in_admin'] );
-
-// Filter status options
-$status_options[-1] = '------------';
-foreach (get_enums(USER_INFOS_TABLE, 'status') as $status)
-{
- $status_options[$status] = l10n('user_status_'.$status);
-}
-$template->assign('status_options', $status_options);
-$template->assign('status_selected',
- isset($_GET['status']) ? $_GET['status'] : '');
-
-// Filter group options
-$template->assign('group_options', $groups);
-$template->assign('group_selected',
- isset($_GET['group']) ? $_GET['group'] : '');
-
-// Filter order options
-$template->assign('order_options', $page['order_by_items']);
-$template->assign('order_selected',
- isset($_GET['order_by']) ? $_GET['order_by'] : '');
-
-// Filter direction options
-$template->assign('direction_options', $page['direction_items']);
-$template->assign('direction_selected',
- isset($_GET['direction']) ? $_GET['direction'] : '');
-
+ 'users' => $users,
+ 'all_users' => join(',', $user_ids),
+ 'Double_Password' => $conf['double_password_type_in_admin']
+ )
+ );
-if (isset($_POST['pref_submit']))
-{
- $template->assign(
- array(
- 'NB_IMAGE_PAGE' => $_POST['nb_image_page'],
- 'RECENT_PERIOD' => $_POST['recent_period'],
- ));
-}
-else
-{
- $default_user = get_default_user_info(true);
- $template->assign(
- array(
- 'NB_IMAGE_PAGE' => $default_user['nb_image_page'],
- 'RECENT_PERIOD' => $default_user['recent_period'],
- ));
-}
+$default_user = get_default_user_info(true);
-// Template Options
-$template->assign('theme_options', get_pwg_themes());
-$template->assign('theme_selected',
- isset($_POST['pref_submit']) ? $_POST['theme'] : get_default_theme());
+$protected_users = array(
+ $user['id'],
+ $conf['guest_id'],
+ $conf['default_user_id'],
+ $conf['webmaster_id'],
+ );
-// Language options
-$template->assign('language_options', get_languages());
-$template->assign('language_selected',
- isset($_POST['pref_submit']) ? $_POST['language'] : get_default_language());
+$template->assign(
+ array(
+ 'PWG_TOKEN' => get_pwg_token(),
+ 'NB_IMAGE_PAGE' => $default_user['nb_image_page'],
+ 'RECENT_PERIOD' => $default_user['recent_period'],
+ 'theme_options' => get_pwg_themes(),
+ 'theme_selected' => get_default_theme(),
+ 'language_options' => get_languages(),
+ 'language_selected' => get_default_language(),
+ 'association_options' => $groups,
+ 'protected_users' => implode(',', array_unique($protected_users)),
+ 'guest_user' => $conf['guest_id'],
+ )
+ );
// Status options
foreach (get_enums(USER_INFOS_TABLE, 'status') as $status)
@@ -633,16 +124,7 @@ foreach (get_enums(USER_INFOS_TABLE, 'status') as $status)
}
}
$template->assign('pref_status_options', $pref_status_options);
-$template->assign('pref_status_selected',
- isset($_POST['pref_submit']) ? $_POST['status'] : 'normal');
-
-// associate and dissociate options
-$template->assign('association_options', $groups);
-$template->assign('associate_selected',
- isset($_POST['pref_submit']) ? $_POST['associate'] : '');
-$template->assign('dissociate_selected',
- isset($_POST['pref_submit']) ? $_POST['dissociate'] : '');
-
+$template->assign('pref_status_selected', 'normal');
// user level options
foreach ($conf['available_permission_levels'] as $level)
@@ -650,107 +132,12 @@ foreach ($conf['available_permission_levels'] as $level)
$level_options[$level] = l10n(sprintf('Level %d', $level));
}
$template->assign('level_options', $level_options);
-$template->assign('level_selected',
- isset($_POST['pref_submit']) ? $_POST['level'] : $default_user['level']);
-
-// +-----------------------------------------------------------------------+
-// | navigation bar |
-// +-----------------------------------------------------------------------+
-
-$url = PHPWG_ROOT_PATH.'admin.php'.get_query_string_diff(array('start'));
-
-$navbar = create_navigation_bar(
- $url,
- count($page['filtered_users']),
- $start,
- $conf['users_page']
- );
-
-$template->assign('navbar', $navbar);
+$template->assign('level_selected', $default_user['level']);
-// +-----------------------------------------------------------------------+
-// | user list |
-// +-----------------------------------------------------------------------+
-
-$profile_url = get_root_url().'admin.php?page=profile&amp;user_id=';
-$perm_url = get_root_url().'admin.php?page=user_perm&amp;user_id=';
-
-$visible_user_list = array();
-foreach ($page['filtered_users'] as $num => $local_user)
-{
- // simulate LIMIT $start, $conf['users_page']
- if ($num < $start)
- {
- continue;
- }
- if ($num >= $start + $conf['users_page'])
- {
- break;
- }
-
- $visible_user_list[] = $local_user;
-}
-
-// allow plugins to fill template var plugin_user_list_column_titles and
-// plugin_columns/plugin_actions for each user in the list
-$visible_user_list = trigger_event('loc_visible_user_list', $visible_user_list);
-
-foreach ($visible_user_list as $local_user)
-{
- $groups_string = preg_replace(
- '/(\d+)/e',
- "\$groups['$1']",
- implode(
- ', ',
- $local_user['groups']
- )
- );
-
- if (isset($_POST['pref_submit'])
- and isset($_POST['selection'])
- and in_array($local_user['id'], $_POST['selection']))
- {
- $checked = 'checked="checked"';
- }
- else
- {
- $checked = '';
- }
-
- $properties = array();
- if ( $local_user['level'] != 0 )
- {
- $properties[] = l10n( sprintf('Level %d', $local_user['level']) );
- }
- $properties[] =
- (isset($local_user['enabled_high']) and ($local_user['enabled_high'] == 'true'))
- ? l10n('High definition') : l10n('');
-
- $template->append(
- 'users',
- array(
- 'ID' => $local_user['id'],
- 'CHECKED' => $checked,
- 'U_PROFILE' => $profile_url.$local_user['id'],
- 'U_PERM' => $perm_url.$local_user['id'],
- 'USERNAME' => stripslashes($local_user['username'])
- .($local_user['id'] == $conf['guest_id']
- ? '<br>['.l10n('guest').']' : '')
- .($local_user['id'] == $conf['default_user_id']
- ? '<br>['.l10n('default values').']' : ''),
- 'STATUS' => l10n('user_status_'.$local_user['status']),
- 'EMAIL' => get_email_address_as_display_text($local_user['email']),
- 'GROUPS' => $groups_string,
- 'PROPERTIES' => implode( ', ', $properties),
- 'plugin_columns' => isset($local_user['plugin_columns']) ? $local_user['plugin_columns'] : array(),
- 'plugin_actions' => isset($local_user['plugin_actions']) ? $local_user['plugin_actions'] : array(),
- )
- );
-}
// +-----------------------------------------------------------------------+
-// | html code display |
+// | html code display |
// +-----------------------------------------------------------------------+
$template->assign_var_from_handle('ADMIN_CONTENT', 'user_list');
-?>
+?> \ No newline at end of file
diff --git a/admin/user_list_backend.php b/admin/user_list_backend.php
new file mode 100644
index 000000000..9d18f270b
--- /dev/null
+++ b/admin/user_list_backend.php
@@ -0,0 +1,182 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+define('PHPWG_ROOT_PATH','../');
+define('IN_ADMIN', true);
+
+include_once(PHPWG_ROOT_PATH.'include/common.inc.php');
+
+check_status(ACCESS_ADMINISTRATOR);
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Easy set variables
+ */
+
+/* Array of database columns which should be read and sent back to DataTables. Use a space where
+ * you want to insert a non-database field (for example a counter or static image)
+ */
+$aColumns = array('id', 'username', 'status', 'mail_address', 'registration_date');
+$aColumns = trigger_change('user_list_columns', $aColumns);
+
+/* Indexed column (used for fast and accurate table cardinality) */
+$sIndexColumn = "id";
+
+/* DB table to use */
+$sTable = USERS_TABLE.' INNER JOIN '.USER_INFOS_TABLE.' AS ui ON id = ui.user_id';
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * If you just want to use the basic configuration for DataTables with PHP server-side, there is
+ * no need to edit below this line
+ */
+
+/*
+ * Paging
+ */
+$sLimit = "";
+if ( isset( $_REQUEST['iDisplayStart'] ) && $_REQUEST['iDisplayLength'] != '-1' )
+{
+ $sLimit = "LIMIT ".pwg_db_real_escape_string( $_REQUEST['iDisplayStart'] ).", ".
+ pwg_db_real_escape_string( $_REQUEST['iDisplayLength'] );
+}
+
+
+/*
+ * Ordering
+ */
+if ( isset( $_REQUEST['iSortCol_0'] ) )
+{
+ $sOrder = "ORDER BY ";
+ for ( $i=0 ; $i<intval( $_REQUEST['iSortingCols'] ) ; $i++ )
+ {
+ if ( $_REQUEST[ 'bSortable_'.intval($_REQUEST['iSortCol_'.$i]) ] == "true" )
+ {
+ $sOrder .= $aColumns[ intval( $_REQUEST['iSortCol_'.$i] ) ]."
+ ".pwg_db_real_escape_string( $_REQUEST['sSortDir_'.$i] ) .", ";
+ }
+ }
+
+ $sOrder = substr_replace( $sOrder, "", -2 );
+ if ( $sOrder == "ORDER BY" )
+ {
+ $sOrder = "";
+ }
+}
+
+
+/*
+ * Filtering
+ * NOTE this does not match the built-in DataTables filtering which does it
+ * word by word on any field. It's possible to do here, but concerned about efficiency
+ * on very large tables, and MySQL's regex functionality is very limited
+ */
+$sWhere = "";
+if ( $_REQUEST['sSearch'] != "" )
+{
+ $sWhere = "WHERE (";
+ for ( $i=0 ; $i<count($aColumns) ; $i++ )
+ {
+ $sWhere .= $aColumns[$i]." LIKE '%".pwg_db_real_escape_string( $_REQUEST['sSearch'] )."%' OR ";
+ }
+ $sWhere = substr_replace( $sWhere, "", -3 );
+ $sWhere .= ')';
+}
+
+/* Individual column filtering */
+for ( $i=0 ; $i<count($aColumns) ; $i++ )
+{
+ if (isset($_REQUEST['bSearchable_'.$i]) && isset($_REQUEST['sSearch_'.$i])
+ &&$_REQUEST['bSearchable_'.$i] == "true" && $_REQUEST['sSearch_'.$i] != ''
+ )
+ {
+ if ( $sWhere == "" )
+ {
+ $sWhere = "WHERE ";
+ }
+ else
+ {
+ $sWhere .= " AND ";
+ }
+ $sWhere .= $aColumns[$i]." LIKE '%".pwg_db_real_escape_string($_REQUEST['sSearch_'.$i])."%' ";
+ }
+}
+
+
+/*
+ * SQL queries
+ * Get data to display
+ */
+$sQuery = "
+ SELECT SQL_CALC_FOUND_ROWS ".str_replace(" , ", " ", implode(", ", $aColumns))."
+ FROM $sTable
+ $sWhere
+ $sOrder
+ $sLimit
+ ";
+$rResult = pwg_query($sQuery);
+
+/* Data set length after filtering */
+$rResultFilterTotal = pwg_query('SELECT FOUND_ROWS();');
+list($iFilteredTotal) = pwg_db_fetch_row($rResultFilterTotal);
+
+/* Total data set length */
+$sQuery = "
+ SELECT COUNT(".$sIndexColumn.")
+ FROM $sTable
+ ";
+$rResultTotal = pwg_query($sQuery);
+$aResultTotal = pwg_db_fetch_array($rResultTotal);
+$iTotal = $aResultTotal[0];
+
+
+/*
+ * Output
+ */
+$output = array(
+ "sEcho" => intval($_REQUEST['sEcho']),
+ "iTotalRecords" => $iTotal,
+ "iTotalDisplayRecords" => $iFilteredTotal,
+ "aaData" => array()
+ );
+
+while ( $aRow = pwg_db_fetch_array( $rResult ) )
+{
+ $row = array();
+ for ( $i=0 ; $i<count($aColumns) ; $i++ )
+ {
+ if ( $aColumns[$i] == "status" )
+ {
+ $row[] = l10n('user_status_'.$aRow[ $aColumns[$i] ]);
+ }
+ else if ( $aColumns[$i] != ' ' )
+ {
+ /* General output */
+ $row[] = $aRow[ $aColumns[$i] ];
+ }
+ }
+ $output['aaData'][] = $row;
+}
+
+$output = trigger_change('after_render_user_list', $output);
+
+echo json_encode( $output );
+?> \ No newline at end of file
diff --git a/admin/user_perm.php b/admin/user_perm.php
index 478d0386d..e40c064c2 100644
--- a/admin/user_perm.php
+++ b/admin/user_perm.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -64,7 +64,9 @@ DELETE FROM '.USER_ACCESS_TABLE.'
;';
pwg_query($query);
}
-else if (isset($_POST['trueify']))
+elseif (isset($_POST['trueify'])
+ and isset($_POST['cat_false'])
+ and count($_POST['cat_false']) > 0)
{
add_permission_on_category($_POST['cat_false'], $page['user']);
}
@@ -83,10 +85,9 @@ $template->set_filenames(
$template->assign(
array(
'TITLE' =>
- sprintf(
- l10n('Manage permissions for user "%s"'),
- get_username($page['user']
- )
+ l10n(
+ 'Manage permissions for user "%s"',
+ get_username($page['user'])
),
'L_CAT_OPTIONS_TRUE'=>l10n('Authorized'),
'L_CAT_OPTIONS_FALSE'=>l10n('Forbidden'),
@@ -118,8 +119,8 @@ if (pwg_db_num_rows($result) > 0)
$cats = array();
while ($row = pwg_db_fetch_assoc($result))
{
- array_push($cats, $row);
- array_push($group_authorized, $row['cat_id']);
+ $cats[] = $row;
+ $group_authorized[] = $row['cat_id'];
}
usort($cats, 'global_rank_compare');
@@ -127,7 +128,7 @@ if (pwg_db_num_rows($result) > 0)
{
$template->append(
'categories_because_of_groups',
- get_cat_display_name_cache($category['uppercats'], null, false)
+ get_cat_display_name_cache($category['uppercats'], null)
);
}
}
@@ -151,7 +152,7 @@ $result = pwg_query($query_true);
$authorized_ids = array();
while ($row = pwg_db_fetch_assoc($result))
{
- array_push($authorized_ids, $row['id']);
+ $authorized_ids[] = $row['id'];
}
$query_false = '
diff --git a/category.php b/category.php
index d3bf2ced2..131098086 100644
--- a/category.php
+++ b/category.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/comments.php b/comments.php
index 07b4581fe..a41e0c57a 100644
--- a/comments.php
+++ b/comments.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -38,6 +38,9 @@ if (!$conf['activate_comments'])
// +-----------------------------------------------------------------------+
check_status(ACCESS_GUEST);
+$url_self = PHPWG_ROOT_PATH.'comments.php'
+ .get_query_string_diff(array('delete','edit','validate','pwg_token'));
+
$sort_order = array(
'DESC' => l10n('descending'),
'ASC' => l10n('ascending')
@@ -78,9 +81,9 @@ if (!in_array($conf['comments_page_nb_comments'], $items_number))
$since_options = array(
1 => array('label' => l10n('today'),
'clause' => 'date > '.pwg_db_get_recent_period_expression(1)),
- 2 => array('label' => sprintf(l10n('last %d days'), 7),
+ 2 => array('label' => l10n('last %d days', 7),
'clause' => 'date > '.pwg_db_get_recent_period_expression(7)),
- 3 => array('label' => sprintf(l10n('last %d days'), 30),
+ 3 => array('label' => l10n('last %d days', 30),
'clause' => 'date > '.pwg_db_get_recent_period_expression(30)),
4 => array('label' => l10n('the beginning'),
'clause' => '1=1') // stupid but generic
@@ -148,8 +151,7 @@ if (isset($_GET['cat']) and 0 != $_GET['cat'])
if (!empty($_GET['author']))
{
$page['where_clauses'][] =
- 'u.'.$conf['user_fields']['username'].' = \''.$_GET['author'].'\'
- OR author = \''.$_GET['author'].'\'';
+ '(u.'.$conf['user_fields']['username'].' = \''.$_GET['author'].'\' OR author = \''.$_GET['author'].'\')';
}
// search a specific comment (if you're coming directly from an admin
@@ -285,12 +287,7 @@ if (isset($action))
if ($perform_redirect)
{
- $redirect_url =
- PHPWG_ROOT_PATH
- .'comments.php'
- .get_query_string_diff(array('delete','edit','validate','pwg_token'));
-
- redirect($redirect_url);
+ redirect($url_self);
}
}
}
@@ -375,34 +372,6 @@ else
$start = 0;
}
-$query = '
-SELECT COUNT(DISTINCT(com.id))
- FROM '.IMAGE_CATEGORY_TABLE.' AS ic
- INNER JOIN '.COMMENTS_TABLE.' AS com
- ON ic.image_id = com.image_id
- LEFT JOIN '.USERS_TABLE.' As u
- ON u.'.$conf['user_fields']['id'].' = com.author_id
- WHERE '.implode('
- AND ', $page['where_clauses']).'
-;';
-list($counter) = pwg_db_fetch_row(pwg_query($query));
-
-$url = PHPWG_ROOT_PATH
- .'comments.php'
- .get_query_string_diff(array('start','delete','validate','pwg_token'));
-
-$navbar = create_navigation_bar($url,
- $counter,
- $start,
- $page['items_number'],
- '');
-
-$template->assign('navbar', $navbar);
-
-$url_self = PHPWG_ROOT_PATH
- .'comments.php'
- .get_query_string_diff(array('edit','delete','validate','pwg_token'));
-
// +-----------------------------------------------------------------------+
// | last comments display |
// +-----------------------------------------------------------------------+
@@ -412,8 +381,9 @@ $element_ids = array();
$category_ids = array();
$query = '
-SELECT com.id AS comment_id,
+SELECT SQL_CALC_FOUND_ROWS com.id AS comment_id,
com.image_id,
+ ic.category_id,
com.author,
com.author_id,
u.'.$conf['user_fields']['email'].' AS user_email,
@@ -429,13 +399,7 @@ SELECT com.id AS comment_id,
ON u.'.$conf['user_fields']['id'].' = com.author_id
WHERE '.implode('
AND ', $page['where_clauses']).'
- GROUP BY comment_id,
- com.image_id,
- com.author,
- com.author_id,
- com.date,
- com.content,
- com.validated
+ GROUP BY comment_id
ORDER BY '.$page['sort_by'].' '.$page['sort_order'];
if ('all' != $page['items_number'])
{
@@ -447,44 +411,39 @@ $query.= '
$result = pwg_query($query);
while ($row = pwg_db_fetch_assoc($result))
{
- array_push($comments, $row);
- array_push($element_ids, $row['image_id']);
+ $comments[] = $row;
+ $element_ids[] = $row['image_id'];
+ $category_ids[] = $row['category_id'];
}
+list($counter) = pwg_db_fetch_row(pwg_query('SELECT FOUND_ROWS()'));
+
+$url = PHPWG_ROOT_PATH.'comments.php'
+ .get_query_string_diff(array('start','edit','delete','validate','pwg_token'));
+
+$navbar = create_navigation_bar($url,
+ $counter,
+ $start,
+ $page['items_number'],
+ '');
+
+$template->assign('navbar', $navbar);
+
if (count($comments) > 0)
{
// retrieving element informations
- $elements = array();
$query = '
SELECT *
FROM '.IMAGES_TABLE.'
WHERE id IN ('.implode(',', $element_ids).')
;';
- $result = pwg_query($query);
- while ($row = pwg_db_fetch_assoc($result))
- {
- $elements[$row['id']] = $row;
- }
+ $elements = hash_from_query($query, 'id');
// retrieving category informations
- $query = '
-SELECT c.id, name, permalink, uppercats, com.id as comment_id
- FROM '.CATEGORIES_TABLE.' AS c
- LEFT JOIN '.IMAGE_CATEGORY_TABLE.' AS ic
- ON c.id=ic.category_id
- LEFT JOIN '.COMMENTS_TABLE.' AS com
- ON ic.image_id=com.image_id
- '.get_sql_condition_FandF
- (
- array
- (
- 'forbidden_categories' => 'c.id',
- 'visible_categories' => 'c.id'
- ),
- 'WHERE'
- ).'
-;';
- $categories = hash_from_query($query, 'comment_id');
+ $query = 'SELECT id, name, permalink, uppercats
+ FROM '.CATEGORIES_TABLE.'
+ WHERE id IN ('.implode(',', $category_ids).')';
+ $categories = hash_from_query($query, 'id');
foreach ($comments as $comment)
{
@@ -503,7 +462,7 @@ SELECT c.id, name, permalink, uppercats, com.id as comment_id
// link to the full size picture
$url = make_picture_url(
array(
- 'category' => $categories[ $comment['comment_id'] ],
+ 'category' => $categories[ $comment['category_id'] ],
'image_id' => $comment['image_id'],
'image_file' => $elements[$comment['image_id']]['file'],
)
@@ -537,13 +496,8 @@ SELECT c.id, name, permalink, uppercats, com.id as comment_id
if (can_manage_comment('delete', $comment['author_id']))
{
- $url =
- get_root_url()
- .'comments.php'
- .get_query_string_diff(array('delete','validate','edit', 'pwg_token'));
-
$tpl_comment['U_DELETE'] = add_url_params(
- $url,
+ $url_self,
array(
'delete' => $comment['comment_id'],
'pwg_token' => get_pwg_token(),
@@ -553,13 +507,8 @@ SELECT c.id, name, permalink, uppercats, com.id as comment_id
if (can_manage_comment('edit', $comment['author_id']))
{
- $url =
- get_root_url()
- .'comments.php'
- .get_query_string_diff(array('edit', 'delete','validate', 'pwg_token'));
-
$tpl_comment['U_EDIT'] = add_url_params(
- $url,
+ $url_self,
array(
'edit' => $comment['comment_id']
)
@@ -582,7 +531,7 @@ SELECT c.id, name, permalink, uppercats, com.id as comment_id
if ('true' != $comment['validated'])
{
$tpl_comment['U_VALIDATE'] = add_url_params(
- $url,
+ $url_self,
array(
'validate'=> $comment['comment_id'],
'pwg_token' => get_pwg_token(),
diff --git a/doc/index.php b/doc/index.php
index 41732f2fd..c8de97f60 100644
--- a/doc/index.php
+++ b/doc/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/feed.php b/feed.php
index 942ae256f..24e9f6846 100644
--- a/feed.php
+++ b/feed.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -122,7 +122,7 @@ if (!$image_only)
if (count($news) > 0)
{
$item = new FeedItem();
- $item->title = sprintf(l10n('New on %s'), format_date($dbnow) );
+ $item->title = l10n('New on %s', format_date($dbnow) );
$item->link = get_gallery_home_url();
// content creation
diff --git a/galleries/index.php b/galleries/index.php
index 41732f2fd..c8de97f60 100644
--- a/galleries/index.php
+++ b/galleries/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/i.php b/i.php
index 2fefd30d9..8ca3b68c2 100644
--- a/i.php
+++ b/i.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// +-----------------------------------------------------------------------+
// | 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 |
@@ -49,7 +49,7 @@ function mkgetdir($dir)
$umask = umask(0);
$mkd = @mkdir($dir, $conf['chmod_value'], true);
umask($umask);
- if ($mkd==false)
+ if ($mkd==false && !is_dir($dir) /* retest existence because of potential concurrent i.php with slow file systems*/)
{
return false;
}
@@ -284,24 +284,21 @@ function parse_request()
function try_switch_source(DerivativeParams $params, $original_mtime)
{
global $page;
- $original_size = null;
- if (isset($page['original_size']))
+ if (!isset($page['original_size']))
+ return false;
+
+ $original_size = $page['original_size'];
+ if ($page['rotation_angle']==90 || $page['rotation_angle']==270)
{
- $original_size = $page['original_size'];
- if ($page['rotation_angle']==90 || $page['rotation_angle']==270)
- {
- $tmp = $original_size[0];
- $original_size[0] = $original_size[1];
- $original_size[1] = $tmp;
- }
+ $tmp = $original_size[0];
+ $original_size[0] = $original_size[1];
+ $original_size[1] = $tmp;
}
+ $dsize = $params->compute_final_size($original_size);
$use_watermark = $params->use_watermark;
if ($use_watermark)
{
- if (!isset($original_size))
- return false; // cannot really know if a watermark is required
- $dsize = $params->compute_final_size($original_size);
$use_watermark = $params->will_watermark($dsize);
}
@@ -314,6 +311,10 @@ function try_switch_source(DerivativeParams $params, $original_mtime)
continue;
if ($candidate->max_width() < $params->max_width() || $candidate->max_height() < $params->max_height())
continue;
+ $candidate_size = $candidate->compute_final_size($original_size);
+ if ($dsize != $params->compute_final_size($candidate_size))
+ continue;
+
if ($params->sizing->max_crop==0)
{
if ($candidate->sizing->max_crop!=0)
@@ -323,9 +324,6 @@ function try_switch_source(DerivativeParams $params, $original_mtime)
{
if ($candidate->sizing->max_crop!=0)
continue; // this could be optimized
- if (!isset($original_size))
- continue;
- $candidate_size = $candidate->compute_final_size($original_size);
if ($candidate_size[0] < $params->sizing->min_size[0] || $candidate_size[1] < $params->sizing->min_size[1] )
continue;
}
@@ -609,7 +607,7 @@ if (!$changes)
ierror( $page['src_url'], 301);
}
-if ($d_size[0]*$d_size[1] < 256000)
+if ($d_size[0]*$d_size[1] < $conf['derivatives_strip_metadata_threshold'])
{// strip metadata for small images
$image->strip();
}
diff --git a/identification.php b/identification.php
index 9c3de083e..c9fc3605b 100644
--- a/identification.php
+++ b/identification.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -39,7 +39,7 @@ if ( !empty($_GET['redirect']) )
$redirect_to = urldecode($_GET['redirect']);
if ( is_a_guest() )
{
- array_push($page['errors'], l10n('You are not authorized to access the requested page'));
+ $page['errors'][] = l10n('You are not authorized to access the requested page');
}
}
@@ -47,10 +47,7 @@ if (isset($_POST['login']))
{
if (!isset($_COOKIE[session_name()]))
{
- array_push(
- $page['errors'],
- l10n('Cookies are blocked or not supported by your browser. You must enable cookies to connect.')
- );
+ $page['errors'][] = l10n('Cookies are blocked or not supported by your browser. You must enable cookies to connect.');
}
else
{
@@ -68,7 +65,7 @@ if (isset($_POST['login']))
}
else
{
- array_push($page['errors'], l10n('Invalid password!') );
+ $page['errors'][] = l10n('Invalid password!');
}
}
}
diff --git a/include/block.class.php b/include/block.class.php
index d0943ebb9..966573ad6 100644
--- a/include/block.class.php
+++ b/include/block.class.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// +-----------------------------------------------------------------------+
// | 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 |
@@ -19,39 +19,63 @@
// | USA. |
// +-----------------------------------------------------------------------+
+/**
+ * @package functions\menubar
+ */
+
+
+/**
+ * Manages a set of RegisteredBlock and DisplayBlock.
+ */
class BlockManager
{
+ /** @var string */
protected $id;
- protected $registered_blocks=array();
+ /** @var RegisteredBlock[] */
+ protected $registered_blocks = array();
+ /** @var DisplayBlock[] */
protected $display_blocks = array();
- public function BlockManager($id)
+ /**
+ * @param string $id
+ */
+ public function __construct($id)
{
$this->id = $id;
}
- /** triggers an action that allows implementors of menu blocks to register the blocks*/
+ /**
+ * Triggers a notice that allows plugins of menu blocks to register the blocks.
+ */
public function load_registered_blocks()
{
- trigger_action('blockmanager_register_blocks', array(&$this) );
+ trigger_action('blockmanager_register_blocks', array(&$this));
}
-
+
+ /**
+ * @return string
+ */
public function get_id()
{
return $this->id;
}
+ /**
+ * @return RegisteredBlock[]
+ */
public function get_registered_blocks()
{
return $this->registered_blocks;
}
- /** registers a block with this menu. usually called as a result of menubar_register_blocks action
- * @param MenuBlock block
- */
+ /**
+ * Add a block with the menu. Usually called in 'blockmanager_register_blocks' event.
+ *
+ * @param RegisteredBlock &$block
+ */
public function register_block(&$block)
{
- if ( isset($this->registered_blocks[$block->get_id()] ) )
+ if (isset($this->registered_blocks[$block->get_id()]))
{
trigger_error("Block '".$block->get_id()."' is already registered", E_USER_WARNING);
return false;
@@ -60,23 +84,26 @@ class BlockManager
return true;
}
- /** performs one time preparation of registered blocks for display;
- * triggers the action menubar_prepare_display where implementors can
+ /**
+ * Performs one time preparation of registered blocks for display.
+ * Triggers 'blockmanager_prepare_display' event where plugins can
* reposition or hide blocks
- */
+ */
public function prepare_display()
{
global $conf;
$conf_id = 'blk_'.$this->id;
$mb_conf = isset($conf[$conf_id]) ? $conf[$conf_id] : array();
- if ( !is_array($mb_conf) )
+ if (!is_array($mb_conf))
+ {
$mb_conf = @unserialize($mb_conf);
+ }
$idx = 1;
- foreach( $this->registered_blocks as $id => $block )
+ foreach ($this->registered_blocks as $id => $block)
{
- $pos = isset( $mb_conf[$id] ) ? $mb_conf[$id] : $idx*50;
- if ( $pos>0 )
+ $pos = isset($mb_conf[$id]) ? $mb_conf[$id] : $idx*50;
+ if ($pos>0)
{
$this->display_blocks[$id] = new DisplayBlock($block);
$this->display_blocks[$id]->set_position($pos);
@@ -84,51 +111,83 @@ class BlockManager
$idx++;
}
$this->sort_blocks();
- trigger_action( 'blockmanager_prepare_display', array(&$this) );
+ trigger_action('blockmanager_prepare_display', array(&$this));
$this->sort_blocks();
}
- /** returns true if the block whose id is hidden
- * @param string block_id
- */
+ /**
+ * Returns true if the block is hidden.
+ *
+ * @param string $block_id
+ * @return bool
+ */
public function is_hidden($block_id)
{
- return isset($this->display_blocks[$block_id]) ? false : true;
+ return !isset($this->display_blocks[$block_id]);
}
+ /**
+ * Remove a block from the displayed blocks.
+ *
+ * @param string $block_id
+ */
public function hide_block($block_id)
{
- unset( $this->display_blocks[$block_id] );
+ unset($this->display_blocks[$block_id]);
}
+ /**
+ * Returns a visible block.
+ *
+ * @param string $block_id
+ * @return &DisplayBlock|null
+ */
public function &get_block($block_id)
{
$tmp = null;
- if ( isset($this->display_blocks[$block_id]) )
+ if (isset($this->display_blocks[$block_id]))
{
return $this->display_blocks[$block_id];
}
return $tmp;
}
+ /**
+ * Changes the position of a block.
+ *
+ * @param string $block_id
+ * @param int $position
+ */
public function set_block_position($block_id, $position)
{
- if ( isset($this->display_blocks[$block_id]) )
+ if (isset($this->display_blocks[$block_id]))
{
$this->display_blocks[$block_id]->set_position($position);
}
}
+ /**
+ * Sorts the blocks.
+ */
protected function sort_blocks()
{
- uasort( $this->display_blocks, array('BlockManager', 'cmp_by_position') );
+ uasort($this->display_blocks, array('BlockManager', 'cmp_by_position'));
}
+ /**
+ * Callback for blocks sorting.
+ */
static protected function cmp_by_position($a, $b)
{
return $a->get_position() - $b->get_position();
}
+ /**
+ * Parse the menu and assign the result in a template variable.
+ *
+ * @param string $var
+ * @param string $file
+ */
public function apply($var, $file)
{
global $template;
@@ -136,9 +195,9 @@ class BlockManager
$template->set_filename('menubar', $file);
trigger_action('blockmanager_apply', array(&$this) );
- foreach( $this->display_blocks as $id=>$block)
+ foreach ($this->display_blocks as $id=>$block)
{
- if (empty($block->raw_content) and empty($block->template) )
+ if (empty($block->raw_content) and empty($block->template))
{
$this->hide_block($id);
}
@@ -149,62 +208,126 @@ class BlockManager
}
}
+
/**
- * Represents a menu block registered in a Menu object.
+ * Represents a menu block registered in a BlockManager object.
*/
class RegisteredBlock
{
+ /** @var string */
protected $id;
+ /** @var string */
protected $name;
+ /** @var string */
protected $owner;
- public function RegisteredBlock($id, $name, $owner)
+ /**
+ * @param string $id
+ * @param string $name
+ * @param string $owner
+ */
+ public function __construct($id, $name, $owner)
{
$this->id = $id;
$this->name = $name;
$this->owner = $owner;
}
- public function get_id() { return $this->id; }
- public function get_name() { return $this->name; }
- public function get_owner() { return $this->owner; }
+ /**
+ * @return string
+ */
+ public function get_id()
+ {
+ return $this->id;
+ }
+
+ /**
+ * @return string
+ */
+ public function get_name()
+ {
+ return $this->name;
+ }
+
+ /**
+ * @return string
+ */
+ public function get_owner()
+ {
+ return $this->owner;
+ }
}
+
/**
- * Represents a menu block ready for display in the Menu object.
+ * Represents a menu block ready for display in the BlockManager object.
*/
class DisplayBlock
{
+ /** @var RegisteredBlock */
protected $_registeredBlock;
+ /** @var int */
protected $_position;
-
+ /** @var string */
protected $_title;
+ /** @var mixed */
public $data;
+ /** @var string */
public $template;
+ /** @var string */
public $raw_content;
- public function DisplayBlock($registeredBlock)
+ /**
+ * @param RegisteredBlock &$block
+ */
+ public function __construct($block)
{
- $this->_registeredBlock = &$registeredBlock;
+ $this->_registeredBlock = &$block;
}
- public function &get_block() { return $this->_registeredBlock; }
+ /**
+ * @return &RegisteredBlock
+ */
+ public function &get_block()
+ {
+ return $this->_registeredBlock;
+ }
- public function get_position() { return $this->_position; }
+ /**
+ * @return int
+ */
+ public function get_position()
+ {
+ return $this->_position;
+ }
+
+ /**
+ * @param int $position
+ */
public function set_position($position)
{
$this->_position = $position;
}
+ /**
+ * @return string
+ */
public function get_title()
{
if (isset($this->_title))
+ {
return $this->_title;
+ }
else
+ {
return $this->_registeredBlock->get_name();
+ }
}
+ /**
+ * @param string
+ */
public function set_title($title)
{
$this->_title = $title;
diff --git a/include/calendar_base.class.php b/include/calendar_base.class.php
index 8f9d1c252..e1b24bfea 100644
--- a/include/calendar_base.class.php
+++ b/include/calendar_base.class.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,20 +22,41 @@
// +-----------------------------------------------------------------------+
/**
+ * @package functions\calendar
+ */
+
+
+/**
* Base class for monthly and weekly calendar styles
*/
-class CalendarBase
+abstract class CalendarBase
{
- // db column on which this calendar works
+ /** db column on which this calendar works */
var $date_field;
- // used for queries (INNER JOIN or normal)
+ /** used for queries (INNER JOIN or normal) */
var $inner_sql;
- //
+ /** used to store db fields */
var $calendar_levels;
/**
- * Initialize the calendar
- * @param string inner_sql used for queries (INNER JOIN or normal)
+ * Generate navigation bars for category page.
+ *
+ * @return boolean false indicates that thumbnails where not included
+ */
+ abstract function generate_category_content();
+
+ /**
+ * Returns a sql WHERE subquery for the date field.
+ *
+ * @param int $max_levels (e.g. 2=only year and month)
+ * @return string
+ */
+ abstract function get_date_where($max_levels);
+
+ /**
+ * Initialize the calendar.
+ *
+ * @param string $inner_sql
*/
function initialize($inner_sql)
{
@@ -51,6 +72,11 @@ class CalendarBase
$this->inner_sql = $inner_sql;
}
+ /**
+ * Returns the calendar title (with HTML).
+ *
+ * @return string
+ */
function get_display_name()
{
global $conf, $page;
@@ -82,11 +108,12 @@ class CalendarBase
return $res;
}
-//--------------------------------------------------------- private members ---
/**
- * Returns a display name for a date component optionally using labels
- */
- function get_date_component_label($level, $date_component)
+ * Returns a display name for a date component optionally using labels.
+ *
+ * @return string
+ */
+ protected function get_date_component_label($level, $date_component)
{
$label = $date_component;
if (isset($this->calendar_levels[$level]['labels'][$date_component]))
@@ -101,9 +128,12 @@ class CalendarBase
}
/**
- * Gets a nice display name for a date to be shown in previos/next links.
+ * Gets a nice display name for a date to be shown in previous/next links
+ *
+ * @param string $date
+ * @return string
*/
- function get_date_nice_name($date)
+ protected function get_date_nice_name($date)
{
$date_components = explode('-', $date);
$res = '';
@@ -125,14 +155,14 @@ class CalendarBase
/**
* Creates a calendar navigation bar.
*
- * @param array date_components
- * @param array items - hash of items to put in the bar (e.g. 2005,2006)
- * @param bool show_any - adds any link to the end of the bar
- * @param bool show_empty - shows all labels even those without items
- * @param array labels - optional labels for items (e.g. Jan,Feb,...)
- * @return string the navigation bar
+ * @param array $date_components
+ * @param array $items - hash of items to put in the bar (e.g. 2005,2006)
+ * @param bool $show_any - adds any link to the end of the bar
+ * @param bool $show_empty - shows all labels even those without items
+ * @param array $labels - optional labels for items (e.g. Jan,Feb,...)
+ * @return string
*/
- function get_nav_bar_from_items($date_components, $items,
+ protected function get_nav_bar_from_items($date_components, $items,
$show_any,
$show_empty=false, $labels=null)
{
@@ -203,10 +233,9 @@ class CalendarBase
/**
* Creates a calendar navigation bar for a given level.
*
- * @param int level - the level (0-year,1-month/week,2-day)
- * @return void
+ * @param int $level - 0-year, 1-month/week, 2-day
*/
- function build_nav_bar($level, $labels=null)
+ protected function build_nav_bar($level, $labels=null)
{
global $template, $conf, $page;
@@ -261,7 +290,7 @@ $this->get_date_where($level).'
* Assigns the next/previous link to the template with regards to
* the currently choosen date.
*/
- function build_next_prev()
+ protected function build_next_prev()
{
global $template, $page;
@@ -294,7 +323,7 @@ GROUP BY period';
$upper_items_rank = array_flip($upper_items);
if ( !isset($upper_items_rank[$current]) )
{
- array_push($upper_items, $current);// just in case (external link)
+ $upper_items[] = $current;// just in case (external link)
usort($upper_items, 'version_compare');
$upper_items_rank = array_flip($upper_items);
}
@@ -330,11 +359,11 @@ GROUP BY period';
if ( !empty($tpl_var) )
{
- $existing = & $template->get_template_vars('chronology_navigation_bars');
- if ( !empty($existing) )
+ $existing = $template->smarty->getVariable('chronology_navigation_bars');
+ if (! ($existing instanceof Undefined_Smarty_Variable))
{
- $existing[ sizeof($existing)-1 ] =
- array_merge( $existing[ sizeof($existing)-1 ], $tpl_var);
+ $existing->value[ sizeof($existing->value)-1 ] =
+ array_merge( $existing->value[ sizeof($existing->value)-1 ], $tpl_var);
}
else
{
@@ -343,4 +372,5 @@ GROUP BY period';
}
}
}
+
?> \ No newline at end of file
diff --git a/include/calendar_monthly.class.php b/include/calendar_monthly.class.php
index f3eb2a909..b9c845536 100644
--- a/include/calendar_monthly.class.php
+++ b/include/calendar_monthly.class.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,21 +21,28 @@
// | USA. |
// +-----------------------------------------------------------------------+
+/**
+ * @package functions\calendar
+ */
+
include_once(PHPWG_ROOT_PATH.'include/calendar_base.class.php');
-define ('CYEAR', 0);
-define ('CMONTH', 1);
-define ('CDAY', 2);
+/** level of year view */
+define('CYEAR', 0);
+/** level of month view */
+define('CMONTH', 1);
+/** level of day view */
+define('CDAY', 2);
+
/**
* Monthly calendar style (composed of years/months and days)
*/
class Calendar extends CalendarBase
{
-
/**
- * Initialize the calendar
- * @param string inner_sql used for queries (INNER JOIN or normal)
+ * Initialize the calendar.
+ * @param string $inner_sql
*/
function initialize($inner_sql)
{
@@ -57,113 +64,126 @@ class Calendar extends CalendarBase
);
}
-/**
- * Generate navigation bars for category page
- * @return boolean false to indicate that thumbnails
- * where not included here, true otherwise
- */
-function generate_category_content()
-{
- global $conf, $page;
-
- $view_type = $page['chronology_view'];
- if ($view_type==CAL_VIEW_CALENDAR)
+ /**
+ * Generate navigation bars for category page.
+ *
+ * @return boolean false indicates that thumbnails where not included
+ */
+ function generate_category_content()
{
- global $template;
- $tpl_var = array();
- if ( count($page['chronology_date'])==0 )
- {//case A: no year given - display all years+months
- if ($this->build_global_calendar($tpl_var))
- {
- $template->assign('chronology_calendar', $tpl_var);
+ global $conf, $page;
+
+ $view_type = $page['chronology_view'];
+ if ($view_type==CAL_VIEW_CALENDAR)
+ {
+ global $template;
+ $tpl_var = array();
+ if ( count($page['chronology_date'])==0 )
+ {//case A: no year given - display all years+months
+ if ($this->build_global_calendar($tpl_var))
+ {
+ $template->assign('chronology_calendar', $tpl_var);
+ return true;
+ }
+ }
+
+ if ( count($page['chronology_date'])==1 )
+ {//case B: year given - display all days in given year
+ if ($this->build_year_calendar($tpl_var))
+ {
+ $template->assign('chronology_calendar', $tpl_var);
+ $this->build_nav_bar(CYEAR); // years
+ return true;
+ }
+ }
+
+ if ( count($page['chronology_date'])==2 )
+ {//case C: year+month given - display a nice month calendar
+ if ( $this->build_month_calendar($tpl_var) )
+ {
+ $template->assign('chronology_calendar', $tpl_var);
+ }
+ $this->build_next_prev();
return true;
}
}
- if ( count($page['chronology_date'])==1 )
- {//case B: year given - display all days in given year
- if ($this->build_year_calendar($tpl_var))
+ if ($view_type==CAL_VIEW_LIST or count($page['chronology_date'])==3)
+ {
+ if ( count($page['chronology_date'])==0 )
{
- $template->assign('chronology_calendar', $tpl_var);
$this->build_nav_bar(CYEAR); // years
- return true;
}
- }
-
- if ( count($page['chronology_date'])==2 )
- {//case C: year+month given - display a nice month calendar
- if ( $this->build_month_calendar($tpl_var) )
+ if ( count($page['chronology_date'])==1)
{
- $template->assign('chronology_calendar', $tpl_var);
+ $this->build_nav_bar(CMONTH); // month
+ }
+ if ( count($page['chronology_date'])==2 )
+ {
+ $day_labels = range( 1, $this->get_all_days_in_month(
+ $page['chronology_date'][CYEAR] ,$page['chronology_date'][CMONTH] ) );
+ array_unshift($day_labels, 0);
+ unset( $day_labels[0] );
+ $this->build_nav_bar( CDAY, $day_labels ); // days
}
$this->build_next_prev();
- return true;
}
+ return false;
}
- if ($view_type==CAL_VIEW_LIST or count($page['chronology_date'])==3)
+ /**
+ * Returns a sql WHERE subquery for the date field.
+ *
+ * @param int $max_levels (e.g. 2=only year and month)
+ * @return string
+ */
+ function get_date_where($max_levels=3)
{
- if ( count($page['chronology_date'])==0 )
- {
- $this->build_nav_bar(CYEAR); // years
- }
- if ( count($page['chronology_date'])==1)
- {
- $this->build_nav_bar(CMONTH); // month
- }
- if ( count($page['chronology_date'])==2 )
+ global $page;
+
+ $date = $page['chronology_date'];
+ while (count($date)>$max_levels)
{
- $day_labels = range( 1, $this->get_all_days_in_month(
- $page['chronology_date'][CYEAR] ,$page['chronology_date'][CMONTH] ) );
- array_unshift($day_labels, 0);
- unset( $day_labels[0] );
- $this->build_nav_bar( CDAY, $day_labels ); // days
+ array_pop($date);
}
- $this->build_next_prev();
- }
- return false;
-}
-
-
-/**
- * Returns a sql where subquery for the date field
- * @param int max_levels return the where up to this level
- * (e.g. 2=only year and month)
- * @return string
- */
-function get_date_where($max_levels=3)
-{
- global $page;
-
- $date = $page['chronology_date'];
- while (count($date)>$max_levels)
- {
- array_pop($date);
- }
- $res = '';
- if (isset($date[CYEAR]) and $date[CYEAR]!=='any')
- {
- $b = $date[CYEAR] . '-';
- $e = $date[CYEAR] . '-';
- if (isset($date[CMONTH]) and $date[CMONTH]!=='any')
+ $res = '';
+ if (isset($date[CYEAR]) and $date[CYEAR]!=='any')
{
- $b .= sprintf('%02d-', $date[CMONTH]);
- $e .= sprintf('%02d-', $date[CMONTH]);
- if (isset($date[CDAY]) and $date[CDAY]!=='any')
+ $b = $date[CYEAR] . '-';
+ $e = $date[CYEAR] . '-';
+ if (isset($date[CMONTH]) and $date[CMONTH]!=='any')
{
- $b .= sprintf('%02d', $date[CDAY]);
- $e .= sprintf('%02d', $date[CDAY]);
+ $b .= sprintf('%02d-', $date[CMONTH]);
+ $e .= sprintf('%02d-', $date[CMONTH]);
+ if (isset($date[CDAY]) and $date[CDAY]!=='any')
+ {
+ $b .= sprintf('%02d', $date[CDAY]);
+ $e .= sprintf('%02d', $date[CDAY]);
+ }
+ else
+ {
+ $b .= '01';
+ $e .= $this->get_all_days_in_month($date[CYEAR], $date[CMONTH]);
+ }
}
else
{
- $b .= '01';
- $e .= $this->get_all_days_in_month($date[CYEAR], $date[CMONTH]);
+ $b .= '01-01';
+ $e .= '12-31';
+ if (isset($date[CMONTH]) and $date[CMONTH]!=='any')
+ {
+ $res .= ' AND '.$this->calendar_levels[CMONTH]['sql'].'='.$date[CMONTH];
+ }
+ if (isset($date[CDAY]) and $date[CDAY]!=='any')
+ {
+ $res .= ' AND '.$this->calendar_levels[CDAY]['sql'].'='.$date[CDAY];
+ }
}
+ $res = " AND $this->date_field BETWEEN '$b' AND '$e 23:59:59'" . $res;
}
else
{
- $b .= '01-01';
- $e .= '12-31';
+ $res = ' AND '.$this->date_field.' IS NOT NULL';
if (isset($date[CMONTH]) and $date[CMONTH]!=='any')
{
$res .= ' AND '.$this->calendar_levels[CMONTH]['sql'].'='.$date[CMONTH];
@@ -173,344 +193,305 @@ function get_date_where($max_levels=3)
$res .= ' AND '.$this->calendar_levels[CDAY]['sql'].'='.$date[CDAY];
}
}
- $res = " AND $this->date_field BETWEEN '$b' AND '$e 23:59:59'" . $res;
+ return $res;
}
- else
+
+ /**
+ * Returns an array with all the days in a given month.
+ *
+ * @param int $year
+ * @param int $month
+ * @return int[]
+ */
+ protected function get_all_days_in_month($year, $month)
{
- $res = ' AND '.$this->date_field.' IS NOT NULL';
- if (isset($date[CMONTH]) and $date[CMONTH]!=='any')
+ $md= array(1=>31,28,31,30,31,30,31,31,30,31,30,31);
+
+ if ( is_numeric($year) and $month==2)
+ {
+ $nb_days = $md[2];
+ if ( ($year%4==0) and ( ($year%100!=0) or ($year%400!=0) ) )
+ {
+ $nb_days++;
+ }
+ }
+ elseif ( is_numeric($month) )
{
- $res .= ' AND '.$this->calendar_levels[CMONTH]['sql'].'='.$date[CMONTH];
+ $nb_days = $md[ $month ];
}
- if (isset($date[CDAY]) and $date[CDAY]!=='any')
+ else
{
- $res .= ' AND '.$this->calendar_levels[CDAY]['sql'].'='.$date[CDAY];
+ $nb_days = 31;
}
+ return $nb_days;
}
- return $res;
-}
-
-
-//--------------------------------------------------------- private members ---
+ /**
+ * Build global calendar and assign the result in _$tpl_var_
+ *
+ * @param array $tpl_var
+ * @return bool
+ */
+ protected function build_global_calendar(&$tpl_var)
+ {
+ global $page;
-// returns an array with all the days in a given month
-function get_all_days_in_month($year, $month)
-{
- $md= array(1=>31,28,31,30,31,30,31,31,30,31,30,31);
+ assert( count($page['chronology_date']) == 0 );
+ $query='
+ SELECT '.pwg_db_get_date_YYYYMM($this->date_field).' as period,
+ COUNT(distinct id) as count';
+ $query.= $this->inner_sql;
+ $query.= $this->get_date_where();
+ $query.= '
+ GROUP BY period
+ ORDER BY '.pwg_db_get_year($this->date_field).' DESC, '.pwg_db_get_month($this->date_field).' ASC';
- if ( is_numeric($year) and $month==2)
- {
- $nb_days = $md[2];
- if ( ($year%4==0) and ( ($year%100!=0) or ($year%400!=0) ) )
+ $result = pwg_query($query);
+ $items=array();
+ while ($row = pwg_db_fetch_assoc($result))
{
- $nb_days++;
+ $y = substr($row['period'], 0, 4);
+ $m = (int)substr($row['period'], 4, 2);
+ if ( ! isset($items[$y]) )
+ {
+ $items[$y] = array('nb_images'=>0, 'children'=>array() );
+ }
+ $items[$y]['children'][$m] = $row['count'];
+ $items[$y]['nb_images'] += $row['count'];
+ }
+ //echo ('<pre>'. var_export($items, true) . '</pre>');
+ if (count($items)==1)
+ {// only one year exists so bail out to year view
+ list($y) = array_keys($items);
+ $page['chronology_date'][CYEAR] = $y;
+ return false;
}
- }
- elseif ( is_numeric($month) )
- {
- $nb_days = $md[ $month ];
- }
- else
- {
- $nb_days = 31;
- }
- return $nb_days;
-}
-function build_global_calendar(&$tpl_var)
-{
- global $page;
-
- assert( count($page['chronology_date']) == 0 );
- $query='
-SELECT '.pwg_db_get_date_YYYYMM($this->date_field).' as period,
- COUNT(distinct id) as count';
- $query.= $this->inner_sql;
- $query.= $this->get_date_where();
- $query.= '
- GROUP BY period
- ORDER BY '.pwg_db_get_year($this->date_field).' DESC, '.pwg_db_get_month($this->date_field).' ASC';
-
- $result = pwg_query($query);
- $items=array();
- while ($row = pwg_db_fetch_assoc($result))
- {
- $y = substr($row['period'], 0, 4);
- $m = (int)substr($row['period'], 4, 2);
- if ( ! isset($items[$y]) )
+ global $lang;
+ foreach ( $items as $year=>$year_data)
{
- $items[$y] = array('nb_images'=>0, 'children'=>array() );
- }
- $items[$y]['children'][$m] = $row['count'];
- $items[$y]['nb_images'] += $row['count'];
- }
- //echo ('<pre>'. var_export($items, true) . '</pre>');
- if (count($items)==1)
- {// only one year exists so bail out to year view
- list($y) = array_keys($items);
- $page['chronology_date'][CYEAR] = $y;
- return false;
- }
+ $chronology_date = array( $year );
+ $url = duplicate_index_url( array('chronology_date'=>$chronology_date) );
- global $lang;
- foreach ( $items as $year=>$year_data)
- {
- $chronology_date = array( $year );
- $url = duplicate_index_url( array('chronology_date'=>$chronology_date) );
+ $nav_bar = $this->get_nav_bar_from_items( $chronology_date,
+ $year_data['children'], false, false, $lang['month'] );
- $nav_bar = $this->get_nav_bar_from_items( $chronology_date,
- $year_data['children'], false, false, $lang['month'] );
+ $tpl_var['calendar_bars'][] =
+ array(
+ 'U_HEAD' => $url,
+ 'NB_IMAGES' => $year_data['nb_images'],
+ 'HEAD_LABEL' => $year,
+ 'items' => $nav_bar,
+ );
+ }
- $tpl_var['calendar_bars'][] =
- array(
- 'U_HEAD' => $url,
- 'NB_IMAGES' => $year_data['nb_images'],
- 'HEAD_LABEL' => $year,
- 'items' => $nav_bar,
- );
+ return true;
}
- return true;
-}
-function build_year_calendar(&$tpl_var)
-{
- global $page;
-
- assert( count($page['chronology_date']) == 1 );
- $query='SELECT '.pwg_db_get_date_MMDD($this->date_field).' as period,
- COUNT(DISTINCT id) as count';
- $query.= $this->inner_sql;
- $query.= $this->get_date_where();
- $query.= '
- GROUP BY period
- ORDER BY period ASC';
-
- $result = pwg_query($query);
- $items=array();
- while ($row = pwg_db_fetch_assoc($result))
+ /**
+ * Build year calendar and assign the result in _$tpl_var_
+ *
+ * @param array $tpl_var
+ * @return bool
+ */
+ protected function build_year_calendar(&$tpl_var)
{
- $m = (int)substr($row['period'], 0, 2);
- $d = substr($row['period'], 2, 2);
- if ( ! isset($items[$m]) )
+ global $page;
+
+ assert( count($page['chronology_date']) == 1 );
+ $query='SELECT '.pwg_db_get_date_MMDD($this->date_field).' as period,
+ COUNT(DISTINCT id) as count';
+ $query.= $this->inner_sql;
+ $query.= $this->get_date_where();
+ $query.= '
+ GROUP BY period
+ ORDER BY period ASC';
+
+ $result = pwg_query($query);
+ $items=array();
+ while ($row = pwg_db_fetch_assoc($result))
{
- $items[$m] = array('nb_images'=>0, 'children'=>array() );
+ $m = (int)substr($row['period'], 0, 2);
+ $d = substr($row['period'], 2, 2);
+ if ( ! isset($items[$m]) )
+ {
+ $items[$m] = array('nb_images'=>0, 'children'=>array() );
+ }
+ $items[$m]['children'][$d] = $row['count'];
+ $items[$m]['nb_images'] += $row['count'];
}
- $items[$m]['children'][$d] = $row['count'];
- $items[$m]['nb_images'] += $row['count'];
- }
- if (count($items)==1)
- { // only one month exists so bail out to month view
- list($m) = array_keys($items);
- $page['chronology_date'][CMONTH] = $m;
- return false;
- }
- global $lang;
- foreach ( $items as $month=>$month_data)
- {
- $chronology_date = array( $page['chronology_date'][CYEAR], $month );
- $url = duplicate_index_url( array('chronology_date'=>$chronology_date) );
-
- $nav_bar = $this->get_nav_bar_from_items( $chronology_date,
- $month_data['children'], false );
+ if (count($items)==1)
+ { // only one month exists so bail out to month view
+ list($m) = array_keys($items);
+ $page['chronology_date'][CMONTH] = $m;
+ return false;
+ }
+ global $lang;
+ foreach ( $items as $month=>$month_data)
+ {
+ $chronology_date = array( $page['chronology_date'][CYEAR], $month );
+ $url = duplicate_index_url( array('chronology_date'=>$chronology_date) );
- $tpl_var['calendar_bars'][] =
- array(
- 'U_HEAD' => $url,
- 'NB_IMAGES' => $month_data['nb_images'],
- 'HEAD_LABEL' => $lang['month'][$month],
- 'items' => $nav_bar,
- );
- }
- return true;
+ $nav_bar = $this->get_nav_bar_from_items( $chronology_date,
+ $month_data['children'], false );
-}
+ $tpl_var['calendar_bars'][] =
+ array(
+ 'U_HEAD' => $url,
+ 'NB_IMAGES' => $month_data['nb_images'],
+ 'HEAD_LABEL' => $lang['month'][$month],
+ 'items' => $nav_bar,
+ );
+ }
-function build_month_calendar(&$tpl_var)
-{
- global $page, $lang, $conf;
-
- $query='SELECT '.pwg_db_get_dayofmonth($this->date_field).' as period,
- COUNT(DISTINCT id) as count';
- $query.= $this->inner_sql;
- $query.= $this->get_date_where();
- $query.= '
- GROUP BY period
- ORDER BY period ASC';
-
- $items=array();
- $result = pwg_query($query);
- while ($row = pwg_db_fetch_assoc($result))
- {
- $d = (int)$row['period'];
- $items[$d] = array('nb_images'=>$row['count']);
+ return true;
}
- foreach ( $items as $day=>$data)
+ /**
+ * Build month calendar and assign the result in _$tpl_var_
+ *
+ * @param array $tpl_var
+ * @return bool
+ */
+ protected function build_month_calendar(&$tpl_var)
{
- $page['chronology_date'][CDAY]=$day;
- $query = '
-SELECT id, file,representative_ext,path,width,height,rotation, '.pwg_db_get_dayofweek($this->date_field).'-1 as dow';
+ global $page, $lang, $conf;
+
+ $query='SELECT '.pwg_db_get_dayofmonth($this->date_field).' as period,
+ COUNT(DISTINCT id) as count';
$query.= $this->inner_sql;
$query.= $this->get_date_where();
$query.= '
- ORDER BY '.DB_RANDOM_FUNCTION.'()
- LIMIT 1';
- unset ( $page['chronology_date'][CDAY] );
-
- $row = pwg_db_fetch_assoc(pwg_query($query));
- $derivative = new DerivativeImage(IMG_SQUARE, new SrcImage($row));
- $items[$day]['derivative'] = $derivative;
- $items[$day]['file'] = $row['file'];
- $items[$day]['dow'] = $row['dow'];
- }
+ GROUP BY period
+ ORDER BY period ASC';
- if ( !empty($items) )
- {
- list($known_day) = array_keys($items);
- $known_dow = $items[$known_day]['dow'];
- $first_day_dow = ($known_dow-($known_day-1))%7;
- if ($first_day_dow<0)
+ $items=array();
+ $result = pwg_query($query);
+ while ($row = pwg_db_fetch_assoc($result))
{
- $first_day_dow += 7;
+ $d = (int)$row['period'];
+ $items[$d] = array('nb_images'=>$row['count']);
}
- //first_day_dow = week day corresponding to the first day of this month
- $wday_labels = $lang['day'];
- if ('monday' == $conf['week_starts_on'])
+ foreach ( $items as $day=>$data)
{
- if ($first_day_dow==0)
- {
- $first_day_dow = 6;
- }
- else
+ $page['chronology_date'][CDAY]=$day;
+ $query = '
+ SELECT id, file,representative_ext,path,width,height,rotation, '.pwg_db_get_dayofweek($this->date_field).'-1 as dow';
+ $query.= $this->inner_sql;
+ $query.= $this->get_date_where();
+ $query.= '
+ ORDER BY '.DB_RANDOM_FUNCTION.'()
+ LIMIT 1';
+ unset ( $page['chronology_date'][CDAY] );
+
+ $row = pwg_db_fetch_assoc(pwg_query($query));
+ $derivative = new DerivativeImage(IMG_SQUARE, new SrcImage($row));
+ $items[$day]['derivative'] = $derivative;
+ $items[$day]['file'] = $row['file'];
+ $items[$day]['dow'] = $row['dow'];
+ }
+
+ if ( !empty($items) )
+ {
+ list($known_day) = array_keys($items);
+ $known_dow = $items[$known_day]['dow'];
+ $first_day_dow = ($known_dow-($known_day-1))%7;
+ if ($first_day_dow<0)
{
- $first_day_dow -= 1;
+ $first_day_dow += 7;
}
+ //first_day_dow = week day corresponding to the first day of this month
+ $wday_labels = $lang['day'];
- array_push( $wday_labels, array_shift($wday_labels) );
- }
+ if ('monday' == $conf['week_starts_on'])
+ {
+ if ($first_day_dow==0)
+ {
+ $first_day_dow = 6;
+ }
+ else
+ {
+ $first_day_dow -= 1;
+ }
- list($cell_width, $cell_height) = ImageStdParams::get_by_type(IMG_SQUARE)->sizing->ideal_size;
- if ($cell_width>120)
- {
- $cell_width = $cell_height = 120;
- }
+ $wday_labels[] = array_shift($wday_labels);
+ }
- $tpl_weeks = array();
- $tpl_crt_week = array();
+ list($cell_width, $cell_height) = ImageStdParams::get_by_type(IMG_SQUARE)->sizing->ideal_size;
- //fill the empty days in the week before first day of this month
- for ($i=0; $i<$first_day_dow; $i++)
- {
- $tpl_crt_week[] = array();
- }
+ $tpl_weeks = array();
+ $tpl_crt_week = array();
- for ( $day = 1;
- $day <= $this->get_all_days_in_month(
- $page['chronology_date'][CYEAR], $page['chronology_date'][CMONTH]
- );
- $day++)
- {
- $dow = ($first_day_dow + $day-1)%7;
- if ($dow==0 and $day!=1)
+ //fill the empty days in the week before first day of this month
+ for ($i=0; $i<$first_day_dow; $i++)
{
- $tpl_weeks[] = $tpl_crt_week; // add finished week to week list
- $tpl_crt_week = array(); // start new week
+ $tpl_crt_week[] = array();
}
- if ( !isset($items[$day]) )
- {// empty day
- $tpl_crt_week[] =
- array(
- 'DAY' => $day
- );
- }
- else
+ for ( $day = 1;
+ $day <= $this->get_all_days_in_month(
+ $page['chronology_date'][CYEAR], $page['chronology_date'][CMONTH]
+ );
+ $day++)
{
- list($tn_width,$tn_height) = $items[$day]['derivative']->get_size();
-
- // now need to fit the thumbnail of size tn_size within
- // a cell of size cell_size by playing with CSS position (left/top)
- // and the width and height of <img>.
- $ratio_w = $tn_width/$cell_width;
- $ratio_h = $tn_height/$cell_height;
-
- $pos_top=$pos_left=0;
- $css_style = '';
-
- if ( $ratio_w>1 and $ratio_h>1)
- {// cell completely smaller than the thumbnail so we will let the browser
- // resize the thumbnail
- if ($ratio_w > $ratio_h )
- {// thumbnail ratio compared to cell -> wide format
- $css_style = 'height:'.$cell_height.'px;';
- $browser_img_width = $cell_height*$tn_width/$tn_height;
- $pos_left = ($browser_img_width-$cell_width)/2;
- }
- else
- {
- $css_style = 'width:'.$cell_width.'px;';
- $browser_img_height = $cell_width*$tn_height/$tn_width;
- $pos_top = ($browser_img_height-$cell_height)/2;
- }
- }
- else
+ $dow = ($first_day_dow + $day-1)%7;
+ if ($dow==0 and $day!=1)
{
- $pos_left = ($tn_width-$cell_width)/2;
- $pos_top = ($tn_height-$cell_height)/2;
+ $tpl_weeks[] = $tpl_crt_week; // add finished week to week list
+ $tpl_crt_week = array(); // start new week
}
- if ( round($pos_left)!=0)
- {
- $css_style.='left:'.round(-$pos_left).'px;';
+ if ( !isset($items[$day]) )
+ {// empty day
+ $tpl_crt_week[] =
+ array(
+ 'DAY' => $day
+ );
}
- if ( round($pos_top)!=0)
+ else
{
- $css_style.='top:'.round(-$pos_top).'px;';
- }
- $url = duplicate_index_url(
+ $url = duplicate_index_url(
+ array(
+ 'chronology_date' =>
+ array(
+ $page['chronology_date'][CYEAR],
+ $page['chronology_date'][CMONTH],
+ $day
+ )
+ )
+ );
+
+ $tpl_crt_week[] =
array(
- 'chronology_date' =>
- array(
- $page['chronology_date'][CYEAR],
- $page['chronology_date'][CMONTH],
- $day
- )
- )
- );
-
- $tpl_crt_week[] =
+ 'DAY' => $day,
+ 'DOW' => $dow,
+ 'NB_ELEMENTS' => $items[$day]['nb_images'],
+ 'IMAGE' => $items[$day]['derivative']->get_url(),
+ 'U_IMG_LINK' => $url,
+ 'IMAGE_ALT' => $items[$day]['file'],
+ );
+ }
+ }
+ //fill the empty days in the week after the last day of this month
+ while ( $dow<6 )
+ {
+ $tpl_crt_week[] = array();
+ $dow++;
+ }
+ $tpl_weeks[] = $tpl_crt_week;
+
+ $tpl_var['month_view'] =
array(
- 'DAY' => $day,
- 'DOW' => $dow,
- 'NB_ELEMENTS' => $items[$day]['nb_images'],
- 'IMAGE' => $items[$day]['derivative']->get_url(),
- 'U_IMG_LINK' => $url,
- 'IMAGE_STYLE' => $css_style,
- 'IMAGE_ALT' => $items[$day]['file'],
+ 'CELL_WIDTH' => $cell_width,
+ 'CELL_HEIGHT' => $cell_height,
+ 'wday_labels' => $wday_labels,
+ 'weeks' => $tpl_weeks,
);
- }
}
- //fill the empty days in the week after the last day of this month
- while ( $dow<6 )
- {
- $tpl_crt_week[] = array();
- $dow++;
- }
- $tpl_weeks[] = $tpl_crt_week;
- $tpl_var['month_view'] =
- array(
- 'CELL_WIDTH' => $cell_width,
- 'CELL_HEIGHT' => $cell_height,
- 'wday_labels' => $wday_labels,
- 'weeks' => $tpl_weeks,
- );
+ return true;
}
-
- return true;
}
-}
?> \ No newline at end of file
diff --git a/include/calendar_weekly.class.php b/include/calendar_weekly.class.php
index 548631338..d35e294b5 100644
--- a/include/calendar_weekly.class.php
+++ b/include/calendar_weekly.class.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,21 +21,28 @@
// | USA. |
// +-----------------------------------------------------------------------+
+/**
+ * @package functions\calendar
+ */
+
include_once(PHPWG_ROOT_PATH.'include/calendar_base.class.php');
-define ('CYEAR', 0);
-define ('CWEEK', 1);
-define ('CDAY', 2);
+/** level of year view */
+define('CYEAR', 0);
+/** level of week view */
+define('CWEEK', 1);
+/** level of day view */
+define('CDAY', 2);
+
/**
* Weekly calendar style (composed of years/week in years and days in week)
*/
class Calendar extends CalendarBase
{
-
/**
* Initialize the calendar
- * @param string inner_sql used for queries (INNER JOIN or normal)
+ * @param string $inner_sql
*/
function initialize($inner_sql)
{
@@ -44,7 +51,7 @@ class Calendar extends CalendarBase
$week_no_labels=array();
for ($i=1; $i<=53; $i++)
{
- $week_no_labels[$i] = sprintf( l10n("Week %d"), $i);
+ $week_no_labels[$i] = l10n('Week %d', $i);
//$week_no_labels[$i] = $i;
}
@@ -68,72 +75,70 @@ class Calendar extends CalendarBase
{
$this->calendar_levels[CWEEK]['sql'] = pwg_db_get_week($this->date_field, 5).'+1';
$this->calendar_levels[CDAY]['sql'] = pwg_db_get_weekday($this->date_field);
- array_push( $this->calendar_levels[CDAY]['labels'],
- array_shift( $this->calendar_levels[CDAY]['labels'] ) );
+ $this->calendar_levels[CDAY]['labels'][] = array_shift($this->calendar_levels[CDAY]['labels']);
}
}
-/**
- * Generate navigation bars for category page
- * @return boolean false to indicate that thumbnails where not included here
- */
-function generate_category_content()
-{
- global $conf, $page;
-
- if ( count($page['chronology_date'])==0 )
- {
- $this->build_nav_bar(CYEAR); // years
- }
- if ( count($page['chronology_date'])==1 )
- {
- $this->build_nav_bar(CWEEK, array()); // week nav bar 1-53
- }
- if ( count($page['chronology_date'])==2 )
+ /**
+ * Generate navigation bars for category page.
+ *
+ * @return boolean false indicates that thumbnails where not included
+ */
+ function generate_category_content()
{
- $this->build_nav_bar(CDAY); // days nav bar Mon-Sun
- }
- $this->build_next_prev();
- return false;
-}
-
+ global $conf, $page;
-/**
- * Returns a sql where subquery for the date field
- * @param int max_levels return the where up to this level
- * (e.g. 2=only year and week in year)
- * @return string
- */
-function get_date_where($max_levels=3)
-{
- global $page;
- $date = $page['chronology_date'];
- while (count($date)>$max_levels)
- {
- array_pop($date);
- }
- $res = '';
- if (isset($date[CYEAR]) and $date[CYEAR]!=='any')
- {
- $y = $date[CYEAR];
- $res = " AND $this->date_field BETWEEN '$y-01-01' AND '$y-12-31 23:59:59'";
+ if ( count($page['chronology_date'])==0 )
+ {
+ $this->build_nav_bar(CYEAR); // years
+ }
+ if ( count($page['chronology_date'])==1 )
+ {
+ $this->build_nav_bar(CWEEK, array()); // week nav bar 1-53
+ }
+ if ( count($page['chronology_date'])==2 )
+ {
+ $this->build_nav_bar(CDAY); // days nav bar Mon-Sun
+ }
+ $this->build_next_prev();
+ return false;
}
- if (isset($date[CWEEK]) and $date[CWEEK]!=='any')
- {
- $res .= ' AND '.$this->calendar_levels[CWEEK]['sql'].'='.$date[CWEEK];
- }
- if (isset($date[CDAY]) and $date[CDAY]!=='any')
- {
- $res .= ' AND '.$this->calendar_levels[CDAY]['sql'].'='.$date[CDAY];
- }
- if (empty($res))
+ /**
+ * Returns a sql WHERE subquery for the date field.
+ *
+ * @param int $max_levels (e.g. 2=only year and month)
+ * @return string
+ */
+ function get_date_where($max_levels=3)
{
- $res = ' AND '.$this->date_field.' IS NOT NULL';
- }
- return $res;
-}
+ global $page;
+ $date = $page['chronology_date'];
+ while (count($date)>$max_levels)
+ {
+ array_pop($date);
+ }
+ $res = '';
+ if (isset($date[CYEAR]) and $date[CYEAR]!=='any')
+ {
+ $y = $date[CYEAR];
+ $res = " AND $this->date_field BETWEEN '$y-01-01' AND '$y-12-31 23:59:59'";
+ }
+ if (isset($date[CWEEK]) and $date[CWEEK]!=='any')
+ {
+ $res .= ' AND '.$this->calendar_levels[CWEEK]['sql'].'='.$date[CWEEK];
+ }
+ if (isset($date[CDAY]) and $date[CDAY]!=='any')
+ {
+ $res .= ' AND '.$this->calendar_levels[CDAY]['sql'].'='.$date[CDAY];
+ }
+ if (empty($res))
+ {
+ $res = ' AND '.$this->date_field.' IS NOT NULL';
+ }
+ return $res;
+ }
}
-?>
+?> \ No newline at end of file
diff --git a/include/category_cats.inc.php b/include/category_cats.inc.php
index 414bc24ca..bb048297f 100644
--- a/include/category_cats.inc.php
+++ b/include/category_cats.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -37,6 +37,7 @@ SELECT
date_last,
max_date_last,
count_images,
+ nb_categories,
count_categories
FROM '.CATEGORIES_TABLE.' c
INNER JOIN '.USER_CACHE_CATEGORIES_TABLE.' ucc
@@ -46,7 +47,7 @@ SELECT
if ('recent_cats' == $page['section'])
{
$query.= '
- WHERE date_last >= '.pwg_db_get_recent_period_expression($user['recent_period']);
+ WHERE '.get_recent_photos_sql('date_last');
}
else
{
@@ -66,9 +67,6 @@ if ('recent_cats' != $page['section'])
ORDER BY rank';
}
-$query.= '
-;';
-
$result = pwg_query($query);
$categories = array();
$category_ids = array();
@@ -83,55 +81,52 @@ while ($row = pwg_db_fetch_assoc($result))
{
$image_id = $row['user_representative_picture_id'];
}
- else if (!empty($row['representative_picture_id']))
+ elseif (!empty($row['representative_picture_id']))
{ // if a representative picture is set, it has priority
$image_id = $row['representative_picture_id'];
}
- else if ($conf['allow_random_representative'])
- {
- // searching a random representant among elements in sub-categories
+ elseif ($conf['allow_random_representative'])
+ { // searching a random representant among elements in sub-categories
$image_id = get_random_image_in_category($row);
}
- else
+ elseif ($row['count_categories']>0 and $row['count_images']>0)
{ // searching a random representant among representant of sub-categories
- if ($row['count_categories']>0 and $row['count_images']>0)
+ $query = '
+SELECT representative_picture_id
+ FROM '.CATEGORIES_TABLE.' INNER JOIN '.USER_CACHE_CATEGORIES_TABLE.'
+ ON id = cat_id and user_id = '.$user['id'].'
+ WHERE uppercats LIKE \''.$row['uppercats'].',%\'
+ AND representative_picture_id IS NOT NULL'
+ .get_sql_condition_FandF
+ (
+ array
+ (
+ 'visible_categories' => 'id',
+ ),
+ "\n AND"
+ ).'
+ ORDER BY '.DB_RANDOM_FUNCTION.'()
+ LIMIT 1
+;';
+ $subresult = pwg_query($query);
+ if (pwg_db_num_rows($subresult) > 0)
{
- $query = '
- SELECT representative_picture_id
- FROM '.CATEGORIES_TABLE.' INNER JOIN '.USER_CACHE_CATEGORIES_TABLE.'
- ON id = cat_id and user_id = '.$user['id'].'
- WHERE uppercats LIKE \''.$row['uppercats'].',%\'
- AND representative_picture_id IS NOT NULL'
- .get_sql_condition_FandF
- (
- array
- (
- 'visible_categories' => 'id',
- ),
- "\n AND"
- ).'
- ORDER BY '.DB_RANDOM_FUNCTION.'()
- LIMIT 1
- ;';
- $subresult = pwg_query($query);
- if (pwg_db_num_rows($subresult) > 0)
- {
- list($image_id) = pwg_db_fetch_row($subresult);
- }
+ list($image_id) = pwg_db_fetch_row($subresult);
}
}
+
if (isset($image_id))
{
if ($conf['representative_cache_on_subcats'] and $row['user_representative_picture_id'] != $image_id)
{
- $user_representative_updates_for[ $user['id'].'#'.$row['id'] ] = $image_id;
+ $user_representative_updates_for[ $row['id'] ] = $image_id;
}
$row['representative_picture_id'] = $image_id;
- array_push($image_ids, $image_id);
- array_push($categories, $row);
- array_push($category_ids, $row['id']);
+ $image_ids[] = $image_id;
+ $categories[] = $row;
+ $category_ids[] = $row['id'];
}
unset($image_id);
}
@@ -212,12 +207,12 @@ SELECT *
if (isset($image_id) and !in_array($image_id, $image_ids))
{
- array_push($new_image_ids, $image_id);
+ $new_image_ids[] = $image_id;
}
if ($conf['representative_cache_on_level'])
{
- $user_representative_updates_for[ $user['id'].'#'.$category['id'] ] = $image_id;
+ $user_representative_updates_for[ $category['id'] ] = $image_id;
}
$category['representative_picture_id'] = $image_id;
@@ -252,18 +247,14 @@ if (count($user_representative_updates_for))
{
$updates = array();
- foreach ($user_representative_updates_for as $user_cat => $image_id)
+ foreach ($user_representative_updates_for as $cat_id => $image_id)
{
- list($user_id, $cat_id) = explode('#', $user_cat);
-
- array_push(
- $updates,
+ $updates[] =
array(
- 'user_id' => $user_id,
+ 'user_id' => $user['id'],
'cat_id' => $cat_id,
'user_representative_picture_id' => $image_id,
- )
- );
+ );
}
mass_updates(
@@ -305,7 +296,7 @@ if (count($categories) > 0)
if ($page['section']=='recent_cats')
{
- $name = get_cat_display_name_cache($category['uppercats'], null, false);
+ $name = get_cat_display_name_cache($category['uppercats'], null);
}
else
{
@@ -361,8 +352,8 @@ if (count($categories) > 0)
}
else
{
- $info = sprintf(
- l10n('from %s to %s'),
+ $info = l10n(
+ 'from %s to %s',
format_date($from),
format_date($to)
);
diff --git a/include/category_default.inc.php b/include/category_default.inc.php
index 41f83f9e1..59f2195b0 100644
--- a/include/category_default.inc.php
+++ b/include/category_default.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -111,7 +111,7 @@ foreach ($pictures as $row)
}
$name = render_element_name($row);
- $desc = render_element_description($row);
+ $desc = render_element_description($row, 'main_page_element_description');
$tpl_var = array_merge( $row, array(
'TN_ALT' => htmlspecialchars(strip_tags($name)),
diff --git a/include/class_smtp_mail.inc.php b/include/class_smtp_mail.inc.php
deleted file mode 100644
index 623e23045..000000000
--- a/include/class_smtp_mail.inc.php
+++ /dev/null
@@ -1,185 +0,0 @@
-<?php
-// +-----------------------------------------------------------------------+
-// | Piwigo - a PHP based photo gallery |
-// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
-// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
-// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
-// +-----------------------------------------------------------------------+
-// | 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 |
-// | |
-// | This program is distributed in the hope that it will be useful, but |
-// | WITHOUT ANY WARRANTY; without even the implied warranty of |
-// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
-// | General Public License for more details. |
-// | |
-// | You should have received a copy of the GNU General Public License |
-// | along with this program; if not, write to the Free Software |
-// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
-// | USA. |
-// +-----------------------------------------------------------------------+
-
-// These function were originally a part of the punBB.
-
-class smtp_mail
-{
- var $socket;
- var $no_error;
- var $host;
- var $user;
- var $password;
- var $email_webmaster;
-
- function smtp_mail($host, $user, $password, $email_webmaster)
- {
- $this->host = $host;
- $this->user = $user;
- $this->password = $password;
- $this->email_webmaster = $email_webmaster;
- }
-
- // Adaptation of server_parse
- function server_parse($expected_response)
- {
- if ($this->no_error)
- {
- $server_response = '';
- while (substr($server_response, 3, 1) != ' ')
- {
- if (!($server_response = fgets($this->socket, 256)))
- {
- trigger_error('Couldn\'t get mail server response codes.', E_USER_WARNING);
- $this->no_error = false;
- }
- }
- }
-
- if ($this->no_error)
- {
- if (!(substr($server_response, 0, 3) == $expected_response))
- {
- trigger_error('Unable to send e-mail. Error message reported by the SMTP server: "'.$server_response.'"', E_USER_WARNING);
- $this->no_error = false;
- }
- }
- return $this->no_error;
- }
-
- function server_write($s)
- {
- $this->no_error = $this->no_error && (fwrite($this->socket, $s) !== false);
- return $this->no_error;
- }
-
- function add_recipients(&$recipients, $headers, $type_header)
- {
- if (preg_match('/^\s*'.$type_header.'\s*:.*/mi', $headers, $matches) != 0)
- {
- $list = explode(',', $matches[0]);
- foreach ($list as $email)
- {
- if (strpos($email, '<') !== false)
- {
- $email = preg_replace('/.*<(.*)>.*/i', '$1', $email);
- }
- $recipients[] = trim($email);
- }
- }
- }
-
- // Adaptation of pun_mail
- function mail($to, $subject, $message, $headers = '')
- {
- $this->no_error = true;
-
- // Are we using port 25 or a custom port?
- if (strpos($this->host, ':') !== false)
- {
- list($smtp_host, $smtp_port) = explode(':', $this->host);
- }
- else
- {
- $smtp_host = $this->host;
- $smtp_port = 25;
- }
-
- if ($this->socket = fsockopen($smtp_host, $smtp_port, $errno, $errstr, 15))
- {
- $this->server_parse('220');
-
- if (!empty($this->user) && !empty($this->password))
- {
- $this->server_write('EHLO '.$smtp_host."\r\n");
- $this->server_parse('250');
-
- $this->server_write('AUTH LOGIN'."\r\n");
- $this->server_parse('334');
-
- $this->server_write(base64_encode($this->user)."\r\n");
- $this->no_error = $this->no_error && $this->no_error = $this->server_parse('334');
-
- $this->server_write(base64_encode($this->password)."\r\n");
- $this->server_parse('235');
- }
- else
- {
- $this->server_write('HELO '.$smtp_host."\r\n");
- $this->server_parse('250');
- }
-
- $this->server_write('MAIL FROM:<'.$this->email_webmaster.'>'."\r\n");
- $this->server_parse('250');
-
- // Add "To:" on headers if there are included
- if ((preg_match('/^\s*to\s*:.*/mi', $headers) === 0) and !empty($to))
- {
- $to_header = 'To:'.implode(',', array_map(create_function('$email','return "<".$email.">";'), explode(',', $to)));
- }
- else
- {
- $to_header = '';
- }
-
- if (!empty($to))
- {
- $recipients = explode(',', $to);
- }
- else
- {
- $recipients = array();
- }
-
- $this->add_recipients($recipients, $headers, 'Cc');
- $this->add_recipients($recipients, $headers, 'Bcc');
-
- @reset($recipients);
- while (list(, $email) = @each($recipients))
- {
- $this->server_write('RCPT TO:<'.$email.'>'."\r\n");
- $this->server_parse('250');
- }
-
- $this->server_write('DATA'."\r\n");
- $this->server_parse('354');
-
- $this->server_write('Date: '.date('D, j M Y H:i:s O')."\r\n");
- $this->server_write('Subject:'.$subject."\r\n".(empty($to_header) ? "" : $to_header."\r\n").$headers."\r\n\r\n".$message."\r\n");
- $this->server_write('.'."\r\n");
- $this->server_parse('250');
-
- $this->server_write('QUIT'."\r\n");
- fclose($this->socket);
- }
- else
- {
- trigger_error('Could not connect to smtp host "'.$this->host.'" ('.$errno.') ('.$errstr.')', E_USER_WARNING);
- $this->no_error = false;;
- }
-
- return $this->no_error;
- }
-}
-
-?>
diff --git a/include/common.inc.php b/include/common.inc.php
index 6e06b75fb..35d3fad92 100644
--- a/include/common.inc.php
+++ b/include/common.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -155,6 +155,9 @@ if (in_array( substr($user['language'],0,2), array('fr','it','de','es','pl','hu'
elseif ('zh_CN' == $user['language']) {
define('PHPWG_DOMAIN', 'cn.piwigo.org');
}
+elseif ('pt_BR' == $user['language']) {
+ define('PHPWG_DOMAIN', 'br.piwigo.org');
+}
else {
define('PHPWG_DOMAIN', 'piwigo.org');
}
diff --git a/include/config_default.inc.php b/include/config_default.inc.php
index 2a9ea1cad..7d6eda301 100644
--- a/include/config_default.inc.php
+++ b/include/config_default.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -229,40 +229,6 @@ $conf['users_page'] = 20;
// image level permissions available in the admin interface
$conf['available_permission_levels'] = array(0,1,2,4,8);
-// mail_options: only set it true if you have a send mail warning with
-// "options" parameter missing on mail() function execution.
-$conf['mail_options'] = false;
-
-// send_bcc_mail_webmaster: send bcc mail to webmaster. Set true for debug
-// or test.
-$conf['send_bcc_mail_webmaster'] = false;
-
-// default_email_format:
-// Define the default email format use to send email
-// Value could be text/plain or text/html
-$conf['default_email_format'] = 'text/html';
-
-// alternative_email_format:
-// Define the alternative email format use to send email
-// Value could be text/plain or text/html
-$conf['alternative_email_format'] = 'text/plain';
-
-// define the name of sender mail:
-// If value is empty, gallery title is used
-$conf['mail_sender_name'] = '';
-
-// smtp configuration
-// (work if fsockopen function is allowed for smtp port)
-// smtp_host: smtp server host
-// if null, regular mail function is used
-// format: hoststring[:port]
-// exemple: smtp.pwg.net:21
-// smtp_user/smtp_password: user & password for smtp identication
-$conf['smtp_host'] = '';
-$conf['smtp_user'] = '';
-$conf['smtp_password'] = '';
-
-
// check_upgrade_feed: check if there are database upgrade required. Set to
// true, a message will strongly encourage you to upgrade your database if
// needed.
@@ -305,6 +271,36 @@ $conf['ext_imagick_dir'] = '';
$conf['comments_page_nb_comments'] = 10;
// +-----------------------------------------------------------------------+
+// | email |
+// +-----------------------------------------------------------------------+
+
+// send_bcc_mail_webmaster: send bcc mail to webmaster. Set true for debug
+// or test.
+$conf['send_bcc_mail_webmaster'] = false;
+
+// define the name of sender mail: if value is empty, gallery title is used
+$conf['mail_sender_name'] = '';
+
+// define the email of sender mail: if valie is empty, webmaster email is used
+$conf['mail_sender_email'] = '';
+
+// set true to allow text/html emails
+$conf['mail_allow_html'] = true;
+
+// smtp configuration (work if fsockopen function is allowed for smtp port)
+// smtp_host: smtp server host
+// if null, regular mail function is used
+// format: hoststring[:port]
+// exemple: smtp.pwg.net:21
+// smtp_user/smtp_password: user & password for smtp identication
+$conf['smtp_host'] = '';
+$conf['smtp_user'] = '';
+$conf['smtp_password'] = '';
+
+// 'ssl' or 'tls'
+$conf['smtp_secure'] = null;
+
+// +-----------------------------------------------------------------------+
// | metadata |
// +-----------------------------------------------------------------------+
@@ -374,6 +370,11 @@ $conf['use_exif_mapping'] = array(
'date_creation' => 'DateTimeOriginal'
);
+// allow_html_in_metadata: in case the origin of the photo is unsecure (user
+// upload), we remove HTML tags to avoid XSS (malicious execution of
+// javascript)
+$conf['allow_html_in_metadata'] = false;
+
// +-----------------------------------------------------------------------+
// | sessions |
// +-----------------------------------------------------------------------+
@@ -485,7 +486,7 @@ $conf['apache_authentication'] = false;
// delete from piwigo_user_infos;
// delete from piwigo_sessions;
// delete from piwigo_rate;
-// update piwigo_images set rating_score = null;
+// update piwigo_images set rating_score = null, added_by = <webmaster_id>;
// delete from piwigo_caddie;
// delete from piwigo_favorites;
//
@@ -661,6 +662,9 @@ $conf['ws_log_filepath'] = '/tmp/piwigo_ws.log';
// Maximum number of images to be returned foreach call to the web service
$conf['ws_max_images_per_page'] = 500;
+// Maximum number of users to be returned foreach call to the web service
+$conf['ws_max_users_per_page'] = 1000;
+
// Display a link to subscribe to Piwigo Announcements Newsletter
$conf['show_newsletter_subscription'] = true;
@@ -775,10 +779,24 @@ $conf['chmod_value']= substr_compare(PHP_SAPI, 'apa', 0, 3)==0 ? 0777 : 0755;
// 'small', 'medium' or 'large'
$conf['derivative_default_size'] = 'medium';
+// below which size (in pixels, ie width*height) do we remove metadata
+// EXIF/IPTC... from derivative?
+$conf['derivatives_strip_metadata_threshold'] = 256000;
+
//Maximum Ajax requests at once, for thumbnails on-the-fly generation
$conf['max_requests']=3;
// one of '', 'images', 'all'
//TODO: Put this in admin and also manage .htaccess in #sites and upload folders
$conf['original_url_protection'] = '';
-?> \ No newline at end of file
+
+
+// Default behaviour when a new album is created: should the new album inherit the group/user
+// permissions from its parent? Note that config is only used for Ftp synchro,
+// and if that option is not explicitly transmit when the album is created.
+$conf['inheritance_by_default'] = false;
+
+// 'png' or 'jpg': your uploaded TIF photos will have a representative in
+// JPEG or PNG file format
+$conf['tiff_representative_ext'] = 'png';
+?>
diff --git a/include/constants.php b/include/constants.php
index a255d3927..8e5b92b11 100644
--- a/include/constants.php
+++ b/include/constants.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
// Default settings
-define('PHPWG_VERSION', '2.5.0');
+define('PHPWG_VERSION', '2.6.0');
define('PHPWG_DEFAULT_LANGUAGE', 'en_UK');
define('PHPWG_DEFAULT_TEMPLATE', 'elegant');
diff --git a/include/cssmin.class.php b/include/cssmin.class.php
index aa838e7b2..f84111a00 100644
--- a/include/cssmin.class.php
+++ b/include/cssmin.class.php
@@ -31,5 +31,5 @@
* @license http://opensource.org/licenses/mit-license.php MIT License
* @version 3.0.1
*/
- abstract class aCssToken { abstract public function __toString(); } abstract class aCssRulesetStartToken extends aCssToken { } abstract class aCssRulesetEndToken extends aCssToken { public function __toString() { return "}"; } } abstract class aCssParserPlugin { protected $configuration = array(); protected $parser = null; protected $buffer = ""; public function __construct(CssParser $parser, array $configuration = null) { $this->configuration = $configuration; $this->parser = $parser; } abstract public function getTriggerChars(); abstract public function getTriggerStates(); abstract public function parse($index, $char, $previousChar, $state); } abstract class aCssMinifierPlugin { protected $configuration = array(); protected $minifier = null; public function __construct(CssMinifier $minifier, array $configuration = array()) { $this->configuration = $configuration; $this->minifier = $minifier; } abstract public function apply(aCssToken &$token); abstract public function getTriggerTokens(); } abstract class aCssMinifierFilter { protected $configuration = array(); protected $minifier = null; public function __construct(CssMinifier $minifier, array $configuration = array()) { $this->configuration = $configuration; $this->minifier = $minifier; } abstract public function apply(array &$tokens); } abstract class aCssFormatter { protected $indent = " "; protected $padding = 0; protected $tokens = array(); public function __construct(array $tokens, $indent = null, $padding = null) { $this->tokens = $tokens; $this->indent = !is_null($indent) ? $indent : $this->indent; $this->padding = !is_null($padding) ? $padding : $this->padding; } abstract public function __toString(); } abstract class aCssDeclarationToken extends aCssToken { public $IsImportant = false; public $IsLast = false; public $Property = ""; public $Value = ""; public function __construct($property, $value, $isImportant = false, $isLast = false) { $this->Property = $property; $this->Value = $value; $this->IsImportant = $isImportant; $this->IsLast = $isLast; } public function __toString() { return $this->Property . ":" . $this->Value . ($this->IsImportant ? " !important" : "") . ($this->IsLast ? "" : ";"); } } abstract class aCssAtBlockStartToken extends aCssToken { } abstract class aCssAtBlockEndToken extends aCssToken { public function __toString() { return "}"; } } class CssWhitesmithsFormatter extends aCssFormatter { public function __toString() { $r = array(); $level = 0; for ($i = 0, $l = count($this->tokens); $i < $l; $i++) { $token = $this->tokens[$i]; $class = get_class($token); $indent = str_repeat($this->indent, $level); if ($class === "CssCommentToken") { $lines = array_map("trim", explode("\n", $token->Comment)); for ($ii = 0, $ll = count($lines); $ii < $ll; $ii++) { $r[] = $indent . (substr($lines[$ii], 0, 1) == "*" ? " " : "") . $lines[$ii]; } } elseif ($class === "CssAtCharsetToken") { $r[] = $indent . "@charset " . $token->Charset . ";"; } elseif ($class === "CssAtFontFaceStartToken") { $r[] = $indent . "@font-face"; $r[] = $this->indent . $indent . "{"; $level++; } elseif ($class === "CssAtImportToken") { $r[] = $indent . "@import " . $token->Import . " " . implode(", ", $token->MediaTypes) . ";"; } elseif ($class === "CssAtKeyframesStartToken") { $r[] = $indent . "@keyframes \"" . $token->Name . "\""; $r[] = $this->indent . $indent . "{"; $level++; } elseif ($class === "CssAtMediaStartToken") { $r[] = $indent . "@media " . implode(", ", $token->MediaTypes); $r[] = $this->indent . $indent . "{"; $level++; } elseif ($class === "CssAtPageStartToken") { $r[] = $indent . "@page"; $r[] = $this->indent . $indent . "{"; $level++; } elseif ($class === "CssAtVariablesStartToken") { $r[] = $indent . "@variables " . implode(", ", $token->MediaTypes); $r[] = $this->indent . $indent . "{"; $level++; } elseif ($class === "CssRulesetStartToken" || $class === "CssAtKeyframesRulesetStartToken") { $r[] = $indent . implode(", ", $token->Selectors); $r[] = $this->indent . $indent . "{"; $level++; } elseif ($class == "CssAtFontFaceDeclarationToken" || $class === "CssAtKeyframesRulesetDeclarationToken" || $class === "CssAtPageDeclarationToken" || $class == "CssAtVariablesDeclarationToken" || $class === "CssRulesetDeclarationToken" ) { $declaration = $indent . $token->Property . ": "; if ($this->padding) { $declaration = str_pad($declaration, $this->padding, " ", STR_PAD_RIGHT); } $r[] = $declaration . $token->Value . ($token->IsImportant ? " !important" : "") . ";"; } elseif ($class === "CssAtFontFaceEndToken" || $class === "CssAtMediaEndToken" || $class === "CssAtKeyframesEndToken" || $class === "CssAtKeyframesRulesetEndToken" || $class === "CssAtPageEndToken" || $class === "CssAtVariablesEndToken" || $class === "CssRulesetEndToken" ) { $r[] = $indent . "}"; $level--; } } return implode("\n", $r); } } class CssVariablesMinifierPlugin extends aCssMinifierPlugin { private $reMatch = "/var\((.+)\)/iSU"; private $variables = null; public function getVariables() { return $this->variables; } public function apply(aCssToken &$token) { if (stripos($token->Value, "var") !== false && preg_match_all($this->reMatch, $token->Value, $m)) { $mediaTypes = $token->MediaTypes; if (!in_array("all", $mediaTypes)) { $mediaTypes[] = "all"; } for ($i = 0, $l = count($m[0]); $i < $l; $i++) { $variable = trim($m[1][$i]); foreach ($mediaTypes as $mediaType) { if (isset($this->variables[$mediaType], $this->variables[$mediaType][$variable])) { $token->Value = str_replace($m[0][$i], $this->variables[$mediaType][$variable], $token->Value); continue 2; } } CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": No value found for variable <code>" . $variable . "</code> in media types <code>" . implode(", ", $mediaTypes) . "</code>", (string) $token)); $token = new CssNullToken(); return true; } } return false; } public function getTriggerTokens() { return array ( "CssAtFontFaceDeclarationToken", "CssAtPageDeclarationToken", "CssRulesetDeclarationToken" ); } public function setVariables(array $variables) { $this->variables = $variables; } } class CssVariablesMinifierFilter extends aCssMinifierFilter { public function apply(array &$tokens) { $variables = array(); $defaultMediaTypes = array("all"); $mediaTypes = array(); $remove = array(); for($i = 0, $l = count($tokens); $i < $l; $i++) { if (get_class($tokens[$i]) === "CssAtVariablesStartToken") { $remove[] = $i; $mediaTypes = (count($tokens[$i]->MediaTypes) == 0 ? $defaultMediaTypes : $tokens[$i]->MediaTypes); foreach ($mediaTypes as $mediaType) { if (!isset($variables[$mediaType])) { $variables[$mediaType] = array(); } } for($i = $i; $i < $l; $i++) { if (get_class($tokens[$i]) === "CssAtVariablesDeclarationToken") { foreach ($mediaTypes as $mediaType) { $variables[$mediaType][$tokens[$i]->Property] = $tokens[$i]->Value; } $remove[] = $i; } elseif (get_class($tokens[$i]) === "CssAtVariablesEndToken") { $remove[] = $i; break; } } } } foreach($variables as $mediaType => $null) { foreach($variables[$mediaType] as $variable => $value) { if (stripos($value, "var") !== false && preg_match_all("/var\((.+)\)/iSU", $value, $m)) { for ($i = 0, $l = count($m[0]); $i < $l; $i++) { $variables[$mediaType][$variable] = str_replace($m[0][$i], (isset($variables[$mediaType][$m[1][$i]]) ? $variables[$mediaType][$m[1][$i]] : ""), $variables[$mediaType][$variable]); } } } } foreach ($remove as $i) { $tokens[$i] = null; } if (!($plugin = $this->minifier->getPlugin("CssVariablesMinifierPlugin"))) { CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": The plugin <code>CssVariablesMinifierPlugin</code> was not found but is required for <code>" . __CLASS__ . "</code>")); } else { $plugin->setVariables($variables); } return count($remove); } } class CssUrlParserPlugin extends aCssParserPlugin { public function getTriggerChars() { return array("(", ")"); } public function getTriggerStates() { return false; } public function parse($index, $char, $previousChar, $state) { if ($char === "(" && strtolower(substr($this->parser->getSource(), $index - 3, 4)) === "url(" && $state !== "T_URL") { $this->parser->pushState("T_URL"); $this->parser->setExclusive(__CLASS__); } elseif ($char === "\n" && $previousChar === "\\" && $state === "T_URL") { $this->parser->setBuffer(substr($this->parser->getBuffer(), 0, -2)); } elseif ($char === "\n" && $previousChar !== "\\" && $state === "T_URL") { $line = $this->parser->getBuffer(); $this->parser->setBuffer(substr($this->parser->getBuffer(), 0, -1) . ")"); $this->parser->popState(); $this->parser->unsetExclusive(); CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Unterminated string literal", $line . "_")); } elseif ($char === ")" && $state === "T_URL") { $this->parser->popState(); $this->parser->unsetExclusive(); } else { return false; } return true; } } class CssStringParserPlugin extends aCssParserPlugin { private $delimiterChar = null; public function getTriggerChars() { return array("\"", "'", "\n"); } public function getTriggerStates() { return false; } public function parse($index, $char, $previousChar, $state) { if (($char === "\"" || $char === "'") && $state !== "T_STRING") { $this->delimiterChar = $char; $this->parser->pushState("T_STRING"); $this->parser->setExclusive(__CLASS__); } elseif ($char === "\n" && $previousChar === "\\" && $state === "T_STRING") { $this->parser->setBuffer(substr($this->parser->getBuffer(), 0, -2)); } elseif ($char === "\n" && $previousChar !== "\\" && $state === "T_STRING") { $line = $this->parser->getBuffer(); $this->parser->popState(); $this->parser->unsetExclusive(); $this->parser->setBuffer(substr($this->parser->getBuffer(), 0, -1) . $this->delimiterChar); CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Unterminated string literal", $line . "_")); $this->delimiterChar = null; } elseif ($char === $this->delimiterChar && $state === "T_STRING") { if ($previousChar == "\\") { $source = $this->parser->getSource(); $c = 1; $i = $index - 2; while (substr($source, $i, 1) === "\\") { $c++; $i--; } if ($c % 2) { return false; } } $this->parser->popState(); $this->parser->unsetExclusive(); $this->delimiterChar = null; } else { return false; } return true; } } class CssSortRulesetPropertiesMinifierFilter extends aCssMinifierFilter { public function apply(array &$tokens) { $r = 0; for ($i = 0, $l = count($tokens); $i < $l; $i++) { if (get_class($tokens[$i]) !== "CssRulesetStartToken") { continue; } $endIndex = false; for ($ii = $i + 1; $ii < $l; $ii++) { if (get_class($tokens[$ii]) !== "CssRulesetEndToken") { continue; } $endIndex = $ii; break; } if (!$endIndex) { break; } $startIndex = $i; $i = $endIndex; if ($endIndex - $startIndex <= 2) { continue; } for ($ii = $startIndex + 1; $ii < $endIndex; $ii++) { if (get_class($tokens[$ii]) !== "CssRulesetDeclarationToken") { continue(2); } } $declarations = array_slice($tokens, $startIndex + 1, $endIndex - $startIndex - 1); $sortRequired = $lastPropertyName = false; foreach ($declarations as $declaration) { if ($lastPropertyName) { if (strcmp($lastPropertyName, $declaration->Property) > 0) { $sortRequired = true; break; } } $lastPropertyName = $declaration->Property; } if (!$sortRequired) { continue; } usort($declarations, array(__CLASS__, "userDefinedSort1")); for ($ii = 0, $ll = count($declarations) - 1; $ii <= $ll; $ii++) { if ($ii == $ll) { $declarations[$ii]->IsLast = true; } else { $declarations[$ii]->IsLast = false; } } array_splice($tokens, $startIndex + 1, $endIndex - $startIndex - 1, $declarations); $r += $endIndex - $startIndex - 1; } return $r; } public static function userDefinedSort1($a, $b) { return strcmp($a->Property, $b->Property); } } class CssRulesetStartToken extends aCssRulesetStartToken { public $Selectors = array(); public function __construct(array $selectors = array()) { $this->Selectors = $selectors; } public function __toString() { return implode(",", $this->Selectors) . "{"; } } class CssRulesetParserPlugin extends aCssParserPlugin { public function getTriggerChars() { return array(",", "{", "}", ":", ";"); } public function getTriggerStates() { return array("T_DOCUMENT", "T_AT_MEDIA", "T_RULESET::SELECTORS", "T_RULESET", "T_RULESET_DECLARATION"); } private $selectors = array(); public function parse($index, $char, $previousChar, $state) { if ($char === "," && ($state === "T_DOCUMENT" || $state === "T_AT_MEDIA" || $state === "T_RULESET::SELECTORS")) { if ($state !== "T_RULESET::SELECTORS") { $this->parser->pushState("T_RULESET::SELECTORS"); } $this->selectors[] = $this->parser->getAndClearBuffer(",{"); } elseif ($char === "{" && ($state === "T_DOCUMENT" || $state === "T_AT_MEDIA" || $state === "T_RULESET::SELECTORS")) { if ($this->parser->getBuffer() !== "") { $this->selectors[] = $this->parser->getAndClearBuffer(",{"); if ($state == "T_RULESET::SELECTORS") { $this->parser->popState(); } $this->parser->pushState("T_RULESET"); $this->parser->appendToken(new CssRulesetStartToken($this->selectors)); $this->selectors = array(); } } elseif ($char === ":" && $state === "T_RULESET") { $this->parser->pushState("T_RULESET_DECLARATION"); $this->buffer = $this->parser->getAndClearBuffer(":;", true); } elseif ($char === ":" && $state === "T_RULESET_DECLARATION") { if ($this->buffer === "filter") { return false; } CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Unterminated declaration", $this->buffer . ":" . $this->parser->getBuffer() . "_")); } elseif (($char === ";" || $char === "}") && $state === "T_RULESET_DECLARATION") { $value = $this->parser->getAndClearBuffer(";}"); if (strtolower(substr($value, -10, 10)) === "!important") { $value = trim(substr($value, 0, -10)); $isImportant = true; } else { $isImportant = false; } $this->parser->popState(); $this->parser->appendToken(new CssRulesetDeclarationToken($this->buffer, $value, $this->parser->getMediaTypes(), $isImportant)); if ($char === "}") { $this->parser->appendToken(new CssRulesetEndToken()); $this->parser->popState(); } $this->buffer = ""; } elseif ($char === "}" && $state === "T_RULESET") { $this->parser->popState(); $this->parser->clearBuffer(); $this->parser->appendToken(new CssRulesetEndToken()); $this->buffer = ""; $this->selectors = array(); } else { return false; } return true; } } class CssRulesetEndToken extends aCssRulesetEndToken { } class CssRulesetDeclarationToken extends aCssDeclarationToken { public $MediaTypes = array("all"); public function __construct($property, $value, $mediaTypes = null, $isImportant = false, $isLast = false) { parent::__construct($property, $value, $isImportant, $isLast); $this->MediaTypes = $mediaTypes ? $mediaTypes : array("all"); } } class CssRemoveLastDelarationSemiColonMinifierFilter extends aCssMinifierFilter { public function apply(array &$tokens) { for ($i = 0, $l = count($tokens); $i < $l; $i++) { $current = get_class($tokens[$i]); $next = isset($tokens[$i+1]) ? get_class($tokens[$i+1]) : false; if (($current === "CssRulesetDeclarationToken" && $next === "CssRulesetEndToken") || ($current === "CssAtFontFaceDeclarationToken" && $next === "CssAtFontFaceEndToken") || ($current === "CssAtPageDeclarationToken" && $next === "CssAtPageEndToken")) { $tokens[$i]->IsLast = true; } } return 0; } } class CssRemoveEmptyRulesetsMinifierFilter extends aCssMinifierFilter { public function apply(array &$tokens) { $r = 0; for ($i = 0, $l = count($tokens); $i < $l; $i++) { $current = get_class($tokens[$i]); $next = isset($tokens[$i + 1]) ? get_class($tokens[$i + 1]) : false; if (($current === "CssRulesetStartToken" && $next === "CssRulesetEndToken") || ($current === "CssAtKeyframesRulesetStartToken" && $next === "CssAtKeyframesRulesetEndToken" && !array_intersect(array("from", "0%", "to", "100%"), array_map("strtolower", $tokens[$i]->Selectors))) ) { $tokens[$i] = null; $tokens[$i + 1] = null; $i++; $r = $r + 2; } } return $r; } } class CssRemoveEmptyAtBlocksMinifierFilter extends aCssMinifierFilter { public function apply(array &$tokens) { $r = 0; for ($i = 0, $l = count($tokens); $i < $l; $i++) { $current = get_class($tokens[$i]); $next = isset($tokens[$i + 1]) ? get_class($tokens[$i + 1]) : false; if (($current === "CssAtFontFaceStartToken" && $next === "CssAtFontFaceEndToken") || ($current === "CssAtKeyframesStartToken" && $next === "CssAtKeyframesEndToken") || ($current === "CssAtPageStartToken" && $next === "CssAtPageEndToken") || ($current === "CssAtMediaStartToken" && $next === "CssAtMediaEndToken")) { $tokens[$i] = null; $tokens[$i + 1] = null; $i++; $r = $r + 2; } } return $r; } } class CssRemoveCommentsMinifierFilter extends aCssMinifierFilter { public function apply(array &$tokens) { $r = 0; for ($i = 0, $l = count($tokens); $i < $l; $i++) { if (get_class($tokens[$i]) === "CssCommentToken") { $tokens[$i] = null; $r++; } } return $r; } } class CssParser { private $buffer = ""; private $plugins = array(); private $source = ""; private $state = "T_DOCUMENT"; private $stateExclusive = false; private $stateMediaTypes = false; private $states = array("T_DOCUMENT"); private $tokens = array(); public function __construct($source = null, array $plugins = null) { $plugins = array_merge(array ( "Comment" => true, "String" => true, "Url" => true, "Expression" => true, "Ruleset" => true, "AtCharset" => true, "AtFontFace" => true, "AtImport" => true, "AtKeyframes" => true, "AtMedia" => true, "AtPage" => true, "AtVariables" => true ), is_array($plugins) ? $plugins : array()); foreach ($plugins as $name => $config) { if ($config !== false) { $class = "Css" . $name . "ParserPlugin"; $config = is_array($config) ? $config : array(); if (class_exists($class)) { $this->plugins[] = new $class($this, $config); } else { CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": The plugin <code>" . $name . "</code> with the class name <code>" . $class . "</code> was not found")); } } } if (!is_null($source)) { $this->parse($source); } } public function appendToken(aCssToken $token) { $this->tokens[] = $token; } public function clearBuffer() { $this->buffer = ""; } public function getAndClearBuffer($trim = "", $tolower = false) { $r = $this->getBuffer($trim, $tolower); $this->buffer = ""; return $r; } public function getBuffer($trim = "", $tolower = false) { $r = $this->buffer; if ($trim) { $r = trim($r, " \t\n\r\0\x0B" . $trim); } if ($tolower) { $r = strtolower($r); } return $r; } public function getMediaTypes() { return $this->stateMediaTypes; } public function getSource() { return $this->source; } public function getState() { return $this->state; } public function getPlugin($class) { static $index = null; if (is_null($index)) { $index = array(); for ($i = 0, $l = count($this->plugins); $i < $l; $i++) { $index[get_class($this->plugins[$i])] = $i; } } return isset($index[$class]) ? $this->plugins[$index[$class]] : false; } public function getTokens() { return $this->tokens; } public function isState($state) { return ($this->state == $state); } public function parse($source) { $this->source = ""; $this->tokens = array(); $globalTriggerChars = ""; $plugins = $this->plugins; $pluginCount = count($plugins); $pluginIndex = array(); $pluginTriggerStates = array(); $pluginTriggerChars = array(); for ($i = 0, $l = count($plugins); $i < $l; $i++) { $tPluginClassName = get_class($plugins[$i]); $pluginTriggerChars[$i] = implode("", $plugins[$i]->getTriggerChars()); $tPluginTriggerStates = $plugins[$i]->getTriggerStates(); $pluginTriggerStates[$i] = $tPluginTriggerStates === false ? false : "|" . implode("|", $tPluginTriggerStates) . "|"; $pluginIndex[$tPluginClassName] = $i; for ($ii = 0, $ll = strlen($pluginTriggerChars[$i]); $ii < $ll; $ii++) { $c = substr($pluginTriggerChars[$i], $ii, 1); if (strpos($globalTriggerChars, $c) === false) { $globalTriggerChars .= $c; } } } $source = str_replace("\r\n", "\n", $source); $source = str_replace("\r", "\n", $source); $this->source = $source; $buffer = &$this->buffer; $exclusive = &$this->stateExclusive; $state = &$this->state; $c = $p = null; for ($i = 0, $l = strlen($source); $i < $l; $i++) { $c = $source[$i]; if ($exclusive === false) { if ($c === "\n" || $c === "\t") { $c = " "; } if ($c === " " && $p === " ") { continue; } } $buffer .= $c; if (strpos($globalTriggerChars, $c) !== false) { if ($exclusive) { $tPluginIndex = $pluginIndex[$exclusive]; if (strpos($pluginTriggerChars[$tPluginIndex], $c) !== false && ($pluginTriggerStates[$tPluginIndex] === false || strpos($pluginTriggerStates[$tPluginIndex], $state) !== false)) { $r = $plugins[$tPluginIndex]->parse($i, $c, $p, $state); if ($r === true) { continue; } elseif ($r !== false && $r != $i) { $i = $r; continue; } } } else { $triggerState = "|" . $state . "|"; for ($ii = 0, $ll = $pluginCount; $ii < $ll; $ii++) { if (strpos($pluginTriggerChars[$ii], $c) !== false && ($pluginTriggerStates[$ii] === false || strpos($pluginTriggerStates[$ii], $triggerState) !== false)) { $r = $plugins[$ii]->parse($i, $c, $p, $state); if ($r === true) { break; } elseif ($r !== false && $r != $i) { $i = $r; break; } } } } } $p = $c; } return $this->tokens; } public function popState() { $r = array_pop($this->states); $this->state = $this->states[count($this->states) - 1]; return $r; } public function pushState($state) { $r = array_push($this->states, $state); $this->state = $this->states[count($this->states) - 1]; return $r; } public function setBuffer($buffer) { $this->buffer = $buffer; } public function setExclusive($exclusive) { $this->stateExclusive = $exclusive; } public function setMediaTypes(array $mediaTypes) { $this->stateMediaTypes = $mediaTypes; } public function setState($state) { $r = array_pop($this->states); array_push($this->states, $state); $this->state = $this->states[count($this->states) - 1]; return $r; } public function unsetExclusive() { $this->stateExclusive = false; } public function unsetMediaTypes() { $this->stateMediaTypes = false; } } class CssOtbsFormatter extends aCssFormatter { public function __toString() { $r = array(); $level = 0; for ($i = 0, $l = count($this->tokens); $i < $l; $i++) { $token = $this->tokens[$i]; $class = get_class($token); $indent = str_repeat($this->indent, $level); if ($class === "CssCommentToken") { $lines = array_map("trim", explode("\n", $token->Comment)); for ($ii = 0, $ll = count($lines); $ii < $ll; $ii++) { $r[] = $indent . (substr($lines[$ii], 0, 1) == "*" ? " " : "") . $lines[$ii]; } } elseif ($class === "CssAtCharsetToken") { $r[] = $indent . "@charset " . $token->Charset . ";"; } elseif ($class === "CssAtFontFaceStartToken") { $r[] = $indent . "@font-face {"; $level++; } elseif ($class === "CssAtImportToken") { $r[] = $indent . "@import " . $token->Import . " " . implode(", ", $token->MediaTypes) . ";"; } elseif ($class === "CssAtKeyframesStartToken") { $r[] = $indent . "@keyframes \"" . $token->Name . "\" {"; $level++; } elseif ($class === "CssAtMediaStartToken") { $r[] = $indent . "@media " . implode(", ", $token->MediaTypes) . " {"; $level++; } elseif ($class === "CssAtPageStartToken") { $r[] = $indent . "@page {"; $level++; } elseif ($class === "CssAtVariablesStartToken") { $r[] = $indent . "@variables " . implode(", ", $token->MediaTypes) . " {"; $level++; } elseif ($class === "CssRulesetStartToken" || $class === "CssAtKeyframesRulesetStartToken") { $r[] = $indent . implode(", ", $token->Selectors) . " {"; $level++; } elseif ($class == "CssAtFontFaceDeclarationToken" || $class === "CssAtKeyframesRulesetDeclarationToken" || $class === "CssAtPageDeclarationToken" || $class == "CssAtVariablesDeclarationToken" || $class === "CssRulesetDeclarationToken" ) { $declaration = $indent . $token->Property . ": "; if ($this->padding) { $declaration = str_pad($declaration, $this->padding, " ", STR_PAD_RIGHT); } $r[] = $declaration . $token->Value . ($token->IsImportant ? " !important" : "") . ";"; } elseif ($class === "CssAtFontFaceEndToken" || $class === "CssAtMediaEndToken" || $class === "CssAtKeyframesEndToken" || $class === "CssAtKeyframesRulesetEndToken" || $class === "CssAtPageEndToken" || $class === "CssAtVariablesEndToken" || $class === "CssRulesetEndToken" ) { $level--; $r[] = str_repeat($indent, $level) . "}"; } } return implode("\n", $r); } } class CssNullToken extends aCssToken { public function __toString() { return ""; } } class CssMinifier { private $filters = array(); private $plugins = array(); private $minified = ""; public function __construct($source = null, array $filters = null, array $plugins = null) { $filters = array_merge(array ( "ImportImports" => false, "RemoveComments" => true, "RemoveEmptyRulesets" => true, "RemoveEmptyAtBlocks" => true, "ConvertLevel3Properties" => false, "ConvertLevel3AtKeyframes" => false, "Variables" => true, "RemoveLastDelarationSemiColon" => true ), is_array($filters) ? $filters : array()); $plugins = array_merge(array ( "Variables" => true, "ConvertFontWeight" => false, "ConvertHslColors" => false, "ConvertRgbColors" => false, "ConvertNamedColors" => false, "CompressColorValues" => false, "CompressUnitValues" => false, "CompressExpressionValues" => false ), is_array($plugins) ? $plugins : array()); foreach ($filters as $name => $config) { if ($config !== false) { $class = "Css" . $name . "MinifierFilter"; $config = is_array($config) ? $config : array(); if (class_exists($class)) { $this->filters[] = new $class($this, $config); } else { CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": The filter <code>" . $name . "</code> with the class name <code>" . $class . "</code> was not found")); } } } foreach ($plugins as $name => $config) { if ($config !== false) { $class = "Css" . $name . "MinifierPlugin"; $config = is_array($config) ? $config : array(); if (class_exists($class)) { $this->plugins[] = new $class($this, $config); } else { CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": The plugin <code>" . $name . "</code> with the class name <code>" . $class . "</code> was not found")); } } } if (!is_null($source)) { $this->minify($source); } } public function getMinified() { return $this->minified; } public function getPlugin($class) { static $index = null; if (is_null($index)) { $index = array(); for ($i = 0, $l = count($this->plugins); $i < $l; $i++) { $index[get_class($this->plugins[$i])] = $i; } } return isset($index[$class]) ? $this->plugins[$index[$class]] : false; } public function minify($source) { $r = ""; $parser = new CssParser($source); $tokens = $parser->getTokens(); $filters = $this->filters; $filterCount = count($this->filters); $plugins = $this->plugins; $pluginCount = count($plugins); $pluginIndex = array(); $pluginTriggerTokens = array(); $globalTriggerTokens = array(); for ($i = 0, $l = count($plugins); $i < $l; $i++) { $tPluginClassName = get_class($plugins[$i]); $pluginTriggerTokens[$i] = $plugins[$i]->getTriggerTokens(); foreach ($pluginTriggerTokens[$i] as $v) { if (!in_array($v, $globalTriggerTokens)) { $globalTriggerTokens[] = $v; } } $pluginTriggerTokens[$i] = "|" . implode("|", $pluginTriggerTokens[$i]) . "|"; $pluginIndex[$tPluginClassName] = $i; } $globalTriggerTokens = "|" . implode("|", $globalTriggerTokens) . "|"; for($i = 0; $i < $filterCount; $i++) { if ($filters[$i]->apply($tokens) > 0) { $tokens = array_values(array_filter($tokens)); } } $tokenCount = count($tokens); for($i = 0; $i < $tokenCount; $i++) { $triggerToken = "|" . get_class($tokens[$i]) . "|"; if (strpos($globalTriggerTokens, $triggerToken) !== false) { for($ii = 0; $ii < $pluginCount; $ii++) { if (strpos($pluginTriggerTokens[$ii], $triggerToken) !== false || $pluginTriggerTokens[$ii] === false) { if ($plugins[$ii]->apply($tokens[$i]) === true) { continue 2; } } } } } for($i = 0; $i < $tokenCount; $i++) { $r .= (string) $tokens[$i]; } $this->minified = $r; return $r; } } class CssMin { private static $classIndex = array(); private static $errors = array(); private static $isVerbose = false; public static function autoload($class) { if (isset(self::$classIndex[$class])) { require(self::$classIndex[$class]); } } public static function getErrors() { return self::$errors; } public static function hasErrors() { return count(self::$errors) > 0; } public static function initialise() { $paths = array(dirname(__FILE__)); while (list($i, $path) = each($paths)) { $subDirectorys = glob($path . "*", GLOB_MARK | GLOB_ONLYDIR | GLOB_NOSORT); if (is_array($subDirectorys)) { foreach ($subDirectorys as $subDirectory) { $paths[] = $subDirectory; } } $files = glob($path . "*.php", 0); if (is_array($files)) { foreach ($files as $file) { $class = substr(basename($file), 0, -4); self::$classIndex[$class] = $file; } } } krsort(self::$classIndex); if (function_exists("spl_autoload_register") && !is_callable("__autoload")) { spl_autoload_register(array(__CLASS__, "autoload")); } else { foreach (self::$classIndex as $class => $file) { if (!class_exists($class)) { require_once($file); } } } } public static function minify($source, array $filters = null, array $plugins = null) { self::$errors = array(); $minifier = new CssMinifier($source, $filters, $plugins); return $minifier->getMinified(); } public static function parse($source, array $plugins = null) { self::$errors = array(); $parser = new CssParser($source, $plugins); return $parser->getTokens(); } public static function setVerbose($to) { self::$isVerbose = (boolean) $to; return self::$isVerbose; } public static function triggerError(CssError $error) { self::$errors[] = $error; if (self::$isVerbose) { trigger_error((string) $error, E_USER_WARNING); } } } CssMin::initialise(); class CssImportImportsMinifierFilter extends aCssMinifierFilter { private $imported = array(); public function apply(array &$tokens) { if (!isset($this->configuration["BasePath"]) || !is_dir($this->configuration["BasePath"])) { CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Base path <code>" . ($this->configuration["BasePath"] ? $this->configuration["BasePath"] : "null"). "</code> is not a directory")); return 0; } for ($i = 0, $l = count($tokens); $i < $l; $i++) { if (get_class($tokens[$i]) === "CssAtImportToken") { $import = $this->configuration["BasePath"] . "/" . $tokens[$i]->Import; if (!is_file($import)) { CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Import file <code>" . $import. "</code> was not found.", (string) $tokens[$i])); } elseif (in_array($import, $this->imported)) { CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Import file <code>" . $import. "</code> was already imported.", (string) $tokens[$i])); $tokens[$i] = null; } else { $this->imported[] = $import; $parser = new CssParser(file_get_contents($import)); $import = $parser->getTokens(); if (count($tokens[$i]->MediaTypes) > 0 && !(count($tokens[$i]->MediaTypes) == 1 && $tokens[$i]->MediaTypes[0] == "all")) { $blocks = array(); for($ii = 0, $ll = count($import); $ii < $ll; $ii++) { if (get_class($import[$ii]) === "CssAtImportToken") { if (count($import[$ii]->MediaTypes) == 0 || (count($import[$ii]->MediaTypes) == 1 && $import[$ii]->MediaTypes[0] == "all")) { $import[$ii]->MediaTypes = $tokens[$i]->MediaTypes; } elseif (count($import[$ii]->MediaTypes > 0)) { foreach ($import[$ii]->MediaTypes as $index => $mediaType) { if (!in_array($mediaType, $tokens[$i]->MediaTypes)) { unset($import[$ii]->MediaTypes[$index]); } } $import[$ii]->MediaTypes = array_values($import[$ii]->MediaTypes); if (count($import[$ii]->MediaTypes) == 0) { $import[$ii] = null; } } } } for($ii = 0, $ll = count($import); $ii < $ll; $ii++) { if (get_class($import[$ii]) === "CssAtMediaStartToken") { foreach ($import[$ii]->MediaTypes as $index => $mediaType) { if (!in_array($mediaType, $tokens[$i]->MediaTypes)) { unset($import[$ii]->MediaTypes[$index]); } $import[$ii]->MediaTypes = array_values($import[$ii]->MediaTypes); } } } for($ii = 0, $ll = count($import); $ii < $ll; $ii++) { if (get_class($import[$ii]) === "CssAtMediaStartToken") { if (count($import[$ii]->MediaTypes) === 0) { for ($iii = $ii; $iii < $ll; $iii++) { if (get_class($import[$iii]) === "CssAtMediaEndToken") { break; } } if (get_class($import[$iii]) === "CssAtMediaEndToken") { array_splice($import, $ii, $iii - $ii + 1, array()); $ll = count($import); } } } } for($ii = 0, $ll = count($import); $ii < $ll; $ii++) { if (get_class($import[$ii]) === "CssAtMediaStartToken" && count(array_diff($tokens[$i]->MediaTypes, $import[$ii]->MediaTypes)) === 0) { for ($iii = $ii; $iii < $ll; $iii++) { if (get_class($import[$iii]) == "CssAtMediaEndToken") { break; } } if (get_class($import[$iii]) == "CssAtMediaEndToken") { unset($import[$ii]); unset($import[$iii]); $import = array_values($import); $ll = count($import); } } } for($ii = 0, $ll = count($import); $ii < $ll; $ii++) { $class = get_class($import[$ii]); if ($class === "CssAtImportToken" || $class === "CssAtCharsetToken") { $blocks = array_merge($blocks, array_splice($import, $ii, 1, array())); $ll = count($import); } } for($ii = 0, $ll = count($import); $ii < $ll; $ii++) { $class = get_class($import[$ii]); if ($class === "CssAtFontFaceStartToken" || $class === "CssAtMediaStartToken" || $class === "CssAtPageStartToken" || $class === "CssAtVariablesStartToken") { for ($iii = $ii; $iii < $ll; $iii++) { $class = get_class($import[$iii]); if ($class === "CssAtFontFaceEndToken" || $class === "CssAtMediaEndToken" || $class === "CssAtPageEndToken" || $class === "CssAtVariablesEndToken") { break; } } $class = get_class($import[$iii]); if (isset($import[$iii]) && ($class === "CssAtFontFaceEndToken" || $class === "CssAtMediaEndToken" || $class === "CssAtPageEndToken" || $class === "CssAtVariablesEndToken")) { $blocks = array_merge($blocks, array_splice($import, $ii, $iii - $ii + 1, array())); $ll = count($import); } } } $import = array_merge($blocks, array(new CssAtMediaStartToken($tokens[$i]->MediaTypes)), $import, array(new CssAtMediaEndToken())); } array_splice($tokens, $i, 1, $import); $i--; $l = count($tokens); } } } } } class CssExpressionParserPlugin extends aCssParserPlugin { private $leftBraces = 0; private $rightBraces = 0; public function getTriggerChars() { return array("(", ")", ";", "}"); } public function getTriggerStates() { return false; } public function parse($index, $char, $previousChar, $state) { if ($char === "(" && strtolower(substr($this->parser->getSource(), $index - 10, 11)) === "expression(" && $state !== "T_EXPRESSION") { $this->parser->pushState("T_EXPRESSION"); $this->leftBraces++; } elseif ($char === "(" && $state === "T_EXPRESSION") { $this->leftBraces++; } elseif ($char === ")" && $state === "T_EXPRESSION") { $this->rightBraces++; } elseif (($char === ";" || $char === "}") && $state === "T_EXPRESSION" && $this->leftBraces === $this->rightBraces) { $this->leftBraces = $this->rightBraces = 0; $this->parser->popState(); return $index - 1; } else { return false; } return true; } } class CssError { public $File = ""; public $Line = 0; public $Message = ""; public $Source = ""; public function __construct($file, $line, $message, $source = "") { $this->File = $file; $this->Line = $line; $this->Message = $message; $this->Source = $source; } public function __toString() { return $this->Message . ($this->Source ? ": <br /><code>" . $this->Source . "</code>": "") . "<br />in file " . $this->File . " at line " . $this->Line; } } class CssConvertRgbColorsMinifierPlugin extends aCssMinifierPlugin { private $reMatch = "/rgb\s*\(\s*([0-9%]+)\s*,\s*([0-9%]+)\s*,\s*([0-9%]+)\s*\)/iS"; public function apply(aCssToken &$token) { if (stripos($token->Value, "rgb") !== false && preg_match($this->reMatch, $token->Value, $m)) { for ($i = 1, $l = count($m); $i < $l; $i++) { if (strpos("%", $m[$i]) !== false) { $m[$i] = substr($m[$i], 0, -1); $m[$i] = (int) (256 * ($m[$i] / 100)); } $m[$i] = str_pad(dechex($m[$i]), 2, "0", STR_PAD_LEFT); } $token->Value = str_replace($m[0], "#" . $m[1] . $m[2] . $m[3], $token->Value); } return false; } public function getTriggerTokens() { return array ( "CssAtFontFaceDeclarationToken", "CssAtPageDeclarationToken", "CssRulesetDeclarationToken" ); } } class CssConvertNamedColorsMinifierPlugin extends aCssMinifierPlugin { private $reMatch = null; private $reReplace = "\"\${1}\" . \$this->transformation[strtolower(\"\${2}\")] . \"\${3}\""; private $transformation = array ( "aliceblue" => "#f0f8ff", "antiquewhite" => "#faebd7", "aqua" => "#0ff", "aquamarine" => "#7fffd4", "azure" => "#f0ffff", "beige" => "#f5f5dc", "black" => "#000", "blue" => "#00f", "blueviolet" => "#8a2be2", "brown" => "#a52a2a", "burlywood" => "#deb887", "cadetblue" => "#5f9ea0", "chartreuse" => "#7fff00", "chocolate" => "#d2691e", "coral" => "#ff7f50", "cornflowerblue" => "#6495ed", "cornsilk" => "#fff8dc", "crimson" => "#dc143c", "darkblue" => "#00008b", "darkcyan" => "#008b8b", "darkgoldenrod" => "#b8860b", "darkgray" => "#a9a9a9", "darkgreen" => "#006400", "darkkhaki" => "#bdb76b", "darkmagenta" => "#8b008b", "darkolivegreen" => "#556b2f", "darkorange" => "#ff8c00", "darkorchid" => "#9932cc", "darkred" => "#8b0000", "darksalmon" => "#e9967a", "darkseagreen" => "#8fbc8f", "darkslateblue" => "#483d8b", "darkslategray" => "#2f4f4f", "darkturquoise" => "#00ced1", "darkviolet" => "#9400d3", "deeppink" => "#ff1493", "deepskyblue" => "#00bfff", "dimgray" => "#696969", "dodgerblue" => "#1e90ff", "firebrick" => "#b22222", "floralwhite" => "#fffaf0", "forestgreen" => "#228b22", "fuchsia" => "#f0f", "gainsboro" => "#dcdcdc", "ghostwhite" => "#f8f8ff", "gold" => "#ffd700", "goldenrod" => "#daa520", "gray" => "#808080", "green" => "#008000", "greenyellow" => "#adff2f", "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", "lightgreen" => "#90ee90", "lightgrey" => "#d3d3d3", "lightpink" => "#ffb6c1", "lightsalmon" => "#ffa07a", "lightseagreen" => "#20b2aa", "lightskyblue" => "#87cefa", "lightslategray" => "#789", "lightsteelblue" => "#b0c4de", "lightyellow" => "#ffffe0", "lime" => "#0f0", "limegreen" => "#32cd32", "linen" => "#faf0e6", "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" => "#f00", "rosybrown" => "#bc8f8f", "royalblue" => "#4169e1", "saddlebrown" => "#8b4513", "salmon" => "#fa8072", "sandybrown" => "#f4a460", "seagreen" => "#2e8b57", "seashell" => "#fff5ee", "sienna" => "#a0522d", "silver" => "#c0c0c0", "skyblue" => "#87ceeb", "slateblue" => "#6a5acd", "slategray" => "#708090", "snow" => "#fffafa", "springgreen" => "#00ff7f", "steelblue" => "#4682b4", "tan" => "#d2b48c", "teal" => "#008080", "thistle" => "#d8bfd8", "tomato" => "#ff6347", "turquoise" => "#40e0d0", "violet" => "#ee82ee", "wheat" => "#f5deb3", "white" => "#fff", "whitesmoke" => "#f5f5f5", "yellow" => "#ff0", "yellowgreen" => "#9acd32" ); public function __construct(CssMinifier $minifier, array $configuration = array()) { $this->reMatch = "/(^|\s)+(" . implode("|", array_keys($this->transformation)) . ")(\s|$)+/eiS"; parent::__construct($minifier, $configuration); } public function apply(aCssToken &$token) { $lcValue = strtolower($token->Value); if (isset($this->transformation[$lcValue])) { $token->Value = $this->transformation[$lcValue]; } elseif (preg_match($this->reMatch, $token->Value)) { $token->Value = preg_replace($this->reMatch, $this->reReplace, $token->Value); } return false; } public function getTriggerTokens() { return array ( "CssAtFontFaceDeclarationToken", "CssAtPageDeclarationToken", "CssRulesetDeclarationToken" ); } } class CssConvertLevel3PropertiesMinifierFilter extends aCssMinifierFilter { private $transformations = array ( "animation" => array(null, "-webkit-animation", null, null), "animation-delay" => array(null, "-webkit-animation-delay", null, null), "animation-direction" => array(null, "-webkit-animation-direction", null, null), "animation-duration" => array(null, "-webkit-animation-duration", null, null), "animation-fill-mode" => array(null, "-webkit-animation-fill-mode", null, null), "animation-iteration-count" => array(null, "-webkit-animation-iteration-count", null, null), "animation-name" => array(null, "-webkit-animation-name", null, null), "animation-play-state" => array(null, "-webkit-animation-play-state", null, null), "animation-timing-function" => array(null, "-webkit-animation-timing-function", null, null), "appearance" => array("-moz-appearance", "-webkit-appearance", null, null), "backface-visibility" => array(null, "-webkit-backface-visibility", null, null), "background-clip" => array(null, "-webkit-background-clip", null, null), "background-composite" => array(null, "-webkit-background-composite", null, null), "background-inline-policy" => array("-moz-background-inline-policy", null, null, null), "background-origin" => array(null, "-webkit-background-origin", null, null), "background-position-x" => array(null, null, null, "-ms-background-position-x"), "background-position-y" => array(null, null, null, "-ms-background-position-y"), "background-size" => array(null, "-webkit-background-size", null, null), "behavior" => array(null, null, null, "-ms-behavior"), "binding" => array("-moz-binding", null, null, null), "border-after" => array(null, "-webkit-border-after", null, null), "border-after-color" => array(null, "-webkit-border-after-color", null, null), "border-after-style" => array(null, "-webkit-border-after-style", null, null), "border-after-width" => array(null, "-webkit-border-after-width", null, null), "border-before" => array(null, "-webkit-border-before", null, null), "border-before-color" => array(null, "-webkit-border-before-color", null, null), "border-before-style" => array(null, "-webkit-border-before-style", null, null), "border-before-width" => array(null, "-webkit-border-before-width", null, null), "border-border-bottom-colors" => array("-moz-border-bottom-colors", null, null, null), "border-bottom-left-radius" => array("-moz-border-radius-bottomleft", "-webkit-border-bottom-left-radius", null, null), "border-bottom-right-radius" => array("-moz-border-radius-bottomright", "-webkit-border-bottom-right-radius", null, null), "border-end" => array("-moz-border-end", "-webkit-border-end", null, null), "border-end-color" => array("-moz-border-end-color", "-webkit-border-end-color", null, null), "border-end-style" => array("-moz-border-end-style", "-webkit-border-end-style", null, null), "border-end-width" => array("-moz-border-end-width", "-webkit-border-end-width", null, null), "border-fit" => array(null, "-webkit-border-fit", null, null), "border-horizontal-spacing" => array(null, "-webkit-border-horizontal-spacing", null, null), "border-image" => array("-moz-border-image", "-webkit-border-image", null, null), "border-left-colors" => array("-moz-border-left-colors", null, null, null), "border-radius" => array("-moz-border-radius", "-webkit-border-radius", null, null), "border-border-right-colors" => array("-moz-border-right-colors", null, null, null), "border-start" => array("-moz-border-start", "-webkit-border-start", null, null), "border-start-color" => array("-moz-border-start-color", "-webkit-border-start-color", null, null), "border-start-style" => array("-moz-border-start-style", "-webkit-border-start-style", null, null), "border-start-width" => array("-moz-border-start-width", "-webkit-border-start-width", null, null), "border-top-colors" => array("-moz-border-top-colors", null, null, null), "border-top-left-radius" => array("-moz-border-radius-topleft", "-webkit-border-top-left-radius", null, null), "border-top-right-radius" => array("-moz-border-radius-topright", "-webkit-border-top-right-radius", null, null), "border-vertical-spacing" => array(null, "-webkit-border-vertical-spacing", null, null), "box-align" => array("-moz-box-align", "-webkit-box-align", null, null), "box-direction" => array("-moz-box-direction", "-webkit-box-direction", null, null), "box-flex" => array("-moz-box-flex", "-webkit-box-flex", null, null), "box-flex-group" => array(null, "-webkit-box-flex-group", null, null), "box-flex-lines" => array(null, "-webkit-box-flex-lines", null, null), "box-ordinal-group" => array("-moz-box-ordinal-group", "-webkit-box-ordinal-group", null, null), "box-orient" => array("-moz-box-orient", "-webkit-box-orient", null, null), "box-pack" => array("-moz-box-pack", "-webkit-box-pack", null, null), "box-reflect" => array(null, "-webkit-box-reflect", null, null), "box-shadow" => array("-moz-box-shadow", "-webkit-box-shadow", null, null), "box-sizing" => array("-moz-box-sizing", null, null, null), "color-correction" => array(null, "-webkit-color-correction", null, null), "column-break-after" => array(null, "-webkit-column-break-after", null, null), "column-break-before" => array(null, "-webkit-column-break-before", null, null), "column-break-inside" => array(null, "-webkit-column-break-inside", null, null), "column-count" => array("-moz-column-count", "-webkit-column-count", null, null), "column-gap" => array("-moz-column-gap", "-webkit-column-gap", null, null), "column-rule" => array("-moz-column-rule", "-webkit-column-rule", null, null), "column-rule-color" => array("-moz-column-rule-color", "-webkit-column-rule-color", null, null), "column-rule-style" => array("-moz-column-rule-style", "-webkit-column-rule-style", null, null), "column-rule-width" => array("-moz-column-rule-width", "-webkit-column-rule-width", null, null), "column-span" => array(null, "-webkit-column-span", null, null), "column-width" => array("-moz-column-width", "-webkit-column-width", null, null), "columns" => array(null, "-webkit-columns", null, null), "filter" => array(__CLASS__, "filter"), "float-edge" => array("-moz-float-edge", null, null, null), "font-feature-settings" => array("-moz-font-feature-settings", null, null, null), "font-language-override" => array("-moz-font-language-override", null, null, null), "font-size-delta" => array(null, "-webkit-font-size-delta", null, null), "font-smoothing" => array(null, "-webkit-font-smoothing", null, null), "force-broken-image-icon" => array("-moz-force-broken-image-icon", null, null, null), "highlight" => array(null, "-webkit-highlight", null, null), "hyphenate-character" => array(null, "-webkit-hyphenate-character", null, null), "hyphenate-locale" => array(null, "-webkit-hyphenate-locale", null, null), "hyphens" => array(null, "-webkit-hyphens", null, null), "force-broken-image-icon" => array("-moz-image-region", null, null, null), "ime-mode" => array(null, null, null, "-ms-ime-mode"), "interpolation-mode" => array(null, null, null, "-ms-interpolation-mode"), "layout-flow" => array(null, null, null, "-ms-layout-flow"), "layout-grid" => array(null, null, null, "-ms-layout-grid"), "layout-grid-char" => array(null, null, null, "-ms-layout-grid-char"), "layout-grid-line" => array(null, null, null, "-ms-layout-grid-line"), "layout-grid-mode" => array(null, null, null, "-ms-layout-grid-mode"), "layout-grid-type" => array(null, null, null, "-ms-layout-grid-type"), "line-break" => array(null, "-webkit-line-break", null, "-ms-line-break"), "line-clamp" => array(null, "-webkit-line-clamp", null, null), "line-grid-mode" => array(null, null, null, "-ms-line-grid-mode"), "logical-height" => array(null, "-webkit-logical-height", null, null), "logical-width" => array(null, "-webkit-logical-width", null, null), "margin-after" => array(null, "-webkit-margin-after", null, null), "margin-after-collapse" => array(null, "-webkit-margin-after-collapse", null, null), "margin-before" => array(null, "-webkit-margin-before", null, null), "margin-before-collapse" => array(null, "-webkit-margin-before-collapse", null, null), "margin-bottom-collapse" => array(null, "-webkit-margin-bottom-collapse", null, null), "margin-collapse" => array(null, "-webkit-margin-collapse", null, null), "margin-end" => array("-moz-margin-end", "-webkit-margin-end", null, null), "margin-start" => array("-moz-margin-start", "-webkit-margin-start", null, null), "margin-top-collapse" => array(null, "-webkit-margin-top-collapse", null, null), "marquee " => array(null, "-webkit-marquee", null, null), "marquee-direction" => array(null, "-webkit-marquee-direction", null, null), "marquee-increment" => array(null, "-webkit-marquee-increment", null, null), "marquee-repetition" => array(null, "-webkit-marquee-repetition", null, null), "marquee-speed" => array(null, "-webkit-marquee-speed", null, null), "marquee-style" => array(null, "-webkit-marquee-style", null, null), "mask" => array(null, "-webkit-mask", null, null), "mask-attachment" => array(null, "-webkit-mask-attachment", null, null), "mask-box-image" => array(null, "-webkit-mask-box-image", null, null), "mask-clip" => array(null, "-webkit-mask-clip", null, null), "mask-composite" => array(null, "-webkit-mask-composite", null, null), "mask-image" => array(null, "-webkit-mask-image", null, null), "mask-origin" => array(null, "-webkit-mask-origin", null, null), "mask-position" => array(null, "-webkit-mask-position", null, null), "mask-position-x" => array(null, "-webkit-mask-position-x", null, null), "mask-position-y" => array(null, "-webkit-mask-position-y", null, null), "mask-repeat" => array(null, "-webkit-mask-repeat", null, null), "mask-repeat-x" => array(null, "-webkit-mask-repeat-x", null, null), "mask-repeat-y" => array(null, "-webkit-mask-repeat-y", null, null), "mask-size" => array(null, "-webkit-mask-size", null, null), "match-nearest-mail-blockquote-color" => array(null, "-webkit-match-nearest-mail-blockquote-color", null, null), "max-logical-height" => array(null, "-webkit-max-logical-height", null, null), "max-logical-width" => array(null, "-webkit-max-logical-width", null, null), "min-logical-height" => array(null, "-webkit-min-logical-height", null, null), "min-logical-width" => array(null, "-webkit-min-logical-width", null, null), "object-fit" => array(null, null, "-o-object-fit", null), "object-position" => array(null, null, "-o-object-position", null), "opacity" => array(__CLASS__, "opacity"), "outline-radius" => array("-moz-outline-radius", null, null, null), "outline-bottom-left-radius" => array("-moz-outline-radius-bottomleft", null, null, null), "outline-bottom-right-radius" => array("-moz-outline-radius-bottomright", null, null, null), "outline-top-left-radius" => array("-moz-outline-radius-topleft", null, null, null), "outline-top-right-radius" => array("-moz-outline-radius-topright", null, null, null), "padding-after" => array(null, "-webkit-padding-after", null, null), "padding-before" => array(null, "-webkit-padding-before", null, null), "padding-end" => array("-moz-padding-end", "-webkit-padding-end", null, null), "padding-start" => array("-moz-padding-start", "-webkit-padding-start", null, null), "perspective" => array(null, "-webkit-perspective", null, null), "perspective-origin" => array(null, "-webkit-perspective-origin", null, null), "perspective-origin-x" => array(null, "-webkit-perspective-origin-x", null, null), "perspective-origin-y" => array(null, "-webkit-perspective-origin-y", null, null), "rtl-ordering" => array(null, "-webkit-rtl-ordering", null, null), "scrollbar-3dlight-color" => array(null, null, null, "-ms-scrollbar-3dlight-color"), "scrollbar-arrow-color" => array(null, null, null, "-ms-scrollbar-arrow-color"), "scrollbar-base-color" => array(null, null, null, "-ms-scrollbar-base-color"), "scrollbar-darkshadow-color" => array(null, null, null, "-ms-scrollbar-darkshadow-color"), "scrollbar-face-color" => array(null, null, null, "-ms-scrollbar-face-color"), "scrollbar-highlight-color" => array(null, null, null, "-ms-scrollbar-highlight-color"), "scrollbar-shadow-color" => array(null, null, null, "-ms-scrollbar-shadow-color"), "scrollbar-track-color" => array(null, null, null, "-ms-scrollbar-track-color"), "stack-sizing" => array("-moz-stack-sizing", null, null, null), "svg-shadow" => array(null, "-webkit-svg-shadow", null, null), "tab-size" => array("-moz-tab-size", null, "-o-tab-size", null), "table-baseline" => array(null, null, "-o-table-baseline", null), "text-align-last" => array(null, null, null, "-ms-text-align-last"), "text-autospace" => array(null, null, null, "-ms-text-autospace"), "text-combine" => array(null, "-webkit-text-combine", null, null), "text-decorations-in-effect" => array(null, "-webkit-text-decorations-in-effect", null, null), "text-emphasis" => array(null, "-webkit-text-emphasis", null, null), "text-emphasis-color" => array(null, "-webkit-text-emphasis-color", null, null), "text-emphasis-position" => array(null, "-webkit-text-emphasis-position", null, null), "text-emphasis-style" => array(null, "-webkit-text-emphasis-style", null, null), "text-fill-color" => array(null, "-webkit-text-fill-color", null, null), "text-justify" => array(null, null, null, "-ms-text-justify"), "text-kashida-space" => array(null, null, null, "-ms-text-kashida-space"), "text-overflow" => array(null, null, "-o-text-overflow", "-ms-text-overflow"), "text-security" => array(null, "-webkit-text-security", null, null), "text-size-adjust" => array(null, "-webkit-text-size-adjust", null, "-ms-text-size-adjust"), "text-stroke" => array(null, "-webkit-text-stroke", null, null), "text-stroke-color" => array(null, "-webkit-text-stroke-color", null, null), "text-stroke-width" => array(null, "-webkit-text-stroke-width", null, null), "text-underline-position" => array(null, null, null, "-ms-text-underline-position"), "transform" => array("-moz-transform", "-webkit-transform", "-o-transform", null), "transform-origin" => array("-moz-transform-origin", "-webkit-transform-origin", "-o-transform-origin", null), "transform-origin-x" => array(null, "-webkit-transform-origin-x", null, null), "transform-origin-y" => array(null, "-webkit-transform-origin-y", null, null), "transform-origin-z" => array(null, "-webkit-transform-origin-z", null, null), "transform-style" => array(null, "-webkit-transform-style", null, null), "transition" => array("-moz-transition", "-webkit-transition", "-o-transition", null), "transition-delay" => array("-moz-transition-delay", "-webkit-transition-delay", "-o-transition-delay", null), "transition-duration" => array("-moz-transition-duration", "-webkit-transition-duration", "-o-transition-duration", null), "transition-property" => array("-moz-transition-property", "-webkit-transition-property", "-o-transition-property", null), "transition-timing-function" => array("-moz-transition-timing-function", "-webkit-transition-timing-function", "-o-transition-timing-function", null), "user-drag" => array(null, "-webkit-user-drag", null, null), "user-focus" => array("-moz-user-focus", null, null, null), "user-input" => array("-moz-user-input", null, null, null), "user-modify" => array("-moz-user-modify", "-webkit-user-modify", null, null), "user-select" => array("-moz-user-select", "-webkit-user-select", null, null), "white-space" => array(__CLASS__, "whiteSpace"), "window-shadow" => array("-moz-window-shadow", null, null, null), "word-break" => array(null, null, null, "-ms-word-break"), "word-wrap" => array(null, null, null, "-ms-word-wrap"), "writing-mode" => array(null, "-webkit-writing-mode", null, "-ms-writing-mode"), "zoom" => array(null, null, null, "-ms-zoom") ); public function apply(array &$tokens) { $r = 0; $transformations = &$this->transformations; for ($i = 0, $l = count($tokens); $i < $l; $i++) { if (get_class($tokens[$i]) === "CssRulesetDeclarationToken") { $tProperty = $tokens[$i]->Property; if (isset($transformations[$tProperty])) { $result = array(); if (is_callable($transformations[$tProperty])) { $result = call_user_func_array($transformations[$tProperty], array($tokens[$i])); if (!is_array($result) && is_object($result)) { $result = array($result); } } else { $tValue = $tokens[$i]->Value; $tMediaTypes = $tokens[$i]->MediaTypes; foreach ($transformations[$tProperty] as $property) { if ($property !== null) { $result[] = new CssRulesetDeclarationToken($property, $tValue, $tMediaTypes); } } } if (count($result) > 0) { array_splice($tokens, $i + 1, 0, $result); $i += count($result); $l += count($result); } } } } return $r; } private static function filter($token) { $r = array ( new CssRulesetDeclarationToken("-ms-filter", "\"" . $token->Value . "\"", $token->MediaTypes), ); return $r; } private static function opacity($token) { $ieValue = (int) ((float) $token->Value * 100); $r = array ( new CssRulesetDeclarationToken("-ms-filter", "\"alpha(opacity=" . $ieValue . ")\"", $token->MediaTypes), new CssRulesetDeclarationToken("filter", "alpha(opacity=" . $ieValue . ")", $token->MediaTypes), new CssRulesetDeclarationToken("zoom", "1", $token->MediaTypes) ); return $r; } private static function whiteSpace($token) { if (strtolower($token->Value) === "pre-wrap") { $r = array ( new CssRulesetDeclarationToken("white-space", "-moz-pre-wrap", $token->MediaTypes), new CssRulesetDeclarationToken("white-space", "-webkit-pre-wrap", $token->MediaTypes), new CssRulesetDeclarationToken("white-space", "-pre-wrap", $token->MediaTypes), new CssRulesetDeclarationToken("white-space", "-o-pre-wrap", $token->MediaTypes), new CssRulesetDeclarationToken("word-wrap", "break-word", $token->MediaTypes) ); return $r; } else { return array(); } } } class CssConvertLevel3AtKeyframesMinifierFilter extends aCssMinifierFilter { public function apply(array &$tokens) { $r = 0; $transformations = array("-moz-keyframes", "-webkit-keyframes"); for ($i = 0, $l = count($tokens); $i < $l; $i++) { if (get_class($tokens[$i]) === "CssAtKeyframesStartToken") { for ($ii = $i; $ii < $l; $ii++) { if (get_class($tokens[$ii]) === "CssAtKeyframesEndToken") { break; } } if (get_class($tokens[$ii]) === "CssAtKeyframesEndToken") { $add = array(); $source = array(); for ($iii = $i; $iii <= $ii; $iii++) { $source[] = clone($tokens[$iii]); } foreach ($transformations as $transformation) { $t = array(); foreach ($source as $token) { $t[] = clone($token); } $t[0]->AtRuleName = $transformation; $add = array_merge($add, $t); } if (isset($this->configuration["RemoveSource"]) && $this->configuration["RemoveSource"] === true) { array_splice($tokens, $i, $ii - $i + 1, $add); } else { array_splice($tokens, $ii + 1, 0, $add); } $l = count($tokens); $i = $ii + count($add); $r += count($add); } } } return $r; } } class CssConvertHslColorsMinifierPlugin extends aCssMinifierPlugin { private $reMatch = "/^hsl\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*%\s*,\s*([0-9]+)\s*%\s*\)/iS"; public function apply(aCssToken &$token) { if (stripos($token->Value, "hsl") !== false && preg_match($this->reMatch, $token->Value, $m)) { $token->Value = str_replace($m[0], $this->hsl2hex($m[1], $m[2], $m[3]), $token->Value); } return false; } public function getTriggerTokens() { return array ( "CssAtFontFaceDeclarationToken", "CssAtPageDeclarationToken", "CssRulesetDeclarationToken" ); } private function hsl2hex($hue, $saturation, $lightness) { $hue = $hue / 360; $saturation = $saturation / 100; $lightness = $lightness / 100; if ($saturation == 0) { $red = $lightness * 255; $green = $lightness * 255; $blue = $lightness * 255; } else { if ($lightness < 0.5 ) { $v2 = $lightness * (1 + $saturation); } else { $v2 = ($lightness + $saturation) - ($saturation * $lightness); } $v1 = 2 * $lightness - $v2; $red = 255 * self::hue2rgb($v1, $v2, $hue + (1 / 3)); $green = 255 * self::hue2rgb($v1, $v2, $hue); $blue = 255 * self::hue2rgb($v1, $v2, $hue - (1 / 3)); } return "#" . str_pad(dechex(round($red)), 2, "0", STR_PAD_LEFT) . str_pad(dechex(round($green)), 2, "0", STR_PAD_LEFT) . str_pad(dechex(round($blue)), 2, "0", STR_PAD_LEFT); } private function hue2rgb($v1, $v2, $hue) { if ($hue < 0) { $hue += 1; } if ($hue > 1) { $hue -= 1; } if ((6 * $hue) < 1) { return ($v1 + ($v2 - $v1) * 6 * $hue); } if ((2 * $hue) < 1) { return ($v2); } if ((3 * $hue) < 2) { return ($v1 + ($v2 - $v1) * (( 2 / 3) - $hue) * 6); } return $v1; } } class CssConvertFontWeightMinifierPlugin extends aCssMinifierPlugin { private $include = array ( "font", "font-weight" ); private $reMatch = null; private $reReplace = "\"\${1}\" . \$this->transformation[\"\${2}\"] . \"\${3}\""; private $transformation = array ( "normal" => "400", "bold" => "700" ); public function __construct(CssMinifier $minifier) { $this->reMatch = "/(^|\s)+(" . implode("|", array_keys($this->transformation)). ")(\s|$)+/eiS"; parent::__construct($minifier); } public function apply(aCssToken &$token) { if (in_array($token->Property, $this->include) && preg_match($this->reMatch, $token->Value, $m)) { $token->Value = preg_replace($this->reMatch, $this->reReplace, $token->Value); } return false; } public function getTriggerTokens() { return array ( "CssAtFontFaceDeclarationToken", "CssAtPageDeclarationToken", "CssRulesetDeclarationToken" ); } } class CssCompressUnitValuesMinifierPlugin extends aCssMinifierPlugin { private $re = array ( "/(^| |-)0\.([0-9]+?)(0+)?(%|em|ex|px|in|cm|mm|pt|pc)/iS" => "\${1}.\${2}\${4}", "/(^| )-?(\.?)0(%|em|ex|px|in|cm|mm|pt|pc)/iS" => "\${1}0", "/(^0\s0\s0\s0)|(^0\s0\s0$)|(^0\s0$)/iS" => "0" ); private $reMatch = "/(^| |-)0\.([0-9]+?)(0+)?(%|em|ex|px|in|cm|mm|pt|pc)|(^| )-?(\.?)0(%|em|ex|px|in|cm|mm|pt|pc)|(^0\s0\s0\s0$)|(^0\s0\s0$)|(^0\s0$)/iS"; public function apply(aCssToken &$token) { if (preg_match($this->reMatch, $token->Value)) { foreach ($this->re as $reMatch => $reReplace) { $token->Value = preg_replace($reMatch, $reReplace, $token->Value); } } return false; } public function getTriggerTokens() { return array ( "CssAtFontFaceDeclarationToken", "CssAtPageDeclarationToken", "CssRulesetDeclarationToken" ); } } class CssCompressExpressionValuesMinifierPlugin extends aCssMinifierPlugin { public function apply(aCssToken &$token) { if (class_exists("JSMin") && stripos($token->Value, "expression(") !== false) { $value = $token->Value; $value = substr($token->Value, stripos($token->Value, "expression(") + 10); $value = trim(JSMin::minify($value)); $token->Value = "expression(" . $value . ")"; } return false; } public function getTriggerTokens() { return array ( "CssAtFontFaceDeclarationToken", "CssAtPageDeclarationToken", "CssRulesetDeclarationToken" ); } } class CssCompressColorValuesMinifierPlugin extends aCssMinifierPlugin { private $reMatch = "/\#([0-9a-f]{6})/iS"; public function apply(aCssToken &$token) { if (strpos($token->Value, "#") !== false && preg_match($this->reMatch, $token->Value, $m)) { $value = strtolower($m[1]); if ($value[0] == $value[1] && $value[2] == $value[3] && $value[4] == $value[5]) { $token->Value = str_replace($m[0], "#" . $value[0] . $value[2] . $value[4], $token->Value); } } return false; } public function getTriggerTokens() { return array ( "CssAtFontFaceDeclarationToken", "CssAtPageDeclarationToken", "CssRulesetDeclarationToken" ); } } class CssCommentToken extends aCssToken { public $Comment = ""; public function __construct($comment) { $this->Comment = $comment; } public function __toString() { return $this->Comment; } } class CssCommentParserPlugin extends aCssParserPlugin { public function getTriggerChars() { return array("*", "/"); } public function getTriggerStates() { return false; } private $restoreBuffer = ""; public function parse($index, $char, $previousChar, $state) { if ($char === "*" && $previousChar === "/" && $state !== "T_COMMENT") { $this->parser->pushState("T_COMMENT"); $this->parser->setExclusive(__CLASS__); $this->restoreBuffer = substr($this->parser->getAndClearBuffer(), 0, -2); } elseif ($char === "/" && $previousChar === "*" && $state === "T_COMMENT") { $this->parser->popState(); $this->parser->unsetExclusive(); $this->parser->appendToken(new CssCommentToken("/*" . $this->parser->getAndClearBuffer())); $this->parser->setBuffer($this->restoreBuffer); } else { return false; } return true; } } class CssAtVariablesStartToken extends aCssAtBlockStartToken { public $MediaTypes = array(); public function __construct($mediaTypes = null) { $this->MediaTypes = $mediaTypes ? $mediaTypes : array("all"); } public function __toString() { return ""; } } class CssAtVariablesParserPlugin extends aCssParserPlugin { public function getTriggerChars() { return array("@", "{", "}", ":", ";"); } public function getTriggerStates() { return array("T_DOCUMENT", "T_AT_VARIABLES::PREPARE", "T_AT_VARIABLES", "T_AT_VARIABLES_DECLARATION"); } public function parse($index, $char, $previousChar, $state) { if ($char === "@" && $state === "T_DOCUMENT" && strtolower(substr($this->parser->getSource(), $index, 10)) === "@variables") { $this->parser->pushState("T_AT_VARIABLES::PREPARE"); $this->parser->clearBuffer(); return $index + 10; } elseif ($char === "{" && $state === "T_AT_VARIABLES::PREPARE") { $this->parser->setState("T_AT_VARIABLES"); $mediaTypes = array_filter(array_map("trim", explode(",", $this->parser->getAndClearBuffer("{")))); $this->parser->appendToken(new CssAtVariablesStartToken($mediaTypes)); } if ($char === ":" && $state === "T_AT_VARIABLES") { $this->buffer = $this->parser->getAndClearBuffer(":"); $this->parser->pushState("T_AT_VARIABLES_DECLARATION"); } elseif ($char === ":" && $state === "T_AT_VARIABLES_DECLARATION") { if ($this->buffer === "filter") { return false; } CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Unterminated @variables declaration", $this->buffer . ":" . $this->parser->getBuffer() . "_")); } elseif (($char === ";" || $char === "}") && $state === "T_AT_VARIABLES_DECLARATION") { $value = $this->parser->getAndClearBuffer(";}"); if (strtolower(substr($value, -10, 10)) === "!important") { $value = trim(substr($value, 0, -10)); $isImportant = true; } else { $isImportant = false; } $this->parser->popState(); $this->parser->appendToken(new CssAtVariablesDeclarationToken($this->buffer, $value, $isImportant)); $this->buffer = ""; } elseif ($char === "}" && $state === "T_AT_VARIABLES") { $this->parser->popState(); $this->parser->clearBuffer(); $this->parser->appendToken(new CssAtVariablesEndToken()); } else { return false; } return true; } } class CssAtVariablesEndToken extends aCssAtBlockEndToken { public function __toString() { return ""; } } class CssAtVariablesDeclarationToken extends aCssDeclarationToken { public function __toString() { return ""; } } class CssAtPageStartToken extends aCssAtBlockStartToken { public $Selector = ""; public function __construct($selector = "") { $this->Selector = $selector; } public function __toString() { return "@page" . ($this->Selector ? " " . $this->Selector : "") . "{"; } } class CssAtPageParserPlugin extends aCssParserPlugin { public function getTriggerChars() { return array("@", "{", "}", ":", ";"); } public function getTriggerStates() { return array("T_DOCUMENT", "T_AT_PAGE::SELECTOR", "T_AT_PAGE", "T_AT_PAGE_DECLARATION"); } public function parse($index, $char, $previousChar, $state) { if ($char === "@" && $state === "T_DOCUMENT" && strtolower(substr($this->parser->getSource(), $index, 5)) === "@page") { $this->parser->pushState("T_AT_PAGE::SELECTOR"); $this->parser->clearBuffer(); return $index + 5; } elseif ($char === "{" && $state === "T_AT_PAGE::SELECTOR") { $selector = $this->parser->getAndClearBuffer("{"); $this->parser->setState("T_AT_PAGE"); $this->parser->clearBuffer(); $this->parser->appendToken(new CssAtPageStartToken($selector)); } elseif ($char === ":" && $state === "T_AT_PAGE") { $this->parser->pushState("T_AT_PAGE_DECLARATION"); $this->buffer = $this->parser->getAndClearBuffer(":", true); } elseif ($char === ":" && $state === "T_AT_PAGE_DECLARATION") { if ($this->buffer === "filter") { return false; } CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Unterminated @page declaration", $this->buffer . ":" . $this->parser->getBuffer() . "_")); } elseif (($char === ";" || $char === "}") && $state == "T_AT_PAGE_DECLARATION") { $value = $this->parser->getAndClearBuffer(";}"); if (strtolower(substr($value, -10, 10)) == "!important") { $value = trim(substr($value, 0, -10)); $isImportant = true; } else { $isImportant = false; } $this->parser->popState(); $this->parser->appendToken(new CssAtPageDeclarationToken($this->buffer, $value, $isImportant)); if ($char === "}") { $this->parser->popState(); $this->parser->appendToken(new CssAtPageEndToken()); } $this->buffer = ""; } elseif ($char === "}" && $state === "T_AT_PAGE") { $this->parser->popState(); $this->parser->clearBuffer(); $this->parser->appendToken(new CssAtPageEndToken()); } else { return false; } return true; } } class CssAtPageEndToken extends aCssAtBlockEndToken { } class CssAtPageDeclarationToken extends aCssDeclarationToken { } class CssAtMediaStartToken extends aCssAtBlockStartToken { public function __construct(array $mediaTypes = array()) { $this->MediaTypes = $mediaTypes; } public function __toString() { return "@media " . implode(",", $this->MediaTypes) . "{"; } } class CssAtMediaParserPlugin extends aCssParserPlugin { public function getTriggerChars() { return array("@", "{", "}"); } public function getTriggerStates() { return array("T_DOCUMENT", "T_AT_MEDIA::PREPARE", "T_AT_MEDIA"); } public function parse($index, $char, $previousChar, $state) { if ($char === "@" && $state === "T_DOCUMENT" && strtolower(substr($this->parser->getSource(), $index, 6)) === "@media") { $this->parser->pushState("T_AT_MEDIA::PREPARE"); $this->parser->clearBuffer(); return $index + 6; } elseif ($char === "{" && $state === "T_AT_MEDIA::PREPARE") { $mediaTypes = array_filter(array_map("trim", explode(",", $this->parser->getAndClearBuffer("{")))); $this->parser->setMediaTypes($mediaTypes); $this->parser->setState("T_AT_MEDIA"); $this->parser->appendToken(new CssAtMediaStartToken($mediaTypes)); } elseif ($char === "}" && $state === "T_AT_MEDIA") { $this->parser->appendToken(new CssAtMediaEndToken()); $this->parser->clearBuffer(); $this->parser->unsetMediaTypes(); $this->parser->popState(); } else { return false; } return true; } } class CssAtMediaEndToken extends aCssAtBlockEndToken { } class CssAtKeyframesStartToken extends aCssAtBlockStartToken { public $AtRuleName = "keyframes"; public $Name = ""; public function __construct($name, $atRuleName = null) { $this->Name = $name; if (!is_null($atRuleName)) { $this->AtRuleName = $atRuleName; } } public function __toString() { return "@" . $this->AtRuleName . " \"" . $this->Name . "\"{"; } } class CssAtKeyframesRulesetStartToken extends aCssRulesetStartToken { public $Selectors = array(); public function __construct(array $selectors = array()) { $this->Selectors = $selectors; } public function __toString() { return implode(",", $this->Selectors) . "{"; } } class CssAtKeyframesRulesetEndToken extends aCssRulesetEndToken { } class CssAtKeyframesRulesetDeclarationToken extends aCssDeclarationToken { } class CssAtKeyframesParserPlugin extends aCssParserPlugin { private $atRuleName = ""; private $selectors = array(); public function getTriggerChars() { return array("@", "{", "}", ":", ",", ";"); } public function getTriggerStates() { return array("T_DOCUMENT", "T_AT_KEYFRAMES::NAME", "T_AT_KEYFRAMES", "T_AT_KEYFRAMES_RULESETS", "T_AT_KEYFRAMES_RULESET", "T_AT_KEYFRAMES_RULESET_DECLARATION"); } public function parse($index, $char, $previousChar, $state) { if ($char === "@" && $state === "T_DOCUMENT" && strtolower(substr($this->parser->getSource(), $index, 10)) === "@keyframes") { $this->atRuleName = "keyframes"; $this->parser->pushState("T_AT_KEYFRAMES::NAME"); $this->parser->clearBuffer(); return $index + 10; } elseif ($char === "@" && $state === "T_DOCUMENT" && strtolower(substr($this->parser->getSource(), $index, 15)) === "@-moz-keyframes") { $this->atRuleName = "-moz-keyframes"; $this->parser->pushState("T_AT_KEYFRAMES::NAME"); $this->parser->clearBuffer(); return $index + 15; } elseif ($char === "@" && $state === "T_DOCUMENT" && strtolower(substr($this->parser->getSource(), $index, 18)) === "@-webkit-keyframes") { $this->atRuleName = "-webkit-keyframes"; $this->parser->pushState("T_AT_KEYFRAMES::NAME"); $this->parser->clearBuffer(); return $index + 18; } elseif ($char === "{" && $state === "T_AT_KEYFRAMES::NAME") { $name = $this->parser->getAndClearBuffer("{\"'"); $this->parser->setState("T_AT_KEYFRAMES_RULESETS"); $this->parser->clearBuffer(); $this->parser->appendToken(new CssAtKeyframesStartToken($name, $this->atRuleName)); } if ($char === "," && $state === "T_AT_KEYFRAMES_RULESETS") { $this->selectors[] = $this->parser->getAndClearBuffer(",{"); } elseif ($char === "{" && $state === "T_AT_KEYFRAMES_RULESETS") { if ($this->parser->getBuffer() !== "") { $this->selectors[] = $this->parser->getAndClearBuffer(",{"); $this->parser->pushState("T_AT_KEYFRAMES_RULESET"); $this->parser->appendToken(new CssAtKeyframesRulesetStartToken($this->selectors)); $this->selectors = array(); } } elseif ($char === ":" && $state === "T_AT_KEYFRAMES_RULESET") { $this->parser->pushState("T_AT_KEYFRAMES_RULESET_DECLARATION"); $this->buffer = $this->parser->getAndClearBuffer(":;", true); } elseif ($char === ":" && $state === "T_AT_KEYFRAMES_RULESET_DECLARATION") { if ($this->buffer === "filter") { return false; } CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Unterminated @keyframes ruleset declaration", $this->buffer . ":" . $this->parser->getBuffer() . "_")); } elseif (($char === ";" || $char === "}") && $state === "T_AT_KEYFRAMES_RULESET_DECLARATION") { $value = $this->parser->getAndClearBuffer(";}"); if (strtolower(substr($value, -10, 10)) === "!important") { $value = trim(substr($value, 0, -10)); $isImportant = true; } else { $isImportant = false; } $this->parser->popState(); $this->parser->appendToken(new CssAtKeyframesRulesetDeclarationToken($this->buffer, $value, $isImportant)); if ($char === "}") { $this->parser->appendToken(new CssAtKeyframesRulesetEndToken()); $this->parser->popState(); } $this->buffer = ""; } elseif ($char === "}" && $state === "T_AT_KEYFRAMES_RULESET") { $this->parser->clearBuffer(); $this->parser->popState(); $this->parser->appendToken(new CssAtKeyframesRulesetEndToken()); } elseif ($char === "}" && $state === "T_AT_KEYFRAMES_RULESETS") { $this->parser->clearBuffer(); $this->parser->popState(); $this->parser->appendToken(new CssAtKeyframesEndToken()); } else { return false; } return true; } } class CssAtKeyframesEndToken extends aCssAtBlockEndToken { } class CssAtImportToken extends aCssToken { public $Import = ""; public $MediaTypes = array(); public function __construct($import, $mediaTypes) { $this->Import = $import; $this->MediaTypes = $mediaTypes ? $mediaTypes : array(); } public function __toString() { return "@import \"" . $this->Import . "\"" . (count($this->MediaTypes) > 0 ? " " . implode(",", $this->MediaTypes) : ""). ";"; } } class CssAtImportParserPlugin extends aCssParserPlugin { public function getTriggerChars() { return array("@", ";", ",", "\n"); } public function getTriggerStates() { return array("T_DOCUMENT", "T_AT_IMPORT"); } public function parse($index, $char, $previousChar, $state) { if ($char === "@" && $state === "T_DOCUMENT" && strtolower(substr($this->parser->getSource(), $index, 7)) === "@import") { $this->parser->pushState("T_AT_IMPORT"); $this->parser->clearBuffer(); return $index + 7; } elseif (($char === ";" || $char === "\n") && $state === "T_AT_IMPORT") { $this->buffer = $this->parser->getAndClearBuffer(";"); $pos = false; foreach (array(")", "\"", "'") as $needle) { if (($pos = strrpos($this->buffer, $needle)) !== false) { break; } } $import = substr($this->buffer, 0, $pos + 1); if (stripos($import, "url(") === 0) { $import = substr($import, 4, -1); } $import = trim($import, " \t\n\r\0\x0B'\""); $mediaTypes = array_filter(array_map("trim", explode(",", trim(substr($this->buffer, $pos + 1), " \t\n\r\0\x0B{")))); if ($pos) { $this->parser->appendToken(new CssAtImportToken($import, $mediaTypes)); } else { CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Invalid @import at-rule syntax", $this->parser->buffer)); } $this->parser->popState(); } else { return false; } return true; } } class CssAtFontFaceStartToken extends aCssAtBlockStartToken { public function __toString() { return "@font-face{"; } } class CssAtFontFaceParserPlugin extends aCssParserPlugin { public function getTriggerChars() { return array("@", "{", "}", ":", ";"); } public function getTriggerStates() { return array("T_DOCUMENT", "T_AT_FONT_FACE::PREPARE", "T_AT_FONT_FACE", "T_AT_FONT_FACE_DECLARATION"); } public function parse($index, $char, $previousChar, $state) { if ($char === "@" && $state === "T_DOCUMENT" && strtolower(substr($this->parser->getSource(), $index, 10)) === "@font-face") { $this->parser->pushState("T_AT_FONT_FACE::PREPARE"); $this->parser->clearBuffer(); return $index + 10; } elseif ($char === "{" && $state === "T_AT_FONT_FACE::PREPARE") { $this->parser->setState("T_AT_FONT_FACE"); $this->parser->clearBuffer(); $this->parser->appendToken(new CssAtFontFaceStartToken()); } elseif ($char === ":" && $state === "T_AT_FONT_FACE") { $this->parser->pushState("T_AT_FONT_FACE_DECLARATION"); $this->buffer = $this->parser->getAndClearBuffer(":", true); } elseif ($char === ":" && $state === "T_AT_FONT_FACE_DECLARATION") { if ($this->buffer === "filter") { return false; } CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Unterminated @font-face declaration", $this->buffer . ":" . $this->parser->getBuffer() . "_")); } elseif (($char === ";" || $char === "}") && $state === "T_AT_FONT_FACE_DECLARATION") { $value = $this->parser->getAndClearBuffer(";}"); if (strtolower(substr($value, -10, 10)) === "!important") { $value = trim(substr($value, 0, -10)); $isImportant = true; } else { $isImportant = false; } $this->parser->popState(); $this->parser->appendToken(new CssAtFontFaceDeclarationToken($this->buffer, $value, $isImportant)); $this->buffer = ""; if ($char === "}") { $this->parser->appendToken(new CssAtFontFaceEndToken()); $this->parser->popState(); } } elseif ($char === "}" && $state === "T_AT_FONT_FACE") { $this->parser->appendToken(new CssAtFontFaceEndToken()); $this->parser->clearBuffer(); $this->parser->popState(); } else { return false; } return true; } } class CssAtFontFaceEndToken extends aCssAtBlockEndToken { } class CssAtFontFaceDeclarationToken extends aCssDeclarationToken { } class CssAtCharsetToken extends aCssToken { public $Charset = ""; public function __construct($charset) { $this->Charset = $charset; } public function __toString() { return "@charset " . $this->Charset . ";"; } } class CssAtCharsetParserPlugin extends aCssParserPlugin { public function getTriggerChars() { return array("@", ";", "\n"); } public function getTriggerStates() { return array("T_DOCUMENT", "T_AT_CHARSET"); } public function parse($index, $char, $previousChar, $state) { if ($char === "@" && $state === "T_DOCUMENT" && strtolower(substr($this->parser->getSource(), $index, 8)) === "@charset") { $this->parser->pushState("T_AT_CHARSET"); $this->parser->clearBuffer(); return $index + 8; } elseif (($char === ";" || $char === "\n") && $state === "T_AT_CHARSET") { $charset = $this->parser->getAndClearBuffer(";"); $this->parser->popState(); $this->parser->appendToken(new CssAtCharsetToken($charset)); } else { return false; } return true; } }
+ abstract class aCssToken { abstract public function __toString(); } abstract class aCssRulesetStartToken extends aCssToken { } abstract class aCssRulesetEndToken extends aCssToken { public function __toString() { return "}"; } } abstract class aCssParserPlugin { protected $configuration = array(); protected $parser = null; protected $buffer = ""; public function __construct(CssParser $parser, array $configuration = null) { $this->configuration = $configuration; $this->parser = $parser; } abstract public function getTriggerChars(); abstract public function getTriggerStates(); abstract public function parse($index, $char, $previousChar, $state); } abstract class aCssMinifierPlugin { protected $configuration = array(); protected $minifier = null; public function __construct(CssMinifier $minifier, array $configuration = array()) { $this->configuration = $configuration; $this->minifier = $minifier; } abstract public function apply(aCssToken &$token); abstract public function getTriggerTokens(); } abstract class aCssMinifierFilter { protected $configuration = array(); protected $minifier = null; public function __construct(CssMinifier $minifier, array $configuration = array()) { $this->configuration = $configuration; $this->minifier = $minifier; } abstract public function apply(array &$tokens); } abstract class aCssFormatter { protected $indent = " "; protected $padding = 0; protected $tokens = array(); public function __construct(array $tokens, $indent = null, $padding = null) { $this->tokens = $tokens; $this->indent = !is_null($indent) ? $indent : $this->indent; $this->padding = !is_null($padding) ? $padding : $this->padding; } abstract public function __toString(); } abstract class aCssDeclarationToken extends aCssToken { public $IsImportant = false; public $IsLast = false; public $Property = ""; public $Value = ""; public function __construct($property, $value, $isImportant = false, $isLast = false) { $this->Property = $property; $this->Value = $value; $this->IsImportant = $isImportant; $this->IsLast = $isLast; } public function __toString() { return $this->Property . ":" . $this->Value . ($this->IsImportant ? " !important" : "") . ($this->IsLast ? "" : ";"); } } abstract class aCssAtBlockStartToken extends aCssToken { } abstract class aCssAtBlockEndToken extends aCssToken { public function __toString() { return "}"; } } class CssWhitesmithsFormatter extends aCssFormatter { public function __toString() { $r = array(); $level = 0; for ($i = 0, $l = count($this->tokens); $i < $l; $i++) { $token = $this->tokens[$i]; $class = get_class($token); $indent = str_repeat($this->indent, $level); if ($class === "CssCommentToken") { $lines = array_map("trim", explode("\n", $token->Comment)); for ($ii = 0, $ll = count($lines); $ii < $ll; $ii++) { $r[] = $indent . (substr($lines[$ii], 0, 1) == "*" ? " " : "") . $lines[$ii]; } } elseif ($class === "CssAtCharsetToken") { $r[] = $indent . "@charset " . $token->Charset . ";"; } elseif ($class === "CssAtFontFaceStartToken") { $r[] = $indent . "@font-face"; $r[] = $this->indent . $indent . "{"; $level++; } elseif ($class === "CssAtImportToken") { $r[] = $indent . "@import " . $token->Import . " " . implode(", ", $token->MediaTypes) . ";"; } elseif ($class === "CssAtKeyframesStartToken") { $r[] = $indent . "@keyframes \"" . $token->Name . "\""; $r[] = $this->indent . $indent . "{"; $level++; } elseif ($class === "CssAtMediaStartToken") { $r[] = $indent . "@media " . implode(", ", $token->MediaTypes); $r[] = $this->indent . $indent . "{"; $level++; } elseif ($class === "CssAtPageStartToken") { $r[] = $indent . "@page"; $r[] = $this->indent . $indent . "{"; $level++; } elseif ($class === "CssAtVariablesStartToken") { $r[] = $indent . "@variables " . implode(", ", $token->MediaTypes); $r[] = $this->indent . $indent . "{"; $level++; } elseif ($class === "CssRulesetStartToken" || $class === "CssAtKeyframesRulesetStartToken") { $r[] = $indent . implode(", ", $token->Selectors); $r[] = $this->indent . $indent . "{"; $level++; } elseif ($class == "CssAtFontFaceDeclarationToken" || $class === "CssAtKeyframesRulesetDeclarationToken" || $class === "CssAtPageDeclarationToken" || $class == "CssAtVariablesDeclarationToken" || $class === "CssRulesetDeclarationToken" ) { $declaration = $indent . $token->Property . ": "; if ($this->padding) { $declaration = str_pad($declaration, $this->padding, " ", STR_PAD_RIGHT); } $r[] = $declaration . $token->Value . ($token->IsImportant ? " !important" : "") . ";"; } elseif ($class === "CssAtFontFaceEndToken" || $class === "CssAtMediaEndToken" || $class === "CssAtKeyframesEndToken" || $class === "CssAtKeyframesRulesetEndToken" || $class === "CssAtPageEndToken" || $class === "CssAtVariablesEndToken" || $class === "CssRulesetEndToken" ) { $r[] = $indent . "}"; $level--; } } return implode("\n", $r); } } class CssVariablesMinifierPlugin extends aCssMinifierPlugin { private $reMatch = "/var\((.+)\)/iSU"; private $variables = null; public function getVariables() { return $this->variables; } public function apply(aCssToken &$token) { if (stripos($token->Value, "var") !== false && preg_match_all($this->reMatch, $token->Value, $m)) { $mediaTypes = $token->MediaTypes; if (!in_array("all", $mediaTypes)) { $mediaTypes[] = "all"; } for ($i = 0, $l = count($m[0]); $i < $l; $i++) { $variable = trim($m[1][$i]); foreach ($mediaTypes as $mediaType) { if (isset($this->variables[$mediaType], $this->variables[$mediaType][$variable])) { $token->Value = str_replace($m[0][$i], $this->variables[$mediaType][$variable], $token->Value); continue 2; } } CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": No value found for variable <code>" . $variable . "</code> in media types <code>" . implode(", ", $mediaTypes) . "</code>", (string) $token)); $token = new CssNullToken(); return true; } } return false; } public function getTriggerTokens() { return array ( "CssAtFontFaceDeclarationToken", "CssAtPageDeclarationToken", "CssRulesetDeclarationToken" ); } public function setVariables(array $variables) { $this->variables = $variables; } } class CssVariablesMinifierFilter extends aCssMinifierFilter { public function apply(array &$tokens) { $variables = array(); $defaultMediaTypes = array("all"); $mediaTypes = array(); $remove = array(); for($i = 0, $l = count($tokens); $i < $l; $i++) { if (get_class($tokens[$i]) === "CssAtVariablesStartToken") { $remove[] = $i; $mediaTypes = (count($tokens[$i]->MediaTypes) == 0 ? $defaultMediaTypes : $tokens[$i]->MediaTypes); foreach ($mediaTypes as $mediaType) { if (!isset($variables[$mediaType])) { $variables[$mediaType] = array(); } } for($i = $i; $i < $l; $i++) { if (get_class($tokens[$i]) === "CssAtVariablesDeclarationToken") { foreach ($mediaTypes as $mediaType) { $variables[$mediaType][$tokens[$i]->Property] = $tokens[$i]->Value; } $remove[] = $i; } elseif (get_class($tokens[$i]) === "CssAtVariablesEndToken") { $remove[] = $i; break; } } } } foreach($variables as $mediaType => $null) { foreach($variables[$mediaType] as $variable => $value) { if (stripos($value, "var") !== false && preg_match_all("/var\((.+)\)/iSU", $value, $m)) { for ($i = 0, $l = count($m[0]); $i < $l; $i++) { $variables[$mediaType][$variable] = str_replace($m[0][$i], (isset($variables[$mediaType][$m[1][$i]]) ? $variables[$mediaType][$m[1][$i]] : ""), $variables[$mediaType][$variable]); } } } } foreach ($remove as $i) { $tokens[$i] = null; } if (!($plugin = $this->minifier->getPlugin("CssVariablesMinifierPlugin"))) { CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": The plugin <code>CssVariablesMinifierPlugin</code> was not found but is required for <code>" . __CLASS__ . "</code>")); } else { $plugin->setVariables($variables); } return count($remove); } } class CssUrlParserPlugin extends aCssParserPlugin { public function getTriggerChars() { return array("(", ")"); } public function getTriggerStates() { return false; } public function parse($index, $char, $previousChar, $state) { if ($char === "(" && strtolower(substr($this->parser->getSource(), $index - 3, 4)) === "url(" && $state !== "T_URL") { $this->parser->pushState("T_URL"); $this->parser->setExclusive(__CLASS__); } elseif ($char === "\n" && $previousChar === "\\" && $state === "T_URL") { $this->parser->setBuffer(substr($this->parser->getBuffer(), 0, -2)); } elseif ($char === "\n" && $previousChar !== "\\" && $state === "T_URL") { $line = $this->parser->getBuffer(); $this->parser->setBuffer(substr($this->parser->getBuffer(), 0, -1) . ")"); $this->parser->popState(); $this->parser->unsetExclusive(); CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Unterminated string literal", $line . "_")); } elseif ($char === ")" && $state === "T_URL") { $this->parser->popState(); $this->parser->unsetExclusive(); } else { return false; } return true; } } class CssStringParserPlugin extends aCssParserPlugin { private $delimiterChar = null; public function getTriggerChars() { return array("\"", "'", "\n"); } public function getTriggerStates() { return false; } public function parse($index, $char, $previousChar, $state) { if (($char === "\"" || $char === "'") && $state !== "T_STRING") { $this->delimiterChar = $char; $this->parser->pushState("T_STRING"); $this->parser->setExclusive(__CLASS__); } elseif ($char === "\n" && $previousChar === "\\" && $state === "T_STRING") { $this->parser->setBuffer(substr($this->parser->getBuffer(), 0, -2)); } elseif ($char === "\n" && $previousChar !== "\\" && $state === "T_STRING") { $line = $this->parser->getBuffer(); $this->parser->popState(); $this->parser->unsetExclusive(); $this->parser->setBuffer(substr($this->parser->getBuffer(), 0, -1) . $this->delimiterChar); CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Unterminated string literal", $line . "_")); $this->delimiterChar = null; } elseif ($char === $this->delimiterChar && $state === "T_STRING") { if ($previousChar == "\\") { $source = $this->parser->getSource(); $c = 1; $i = $index - 2; while (substr($source, $i, 1) === "\\") { $c++; $i--; } if ($c % 2) { return false; } } $this->parser->popState(); $this->parser->unsetExclusive(); $this->delimiterChar = null; } else { return false; } return true; } } class CssSortRulesetPropertiesMinifierFilter extends aCssMinifierFilter { public function apply(array &$tokens) { $r = 0; for ($i = 0, $l = count($tokens); $i < $l; $i++) { if (get_class($tokens[$i]) !== "CssRulesetStartToken") { continue; } $endIndex = false; for ($ii = $i + 1; $ii < $l; $ii++) { if (get_class($tokens[$ii]) !== "CssRulesetEndToken") { continue; } $endIndex = $ii; break; } if (!$endIndex) { break; } $startIndex = $i; $i = $endIndex; if ($endIndex - $startIndex <= 2) { continue; } for ($ii = $startIndex + 1; $ii < $endIndex; $ii++) { if (get_class($tokens[$ii]) !== "CssRulesetDeclarationToken") { continue(2); } } $declarations = array_slice($tokens, $startIndex + 1, $endIndex - $startIndex - 1); $sortRequired = $lastPropertyName = false; foreach ($declarations as $declaration) { if ($lastPropertyName) { if (strcmp($lastPropertyName, $declaration->Property) > 0) { $sortRequired = true; break; } } $lastPropertyName = $declaration->Property; } if (!$sortRequired) { continue; } usort($declarations, array(__CLASS__, "userDefinedSort1")); for ($ii = 0, $ll = count($declarations) - 1; $ii <= $ll; $ii++) { if ($ii == $ll) { $declarations[$ii]->IsLast = true; } else { $declarations[$ii]->IsLast = false; } } array_splice($tokens, $startIndex + 1, $endIndex - $startIndex - 1, $declarations); $r += $endIndex - $startIndex - 1; } return $r; } public static function userDefinedSort1($a, $b) { return strcmp($a->Property, $b->Property); } } class CssRulesetStartToken extends aCssRulesetStartToken { public $Selectors = array(); public function __construct(array $selectors = array()) { $this->Selectors = $selectors; } public function __toString() { return implode(",", $this->Selectors) . "{"; } } class CssRulesetParserPlugin extends aCssParserPlugin { public function getTriggerChars() { return array(",", "{", "}", ":", ";"); } public function getTriggerStates() { return array("T_DOCUMENT", "T_AT_MEDIA", "T_RULESET::SELECTORS", "T_RULESET", "T_RULESET_DECLARATION"); } private $selectors = array(); public function parse($index, $char, $previousChar, $state) { if ($char === "," && ($state === "T_DOCUMENT" || $state === "T_AT_MEDIA" || $state === "T_RULESET::SELECTORS")) { if ($state !== "T_RULESET::SELECTORS") { $this->parser->pushState("T_RULESET::SELECTORS"); } $this->selectors[] = $this->parser->getAndClearBuffer(",{"); } elseif ($char === "{" && ($state === "T_DOCUMENT" || $state === "T_AT_MEDIA" || $state === "T_RULESET::SELECTORS")) { if ($this->parser->getBuffer() !== "") { $this->selectors[] = $this->parser->getAndClearBuffer(",{"); if ($state == "T_RULESET::SELECTORS") { $this->parser->popState(); } $this->parser->pushState("T_RULESET"); $this->parser->appendToken(new CssRulesetStartToken($this->selectors)); $this->selectors = array(); } } elseif ($char === ":" && $state === "T_RULESET") { $this->parser->pushState("T_RULESET_DECLARATION"); $this->buffer = $this->parser->getAndClearBuffer(":;", true); } elseif ($char === ":" && $state === "T_RULESET_DECLARATION") { if ($this->buffer === "filter") { return false; } CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Unterminated declaration", $this->buffer . ":" . $this->parser->getBuffer() . "_")); } elseif (($char === ";" || $char === "}") && $state === "T_RULESET_DECLARATION") { $value = $this->parser->getAndClearBuffer(";}"); if (strtolower(substr($value, -10, 10)) === "!important") { $value = trim(substr($value, 0, -10)); $isImportant = true; } else { $isImportant = false; } $this->parser->popState(); $this->parser->appendToken(new CssRulesetDeclarationToken($this->buffer, $value, $this->parser->getMediaTypes(), $isImportant)); if ($char === "}") { $this->parser->appendToken(new CssRulesetEndToken()); $this->parser->popState(); } $this->buffer = ""; } elseif ($char === "}" && $state === "T_RULESET") { $this->parser->popState(); $this->parser->clearBuffer(); $this->parser->appendToken(new CssRulesetEndToken()); $this->buffer = ""; $this->selectors = array(); } else { return false; } return true; } } class CssRulesetEndToken extends aCssRulesetEndToken { } class CssRulesetDeclarationToken extends aCssDeclarationToken { public $MediaTypes = array("all"); public function __construct($property, $value, $mediaTypes = null, $isImportant = false, $isLast = false) { parent::__construct($property, $value, $isImportant, $isLast); $this->MediaTypes = $mediaTypes ? $mediaTypes : array("all"); } } class CssRemoveLastDelarationSemiColonMinifierFilter extends aCssMinifierFilter { public function apply(array &$tokens) { for ($i = 0, $l = count($tokens); $i < $l; $i++) { $current = get_class($tokens[$i]); $next = isset($tokens[$i+1]) ? get_class($tokens[$i+1]) : false; if (($current === "CssRulesetDeclarationToken" && $next === "CssRulesetEndToken") || ($current === "CssAtFontFaceDeclarationToken" && $next === "CssAtFontFaceEndToken") || ($current === "CssAtPageDeclarationToken" && $next === "CssAtPageEndToken")) { $tokens[$i]->IsLast = true; } } return 0; } } class CssRemoveEmptyRulesetsMinifierFilter extends aCssMinifierFilter { public function apply(array &$tokens) { $r = 0; for ($i = 0, $l = count($tokens); $i < $l; $i++) { $current = get_class($tokens[$i]); $next = isset($tokens[$i + 1]) ? get_class($tokens[$i + 1]) : false; if (($current === "CssRulesetStartToken" && $next === "CssRulesetEndToken") || ($current === "CssAtKeyframesRulesetStartToken" && $next === "CssAtKeyframesRulesetEndToken" && !array_intersect(array("from", "0%", "to", "100%"), array_map("strtolower", $tokens[$i]->Selectors))) ) { $tokens[$i] = null; $tokens[$i + 1] = null; $i++; $r = $r + 2; } } return $r; } } class CssRemoveEmptyAtBlocksMinifierFilter extends aCssMinifierFilter { public function apply(array &$tokens) { $r = 0; for ($i = 0, $l = count($tokens); $i < $l; $i++) { $current = get_class($tokens[$i]); $next = isset($tokens[$i + 1]) ? get_class($tokens[$i + 1]) : false; if (($current === "CssAtFontFaceStartToken" && $next === "CssAtFontFaceEndToken") || ($current === "CssAtKeyframesStartToken" && $next === "CssAtKeyframesEndToken") || ($current === "CssAtPageStartToken" && $next === "CssAtPageEndToken") || ($current === "CssAtMediaStartToken" && $next === "CssAtMediaEndToken")) { $tokens[$i] = null; $tokens[$i + 1] = null; $i++; $r = $r + 2; } } return $r; } } class CssRemoveCommentsMinifierFilter extends aCssMinifierFilter { public function apply(array &$tokens) { $r = 0; for ($i = 0, $l = count($tokens); $i < $l; $i++) { if (get_class($tokens[$i]) === "CssCommentToken") { $tokens[$i] = null; $r++; } } return $r; } } class CssParser { private $buffer = ""; private $plugins = array(); private $source = ""; private $state = "T_DOCUMENT"; private $stateExclusive = false; private $stateMediaTypes = false; private $states = array("T_DOCUMENT"); private $tokens = array(); public function __construct($source = null, array $plugins = null) { $plugins = array_merge(array ( "Comment" => true, "String" => true, "Url" => true, "Expression" => true, "Ruleset" => true, "AtCharset" => true, "AtFontFace" => true, "AtImport" => true, "AtKeyframes" => true, "AtMedia" => true, "AtPage" => true, "AtVariables" => true ), is_array($plugins) ? $plugins : array()); foreach ($plugins as $name => $config) { if ($config !== false) { $class = "Css" . $name . "ParserPlugin"; $config = is_array($config) ? $config : array(); if (class_exists($class)) { $this->plugins[] = new $class($this, $config); } else { CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": The plugin <code>" . $name . "</code> with the class name <code>" . $class . "</code> was not found")); } } } if (!is_null($source)) { $this->parse($source); } } public function appendToken(aCssToken $token) { $this->tokens[] = $token; } public function clearBuffer() { $this->buffer = ""; } public function getAndClearBuffer($trim = "", $tolower = false) { $r = $this->getBuffer($trim, $tolower); $this->buffer = ""; return $r; } public function getBuffer($trim = "", $tolower = false) { $r = $this->buffer; if ($trim) { $r = trim($r, " \t\n\r\0\x0B" . $trim); } if ($tolower) { $r = strtolower($r); } return $r; } public function getMediaTypes() { return $this->stateMediaTypes; } public function getSource() { return $this->source; } public function getState() { return $this->state; } public function getPlugin($class) { static $index = null; if (is_null($index)) { $index = array(); for ($i = 0, $l = count($this->plugins); $i < $l; $i++) { $index[get_class($this->plugins[$i])] = $i; } } return isset($index[$class]) ? $this->plugins[$index[$class]] : false; } public function getTokens() { return $this->tokens; } public function isState($state) { return ($this->state == $state); } public function parse($source) { $this->source = ""; $this->tokens = array(); $globalTriggerChars = ""; $plugins = $this->plugins; $pluginCount = count($plugins); $pluginIndex = array(); $pluginTriggerStates = array(); $pluginTriggerChars = array(); for ($i = 0, $l = count($plugins); $i < $l; $i++) { $tPluginClassName = get_class($plugins[$i]); $pluginTriggerChars[$i] = implode("", $plugins[$i]->getTriggerChars()); $tPluginTriggerStates = $plugins[$i]->getTriggerStates(); $pluginTriggerStates[$i] = $tPluginTriggerStates === false ? false : "|" . implode("|", $tPluginTriggerStates) . "|"; $pluginIndex[$tPluginClassName] = $i; for ($ii = 0, $ll = strlen($pluginTriggerChars[$i]); $ii < $ll; $ii++) { $c = substr($pluginTriggerChars[$i], $ii, 1); if (strpos($globalTriggerChars, $c) === false) { $globalTriggerChars .= $c; } } } $source = str_replace("\r\n", "\n", $source); $source = str_replace("\r", "\n", $source); $this->source = $source; $buffer = &$this->buffer; $exclusive = &$this->stateExclusive; $state = &$this->state; $c = $p = null; for ($i = 0, $l = strlen($source); $i < $l; $i++) { $c = $source[$i]; if ($exclusive === false) { if ($c === "\n" || $c === "\t") { $c = " "; } if ($c === " " && $p === " ") { continue; } } $buffer .= $c; if (strpos($globalTriggerChars, $c) !== false) { if ($exclusive) { $tPluginIndex = $pluginIndex[$exclusive]; if (strpos($pluginTriggerChars[$tPluginIndex], $c) !== false && ($pluginTriggerStates[$tPluginIndex] === false || strpos($pluginTriggerStates[$tPluginIndex], $state) !== false)) { $r = $plugins[$tPluginIndex]->parse($i, $c, $p, $state); if ($r === true) { continue; } elseif ($r !== false && $r != $i) { $i = $r; continue; } } } else { $triggerState = "|" . $state . "|"; for ($ii = 0, $ll = $pluginCount; $ii < $ll; $ii++) { if (strpos($pluginTriggerChars[$ii], $c) !== false && ($pluginTriggerStates[$ii] === false || strpos($pluginTriggerStates[$ii], $triggerState) !== false)) { $r = $plugins[$ii]->parse($i, $c, $p, $state); if ($r === true) { break; } elseif ($r !== false && $r != $i) { $i = $r; break; } } } } } $p = $c; } return $this->tokens; } public function popState() { $r = array_pop($this->states); $this->state = $this->states[count($this->states) - 1]; return $r; } public function pushState($state) { $r = array_push($this->states, $state); $this->state = $this->states[count($this->states) - 1]; return $r; } public function setBuffer($buffer) { $this->buffer = $buffer; } public function setExclusive($exclusive) { $this->stateExclusive = $exclusive; } public function setMediaTypes(array $mediaTypes) { $this->stateMediaTypes = $mediaTypes; } public function setState($state) { $r = array_pop($this->states); array_push($this->states, $state); $this->state = $this->states[count($this->states) - 1]; return $r; } public function unsetExclusive() { $this->stateExclusive = false; } public function unsetMediaTypes() { $this->stateMediaTypes = false; } } class CssOtbsFormatter extends aCssFormatter { public function __toString() { $r = array(); $level = 0; for ($i = 0, $l = count($this->tokens); $i < $l; $i++) { $token = $this->tokens[$i]; $class = get_class($token); $indent = str_repeat($this->indent, $level); if ($class === "CssCommentToken") { $lines = array_map("trim", explode("\n", $token->Comment)); for ($ii = 0, $ll = count($lines); $ii < $ll; $ii++) { $r[] = $indent . (substr($lines[$ii], 0, 1) == "*" ? " " : "") . $lines[$ii]; } } elseif ($class === "CssAtCharsetToken") { $r[] = $indent . "@charset " . $token->Charset . ";"; } elseif ($class === "CssAtFontFaceStartToken") { $r[] = $indent . "@font-face {"; $level++; } elseif ($class === "CssAtImportToken") { $r[] = $indent . "@import " . $token->Import . " " . implode(", ", $token->MediaTypes) . ";"; } elseif ($class === "CssAtKeyframesStartToken") { $r[] = $indent . "@keyframes \"" . $token->Name . "\" {"; $level++; } elseif ($class === "CssAtMediaStartToken") { $r[] = $indent . "@media " . implode(", ", $token->MediaTypes) . " {"; $level++; } elseif ($class === "CssAtPageStartToken") { $r[] = $indent . "@page {"; $level++; } elseif ($class === "CssAtVariablesStartToken") { $r[] = $indent . "@variables " . implode(", ", $token->MediaTypes) . " {"; $level++; } elseif ($class === "CssRulesetStartToken" || $class === "CssAtKeyframesRulesetStartToken") { $r[] = $indent . implode(", ", $token->Selectors) . " {"; $level++; } elseif ($class == "CssAtFontFaceDeclarationToken" || $class === "CssAtKeyframesRulesetDeclarationToken" || $class === "CssAtPageDeclarationToken" || $class == "CssAtVariablesDeclarationToken" || $class === "CssRulesetDeclarationToken" ) { $declaration = $indent . $token->Property . ": "; if ($this->padding) { $declaration = str_pad($declaration, $this->padding, " ", STR_PAD_RIGHT); } $r[] = $declaration . $token->Value . ($token->IsImportant ? " !important" : "") . ";"; } elseif ($class === "CssAtFontFaceEndToken" || $class === "CssAtMediaEndToken" || $class === "CssAtKeyframesEndToken" || $class === "CssAtKeyframesRulesetEndToken" || $class === "CssAtPageEndToken" || $class === "CssAtVariablesEndToken" || $class === "CssRulesetEndToken" ) { $level--; $r[] = str_repeat($indent, $level) . "}"; } } return implode("\n", $r); } } class CssNullToken extends aCssToken { public function __toString() { return ""; } } class CssMinifier { private $filters = array(); private $plugins = array(); private $minified = ""; public function __construct($source = null, array $filters = null, array $plugins = null) { $filters = array_merge(array ( "ImportImports" => false, "RemoveComments" => true, "RemoveEmptyRulesets" => true, "RemoveEmptyAtBlocks" => true, "ConvertLevel3Properties" => false, "ConvertLevel3AtKeyframes" => false, "Variables" => true, "RemoveLastDelarationSemiColon" => true ), is_array($filters) ? $filters : array()); $plugins = array_merge(array ( "Variables" => true, "ConvertFontWeight" => false, "ConvertHslColors" => false, "ConvertRgbColors" => false, "ConvertNamedColors" => false, "CompressColorValues" => false, "CompressUnitValues" => false, "CompressExpressionValues" => false ), is_array($plugins) ? $plugins : array()); foreach ($filters as $name => $config) { if ($config !== false) { $class = "Css" . $name . "MinifierFilter"; $config = is_array($config) ? $config : array(); if (class_exists($class)) { $this->filters[] = new $class($this, $config); } else { CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": The filter <code>" . $name . "</code> with the class name <code>" . $class . "</code> was not found")); } } } foreach ($plugins as $name => $config) { if ($config !== false) { $class = "Css" . $name . "MinifierPlugin"; $config = is_array($config) ? $config : array(); if (class_exists($class)) { $this->plugins[] = new $class($this, $config); } else { CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": The plugin <code>" . $name . "</code> with the class name <code>" . $class . "</code> was not found")); } } } if (!is_null($source)) { $this->minify($source); } } public function getMinified() { return $this->minified; } public function getPlugin($class) { static $index = null; if (is_null($index)) { $index = array(); for ($i = 0, $l = count($this->plugins); $i < $l; $i++) { $index[get_class($this->plugins[$i])] = $i; } } return isset($index[$class]) ? $this->plugins[$index[$class]] : false; } public function minify($source) { $r = ""; $parser = new CssParser($source); $tokens = $parser->getTokens(); $filters = $this->filters; $filterCount = count($this->filters); $plugins = $this->plugins; $pluginCount = count($plugins); $pluginIndex = array(); $pluginTriggerTokens = array(); $globalTriggerTokens = array(); for ($i = 0, $l = count($plugins); $i < $l; $i++) { $tPluginClassName = get_class($plugins[$i]); $pluginTriggerTokens[$i] = $plugins[$i]->getTriggerTokens(); foreach ($pluginTriggerTokens[$i] as $v) { if (!in_array($v, $globalTriggerTokens)) { $globalTriggerTokens[] = $v; } } $pluginTriggerTokens[$i] = "|" . implode("|", $pluginTriggerTokens[$i]) . "|"; $pluginIndex[$tPluginClassName] = $i; } $globalTriggerTokens = "|" . implode("|", $globalTriggerTokens) . "|"; for($i = 0; $i < $filterCount; $i++) { if ($filters[$i]->apply($tokens) > 0) { $tokens = array_values(array_filter($tokens)); } } $tokenCount = count($tokens); for($i = 0; $i < $tokenCount; $i++) { $triggerToken = "|" . get_class($tokens[$i]) . "|"; if (strpos($globalTriggerTokens, $triggerToken) !== false) { for($ii = 0; $ii < $pluginCount; $ii++) { if (strpos($pluginTriggerTokens[$ii], $triggerToken) !== false || $pluginTriggerTokens[$ii] === false) { if ($plugins[$ii]->apply($tokens[$i]) === true) { continue 2; } } } } } for($i = 0; $i < $tokenCount; $i++) { $r .= (string) $tokens[$i]; } $this->minified = $r; return $r; } } class CssMin { private static $classIndex = array(); private static $errors = array(); private static $isVerbose = false; public static function autoload($class) { if (isset(self::$classIndex[$class])) { require(self::$classIndex[$class]); } } public static function getErrors() { return self::$errors; } public static function hasErrors() { return count(self::$errors) > 0; } public static function initialise() { $paths = array(dirname(__FILE__)); while (list($i, $path) = each($paths)) { $subDirectorys = glob($path . "*", GLOB_MARK | GLOB_ONLYDIR | GLOB_NOSORT); if (is_array($subDirectorys)) { foreach ($subDirectorys as $subDirectory) { $paths[] = $subDirectory; } } $files = glob($path . "*.php", 0); if (is_array($files)) { foreach ($files as $file) { $class = substr(basename($file), 0, -4); self::$classIndex[$class] = $file; } } } krsort(self::$classIndex); if (function_exists("spl_autoload_register") && !is_callable("__autoload")) { spl_autoload_register(array(__CLASS__, "autoload")); } else { foreach (self::$classIndex as $class => $file) { if (!class_exists($class)) { require_once($file); } } } } public static function minify($source, array $filters = null, array $plugins = null) { self::$errors = array(); $minifier = new CssMinifier($source, $filters, $plugins); return $minifier->getMinified(); } public static function parse($source, array $plugins = null) { self::$errors = array(); $parser = new CssParser($source, $plugins); return $parser->getTokens(); } public static function setVerbose($to) { self::$isVerbose = (boolean) $to; return self::$isVerbose; } public static function triggerError(CssError $error) { self::$errors[] = $error; if (self::$isVerbose) { trigger_error((string) $error, E_USER_WARNING); } } } CssMin::initialise(); class CssImportImportsMinifierFilter extends aCssMinifierFilter { private $imported = array(); public function apply(array &$tokens) { if (!isset($this->configuration["BasePath"]) || !is_dir($this->configuration["BasePath"])) { CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Base path <code>" . ($this->configuration["BasePath"] ? $this->configuration["BasePath"] : "null"). "</code> is not a directory")); return 0; } for ($i = 0, $l = count($tokens); $i < $l; $i++) { if (get_class($tokens[$i]) === "CssAtImportToken") { $import = $this->configuration["BasePath"] . "/" . $tokens[$i]->Import; if (!is_file($import)) { CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Import file <code>" . $import. "</code> was not found.", (string) $tokens[$i])); } elseif (in_array($import, $this->imported)) { CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Import file <code>" . $import. "</code> was already imported.", (string) $tokens[$i])); $tokens[$i] = null; } else { $this->imported[] = $import; $parser = new CssParser(file_get_contents($import)); $import = $parser->getTokens(); if (count($tokens[$i]->MediaTypes) > 0 && !(count($tokens[$i]->MediaTypes) == 1 && $tokens[$i]->MediaTypes[0] == "all")) { $blocks = array(); for($ii = 0, $ll = count($import); $ii < $ll; $ii++) { if (get_class($import[$ii]) === "CssAtImportToken") { if (count($import[$ii]->MediaTypes) == 0 || (count($import[$ii]->MediaTypes) == 1 && $import[$ii]->MediaTypes[0] == "all")) { $import[$ii]->MediaTypes = $tokens[$i]->MediaTypes; } elseif (count($import[$ii]->MediaTypes > 0)) { foreach ($import[$ii]->MediaTypes as $index => $mediaType) { if (!in_array($mediaType, $tokens[$i]->MediaTypes)) { unset($import[$ii]->MediaTypes[$index]); } } $import[$ii]->MediaTypes = array_values($import[$ii]->MediaTypes); if (count($import[$ii]->MediaTypes) == 0) { $import[$ii] = null; } } } } for($ii = 0, $ll = count($import); $ii < $ll; $ii++) { if (get_class($import[$ii]) === "CssAtMediaStartToken") { foreach ($import[$ii]->MediaTypes as $index => $mediaType) { if (!in_array($mediaType, $tokens[$i]->MediaTypes)) { unset($import[$ii]->MediaTypes[$index]); } $import[$ii]->MediaTypes = array_values($import[$ii]->MediaTypes); } } } for($ii = 0, $ll = count($import); $ii < $ll; $ii++) { if (get_class($import[$ii]) === "CssAtMediaStartToken") { if (count($import[$ii]->MediaTypes) === 0) { for ($iii = $ii; $iii < $ll; $iii++) { if (get_class($import[$iii]) === "CssAtMediaEndToken") { break; } } if (get_class($import[$iii]) === "CssAtMediaEndToken") { array_splice($import, $ii, $iii - $ii + 1, array()); $ll = count($import); } } } } for($ii = 0, $ll = count($import); $ii < $ll; $ii++) { if (get_class($import[$ii]) === "CssAtMediaStartToken" && count(array_diff($tokens[$i]->MediaTypes, $import[$ii]->MediaTypes)) === 0) { for ($iii = $ii; $iii < $ll; $iii++) { if (get_class($import[$iii]) == "CssAtMediaEndToken") { break; } } if (get_class($import[$iii]) == "CssAtMediaEndToken") { unset($import[$ii]); unset($import[$iii]); $import = array_values($import); $ll = count($import); } } } for($ii = 0, $ll = count($import); $ii < $ll; $ii++) { $class = get_class($import[$ii]); if ($class === "CssAtImportToken" || $class === "CssAtCharsetToken") { $blocks = array_merge($blocks, array_splice($import, $ii, 1, array())); $ll = count($import); } } for($ii = 0, $ll = count($import); $ii < $ll; $ii++) { $class = get_class($import[$ii]); if ($class === "CssAtFontFaceStartToken" || $class === "CssAtMediaStartToken" || $class === "CssAtPageStartToken" || $class === "CssAtVariablesStartToken") { for ($iii = $ii; $iii < $ll; $iii++) { $class = get_class($import[$iii]); if ($class === "CssAtFontFaceEndToken" || $class === "CssAtMediaEndToken" || $class === "CssAtPageEndToken" || $class === "CssAtVariablesEndToken") { break; } } $class = get_class($import[$iii]); if (isset($import[$iii]) && ($class === "CssAtFontFaceEndToken" || $class === "CssAtMediaEndToken" || $class === "CssAtPageEndToken" || $class === "CssAtVariablesEndToken")) { $blocks = array_merge($blocks, array_splice($import, $ii, $iii - $ii + 1, array())); $ll = count($import); } } } $import = array_merge($blocks, array(new CssAtMediaStartToken($tokens[$i]->MediaTypes)), $import, array(new CssAtMediaEndToken())); } array_splice($tokens, $i, 1, $import); $i--; $l = count($tokens); } } } } } class CssExpressionParserPlugin extends aCssParserPlugin { private $leftBraces = 0; private $rightBraces = 0; public function getTriggerChars() { return array("(", ")", ";", "}"); } public function getTriggerStates() { return false; } public function parse($index, $char, $previousChar, $state) { if ($char === "(" && strtolower(substr($this->parser->getSource(), $index - 10, 11)) === "expression(" && $state !== "T_EXPRESSION") { $this->parser->pushState("T_EXPRESSION"); $this->leftBraces++; } elseif ($char === "(" && $state === "T_EXPRESSION") { $this->leftBraces++; } elseif ($char === ")" && $state === "T_EXPRESSION") { $this->rightBraces++; } elseif (($char === ";" || $char === "}") && $state === "T_EXPRESSION" && $this->leftBraces === $this->rightBraces) { $this->leftBraces = $this->rightBraces = 0; $this->parser->popState(); return $index - 1; } else { return false; } return true; } } class CssError { public $File = ""; public $Line = 0; public $Message = ""; public $Source = ""; public function __construct($file, $line, $message, $source = "") { $this->File = $file; $this->Line = $line; $this->Message = $message; $this->Source = $source; } public function __toString() { return $this->Message . ($this->Source ? ": <br /><code>" . $this->Source . "</code>": "") . "<br />in file " . $this->File . " at line " . $this->Line; } } class CssConvertRgbColorsMinifierPlugin extends aCssMinifierPlugin { private $reMatch = "/rgb\s*\(\s*([0-9%]+)\s*,\s*([0-9%]+)\s*,\s*([0-9%]+)\s*\)/iS"; public function apply(aCssToken &$token) { if (stripos($token->Value, "rgb") !== false && preg_match($this->reMatch, $token->Value, $m)) { for ($i = 1, $l = count($m); $i < $l; $i++) { if (strpos("%", $m[$i]) !== false) { $m[$i] = substr($m[$i], 0, -1); $m[$i] = (int) (256 * ($m[$i] / 100)); } $m[$i] = str_pad(dechex($m[$i]), 2, "0", STR_PAD_LEFT); } $token->Value = str_replace($m[0], "#" . $m[1] . $m[2] . $m[3], $token->Value); } return false; } public function getTriggerTokens() { return array ( "CssAtFontFaceDeclarationToken", "CssAtPageDeclarationToken", "CssRulesetDeclarationToken" ); } } class CssConvertNamedColorsMinifierPlugin extends aCssMinifierPlugin { private $reMatch = null; private $reReplace = "\"\${1}\" . \$this->transformation[strtolower(\"\${2}\")] . \"\${3}\""; private $transformation = array ( "aliceblue" => "#f0f8ff", "antiquewhite" => "#faebd7", "aqua" => "#0ff", "aquamarine" => "#7fffd4", "azure" => "#f0ffff", "beige" => "#f5f5dc", "black" => "#000", "blue" => "#00f", "blueviolet" => "#8a2be2", "brown" => "#a52a2a", "burlywood" => "#deb887", "cadetblue" => "#5f9ea0", "chartreuse" => "#7fff00", "chocolate" => "#d2691e", "coral" => "#ff7f50", "cornflowerblue" => "#6495ed", "cornsilk" => "#fff8dc", "crimson" => "#dc143c", "darkblue" => "#00008b", "darkcyan" => "#008b8b", "darkgoldenrod" => "#b8860b", "darkgray" => "#a9a9a9", "darkgreen" => "#006400", "darkkhaki" => "#bdb76b", "darkmagenta" => "#8b008b", "darkolivegreen" => "#556b2f", "darkorange" => "#ff8c00", "darkorchid" => "#9932cc", "darkred" => "#8b0000", "darksalmon" => "#e9967a", "darkseagreen" => "#8fbc8f", "darkslateblue" => "#483d8b", "darkslategray" => "#2f4f4f", "darkturquoise" => "#00ced1", "darkviolet" => "#9400d3", "deeppink" => "#ff1493", "deepskyblue" => "#00bfff", "dimgray" => "#696969", "dodgerblue" => "#1e90ff", "firebrick" => "#b22222", "floralwhite" => "#fffaf0", "forestgreen" => "#228b22", "fuchsia" => "#f0f", "gainsboro" => "#dcdcdc", "ghostwhite" => "#f8f8ff", "gold" => "#ffd700", "goldenrod" => "#daa520", "gray" => "#808080", "green" => "#008000", "greenyellow" => "#adff2f", "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", "lightgreen" => "#90ee90", "lightgrey" => "#d3d3d3", "lightpink" => "#ffb6c1", "lightsalmon" => "#ffa07a", "lightseagreen" => "#20b2aa", "lightskyblue" => "#87cefa", "lightslategray" => "#789", "lightsteelblue" => "#b0c4de", "lightyellow" => "#ffffe0", "lime" => "#0f0", "limegreen" => "#32cd32", "linen" => "#faf0e6", "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" => "#f00", "rosybrown" => "#bc8f8f", "royalblue" => "#4169e1", "saddlebrown" => "#8b4513", "salmon" => "#fa8072", "sandybrown" => "#f4a460", "seagreen" => "#2e8b57", "seashell" => "#fff5ee", "sienna" => "#a0522d", "silver" => "#c0c0c0", "skyblue" => "#87ceeb", "slateblue" => "#6a5acd", "slategray" => "#708090", "snow" => "#fffafa", "springgreen" => "#00ff7f", "steelblue" => "#4682b4", "tan" => "#d2b48c", "teal" => "#008080", "thistle" => "#d8bfd8", "tomato" => "#ff6347", "turquoise" => "#40e0d0", "violet" => "#ee82ee", "wheat" => "#f5deb3", "white" => "#fff", "whitesmoke" => "#f5f5f5", "yellow" => "#ff0", "yellowgreen" => "#9acd32" ); public function __construct(CssMinifier $minifier, array $configuration = array()) { $this->reMatch = "/(^|\s)+(" . implode("|", array_keys($this->transformation)) . ")(\s|$)+/eiS"; parent::__construct($minifier, $configuration); } public function apply(aCssToken &$token) { $lcValue = strtolower($token->Value); if (isset($this->transformation[$lcValue])) { $token->Value = $this->transformation[$lcValue]; } elseif (preg_match($this->reMatch, $token->Value)) { $token->Value = preg_replace($this->reMatch, $this->reReplace, $token->Value); } return false; } public function getTriggerTokens() { return array ( "CssAtFontFaceDeclarationToken", "CssAtPageDeclarationToken", "CssRulesetDeclarationToken" ); } } class CssConvertLevel3PropertiesMinifierFilter extends aCssMinifierFilter { private $transformations = array ( "animation" => array(null, "-webkit-animation", null, null), "animation-delay" => array(null, "-webkit-animation-delay", null, null), "animation-direction" => array(null, "-webkit-animation-direction", null, null), "animation-duration" => array(null, "-webkit-animation-duration", null, null), "animation-fill-mode" => array(null, "-webkit-animation-fill-mode", null, null), "animation-iteration-count" => array(null, "-webkit-animation-iteration-count", null, null), "animation-name" => array(null, "-webkit-animation-name", null, null), "animation-play-state" => array(null, "-webkit-animation-play-state", null, null), "animation-timing-function" => array(null, "-webkit-animation-timing-function", null, null), "appearance" => array("-moz-appearance", "-webkit-appearance", null, null), "backface-visibility" => array(null, "-webkit-backface-visibility", null, null), "background-clip" => array(null, "-webkit-background-clip", null, null), "background-composite" => array(null, "-webkit-background-composite", null, null), "background-inline-policy" => array("-moz-background-inline-policy", null, null, null), "background-origin" => array(null, "-webkit-background-origin", null, null), "background-position-x" => array(null, null, null, "-ms-background-position-x"), "background-position-y" => array(null, null, null, "-ms-background-position-y"), "background-size" => array(null, "-webkit-background-size", null, null), "behavior" => array(null, null, null, "-ms-behavior"), "binding" => array("-moz-binding", null, null, null), "border-after" => array(null, "-webkit-border-after", null, null), "border-after-color" => array(null, "-webkit-border-after-color", null, null), "border-after-style" => array(null, "-webkit-border-after-style", null, null), "border-after-width" => array(null, "-webkit-border-after-width", null, null), "border-before" => array(null, "-webkit-border-before", null, null), "border-before-color" => array(null, "-webkit-border-before-color", null, null), "border-before-style" => array(null, "-webkit-border-before-style", null, null), "border-before-width" => array(null, "-webkit-border-before-width", null, null), "border-border-bottom-colors" => array("-moz-border-bottom-colors", null, null, null), "border-bottom-left-radius" => array("-moz-border-radius-bottomleft", "-webkit-border-bottom-left-radius", null, null), "border-bottom-right-radius" => array("-moz-border-radius-bottomright", "-webkit-border-bottom-right-radius", null, null), "border-end" => array("-moz-border-end", "-webkit-border-end", null, null), "border-end-color" => array("-moz-border-end-color", "-webkit-border-end-color", null, null), "border-end-style" => array("-moz-border-end-style", "-webkit-border-end-style", null, null), "border-end-width" => array("-moz-border-end-width", "-webkit-border-end-width", null, null), "border-fit" => array(null, "-webkit-border-fit", null, null), "border-horizontal-spacing" => array(null, "-webkit-border-horizontal-spacing", null, null), "border-image" => array("-moz-border-image", "-webkit-border-image", null, null), "border-left-colors" => array("-moz-border-left-colors", null, null, null), "border-radius" => array("-moz-border-radius", "-webkit-border-radius", null, null), "border-border-right-colors" => array("-moz-border-right-colors", null, null, null), "border-start" => array("-moz-border-start", "-webkit-border-start", null, null), "border-start-color" => array("-moz-border-start-color", "-webkit-border-start-color", null, null), "border-start-style" => array("-moz-border-start-style", "-webkit-border-start-style", null, null), "border-start-width" => array("-moz-border-start-width", "-webkit-border-start-width", null, null), "border-top-colors" => array("-moz-border-top-colors", null, null, null), "border-top-left-radius" => array("-moz-border-radius-topleft", "-webkit-border-top-left-radius", null, null), "border-top-right-radius" => array("-moz-border-radius-topright", "-webkit-border-top-right-radius", null, null), "border-vertical-spacing" => array(null, "-webkit-border-vertical-spacing", null, null), "box-align" => array("-moz-box-align", "-webkit-box-align", null, null), "box-direction" => array("-moz-box-direction", "-webkit-box-direction", null, null), "box-flex" => array("-moz-box-flex", "-webkit-box-flex", null, null), "box-flex-group" => array(null, "-webkit-box-flex-group", null, null), "box-flex-lines" => array(null, "-webkit-box-flex-lines", null, null), "box-ordinal-group" => array("-moz-box-ordinal-group", "-webkit-box-ordinal-group", null, null), "box-orient" => array("-moz-box-orient", "-webkit-box-orient", null, null), "box-pack" => array("-moz-box-pack", "-webkit-box-pack", null, null), "box-reflect" => array(null, "-webkit-box-reflect", null, null), "box-shadow" => array("-moz-box-shadow", "-webkit-box-shadow", null, null), "box-sizing" => array("-moz-box-sizing", null, null, null), "color-correction" => array(null, "-webkit-color-correction", null, null), "column-break-after" => array(null, "-webkit-column-break-after", null, null), "column-break-before" => array(null, "-webkit-column-break-before", null, null), "column-break-inside" => array(null, "-webkit-column-break-inside", null, null), "column-count" => array("-moz-column-count", "-webkit-column-count", null, null), "column-gap" => array("-moz-column-gap", "-webkit-column-gap", null, null), "column-rule" => array("-moz-column-rule", "-webkit-column-rule", null, null), "column-rule-color" => array("-moz-column-rule-color", "-webkit-column-rule-color", null, null), "column-rule-style" => array("-moz-column-rule-style", "-webkit-column-rule-style", null, null), "column-rule-width" => array("-moz-column-rule-width", "-webkit-column-rule-width", null, null), "column-span" => array(null, "-webkit-column-span", null, null), "column-width" => array("-moz-column-width", "-webkit-column-width", null, null), "columns" => array(null, "-webkit-columns", null, null), "filter" => array(__CLASS__, "filter"), "float-edge" => array("-moz-float-edge", null, null, null), "font-feature-settings" => array("-moz-font-feature-settings", null, null, null), "font-language-override" => array("-moz-font-language-override", null, null, null), "font-size-delta" => array(null, "-webkit-font-size-delta", null, null), "font-smoothing" => array(null, "-webkit-font-smoothing", null, null), "force-broken-image-icon" => array("-moz-force-broken-image-icon", null, null, null), "highlight" => array(null, "-webkit-highlight", null, null), "hyphenate-character" => array(null, "-webkit-hyphenate-character", null, null), "hyphenate-locale" => array(null, "-webkit-hyphenate-locale", null, null), "hyphens" => array(null, "-webkit-hyphens", null, null), "force-broken-image-icon" => array("-moz-image-region", null, null, null), "ime-mode" => array(null, null, null, "-ms-ime-mode"), "interpolation-mode" => array(null, null, null, "-ms-interpolation-mode"), "layout-flow" => array(null, null, null, "-ms-layout-flow"), "layout-grid" => array(null, null, null, "-ms-layout-grid"), "layout-grid-char" => array(null, null, null, "-ms-layout-grid-char"), "layout-grid-line" => array(null, null, null, "-ms-layout-grid-line"), "layout-grid-mode" => array(null, null, null, "-ms-layout-grid-mode"), "layout-grid-type" => array(null, null, null, "-ms-layout-grid-type"), "line-break" => array(null, "-webkit-line-break", null, "-ms-line-break"), "line-clamp" => array(null, "-webkit-line-clamp", null, null), "line-grid-mode" => array(null, null, null, "-ms-line-grid-mode"), "logical-height" => array(null, "-webkit-logical-height", null, null), "logical-width" => array(null, "-webkit-logical-width", null, null), "margin-after" => array(null, "-webkit-margin-after", null, null), "margin-after-collapse" => array(null, "-webkit-margin-after-collapse", null, null), "margin-before" => array(null, "-webkit-margin-before", null, null), "margin-before-collapse" => array(null, "-webkit-margin-before-collapse", null, null), "margin-bottom-collapse" => array(null, "-webkit-margin-bottom-collapse", null, null), "margin-collapse" => array(null, "-webkit-margin-collapse", null, null), "margin-end" => array("-moz-margin-end", "-webkit-margin-end", null, null), "margin-start" => array("-moz-margin-start", "-webkit-margin-start", null, null), "margin-top-collapse" => array(null, "-webkit-margin-top-collapse", null, null), "marquee " => array(null, "-webkit-marquee", null, null), "marquee-direction" => array(null, "-webkit-marquee-direction", null, null), "marquee-increment" => array(null, "-webkit-marquee-increment", null, null), "marquee-repetition" => array(null, "-webkit-marquee-repetition", null, null), "marquee-speed" => array(null, "-webkit-marquee-speed", null, null), "marquee-style" => array(null, "-webkit-marquee-style", null, null), "mask" => array(null, "-webkit-mask", null, null), "mask-attachment" => array(null, "-webkit-mask-attachment", null, null), "mask-box-image" => array(null, "-webkit-mask-box-image", null, null), "mask-clip" => array(null, "-webkit-mask-clip", null, null), "mask-composite" => array(null, "-webkit-mask-composite", null, null), "mask-image" => array(null, "-webkit-mask-image", null, null), "mask-origin" => array(null, "-webkit-mask-origin", null, null), "mask-position" => array(null, "-webkit-mask-position", null, null), "mask-position-x" => array(null, "-webkit-mask-position-x", null, null), "mask-position-y" => array(null, "-webkit-mask-position-y", null, null), "mask-repeat" => array(null, "-webkit-mask-repeat", null, null), "mask-repeat-x" => array(null, "-webkit-mask-repeat-x", null, null), "mask-repeat-y" => array(null, "-webkit-mask-repeat-y", null, null), "mask-size" => array(null, "-webkit-mask-size", null, null), "match-nearest-mail-blockquote-color" => array(null, "-webkit-match-nearest-mail-blockquote-color", null, null), "max-logical-height" => array(null, "-webkit-max-logical-height", null, null), "max-logical-width" => array(null, "-webkit-max-logical-width", null, null), "min-logical-height" => array(null, "-webkit-min-logical-height", null, null), "min-logical-width" => array(null, "-webkit-min-logical-width", null, null), "object-fit" => array(null, null, "-o-object-fit", null), "object-position" => array(null, null, "-o-object-position", null), "opacity" => array(__CLASS__, "opacity"), "outline-radius" => array("-moz-outline-radius", null, null, null), "outline-bottom-left-radius" => array("-moz-outline-radius-bottomleft", null, null, null), "outline-bottom-right-radius" => array("-moz-outline-radius-bottomright", null, null, null), "outline-top-left-radius" => array("-moz-outline-radius-topleft", null, null, null), "outline-top-right-radius" => array("-moz-outline-radius-topright", null, null, null), "padding-after" => array(null, "-webkit-padding-after", null, null), "padding-before" => array(null, "-webkit-padding-before", null, null), "padding-end" => array("-moz-padding-end", "-webkit-padding-end", null, null), "padding-start" => array("-moz-padding-start", "-webkit-padding-start", null, null), "perspective" => array(null, "-webkit-perspective", null, null), "perspective-origin" => array(null, "-webkit-perspective-origin", null, null), "perspective-origin-x" => array(null, "-webkit-perspective-origin-x", null, null), "perspective-origin-y" => array(null, "-webkit-perspective-origin-y", null, null), "rtl-ordering" => array(null, "-webkit-rtl-ordering", null, null), "scrollbar-3dlight-color" => array(null, null, null, "-ms-scrollbar-3dlight-color"), "scrollbar-arrow-color" => array(null, null, null, "-ms-scrollbar-arrow-color"), "scrollbar-base-color" => array(null, null, null, "-ms-scrollbar-base-color"), "scrollbar-darkshadow-color" => array(null, null, null, "-ms-scrollbar-darkshadow-color"), "scrollbar-face-color" => array(null, null, null, "-ms-scrollbar-face-color"), "scrollbar-highlight-color" => array(null, null, null, "-ms-scrollbar-highlight-color"), "scrollbar-shadow-color" => array(null, null, null, "-ms-scrollbar-shadow-color"), "scrollbar-track-color" => array(null, null, null, "-ms-scrollbar-track-color"), "stack-sizing" => array("-moz-stack-sizing", null, null, null), "svg-shadow" => array(null, "-webkit-svg-shadow", null, null), "tab-size" => array("-moz-tab-size", null, "-o-tab-size", null), "table-baseline" => array(null, null, "-o-table-baseline", null), "text-align-last" => array(null, null, null, "-ms-text-align-last"), "text-autospace" => array(null, null, null, "-ms-text-autospace"), "text-combine" => array(null, "-webkit-text-combine", null, null), "text-decorations-in-effect" => array(null, "-webkit-text-decorations-in-effect", null, null), "text-emphasis" => array(null, "-webkit-text-emphasis", null, null), "text-emphasis-color" => array(null, "-webkit-text-emphasis-color", null, null), "text-emphasis-position" => array(null, "-webkit-text-emphasis-position", null, null), "text-emphasis-style" => array(null, "-webkit-text-emphasis-style", null, null), "text-fill-color" => array(null, "-webkit-text-fill-color", null, null), "text-justify" => array(null, null, null, "-ms-text-justify"), "text-kashida-space" => array(null, null, null, "-ms-text-kashida-space"), "text-overflow" => array(null, null, "-o-text-overflow", "-ms-text-overflow"), "text-security" => array(null, "-webkit-text-security", null, null), "text-size-adjust" => array(null, "-webkit-text-size-adjust", null, "-ms-text-size-adjust"), "text-stroke" => array(null, "-webkit-text-stroke", null, null), "text-stroke-color" => array(null, "-webkit-text-stroke-color", null, null), "text-stroke-width" => array(null, "-webkit-text-stroke-width", null, null), "text-underline-position" => array(null, null, null, "-ms-text-underline-position"), "transform" => array("-moz-transform", "-webkit-transform", "-o-transform", null), "transform-origin" => array("-moz-transform-origin", "-webkit-transform-origin", "-o-transform-origin", null), "transform-origin-x" => array(null, "-webkit-transform-origin-x", null, null), "transform-origin-y" => array(null, "-webkit-transform-origin-y", null, null), "transform-origin-z" => array(null, "-webkit-transform-origin-z", null, null), "transform-style" => array(null, "-webkit-transform-style", null, null), "transition" => array("-moz-transition", "-webkit-transition", "-o-transition", null), "transition-delay" => array("-moz-transition-delay", "-webkit-transition-delay", "-o-transition-delay", null), "transition-duration" => array("-moz-transition-duration", "-webkit-transition-duration", "-o-transition-duration", null), "transition-property" => array("-moz-transition-property", "-webkit-transition-property", "-o-transition-property", null), "transition-timing-function" => array("-moz-transition-timing-function", "-webkit-transition-timing-function", "-o-transition-timing-function", null), "user-drag" => array(null, "-webkit-user-drag", null, null), "user-focus" => array("-moz-user-focus", null, null, null), "user-input" => array("-moz-user-input", null, null, null), "user-modify" => array("-moz-user-modify", "-webkit-user-modify", null, null), "user-select" => array("-moz-user-select", "-webkit-user-select", null, null), "white-space" => array(__CLASS__, "whiteSpace"), "window-shadow" => array("-moz-window-shadow", null, null, null), "word-break" => array(null, null, null, "-ms-word-break"), "word-wrap" => array(null, null, null, "-ms-word-wrap"), "writing-mode" => array(null, "-webkit-writing-mode", null, "-ms-writing-mode"), "zoom" => array(null, null, null, "-ms-zoom") ); public function apply(array &$tokens) { $r = 0; $transformations = &$this->transformations; for ($i = 0, $l = count($tokens); $i < $l; $i++) { if (get_class($tokens[$i]) === "CssRulesetDeclarationToken") { $tProperty = $tokens[$i]->Property; if (isset($transformations[$tProperty])) { $result = array(); if (is_callable($transformations[$tProperty])) { $result = call_user_func_array($transformations[$tProperty], array($tokens[$i])); if (!is_array($result) && is_object($result)) { $result = array($result); } } else { $tValue = $tokens[$i]->Value; $tMediaTypes = $tokens[$i]->MediaTypes; foreach ($transformations[$tProperty] as $property) { if ($property !== null) { $result[] = new CssRulesetDeclarationToken($property, $tValue, $tMediaTypes); } } } if (count($result) > 0) { array_splice($tokens, $i + 1, 0, $result); $i += count($result); $l += count($result); } } } } return $r; } private static function filter($token) { $r = array ( new CssRulesetDeclarationToken("-ms-filter", "\"" . $token->Value . "\"", $token->MediaTypes), ); return $r; } private static function opacity($token) { $ieValue = (int) ((float) $token->Value * 100); $r = array ( new CssRulesetDeclarationToken("-ms-filter", "\"alpha(opacity=" . $ieValue . ")\"", $token->MediaTypes), new CssRulesetDeclarationToken("filter", "alpha(opacity=" . $ieValue . ")", $token->MediaTypes), new CssRulesetDeclarationToken("zoom", "1", $token->MediaTypes) ); return $r; } private static function whiteSpace($token) { if (strtolower($token->Value) === "pre-wrap") { $r = array ( new CssRulesetDeclarationToken("white-space", "-moz-pre-wrap", $token->MediaTypes), new CssRulesetDeclarationToken("white-space", "-webkit-pre-wrap", $token->MediaTypes), new CssRulesetDeclarationToken("white-space", "-pre-wrap", $token->MediaTypes), new CssRulesetDeclarationToken("white-space", "-o-pre-wrap", $token->MediaTypes), new CssRulesetDeclarationToken("word-wrap", "break-word", $token->MediaTypes) ); return $r; } else { return array(); } } } class CssConvertLevel3AtKeyframesMinifierFilter extends aCssMinifierFilter { public function apply(array &$tokens) { $r = 0; $transformations = array("-moz-keyframes", "-webkit-keyframes"); for ($i = 0, $l = count($tokens); $i < $l; $i++) { if (get_class($tokens[$i]) === "CssAtKeyframesStartToken") { for ($ii = $i; $ii < $l; $ii++) { if (get_class($tokens[$ii]) === "CssAtKeyframesEndToken") { break; } } if (get_class($tokens[$ii]) === "CssAtKeyframesEndToken") { $add = array(); $source = array(); for ($iii = $i; $iii <= $ii; $iii++) { $source[] = clone($tokens[$iii]); } foreach ($transformations as $transformation) { $t = array(); foreach ($source as $token) { $t[] = clone($token); } $t[0]->AtRuleName = $transformation; $add = array_merge($add, $t); } if (isset($this->configuration["RemoveSource"]) && $this->configuration["RemoveSource"] === true) { array_splice($tokens, $i, $ii - $i + 1, $add); } else { array_splice($tokens, $ii + 1, 0, $add); } $l = count($tokens); $i = $ii + count($add); $r += count($add); } } } return $r; } } class CssConvertHslColorsMinifierPlugin extends aCssMinifierPlugin { private $reMatch = "/^hsl\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*%\s*,\s*([0-9]+)\s*%\s*\)/iS"; public function apply(aCssToken &$token) { if (stripos($token->Value, "hsl") !== false && preg_match($this->reMatch, $token->Value, $m)) { $token->Value = str_replace($m[0], $this->hsl2hex($m[1], $m[2], $m[3]), $token->Value); } return false; } public function getTriggerTokens() { return array ( "CssAtFontFaceDeclarationToken", "CssAtPageDeclarationToken", "CssRulesetDeclarationToken" ); } private function hsl2hex($hue, $saturation, $lightness) { $hue = $hue / 360; $saturation = $saturation / 100; $lightness = $lightness / 100; if ($saturation == 0) { $red = $lightness * 255; $green = $lightness * 255; $blue = $lightness * 255; } else { if ($lightness < 0.5 ) { $v2 = $lightness * (1 + $saturation); } else { $v2 = ($lightness + $saturation) - ($saturation * $lightness); } $v1 = 2 * $lightness - $v2; $red = 255 * self::hue2rgb($v1, $v2, $hue + (1 / 3)); $green = 255 * self::hue2rgb($v1, $v2, $hue); $blue = 255 * self::hue2rgb($v1, $v2, $hue - (1 / 3)); } return "#" . str_pad(dechex(round($red)), 2, "0", STR_PAD_LEFT) . str_pad(dechex(round($green)), 2, "0", STR_PAD_LEFT) . str_pad(dechex(round($blue)), 2, "0", STR_PAD_LEFT); } private function hue2rgb($v1, $v2, $hue) { if ($hue < 0) { $hue += 1; } if ($hue > 1) { $hue -= 1; } if ((6 * $hue) < 1) { return ($v1 + ($v2 - $v1) * 6 * $hue); } if ((2 * $hue) < 1) { return ($v2); } if ((3 * $hue) < 2) { return ($v1 + ($v2 - $v1) * (( 2 / 3) - $hue) * 6); } return $v1; } } class CssConvertFontWeightMinifierPlugin extends aCssMinifierPlugin { private $include = array ( "font", "font-weight" ); private $reMatch = null; private $reReplace = "\"\${1}\" . \$this->transformation[\"\${2}\"] . \"\${3}\""; private $transformation = array ( "normal" => "400", "bold" => "700" ); public function __construct(CssMinifier $minifier) { $this->reMatch = "/(^|\s)+(" . implode("|", array_keys($this->transformation)). ")(\s|$)+/eiS"; parent::__construct($minifier); } public function apply(aCssToken &$token) { if (in_array($token->Property, $this->include) && preg_match($this->reMatch, $token->Value, $m)) { $token->Value = preg_replace($this->reMatch, $this->reReplace, $token->Value); } return false; } public function getTriggerTokens() { return array ( "CssAtFontFaceDeclarationToken", "CssAtPageDeclarationToken", "CssRulesetDeclarationToken" ); } } class CssCompressUnitValuesMinifierPlugin extends aCssMinifierPlugin { private $re = array ( "/(^| |-)0\.([0-9]+?)(0+)?(%|em|ex|px|in|cm|mm|pt|pc)/iS" => "\${1}.\${2}\${4}", "/(^| )-?(\.?)0(%|em|ex|px|in|cm|mm|pt|pc)/iS" => "\${1}0", "/(^0\s0\s0\s0)|(^0\s0\s0$)|(^0\s0$)/iS" => "0" ); private $reMatch = "/(^| |-)0\.([0-9]+?)(0+)?(%|em|ex|px|in|cm|mm|pt|pc)|(^| )-?(\.?)0(%|em|ex|px|in|cm|mm|pt|pc)|(^0\s0\s0\s0$)|(^0\s0\s0$)|(^0\s0$)/iS"; public function apply(aCssToken &$token) { if (preg_match($this->reMatch, $token->Value)) { foreach ($this->re as $reMatch => $reReplace) { $token->Value = preg_replace($reMatch, $reReplace, $token->Value); } } return false; } public function getTriggerTokens() { return array ( "CssAtFontFaceDeclarationToken", "CssAtPageDeclarationToken", "CssRulesetDeclarationToken" ); } } class CssCompressExpressionValuesMinifierPlugin extends aCssMinifierPlugin { public function apply(aCssToken &$token) { if (class_exists("JSMin") && stripos($token->Value, "expression(") !== false) { $value = $token->Value; $value = substr($token->Value, stripos($token->Value, "expression(") + 10); $value = trim(JSMin::minify($value)); $token->Value = "expression(" . $value . ")"; } return false; } public function getTriggerTokens() { return array ( "CssAtFontFaceDeclarationToken", "CssAtPageDeclarationToken", "CssRulesetDeclarationToken" ); } } class CssCompressColorValuesMinifierPlugin extends aCssMinifierPlugin { private $reMatch = "/\#([0-9a-f]{6})/iS"; public function apply(aCssToken &$token) { if (strpos($token->Value, "#") !== false && preg_match($this->reMatch, $token->Value, $m)) { $value = strtolower($m[1]); if ($value[0] == $value[1] && $value[2] == $value[3] && $value[4] == $value[5]) { $token->Value = str_replace($m[0], "#" . $value[0] . $value[2] . $value[4], $token->Value); } } return false; } public function getTriggerTokens() { return array ( "CssAtFontFaceDeclarationToken", "CssAtPageDeclarationToken", "CssRulesetDeclarationToken" ); } } class CssCommentToken extends aCssToken { public $Comment = ""; public function __construct($comment) { $this->Comment = $comment; } public function __toString() { return $this->Comment; } } class CssCommentParserPlugin extends aCssParserPlugin { public function getTriggerChars() { return array("*", "/"); } public function getTriggerStates() { return false; } private $restoreBuffer = ""; public function parse($index, $char, $previousChar, $state) { if ($char === "*" && $previousChar === "/" && $state !== "T_COMMENT") { $this->parser->pushState("T_COMMENT"); $this->parser->setExclusive(__CLASS__); $this->restoreBuffer = substr($this->parser->getAndClearBuffer(), 0, -2); } elseif ($char === "/" && $previousChar === "*" && $state === "T_COMMENT") { $this->parser->popState(); $this->parser->unsetExclusive(); $this->parser->appendToken(new CssCommentToken("/*" . $this->parser->getAndClearBuffer())); $this->parser->setBuffer($this->restoreBuffer); } else { return false; } return true; } } class CssAtVariablesStartToken extends aCssAtBlockStartToken { public $MediaTypes = array(); public function __construct($mediaTypes = null) { $this->MediaTypes = $mediaTypes ? $mediaTypes : array("all"); } public function __toString() { return ""; } } class CssAtVariablesParserPlugin extends aCssParserPlugin { public function getTriggerChars() { return array("@", "{", "}", ":", ";"); } public function getTriggerStates() { return array("T_DOCUMENT", "T_AT_VARIABLES::PREPARE", "T_AT_VARIABLES", "T_AT_VARIABLES_DECLARATION"); } public function parse($index, $char, $previousChar, $state) { if ($char === "@" && $state === "T_DOCUMENT" && strtolower(substr($this->parser->getSource(), $index, 10)) === "@variables") { $this->parser->pushState("T_AT_VARIABLES::PREPARE"); $this->parser->clearBuffer(); return $index + 10; } elseif ($char === "{" && $state === "T_AT_VARIABLES::PREPARE") { $this->parser->setState("T_AT_VARIABLES"); $mediaTypes = array_filter(array_map("trim", explode(",", $this->parser->getAndClearBuffer("{")))); $this->parser->appendToken(new CssAtVariablesStartToken($mediaTypes)); } if ($char === ":" && $state === "T_AT_VARIABLES") { $this->buffer = $this->parser->getAndClearBuffer(":"); $this->parser->pushState("T_AT_VARIABLES_DECLARATION"); } elseif ($char === ":" && $state === "T_AT_VARIABLES_DECLARATION") { if ($this->buffer === "filter") { return false; } CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Unterminated @variables declaration", $this->buffer . ":" . $this->parser->getBuffer() . "_")); } elseif (($char === ";" || $char === "}") && $state === "T_AT_VARIABLES_DECLARATION") { $value = $this->parser->getAndClearBuffer(";}"); if (strtolower(substr($value, -10, 10)) === "!important") { $value = trim(substr($value, 0, -10)); $isImportant = true; } else { $isImportant = false; } $this->parser->popState(); $this->parser->appendToken(new CssAtVariablesDeclarationToken($this->buffer, $value, $isImportant)); $this->buffer = ""; } elseif ($char === "}" && $state === "T_AT_VARIABLES") { $this->parser->popState(); $this->parser->clearBuffer(); $this->parser->appendToken(new CssAtVariablesEndToken()); } else { return false; } return true; } } class CssAtVariablesEndToken extends aCssAtBlockEndToken { public function __toString() { return ""; } } class CssAtVariablesDeclarationToken extends aCssDeclarationToken { public function __toString() { return ""; } } class CssAtPageStartToken extends aCssAtBlockStartToken { public $Selector = ""; public function __construct($selector = "") { $this->Selector = $selector; } public function __toString() { return "@page" . ($this->Selector ? " " . $this->Selector : "") . "{"; } } class CssAtPageParserPlugin extends aCssParserPlugin { public function getTriggerChars() { return array("@", "{", "}", ":", ";"); } public function getTriggerStates() { return array("T_DOCUMENT", "T_AT_PAGE::SELECTOR", "T_AT_PAGE", "T_AT_PAGE_DECLARATION"); } public function parse($index, $char, $previousChar, $state) { if ($char === "@" && $state === "T_DOCUMENT" && strtolower(substr($this->parser->getSource(), $index, 5)) === "@page") { $this->parser->pushState("T_AT_PAGE::SELECTOR"); $this->parser->clearBuffer(); return $index + 5; } elseif ($char === "{" && $state === "T_AT_PAGE::SELECTOR") { $selector = $this->parser->getAndClearBuffer("{"); $this->parser->setState("T_AT_PAGE"); $this->parser->clearBuffer(); $this->parser->appendToken(new CssAtPageStartToken($selector)); } elseif ($char === ":" && $state === "T_AT_PAGE") { $this->parser->pushState("T_AT_PAGE_DECLARATION"); $this->buffer = $this->parser->getAndClearBuffer(":", true); } elseif ($char === ":" && $state === "T_AT_PAGE_DECLARATION") { if ($this->buffer === "filter") { return false; } CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Unterminated @page declaration", $this->buffer . ":" . $this->parser->getBuffer() . "_")); } elseif (($char === ";" || $char === "}") && $state == "T_AT_PAGE_DECLARATION") { $value = $this->parser->getAndClearBuffer(";}"); if (strtolower(substr($value, -10, 10)) == "!important") { $value = trim(substr($value, 0, -10)); $isImportant = true; } else { $isImportant = false; } $this->parser->popState(); $this->parser->appendToken(new CssAtPageDeclarationToken($this->buffer, $value, $isImportant)); if ($char === "}") { $this->parser->popState(); $this->parser->appendToken(new CssAtPageEndToken()); } $this->buffer = ""; } elseif ($char === "}" && $state === "T_AT_PAGE") { $this->parser->popState(); $this->parser->clearBuffer(); $this->parser->appendToken(new CssAtPageEndToken()); } else { return false; } return true; } } class CssAtPageEndToken extends aCssAtBlockEndToken { } class CssAtPageDeclarationToken extends aCssDeclarationToken { } class CssAtMediaStartToken extends aCssAtBlockStartToken { public function __construct(array $mediaTypes = array()) { $this->MediaTypes = $mediaTypes; } public function __toString() { return "@media " . implode(",", $this->MediaTypes) . "{"; } } class CssAtMediaParserPlugin extends aCssParserPlugin { public function getTriggerChars() { return array("@", "{", "}"); } public function getTriggerStates() { return array("T_DOCUMENT", "T_AT_MEDIA::PREPARE", "T_AT_MEDIA"); } public function parse($index, $char, $previousChar, $state) { if ($char === "@" && $state === "T_DOCUMENT" && strtolower(substr($this->parser->getSource(), $index, 6)) === "@media") { $this->parser->pushState("T_AT_MEDIA::PREPARE"); $this->parser->clearBuffer(); return $index + 6; } elseif ($char === "{" && $state === "T_AT_MEDIA::PREPARE") { $mediaTypes = array_filter(array_map("trim", explode(",", $this->parser->getAndClearBuffer("{")))); $this->parser->setMediaTypes($mediaTypes); $this->parser->setState("T_AT_MEDIA"); $this->parser->appendToken(new CssAtMediaStartToken($mediaTypes)); } elseif ($char === "}" && $state === "T_AT_MEDIA") { $this->parser->appendToken(new CssAtMediaEndToken()); $this->parser->clearBuffer(); $this->parser->unsetMediaTypes(); $this->parser->popState(); } else { return false; } return true; } } class CssAtMediaEndToken extends aCssAtBlockEndToken { } class CssAtKeyframesStartToken extends aCssAtBlockStartToken { public $AtRuleName = "keyframes"; public $Name = ""; public function __construct($name, $atRuleName = null) { $this->Name = $name; if (!is_null($atRuleName)) { $this->AtRuleName = $atRuleName; } } public function __toString() { return "@" . $this->AtRuleName . " " . $this->Name . "{"; } } class CssAtKeyframesRulesetStartToken extends aCssRulesetStartToken { public $Selectors = array(); public function __construct(array $selectors = array()) { $this->Selectors = $selectors; } public function __toString() { return implode(",", $this->Selectors) . "{"; } } class CssAtKeyframesRulesetEndToken extends aCssRulesetEndToken { } class CssAtKeyframesRulesetDeclarationToken extends aCssDeclarationToken { } class CssAtKeyframesParserPlugin extends aCssParserPlugin { private $atRuleName = ""; private $selectors = array(); public function getTriggerChars() { return array("@", "{", "}", ":", ",", ";"); } public function getTriggerStates() { return array("T_DOCUMENT", "T_AT_KEYFRAMES::NAME", "T_AT_KEYFRAMES", "T_AT_KEYFRAMES_RULESETS", "T_AT_KEYFRAMES_RULESET", "T_AT_KEYFRAMES_RULESET_DECLARATION"); } public function parse($index, $char, $previousChar, $state) { if ($char === "@" && $state === "T_DOCUMENT" && strtolower(substr($this->parser->getSource(), $index, 10)) === "@keyframes") { $this->atRuleName = "keyframes"; $this->parser->pushState("T_AT_KEYFRAMES::NAME"); $this->parser->clearBuffer(); return $index + 10; } elseif ($char === "@" && $state === "T_DOCUMENT" && strtolower(substr($this->parser->getSource(), $index, 15)) === "@-moz-keyframes") { $this->atRuleName = "-moz-keyframes"; $this->parser->pushState("T_AT_KEYFRAMES::NAME"); $this->parser->clearBuffer(); return $index + 15; } elseif ($char === "@" && $state === "T_DOCUMENT" && strtolower(substr($this->parser->getSource(), $index, 18)) === "@-webkit-keyframes") { $this->atRuleName = "-webkit-keyframes"; $this->parser->pushState("T_AT_KEYFRAMES::NAME"); $this->parser->clearBuffer(); return $index + 18; } elseif ($char === "{" && $state === "T_AT_KEYFRAMES::NAME") { $name = $this->parser->getAndClearBuffer("{\"'"); $this->parser->setState("T_AT_KEYFRAMES_RULESETS"); $this->parser->clearBuffer(); $this->parser->appendToken(new CssAtKeyframesStartToken($name, $this->atRuleName)); } if ($char === "," && $state === "T_AT_KEYFRAMES_RULESETS") { $this->selectors[] = $this->parser->getAndClearBuffer(",{"); } elseif ($char === "{" && $state === "T_AT_KEYFRAMES_RULESETS") { if ($this->parser->getBuffer() !== "") { $this->selectors[] = $this->parser->getAndClearBuffer(",{"); $this->parser->pushState("T_AT_KEYFRAMES_RULESET"); $this->parser->appendToken(new CssAtKeyframesRulesetStartToken($this->selectors)); $this->selectors = array(); } } elseif ($char === ":" && $state === "T_AT_KEYFRAMES_RULESET") { $this->parser->pushState("T_AT_KEYFRAMES_RULESET_DECLARATION"); $this->buffer = $this->parser->getAndClearBuffer(":;", true); } elseif ($char === ":" && $state === "T_AT_KEYFRAMES_RULESET_DECLARATION") { if ($this->buffer === "filter") { return false; } CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Unterminated @keyframes ruleset declaration", $this->buffer . ":" . $this->parser->getBuffer() . "_")); } elseif (($char === ";" || $char === "}") && $state === "T_AT_KEYFRAMES_RULESET_DECLARATION") { $value = $this->parser->getAndClearBuffer(";}"); if (strtolower(substr($value, -10, 10)) === "!important") { $value = trim(substr($value, 0, -10)); $isImportant = true; } else { $isImportant = false; } $this->parser->popState(); $this->parser->appendToken(new CssAtKeyframesRulesetDeclarationToken($this->buffer, $value, $isImportant)); if ($char === "}") { $this->parser->appendToken(new CssAtKeyframesRulesetEndToken()); $this->parser->popState(); } $this->buffer = ""; } elseif ($char === "}" && $state === "T_AT_KEYFRAMES_RULESET") { $this->parser->clearBuffer(); $this->parser->popState(); $this->parser->appendToken(new CssAtKeyframesRulesetEndToken()); } elseif ($char === "}" && $state === "T_AT_KEYFRAMES_RULESETS") { $this->parser->clearBuffer(); $this->parser->popState(); $this->parser->appendToken(new CssAtKeyframesEndToken()); } else { return false; } return true; } } class CssAtKeyframesEndToken extends aCssAtBlockEndToken { } class CssAtImportToken extends aCssToken { public $Import = ""; public $MediaTypes = array(); public function __construct($import, $mediaTypes) { $this->Import = $import; $this->MediaTypes = $mediaTypes ? $mediaTypes : array(); } public function __toString() { return "@import \"" . $this->Import . "\"" . (count($this->MediaTypes) > 0 ? " " . implode(",", $this->MediaTypes) : ""). ";"; } } class CssAtImportParserPlugin extends aCssParserPlugin { public function getTriggerChars() { return array("@", ";", ",", "\n"); } public function getTriggerStates() { return array("T_DOCUMENT", "T_AT_IMPORT"); } public function parse($index, $char, $previousChar, $state) { if ($char === "@" && $state === "T_DOCUMENT" && strtolower(substr($this->parser->getSource(), $index, 7)) === "@import") { $this->parser->pushState("T_AT_IMPORT"); $this->parser->clearBuffer(); return $index + 7; } elseif (($char === ";" || $char === "\n") && $state === "T_AT_IMPORT") { $this->buffer = $this->parser->getAndClearBuffer(";"); $pos = false; foreach (array(")", "\"", "'") as $needle) { if (($pos = strrpos($this->buffer, $needle)) !== false) { break; } } $import = substr($this->buffer, 0, $pos + 1); if (stripos($import, "url(") === 0) { $import = substr($import, 4, -1); } $import = trim($import, " \t\n\r\0\x0B'\""); $mediaTypes = array_filter(array_map("trim", explode(",", trim(substr($this->buffer, $pos + 1), " \t\n\r\0\x0B{")))); if ($pos) { $this->parser->appendToken(new CssAtImportToken($import, $mediaTypes)); } else { CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Invalid @import at-rule syntax", $this->parser->buffer)); } $this->parser->popState(); } else { return false; } return true; } } class CssAtFontFaceStartToken extends aCssAtBlockStartToken { public function __toString() { return "@font-face{"; } } class CssAtFontFaceParserPlugin extends aCssParserPlugin { public function getTriggerChars() { return array("@", "{", "}", ":", ";"); } public function getTriggerStates() { return array("T_DOCUMENT", "T_AT_FONT_FACE::PREPARE", "T_AT_FONT_FACE", "T_AT_FONT_FACE_DECLARATION"); } public function parse($index, $char, $previousChar, $state) { if ($char === "@" && $state === "T_DOCUMENT" && strtolower(substr($this->parser->getSource(), $index, 10)) === "@font-face") { $this->parser->pushState("T_AT_FONT_FACE::PREPARE"); $this->parser->clearBuffer(); return $index + 10; } elseif ($char === "{" && $state === "T_AT_FONT_FACE::PREPARE") { $this->parser->setState("T_AT_FONT_FACE"); $this->parser->clearBuffer(); $this->parser->appendToken(new CssAtFontFaceStartToken()); } elseif ($char === ":" && $state === "T_AT_FONT_FACE") { $this->parser->pushState("T_AT_FONT_FACE_DECLARATION"); $this->buffer = $this->parser->getAndClearBuffer(":", true); } elseif ($char === ":" && $state === "T_AT_FONT_FACE_DECLARATION") { if ($this->buffer === "filter") { return false; } CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Unterminated @font-face declaration", $this->buffer . ":" . $this->parser->getBuffer() . "_")); } elseif (($char === ";" || $char === "}") && $state === "T_AT_FONT_FACE_DECLARATION") { $value = $this->parser->getAndClearBuffer(";}"); if (strtolower(substr($value, -10, 10)) === "!important") { $value = trim(substr($value, 0, -10)); $isImportant = true; } else { $isImportant = false; } $this->parser->popState(); $this->parser->appendToken(new CssAtFontFaceDeclarationToken($this->buffer, $value, $isImportant)); $this->buffer = ""; if ($char === "}") { $this->parser->appendToken(new CssAtFontFaceEndToken()); $this->parser->popState(); } } elseif ($char === "}" && $state === "T_AT_FONT_FACE") { $this->parser->appendToken(new CssAtFontFaceEndToken()); $this->parser->clearBuffer(); $this->parser->popState(); } else { return false; } return true; } } class CssAtFontFaceEndToken extends aCssAtBlockEndToken { } class CssAtFontFaceDeclarationToken extends aCssDeclarationToken { } class CssAtCharsetToken extends aCssToken { public $Charset = ""; public function __construct($charset) { $this->Charset = $charset; } public function __toString() { return "@charset " . $this->Charset . ";"; } } class CssAtCharsetParserPlugin extends aCssParserPlugin { public function getTriggerChars() { return array("@", ";", "\n"); } public function getTriggerStates() { return array("T_DOCUMENT", "T_AT_CHARSET"); } public function parse($index, $char, $previousChar, $state) { if ($char === "@" && $state === "T_DOCUMENT" && strtolower(substr($this->parser->getSource(), $index, 8)) === "@charset") { $this->parser->pushState("T_AT_CHARSET"); $this->parser->clearBuffer(); return $index + 8; } elseif (($char === ";" || $char === "\n") && $state === "T_AT_CHARSET") { $charset = $this->parser->getAndClearBuffer(";"); $this->parser->popState(); $this->parser->appendToken(new CssAtCharsetToken($charset)); } else { return false; } return true; } }
?> \ No newline at end of file
diff --git a/include/dblayer/functions_mysql.inc.php b/include/dblayer/functions_mysql.inc.php
index 9c73637ee..c90a5504d 100644
--- a/include/dblayer/functions_mysql.inc.php
+++ b/include/dblayer/functions_mysql.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -200,36 +200,6 @@ function pwg_db_close()
*
*/
-/**
- * creates an array based on a query, this function is a very common pattern
- * used here
- *
- * @param string $query
- * @param string $fieldname optional
- * @return array
- */
-function array_from_query($query, $fieldname=false)
-{
- $array = array();
-
- $result = pwg_query($query);
- if (false === $fieldname)
- {
- while ($row = mysql_fetch_assoc($result))
- {
- $array[] = $row;
- }
- }
- else
- {
- while ($row = mysql_fetch_assoc($result))
- {
- $array[] = $row[$fieldname];
- }
- }
- return $array;
-}
-
define('MASS_UPDATES_SKIP_EMPTY', 1);
/**
* updates multiple lines in a table
@@ -328,7 +298,7 @@ SHOW FULL COLUMNS FROM '.$tablename;
{
$column.= " collate '".$row['Collation']."'";
}
- array_push($columns, $column);
+ $columns[] = $column;
}
}
@@ -564,7 +534,7 @@ function do_maintenance_all_tables()
$result = pwg_query($query);
while ($row = pwg_db_fetch_row($result))
{
- array_push($all_tables, $row[0]);
+ $all_tables[] = $row[0];
}
// Repair all tables
@@ -582,7 +552,7 @@ function do_maintenance_all_tables()
{
if ($row['Key'] == 'PRI')
{
- array_push($all_primary_key, $row['Field']);
+ $all_primary_key[] = $row['Field'];
}
}
@@ -598,17 +568,11 @@ function do_maintenance_all_tables()
$mysql_rc = $mysql_rc && pwg_query($query);
if ($mysql_rc)
{
- array_push(
- $page['infos'],
- l10n('All optimizations have been successfully completed.')
- );
+ $page['infos'][] = l10n('All optimizations have been successfully completed.');
}
else
{
- array_push(
- $page['errors'],
- l10n('Optimizations have been completed with some errors.')
- );
+ $page['errors'][] = l10n('Optimizations have been completed with some errors.');
}
}
diff --git a/include/dblayer/functions_mysqli.inc.php b/include/dblayer/functions_mysqli.inc.php
index 2c7f0c6af..41ada251d 100644
--- a/include/dblayer/functions_mysqli.inc.php
+++ b/include/dblayer/functions_mysqli.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2012 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -36,8 +36,29 @@ define('DB_RANDOM_FUNCTION', 'RAND');
function pwg_db_connect($host, $user, $password, $database)
{
global $mysqli;
+
+ // $host can be:
+ //
+ // $host = localhost
+ // $host = 1.2.3.4:3405
+ // $host = /path/to/socket
+
+ $port = null;
+ $socket = null;
+
+ if (strpos($host, '/') === 0)
+ {
+ $socket = $host;
+ $host = null;
+ }
+ elseif (strpos($host, ':') !== false)
+ {
+ list($host, $port) = explode(':', $host);
+ }
+
+ $dbname = null;
- $mysqli = new mysqli($host, $user, $password);
+ $mysqli = new mysqli($host, $user, $password, $dbname, $port, $socket);
if (mysqli_connect_error())
{
throw new Exception("Can't connect to server");
@@ -216,36 +237,6 @@ function pwg_db_close()
*
*/
-/**
- * creates an array based on a query, this function is a very common pattern
- * used here
- *
- * @param string $query
- * @param string $fieldname optional
- * @return array
- */
-function array_from_query($query, $fieldname=false)
-{
- $array = array();
-
- $result = pwg_query($query);
- if (false === $fieldname)
- {
- while ($row = pwg_db_fetch_assoc($result))
- {
- $array[] = $row;
- }
- }
- else
- {
- while ($row = pwg_db_fetch_assoc($result))
- {
- $array[] = $row[$fieldname];
- }
- }
- return $array;
-}
-
define('MASS_UPDATES_SKIP_EMPTY', 1);
/**
* updates multiple lines in a table
@@ -344,7 +335,7 @@ SHOW FULL COLUMNS FROM '.$tablename;
{
$column.= " collate '".$row['Collation']."'";
}
- array_push($columns, $column);
+ $columns[] = $column;
}
}
@@ -580,7 +571,7 @@ function do_maintenance_all_tables()
$result = pwg_query($query);
while ($row = pwg_db_fetch_row($result))
{
- array_push($all_tables, $row[0]);
+ $all_tables[] = $row[0];
}
// Repair all tables
@@ -598,7 +589,7 @@ function do_maintenance_all_tables()
{
if ($row['Key'] == 'PRI')
{
- array_push($all_primary_key, $row['Field']);
+ $all_primary_key[] = $row['Field'];
}
}
@@ -614,17 +605,11 @@ function do_maintenance_all_tables()
$mysqli_rc = $mysqli_rc && pwg_query($query);
if ($mysqli_rc)
{
- array_push(
- $page['infos'],
- l10n('All optimizations have been successfully completed.')
- );
+ $page['infos'][] = l10n('All optimizations have been successfully completed.');
}
else
{
- array_push(
- $page['errors'],
- l10n('Optimizations have been completed with some errors.')
- );
+ $page['errors'][] = l10n('Optimizations have been completed with some errors.');
}
}
diff --git a/include/derivative.inc.php b/include/derivative.inc.php
index 1625d5860..49fa9d042 100644
--- a/include/derivative.inc.php
+++ b/include/derivative.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// +-----------------------------------------------------------------------+
// | 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 |
@@ -19,22 +19,36 @@
// | USA. |
// +-----------------------------------------------------------------------+
-/*A source image is used to get a derivative image. A source image is either the original file for a jpg or a
-'representative' image of a non image file or a standard icon for the non-image file.*/
+/**
+ * @package Derivatives
+ */
+
+
+/**
+ * A source image is used to get a derivative image. It is either
+ * the original file for a jpg/png/... or a 'representative' image
+ * of a non image file or a standard icon for the non-image file.
+ */
final class SrcImage
{
const IS_ORIGINAL = 0x01;
const IS_MIMETYPE = 0x02;
const DIM_NOT_GIVEN = 0x04;
+ /** @var int */
public $id;
+ /** @var string */
public $rel_path;
+ /** @var int */
public $rotation = 0;
-
+ /** @var int[] */
private $size=null;
+ /** @var int */
private $flags=0;
- /*@param infos assoc array of data from images table*/
+ /**
+ * @param array $infos assoc array of data from images table
+ */
function __construct($infos)
{
global $conf;
@@ -88,21 +102,33 @@ final class SrcImage
}
}
+ /**
+ * @return bool
+ */
function is_original()
{
return $this->flags & self::IS_ORIGINAL;
}
+ /**
+ * @return bool
+ */
function is_mimetype()
{
return $this->flags & self::IS_MIMETYPE;
}
+ /**
+ * @return string
+ */
function get_path()
{
return PHPWG_ROOT_PATH.$this->rel_path;
}
+ /**
+ * @return string
+ */
function get_url()
{
$url = get_root_url().$this->rel_path;
@@ -113,12 +139,17 @@ final class SrcImage
return embellish_url($url);
}
+ /**
+ * @return bool
+ */
function has_size()
{
return $this->size != null;
}
- /* @return a 2-element array containing width/height or null if dimensions are not available*/
+ /**
+ * @return int[]|null 0=width, 1=height or null if fail to compute size
+ */
function get_size()
{
if ($this->size == null)
@@ -137,19 +168,29 @@ final class SrcImage
}
-/*Holds information (path, url, dimensions) about a derivative image. A derivative image is constructed from a source
-image (SrcImage class) and derivative parameters (DerivativeParams class).
-*/
+/**
+ * Holds information (path, url, dimensions) about a derivative image.
+ * A derivative image is constructed from a source image (SrcImage class)
+ * and derivative parameters (DerivativeParams class).
+ */
final class DerivativeImage
{
+ /** @var SrcImage */
public $src_image;
-
+ /** @var array */
private $params;
- private $rel_path, $rel_url, $is_cached=true;
+ /** @var string */
+ private $rel_path;
+ /** @var string */
+ private $rel_url;
+ /** @var bool */
+ private $is_cached=true;
- /*
- @param type string of standard derivative param type (e.g. IMG_???) or a DerivativeParams object
- @param src_image the source image of this derivative*/
+ /**
+ * @param string|DerivativeParams $type standard derivative param type (e.g. IMG_*)
+ * or a DerivativeParams object
+ * @param SrcImage $src_image the source image of this derivative
+ */
function __construct($type, SrcImage $src_image)
{
$this->src_image = $src_image;
@@ -165,16 +206,25 @@ final class DerivativeImage
self::build($src_image, $this->params, $this->rel_path, $this->rel_url, $this->is_cached);
}
+ /**
+ * Generates the url of a thumbnail.
+ *
+ * @param array|SrcImage $infos array of info from db or SrcImage
+ * @return string
+ */
static function thumb_url($infos)
{
return self::url(IMG_THUMB, $infos);
}
/**
- @return derivative image url
- @param type string of standard derivative param type (e.g. IMG_???) or a DerivativeParams object
- @param infos assoc array of data from images table or a SrcImage object
- */
+ * Generates the url for a particular photo size.
+ *
+ * @param string|DerivativeParams $type standard derivative param type (e.g. IMG_*)
+ * or a DerivativeParams object
+ * @param array|SrcImage $infos array of info from db or SrcImage
+ * @return string
+ */
static function url($type, $infos)
{
$src_image = is_object($infos) ? $infos : new SrcImage($infos);
@@ -192,13 +242,22 @@ final class DerivativeImage
}
/**
- @return an associative array of derivative images with keys all standard derivative image types:
- Disabled derivative types can be still found in the return mapped to an enabled derivative (e.g. the values are not
- unique in the return array). This is useful for any plugin/theme to just use $deriv[IMG_XLARGE] even if the XLARGE is
- disabled.
- */
+ * Return associative an array of all DerivativeImage for a specific image.
+ * Disabled derivative types can be still found in the return, mapped to an
+ * enabled derivative (e.g. the values are not unique in the return array).
+ * This is useful for any plugin/theme to just use $deriv[IMG_XLARGE] even if
+ * the XLARGE is disabled.
+ *
+ * @param array|SrcImage $src_image array of info from db or SrcImage
+ * @return DerivativeImage[]
+ */
static function get_all($src_image)
{
+ if (!is_object($src_image))
+ {
+ $src_image = new SrcImage($src_image);
+ }
+
$ret = array();
// build enabled types
foreach (ImageStdParams::get_defined_type_map() as $type => $params)
@@ -206,7 +265,7 @@ final class DerivativeImage
$derivative = new DerivativeImage($params, $src_image);
$ret[$type] = $derivative;
}
- // disabled types fqllbqck to enqbled types
+ // disabled types, fallback to enabled types
foreach (ImageStdParams::get_undefined_type_map() as $type => $type2)
{
$ret[$type] = $ret[$type2];
@@ -215,6 +274,39 @@ final class DerivativeImage
return $ret;
}
+ /**
+ * Returns an instance of DerivativeImage for a specific image and size.
+ * Disabled derivatives fallback to an enabled derivative.
+ *
+ * @param string $type standard derivative param type (e.g. IMG_*)
+ * @param array|SrcImage $src_image array of info from db or SrcImage
+ * @return DerivativeImage|null null if $type not found
+ */
+ static function get_one($type, $src_image)
+ {
+ if (!is_object($src_image))
+ {
+ $src_image = new SrcImage($src_image);
+ }
+
+ $defined = ImageStdParams::get_defined_type_map();
+ if (isset($defined[$type]))
+ {
+ return new DerivativeImage($defined[$type], $src_image);
+ }
+
+ $undefined = ImageStdParams::get_undefined_type_map();
+ if (isset($undefined[$type]))
+ {
+ return new DerivativeImage($defined[ $undefined[$type] ], $src_image);
+ }
+
+ return null;
+ }
+
+ /**
+ * @todo : documentation of DerivativeImage::build
+ */
private static function build($src, &$params, &$rel_path, &$rel_url, &$is_cached=null)
{
if ( $src->has_size() && $params->is_identity( $src->get_size() ) )
@@ -295,11 +387,17 @@ final class DerivativeImage
}
}
+ /**
+ * @return string
+ */
function get_path()
{
return PHPWG_ROOT_PATH.$this->rel_path;
}
+ /**
+ * @return string
+ */
function get_url()
{
if ($this->params == null)
@@ -313,12 +411,17 @@ final class DerivativeImage
) );
}
+ /**
+ * @return bool
+ */
function same_as_source()
{
return $this->params == null;
}
-
+ /**
+ * @return string one if IMG_* or 'Original'
+ */
function get_type()
{
if ($this->params == null)
@@ -326,7 +429,9 @@ final class DerivativeImage
return $this->params->type;
}
- /* returns the size of the derivative image*/
+ /**
+ * @return int[]
+ */
function get_size()
{
if ($this->params == null)
@@ -336,6 +441,11 @@ final class DerivativeImage
return $this->params->compute_final_size($this->src_image->get_size());
}
+ /**
+ * Returns the size as CSS rule.
+ *
+ * @return string
+ */
function get_size_css()
{
$size = $this->get_size();
@@ -345,6 +455,11 @@ final class DerivativeImage
}
}
+ /**
+ * Returns the size as HTML attributes.
+ *
+ * @return string
+ */
function get_size_htm()
{
$size = $this->get_size();
@@ -354,6 +469,11 @@ final class DerivativeImage
}
}
+ /**
+ * Returns literal size: $widthx$height.
+ *
+ * @return string
+ */
function get_size_hr()
{
$size = $this->get_size();
@@ -363,6 +483,11 @@ final class DerivativeImage
}
}
+ /**
+ * @param int $maxw
+ * @param int $mawh
+ * @return int[]
+ */
function get_scaled_size($maxw, $maxh)
{
$size = $this->get_size();
@@ -387,6 +512,13 @@ final class DerivativeImage
return $size;
}
+ /**
+ * Returns the scaled size as HTML attributes.
+ *
+ * @param int $maxw
+ * @param int $mawh
+ * @return string
+ */
function get_scaled_size_htm($maxw=9999, $maxh=9999)
{
$size = $this->get_scaled_size($maxw, $maxh);
@@ -396,6 +528,9 @@ final class DerivativeImage
}
}
+ /**
+ * @return bool
+ */
function is_cached()
{
return $this->is_cached;
diff --git a/include/derivative_params.inc.php b/include/derivative_params.inc.php
index 31c76bed7..cb1f22e5e 100644
--- a/include/derivative_params.inc.php
+++ b/include/derivative_params.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// +-----------------------------------------------------------------------+
// | 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 |
@@ -19,11 +19,28 @@
// | USA. |
// +-----------------------------------------------------------------------+
+/**
+ * @package Derivatives
+ */
+
+
+/**
+ * Formats a size name into a 2 chars identifier usable in filename.
+ *
+ * @param string $t one of IMG_*
+ * @return string
+ */
function derivative_to_url($t)
{
return substr($t, 0, 2);
}
+/**
+ * Formats a size array into a identifier usable in filename.
+ *
+ * @param int[] $s
+ * @return string
+ */
function size_to_url($s)
{
if ($s[0]==$s[1])
@@ -33,26 +50,55 @@ function size_to_url($s)
return $s[0].'x'.$s[1];
}
+/**
+ * @param int[] $s1
+ * @param int[] $s2
+ * @return bool
+ */
function size_equals($s1, $s2)
{
return ($s1[0]==$s2[0] && $s1[1]==$s2[1]);
}
+/**
+ * Converts a char a-z into a float.
+ *
+ * @param string
+ * @return float
+ */
function char_to_fraction($c)
{
return (ord($c) - ord('a'))/25;
}
+/**
+ * Converts a float into a char a-z.
+ *
+ * @param float
+ * @return string
+ */
function fraction_to_char($f)
{
return chr(ord('a') + round($f*25));
}
-/** small utility to manipulate a 'rectangle'*/
+
+/**
+ * Small utility to manipulate a 'rectangle'.
+ */
final class ImageRect
{
+ /**
+ * @var int $l
+ * @var int $t
+ * @var int $r
+ * @var int $b
+ */
public $l,$t,$r,$b;
+ /**
+ * @param int[] $l width and height
+ */
function __construct($l)
{
$this->l = $this->t = 0;
@@ -60,19 +106,28 @@ final class ImageRect
$this->b = $l[1];
}
+ /**
+ * @return int
+ */
function width()
{
return $this->r - $this->l;
}
+ /**
+ * @return int
+ */
function height()
{
return $this->b - $this->t;
}
- /** crops horizontally this rectangle by increasing left side and/or reducing the right side.
- @param pixels the amount to substract from the width
- @param coi a 4 character string (or null) containing the center of interest*/
+ /**
+ * Crops horizontally this rectangle by increasing left side and/or reducing the right side.
+ *
+ * @param int $pixels - the amount to substract from the width
+ * @param stirng $coi - a 4 character string (or null) containing the center of interest
+ */
function crop_h($pixels, $coi)
{
if ($this->width() <= $pixels)
@@ -101,9 +156,12 @@ final class ImageRect
$this->r -= $pixels - $tlcrop;
}
- /** crops vertically this rectangle by increasing top side and/or reducing the bottom side.
- @param pixels the amount to substract from the height
- @param coi a 4 character string (or null) containing the center of interest*/
+ /**
+ * Crops vertically this rectangle by increasing top side and/or reducing the bottom side.
+ *
+ * @param int $pixels - the amount to substract from the height
+ * @param string $coi - a 4 character string (or null) containing the center of interest
+ */
function crop_v($pixels, $coi)
{
if ($this->height() <= $pixels)
@@ -131,35 +189,63 @@ final class ImageRect
$this->t += $tlcrop;
$this->b -= $pixels - $tlcrop;
}
-
}
-/** Paramaters for derivative scaling and cropping. Instance of this class contained by DerivativeParams class.*/
+/**
+ * Paramaters for derivative scaling and cropping.
+ * Instance of this class contained by DerivativeParams class.
+ */
final class SizingParams
{
+ /** @var int[] */
+ var $ideal_size;
+ /** @var float */
+ var $max_crop;
+ /** @var int[] */
+ var $min_size;
+
/**
- @param ideal_size two element array of maximum output dimensions (width, height)
- @param max_crop range 0=no cropping ... 1= max cropping (100% of width/height); expressed as a factor of the input width/height
- @param min_size used only if max_crop != 0 - two element array of output dimensions (width, height)
- */
- function __construct($ideal_size, $max_crop = 0, $min_size = null)
+ * @param int[] $ideal_size - two element array of maximum output dimensions (width, height)
+ * @param float $max_crop - from 0=no cropping to 1= max cropping (100% of width/height);
+ * expressed as a factor of the input width/height
+ * @param int[] $min_size - (used only if _$max_crop_ !=0) two element array of output dimensions (width, height)
+ */
+ function __construct($ideal_size, $max_crop=0, $min_size=null)
{
$this->ideal_size = $ideal_size;
- $this->max_crop = $max_crop; // range 0=no cropping ... 1= max cropping (100% of width/height)
+ $this->max_crop = $max_crop;
$this->min_size = $min_size;
}
+ /**
+ * Returns a simple SizingParams object.
+ *
+ * @param int $w
+ * @param int $h
+ * @return SizingParams
+ */
static function classic($w, $h)
{
return new SizingParams( array($w,$h) );
}
+ /**
+ * Returns a square SizingParams object.
+ *
+ * @param int $x
+ * @return SizingParams
+ */
static function square($w)
{
return new SizingParams( array($w,$w), 1, array($w,$w) );
}
+ /**
+ * Adds tokens depending on sizing configuration.
+ *
+ * @param array &$tokens
+ */
function add_url_tokens(&$tokens)
{
if ($this->max_crop == 0)
@@ -178,12 +264,14 @@ final class SizingParams
}
}
- /* calculate the cropping rectangle and the scaled size for an input image size
- @param in_size two element array of input dimensions (width, height)
- @param coi empty or a four character encoded string containing the center of interest (unused if max_crop=0)
- @param crop_rect output ImageRect containing the cropping rectangle or null if cropping is not required
- @param scale_size output two element array containing width and height of the scaled image
- */
+ /**
+ * Calculates the cropping rectangle and the scaled size for an input image size.
+ *
+ * @param int[] $in_size - two element array of input dimensions (width, height)
+ * @param string $coi - four character encoded string containing the center of interest (unused if max_crop=0)
+ * @param ImageRect &$crop_rect - ImageRect containing the cropping rectangle or null if cropping is not required
+ * @param int[] &$scale_size - two element array containing width and height of the scaled image
+ */
function compute($in_size, $coi, &$crop_rect, &$scale_size)
{
$destCrop = new ImageRect($in_size);
@@ -245,50 +333,81 @@ final class SizingParams
$crop_rect = $destCrop;
}
}
-
}
-/** All needed parameters to generate a derivative image.*/
+/**
+ * All needed parameters to generate a derivative image.
+ */
final class DerivativeParams
{
- public $type = IMG_CUSTOM; // string IMG_xxx
- public $last_mod_time = 0; // used for non-custom images to regenerate the cached files
+ /** @var SizingParams */
+ public $sizing;
+ /** @var string among IMG_* */
+ public $type = IMG_CUSTOM;
+ /** @var int used for non-custom images to regenerate the cached files */
+ public $last_mod_time = 0;
+ /** @var bool */
public $use_watermark = false;
- public $sizing; // of type SizingParams
- public $sharpen = 0; // range 0= no sharpening ... 1= max sharpening
+ /** @var float from 0=no sharpening to 1=max sharpening */
+ public $sharpen = 0;
+ /**
+ * @param SizingParams $sizing
+ */
function __construct($sizing)
{
$this->sizing = $sizing;
}
+ /**
+ * @return array
+ */
public function __sleep()
{
- return array('last_mod_time', 'sizing', 'sharpen');
+ return array('last_mod_time', 'sizing', 'sharpen');
}
+ /**
+ * Adds tokens depending on sizing configuration.
+ *
+ * @param array &$tokens
+ */
function add_url_tokens(&$tokens)
{
$this->sizing->add_url_tokens($tokens);
}
+ /**
+ * @return int[]
+ */
function compute_final_size($in_size)
{
$this->sizing->compute( $in_size, null, $crop_rect, $scale_size );
return $scale_size != null ? $scale_size : $in_size;
}
+ /**
+ * @return int
+ */
function max_width()
{
return $this->sizing->ideal_size[0];
}
+ /**
+ * @return int
+ */
function max_height()
{
return $this->sizing->ideal_size[1];
}
+ /**
+ * @todo : description of DerivativeParams::is_identity
+ *
+ * @return bool
+ */
function is_identity($in_size)
{
if ($in_size[0] > $this->sizing->ideal_size[0] or
@@ -299,6 +418,9 @@ final class DerivativeParams
return true;
}
+ /**
+ * @return bool
+ */
function will_watermark($out_size)
{
if ($this->use_watermark)
@@ -310,4 +432,5 @@ final class DerivativeParams
return false;
}
}
+
?> \ No newline at end of file
diff --git a/include/derivative_std_params.inc.php b/include/derivative_std_params.inc.php
index 649120033..375eb18e9 100644
--- a/include/derivative_std_params.inc.php
+++ b/include/derivative_std_params.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// +-----------------------------------------------------------------------+
// | 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 |
@@ -19,6 +19,11 @@
// | USA. |
// +-----------------------------------------------------------------------+
+/**
+ * @package Derivatives
+ */
+
+
define('IMG_SQUARE', 'square');
define('IMG_THUMB', 'thumb');
define('IMG_XXSMALL', '2small');
@@ -30,54 +35,98 @@ define('IMG_XLARGE', 'xlarge');
define('IMG_XXLARGE', 'xxlarge');
define('IMG_CUSTOM', 'custom');
+
+/**
+ * Container for watermark configuration.
+ */
final class WatermarkParams
{
+ /** @var string */
public $file = '';
+ /** @var int[] */
public $min_size = array(500,500);
+ /** @var int */
public $xpos = 50;
+ /** @var int */
public $ypos = 50;
+ /** @var int */
public $xrepeat = 0;
+ /** @var int */
public $opacity = 100;
}
+/**
+ * Container for standard derivatives parameters.
+ */
final class ImageStdParams
{
+ /** @var string[] */
private static $all_types = array(
- IMG_SQUARE,IMG_THUMB,IMG_XXSMALL,IMG_XSMALL,IMG_SMALL,IMG_MEDIUM,IMG_LARGE,IMG_XLARGE,IMG_XXLARGE
+ IMG_SQUARE, IMG_THUMB, IMG_XXSMALL, IMG_XSMALL, IMG_SMALL,
+ IMG_MEDIUM, IMG_LARGE, IMG_XLARGE, IMG_XXLARGE
);
+ /** @var DerivativeParams[] */
private static $all_type_map = array();
+ /** @var DerivativeParams[] */
private static $type_map = array();
+ /** @var DerivativeParams[] */
private static $undefined_type_map = array();
+ /** @var WatermarkParams */
private static $watermark;
+ /** @var array */
public static $custom = array();
+ /** @var int */
public static $quality=95;
+ /**
+ * @return string[]
+ */
static function get_all_types()
{
return self::$all_types;
}
+ /**
+ * @return DerivativeParams[]
+ */
static function get_all_type_map()
{
return self::$all_type_map;
}
+ /**
+ * @return DerivativeParams[]
+ */
static function get_defined_type_map()
{
return self::$type_map;
}
+ /**
+ * @return DerivativeParams[]
+ */
static function get_undefined_type_map()
{
return self::$undefined_type_map;
}
+ /**
+ * @return DerivativeParams
+ */
static function get_by_type($type)
{
return self::$all_type_map[$type];
}
+ /**
+ * @param int $w
+ * @param int $h
+ * @param float $crop
+ * @param int $minw
+ * @param int $minh
+ * @return DerivativeParams
+ */
static function get_custom($w, $h, $crop=0, $minw=null, $minh=null)
{
$params = new DerivativeParams( new SizingParams( array($w,$h), $crop, array($minw,$minh)) );
@@ -94,11 +143,17 @@ final class ImageStdParams
return $params;
}
+ /**
+ * @return WatermarkParams
+ */
static function get_watermark()
{
return self::$watermark;
}
+ /**
+ * Loads derivative configuration from database or initializes it.
+ */
static function load_from_db()
{
global $conf;
@@ -121,11 +176,19 @@ final class ImageStdParams
self::build_maps();
}
+ /**
+ * @param WatermarkParams $watermark
+ */
static function set_watermark($watermark)
{
self::$watermark = $watermark;
}
+ /**
+ * @see ImageStdParams::save()
+ *
+ * @param DerivativeParams[] $map
+ */
static function set_and_save($map)
{
self::$type_map = $map;
@@ -133,6 +196,9 @@ final class ImageStdParams
self::build_maps();
}
+ /**
+ * Saves the configuration in database.
+ */
static function save()
{
global $conf;
@@ -146,6 +212,9 @@ final class ImageStdParams
conf_update_param('derivatives', addslashes($ser) );
}
+ /**
+ * @return DerivativeParams[]
+ */
static function get_default_sizes()
{
$arr = array(
@@ -159,13 +228,19 @@ final class ImageStdParams
IMG_XLARGE => new DerivativeParams( SizingParams::classic(1224,918) ),
IMG_XXLARGE => new DerivativeParams( SizingParams::classic(1656,1242) ),
);
+ $now = time();
foreach($arr as $params)
{
- $params->last_mod_time = time();
+ $params->last_mod_time = $now;
}
return $arr;
}
+ /**
+ * Compute 'apply_watermark'
+ *
+ * @param DerivativeParams $params
+ */
static function apply_global($params)
{
$params->use_watermark = !empty(self::$watermark->file) &&
@@ -173,6 +248,9 @@ final class ImageStdParams
or self::$watermark->min_size[1]<=$params->sizing->ideal_size[1] );
}
+ /**
+ * Build 'type_map', 'all_type_map' and 'undefined_type_map'.
+ */
private static function build_maps()
{
foreach (self::$type_map as $type=>$params)
@@ -200,7 +278,6 @@ final class ImageStdParams
}
}
}
-
}
?> \ No newline at end of file
diff --git a/include/emogrifier.class.php b/include/emogrifier.class.php
new file mode 100644
index 000000000..ef2c49730
--- /dev/null
+++ b/include/emogrifier.class.php
@@ -0,0 +1,404 @@
+<?php
+/*
+UPDATES
+
+ 2008-08-10 Fixed CSS comment stripping regex to add PCRE_DOTALL (changed from '/\/\*.*\*\//U' to '/\/\*.*\*\//sU')
+ 2008-08-18 Added lines instructing DOMDocument to attempt to normalize HTML before processing
+ 2008-10-20 Fixed bug with bad variable name... Thanks Thomas!
+ 2008-03-02 Added licensing terms under the MIT License
+ Only remove unprocessable HTML tags if they exist in the array
+ 2009-06-03 Normalize existing CSS (style) attributes in the HTML before we process the CSS.
+ Made it so that the display:none stripper doesn't require a trailing semi-colon.
+ 2009-08-13 Added support for subset class values (e.g. "p.class1.class2").
+ Added better protection for bad css attributes.
+ Fixed support for HTML entities.
+ 2009-08-17 Fixed CSS selector processing so that selectors are processed by precedence/specificity, and not just in order.
+ 2009-10-29 Fixed so that selectors appearing later in the CSS will have precedence over identical selectors appearing earlier.
+ 2009-11-04 Explicitly declared static functions static to get rid of E_STRICT notices.
+ 2010-05-18 Fixed bug where full url filenames with protocols wouldn't get split improperly when we explode on ':'... Thanks Mark!
+ Added two new attribute selectors
+ 2010-06-16 Added static caching for less processing overhead in situations where multiple emogrification takes place
+ 2010-07-26 Fixed bug where '0' values were getting discarded because of php's empty() function... Thanks Scott!
+ 2010-09-03 Added checks to invisible node removal to ensure that we don't try to remove non-existent child nodes of parents that have already been deleted
+ 2011-04-08 Fixed errors in CSS->XPath conversion for adjacent sibling selectors and id/class combinations... Thanks Bob V.!
+ 2011-06-08 Fixed an error where CSS @media types weren't being parsed correctly... Thanks Will W.!
+ 2011-08-03 Fixed an error where an empty selector at the beginning of the CSS would cause a parse error on the next selector... Thanks Alexei T.!
+ 2011-10-13 Fully fixed a bug introduced in 2011-06-08 where selectors at the beginning of the CSS would be parsed incorrectly... Thanks Thomas A.!
+ 2011-10-26 Added an option to allow you to output emogrified code without extended characters being turned into HTML entities.
+ Moved static references to class attributes so they can be manipulated.
+ Added the ability to clear out the (formerly) static cache when CSS is reloaded.
+ 2011-12-22 Fixed a bug that was overwriting existing inline styles from the original HTML... Thanks Sagi L.!
+ 2012-01-31 Fixed a bug that was introduced with the 2011-12-22 revision... Thanks Sagi L. and M. BÄ…kowski!
+ Added extraction of <style> blocks within the HTML due to popular demand.
+ Added several new pseudo-selectors (first-child, last-child, nth-child, and nth-of-type).
+ 2012-02-07 Fixed some recent code introductions to use class constants rather than global constants.
+ Fixed some recent code introductions to make it cleaner to read.
+ 2012-05-01 Made removal of invisible nodes operate in a case-insensitive manner... Thanks Juha P.!
+ 2013-10-10 Add preserveStyleTag option
+*/
+
+define('CACHE_CSS', 0);
+define('CACHE_SELECTOR', 1);
+define('CACHE_XPATH', 2);
+
+class Emogrifier {
+
+ // for calculating nth-of-type and nth-child selectors
+ const INDEX = 0;
+ const MULTIPLIER = 1;
+
+ private $html = '';
+ private $css = '';
+ private $unprocessableHTMLTags = array('wbr');
+ private $caches = array();
+
+ // this attribute applies to the case where you want to preserve your original text encoding.
+ // by default, emogrifier translates your text into HTML entities for two reasons:
+ // 1. because of client incompatibilities, it is better practice to send out HTML entities rather than unicode over email
+ // 2. it translates any illegal XML characters that DOMDocument cannot work with
+ // if you would like to preserve your original encoding, set this attribute to true.
+ public $preserveEncoding = false;
+
+ // by default, emogrifier removes <style> tags, set preserveStyleTag to true to keep them
+ public $preserveStyleTag = false;
+
+ public function __construct($html = '', $css = '') {
+ $this->html = $html;
+ $this->css = $css;
+ $this->clearCache();
+ }
+
+ public function setHTML($html = '') { $this->html = $html; }
+ public function setCSS($css = '') {
+ $this->css = $css;
+ $this->clearCache(CACHE_CSS);
+ }
+
+ public function clearCache($key = null) {
+ if (!is_null($key)) {
+ if (isset($this->caches[$key])) $this->caches[$key] = array();
+ } else {
+ $this->caches = array(
+ CACHE_CSS => array(),
+ CACHE_SELECTOR => array(),
+ CACHE_XPATH => array(),
+ );
+ }
+ }
+
+ // there are some HTML tags that DOMDocument cannot process, and will throw an error if it encounters them.
+ // in particular, DOMDocument will complain if you try to use HTML5 tags in an XHTML document.
+ // these functions allow you to add/remove them if necessary.
+ // it only strips them from the code (does not remove actual nodes).
+ public function addUnprocessableHTMLTag($tag) { $this->unprocessableHTMLTags[] = $tag; }
+ public function removeUnprocessableHTMLTag($tag) {
+ if (($key = array_search($tag,$this->unprocessableHTMLTags)) !== false)
+ unset($this->unprocessableHTMLTags[$key]);
+ }
+
+ // applies the CSS you submit to the html you submit. places the css inline
+ public function emogrify() {
+ $body = $this->html;
+
+ // remove any unprocessable HTML tags (tags that DOMDocument cannot parse; this includes wbr and many new HTML5 tags)
+ if (count($this->unprocessableHTMLTags)) {
+ $unprocessableHTMLTags = implode('|',$this->unprocessableHTMLTags);
+ $body = preg_replace("/<\/?($unprocessableHTMLTags)[^>]*>/i",'',$body);
+ }
+
+ $encoding = mb_detect_encoding($body);
+ $body = mb_convert_encoding($body, 'HTML-ENTITIES', $encoding);
+
+ $xmldoc = new DOMDocument;
+ $xmldoc->encoding = $encoding;
+ $xmldoc->strictErrorChecking = false;
+ $xmldoc->formatOutput = true;
+ $xmldoc->loadHTML($body);
+ $xmldoc->normalizeDocument();
+
+ $xpath = new DOMXPath($xmldoc);
+
+ // before be begin processing the CSS file, parse the document and normalize all existing CSS attributes (changes 'DISPLAY: none' to 'display: none');
+ // we wouldn't have to do this if DOMXPath supported XPath 2.0.
+ // also store a reference of nodes with existing inline styles so we don't overwrite them
+ $vistedNodes = $vistedNodeRef = array();
+ $nodes = @$xpath->query('//*[@style]');
+ foreach ($nodes as $node) {
+ $normalizedOrigStyle = preg_replace('/[A-z\-]+(?=\:)/Se',"strtolower('\\0')", $node->getAttribute('style'));
+
+ // in order to not overwrite existing style attributes in the HTML, we have to save the original HTML styles
+ $nodeKey = md5($node->getNodePath());
+ if (!isset($vistedNodeRef[$nodeKey])) {
+ $vistedNodeRef[$nodeKey] = $this->cssStyleDefinitionToArray($normalizedOrigStyle);
+ $vistedNodes[$nodeKey] = $node;
+ }
+
+ $node->setAttribute('style', $normalizedOrigStyle);
+ }
+
+ // grab any existing style blocks from the html and append them to the existing CSS
+ // (these blocks should be appended so as to have precedence over conflicting styles in the existing CSS)
+ $css = $this->css;
+ $nodes = @$xpath->query('//style');
+ foreach ($nodes as $node) {
+ // append the css
+ $css .= "\n\n{$node->nodeValue}";
+ // remove the <style> node
+ if (!$this->preserveStyleTag) {
+ $node->parentNode->removeChild($node);
+ }
+ }
+
+ // filter the CSS
+ $search = array(
+ '/\/\*.*\*\//sU', // get rid of css comment code
+ '/^\s*@import\s[^;]+;/misU', // strip out any import directives
+ '/^\s*@media\s[^{]+{\s*}/misU', // strip any empty media enclosures
+ '/^\s*@media\s+((aural|braille|embossed|handheld|print|projection|speech|tty|tv)\s*,*\s*)+{.*}\s*}/misU', // strip out all media types that are not 'screen' or 'all' (these don't apply to email)
+ '/^\s*@media\s[^{]+{(.*})\s*}/misU', // get rid of remaining media type enclosures
+ );
+
+ $replace = array(
+ '',
+ '',
+ '',
+ '',
+ '\\1',
+ );
+
+ $css = preg_replace($search, $replace, $css);
+
+ $csskey = md5($css);
+ if (!isset($this->caches[CACHE_CSS][$csskey])) {
+
+ // process the CSS file for selectors and definitions
+ preg_match_all('/(^|[^{}])\s*([^{]+){([^}]*)}/mis', $css, $matches, PREG_SET_ORDER);
+
+ $all_selectors = array();
+ foreach ($matches as $key => $selectorString) {
+ // if there is a blank definition, skip
+ if (!strlen(trim($selectorString[3]))) continue;
+
+ // else split by commas and duplicate attributes so we can sort by selector precedence
+ $selectors = explode(',',$selectorString[2]);
+ foreach ($selectors as $selector) {
+
+ // don't process pseudo-elements and behavioral (dynamic) pseudo-classes; ONLY allow structural pseudo-classes
+ if (strpos($selector, ':') !== false && !preg_match('/:\S+\-(child|type)\(/i', $selector)) continue;
+
+ $all_selectors[] = array('selector' => trim($selector),
+ 'attributes' => trim($selectorString[3]),
+ 'line' => $key, // keep track of where it appears in the file, since order is important
+ );
+ }
+ }
+
+ // now sort the selectors by precedence
+ usort($all_selectors, array($this,'sortBySelectorPrecedence'));
+
+ $this->caches[CACHE_CSS][$csskey] = $all_selectors;
+ }
+
+ foreach ($this->caches[CACHE_CSS][$csskey] as $value) {
+
+ // query the body for the xpath selector
+ $nodes = $xpath->query($this->translateCSStoXpath(trim($value['selector'])));
+
+ foreach($nodes as $node) {
+ // if it has a style attribute, get it, process it, and append (overwrite) new stuff
+ if ($node->hasAttribute('style')) {
+ // break it up into an associative array
+ $oldStyleArr = $this->cssStyleDefinitionToArray($node->getAttribute('style'));
+ $newStyleArr = $this->cssStyleDefinitionToArray($value['attributes']);
+
+ // new styles overwrite the old styles (not technically accurate, but close enough)
+ $combinedArr = array_merge($oldStyleArr,$newStyleArr);
+ $style = '';
+ foreach ($combinedArr as $k => $v) $style .= (strtolower($k) . ':' . $v . ';');
+ } else {
+ // otherwise create a new style
+ $style = trim($value['attributes']);
+ }
+ $node->setAttribute('style', $style);
+ }
+ }
+
+ // now iterate through the nodes that contained inline styles in the original HTML
+ foreach ($vistedNodeRef as $nodeKey => $origStyleArr) {
+ $node = $vistedNodes[$nodeKey];
+ $currStyleArr = $this->cssStyleDefinitionToArray($node->getAttribute('style'));
+
+ $combinedArr = array_merge($currStyleArr, $origStyleArr);
+ $style = '';
+ foreach ($combinedArr as $k => $v) $style .= (strtolower($k) . ':' . $v . ';');
+
+ $node->setAttribute('style', $style);
+ }
+
+ // This removes styles from your email that contain display:none.
+ // We need to look for display:none, but we need to do a case-insensitive search. Since DOMDocument only supports XPath 1.0,
+ // lower-case() isn't available to us. We've thus far only set attributes to lowercase, not attribute values. Consequently, we need
+ // to translate() the letters that would be in 'NONE' ("NOE") to lowercase.
+ $nodes = $xpath->query('//*[contains(translate(translate(@style," ",""),"NOE","noe"),"display:none")]');
+ // The checks on parentNode and is_callable below ensure that if we've deleted the parent node,
+ // we don't try to call removeChild on a nonexistent child node
+ if ($nodes->length > 0)
+ foreach ($nodes as $node)
+ if ($node->parentNode && is_callable(array($node->parentNode,'removeChild')))
+ $node->parentNode->removeChild($node);
+
+ if ($this->preserveEncoding) {
+ return mb_convert_encoding($xmldoc->saveHTML(), $encoding, 'HTML-ENTITIES');
+ } else {
+ return $xmldoc->saveHTML();
+ }
+ }
+
+ private function sortBySelectorPrecedence($a, $b) {
+ $precedenceA = $this->getCSSSelectorPrecedence($a['selector']);
+ $precedenceB = $this->getCSSSelectorPrecedence($b['selector']);
+
+ // we want these sorted ascendingly so selectors with lesser precedence get processed first and
+ // selectors with greater precedence get sorted last
+ return ($precedenceA == $precedenceB) ? ($a['line'] < $b['line'] ? -1 : 1) : ($precedenceA < $precedenceB ? -1 : 1);
+ }
+
+ private function getCSSSelectorPrecedence($selector) {
+ $selectorkey = md5($selector);
+ if (!isset($this->caches[CACHE_SELECTOR][$selectorkey])) {
+ $precedence = 0;
+ $value = 100;
+ $search = array('\#','\.',''); // ids: worth 100, classes: worth 10, elements: worth 1
+
+ foreach ($search as $s) {
+ if (trim($selector == '')) break;
+ $num = 0;
+ $selector = preg_replace('/'.$s.'\w+/','',$selector,-1,$num);
+ $precedence += ($value * $num);
+ $value /= 10;
+ }
+ $this->caches[CACHE_SELECTOR][$selectorkey] = $precedence;
+ }
+
+ return $this->caches[CACHE_SELECTOR][$selectorkey];
+ }
+
+ // right now we support all CSS 1 selectors and most CSS2/3 selectors.
+ // http://plasmasturm.org/log/444/
+ private function translateCSStoXpath($css_selector) {
+
+ $css_selector = trim($css_selector);
+ $xpathkey = md5($css_selector);
+ if (!isset($this->caches[CACHE_XPATH][$xpathkey])) {
+ // returns an Xpath selector
+ $search = array(
+ '/\s+>\s+/', // Matches any element that is a child of parent.
+ '/\s+\+\s+/', // Matches any element that is an adjacent sibling.
+ '/\s+/', // Matches any element that is a descendant of an parent element element.
+ '/([^\/]+):first-child/i', // first-child pseudo-selector
+ '/([^\/]+):last-child/i', // last-child pseudo-selector
+ '/(\w)\[(\w+)\]/', // Matches element with attribute
+ '/(\w)\[(\w+)\=[\'"]?(\w+)[\'"]?\]/', // Matches element with EXACT attribute
+ '/(\w+)?\#([\w\-]+)/e', // Matches id attributes
+ '/(\w+|[\*\]])?((\.[\w\-]+)+)/e', // Matches class attributes
+
+ );
+ $replace = array(
+ '/',
+ '/following-sibling::*[1]/self::',
+ '//',
+ '*[1]/self::\\1',
+ '*[last()]/self::\\1',
+ '\\1[@\\2]',
+ '\\1[@\\2="\\3"]',
+ "(strlen('\\1') ? '\\1' : '*').'[@id=\"\\2\"]'",
+ "(strlen('\\1') ? '\\1' : '*').'[contains(concat(\" \",@class,\" \"),concat(\" \",\"'.implode('\",\" \"))][contains(concat(\" \",@class,\" \"),concat(\" \",\"',explode('.',substr('\\2',1))).'\",\" \"))]'",
+ );
+
+ $css_selector = '//'.preg_replace($search, $replace, $css_selector);
+
+ // advanced selectors are going to require a bit more advanced emogrification
+ // if we required PHP 5.3 we could do this with closures
+ $css_selector = preg_replace_callback('/([^\/]+):nth-child\(\s*(odd|even|[+\-]?\d|[+\-]?\d?n(\s*[+\-]\s*\d)?)\s*\)/i', array($this, 'translateNthChild'), $css_selector);
+ $css_selector = preg_replace_callback('/([^\/]+):nth-of-type\(\s*(odd|even|[+\-]?\d|[+\-]?\d?n(\s*[+\-]\s*\d)?)\s*\)/i', array($this, 'translateNthOfType'), $css_selector);
+
+ $this->caches[CACHE_SELECTOR][$xpathkey] = $css_selector;
+ }
+ return $this->caches[CACHE_SELECTOR][$xpathkey];
+ }
+
+ private function translateNthChild($match) {
+
+ $result = $this->parseNth($match);
+
+ if (isset($result[self::MULTIPLIER])) {
+ if ($result[self::MULTIPLIER] < 0) {
+ $result[self::MULTIPLIER] = abs($result[self::MULTIPLIER]);
+ return sprintf("*[(last() - position()) mod %u = %u]/self::%s", $result[self::MULTIPLIER], $result[self::INDEX], $match[1]);
+ } else {
+ return sprintf("*[position() mod %u = %u]/self::%s", $result[self::MULTIPLIER], $result[self::INDEX], $match[1]);
+ }
+ } else {
+ return sprintf("*[%u]/self::%s", $result[self::INDEX], $match[1]);
+ }
+ }
+
+ private function translateNthOfType($match) {
+
+ $result = $this->parseNth($match);
+
+ if (isset($result[self::MULTIPLIER])) {
+ if ($result[self::MULTIPLIER] < 0) {
+ $result[self::MULTIPLIER] = abs($result[self::MULTIPLIER]);
+ return sprintf("%s[(last() - position()) mod %u = %u]", $match[1], $result[self::MULTIPLIER], $result[self::INDEX]);
+ } else {
+ return sprintf("%s[position() mod %u = %u]", $match[1], $result[self::MULTIPLIER], $result[self::INDEX]);
+ }
+ } else {
+ return sprintf("%s[%u]", $match[1], $result[self::INDEX]);
+ }
+ }
+
+ private function parseNth($match) {
+
+ if (in_array(strtolower($match[2]), array('even','odd'))) {
+ $index = strtolower($match[2]) == 'even' ? 0 : 1;
+ return array(self::MULTIPLIER => 2, self::INDEX => $index);
+ // if there is a multiplier
+ } else if (stripos($match[2], 'n') === false) {
+ $index = intval(str_replace(' ', '', $match[2]));
+ return array(self::INDEX => $index);
+ } else {
+
+ if (isset($match[3])) {
+ $multiple_term = str_replace($match[3], '', $match[2]);
+ $index = intval(str_replace(' ', '', $match[3]));
+ } else {
+ $multiple_term = $match[2];
+ $index = 0;
+ }
+
+ $multiplier = str_ireplace('n', '', $multiple_term);
+
+ if (!strlen($multiplier)) $multiplier = 1;
+ elseif ($multiplier == 0) return array(self::INDEX => $index);
+ else $multiplier = intval($multiplier);
+
+ while ($index < 0) $index += abs($multiplier);
+
+ return array(self::MULTIPLIER => $multiplier, self::INDEX => $index);
+ }
+ }
+
+ private function cssStyleDefinitionToArray($style) {
+ $definitions = explode(';',$style);
+ $retArr = array();
+ foreach ($definitions as $def) {
+ if (empty($def) || strpos($def, ':') === false) continue;
+ list($key,$value) = explode(':',$def,2);
+ if (empty($key) || strlen(trim($value)) === 0) continue;
+ $retArr[trim($key)] = trim($value);
+ }
+ return $retArr;
+ }
+} \ No newline at end of file
diff --git a/include/filter.inc.php b/include/filter.inc.php
index 4b0f93bbf..05665a036 100644
--- a/include/filter.inc.php
+++ b/include/filter.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -123,7 +123,10 @@ WHERE ';
unset($filter_key);
if (get_filter_page_value('add_notes'))
{
- $header_notes[] = l10n_dec('Photos posted within the last %d day.', 'Photos posted within the last %d days.', $filter['recent_period']);
+ $header_notes[] = l10n_dec(
+ 'Photos posted within the last %d day.', 'Photos posted within the last %d days.',
+ $filter['recent_period']
+ );
}
include_once(PHPWG_ROOT_PATH.'include/functions_filter.inc.php');
}
diff --git a/include/functions.inc.php b/include/functions.inc.php
index bcbab6ad1..219f6dcce 100644
--- a/include/functions.inc.php
+++ b/include/functions.inc.php
@@ -1,8 +1,8 @@
-<?php
+<?php
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,6 +21,10 @@
// | USA. |
// +-----------------------------------------------------------------------+
+/**
+ * @package functions\___
+ */
+
include_once( PHPWG_ROOT_PATH .'include/functions_plugins.inc.php' );
include_once( PHPWG_ROOT_PATH .'include/functions_user.inc.php' );
include_once( PHPWG_ROOT_PATH .'include/functions_cookie.inc.php' );
@@ -32,13 +36,13 @@ include_once( PHPWG_ROOT_PATH .'include/functions_url.inc.php' );
include_once( PHPWG_ROOT_PATH .'include/derivative_params.inc.php');
include_once( PHPWG_ROOT_PATH .'include/derivative_std_params.inc.php');
include_once( PHPWG_ROOT_PATH .'include/derivative.inc.php');
-require_once( PHPWG_ROOT_PATH .'include/smarty/libs/Smarty.class.php');
include_once( PHPWG_ROOT_PATH .'include/template.class.php');
-//----------------------------------------------------------- generic functions
/**
- * stupidly returns the current microsecond since Unix epoch
+ * returns the current microsecond since Unix epoch
+ *
+ * @return int
*/
function micro_seconds()
{
@@ -48,95 +52,74 @@ function micro_seconds()
return $t2;
}
-// The function get_moment returns a float value coresponding to the number
-// of seconds since the unix epoch (1st January 1970) and the microseconds
-// are precised : e.g. 1052343429.89276600
+/**
+ * returns a float value coresponding to the number of seconds since
+ * the unix epoch (1st January 1970) and the microseconds are precised
+ * e.g. 1052343429.89276600
+ *
+ * @return float
+ */
function get_moment()
{
return microtime(true);
}
-// The function get_elapsed_time returns the number of seconds (with 3
-// decimals precision) between the start time and the end time given.
-function get_elapsed_time( $start, $end )
-{
- return number_format( $end - $start, 3, '.', ' ').' s';
-}
-
-// - The replace_space function replaces space and '-' characters
-// by their HTML equivalent &nbsb; and &minus;
-// - The function does not replace characters in HTML tags
-// - This function was created because IE5 does not respect the
-// CSS "white-space: nowrap;" property unless space and minus
-// characters are replaced like this function does.
-// - Example :
-// <div class="foo">My friend</div>
-// ( 01234567891111111111222222222233 )
-// ( 0123456789012345678901 )
-// becomes :
-// <div class="foo">My&nbsp;friend</div>
-function replace_space( $string )
-{
- //return $string;
- $return_string = '';
- // $remaining is the rest of the string where to replace spaces characters
- $remaining = $string;
- // $start represents the position of the next '<' character
- // $end represents the position of the next '>' character
- ; // -> 0
- $end = strpos ( $remaining, '>' ); // -> 16
- // as long as a '<' and his friend '>' are found, we loop
- while ( ($start=strpos( $remaining, '<' )) !==false
- and ($end=strpos( $remaining, '>' )) !== false )
- {
- // $treatment is the part of the string to treat
- // In the first loop of our example, this variable is empty, but in the
- // second loop, it equals 'My friend'
- $treatment = substr ( $remaining, 0, $start );
- // Replacement of ' ' by his equivalent '&nbsp;'
- $treatment = str_replace( ' ', '&nbsp;', $treatment );
- $treatment = str_replace( '-', '&minus;', $treatment );
- // composing the string to return by adding the treated string and the
- // following HTML tag -> 'My&nbsp;friend</div>'
- $return_string.= $treatment.substr( $remaining, $start, $end-$start+1 );
- // the remaining string is deplaced to the part after the '>' of this
- // loop
- $remaining = substr ( $remaining, $end + 1, strlen( $remaining ) );
- }
- $treatment = str_replace( ' ', '&nbsp;', $remaining );
- $treatment = str_replace( '-', '&minus;', $treatment );
- $return_string.= $treatment;
-
- return $return_string;
-}
-
-// get_extension returns the part of the string after the last "."
+/**
+ * returns the number of seconds (with 3 decimals precision)
+ * between the start time and the end time given
+ *
+ * @param float $start
+ * @param float $end
+ * @return string "$TIME s"
+ */
+function get_elapsed_time($start, $end)
+{
+ return number_format($end - $start, 3, '.', ' ').' s';
+}
+
+/**
+ * returns the part of the string after the last "."
+ *
+ * @param string $filename
+ * @return string
+ */
function get_extension( $filename )
{
return substr( strrchr( $filename, '.' ), 1, strlen ( $filename ) );
}
-// get_filename_wo_extension returns the part of the string before the last
-// ".".
-// get_filename_wo_extension( 'test.tar.gz' ) -> 'test.tar'
+/**
+ * returns the part of the string before the last ".".
+ * get_filename_wo_extension( 'test.tar.gz' ) = 'test.tar'
+ *
+ * @param string $filename
+ * @return string
+ */
function get_filename_wo_extension( $filename )
{
$pos = strrpos( $filename, '.' );
return ($pos===false) ? $filename : substr( $filename, 0, $pos);
}
+/** no option for mkgetdir() */
define('MKGETDIR_NONE', 0);
+/** sets mkgetdir() recursive */
define('MKGETDIR_RECURSIVE', 1);
+/** sets mkgetdir() exit script on error */
define('MKGETDIR_DIE_ON_ERROR', 2);
+/** sets mkgetdir() add a index.htm file */
define('MKGETDIR_PROTECT_INDEX', 4);
+/** sets mkgetdir() add a .htaccess file*/
define('MKGETDIR_PROTECT_HTACCESS', 8);
-define('MKGETDIR_DEFAULT', 7);
+/** default options for mkgetdir() = MKGETDIR_RECURSIVE | MKGETDIR_DIE_ON_ERROR | MKGETDIR_PROTECT_INDEX */
+define('MKGETDIR_DEFAULT', MKGETDIR_RECURSIVE | MKGETDIR_DIE_ON_ERROR | MKGETDIR_PROTECT_INDEX);
+
/**
- * creates directory if not exists; ensures that directory is writable
- * @param:
- * string $dir
- * int $flags combination of MKGETDIR_xxx
- * @return bool false on error else true
+ * creates directory if not exists and ensures that directory is writable
+ *
+ * @param string $dir
+ * @param int $flags combination of MKGETDIR_xxx
+ * @return bool
*/
function mkgetdir($dir, $flags=MKGETDIR_DEFAULT)
{
@@ -174,19 +157,17 @@ function mkgetdir($dir, $flags=MKGETDIR_DEFAULT)
return true;
}
-/* Returns true if the string appears to be encoded in UTF-8. (from wordpress)
- * @param string Str
+/**
+ * finds out if a string is in ASCII, UTF-8 or other encoding
+ *
+ * @param string $str
+ * @return int *0* if _$str_ is ASCII, *1* if UTF-8, *-1* otherwise
*/
-function seems_utf8($Str) {
- // OBSOLETE !!!
- return qualify_utf8($Str) >= 0;
-}
-
-/* returns 0 if $str is Ascii, 1 if utf-8, -1 otherwise */
function qualify_utf8($Str)
{
$ret = 0;
- for ($i=0; $i<strlen($Str); $i++) {
+ for ($i=0; $i<strlen($Str); $i++)
+ {
if (ord($Str[$i]) < 0x80) continue; # 0bbbbbbb
$ret = 1;
if ((ord($Str[$i]) & 0xE0) == 0xC0) $n=1; # 110bbbbb
@@ -195,7 +176,8 @@ function qualify_utf8($Str)
elseif ((ord($Str[$i]) & 0xFC) == 0xF8) $n=4; # 111110bb
elseif ((ord($Str[$i]) & 0xFE) == 0xFC) $n=5; # 1111110b
else return -1; # Does not match any model
- for ($j=0; $j<$n; $j++) { # n bytes matching 10bbbbbb follow ?
+ for ($j=0; $j<$n; $j++)
+ { # n bytes matching 10bbbbbb follow ?
if ((++$i == strlen($Str)) || ((ord($Str[$i]) & 0xC0) != 0x80))
return -1;
}
@@ -203,16 +185,22 @@ function qualify_utf8($Str)
return $ret;
}
-/* Remove accents from a UTF-8 or ISO-859-1 string (from wordpress)
- * @param string sstring - an UTF-8 or ISO-8859-1 string
+/**
+ * Remove accents from a UTF-8 or ISO-8859-1 string (from wordpress)
+ *
+ * @param string $string
+ * @return string
*/
function remove_accents($string)
{
$utf = qualify_utf8($string);
if ( $utf == 0 )
+ {
return $string; // ascii
+ }
- if ( $utf > 0 ) {
+ if ( $utf > 0 )
+ {
$chars = array(
// Decompositions for Latin-1 Supplement
"\xc3\x80"=>'A', "\xc3\x81"=>'A',
@@ -316,7 +304,9 @@ function remove_accents($string)
"\xc2\xa3"=>'');
$string = strtr($string, $chars);
- } else {
+ }
+ else
+ {
// Assume ISO-8859-1 if not UTF-8
$chars['in'] = chr(128).chr(131).chr(138).chr(142).chr(154).chr(158)
.chr(159).chr(162).chr(165).chr(181).chr(192).chr(193).chr(194)
@@ -342,6 +332,12 @@ function remove_accents($string)
if (function_exists('mb_strtolower') && defined('PWG_CHARSET'))
{
+ /**
+ * removes accents from a string and converts it to lower case
+ *
+ * @param string $term
+ * @return string
+ */
function transliterate($term)
{
return remove_accents( mb_strtolower($term, PWG_CHARSET) );
@@ -349,18 +345,19 @@ if (function_exists('mb_strtolower') && defined('PWG_CHARSET'))
}
else
{
+ /**
+ * @ignore
+ */
function transliterate($term)
{
return remove_accents( strtolower($term) );
}
}
-
-
/**
* simplify a string to insert it into an URL
*
- * @param string
+ * @param string $str
* @return string
*/
function str2url($str)
@@ -378,12 +375,10 @@ function str2url($str)
return $res;
}
-//-------------------------------------------- Piwigo specific functions
-
/**
* returns an array with a list of {language_code => language_name}
*
- * @returns array
+ * @return string[]
*/
function get_languages()
{
@@ -406,6 +401,13 @@ SELECT id, name
return $languages;
}
+/**
+ * log the visit into history table
+ *
+ * @param int $image_id
+ * @param string $image_type
+ * @return bool
+ */
function pwg_log($image_id = null, $image_type = null)
{
global $conf, $user, $page;
@@ -464,122 +466,255 @@ INSERT INTO '.HISTORY_TABLE.'
return true;
}
-// format_date returns a formatted date for display. The date given in
-// argument must be an american format (2003-09-15). By option, you can show the time.
-// The output is internationalized.
-//
-// format_date( "2003-09-15", true ) -> "Monday 15 September 2003 21:52"
-function format_date($date, $show_time = false, $show_day_name = true)
+/**
+ * Computes the difference between two dates.
+ * returns a DateInterval object or a stdClass with the same attributes
+ * http://stephenharris.info/date-intervals-in-php-5-2
+ *
+ * @param DateTime $date1
+ * @param DateTime $date2
+ * @return DateInterval|stdClass
+ */
+function dateDiff($date1, $date2)
{
- global $lang;
-
- if (strpos($date, '0') == 0)
+ if (version_compare(PHP_VERSION, '5.3.0') >= 0)
{
- return l10n('N/A');
+ return $date1->diff($date2);
}
-
- $ymdhms = array();
- $tok = strtok( $date, '- :');
- while ($tok !== false)
+
+ $diff = new stdClass();
+
+ //Make sure $date1 is ealier
+ $diff->invert = $date2 < $date1;
+ if ($diff->invert)
{
- $ymdhms[] = $tok;
- $tok = strtok('- :');
+ list($date1, $date2) = array($date2, $date1);
}
+
+ //Calculate R values
+ $R = ($date1 <= $date2 ? '+' : '-');
+ $r = ($date1 <= $date2 ? '' : '-');
- if ( count($ymdhms)<3 )
- {
- return false;
- }
+ //Calculate total days
+ $diff->days = round(abs($date1->format('U') - $date2->format('U'))/86400);
- $formated_date = '';
- // before 1970, Microsoft Windows can't mktime
- if ($ymdhms[0] >= 1970 and $ymdhms[1] != 0 and $ymdhms[2] != 0)
+ //A leap year work around - consistent with DateInterval
+ $leap_year = $date1->format('m-d') == '02-29';
+ if ($leap_year)
{
- // we ask midday because Windows think it's prior to midnight with a
- // zero and refuse to work
- $formated_date.= $lang['day'][date('w', mktime(12,0,0,$ymdhms[1],$ymdhms[2],$ymdhms[0]))];
+ $date1->modify('-1 day');
}
- if ($ymdhms[2] != 0)
+ //Years, months, days, hours
+ $periods = array('years'=>-1, 'months'=>-1, 'days'=>-1, 'hours'=>-1);
+
+ foreach ($periods as $period => &$i)
{
- $formated_date.= ' '.$ymdhms[2];
+ if ($period == 'days' && $leap_year)
+ {
+ $date1->modify('+1 day');
+ }
+
+ while ($date1 <= $date2 )
+ {
+ $date1->modify('+1 '.$period);
+ $i++;
+ }
+
+ //Reset date and record increments
+ $date1->modify('-1 '.$period);
}
+
+ list($diff->y, $diff->m, $diff->d, $diff->h) = array_values($periods);
- if ($ymdhms[1] != 0)
+ //Minutes, seconds
+ $diff->s = round(abs($date1->format('U') - $date2->format('U')));
+ $diff->i = floor($diff->s/60);
+ $diff->s = $diff->s - $diff->i*60;
+
+ return $diff;
+}
+
+/**
+ * converts a string into a DateTime object
+ *
+ * @param int|string timestamp or datetime string
+ * @param string $format input format respecting date() syntax
+ * @return DateTime|false
+ */
+function str2DateTime($original, $format=null)
+{
+ if ( !empty($format) && version_compare(PHP_VERSION, '5.3.0') >= 0 )// from known date format
{
- $formated_date.= ' '.$lang['month'][(int)$ymdhms[1]];
+ return DateTime::createFromFormat('!'.$format, $original); // ! char to reset fields to UNIX epoch
}
-
- $formated_date.= ' '.$ymdhms[0];
- if ($show_time and count($ymdhms)>=5 )
+ else
{
- $formated_date.= ' '.$ymdhms[3].':'.$ymdhms[4];
+ $date = new DateTime();
+
+ $t = trim($original, '0123456789');
+ if (empty($t)) // from timestamp
+ {
+ $date->setTimestamp($original);
+ }
+ else // from unknown date format (assuming something like Y-m-d H:i:s)
+ {
+ $ymdhms = array();
+ $tok = strtok($original, '- :/');
+ while ($tok !== false)
+ {
+ $ymdhms[] = $tok;
+ $tok = strtok('- :/');
+ }
+
+ if (count($ymdhms)<3) return false;
+ if (!isset($ymdhms[3])) $ymdhms[3] = 0;
+ if (!isset($ymdhms[4])) $ymdhms[4] = 0;
+ if (!isset($ymdhms[5])) $ymdhms[5] = 0;
+
+ $date->setDate($ymdhms[0], $ymdhms[1], $ymdhms[2]);
+ $date->setTime($ymdhms[3], $ymdhms[4], $ymdhms[5]);
+ }
+
+ return $date;
}
- return $formated_date;
}
/**
- * Works out the time since the entry post, takes a an argument in unix time or datetime
+ * returns a formatted and localized date for display
+ *
+ * @param int|string timestamp or datetime string
+ * @param bool $show_time
+ * @param bool $show_day_name
+ * @param string $format input format respecting date() syntax
+ * @return string
*/
-function time_since($original, $stop = 'minute')
+function format_date($original, $show_time=false, $show_day_name=true, $format=null)
{
- if (!is_int($original))
+ global $lang;
+
+ $date = str2DateTime($original, $format);
+
+ if (!$date)
+ {
+ return l10n('N/A');
+ }
+
+ $print = '';
+ if ($show_day_name)
{
- $ymdhms = array();
- $tok = strtok($original, '- :');
- while ($tok !== false)
+ $print.= $lang['day'][ $date->format('w') ].' ';
+ }
+
+ $print.= $date->format('j');
+ $print.= ' '.$lang['month'][ $date->format('n') ];
+ $print.= ' '.$date->format('Y');
+
+ if ($show_time)
+ {
+ $temp = $date->format('H:i');
+ if ($temp != '00:00')
{
- $ymdhms[] = $tok;
- $tok = strtok('- :');
+ $print.= ' '.$temp;
}
-
- if ($ymdhms[0] < 1970) return false;
- if (!isset($ymdhms[3])) $ymdhms[3] = 12;
- if (!isset($ymdhms[4])) $ymdhms[4] = 0;
- if (!isset($ymdhms[5])) $ymdhms[5] = 0;
- $original = mktime($ymdhms[3],$ymdhms[4],$ymdhms[5],$ymdhms[1],$ymdhms[2],$ymdhms[0]);
}
- // array of time period chunks
- $chunks = array(
- 'year' => 60 * 60 * 24 * 365,
- 'month' => 60 * 60 * 24 * 30,
- 'week' => 60 * 60 * 24 * 7,
- 'day' => 60 * 60 * 24,
- 'hour' => 60 * 60,
- 'minute' => 60,
- 'second' => 1,
- );
+ return trim($print);
+}
- $today = time(); /* Current unix time */
- $since = abs($today - $original);
+/**
+ * Works out the time since the given date
+ *
+ * @param int|string timestamp or datetime string
+ * @param string $stop year,month,week,day,hour,minute,second
+ * @param string $format input format respecting date() syntax
+ * @param bool $with_text append "ago" or "in the future"
+ * @param bool $with_weeks
+ * @return string
+ */
+function time_since($original, $stop='minute', $format=null, $with_text=true, $with_week=true)
+{
+ $date = str2DateTime($original, $format);
- $print = null;
- foreach ($chunks as $name => $seconds)
+ if (!$date)
+ {
+ return l10n('N/A');
+ }
+
+ $now = new DateTime();
+ $diff = dateDiff($now, $date);
+
+ $chunks = array(
+ 'year' => $diff->y,
+ 'month' => $diff->m,
+ 'week' => 0,
+ 'day' => $diff->d,
+ 'hour' => $diff->h,
+ 'minute' => $diff->i,
+ 'second' => $diff->s,
+ );
+
+ // DateInterval does not contain the number of weeks
+ if ($with_week)
+ {
+ $chunks['week'] = (int)floor($chunks['day']/7);
+ $chunks['day'] = $chunks['day'] - $chunks['week']*7;
+ }
+
+ $j = array_search($stop, array_keys($chunks));
+
+ $print = ''; $i=0;
+ foreach ($chunks as $name => $value)
{
- if (($count = floor($since / $seconds)) != 0)
+ if ($value != 0)
{
- $print.= l10n_dec('%d '.$name, '%d '.$name.'s', $count);
- $since-= $count*$seconds;
+ $print.= ' '.l10n_dec('%d '.$name, '%d '.$name.'s', $value);
}
- if (!empty($print) and $chunks[$name] <= $chunks[$stop])
+ if (!empty($print) && $i >= $j)
{
break;
}
+ $i++;
}
-
- if ($today > $original)
- {
- $print = sprintf(l10n('%s ago'), $print);
- }
- else
+
+ $print = trim($print);
+
+ if ($with_text)
{
- $print = sprintf(l10n('%s in the future'), $print);
+ if ($diff->invert)
+ {
+ $print = l10n('%s ago', $print);
+ }
+ else
+ {
+ $print = l10n('%s in the future', $print);
+ }
}
return $print;
}
+/**
+ * transform a date string from a format to another (MySQL to d/M/Y for instance)
+ *
+ * @param string $original
+ * @param string $format_in respecting date() syntax
+ * @param string $format_out respecting date() syntax
+ * @param string $default if _$original_ is empty
+ * @return string
+ */
+function transform_date($original, $format_in, $format_out, $default=null)
+{
+ if (empty($original)) return $default;
+ $date = str2DateTime($original, $format_in);
+ return $date->format($format_out);
+}
+
+/**
+ * append a variable to _$debug_ global
+ *
+ * @param string $string
+ */
function pwg_debug( $string )
{
global $debug,$t2,$page;
@@ -595,9 +730,8 @@ function pwg_debug( $string )
}
/**
- * Redirects to the given URL (HTTP method)
- *
- * Note : once this function called, the execution doesn't go further
+ * Redirects to the given URL (HTTP method).
+ * once this function called, the execution doesn't go further
* (presence of an exit() instruction.
*
* @param string $url
@@ -618,14 +752,13 @@ function redirect_http( $url )
}
/**
- * Redirects to the given URL (HTML method)
- *
- * Note : once this function called, the execution doesn't go further
+ * Redirects to the given URL (HTML method).
+ * once this function called, the execution doesn't go further
* (presence of an exit() instruction.
*
* @param string $url
- * @param string $title_msg
- * @param integer $refreh_time
+ * @param string $msg
+ * @param integer $refresh_time
* @return void
*/
function redirect_html( $url , $msg = '', $refresh_time = 0)
@@ -669,14 +802,13 @@ function redirect_html( $url , $msg = '', $refresh_time = 0)
}
/**
- * Redirects to the given URL (Switch to HTTP method or HTML method)
- *
- * Note : once this function called, the execution doesn't go further
+ * Redirects to the given URL (automatically choose HTTP or HTML method).
+ * once this function called, the execution doesn't go further
* (presence of an exit() instruction.
*
* @param string $url
- * @param string $title_msg
- * @param integer $refreh_time
+ * @param string $msg
+ * @param integer $refresh_time
* @return void
*/
function redirect( $url , $msg = '', $refresh_time = 0)
@@ -698,50 +830,10 @@ function redirect( $url , $msg = '', $refresh_time = 0)
}
/**
- * returns $_SERVER['QUERY_STRING'] whitout keys given in parameters
- *
- * @param array $rejects
- * @param boolean $escape - if true escape & to &amp; (for html)
- * @returns string
- */
-function get_query_string_diff($rejects=array(), $escape=true)
-{
- if (empty($_SERVER['QUERY_STRING']))
- {
- return '';
- }
-
- $query_string = '';
-
- $str = $_SERVER['QUERY_STRING'];
- parse_str($str, $vars);
-
- $is_first = true;
- foreach ($vars as $key => $value)
- {
- if (!in_array($key, $rejects))
- {
- $query_string.= $is_first ? '?' : ($escape ? '&amp;' : '&' );
- $is_first = false;
- $query_string.= $key.'='.$value;
- }
- }
-
- return $query_string;
-}
-
-function url_is_remote($url)
-{
- if ( strncmp($url, 'http://', 7)==0
- or strncmp($url, 'https://', 8)==0 )
- {
- return true;
- }
- return false;
-}
-
-/**
* returns available themes
+ *
+ * @param bool $show_mobile
+ * @return array
*/
function get_pwg_themes($show_mobile=false)
{
@@ -779,6 +871,12 @@ SELECT
return $themes;
}
+/**
+ * check if a theme is installed (directory exsists)
+ *
+ * @param string $theme_id
+ * @return bool
+ */
function check_theme_installed($theme_id)
{
global $conf;
@@ -786,7 +884,13 @@ function check_theme_installed($theme_id)
return file_exists($conf['themes_dir'].'/'.$theme_id.'/'.'themeconf.inc.php');
}
-/** Transforms an original path to its pwg representative */
+/**
+ * Transforms an original path to its pwg representative
+ *
+ * @param string $path
+ * @param string $representative_ext
+ * @return string
+ */
function original_to_representative($path, $representative_ext)
{
$pos = strrpos($path, '/');
@@ -796,8 +900,10 @@ function original_to_representative($path, $representative_ext)
}
/**
- * @param element_info array containing element information from db;
- * at least 'id', 'path' should be present
+ * get the full path of an image
+ *
+ * @param array $element_info element information from db (at least 'path')
+ * @return string
*/
function get_element_path($element_info)
{
@@ -811,10 +917,9 @@ function get_element_path($element_info)
/**
- * fill the current user caddie with given elements, if not already in
- * caddie
+ * fill the current user caddie with given elements, if not already in caddie
*
- * @param array elements_id
+ * @param int[] $elements_id
*/
function fill_caddie($elements_id)
{
@@ -833,8 +938,10 @@ SELECT element_id
foreach ($caddiables as $caddiable)
{
- array_push($datas, array('element_id' => $caddiable,
- 'user_id' => $user['id']));
+ $datas[] = array(
+ 'element_id' => $caddiable,
+ 'user_id' => $user['id'],
+ );
}
if (count($caddiables) > 0)
@@ -844,9 +951,10 @@ SELECT element_id
}
/**
- * returns the element name from its filename
+ * returns the element name from its filename.
+ * removes file extension and replace underscores by spaces
*
- * @param string filename
+ * @param string $filename
* @return string name
*/
function get_name_from_file($filename)
@@ -855,10 +963,12 @@ function get_name_from_file($filename)
}
/**
- * returns the corresponding value from $lang if existing. Else, the key is
- * returned
+ * translation function.
+ * returns the corresponding value from _$lang_ if existing else the key is returned
+ * if more than one parameter is provided sprintf is applied
*
- * @param string key
+ * @param string $key
+ * @param mixed $args,... optional arguments
* @return string
*/
function l10n($key)
@@ -869,23 +979,30 @@ function l10n($key)
{
if ($conf['debug_l10n'] and !isset($lang[$key]) and !empty($key))
{
- trigger_error('[l10n] language key "'.$key.'" is not defined', E_USER_WARNING);
+ trigger_error('[l10n] language key "'. $key .'" not defined', E_USER_WARNING);
}
$val = $key;
}
+
+ if (func_num_args() > 1)
+ {
+ $args = func_get_args();
+ $val = vsprintf($val, array_slice($args, 1));
+ }
+
return $val;
}
/**
- * returns the prinft value for strings including %d
- * return is concorded with decimal value (singular, plural)
+ * returns the printf value for strings including %d
+ * returned value is concorded with decimal value (singular, plural)
*
- * @param singular string key
- * @param plural string key
- * @param decimal value
+ * @param string $singular_key
+ * @param string $plural_key
+ * @param int $decimal
* @return string
*/
-function l10n_dec($singular_fmt_key, $plural_fmt_key, $decimal)
+function l10n_dec($singular_key, $plural_key, $decimal)
{
global $lang_info;
@@ -893,20 +1010,20 @@ function l10n_dec($singular_fmt_key, $plural_fmt_key, $decimal)
sprintf(
l10n((
(($decimal > 1) or ($decimal == 0 and $lang_info['zero_plural']))
- ? $plural_fmt_key
- : $singular_fmt_key
+ ? $plural_key
+ : $singular_key
)), $decimal);
}
-/*
+/**
* returns a single element to use with l10n_args
*
- * @param string key: translation key
- * @param mixed args: arguments to use on sprintf($key, args)
+ * @param string $key translation key
+ * @param mixed $args arguments to use on sprintf($key, args)
* if args is a array, each values are used on sprintf
* @return string
*/
-function get_l10n_args($key, $args)
+function get_l10n_args($key, $args='')
{
if (is_array($args))
{
@@ -919,11 +1036,13 @@ function get_l10n_args($key, $args)
return array('key_args' => $key_arg);
}
-/*
- * returns a string formated with l10n elements
+/**
+ * returns a string formated with l10n elements.
+ * it is usefull to "prepare" a text and translate it later
+ * @see get_l10n_args()
*
- * @param array $key_args: l10n_args element or array of l10n_args elements
- * @param string $sep: used when translated elements are concatened
+ * @param array $key_args one l10n_args element or array of l10n_args elements
+ * @param string $sep used when translated elements are concatened
* @return string
*/
function l10n_args($key_args, $sep = "\n")
@@ -961,10 +1080,9 @@ function l10n_args($key_args, $sep = "\n")
}
/**
- * returns the corresponding value from $themeconf if existing. Else, the
- * key is returned
+ * returns the corresponding value from $themeconf if existing or an empty string
*
- * @param string key
+ * @param string $key
* @return string
*/
function get_themeconf($key)
@@ -990,12 +1108,15 @@ SELECT '.$conf['user_fields']['email'].'
;';
list($email) = pwg_db_fetch_row(pwg_query($query));
+ $email = trigger_event('get_webmaster_mail_address', $email);
+
return $email;
}
/**
* Add configuration parameters from database to global $conf array
*
+ * @param string $condition SQL condition
* @return void
*/
function load_conf_from_db($condition = '')
@@ -1028,8 +1149,16 @@ SELECT param, value
}
$conf[ $row['param'] ] = $val;
}
+
+ trigger_action('load_conf', $condition);
}
+/**
+ * Add or update a config parameter
+ *
+ * @param string $param
+ * @param string $value
+ */
function conf_update_param($param, $value)
{
$query = '
@@ -1063,11 +1192,43 @@ UPDATE '.CONFIG_TABLE.'
}
/**
- * Prepends and appends a string at each value of the given array.
+ * Delete one or more config parameters
+ * @since 2.6
+ *
+ * @param string|string[] $params
+ */
+function conf_delete_param($params)
+{
+ global $conf;
+
+ if (!is_array($params))
+ {
+ $params = array($params);
+ }
+ if (empty($params))
+ {
+ return;
+ }
+
+ $query = '
+DELETE FROM '.CONFIG_TABLE.'
+ WHERE param IN(\''. implode('\',\'', $params) .'\')
+;';
+ pwg_query($query);
+
+ foreach ($params as $param)
+ {
+ unset($conf[$param]);
+ }
+}
+
+/**
+ * Prepends and appends strings at each value of the given array.
*
- * @param array
- * @param string prefix to each array values
- * @param string suffix to each array values
+ * @param array $array
+ * @param string $prepend_str
+ * @param string $append_str
+ * @return array
*/
function prepend_append_array_items($array, $prepend_str, $append_str)
{
@@ -1080,9 +1241,72 @@ function prepend_append_array_items($array, $prepend_str, $append_str)
}
/**
- * creates an hashed based on a query, this function is a very common
- * pattern used here. Among the selected columns fetched, choose one to be
- * the key, another one to be the value.
+ * Builds an data array from a SQL query.
+ * Depending on $key_name and $value_name it can return :
+ *
+ * - an array of arrays of all fields (key=null, value=null)
+ * array(
+ * array('id'=>1, 'name'=>'DSC8956', ...),
+ * array('id'=>2, 'name'=>'DSC8957', ...),
+ * ...
+ * )
+ *
+ * - an array of a single field (key=null, value='...')
+ * array('DSC8956', 'DSC8957', ...)
+ *
+ * - an associative array of array of all fields (key='...', value=null)
+ * array(
+ * 'DSC8956' => array('id'=>1, 'name'=>'DSC8956', ...),
+ * 'DSC8957' => array('id'=>2, 'name'=>'DSC8957', ...),
+ * ...
+ * )
+ *
+ * - an associative array of a single field (key='...', value='...')
+ * array(
+ * 'DSC8956' => 1,
+ * 'DSC8957' => 2,
+ * ...
+ * )
+ *
+ * @since 2.6
+ *
+ * @param string $query
+ * @param string $key_name
+ * @param string $value_name
+ * @return array
+ */
+function query2array($query, $key_name=null, $value_name=null)
+{
+ $result = pwg_query($query);
+ $data = array();
+
+ while ($row = pwg_db_fetch_assoc($result))
+ {
+ if (isset($value_name))
+ {
+ $value = $row[ $value_name ];
+ }
+ else
+ {
+ $value = $row;
+ }
+ if (isset($key_name))
+ {
+ $data[ $row[$key_name] ] = $value;
+ }
+ else
+ {
+ $data[] = $value;
+ }
+ }
+
+ return $data;
+}
+
+/**
+ * creates an simple hashmap based on a SQL query.
+ * choose one to be the key, another one to be the value.
+ * @deprecated 2.6
*
* @param string $query
* @param string $keyname
@@ -1103,9 +1327,9 @@ function simple_hash_from_query($query, $keyname, $valuename)
}
/**
- * creates an hashed based on a query, this function is a very common
- * pattern used here. The key is given as parameter, the value is an associative
- * array.
+ * creates an associative array based on a SQL query.
+ * choose one to be the key
+ * @deprecated 2.6
*
* @param string $query
* @param string $keyname
@@ -1123,13 +1347,42 @@ function hash_from_query($query, $keyname)
}
/**
- * Return basename of the current script
- * Lower case convertion is applied on return value
- * Return value is without file extention ".php"
+ * creates a numeric array based on a SQL query.
+ * if _$fieldname_ is empty the returned value will be an array of arrays
+ * if _$fieldname_ is provided the returned value will be a one dimension array
+ * @deprecated 2.6
*
- * @param void
+ * @param string $query
+ * @param string $fieldname
+ * @return array
+ */
+function array_from_query($query, $fieldname=false)
+{
+ $array = array();
+
+ $result = pwg_query($query);
+ if (false === $fieldname)
+ {
+ while ($row = pwg_db_fetch_assoc($result))
+ {
+ $array[] = $row;
+ }
+ }
+ else
+ {
+ while ($row = pwg_db_fetch_assoc($result))
+ {
+ $array[] = $row[$fieldname];
+ }
+ }
+ return $array;
+}
+
+/**
+ * Return the basename of the current script.
+ * The lowercase case filename of the current script without extension
*
- * @return script basename
+ * @return string
*/
function script_basename()
{
@@ -1153,12 +1406,10 @@ function script_basename()
}
/**
- * Return value for the current page define on $conf['filter_pages']
- * Îf value is not defined, default value are returned
- *
- * @param value name
+ * Return $conf['filter_pages'] value for the current page
*
- * @return filter page value
+ * @param string $value_name
+ * @return mixed
*/
function get_filter_page_value($value_name)
{
@@ -1181,7 +1432,8 @@ function get_filter_page_value($value_name)
}
/**
- * returns the character set of data sent to browsers / received from forms
+ * return the character set used by Piwigo
+ * @return string
*/
function get_pwg_charset()
{
@@ -1194,27 +1446,58 @@ function get_pwg_charset()
}
/**
+ * returns the parent (fallback) language of a language.
+ * if _$lang_id_ is null it applies to the current language
+ * @since 2.6
+ *
+ * @param string $lang_id
+ * @return string|null
+ */
+function get_parent_language($lang_id=null)
+{
+ if (empty($lang_id))
+ {
+ global $lang_info;
+ return !empty($lang_info['parent']) ? $lang_info['parent'] : null;
+ }
+ else
+ {
+ $f = PHPWG_ROOT_PATH.'language/'.$lang_id.'/common.lang.php';
+ if (file_exists($f))
+ {
+ include($f);
+ return !empty($lang_info['parent']) ? $lang_info['parent'] : null;
+ }
+ }
+ return null;
+}
+
+/**
* includes a language file or returns the content of a language file
- * availability of the file
*
- * in descending order of preference:
+ * tries to load in descending order:
* param language, user language, default language
- * Piwigo default language.
*
- * @param string filename
- * @param string dirname
+ * @param string $filename
+ * @param string $dirname
* @param mixed options can contain
- * language - language to load (if empty uses user language)
- * return - if true the file content is returned otherwise the file is evaluated as php
- * target_charset -
- * no_fallback - the language must be respected
- * local - if true, get local language file
- * @return boolean success status or a string if options['return'] is true
+ * @option string language - language to load
+ * @option bool return - if true the file content is returned
+ * @option bool no_fallback - if true do not load default language
+ * @option bool local - if true load file from local directory
+ * @return boolean|string
*/
-function load_language($filename, $dirname = '',
- $options = array() )
+function load_language($filename, $dirname = '', $options = array())
{
- global $user;
+ global $user, $language_files;
+
+ if ( !empty($dirname) and !empty($filename) )
+ {
+ if ( empty($language_files[$dirname]) or !in_array($filename,$language_files[$dirname]) )
+ {
+ $language_files[$dirname][] = $filename;
+ }
+ }
if (! @$options['return'] )
{
@@ -1235,6 +1518,10 @@ function load_language($filename, $dirname = '',
{
$languages[] = $user['language'];
}
+ if ( ($parent = get_parent_language()) != null)
+ {
+ $languages[] = $parent;
+ }
if ( ! @$options['no_fallback'] )
{
if ( defined('PHPWG_INSTALLED') )
@@ -1286,7 +1573,7 @@ function load_language($filename, $dirname = '',
$parent_language = !empty($load_lang_info['parent']) ? $load_lang_info['parent'] : (
!empty($lang_info['parent']) ? $lang_info['parent'] : null );
- if (!empty($parent_language))
+ if (!empty($parent_language) and $parent_language != $selected_language)
{
@include(str_replace($selected_language, $parent_language, $source_file));
}
@@ -1334,9 +1621,10 @@ function load_language($filename, $dirname = '',
/**
* converts a string from a character set to another character set
- * @param string str the string to be converted
- * @param string source_charset the character set in which the string is encoded
- * @param string dest_charset the destination character set
+ *
+ * @param string $str
+ * @param string $source_charset
+ * @param string $dest_charset
*/
function convert_charset($str, $source_charset, $dest_charset)
{
@@ -1358,13 +1646,13 @@ function convert_charset($str, $source_charset, $dest_charset)
{
return mb_convert_encoding( $str, $dest_charset, $source_charset );
}
- return $str; //???
+ return $str; // TODO
}
/**
* makes sure a index.htm protects the directory from browser file listing
*
- * @param string dir directory
+ * @param string $dir
*/
function secure_directory($dir)
{
@@ -1378,7 +1666,9 @@ function secure_directory($dir)
/**
* returns a "secret key" that is to be sent back when a user posts a form
*
- * @param int valid_after_seconds - key validity start time from now
+ * @param int $valid_after_seconds - key validity start time from now
+ * @param string $aditionnal_data_to_hash
+ * @return string
*/
function get_ephemeral_key($valid_after_seconds, $aditionnal_data_to_hash = '')
{
@@ -1391,6 +1681,13 @@ function get_ephemeral_key($valid_after_seconds, $aditionnal_data_to_hash = '')
$conf['secret_key']);
}
+/**
+ * verify a key sent back with a form
+ *
+ * @param string $key
+ * @param string $aditionnal_data_to_hash
+ * @return bool
+ */
function verify_ephemeral_key($key, $aditionnal_data_to_hash = '')
{
global $conf;
@@ -1411,6 +1708,14 @@ function verify_ephemeral_key($key, $aditionnal_data_to_hash = '')
/**
* return an array which will be sent to template to display navigation bar
+ *
+ * @param string $url base url of all links
+ * @param int $nb_elements
+ * @param int $start
+ * @param int $nb_element_page
+ * @param bool $clean_url
+ * @param string $param_name
+ * @return array
*/
function create_navigation_bar($url, $nb_element, $start, $nb_element_page, $clean_url = false, $param_name='start')
{
@@ -1460,12 +1765,17 @@ function create_navigation_bar($url, $nb_element, $start, $nb_element_page, $cle
$navbar['pages'][$i] = $url.$start_str.(($i - 1) * $nb_element_page);
}
$navbar['pages'][$maximum] = $url_start.$last;
+ $navbar['NB_PAGE']=$maximum;
}
return $navbar;
}
/**
* return an array which will be sent to template to display recent icon
+ *
+ * @param string $date
+ * @param bool $is_child_date
+ * @return array
*/
function get_icon($date, $is_child_date = false)
{
@@ -1478,8 +1788,8 @@ function get_icon($date, $is_child_date = false)
if (!isset($cache['get_icon']['title']))
{
- $cache['get_icon']['title'] = sprintf(
- l10n('photos posted during the last %d days'),
+ $cache['get_icon']['title'] = l10n(
+ 'photos posted during the last %d days',
$user['recent_period']
);
}
@@ -1506,7 +1816,7 @@ function get_icon($date, $is_child_date = false)
}
/**
- * check token comming from form posted or get params to prevent csrf attacks
+ * check token comming from form posted or get params to prevent csrf attacks.
* if pwg_token is empty action doesn't require token
* else pwg_token is compare to server token
*
@@ -1522,9 +1832,16 @@ function check_pwg_token()
}
}
else
+ {
bad_request('missing token');
+ }
}
+/**
+ * get pwg_token used to prevent csrf attacks
+ *
+ * @return string
+ */
function get_pwg_token()
{
global $conf;
@@ -1536,14 +1853,13 @@ function get_pwg_token()
* breaks the script execution if the given value doesn't match the given
* pattern. This should happen only during hacking attempts.
*
- * @param string param_name
- * @param array param_array
- * @param boolean is_array
- * @param string pattern
- *
- * @return void
+ * @param string $param_name
+ * @param array $param_array
+ * @param boolean $is_array
+ * @param string $pattern
+ * @param boolean $mandatory
*/
-function check_input_parameter($param_name, $param_array, $is_array, $pattern)
+function check_input_parameter($param_name, $param_array, $is_array, $pattern, $mandatory=false)
{
$param_value = null;
if (isset($param_array[$param_name]))
@@ -1554,6 +1870,10 @@ function check_input_parameter($param_name, $param_array, $is_array, $pattern)
// it's ok if the input parameter is null
if (empty($param_value))
{
+ if ($mandatory)
+ {
+ fatal_error('[Hacking attempt] the input parameter "'.$param_name.'" is not valid');
+ }
return true;
}
@@ -1581,7 +1901,11 @@ function check_input_parameter($param_name, $param_array, $is_array, $pattern)
}
}
-
+/**
+ * get localized privacy level values
+ *
+ * @return string[]
+ */
function get_privacy_level_options()
{
global $conf;
@@ -1600,7 +1924,7 @@ function get_privacy_level_options()
{
$label .= ', ';
}
- $label .= l10n( sprintf('Level %d',$level) );
+ $label .= l10n( sprintf('Level %d', $level) );
}
$options[$level] = $label;
}
@@ -1610,6 +1934,9 @@ function get_privacy_level_options()
/**
* return the branch from the version. For example version 2.2.4 is for branch 2.2
+ *
+ * @param string $version
+ * @return string
*/
function get_branch_from_version($version)
{
@@ -1618,6 +1945,8 @@ function get_branch_from_version($version)
/**
* return the device type: mobile, tablet or desktop
+ *
+ * @return string
*/
function get_device()
{
@@ -1647,6 +1976,8 @@ function get_device()
/**
* return true if mobile theme should be loaded
+ *
+ * @return bool
*/
function mobile_theme()
{
@@ -1678,6 +2009,9 @@ function mobile_theme()
/**
* check url format
+ *
+ * @param string $url
+ * @return bool
*/
function url_check_format($url)
{
@@ -1694,6 +2028,9 @@ function url_check_format($url)
/**
* check email format
+ *
+ * @param string $mail_address
+ * @return bool
*/
function email_check_format($mail_address)
{
@@ -1710,4 +2047,78 @@ function email_check_format($mail_address)
return (bool)preg_match($regex, $mail_address);
}
}
+
+/**
+ * returns the number of available comments for the connected user
+ *
+ * @return int
+ */
+function get_nb_available_comments()
+{
+ global $user;
+ if (!isset($user['nb_available_comments']))
+ {
+ $where = array();
+ if ( !is_admin() )
+ $where[] = 'validated=\'true\'';
+ $where[] = get_sql_condition_FandF
+ (
+ array
+ (
+ 'forbidden_categories' => 'category_id',
+ 'visible_categories' => 'category_id',
+ 'visible_images' => 'ic.image_id'
+ ),
+ '', true
+ );
+
+ $query = '
+SELECT COUNT(DISTINCT(com.id))
+ FROM '.IMAGE_CATEGORY_TABLE.' AS ic
+ INNER JOIN '.COMMENTS_TABLE.' AS com
+ ON ic.image_id = com.image_id
+ WHERE '.implode('
+ AND ', $where);
+ list($user['nb_available_comments']) = pwg_db_fetch_row(pwg_query($query));
+
+ single_update(USER_CACHE_TABLE,
+ array('nb_available_comments'=>$user['nb_available_comments']),
+ array('user_id'=>$user['id'])
+ );
+ }
+ return $user['nb_available_comments'];
+}
+
+/**
+ * Compare two versions with version_compare after having converted
+ * single chars to their decimal values.
+ * Needed because version_compare does not understand versions like '2.5.c'.
+ * @since 2.6
+ *
+ * @param string $a
+ * @param string $b
+ * @param string $op
+ */
+function safe_version_compare($a, $b, $op=null)
+{
+ $replace_chars = create_function('$m', 'return ord(strtolower($m[1]));');
+
+ // add dot before groups of letters (version_compare does the same thing)
+ $a = preg_replace('#([0-9]+)([a-z]+)#i', '$1.$2', $a);
+ $b = preg_replace('#([0-9]+)([a-z]+)#i', '$1.$2', $b);
+
+ // apply ord() to any single letter
+ $a = preg_replace_callback('#\b([a-z]{1})\b#i', $replace_chars, $a);
+ $b = preg_replace_callback('#\b([a-z]{1})\b#i', $replace_chars, $b);
+
+ if (empty($op))
+ {
+ return version_compare($a, $b);
+ }
+ else
+ {
+ return version_compare($a, $b, $op);
+ }
+}
+
?> \ No newline at end of file
diff --git a/include/functions_calendar.inc.php b/include/functions_calendar.inc.php
index 59f2ee571..2f71e5d94 100644
--- a/include/functions_calendar.inc.php
+++ b/include/functions_calendar.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,9 +21,19 @@
// | USA. |
// +-----------------------------------------------------------------------+
+/**
+ * @package functions\calendar
+ */
+
+/** URL keyword for list view */
define('CAL_VIEW_LIST', 'list');
+/** URL keyword for calendar view */
define('CAL_VIEW_CALENDAR', 'calendar');
+
+/**
+ * Initialize _$page_ and _$template_ vars for calendar view.
+ */
function initialize_calendar()
{
global $page, $conf, $user, $template, $filter;
@@ -124,7 +134,8 @@ WHERE id IN (' . implode(',',$page['items']) .')';
}
$cal_style = $page['chronology_style'];
include(PHPWG_ROOT_PATH.'include/'. $styles[$cal_style]['include']);
- $calendar = new Calendar();
+ // TODO : class name overlap, rename them in CalendarMonth and CalendarWeek
+ $calendar = new Calendar();
// Retrieve view
@@ -212,7 +223,7 @@ WHERE id IN (' . implode(',',$page['items']) .')';
$chronology_date = array();
if ( isset($page['chronology_date'][0]) )
{
- array_push($chronology_date, $page['chronology_date'][0]);
+ $chronology_date[] = $page['chronology_date'][0];
}
}
else
@@ -289,4 +300,5 @@ WHERE id IN (' . implode(',',$page['items']) .')';
}
pwg_debug('end initialize_calendar');
}
+
?> \ No newline at end of file
diff --git a/include/functions_category.inc.php b/include/functions_category.inc.php
index 7cde5e35c..43289ca01 100644
--- a/include/functions_category.inc.php
+++ b/include/functions_category.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,19 +22,31 @@
// +-----------------------------------------------------------------------+
/**
- * Provides functions to handle categories.
- *
- *
+ * @package functions\category
*/
+
+/**
+ * Callback used for sorting by global_rank
+ */
+function global_rank_compare($a, $b)
+{
+ return strnatcasecmp($a['global_rank'], $b['global_rank']);
+}
+
+/**
+ * Callback used for sorting by rank
+ */
+function rank_compare($a, $b)
+{
+ return $a['rank'] - $b['rank'];
+}
+
/**
* Is the category accessible to the connected user ?
+ * If the user is not authorized to see this category, script exits
*
- * Note : if the user is not authorized to see this category, page creation
- * ends (exit command in this function)
- *
- * @param int category id to verify
- * @return void
+ * @param int $category_id
*/
function check_restrictions($category_id)
{
@@ -48,6 +60,11 @@ function check_restrictions($category_id)
}
}
+/**
+ * Returns template vars for main categories menu.
+ *
+ * @return array[]
+ */
function get_categories_menu()
{
global $page, $user, $filter, $conf;
@@ -143,25 +160,13 @@ WHERE '.$where.'
return $cats;
}
-
/**
- * Retrieve informations about a category in the database
- *
- * Returns an array with following keys :
- *
- * - comment
- * - dir : directory, might be empty for virtual categories
- * - name : an array with indexes from 0 (lowest cat name) to n (most
- * uppercat name findable)
- * - nb_images
- * - id_uppercat
- * - site_id
- * -
+ * Retrieves informations about a category.
*
- * @param int category id
+ * @param int $id
* @return array
*/
-function get_cat_info( $id )
+function get_cat_info($id)
{
$query = '
SELECT *
@@ -212,9 +217,15 @@ SELECT *
return $cat;
}
-
-
-// returns an array of image orders available for users/visitors
+/**
+ * Returns an array of image orders available for users/visitors.
+ * Each entry is an array containing
+ * 0: name
+ * 1: SQL ORDER command
+ * 2: visiblity (true or false)
+ *
+ * @return array[]
+ */
function get_category_preferred_image_orders()
{
global $conf, $page;
@@ -235,6 +246,14 @@ function get_category_preferred_image_orders()
));
}
+/**
+ * Assign a template var useable with {html_options} from a list of categories
+ *
+ * @param array[] $categories (at least id,name,global_rank,uppercats for each)
+ * @param int[] $selected ids of selected items
+ * @param string $blockname variable name in template
+ * @param bool $fullname full breadcrumb or not
+ */
function display_select_categories($categories,
$selecteds,
$blockname,
@@ -250,8 +269,7 @@ function display_select_categories($categories,
$option = strip_tags(
get_cat_display_name_cache(
$category['uppercats'],
- null,
- false
+ null
)
);
}
@@ -275,7 +293,13 @@ function display_select_categories($categories,
$template->assign( $blockname.'_selected', $selecteds);
}
-function display_select_cat_wrapper($query, $selecteds, $blockname,
+/**
+ * Same as display_select_categories but categories are ordered by rank
+ * @see display_select_categories()
+ */
+function display_select_cat_wrapper($query,
+ $selecteds,
+ $blockname,
$fullname = true)
{
$categories = array_from_query($query);
@@ -284,10 +308,10 @@ function display_select_cat_wrapper($query, $selecteds, $blockname,
}
/**
- * returns all subcategory identifiers of given category ids
+ * Returns all subcategory identifiers of given category ids
*
- * @param array ids
- * @return array
+ * @param int[] $ids
+ * @return int[]
*/
function get_subcat_ids($ids)
{
@@ -314,12 +338,14 @@ SELECT DISTINCT(id)
return array_from_query($query, 'id');
}
-/** finds a matching category id from a potential list of permalinks
- * @param array permalinks example: holiday holiday/france holiday/france/paris
- * @param int idx - output of the index in $permalinks that matches
- * return category id or null if no match
+/**
+ * Finds a matching category id from a potential list of permalinks
+ *
+ * @param string[] $permalinks
+ * @param int &$idx filled with the index in $permalinks that matches
+ * @return int|null
*/
-function get_cat_id_from_permalinks( $permalinks, &$idx )
+function get_cat_id_from_permalinks($permalinks, &$idx)
{
$in = '';
foreach($permalinks as $permalink)
@@ -360,23 +386,17 @@ UPDATE '.OLD_PERMALINKS_TABLE.' SET last_hit=NOW(), hit=hit+1
return null;
}
-function global_rank_compare($a, $b)
-{
- return strnatcasecmp($a['global_rank'], $b['global_rank']);
-}
-
-function rank_compare($a, $b)
-{
- return $a['rank'] - $b['rank'];
-}
-
/**
- * returns display text for information images of category
+ * Returns display text for images counter of category
*
- * @param array categories
+ * @param int $cat_nb_images nb images directly in category
+ * @param int $cat_count_images nb images in category (including subcats)
+ * @param int $cat_count_categories nb subcats
+ * @param bool $short_message if true append " in this album"
+ * @param string $separator
* @return string
*/
-function get_display_images_count($cat_nb_images, $cat_count_images, $cat_count_categories, $short_message = true, $Separator = '\n')
+function get_display_images_count($cat_nb_images, $cat_count_images, $cat_count_categories, $short_message = true, $separator = '\n')
{
$display_text = '';
@@ -384,7 +404,7 @@ function get_display_images_count($cat_nb_images, $cat_count_images, $cat_count_
{
if ($cat_nb_images > 0 and $cat_nb_images < $cat_count_images)
{
- $display_text.= get_display_images_count($cat_nb_images, $cat_nb_images, 0, $short_message, $Separator).$Separator;
+ $display_text.= get_display_images_count($cat_nb_images, $cat_nb_images, 0, $short_message, $separator).$separator;
$cat_count_images-= $cat_nb_images;
$cat_nb_images = 0;
}
@@ -395,7 +415,7 @@ function get_display_images_count($cat_nb_images, $cat_count_images, $cat_count_
if ($cat_count_categories == 0 or $cat_nb_images == $cat_count_images)
{
//no descendant categories or descendants do not contain images
- if (! $short_message)
+ if (!$short_message)
{
$display_text.= ' '.l10n('in this album');
}
@@ -410,10 +430,11 @@ function get_display_images_count($cat_nb_images, $cat_count_images, $cat_count_
}
/**
- * Find a random photo among all photos below a given album in the tree (not
- * only photo directly associated to the album but also to sub-albums)
+ * Find a random photo among all photos inside an album (including sub-albums)
*
- * we need $category['uppercats'], $category['id'], $category['count_images']
+ * @param array $category (at least id,uppercats,count_images)
+ * @param bool $recursive
+ * @return int|null
*/
function get_random_image_in_category($category, $recursive=true)
{
@@ -459,5 +480,126 @@ SELECT image_id
return $image_id;
}
+/**
+ * Get computed array of categories, that means cache data of all categories
+ * available for the current user (count_categories, count_images, etc.).
+ *
+ * @param array &$userdata
+ * @param int $filter_days number of recent days to filter on or null
+ * @return array
+ */
+function get_computed_categories(&$userdata, $filter_days=null)
+{
+ $query = 'SELECT c.id AS cat_id, id_uppercat';
+ // Count by date_available to avoid count null
+ $query .= ',
+ MAX(date_available) AS date_last, COUNT(date_available) AS nb_images
+FROM '.CATEGORIES_TABLE.' as c
+ LEFT JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON ic.category_id = c.id
+ LEFT JOIN '.IMAGES_TABLE.' AS i
+ ON ic.image_id = i.id
+ AND i.level<='.$userdata['level'];
+
+ if ( isset($filter_days) )
+ {
+ $query .= ' AND i.date_available > '.pwg_db_get_recent_period_expression($filter_days);
+ }
+
+ if ( !empty($userdata['forbidden_categories']) )
+ {
+ $query.= '
+ WHERE c.id NOT IN ('.$userdata['forbidden_categories'].')';
+ }
+
+ $query.= '
+ GROUP BY c.id';
+
+ $result = pwg_query($query);
+
+ $userdata['last_photo_date'] = null;
+ $cats = array();
+ while ($row = pwg_db_fetch_assoc($result))
+ {
+ $row['user_id'] = $userdata['id'];
+ $row['nb_categories'] = 0;
+ $row['count_categories'] = 0;
+ $row['count_images'] = (int)$row['nb_images'];
+ $row['max_date_last'] = $row['date_last'];
+ if ($row['date_last'] > $userdata['last_photo_date'])
+ {
+ $userdata['last_photo_date'] = $row['date_last'];
+ }
+
+ $cats[$row['cat_id']] = $row;
+ }
+
+ foreach ($cats as $cat)
+ {
+ if ( !isset( $cat['id_uppercat'] ) )
+ continue;
+
+ $parent = & $cats[ $cat['id_uppercat'] ];
+ $parent['nb_categories']++;
+
+ do
+ {
+ $parent['count_images'] += $cat['nb_images'];
+ $parent['count_categories']++;
+
+ if ((empty($parent['max_date_last'])) or ($parent['max_date_last'] < $cat['date_last']))
+ {
+ $parent['max_date_last'] = $cat['date_last'];
+ }
+
+ if ( !isset( $parent['id_uppercat'] ) )
+ break;
+ $parent = & $cats[$parent['id_uppercat']];
+ }
+ while (true);
+ unset($parent);
+ }
+
+ if ( isset($filter_days) )
+ {
+ foreach ($cats as $category)
+ {
+ if (empty($category['max_date_last']))
+ {
+ remove_computed_category($cats, $category);
+ }
+ }
+ }
+ return $cats;
+}
+
+/**
+ * Removes a category from computed array of categories and updates counters.
+ *
+ * @param array &$cats
+ * @param array $cat category to remove
+ */
+function remove_computed_category(&$cats, $cat)
+{
+ if ( isset($cats[$cat['id_uppercat']]) )
+ {
+ $parent = &$cats[ $cat['id_uppercat'] ];
+ $parent['nb_categories']--;
+
+ do
+ {
+ $parent['count_images'] -= $cat['nb_images'];
+ $parent['count_categories'] -= 1+$cat['count_categories'];
+
+ if ( !isset($cats[$parent['id_uppercat']]) )
+ {
+ break;
+ }
+ $parent = &$cats[$parent['id_uppercat']];
+ }
+ while (true);
+ }
+
+ unset($cats[$cat['cat_id']]);
+}
?> \ No newline at end of file
diff --git a/include/functions_comment.inc.php b/include/functions_comment.inc.php
index dc218a2ff..f14431cf7 100644
--- a/include/functions_comment.inc.php
+++ b/include/functions_comment.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,7 +21,22 @@
// | USA. |
// +-----------------------------------------------------------------------+
-//returns string action to perform on a new comment: validate, moderate, reject
+/**
+ * @package functions\comment
+ */
+
+
+add_event_handler('user_comment_check', 'user_comment_check',
+ EVENT_HANDLER_PRIORITY_NEUTRAL, 2);
+
+/**
+ * Does basic check on comment and returns action to perform.
+ * This method is called by a trigger_event()
+ *
+ * @param string $action before check
+ * @param array $comment
+ * @return string validate, moderate, reject
+ */
function user_comment_check($action, $comment)
{
global $conf,$user;
@@ -54,18 +69,15 @@ function user_comment_check($action, $comment)
return $action;
}
-
-add_event_handler('user_comment_check', 'user_comment_check',
- EVENT_HANDLER_PRIORITY_NEUTRAL, 2);
-
/**
- * Tries to insert a user comment in the database and returns one of :
- * validate, moderate, reject
- * @param array comm contains author, content, image_id
- * @param string key secret key sent back to the browser
- * @param array infos out array of messages
+ * Tries to insert a user comment and returns action to perform.
+ *
+ * @param array &$comm
+ * @param string $key secret key sent back to the browser
+ * @param array &$infos output array of error messages
+ * @return string validate, moderate, reject
*/
-function insert_user_comment( &$comm, $key, &$infos )
+function insert_user_comment(&$comm, $key, &$infos)
{
global $conf, $user;
@@ -93,7 +105,7 @@ function insert_user_comment( &$comm, $key, &$infos )
{
if ($conf['comments_author_mandatory'])
{
- array_push($infos, l10n('Username is mandatory') );
+ $infos[] = l10n('Username is mandatory');
$comment_action='reject';
}
$comm['author'] = 'guest';
@@ -110,7 +122,7 @@ SELECT COUNT(*) AS user_exists
$row = pwg_db_fetch_assoc( pwg_query( $query ) );
if ( $row['user_exists'] == 1 )
{
- array_push($infos, l10n('This login is already used by another user') );
+ $infos[] = l10n('This login is already used by another user');
$comment_action='reject';
}
}
@@ -141,7 +153,7 @@ SELECT COUNT(*) AS user_exists
}
if (!url_check_format($comm['website_url']))
{
- array_push($infos, l10n('Your website URL is invalid'));
+ $infos[] = l10n('Your website URL is invalid');
$comment_action='reject';
}
}
@@ -155,13 +167,13 @@ SELECT COUNT(*) AS user_exists
}
else if ($conf['comments_email_mandatory'])
{
- array_push($infos, l10n('Email address is missing. Please specify an email address.') );
+ $infos[] = l10n('Email address is missing. Please specify an email address.');
$comment_action='reject';
}
}
else if (!email_check_format($comm['email']))
{
- array_push($infos, l10n('mail address must be like xxx@yyy.eee (example : jack@altern.org)'));
+ $infos[] = l10n('mail address must be like xxx@yyy.eee (example : jack@altern.org)');
$comment_action='reject';
}
@@ -192,7 +204,7 @@ SELECT count(1) FROM '.COMMENTS_TABLE.'
list($counter) = pwg_db_fetch_row(pwg_query($query));
if ( $counter > 0 )
{
- array_push( $infos, l10n('Anti-flood system : please wait for a moment before trying to post another comment') );
+ $infos[] = l10n('Anti-flood system : please wait for a moment before trying to post another comment');
$comment_action='reject';
}
}
@@ -220,11 +232,11 @@ INSERT INTO '.COMMENTS_TABLE.'
'.(!empty($comm['email']) ? '\''.$comm['email'].'\'' : 'NULL').'
)
';
-
pwg_query($query);
-
$comm['id'] = pwg_db_insert_id(COMMENTS_TABLE);
+ invalidate_user_cache_nb_comments();
+
if ( ($conf['email_admin_on_comment'] && 'validate' == $comment_action)
or ($conf['email_admin_on_comment_validation'] and 'moderate' == $comment_action))
{
@@ -232,38 +244,36 @@ INSERT INTO '.COMMENTS_TABLE.'
$comment_url = get_absolute_root_url().'comments.php?comment_id='.$comm['id'];
- $keyargs_content = array
- (
+ $keyargs_content = array(
get_l10n_args('Author: %s', stripslashes($comm['author']) ),
get_l10n_args('Email: %s', stripslashes($comm['email']) ),
get_l10n_args('Comment: %s', stripslashes($comm['content']) ),
- get_l10n_args('', ''),
- get_l10n_args('Manage this user comment: %s', $comment_url)
+ get_l10n_args(''),
+ get_l10n_args('Manage this user comment: %s', $comment_url),
);
if ('moderate' == $comment_action)
{
- $keyargs_content[] = get_l10n_args('', '');
- $keyargs_content[] = get_l10n_args('(!) This comment requires validation', '');
+ $keyargs_content[] = get_l10n_args('(!) This comment requires validation');
}
- pwg_mail_notification_admins
- (
+ pwg_mail_notification_admins(
get_l10n_args('Comment by %s', stripslashes($comm['author']) ),
$keyargs_content
);
}
}
+
return $comment_action;
}
/**
- * Tries to delete a user comment in the database
- * only admin can delete all comments
- * other users can delete their own comments
- * so to avoid a new sql request we add author in where clause
+ * Tries to delete a (or more) user comment.
+ * only admin can delete all comments
+ * other users can delete their own comments
*
- * @param int or array of int comment_id
+ * @param int|int[] $comment_id
+ * @return bool false if nothing deleted
*/
function delete_user_comment($comment_id)
{
@@ -283,28 +293,31 @@ DELETE FROM '.COMMENTS_TABLE.'
WHERE '.$where_clause.
$user_where_clause.'
;';
- $result = pwg_query($query);
- if ($result)
+ if ( pwg_db_changes(pwg_query($query)) )
{
+ invalidate_user_cache_nb_comments();
+
email_admin('delete',
array('author' => $GLOBALS['user']['username'],
'comment_id' => $comment_id
));
+ trigger_action('user_comment_deletion', $comment_id);
+
+ return true;
}
-
- trigger_action('user_comment_deletion', $comment_id);
+
+ return false;
}
/**
- * Tries to update a user comment in the database
- * only admin can update all comments
- * users can edit their own comments if admin allow them
- * so to avoid a new sql request we add author in where clause
+ * Tries to update a user comment
+ * only admin can update all comments
+ * users can edit their own comments if admin allow them
*
- * @param comment_id
- * @param post_key
- * @param content
+ * @param array $comment
+ * @param string $post_key secret key sent back to the browser
+ * @return string validate, moderate, reject
*/
function update_user_comment($comment, $post_key)
@@ -344,7 +357,7 @@ function update_user_comment($comment, $post_key)
}
if (!url_check_format($comment['website_url']))
{
- array_push($page['errors'], l10n('Your website URL is invalid'));
+ $page['errors'][] = l10n('Your website URL is invalid');
$comment_action='reject';
}
}
@@ -376,24 +389,21 @@ $user_where_clause.'
$comment_url = get_absolute_root_url().'comments.php?comment_id='.$comment['comment_id'];
- $keyargs_content = array
- (
+ $keyargs_content = array(
get_l10n_args('Author: %s', stripslashes($GLOBALS['user']['username']) ),
get_l10n_args('Comment: %s', stripslashes($comment['content']) ),
- get_l10n_args('', ''),
+ get_l10n_args(''),
get_l10n_args('Manage this user comment: %s', $comment_url),
- get_l10n_args('', ''),
- get_l10n_args('(!) This comment requires validation', ''),
+ get_l10n_args('(!) This comment requires validation'),
);
- pwg_mail_notification_admins
- (
+ pwg_mail_notification_admins(
get_l10n_args('Comment by %s', stripslashes($GLOBALS['user']['username']) ),
$keyargs_content
);
}
// just mail admin
- else if ($result)
+ elseif ($result)
{
email_admin('edit', array('author' => $GLOBALS['user']['username'],
'content' => stripslashes($comment['content'])) );
@@ -403,6 +413,13 @@ $user_where_clause.'
return $comment_action;
}
+/**
+ * Notifies admins about updated or deleted comment.
+ * Only used when no validation is needed, otherwise pwg_mail_notification_admins() is used.
+ *
+ * @param string $action edit, delete
+ * @param array $comment
+ */
function email_admin($action, $comment)
{
global $conf;
@@ -416,26 +433,33 @@ function email_admin($action, $comment)
include_once(PHPWG_ROOT_PATH.'include/functions_mail.inc.php');
- $keyargs_content = array();
- $keyargs_content[] = get_l10n_args('Author: %s', $comment['author']);
+ $keyargs_content = array(
+ get_l10n_args('Author: %s', $comment['author']),
+ );
+
if ($action=='delete')
{
- $keyargs_content[] = get_l10n_args('This author removed the comment with id %d',
- $comment['comment_id']
- );
+ $keyargs_content[] = get_l10n_args('This author removed the comment with id %d', $comment['comment_id']);
}
else
{
- $keyargs_content[] = get_l10n_args('This author modified following comment:', '');
+ $keyargs_content[] = get_l10n_args('This author modified following comment:');
$keyargs_content[] = get_l10n_args('Comment: %s', $comment['content']);
}
- pwg_mail_notification_admins(get_l10n_args('Comment by %s',
- $comment['author']),
- $keyargs_content
- );
+ pwg_mail_notification_admins(
+ get_l10n_args('Comment by %s', $comment['author']),
+ $keyargs_content
+ );
}
+/**
+ * Returns the author id of a comment
+ *
+ * @param int $comment_id
+ * @param bool $die_on_error
+ * @return int
+ */
function get_comment_author_id($comment_id, $die_on_error=true)
{
$query = '
@@ -463,8 +487,9 @@ SELECT
}
/**
- * Tries to validate a user comment in the database
- * @param int or array of int comment_id
+ * Tries to validate a user comment.
+ *
+ * @param int|int[] $comment_id
*/
function validate_user_comment($comment_id)
{
@@ -481,6 +506,24 @@ UPDATE '.COMMENTS_TABLE.'
;';
pwg_query($query);
+ invalidate_user_cache_nb_comments();
trigger_action('user_comment_validation', $comment_id);
}
+
+/**
+ * Clears cache of nb comments for all users
+ */
+function invalidate_user_cache_nb_comments()
+{
+ global $user;
+
+ unset($user['nb_available_comments']);
+
+ $query = '
+UPDATE '.USER_CACHE_TABLE.'
+ SET nb_available_comments = NULL
+;';
+ pwg_query($query);
+}
+
?> \ No newline at end of file
diff --git a/include/functions_cookie.inc.php b/include/functions_cookie.inc.php
index 668dca670..4e547e10e 100644
--- a/include/functions_cookie.inc.php
+++ b/include/functions_cookie.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,10 +21,19 @@
// | USA. |
// +-----------------------------------------------------------------------+
-// cookie_path returns the path to use for the Piwigo cookie.
-// If Piwigo is installed on :
-// http://domain.org/meeting/gallery/category.php
-// cookie_path will return : "/meeting/gallery"
+/**
+ * @package functions\cookie
+ */
+
+
+/**
+ * Returns the path to use for the Piwigo cookie.
+ * If Piwigo is installed on :
+ * http://domain.org/meeting/gallery/
+ * it will return : "/meeting/gallery"
+ *
+ * @return string
+ */
function cookie_path()
{
if ( isset($_SERVER['REDIRECT_SCRIPT_NAME']) and
@@ -83,9 +92,13 @@ function cookie_path()
}
/**
- * persistently stores a variable in pwg cookie
- * @return boolean true on success
- * @see pwg_get_cookie_var
+ * Persistently stores a variable in pwg cookie.
+ * Set $value to null to delete the cookie.
+ *
+ * @param string $car
+ * @param mixed $value
+ * @param int|null $expire
+ * @return bool
*/
function pwg_set_cookie_var($var, $value, $expire=null)
{
@@ -104,9 +117,12 @@ function pwg_set_cookie_var($var, $value, $expire=null)
}
/**
- * retrieves the value of a persistent variable in pwg cookie
- * @return mixed
+ * Retrieves the value of a persistent variable in pwg cookie
* @see pwg_set_cookie_var
+ *
+ * @param string $var
+ * @param mixed $default
+ * @return mixed
*/
function pwg_get_cookie_var($var, $default = null)
{
@@ -120,4 +136,4 @@ function pwg_get_cookie_var($var, $default = null)
}
}
-?>
+?> \ No newline at end of file
diff --git a/include/functions_filter.inc.php b/include/functions_filter.inc.php
index d5b21075c..47d0ffde2 100644
--- a/include/functions_filter.inc.php
+++ b/include/functions_filter.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,13 +21,15 @@
// | USA. |
// +-----------------------------------------------------------------------+
+/**
+ * @package functions\filter
+ */
/**
- * update data of categories with filtered values
+ * Updates data of categories with filtered values
*
- * @param array list of categories
- * @return null
+ * @param array &$cats
*/
function update_cats_with_filtered_data(&$cats)
{
@@ -47,4 +49,4 @@ function update_cats_with_filtered_data(&$cats)
}
}
-?>
+?> \ No newline at end of file
diff --git a/include/functions_html.inc.php b/include/functions_html.inc.php
index 5b6a5079b..8cad4e395 100644
--- a/include/functions_html.inc.php
+++ b/include/functions_html.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,21 +22,22 @@
// +-----------------------------------------------------------------------+
/**
- * returns the list of categories as a HTML string
- *
- * categories string returned contains categories as given in the input
+ * @package functions\html
+ */
+
+
+/**
+ * Generates breadcrumb from categories list.
+ * Categories string returned contains categories as given in the input
* array $cat_informations. $cat_informations array must be an array
* of array( id=>?, name=>?, permalink=>?). If url input parameter is null,
* returns only the categories name without links.
*
- * @param array cat_informations
- * @param string url
- * @param boolean replace_space
+ * @param array $cat_informations
+ * @param string|null $url
* @return string
*/
-function get_cat_display_name($cat_informations,
- $url = '',
- $replace_space = false)
+function get_cat_display_name($cat_informations, $url='')
{
global $conf;
@@ -86,32 +87,21 @@ function get_cat_display_name($cat_informations,
$output.= $cat['name'].'</a>';
}
}
- if ($replace_space)
- {
- return replace_space($output);
- }
- else
- {
- return $output;
- }
+ return $output;
}
/**
- * returns the list of categories as a HTML string, with cache of names
- *
- * categories string returned contains categories as given in the input
- * array $cat_informations. $uppercats is the list of category ids to
- * display in the right order. If url input parameter is empty, returns only
- * the categories name without links.
+ * Generates breadcrumb from categories list using a cache.
+ * @see get_cat_display_name()
*
- * @param string uppercats
- * @param string url
- * @param boolean replace_space
+ * @param string $uppercats
+ * @param string|null $url
+ * @param bool $single_link
+ * @param string|null $link_class
* @return string
*/
function get_cat_display_name_cache($uppercats,
$url = '',
- $replace_space = false,
$single_link = false,
$link_class = null)
{
@@ -184,23 +174,32 @@ SELECT id, name, permalink
$output.= '</a>';
}
- if ($replace_space)
- {
- return replace_space($output);
- }
- else
- {
- return $output;
- }
+ return $output;
}
/**
- * returns HTMLized comment contents retrieved from database
+ * Generates breadcrumb for a category.
+ * @see get_cat_display_name()
*
- * newlines becomes br tags, _word_ becomes underline, /word/ becomes
- * italic, *word* becomes bolded
+ * @param int $cat_id
+ * @param string|null $url
+ * @return string
+ */
+function get_cat_display_name_from_id($cat_id, $url = '')
+{
+ $cat_info = get_cat_info($cat_id);
+ return get_cat_display_name($cat_info['upper_names'], $url);
+}
+
+/**
+ * Apply basic markdown transformations to a text.
+ * newlines becomes br tags
+ * _word_ becomes underline
+ * /word/ becomes italic
+ * *word* becomes bolded
+ * urls becomes a tags
*
- * @param string content
+ * @param string $content
* @return string
*/
function render_comment_content($content)
@@ -227,15 +226,9 @@ function render_comment_content($content)
$replacement = '<span style="font-style:italic;">$1$2</span>';
$content = preg_replace($pattern, $replacement, $content);
- return $content;
-}
+ // TODO : add a trigger
-function get_cat_display_name_from_id($cat_id,
- $url = '',
- $replace_space = false)
-{
- $cat_info = get_cat_info($cat_id);
- return get_cat_display_name($cat_info['upper_names'], $url, $replace_space);
+ return $content;
}
/**
@@ -287,11 +280,17 @@ function get_html_tag_selection(
return $output;
}
+/**
+ * Callback used for sorting by name.
+ */
function name_compare($a, $b)
{
return strcmp(strtolower($a['name']), strtolower($b['name']));
}
+/**
+ * Callback used for sorting by name (slug) with cache.
+ */
function tag_alpha_compare($a, $b)
{
global $cache;
@@ -308,7 +307,7 @@ function tag_alpha_compare($a, $b)
}
/**
- * exits the current script (either exit or redirect)
+ * Exits the current script (or redirect to login page if not logged).
*/
function access_denied()
{
@@ -335,9 +334,11 @@ function access_denied()
}
/**
- * exits the current script with 403 code
- * @param string msg a message to display
- * @param string alternate_url redirect to this url
+ * Exits the current script with 403 code.
+ * @todo nice display if $template loaded
+ *
+ * @param string $msg
+ * @param string|null $alternate_url redirect to this url
*/
function page_forbidden($msg, $alternate_url=null)
{
@@ -352,9 +353,11 @@ function page_forbidden($msg, $alternate_url=null)
}
/**
- * exits the current script with 400 code
- * @param string msg a message to display
- * @param string alternate_url redirect to this url
+ * Exits the current script with 400 code.
+ * @todo nice display if $template loaded
+ *
+ * @param string $msg
+ * @param string|null $alternate_url redirect to this url
*/
function bad_request($msg, $alternate_url=null)
{
@@ -369,9 +372,11 @@ function bad_request($msg, $alternate_url=null)
}
/**
- * exits the current script with 404 code when a page cannot be found
- * @param string msg a message to display
- * @param string alternate_url redirect to this url
+ * Exits the current script with 404 code.
+ * @todo nice display if $template loaded
+ *
+ * @param string $msg
+ * @param string|null $alternate_url redirect to this url
*/
function page_not_found($msg, $alternate_url=null)
{
@@ -386,9 +391,12 @@ function page_not_found($msg, $alternate_url=null)
}
/**
- * exits the current script with 500 http code
- * this method can be called at any time (does not use template/language/user etc...)
- * @param string msg a message to display
+ * Exits the current script with 500 code.
+ * @todo nice display if $template loaded
+ *
+ * @param string $msg
+ * @param string|null $title
+ * @param bool $show_trace
*/
function fatal_error($msg, $title=null, $show_trace=true)
{
@@ -429,7 +437,10 @@ $btrace_msg
die(0); // just in case
}
-/* returns the title to be displayed above thumbnails on tag page
+/**
+ * Returns the breadcrumb to be displayed above thumbnails on tag page.
+ *
+ * @return string
*/
function get_tags_content_title()
{
@@ -452,7 +463,7 @@ function get_tags_content_title()
.'" title="'
.l10n('display photos linked to this tag')
.'">'
- .trigger_event('render_tag_name', $page['tags'][$i]['name'])
+ .trigger_event('render_tag_name', $page['tags'][$i]['name'], $page['tags'][$i])
.'</a>';
if (count($page['tags']) > 2)
@@ -478,7 +489,9 @@ function get_tags_content_title()
}
/**
- Sets the http status header (200,401,...)
+ * Sets the http status header (200,401,...)
+ * @param int $code
+ * @param string $text for exotic http codes
*/
function set_status_header($code, $text='')
{
@@ -507,16 +520,25 @@ function set_status_header($code, $text='')
trigger_action('set_status_header', $code, $text);
}
-/** returns the category comment for rendering in html textual mode (subcatify)
- * this is an event handler. don't call directly
+/**
+ * Returns the category comment for rendering in html textual mode (subcatify)
+ * This method is called by a trigger_action()
+ *
+ * @param string $desc
+ * @return string
*/
function render_category_literal_description($desc)
{
return strip_tags($desc, '<span><p><a><br><b><i><small><big><strong><em>');
}
-/*event handler for menu*/
-function register_default_menubar_blocks( $menu_ref_arr )
+/**
+ * Add known menubar blocks.
+ * This method is called by a trigger_event()
+ *
+ * @param BlockManager[] $menu_ref_arr
+ */
+function register_default_menubar_blocks($menu_ref_arr)
{
$menu = & $menu_ref_arr[0];
if ($menu->get_id() != 'menubar')
@@ -530,34 +552,46 @@ function register_default_menubar_blocks( $menu_ref_arr )
}
/**
+ * Returns display name for an element.
+ * Returns 'name' if exists of name from 'file'.
+ *
+ * @param array $info at least file or name
+ * @return string
*/
function render_element_name($info)
{
- $name = $info['name'];
- if (!empty($name))
+ if (!empty($info['name']))
{
- $name = trigger_event('render_element_name', $name);
- return $name;
+ return trigger_event('render_element_name', $info['name']);
}
-
return get_name_from_file($info['file']);
}
-function render_element_description($info)
+/**
+ * Returns display description for an element.
+ *
+ * @param array $info at least comment
+ * @param string $param used to identify the trigger
+ * @return string
+ */
+function render_element_description($info, $param='')
{
- $comment = $info['comment'];
- if (!empty($comment))
+ if (!empty($info['comment']))
{
- $comment = trigger_event('render_element_description', $comment);
- return $comment;
+ return trigger_event('render_element_description', $info['comment'], $param);
}
return '';
}
/**
- * returns the title of the thumbnail based on photo properties
+ * Add info to the title of the thumbnail based on photo properties.
+ *
+ * @param array $info hit, rating_score, nb_comments
+ * @param string $title
+ * @param string $comment
+ * @return string
*/
-function get_thumbnail_title($info, $title, $comment)
+function get_thumbnail_title($info, $title, $comment='')
{
global $conf, $user;
@@ -585,21 +619,35 @@ function get_thumbnail_title($info, $title, $comment)
if (!empty($comment))
{
- $title.= ' '.substr($info['comment'], 0, 100).(strlen($info['comment']) > 100 ? '...' : '');
+ $comment = strip_tags($comment);
+ $title.= ' '.substr($comment, 0, 100).(strlen($comment) > 100 ? '...' : '');
}
$title = htmlspecialchars(strip_tags($title));
$title = trigger_event('get_thumbnail_title', $title, $info);
+
return $title;
}
-/** optional event handler to protect src image urls */
+/**
+ * Event handler to protect src image urls.
+ *
+ * @param string $url
+ * @param SrcImage $src_image
+ * @return string
+ */
function get_src_image_url_protection_handler($url, $src_image)
{
return get_action_url($src_image->id, $src_image->is_original() ? 'e' : 'r', false);
}
-/** optional event handler to protect element urls */
+/**
+ * Event handler to protect element urls.
+ *
+ * @param string $url
+ * @param array $infos id, path
+ * @return string
+ */
function get_element_url_protection_handler($url, $infos)
{
global $conf;
@@ -614,7 +662,9 @@ function get_element_url_protection_handler($url, $infos)
return get_action_url($infos['id'], 'e', false);
}
-
+/**
+ * Sends to the template all messages stored in $page and in the session.
+ */
function flush_page_messages()
{
global $template, $page;
diff --git a/include/functions_mail.inc.php b/include/functions_mail.inc.php
index 7ad0b1853..20dd9e610 100644
--- a/include/functions_mail.inc.php
+++ b/include/functions_mail.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,59 +21,47 @@
// | USA. |
// +-----------------------------------------------------------------------+
-// +-----------------------------------------------------------------------+
-// | functions |
-// +-----------------------------------------------------------------------+
+/**
+ * @package functions\mail
+ */
/**
- * Encodes a string using Q form if required (RFC2045)
- * mail headers MUST contain only US-ASCII characters
+ * Returns the name of the mail sender
+ *
+ * @return string
*/
-function encode_mime_header($str)
+function get_mail_sender_name()
{
- $x = preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
- if ($x==0)
- {
- return $str;
- }
- // Replace every high ascii, control =, ? and _ characters
- $str = preg_replace('/([\000-\011\013\014\016-\037\075\077\137\177-\377])/e',
- "'='.sprintf('%02X', ord('\\1'))", $str);
-
- // Replace every spaces to _ (more readable than =20)
- $str = str_replace(" ", "_", $str);
+ global $conf;
- global $lang_info;
- return '=?'.get_pwg_charset().'?Q?'.$str.'?=';
+ return (empty($conf['mail_sender_name']) ? $conf['gallery_title'] : $conf['mail_sender_name']);
}
-/*
- * Returns the name of the mail sender :
+/**
+ * Returns the email of the mail sender
*
+ * @since 2.6
* @return string
*/
-function get_mail_sender_name()
+function get_mail_sender_email()
{
global $conf;
- return (empty($conf['mail_sender_name']) ? $conf['gallery_title'] : $conf['mail_sender_name']);
+ return (empty($conf['mail_sender_email']) ? get_webmaster_mail_address() : $conf['mail_sender_email']);
}
-/*
- * Returns an array of mail configuration parameters :
- *
- * - mail_options
+/**
+ * Returns an array of mail configuration parameters.
* - send_bcc_mail_webmaster
- * - default_email_format
- * - alternative_email_format
+ * - mail_allow_html
* - use_smtp
* - smtp_host
* - smtp_user
* - smtp_password
- * - boundary_key
+ * - smtp_secure
* - email_webmaster
- * - formated_email_webmaster
+ * - name_webmaster
*
* @return array
*/
@@ -82,46 +70,39 @@ function get_mail_configuration()
global $conf;
$conf_mail = array(
- 'mail_options' => $conf['mail_options'],
'send_bcc_mail_webmaster' => $conf['send_bcc_mail_webmaster'],
- 'default_email_format' => $conf['default_email_format'],
- 'alternative_email_format' => $conf['alternative_email_format'],
+ 'mail_allow_html' => $conf['mail_allow_html'],
+ 'mail_theme' => $conf['mail_theme'],
'use_smtp' => !empty($conf['smtp_host']),
'smtp_host' => $conf['smtp_host'],
'smtp_user' => $conf['smtp_user'],
'smtp_password' => $conf['smtp_password'],
- 'boundary_key' => generate_key(32),
+ 'smtp_secure' => $conf['smtp_secure'],
+ 'email_webmaster' => get_mail_sender_email(),
+ 'name_webmaster' => get_mail_sender_name(),
);
- // we have webmaster id among user list, what's his email address ?
- $conf_mail['email_webmaster'] = get_webmaster_mail_address();
-
- // name of the webmaster is the title of the gallery
- $conf_mail['formated_email_webmaster'] =
- format_email(get_mail_sender_name(), $conf_mail['email_webmaster']);
-
return $conf_mail;
}
/**
- * Returns an email address with an associated real name
+ * Returns an email address with an associated real name.
+ * Can return either:
+ * - email@domain.com
+ * - name <email@domain.com>
*
- * @param string name
- * @param string email
+ * @param string $name
+ * @param string $email
+ * @return string
*/
function format_email($name, $email)
{
- // Spring cleaning
$cvt_email = trim(preg_replace('#[\n\r]+#s', '', $email));
$cvt_name = trim(preg_replace('#[\n\r]+#s', '', $name));
if ($cvt_name!="")
{
- $cvt_name = encode_mime_header(
- '"'
- .addcslashes($cvt_name,'"')
- .'"');
- $cvt_name .= ' ';
+ $cvt_name = '"'.addcslashes($cvt_name,'"').'"'.' ';
}
if (strpos($cvt_email, '<') === false)
@@ -135,14 +116,118 @@ function format_email($name, $email)
}
/**
- * Returns an email address list with minimal email string
+ * Returns the email and the name from a formatted address.
+ * @since 2.6
+ *
+ * @param string|string[] $input - if is an array must contain email[, name]
+ * @return array email, name
+ */
+function unformat_email($input)
+{
+ if (is_array($input))
+ {
+ if (!isset($input['name']))
+ {
+ $input['name'] = '';
+ }
+ return $input;
+ }
+
+ if (preg_match('/(.*)<(.*)>.*/', $input, $matches))
+ {
+ return array(
+ 'email' => trim($matches[2]),
+ 'name' => trim($matches[1]),
+ );
+ }
+ else
+ {
+ return array(
+ 'email' => trim($input),
+ 'name' => '',
+ );
+ }
+}
+
+/**
+ * Return a clean array of hashmaps (email, name) removing duplicates.
+ * It accepts various inputs:
+ * - comma separated list
+ * - array of emails
+ * - single hashmap (email[, name])
+ * - array of incomplete hashmaps
+ * @since 2.6
+ *
+ * @param mixed $data
+ * @return string[][]
+ */
+function get_clean_recipients_list($data)
+{
+ if (empty($data))
+ {
+ return array();
+ }
+ else if (is_array($data))
+ {
+ $values = array_values($data);
+ if (!is_array($values[0]))
+ {
+ $keys = array_keys($data);
+ if (is_int($keys[0]))
+ { // simple array of emails
+ foreach ($data as &$item)
+ {
+ $item = array(
+ 'email' => trim($item),
+ 'name' => '',
+ );
+ }
+ unset($item);
+ }
+ else
+ { // hashmap of one recipient
+ $data = array(unformat_email($data));
+ }
+ }
+ else
+ { // array of hashmaps
+ $data = array_map('unformat_email', $data);
+ }
+ }
+ else
+ {
+ $data = explode(',', $data);
+ $data = array_map('unformat_email', $data);
+ }
+
+ $existing = array();
+ foreach ($data as $i => $entry)
+ {
+ if (isset($existing[ $entry['email'] ]))
+ {
+ unset($data[$i]);
+ }
+ else
+ {
+ $existing[ $entry['email'] ] = true;
+ }
+ }
+
+ return array_values($data);
+}
+
+/**
+ * Returns an email address list with minimal email string.
+ * @deprecated 2.6
*
- * @param string with email list (email separated by comma)
+ * @param string $email_list - comma separated
+ * @return string
*/
function get_strict_email_list($email_list)
{
$result = array();
$list = explode(',', $email_list);
+
foreach ($list as $email)
{
if (strpos($email, '<') !== false)
@@ -155,44 +240,38 @@ function get_strict_email_list($email_list)
return implode(',', array_unique($result));
}
-
/**
- * Return an new mail template
+ * Return an new mail template.
*
- * @param string email_format: mail format, text/html or text/plain
- * @param string theme: theme to use [default get_default_theme()]
+ * @param string $email_format - text/html or text/plain
+ * @return Template
*/
-function & get_mail_template($email_format, $theme='')
+function &get_mail_template($email_format)
{
- if (empty($theme))
- {
- $theme = get_default_theme();
- }
-
- $mail_template = new Template(PHPWG_ROOT_PATH.'themes', $theme, 'template/mail/'.$email_format);
-
- return $mail_template;
+ $template = new Template(PHPWG_ROOT_PATH.'themes', 'default', 'template/mail/'.$email_format);
+ return $template;
}
/**
- * Return string email format (text/html or text/plain)
+ * Return string email format (text/html or text/plain).
*
- * @param string format
+ * @param bool $is_html
+ * @return string
*/
function get_str_email_format($is_html)
{
return ($is_html ? 'text/html' : 'text/plain');
}
-/*
- * Switch language to param language
+/**
+ * Switch language to specified language.
* All entries are push on language stack
*
- * @param string language
+ * @param string $language
*/
function switch_lang_to($language)
{
- global $switch_lang, $user, $lang, $lang_info;
+ global $switch_lang, $user, $lang, $lang_info, $language_files;
// explanation of switch_lang
// $switch_lang['language'] contains data of language
@@ -224,6 +303,15 @@ function switch_lang_to($language)
// No test admin because script is checked admin (user selected no)
// Translations are in admin file too
load_language('admin.lang', '', array('language'=>$language) );
+
+ // Reload all plugins files (see load_language declaration)
+ if (!empty($language_files))
+ {
+ foreach ($language_files as $dirname => $files)
+ foreach ($files as $filename)
+ load_language($filename, $dirname, array('language'=>$language) );
+ }
+
trigger_action('loading_lang');
load_language('lang', PHPWG_ROOT_PATH.PWG_LOCAL_DIR,
array('language'=>$language, 'no_fallback'=>true, 'local'=>true)
@@ -239,10 +327,9 @@ function switch_lang_to($language)
}
}
-/*
- * Switch back language pushed with switch_lang_to function
- *
- * @param: none
+/**
+ * Switch back language pushed with switch_lang_to() function.
+ * @see switch_lang_to()
*/
function switch_lang_back()
{
@@ -264,118 +351,126 @@ function switch_lang_back()
}
/**
- * Returns email of all administrator
+ * Send a notification email to all administrators.
+ * current user (if admin) is not notified
*
- * @return string
+ * @param string|array $subject
+ * @param string|array $content
+ * @param boolean $send_technical_details - send user IP and browser
+ * @return boolean
*/
-/*
- * send en notification email to all administrators
- * if a administrator is doing action,
- * he's be removed to email list
- *
- * @param:
- * - keyargs_subject: mail subject on l10n_args format
- * - keyargs_content: mail content on l10n_args format
- * - send_technical_details: send user IP and browser
+function pwg_mail_notification_admins($subject, $content, $send_technical_details=true)
+{
+ if (empty($subject) or empty($content))
+ {
+ return false;
+ }
+
+ global $conf, $user;
+
+ if (is_array($subject) or is_array($content))
+ {
+ switch_lang_to(get_default_language());
+
+ if (is_array($subject))
+ {
+ $subject = l10n_args($subject);
+ }
+ if (is_array($content))
+ {
+ $content = l10n_args($content);
+ }
+
+ switch_lang_back();
+ }
+
+ $tpl_vars = array();
+ if ($send_technical_details)
+ {
+ $tpl_vars['TECHNICAL'] = array(
+ 'username' => stripslashes($user['username']),
+ 'ip' => $_SERVER['REMOTE_ADDR'],
+ 'user_agent' => $_SERVER['HTTP_USER_AGENT'],
+ );
+ }
+
+ return pwg_mail_admins(
+ array(
+ 'subject' => '['. $conf['gallery_title'] .'] '. $subject,
+ 'mail_title' => $conf['gallery_title'],
+ 'mail_subtitle' => $subject,
+ 'content' => $content,
+ 'content_format' => 'text/plain',
+ ),
+ array(
+ 'filename' => 'notification_admin',
+ 'assign' => $tpl_vars,
+ )
+ );
+}
+
+/**
+ * Send a email to all administrators.
+ * current user (if admin) is excluded
+ * @see pwg_mail()
+ * @since 2.6
*
- * @return boolean (Ok or not)
+ * @param array $args - as in pwg_mail()
+ * @param array $tpl - as in pwg_mail()
+ * @return boolean
*/
-function pwg_mail_notification_admins($keyargs_subject, $keyargs_content, $send_technical_details=true)
+function pwg_mail_admins($args=array(), $tpl=array())
{
- global $conf, $user;
-
- // Check arguments
- if (empty($keyargs_subject) or empty($keyargs_content))
+ if (empty($args['content']) and empty($tpl))
{
return false;
}
+ global $conf, $user;
$return = true;
- $admins = array();
-
+ // get admins (except ourself)
$query = '
SELECT
- u.'.$conf['user_fields']['username'].' AS username,
- u.'.$conf['user_fields']['email'].' AS mail_address
+ u.'.$conf['user_fields']['username'].' AS name,
+ u.'.$conf['user_fields']['email'].' AS email
FROM '.USERS_TABLE.' AS u
- JOIN '.USER_INFOS_TABLE.' AS i ON i.user_id = u.'.$conf['user_fields']['id'].'
+ JOIN '.USER_INFOS_TABLE.' AS i
+ ON i.user_id = u.'.$conf['user_fields']['id'].'
WHERE i.status in (\'webmaster\', \'admin\')
- AND '.$conf['user_fields']['email'].' IS NOT NULL
+ AND u.'.$conf['user_fields']['email'].' IS NOT NULL
AND i.user_id <> '.$user['id'].'
ORDER BY username
;';
+ $admins = array_from_query($query);
- $datas = pwg_query($query);
- if (!empty($datas))
+ if (empty($admins))
{
- while ($admin = pwg_db_fetch_assoc($datas))
- {
- if (!empty($admin['mail_address']))
- {
- array_push($admins, format_email($admin['username'], $admin['mail_address']));
- }
- }
+ return $return;
}
- if (count($admins) > 0)
- {
- switch_lang_to(get_default_language());
+ switch_lang_to(get_default_language());
- $content = l10n_args($keyargs_content)."\n";
- if ($send_technical_details)
- {
- $keyargs_content_admin_info = array(
- get_l10n_args('Connected user: %s', stripslashes($user['username'])),
- get_l10n_args('IP: %s', $_SERVER['REMOTE_ADDR']),
- get_l10n_args('Browser: %s', $_SERVER['HTTP_USER_AGENT'])
- );
-
- $content.= "\n".l10n_args($keyargs_content_admin_info)."\n";
- }
+ $return = pwg_mail($admins, $args, $tpl);
- $return = pwg_mail(
- implode(', ', $admins),
- array(
- 'subject' => '['.$conf['gallery_title'].'] '.l10n_args($keyargs_subject),
- 'content' => $content,
- 'content_format' => 'text/plain',
- 'email_format' => 'text/plain',
- )
- );
-
- switch_lang_back();
- }
+ switch_lang_back();
return $return;
}
-/*
- * send en email to user's group
- *
- * @param:
- * - group_id: mail are sent to group with this Id
- * - email_format: mail format
- * - keyargs_subject: mail subject on l10n_args format
- * - tpl_shortname: short template name without extension
- * - assign_vars: array used to assign_vars to mail template
- * - language_selected: send mail only to user with this selected language
+/**
+ * Send an email to a group.
+ * @see pwg_mail()
*
- * @return boolean (Ok or not)
+ * @param int $group_id
+ * @param array $args - as in pwg_mail()
+ * o language_selected: filters users of the group by language [default value empty]
+ * @param array $tpl - as in pwg_mail()
+ * @return boolean
*/
-function pwg_mail_group(
- $group_id, $email_format, $keyargs_subject,
- $tpl_shortname,
- $assign_vars = array(), $language_selected = '')
-{
- // Check arguments
- if
- (
- empty($group_id) or
- empty($email_format) or
- empty($keyargs_subject) or
- empty($tpl_shortname)
- )
+function pwg_mail_group($group_id, $args=array(), $tpl=array())
+{
+ if (empty($group_id) or ( empty($args['content']) and empty($tpl) ))
{
return false;
}
@@ -383,117 +478,93 @@ function pwg_mail_group(
global $conf;
$return = true;
+ // get distinct languages of targeted users
$query = '
-SELECT
- distinct language, theme
-FROM
- '.USER_GROUP_TABLE.' as ug
- INNER JOIN '.USERS_TABLE.' as u ON '.$conf['user_fields']['id'].' = ug.user_id
- INNER JOIN '.USER_INFOS_TABLE.' as ui ON ui.user_id = ug.user_id
-WHERE
- '.$conf['user_fields']['email'].' IS NOT NULL
- AND group_id = '.$group_id;
-
- if (!empty($language_selected))
+SELECT DISTINCT language
+ FROM '.USER_GROUP_TABLE.' AS ug
+ INNER JOIN '.USERS_TABLE.' AS u
+ ON '.$conf['user_fields']['id'].' = ug.user_id
+ INNER JOIN '.USER_INFOS_TABLE.' AS ui
+ ON ui.user_id = ug.user_id
+ WHERE group_id = '.$group_id.'
+ AND '.$conf['user_fields']['email'].' <> ""';
+ if (!empty($args['language_selected']))
{
$query .= '
- AND language = \''.$language_selected.'\'';
+ AND language = \''.$args['language_selected'].'\'';
}
$query .= '
;';
+ $languages = array_from_query($query, 'language');
- $result = pwg_query($query);
-
- if (pwg_db_num_rows($result) > 0)
+ if (empty($languages))
{
- $list = array();
- while ($row = pwg_db_fetch_assoc($result))
- {
- $list[] = $row;
- }
+ return $return;
+ }
- foreach ($list as $elem)
- {
- $query = '
+ foreach ($languages as $language)
+ {
+ // get subset of users in this group for a specific language
+ $query = '
SELECT
- u.'.$conf['user_fields']['username'].' as username,
- u.'.$conf['user_fields']['email'].' as mail_address
-FROM
- '.USER_GROUP_TABLE.' as ug
- INNER JOIN '.USERS_TABLE.' as u ON '.$conf['user_fields']['id'].' = ug.user_id
- INNER JOIN '.USER_INFOS_TABLE.' as ui ON ui.user_id = ug.user_id
-WHERE
- '.$conf['user_fields']['email'].' IS NOT NULL
- AND group_id = '.$group_id.'
- AND language = \''.$elem['language'].'\'
- AND theme = \''.$elem['theme'].'\'
+ u.'.$conf['user_fields']['username'].' AS name,
+ u.'.$conf['user_fields']['email'].' AS email
+ FROM '.USER_GROUP_TABLE.' AS ug
+ INNER JOIN '.USERS_TABLE.' AS u
+ ON '.$conf['user_fields']['id'].' = ug.user_id
+ INNER JOIN '.USER_INFOS_TABLE.' AS ui
+ ON ui.user_id = ug.user_id
+ WHERE group_id = '.$group_id.'
+ AND '.$conf['user_fields']['email'].' <> ""
+ AND language = \''.$language.'\'
;';
+ $users = array_from_query($query);
- $result = pwg_query($query);
+ if (empty($users))
+ {
+ continue;
+ }
- if (pwg_db_num_rows($result) > 0)
- {
- $Bcc = array();
- while ($row = pwg_db_fetch_assoc($result))
- {
- if (!empty($row['mail_address']))
- {
- array_push($Bcc, format_email(stripslashes($row['username']), $row['mail_address']));
- }
- }
+ switch_lang_to($language);
- if (count($Bcc) > 0)
- {
- switch_lang_to($elem['language']);
-
- $mail_template = get_mail_template($email_format, $elem['theme']);
- $mail_template->set_filename($tpl_shortname, $tpl_shortname.'.tpl');
-
- $mail_template->assign(
- trigger_event('mail_group_assign_vars', $assign_vars));
-
- $return = pwg_mail
- (
- '',
- array
- (
- 'Bcc' => $Bcc,
- 'subject' => l10n_args($keyargs_subject),
- 'email_format' => $email_format,
- 'content' => $mail_template->parse($tpl_shortname, true),
- 'content_format' => $email_format,
- 'theme' => $elem['theme']
- )
- ) and $return;
+ $return&= pwg_mail(null,
+ array_merge(
+ $args,
+ array('Bcc' => $users)
+ ),
+ $tpl
+ );
- switch_lang_back();
- }
- }
- }
+ switch_lang_back();
}
return $return;
}
-/*
- * sends an email, using Piwigo specific informations
+/**
+ * Sends an email, using Piwigo specific informations.
*
- * @param:
- * - to: receiver(s) of the mail (list separated by comma).
- * - args: function params of mail function:
+ * @param string|array $to
+ * @param array $args
* o from: sender [default value webmaster email]
* o Cc: array of carbon copy receivers of the mail. [default value empty]
* o Bcc: array of blind carbon copy receivers of the mail. [default value empty]
- * o subject [default value 'Piwigo']
- * o content: content of mail [default value '']
- * o content_format: format of mail content [default value 'text/plain']
- * o email_format: global mail format [default value $conf_mail['default_email_format']]
- * o theme: template to use [default get_default_theme()]
+ * o subject [default value 'Piwigo']
+ * o content: content of mail [default value '']
+ * o content_format: format of mail content [default value 'text/plain']
+ * o email_format: global mail format [default value $conf_mail['default_email_format']]
+ * o theme: theme to use [default value $conf_mail['mail_theme']]
+ * o mail_title: main title of the mail [default value $conf['gallery_title']]
+ * o mail_subtitle: subtitle of the mail [default value subject]
+ * @param array $tpl - use these options to define a custom content template file
+ * o filename
+ * o dirname (optional)
+ * o assign (optional)
*
- * @return boolean (Ok or not)
+ * @return boolean
*/
-function pwg_mail($to, $args = array())
+function pwg_mail($to, $args=array(), $tpl=array())
{
global $conf, $conf_mail, $lang_info, $page;
@@ -507,224 +578,316 @@ function pwg_mail($to, $args = array())
$conf_mail = get_mail_configuration();
}
- if (empty($args['email_format']))
+ include_once(PHPWG_ROOT_PATH.'include/phpmailer/class.phpmailer.php');
+
+ $mail = new PHPMailer;
+
+ foreach (get_clean_recipients_list($to) as $recipient)
{
- $args['email_format'] = $conf_mail['default_email_format'];
+ $mail->addAddress($recipient['email'], $recipient['name']);
}
+ $mail->WordWrap = 76;
+ $mail->CharSet = 'UTF-8';
+
// Compute root_path in order have complete path
set_make_full_url();
if (empty($args['from']))
{
- $args['from'] = $conf_mail['formated_email_webmaster'];
+ $from = array(
+ 'email' => $conf_mail['email_webmaster'],
+ 'name' => $conf_mail['name_webmaster'],
+ );
}
else
{
- $args['from'] = format_email('', $args['from']);
+ $from = unformat_email($args['from']);
}
+ $mail->setFrom($from['email'], $from['name']);
+ $mail->addReplyTo($from['email'], $from['name']);
+ // Subject
if (empty($args['subject']))
{
$args['subject'] = 'Piwigo';
}
- // Spring cleaning
- $cvt_subject = trim(preg_replace('#[\n\r]+#s', '', $args['subject']));
- // Ascii convertion
- $cvt_subject = encode_mime_header($cvt_subject);
+ $args['subject'] = trim(preg_replace('#[\n\r]+#s', '', $args['subject']));
+ $mail->Subject = $args['subject'];
- if (!isset($args['content']))
+ // Cc
+ if (!empty($args['Cc']))
{
- $args['content'] = '';
+ foreach (get_clean_recipients_list($args['Cc']) as $recipient)
+ {
+ $mail->addCC($recipient['email'], $recipient['name']);
+ }
}
- if (empty($args['content_format']))
+ // Bcc
+ $Bcc = get_clean_recipients_list(@$args['Bcc']);
+ if ($conf_mail['send_bcc_mail_webmaster'])
{
- $args['content_format'] = 'text/plain';
+ $Bcc[] = array(
+ 'email' => get_webmaster_mail_address(),
+ 'name' => '',
+ );
}
-
- if ($conf_mail['send_bcc_mail_webmaster'])
+ if (!empty($Bcc))
{
- $args['Bcc'][] = $conf_mail['formated_email_webmaster'];
+ foreach ($Bcc as $recipient)
+ {
+ $mail->addBCC($recipient['email'], $recipient['name']);
+ }
}
- if (empty($args['theme']))
+ // theme
+ if (empty($args['theme']) or !in_array($args['theme'], array('clear','dark')))
{
- $args['theme'] = get_default_theme();
+ $args['theme'] = $conf_mail['mail_theme'];
}
- $headers = 'From: '.$args['from']."\n";
- $headers.= 'Reply-To: '.$args['from']."\n";
-
- if (!empty($args['Cc']))
+ // content
+ if (!isset($args['content']))
{
- $headers.= 'Cc: '.implode(',', $args['Cc'])."\n";
+ $args['content'] = '';
}
-
- if (!empty($args['Bcc']))
+
+ // try to decompose subject like "[....] ...."
+ if (!isset($args['mail_title']) and !isset($args['mail_subtitle']))
{
- $headers.= 'Bcc: '.implode(',', $args['Bcc'])."\n";
+ if (preg_match('#^\[(.*)\](.*)$#', $args['subject'], $matches))
+ {
+ $args['mail_title'] = $matches[1];
+ $args['mail_subtitle'] = $matches[2];
+ }
+ }
+ if (!isset($args['mail_title']))
+ {
+ $args['mail_title'] = $conf['gallery_title'];
+ }
+ if (!isset($args['mail_subtitle']))
+ {
+ $args['mail_subtitle'] = $args['subject'];
}
- $headers.= 'Content-Type: multipart/alternative;'."\n";
- $headers.= ' boundary="---='.$conf_mail['boundary_key'].'";'."\n";
- $headers.= ' reply-type=original'."\n";
- $headers.= 'MIME-Version: 1.0'."\n";
- $headers.= 'X-Mailer: Piwigo Mailer'."\n";
-
- // List on content-type
- $content_type_list[] = $args['email_format'];
- if (!empty($conf_mail['alternative_email_format']))
+ // content type
+ if (empty($args['content_format']))
{
- $content_type_list[] = $conf_mail['alternative_email_format'];
+ $args['content_format'] = 'text/plain';
}
- $content = '';
+ $content_type_list = array();
+ if ($conf_mail['mail_allow_html'] and @$args['email_format'] != 'text/plain')
+ {
+ $content_type_list[] = 'text/html';
+ }
+ $content_type_list[] = 'text/plain';
- foreach (array_unique($content_type_list) as $content_type)
+ $contents = array();
+ foreach ($content_type_list as $content_type)
{
- // key compose of indexes witch allow ti cache mail data
- $cache_key = $content_type.'-'.$lang_info['code'].'-'.$args['theme'];
+ // key compose of indexes witch allow to cache mail data
+ $cache_key = $content_type.'-'.$lang_info['code'];
if (!isset($conf_mail[$cache_key]))
{
+ // instanciate a new Template
if (!isset($conf_mail[$cache_key]['theme']))
{
- $conf_mail[$cache_key]['theme'] = get_mail_template($content_type, $args['theme']);
+ $conf_mail[$cache_key]['theme'] = get_mail_template($content_type);
+ trigger_action('before_parse_mail_template', $cache_key, $content_type);
}
+ $template = &$conf_mail[$cache_key]['theme'];
- $conf_mail[$cache_key]['theme']->set_filename('mail_header', 'header.tpl');
- $conf_mail[$cache_key]['theme']->set_filename('mail_footer', 'footer.tpl');
+ $template->set_filename('mail_header', 'header.tpl');
+ $template->set_filename('mail_footer', 'footer.tpl');
- $conf_mail[$cache_key]['theme']->assign(
+ $template->assign(
array(
- //Header
- 'BOUNDARY_KEY' => $conf_mail['boundary_key'],
- 'CONTENT_TYPE' => $content_type,
- 'CONTENT_ENCODING' => get_pwg_charset(),
-
- // Footer
'GALLERY_URL' => get_gallery_home_url(),
- 'GALLERY_TITLE' =>
- isset($page['gallery_title']) ?
- $page['gallery_title'] : $conf['gallery_title'],
+ 'GALLERY_TITLE' => isset($page['gallery_title']) ? $page['gallery_title'] : $conf['gallery_title'],
'VERSION' => $conf['show_version'] ? PHPWG_VERSION : '',
- 'PHPWG_URL' => PHPWG_URL,
-
- 'TITLE_MAIL' => urlencode(l10n('A comment on your site')),
- 'MAIL' => get_webmaster_mail_address()
- ));
+ 'PHPWG_URL' => defined('PHPWG_URL') ? PHPWG_URL : '',
+ 'CONTENT_ENCODING' => get_pwg_charset(),
+ 'CONTACT_MAIL' => $conf_mail['email_webmaster'],
+ )
+ );
if ($content_type == 'text/html')
{
- if ($conf_mail[$cache_key]['theme']->smarty->template_exists('global-mail-css.tpl'))
+ if ($template->smarty->templateExists('global-mail-css.tpl'))
{
- $conf_mail[$cache_key]['theme']->set_filename('css', 'global-mail-css.tpl');
- $conf_mail[$cache_key]['theme']->assign_var_from_handle('GLOBAL_MAIL_CSS', 'css');
+ $template->set_filename('global-css', 'global-mail-css.tpl');
+ $template->assign_var_from_handle('GLOBAL_MAIL_CSS', 'global-css');
}
- $file = PHPWG_ROOT_PATH.'themes/'.$args['theme'].'/mail-css.tpl';
- if (is_file($file))
+ if ($template->smarty->templateExists('mail-css-'. $args['theme'] .'.tpl'))
{
- $conf_mail[$cache_key]['theme']->set_filename('css', realpath($file));
- $conf_mail[$cache_key]['theme']->assign_var_from_handle('MAIL_CSS', 'css');
+ $template->set_filename('css', 'mail-css-'. $args['theme'] .'.tpl');
+ $template->assign_var_from_handle('MAIL_CSS', 'css');
}
}
-
- // what are displayed on the header of each mail ?
- $conf_mail[$cache_key]['header'] =
- $conf_mail[$cache_key]['theme']->parse('mail_header', true);
-
- // what are displayed on the footer of each mail ?
- $conf_mail[$cache_key]['footer'] =
- $conf_mail[$cache_key]['theme']->parse('mail_footer', true);
}
+
+ $template = &$conf_mail[$cache_key]['theme'];
+ $template->assign(
+ array(
+ 'MAIL_TITLE' => $args['mail_title'],
+ 'MAIL_SUBTITLE' => $args['mail_subtitle'],
+ )
+ );
// Header
- $content.= $conf_mail[$cache_key]['header'];
+ $contents[$content_type] = $template->parse('mail_header', true);
// Content
- if (($args['content_format'] == 'text/plain') and ($content_type == 'text/html'))
+ // Stored in a temp variable, if a content template is used it will be assigned
+ // to the $CONTENT template variable, otherwise it will be appened to the mail
+ if ($args['content_format'] == 'text/plain' and $content_type == 'text/html')
{
- $content.= '<p>'.
- nl2br(
- preg_replace("/(http:\/\/)([^\s,]*)/i",
- "<a href='$1$2' class='thumblnk'>$1$2</a>",
- htmlspecialchars($args['content']))).
- '</p>';
+ // convert plain text to html
+ $mail_content =
+ '<p>'.
+ nl2br(
+ preg_replace(
+ '/(https?:\/\/([-\w\.]+[-\w])+(:\d+)?(\/([\w\/_\.\#-]*(\?\S+)?[^\.\s])?)?)/i',
+ '<a href="$1">$1</a>',
+ htmlspecialchars($args['content'])
+ )
+ ).
+ '</p>';
}
- else if (($args['content_format'] == 'text/html') and ($content_type == 'text/plain'))
+ else if ($args['content_format'] == 'text/html' and $content_type == 'text/plain')
{
// convert html text to plain text
- $content.= strip_tags($args['content']);
+ $mail_content = strip_tags($args['content']);
+ }
+ else
+ {
+ $mail_content = $args['content'];
+ }
+
+ // Runtime template
+ if (isset($tpl['filename']))
+ {
+ if (isset($tpl['dirname']))
+ {
+ $template->set_template_dir($tpl['dirname'] .'/'. $content_type);
+ }
+ if ($template->smarty->templateExists($tpl['filename'] .'.tpl'))
+ {
+ $template->set_filename($tpl['filename'], $tpl['filename'] .'.tpl');
+ if (!empty($tpl['assign']))
+ {
+ $template->assign($tpl['assign']);
+ }
+ $template->assign('CONTENT', $mail_content);
+ $contents[$content_type].= $template->parse($tpl['filename'], true);
+ }
+ else
+ {
+ $contents[$content_type].= $mail_content;
+ }
}
else
{
- $content.= $args['content'];
+ $contents[$content_type].= $mail_content;
}
// Footer
- $content.= $conf_mail[$cache_key]['footer'];
+ $contents[$content_type].= $template->parse('mail_footer', true);
+ }
+
+ // Undo Compute root_path in order have complete path
+ unset_make_full_url();
+
+ // Send content to PHPMailer
+ if (isset($contents['text/html']))
+ {
+ $mail->isHTML(true);
+ $mail->Body = move_css_to_body($contents['text/html']);
+
+ if (isset($contents['text/plain']))
+ {
+ $mail->AltBody = $contents['text/plain'];
+ }
+ }
+ else
+ {
+ $mail->isHTML(false);
+ $mail->Body = $contents['text/plain'];
+ }
+
+ if ($conf_mail['use_smtp'])
+ {
+ // now we need to split port number
+ if (strpos($conf_mail['smtp_host'], ':') !== false)
+ {
+ list($smtp_host, $smtp_port) = explode(':', $conf_mail['smtp_host']);
+ }
+ else
+ {
+ $smtp_host = $conf_mail['smtp_host'];
+ $smtp_port = 25;
+ }
- // Close boundary
- $content.= "\n".'-----='.$conf_mail['boundary_key'].'--'."\n";
+ $mail->IsSMTP();
+
+ // enables SMTP debug information (for testing) 2 - debug, 0 - no message
+ $mail->SMTPDebug = 0;
+
+ $mail->Host = $smtp_host;
+ $mail->Port = $smtp_port;
+
+ if (!empty($conf_mail['smtp_secure']) and in_array($conf_mail['smtp_secure'], array('ssl', 'tls')))
+ {
+ $mail->SMTPSecure = $conf_mail['smtp_secure'];
+ }
+
+ if (!empty($conf_mail['smtp_user']))
+ {
+ $mail->SMTPAuth = true;
+ $mail->Username = $conf_mail['smtp_user'];
+ $mail->Password = $conf_mail['smtp_password'];
+ }
}
- //~ // Close boundary
- //~ $content.= "\n".'-----='.$conf_mail['boundary_key'].'--'."\n";
+ $ret = true;
+ $pre_result = trigger_event('before_send_mail', true, $to, $args, $mail);
- // Undo Compute root_path in order have complete path
- unset_make_full_url();
+ if ($pre_result)
+ {
+ $ret = $mail->send();
+ if (!$ret and (!ini_get('display_errors') or is_admin()))
+ {
+ trigger_error('Mailer Error: ' . $mail->ErrorInfo, E_USER_WARNING);
+ }
+ if ($conf['debug_mail'])
+ {
+ pwg_send_mail_test($ret, $mail, $args);
+ }
+ }
- return
- trigger_event('send_mail',
- false, /* Result */
- trigger_event('send_mail_to', get_strict_email_list($to)),
- trigger_event('send_mail_subject', $cvt_subject),
- trigger_event('send_mail_content', $content),
- trigger_event('send_mail_headers', $headers),
- $args
- );
+ return $ret;
}
-/*
- * pwg sendmail
- *
- * @param:
- * - result of other sendmail
- * - to: Receiver or receiver(s) of the mail.
- * - subject [default value 'Piwigo']
- * - content: content of mail
- * - headers: headers of mail
- *
- * @return boolean (Ok or not)
+/**
+ * @deprecated 2.6
*/
function pwg_send_mail($result, $to, $subject, $content, $headers)
{
+ if (is_admin())
+ {
+ trigger_error('pwg_send_mail function is deprecated', E_USER_NOTICE);
+ }
+
if (!$result)
{
- global $conf_mail;
-
- if ($conf_mail['use_smtp'])
- {
- include_once( PHPWG_ROOT_PATH.'include/class_smtp_mail.inc.php' );
- $smtp_mail = new smtp_mail(
- $conf_mail['smtp_host'], $conf_mail['smtp_user'], $conf_mail['smtp_password'],
- $conf_mail['email_webmaster']);
- return $smtp_mail->mail($to, $subject, $content, $headers);
- }
- else
- {
- if ($conf_mail['mail_options'])
- {
- $options = '-f '.$conf_mail['email_webmaster'];
- return mail($to, $subject, $content, $headers, $options);
- }
- else
- {
- return mail($to, $subject, $content, $headers);
- }
- }
+ return pwg_mail($to, array(
+ 'content' => $content,
+ 'subject' => $subject,
+ ));
}
else
{
@@ -732,94 +895,65 @@ function pwg_send_mail($result, $to, $subject, $content, $headers)
}
}
-function move_ccs_rules_to_body($content)
+/**
+ * Moves CSS rules contained in the <style> tag to inline CSS.
+ * Used for compatibility with Gmail and such clients
+ * @since 2.6
+ *
+ * @param string $content
+ * @return string
+ */
+function move_css_to_body($content)
{
- // We search all css rules in style tags
- preg_match('#<style>(.*?)</style>#s', $content, $matches);
-
- if (!empty($matches[1]))
- {
- preg_match_all('#([^\n]*?)\{(.*?)\}#s', $matches[1], $matches);
+ include_once(PHPWG_ROOT_PATH.'include/emogrifier.class.php');
- $selectors = array();
- $unknow_selectors = '';
+ // disable DOM warnings
+ $e_state = libxml_use_internal_errors(true);
- foreach ($matches[1] as $key => $value)
- {
- $selects = explode(',', $value);
- $style = trim($matches[2][$key], ' ;');
+ $e = new Emogrifier($content);
+ // $e->preserveStyleTag = true;
+ $content = $e->emogrify();
- foreach($selects as $select)
- {
- $select = trim($select);
- $selectors[$select][] = $style;
- }
- }
+ libxml_clear_errors();
+ libxml_use_internal_errors($e_state);
- foreach ($selectors as $selector => $style)
- {
- if (!preg_match('/^(#|\.|)([A-Za-z0-9_-]*)$/', $selector, $matches))
- {
- $unknow_selectors .= $selector.' {'.implode(";\n", $style).";}\n";
- }
- else switch ($matches[1])
- {
- case '#':
- $content = preg_replace('|id="'.$matches[2].'"|', 'id="'.$matches[2].'" style="'.implode(";\n", $style).";\"\n", $content);
- break;
- case '.':
- $content = preg_replace('|class="'.$matches[2].'"|', 'class="'.$matches[2].'" style="'.implode(";\n", $style).";\"\n", $content);
- break;
- default:
- $content = preg_replace('#<'.$matches[2].'( |>)#', '<'.$matches[2].' style="'.implode(";\n", $style).";\"\n$1", $content);
- break;
- }
- }
+ return $content;
+}
- // Keep unknow tags in page head
- if (!empty($unknow_selectors))
+/**
+ * Saves a copy of the mail if _data/tmp.
+ *
+ * @param boolean $success
+ * @param PHPMailer $mail
+ * @param array $args
+ */
+function pwg_send_mail_test($success, $mail, $args)
+{
+ global $conf, $user, $lang_info;
+
+ $dir = PHPWG_ROOT_PATH.$conf['data_location'].'tmp';
+ if (mkgetdir($dir, MKGETDIR_DEFAULT&~MKGETDIR_DIE_ON_ERROR))
+ {
+ $filename = $dir.'/mail.'.stripslashes($user['username']).'.'.$lang_info['code'].'-'.date('YmdHis').($success ? '' : '.ERROR');
+ if ($args['content_format'] == 'text/plain')
{
- $content = preg_replace('#<style>.*?</style>#s', "<style type=\"text/css\">\n$unknow_selectors</style>", $content);
+ $filename .= '.txt';
}
else
{
- $content = preg_replace('#<style>.*?</style>#s', '', $content);
+ $filename .= '.html';
}
- }
- return $content;
-}
-
-/*Testing block*/
-function pwg_send_mail_test($result, $to, $subject, $content, $headers, $args)
-{
- global $conf, $user, $lang_info;
- $dir = PHPWG_ROOT_PATH.$conf['data_location'].'tmp';
- if ( mkgetdir( $dir, MKGETDIR_DEFAULT&~MKGETDIR_DIE_ON_ERROR) )
+
+ $file = fopen($filename, 'w+');
+ if (!$success)
{
- $filename = $dir.'/mail.'.stripslashes($user['username']).'.'.$lang_info['code'].'.'.$args['theme'].'-'.date('YmdHis');
- if ($args['content_format'] == 'text/plain')
- {
- $filename .= '.txt';
- }
- else
- {
- $filename .= '.html';
- }
- $file = fopen($filename, 'w+');
- fwrite($file, $to ."\n");
- fwrite($file, $subject ."\n");
- fwrite($file, $headers);
- fwrite($file, $content);
- fclose($file);
+ fwrite($file, "ERROR: " . $mail->ErrorInfo . "\n\n");
}
- return $result;
+ fwrite($file, $mail->getSentMIMEMessage());
+ fclose($file);
+ }
}
-if ($conf['debug_mail'])
- add_event_handler('send_mail', 'pwg_send_mail_test', EVENT_HANDLER_PRIORITY_NEUTRAL+10, 6);
-
-add_event_handler('send_mail', 'pwg_send_mail', EVENT_HANDLER_PRIORITY_NEUTRAL, 5);
-add_event_handler('send_mail_content', 'move_ccs_rules_to_body');
trigger_action('functions_mail_included');
-?>
+?> \ No newline at end of file
diff --git a/include/functions_metadata.inc.php b/include/functions_metadata.inc.php
index 4549ca7c6..fc74e2aec 100644
--- a/include/functions_metadata.inc.php
+++ b/include/functions_metadata.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,14 +22,21 @@
// +-----------------------------------------------------------------------+
/**
- * returns informations from IPTC metadata, mapping is done at the beginning
- * of the function
+ * @package functions\metadata
+ */
+
+
+/**
+ * returns informations from IPTC metadata, mapping is done in this function.
*
* @param string $filename
+ * @param array $map
* @return array
*/
function get_iptc_data($filename, $map)
{
+ global $conf;
+
$result = array();
$imginfo = array();
@@ -60,10 +67,15 @@ function get_iptc_data($filename, $map)
foreach (array_keys($map, $iptc_key) as $pwg_key)
{
- // in case the origin of the photo is unsecure (user upload), we
- // remove HTML tags to avoid XSS (malicious execution of
- // javascript)
- $result[$pwg_key] = strip_tags($value);
+ $result[$pwg_key] = $value;
+
+ if (!$conf['allow_html_in_metadata'])
+ {
+ // in case the origin of the photo is unsecure (user upload), we
+ // remove HTML tags to avoid XSS (malicious execution of
+ // javascript)
+ $result[$pwg_key] = strip_tags($result[$pwg_key]);
+ }
}
}
}
@@ -73,9 +85,9 @@ function get_iptc_data($filename, $map)
}
/**
- * return a cleaned IPTC value
+ * return a cleaned IPTC value.
*
- * @param string value
+ * @param string $value
* @return string
*/
function clean_iptc_value($value)
@@ -95,23 +107,41 @@ function clean_iptc_value($value)
$value = trigger_event('clean_iptc_value', $value);
if ( ($qual = qualify_utf8($value)) != 0)
{// has non ascii chars
- $value = convert_charset( $value,
- $qual>0 ? 'utf-8' : 'iso-8859-1',
- get_pwg_charset() );
+ if ($qual>0)
+ {
+ $input_encoding = 'utf-8';
+ }
+ else
+ {
+ $input_encoding = 'iso-8859-1';
+ if (function_exists('iconv') or function_exists('mb_convert_encoding'))
+ {
+ // using windows-1252 because it supports additional characters
+ // such as "oe" in a single character (ligature). About the
+ // difference between Windows-1252 and ISO-8859-1: the characters
+ // 0x80-0x9F will not convert correctly. But these are control
+ // characters which are almost never used.
+ $input_encoding = 'windows-1252';
+ }
+ }
+
+ $value = convert_charset($value, $input_encoding, get_pwg_charset());
}
}
return $value;
}
/**
- * returns informations from EXIF metadata, mapping is done at the beginning
- * of the function
+ * returns informations from EXIF metadata, mapping is done in this function.
*
* @param string $filename
+ * @param array $map
* @return array
*/
function get_exif_data($filename, $map)
{
+ global $conf;
+
$result = array();
if (!function_exists('read_exif_data'))
@@ -122,7 +152,9 @@ function get_exif_data($filename, $map)
// Read EXIF data
if ($exif = @read_exif_data($filename))
{
- $exif = trigger_event('format_exif_data', $exif, $filename, $map );
+ $exif = trigger_event('format_exif_data', $exif, $filename, $map);
+
+ // configured fields
foreach ($map as $key => $field)
{
if (strpos($field, ';') === false)
@@ -141,15 +173,62 @@ function get_exif_data($filename, $map)
}
}
}
+
+ // GPS data
+ $gps_exif = array_intersect_key($exif, array_flip(array('GPSLatitudeRef', 'GPSLatitude', 'GPSLongitudeRef', 'GPSLongitude')));
+ if (count($gps_exif) == 4)
+ {
+ if (
+ is_array($gps_exif['GPSLatitude']) and in_array($gps_exif['GPSLatitudeRef'], array('S', 'N')) and
+ is_array($gps_exif['GPSLongitude']) and in_array($gps_exif['GPSLongitudeRef'], array('W', 'E'))
+ )
+ {
+ $result['latitude'] = parse_exif_gps_data($gps_exif['GPSLatitude'], $gps_exif['GPSLatitudeRef']);
+ $result['longitude'] = parse_exif_gps_data($gps_exif['GPSLongitude'], $gps_exif['GPSLongitudeRef']);
+ }
+ }
}
- foreach ($result as $key => $value)
+ if (!$conf['allow_html_in_metadata'])
{
- // in case the origin of the photo is unsecure (user upload), we remove
- // HTML tags to avoid XSS (malicious execution of javascript)
- $result[$key] = strip_tags($value);
+ foreach ($result as $key => $value)
+ {
+ // in case the origin of the photo is unsecure (user upload), we remove
+ // HTML tags to avoid XSS (malicious execution of javascript)
+ $result[$key] = strip_tags($value);
+ }
}
return $result;
}
+
+
+/**
+ * Converts EXIF GPS format to a float value.
+ * @since 2.6
+ *
+ * @param string[] $raw eg:
+ * - 41/1
+ * - 54/1
+ * - 9843/500
+ * @param string $ref 'S', 'N', 'E', 'W'. eg: 'N'
+ * @return float eg: 41.905468
+ */
+function parse_exif_gps_data($raw, $ref)
+{
+ foreach ($raw as &$i)
+ {
+ $i = explode('/', $i);
+ $i = $i[1]==0 ? 0 : $i[0]/$i[1];
+ }
+ unset($i);
+
+ $v = $raw[0] + $raw[1]/60 + $raw[2]/3600;
+
+ $ref = strtoupper($ref);
+ if ($ref == 'S' or $ref == 'W') $v= -$v;
+
+ return $v;
+}
+
?> \ No newline at end of file
diff --git a/include/functions_notification.inc.php b/include/functions_notification.inc.php
index a687195d9..af46f50d2 100644
--- a/include/functions_notification.inc.php
+++ b/include/functions_notification.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,139 +21,157 @@
// | USA. |
// +-----------------------------------------------------------------------+
-// +-----------------------------------------------------------------------+
-// | functions |
-// +-----------------------------------------------------------------------+
+/**
+ * @package functions\notification
+ */
-/*
- * get standard sql where in order to
- * restict an filter caregories and images
- *
- * IMAGE_CATEGORY_TABLE muste named ic in the query
- *
- * @param none
+
+/**
+ * Get standard sql where in order to restrict and filter categories and images.
+ * IMAGE_CATEGORY_TABLE must be named "ic" in the query
*
- * @return string sql where
+ * @param string $prefix_condition
+ * @param string $img_field
+ * @param bool $force_one_condition
+ * @return string
*/
-function get_std_sql_where_restrict_filter($prefix_condition, $img_field='ic.image_id', $force_one_condition = false)
+function get_std_sql_where_restrict_filter($prefix_condition,
+ $img_field = 'ic.image_id',
+ $force_one_condition = false)
{
- return get_sql_condition_FandF
- (
- array
- (
- 'forbidden_categories' => 'ic.category_id',
- 'visible_categories' => 'ic.category_id',
- 'visible_images' => $img_field
- ),
- $prefix_condition,
- $force_one_condition
- );
+ return get_sql_condition_FandF(
+ array(
+ 'forbidden_categories' => 'ic.category_id',
+ 'visible_categories' => 'ic.category_id',
+ 'visible_images' => $img_field
+ ),
+ $prefix_condition,
+ $force_one_condition
+ );
}
-/*
- * Execute custom notification query
- *
- * @param string action ('count' or 'info')
- * @param string type of query ('new_comments', 'unvalidated_comments', 'new_elements', 'updated_categories', 'new_users')
- * @param string start (mysql datetime format)
- * @param string end (mysql datetime format)
+/**
+ * Execute custom notification query.
+ * @todo use a cache for all data returned by custom_notification_query()
*
- * @return integer for action count
- * array for info
+ * @param string $action 'count', 'info'
+ * @param string $type 'new_comments', 'unvalidated_comments', 'new_elements', 'updated_categories', 'new_users'
+ * @param string $start (mysql datetime format)
+ * @param string $end (mysql datetime format)
+ * @return int|array int for action count array for info
*/
-function custom_notification_query($action, $type, $start, $end)
+function custom_notification_query($action, $type, $start=null, $end=null)
{
global $user;
switch($type)
{
case 'new_comments':
+ {
$query = '
FROM '.COMMENTS_TABLE.' AS c
- , '.IMAGE_CATEGORY_TABLE.' AS ic
- WHERE c.image_id = ic.image_id';
+ INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON c.image_id = ic.image_id
+ WHERE 1=1';
if (!empty($start))
{
- $query .= '
+ $query.= '
AND c.validation_date > \''.$start.'\'';
}
if (!empty($end))
{
- $query .= '
+ $query.= '
AND c.validation_date <= \''.$end.'\'';
}
- $query .= get_std_sql_where_restrict_filter('AND').'
-;';
+ $query.= get_std_sql_where_restrict_filter('AND');
break;
+ }
+
case 'unvalidated_comments':
+ {
$query = '
FROM '.COMMENTS_TABLE.'
WHERE 1=1';
if (!empty($start))
{
- $query .= ' AND date> \''.$start.'\'';
+ $query.= '
+ AND date > \''.$start.'\'';
}
if (!empty($end))
{
- $query .= ' AND date <= \''.$end.'\'';
+ $query.= '
+ AND date <= \''.$end.'\'';
}
- $query .= ' AND validated = \'false\'
-;';
+ $query.= '
+ AND validated = \'false\'';
break;
+ }
+
case 'new_elements':
+ {
$query = '
- FROM '.IMAGES_TABLE.' INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON image_id = id
+ FROM '.IMAGES_TABLE.'
+ INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON image_id = id
WHERE 1=1';
if (!empty($start))
{
- $query .= ' AND date_available > \''.$start.'\'';
+ $query.= '
+ AND date_available > \''.$start.'\'';
}
if (!empty($end))
{
- $query .= ' AND date_available <= \''.$end.'\'';
+ $query.= '
+ AND date_available <= \''.$end.'\'';
}
- $query .= get_std_sql_where_restrict_filter('AND', 'id').'
-;';
+ $query.= get_std_sql_where_restrict_filter('AND', 'id');
break;
+ }
+
case 'updated_categories':
+ {
$query = '
- FROM '.IMAGES_TABLE.' INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON image_id = id
+ FROM '.IMAGES_TABLE.'
+ INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON image_id = id
WHERE 1=1';
if (!empty($start))
{
- $query .= ' AND date_available > \''.$start.'\'';
+ $query.= '
+ AND date_available > \''.$start.'\'';
}
if (!empty($end))
{
- $query .= ' AND date_available <= \''.$end.'\'';
+ $query.= '
+ AND date_available <= \''.$end.'\'';
}
- $query .= get_std_sql_where_restrict_filter('AND', 'id').'
-;';
+ $query.= get_std_sql_where_restrict_filter('AND', 'id');
break;
+ }
+
case 'new_users':
+ {
$query = '
FROM '.USER_INFOS_TABLE.'
WHERE 1=1';
if (!empty($start))
{
- $query .= ' AND registration_date > \''.$start.'\'';
+ $query.= '
+ AND registration_date > \''.$start.'\'';
}
if (!empty($end))
{
- $query .= ' AND registration_date <= \''.$end.'\'';
+ $query.= '
+ AND registration_date <= \''.$end.'\'';
}
- $query .= '
-;';
break;
+ }
+
default:
- // stop this function and return nothing
- return;
- break;
+ return null; // stop and return nothing
}
switch($action)
{
case 'count':
+ {
switch($type)
{
case 'new_comments':
@@ -171,183 +189,166 @@ function custom_notification_query($action, $type, $start, $end)
case 'new_users':
$field_id = 'user_id';
break;
+ }
+ $query = 'SELECT COUNT(DISTINCT '.$field_id.') '.$query.';';
+ list($count) = pwg_db_fetch_row(pwg_query($query));
+ return $count;
+ break;
}
- $query = 'SELECT count(distinct '.$field_id.') as CountId
-'.$query;
- list($count) = pwg_db_fetch_row(pwg_query($query));
- return $count;
- break;
case 'info':
+ {
switch($type)
{
case 'new_comments':
- $fields = array('c.id');
+ $field_id = 'c.id';
break;
case 'unvalidated_comments':
- $fields = array('id');
+ $field_id = 'id';
break;
case 'new_elements':
- $fields = array('image_id');
+ $field_id = 'image_id';
break;
case 'updated_categories':
- $fields = array('category_id');
+ $field_id = 'category_id';
break;
case 'new_users':
- $fields = array('user_id');
+ $field_id = 'user_id';
break;
}
-
- $query = 'SELECT distinct '.implode(', ', $fields).'
-'.$query;
- $result = pwg_query($query);
-
- $infos = array();
-
- while ($row = pwg_db_fetch_assoc($result))
- {
- array_push($infos, $row);
+ $query = 'SELECT DISTINCT '.$field_id.' '.$query.';';
+ $infos = array_from_query($query);
+ return $infos;
+ break;
}
- return $infos;
-
- break;
+ default:
+ return null; // stop and return nothing
}
-
- //return is done on previous switch($action)
}
/**
- * new comments between two dates, according to authorized categories
+ * Returns number of new comments between two dates.
*
- * @param string start (mysql datetime format)
- * @param string end (mysql datetime format)
- * @param string forbidden categories (comma separated)
- * @return count comment ids
+ * @param string $start (mysql datetime format)
+ * @param string $end (mysql datetime format)
+ * @return int
*/
-function nb_new_comments($start, $end)
+function nb_new_comments($start=null, $end=null)
{
return custom_notification_query('count', 'new_comments', $start, $end);
}
/**
- * new comments between two dates, according to authorized categories
+ * Returns new comments between two dates.
*
- * @param string start (mysql datetime format)
- * @param string end (mysql datetime format)
- * @param string forbidden categories (comma separated)
- * @return array comment ids
+ * @param string $start (mysql datetime format)
+ * @param string $end (mysql datetime format)
+ * @return int[] comment ids
*/
-function new_comments($start, $end)
+function new_comments($start=null, $end=null)
{
return custom_notification_query('info', 'new_comments', $start, $end);
}
/**
- * unvalidated at a precise date
- *
- * Comments that are registered and not validated yet on a precise date
+ * Returns number of unvalidated comments between two dates.
*
- * @param string start (mysql datetime format)
- * @param string end (mysql datetime format)
- * @return count comment ids
+ * @param string $start (mysql datetime format)
+ * @param string $end (mysql datetime format)
+ * @return int
*/
-function nb_unvalidated_comments($start, $end)
+function nb_unvalidated_comments($start=null, $end=null)
{
return custom_notification_query('count', 'unvalidated_comments', $start, $end);
}
/**
- * new elements between two dates, according to authorized categories
+ * Returns number of new photos between two dates.
*
- * @param string start (mysql datetime format)
- * @param string end (mysql datetime format)
- * @param string forbidden categories (comma separated)
- * @return count element ids
+ * @param string $start (mysql datetime format)
+ * @param string $end (mysql datetime format)
+ * @return int
*/
-function nb_new_elements($start, $end)
+function nb_new_elements($start=null, $end=null)
{
return custom_notification_query('count', 'new_elements', $start, $end);
}
/**
- * new elements between two dates, according to authorized categories
+ * Returns new photos between two dates.es
*
- * @param string start (mysql datetime format)
- * @param string end (mysql datetime format)
- * @param string forbidden categories (comma separated)
- * @return array element ids
+ * @param string $start (mysql datetime format)
+ * @param string $end (mysql datetime format)
+ * @return int[] photos ids
*/
-function new_elements($start, $end)
+function new_elements($start=null, $end=null)
{
return custom_notification_query('info', 'new_elements', $start, $end);
}
/**
- * updated categories between two dates, according to authorized categories
+ * Returns number of updated categories between two dates.
*
- * @param string start (mysql datetime format)
- * @param string end (mysql datetime format)
- * @param string forbidden categories (comma separated)
- * @return count element ids
+ * @param string $start (mysql datetime format)
+ * @param string $end (mysql datetime format)
+ * @return int
*/
-function nb_updated_categories($start, $end)
+function nb_updated_categories($start=null, $end=null)
{
return custom_notification_query('count', 'updated_categories', $start, $end);
}
/**
- * updated categories between two dates, according to authorized categories
+ * Returns updated categories between two dates.
*
- * @param string start (mysql datetime format)
- * @param string end (mysql datetime format)
- * @param string forbidden categories (comma separated)
- * @return array element ids
+ * @param string $start (mysql datetime format)
+ * @param string $end (mysql datetime format)
+ * @return int[] categories ids
*/
-function updated_categories($start, $end)
+function updated_categories($start=null, $end=null)
{
return custom_notification_query('info', 'updated_categories', $start, $end);
}
/**
- * new registered users between two dates
+ * Returns number of new users between two dates.
*
- * @param string start (mysql datetime format)
- * @param string end (mysql datetime format)
- * @return count user ids
+ * @param string $start (mysql datetime format)
+ * @param string $end (mysql datetime format)
+ * @return int
*/
-function nb_new_users($start, $end)
+function nb_new_users($start=null, $end=null)
{
return custom_notification_query('count', 'new_users', $start, $end);
}
/**
- * new registered users between two dates
+ * Returns new users between two dates.
*
- * @param string start (mysql datetime format)
- * @param string end (mysql datetime format)
- * @return array user ids
+ * @param string $start (mysql datetime format)
+ * @param string $end (mysql datetime format)
+ * @return int[] user ids
*/
-function new_users($start, $end)
+function new_users($start=null, $end=null)
{
return custom_notification_query('info', 'new_users', $start, $end);
}
/**
- * There are new between two dates ?
+ * Returns if there was new activity between two dates.
*
- * Informations : number of new comments, number of new elements, number of
- * updated categories. Administrators are also informed about : number of
- * unvalidated comments, number of new users (TODO : number of unvalidated
- * elements)
+ * Takes in account: number of new comments, number of new elements, number of
+ * updated categories. Administrators are also informed about: number of
+ * unvalidated comments, number of new users.
+ * @todo number of unvalidated elements
*
- * @param string start date (mysql datetime format)
- * @param string end date (mysql datetime format)
- *
- * @return boolean : true if exist news else false
+ * @param string $start (mysql datetime format)
+ * @param string $end (mysql datetime format)
+ * @return boolean
*/
-function news_exists($start, $end)
+function news_exists($start=null, $end=null)
{
return (
(nb_new_comments($start, $end) > 0) or
@@ -359,36 +360,42 @@ function news_exists($start, $end)
/**
* Formats a news line and adds it to the array (e.g. '5 new elements')
+ *
+ * @param array &$news
+ * @param int $count
+ * @param string $singular_key
+ * @param string $plural_key
+ * @param string $url
+ * @param bool $add_url
*/
-function add_news_line(&$news, $count, $singular_fmt_key, $plural_fmt_key, $url='', $add_url=false)
+function add_news_line(&$news, $count, $singular_key, $plural_key, $url='', $add_url=false)
{
if ($count > 0)
{
- $line = l10n_dec($singular_fmt_key, $plural_fmt_key, $count);
+ $line = l10n_dec($singular_key, $plural_key, $count);
if ($add_url and !empty($url) )
{
$line = '<a href="'.$url.'">'.$line.'</a>';
}
- array_push($news, $line);
+ $news[] = $line;
}
}
/**
- * What's new between two dates ?
+ * Returns new activity between two dates.
*
- * Informations : number of new comments, number of new elements, number of
- * updated categories. Administrators are also informed about : number of
- * unvalidated comments, number of new users (TODO : number of unvalidated
- * elements)
+ * Takes in account: number of new comments, number of new elements, number of
+ * updated categories. Administrators are also informed about: number of
+ * unvalidated comments, number of new users.
+ * @todo number of unvalidated elements
*
- * @param string start date (mysql datetime format)
- * @param string end date (mysql datetime format)
- * @param bool exclude_img_cats if true, no info about new images/categories
- * @param bool add_url add html A link around news
- *
- * @return array of news
+ * @param string $start (mysql datetime format)
+ * @param string $end (mysql datetime format)
+ * @param bool $exclude_img_cats if true, no info about new images/categories
+ * @param bool $add_url add html link around news
+ * @return array
*/
-function news($start, $end, $exclude_img_cats=false, $add_url=false)
+function news($start=null, $end=null, $exclude_img_cats=false, $add_url=false)
{
$news = array();
@@ -425,10 +432,12 @@ function news($start, $end, $exclude_img_cats=false, $add_url=false)
}
/**
- * returns information about recently published elements grouped by post date
- * @param int max_dates maximum returned number of recent dates
- * @param int max_elements maximum returned number of elements per date
- * @param int max_cats maximum returned number of categories per date
+ * Returns information about recently published elements grouped by post date.
+ *
+ * @param int $max_dates maximum number of recent dates
+ * @param int $max_elements maximum number of elements per date
+ * @param int $max_cats maximum number of categories per date
+ * @return array
*/
function get_recent_post_dates($max_dates, $max_elements, $max_cats)
{
@@ -437,21 +446,17 @@ function get_recent_post_dates($max_dates, $max_elements, $max_cats)
$where_sql = get_std_sql_where_restrict_filter('WHERE', 'i.id', true);
$query = '
-SELECT date_available,
- COUNT(DISTINCT id) AS nb_elements,
- COUNT(DISTINCT category_id) AS nb_cats
+SELECT
+ date_available,
+ COUNT(DISTINCT id) AS nb_elements,
+ COUNT(DISTINCT category_id) AS nb_cats
FROM '.IMAGES_TABLE.' i INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON id=image_id
'.$where_sql.'
GROUP BY date_available
ORDER BY date_available DESC
LIMIT '.$max_dates.'
;';
- $result = pwg_query($query);
- $dates = array();
- while ($row = pwg_db_fetch_assoc($result))
- {
- array_push($dates, $row);
- }
+ $dates = array_from_query($query);
for ($i=0; $i<count($dates); $i++)
{
@@ -459,25 +464,24 @@ SELECT date_available,
{ // get some thumbnails ...
$query = '
SELECT DISTINCT i.*
- FROM '.IMAGES_TABLE.' i INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON id=image_id
+ FROM '.IMAGES_TABLE.' i
+ INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON id=image_id
'.$where_sql.'
AND date_available=\''.$dates[$i]['date_available'].'\'
ORDER BY '.DB_RANDOM_FUNCTION.'()
LIMIT '.$max_elements.'
;';
- $dates[$i]['elements'] = array();
- $result = pwg_query($query);
- while ($row = pwg_db_fetch_assoc($result))
- {
- array_push($dates[$i]['elements'], $row);
- }
+ $dates[$i]['elements'] = array_from_query($query);
}
if ($max_cats>0)
{// get some categories ...
$query = '
-SELECT DISTINCT c.uppercats, COUNT(DISTINCT i.id) AS img_count
- FROM '.IMAGES_TABLE.' i INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON i.id=image_id
+SELECT
+ DISTINCT c.uppercats,
+ COUNT(DISTINCT i.id) AS img_count
+ FROM '.IMAGES_TABLE.' i
+ INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON i.id=image_id
INNER JOIN '.CATEGORIES_TABLE.' c ON c.id=category_id
'.$where_sql.'
AND date_available=\''.$dates[$i]['date_available'].'\'
@@ -485,37 +489,37 @@ SELECT DISTINCT c.uppercats, COUNT(DISTINCT i.id) AS img_count
ORDER BY img_count DESC
LIMIT '.$max_cats.'
;';
- $dates[$i]['categories'] = array();
- $result = pwg_query($query);
- while ($row = pwg_db_fetch_assoc($result))
- {
- array_push($dates[$i]['categories'], $row);
- }
+ $dates[$i]['categories'] = array_from_query($query);
}
}
+
return $dates;
}
-/*
- Call function get_recent_post_dates but
- the parameters to be passed to the function, as an indexed array.
-
-*/
+/**
+ * Returns information about recently published elements grouped by post date.
+ * Same as get_recent_post_dates() but parameters as an indexed array.
+ * @see get_recent_post_dates()
+ *
+ * @param array $args
+ * @return array
+ */
function get_recent_post_dates_array($args)
{
- return
- get_recent_post_dates
- (
- (empty($args['max_dates']) ? 3 : $args['max_dates']),
- (empty($args['max_elements']) ? 3 : $args['max_elements']),
- (empty($args['max_cats']) ? 3 : $args['max_cats'])
+ return get_recent_post_dates(
+ (empty($args['max_dates']) ? 3 : $args['max_dates']),
+ (empty($args['max_elements']) ? 3 : $args['max_elements']),
+ (empty($args['max_cats']) ? 3 : $args['max_cats'])
);
}
/**
- * returns html description about recently published elements grouped by post date
- * @param $date_detail: selected date computed by get_recent_post_dates function
+ * Returns html description about recently published elements grouped by post date.
+ * @todo clean up HTML output, currently messy and invalid !
+ *
+ * @param array $date_detail returned value of get_recent_post_dates()
+ * @return string
*/
function get_html_description_recent_post_date($date_detail)
{
@@ -546,8 +550,7 @@ function get_html_description_recent_post_date($date_detail)
$description .=
'<li>'
- .l10n_dec('%d album updated', '%d albums updated',
- $date_detail['nb_cats'])
+ .l10n_dec('%d album updated', '%d albums updated', $date_detail['nb_cats'])
.'</li>';
$description .= '<ul>';
@@ -557,8 +560,7 @@ function get_html_description_recent_post_date($date_detail)
'<li>'
.get_cat_display_name_cache($cat['uppercats'])
.' ('.
- l10n_dec('%d new photo',
- '%d new photos', $cat['img_count']).')'
+ l10n_dec('%d new photo', '%d new photos', $cat['img_count']).')'
.'</li>';
}
$description .= '</ul>';
@@ -569,8 +571,10 @@ function get_html_description_recent_post_date($date_detail)
}
/**
- * returns title about recently published elements grouped by post date
- * @param $date_detail: selected date computed by get_recent_post_dates function
+ * Returns title about recently published elements grouped by post date.
+ *
+ * @param array $date_detail returned value of get_recent_post_dates()
+ * @return string
*/
function get_title_recent_post_date($date_detail)
{
@@ -585,15 +589,16 @@ function get_title_recent_post_date($date_detail)
return $title;
}
-if(!function_exists("strptime"))
+if (!function_exists('strptime'))
{
- function strptime($date, $fmt)
- {
- if ($fmt != '%Y-%m-%d %H:%M:%S')
- die('Invalid strptime format '.$fmt);
- list($y,$m,$d,$H,$M,$S) = preg_split('/[-: ]/', $date);
- $res = localtime( mktime($H,$M,$S,$m,$d,$y), true );
- return $res;
- }
- }
+ function strptime($date, $fmt)
+ {
+ if ($fmt != '%Y-%m-%d %H:%M:%S')
+ die('Invalid strptime format '.$fmt);
+ list($y,$m,$d,$H,$M,$S) = preg_split('/[-: ]/', $date);
+ $res = localtime( mktime($H,$M,$S,$m,$d,$y), true );
+ return $res;
+ }
+}
+
?> \ No newline at end of file
diff --git a/include/functions_picture.inc.php b/include/functions_picture.inc.php
index b8247fd23..ae3f944b0 100644
--- a/include/functions_picture.inc.php
+++ b/include/functions_picture.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,13 +21,18 @@
// | USA. |
// +-----------------------------------------------------------------------+
+/**
+ * @package functions\picture
+ */
-/*
- * get slideshow default params into array
- *
- * @param void
+
+/**
+ * Returns slideshow default params.
+ * - period
+ * - repeat
+ * - play
*
- * @return slideshow default values into array
+ * @return array
*/
function get_default_slideshow_params()
{
@@ -40,14 +45,13 @@ function get_default_slideshow_params()
);
}
-/*
- * check and correct slideshow params from array
- *
- * @param array of params
+/**
+ * Checks and corrects slideshow params
*
- * @return slideshow corrected values into array
+ * @param array $params
+ * @return array
*/
-function correct_slideshow_params($params = array())
+function correct_slideshow_params($params=array())
{
global $conf;
@@ -63,14 +67,13 @@ function correct_slideshow_params($params = array())
return $params;
}
-/*
- * Decode slideshow string params into array
+/**
+ * Decodes slideshow string params into array
*
- * @param string params like ""
- *
- * @return slideshow values into array
+ * @param string $encode_params
+ * @return array
*/
-function decode_slideshow_params($encode_params = null)
+function decode_slideshow_params($encode_params=null)
{
global $conf;
@@ -105,14 +108,13 @@ function decode_slideshow_params($encode_params = null)
return correct_slideshow_params($result);
}
-/*
- * Encode slideshow array params into array
- *
- * @param array params
+/**
+ * Encodes slideshow array params into a string
*
- * @return slideshow values into string
+ * @param array $decode_params
+ * @return string
*/
-function encode_slideshow_params($decode_params = array())
+function encode_slideshow_params($decode_params=array())
{
global $conf;
@@ -127,4 +129,5 @@ function encode_slideshow_params($decode_params = array())
return $result;
}
+
?> \ No newline at end of file
diff --git a/include/functions_plugins.inc.php b/include/functions_plugins.inc.php
index 7d6da7289..d71f58491 100644
--- a/include/functions_plugins.inc.php
+++ b/include/functions_plugins.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,25 +21,158 @@
// | USA. |
// +-----------------------------------------------------------------------+
-/*
-Events and event handlers are the core of Piwigo plugin management.
-Plugins are addons that are found in plugins subdirectory. If activated, PWG
-will include the index.php of each plugin.
-Events are triggered by PWG core code. Plugins (or even PWG itself) can
-register their functions to handle these events. An event is identified by a
-string.
-*/
+/**
+ * @package functions\plugins
+ */
-define('PHPWG_PLUGINS_PATH', PHPWG_ROOT_PATH.'plugins/');
+/** base directory of plugins */
+define('PHPWG_PLUGINS_PATH', PHPWG_ROOT_PATH.'plugins/');
+/** default priority for plugins handlers */
define('EVENT_HANDLER_PRIORITY_NEUTRAL', 50);
-/* Register a event handler.
+
+/**
+ * Used to declare maintenance methods of a plugin.
+ */
+abstract class PluginMaintain
+{
+ /** @var string $plugin_id */
+ protected $plugin_id;
+
+ /**
+ * @param string $id
+ */
+ function __construct($id)
+ {
+ $this->plugin_id = $id;
+ }
+
+ /**
+ * @param string $plugin_version
+ * @param array &$errors - used to return error messages
+ */
+ abstract function install($plugin_version, &$errors=array());
+
+ /**
+ * @param string $plugin_version
+ * @param array &$errors - used to return error messages
+ */
+ abstract function activate($plugin_version, &$errors=array());
+
+ abstract function deactivate();
+
+ abstract function uninstall();
+
+ /**
+ * Tests if the plugin needs to be updated and call an update function
+ *
+ * @param string $version version exposed by the plugin (potentially new)
+ * @param string $on_update name of a method to call when an update is needed
+ * it receives the previous version as first parameter
+ */
+ function autoUpdate($version, $on_update=null)
+ {
+ global $pwg_loaded_plugins;
+
+ $current_version = $pwg_loaded_plugins[$this->plugin_id]['version'];
+
+ if ( $version == 'auto' or $current_version == 'auto'
+ or safe_version_compare($current_version, $version, '<')
+ )
+ {
+ if (!empty($on_update))
+ {
+ call_user_func(array(&$this, $on_update), $current_version);
+ }
+
+ if ($version != 'auto')
+ {
+ $query = '
+UPDATE '. PLUGINS_TABLE .'
+ SET version = "'. $version .'"
+ WHERE id = "'. $this->plugin_id .'"
+;';
+ pwg_query($query);
+
+ $pwg_loaded_plugins[$this->plugin_id]['version'] = $version;
+ }
+ }
+ }
+}
+
+/**
+ * Used to declare maintenance methods of a theme.
+ */
+abstract class ThemeMaintain
+{
+ /** @var string $theme_id */
+ protected $theme_id;
+
+ /**
+ * @param string $id
+ */
+ function __construct($id)
+ {
+ $this->theme_id = $id;
+ }
+
+ /**
+ * @param string $theme_version
+ * @param array &$errors - used to return error messages
+ */
+ abstract function activate($theme_version, &$errors=array());
+
+ abstract function deactivate();
+
+ abstract function delete();
+
+ /**
+ * Tests if the theme needs to be updated and call an update function
+ *
+ * @param string $version version exposed by the theme (potentially new)
+ * @param string $on_update name of a method to call when an update is needed
+ * it receives the previous version as first parameter
+ */
+ function autoUpdate($version, $on_update=null)
+ {
+ $query = '
+SELECT version
+ FROM '. THEMES_TABLE .'
+ WHERE id = "'. $this->theme_id .'"
+;';
+ list($current_version) = pwg_db_fetch_row(pwg_query($query));
+
+ if ( $version == 'auto' or $current_version == 'auto'
+ or safe_version_compare($current_version, $version, '<')
+ )
+ {
+ if (!empty($on_update))
+ {
+ call_user_func(array(&$this, $on_update), $current_version);
+ }
+
+ if ($version != 'auto')
+ {
+ $query = '
+UPDATE '. THEMES_TABLE .'
+ SET version = "'. $version .'"
+ WHERE id = "'. $this->theme_id .'"
+;';
+ pwg_query($query);
+ }
+ }
+ }
+}
+
+
+/**
+ * Register an event handler.
+ *
* @param string $event the name of the event to listen to
- * @param mixed $func the function that will handle the event
- * @param int $priority optional priority (greater priority will
- * be executed at last)
-*/
+ * @param Callable $func the callback function
+ * @param int $priority greater priority will be executed at last
+ */
function add_event_handler($event, $func,
$priority=EVENT_HANDLER_PRIORITY_NEUTRAL, $accepted_args=1)
{
@@ -64,12 +197,14 @@ function add_event_handler($event, $func,
return true;
}
-/* Register a event handler.
- * @param string $event the name of the event to listen to
- * @param mixed $func the function that needs removal
- * @param int $priority optional priority (greater priority will
- * be executed at last)
-*/
+/**
+ * Removes an event handler.
+ * @see add_event_handler()
+ *
+ * @param string $event
+ * @param Callable $func
+ * @param int $priority
+ */
function remove_event_handler($event, $func,
$priority=EVENT_HANDLER_PRIORITY_NEUTRAL)
{
@@ -101,10 +236,29 @@ function remove_event_handler($event, $func,
return false;
}
-/* Triggers an event and calls all registered event handlers
- * @param string $event name of the event
- * @param mixed $data data to pass to handlers
-*/
+/**
+ * Triggers a modifier event and calls all registered event handlers.
+ * trigger_change() is used as a modifier: it allows to transmit _$data_
+ * through all handlers, thus each handler MUST return a value,
+ * optional _$args_ are not transmitted.
+ *
+ * @since 2.6
+ * @todo remove trigger_event()
+ *
+ * @param string $event
+ * @param mixed $data data to transmit to all handlers
+ * @param mixed $args,... optional arguments
+ * @return mixed $data
+ */
+function trigger_change($event, $data=null)
+{
+ return call_user_func_array('trigger_event', func_get_args());
+}
+
+/**
+ * @deprecated 2.6
+ * @see trigger_change
+ */
function trigger_event($event, $data=null)
{
global $pwg_event_handlers;
@@ -136,13 +290,32 @@ function trigger_event($event, $data=null)
return $data;
}
-function trigger_action($event, $data=null)
+/**
+ * Triggers a notifier event and calls all registered event handlers.
+ * trigger_notify() is only used as a notifier, no modification of data is possible
+ *
+ * @since 2.6
+ * @todo remove trigger_action()
+ *
+ * @param string $event
+ * @param mixed $args,... optional arguments
+ */
+function trigger_notify($event)
+{
+ return call_user_func_array('trigger_action', func_get_args());
+}
+
+/**
+ * @deprecated 2.6
+ * @see trigger_notify
+ */
+function trigger_action($event)
{
global $pwg_event_handlers;
if ( isset($pwg_event_handlers['trigger']) and $event!='trigger' )
{// special case for debugging - avoid recursive calls
trigger_action('trigger',
- array('type'=>'action', 'event'=>$event, 'data'=>$data) );
+ array('type'=>'action', 'event'=>$event, 'data'=>null) );
}
if ( !isset($pwg_event_handlers[$event]) )
@@ -163,11 +336,14 @@ function trigger_action($event, $data=null)
}
}
-/** Saves some data with the associated plugim id. It can be retrieved later (
- * during this script lifetime) using get_plugin_data
- * @param string plugin_id
- * @param mixed data
- * returns true on success, false otherwise
+/**
+ * Saves some data with the associated plugin id, data are only available
+ * during script lifetime.
+ * @depracted 2.6
+ *
+ * @param string $plugin_id
+ * @param mixed &$data
+ * @return bool
*/
function set_plugin_data($plugin_id, &$data)
{
@@ -180,23 +356,31 @@ function set_plugin_data($plugin_id, &$data)
return false;
}
-/** Retrieves plugin data saved previously with set_plugin_data
- * @param string plugin_id
+/**
+ * Retrieves plugin data saved previously with set_plugin_data.
+ * @see set_plugin_data()
+ * @depracted 2.6
+ *
+ * @param string $plugin_id
+ * @return mixed
*/
function &get_plugin_data($plugin_id)
{
global $pwg_loaded_plugins;
- if ( isset($pwg_loaded_plugins[$plugin_id]) )
+ if ( isset($pwg_loaded_plugins[$plugin_id]['plugin_data']) )
{
return $pwg_loaded_plugins[$plugin_id]['plugin_data'];
}
return null;
}
-/* Returns an array of plugins defined in the database
- * @param string $state optional filter on this state
- * @param string $id optional returns only data about given plugin
-*/
+/**
+ * Returns an array of plugins defined in the database.
+ *
+ * @param string $state optional filter
+ * @param string $id returns only data about given plugin
+ * @return array
+ */
function get_db_plugins($state='', $id='')
{
$query = '
@@ -220,12 +404,16 @@ SELECT * FROM '.PLUGINS_TABLE;
$plugins = array();
while ($row = pwg_db_fetch_assoc($result))
{
- array_push($plugins, $row);
+ $plugins[] = $row;
}
return $plugins;
}
-
+/**
+ * Loads a plugin, it includes the main.inc.php file and updates _$pwg_loaded_plugins_.
+ *
+ * @param string $plugin
+ */
function load_plugin($plugin)
{
$file_name = PHPWG_PLUGINS_PATH.$plugin['id'].'/main.inc.php';
@@ -237,7 +425,9 @@ function load_plugin($plugin)
}
}
-/*loads all the plugins on startup*/
+/**
+ * Loads all the registered plugins.
+ */
function load_plugins()
{
global $conf, $pwg_loaded_plugins;
@@ -252,4 +442,5 @@ function load_plugins()
trigger_action('plugins_loaded');
}
}
+
?> \ No newline at end of file
diff --git a/include/functions_rate.inc.php b/include/functions_rate.inc.php
index d0319bd5c..2644caad9 100644
--- a/include/functions_rate.inc.php
+++ b/include/functions_rate.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,11 +22,16 @@
// +-----------------------------------------------------------------------+
/**
- * rate a picture by a user
+ * @package functions\rate
+ */
+
+
+/**
+ * Rate a picture by the current user.
*
- * @param int image identifier
- * @param int rate
- * @return void
+ * @param int $image_id
+ * @param float $rate
+ * @return array as return by update_rating_score()
*/
function rate_picture($image_id, $rate)
{
@@ -120,13 +125,14 @@ INSERT
}
-/* update images.rating_score field
- * we use a bayesian average (http://en.wikipedia.org/wiki/Bayesian_average) with
-C = average number of rates per item
-m = global average rate (all rates)
-
- * param int $element_id optional, otherwise applies to all
- * @return array(rating_score, count) if element_id is specified
+/**
+ * Update images.rating_score field.
+ * We use a bayesian average (http://en.wikipedia.org/wiki/Bayesian_average) with
+ * C = average number of rates per item
+ * m = global average rate (all rates)
+ *
+ * @param int|false $element_id if false applies to all
+ * @return array (score, average, count) values are null if $element_id is false
*/
function update_rating_score($element_id = false)
{
diff --git a/include/functions_search.inc.php b/include/functions_search.inc.php
index 66be23bb4..9cf50d602 100644
--- a/include/functions_search.inc.php
+++ b/include/functions_search.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,12 +21,16 @@
// | USA. |
// +-----------------------------------------------------------------------+
+/**
+ * @package functions\search
+ */
+
/**
- * returns search rules stored into a serialized array in "search"
+ * Returns search rules stored into a serialized array in "search"
* table. Each search rules set is numericaly identified.
*
- * @param int search_id
+ * @param int $search_id
* @return array
*/
function get_search_array($search_id)
@@ -47,12 +51,10 @@ SELECT rules
}
/**
- * returns the SQL clause from a search identifier
+ * Returns the SQL clause for a search.
+ * Transforms the array returned by get_search_array() into SQL sub-query.
*
- * Search rules are stored in search table as a serialized array. This array
- * need to be transformed into an SQL clause to be used in queries.
- *
- * @param array search
+ * @param array $search
* @return string
*/
function get_sql_search_clause($search)
@@ -68,18 +70,15 @@ function get_sql_search_clause($search)
$local_clauses = array();
foreach ($search['fields'][$textfield]['words'] as $word)
{
- array_push($local_clauses, $textfield." LIKE '%".$word."%'");
+ $local_clauses[] = $textfield." LIKE '%".$word."%'";
}
// adds brackets around where clauses
$local_clauses = prepend_append_array_items($local_clauses, '(', ')');
- array_push(
- $clauses,
- implode(
- ' '.$search['fields'][$textfield]['mode'].' ',
- $local_clauses
- )
+ $clauses[] = implode(
+ ' '.$search['fields'][$textfield]['mode'].' ',
+ $local_clauses
);
}
}
@@ -100,15 +99,12 @@ function get_sql_search_clause($search)
$field_clauses = array();
foreach ($fields as $field)
{
- array_push($field_clauses, $field." LIKE '%".$word."%'");
+ $field_clauses[] = $field." LIKE '%".$word."%'";
}
// adds brackets around where clauses
- array_push(
- $word_clauses,
- implode(
- "\n OR ",
- $field_clauses
- )
+ $word_clauses[] = implode(
+ "\n OR ",
+ $field_clauses
);
}
@@ -117,26 +113,24 @@ function get_sql_search_clause($search)
create_function('&$s','$s="(".$s.")";')
);
- array_push(
- $clauses,
- "\n ".
+ // make sure the "mode" is either OR or AND
+ if ($search['fields']['allwords']['mode'] != 'AND' and $search['fields']['allwords']['mode'] != 'OR')
+ {
+ $search['fields']['allwords']['mode'] = 'AND';
+ }
+
+ $clauses[] = "\n ".
implode(
- "\n ".
- $search['fields']['allwords']['mode'].
- "\n ",
+ "\n ". $search['fields']['allwords']['mode']. "\n ",
$word_clauses
- )
- );
+ );
}
foreach (array('date_available', 'date_creation') as $datefield)
{
if (isset($search['fields'][$datefield]))
{
- array_push(
- $clauses,
- $datefield." = '".$search['fields'][$datefield]['date']."'"
- );
+ $clauses[] = $datefield." = '".$search['fields'][$datefield]['date']."'";
}
foreach (array('after','before') as $suffix)
@@ -145,15 +139,10 @@ function get_sql_search_clause($search)
if (isset($search['fields'][$key]))
{
- array_push(
- $clauses,
-
- $datefield.
+ $clauses[] = $datefield.
($suffix == 'after' ? ' >' : ' <').
($search['fields'][$key]['inc'] ? '=' : '').
- " '".$search['fields'][$key]['date']."'"
-
- );
+ " '".$search['fields'][$key]['date']."'";
}
}
}
@@ -171,7 +160,7 @@ function get_sql_search_clause($search)
}
$local_clause = 'category_id IN ('.implode(',', $cat_ids).')';
- array_push($clauses, $local_clause);
+ $clauses[] = $local_clause;
}
// adds brackets around where clauses
@@ -189,12 +178,13 @@ function get_sql_search_clause($search)
}
/**
- * returns the list of items corresponding to the advanced search array
+ * Returns the list of items corresponding to the advanced search array.
*
- * @param array search
+ * @param array $search
+ * @param string $images_where optional additional restriction on images table
* @return array
*/
-function get_regular_search_results($search, $images_where)
+function get_regular_search_results($search, $images_where='')
{
global $conf;
$forbidden = get_sql_condition_FandF(
@@ -265,34 +255,55 @@ SELECT DISTINCT(id)
return $items;
}
-
+/**
+ * Finds if a char is a letter, a figure or any char of the extended ASCII table (>127).
+ *
+ * @param char $ch
+ * @return bool
+ */
function is_word_char($ch)
{
return ($ch>='0' && $ch<='9') || ($ch>='a' && $ch<='z') || ($ch>='A' && $ch<='Z') || ord($ch)>127;
}
+/**
+ * Finds if a char is a special token for word start: [{<=*+
+ *
+ * @param char $ch
+ * @return bool
+ */
function is_odd_wbreak_begin($ch)
{
return strpos('[{<=*+', $ch)===false ? false:true;
}
+/**
+ * Finds if a char is a special token for word end: ]}>=*+
+ *
+ * @param char $ch
+ * @return bool
+ */
function is_odd_wbreak_end($ch)
{
return strpos(']}>=*+', $ch)===false ? false:true;
}
-define('QST_QUOTED', 0x01);
-define('QST_NOT', 0x02);
-define('QST_WILDCARD_BEGIN',0x04);
-define('QST_WILDCARD_END', 0x08);
-define('QST_WILDCARD', QST_WILDCARD_BEGIN|QST_WILDCARD_END);
+define('QST_QUOTED', 0x01);
+define('QST_NOT', 0x02);
+define('QST_WILDCARD_BEGIN', 0x04);
+define('QST_WILDCARD_END', 0x08);
+define('QST_WILDCARD', QST_WILDCARD_BEGIN|QST_WILDCARD_END);
/**
- * analyzes and splits the quick/query search query $q into tokens
+ * Analyzes and splits the quick/query search query $q into tokens.
* q='john bill' => 2 tokens 'john' 'bill'
* Special characters for MySql full text search (+,<,>,~) appear in the token modifiers.
* The query can contain a phrase: 'Pierre "New York"' will return 'pierre' qnd 'new york'.
+ *
+ * @param string $q
+ * @param array &$qtokens
+ * @param array &$qtoken_modifiers
*/
function analyse_qsearch($q, &$qtokens, &$qtoken_modifiers)
{
@@ -372,12 +383,12 @@ function analyse_qsearch($q, &$qtokens, &$qtoken_modifiers)
$qtoken_modifiers = array();
for ($i=0; $i<count($tokens); $i++)
{
- if (strstr($token_modifiers[$i], 'q')===false)
+ if ( !($token_modifiers[$i] & QST_QUOTED) )
{
if ( substr($tokens[$i], -1)=='*' )
{
$tokens[$i] = rtrim($tokens[$i], '*');
- $token_modifiers[$i] .= '*';
+ $token_modifiers[$i] |= QST_WILDCARD_END;
}
}
if ( strlen($tokens[$i])==0)
@@ -387,11 +398,15 @@ function analyse_qsearch($q, &$qtokens, &$qtoken_modifiers)
}
}
-
/**
- * returns the LIKE sql clause corresponding to the quick search query
- * that has been split into tokens
+ * Returns the LIKE SQL clause corresponding to the quick search query
+ * that has been split into tokens.
* for example file LIKE '%john%' OR file LIKE '%bill%'.
+ *
+ * @param array $tokens
+ * @param array $token_modifiers
+ * @param string $field
+ * @return string|null
*/
function get_qsearch_like_clause($tokens, $token_modifiers, $field)
{
@@ -412,7 +427,14 @@ function get_qsearch_like_clause($tokens, $token_modifiers, $field)
}
/**
-*/
+ * Returns tags corresponding to the quick search query that has been split into tokens.
+ *
+ * @param array $tokens
+ * @param array $token_modifiers
+ * @param array &$token_tag_ids
+ * @param array &$not_tag_ids
+ * @param array &$all_tags
+ */
function get_qsearch_tags($tokens, $token_modifiers, &$token_tag_ids, &$not_tag_ids, &$all_tags)
{
$token_tag_ids = array_fill(0, count($tokens), array() );
@@ -549,6 +571,8 @@ SELECT t.*, COUNT(image_id) AS counter
{
array_splice($token_tag_ids[$i], $j, 1);
array_splice($token_tag_scores[$i], $j, 1);
+ $j--;
+ continue;
}
$counter += $all_tags[$tag_id]['counter'];
@@ -560,27 +584,30 @@ SELECT t.*, COUNT(image_id) AS counter
}
}
}
-
+
usort($all_tags, 'tag_alpha_compare');
foreach ( $all_tags as &$tag )
- $tag['name'] = trigger_event('render_tag_name', $tag['name']);
+ {
+ $tag['name'] = trigger_event('render_tag_name', $tag['name'], $tag);
+ }
}
/**
- * returns the search results corresponding to a quick/query search.
+ * Returns the search results corresponding to a quick/query search.
* A quick/query search returns many items (search is not strict), but results
* are sorted by relevance unless $super_order_by is true. Returns:
- * array (
- * 'items' => array(85,68,79...)
- * 'qs' => array(
- * 'matching_tags' => array of matching tags
- * 'matching_cats' => array of matching categories
- * 'matching_cats_no_images' =>array(99) - matching categories without images
- * ))
+ * array (
+ * 'items' => array of matching images
+ * 'qs' => array(
+ * 'matching_tags' => array of matching tags
+ * 'matching_cats' => array of matching categories
+ * 'matching_cats_no_images' =>array(99) - matching categories without images
+ * )
+ * )
*
- * @param string q
- * @param bool super_order_by
- * @param string images_where optional aditional restriction on images table
+ * @param string $q
+ * @param bool $super_order_by
+ * @param string $images_where optional additional restriction on images table
* @return array
*/
function get_quick_search_results($q, $super_order_by, $images_where='')
@@ -766,22 +793,26 @@ SELECT DISTINCT(id)
$allowed_images = array_flip( $allowed_images );
$divisor = 5.0 * count($allowed_images);
- foreach ($allowed_images as $id=>$rank )
+ foreach ($allowed_images as $id=> &$rank )
{
$weight = isset($by_weights[$id]) ? $by_weights[$id] : 1;
$weight -= $rank/$divisor;
- $allowed_images[$id] = $weight;
+ $rank = $weight;
}
+ unset($rank);
+
arsort($allowed_images, SORT_NUMERIC);
$search_results['items'] = array_keys($allowed_images);
return $search_results;
}
/**
- * returns an array of 'items' corresponding to the search id
+ * Returns an array of 'items' corresponding to the search id.
+ * It can be either a quick search or a regular search.
*
- * @param int search id
- * @param string images_where optional aditional restriction on images table
+ * @param int $search_id
+ * @param bool $super_order_by
+ * @param string $images_where optional aditional restriction on images table
* @return array
*/
function get_search_results($search_id, $super_order_by, $images_where='')
@@ -797,4 +828,5 @@ function get_search_results($search_id, $super_order_by, $images_where='')
return get_quick_search_results($search['q'], $super_order_by, $images_where);
}
}
+
?> \ No newline at end of file
diff --git a/include/functions_session.inc.php b/include/functions_session.inc.php
index 213fceb21..24cffea57 100644
--- a/include/functions_session.inc.php
+++ b/include/functions_session.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,62 +21,74 @@
// | USA. |
// +-----------------------------------------------------------------------+
-// The function generate_key creates a string with pseudo random characters.
-// the size of the string depends on the $conf['session_id_size'].
-// Characters used are a-z A-Z and numerical values. Examples :
-// "Er4Tgh6", "Rrp08P", "54gj"
-// input : none (using global variable)
-// output : $key
-function generate_key($size)
-{
- global $conf;
+/**
+ * @package functions\session
+ */
- $md5 = md5(substr(microtime(), 2, 6));
- $init = '';
- for ( $i = 0; $i < strlen( $md5 ); $i++ )
- {
- if ( is_numeric( $md5[$i] ) ) $init.= $md5[$i];
- }
- $init = substr( $init, 0, 8 );
- mt_srand( $init );
- $key = '';
- for ( $i = 0; $i < $size; $i++ )
- {
- $c = mt_rand( 0, 2 );
- if ( $c == 0 ) $key .= chr( mt_rand( 65, 90 ) );
- else if ( $c == 1 ) $key .= chr( mt_rand( 97, 122 ) );
- else $key .= mt_rand( 0, 9 );
- }
- return $key;
-}
if (isset($conf['session_save_handler'])
and ($conf['session_save_handler'] == 'db')
and defined('PHPWG_INSTALLED'))
{
- session_set_save_handler('pwg_session_open',
+ session_set_save_handler(
+ 'pwg_session_open',
'pwg_session_close',
'pwg_session_read',
'pwg_session_write',
'pwg_session_destroy',
'pwg_session_gc'
);
- if ( function_exists('ini_set') )
+
+ if (function_exists('ini_set'))
{
ini_set('session.use_cookies', $conf['session_use_cookies']);
ini_set('session.use_only_cookies', $conf['session_use_only_cookies']);
ini_set('session.use_trans_sid', intval($conf['session_use_trans_sid']));
ini_set('session.cookie_httponly', 1);
}
+
session_name($conf['session_name']);
session_set_cookie_params(0, cookie_path());
register_shutdown_function('session_write_close');
}
+
+/**
+ * Generates a pseudo random string.
+ * Characters used are a-z A-Z and numerical values.
+ *
+ * @param int $size
+ * @return string
+ */
+function generate_key($size)
+{
+ global $conf;
+
+ $md5 = md5(substr(microtime(), 2, 6));
+ $init = '';
+ for ( $i = 0; $i < strlen( $md5 ); $i++ )
+ {
+ if ( is_numeric( $md5[$i] ) ) $init.= $md5[$i];
+ }
+ $init = substr( $init, 0, 8 );
+ mt_srand( $init );
+ $key = '';
+ for ( $i = 0; $i < $size; $i++ )
+ {
+ $c = mt_rand( 0, 2 );
+ if ( $c == 0 ) $key .= chr( mt_rand( 65, 90 ) );
+ else if ( $c == 1 ) $key .= chr( mt_rand( 97, 122 ) );
+ else $key .= mt_rand( 0, 9 );
+ }
+ return $key;
+}
+
/**
- * returns true; used when the session_start() function is called
+ * Called by PHP session manager, always return true.
*
- * @params not use but useful for php engine
+ * @param string $path
+ * @param sring $name
+ * @return true
*/
function pwg_session_open($path, $name)
{
@@ -84,14 +96,20 @@ function pwg_session_open($path, $name)
}
/**
- * returns true; used when the session is closed (unset($_SESSION))
+ * Called by PHP session manager, always return true.
*
+ * @return true
*/
function pwg_session_close()
{
return true;
}
+/**
+ * Returns a hash from current user IP
+ *
+ * @return string
+ */
function get_remote_addr_session_hash()
{
global $conf;
@@ -112,11 +130,10 @@ function get_remote_addr_session_hash()
}
/**
- * this function returns
- * a string corresponding to the value of the variable save in the session
- * or an empty string when the variable doesn't exist
+ * Called by PHP session manager, retrieves data stored in the sessions table.
*
- * @param string session id
+ * @param string $session_id
+ * @return string
*/
function pwg_session_read($session_id)
{
@@ -138,10 +155,11 @@ SELECT data
}
/**
- * returns true; writes set a variable in the active session
+ * Called by PHP session manager, writes data in the sessions table.
*
- * @param string session id
- * @data string value of date to be saved
+ * @param string $session_id
+ * @param sring $data
+ * @return true
*/
function pwg_session_write($session_id, $data)
{
@@ -155,9 +173,10 @@ REPLACE INTO '.SESSIONS_TABLE.'
}
/**
- * returns true; delete the active session
+ * Called by PHP session manager, deletes data in the sessions table.
*
- * @param string session id
+ * @param string $session_id
+ * @return true
*/
function pwg_session_destroy($session_id)
{
@@ -171,8 +190,9 @@ DELETE
}
/**
- * returns true; delete expired sessions
- * called each time a session is closed.
+ * Called by PHP session manager, garbage collector for expired sessions.
+ *
+ * @return true
*/
function pwg_session_gc()
{
@@ -188,12 +208,12 @@ DELETE
return true;
}
-
/**
- * persistently stores a variable for the current session
- * currently we use standard php sessions but it might change
- * @return boolean true on success
- * @see pwg_get_session_var, pwg_unset_session_var
+ * Persistently stores a variable for the current session.
+ *
+ * @param string $var
+ * @param mixed $value
+ * @return bool
*/
function pwg_set_session_var($var, $value)
{
@@ -204,10 +224,11 @@ function pwg_set_session_var($var, $value)
}
/**
- * retrieves the value of a persistent variable for the current session
- * currently we use standard php sessions but it might change
+ * Retrieves the value of a persistent variable for the current session.
+ *
+ * @param string $var
+ * @param mixed $default
* @return mixed
- * @see pwg_set_session_var, pwg_unset_session_var
*/
function pwg_get_session_var($var, $default = null)
{
@@ -219,10 +240,10 @@ function pwg_get_session_var($var, $default = null)
}
/**
- * deletes a persistent variable for the current session
- * currently we use standard php sessions but it might change
- * @return boolean true on success
- * @see pwg_set_session_var, pwg_get_session_var
+ * Deletes a persistent variable for the current session.
+ *
+ * @param string $var
+ * @return bool
*/
function pwg_unset_session_var($var)
{
@@ -232,4 +253,4 @@ function pwg_unset_session_var($var)
return true;
}
-?>
+?> \ No newline at end of file
diff --git a/include/functions_tag.inc.php b/include/functions_tag.inc.php
index 5766b9509..6e047c502 100644
--- a/include/functions_tag.inc.php
+++ b/include/functions_tag.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,16 +21,36 @@
// | USA. |
// +-----------------------------------------------------------------------+
+/**
+ * @package functions\tag
+ */
+
/**
- * Tags available. Each return tag is represented as an array with its id,
- * its name, its weight (count), its url name. Tags are not sorted.
+ * Returns the number of available tags for the connected user.
*
- * The returned list can be a subset of all existing tags due to
- * permissions, only if a list of forbidden categories is provided
+ * @return int
+ */
+function get_nb_available_tags()
+{
+ global $user;
+ if (!isset($user['nb_available_tags']))
+ {
+ $user['nb_available_tags'] = count(get_available_tags());
+ single_update(USER_CACHE_TABLE,
+ array('nb_available_tags'=>$user['nb_available_tags']),
+ array('user_id'=>$user['id'])
+ );
+ }
+ return $user['nb_available_tags'];
+}
+
+/**
+ * Returns all available tags for the connected user (not sorted).
+ * The returned list can be a subset of all existing tags due to permissions,
+ * also tags with no images are not returned.
*
- * @param array forbidden categories
- * @return array
+ * @return array [id, name, counter, url_name]
*/
function get_available_tags()
{
@@ -38,18 +58,18 @@ function get_available_tags()
$query = '
SELECT tag_id, COUNT(DISTINCT(it.image_id)) AS counter
FROM '.IMAGE_CATEGORY_TABLE.' ic
- INNER JOIN '.IMAGE_TAG_TABLE.' it ON ic.image_id=it.image_id'.get_sql_condition_FandF
- (
- array
- (
- 'forbidden_categories' => 'category_id',
- 'visible_categories' => 'category_id',
- 'visible_images' => 'ic.image_id'
- ),
- '
- WHERE'
+ INNER JOIN '.IMAGE_TAG_TABLE.' it
+ ON ic.image_id=it.image_id
+ '.get_sql_condition_FandF(
+ array(
+ 'forbidden_categories' => 'category_id',
+ 'visible_categories' => 'category_id',
+ 'visible_images' => 'ic.image_id'
+ ),
+ ' WHERE '
).'
- GROUP BY tag_id';
+ GROUP BY tag_id
+;';
$tag_counters = simple_hash_from_query($query, 'tag_id', 'counter');
if ( empty($tag_counters) )
@@ -61,6 +81,7 @@ SELECT tag_id, COUNT(DISTINCT(it.image_id)) AS counter
SELECT *
FROM '.TAGS_TABLE;
$result = pwg_query($query);
+
$tags = array();
while ($row = pwg_db_fetch_assoc($result))
{
@@ -68,7 +89,7 @@ SELECT *
if ( $counter )
{
$row['counter'] = $counter;
- $row['name'] = trigger_event('render_tag_name', $row['name']);
+ $row['name'] = trigger_event('render_tag_name', $row['name'], $row);
$tags[] = $row;
}
}
@@ -76,9 +97,9 @@ SELECT *
}
/**
- * All tags, even tags associated to no image.
+ * Returns all tags even associated to no image.
*
- * @return array
+ * @return array [id, name, url_name]
*/
function get_all_tags()
{
@@ -90,7 +111,7 @@ SELECT *
$tags = array();
while ($row = pwg_db_fetch_assoc($result))
{
- $row['name'] = trigger_event('render_tag_name', $row['name']);
+ $row['name'] = trigger_event('render_tag_name', $row['name'], $row);
$tags[] = $row;
}
@@ -104,11 +125,11 @@ SELECT *
* level of each tag.
*
* The level of each tag depends on the average count of tags. This
- * calcylation method avoid having very different levels for tags having
+ * calculation method avoid having very different levels for tags having
* nearly the same count when set are small.
*
- * @param array tags
- * @return array
+ * @param array $tags at least [id, counter]
+ * @return array [..., level]
*/
function add_level_to_tags($tags)
{
@@ -158,13 +179,14 @@ function add_level_to_tags($tags)
}
/**
- * return the list of image ids corresponding to given tags. AND & OR mode
- * supported.
+ * Return the list of image ids corresponding to given tags.
+ * AND & OR mode supported.
*
- * @param array tag ids
+ * @param int[] $tag_ids
* @param string mode
- * @param string extra_images_where_sql - optionally apply a sql where filter to retrieved images
- * @param string order_by - optionally overwrite default photo order
+ * @param string $extra_images_where_sql - optionally apply a sql where filter to retrieved images
+ * @param string $order_by - optionally overwrite default photo order
+ * @param bool $user_permissions
* @return array
*/
function get_image_ids_for_tags($tag_ids, $mode='AND', $extra_images_where_sql='', $order_by='', $use_permissions=true)
@@ -175,7 +197,8 @@ function get_image_ids_for_tags($tag_ids, $mode='AND', $extra_images_where_sql='
return array();
}
- $query = 'SELECT id
+ $query = '
+SELECT id
FROM '.IMAGES_TABLE.' i ';
if ($use_permissions)
@@ -214,14 +237,14 @@ function get_image_ids_for_tags($tag_ids, $mode='AND', $extra_images_where_sql='
}
/**
- * return a list of tags corresponding to given items.
+ * Return a list of tags corresponding to given items.
*
- * @param array items
- * @param array max_tags
- * @param array excluded_tag_ids
- * @return array
+ * @param int[] $items
+ * @param int $max_tags
+ * @param int[] $excluded_tag_ids
+ * @return array [id, name, counter, url_name]
*/
-function get_common_tags($items, $max_tags, $excluded_tag_ids=null)
+function get_common_tags($items, $max_tags, $excluded_tag_ids=array())
{
if (empty($items))
{
@@ -241,7 +264,7 @@ SELECT t.*, count(*) AS counter
GROUP BY t.id
ORDER BY ';
if ($max_tags>0)
- {
+ { // TODO : why ORDER field is in the if ?
$query .= 'counter DESC
LIMIT '.$max_tags;
}
@@ -254,7 +277,7 @@ SELECT t.*, count(*) AS counter
$tags = array();
while($row = pwg_db_fetch_assoc($result))
{
- $row['name'] = trigger_event('render_tag_name', $row['name']);
+ $row['name'] = trigger_event('render_tag_name', $row['name'], $row);
$tags[] = $row;
}
usort($tags, 'tag_alpha_compare');
@@ -262,45 +285,29 @@ SELECT t.*, count(*) AS counter
}
/**
- * return a list of tags corresponding to any of ids, url_names, names
+ * Return a list of tags corresponding to any of ids, url_names or names.
*
- * @param array ids
- * @param array url_names
- * @param array names
- * @return array
+ * @param int[] $ids
+ * @param string[] $url_names
+ * @param string[] $names
+ * @return array [id, name, url_name]
*/
-function find_tags($ids, $url_names=array(), $names=array() )
+function find_tags($ids=array(), $url_names=array(), $names=array() )
{
$where_clauses = array();
- if ( !empty($ids) )
+ if (!empty($ids))
{
$where_clauses[] = 'id IN ('.implode(',', $ids).')';
}
- if ( !empty($url_names) )
+ if (!empty($url_names))
{
$where_clauses[] =
- 'url_name IN ('.
- implode(
- ',',
- array_map(
- create_function('$s', 'return "\'".$s."\'";'),
- $url_names
- )
- )
- .')';
+ 'url_name IN (\''. implode('\', \'', $url_names) .'\')';
}
- if ( !empty($names) )
+ if (!empty($names))
{
$where_clauses[] =
- 'name IN ('.
- implode(
- ',',
- array_map(
- create_function('$s', 'return "\'".$s."\'";'),
- $names
- )
- )
- .')';
+ 'name IN (\''. implode('\', \'', $names) .'\')';
}
if (empty($where_clauses))
{
@@ -317,8 +324,9 @@ SELECT *
$tags = array();
while ($row = pwg_db_fetch_assoc($result))
{
- array_push($tags, $row);
+ $tags[] = $row;
}
return $tags;
}
+
?> \ No newline at end of file
diff --git a/include/functions_url.inc.php b/include/functions_url.inc.php
index 787c06780..d8c49f372 100644
--- a/include/functions_url.inc.php
+++ b/include/functions_url.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -51,9 +51,11 @@ function get_absolute_root_url($with_scheme=true)
$url = '';
if ($with_scheme)
{
+ $is_https = false;
if (isset($_SERVER['HTTPS']) &&
- ((strtolower($_SERVER['HTTPS']) == 'on') or ($_SERVER['HTTPS'] == 1)))
+ ((strtolower($_SERVER['HTTPS']) == 'on') or ($_SERVER['HTTPS'] == 1)))
{
+ $is_https = true;
$url .= 'https://';
}
else
@@ -61,7 +63,8 @@ function get_absolute_root_url($with_scheme=true)
$url .= 'http://';
}
$url .= $_SERVER['HTTP_HOST'];
- if ($_SERVER['SERVER_PORT'] != 80)
+ if ( (!$is_https && $_SERVER['SERVER_PORT'] != 80)
+ ||($is_https && $_SERVER['SERVER_PORT'] != 443))
{
$url_port = ':'.$_SERVER['SERVER_PORT'];
if (strrchr($url, ':') != $url_port)
@@ -231,7 +234,7 @@ function make_picture_url($params)
$url .= $params['image_id'];
if ( isset($params['image_file']) )
{
- $url .= '-'.get_filename_wo_extension($params['image_file']);
+ $url .= '-'.str2url(get_filename_wo_extension($params['image_file']));
}
break;
case 'file':
@@ -463,14 +466,13 @@ function parse_section_url( $tokens, &$next_token)
{
if (empty($maybe_permalinks))
{
- array_push($maybe_permalinks, $tokens[$current_token]);
+ $maybe_permalinks[] = $tokens[$current_token];
}
else
{
- array_push($maybe_permalinks,
+ $maybe_permalinks[] =
$maybe_permalinks[count($maybe_permalinks)-1]
- . '/' . $tokens[$current_token]
- );
+ . '/' . $tokens[$current_token];
}
$current_token++;
}
@@ -524,11 +526,11 @@ function parse_section_url( $tokens, &$next_token)
if ( $conf['tag_url_style'] != 'tag' and preg_match('/^(\d+)(?:-(.*)|)$/', $tokens[$i], $matches) )
{
- array_push($requested_tag_ids, $matches[1]);
+ $requested_tag_ids[] = $matches[1];
}
else
{
- array_push($requested_tag_url_names, $tokens[$i]);
+ $requested_tag_url_names[] = $tokens[$i];
}
$i++;
}
@@ -594,7 +596,7 @@ function parse_section_url( $tokens, &$next_token)
if (empty($tokens[$next_token]))
{
// Add dummy element list
- array_push($page['list'], -1);
+ $page['list'][] = -1;
}
// With pictures list
else
@@ -605,7 +607,7 @@ function parse_section_url( $tokens, &$next_token)
}
foreach (explode(',', $tokens[$next_token]) as $image_id)
{
- array_push($page['list'], $image_id);
+ $page['list'][] = $image_id;
}
}
$next_token++;
@@ -792,4 +794,42 @@ function get_gallery_home_url()
return make_index_url();
}
}
+
+/**
+ * returns $_SERVER['QUERY_STRING'] whithout keys given in parameters
+ *
+ * @param string[] $rejects
+ * @param boolean $escape escape *&* to *&amp;*
+ * @returns string
+ */
+function get_query_string_diff($rejects=array(), $escape=true)
+{
+ if (empty($_SERVER['QUERY_STRING']))
+ {
+ return '';
+ }
+
+ parse_str($_SERVER['QUERY_STRING'], $vars);
+
+ $vars = array_diff_key($vars, array_flip($rejects));
+
+ return '?' . http_build_query($vars, '', $escape ? '&amp;' : '&');
+}
+
+/**
+ * returns true if the url is absolute (begins with http)
+ *
+ * @param string $url
+ * @returns boolean
+ */
+function url_is_remote($url)
+{
+ if ( strncmp($url, 'http://', 7)==0
+ or strncmp($url, 'https://', 8)==0 )
+ {
+ return true;
+ }
+ return false;
+}
+
?> \ No newline at end of file
diff --git a/include/functions_user.inc.php b/include/functions_user.inc.php
index d6250c582..896c175f0 100644
--- a/include/functions_user.inc.php
+++ b/include/functions_user.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,15 +21,18 @@
// | USA. |
// +-----------------------------------------------------------------------+
-// validate_mail_address:
-// o verifies whether the given mail address has the
-// right format. ie someone@domain.com "someone" can contain ".", "-" or
-// even "_". Exactly as "domain". The extension doesn't have to be
-// "com". The mail address can also be empty.
-// o check if address could be empty
-// o check if address is not used by a other user
-// If the mail address doesn't correspond, an error message is returned.
-//
+/**
+ * @package functions\user
+ */
+
+
+/**
+ * Checks if an email is well formed and not already in use.
+ *
+ * @param int $user_id
+ * @param string $mail_address
+ * @return string|void error message or nothing
+ */
function validate_mail_address($user_id, $mail_address)
{
global $conf;
@@ -62,10 +65,13 @@ WHERE upper('.$conf['user_fields']['email'].') = upper(\''.$mail_address.'\')
}
}
-// validate_login_case:
-// o check if login is not used by a other user
-// If the login doesn't correspond, an error message is returned.
-//
+/**
+ * Checks if a login is not already in use.
+ * Comparision is case insensitive.
+ *
+ * @param string $login
+ * @return string|void error message or nothing
+ */
function validate_login_case($login)
{
global $conf;
@@ -87,12 +93,10 @@ WHERE LOWER(".stripslashes($conf['user_fields']['username']).") = '".strtolower(
}
}
/**
- * For test on username case sensitivity
- *
- * @param : $username typed in by user for identification
- *
- * @return : $username found in database
+ * Searches for user with the same username in different case.
*
+ * @param string $username typically typed in by user for identification
+ * @return string $username found in database
*/
function search_case_username($username)
{
@@ -119,8 +123,19 @@ function search_case_username($username)
else
return $users_found[0];
}
-function register_user($login, $password, $mail_address,
- $with_notification = true, $errors = array())
+
+/**
+ * Creates a new user.
+ *
+ * @param string $login
+ * @param string $password
+ * @param string $mail_adress
+ * @param bool $notify_admin
+ * @param array &$errors populated with error messages
+ * @param bool $notify_user
+ * @return int|false user id or false
+ */
+function register_user($login, $password, $mail_address, $notify_admin=true, &$errors = array(), $notify_user=false)
{
global $conf;
@@ -159,53 +174,44 @@ function register_user($login, $password, $mail_address,
}
}
- $errors = trigger_event('register_user_check',
- $errors,
- array(
- 'username'=>$login,
- 'password'=>$password,
- 'email'=>$mail_address,
- )
- );
+ $errors = trigger_event(
+ 'register_user_check',
+ $errors,
+ array(
+ 'username'=>$login,
+ 'password'=>$password,
+ 'email'=>$mail_address,
+ )
+ );
// if no error until here, registration of the user
if (count($errors) == 0)
{
- // what will be the inserted id ?
- $query = '
-SELECT MAX('.$conf['user_fields']['id'].') + 1
- FROM '.USERS_TABLE.'
-;';
- list($next_id) = pwg_db_fetch_row(pwg_query($query));
-
- $insert =
- array(
- $conf['user_fields']['id'] => $next_id,
- $conf['user_fields']['username'] => pwg_db_real_escape_string($login),
- $conf['user_fields']['password'] => $conf['password_hash']($password),
- $conf['user_fields']['email'] => $mail_address
- );
+ $insert = array(
+ $conf['user_fields']['username'] => pwg_db_real_escape_string($login),
+ $conf['user_fields']['password'] => $conf['password_hash']($password),
+ $conf['user_fields']['email'] => $mail_address
+ );
- mass_inserts(USERS_TABLE, array_keys($insert), array($insert));
+ single_insert(USERS_TABLE, $insert);
+ $user_id = pwg_db_insert_id();
// Assign by default groups
- {
- $query = '
+ $query = '
SELECT id
FROM '.GROUPS_TABLE.'
WHERE is_default = \''.boolean_to_string(true).'\'
ORDER BY id ASC
;';
- $result = pwg_query($query);
+ $result = pwg_query($query);
- $inserts = array();
- while ($row = pwg_db_fetch_assoc($result))
- {
- $inserts[] = array(
- 'user_id' => $next_id,
- 'group_id' => $row['id']
- );
- }
+ $inserts = array();
+ while ($row = pwg_db_fetch_assoc($result))
+ {
+ $inserts[] = array(
+ 'user_id' => $user_id,
+ 'group_id' => $row['id']
+ );
}
if (count($inserts) != 0)
@@ -214,47 +220,85 @@ SELECT id
}
$override = null;
- if ($with_notification and $conf['browser_language'])
+ if ($notify_admin and $conf['browser_language'])
{
- if ( !get_browser_language($override['language']) )
+ if (!get_browser_language($override['language']))
+ {
$override=null;
+ }
}
- create_user_infos($next_id, $override);
+ create_user_infos($user_id, $override);
- if ($with_notification and $conf['email_admin_on_new_user'])
+ if ($notify_admin and $conf['email_admin_on_new_user'])
{
include_once(PHPWG_ROOT_PATH.'include/functions_mail.inc.php');
- $admin_url = get_absolute_root_url()
- .'admin.php?page=user_list&username='.$login;
+ $admin_url = get_absolute_root_url().'admin.php?page=user_list&username='.$login;
- $keyargs_content = array
- (
- get_l10n_args('User: %s', stripslashes($login)),
+ $keyargs_content = array(
+ get_l10n_args('User: %s', stripslashes($login) ),
get_l10n_args('Email: %s', $_POST['mail_address']),
- get_l10n_args('', ''),
- get_l10n_args('Admin: %s', $admin_url)
- );
+ get_l10n_args(''),
+ get_l10n_args('Admin: %s', $admin_url),
+ );
- pwg_mail_notification_admins
- (
- get_l10n_args('Registration of %s', stripslashes($login)),
+ pwg_mail_notification_admins(
+ get_l10n_args('Registration of %s', stripslashes($login) ),
$keyargs_content
- );
+ );
+ }
+
+ if ($notify_user and email_check_format($mail_address))
+ {
+ include_once(PHPWG_ROOT_PATH.'include/functions_mail.inc.php');
+
+ $keyargs_content = array(
+ get_l10n_args('Hello %s,', stripslashes($login)),
+ get_l10n_args('Thank you for registering at %s!', $conf['gallery_title']),
+ get_l10n_args('', ''),
+ get_l10n_args('Here are your connection settings', ''),
+ get_l10n_args('Username: %s', stripslashes($login)),
+ get_l10n_args('Password: %s', stripslashes($password)),
+ get_l10n_args('Email: %s', $mail_address),
+ get_l10n_args('', ''),
+ get_l10n_args('If you think you\'ve received this email in error, please contact us at %s', get_webmaster_mail_address()),
+ );
+
+ pwg_mail(
+ $mail_address,
+ array(
+ 'subject' => '['.$conf['gallery_title'].'] '.l10n('Registration'),
+ 'content' => l10n_args($keyargs_content),
+ 'content_format' => 'text/plain',
+ )
+ );
}
- trigger_action('register_user',
+ trigger_action(
+ 'register_user',
array(
- 'id'=>$next_id,
+ 'id'=>$user_id,
'username'=>$login,
'email'=>$mail_address,
- )
+ )
);
+
+ return $user_id;
+ }
+ else
+ {
+ return false;
}
-
- return $errors;
}
-function build_user( $user_id, $use_cache )
+/**
+ * Fetches user data from database.
+ * Same that getuserdata() but with additional tests for guest.
+ *
+ * @param int $user_id
+ * @param boolean $user_cache
+ * @return array
+ */
+function build_user($user_id, $use_cache=true)
{
global $conf;
@@ -277,13 +321,13 @@ function build_user( $user_id, $use_cache )
}
/**
- * find informations related to the user identifier
+ * Finds informations related to the user identifier.
*
- * @param int user identifier
- * @param boolean use_cache
- * @param array
+ * @param int $user_id
+ * @param boolean $use_cache
+ * @return array
*/
-function getuserdata($user_id, $use_cache)
+function getuserdata($user_id, $use_cache=false)
{
global $conf;
@@ -410,7 +454,7 @@ SELECT COUNT(DISTINCT(image_id)) as total
if ($cat['count_images']==0)
{
$forbidden_ids[] = $cat['cat_id'];
- unset( $user_cache_cats[$cat['cat_id']] );
+ remove_computed_category($user_cache_cats, $cat);
}
}
if ( !empty($forbidden_ids) )
@@ -435,14 +479,12 @@ DELETE FROM '.USER_CACHE_CATEGORIES_TABLE.'
// Due to concurrency issues, we ask MySQL to ignore errors on
// insert. This may happen when cache needs refresh and that Piwigo is
// called "very simultaneously".
- mass_inserts
- (
+ mass_inserts(
USER_CACHE_CATEGORIES_TABLE,
- array
- (
+ array(
'user_id', 'cat_id',
- 'date_last', 'max_date_last', 'nb_images', 'count_images', 'count_categories'
- ),
+ 'date_last', 'max_date_last', 'nb_images', 'count_images', 'nb_categories', 'count_categories'
+ ),
$user_cache_cats,
array('ignore' => true)
);
@@ -459,12 +501,14 @@ DELETE FROM '.USER_CACHE_TABLE.'
$query = '
INSERT IGNORE INTO '.USER_CACHE_TABLE.'
(user_id, need_update, cache_update_time, forbidden_categories, nb_total_images,
+ last_photo_date,
image_access_type, image_access_list)
VALUES
('.$userdata['id'].',\''.boolean_to_string($userdata['need_update']).'\','
.$userdata['cache_update_time'].',\''
- .$userdata['forbidden_categories'].'\','.$userdata['nb_total_images'].',\''
- .$userdata['image_access_type'].'\',\''.$userdata['image_access_list'].'\')';
+ .$userdata['forbidden_categories'].'\','.$userdata['nb_total_images'].','.
+ (empty($userdata['last_photo_date']) ? 'NULL': '\''.$userdata['last_photo_date'].'\'').
+ ',\''.$userdata['image_access_type'].'\',\''.$userdata['image_access_list'].'\')';
pwg_query($query);
}
}
@@ -472,10 +516,8 @@ INSERT IGNORE INTO '.USER_CACHE_TABLE.'
return $userdata;
}
-/*
- * deletes favorites of the current user if he's not allowed to see them
- *
- * @return void
+/**
+ * Deletes favorites of the current user if he's not allowed to see them.
*/
function check_user_favorites()
{
@@ -495,14 +537,12 @@ SELECT DISTINCT f.image_id
FROM '.FAVORITES_TABLE.' AS f INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic
ON f.image_id = ic.image_id
WHERE f.user_id = '.$user['id'].'
-'.get_sql_condition_FandF
- (
- array
- (
+ '.get_sql_condition_FandF(
+ array(
'forbidden_categories' => 'ic.category_id',
- ),
- 'AND'
- ).'
+ ),
+ 'AND'
+ ).'
;';
$authorizeds = array_from_query($query, 'image_id');
@@ -526,16 +566,16 @@ DELETE FROM '.FAVORITES_TABLE.'
}
/**
- * calculates the list of forbidden categories for a given user
+ * Calculates the list of forbidden categories for a given user.
*
* Calculation is based on private categories minus categories authorized to
* the groups the user belongs to minus the categories directly authorized
- * to the user. The list contains at least -1 to be compliant with queries
+ * to the user. The list contains at least 0 to be compliant with queries
* such as "WHERE category_id NOT IN ($forbidden_categories)"
*
- * @param int user_id
- * @param string user_status
- * @return string forbidden_categories
+ * @param int $user_id
+ * @param string $user_status
+ * @return string comma separated ids
*/
function calculate_permissions($user_id, $user_status)
{
@@ -601,152 +641,10 @@ SELECT id
}
/**
- * compute data of categories branches (one branch only)
- */
-function compute_branch_cat_data(&$cats, &$list_cat_id, &$level, &$ref_level)
-{
- $date = '';
- $count_images = 0;
- $count_categories = 0;
- do
- {
- $cat_id = array_pop($list_cat_id);
- if (!is_null($cat_id))
- {
- // Count images and categories
- $cats[$cat_id]['count_images'] += $count_images;
- $cats[$cat_id]['count_categories'] += $count_categories;
- $count_images = $cats[$cat_id]['count_images'];
- $count_categories = $cats[$cat_id]['count_categories'] + 1;
-
- if ((empty($cats[$cat_id]['max_date_last'])) or ($cats[$cat_id]['max_date_last'] < $date))
- {
- $cats[$cat_id]['max_date_last'] = $date;
- }
- else
- {
- $date = $cats[$cat_id]['max_date_last'];
- }
- $ref_level = substr_count($cats[$cat_id]['global_rank'], '.') + 1;
- }
- else
- {
- $ref_level = 0;
- }
- } while ($level <= $ref_level);
-
- // Last cat updating must be added to list for next branch
- if ($ref_level <> 0)
- {
- $list_cat_id[] = $cat_id;
- }
-}
-
-/**
- * compute data of categories branches
- */
-function compute_categories_data(&$cats)
-{
- $ref_level = 0;
- $level = 0;
- $list_cat_id = array();
-
- foreach ($cats as $id => $category)
- {
- // Compute
- $level = substr_count($category['global_rank'], '.') + 1;
- if ($level > $ref_level)
- {
- $list_cat_id[] = $id;
- }
- else
- {
- compute_branch_cat_data($cats, $list_cat_id, $level, $ref_level);
- $list_cat_id[] = $id;
- }
- $ref_level = $level;
- }
-
- $level = 1;
- compute_branch_cat_data($cats, $list_cat_id, $level, $ref_level);
-}
-
-/**
- * get computed array of categories
+ * Returns user identifier thanks to his name.
*
- * @param array userdata
- * @param int filter_days number of recent days to filter on or null
- * @return array
- */
-function get_computed_categories($userdata, $filter_days=null)
-{
- $query = 'SELECT c.id AS cat_id, global_rank';
- // Count by date_available to avoid count null
- $query .= ',
- MAX(date_available) AS date_last, COUNT(date_available) AS nb_images
-FROM '.CATEGORIES_TABLE.' as c
- LEFT JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON ic.category_id = c.id
- LEFT JOIN '.IMAGES_TABLE.' AS i
- ON ic.image_id = i.id
- AND i.level<='.$userdata['level'];
-
- if ( isset($filter_days) )
- {
- $query .= ' AND i.date_available > '.pwg_db_get_recent_period_expression($filter_days);
- }
-
- if ( !empty($userdata['forbidden_categories']) )
- {
- $query.= '
- WHERE c.id NOT IN ('.$userdata['forbidden_categories'].')';
- }
-
- $query.= '
- GROUP BY c.id, c.global_rank';
-
- $result = pwg_query($query);
-
- $cats = array();
- while ($row = pwg_db_fetch_assoc($result))
- {
- $row['user_id'] = $userdata['id'];
- $row['count_categories'] = 0;
- $row['count_images'] = (int)$row['nb_images'];
- $row['max_date_last'] = $row['date_last'];
-
- $cats += array($row['cat_id'] => $row);
- }
- uasort($cats, 'global_rank_compare');
-
- compute_categories_data($cats);
-
- if ( isset($filter_days) )
- {
- $cat_tmp = $cats;
- $cats = array();
-
- foreach ($cat_tmp as $category)
- {
- if (!empty($category['max_date_last']))
- {
- // Re-init counters
- $category['count_categories'] = 0;
- $category['count_images'] = (int)$category['nb_images'];
- // Keep category
- $cats[$category['cat_id']] = $category;
- }
- }
- // Compute a second time
- compute_categories_data($cats);
- }
- return $cats;
-}
-
-/**
- * returns user identifier thanks to his name, false if not found
- *
- * @param string username
- * @param int user identifier
+ * @param string $username
+ * @param int|false
*/
function get_userid($username)
{
@@ -772,6 +670,12 @@ SELECT '.$conf['user_fields']['id'].'
}
}
+/**
+ * Returns user identifier thanks to his email.
+ *
+ * @param string $email
+ * @param int|false
+ */
function get_userid_by_email($email)
{
global $conf;
@@ -797,12 +701,13 @@ SELECT
}
}
-/*
- * Returns a array with default user value
+/**
+ * Returns a array with default user valuees.
*
- * @param convert_str allows to convert string value if necessary
+ * @param convert_str ceonferts 'true' and 'false' into booleans
+ * @return array
*/
-function get_default_user_info($convert_str = true)
+function get_default_user_info($convert_str=true)
{
global $cache, $conf;
@@ -819,7 +724,7 @@ SELECT *
if (pwg_db_num_rows($result) > 0)
{
$cache['default_user'] = pwg_db_fetch_assoc($result);
-
+
unset($cache['default_user']['user_id']);
unset($cache['default_user']['status']);
unset($cache['default_user']['registration_date']);
@@ -853,18 +758,19 @@ SELECT *
}
}
-/*
- * Returns a default user value
+/**
+ * Returns a default user value.
*
- * @param value_name: name of value
- * @param sos_value: value used if don't exist value
+ * @param string $value_name
+ * @param mixed $default
+ * @return mixed
*/
-function get_default_user_value($value_name, $sos_value)
+function get_default_user_value($value_name, $default)
{
$default_user = get_default_user_info(true);
if ($default_user === false or empty($default_user[$value_name]))
{
- return $sos_value;
+ return $default;
}
else
{
@@ -872,9 +778,11 @@ function get_default_user_value($value_name, $sos_value)
}
}
-/*
- * Returns the default template value
+/**
+ * Returns the default theme.
+ * If the default theme is not available it returns the first available one.
*
+ * @return string
*/
function get_default_theme()
{
@@ -885,16 +793,14 @@ function get_default_theme()
}
// let's find the first available theme
- $active_themes = get_pwg_themes();
- foreach (array_keys(get_pwg_themes()) as $theme_id)
- {
- return $theme_id;
- }
+ $active_themes = array_keys(get_pwg_themes());
+ return $active_themes[0];
}
-/*
- * Returns the default language value
+/**
+ * Returns the default language.
*
+ * @return string
*/
function get_default_language()
{
@@ -902,9 +808,12 @@ function get_default_language()
}
/**
- * Returns true if the browser language value is set into param $lang
- *
- */
+ * Tries to find the browser language among available languages.
+ * @todo : try to match 'fr_CA' before 'fr'
+ *
+ * @param string &$lang
+ * @return bool
+ */
function get_browser_language(&$lang)
{
$browser_language = substr(@$_SERVER["HTTP_ACCEPT_LANGUAGE"], 0, 2);
@@ -920,26 +829,18 @@ function get_browser_language(&$lang)
}
/**
- * add user informations based on default values
+ * Creates user informations based on default values.
*
- * @param int user_id / array of user_if
- * @param array of values used to override default user values
+ * @param int|int[] $user_ids
+ * @param array $override_values values used to override default user values
*/
-function create_user_infos($arg_id, $override_values = null)
+function create_user_infos($user_ids, $override_values=null)
{
global $conf;
- if (is_array($arg_id))
+ if (!is_array($user_ids))
{
- $user_ids = $arg_id;
- }
- else
- {
- $user_ids = array();
- if (is_numeric($arg_id))
- {
- $user_ids[] = $arg_id;
- }
+ $user_ids = array($user_ids);
}
if (!empty($user_ids))
@@ -994,11 +895,13 @@ function create_user_infos($arg_id, $override_values = null)
}
/**
- * returns the auto login key or false on error
- * @param int user_id
- * @param time_t time
- * @param string [out] username
-*/
+ * Returns the auto login key for an user or false if the user is not found.
+ *
+ * @param int $user_id
+ * @param int $time
+ * @param string &$username fille with corresponding username
+ * @return string|false
+ */
function calculate_auto_login_key($user_id, $time, &$username)
{
global $conf;
@@ -1019,12 +922,12 @@ WHERE '.$conf['user_fields']['id'].' = '.$user_id;
return false;
}
-/*
- * Performs all required actions for user login
- * @param int user_id
- * @param bool remember_me
- * @return void
-*/
+/**
+ * Performs all required actions for user login.
+ *
+ * @param int $user_id
+ * @param bool $remember_me
+ */
function log_user($user_id, $remember_me)
{
global $conf, $user;
@@ -1074,11 +977,13 @@ function log_user($user_id, $remember_me)
trigger_action('user_login', $user['id']);
}
-/*
- * Performs auto-connexion when cookie remember_me exists
- * @return true/false
-*/
-function auto_login() {
+/**
+ * Performs auto-connection when cookie remember_me exists.
+ *
+ * @return bool
+ */
+function auto_login()
+{
global $conf;
if ( isset( $_COOKIE[$conf['remember_me_name']] ) )
@@ -1104,12 +1009,11 @@ function auto_login() {
}
/**
- * hashes a password, with the PasswordHash class from phpass security
- * library. We use an "pwg_" prefix because function password_hash is
- * planned for PHP 5.5. Code inspired from Wordpress.
+ * Hashes a password with the PasswordHash class from phpass security library.
+ * @since 2.5
*
- * @param string $password Plain text user password to hash
- * @return string The hash string of the password
+ * @param string $password plain text
+ * @return string
*/
function pwg_password_hash($password)
{
@@ -1118,32 +1022,33 @@ function pwg_password_hash($password)
if (empty($pwg_hasher))
{
require_once(PHPWG_ROOT_PATH.'include/passwordhash.class.php');
-
+
// We use the portable hash feature from phpass because we can't be sure
// Piwigo runs on PHP 5.3+ (and won't run on an older version in the
// future)
$pwg_hasher = new PasswordHash(13, true);
}
-
+
return $pwg_hasher->HashPassword($password);
}
/**
- * Verifies a password, with the PasswordHash class from phpass security
- * library. We use an "pwg_" prefix because function password_verify is
- * planned for PHP 5.5. Code inspired from Wordpress.
+ * Verifies a password, with the PasswordHash class from phpass security library.
+ * If the hash is 'old' (assumed MD5) the hash is updated in database, used for
+ * migration from Piwigo 2.4.
+ * @since 2.5
*
- * @param string $password Plain text user password to hash
+ * @param string $password plain text
* @param string $hash may be md5 or phpass hashed password
- * @param integer $account_id only useful to update password hash from md5 to phpass
- * @return string The hash string of the password
+ * @param integer $user_id only useful to update password hash from md5 to phpass
+ * @return bool
*/
function pwg_password_verify($password, $hash, $user_id=null)
{
global $conf, $pwg_hasher;
// If the password has not been hashed with the current algorithm.
- if (strpos('$P', $hash) !== 0)
+ if (strpos($hash, '$P') !== 0)
{
if (!empty($conf['pass_convert']))
{
@@ -1153,9 +1058,14 @@ function pwg_password_verify($password, $hash, $user_id=null)
{
$check = ($hash == md5($password));
}
-
- if ($check and isset($user_id) and !$conf['external_authentification'])
+
+ if ($check)
{
+ if (!isset($user_id) or $conf['external_authentification'])
+ {
+ return true;
+ }
+
// Rehash using new hash.
$hash = pwg_password_hash($password);
@@ -1172,7 +1082,7 @@ function pwg_password_verify($password, $hash, $user_id=null)
if (empty($pwg_hasher))
{
require_once(PHPWG_ROOT_PATH.'include/passwordhash.class.php');
-
+
// We use the portable hash feature
$pwg_hasher = new PasswordHash(13, true);
}
@@ -1181,8 +1091,12 @@ function pwg_password_verify($password, $hash, $user_id=null)
}
/**
- * Tries to login a user given username and password (must be MySql escaped)
- * return true on success
+ * Tries to login a user given username and password (must be MySql escaped).
+ *
+ * @param string $username
+ * @param string $password
+ * @param bool $remember_me
+ * @return bool
*/
function try_log_user($username, $password, $remember_me)
{
@@ -1191,13 +1105,22 @@ function try_log_user($username, $password, $remember_me)
add_event_handler('try_log_user', 'pwg_login', EVENT_HANDLER_PRIORITY_NEUTRAL, 4);
+/**
+ * Default method for user login, can be overwritten with 'try_log_user' trigger.
+ * @see try_log_user()
+ *
+ * @param string $username
+ * @param string $password
+ * @param bool $remember_me
+ * @return bool
+ */
function pwg_login($success, $username, $password, $remember_me)
{
- if ($success===true)
+ if ($success===true)
{
return true;
}
-
+
// we force the session table to be clean
pwg_session_gc();
@@ -1220,13 +1143,15 @@ SELECT '.$conf['user_fields']['id'].' AS id,
return false;
}
-/** Performs all the cleanup on user logout */
+/**
+ * Performs all the cleanup on user logout.
+ */
function logout_user()
{
global $conf;
-
+
trigger_action('user_logout', @$_SESSION['pwg_uid']);
-
+
$_SESSION = array();
session_unset();
session_destroy();
@@ -1237,11 +1162,13 @@ function logout_user()
setcookie($conf['remember_me_name'], '', 0, cookie_path(),ini_get('session.cookie_domain'));
}
-/*
- * Return user status used in this library
+/**
+ * Return user status.
+ *
+ * @param string $user_status used if $user not initialized
* @return string
-*/
-function get_user_status($user_status)
+ */
+function get_user_status($user_status='')
{
global $user;
@@ -1260,11 +1187,12 @@ function get_user_status($user_status)
return $user_status;
}
-/*
- * Return access_type definition of user
- * Test does with user status
- * @return bool
-*/
+/**
+ * Return ACCESS_* value for a given $status.
+ *
+ * @param string $user_status used if $user not initialized
+ * @return int one of ACCESS_* constants
+ */
function get_access_type_status($user_status='')
{
global $conf;
@@ -1307,23 +1235,25 @@ function get_access_type_status($user_status='')
return $access_type_status;
}
-/*
- * Return if user have access to access_type definition
- * Test does with user status
+/**
+ * Returns if user has access to a particular ACCESS_*
+ *
+ * @return int $access_type one of ACCESS_* constants
+ * @param string $user_status used if $user not initialized
* @return bool
-*/
-function is_autorize_status($access_type, $user_status = '')
+ */
+function is_autorize_status($access_type, $user_status='')
{
return (get_access_type_status($user_status) >= $access_type);
}
-/*
- * Check if user have access to access_type definition
- * Stop action if there are not access
- * Test does with user status
- * @return none
-*/
-function check_status($access_type, $user_status = '')
+/**
+ * Abord script if user has no access to a particular ACCESS_*
+ *
+ * @return int $access_type one of ACCESS_* constants
+ * @param string $user_status used if $user not initialized
+ */
+function check_status($access_type, $user_status='')
{
if (!is_autorize_status($access_type, $user_status))
{
@@ -1331,66 +1261,66 @@ function check_status($access_type, $user_status = '')
}
}
-/*
- * Return if user is generic
+/**
+ * Returns if user is generic.
+ *
+ * @param string $user_status used if $user not initialized
* @return bool
-*/
- function is_generic($user_status = '')
+ */
+function is_generic($user_status='')
{
return get_user_status($user_status) == 'generic';
}
-/*
- * Return if user is only a guest
+/**
+ * Returns if user is a guest.
+ *
+ * @param string $user_status used if $user not initialized
* @return bool
-*/
- function is_a_guest($user_status = '')
+ */
+function is_a_guest($user_status='')
{
return get_user_status($user_status) == 'guest';
}
-/*
- * Return if user is, at least, a classic user
+/**
+ * Returns if user is, at least, a classic user.
+ *
+ * @param string $user_status used if $user not initialized
* @return bool
-*/
- function is_classic_user($user_status = '')
+ */
+function is_classic_user($user_status='')
{
return is_autorize_status(ACCESS_CLASSIC, $user_status);
}
-/*
- * Return if user is, at least, an administrator
+/**
+ * Returns if user is, at least, an administrator.
+ *
+ * @param string $user_status used if $user not initialized
* @return bool
-*/
- function is_admin($user_status = '')
+ */
+function is_admin($user_status='')
{
return is_autorize_status(ACCESS_ADMINISTRATOR, $user_status);
}
-/*
- * Return if user is, at least, a webmaster
+/**
+ * Returns if user is a webmaster.
+ *
+ * @param string $user_status used if $user not initialized
* @return bool
-*/
- function is_webmaster($user_status = '')
+ */
+function is_webmaster($user_status='')
{
return is_autorize_status(ACCESS_WEBMASTER, $user_status);
}
-/*
- * Adviser status is depreciated from piwigo 2.2
- * @return false
-*/
-function is_adviser()
-{
- // TODO for Piwigo 2.4 : trigger a warning. We don't do it on Piwigo 2.3
- // to avoid changes for plugin contributors
- // trigger_error('call to obsolete function is_adviser', E_USER_WARNING);
- return false;
-}
-
-/*
- * Return if current user can edit/delete/validate a comment
- * @param action edit/delete/validate
+/**
+ * Returns if current user can edit/delete/validate a comment.
+ *
+ * @param string $action edit/delete/validate
+ * @param int $comment_author_id
* @return bool
*/
function can_manage_comment($action, $comment_author_id)
@@ -1429,33 +1359,18 @@ function can_manage_comment($action, $comment_author_id)
return false;
}
-/*
- * Return mail address as display text
- * @return string
-*/
-function get_email_address_as_display_text($email_address)
-{
- global $conf;
-
- if (!isset($email_address) or (trim($email_address) == ''))
- {
- return '';
- }
- else
- {
- return $email_address;
- }
-}
-
-/*
- * Compute sql where condition with restrict and filter data. "FandF" means
- * Forbidden and Filters.
- *
- * @param array condition_fields: read function body
- * @param string prefix_condition: prefixes sql if condition is not empty
- * @param boolean force_one_condition: use at least "1 = 1"
+/**
+ * Compute sql WHERE condition with restrict and filter data.
+ * "FandF" means Forbidden and Filters.
*
- * @return string sql where/conditions
+ * @param array $condition_fields one witch fields apply each filter
+ * - forbidden_categories
+ * - visible_categories
+ * - forbidden_images
+ * - visible_images
+ * @param string $prefix_condition prefixes query if condition is not empty
+ * @param boolean $force_one_condition use at least "1 = 1"
+ * @return string
*/
function get_sql_condition_FandF(
$condition_fields,
@@ -1515,7 +1430,7 @@ function get_sql_condition_FandF(
{
$sql_list[]=$table_prefix.'level<='.$user['level'];
}
- else if ( !empty($user['image_access_list']) and !empty($user['image_access_type']) )
+ elseif ( !empty($user['image_access_list']) and !empty($user['image_access_type']) )
{
$sql_list[]=$field_name.' '.$user['image_access_type']
.' ('.$user['image_access_list'].')';
@@ -1547,8 +1462,26 @@ function get_sql_condition_FandF(
return $sql;
}
+/**
+ * Returns sql WHERE condition for recent photos/albums for current user.
+ *
+ * @param string $db_field
+ * @return string
+ */
+function get_recent_photos_sql($db_field)
+{
+ global $user;
+ if (!isset($user['last_photo_date']))
+ {
+ return '0=1';
+ }
+ return $db_field.'>=LEAST('
+ .pwg_db_get_recent_period_expression($user['recent_period'])
+ .','.pwg_db_get_recent_period_expression(1,$user['last_photo_date']).')';
+}
+
/**
- * search an available activation_key
+ * Returns a unique activation key.
*
* @return string
*/
@@ -1570,4 +1503,4 @@ SELECT COUNT(*)
}
}
-?>
+?> \ No newline at end of file
diff --git a/include/index.php b/include/index.php
index 41732f2fd..c8de97f60 100644
--- a/include/index.php
+++ b/include/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/include/menubar.inc.php b/include/menubar.inc.php
index bd75a0b44..07ca96bcb 100644
--- a/include/menubar.inc.php
+++ b/include/menubar.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,14 +22,16 @@
// +-----------------------------------------------------------------------+
/**
- * This file is included by the main page to show the menu bar
- *
+ * @package functions\menubar
*/
include_once(PHPWG_ROOT_PATH.'include/block.class.php');
initialize_menu();
+/**
+ * Setups each block the main menubar.
+ */
function initialize_menu()
{
global $page, $conf, $user, $template, $filter;
@@ -191,14 +193,6 @@ function initialize_menu()
);
}
- $block->data['random'] =
- array(
- 'URL' => get_root_url().'random.php',
- 'TITLE' => l10n('display a set of random photos'),
- 'NAME' => l10n('Random photos'),
- 'REL'=> 'rel="nofollow"'
- );
-
$block->data['recent_pics'] =
array(
'URL' => make_index_url(array('section' => 'recent_pics')),
@@ -213,6 +207,13 @@ function initialize_menu()
'NAME' => l10n('Recent albums'),
);
+ $block->data['random'] =
+ array(
+ 'URL' => get_root_url().'random.php',
+ 'TITLE' => l10n('display a set of random photos'),
+ 'NAME' => l10n('Random photos'),
+ 'REL'=> 'rel="nofollow"'
+ );
$block->data['calendar'] =
array(
@@ -246,6 +247,7 @@ function initialize_menu()
'TITLE' => l10n('display available tags'),
'NAME' => l10n('Tags'),
'URL'=> get_root_url().'tags.php',
+ 'COUNTER' => get_nb_available_tags(),
);
// search link
@@ -265,6 +267,7 @@ function initialize_menu()
'TITLE'=>l10n('display last user comments'),
'NAME'=>l10n('Comments'),
'URL'=> get_root_url().'comments.php',
+ 'COUNTER' => get_nb_available_comments(),
);
}
@@ -328,4 +331,5 @@ function initialize_menu()
}
$menu->apply('MENUBAR', 'menubar.tpl' );
}
+
?> \ No newline at end of file
diff --git a/include/no_photo_yet.inc.php b/include/no_photo_yet.inc.php
index 17907c51d..608da6c9c 100644
--- a/include/no_photo_yet.inc.php
+++ b/include/no_photo_yet.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -76,8 +76,8 @@ SELECT
$template->assign(
array(
'step' => 2,
- 'intro' => sprintf(
- l10n('Hello %s, your Piwigo photo gallery is empty!'),
+ 'intro' => l10n(
+ 'Hello %s, your Piwigo photo gallery is empty!',
$user['username']
),
'next_step_url' => $url,
diff --git a/include/page_header.php b/include/page_header.php
index 862f83b3d..5ae28b27c 100644
--- a/include/page_header.php
+++ b/include/page_header.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/include/page_tail.php b/include/page_tail.php
index cf89ed702..0a834d43e 100644
--- a/include/page_tail.php
+++ b/include/page_tail.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/include/passwordhash.class.php b/include/passwordhash.class.php
index 12958c7f1..84447b277 100644
--- a/include/passwordhash.class.php
+++ b/include/passwordhash.class.php
@@ -48,7 +48,7 @@ class PasswordHash {
function get_random_bytes($count)
{
$output = '';
- if (is_readable('/dev/urandom') &&
+ if (@is_readable('/dev/urandom') &&
($fh = @fopen('/dev/urandom', 'rb'))) {
$output = fread($fh, $count);
fclose($fh);
diff --git a/include/php_compat/index.php b/include/php_compat/index.php
index 41732f2fd..c8de97f60 100644
--- a/include/php_compat/index.php
+++ b/include/php_compat/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/include/php_compat/json_encode.php b/include/php_compat/json_encode.php
index 8fbdbffec..3e6f37f52 100644
--- a/include/php_compat/json_encode.php
+++ b/include/php_compat/json_encode.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/include/php_compat/preg_last_error.php b/include/php_compat/preg_last_error.php
index 408c137a2..b44c9f953 100644
--- a/include/php_compat/preg_last_error.php
+++ b/include/php_compat/preg_last_error.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/include/phpmailer/PHPMailerAutoload.php b/include/phpmailer/PHPMailerAutoload.php
new file mode 100644
index 000000000..46db5bd0b
--- /dev/null
+++ b/include/phpmailer/PHPMailerAutoload.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * PHPMailer SPL autoloader.
+ * PHP Version 5.0.0
+ * @package PHPMailer
+ * @link https://github.com/PHPMailer/PHPMailer/
+ * @author Marcus Bointon (coolbru) <phpmailer@synchromedia.co.uk>
+ * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
+ * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
+ * @author Brent R. Matzelle (original founder)
+ * @copyright 2013 Marcus Bointon
+ * @copyright 2010 - 2012 Jim Jagielski
+ * @copyright 2004 - 2009 Andy Prevost
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ * @note This program is distributed in the hope that it will be useful - WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+/**
+ * PHPMailer SPL autoloader.
+ * @param string $classname The name of the class to load
+ */
+function PHPMailerAutoload($classname)
+{
+ //Can't use __DIR__ as it's only in PHP 5.3+
+ $filename = dirname(__FILE__).DIRECTORY_SEPARATOR.'class.'.strtolower($classname).'.php';
+ if (is_readable($filename)) {
+ require $filename;
+ }
+}
+
+spl_autoload_register('PHPMailerAutoload');
diff --git a/include/phpmailer/class.phpmailer.php b/include/phpmailer/class.phpmailer.php
new file mode 100644
index 000000000..a79508eb8
--- /dev/null
+++ b/include/phpmailer/class.phpmailer.php
@@ -0,0 +1,3268 @@
+<?php
+/**
+ * PHPMailer - PHP email creation and transport class.
+ * PHP Version 5.0.0
+ * Version 5.2.7
+ * @package PHPMailer
+ * @link https://github.com/PHPMailer/PHPMailer/
+ * @author Marcus Bointon (coolbru) <phpmailer@synchromedia.co.uk>
+ * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
+ * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
+ * @author Brent R. Matzelle (original founder)
+ * @copyright 2013 Marcus Bointon
+ * @copyright 2010 - 2012 Jim Jagielski
+ * @copyright 2004 - 2009 Andy Prevost
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ * @note This program is distributed in the hope that it will be useful - WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+if (version_compare(PHP_VERSION, '5.0.0', '<')) {
+ exit("Sorry, PHPMailer will only run on PHP version 5 or greater!\n");
+}
+
+/**
+ * PHPMailer - PHP email creation and transport class.
+ * PHP Version 5.0.0
+ * @package PHPMailer
+ * @author Marcus Bointon (coolbru) <phpmailer@synchromedia.co.uk>
+ * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
+ * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
+ * @author Brent R. Matzelle (original founder)
+ * @copyright 2013 Marcus Bointon
+ * @copyright 2010 - 2012 Jim Jagielski
+ * @copyright 2004 - 2009 Andy Prevost
+ */
+class PHPMailer
+{
+ /**
+ * The PHPMailer Version number.
+ * @type string
+ */
+ public $Version = '5.2.7';
+
+ /**
+ * Email priority.
+ * Options: 1 = High, 3 = Normal, 5 = low.
+ * @type int
+ */
+ public $Priority = 3;
+
+ /**
+ * The character set of the message.
+ * @type string
+ */
+ public $CharSet = 'iso-8859-1';
+
+ /**
+ * The MIME Content-type of the message.
+ * @type string
+ */
+ public $ContentType = 'text/plain';
+
+ /**
+ * The message encoding.
+ * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
+ * @type string
+ */
+ public $Encoding = '8bit';
+
+ /**
+ * Holds the most recent mailer error message.
+ * @type string
+ */
+ public $ErrorInfo = '';
+
+ /**
+ * The From email address for the message.
+ * @type string
+ */
+ public $From = 'root@localhost';
+
+ /**
+ * The From name of the message.
+ * @type string
+ */
+ public $FromName = 'Root User';
+
+ /**
+ * The Sender email (Return-Path) of the message.
+ * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
+ * @type string
+ */
+ public $Sender = '';
+
+ /**
+ * The Return-Path of the message.
+ * If empty, it will be set to either From or Sender.
+ * @type string
+ */
+ public $ReturnPath = '';
+
+ /**
+ * The Subject of the message.
+ * @type string
+ */
+ public $Subject = '';
+
+ /**
+ * An HTML or plain text message body.
+ * If HTML then call isHTML(true).
+ * @type string
+ */
+ public $Body = '';
+
+ /**
+ * The plain-text message body.
+ * This body can be read by mail clients that do not have HTML email
+ * capability such as mutt & Eudora.
+ * Clients that can read HTML will view the normal Body.
+ * @type string
+ */
+ public $AltBody = '';
+
+ /**
+ * An iCal message part body.
+ * Only supported in simple alt or alt_inline message types
+ * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
+ * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
+ * @link http://kigkonsult.se/iCalcreator/
+ * @type string
+ */
+ public $Ical = '';
+
+ /**
+ * The complete compiled MIME message body.
+ * @access protected
+ * @type string
+ */
+ protected $MIMEBody = '';
+
+ /**
+ * The complete compiled MIME message headers.
+ * @type string
+ * @access protected
+ */
+ protected $MIMEHeader = '';
+
+ /**
+ * Extra headers that createHeader() doesn't fold in.
+ * @type string
+ * @access protected
+ */
+ protected $mailHeader = '';
+
+ /**
+ * Word-wrap the message body to this number of chars.
+ * @type int
+ */
+ public $WordWrap = 0;
+
+ /**
+ * Which method to use to send mail.
+ * Options: "mail", "sendmail", or "smtp".
+ * @type string
+ */
+ public $Mailer = 'mail';
+
+ /**
+ * The path to the sendmail program.
+ * @type string
+ */
+ public $Sendmail = '/usr/sbin/sendmail';
+
+ /**
+ * Whether mail() uses a fully sendmail-compatible MTA.
+ * One which supports sendmail's "-oi -f" options.
+ * @type bool
+ */
+ public $UseSendmailOptions = true;
+
+ /**
+ * Path to PHPMailer plugins.
+ * Useful if the SMTP class is not in the PHP include path.
+ * @type string
+ * @deprecated Should not be needed now there is an autoloader.
+ */
+ public $PluginDir = '';
+
+ /**
+ * The email address that a reading confirmation should be sent to.
+ * @type string
+ */
+ public $ConfirmReadingTo = '';
+
+ /**
+ * The hostname to use in Message-Id and Received headers
+ * and as default HELO string.
+ * If empty, the value returned
+ * by SERVER_NAME is used or 'localhost.localdomain'.
+ * @type string
+ */
+ public $Hostname = '';
+
+ /**
+ * An ID to be used in the Message-Id header.
+ * If empty, a unique id will be generated.
+ * @type string
+ */
+ public $MessageID = '';
+
+ /**
+ * The message Date to be used in the Date header.
+ * If empty, the current date will be added.
+ * @type string
+ */
+ public $MessageDate = '';
+
+ /**
+ * SMTP hosts.
+ * Either a single hostname or multiple semicolon-delimited hostnames.
+ * You can also specify a different port
+ * for each host by using this format: [hostname:port]
+ * (e.g. "smtp1.example.com:25;smtp2.example.com").
+ * Hosts will be tried in order.
+ * @type string
+ */
+ public $Host = 'localhost';
+
+ /**
+ * The default SMTP server port.
+ * @type int
+ * @Todo Why is this needed when the SMTP class takes care of it?
+ */
+ public $Port = 25;
+
+ /**
+ * The SMTP HELO of the message.
+ * Default is $Hostname.
+ * @type string
+ * @see PHPMailer::$Hostname
+ */
+ public $Helo = '';
+
+ /**
+ * The secure connection prefix.
+ * Options: "", "ssl" or "tls"
+ * @type string
+ */
+ public $SMTPSecure = '';
+
+ /**
+ * Whether to use SMTP authentication.
+ * Uses the Username and Password properties.
+ * @type bool
+ * @see PHPMailer::$Username
+ * @see PHPMailer::$Password
+ */
+ public $SMTPAuth = false;
+
+ /**
+ * SMTP username.
+ * @type string
+ */
+ public $Username = '';
+
+ /**
+ * SMTP password.
+ * @type string
+ */
+ public $Password = '';
+
+ /**
+ * SMTP auth type.
+ * Options are LOGIN (default), PLAIN, NTLM, CRAM-MD5
+ * @type string
+ */
+ public $AuthType = '';
+
+ /**
+ * SMTP realm.
+ * Used for NTLM auth
+ * @type string
+ */
+ public $Realm = '';
+
+ /**
+ * SMTP workstation.
+ * Used for NTLM auth
+ * @type string
+ */
+ public $Workstation = '';
+
+ /**
+ * The SMTP server timeout in seconds.
+ * @type int
+ */
+ public $Timeout = 10;
+
+ /**
+ * SMTP class debug output mode.
+ * Options: 0 = off, 1 = commands, 2 = commands and data
+ * @type int
+ * @see SMTP::$do_debug
+ */
+ public $SMTPDebug = 0;
+
+ /**
+ * The function/method to use for debugging output.
+ * Options: "echo" or "error_log"
+ * @type string
+ * @see SMTP::$Debugoutput
+ */
+ public $Debugoutput = "echo";
+
+ /**
+ * Whether to keep SMTP connection open after each message.
+ * If this is set to true then to close the connection
+ * requires an explicit call to smtpClose().
+ * @type bool
+ */
+ public $SMTPKeepAlive = false;
+
+ /**
+ * Whether to split multiple to addresses into multiple messages
+ * or send them all in one message.
+ * @type bool
+ */
+ public $SingleTo = false;
+
+ /**
+ * Storage for addresses when SingleTo is enabled.
+ * @type array
+ * @todo This should really not be public
+ */
+ public $SingleToArray = array();
+
+ /**
+ * Whether to generate VERP addresses on send.
+ * Only applicable when sending via SMTP.
+ * @link http://en.wikipedia.org/wiki/Variable_envelope_return_path
+ * @type bool
+ */
+ public $do_verp = false;
+
+ /**
+ * Whether to allow sending messages with an empty body.
+ * @type bool
+ */
+ public $AllowEmpty = false;
+
+ /**
+ * The default line ending.
+ * @note The default remains "\n". We force CRLF where we know
+ * it must be used via self::CRLF.
+ * @type string
+ */
+ public $LE = "\n";
+
+ /**
+ * DKIM selector.
+ * @type string
+ */
+ public $DKIM_selector = '';
+
+ /**
+ * DKIM Identity.
+ * Usually the email address used as the source of the email
+ * @type string
+ */
+ public $DKIM_identity = '';
+
+ /**
+ * DKIM passphrase.
+ * Used if your key is encrypted.
+ * @type string
+ */
+ public $DKIM_passphrase = '';
+
+ /**
+ * DKIM signing domain name.
+ * @example 'example.com'
+ * @type string
+ */
+ public $DKIM_domain = '';
+
+ /**
+ * DKIM private key file path.
+ * @type string
+ */
+ public $DKIM_private = '';
+
+ /**
+ * Callback Action function name.
+ *
+ * The function that handles the result of the send email action.
+ * It is called out by send() for each email sent.
+ *
+ * Value can be:
+ * - 'function_name' for function names
+ * - 'Class::Method' for static method calls
+ * - array($object, 'Method') for calling methods on $object
+ * See http://php.net/is_callable manual page for more details.
+ *
+ * Parameters:
+ * bool $result result of the send action
+ * string $to email address of the recipient
+ * string $cc cc email addresses
+ * string $bcc bcc email addresses
+ * string $subject the subject
+ * string $body the email body
+ * string $from email address of sender
+ *
+ * @type string
+ */
+ public $action_function = '';
+
+ /**
+ * What to use in the X-Mailer header.
+ * Options: null for default, whitespace for none, or a string to use
+ * @type string
+ */
+ public $XMailer = '';
+
+ /**
+ * An instance of the SMTP sender class.
+ * @type SMTP
+ * @access protected
+ */
+ protected $smtp = null;
+
+ /**
+ * The array of 'to' addresses.
+ * @type array
+ * @access protected
+ */
+ protected $to = array();
+
+ /**
+ * The array of 'cc' addresses.
+ * @type array
+ * @access protected
+ */
+ protected $cc = array();
+
+ /**
+ * The array of 'bcc' addresses.
+ * @type array
+ * @access protected
+ */
+ protected $bcc = array();
+
+ /**
+ * The array of reply-to names and addresses.
+ * @type array
+ * @access protected
+ */
+ protected $ReplyTo = array();
+
+ /**
+ * An array of all kinds of addresses.
+ * Includes all of $to, $cc, $bcc, $replyto
+ * @type array
+ * @access protected
+ */
+ protected $all_recipients = array();
+
+ /**
+ * The array of attachments.
+ * @type array
+ * @access protected
+ */
+ protected $attachment = array();
+
+ /**
+ * The array of custom headers.
+ * @type array
+ * @access protected
+ */
+ protected $CustomHeader = array();
+
+ /**
+ * The most recent Message-ID (including angular brackets).
+ * @type string
+ * @access protected
+ */
+ protected $lastMessageID = '';
+
+ /**
+ * The message's MIME type.
+ * @type string
+ * @access protected
+ */
+ protected $message_type = '';
+
+ /**
+ * The array of MIME boundary strings.
+ * @type array
+ * @access protected
+ */
+ protected $boundary = array();
+
+ /**
+ * The array of available languages.
+ * @type array
+ * @access protected
+ */
+ protected $language = array();
+
+ /**
+ * The number of errors encountered.
+ * @type integer
+ * @access protected
+ */
+ protected $error_count = 0;
+
+ /**
+ * The S/MIME certificate file path.
+ * @type string
+ * @access protected
+ */
+ protected $sign_cert_file = '';
+
+ /**
+ * The S/MIME key file path.
+ * @type string
+ * @access protected
+ */
+ protected $sign_key_file = '';
+
+ /**
+ * The S/MIME password for the key.
+ * Used only if the key is encrypted.
+ * @type string
+ * @access protected
+ */
+ protected $sign_key_pass = '';
+
+ /**
+ * Whether to throw exceptions for errors.
+ * @type bool
+ * @access protected
+ */
+ protected $exceptions = false;
+
+ /**
+ * Error severity: message only, continue processing
+ */
+ const STOP_MESSAGE = 0;
+
+ /**
+ * Error severity: message, likely ok to continue processing
+ */
+ const STOP_CONTINUE = 1;
+
+ /**
+ * Error severity: message, plus full stop, critical error reached
+ */
+ const STOP_CRITICAL = 2;
+
+ /**
+ * SMTP RFC standard line ending
+ */
+ const CRLF = "\r\n";
+
+ /**
+ * Constructor
+ * @param bool $exceptions Should we throw external exceptions?
+ */
+ public function __construct($exceptions = false)
+ {
+ $this->exceptions = ($exceptions == true);
+ //Make sure our autoloader is loaded
+ if (!in_array('PHPMailerAutoload', spl_autoload_functions())) {
+ require 'PHPMailerAutoload.php';
+ }
+ }
+
+ /**
+ * Destructor.
+ */
+ public function __destruct()
+ {
+ if ($this->Mailer == 'smtp') { //close any open SMTP connection nicely
+ $this->smtpClose();
+ }
+ }
+
+ /**
+ * Call mail() in a safe_mode-aware fashion.
+ * Also, unless sendmail_path points to sendmail (or something that
+ * claims to be sendmail), don't pass params (not a perfect fix,
+ * but it will do)
+ * @param string $to To
+ * @param string $subject Subject
+ * @param string $body Message Body
+ * @param string $header Additional Header(s)
+ * @param string $params Params
+ * @access private
+ * @return bool
+ */
+ private function mailPassthru($to, $subject, $body, $header, $params)
+ {
+ if (ini_get('safe_mode') || !($this->UseSendmailOptions)) {
+ $rt = @mail($to, $this->encodeHeader($this->secureHeader($subject)), $body, $header);
+ } else {
+ $rt = @mail($to, $this->encodeHeader($this->secureHeader($subject)), $body, $header, $params);
+ }
+ return $rt;
+ }
+
+ /**
+ * Output debugging info via user-defined method.
+ * Only if debug output is enabled.
+ * @see PHPMailer::$Debugoutput
+ * @see PHPMailer::$SMTPDebug
+ * @param string $str
+ */
+ protected function edebug($str)
+ {
+ if (!$this->SMTPDebug) {
+ return;
+ }
+ switch ($this->Debugoutput) {
+ case 'error_log':
+ error_log($str);
+ break;
+ case 'html':
+ //Cleans up output a bit for a better looking display that's HTML-safe
+ echo htmlentities(preg_replace('/[\r\n]+/', '', $str), ENT_QUOTES, $this->CharSet) . "<br>\n";
+ break;
+ case 'echo':
+ default:
+ //Just echoes exactly what was received
+ echo $str;
+ }
+ }
+
+ /**
+ * Sets message type to HTML or plain.
+ * @param bool $ishtml True for HTML mode.
+ * @return void
+ */
+ public function isHTML($ishtml = true)
+ {
+ if ($ishtml) {
+ $this->ContentType = 'text/html';
+ } else {
+ $this->ContentType = 'text/plain';
+ }
+ }
+
+ /**
+ * Send messages using SMTP.
+ * @return void
+ */
+ public function isSMTP()
+ {
+ $this->Mailer = 'smtp';
+ }
+
+ /**
+ * Send messages using PHP's mail() function.
+ * @return void
+ */
+ public function isMail()
+ {
+ $this->Mailer = 'mail';
+ }
+
+ /**
+ * Send messages using $Sendmail.
+ * @return void
+ */
+ public function isSendmail()
+ {
+ if (!stristr(ini_get('sendmail_path'), 'sendmail')) {
+ $this->Sendmail = '/var/qmail/bin/sendmail';
+ }
+ $this->Mailer = 'sendmail';
+ }
+
+ /**
+ * Send messages using qmail.
+ * @return void
+ */
+ public function isQmail()
+ {
+ if (stristr(ini_get('sendmail_path'), 'qmail')) {
+ $this->Sendmail = '/var/qmail/bin/sendmail';
+ }
+ $this->Mailer = 'sendmail';
+ }
+
+ /**
+ * Add a "To" address.
+ * @param string $address
+ * @param string $name
+ * @return bool true on success, false if address already used
+ */
+ public function addAddress($address, $name = '')
+ {
+ return $this->addAnAddress('to', $address, $name);
+ }
+
+ /**
+ * Add a "CC" address.
+ * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
+ * @param string $address
+ * @param string $name
+ * @return bool true on success, false if address already used
+ */
+ public function addCC($address, $name = '')
+ {
+ return $this->addAnAddress('cc', $address, $name);
+ }
+
+ /**
+ * Add a "BCC" address.
+ * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
+ * @param string $address
+ * @param string $name
+ * @return bool true on success, false if address already used
+ */
+ public function addBCC($address, $name = '')
+ {
+ return $this->addAnAddress('bcc', $address, $name);
+ }
+
+ /**
+ * Add a "Reply-to" address.
+ * @param string $address
+ * @param string $name
+ * @return bool
+ */
+ public function addReplyTo($address, $name = '')
+ {
+ return $this->addAnAddress('Reply-To', $address, $name);
+ }
+
+ /**
+ * Add an address to one of the recipient arrays.
+ * Addresses that have been added already return false, but do not throw exceptions
+ * @param string $kind One of 'to', 'cc', 'bcc', 'ReplyTo'
+ * @param string $address The email address to send to
+ * @param string $name
+ * @throws phpmailerException
+ * @return bool true on success, false if address already used or invalid in some way
+ * @access protected
+ */
+ protected function addAnAddress($kind, $address, $name = '')
+ {
+ if (!preg_match('/^(to|cc|bcc|Reply-To)$/', $kind)) {
+ $this->setError($this->lang('Invalid recipient array') . ': ' . $kind);
+ if ($this->exceptions) {
+ throw new phpmailerException('Invalid recipient array: ' . $kind);
+ }
+ $this->edebug($this->lang('Invalid recipient array') . ': ' . $kind);
+ return false;
+ }
+ $address = trim($address);
+ $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
+ if (!$this->validateAddress($address)) {
+ $this->setError($this->lang('invalid_address') . ': ' . $address);
+ if ($this->exceptions) {
+ throw new phpmailerException($this->lang('invalid_address') . ': ' . $address);
+ }
+ $this->edebug($this->lang('invalid_address') . ': ' . $address);
+ return false;
+ }
+ if ($kind != 'Reply-To') {
+ if (!isset($this->all_recipients[strtolower($address)])) {
+ array_push($this->$kind, array($address, $name));
+ $this->all_recipients[strtolower($address)] = true;
+ return true;
+ }
+ } else {
+ if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
+ $this->ReplyTo[strtolower($address)] = array($address, $name);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Set the From and FromName properties.
+ * @param string $address
+ * @param string $name
+ * @param bool $auto Whether to also set the Sender address, defaults to true
+ * @throws phpmailerException
+ * @return bool
+ */
+ public function setFrom($address, $name = '', $auto = true)
+ {
+ $address = trim($address);
+ $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
+ if (!$this->validateAddress($address)) {
+ $this->setError($this->lang('invalid_address') . ': ' . $address);
+ if ($this->exceptions) {
+ throw new phpmailerException($this->lang('invalid_address') . ': ' . $address);
+ }
+ $this->edebug($this->lang('invalid_address') . ': ' . $address);
+ return false;
+ }
+ $this->From = $address;
+ $this->FromName = $name;
+ if ($auto) {
+ if (empty($this->Sender)) {
+ $this->Sender = $address;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Return the Message-ID header of the last email.
+ * Technically this is the value from the last time the headers were created,
+ * but it's also the message ID of the last sent message except in
+ * pathological cases.
+ * @return string
+ */
+ public function getLastMessageID()
+ {
+ return $this->lastMessageID;
+ }
+
+ /**
+ * Check that a string looks like an email address.
+ * @param string $address The email address to check
+ * @param string $patternselect A selector for the validation pattern to use :
+ * 'auto' - pick best one automatically;
+ * 'pcre8' - use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
+ * 'pcre' - use old PCRE implementation;
+ * 'php' - use PHP built-in FILTER_VALIDATE_EMAIL; faster, less thorough;
+ * 'noregex' - super fast, really dumb.
+ * @return bool
+ * @static
+ * @access public
+ */
+ public static function validateAddress($address, $patternselect = 'auto')
+ {
+ if ($patternselect == 'auto') {
+ if (defined(
+ 'PCRE_VERSION'
+ )
+ ) { //Check this instead of extension_loaded so it works when that function is disabled
+ if (version_compare(PCRE_VERSION, '8.0') >= 0) {
+ $patternselect = 'pcre8';
+ } else {
+ $patternselect = 'pcre';
+ }
+ } else {
+ //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
+ if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
+ $patternselect = 'php';
+ } else {
+ $patternselect = 'noregex';
+ }
+ }
+ }
+ switch ($patternselect) {
+ case 'pcre8':
+ /**
+ * Conforms to RFC5322: Uses *correct* regex on which FILTER_VALIDATE_EMAIL is
+ * based; So why not use FILTER_VALIDATE_EMAIL? Because it was broken to
+ * not allow a@b type valid addresses :(
+ * @link http://squiloople.com/2009/12/20/email-address-validation/
+ * @copyright 2009-2010 Michael Rushton
+ * Feel free to use and redistribute this code. But please keep this copyright notice.
+ */
+ return (bool)preg_match(
+ '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
+ '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
+ '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
+ '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
+ '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
+ '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
+ '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
+ '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
+ '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
+ $address
+ );
+ break;
+ case 'pcre':
+ //An older regex that doesn't need a recent PCRE
+ return (bool)preg_match(
+ '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
+ '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
+ '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
+ '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
+ '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
+ '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
+ '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
+ '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
+ '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
+ '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
+ $address
+ );
+ break;
+ case 'php':
+ default:
+ return (bool)filter_var($address, FILTER_VALIDATE_EMAIL);
+ break;
+ case 'noregex':
+ //No PCRE! Do something _very_ approximate!
+ //Check the address is 3 chars or longer and contains an @ that's not the first or last char
+ return (strlen($address) >= 3
+ and strpos($address, '@') >= 1
+ and strpos($address, '@') != strlen($address) - 1);
+ break;
+ }
+ }
+
+ /**
+ * Create a message and send it.
+ * Uses the sending method specified by $Mailer.
+ * Returns false on error - Use the ErrorInfo variable to view description of the error.
+ * @throws phpmailerException
+ * @return bool
+ */
+ public function send()
+ {
+ try {
+ if (!$this->preSend()) {
+ return false;
+ }
+ return $this->postSend();
+ } catch (phpmailerException $e) {
+ $this->mailHeader = '';
+ $this->setError($e->getMessage());
+ if ($this->exceptions) {
+ throw $e;
+ }
+ return false;
+ }
+ }
+
+ /**
+ * Prepare a message for sending.
+ * @throws phpmailerException
+ * @return bool
+ */
+ public function preSend()
+ {
+ try {
+ $this->mailHeader = "";
+ if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
+ throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
+ }
+
+ // Set whether the message is multipart/alternative
+ if (!empty($this->AltBody)) {
+ $this->ContentType = 'multipart/alternative';
+ }
+
+ $this->error_count = 0; // reset errors
+ $this->setMessageType();
+ // Refuse to send an empty message unless we are specifically allowing it
+ if (!$this->AllowEmpty and empty($this->Body)) {
+ throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
+ }
+
+ $this->MIMEHeader = $this->createHeader();
+ $this->MIMEBody = $this->createBody();
+
+ // To capture the complete message when using mail(), create
+ // an extra header list which createHeader() doesn't fold in
+ if ($this->Mailer == 'mail') {
+ if (count($this->to) > 0) {
+ $this->mailHeader .= $this->addrAppend("To", $this->to);
+ } else {
+ $this->mailHeader .= $this->headerLine("To", "undisclosed-recipients:;");
+ }
+ $this->mailHeader .= $this->headerLine(
+ 'Subject',
+ $this->encodeHeader($this->secureHeader(trim($this->Subject)))
+ );
+ }
+
+ // Sign with DKIM if enabled
+ if (!empty($this->DKIM_domain)
+ && !empty($this->DKIM_private)
+ && !empty($this->DKIM_selector)
+ && !empty($this->DKIM_domain)
+ && file_exists($this->DKIM_private)) {
+ $header_dkim = $this->DKIM_Add(
+ $this->MIMEHeader . $this->mailHeader,
+ $this->encodeHeader($this->secureHeader($this->Subject)),
+ $this->MIMEBody
+ );
+ $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
+ str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
+ }
+ return true;
+
+ } catch (phpmailerException $e) {
+ $this->setError($e->getMessage());
+ if ($this->exceptions) {
+ throw $e;
+ }
+ return false;
+ }
+ }
+
+ /**
+ * Actually send a message.
+ * Send the email via the selected mechanism
+ * @throws phpmailerException
+ * @return bool
+ */
+ public function postSend()
+ {
+ try {
+ // Choose the mailer and send through it
+ switch ($this->Mailer) {
+ case 'sendmail':
+ return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
+ case 'smtp':
+ return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
+ case 'mail':
+ return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
+ default:
+ return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
+ }
+ } catch (phpmailerException $e) {
+ $this->setError($e->getMessage());
+ if ($this->exceptions) {
+ throw $e;
+ }
+ $this->edebug($e->getMessage() . "\n");
+ }
+ return false;
+ }
+
+ /**
+ * Send mail using the $Sendmail program.
+ * @param string $header The message headers
+ * @param string $body The message body
+ * @see PHPMailer::$Sendmail
+ * @throws phpmailerException
+ * @access protected
+ * @return bool
+ */
+ protected function sendmailSend($header, $body)
+ {
+ if ($this->Sender != '') {
+ $sendmail = sprintf("%s -oi -f%s -t", escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender));
+ } else {
+ $sendmail = sprintf("%s -oi -t", escapeshellcmd($this->Sendmail));
+ }
+ if ($this->SingleTo === true) {
+ foreach ($this->SingleToArray as $val) {
+ if (!@$mail = popen($sendmail, 'w')) {
+ throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
+ }
+ fputs($mail, "To: " . $val . "\n");
+ fputs($mail, $header);
+ fputs($mail, $body);
+ $result = pclose($mail);
+ // implement call back function if it exists
+ $isSent = ($result == 0) ? 1 : 0;
+ $this->doCallback($isSent, $val, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
+ if ($result != 0) {
+ throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
+ }
+ }
+ } else {
+ if (!@$mail = popen($sendmail, 'w')) {
+ throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
+ }
+ fputs($mail, $header);
+ fputs($mail, $body);
+ $result = pclose($mail);
+ // implement call back function if it exists
+ $isSent = ($result == 0) ? 1 : 0;
+ $this->doCallback($isSent, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
+ if ($result != 0) {
+ throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Send mail using the PHP mail() function.
+ * @param string $header The message headers
+ * @param string $body The message body
+ * @link http://www.php.net/manual/en/book.mail.php
+ * @throws phpmailerException
+ * @access protected
+ * @return bool
+ */
+ protected function mailSend($header, $body)
+ {
+ $toArr = array();
+ foreach ($this->to as $t) {
+ $toArr[] = $this->addrFormat($t);
+ }
+ $to = implode(', ', $toArr);
+
+ if (empty($this->Sender)) {
+ $params = " ";
+ } else {
+ $params = sprintf("-f%s", $this->Sender);
+ }
+ if ($this->Sender != '' and !ini_get('safe_mode')) {
+ $old_from = ini_get('sendmail_from');
+ ini_set('sendmail_from', $this->Sender);
+ }
+ $rt = false;
+ if ($this->SingleTo === true && count($toArr) > 1) {
+ foreach ($toArr as $val) {
+ $rt = $this->mailPassthru($val, $this->Subject, $body, $header, $params);
+ // implement call back function if it exists
+ $isSent = ($rt == 1) ? 1 : 0;
+ $this->doCallback($isSent, $val, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
+ }
+ } else {
+ $rt = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
+ // implement call back function if it exists
+ $isSent = ($rt == 1) ? 1 : 0;
+ $this->doCallback($isSent, $to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
+ }
+ if (isset($old_from)) {
+ ini_set('sendmail_from', $old_from);
+ }
+ if (!$rt) {
+ throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
+ }
+ return true;
+ }
+
+ /**
+ * Get an instance to use for SMTP operations.
+ * Override this function to load your own SMTP implementation
+ * @return SMTP
+ */
+ public function getSMTPInstance()
+ {
+ if (!is_object($this->smtp)) {
+ $this->smtp = new SMTP;
+ }
+ return $this->smtp;
+ }
+
+ /**
+ * Send mail via SMTP.
+ * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
+ * Uses the PHPMailerSMTP class by default.
+ * @see PHPMailer::getSMTPInstance() to use a different class.
+ * @param string $header The message headers
+ * @param string $body The message body
+ * @throws phpmailerException
+ * @uses SMTP
+ * @access protected
+ * @return bool
+ */
+ protected function smtpSend($header, $body)
+ {
+ $bad_rcpt = array();
+
+ if (!$this->smtpConnect()) {
+ throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
+ }
+ $smtp_from = ($this->Sender == '') ? $this->From : $this->Sender;
+ if (!$this->smtp->mail($smtp_from)) {
+ $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
+ throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
+ }
+
+ // Attempt to send attach all recipients
+ foreach ($this->to as $to) {
+ if (!$this->smtp->recipient($to[0])) {
+ $bad_rcpt[] = $to[0];
+ $isSent = 0;
+ } else {
+ $isSent = 1;
+ }
+ $this->doCallback($isSent, $to[0], '', '', $this->Subject, $body, $this->From);
+ }
+ foreach ($this->cc as $cc) {
+ if (!$this->smtp->recipient($cc[0])) {
+ $bad_rcpt[] = $cc[0];
+ $isSent = 0;
+ } else {
+ $isSent = 1;
+ }
+ $this->doCallback($isSent, '', $cc[0], '', $this->Subject, $body, $this->From);
+ }
+ foreach ($this->bcc as $bcc) {
+ if (!$this->smtp->recipient($bcc[0])) {
+ $bad_rcpt[] = $bcc[0];
+ $isSent = 0;
+ } else {
+ $isSent = 1;
+ }
+ $this->doCallback($isSent, '', '', $bcc[0], $this->Subject, $body, $this->From);
+ }
+
+ if (count($bad_rcpt) > 0) { //Create error message for any bad addresses
+ throw new phpmailerException($this->lang('recipients_failed') . implode(', ', $bad_rcpt));
+ }
+ if (!$this->smtp->data($header . $body)) {
+ throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
+ }
+ if ($this->SMTPKeepAlive == true) {
+ $this->smtp->reset();
+ } else {
+ $this->smtp->quit();
+ $this->smtp->close();
+ }
+ return true;
+ }
+
+ /**
+ * Initiate a connection to an SMTP server.
+ * Returns false if the operation failed.
+ * @param array $options An array of options compatible with stream_context_create()
+ * @uses SMTP
+ * @access public
+ * @throws phpmailerException
+ * @return bool
+ */
+ public function smtpConnect($options = array())
+ {
+ if (is_null($this->smtp)) {
+ $this->smtp = $this->getSMTPInstance();
+ }
+
+ //Already connected?
+ if ($this->smtp->connected()) {
+ return true;
+ }
+
+ $this->smtp->setTimeout($this->Timeout);
+ $this->smtp->setDebugLevel($this->SMTPDebug);
+ $this->smtp->setDebugOutput($this->Debugoutput);
+ $this->smtp->setVerp($this->do_verp);
+ $tls = ($this->SMTPSecure == 'tls');
+ $ssl = ($this->SMTPSecure == 'ssl');
+ $hosts = explode(';', $this->Host);
+ $lastexception = null;
+
+ foreach ($hosts as $hostentry) {
+ $hostinfo = array();
+ $host = $hostentry;
+ $port = $this->Port;
+ if (preg_match(
+ '/^(.+):([0-9]+)$/',
+ $hostentry,
+ $hostinfo
+ )
+ ) { //If $hostentry contains 'address:port', override default
+ $host = $hostinfo[1];
+ $port = $hostinfo[2];
+ }
+ if ($this->smtp->connect(($ssl ? 'ssl://' : '') . $host, $port, $this->Timeout, $options)) {
+ try {
+ if ($this->Helo) {
+ $hello = $this->Helo;
+ } else {
+ $hello = $this->serverHostname();
+ }
+ $this->smtp->hello($hello);
+
+ if ($tls) {
+ if (!$this->smtp->startTLS()) {
+ throw new phpmailerException($this->lang('connect_host'));
+ }
+ //We must resend HELO after tls negotiation
+ $this->smtp->hello($hello);
+ }
+ if ($this->SMTPAuth) {
+ if (!$this->smtp->authenticate(
+ $this->Username,
+ $this->Password,
+ $this->AuthType,
+ $this->Realm,
+ $this->Workstation
+ )
+ ) {
+ throw new phpmailerException($this->lang('authenticate'));
+ }
+ }
+ return true;
+ } catch (phpmailerException $e) {
+ $lastexception = $e;
+ //We must have connected, but then failed TLS or Auth, so close connection nicely
+ $this->smtp->quit();
+ }
+ }
+ }
+ //If we get here, all connection attempts have failed, so close connection hard
+ $this->smtp->close();
+ //As we've caught all exceptions, just report whatever the last one was
+ if ($this->exceptions and !is_null($lastexception)) {
+ throw $lastexception;
+ }
+ return false;
+ }
+
+ /**
+ * Close the active SMTP session if one exists.
+ * @return void
+ */
+ public function smtpClose()
+ {
+ if ($this->smtp !== null) {
+ if ($this->smtp->connected()) {
+ $this->smtp->quit();
+ $this->smtp->close();
+ }
+ }
+ }
+
+ /**
+ * Set the language for error messages.
+ * Returns false if it cannot load the language file.
+ * The default language is English.
+ * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
+ * @param string $lang_path Path to the language file directory, with trailing separator (slash)
+ * @return bool
+ * @access public
+ */
+ public function setLanguage($langcode = 'en', $lang_path = 'language/')
+ {
+ //Define full set of translatable strings
+ $PHPMAILER_LANG = array(
+ 'authenticate' => 'SMTP Error: Could not authenticate.',
+ 'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
+ 'data_not_accepted' => 'SMTP Error: data not accepted.',
+ 'empty_message' => 'Message body empty',
+ 'encoding' => 'Unknown encoding: ',
+ 'execute' => 'Could not execute: ',
+ 'file_access' => 'Could not access file: ',
+ 'file_open' => 'File Error: Could not open file: ',
+ 'from_failed' => 'The following From address failed: ',
+ 'instantiate' => 'Could not instantiate mail function.',
+ 'invalid_address' => 'Invalid address',
+ 'mailer_not_supported' => ' mailer is not supported.',
+ 'provide_address' => 'You must provide at least one recipient email address.',
+ 'recipients_failed' => 'SMTP Error: The following recipients failed: ',
+ 'signing' => 'Signing Error: ',
+ 'smtp_connect_failed' => 'SMTP connect() failed.',
+ 'smtp_error' => 'SMTP server error: ',
+ 'variable_set' => 'Cannot set or reset variable: '
+ );
+ //Overwrite language-specific strings.
+ //This way we'll never have missing translations - no more "language string failed to load"!
+ $l = true;
+ if ($langcode != 'en') { //There is no English translation file
+ $l = @include $lang_path . 'phpmailer.lang-' . $langcode . '.php';
+ }
+ $this->language = $PHPMAILER_LANG;
+ return ($l == true); //Returns false if language not found
+ }
+
+ /**
+ * Get the array of strings for the current language.
+ * @return array
+ */
+ public function getTranslations()
+ {
+ return $this->language;
+ }
+
+ /**
+ * Create recipient headers.
+ * @access public
+ * @param string $type
+ * @param array $addr An array of recipient,
+ * where each recipient is a 2-element indexed array with element 0 containing an address
+ * and element 1 containing a name, like:
+ * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
+ * @return string
+ */
+ public function addrAppend($type, $addr)
+ {
+ $addresses = array();
+ foreach ($addr as $a) {
+ $addresses[] = $this->addrFormat($a);
+ }
+ return $type . ': ' . implode(', ', $addresses) . $this->LE;
+ }
+
+ /**
+ * Format an address for use in a message header.
+ * @access public
+ * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
+ * like array('joe@example.com', 'Joe User')
+ * @return string
+ */
+ public function addrFormat($addr)
+ {
+ if (empty($addr[1])) { // No name provided
+ return $this->secureHeader($addr[0]);
+ } else {
+ return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . " <" . $this->secureHeader(
+ $addr[0]
+ ) . ">";
+ }
+ }
+
+ /**
+ * Word-wrap message.
+ * For use with mailers that do not automatically perform wrapping
+ * and for quoted-printable encoded messages.
+ * Original written by philippe.
+ * @param string $message The message to wrap
+ * @param integer $length The line length to wrap to
+ * @param bool $qp_mode Whether to run in Quoted-Printable mode
+ * @access public
+ * @return string
+ */
+ public function wrapText($message, $length, $qp_mode = false)
+ {
+ $soft_break = ($qp_mode) ? sprintf(" =%s", $this->LE) : $this->LE;
+ // If utf-8 encoding is used, we will need to make sure we don't
+ // split multibyte characters when we wrap
+ $is_utf8 = (strtolower($this->CharSet) == "utf-8");
+ $lelen = strlen($this->LE);
+ $crlflen = strlen(self::CRLF);
+
+ $message = $this->fixEOL($message);
+ if (substr($message, -$lelen) == $this->LE) {
+ $message = substr($message, 0, -$lelen);
+ }
+
+ $line = explode($this->LE, $message); // Magic. We know fixEOL uses $LE
+ $message = '';
+ for ($i = 0; $i < count($line); $i++) {
+ $line_part = explode(' ', $line[$i]);
+ $buf = '';
+ for ($e = 0; $e < count($line_part); $e++) {
+ $word = $line_part[$e];
+ if ($qp_mode and (strlen($word) > $length)) {
+ $space_left = $length - strlen($buf) - $crlflen;
+ if ($e != 0) {
+ if ($space_left > 20) {
+ $len = $space_left;
+ if ($is_utf8) {
+ $len = $this->utf8CharBoundary($word, $len);
+ } elseif (substr($word, $len - 1, 1) == "=") {
+ $len--;
+ } elseif (substr($word, $len - 2, 1) == "=") {
+ $len -= 2;
+ }
+ $part = substr($word, 0, $len);
+ $word = substr($word, $len);
+ $buf .= ' ' . $part;
+ $message .= $buf . sprintf("=%s", self::CRLF);
+ } else {
+ $message .= $buf . $soft_break;
+ }
+ $buf = '';
+ }
+ while (strlen($word) > 0) {
+ if ($length <= 0) {
+ break;
+ }
+ $len = $length;
+ if ($is_utf8) {
+ $len = $this->utf8CharBoundary($word, $len);
+ } elseif (substr($word, $len - 1, 1) == "=") {
+ $len--;
+ } elseif (substr($word, $len - 2, 1) == "=") {
+ $len -= 2;
+ }
+ $part = substr($word, 0, $len);
+ $word = substr($word, $len);
+
+ if (strlen($word) > 0) {
+ $message .= $part . sprintf("=%s", self::CRLF);
+ } else {
+ $buf = $part;
+ }
+ }
+ } else {
+ $buf_o = $buf;
+ $buf .= ($e == 0) ? $word : (' ' . $word);
+
+ if (strlen($buf) > $length and $buf_o != '') {
+ $message .= $buf_o . $soft_break;
+ $buf = $word;
+ }
+ }
+ }
+ $message .= $buf . self::CRLF;
+ }
+
+ return $message;
+ }
+
+ /**
+ * Find the last character boundary prior to $maxLength in a utf-8
+ * quoted (printable) encoded string.
+ * Original written by Colin Brown.
+ * @access public
+ * @param string $encodedText utf-8 QP text
+ * @param int $maxLength find last character boundary prior to this length
+ * @return int
+ */
+ public function utf8CharBoundary($encodedText, $maxLength)
+ {
+ $foundSplitPos = false;
+ $lookBack = 3;
+ while (!$foundSplitPos) {
+ $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
+ $encodedCharPos = strpos($lastChunk, "=");
+ if ($encodedCharPos !== false) {
+ // Found start of encoded character byte within $lookBack block.
+ // Check the encoded byte value (the 2 chars after the '=')
+ $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
+ $dec = hexdec($hex);
+ if ($dec < 128) { // Single byte character.
+ // If the encoded char was found at pos 0, it will fit
+ // otherwise reduce maxLength to start of the encoded char
+ $maxLength = ($encodedCharPos == 0) ? $maxLength :
+ $maxLength - ($lookBack - $encodedCharPos);
+ $foundSplitPos = true;
+ } elseif ($dec >= 192) { // First byte of a multi byte character
+ // Reduce maxLength to split at start of character
+ $maxLength = $maxLength - ($lookBack - $encodedCharPos);
+ $foundSplitPos = true;
+ } elseif ($dec < 192) { // Middle byte of a multi byte character, look further back
+ $lookBack += 3;
+ }
+ } else {
+ // No encoded character found
+ $foundSplitPos = true;
+ }
+ }
+ return $maxLength;
+ }
+
+
+ /**
+ * Set the body wrapping.
+ * @access public
+ * @return void
+ */
+ public function setWordWrap()
+ {
+ if ($this->WordWrap < 1) {
+ return;
+ }
+
+ switch ($this->message_type) {
+ case 'alt':
+ case 'alt_inline':
+ case 'alt_attach':
+ case 'alt_inline_attach':
+ $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
+ break;
+ default:
+ $this->Body = $this->wrapText($this->Body, $this->WordWrap);
+ break;
+ }
+ }
+
+ /**
+ * Assemble message headers.
+ * @access public
+ * @return string The assembled headers
+ */
+ public function createHeader()
+ {
+ $result = '';
+
+ // Set the boundaries
+ $uniq_id = md5(uniqid(time()));
+ $this->boundary[1] = 'b1_' . $uniq_id;
+ $this->boundary[2] = 'b2_' . $uniq_id;
+ $this->boundary[3] = 'b3_' . $uniq_id;
+
+ if ($this->MessageDate == '') {
+ $result .= $this->headerLine('Date', self::rfcDate());
+ } else {
+ $result .= $this->headerLine('Date', $this->MessageDate);
+ }
+
+ if ($this->ReturnPath) {
+ $result .= $this->headerLine('Return-Path', '<' . trim($this->ReturnPath) . '>');
+ } elseif ($this->Sender == '') {
+ $result .= $this->headerLine('Return-Path', '<' . trim($this->From) . '>');
+ } else {
+ $result .= $this->headerLine('Return-Path', '<' . trim($this->Sender) . '>');
+ }
+
+ // To be created automatically by mail()
+ if ($this->Mailer != 'mail') {
+ if ($this->SingleTo === true) {
+ foreach ($this->to as $t) {
+ $this->SingleToArray[] = $this->addrFormat($t);
+ }
+ } else {
+ if (count($this->to) > 0) {
+ $result .= $this->addrAppend('To', $this->to);
+ } elseif (count($this->cc) == 0) {
+ $result .= $this->headerLine('To', 'undisclosed-recipients:;');
+ }
+ }
+ }
+
+ $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));
+
+ // sendmail and mail() extract Cc from the header before sending
+ if (count($this->cc) > 0) {
+ $result .= $this->addrAppend('Cc', $this->cc);
+ }
+
+ // sendmail and mail() extract Bcc from the header before sending
+ if ((($this->Mailer == 'sendmail') || ($this->Mailer == 'mail')) && (count($this->bcc) > 0)) {
+ $result .= $this->addrAppend('Bcc', $this->bcc);
+ }
+
+ if (count($this->ReplyTo) > 0) {
+ $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
+ }
+
+ // mail() sets the subject itself
+ if ($this->Mailer != 'mail') {
+ $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
+ }
+
+ if ($this->MessageID != '') {
+ $this->lastMessageID = $this->MessageID;
+ } else {
+ $this->lastMessageID = sprintf("<%s@%s>", $uniq_id, $this->ServerHostname());
+ }
+ $result .= $this->HeaderLine('Message-ID', $this->lastMessageID);
+ $result .= $this->headerLine('X-Priority', $this->Priority);
+ if ($this->XMailer == '') {
+ $result .= $this->headerLine(
+ 'X-Mailer',
+ 'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer/)'
+ );
+ } else {
+ $myXmailer = trim($this->XMailer);
+ if ($myXmailer) {
+ $result .= $this->headerLine('X-Mailer', $myXmailer);
+ }
+ }
+
+ if ($this->ConfirmReadingTo != '') {
+ $result .= $this->headerLine('Disposition-Notification-To', '<' . trim($this->ConfirmReadingTo) . '>');
+ }
+
+ // Add custom headers
+ for ($index = 0; $index < count($this->CustomHeader); $index++) {
+ $result .= $this->headerLine(
+ trim($this->CustomHeader[$index][0]),
+ $this->encodeHeader(trim($this->CustomHeader[$index][1]))
+ );
+ }
+ if (!$this->sign_key_file) {
+ $result .= $this->headerLine('MIME-Version', '1.0');
+ $result .= $this->getMailMIME();
+ }
+
+ return $result;
+ }
+
+ /**
+ * Get the message MIME type headers.
+ * @access public
+ * @return string
+ */
+ public function getMailMIME()
+ {
+ $result = '';
+ switch ($this->message_type) {
+ case 'inline':
+ $result .= $this->headerLine('Content-Type', 'multipart/related;');
+ $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
+ break;
+ case 'attach':
+ case 'inline_attach':
+ case 'alt_attach':
+ case 'alt_inline_attach':
+ $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
+ $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
+ break;
+ case 'alt':
+ case 'alt_inline':
+ $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
+ $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
+ break;
+ default:
+ // Catches case 'plain': and case '':
+ $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
+ break;
+ }
+ //RFC1341 part 5 says 7bit is assumed if not specified
+ if ($this->Encoding != '7bit') {
+ $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
+ }
+
+ if ($this->Mailer != 'mail') {
+ $result .= $this->LE;
+ }
+
+ return $result;
+ }
+
+ /**
+ * Returns the whole MIME message.
+ * Includes complete headers and body.
+ * Only valid post PreSend().
+ * @see PHPMailer::PreSend()
+ * @access public
+ * @return string
+ */
+ public function getSentMIMEMessage()
+ {
+ return $this->MIMEHeader . $this->mailHeader . self::CRLF . $this->MIMEBody;
+ }
+
+
+ /**
+ * Assemble the message body.
+ * Returns an empty string on failure.
+ * @access public
+ * @throws phpmailerException
+ * @return string The assembled message body
+ */
+ public function createBody()
+ {
+ $body = '';
+
+ if ($this->sign_key_file) {
+ $body .= $this->getMailMIME() . $this->LE;
+ }
+
+ $this->setWordWrap();
+
+ switch ($this->message_type) {
+ case 'inline':
+ $body .= $this->getBoundary($this->boundary[1], '', '', '');
+ $body .= $this->encodeString($this->Body, $this->Encoding);
+ $body .= $this->LE . $this->LE;
+ $body .= $this->attachAll('inline', $this->boundary[1]);
+ break;
+ case 'attach':
+ $body .= $this->getBoundary($this->boundary[1], '', '', '');
+ $body .= $this->encodeString($this->Body, $this->Encoding);
+ $body .= $this->LE . $this->LE;
+ $body .= $this->attachAll('attachment', $this->boundary[1]);
+ break;
+ case 'inline_attach':
+ $body .= $this->textLine('--' . $this->boundary[1]);
+ $body .= $this->headerLine('Content-Type', 'multipart/related;');
+ $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
+ $body .= $this->LE;
+ $body .= $this->getBoundary($this->boundary[2], '', '', '');
+ $body .= $this->encodeString($this->Body, $this->Encoding);
+ $body .= $this->LE . $this->LE;
+ $body .= $this->attachAll('inline', $this->boundary[2]);
+ $body .= $this->LE;
+ $body .= $this->attachAll('attachment', $this->boundary[1]);
+ break;
+ case 'alt':
+ $body .= $this->getBoundary($this->boundary[1], '', 'text/plain', '');
+ $body .= $this->encodeString($this->AltBody, $this->Encoding);
+ $body .= $this->LE . $this->LE;
+ $body .= $this->getBoundary($this->boundary[1], '', 'text/html', '');
+ $body .= $this->encodeString($this->Body, $this->Encoding);
+ $body .= $this->LE . $this->LE;
+ if (!empty($this->Ical)) {
+ $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
+ $body .= $this->encodeString($this->Ical, $this->Encoding);
+ $body .= $this->LE . $this->LE;
+ }
+ $body .= $this->endBoundary($this->boundary[1]);
+ break;
+ case 'alt_inline':
+ $body .= $this->getBoundary($this->boundary[1], '', 'text/plain', '');
+ $body .= $this->encodeString($this->AltBody, $this->Encoding);
+ $body .= $this->LE . $this->LE;
+ $body .= $this->textLine('--' . $this->boundary[1]);
+ $body .= $this->headerLine('Content-Type', 'multipart/related;');
+ $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
+ $body .= $this->LE;
+ $body .= $this->getBoundary($this->boundary[2], '', 'text/html', '');
+ $body .= $this->encodeString($this->Body, $this->Encoding);
+ $body .= $this->LE . $this->LE;
+ $body .= $this->attachAll('inline', $this->boundary[2]);
+ $body .= $this->LE;
+ $body .= $this->endBoundary($this->boundary[1]);
+ break;
+ case 'alt_attach':
+ $body .= $this->textLine('--' . $this->boundary[1]);
+ $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
+ $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
+ $body .= $this->LE;
+ $body .= $this->getBoundary($this->boundary[2], '', 'text/plain', '');
+ $body .= $this->encodeString($this->AltBody, $this->Encoding);
+ $body .= $this->LE . $this->LE;
+ $body .= $this->getBoundary($this->boundary[2], '', 'text/html', '');
+ $body .= $this->encodeString($this->Body, $this->Encoding);
+ $body .= $this->LE . $this->LE;
+ $body .= $this->endBoundary($this->boundary[2]);
+ $body .= $this->LE;
+ $body .= $this->attachAll('attachment', $this->boundary[1]);
+ break;
+ case 'alt_inline_attach':
+ $body .= $this->textLine('--' . $this->boundary[1]);
+ $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
+ $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
+ $body .= $this->LE;
+ $body .= $this->getBoundary($this->boundary[2], '', 'text/plain', '');
+ $body .= $this->encodeString($this->AltBody, $this->Encoding);
+ $body .= $this->LE . $this->LE;
+ $body .= $this->textLine('--' . $this->boundary[2]);
+ $body .= $this->headerLine('Content-Type', 'multipart/related;');
+ $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
+ $body .= $this->LE;
+ $body .= $this->getBoundary($this->boundary[3], '', 'text/html', '');
+ $body .= $this->encodeString($this->Body, $this->Encoding);
+ $body .= $this->LE . $this->LE;
+ $body .= $this->attachAll('inline', $this->boundary[3]);
+ $body .= $this->LE;
+ $body .= $this->endBoundary($this->boundary[2]);
+ $body .= $this->LE;
+ $body .= $this->attachAll('attachment', $this->boundary[1]);
+ break;
+ default:
+ // catch case 'plain' and case ''
+ $body .= $this->encodeString($this->Body, $this->Encoding);
+ break;
+ }
+
+ if ($this->isError()) {
+ $body = '';
+ } elseif ($this->sign_key_file) {
+ try {
+ if (!defined('PKCS7_TEXT')) {
+ throw new phpmailerException($this->lang('signing') . ' OpenSSL extension missing.');
+ }
+ $file = tempnam(sys_get_temp_dir(), 'mail');
+ file_put_contents($file, $body); //TODO check this worked
+ $signed = tempnam(sys_get_temp_dir(), 'signed');
+ if (@openssl_pkcs7_sign(
+ $file,
+ $signed,
+ 'file://' . realpath($this->sign_cert_file),
+ array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
+ null
+ )
+ ) {
+ @unlink($file);
+ $body = file_get_contents($signed);
+ @unlink($signed);
+ } else {
+ @unlink($file);
+ @unlink($signed);
+ throw new phpmailerException($this->lang('signing') . openssl_error_string());
+ }
+ } catch (phpmailerException $e) {
+ $body = '';
+ if ($this->exceptions) {
+ throw $e;
+ }
+ }
+ }
+ return $body;
+ }
+
+ /**
+ * Return the start of a message boundary.
+ * @access protected
+ * @param string $boundary
+ * @param string $charSet
+ * @param string $contentType
+ * @param string $encoding
+ * @return string
+ */
+ protected function getBoundary($boundary, $charSet, $contentType, $encoding)
+ {
+ $result = '';
+ if ($charSet == '') {
+ $charSet = $this->CharSet;
+ }
+ if ($contentType == '') {
+ $contentType = $this->ContentType;
+ }
+ if ($encoding == '') {
+ $encoding = $this->Encoding;
+ }
+ $result .= $this->textLine('--' . $boundary);
+ $result .= sprintf("Content-Type: %s; charset=%s", $contentType, $charSet);
+ $result .= $this->LE;
+ $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
+ $result .= $this->LE;
+
+ return $result;
+ }
+
+ /**
+ * Return the end of a message boundary.
+ * @access protected
+ * @param string $boundary
+ * @return string
+ */
+ protected function endBoundary($boundary)
+ {
+ return $this->LE . '--' . $boundary . '--' . $this->LE;
+ }
+
+ /**
+ * Set the message type.
+ * PHPMailer only supports some preset message types,
+ * not arbitrary MIME structures.
+ * @access protected
+ * @return void
+ */
+ protected function setMessageType()
+ {
+ $this->message_type = array();
+ if ($this->alternativeExists()) {
+ $this->message_type[] = "alt";
+ }
+ if ($this->inlineImageExists()) {
+ $this->message_type[] = "inline";
+ }
+ if ($this->attachmentExists()) {
+ $this->message_type[] = "attach";
+ }
+ $this->message_type = implode("_", $this->message_type);
+ if ($this->message_type == "") {
+ $this->message_type = "plain";
+ }
+ }
+
+ /**
+ * Format a header line.
+ * @access public
+ * @param string $name
+ * @param string $value
+ * @return string
+ */
+ public function headerLine($name, $value)
+ {
+ return $name . ': ' . $value . $this->LE;
+ }
+
+ /**
+ * Return a formatted mail line.
+ * @access public
+ * @param string $value
+ * @return string
+ */
+ public function textLine($value)
+ {
+ return $value . $this->LE;
+ }
+
+ /**
+ * Add an attachment from a path on the filesystem.
+ * Returns false if the file could not be found or read.
+ * @param string $path Path to the attachment.
+ * @param string $name Overrides the attachment name.
+ * @param string $encoding File encoding (see $Encoding).
+ * @param string $type File extension (MIME) type.
+ * @param string $disposition Disposition to use
+ * @throws phpmailerException
+ * @return bool
+ */
+ public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
+ {
+ try {
+ if (!@is_file($path)) {
+ throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
+ }
+
+ //If a MIME type is not specified, try to work it out from the file name
+ if ($type == '') {
+ $type = self::filenameToType($path);
+ }
+
+ $filename = basename($path);
+ if ($name == '') {
+ $name = $filename;
+ }
+
+ $this->attachment[] = array(
+ 0 => $path,
+ 1 => $filename,
+ 2 => $name,
+ 3 => $encoding,
+ 4 => $type,
+ 5 => false, // isStringAttachment
+ 6 => $disposition,
+ 7 => 0
+ );
+
+ } catch (phpmailerException $e) {
+ $this->setError($e->getMessage());
+ if ($this->exceptions) {
+ throw $e;
+ }
+ $this->edebug($e->getMessage() . "\n");
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Return the array of attachments.
+ * @return array
+ */
+ public function getAttachments()
+ {
+ return $this->attachment;
+ }
+
+ /**
+ * Attach all file, string, and binary attachments to the message.
+ * Returns an empty string on failure.
+ * @access protected
+ * @param string $disposition_type
+ * @param string $boundary
+ * @return string
+ */
+ protected function attachAll($disposition_type, $boundary)
+ {
+ // Return text of body
+ $mime = array();
+ $cidUniq = array();
+ $incl = array();
+
+ // Add all attachments
+ foreach ($this->attachment as $attachment) {
+ // Check if it is a valid disposition_filter
+ if ($attachment[6] == $disposition_type) {
+ // Check for string attachment
+ $string = '';
+ $path = '';
+ $bString = $attachment[5];
+ if ($bString) {
+ $string = $attachment[0];
+ } else {
+ $path = $attachment[0];
+ }
+
+ $inclhash = md5(serialize($attachment));
+ if (in_array($inclhash, $incl)) {
+ continue;
+ }
+ $incl[] = $inclhash;
+ $name = $attachment[2];
+ $encoding = $attachment[3];
+ $type = $attachment[4];
+ $disposition = $attachment[6];
+ $cid = $attachment[7];
+ if ($disposition == 'inline' && isset($cidUniq[$cid])) {
+ continue;
+ }
+ $cidUniq[$cid] = true;
+
+ $mime[] = sprintf("--%s%s", $boundary, $this->LE);
+ $mime[] = sprintf(
+ "Content-Type: %s; name=\"%s\"%s",
+ $type,
+ $this->encodeHeader($this->secureHeader($name)),
+ $this->LE
+ );
+ $mime[] = sprintf("Content-Transfer-Encoding: %s%s", $encoding, $this->LE);
+
+ if ($disposition == 'inline') {
+ $mime[] = sprintf("Content-ID: <%s>%s", $cid, $this->LE);
+ }
+
+ // If a filename contains any of these chars, it should be quoted,
+ // but not otherwise: RFC2183 & RFC2045 5.1
+ // Fixes a warning in IETF's msglint MIME checker
+ // Allow for bypassing the Content-Disposition header totally
+ if (!(empty($disposition))) {
+ if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $name)) {
+ $mime[] = sprintf(
+ "Content-Disposition: %s; filename=\"%s\"%s",
+ $disposition,
+ $this->encodeHeader($this->secureHeader($name)),
+ $this->LE . $this->LE
+ );
+ } else {
+ $mime[] = sprintf(
+ "Content-Disposition: %s; filename=%s%s",
+ $disposition,
+ $this->encodeHeader($this->secureHeader($name)),
+ $this->LE . $this->LE
+ );
+ }
+ } else {
+ $mime[] = $this->LE;
+ }
+
+ // Encode as string attachment
+ if ($bString) {
+ $mime[] = $this->encodeString($string, $encoding);
+ if ($this->isError()) {
+ return '';
+ }
+ $mime[] = $this->LE . $this->LE;
+ } else {
+ $mime[] = $this->encodeFile($path, $encoding);
+ if ($this->isError()) {
+ return '';
+ }
+ $mime[] = $this->LE . $this->LE;
+ }
+ }
+ }
+
+ $mime[] = sprintf("--%s--%s", $boundary, $this->LE);
+
+ return implode("", $mime);
+ }
+
+ /**
+ * Encode a file attachment in requested format.
+ * Returns an empty string on failure.
+ * @param string $path The full path to the file
+ * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
+ * @throws phpmailerException
+ * @see EncodeFile(encodeFile
+ * @access protected
+ * @return string
+ */
+ protected function encodeFile($path, $encoding = 'base64')
+ {
+ try {
+ if (!is_readable($path)) {
+ throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
+ }
+ $magic_quotes = get_magic_quotes_runtime();
+ if ($magic_quotes) {
+ if (version_compare(PHP_VERSION, '5.3.0', '<')) {
+ set_magic_quotes_runtime(0);
+ } else {
+ ini_set('magic_quotes_runtime', 0);
+ }
+ }
+ $file_buffer = file_get_contents($path);
+ $file_buffer = $this->encodeString($file_buffer, $encoding);
+ if ($magic_quotes) {
+ if (version_compare(PHP_VERSION, '5.3.0', '<')) {
+ set_magic_quotes_runtime($magic_quotes);
+ } else {
+ ini_set('magic_quotes_runtime', $magic_quotes);
+ }
+ }
+ return $file_buffer;
+ } catch (Exception $e) {
+ $this->setError($e->getMessage());
+ return '';
+ }
+ }
+
+ /**
+ * Encode a string in requested format.
+ * Returns an empty string on failure.
+ * @param string $str The text to encode
+ * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
+ * @access public
+ * @return string
+ */
+ public function encodeString($str, $encoding = 'base64')
+ {
+ $encoded = '';
+ switch (strtolower($encoding)) {
+ case 'base64':
+ $encoded = chunk_split(base64_encode($str), 76, $this->LE);
+ break;
+ case '7bit':
+ case '8bit':
+ $encoded = $this->fixEOL($str);
+ //Make sure it ends with a line break
+ if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
+ $encoded .= $this->LE;
+ }
+ break;
+ case 'binary':
+ $encoded = $str;
+ break;
+ case 'quoted-printable':
+ $encoded = $this->encodeQP($str);
+ break;
+ default:
+ $this->setError($this->lang('encoding') . $encoding);
+ break;
+ }
+ return $encoded;
+ }
+
+ /**
+ * Encode a header string optimally.
+ * Picks shortest of Q, B, quoted-printable or none.
+ * @access public
+ * @param string $str
+ * @param string $position
+ * @return string
+ */
+ public function encodeHeader($str, $position = 'text')
+ {
+ $x = 0;
+ switch (strtolower($position)) {
+ case 'phrase':
+ if (!preg_match('/[\200-\377]/', $str)) {
+ // Can't use addslashes as we don't know what value has magic_quotes_sybase
+ $encoded = addcslashes($str, "\0..\37\177\\\"");
+ if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
+ return ($encoded);
+ } else {
+ return ("\"$encoded\"");
+ }
+ }
+ $x = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
+ break;
+ /** @noinspection PhpMissingBreakStatementInspection */
+ case 'comment':
+ $x = preg_match_all('/[()"]/', $str, $matches);
+ // Intentional fall-through
+ case 'text':
+ default:
+ $x += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
+ break;
+ }
+
+ if ($x == 0) { //There are no chars that need encoding
+ return ($str);
+ }
+
+ $maxlen = 75 - 7 - strlen($this->CharSet);
+ // Try to select the encoding which should produce the shortest output
+ if ($x > strlen($str) / 3) {
+ //More than a third of the content will need encoding, so B encoding will be most efficient
+ $encoding = 'B';
+ if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
+ // Use a custom function which correctly encodes and wraps long
+ // multibyte strings without breaking lines within a character
+ $encoded = $this->base64EncodeWrapMB($str, "\n");
+ } else {
+ $encoded = base64_encode($str);
+ $maxlen -= $maxlen % 4;
+ $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
+ }
+ } else {
+ $encoding = 'Q';
+ $encoded = $this->encodeQ($str, $position);
+ $encoded = $this->wrapText($encoded, $maxlen, true);
+ $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
+ }
+
+ $encoded = preg_replace('/^(.*)$/m', " =?" . $this->CharSet . "?$encoding?\\1?=", $encoded);
+ $encoded = trim(str_replace("\n", $this->LE, $encoded));
+
+ return $encoded;
+ }
+
+ /**
+ * Check if a string contains multi-byte characters.
+ * @access public
+ * @param string $str multi-byte text to wrap encode
+ * @return bool
+ */
+ public function hasMultiBytes($str)
+ {
+ if (function_exists('mb_strlen')) {
+ return (strlen($str) > mb_strlen($str, $this->CharSet));
+ } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
+ return false;
+ }
+ }
+
+ /**
+ * Encode and wrap long multibyte strings for mail headers
+ * without breaking lines within a character.
+ * Adapted from a function by paravoid at http://uk.php.net/manual/en/function.mb-encode-mimeheader.php
+ * @access public
+ * @param string $str multi-byte text to wrap encode
+ * @param string $lf string to use as linefeed/end-of-line
+ * @return string
+ */
+ public function base64EncodeWrapMB($str, $lf = null)
+ {
+ $start = "=?" . $this->CharSet . "?B?";
+ $end = "?=";
+ $encoded = "";
+ if ($lf === null) {
+ $lf = $this->LE;
+ }
+
+ $mb_length = mb_strlen($str, $this->CharSet);
+ // Each line must have length <= 75, including $start and $end
+ $length = 75 - strlen($start) - strlen($end);
+ // Average multi-byte ratio
+ $ratio = $mb_length / strlen($str);
+ // Base64 has a 4:3 ratio
+ $avgLength = floor($length * $ratio * .75);
+
+ for ($i = 0; $i < $mb_length; $i += $offset) {
+ $lookBack = 0;
+ do {
+ $offset = $avgLength - $lookBack;
+ $chunk = mb_substr($str, $i, $offset, $this->CharSet);
+ $chunk = base64_encode($chunk);
+ $lookBack++;
+ } while (strlen($chunk) > $length);
+ $encoded .= $chunk . $lf;
+ }
+
+ // Chomp the last linefeed
+ $encoded = substr($encoded, 0, -strlen($lf));
+ return $encoded;
+ }
+
+ /**
+ * Encode a string in quoted-printable format.
+ * According to RFC2045 section 6.7.
+ * @access public
+ * @param string $string The text to encode
+ * @param integer $line_max Number of chars allowed on a line before wrapping
+ * @return string
+ * @link PHP version adapted from http://www.php.net/manual/en/function.quoted-printable-decode.php#89417
+ */
+ public function encodeQP($string, $line_max = 76)
+ {
+ if (function_exists('quoted_printable_encode')) { //Use native function if it's available (>= PHP5.3)
+ return quoted_printable_encode($string);
+ }
+ //Fall back to a pure PHP implementation
+ $string = str_replace(
+ array('%20', '%0D%0A.', '%0D%0A', '%'),
+ array(' ', "\r\n=2E", "\r\n", '='),
+ rawurlencode($string)
+ );
+ $string = preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
+ return $string;
+ }
+
+ /**
+ * Backward compatibility wrapper for an old QP encoding function that was removed.
+ * @see PHPMailer::encodeQP()
+ * @access public
+ * @param string $string
+ * @param integer $line_max
+ * @param bool $space_conv
+ * @return string
+ * @deprecated Use encodeQP instead.
+ */
+ public function encodeQPphp(
+ $string,
+ $line_max = 76,
+ /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
+ ) {
+ return $this->encodeQP($string, $line_max);
+ }
+
+ /**
+ * Encode a string using Q encoding.
+ * @link http://tools.ietf.org/html/rfc2047
+ * @param string $str the text to encode
+ * @param string $position Where the text is going to be used, see the RFC for what that means
+ * @access public
+ * @return string
+ */
+ public function encodeQ($str, $position = 'text')
+ {
+ //There should not be any EOL in the string
+ $pattern = '';
+ $encoded = str_replace(array("\r", "\n"), '', $str);
+ switch (strtolower($position)) {
+ case 'phrase':
+ //RFC 2047 section 5.3
+ $pattern = '^A-Za-z0-9!*+\/ -';
+ break;
+ /** @noinspection PhpMissingBreakStatementInspection */
+ case 'comment':
+ //RFC 2047 section 5.2
+ $pattern = '\(\)"';
+ //intentional fall-through
+ //for this reason we build the $pattern without including delimiters and []
+ case 'text':
+ default:
+ //RFC 2047 section 5.1
+ //Replace every high ascii, control, =, ? and _ characters
+ $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
+ break;
+ }
+ $matches = array();
+ if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
+ //If the string contains an '=', make sure it's the first thing we replace
+ //so as to avoid double-encoding
+ $s = array_search('=', $matches[0]);
+ if ($s !== false) {
+ unset($matches[0][$s]);
+ array_unshift($matches[0], '=');
+ }
+ foreach (array_unique($matches[0]) as $char) {
+ $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
+ }
+ }
+ //Replace every spaces to _ (more readable than =20)
+ return str_replace(' ', '_', $encoded);
+ }
+
+
+ /**
+ * Add a string or binary attachment (non-filesystem).
+ * This method can be used to attach ascii or binary data,
+ * such as a BLOB record from a database.
+ * @param string $string String attachment data.
+ * @param string $filename Name of the attachment.
+ * @param string $encoding File encoding (see $Encoding).
+ * @param string $type File extension (MIME) type.
+ * @param string $disposition Disposition to use
+ * @return void
+ */
+ public function addStringAttachment(
+ $string,
+ $filename,
+ $encoding = 'base64',
+ $type = '',
+ $disposition = 'attachment'
+ ) {
+ //If a MIME type is not specified, try to work it out from the file name
+ if ($type == '') {
+ $type = self::filenameToType($filename);
+ }
+ // Append to $attachment array
+ $this->attachment[] = array(
+ 0 => $string,
+ 1 => $filename,
+ 2 => basename($filename),
+ 3 => $encoding,
+ 4 => $type,
+ 5 => true, // isStringAttachment
+ 6 => $disposition,
+ 7 => 0
+ );
+ }
+
+ /**
+ * Add an embedded (inline) attachment from a file.
+ * This can include images, sounds, and just about any other document type.
+ * These differ from 'regular' attachmants in that they are intended to be
+ * displayed inline with the message, not just attached for download.
+ * This is used in HTML messages that embed the images
+ * the HTML refers to using the $cid value.
+ * @param string $path Path to the attachment.
+ * @param string $cid Content ID of the attachment; Use this to reference
+ * the content when using an embedded image in HTML.
+ * @param string $name Overrides the attachment name.
+ * @param string $encoding File encoding (see $Encoding).
+ * @param string $type File MIME type.
+ * @param string $disposition Disposition to use
+ * @return bool True on successfully adding an attachment
+ */
+ public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
+ {
+ if (!@is_file($path)) {
+ $this->setError($this->lang('file_access') . $path);
+ return false;
+ }
+
+ //If a MIME type is not specified, try to work it out from the file name
+ if ($type == '') {
+ $type = self::filenameToType($path);
+ }
+
+ $filename = basename($path);
+ if ($name == '') {
+ $name = $filename;
+ }
+
+ // Append to $attachment array
+ $this->attachment[] = array(
+ 0 => $path,
+ 1 => $filename,
+ 2 => $name,
+ 3 => $encoding,
+ 4 => $type,
+ 5 => false, // isStringAttachment
+ 6 => $disposition,
+ 7 => $cid
+ );
+ return true;
+ }
+
+ /**
+ * Add an embedded stringified attachment.
+ * This can include images, sounds, and just about any other document type.
+ * Be sure to set the $type to an image type for images:
+ * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
+ * @param string $string The attachment binary data.
+ * @param string $cid Content ID of the attachment; Use this to reference
+ * the content when using an embedded image in HTML.
+ * @param string $name
+ * @param string $encoding File encoding (see $Encoding).
+ * @param string $type MIME type.
+ * @param string $disposition Disposition to use
+ * @return bool True on successfully adding an attachment
+ */
+ public function addStringEmbeddedImage(
+ $string,
+ $cid,
+ $name = '',
+ $encoding = 'base64',
+ $type = '',
+ $disposition = 'inline'
+ ) {
+ //If a MIME type is not specified, try to work it out from the name
+ if ($type == '') {
+ $type = self::filenameToType($name);
+ }
+
+ // Append to $attachment array
+ $this->attachment[] = array(
+ 0 => $string,
+ 1 => $name,
+ 2 => $name,
+ 3 => $encoding,
+ 4 => $type,
+ 5 => true, // isStringAttachment
+ 6 => $disposition,
+ 7 => $cid
+ );
+ return true;
+ }
+
+ /**
+ * Check if an inline attachment is present.
+ * @access public
+ * @return bool
+ */
+ public function inlineImageExists()
+ {
+ foreach ($this->attachment as $attachment) {
+ if ($attachment[6] == 'inline') {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Check if an attachment (non-inline) is present.
+ * @return bool
+ */
+ public function attachmentExists()
+ {
+ foreach ($this->attachment as $attachment) {
+ if ($attachment[6] == 'attachment') {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Check if this message has an alternative body set.
+ * @return bool
+ */
+ public function alternativeExists()
+ {
+ return !empty($this->AltBody);
+ }
+
+ /**
+ * Clear all To recipients.
+ * @return void
+ */
+ public function clearAddresses()
+ {
+ foreach ($this->to as $to) {
+ unset($this->all_recipients[strtolower($to[0])]);
+ }
+ $this->to = array();
+ }
+
+ /**
+ * Clear all CC recipients.
+ * @return void
+ */
+ public function clearCCs()
+ {
+ foreach ($this->cc as $cc) {
+ unset($this->all_recipients[strtolower($cc[0])]);
+ }
+ $this->cc = array();
+ }
+
+ /**
+ * Clear all BCC recipients.
+ * @return void
+ */
+ public function clearBCCs()
+ {
+ foreach ($this->bcc as $bcc) {
+ unset($this->all_recipients[strtolower($bcc[0])]);
+ }
+ $this->bcc = array();
+ }
+
+ /**
+ * Clear all ReplyTo recipients.
+ * @return void
+ */
+ public function clearReplyTos()
+ {
+ $this->ReplyTo = array();
+ }
+
+ /**
+ * Clear all recipient types.
+ * @return void
+ */
+ public function clearAllRecipients()
+ {
+ $this->to = array();
+ $this->cc = array();
+ $this->bcc = array();
+ $this->all_recipients = array();
+ }
+
+ /**
+ * Clear all filesystem, string, and binary attachments.
+ * @return void
+ */
+ public function clearAttachments()
+ {
+ $this->attachment = array();
+ }
+
+ /**
+ * Clear all custom headers.
+ * @return void
+ */
+ public function clearCustomHeaders()
+ {
+ $this->CustomHeader = array();
+ }
+
+ /**
+ * Add an error message to the error container.
+ * @access protected
+ * @param string $msg
+ * @return void
+ */
+ protected function setError($msg)
+ {
+ $this->error_count++;
+ if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
+ $lasterror = $this->smtp->getError();
+ if (!empty($lasterror) and array_key_exists('smtp_msg', $lasterror)) {
+ $msg .= '<p>' . $this->lang('smtp_error') . $lasterror['smtp_msg'] . "</p>\n";
+ }
+ }
+ $this->ErrorInfo = $msg;
+ }
+
+ /**
+ * Return an RFC 822 formatted date.
+ * @access public
+ * @return string
+ * @static
+ */
+ public static function rfcDate()
+ {
+ //Set the time zone to whatever the default is to avoid 500 errors
+ //Will default to UTC if it's not set properly in php.ini
+ date_default_timezone_set(@date_default_timezone_get());
+ return date('D, j M Y H:i:s O');
+ }
+
+ /**
+ * Get the server hostname.
+ * Returns 'localhost.localdomain' if unknown.
+ * @access protected
+ * @return string
+ */
+ protected function serverHostname()
+ {
+ if (!empty($this->Hostname)) {
+ $result = $this->Hostname;
+ } elseif (isset($_SERVER['SERVER_NAME'])) {
+ $result = $_SERVER['SERVER_NAME'];
+ } else {
+ $result = 'localhost.localdomain';
+ }
+
+ return $result;
+ }
+
+ /**
+ * Get an error message in the current language.
+ * @access protected
+ * @param string $key
+ * @return string
+ */
+ protected function lang($key)
+ {
+ if (count($this->language) < 1) {
+ $this->setLanguage('en'); // set the default language
+ }
+
+ if (isset($this->language[$key])) {
+ return $this->language[$key];
+ } else {
+ return 'Language string failed to load: ' . $key;
+ }
+ }
+
+ /**
+ * Check if an error occurred.
+ * @access public
+ * @return bool True if an error did occur.
+ */
+ public function isError()
+ {
+ return ($this->error_count > 0);
+ }
+
+ /**
+ * Ensure consistent line endings in a string.
+ * Changes every end of line from CRLF, CR or LF to $this->LE.
+ * @access public
+ * @param string $str String to fixEOL
+ * @return string
+ */
+ public function fixEOL($str)
+ {
+ // Normalise to \n
+ $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
+ // Now convert LE as needed
+ if ($this->LE !== "\n") {
+ $nstr = str_replace("\n", $this->LE, $nstr);
+ }
+ return $nstr;
+ }
+
+ /**
+ * Add a custom header.
+ * $name value can be overloaded to contain
+ * both header name and value (name:value)
+ * @access public
+ * @param string $name Custom header name
+ * @param string $value Header value
+ * @return void
+ */
+ public function addCustomHeader($name, $value = null)
+ {
+ if ($value === null) {
+ // Value passed in as name:value
+ $this->CustomHeader[] = explode(':', $name, 2);
+ } else {
+ $this->CustomHeader[] = array($name, $value);
+ }
+ }
+
+ /**
+ * Create a message from an HTML string.
+ * Automatically makes modifications for inline images and backgrounds
+ * and creates a plain-text version by converting the HTML.
+ * Overwrites any existing values in $this->Body and $this->AltBody
+ * @access public
+ * @param string $message HTML message string
+ * @param string $basedir baseline directory for path
+ * @param bool $advanced Whether to use the advanced HTML to text converter
+ * @return string $message
+ */
+ public function msgHTML($message, $basedir = '', $advanced = false)
+ {
+ preg_match_all("/(src|background)=[\"'](.*)[\"']/Ui", $message, $images);
+ if (isset($images[2])) {
+ foreach ($images[2] as $i => $url) {
+ // do not change urls for absolute images (thanks to corvuscorax)
+ if (!preg_match('#^[A-z]+://#', $url)) {
+ $filename = basename($url);
+ $directory = dirname($url);
+ if ($directory == '.') {
+ $directory = '';
+ }
+ $cid = md5($url) . '@phpmailer.0'; //RFC2392 S 2
+ if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
+ $basedir .= '/';
+ }
+ if (strlen($directory) > 1 && substr($directory, -1) != '/') {
+ $directory .= '/';
+ }
+ if ($this->addEmbeddedImage(
+ $basedir . $directory . $filename,
+ $cid,
+ $filename,
+ 'base64',
+ self::_mime_types(self::mb_pathinfo($filename, PATHINFO_EXTENSION))
+ )
+ ) {
+ $message = preg_replace(
+ "/" . $images[1][$i] . "=[\"']" . preg_quote($url, '/') . "[\"']/Ui",
+ $images[1][$i] . "=\"cid:" . $cid . "\"",
+ $message
+ );
+ }
+ }
+ }
+ }
+ $this->isHTML(true);
+ if (empty($this->AltBody)) {
+ $this->AltBody = 'To view this email message, open it in a program that understands HTML!' . "\n\n";
+ }
+ //Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
+ $this->Body = $this->normalizeBreaks($message);
+ $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
+ return $this->Body;
+ }
+
+ /**
+ * Convert an HTML string into plain text.
+ * @param string $html The HTML text to convert
+ * @param bool $advanced Should this use the more complex html2text converter or just a simple one?
+ * @return string
+ */
+ public function html2text($html, $advanced = false)
+ {
+ if ($advanced) {
+ require_once 'extras/class.html2text.php';
+ $h = new html2text($html);
+ return $h->get_text();
+ }
+ return html_entity_decode(
+ trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
+ ENT_QUOTES,
+ $this->CharSet
+ );
+ }
+
+ /**
+ * Get the MIME type for a file extension.
+ * @param string $ext File extension
+ * @access public
+ * @return string MIME type of file.
+ * @static
+ */
+ public static function _mime_types($ext = '')
+ {
+ $mimes = array(
+ 'xl' => 'application/excel',
+ 'hqx' => 'application/mac-binhex40',
+ 'cpt' => 'application/mac-compactpro',
+ 'bin' => 'application/macbinary',
+ 'doc' => 'application/msword',
+ 'word' => 'application/msword',
+ 'class' => 'application/octet-stream',
+ 'dll' => 'application/octet-stream',
+ 'dms' => 'application/octet-stream',
+ 'exe' => 'application/octet-stream',
+ 'lha' => 'application/octet-stream',
+ 'lzh' => 'application/octet-stream',
+ 'psd' => 'application/octet-stream',
+ 'sea' => 'application/octet-stream',
+ 'so' => 'application/octet-stream',
+ 'oda' => 'application/oda',
+ 'pdf' => 'application/pdf',
+ 'ai' => 'application/postscript',
+ 'eps' => 'application/postscript',
+ 'ps' => 'application/postscript',
+ 'smi' => 'application/smil',
+ 'smil' => 'application/smil',
+ 'mif' => 'application/vnd.mif',
+ 'xls' => 'application/vnd.ms-excel',
+ 'ppt' => 'application/vnd.ms-powerpoint',
+ 'wbxml' => 'application/vnd.wap.wbxml',
+ 'wmlc' => 'application/vnd.wap.wmlc',
+ 'dcr' => 'application/x-director',
+ 'dir' => 'application/x-director',
+ 'dxr' => 'application/x-director',
+ 'dvi' => 'application/x-dvi',
+ 'gtar' => 'application/x-gtar',
+ 'php3' => 'application/x-httpd-php',
+ 'php4' => 'application/x-httpd-php',
+ 'php' => 'application/x-httpd-php',
+ 'phtml' => 'application/x-httpd-php',
+ 'phps' => 'application/x-httpd-php-source',
+ 'js' => 'application/x-javascript',
+ 'swf' => 'application/x-shockwave-flash',
+ 'sit' => 'application/x-stuffit',
+ 'tar' => 'application/x-tar',
+ 'tgz' => 'application/x-tar',
+ 'xht' => 'application/xhtml+xml',
+ 'xhtml' => 'application/xhtml+xml',
+ 'zip' => 'application/zip',
+ 'mid' => 'audio/midi',
+ 'midi' => 'audio/midi',
+ 'mp2' => 'audio/mpeg',
+ 'mp3' => 'audio/mpeg',
+ 'mpga' => 'audio/mpeg',
+ 'aif' => 'audio/x-aiff',
+ 'aifc' => 'audio/x-aiff',
+ 'aiff' => 'audio/x-aiff',
+ 'ram' => 'audio/x-pn-realaudio',
+ 'rm' => 'audio/x-pn-realaudio',
+ 'rpm' => 'audio/x-pn-realaudio-plugin',
+ 'ra' => 'audio/x-realaudio',
+ 'wav' => 'audio/x-wav',
+ 'bmp' => 'image/bmp',
+ 'gif' => 'image/gif',
+ 'jpeg' => 'image/jpeg',
+ 'jpe' => 'image/jpeg',
+ 'jpg' => 'image/jpeg',
+ 'png' => 'image/png',
+ 'tiff' => 'image/tiff',
+ 'tif' => 'image/tiff',
+ 'eml' => 'message/rfc822',
+ 'css' => 'text/css',
+ 'html' => 'text/html',
+ 'htm' => 'text/html',
+ 'shtml' => 'text/html',
+ 'log' => 'text/plain',
+ 'text' => 'text/plain',
+ 'txt' => 'text/plain',
+ 'rtx' => 'text/richtext',
+ 'rtf' => 'text/rtf',
+ 'xml' => 'text/xml',
+ 'xsl' => 'text/xml',
+ 'mpeg' => 'video/mpeg',
+ 'mpe' => 'video/mpeg',
+ 'mpg' => 'video/mpeg',
+ 'mov' => 'video/quicktime',
+ 'qt' => 'video/quicktime',
+ 'rv' => 'video/vnd.rn-realvideo',
+ 'avi' => 'video/x-msvideo',
+ 'movie' => 'video/x-sgi-movie'
+ );
+ return (array_key_exists(strtolower($ext), $mimes) ? $mimes[strtolower($ext)]: 'application/octet-stream');
+ }
+
+ /**
+ * Map a file name to a MIME type.
+ * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
+ * @param string $filename A file name or full path, does not need to exist as a file
+ * @return string
+ * @static
+ */
+ public static function filenameToType($filename)
+ {
+ //In case the path is a URL, strip any query string before getting extension
+ $qpos = strpos($filename, '?');
+ if ($qpos !== false) {
+ $filename = substr($filename, 0, $qpos);
+ }
+ $pathinfo = self::mb_pathinfo($filename);
+ return self::_mime_types($pathinfo['extension']);
+ }
+
+ /**
+ * Multi-byte-safe pathinfo replacement.
+ * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
+ * Works similarly to the one in PHP >= 5.2.0
+ * @link http://www.php.net/manual/en/function.pathinfo.php#107461
+ * @param string $path A filename or path, does not need to exist as a file
+ * @param integer|string $options Either a PATHINFO_* constant,
+ * or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
+ * @return string|array
+ * @static
+ */
+ public static function mb_pathinfo($path, $options = null)
+ {
+ $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
+ $m = array();
+ preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $m);
+ if (array_key_exists(1, $m)) {
+ $ret['dirname'] = $m[1];
+ }
+ if (array_key_exists(2, $m)) {
+ $ret['basename'] = $m[2];
+ }
+ if (array_key_exists(5, $m)) {
+ $ret['extension'] = $m[5];
+ }
+ if (array_key_exists(3, $m)) {
+ $ret['filename'] = $m[3];
+ }
+ switch ($options) {
+ case PATHINFO_DIRNAME:
+ case 'dirname':
+ return $ret['dirname'];
+ break;
+ case PATHINFO_BASENAME:
+ case 'basename':
+ return $ret['basename'];
+ break;
+ case PATHINFO_EXTENSION:
+ case 'extension':
+ return $ret['extension'];
+ break;
+ case PATHINFO_FILENAME:
+ case 'filename':
+ return $ret['filename'];
+ break;
+ default:
+ return $ret;
+ }
+ }
+
+ /**
+ * Set or reset instance properties.
+ *
+ * Usage Example:
+ * $page->set('X-Priority', '3');
+ *
+ * @access public
+ * @param string $name
+ * @param mixed $value
+ * NOTE: will not work with arrays, there are no arrays to set/reset
+ * @throws phpmailerException
+ * @return bool
+ * @todo Should this not be using __set() magic function?
+ */
+ public function set($name, $value = '')
+ {
+ try {
+ if (isset($this->$name)) {
+ $this->$name = $value;
+ } else {
+ throw new phpmailerException($this->lang('variable_set') . $name, self::STOP_CRITICAL);
+ }
+ } catch (Exception $e) {
+ $this->setError($e->getMessage());
+ if ($e->getCode() == self::STOP_CRITICAL) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Strip newlines to prevent header injection.
+ * @access public
+ * @param string $str
+ * @return string
+ */
+ public function secureHeader($str)
+ {
+ return trim(str_replace(array("\r", "\n"), '', $str));
+ }
+
+ /**
+ * Normalize line breaks in a string.
+ * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
+ * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
+ * @param string $text
+ * @param string $breaktype What kind of line break to use, defaults to CRLF
+ * @return string
+ * @access public
+ * @static
+ */
+ public static function normalizeBreaks($text, $breaktype = "\r\n")
+ {
+ return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
+ }
+
+
+ /**
+ * Set the private key file and password for S/MIME signing.
+ * @access public
+ * @param string $cert_filename
+ * @param string $key_filename
+ * @param string $key_pass Password for private key
+ */
+ public function sign($cert_filename, $key_filename, $key_pass)
+ {
+ $this->sign_cert_file = $cert_filename;
+ $this->sign_key_file = $key_filename;
+ $this->sign_key_pass = $key_pass;
+ }
+
+ /**
+ * Quoted-Printable-encode a DKIM header.
+ * @access public
+ * @param string $txt
+ * @return string
+ */
+ public function DKIM_QP($txt)
+ {
+ $line = '';
+ for ($i = 0; $i < strlen($txt); $i++) {
+ $ord = ord($txt[$i]);
+ if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
+ $line .= $txt[$i];
+ } else {
+ $line .= "=" . sprintf("%02X", $ord);
+ }
+ }
+ return $line;
+ }
+
+ /**
+ * Generate a DKIM signature.
+ * @access public
+ * @param string $s Header
+ * @throws phpmailerException
+ * @return string
+ */
+ public function DKIM_Sign($s)
+ {
+ if (!defined('PKCS7_TEXT')) {
+ if ($this->exceptions) {
+ throw new phpmailerException($this->lang("signing") . ' OpenSSL extension missing.');
+ }
+ return '';
+ }
+ $privKeyStr = file_get_contents($this->DKIM_private);
+ if ($this->DKIM_passphrase != '') {
+ $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
+ } else {
+ $privKey = $privKeyStr;
+ }
+ if (openssl_sign($s, $signature, $privKey)) {
+ return base64_encode($signature);
+ }
+ return '';
+ }
+
+ /**
+ * Generate a DKIM canonicalization header.
+ * @access public
+ * @param string $s Header
+ * @return string
+ */
+ public function DKIM_HeaderC($s)
+ {
+ $s = preg_replace("/\r\n\s+/", " ", $s);
+ $lines = explode("\r\n", $s);
+ foreach ($lines as $key => $line) {
+ list($heading, $value) = explode(":", $line, 2);
+ $heading = strtolower($heading);
+ $value = preg_replace("/\s+/", " ", $value); // Compress useless spaces
+ $lines[$key] = $heading . ":" . trim($value); // Don't forget to remove WSP around the value
+ }
+ $s = implode("\r\n", $lines);
+ return $s;
+ }
+
+ /**
+ * Generate a DKIM canonicalization body.
+ * @access public
+ * @param string $body Message Body
+ * @return string
+ */
+ public function DKIM_BodyC($body)
+ {
+ if ($body == '') {
+ return "\r\n";
+ }
+ // stabilize line endings
+ $body = str_replace("\r\n", "\n", $body);
+ $body = str_replace("\n", "\r\n", $body);
+ // END stabilize line endings
+ while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
+ $body = substr($body, 0, strlen($body) - 2);
+ }
+ return $body;
+ }
+
+ /**
+ * Create the DKIM header and body in a new message header.
+ * @access public
+ * @param string $headers_line Header lines
+ * @param string $subject Subject
+ * @param string $body Body
+ * @return string
+ */
+ public function DKIM_Add($headers_line, $subject, $body)
+ {
+ $DKIMsignatureType = 'rsa-sha1'; // Signature & hash algorithms
+ $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
+ $DKIMquery = 'dns/txt'; // Query method
+ $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
+ $subject_header = "Subject: $subject";
+ $headers = explode($this->LE, $headers_line);
+ $from_header = '';
+ $to_header = '';
+ $current = '';
+ foreach ($headers as $header) {
+ if (strpos($header, 'From:') === 0) {
+ $from_header = $header;
+ $current = 'from_header';
+ } elseif (strpos($header, 'To:') === 0) {
+ $to_header = $header;
+ $current = 'to_header';
+ } else {
+ if ($current && strpos($header, ' =?') === 0) {
+ $current .= $header;
+ } else {
+ $current = '';
+ }
+ }
+ }
+ $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
+ $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
+ $subject = str_replace(
+ '|',
+ '=7C',
+ $this->DKIM_QP($subject_header)
+ ); // Copied header fields (dkim-quoted-printable)
+ $body = $this->DKIM_BodyC($body);
+ $DKIMlen = strlen($body); // Length of body
+ $DKIMb64 = base64_encode(pack("H*", sha1($body))); // Base64 of packed binary SHA-1 hash of body
+ $ident = ($this->DKIM_identity == '') ? '' : " i=" . $this->DKIM_identity . ";";
+ $dkimhdrs = "DKIM-Signature: v=1; a=" .
+ $DKIMsignatureType . "; q=" .
+ $DKIMquery . "; l=" .
+ $DKIMlen . "; s=" .
+ $this->DKIM_selector .
+ ";\r\n" .
+ "\tt=" . $DKIMtime . "; c=" . $DKIMcanonicalization . ";\r\n" .
+ "\th=From:To:Subject;\r\n" .
+ "\td=" . $this->DKIM_domain . ";" . $ident . "\r\n" .
+ "\tz=$from\r\n" .
+ "\t|$to\r\n" .
+ "\t|$subject;\r\n" .
+ "\tbh=" . $DKIMb64 . ";\r\n" .
+ "\tb=";
+ $toSign = $this->DKIM_HeaderC(
+ $from_header . "\r\n" . $to_header . "\r\n" . $subject_header . "\r\n" . $dkimhdrs
+ );
+ $signed = $this->DKIM_Sign($toSign);
+ return $dkimhdrs . $signed . "\r\n";
+ }
+
+ /**
+ * Perform a callback.
+ * @param bool $isSent
+ * @param string $to
+ * @param string $cc
+ * @param string $bcc
+ * @param string $subject
+ * @param string $body
+ * @param string $from
+ */
+ protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from = null)
+ {
+ if (!empty($this->action_function) && is_callable($this->action_function)) {
+ $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
+ call_user_func_array($this->action_function, $params);
+ }
+ }
+}
+
+/**
+ * PHPMailer exception handler
+ * @package PHPMailer
+ */
+class phpmailerException extends Exception
+{
+ /**
+ * Prettify error message output
+ * @return string
+ */
+ public function errorMessage()
+ {
+ $errorMsg = '<strong>' . $this->getMessage() . "</strong><br />\n";
+ return $errorMsg;
+ }
+}
diff --git a/include/phpmailer/class.smtp.php b/include/phpmailer/class.smtp.php
new file mode 100644
index 000000000..e6b45222d
--- /dev/null
+++ b/include/phpmailer/class.smtp.php
@@ -0,0 +1,943 @@
+<?php
+/**
+ * PHPMailer RFC821 SMTP email transport class.
+ * Version 5.2.7
+ * PHP version 5.0.0
+ * @category PHP
+ * @package PHPMailer
+ * @link https://github.com/PHPMailer/PHPMailer/
+ * @author Marcus Bointon (coolbru) <phpmailer@synchromedia.co.uk>
+ * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
+ * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
+ * @copyright 2013 Marcus Bointon
+ * @copyright 2004 - 2008 Andy Prevost
+ * @copyright 2010 - 2012 Jim Jagielski
+ * @license http://www.gnu.org/copyleft/lesser.html Distributed under the Lesser General Public License (LGPL)
+ */
+
+/**
+ * PHPMailer RFC821 SMTP email transport class.
+ *
+ * Implements RFC 821 SMTP commands
+ * and provides some utility methods for sending mail to an SMTP server.
+ *
+ * PHP Version 5.0.0
+ *
+ * @category PHP
+ * @package PHPMailer
+ * @link https://github.com/PHPMailer/PHPMailer/blob/master/class.smtp.php
+ * @author Chris Ryan <unknown@example.com>
+ * @author Marcus Bointon <phpmailer@synchromedia.co.uk>
+ * @license http://www.gnu.org/copyleft/lesser.html Distributed under the Lesser General Public License (LGPL)
+ */
+
+class SMTP
+{
+ /**
+ * The PHPMailer SMTP Version number.
+ */
+ const VERSION = '5.2.7';
+
+ /**
+ * SMTP line break constant.
+ */
+ const CRLF = "\r\n";
+
+ /**
+ * The SMTP port to use if one is not specified.
+ */
+ const DEFAULT_SMTP_PORT = 25;
+
+ /**
+ * The PHPMailer SMTP Version number.
+ * @type string
+ * @deprecated This should be a constant
+ * @see SMTP::VERSION
+ */
+ public $Version = '5.2.7';
+
+ /**
+ * SMTP server port number.
+ * @type int
+ * @deprecated This is only ever ued as default value, so should be a constant
+ * @see SMTP::DEFAULT_SMTP_PORT
+ */
+ public $SMTP_PORT = 25;
+
+ /**
+ * SMTP reply line ending
+ * @type string
+ * @deprecated Use the class constant instead
+ * @see SMTP::CRLF
+ */
+ public $CRLF = "\r\n";
+
+ /**
+ * Debug output level.
+ * Options: 0 for no output, 1 for commands, 2 for data and commands
+ * @type int
+ */
+ public $do_debug = 0;
+
+ /**
+ * The function/method to use for debugging output.
+ * Options: 'echo', 'html' or 'error_log'
+ * @type string
+ */
+ public $Debugoutput = 'echo';
+
+ /**
+ * Whether to use VERP.
+ * @type bool
+ */
+ public $do_verp = false;
+
+ /**
+ * The SMTP timeout value for reads, in seconds.
+ * @type int
+ */
+ public $Timeout = 15;
+
+ /**
+ * The SMTP timelimit value for reads, in seconds.
+ * @type int
+ */
+ public $Timelimit = 30;
+
+ /**
+ * The socket for the server connection.
+ * @type resource
+ */
+ protected $smtp_conn;
+
+ /**
+ * Error message, if any, for the last call.
+ * @type string
+ */
+ protected $error = '';
+
+ /**
+ * The reply the server sent to us for HELO.
+ * @type string
+ */
+ protected $helo_rply = '';
+
+ /**
+ * The most recent reply received from the server.
+ * @type string
+ */
+ protected $last_reply = '';
+
+ /**
+ * Constructor.
+ * @access public
+ */
+ public function __construct()
+ {
+ $this->smtp_conn = 0;
+ $this->error = null;
+ $this->helo_rply = null;
+
+ $this->do_debug = 0;
+ }
+
+ /**
+ * Output debugging info via a user-selected method.
+ * @param string $str Debug string to output
+ * @return void
+ */
+ protected function edebug($str)
+ {
+ switch ($this->Debugoutput) {
+ case 'error_log':
+ //Don't output, just log
+ error_log($str);
+ break;
+ case 'html':
+ //Cleans up output a bit for a better looking, HTML-safe output
+ echo htmlentities(
+ preg_replace('/[\r\n]+/', '', $str),
+ ENT_QUOTES,
+ 'UTF-8'
+ )
+ . "<br>\n";
+ break;
+ case 'echo':
+ default:
+ //Just echoes whatever was received
+ echo $str;
+ }
+ }
+
+ /**
+ * Connect to an SMTP server.
+ * @param string $host SMTP server IP or host name
+ * @param int $port The port number to connect to
+ * @param int $timeout How long to wait for the connection to open
+ * @param array $options An array of options for stream_context_create()
+ * @access public
+ * @return bool
+ */
+ public function connect($host, $port = null, $timeout = 30, $options = array())
+ {
+ // Clear errors to avoid confusion
+ $this->error = null;
+
+ // Make sure we are __not__ connected
+ if ($this->connected()) {
+ // Already connected, generate error
+ $this->error = array('error' => 'Already connected to a server');
+ return false;
+ }
+
+ if (empty($port)) {
+ $port = self::DEFAULT_SMTP_PORT;
+ }
+
+ // Connect to the SMTP server
+ $errno = 0;
+ $errstr = '';
+ $socket_context = stream_context_create($options);
+ //Suppress errors; connection failures are handled at a higher level
+ $this->smtp_conn = @stream_socket_client(
+ $host . ":" . $port,
+ $errno,
+ $errstr,
+ $timeout,
+ STREAM_CLIENT_CONNECT,
+ $socket_context
+ );
+
+ // Verify we connected properly
+ if (empty($this->smtp_conn)) {
+ $this->error = array(
+ 'error' => 'Failed to connect to server',
+ 'errno' => $errno,
+ 'errstr' => $errstr
+ );
+ if ($this->do_debug >= 1) {
+ $this->edebug(
+ 'SMTP -> ERROR: ' . $this->error['error']
+ . ": $errstr ($errno)"
+ );
+ }
+ return false;
+ }
+
+ // SMTP server can take longer to respond, give longer timeout for first read
+ // Windows does not have support for this timeout function
+ if (substr(PHP_OS, 0, 3) != 'WIN') {
+ $max = ini_get('max_execution_time');
+ if ($max != 0 && $timeout > $max) { // Don't bother if unlimited
+ @set_time_limit($timeout);
+ }
+ stream_set_timeout($this->smtp_conn, $timeout, 0);
+ }
+
+ // Get any announcement
+ $announce = $this->get_lines();
+
+ if ($this->do_debug >= 2) {
+ $this->edebug('SMTP -> FROM SERVER:' . $announce);
+ }
+
+ return true;
+ }
+
+ /**
+ * Initiate a TLS (encrypted) session.
+ * @access public
+ * @return bool
+ */
+ public function startTLS()
+ {
+ if (!$this->sendCommand("STARTTLS", "STARTTLS", 220)) {
+ return false;
+ }
+ // Begin encrypted connection
+ if (!stream_socket_enable_crypto(
+ $this->smtp_conn,
+ true,
+ STREAM_CRYPTO_METHOD_TLS_CLIENT
+ )
+ ) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Perform SMTP authentication.
+ * Must be run after hello().
+ * @see hello()
+ * @param string $username The user name
+ * @param string $password The password
+ * @param string $authtype The auth type (PLAIN, LOGIN, NTLM, CRAM-MD5)
+ * @param string $realm The auth realm for NTLM
+ * @param string $workstation The auth workstation for NTLM
+ * @access public
+ * @return bool True if successfully authenticated.
+ */
+ public function authenticate(
+ $username,
+ $password,
+ $authtype = 'LOGIN',
+ $realm = '',
+ $workstation = ''
+ ) {
+ if (empty($authtype)) {
+ $authtype = 'LOGIN';
+ }
+
+ switch ($authtype) {
+ case 'PLAIN':
+ // Start authentication
+ if (!$this->sendCommand('AUTH', 'AUTH PLAIN', 334)) {
+ return false;
+ }
+ // Send encoded username and password
+ if (!$this->sendCommand(
+ 'User & Password',
+ base64_encode("\0" . $username . "\0" . $password),
+ 235
+ )
+ ) {
+ return false;
+ }
+ break;
+ case 'LOGIN':
+ // Start authentication
+ if (!$this->sendCommand('AUTH', 'AUTH LOGIN', 334)) {
+ return false;
+ }
+ if (!$this->sendCommand("Username", base64_encode($username), 334)) {
+ return false;
+ }
+ if (!$this->sendCommand("Password", base64_encode($password), 235)) {
+ return false;
+ }
+ break;
+ case 'NTLM':
+ /*
+ * ntlm_sasl_client.php
+ * Bundled with Permission
+ *
+ * How to telnet in windows:
+ * http://technet.microsoft.com/en-us/library/aa995718%28EXCHG.65%29.aspx
+ * PROTOCOL Docs http://curl.haxx.se/rfc/ntlm.html#ntlmSmtpAuthentication
+ */
+ require_once 'extras/ntlm_sasl_client.php';
+ $temp = new stdClass();
+ $ntlm_client = new ntlm_sasl_client_class;
+ //Check that functions are available
+ if (!$ntlm_client->Initialize($temp)) {
+ $this->error = array('error' => $temp->error);
+ if ($this->do_debug >= 1) {
+ $this->edebug(
+ 'You need to enable some modules in your php.ini file: '
+ . $this->error['error']
+ );
+ }
+ return false;
+ }
+ //msg1
+ $msg1 = $ntlm_client->TypeMsg1($realm, $workstation); //msg1
+
+ if (!$this->sendCommand(
+ 'AUTH NTLM',
+ 'AUTH NTLM ' . base64_encode($msg1),
+ 334
+ )
+ ) {
+ return false;
+ }
+
+ //Though 0 based, there is a white space after the 3 digit number
+ //msg2
+ $challenge = substr($this->last_reply, 3);
+ $challenge = base64_decode($challenge);
+ $ntlm_res = $ntlm_client->NTLMResponse(
+ substr($challenge, 24, 8),
+ $password
+ );
+ //msg3
+ $msg3 = $ntlm_client->TypeMsg3(
+ $ntlm_res,
+ $username,
+ $realm,
+ $workstation
+ );
+ // send encoded username
+ return $this->sendCommand('Username', base64_encode($msg3), 235);
+ break;
+ case 'CRAM-MD5':
+ // Start authentication
+ if (!$this->sendCommand('AUTH CRAM-MD5', 'AUTH CRAM-MD5', 334)) {
+ return false;
+ }
+ // Get the challenge
+ $challenge = base64_decode(substr($this->last_reply, 4));
+
+ // Build the response
+ $response = $username . ' ' . $this->hmac($challenge, $password);
+
+ // send encoded credentials
+ return $this->sendCommand('Username', base64_encode($response), 235);
+ break;
+ }
+ return true;
+ }
+
+ /**
+ * Calculate an MD5 HMAC hash.
+ * Works like hash_hmac('md5', $data, $key)
+ * in case that function is not available
+ * @param string $data The data to hash
+ * @param string $key The key to hash with
+ * @access protected
+ * @return string
+ */
+ protected function hmac($data, $key)
+ {
+ if (function_exists('hash_hmac')) {
+ return hash_hmac('md5', $data, $key);
+ }
+
+ // The following borrowed from
+ // http://php.net/manual/en/function.mhash.php#27225
+
+ // RFC 2104 HMAC implementation for php.
+ // Creates an md5 HMAC.
+ // Eliminates the need to install mhash to compute a HMAC
+ // Hacked by Lance Rushing
+
+ $b = 64; // byte length for md5
+ if (strlen($key) > $b) {
+ $key = pack('H*', md5($key));
+ }
+ $key = str_pad($key, $b, chr(0x00));
+ $ipad = str_pad('', $b, chr(0x36));
+ $opad = str_pad('', $b, chr(0x5c));
+ $k_ipad = $key ^ $ipad;
+ $k_opad = $key ^ $opad;
+
+ return md5($k_opad . pack('H*', md5($k_ipad . $data)));
+ }
+
+ /**
+ * Check connection state.
+ * @access public
+ * @return bool True if connected.
+ */
+ public function connected()
+ {
+ if (!empty($this->smtp_conn)) {
+ $sock_status = stream_get_meta_data($this->smtp_conn);
+ if ($sock_status['eof']) {
+ // the socket is valid but we are not connected
+ if ($this->do_debug >= 1) {
+ $this->edebug(
+ 'SMTP -> NOTICE: EOF caught while checking if connected'
+ );
+ }
+ $this->close();
+ return false;
+ }
+ return true; // everything looks good
+ }
+ return false;
+ }
+
+ /**
+ * Close the socket and clean up the state of the class.
+ * Don't use this function without first trying to use QUIT.
+ * @see quit()
+ * @access public
+ * @return void
+ */
+ public function close()
+ {
+ $this->error = null; // so there is no confusion
+ $this->helo_rply = null;
+ if (!empty($this->smtp_conn)) {
+ // close the connection and cleanup
+ fclose($this->smtp_conn);
+ $this->smtp_conn = 0;
+ }
+ }
+
+ /**
+ * Send an SMTP DATA command.
+ * Issues a data command and sends the msg_data to the server,
+ * finializing the mail transaction. $msg_data is the message
+ * that is to be send with the headers. Each header needs to be
+ * on a single line followed by a <CRLF> with the message headers
+ * and the message body being separated by and additional <CRLF>.
+ * Implements rfc 821: DATA <CRLF>
+ * @param string $msg_data Message data to send
+ * @access public
+ * @return bool
+ */
+ public function data($msg_data)
+ {
+ if (!$this->sendCommand('DATA', 'DATA', 354)) {
+ return false;
+ }
+
+ /* The server is ready to accept data!
+ * according to rfc821 we should not send more than 1000
+ * including the CRLF
+ * characters on a single line so we will break the data up
+ * into lines by \r and/or \n then if needed we will break
+ * each of those into smaller lines to fit within the limit.
+ * in addition we will be looking for lines that start with
+ * a period '.' and append and additional period '.' to that
+ * line. NOTE: this does not count towards limit.
+ */
+
+ // Normalize the line breaks before exploding
+ $msg_data = str_replace("\r\n", "\n", $msg_data);
+ $msg_data = str_replace("\r", "\n", $msg_data);
+ $lines = explode("\n", $msg_data);
+
+ /* We need to find a good way to determine if headers are
+ * in the msg_data or if it is a straight msg body
+ * currently I am assuming rfc822 definitions of msg headers
+ * and if the first field of the first line (':' separated)
+ * does not contain a space then it _should_ be a header
+ * and we can process all lines before a blank "" line as
+ * headers.
+ */
+
+ $field = substr($lines[0], 0, strpos($lines[0], ':'));
+ $in_headers = false;
+ if (!empty($field) && !strstr($field, ' ')) {
+ $in_headers = true;
+ }
+
+ //RFC 2822 section 2.1.1 limit
+ $max_line_length = 998;
+
+ foreach ($lines as $line) {
+ $lines_out = null;
+ if ($line == '' && $in_headers) {
+ $in_headers = false;
+ }
+ // ok we need to break this line up into several smaller lines
+ while (strlen($line) > $max_line_length) {
+ $pos = strrpos(substr($line, 0, $max_line_length), ' ');
+
+ // Patch to fix DOS attack
+ if (!$pos) {
+ $pos = $max_line_length - 1;
+ $lines_out[] = substr($line, 0, $pos);
+ $line = substr($line, $pos);
+ } else {
+ $lines_out[] = substr($line, 0, $pos);
+ $line = substr($line, $pos + 1);
+ }
+
+ /* If processing headers add a LWSP-char to the front of new line
+ * rfc822 on long msg headers
+ */
+ if ($in_headers) {
+ $line = "\t" . $line;
+ }
+ }
+ $lines_out[] = $line;
+
+ // send the lines to the server
+ while (list(, $line_out) = @each($lines_out)) {
+ if (strlen($line_out) > 0) {
+ if (substr($line_out, 0, 1) == '.') {
+ $line_out = '.' . $line_out;
+ }
+ }
+ $this->client_send($line_out . self::CRLF);
+ }
+ }
+
+ // Message data has been sent, complete the command
+ return $this->sendCommand('DATA END', '.', 250);
+ }
+
+ /**
+ * Send an SMTP HELO or EHLO command.
+ * Used to identify the sending server to the receiving server.
+ * This makes sure that client and server are in a known state.
+ * Implements from RFC 821: HELO <SP> <domain> <CRLF>
+ * and RFC 2821 EHLO.
+ * @param string $host The host name or IP to connect to
+ * @access public
+ * @return bool
+ */
+ public function hello($host = '')
+ {
+ // Try extended hello first (RFC 2821)
+ if (!$this->sendHello('EHLO', $host)) {
+ if (!$this->sendHello('HELO', $host)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Send an SMTP HELO or EHLO command.
+ * Low-level implementation used by hello()
+ * @see hello()
+ * @param string $hello The HELO string
+ * @param string $host The hostname to say we are
+ * @access protected
+ * @return bool
+ */
+ protected function sendHello($hello, $host)
+ {
+ $noerror = $this->sendCommand($hello, $hello . ' ' . $host, 250);
+ $this->helo_rply = $this->last_reply;
+ return $noerror;
+ }
+
+ /**
+ * Send an SMTP MAIL command.
+ * Starts a mail transaction from the email address specified in
+ * $from. Returns true if successful or false otherwise. If True
+ * the mail transaction is started and then one or more recipient
+ * commands may be called followed by a data command.
+ * Implements rfc 821: MAIL <SP> FROM:<reverse-path> <CRLF>
+ * @param string $from Source address of this message
+ * @access public
+ * @return bool
+ */
+ public function mail($from)
+ {
+ $useVerp = ($this->do_verp ? ' XVERP' : '');
+ return $this->sendCommand(
+ 'MAIL FROM',
+ 'MAIL FROM:<' . $from . '>' . $useVerp,
+ 250
+ );
+ }
+
+ /**
+ * Send an SMTP QUIT command.
+ * Closes the socket if there is no error or the $close_on_error argument is true.
+ * Implements from rfc 821: QUIT <CRLF>
+ * @param bool $close_on_error Should the connection close if an error occurs?
+ * @access public
+ * @return bool
+ */
+ public function quit($close_on_error = true)
+ {
+ $noerror = $this->sendCommand('QUIT', 'QUIT', 221);
+ $e = $this->error; //Save any error
+ if ($noerror or $close_on_error) {
+ $this->close();
+ $this->error = $e; //Restore any error from the quit command
+ }
+ return $noerror;
+ }
+
+ /**
+ * Send an SMTP RCPT command.
+ * Sets the TO argument to $to.
+ * Returns true if the recipient was accepted false if it was rejected.
+ * Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF>
+ * @param string $to The address the message is being sent to
+ * @access public
+ * @return bool
+ */
+ public function recipient($to)
+ {
+ return $this->sendCommand(
+ 'RCPT TO ',
+ 'RCPT TO:<' . $to . '>',
+ array(250, 251)
+ );
+ }
+
+ /**
+ * Send an SMTP RSET command.
+ * Abort any transaction that is currently in progress.
+ * Implements rfc 821: RSET <CRLF>
+ * @access public
+ * @return bool True on success.
+ */
+ public function reset()
+ {
+ return $this->sendCommand('RSET', 'RSET', 250);
+ }
+
+ /**
+ * Send a command to an SMTP server and check its return code.
+ * @param string $command The command name - not sent to the server
+ * @param string $commandstring The actual command to send
+ * @param int|array $expect One or more expected integer success codes
+ * @access protected
+ * @return bool True on success.
+ */
+ protected function sendCommand($command, $commandstring, $expect)
+ {
+ if (!$this->connected()) {
+ $this->error = array(
+ "error" => "Called $command without being connected"
+ );
+ return false;
+ }
+ $this->client_send($commandstring . self::CRLF);
+
+ $reply = $this->get_lines();
+ $code = substr($reply, 0, 3);
+
+ if ($this->do_debug >= 2) {
+ $this->edebug('SMTP -> FROM SERVER:' . $reply);
+ }
+
+ if (!in_array($code, (array)$expect)) {
+ $this->last_reply = null;
+ $this->error = array(
+ "error" => "$command command failed",
+ "smtp_code" => $code,
+ "detail" => substr($reply, 4)
+ );
+ if ($this->do_debug >= 1) {
+ $this->edebug(
+ 'SMTP -> ERROR: ' . $this->error['error'] . ': ' . $reply
+ );
+ }
+ return false;
+ }
+
+ $this->last_reply = $reply;
+ $this->error = null;
+ return true;
+ }
+
+ /**
+ * Send an SMTP SAML command.
+ * Starts a mail transaction from the email address specified in $from.
+ * Returns true if successful or false otherwise. If True
+ * the mail transaction is started and then one or more recipient
+ * commands may be called followed by a data command. This command
+ * will send the message to the users terminal if they are logged
+ * in and send them an email.
+ * Implements rfc 821: SAML <SP> FROM:<reverse-path> <CRLF>
+ * @param string $from The address the message is from
+ * @access public
+ * @return bool
+ */
+ public function sendAndMail($from)
+ {
+ return $this->sendCommand("SAML", "SAML FROM:$from", 250);
+ }
+
+ /**
+ * Send an SMTP VRFY command.
+ * @param string $name The name to verify
+ * @access public
+ * @return bool
+ */
+ public function verify($name)
+ {
+ return $this->sendCommand("VRFY", "VRFY $name", array(250, 251));
+ }
+
+ /**
+ * Send an SMTP NOOP command.
+ * Used to keep keep-alives alive, doesn't actually do anything
+ * @access public
+ * @return bool
+ */
+ public function noop()
+ {
+ return $this->sendCommand("NOOP", "NOOP", 250);
+ }
+
+ /**
+ * Send an SMTP TURN command.
+ * This is an optional command for SMTP that this class does not support.
+ * This method is here to make the RFC821 Definition
+ * complete for this class and __may__ be implemented in future
+ * Implements from rfc 821: TURN <CRLF>
+ * @access public
+ * @return bool
+ */
+ public function turn()
+ {
+ $this->error = array(
+ 'error' => 'The SMTP TURN command is not implemented'
+ );
+ if ($this->do_debug >= 1) {
+ $this->edebug('SMTP -> NOTICE: ' . $this->error['error']);
+ }
+ return false;
+ }
+
+ /**
+ * Send raw data to the server.
+ * @param string $data The data to send
+ * @access public
+ * @return int|bool The number of bytes sent to the server or FALSE on error
+ */
+ public function client_send($data)
+ {
+ if ($this->do_debug >= 1) {
+ $this->edebug("CLIENT -> SMTP: $data");
+ }
+ return fwrite($this->smtp_conn, $data);
+ }
+
+ /**
+ * Get the latest error.
+ * @access public
+ * @return array
+ */
+ public function getError()
+ {
+ return $this->error;
+ }
+
+ /**
+ * Get the last reply from the server.
+ * @access public
+ * @return string
+ */
+ public function getLastReply()
+ {
+ return $this->last_reply;
+ }
+
+ /**
+ * Read the SMTP server's response.
+ * Either before eof or socket timeout occurs on the operation.
+ * With SMTP we can tell if we have more lines to read if the
+ * 4th character is '-' symbol. If it is a space then we don't
+ * need to read anything else.
+ * @access protected
+ * @return string
+ */
+ protected function get_lines()
+ {
+ $data = '';
+ $endtime = 0;
+ // If the connection is bad, give up now
+ if (!is_resource($this->smtp_conn)) {
+ return $data;
+ }
+ stream_set_timeout($this->smtp_conn, $this->Timeout);
+ if ($this->Timelimit > 0) {
+ $endtime = time() + $this->Timelimit;
+ }
+ while (is_resource($this->smtp_conn) && !feof($this->smtp_conn)) {
+ $str = @fgets($this->smtp_conn, 515);
+ if ($this->do_debug >= 4) {
+ $this->edebug("SMTP -> get_lines(): \$data was \"$data\"");
+ $this->edebug("SMTP -> get_lines(): \$str is \"$str\"");
+ }
+ $data .= $str;
+ if ($this->do_debug >= 4) {
+ $this->edebug("SMTP -> get_lines(): \$data is \"$data\"");
+ }
+ // if 4th character is a space, we are done reading, break the loop
+ if (substr($str, 3, 1) == ' ') {
+ break;
+ }
+ // Timed-out? Log and break
+ $info = stream_get_meta_data($this->smtp_conn);
+ if ($info['timed_out']) {
+ if ($this->do_debug >= 4) {
+ $this->edebug(
+ 'SMTP -> get_lines(): timed-out (' . $this->Timeout . ' sec)'
+ );
+ }
+ break;
+ }
+ // Now check if reads took too long
+ if ($endtime) {
+ if (time() > $endtime) {
+ if ($this->do_debug >= 4) {
+ $this->edebug(
+ 'SMTP -> get_lines(): timelimit reached ('
+ . $this->Timelimit . ' sec)'
+ );
+ }
+ break;
+ }
+ }
+ }
+ return $data;
+ }
+
+ /**
+ * Enable or disable VERP address generation.
+ * @param bool $enabled
+ */
+ public function setVerp($enabled = false)
+ {
+ $this->do_verp = $enabled;
+ }
+
+ /**
+ * Get VERP address generation mode.
+ * @return bool
+ */
+ public function getVerp()
+ {
+ return $this->do_verp;
+ }
+
+ /**
+ * Set debug output method.
+ * @param string $method The function/method to use for debugging output.
+ */
+ public function setDebugOutput($method = 'echo')
+ {
+ $this->Debugoutput = $method;
+ }
+
+ /**
+ * Get debug output method.
+ * @return string
+ */
+ public function getDebugOutput()
+ {
+ return $this->Debugoutput;
+ }
+
+ /**
+ * Set debug output level.
+ * @param int $level
+ */
+ public function setDebugLevel($level = 0)
+ {
+ $this->do_debug = $level;
+ }
+
+ /**
+ * Get debug output level.
+ * @return int
+ */
+ public function getDebugLevel()
+ {
+ return $this->do_debug;
+ }
+
+ /**
+ * Set SMTP timeout.
+ * @param int $timeout
+ */
+ public function setTimeout($timeout = 0)
+ {
+ $this->Timeout = $timeout;
+ }
+
+ /**
+ * Get SMTP timeout.
+ * @return int
+ */
+ public function getTimeout()
+ {
+ return $this->Timeout;
+ }
+}
diff --git a/include/picture_comment.inc.php b/include/picture_comment.inc.php
index 9a4cef3dd..f69e1447f 100644
--- a/include/picture_comment.inc.php
+++ b/include/picture_comment.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -60,13 +60,13 @@ if ( $page['show_comments'] and isset( $_POST['content'] ) )
switch ($comment_action)
{
case 'moderate':
- array_push($page['infos'], l10n('An administrator must authorize your comment before it is visible.') );
+ $page['infos'][] = l10n('An administrator must authorize your comment before it is visible.');
case 'validate':
- array_push($page['infos'], l10n('Your comment has been registered'));
+ $page['infos'][] = l10n('Your comment has been registered');
break;
case 'reject':
set_status_header(403);
- array_push($page['errors'], l10n('Your comment has NOT been registered because it did not pass the validation rules') );
+ $page['errors'][] = l10n('Your comment has NOT been registered because it did not pass the validation rules');
break;
default:
trigger_error('Invalid comment action '.$comment_action, E_USER_WARNING);
diff --git a/include/picture_metadata.inc.php b/include/picture_metadata.inc.php
index 1b353dbff..0e9284246 100644
--- a/include/picture_metadata.inc.php
+++ b/include/picture_metadata.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/include/picture_rate.inc.php b/include/picture_rate.inc.php
index cc1f93323..c3119bd53 100644
--- a/include/picture_rate.inc.php
+++ b/include/picture_rate.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/include/section_init.inc.php b/include/section_init.inc.php
index 9b6e4b088..61d8bf5e3 100644
--- a/include/section_init.inc.php
+++ b/include/section_init.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -339,7 +339,7 @@ else
$page['tag_ids'] = array();
foreach ($page['tags'] as $tag)
{
- array_push($page['tag_ids'], $tag['id']);
+ $page['tag_ids'][] = $tag['id'];
}
$items = get_image_ids_for_tags($page['tag_ids']);
@@ -452,10 +452,10 @@ SELECT image_id
SELECT DISTINCT(id)
FROM '.IMAGES_TABLE.'
INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON id = ic.image_id
- WHERE
- date_available >= '.pwg_db_get_recent_period_expression($user['recent_period']).'
- '.$forbidden.'
- '.$conf['order_by'].'
+ WHERE '
+ .get_recent_photos_sql('date_available').'
+ '.$forbidden
+ .$conf['order_by'].'
;';
$page = array_merge(
@@ -570,21 +570,14 @@ if (isset($page['chronology_field']))
// title update
if (isset($page['title']))
{
+ $page['section_title'] = '<a href="'.get_gallery_home_url().'">'.l10n('Home').'</a>';
if (!empty($page['title']))
- {
- $page['section_title'] = '<a href="'.get_gallery_home_url().'">'.l10n('Home').'</a>'.$conf['level_separator'].$page['title'];
- }
+ {
+ $page['section_title'] .= $conf['level_separator'].$page['title'];
+ }
else
{
- if ('picture'==script_basename())
- {
- $used_link = duplicate_index_url(array('start'=>0));
- }
- else
- {
- $used_link = get_gallery_home_url();
- }
- $page['section_title'] = $page['title'] = '<a href="'.$used_link.'">'.l10n('Home').'</a>';
+ $page['title'] = $page['section_title'];
}
}
diff --git a/include/smarty/COPYING.lib b/include/smarty/COPYING.lib
index 3b204400c..02bbb60bc 100644
--- a/include/smarty/COPYING.lib
+++ b/include/smarty/COPYING.lib
@@ -1,458 +1,165 @@
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ 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.
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-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 and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, 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 library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete 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 distribute a copy of this License along with the
-Library.
-
- 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 Library or any portion
-of it, thus forming a work based on the Library, 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) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-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 Library, 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 Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you 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.
-
- If distribution of 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 satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be 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.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library 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.
-
- 9. 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 Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-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 with
-this License.
-
- 11. 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 Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library 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 Library.
-
-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.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library 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.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser 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 Library
-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 Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-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
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "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
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. 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 LIBRARY 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
-LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser 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
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library. \ No newline at end of file
diff --git a/include/smarty/NEWS b/include/smarty/NEWS
deleted file mode 100644
index cbab78f5a..000000000
--- a/include/smarty/NEWS
+++ /dev/null
@@ -1,1067 +0,0 @@
-Version 2.6.26 (June 18th, 2009)
--------------------------------
-- revert super global access changes, and instead rely on
- USE_SUPER_GLOBALS for security
-
-Version 2.6.25 (May 19th, 2009)
--------------------------------
-- fix E_NOTICE when sessions are disabled (mohrt)
-
-Version 2.6.24 (May 16th, 2009)
--------------------------------
-- fix problem introduced with super global changes (mohrt)
-
-Version 2.6.23 (May 13th, 2009)
--------------------------------
-- strip backticks from {math} equations (mohrt)
-- make PHP super globals read-only from template (mohrt)
-- throw error when template exists but not readable (mohrt)
-
-Version 2.6.22 (Dec 17th, 2008)
--------------------------------
-
-- back out method chaining, bug in some versions of PCRE causes errors (mohrt)
-
-Version 2.6.21 (Dec 2nd, 2008)
-------------------------------
-
-- fix function injection security hole closed (U.Tews)
-- fix pass expiration time at cache_handler_fuc call in core.write_cache_file.php (U.Tews)
-- Update of compiler.class.php to allow method chaining for PHP4 and PHP5 (U.Tews)
-
-Version 2.6.20 (Feb 15th, 2008)
--------------------------------
-
-- fix cache tag bug when multiple cache tags on a page (mankyd,
- mohrt)
-- fix /e tag checking when using arrays with regex_replace
- (mohrt)
-- fix that function results can be used with condition like "is even" in
- {if} tags (U.Tews)
-- fix handling of non-empty <pre>-tags and empty <textarea>- and
- <script>-tags (Spuerhund, messju)
-
-Version 2.6.19 (Feb 11th, 2008)
--------------------------------
-
-- fix regex_replace allowing \0 in the search string (c960657,
- monte)
-- add append feature to {capture} (jablko, monte)
-- fix when (un)registering filters with the same method name but different class
- name (danilo)
-- fix calling registered objects' methods with an empty argument list
- (marcello, messju)
-
-Version 2.6.18 (Mar 7th, 2007)
-------------------------------
-
-- fix html_select_date separator when parts are missing (hayk,
- monte)
-- fix broken detection of non-cached blocks introduced in 2.6.17
- (messju)
-
-Version 2.6.17 (Mar 5th, 2007)
-------------------------------
-
-- fix php handling (monte, boots, danilo)
-- fix handling of plugin tags directly followed by an else tag (Fahr, danilo)
-- fix handling of $etc in the truncate modifier when $etc is longer
- than $length (Sylvinus, messju)
-- fix handling of %I with mysql timestamps in the date_format modifier
- (danilo, boots)
-- update smarty_core_write_file() and smarty_modifier_date_format() to better
- recognize Windows (boots, danilo)
-- emulate %h, %n, %r, %R, %t in the date_format modifier on Windows
- (danilo, boots)
-
-Version 2.6.16 (Dec 1st, 2006)
-------------------------------
-
-- fixed replacement bug in trimwhitespace output filter that was introduced
- in the last release (Spuerhund, boots)
-
-Version 2.6.15 (Nov 30th, 2006)
--------------------------------
-
-- change file writing semantics in smarty_core_write_file() to unlink() only
- when rename() fails or a Windows system is detected (c960657, boots)
-- update debug.tpl to xhtml 1.1 compliance, fix javascript escaping in debug
- output and apply a Smarty based color scheme (cybot, boots)
-- enhance reporting precision of debug_print_var modifier (cybot, boots)
-- make html_select_date work consistently with 0000-00-00 00:00:00 and
- 0000-00-00 inputs (cybot, boots)
-- fix wrong handling of insert's name attribute. (messju)
-- fix false replacement of "$t" inside double quotes (checat, messju)
-- added support for column headings and caption element to html_table and
- updated the output to use thead/tbody elements (boots)
-- fixed ordering of replacements in trimwhitespace output filter (Getty, boots)
-- update mailto function plugin to work around a firefox/thunderbird
- escaping bug (elijahlofgren, boots)
-- emulate %l in the date_format modifier on windows (boots)
-- fix handling of apostrophes in capitalize modifier (Alec Smecher, boots)
-
-Version 2.6.14 (May 28th, 2006)
--------------------------------
-
-- fix compiler bug allowing php tags in secure templates
- (boots,monte)
-- un-hide hidden xml open tags (boots)
-- fix handling of block-methods of registered objects (El Hombre Gris,
- messju)
-
-Version 2.6.13 (March 9th, 2006)
---------------------------------
-
- - update regex_replace, removing possible use of "e" modifier
-
-Version 2.6.12 (Jan 18th, 2006)
--------------------------------
-
- - fix improper use of references in the compiler handling cached
- attributes and in compiled code handling block plugins (messju)
- - make Smarty::_read_file() work on latest php (messju)
- - fixed improper tokenization of certain inline math expressions (boots)
-
-Version 2.6.11 (Dec 14, 2005)
------------------------------
-
- - fixed code generation of non-cacheable blocks to play well with php's
- "Alternative syntax for control structures" (kihara, messju)
- - fix handling of multiple identical inserts in one display()-call (messju)
- - replace {} string access with equivalent substr() to avoid E_STRICT
- warnings in PHP 5.1 (boots)
- - return valid reference in get_config_vars() when given var is
- non-existant (Thomas Schulz, boots)
- - plugin html_image: fix incorrect secure_dir error when
- file doesn't exist (monte)
- - plugin html_image: add path_prefix param (monte)
- - add char_set parameter to escape modifier (Loading, monte)
- - fix notice in debug security check (Drakla, monte)
- - return valid reference in get_template_vars() when given var is
- non-existant (monte)
- - add escape type "urlpathinfo" to escape modifier (monte)
-
-Version 2.6.10 (Aug 5, 2005)
-----------------------------
-
- - allow secure_dir to be a filename, not just
- a directory name (monte)
- - set debug.tpl as a secure_dir, not the entire
- SMARTY_DIR (monte)
- - fix proper escaping for literal strings in
- Smarty_Compiler::_parse_var_props() (boots, messju)
- - remove ambiguity for numeric values passed to smarty_make_timestamp()
- (and thus the date_format modifier). numeric values are treated as
- timestamps now. (andreas, messju)
- - add passthru attribute feature to html_select_date (Sedgar,
- monte)
- - add "middle" parameter to truncate (monte)
- - make form input label ids optional (monte)
- - add error message for empty if/elseif statements (eykanal,
- monte)
- - cast selected value to string for comparison in html_radios
- (Exeption, monte)
- - updated html_select_date's year_as_text-feature to be xhtml compliant
- (Mark West, messju)
- - fix handling of selected month html_select_date (Yuri Weseman, messju)
-
-Version 2.6.9 (Mar 31, 2005)
-----------------------------
-
- - disallow variable function calls in {if} statements (messju, monte)
- - disallow variable function calls in {math} equations (messju, monte)
-
-Version 2.6.8 (Mar 21, 2005)
-----------------------------
-
- - remove e-modifier from regex_replace modifier (messju)
- - remove cast of object to array in foreach's from-attribute (messju)
- - add "null" as a valid token for {if} when security is enabled (messju)
- - add javascript_charcode encoding option to mailto function
- (monte)
- - add ids to html_radios labels (monte, menulis)
- - fix handling of strip-tags with non-default delimiters (Mark West, messju)
-
-Version 2.6.7 (Feb 3, 2005)
----------------------------
-
- - fix handling of hashed opening php-tags inside strip-blocks (messju)
- - removed border tag from html_image function (monte)
- - change escape:url use rawurlencode() instead of urlencode() (messju)
- - make $smarty.const.FOO compile to "FOO", and not to "constant('foo')".
- this is less code and a little faster execution. note that undefined
- constants are now displayed as the constant's name. (messju)
- - make block functions and registered objects' block methods use a
- local variable for block_content instead of a property of $smarty (messju)
- - fix escaping in the generated code that calls smarty_core_load_plugins
- (jes5199, messju)
- - fix invalid HTML issue with popup (Stefanos Harhalakis,
- Monte)
- - fixed {popup} to properly handle inarray and function parameters and added
- support for mouseoff and followmouse options (boots)
-
-Version 2.6.6 (Oct 13, 2004)
-----------------------------
-
- - fixed nocache-handling with nested includes (Lars Jankowfsky, messju)
- - moved /libs/core to /libs/internals (boots)
- - fixed more parsing problems (messju)
-
-Version 2.6.5 (Sept 13, 2004)
------------------------------
-
- - fixed some parsing problems with object calls introduced
- in 2.6.4 (Monte)
- - add $smarty->security_settings['ALLOW_CONSTANTS']. note: this
- defaults to false which means you have to allow them explicitly
- in your secured templates from now on! (messju)
-
-Version 2.6.4 (Sept 7, 2004)
-----------------------------
-
- - add $smarty.ldelim and $smarty.rdelim to smarty special var (Monte)
- - fall back to old uniqid()-behaviour when tempnam() fails in
- core.write_file.php (messju)
- - fix capitalize modifier, don't rely on buggy ucwords (Monte)
- - make html_select_date work with negative timestamps, also
- force year range to include given date unless explicitly
- set (Garo, Monte)
- - fix bug with {fetch}, passing user/pass in url did not work
- (Monte)
- - fix occasional wrong error messages on mismatched tags when
- {else}, {elseif}, {foreachelse} or {sectionelse} is involved (messju)
- - fix handling of methods arguments (messju, Manfred Wischin)
- - remove touch() call that made the compiled-template's timestamp the
- same as the source-template's one. (messju)
- - add assign attribute to html_checkboxes and html_radios
- (pcg, Monte)
- - remove non-xhtml conformant tag from mailto function
- (tacker, Monte)
- - handle date_format codes %e, %T and %D for windows (tip,
- Monte)
- - fix unnecessary call to smarty_core_get_include_path() inside
- Smarty::_get_auto_filename() (c960657, messju)
- - add error-messages when anything else than an identifier is passed
- to foreach's key- or item-attribute (messju)
- - fix handling of digits inside tagnames (messju)
- - fix escaping of backslashes in Smarty_Compiler::_quote_replace() (messju)
-
-Version 2.6.3 (June 16, 2004)
------------------------------
-
- - added escapement of '</' to '<\/' in escape:javascript
- modifier (c960657, Monte)
- - added obfuscation of protocol-string in {mailto} when using hex-
- encoding (bharat, messju)
- - enhanced auto-generated filenames for templates_c and cache (messju)
- - add 'nonstd' to escape modifier for escaping non-std chars,
- such as ms doc quote (Monte)
- - adjusted textformat to not output wrap chars after last para
- (Monte)
- - use tempnam() instead of unqid() to create better temporary files in
- smarty_core_write_file() (xces, messju)
- - add 'mail' to escape modifier for safe display of e-mail
- addresses (Monte)
- - add cycle function attribute "reset" to english docs (Monte)
- - enhanced support of numeric constants as variable-expressions (messju)
- - add case decentity to smarty_modifier_escape() (Konstantin A. Pelepelin,
- messju)
- - make smarty_core_write_compiled_include() php5-aware (messju)
- - removed unused functionality to load a subset of lines from a file (messju)
- - fix is_secure() should only check if a file is_readable, not if
- the directory where it is in is readable (sagi, messju)
- - fix problem displaying debug console when $default_resource_type
- is not "file:" (c960657, Monte)
- - fix permission handling with security and config_load (messju)
- - removed '.' from the list of default template locations in
- _parse_resource_name() (messju)
- - fix avoid warning with template_exists() on an absolute paths (messju)
- - fix parameters passed to resource's secure()-function (messju)
- - fix handling of integer values like width and delay im
- smarty_function_popup() (messju)
-
-Version 2.6.2 (Feb 17, 2004)
-----------------------------
-
- - fix allow empty years, months and days in html_select_date's
- time-attribute (messju)
- - fix YES and NO should not be booleanized inside triple-quotes in a
- config-file (messju)
- - fix accidently slurped line following a triple-quoted value in a
- config-file (messju)
- - change default for use_sub_dirs to false (messju)
- - fix quoting of values in smarty_function_popup() (messju)
- - fix handling of hidden sections in Config_File (messju)
- - add handling of resources for {config_load} (messju)
- - fix bug when using arrays with tr_attr and td_attr in {html_table} (messju)
- - add unit testing to cvs core (Monte)
-
-Version 2.6.1 (Jan 16, 2004)
-----------------------------
-
- - rename $smarty->tpl_error_reporting to $smarty->error_reporting
- (messju)
- - fix interpretation of $smarty->security in {html_image} (messju)
- - add caching of requested paths to _assemble_plugin_filepath() (messju)
- - fix handling of comments inside {php}- and {literal}-blocks (messju)
- - fix bug handling triple-quotes in config-files (BRDude, messju)
- - change default of request_use_auto_globals to true - $_SERVER is
- now preferred over $HTTP_SERVER_VARS (messju)
- - re-add support for $SCRIPT_NAME (messju)
- - reactivate $smarty->default_modifiers (messju)
- - add cookie persistance to debug console (Monte)
- - allow single-digit days and months without smarty_make_timestamp()
- in html_select_date (messju)
- - fix headers sent erroneously with cache_modified_check and fetch()
- (wphilips, messju)
- - fix config_file path bug (Marc Cabadas, Monte)
- - fix 'is even by' and 'is odd by' logic (Monte)
- - add day_empty, month_empty, year_empty and all_empty attributes to
- html_select_date (messju)
- - add table of explanation for {if} qualifiers in docs (boots)
- - fix bug when comparing array-keys to "selected" in html_options
- and html_checkboxes (messju)
- - add better checks for correctly nested tags when compiling (messju)
- - remove {$SCRIPT_NAME}. use {$smarty.server.SCRIPT_NAME} instead (messju)
- - remove $global_assign. assign global variables explicitly instead (messju)
- - fix example for count_characters in docs (boots)
- - add section new basic syntax section "Escaping Smarty Parsing" in docs (boots)
- - fix error handler call in config_load (boots)
- - remove warning in debug_print_var on php-resources (messju)
- - move function.assign.php to compiler.assign.php (messju)
- - add property $tpl_error_reporting (messju)
- - remove property $undefined. "null" is used literally instead (messju)
-
-Version 2.6.0 (Nov 19, 2003)
-----------------------------
-
- - move Smarty::quote_replace() to Smarty_Compiler::_quote_replace() (messju)
- - remove import of of attributes of {include_php} to php's namespace.
- use $params[name] instead (messju)
-
-Version 2.6.0-RC3 (Nov 13, 2003)
---------------------------------
-
- - fix handling of $var.key inside [] (messju)
- - fix handling of assign inside {insert}-tags (messju)
- - fix handling if [...] inside triple-quotes in config-files (messju)
- - fix handling of simple-math-operators inside modifiers (Dominik, messju)
- - fix handling of trailing-slashes in open_basedir in
- smarty_core_create_dir_structure() (packman, messju)
-
-Version 2.6.0-RC2 (Oct 8, 2003)
--------------------------------
-
- - apply modifiers only once to section-loop and foreach-from attrs (messju)
- - remove use of _smarty_cached_paths-files (messju)
- - remove Smarty::_plugin_implementation_exists() - use is_callable() (messju)
- - ignore {strip}/{/strip) inside {strip}-blocks (messju)
- - fixed removal of leading/trailing newlines in {strip}-blocks (messju)
- - fixed proper escaping of " and ' with escape:javascript (messju)
- - fixed bug in traversal of $smarty->plugins_dir-array. now the
- first matching plugin is taken (messju)
- - moved {strip} back into the compiler (messju)
- - fixed config_load: handling of section-attribute and use of
- multiple config-files in one template (atu, messju)
-
-Version 2.6.0-RC1 (August 11, 2003)
------------------------------------
-
- - fixed status-header for cache_modified_check under cgi-sapi (messju)
- - added optional parameter $cache_attrs to register_function() and
- register_block(). $cache_attrs is an array containing attribute-
- names that should be cached on calls to functions that have
- $cacheable set to false. (messju)
- - enabled registration of class-methods as callbacks for the register_*-
- functions (use: array('classname', 'method_name')) as callback) (messju)
- - added filepath caching (Monte)
- - added optional assign-attribute to {capture}-tag (messju)
- - added $cacheable-parameter to register_compiler_function() (messju)
- - added $cacheable-parameter with default=true to register_function()
- and register_block() (messju)
- - add math speedup to core (Dominik, Monte)
- - fix newlines for tags without template output (Monte)
- - added config-option "request_use_auto_globals" to make auto-globals be
- used as request vars instead of HTTP_*_VARS (messju)
- - speed up config_load, simplify compiling (Monte)
- - added block-methods for registered objects (Bharat Mediratta, messju)
- - ignore one char resource names like c:foo.tpl (Monte)
- - added default_resource_type feature (Monte)
- - fix bug where config file starts with hidden section (boots, Monte)
- - add discrete error checking pertaining to $cache_dir
- and $compile_dir, their existance and writability (Monte)
- - fixed behaviour of start=... for {counter} (messju)
- - fixed assign for {counter} (messju)
- - added params vdir, hdir and inner to html_table to allow looping
- over the data in various directions (messju)
- - allow spaces in literal tags (Paul Lockaby, Monte)
- - speed up compiled templates, hardcode plugin filepaths
- instead of dynamically calculate at runtime. (Monte)
- - abstract many core components from Smarty.class.php,
- speeding up core class instantiation (Monte)
- - fixed bug in _create_dir_structure() when used with open_basedir-
- restriction and relative paths (messju)
- - use DIRECTORY_SEPARATOR exclusively, keep DIR_SEP for BC (Monte)
- - changed "link" to "href" in html_image. "link" is still working
- but deprecated (messju)
- - html_image always renders an alt-tag now (default alt="") (messju)
- - fixed assign attribute for multiple counters (messju)
- - added simple math operators to variables (Monte)
- - enabled array(&$obj. 'source', 'timestamp', 'secure', 'trusted')
- as callback for register_resource() (messju);
- - enabled array(&$obj, 'method') as callback for
- $default_template_handler_func (messju)
- - remove unnecessary close/open tags from compiled templates
- (Monte)
- - fixed errornous creation of '//' in image_path in html_image (messju)
- - fix escapement of special chars for key vals in debug
- console (Monte)
- - fixed debug timing logic for config_load (Tom Sommer, Monte)
- - all in-code doc comments converted to phpDocumentor format (Greg)
- - moved strip from smarty core to plugin (Monte)
- - moved config_load from smarty core to plugin (Monte)
- - added &$repeat-parameter to block-functions (messju)
- - enabled hex-constants in function.math.php (messju)
- - enabled hex-constants (0x...) as function-attributes, inside if-statements
- and as modifier-parameters (messju)
- - fixed bug with passing $smarty as reference in Smarty.compiler.class
- (messju)
- - corrected output with {strip} and PHP tag newlines (Monte)
- - added possibility to register function-callbacks as "array(&$obj, 'method)"
- this affects register_function(), -block, -compiler_function, -modifier,
- -prefilter, -postfilter, -outputfilter-functions() and $cache_handler_func
- (messju)
- - added <labels> to html_checkboxes and html_radios (Philippe, messju)
- - added "labels"-options to turn off labels in html_checkboxes and _radios
- (messju)
-
-Version 2.5.0 (April 11, 2003)
-------------------------------
-
- - fixed bug with default modifier when passing integer 0
- (Monte)
- - change backtic syntax from $`foo` to `$foo` (Monte)
- - recognize $foo[][] syntax inside embedded quotes without
- backtics (Monte)
- - name=123 is passed as an integer (not a string) to plugins now (messju)
- - $length is now propagated to sub-values in debug_print_var (messju)
-
-Version 2.5.0-RC2 (March 26, 2003)
-----------------------------------
-
- - made clear_cache() ignore compile_id, when clearing cache-groups (this
- is when no $tpl_file is supplied) (messju)
- - made onmouseout XHTML-compliant in function.popup.php (messju)
- - applied local-var-naming-scheme to fetch() (messju)
- - renamed $localvars to $_localvars in cache-file-handling-functions,
- added _get_auto_id()-function (messju)
- - swapped compile_id and cache_id in read_cache_file and write_cache_file
- (messju)
- - reverted patch for cache-file-handling (messju)
- - made html_radios and html_checkboxes accept "selected" instead
- of "checked" optionally. (messju)
- - made compile_id ignored in clear_cache, made order of
- auto_file_name $cache_id.$compile_id again, applied the the new
- variable-naming-scheme for cache_file_handing functions (messju)
- - removed notice of undefined var in _rm_auto() (messju)
- - added warning message when an array is passed as
- the "checked" value of html_radios (Monte)
- - fixed errormessage in _compile_smarty_ref() (messju)
- - updated docs for html_image "name" -> "file" (messju)
- - fixed bug with html_options-optgroups (Nichlas Löfdahl, messju)
- - cleaned up calls to readdir() (messju)
- - fixed bug with passing multiple modifiers to a parameter
- (Monte)
- - updated docs for html_checkboxes, html_options and html_radios (messju)
- - fixed wrong default "name" attribute for html_options (messju)
- - html_checkboxes now expect the options as attribute "options" instead
- of "checkboxes. html_radios expect "options" instead of "radios".
- cleaned up indentiation (messju)
- - fixed too greedy str_replace in trimwhitespace outputfilter (messju)
- - html_checkboxes and html_radios passthru all unknown paramters now
- additionally their output is now XHTML compliant (messju)
- - html_options passthru all unknown paramters now (messju)
- - fix link functionality of html_image, also make
- output XHTML compatible (Hinrich Donner, Monte)
- - append "@" to default modifier vars/args
- supress possible warnings (Monte)
- - fix problem with escaped double quotes (Monte)
- - fix html_radios to not return an array (Monte)
- - fixed length in modifier.truncate.php (messju)
- - fixed handling of '$'-signs in trimwhitespace outputfilter (messju)
- - fix bug that makes config files recompile every time
- (Nagger, Monte)
- - add dpi functionality to html_image, change "name"
- parameter to "file" (Thomas Shulz, Monte)
- - fix height/width parameter index in html_image (Gerard,
- Monte)
- - get rid of unsetting name and script attributes
- to insert tag (Thomas Schulz, Monte)
- - changed argument order of string_format modifier back,
- was right in the first place (Monte)
-
-Version 2.5.0-RC1 (March 5, 2003)
----------------------------------
-
- - fixed notice in popup function (Nagger, Monte)
- - fix "once" var compiling for include_php (Monte)
- - added nl2br modifier to distribution (Monte)
- - added html_image to distribution (Monte)
- - added cat modifier to distribution (Monte)
- - added html_table to distribution (Monte)
- - added << >> <> support to if statments (SMK, Monte)
- - fix _assign_smarty_interface to not overwrite keys
- other than 'request' (Jerome Poudevigne, Monte)
- - added html_checkboxes to distribution (Christopher Kvarme, Monte)
- - added html_radios to distribution (Christopher Kvarme, Monte)
- - fixed string_format modifier args (wrong order) (Paul
- Lockaby, Monte)
- - use tmp file for file writes, avoid file lock race (Monte)
- - support syntax "$`smarty.config.foo`.tpl" for embedded
- vars in quotes, and allow full dollar var syntax (Monte)
- - add $smarty.config.varname variable for accessing config vars (Paul
- Lockaby, Monte)
- - silence PHP warnings in function.fetch.php (Eduardo,
- Monte)
- - added get_config_vars(), same basic functionality as
- get_template_vars() (Monte)
- - update get_template_vars() to be able to get
- individual vars (Monte)
- - fix minor logic in _fetch_template_info (Dennis Gearon,
- Monte)
- - fix cache groups with compile_id set (Monte)
- - add support for merging appended vars (messju, Monte)
- - allow null as function attribute value
- (André Rabold, Monte)
- - support $foo->bar[index] syntax (Monte)
- - add get_registered_object function (messju, Monte)
- - treat unrecognized param attribute syntax as string (Monte)
- - support $smarty.const.$foo syntax (messju, Monte)
- - remove E_NOTICE warnings from debug.tpl,
- escape modifier (Kanstantin, Monte)
- - don't count non-ascii chars in count_words modifier
- (Kanstantin, Monte)
- - clean up param calls to _parse_var and _parse_attrs (Monte)
- - define $template_source var, elude possible warning
- (Monte)
- - fix syntax problem with evaluating PHP constants (Monte)
- - add @ and === as valid if statement tokens (Monte)
- - enable error messages for config_load errors,
- use $this->config_class for loading class name (Monte)
- - fix html_options to not escape already escaped entities (Monte)
- - send Last-Modified header on cache creation (Monte)
- - check strict syntax of function attributes (Monte)
- - dropped support for modifers on object parameters,
- added support for objects as modifier parameters (Monte)
- - fixed bug with decimal numbers in if statements (Monte)
-
-Version 2.4.2 (Feb 11, 2003)
-----------------------------
- - support embedded variables in objects (Monte)
- - fix bug with objects with no properties (M Mohr, Monte)
- - support full dollar var syntax in quoted text (Monte)
- - fixed bug in $smarty.const.FOO introduced in 2.4.1 (M
- Mohr, Monte)
-
-Version 2.4.1 (Feb 6, 2003)
----------------------------
-
- - ignore case in IF statements (Rainer Collet, Monte)
- - treat undefined constants as null (Ferdinand Beyer, Monte)
- - fix problem with inserts and nested fetches
- (Rainer Collet, Monte)
- - added support for passing params to include_php
- (Tim Riley, Monte)
- - added support for math operators in if statements (Monte)
- - added support for $foo->bar[$x].blah syntax (Monte)
-
-Version 2.4.0 (Feb 2, 2003)
----------------------------
-
- - fix known problems with php tag handling in templates
- (recursion, echoing xml tags) (Monte)
- - add support for object registration (Monte)
- - add debug template to secure_dir, add template_dir
- to secure_dir by default (Ferdinand Beyer, Monte)
- - added support for assigned object access (Monte)
- - fixed bug with directories named '0' (Frank Bauer, Monte)
- - add javascript parameter to escape modifier (Monte)
- - added calling function line numbers to syntax error
- messages in compiler (Monte)
- - added support for modifiers to function calls (Monte)
- - support return value for custom functions
- instead of echoing (but echo still works) (Monte)
- - added direct access to constants
- via $smarty.const.FOO (Monte)
- - added support for passing modifiers
- to static values (Monte)
- - fix up regex code in compiler, more accurate and
- maintainable (Monte)
- - added day_value_format to html_select_date (Marcus
- Bointon, Monte)
- - assigned variables are no longer in global
- namespace, saving extract() calls and speeding
- up fetch() and display() linearly with no. of
- assigned variables (Monte)
- - added trimwhitespace output filter to dist. (Monte)
- - fix popup function to allow newlines in text (Monte)
- - escape html entities in html_options (Monte)
- - fixed bug with label for html_options (Monte)
- - added config_load API function (Monte)
- - added caching to config file loading (Monte)
- - added "extra" parameter to mailto function (Monte,
- Massimiliano Perantoni)
- - added mailto plugin to dist. (Monte)
-
-Version 2.3.1 (Nov 19, 2002)
-----------------------------
-
- - added optgroup support to html_options (Monte, Robert
- Amos)
- - set mtime on compile files so they match source
- files (Monte, Peter Bowen)
- - added proper support for open_basedir setting
- (Monte, Alessandro Astarita)
- - added strip variable modifier, updated docs (Monte)
- - fixed access to $smarty.x variables as arrays. (Andrei)
- - fixed errors with example setup docs (Monte, Matthew
- Hagerty)
- - added textformat block function (Monte)
-
-Version 2.3.0 (Aug 7, 2002)
----------------------------
-
- - added assign_by_ref() and append_by_ref() functions
- (Bob Silva, Monte)
- - changed default warning type for plugin errors from
- E_USER_WARNING to E_USER_ERROR (Monte)
- - added $all_extra, $hour_extra, $minute_extra,
- $second_extra and $meridian_extra parameters to
- html_select_time function (Rainer Collet, Monte)
- - update debug console to print objects (Simon Willison,
- Monte)
- - fix Config_File class to not error when there are no
- sections (Peter Kmet, Monte)
- - add default modifier logic (Monte)
- - updated popup_init to be xhtml compliant (Tom Oram, Monte)
- - fix filename bug with windows (Gary Loescher, Monte)
- - add ability to supply expire time in seconds when clearing
- cache or compile files (Monte)
- - add {debug} plugin to distribution (Monte)
- - fixed bug with insert tags, loading from "script" attribute
- when caching is enabled (Monte)
- - fix bug with debug_tpl file path with Windows (.SMK., Monte)
- - fix append() function with string/array problem (Monte)
-
-Version 2.2.0 (July 11, 2002)
------------------------------
-
- - make debug.tpl work with any delimiter (Monte)
- - change logic in assign() and append() to test var names
- against != '' instead of empty() (Monte)
- - fix PHP notice in append() function (Monte)
- - allow $plugins_dir to be an array of directories
- (Andreas Kossmeier, Monte)
- - move debug.tpl to SMARTY_DIR, add to constructor (Monte)
- - fixed warning message in function.assign_debug_info (Monte)
- - fixed $template_dir, $compile_dir, $cache_dir, $config_dir,
- $plugin_dir to respect include_path (Monte)
- - fixed warning message with output filter array (Monte)
- - add optional 2nd parameter to date_format, used as
- the default date if the passed date is empty (Monte)
- - gave $reset a default value in cycle plugin (Monte)
- - fixed warnings with html_select_date and timestamp
- functions (Monte)
- - added support for sub directory exlusion format (Monte)
- - added support for grouping by cache_id, compile_id
- and segments thereof (Monte)
- - changed cache and compile files to human readable
- format (Monte)
- - remove overlib.js file from distribution (Monte)
- - fixed bug with 304 Not Modified response sending
- content (Monte)
- - fixed cycle function to respect delimiter after
- initial setting (Monte)
- - update $GLOBALS references to work properly with
- track_globals settings (Michal Prinke, Monte)
- - fixed bug in math function with call to assign
- (Grigory V. Kareev, Monte)
- - optimized for loops with count() function calls (Monte)
- - add month_value_format attribute to html_select_date
- plugin (Gary Loescher, Monte)
- - made it possible to use simple variables inside [] for
- indexing. (Andrei)
- - added "once" attribute to {include_php}. (Monte)
-
-Version 2.1.1
--------------
- - added cycle function. (Monte)
- - fixed bug with resource testing, and include_path. (Monte)
- - fixed a bug with register_outputfilter function. (Monte)
-
-Version 2.1.0
--------------
-
- - introduced output filters. (Andrei)
- - changed the way filters are loaded, added load_filter()
- API function and $autoload_filters variable. (Andrei)
- - added caching logic for expire times per cache file
- (Norbert Rocher, Monte)
- - fixed html_select_date when field separator is "/"
- (Roberto Berto, Monte)
- - added YYYY-MM-DD format support to html_select_date
- (Jan Rosier, Monte)
- - fixed cache_lifetime logic bug, also made -1 = never
- expire (Monte)
- - fixed directory separator issue for Windows. (Andrei)
- - added ability to use simple variables as array indices or
- object properties. (Andrei)
- - added ability to unregister pre/postfilters plugins at
- runtime. (Andrei)
- - added 'htmlall' attribute to escape modifier. (Monte)
- - added template_exists() API function. (Andrei)
- - fixed a problem with using dynamic values for 'file'
- attribute of {include_php} tag. (Andrei)
- - added $smarty.template variable. (Andrei)
- - fixed several plugins that would not work if the plugin
- directory was not the default one. (Andrei)
- - implemented support for block functions. (Andrei)
- - made it possible to assign variables in pre/postfilter
- plugins. (Andrei)
-
-Version 2.0.1
--------------
- - rename plugin .make_timestamp.php to shared.make_timestamp.php.
- (Monte)
- - changed crc32() generated values, replace '-' with 'N'. (Monte)
- - added support for +/- N syntax in html_select_date year values.
- (Monte)
- - fixed behavior of inserts with script attribute. (Andrei)
- - fixed bug with $smarty.cookies and $smarty.server. (Andrei)
- - wordwrap and indent are missing from 2.0 release, now fixed.
- (Monte)
- - removed show_info_header and show_info_include variables. (Monte)
-
-Version 2.0.0
--------------
- - added "eval" function plugin for evaluating variables as
- templates. (Monte)
- - removed $tpl_file_ext class variable, no longer used. (Monte)
- - added "hex" and "hexentity" escape types to escape modifier.
- (Monte)
- - removed dependency on PEAR. (Andrei)
- - update popup_init to accept src attribute. (Monte, Duncan Forrest)
- - implemented several optimizations, speeding up Smarty
- significantly in most cases. (Andrei,Monte)
- - implemented plugin architecture. (Andrei)
- - added wordwrap and indent modifiers. (Monte)
- - added support for 'If-Modified-Since' headers for cached content.
- (Monte)
- - removed insert_tag_check class variable, no longer needed. (Monte)
- - optimized cache fetches by scanning for insert tags only if they
- exist. (Monte)
- - fixed bugs in overlib. (Monte, Duncan Forrest)
- - fixed a problem with compile_id usage. (Andrei)
- - fixed problem with using assigned vars with {include_php ...}
- filepath. (Monte)
-
-Version 1.5.2
--------------
- - added Smarty object as fifth argument for template resource functions.
- (Monte)
- - fixed a bug with incorrectly combined cache and compile id in
- clear_cache(). (Andrei)
- - fixed bug in smarty_make_timestamp introduced in PHP 4.1.0. (Monte)
- - fixed bug with cached insert debug timing. (Monte)
- - added 'script' attribute to {insert..} which specifies the script that
- the insert function can be found in. (Andrei)
- - added default template function handler. (Monte)
-
-Version 1.5.1
--------------
- - removed error message from the generic _read_file() method, the caller
- should take care of that. (Andrei)
- - fixed a bug with incorrectly combined cache and compile id. (Andrei)
-
-Version 1.5.0
--------------
- - added include_php built-in function, documented. (Monte)
- - added trusted_dir functionality, documented. (Monte)
- - consolidated secure_dir tests to one function. (Monte)
- - prepended _smarty_ to variable names in fetch() class function to avoid
- namespace conflicts. (Monte)
- - introduced $compile_id class variable that can be used to set persistent
- compile identifier across multiple display calls, documented. (Andrei)
- - fixed bug with concatenated null cache and compile identifiers. (Andrei)
- - added $smarty.section.* syntax for accessing section properties,
- documented. (Andrei)
- - added custom cache handling function ability, documented. (Monte)
- - added assign attribute to include, include_php, insert, fetch, math, and
- counter functions, documented. (Monte)
- - fixed bug with fetch testing for local file when http address. (Monte)
- - fixed bug with counter and skipval setting. (Monte)
- - made {config_load ...} merge globals from each config file only once per
- scope, thus avoiding several problems. (Andrei)
- - added {foreach ...} tag that can be used to iterate through
- non-sequential and associative arrays, documented. (Andrei)
- - speeded up section property access a bit. (Andrei)
- - removed $smarty variable from storage used by normal template variables,
- to prevent any problems. (Andrei)
- - fixed a bug that could cause parse error with quotes inside literal
- blocks. (Andrei, Alexander Belonosov)
- - added 'field_array' attribute to html_select_time function, documented.
- (Andrei, Michael Caplan)
- - documented {section} "max" attribute. (Monte)
- - fixed notice message in Smarty_Compiler.class.php. (Monte)
- - fixed bug with clear_cache introduced in 1.4.6, third parameter should
- default to null. (Monte)
- - updated Config_File class to support '\' path separator in OS/2. (Monte,
- Francesco Cipriani)
- - removed secure_ext setting (not used). (Monte)
- - made cache reading process more efficient. (Monte)
- - fixed bug, is_cached() now supports new 1.4.6 caching behavior. (Monte)
- - update FAQ with mailing list Reply-To header FAQ. (Monte)
- - supress error messages for fopen(), fix cache to regenerate if cache
- file is not available (i.e. cluster race condition). (Monte)
- - added index key example to QUICKSTART guide. (Monte)
-
-Version 1.4.6
--------------
- - fixed bug with {assign ...} when passing an empty value. (Monte)
- - add more warning message fixes. (Monte, Tara Johnson)
- - documentation updates. (Monte)
- - update fetch function to give proper warning when fetching a non-readable
- or non-existant file. (Monte)
- - fixed problem with newline at the end of included templates (Monte, Andrei)
- - added feature to regenerate cache if compile_check is enabled and an
- involved template or config file gets modified. (Monte)
- - added DEBUG execution times to included files: REQUIRES updated debug.tpl
- file! (Monte)
- - added support for hidden config variables that cannot be read by
- templates. (Andrei)
- - added execution time to DEBUG console, total and inserts. (Monte)
- - fixed bug where DEBUG console would not appear with cached content. (Monte)
- - added support for postfilter functions that are applied to compiled
- template right after compilation. (Andrei)
- - fixed the name of clear_compile_tpl() API function to clear_compiled_tpl.
- (Andrei)
- - added fix for removing comments so that the line numbers are reported
- correctly in case of errors. (patch from Anders Janson)
- - made html_options output xhtml compatible code. (Monte, Arnaud Limbourg)
-
-Version 1.4.5
--------------
- - update FAQ with index of questions at the top
- - update overlib to 3.50, adjust addon code so that the overlib.js
- file isn't modified, and not using the mini one. (Monte)
- - added many more options to html_select_date. (Alexander Skwar, Andrei)
- - added support for generating different compiled templates from the same
- source template. (Hans-Peter Oeri, Andrei)
- - modified Smarty to pass itself to insert functions as the second
- parameter. (Andrei)
- - modified Smarty to pass itself to prefilter functions as the second
- parameter. (Andrei)
- - fixed syntax error when including a non-existant template with security
- enabled. (Monte)
- - fixed comments handling to allow commenting out template blocks. (Andrei)
- - implemented named capture buffers, with results accessible via
- $smarty.capture.<name>. (Andrei)
- - added ability to index arrays directly by numbers. (Andrei)
- - fixed bug with SMARTY_DIR not prepended to Config_File include. (Monte)
-
-Version 1.4.4
--------------
- - fixed problem with including insecure templates with security enabled.
- (Monte)
- - numerous documentation updates. (Monte)
- - added ENT_QUOTES to escapement of html. (Monte, Sam Beckwith)
- - implemented access to request variables via auto-assigned $smarty
- template variable. (Andrei)
- - fixed a bug with parsing function arguments inside {if} tags if a comma
- was present. (Andrei)
- - updated debug console with config file vars. (Monte)
- - added SMARTY_DIR constant as an alternative to relying on include_path.
- (Monte)
- - added popup_init and popup functions (requires overlib.js). (Monte)
- - updated debug console with config file vars. (Monte)
- - added debugging url control. (Monte)
- - added 'quotes' type to escape modifier. (Monte, Mike Krus)
- - added 'total' and 'iteration' section properties. (Andrei)
- - added 'start', 'max', and 'step' section attributes/properties. (Andrei)
- - fixed a bug with security checking of functions inside {if} tags.
- (Andrei)
- - fixed a bug in Config_File that would incorrectly booleanize values that
- weren't really booleans. (Andrei)
-
-Version 1.4.3
--------------
- - added regex_replace modifier, documented. (Monte)
- - added debugging console feature and custom function assign_debug_info,
- documented. (Monte)
- - added 'scope' attribute for {config_load}, 'global' is now deprecated but
- is still supported. (Andrei)
- - reduced template symbol table pollution by moving config array into the
- class itself. (Andrei)
- - fixed a bug with passing quoted arguments to modifiers inside {if}
- statements. (Andrei, Sam Beckwith)
- - added security features for third party template editing, documented
- (Monte)
- - added assign custom function, documented. (Monte)
- - fixed bug with template header using version instead of _version. (Monte)
- - fixed a problem with putting $ followed by numbers inside {strip} and
- {/strip} tags. (Andrei)
- - fixed Config_File class to allow empty config paths (defaults to current
- directory). (Andrei)
-
-Version 1.4.2
--------------
- - move $version to internal variable, remove from docs. (Monte)
- - cleaned up compiled templates global scope by moving some variables into
- the class itself. (Andrei)
- - fixed a bug that would not allow referring to a section in the including
- file from the included file. (Andrei)
- - configs directory missing from 1.4.1 release, added back in. (Monte)
- - added windows include_path setup instructions to FAQ & QUICKSTART.
- (Monte)
-
-Version 1.4.1
--------------
- - fix LOCK_EX logic for all windows platforms (Monte)
- - fixed indexing by section properties with the new syntax. (Andrei)
- - updated Smarty to use absolute paths when requiring/including Smarty
- components. (Andrei, John Lim)
-
-Version 1.4.0
--------------
- - added {capture}{/capture} function, documented (Monte)
- - added {counter} function, documented (Monte)
-
-Version 1.4.0b2
----------------
- - fixed issue in Config_File.class with referencing blank sections (Andrei)
- - fixed problem with passing variables to included files (Andrei)
- - fixed resource path recognition for windows (Monte)
-
-Version 1.4.0b1
----------------
- - added "componentized templates" tip into documentation (Monte)
- - added {php}{/php} tags for embedding php code into templates (Monte)
- - changed default value of $show_info_header to false (Monte)
- - implemented '->' syntax for accessing properties of objects passed to the
- template. (Andrei)
- - allowed custom functions to receive Smarty object as the second
- parameter; this can be used to dynamically change template variables, for
- example. (Andrei)
- - added custom compiler functions support, register_compiler_function() and
- unregister_compiler_function() API functions. (Andrei, Ivo Jansch).
- - updated GLOBAL_ASSIGN to take SCRIPT_NAME from HTTP_SERVER_VARS
- instead of global variable. You can also assign several variables
- in one shot with an array. (Monte, Roman Neuhauser)
- - added template prefilters, register_prefilter() and
- unregister_prefilter() API functions. (Monte)
- - added RELEASE_NOTES file to distribution. (Monte)
- - moved CREDITS out of manual into its own file. (Monte)
- - added register_resource() and unregister_resource() API functions. (Monte)
- - changed the syntax of indexing template variables, thus supporting
- structures of arbitrary complexity; supplied fix_vars.php script to fix
- old syntax. (Andrei)
- - added $insert_tag_check to speed up cached pages if {insert ...} is not
- used. (Monte)
- - added $compiler_class variable to allow specifying a different compiler
- class. (Andrei)
- - changed Smarty to compile templates at runtime, allowing for arbitrary
- template resources. (Monte)
- - added fix for LOCK_EX under Windows and changed a couple of file
- permissions for security. (Monte, Fernando Nunes)
- - allow arbitrary date strings to date_format, html_select_date and
- html_select_time (Monte)
-
-Version 1.3.2
--------------
- - fixed a bug that caused some nested includes to loop infinitely. (Andrei)
- - added optional HTML header to output. (Monte)
- - significantly improved config_load performance. (Andrei)
- - added format attribute to math function. (Monte)
- - added html_select_time custom function. (Andrei)
- - fixed minor PHP warning when attempting to unset an unset variable
- (Monte)
- - added count_characters, count_words, count_sentences, count_paragraphs
- modifiers (Monte)
-
-Version 1.3.1pl1
---------------
- - bug fix, recovered missing _syntax_error function (Monte)
-
-Version 1.3.1
--------------
- - document first, last, index_prev, index_next (Monte)
- - added 'first' and 'last' section properties. (Andrei)
- - split out compiling code to separate class for faster template execution
- time (Monte)
- - fixed a couple of minor PHP warnings (Monte)
- - added and documented unregister_modifier() and unregister_function() API
- calls. (Monte)
- - added and documented 'fetch' and 'math' functions. (Monte)
- - added ability to index looped variables by section properties, e.g.
- $foo.index_prev/bar. (Andrei)
- - added index_prev and index_next section properties. (Andrei)
- - fixed issue with php executing in literal blocks. (Monte)
-
-Version 1.3.0
--------------
- - moved license from GPL to LGPL (Monte)
- - implemented workaround for PHP "feature" that eats carriage returns
- if the PHP tag is at the end of the line. (Andrei)
- - removed $allow_php, added $php_handling logic (Monte)
- - added file locking to prevent reader/writer problem. (Andrei)
- - made Smarty catch unimplemented modifiers and custom functions and output
- error messages during compilation instead of failing during run time.
- (Andrei)
- - removed short-tags at the top of the smarty scripts (Monte)
- - added register_function() and register_modifier() API calls to make
- registering stuff easier. (Andrei)
- - added template results caching capability. (Monte, Andrei)
- - added optional 'options' attribute to html_options custom function
- that allows passing associative arrays for values/output. (Andrei)
- - modifier arguments can now contain '|' and ':' characters inside quoted
- strings. (Andrei)
-
-Version 1.2.2
--------------
- - fixed bug that would not respect nested template directories and would
- put all compiled files into top-level one. (Andrei)
- - fixed bug using $PHP_VERSION instead of environment var PHP_VERSION.
- (Monte)
- - a couple small warning fixes. (Monte)
-
-Version 1.2.1
--------------
- - added $compile_dir, removed $compile_dir_ext, simplified usage. (Monte)
- - added tips & tricks chapter to documentation. (Monte)
- - misc documentation updates. (Monte)
-
-Version 1.2.0
--------------
- - updated documentation (Monte)
- - added file and line number information to syntax error messages. (Andrei)
- - added ability to index template vars by a key. (Andrei)
-
-Version 1.1.0
--------------
- - misc documentation changes, official stable release
-
-Version 1.0b
-------------
- - fixed the bug that prevented using non-array values for 'loop' attribute.
- (Andrei)
- - many misc documentation changes & additions (Monte)
-
-Version 1.0a
-------------
- - fixed bug that caused templates to recompile every time (Monte)
-
-Version 1.0
-------------
- - initial release
-
-/* vim: set et tw=64 ft=changelog: */
diff --git a/include/smarty/README b/include/smarty/README
index 15992d09e..bf03403aa 100644
--- a/include/smarty/README
+++ b/include/smarty/README
@@ -1,86 +1,574 @@
+Smarty 3.1.13
-NAME:
+Author: Monte Ohrt <monte at ohrt dot com >
+Author: Uwe Tews
- Smarty - the PHP compiling template engine
+AN INTRODUCTION TO SMARTY 3
-VERSION: 2.6.26
+NOTICE FOR 3.1 release:
-AUTHORS:
-
- Monte Ohrt <monte at ohrt dot com>
- Andrei Zmievski <andrei@php.net>
+Please see the SMARTY_3.1_NOTES.txt file that comes with the distribution.
-MAILING LISTS:
+NOTICE for 3.0.5 release:
- We have a few mailing lists. "discussion" for you to share your ideas or ask
- questions, "developers" for those interested in the development efforts of Smarty,
- and "svn" for those that would like to track the updates made in the svn
- repository.
+Smarty now follows the PHP error_reporting level by default. If PHP does not mask E_NOTICE and you try to access an unset template variable, you will now get an E_NOTICE warning. To revert to the old behavior:
- send a blank e-mail message to:
- smarty-discussion-subscribe@googlecode.com(subscribe to the general discussion list)
- smarty-discussion-unsubscribe@googlecode.com (unsubscribe from the general discussion list)
- smarty-discussion-digest-subscribe@googlecode.com (subscribe to digest)
- smarty-discussion-digest-unsubscribe@googlecode.com (unsubscribe from digest)
- smarty-developers-subscribe@googlecode.com (subscribe to the dev list)
- smarty-developers-unsubscribe@googlecode.com (unsubscribe from the dev list)
- smarty-svn-subscribe@googlecode.com (subscribe to the svn list)
- smarty-svn-unsubscribe@googlecode.com (unsubscribe from the svn list)
+$smarty->error_reporting = E_ALL & ~E_NOTICE;
- You can also browse the mailing list archives at
- http://groups.google.com/group/smarty-discussion
- http://groups.google.com/group/smarty-developers
+NOTICE for 3.0 release:
- and the OLD list archives at
- http://marc.theaimsgroup.com/?l=smarty&r=1&w=2
+IMPORTANT: Some API adjustments have been made between the RC4 and 3.0 release.
+We felt it is better to make these now instead of after a 3.0 release, then have to
+immediately deprecate APIs in 3.1. Online documentation has been updated
+to reflect these changes. Specifically:
-SYNOPSIS:
+---- API CHANGES RC4 -> 3.0 ----
- require("Smarty.class.php");
+$smarty->register->*
+$smarty->unregister->*
+$smarty->utility->*
+$samrty->cache->*
- $smarty = new Smarty;
+Have all been changed to local method calls such as:
- $smarty->assign("Title","My Homepage");
- $smarty->assign("Names",array("John","Gary","Gregg","James"));
+$smarty->clearAllCache()
+$smarty->registerFoo()
+$smarty->unregisterFoo()
+$smarty->testInstall()
+etc.
- $smarty->display("index.tpl");
+Registration of function, block, compiler, and modifier plugins have been
+consolidated under two API calls:
+$smarty->registerPlugin(...)
+$smarty->unregisterPlugin(...)
-DESCRIPTION:
+Registration of pre, post, output and variable filters have been
+consolidated under two API calls:
- What is Smarty?
+$smarty->registerFilter(...)
+$smarty->unregisterFilter(...)
- Smarty is a template engine for PHP. Many other template engines for PHP
- provide basic variable substitution and dynamic block functionality.
- Smarty takes a step further to be a "smart" template engine, adding
- features such as configuration files, template functions, and variable
- modifiers, and making all of this functionality as easy as possible to
- use for both programmers and template designers. Smarty also converts
- the templates into PHP scripts, eliminating the need to parse the
- templates on every invocation. This makes Smarty extremely scalable and
- manageable for large application needs.
+Please refer to the online documentation for all specific changes:
- Some of Smarty's features:
+http://www.smarty.net/documentation
- * it is extremely fast
- * no template parsing overhead, only compiles once.
- * it is smart about recompiling only the template files that have
- changed.
- * the template language is remarkably extensible via the plugin
- architecture.
- * configurable template delimiter tag syntax, so you can use
- {}, {{}}, <!--{}-->, or whatever you like.
- * built-in caching of template output.
- * arbitrary template sources (filesystem, databases, etc.)
- * template if/elseif/else/endif constructs are passed to the PHP parser,
- so the if syntax can be as simple or as complex as you like.
- * unlimited nesting of sections, conditionals, etc. allowed
- * it is possible to embed PHP code right in your template files,
- although not recommended and doubtfully needed since the engine
- is so customizable.
- * and many more.
+----
-COPYRIGHT:
- Copyright (c) 2001-2005 New Digital Group, Inc. All rights reserved.
- This software is released under the GNU Lesser General Public License.
- Please read the disclaimer at the top of the Smarty.class.php file.
+The Smarty 3 API has been refactored to a syntax geared
+for consistency and modularity. The Smarty 2 API syntax is still supported, but
+will throw a deprecation notice. You can disable the notices, but it is highly
+recommended to adjust your syntax to Smarty 3, as the Smarty 2 syntax must run
+through an extra rerouting wrapper.
+
+Basically, all Smarty methods now follow the "fooBarBaz" camel case syntax. Also,
+all Smarty properties now have getters and setters. So for example, the property
+$smarty->cache_dir can be set with $smarty->setCacheDir('foo/') and can be
+retrieved with $smarty->getCacheDir().
+
+Some of the Smarty 3 APIs have been revoked such as the "is*" methods that were
+just duplicate functions of the now available "get*" methods.
+
+Here is a rundown of the Smarty 3 API:
+
+$smarty->fetch($template, $cache_id = null, $compile_id = null, $parent = null)
+$smarty->display($template, $cache_id = null, $compile_id = null, $parent = null)
+$smarty->isCached($template, $cache_id = null, $compile_id = null)
+$smarty->createData($parent = null)
+$smarty->createTemplate($template, $cache_id = null, $compile_id = null, $parent = null)
+$smarty->enableSecurity()
+$smarty->disableSecurity()
+$smarty->setTemplateDir($template_dir)
+$smarty->addTemplateDir($template_dir)
+$smarty->templateExists($resource_name)
+$smarty->loadPlugin($plugin_name, $check = true)
+$smarty->loadFilter($type, $name)
+$smarty->setExceptionHandler($handler)
+$smarty->addPluginsDir($plugins_dir)
+$smarty->getGlobal($varname = null)
+$smarty->getRegisteredObject($name)
+$smarty->getDebugTemplate()
+$smarty->setDebugTemplate($tpl_name)
+$smarty->assign($tpl_var, $value = null, $nocache = false)
+$smarty->assignGlobal($varname, $value = null, $nocache = false)
+$smarty->assignByRef($tpl_var, &$value, $nocache = false)
+$smarty->append($tpl_var, $value = null, $merge = false, $nocache = false)
+$smarty->appendByRef($tpl_var, &$value, $merge = false)
+$smarty->clearAssign($tpl_var)
+$smarty->clearAllAssign()
+$smarty->configLoad($config_file, $sections = null)
+$smarty->getVariable($variable, $_ptr = null, $search_parents = true, $error_enable = true)
+$smarty->getConfigVariable($variable)
+$smarty->getStreamVariable($variable)
+$smarty->getConfigVars($varname = null)
+$smarty->clearConfig($varname = null)
+$smarty->getTemplateVars($varname = null, $_ptr = null, $search_parents = true)
+$smarty->clearAllCache($exp_time = null, $type = null)
+$smarty->clearCache($template_name, $cache_id = null, $compile_id = null, $exp_time = null, $type = null)
+
+$smarty->registerPlugin($type, $tag, $callback, $cacheable = true, $cache_attr = array())
+
+$smarty->registerObject($object_name, $object_impl, $allowed = array(), $smarty_args = true, $block_methods = array())
+
+$smarty->registerFilter($type, $function_name)
+$smarty->registerResource($resource_type, $function_names)
+$smarty->registerDefaultPluginHandler($function_name)
+$smarty->registerDefaultTemplateHandler($function_name)
+
+$smarty->unregisterPlugin($type, $tag)
+$smarty->unregisterObject($object_name)
+$smarty->unregisterFilter($type, $function_name)
+$smarty->unregisterResource($resource_type)
+
+$smarty->compileAllTemplates($extention = '.tpl', $force_compile = false, $time_limit = 0, $max_errors = null)
+$smarty->clearCompiledTemplate($resource_name = null, $compile_id = null, $exp_time = null)
+$smarty->testInstall()
+
+// then all the getters/setters, available for all properties. Here are a few:
+
+$caching = $smarty->getCaching(); // get $smarty->caching
+$smarty->setCaching(true); // set $smarty->caching
+$smarty->setDeprecationNotices(false); // set $smarty->deprecation_notices
+$smarty->setCacheId($id); // set $smarty->cache_id
+$debugging = $smarty->getDebugging(); // get $smarty->debugging
+
+
+FILE STRUCTURE
+
+The Smarty 3 file structure is similar to Smarty 2:
+
+/libs/
+ Smarty.class.php
+/libs/sysplugins/
+ internal.*
+/libs/plugins/
+ function.mailto.php
+ modifier.escape.php
+ ...
+
+A lot of Smarty 3 core functionality lies in the sysplugins directory; you do
+not need to change any files here. The /libs/plugins/ folder is where Smarty
+plugins are located. You can add your own here, or create a separate plugin
+directory, just the same as Smarty 2. You will still need to create your own
+/cache/, /templates/, /templates_c/, /configs/ folders. Be sure /cache/ and
+/templates_c/ are writable.
+
+The typical way to use Smarty 3 should also look familiar:
+
+require('Smarty.class.php');
+$smarty = new Smarty;
+$smarty->assign('foo','bar');
+$smarty->display('index.tpl');
+
+
+However, Smarty 3 works completely different on the inside. Smarty 3 is mostly
+backward compatible with Smarty 2, except for the following items:
+
+*) Smarty 3 is PHP 5 only. It will not work with PHP 4.
+*) The {php} tag is disabled by default. Enable with $smarty->allow_php_tag=true.
+*) Delimiters surrounded by whitespace are no longer treated as Smarty tags.
+ Therefore, { foo } will not compile as a tag, you must use {foo}. This change
+ Makes Javascript/CSS easier to work with, eliminating the need for {literal}.
+ This can be disabled by setting $smarty->auto_literal = false;
+*) The Smarty 3 API is a bit different. Many Smarty 2 API calls are deprecated
+ but still work. You will want to update your calls to Smarty 3 for maximum
+ efficiency.
+
+
+There are many things that are new to Smarty 3. Here are the notable items:
+
+LEXER/PARSER
+============
+
+Smarty 3 now uses a lexing tokenizer for its parser/compiler. Basically, this
+means Smarty has some syntax additions that make life easier such as in-template
+math, shorter/intuitive function parameter options, infinite function recursion,
+more accurate error handling, etc.
+
+
+WHAT IS NEW IN SMARTY TEMPLATE SYNTAX
+=====================================
+
+Smarty 3 allows expressions almost anywhere. Expressions can include PHP
+functions as long as they are not disabled by the security policy, object
+methods and properties, etc. The {math} plugin is no longer necessary but
+is still supported for BC.
+
+Examples:
+{$x+$y} will output the sum of x and y.
+{$foo = strlen($bar)} function in assignment
+{assign var=foo value= $x+$y} in attributes
+{$foo = myfunct( ($x+$y)*3 )} as function parameter
+{$foo[$x+3]} as array index
+
+Smarty tags can be used as values within other tags.
+Example: {$foo={counter}+3}
+
+Smarty tags can also be used inside double quoted strings.
+Example: {$foo="this is message {counter}"}
+
+You can define arrays within templates.
+Examples:
+{assign var=foo value=[1,2,3]}
+{assign var=foo value=['y'=>'yellow','b'=>'blue']}
+Arrays can be nested.
+{assign var=foo value=[1,[9,8],3]}
+
+There is a new short syntax supported for assigning variables.
+Example: {$foo=$bar+2}
+
+You can assign a value to a specific array element. If the variable exists but
+is not an array, it is converted to an array before the new values are assigned.
+Examples:
+{$foo['bar']=1}
+{$foo['bar']['blar']=1}
+
+You can append values to an array. If the variable exists but is not an array,
+it is converted to an array before the new values are assigned.
+Example: {$foo[]=1}
+
+You can use a PHP-like syntax for accessing array elements, as well as the
+original "dot" notation.
+Examples:
+{$foo[1]} normal access
+{$foo['bar']}
+{$foo['bar'][1]}
+{$foo[$x+$x]} index may contain any expression
+{$foo[$bar[1]]} nested index
+{$foo[section_name]} smarty section access, not array access!
+
+The original "dot" notation stays, and with improvements.
+Examples:
+{$foo.a.b.c} => $foo['a']['b']['c']
+{$foo.a.$b.c} => $foo['a'][$b]['c'] with variable index
+{$foo.a.{$b+4}.c} => $foo['a'][$b+4]['c'] with expression as index
+{$foo.a.{$b.c}} => $foo['a'][$b['c']] with nested index
+
+note that { and } are used to address ambiguties when nesting the dot syntax.
+
+Variable names themselves can be variable and contain expressions.
+Examples:
+$foo normal variable
+$foo_{$bar} variable name containing other variable
+$foo_{$x+$y} variable name containing expressions
+$foo_{$bar}_buh_{$blar} variable name with multiple segments
+{$foo_{$x}} will output the variable $foo_1 if $x has a value of 1.
+
+Object method chaining is implemented.
+Example: {$object->method1($x)->method2($y)}
+
+{for} tag added for looping (replacement for {section} tag):
+{for $x=0, $y=count($foo); $x<$y; $x++} .... {/for}
+Any number of statements can be used separated by comma as the first
+inital expression at {for}.
+
+{for $x = $start to $end step $step} ... {/for}is in the SVN now .
+You can use also
+{for $x = $start to $end} ... {/for}
+In this case the step value will be automaticall 1 or -1 depending on the start and end values.
+Instead of $start and $end you can use any valid expression.
+Inside the loop the following special vars can be accessed:
+$x@iteration = number of iteration
+$x@total = total number of iterations
+$x@first = true on first iteration
+$x@last = true on last iteration
+
+
+The Smarty 2 {section} syntax is still supported.
+
+New shorter {foreach} syntax to loop over an array.
+Example: {foreach $myarray as $var}...{/foreach}
+
+Within the foreach loop, properties are access via:
+
+$var@key foreach $var array key
+$var@iteration foreach current iteration count (1,2,3...)
+$var@index foreach current index count (0,1,2...)
+$var@total foreach $var array total
+$var@first true on first iteration
+$var@last true on last iteration
+
+The Smarty 2 {foreach} tag syntax is still supported.
+
+NOTE: {$bar[foo]} still indicates a variable inside of a {section} named foo.
+If you want to access an array element with index foo, you must use quotes
+such as {$bar['foo']}, or use the dot syntax {$bar.foo}.
+
+while block tag is now implemented:
+{while $foo}...{/while}
+{while $x lt 10}...{/while}
+
+Direct access to PHP functions:
+Just as you can use PHP functions as modifiers directly, you can now access
+PHP functions directly, provided they are permitted by security settings:
+{time()}
+
+There is a new {function}...{/function} block tag to implement a template function.
+This enables reuse of code sequences like a plugin function. It can call itself recursively.
+Template function must be called with the new {call name=foo...} tag.
+
+Example:
+
+Template file:
+{function name=menu level=0}
+ <ul class="level{$level}">
+ {foreach $data as $entry}
+ {if is_array($entry)}
+ <li>{$entry@key}</li>
+ {call name=menu data=$entry level=$level+1}
+ {else}
+ <li>{$entry}</li>
+ {/if}
+ {/foreach}
+ </ul>
+{/function}
+
+{$menu = ['item1','item2','item3' => ['item3-1','item3-2','item3-3' =>
+ ['item3-3-1','item3-3-2']],'item4']}
+
+{call name=menu data=$menu}
+
+
+Generated output:
+ * item1
+ * item2
+ * item3
+ o item3-1
+ o item3-2
+ o item3-3
+ + item3-3-1
+ + item3-3-2
+ * item4
+
+The function tag itself must have the "name" attribute. This name is the tag
+name when calling the function. The function tag may have any number of
+additional attributes. These will be default settings for local variables.
+
+New {nocache} block function:
+{nocache}...{/nocache} will declare a section of the template to be non-cached
+when template caching is enabled.
+
+New nocache attribute:
+You can declare variable/function output as non-cached with the nocache attribute.
+Examples:
+
+{$foo nocache=true}
+{$foo nocache} /* same */
+
+{foo bar="baz" nocache=true}
+{foo bar="baz" nocache} /* same */
+
+{time() nocache=true}
+{time() nocache} /* same */
+
+Or you can also assign the variable in your script as nocache:
+$smarty->assign('foo',$something,true); // third param is nocache setting
+{$foo} /* non-cached */
+
+$smarty.current_dir returns the directory name of the current template.
+
+You can use strings directly as templates with the "string" resource type.
+Examples:
+$smarty->display('string:This is my template, {$foo}!'); // php
+{include file="string:This is my template, {$foo}!"} // template
+
+
+
+VARIABLE SCOPE / VARIABLE STORAGE
+=================================
+
+In Smarty 2, all assigned variables were stored within the Smarty object.
+Therefore, all variables assigned in PHP were accessible by all subsequent
+fetch and display template calls.
+
+In Smarty 3, we have the choice to assign variables to the main Smarty object,
+to user-created data objects, and to user-created template objects.
+These objects can be chained. The object at the end of a chain can access all
+variables belonging to that template and all variables within the parent objects.
+The Smarty object can only be the root of a chain, but a chain can be isolated
+from the Smarty object.
+
+All known Smarty assignment interfaces will work on the data and template objects.
+
+Besides the above mentioned objects, there is also a special storage area for
+global variables.
+
+A Smarty data object can be created as follows:
+$data = $smarty->createData(); // create root data object
+$data->assign('foo','bar'); // assign variables as usual
+$data->config_load('my.conf'); // load config file
+
+$data= $smarty->createData($smarty); // create data object having a parent link to
+the Smarty object
+
+$data2= $smarty->createData($data); // create data object having a parent link to
+the $data data object
+
+A template object can be created by using the createTemplate method. It has the
+same parameter assignments as the fetch() or display() method.
+Function definition:
+function createTemplate($template, $cache_id = null, $compile_id = null, $parent = null)
+
+The first parameter can be a template name, a smarty object or a data object.
+
+Examples:
+$tpl = $smarty->createTemplate('mytpl.tpl'); // create template object not linked to any parent
+$tpl->assign('foo','bar'); // directly assign variables
+$tpl->config_load('my.conf'); // load config file
+
+$tpl = $smarty->createTemplate('mytpl.tpl',$smarty); // create template having a parent link to the Smarty object
+$tpl = $smarty->createTemplate('mytpl.tpl',$data); // create template having a parent link to the $data object
+
+The standard fetch() and display() methods will implicitly create a template object.
+If the $parent parameter is not specified in these method calls, the template object
+is will link back to the Smarty object as it's parent.
+
+If a template is called by an {include...} tag from another template, the
+subtemplate links back to the calling template as it's parent.
+
+All variables assigned locally or from a parent template are accessible. If the
+template creates or modifies a variable by using the {assign var=foo...} or
+{$foo=...} tags, these new values are only known locally (local scope). When the
+template exits, none of the new variables or modifications can be seen in the
+parent template(s). This is same behavior as in Smarty 2.
+
+With Smarty 3, we can assign variables with a scope attribute which allows the
+availablility of these new variables or modifications globally (ie in the parent
+templates.)
+
+Possible scopes are local, parent, root and global.
+Examples:
+{assign var=foo value='bar'} // no scope is specified, the default 'local'
+{$foo='bar'} // same, local scope
+{assign var=foo value='bar' scope='local'} // same, local scope
+
+{assign var=foo value='bar' scope='parent'} // Values will be available to the parent object
+{$foo='bar' scope='parent'} // (normally the calling template)
+
+{assign var=foo value='bar' scope='root'} // Values will be exported up to the root object, so they can
+{$foo='bar' scope='root'} // be seen from all templates using the same root.
+
+{assign var=foo value='bar' scope='global'} // Values will be exported to global variable storage,
+{$foo='bar' scope='global'} // they are available to any and all templates.
+
+
+The scope attribute can also be attached to the {include...} tag. In this case,
+the specified scope will be the default scope for all assignments within the
+included template.
+
+
+PLUGINS
+=======
+
+Smarty3 are following the same coding rules as in Smarty2.
+The only difference is that the template object is passed as additional third parameter.
+
+smarty_plugintype_name (array $params, object $smarty, object $template)
+
+The Smarty 2 plugins are still compatible as long as they do not make use of specific Smarty2 internals.
+
+
+TEMPLATE INHERITANCE:
+=====================
+
+With template inheritance you can define blocks, which are areas that can be
+overriden by child templates, so your templates could look like this:
+
+parent.tpl:
+<html>
+ <head>
+ <title>{block name='title'}My site name{/block}</title>
+ </head>
+ <body>
+ <h1>{block name='page-title'}Default page title{/block}</h1>
+ <div id="content">
+ {block name='content'}
+ Default content
+ {/block}
+ </div>
+ </body>
+</html>
+
+child.tpl:
+{extends file='parent.tpl'}
+{block name='title'}
+Child title
+{/block}
+
+grandchild.tpl:
+{extends file='child.tpl'}
+{block name='title'}Home - {$smarty.block.parent}{/block}
+{block name='page-title'}My home{/block}
+{block name='content'}
+ {foreach $images as $img}
+ <img src="{$img.url}" alt="{$img.description}" />
+ {/foreach}
+{/block}
+
+We redefined all the blocks here, however in the title block we used {$smarty.block.parent},
+which tells Smarty to insert the default content from the parent template in its place.
+The content block was overriden to display the image files, and page-title has also be
+overriden to display a completely different title.
+
+If we render grandchild.tpl we will get this:
+<html>
+ <head>
+ <title>Home - Child title</title>
+ </head>
+ <body>
+ <h1>My home</h1>
+ <div id="content">
+ <img src="/example.jpg" alt="image" />
+ <img src="/example2.jpg" alt="image" />
+ <img src="/example3.jpg" alt="image" />
+ </div>
+ </body>
+</html>
+
+NOTE: In the child templates everything outside the {extends} or {block} tag sections
+is ignored.
+
+The inheritance tree can be as big as you want (meaning you can extend a file that
+extends another one that extends another one and so on..), but be aware that all files
+have to be checked for modifications at runtime so the more inheritance the more overhead you add.
+
+Instead of defining the parent/child relationships with the {extends} tag in the child template you
+can use the resource as follow:
+
+$smarty->display('extends:parent.tpl|child.tpl|grandchild.tpl');
+
+Child {block} tags may optionally have a append or prepend attribute. In this case the parent block content
+is appended or prepended to the child block content.
+
+{block name='title' append} My title {/block}
+
+
+PHP STREAMS:
+============
+
+(see online documentation)
+
+VARIBLE FILTERS:
+================
+
+(see online documentation)
+
+
+STATIC CLASS ACCESS AND NAMESPACE SUPPORT
+=========================================
+
+You can register a class with optional namespace for the use in the template like:
+
+$smarty->register->templateClass('foo','name\name2\myclass');
+
+In the template you can use it like this:
+{foo::method()} etc.
+
+
+=======================
+
+Please look through it and send any questions/suggestions/etc to the forums.
+
+http://www.phpinsider.com/smarty-forum/viewtopic.php?t=14168
+
+Monte and Uwe
diff --git a/include/smarty/SMARTY_2_BC_NOTES.txt b/include/smarty/SMARTY_2_BC_NOTES.txt
new file mode 100644
index 000000000..79a2cb1b6
--- /dev/null
+++ b/include/smarty/SMARTY_2_BC_NOTES.txt
@@ -0,0 +1,109 @@
+= Known incompatibilities with Smarty 2 =
+
+== Syntax ==
+
+Smarty 3 API has a new syntax. Much of the Smarty 2 syntax is supported
+by a wrapper but deprecated. See the README that comes with Smarty 3 for more
+information.
+
+The {$array|@mod} syntax has always been a bit confusing, where an "@" is required
+to apply a modifier to an array instead of the individual elements. Normally you
+always want the modifier to apply to the variable regardless of its type. In Smarty 3,
+{$array|mod} and {$array|@mod} behave identical. It is safe to drop the "@" and the
+modifier will still apply to the array. If you really want the modifier to apply to
+each array element, you must loop the array in-template, or use a custom modifier that
+supports array iteration. Most smarty functions already escape values where necessary
+such as {html_options}
+
+== PHP Version ==
+Smarty 3 is PHP 5 only. It will not work with PHP 4.
+
+== {php} Tag ==
+The {php} tag is disabled by default. The use of {php} tags is
+deprecated. It can be enabled with $smarty->allow_php_tag=true.
+
+But if you scatter PHP code which belongs together into several
+{php} tags it may not work any longer.
+
+== Delimiters and whitespace ==
+Delimiters surrounded by whitespace are no longer treated as Smarty tags.
+Therefore, { foo } will not compile as a tag, you must use {foo}. This change
+Makes Javascript/CSS easier to work with, eliminating the need for {literal}.
+This can be disabled by setting $smarty->auto_literal = false;
+
+== Unquoted Strings ==
+Smarty 2 was a bit more forgiving (and ambiguous) when it comes to unquoted strings
+in parameters. Smarty3 is more restrictive. You can still pass strings without quotes
+so long as they contain no special characters. (anything outside of A-Za-z0-9_)
+
+For example filename strings must be quoted
+<source lang="smarty">
+{include file='path/foo.tpl'}
+</source>
+
+== Extending the Smarty class ==
+Smarty 3 makes use of the __construct method for initialization. If you are extending
+the Smarty class, its constructor is not called implicitly if the your child class defines
+its own constructor. In order to run Smarty's constructor, a call to parent::__construct()
+within your child constructor is required.
+
+<source lang="php">
+class MySmarty extends Smarty {
+ function __construct() {
+ parent::__construct();
+
+ // your initialization code goes here
+
+ }
+}
+</source>
+
+== Autoloader ==
+Smarty 3 does register its own autoloader with spl_autoload_register. If your code has
+an existing __autoload function then this function must be explicitly registered on
+the __autoload stack. See http://us3.php.net/manual/en/function.spl-autoload-register.php
+for further details.
+
+== Plugin Filenames ==
+Smarty 3 optionally supports the PHP spl_autoloader. The autoloader requires filenames
+to be lower case. Because of this, Smarty plugin file names must also be lowercase.
+In Smarty 2, mixed case file names did work.
+
+== Scope of Special Smarty Variables ==
+In Smarty 2 the special Smarty variables $smarty.section... and $smarty.foreach...
+had global scope. If you had loops with the same name in subtemplates you could accidentally
+overwrite values of parent template.
+
+In Smarty 3 these special Smarty variable have only local scope in the template which
+is defining the loop. If you need their value in a subtemplate you have to pass them
+as parameter.
+<source lang="smarty">
+{include file='path/foo.tpl' index=$smarty.section.foo.index}
+</source>
+
+== SMARTY_RESOURCE_CHAR_SET ==
+Smarty 3 sets the constant SMARTY_RESOURCE_CHAR_SET to utf-8 as default template charset.
+This is now used also on modifiers like escape as default charset. If your templates use
+other charsets make sure that you define the constant accordingly. Otherwise you may not
+get any output.
+
+== newline at {if} tags ==
+A \n was added to the compiled code of the {if},{else},{elseif},{/if} tags to get output of newlines as expected by the template source.
+If one of the {if} tags is at the line end you will now get a newline in the HTML output.
+
+== trigger_error() ==
+The API function trigger_error() has been removed because it did just map to PHP trigger_error.
+However it's still included in the Smarty2 API wrapper.
+
+== Smarty constants ==
+The constants
+SMARTY_PHP_PASSTHRU
+SMARTY_PHP_QUOTE
+SMARTY_PHP_REMOVE
+SMARTY_PHP_ALLOW
+have been replaced with class constants
+Smarty::PHP_PASSTHRU
+Smarty::PHP_QUOTE
+Smarty::PHP_REMOVE
+Smarty::PHP_ALLOW
+
diff --git a/include/smarty/SMARTY_3.0_BC_NOTES.txt b/include/smarty/SMARTY_3.0_BC_NOTES.txt
new file mode 100644
index 000000000..fd8b540c2
--- /dev/null
+++ b/include/smarty/SMARTY_3.0_BC_NOTES.txt
@@ -0,0 +1,24 @@
+== Smarty2 backward compatibility ==
+All Smarty2 specific API functions and deprecated functionallity has been moved
+to the SmartyBC class.
+
+== {php} Tag ==
+The {php} tag is no longer available in the standard Smarty calls.
+The use of {php} tags is deprecated and only available in the SmartyBC class.
+
+== {include_php} Tag ==
+The {include_php} tag is no longer available in the standard Smarty calls.
+The use of {include_php} tags is deprecated and only available in the SmartyBC class.
+
+== php template resource ==
+The support of the php template resource is removed.
+
+== $cache_dir, $compile_dir, $config_dir, $template_dir access ==
+The mentioned properties can't be accessed directly any longer. You must use
+corresponding getter/setters like addConfigDir(), setConfigDir(), getConfigDir()
+
+== obsolete Smarty class properties ==
+The following no longer used properties are removed:
+$allow_php_tag
+$allow_php_template
+$deprecation_notices \ No newline at end of file
diff --git a/include/smarty/SMARTY_3.1_NOTES.txt b/include/smarty/SMARTY_3.1_NOTES.txt
new file mode 100644
index 000000000..e56e56f67
--- /dev/null
+++ b/include/smarty/SMARTY_3.1_NOTES.txt
@@ -0,0 +1,306 @@
+Smarty 3.1 Notes
+================
+
+Smarty 3.1 is a departure from 2.0 compatibility. Most notably, all
+backward compatibility has been moved to a separate class file named
+SmartyBC.class.php. If you require compatibility with 2.0, you will
+need to use this class.
+
+Some differences from 3.0 are also present. 3.1 begins the journey of
+requiring setters/getters for property access. So far this is only
+implemented on the five directory properties: template_dir,
+plugins_dir, configs_dir, compile_dir and cache_dir. These properties
+are now protected, it is required to use the setters/getters instead.
+That said, direct property access will still work, however slightly
+slower since they will now fall through __set() and __get() and in
+turn passed through the setter/getter methods. 3.2 will exhibit a full
+list of setter/getter methods for all (currently) public properties,
+so code-completion in your IDE will work as expected.
+
+There is absolutely no PHP allowed in templates any more. All
+deprecated features of Smarty 2.0 are gone. Again, use the SmartyBC
+class if you need any backward compatibility.
+
+Internal Changes
+
+ Full UTF-8 Compatibility
+
+The plugins shipped with Smarty 3.1 have been rewritten to fully
+support UTF-8 strings if Multibyte String is available. Without
+MBString UTF-8 cannot be handled properly. For those rare cases where
+templates themselves have to juggle encodings, the new modifiers
+to_charset and from_charset may come in handy.
+
+ Plugin API and Performance
+
+All Plugins (modifiers, functions, blocks, resources,
+default_template_handlers, etc) are now receiving the
+Smarty_Internal_Template instance, where they were supplied with the
+Smarty instance in Smarty 3.0. *. As The Smarty_Internal_Template
+mimics the behavior of Smarty, this API simplification should not
+require any changes to custom plugins.
+
+The plugins shipped with Smarty 3.1 have been rewritten for better
+performance. Most notably {html_select_date} and {html_select_time}
+have been improved vastly. Performance aside, plugins have also been
+reviewed and generalized in their API. {html_select_date} and
+{html_select_time} now share almost all available options.
+
+The escape modifier now knows the $double_encode option, which will
+prevent entities from being encoded again.
+
+The capitalize modifier now know the $lc_rest option, which makes sure
+all letters following a captial letter are lower-cased.
+
+The count_sentences modifier now accepts (.?!) as
+legitimate endings of a sentence - previously only (.) was
+accepted
+
+The new unescape modifier is there to reverse the effects of the
+escape modifier. This applies to the escape formats html, htmlall and
+entity.
+
+ default_template_handler_func
+
+The invocation of $smarty->$default_template_handler_func had to be
+altered. Instead of a Smarty_Internal_Template, the fifth argument is
+now provided with the Smarty instance. New footprint:
+
+
+/**
+ * Default Template Handler
+ *
+ * called when Smarty's file: resource is unable to load a requested file
+ *
+ * @param string $type resource type (e.g. "file", "string", "eval", "resource")
+ * @param string $name resource name (e.g. "foo/bar.tpl")
+ * @param string &$content template's content
+ * @param integer &$modified template's modification time
+ * @param Smarty $smarty Smarty instance
+ * @return string|boolean path to file or boolean true if $content and $modified
+ * have been filled, boolean false if no default template
+ * could be loaded
+ */
+function default_template_handler_func($type, $name, &$content, &$modified, Smarty $smarty) {
+ if (false) {
+ // return corrected filepath
+ return "/tmp/some/foobar.tpl";
+ } elseif (false) {
+ // return a template directly
+ $content = "the template source";
+ $modified = time();
+ return true;
+ } else {
+ // tell smarty that we failed
+ return false;
+ }
+}
+
+ Stuff done to the compiler
+
+Many performance improvements have happened internally. One notable
+improvement is that all compiled templates are now handled as PHP
+functions. This speeds up repeated templates tremendously, as each one
+calls an (in-memory) PHP function instead of performing another file
+include/scan.
+
+New Features
+
+ Template syntax
+
+ {block}..{/block}
+
+The {block} tag has a new hide option flag. It does suppress the block
+content if no corresponding child block exists.
+EXAMPLE:
+parent.tpl
+{block name=body hide} child content "{$smarty.block.child}" was
+inserted {block}
+In the above example the whole block will be suppressed if no child
+block "body" is existing.
+
+ {setfilter}..{/setfilter}
+
+The new {setfilter} block tag allows the definition of filters which
+run on variable output.
+SYNTAX:
+{setfilter filter1|filter2|filter3....}
+Smarty3 will lookup up matching filters in the following search order:
+1. varibale filter plugin in plugins_dir.
+2. a valid modifier. A modifier specification will also accept
+additional parameter like filter2:'foo'
+3. a PHP function
+{/setfilter} will turn previous filter setting off again.
+{setfilter} tags can be nested.
+EXAMPLE:
+{setfilter filter1}
+ {$foo}
+ {setfilter filter2}
+ {$bar}
+ {/setfilter}
+ {$buh}
+{/setfilter}
+{$blar}
+In the above example filter1 will run on the output of $foo, filter2
+on $bar, filter1 again on $buh and no filter on $blar.
+NOTES:
+- {$foo nofilter} will suppress the filters
+- These filters will run in addition to filters defined by
+registerFilter('variable',...), autoLoadFilter('variable',...) and
+defined default modifier.
+- {setfilter} will effect only the current template, not included
+subtemplates.
+
+ Resource API
+
+Smarty 3.1 features a new approach to resource management. The
+Smarty_Resource API allows simple, yet powerful integration of custom
+resources for templates and configuration files. It offers simple
+functions for loading data from a custom resource (e.g. database) as
+well as define new template types adhering to the special
+non-compiling (e,g, plain php) and non-compile-caching (e.g. eval:
+resource type) resources.
+
+See demo/plugins/resource.mysql.php for an example custom database
+resource.
+
+Note that old-fashioned registration of callbacks for resource
+management has been deprecated but is still possible with SmartyBC.
+
+ CacheResource API
+
+In line with the Resource API, the CacheResource API offers a more
+comfortable handling of output-cache data. With the
+Smarty_CacheResource_Custom accessing databases is made simple. With
+the introduction of Smarty_CacheResource_KeyValueStore the
+implementation of resources like memcache or APC became a no-brainer;
+simple hash-based storage systems are now supporting hierarchical
+output-caches.
+
+See demo/plugins/cacheresource.mysql.php for an example custom
+database CacheResource.
+See demo/plugins/cacheresource.memcache.php for an example custom
+memcache CacheResource using the KeyValueStore helper.
+
+Note that old-fashioned registration of $cache_handler is not possible
+anymore. As the functionality had not been ported to Smarty 3.0.x
+properly, it has been dropped from 3.1 completely.
+
+Locking facilities have been implemented to avoid concurrent cache
+generation. Enable cache locking by setting
+$smarty->cache_locking = true;
+
+ Relative Paths in Templates (File-Resource)
+
+As of Smarty 3.1 {include file="../foo.tpl"} and {include
+file="./foo.tpl"} will resolve relative to the template they're in.
+Relative paths are available with {include file="..."} and
+{extends file="..."}. As $smarty->fetch('../foo.tpl') and
+$smarty->fetch('./foo.tpl') cannot be relative to a template, an
+exception is thrown.
+
+ Adressing a specific $template_dir
+
+Smarty 3.1 introduces the $template_dir index notation.
+$smarty->fetch('[foo]bar.tpl') and {include file="[foo]bar.tpl"}
+require the template bar.tpl to be loaded from $template_dir['foo'];
+Smarty::setTemplateDir() and Smarty::addTemplateDir() offer ways to
+define indexes along with the actual directories.
+
+ Mixing Resources in extends-Resource
+
+Taking the php extends: template resource one step further, it is now
+possible to mix resources within an extends: call like
+$smarty->fetch("extends:file:foo.tpl|db:bar.tpl");
+
+To make eval: and string: resources available to the inheritance
+chain, eval:base64:TPL_STRING and eval:urlencode:TPL_STRING have been
+introduced. Supplying the base64 or urlencode flags will trigger
+decoding the TPL_STRING in with either base64_decode() or urldecode().
+
+ extends-Resource in template inheritance
+
+Template based inheritance may now inherit from php's extends:
+resource like {extends file="extends:foo.tpl|db:bar.tpl"}.
+
+ New Smarty property escape_html
+
+$smarty->escape_html = true will autoescape all template variable
+output by calling htmlspecialchars({$output}, ENT_QUOTES,
+SMARTY_RESOURCE_CHAR_SET).
+NOTE:
+This is a compile time option. If you change the setting you must make
+sure that the templates get recompiled.
+
+ New option at Smarty property compile_check
+
+The automatic recompilation of modified templates can now be
+controlled by the following settings:
+$smarty->compile_check = COMPILECHECK_OFF (false) - template files
+will not be checked
+$smarty->compile_check = COMPILECHECK_ON (true) - template files will
+always be checked
+$smarty->compile_check = COMPILECHECK_CACHEMISS - template files will
+be checked if caching is enabled and there is no existing cache file
+or it has expired
+
+ Automatic recompilation on Smarty version change
+
+Templates will now be automatically recompiled on Smarty version
+changes to avoide incompatibillities in the compiled code. Compiled
+template checked against the current setting of the SMARTY_VERSION
+constant.
+
+ default_config_handler_func()
+
+Analogous to the default_template_handler_func()
+default_config_handler_func() has been introduced.
+
+ default_plugin_handler_func()
+
+An optional default_plugin_handler_func() can be defined which gets called
+by the compiler on tags which can't be resolved internally or by plugins.
+The default_plugin_handler() can map tags to plugins on the fly.
+
+New getters/setters
+
+The following setters/getters will be part of the official
+documentation, and will be strongly recommended. Direct property
+access will still work for the foreseeable future... it will be
+transparently routed through the setters/getters, and consequently a
+bit slower.
+
+array|string getTemplateDir( [string $index] )
+replaces $smarty->template_dir; and $smarty->template_dir[$index];
+Smarty setTemplateDir( array|string $path )
+replaces $smarty->template_dir = "foo"; and $smarty->template_dir =
+array("foo", "bar");
+Smarty addTemplateDir( array|string $path, [string $index])
+replaces $smarty->template_dir[] = "bar"; and
+$smarty->template_dir[$index] = "bar";
+
+array|string getConfigDir( [string $index] )
+replaces $smarty->config_dir; and $smarty->config_dir[$index];
+Smarty setConfigDir( array|string $path )
+replaces $smarty->config_dir = "foo"; and $smarty->config_dir =
+array("foo", "bar");
+Smarty addConfigDir( array|string $path, [string $index])
+replaces $smarty->config_dir[] = "bar"; and
+$smarty->config_dir[$index] = "bar";
+
+array getPluginsDir()
+replaces $smarty->plugins_dir;
+Smarty setPluginsDir( array|string $path )
+replaces $smarty->plugins_dir = "foo";
+Smarty addPluginsDir( array|string $path )
+replaces $smarty->plugins_dir[] = "bar";
+
+string getCompileDir()
+replaces $smarty->compile_dir;
+Smarty setCompileDir( string $path )
+replaces $smarty->compile_dir = "foo";
+
+string getCacheDir()
+replaces $smarty->cache_dir;
+Smarty setCacheDir( string $path )
+replaces $smarty->cache_dir;
diff --git a/include/smarty/change_log.txt b/include/smarty/change_log.txt
new file mode 100644
index 000000000..69642e276
--- /dev/null
+++ b/include/smarty/change_log.txt
@@ -0,0 +1,2153 @@
+===== Smarty-3.1.13 =====
+13.01.2013
+- enhancement allow to disable exception message escaping by SmartyException::$escape = false; (Issue #130)
+
+09.01.2013
+- bugfix compilation did fail when a prefilter did modify an {extends} tag (Forum Topic 23966)
+- bugfix template inheritance could fail if nested {block} tags in childs did contain {$smarty.block.child} (Issue #127)
+- bugfix template inheritance could fail if {block} tags in childs did have similar name as used plugins (Issue #128)
+- added abstract method declaration doCompile() in Smarty_Internal_TemplateCompilerBase (Forum Topic 23969)
+
+06.01.2013
+- Allow '://' URL syntax in template names of stream resources (Issue #129)
+
+27.11.2012
+- bugfix wrong variable usage in smarty_internal_utility.php (Issue #125)
+
+26.11.2012
+- bugfix global variable assigned within template function are not seen after template function exit (Forum Topic 23800)
+
+24.11.2012
+- made SmartyBC loadable via composer (Issue #124)
+
+20.11.2012
+- bugfix assignGlobal() called from plugins did not work (Forum Topic 23771)
+
+13.11.2012
+- adding attribute "strict" to html_options, html_checkboxes, html_radios to only print disabled/readonly attributes if their values are true or "disabled"/"readonly" (Issue #120)
+
+01.11.2012
+- bugfix muteExcpetedErrors() would screw up for non-readable paths (Issue #118)
+
+===== Smarty-3.1.12 =====
+14.09.2012
+- bugfix template inheritance failed to compile with delimiters {/ and /} (Forum Topic 23008)
+
+11.09.2012
+- bugfix escape Smarty exception messages to avoid possible script execution
+
+10.09.2012
+- bugfix tag option flags and shorttag attributes did not work when rdel started with '=' (Forum Topic 22979)
+
+31.08.2012
+- bugfix resolving relative paths broke in some circumstances (Issue #114)
+
+22.08.2012
+- bugfix test MBString availability through mb_split, as it could've been compiled without regex support (--enable-mbregex).
+ Either we get MBstring's full package, or we pretend it's not there at all.
+
+21.08.2012
+- bugfix $auto_literal = false did not work with { block} tags in child templates
+ (problem was reintroduced after fix in 3.1.7)(Forum Topic 20581)
+
+17.08.2012
+- bugfix compiled code of nocache sections could contain wrong escaping (Forum Topic 22810)
+
+15.08.2012
+- bugfix template inheritance did produce wrong code if subtemplates with {block} was
+ included several times (from smarty-developers forum)
+
+14.08.2012
+- bugfix PHP5.2 compatibility compromised by SplFileInfo::getBasename() (Issue 110)
+
+01.08.2012
+- bugfix avoid PHP error on $smarty->configLoad(...) with invalid section specification (Forum Topic 22608)
+
+30.07.2012
+-bugfix {assign} in a nocache section should not overwrite existing variable values
+ during compilation (issue 109)
+
+28.07.2012
+- bugfix array access of config variables did not work (Forum Topic 22527)
+
+19.07.2012
+- bugfix the default plugin handler did create wrong compiled code for static class methods
+ from external script files (issue 108)
+
+===== Smarty-3.1.11 =====
+30.06.2012
+- bugfix {block.. hide} did not work as nested child (Forum Topic 22216)
+
+25.06.2012
+- bugfix the default plugin handler did not allow static class methods for modifier (issue 85)
+
+24.06.2012
+- bugfix escape modifier support for PHP < 5.2.3 (Forum Topic 21176)
+
+11.06.2012
+- bugfix the patch for Topic 21856 did break tabs between tag attributes (Forum Topic 22124)
+
+===== Smarty-3.1.10 =====
+09.06.2012
+- bugfix the compiler did ignore registered compiler plugins for closing tags (Forum Topic 22094)
+- bugfix the patch for Topic 21856 did break multiline tags (Forum Topic 22124)
+
+===== Smarty-3.1.9 =====
+07.06.2012
+- bugfix fetch() and display() with relative paths (Issue 104)
+- bugfix treat "0000-00-00" as 0 in modifier.date_format (Issue 103)
+
+24.05.2012
+- bugfix Smarty_Internal_Write_File::writeFile() could cause race-conditions on linux systems (Issue 101)
+- bugfix attribute parameter names of plugins may now contain also "-" and ":" (Forum Topic 21856)
+- bugfix add compile_id to cache key of of source (Issue 97)
+
+22.05.2012
+- bugfix recursive {include} within {section} did fail (Smarty developer group)
+
+12.05.2012
+- bugfix {html_options} did not properly escape values (Issue 98)
+
+03.05.2012
+- bugfix make HTTP protocall version variable (issue 96)
+
+02.05.2012
+- bugfix {nocache}{block}{plugin}... did produce wrong compiled code when caching is disabled (Forum Topic 21572, issue 95)
+
+12.04.2012
+- bugfix Smarty did eat the linebreak after the <?xml...?> closing tag (Issue 93)
+- bugfix concurrent cache updates could create a warning (Forum Topic 21403)
+
+08.04.2012
+- bugfix "\\" was not escaped correctly when generating nocache code (Forum Topic 21364)
+
+30.03.2012
+- bugfix template inheritance did not throw exception when a parent template was deleted (issue 90)
+
+27.03.2012
+- bugfix prefilter did run multiple times on inline subtemplates compiled into several main templates (Forum Topic 21325)
+- bugfix implement Smarty2's behaviour of variables assigned by reference in SmartyBC. {assign} will affect all references.
+ (issue 88)
+
+21.03.2012
+- bugfix compileAllTemplates() and compileAllConfig() did not return the number of compiled files (Forum Topic 21286)
+
+13.03.2012
+- correction of yesterdays bugfix (Forum Topic 21175 and 21182)
+
+12.03.2012
+- bugfix a double quoted string of "$foo" did not compile into PHP "$foo" (Forum Topic 21175)
+- bugfix template inheritance did set $merge_compiled_includes globally true
+
+03.03.2012
+- optimization of compiling speed when same modifier was used several times
+
+02.03.2012
+- enhancement the default plugin handler can now also resolve undefined modifier (Smarty::PLUGIN_MODIFIER)
+ (Issue 85)
+
+===== Smarty-3.1.8 =====
+19.02.2012
+- bugfix {include} could result in a fatal error if used in appended or prepended nested {block} tags
+ (reported by mh and Issue 83)
+- enhancement added Smarty special variable $smarty.template_object to return the current template object (Forum Topic 20289)
+
+
+07.02.2012
+- bugfix increase entropy of internal function names in compiled and cached template files (Forum Topic 20996)
+- enhancement cacheable parameter added to default plugin handler, same functionality as in registerPlugin (request by calguy1000)
+
+06.02.2012
+- improvement stream_resolve_include_path() added to Smarty_Internal_Get_Include_Path (Forum Topic 20980)
+- bugfix fetch('extends:foo.tpl') always yielded $source->exists == true (Forum Topic 20980)
+- added modifier unescape:"url", fix (Forum Topic 20980)
+- improvement replaced some calls of preg_replace with str_replace (Issue 73)
+
+30.01.2012
+- bugfix Smarty_Security internal $_resource_dir cache wasn't properly propagated
+
+27.01.2012
+- bugfix Smarty did not a template name of "0" (Forum Topic 20895)
+
+20.01.2012
+- bugfix typo in Smarty_Internal_Get_IncludePath did cause runtime overhead (Issue 74)
+- improvment remove unneeded assigments (Issue 75 and 76)
+- fixed typo in template parser
+- bugfix output filter must not run before writing cache when template does contain nocache code (Issue 71)
+
+02.01.2012
+- bugfix {block foo nocache} did not load plugins within child {block} in nocache mode (Forum Topic 20753)
+
+29.12.2011
+- bugfix enable more entropy in Smarty_Internal_Write_File for "more uniqueness" and Cygwin compatibility (Forum Topic 20724)
+- bugfix embedded quotes in single quoted strings did not compile correctly in {nocache} sections (Forum Topic 20730)
+
+28.12.2011
+- bugfix Smarty's internal header code must be excluded from postfilters (issue 71)
+
+22.12.2011
+- bugfix the new lexer of 17.12.2011 did fail if mbstring.func_overload != 0 (issue 70) (Forum Topic 20680)
+- bugfix template inheritace did fail if mbstring.func_overload != 0 (issue 70) (Forum Topic 20680)
+
+20.12.2011
+- bugfix template inheritance: {$smarty.block.child} in nested child {block} tags did not return
+ content after {$smarty.block.child} (Forum Topic 20564)
+
+===== Smarty-3.1.7 =====
+18.12.2011
+- bugfix strings ending with " in multiline strings of config files failed to compile (issue #67)
+- added chaining to Smarty_Internal_Templatebase
+- changed unloadFilter() to not return a boolean in favor of chaining and API conformity
+- bugfix unregisterObject() raised notice when object to unregister did not exist
+- changed internals to use Smarty::$_MBSTRING ($_CHARSET, $_DATE_FORMAT) for better unit testing
+- added Smarty::$_UTF8_MODIFIER for proper PCRE charset handling (Forum Topic 20452)
+- added Smarty_Security::isTrustedUri() and Smarty_Security::$trusted_uri to validate
+ remote resource calls through {fetch} and {html_image} (Forum Topic 20627)
+
+17.12.2011
+- improvement of compiling speed by new handling of plain text blocks in the lexer/parser (issue #68)
+
+16.12.2011
+- bugfix the source exits flag and timestamp was not setup when template was in php include path (issue #69)
+
+9.12.2011
+- bugfix {capture} tags around recursive {include} calls did throw exception (Forum Topic 20549)
+- bugfix $auto_literal = false did not work with { block} tags in child templates (Forum Topic 20581)
+- bugfix template inheritance: do not include code of {include} in overloaded {block} into compiled
+ parent template (Issue #66}
+- bugfix template inheritance: {$smarty.block.child} in nested child {block} tags did not return expected
+ result (Forum Topic 20564)
+
+===== Smarty-3.1.6 =====
+30.11.2011
+- bugfix is_cache() for individual cached subtemplates with $smarty->caching = CACHING_OFF did produce
+ an exception (Forum Topic 20531)
+
+29.11.2011
+- bugfix added exception if the default plugin handler did return a not static callback (Forum Topic 20512)
+
+25.11.2011
+- bugfix {html_select_date} and {html_slecet_time} did not default to current time if "time" was not specified
+ since r4432 (issue 60)
+
+24.11.2011
+- bugfix a subtemplate later used as main template did use old variable values
+
+21.11.2011
+- bugfix cache file could include unneeded modifier plugins under certain condition
+
+18.11.2011
+- bugfix declare all directory properties private to map direct access to getter/setter also on extended Smarty class
+
+16.11.2011
+- bugfix Smarty_Resource::load() did not always return a proper resource handler (Forum Topic 20414)
+- added escape argument to html_checkboxes and html_radios (Forum Topic 20425)
+
+===== Smarty-3.1.5 =====
+14.11.2011
+- bugfix allow space between function name and open bracket (forum topic 20375)
+
+09.11.2011
+- bugfix different behaviour of uniqid() on cygwin. See https://bugs.php.net/bug.php?id=34908
+ (forum topic 20343)
+
+01.11.2011
+- bugfix {if} and {while} tags without condition did not throw a SmartyCompilerException (Issue #57)
+- bugfix multiline strings in config files could fail on longer strings (reopened Issue #55)
+
+22.10.2011
+- bugfix smarty_mb_from_unicode() would not decode unicode-points properly
+- bugfix use catch Exception instead UnexpectedValueException in
+ clearCompiledTemplate to be PHP 5.2 compatible
+
+21.10.2011
+- bugfix apostrophe in plugins_dir path name failed (forum topic 20199)
+- improvement sha1() for array keys longer than 150 characters
+- add Smarty::$allow_ambiguous_resources to activate unique resource handling (Forum Topic 20128)
+
+20.10.2011
+- @silenced unlink() in Smarty_Internal_Write_File since debuggers go haywire without it.
+- bugfix Smarty::clearCompiledTemplate() threw an Exception if $cache_id was not present in $compile_dir when $use_sub_dirs = true.
+- bugfix {html_select_date} and {html_select_time} did not properly handle empty time arguments (Forum Topic 20190)
+- improvement removed unnecessary sha1()
+
+19.10.2011
+- revert PHP4 constructor message
+- fixed PHP4 constructor message
+
+===== Smarty-3.1.4 =====
+19.10.2011
+- added exception when using PHP4 style constructor
+
+16.10.2011
+- bugfix testInstall() did not propery check cache_dir and compile_dir
+
+15.10.2011
+- bugfix Smarty_Resource and Smarty_CacheResource runtime caching (Forum Post 75264)
+
+14.10.2011
+- bugfix unique_resource did not properly apply to compiled resources (Forum Topic 20128)
+- add locking to custom resources (Forum Post 75252)
+- add Smarty_Internal_Template::clearCache() to accompany isCached() fetch() etc.
+
+13.10.2011
+- add caching for config files in Smarty_Resource
+- bugfix disable of caching after isCached() call did not work (Forum Topic 20131)
+- add concept unique_resource to combat potentially ambiguous template_resource values when custom resource handlers are used (Forum Topic 20128)
+- bugfix multiline strings in config files could fail on longer strings (Issue #55)
+
+11.10.2011
+- add runtime checks for not matching {capture}/{/capture} calls (Forum Topic 20120)
+
+10.10.2011
+- bugfix variable name typo in {html_options} and {html_checkboxes} (Issue #54)
+- bugfix <?xml> tag did create wrong output when caching enabled and the tag was in included subtemplate
+- bugfix Smarty_CacheResource_mysql example was missing strtotime() calls
+
+===== Smarty-3.1.3 =====
+07.10.2011
+- improvement removed html comments from {mailto} (Forum Topic 20092)
+- bugfix testInstall() would not show path to internal plugins_dir (Forum Post 74627)
+- improvement testInstall() now showing resolved paths and checking the include_path if necessary
+- bugfix html_options plugin did not handle object values properly (Issue #49, Forum Topic 20049)
+- improvement html_checkboxes and html_radios to accept null- and object values, and label_ids attribute
+- improvement removed some unnecessary count()s
+- bugfix parent pointer was not set when fetch() for other template was called on template object
+
+06.10.2011
+- bugfix switch lexer internals depending on mbstring.func_overload
+- bugfix start_year and end_year of {html_select_date} did not use current year as offset base (Issue #53)
+
+05.10.2011
+- bugfix of problem introduced with r4342 by replacing strlen() with isset()
+- add environment configuration issue with mbstring.func_overload Smarty cannot compensate for (Issue #45)
+- bugfix nofilter tag option did not disable default modifier
+- bugfix html_options plugin did not handle null- and object values properly (Issue #49, Forum Topic 20049)
+
+04.10.2011
+- bugfix assign() in plugins called in subtemplates did change value also in parent template
+- bugfix of problem introduced with r4342 on math plugin
+- bugfix output filter should not run on individually cached subtemplates
+- add unloadFilter() method
+- bugfix has_nocache_code flag was not reset before compilation
+
+===== Smarty-3.1.2 =====
+03.10.2011
+- improvement add internal $joined_template_dir property instead computing it on the fly several times
+
+01.10.2011
+- improvement replaced most in_array() calls by more efficient isset() on array_flip()ed haystacks
+- improvement replaced some strlen($foo) > 3 calls by isset($foo[3])
+- improvement Smarty_Internal_Utility::clearCompiledTemplate() removed redundant strlen()s
+
+29.09.2011
+- improvement of Smarty_Internal_Config::loadConfigVars() dropped the in_array for index look up
+
+28.09.2011
+- bugfix on template functions called nocache calling other template functions
+
+27.09.2011
+- bugfix possible warning "attempt to modify property of non-object" in {section} (issue #34)
+- added chaining to Smarty_Internal_Data so $smarty->assign('a',1)->assign('b',2); is possible now
+- bugfix remove race condition when a custom resource did change timestamp during compilation
+- bugfix variable property did not work on objects variable in template
+- bugfix smarty_make_timestamp() failed to process DateTime objects properly
+- bugfix wrong resource could be used on compile check of custom resource
+
+26.09.2011
+- bugfix repeated calls to same subtemplate did not make use of cached template object
+
+24.09.2011
+- removed internal muteExpectedErrors() calls in favor of having the implementor call this once from his application
+- optimized muteExpectedErrors() to pass errors to the latest registered error handler, if appliccable
+- added compile_dir and cache_dir to list of muted directories
+- improvment better error message for undefined templates at {include}
+
+23.09.2011
+- remove unused properties
+- optimization use real function instead anonymous function for preg_replace_callback
+- bugfix a relative {include} in child template blocks failed
+- bugfix direct setting of $template_dir, $config_dir, $plugins_dir in __construct() of an
+ extended Smarty class created problems
+- bugfix error muting was not implemented for cache locking
+
+===== Smarty 3.1.1 =====
+22.09.2011
+- bugfix {foreachelse} does fail if {section} was nested inside {foreach}
+- bugfix debug.tpl did not display correctly when it was compiled with escape_html = true
+
+21.09.2011
+- bugfix look for mixed case plugin file names as in 3.0 if not found try all lowercase
+- added $error_muting to suppress error messages even for badly implemented error_handlers
+- optimized autoloader
+- reverted ./ and ../ handling in fetch() and display() - they're allowed again
+
+20.09.2011
+- bugfix removed debug echo output while compiling template inheritance
+- bugfix relative paths in $template_dir broke relative path resolving in {include "../foo.tpl"}
+- bugfix {include} did not work inside nested {block} tags
+- bugfix {assign} with scope root and global did not work in all cases
+
+19.09.2011
+- bugfix regression in Smarty_CacheReource_KeyValueStore introduced by r4261
+- bugfix output filter shall not run on included subtemplates
+
+18.09.2011
+- bugfix template caching did not care about file.tpl in different template_dir
+- bugfix {include $file} was broken when merge_compiled_incluges = true
+- bugfix {include} was broken when merge_compiled_incluges = true and same indluded template
+ was used in different main templates in one compilation run
+- bugfix for Smarty2 style compiler plugins on unnamed attribute passing like {tag $foo $bar}
+- bugfix debug.tpl did not display correctly when it was compiled with escape_html = true
+
+17.09.2011
+- bugfix lock_id for file resource would create invalid filepath
+- bugfix resource caching did not care about file.tpl in different template_dir
+
+===== Smarty 3.1.0 =====
+15/09/2011
+- optimization of {foreach}; call internal _count() method only when "total" or "last" {foreach} properties are used
+
+11/09/2011
+- added unregisterObject() method
+
+06/09/2011
+- bugfix isset() did not work in templates on config variables
+
+03/09/2011
+- bugfix createTemplate() must default to cache_id and compile_id of Smarty object
+- bugfix Smarty_CacheResource_KeyValueStore must include $source->uid in cache filepath to keep templates with same
+ name but different folders seperated
+- added cacheresource.apc.php example in demo folder
+
+02/09/2011
+- bugfix cache lock file must use absolute filepath
+
+01/09/2011
+- update of cache locking
+
+30/08/2011
+- added locking mechanism to CacheResource API (implemented with File and KeyValueStores)
+
+28/08/2011
+- bugfix clearCompileTemplate() did not work for specific template subfolder or resource
+
+27/08/2011
+- bugfix {$foo|bar+1} did create syntax error
+
+26/08/2011
+- bugfix when generating nocache code which contains double \
+- bugfix handle race condition if cache file was deleted between filemtime and include
+
+17/08/2011
+- bugfix CacheResource_Custom bad internal fetch() call
+
+15/08/2011
+- bugfix CacheResource would load content twice for KeyValueStore and Custom handlers
+
+06/08/2011
+- bugfix {include} with scope attribute could execute in wrong scope
+- optimization of compile_check processing
+
+03/08/2011
+- allow comment tags to comment {block} tags out in child templates
+
+26/07/2011
+- bugfix experimental getTags() method did not work
+
+24/07/2011
+- sure opened output buffers are closed on exception
+- bugfix {foreach} did not work on IteratorAggregate
+
+22/07/2011
+- clear internal caches on clearAllCache(), clearCache(), clearCompiledTemplate()
+
+21/07/2011
+- bugfix value changes of variable values assigned to Smarty object could not be seen on repeated $smarty->fetch() calls
+
+17/07/2011
+- bugfix {$smarty.block.child} did drop a notice at undefined child
+
+15/07/2011
+- bugfix individual cache_lifetime of {include} did not work correctly inside {block} tags
+- added caches for Smarty_Template_Source and Smarty_Template_Compiled to reduce I/O for multiple cache_id rendering
+
+14/07/2011
+- made Smarty::loadPlugin() respect the include_path if required
+
+13/07/2011
+- optimized internal file write functionality
+- bugfix PHP did eat line break on nocache sections
+- fixed typo of Smarty_Security properties $allowed_modifiers and $disabled_modifiers
+
+06/07/2011
+- bugfix variable modifier must run befor gereral filtering/escaping
+
+04/07/2011
+- bugfix use (?P<name>) syntax at preg_match as some pcre libraries failed on (?<name>)
+- some performance improvement when using generic getter/setter on template objects
+
+30/06/2011
+- bugfix generic getter/setter of Smarty properties used on template objects did throw exception
+- removed is_dir and is_readable checks from directory setters for better performance
+
+28/06/2011
+- added back support of php template resource as undocumented feature
+- bugfix automatic recompilation on version change could drop undefined index notice on old 3.0 cache and compiled files
+- update of README_3_1_DEV.txt and moved into the distribution folder
+- improvement show first characters of eval and string templates instead sha1 Uid in debug window
+
+===== Smarty 3.1-RC1 =====
+25/06/2011
+- revert change of 17/06/2011. $_smarty varibale removed. call loadPlugin() from inside plugin code if required
+- code cleanup, remove no longer used properties and methods
+- update of PHPdoc comments
+
+23/06/2011
+- bugfix {html_select_date} would not respect current time zone
+
+19/06/2011
+- added $errors argument to testInstall() functions to suppress output.
+- added plugin-file checks to testInstall()
+
+18/06/2011
+- bugfix mixed use of same subtemplate inline and not inline in same script could cause a warning during compilation
+
+17/06/2011
+- bugfix/change use $_smarty->loadPlugin() when loading nested depending plugins via loadPlugin
+- bugfix {include ... inline} within {block}...{/block} did fail
+
+16/06/2011
+- bugfix do not overwrite '$smarty' template variable when {include ... scope=parent} is called
+- bugfix complete empty inline subtemplates did fail
+
+15/06/2011
+- bugfix template variables where not accessable within inline subtemplates
+
+12/06/2011
+- bugfix removed unneeded merging of template variable when fetching includled subtemplates
+
+10/06/2011
+- made protected properties $template_dir, $plugins_dir, $cache_dir, $compile_dir, $config_dir accessible via magic methods
+
+09/06/2011
+- fix smarty security_policy issue in plugins {html_image} and {fetch}
+
+05/06/2011
+- update of SMARTY_VERSION
+- bugfix made getTags() working again
+
+04/06/2011
+- allow extends resource in file attribute of {extends} tag
+
+03/06/2011
+- added {setfilter} tag to set filters for variable output
+- added escape_html property to control autoescaping of variable output
+
+27/05/2011
+- added allowed/disabled tags and modifiers in security for sandboxing
+
+23/05/2011
+- added base64: and urlencode: arguments to eval and string resource types
+
+22/05/2011
+- made time-attribute of {html_select_date} and {html_select_time} accept arrays as defined by attributes prefix and field_array
+
+13/05/2011
+- remove setOption / getOption calls from SamrtyBC class
+
+02/05/2011
+- removed experimental setOption() getOption() methods
+- output returned content also on opening tag calls of block plugins
+- rewrite of default plugin handler
+- compile code of variable filters for better performance
+
+20/04/2011
+- allow {php} {include_php} tags and PHP_ALLOW handling only with the SmartyBC class
+- removed support of php template resource
+
+20/04/2011
+- added extendsall resource example
+- optimization of template variable access
+- optimization of subtemplate handling {include}
+- optimization of template class
+
+01/04/2011
+- bugfix quote handling in capitalize modifier
+
+28/03/2011
+- bugfix stripslashes() requried when using PCRE e-modifier
+
+04/03/2011
+- upgrade to new PHP_LexerGenerator version 0.4.0 for better performance
+
+27/02/2011
+- ignore .svn folders when clearing cache and compiled files
+- string resources do not need a modify check
+
+26/02/2011
+- replaced smarty_internal_wrapper by SmartyBC class
+- load utility functions as static methods instead through __call()
+- bugfix in extends resource when subresources are used
+- optimization of modify checks
+
+25/02/2011
+- use $smarty->error_unassigned to control NOTICE handling on unassigned variables
+
+21/02/2011
+- added new new compile_check mode COMPILECHECK_CACHEMISS
+- corrected new cloning behaviour of createTemplate()
+- do no longer store the compiler object as property in the compile_tag classes to avoid possible memory leaks
+ during compilation
+
+19/02/2011
+- optimizations on merge_compiled_includes handling
+- a couple of optimizations and bugfixes related to new resource structure
+
+17/02/2011
+- changed ./ and ../ behaviour
+
+14/02/2011
+- added {block ... hide} option to supress block if no child is defined
+
+13/02/2011
+- update handling of recursive subtemplate calls
+- bugfix replace $smarty->triggerError() by exception in smarty_internal_resource_extends.php
+
+12/02/2011
+- new class Smarty_Internal_TemplateBase with shared methods of Smarty and Template objects
+- optimizations of template processing
+- made register... methods permanet
+- code for default_plugin_handler
+- add automatic recompilation at version change
+
+04/02/2011
+- change in Smarty_CacheResource_Custom
+- bugfix cache_lifetime did not compile correctly at {include} after last update
+- moved isCached processing into CacheResource class
+- bugfix new CacheResource API did not work with disabled compile_check
+
+03/02/2011
+- handle template content as function to improve speed on multiple calls of same subtemplate and isCached()/display() calls
+- bugfixes and improvents in the new resource API
+- optimizations of template class code
+
+25/01/2011
+- optimized function html_select_time
+
+22/01/2011
+- added Smarty::$use_include_path configuration directive for Resource API
+
+21/01/2011
+- optimized function html_select_date
+
+19/01/2011
+- optimized outputfilter trimwhitespace
+
+18/01/2011
+- bugfix Config to use Smarty_Resource to fetch sources
+- optimized Smarty_Security's isTrustedDir() and isTrustedPHPDir()
+
+17/01/2011
+- bugfix HTTP headers for CGI SAPIs
+
+16/01/2011
+- optimized internals of Smarty_Resource and Smarty_CacheResource
+
+14/01/2011
+- added modifiercompiler escape to improve performance of escaping html, htmlall, url, urlpathinfo, quotes, javascript
+- added support to choose template_dir to load from: [index]filename.tpl
+
+12/01/2011
+- added unencode modifier to revert results of encode modifier
+- added to_charset and from_charset modifier for character encoding
+
+11/01/2011
+- added SMARTY_MBSTRING to generalize MBString detection
+- added argument $lc_rest to modifier.capitalize to lower-case anything but the first character of a word
+- changed strip modifier to consider unicode white-space, too
+- changed wordwrap modifier to accept UTF-8 strings
+- changed count_sentences modifier to consider unicode characters and treat sequences delimited by ? and ! as sentences, too
+- added argument $double_encode to modifier.escape (applies to html and htmlall only)
+- changed escape modifier to be UTF-8 compliant
+- changed textformat block to be UTF-8 compliant
+- optimized performance of mailto function
+- fixed spacify modifier so characters are not prepended and appended, made it unicode compatible
+- fixed truncate modifier to properly use mb_string if possible
+- removed UTF-8 frenzy from count_characters modifier
+- fixed count_words modifier to treat "hello-world" as a single word like str_count_words() does
+- removed UTF-8 frenzy from upper modifier
+- removed UTF-8 frenzy from lower modifier
+
+01/01/2011
+- optimize smarty_modified_escape for hex, hexentity, decentity.
+
+28/12/2010
+- changed $tpl_vars, $config_vars and $parent to belong to Smarty_Internal_Data
+- added Smarty::registerCacheResource() for dynamic cache resource object registration
+
+27/12/2010
+- added Smarty_CacheResource API and refactored existing cache resources accordingly
+- added Smarty_CacheResource_Custom and Smarty_CacheResource_Mysql
+
+26/12/2010
+- added Smarty_Resource API and refactored existing resources accordingly
+- added Smarty_Resource_Custom and Smarty_Resource_Mysql
+- bugfix Smarty::createTemplate() to return properly cloned template instances
+
+24/12/2010
+- optimize smarty_function_escape_special_chars() for PHP >= 5.2.3
+
+===== SVN 3.0 trunk =====
+14/05/2011
+- bugfix error handling at stream resources
+
+13/05/2011
+- bugfix condition starting with "-" did fail at {if} and {while} tags
+
+22/04/2011
+- bugfix allow only fixed string as file attribute at {extends} tag
+
+01/04/2011
+- bugfix do not run filters and default modifier when displaying the debug template
+- bugfix of embedded double quotes within multi line strings (""")
+
+29/03/2011
+- bugfix on error message in smarty_internal_compile_block.php
+- bugfix mb handling in strip modifier
+- bugfix for Smarty2 style registered compiler function on unnamed attribute passing like {tag $foo $bar}
+
+17/03/2011
+- bugfix on default {function} parameters when {function} was used in nocache sections
+- bugfix on compiler object destruction. compiler_object property was by mistake unset.
+
+09/03/2011
+-bugfix a variable filter should run before modifers on an output tag (see change of 23/07/2010)
+
+08/03/2011
+- bugfix loading config file without section should load only defaults
+
+03/03/2011
+- bugfix "smarty" template variable was not recreated when cached templated had expired
+- bugfix internal rendered_content must be cleared after subtemplate was included
+
+01/03/2011
+- bugfix replace modifier did not work in 3.0.7 on systems without multibyte support
+- bugfix {$smarty.template} could return in 3.0.7 parent template name instead of
+ child name when it needed to compile
+
+25/02/2011
+- bugfix for Smarty2 style compiler plugins on unnamed attribute passing like {tag $foo $bar}
+
+24/02/2011
+- bugfix $smarty->clearCache('some.tpl') did by mistake cache the template object
+
+18/02/2011
+- bugfix removed possible race condition when isCached() was called for an individually cached subtemplate
+- bugfix force default debug.tpl to be loaded by the file resource
+
+17/02/2011
+-improvement not to delete files starting with '.' from cache and template_c folders on clearCompiledTemplate() and clearCache()
+
+16/02/2011
+-fixed typo in exception message of Smarty_Internal_Template
+-improvement allow leading spaces on } tag closing if auto_literal is enabled
+
+13/02/2011
+- bufix replace $smarty->triggerError() by exception
+- removed obsolete {popup_init..} plugin from demo templates
+- bugfix replace $smarty->triggerError() by exception in smarty_internal_resource_extends.php
+
+===== Smarty 3.0.7 =====
+09/02/2011
+- patched vulnerability when using {$smarty.template}
+
+01/02/2011
+- removed assert() from config and template parser
+
+31/01/2011
+- bugfix the lexer/parser did fail on special characters like VT
+
+16/01/2011
+-bugfix of ArrayAccess object handling in internal _count() method
+-bugfix of Iterator object handling in internal _count() method
+
+14/01/2011
+-bugfix removed memory leak while processing compileAllTemplates
+
+12/01/2011
+- bugfix in {if} and {while} tag compiler when using assignments as condition and nocache mode
+
+10/01/2011
+- bugfix when using {$smarty.block.child} and name of {block} was in double quoted string
+- bugfix updateParentVariables() was called twice when leaving {include} processing
+
+- bugfix mb_str_replace in replace and escape modifiers work with utf8
+
+31/12/2010
+- bugfix dynamic configuration of $debugging_crtl did not work
+- bugfix default value of $config_read_hidden changed to false
+- bugfix format of attribute array on compiler plugins
+- bugfix getTemplateVars() could return value from wrong scope
+
+28/12/2010
+- bugfix multiple {append} tags failed to compile.
+
+22/12/2010
+- update do not clone the Smarty object an internal createTemplate() calls to increase performance
+
+21/12/2010
+- update html_options to support class and id attrs
+
+17/12/2010
+- bugfix added missing support of $cache_attrs for registered plugins
+
+15/12/2010
+- bugfix assignment as condition in {while} did drop an E_NOTICE
+
+14/12/2010
+- bugfix when passing an array as default parameter at {function} tag
+
+13/12/2010
+- bugfix {$smarty.template} in child template did not return right content
+- bugfix Smarty3 did not search the PHP include_path for template files
+
+===== Smarty 3.0.6 =====
+
+12/12/2010
+- bugfix fixed typo regarding yesterdays change to allow streamWrapper
+
+11/12/2010
+- bugfix nested block tags in template inheritance child templates did not work correctly
+- bugfix {$smarty.current_dir} in child template did not point to dir of child template
+- bugfix changed code when writing temporary compiled files to allow stream_wrapper
+
+06/12/2010
+- bugfix getTemplateVars() should return 'null' instead dropping E_NOTICE on an unassigned variable
+
+05/12/2010
+- bugfix missing declaration of $smarty in Smarty class
+- bugfix empty($foo) in {if} did drop a notice when $foo was not assigned
+
+01/12/2010
+- improvement of {debug} tag output
+
+27/11/2010
+-change run output filter before cache file is written. (same as in Smarty2)
+
+24/11/2011
+-bugfix on parser at !$foo|modifier
+-change parser logic when assignments used as condition in {if] and {while} to allow assign to array element
+
+23/11/2011
+-bugfix allow integer as attribute name in plugin calls
+-change trimm whitespace from error message, removed long list of expected tokens
+
+22/11/2010
+- bugfix on template inheritance when an {extends} tag was inserted by a prefilter
+- added error message for illegal variable file attributes at {extends...} tags
+
+===== Smarty 3.0.5 =====
+
+
+19/11/2010
+- bugfix on block plugins with modifiers
+
+18/11/2010
+- change on handling of unassigned template variable -- default will drop E_NOTICE
+- bugfix on Smarty2 wrapper load_filter() did not work
+
+17/11/2010
+- bugfix on {call} with variable function name
+- bugfix on {block} if name did contain '-'
+- bugfix in function.fetch.php , referece to undefined $smarty
+
+16/11/2010
+- bugfix whitespace in front of "<?php" in smarty_internal_compile_private_block_plugin.php
+- bugfix {$smarty.now} did compile incorrectly
+- bugfix on reset(),end(),next(),prev(),current() within templates
+- bugfix on default parameter for {function}
+
+15/11/2010
+- bugfix when using {$smarty.session} as object
+- bugfix scoping problem on $smarty object passed to filters
+- bugfix captured content could not be accessed globally
+- bugfix Smarty2 wrapper functions could not be call from within plugins
+
+===== Smarty 3.0.4 =====
+
+14/11/2010
+- bugfix isset() did not allow multiple parameter
+- improvment of some error messages
+- bugfix html_image did use removed property $request_use_auto_globals
+- small performace patch in Smarty class
+
+13/11/2010
+- bugfix overloading problem when $smarty->fetch()/display() have been used in plugins
+ (introduced with 3.0.2)
+- code cleanup
+
+===== Smarty 3.0.3 =====
+
+13/11/2010
+- bugfix on {debug}
+- reverted location of loadPlugin() to Smarty class
+- fixed comments in plugins
+- fixed internal_config (removed unwanted code line)
+- improvement remove last linebreak from {function} definition
+
+===== Smarty 3.0.2 =====
+
+12/11/2010
+- reactivated $error_reporting property handling
+- fixed typo in compile_continue
+- fixed security in {fetch} plugin
+- changed back plugin parameters to two. second is template object
+ with transparent access to Smarty object
+- fixed {config_load} scoping form compile time to run time
+
+===== Smarty 3.0.0 =====
+
+
+
+11/11/2010
+- major update including some API changes
+
+10/11/2010
+- observe compile_id also for config files
+
+09/11/2010
+-bugfix on complex expressions as start value for {for} tag
+request_use_auto_globals
+04/11/2010
+- bugfix do not allow access of dynamic and private object members of assigned objects when
+ security is enabled.
+
+01/11/2010
+- bugfix related to E_NOTICE change. {if empty($foo)} did fail when $foo contained a string
+
+28/10/2010
+- bugfix on compiling modifiers within $smarty special vars like {$smarty.post.{$foo|lower}}
+
+27/10/2010
+- bugfix default parameter values did not work for template functions included with {include}
+
+25/10/2010
+- bugfix for E_NOTICE change, array elements did not work as modifier parameter
+
+20/10/2010
+- bugfix for the E_NOTICE change
+
+19/10/2010
+- change Smarty does no longer mask out E_NOTICE by default during template processing
+
+13/10/2010
+- bugfix removed ambiguity between ternary and stream variable in template syntax
+- bugfix use caching properties of template instead of smarty object when compiling child {block}
+- bugfix {*block}...{/block*} did throw an exception in template inheritance
+- bugfix on template inheritance using nested eval or string resource in {extends} tags
+- bugfix on output buffer handling in isCached() method
+
+===== RC4 =====
+
+01/10/2010
+- added {break} and {continue} tags for flow control of {foreach},{section},{for} and {while} loops
+- change of 'string' resource. It's no longer evaluated and compiled files are now stored
+- new 'eval' resource which evaluates a template without saving the compiled file
+- change in isCached() method to allow multiple calls for the same template
+
+25/09/2010
+- bugfix on some compiling modifiers
+
+24/09/2010
+- bugfix merge_compiled_includes flag was not restored correctly in {block} tag
+
+22/09/2010
+- bugfix on default modifier
+
+18/09/2010
+- bugfix untility compileAllConfig() did not create sha1 code for compiled template file names if template_dir was defined with no trailing DS
+- bugfix on templateExists() for extends resource
+
+17/09/2010
+- bugfix {$smarty.template} and {$smarty.current_dir} did not compile correctly within {block} tags
+- bugfix corrected error message on missing template files in extends resource
+- bugfix untility compileAllTemplates() did not create sha1 code for compiled template file names if template_dir was defined with no trailing DS
+
+16/09/2010
+- bugfix when a doublequoted modifier parameter did contain Smarty tags and ':'
+
+15/09/2010
+- bugfix resolving conflict between '<%'/'%>' as custom Smarty delimiter and ASP tags
+- use ucfirst for resource name on internal resource class names
+
+12/09/2010
+- bugfix for change of 08/09/2010 (final {block} tags in subtemplates did not produce correct results)
+
+10/09/2010
+- bugfix for change of 08/09/2010 (final {block} tags in subtemplates did not produce correct results)
+
+08/09/2010
+- allow multiple template inheritance branches starting in subtemplates
+
+07/09/2010
+- bugfix {counter} and {cycle} plugin assigned result to smarty variable not in local(template) scope
+- bugfix templates containing just {strip} {/strip} tags did produce an error
+
+
+23/08/2010
+- fixed E_STRICT errors for uninitialized variables
+
+22/08/2010
+- added attribute cache_id to {include} tag
+
+13/08/2010
+- remove exception_handler property from Smarty class
+- added Smarty's own exceptions SmartyException and SmartyCompilerException
+
+09/08/2010
+- bugfix on modifier with doublequoted strings as parameter containing embedded tags
+
+06/08/2010
+- bugfix when cascading some modifier like |strip|strip_tags modifier
+
+05/08/2010
+- added plugin type modifiercompiler to produce compiled modifier code
+- changed standard modifier plugins to the compiling versions whenever possible
+- bugfix in nocache sections {include} must not cache the subtemplate
+
+02/08/2010
+- bugfix strip did not work correctly in conjunction with comment lines
+
+31/07/2010
+- bugfix on nocache attribute at {assign} and {append}
+
+30/07/2010
+- bugfix passing scope attributes in doublequoted strings did not work at {include} {assign} and {append}
+
+25/07/2010
+- another bugfix of change from 23/07/2010 when compiling modifer
+
+24/07/2010
+- bugfix of change from 23/07/2010 when compiling modifer
+
+23/07/2010
+- changed execution order. A variable filter does now run before modifiers on output of variables
+- bugfix use always { and } as delimiter for debug.tpl
+
+
+22/07/2010
+- bugfix in templateExists() method
+
+20/07/2010
+- fixed handling of { strip } tag with whitespaces
+
+15/07/2010
+- bufix {$smarty.template} does include now the relative path, not just filename
+
+===== RC3 =====
+
+
+
+
+15/07/2010
+- make the date_format modifier work also on objects of the DateTime class
+- implementation of parsetrees in the parser to close security holes and remove unwanted empty line in HTML output
+
+08/07/2010
+- bugfix on assigning multidimensional arrays within templates
+- corrected bugfix for truncate modifier
+
+07/07/2010
+- bugfix the truncate modifier needs to check if the string is utf-8 encoded or not
+- bugfix support of script files relative to trusted_dir
+
+06/07/2010
+- create exception on recursive {extends} calls
+- fixed reported line number at "unexpected closing tag " exception
+- bugfix on escape:'mail' modifier
+- drop exception if 'item' variable is equal 'from' variable in {foreach} tag
+
+01/07/2010
+- removed call_user_func_array calls for optimization of compiled code when using registered modifiers and plugins
+
+25/06/2010
+- bugfix escaping " when block tags are used within doublequoted strings
+
+24/06/2010
+- replace internal get_time() calls with standard PHP5 microtime(true) calls in Smarty_Internal_Utility
+- added $smarty->register->templateClass() and $smarty->unregister->templateClass() methods for supporting static classes with namespace
+
+
+22/06/2010
+- allow spaces between typecast and value in template syntax
+- bugfix get correct count of traversables in {foreach} tag
+
+21/06/2010
+- removed use of PHP shortags SMARTY_PHP_PASSTHRU mode
+- improved speed of cache->clear() when a compile_id was specified and use_sub_dirs is true
+
+20/06/2010
+- replace internal get_time() calls with standard PHP5 microtime(true) calls
+- closed security hole when php.ini asp_tags = on
+
+18/06/2010
+- added __toString method to the Smarty_Variable class
+
+
+14/06/2010
+- make handling of Smarty comments followed by newline BC to Smarty2
+
+
+===== RC2 =====
+
+
+
+13/06/2010
+- bugfix Smarty3 did not handle hexadecimals like 0x0F as numerical value
+- bugifx Smarty3 did not accept numerical constants like .1 or 2. (without a leading or trailing digit)
+
+11/06/2010
+- bugfix the lexer did fail on larger {literal} ... {/literal} sections
+
+03/06/2010
+- bugfix on calling template functions like Smarty tags
+
+01/06/2010
+- bugfix on template functions used with template inheritance
+- removed /* vim: set expandtab: */ comments
+- bugfix of auto literal problem introduce with fix of 31/05/2010
+
+31/05/2010
+- bugfix the parser did not allow some smarty variables with special name like $for, $if, $else and others.
+
+27/05/2010
+- bugfix on object chaining using variable properties
+- make scope of {counter} and {cycle} tags again global as in Smarty2
+
+26/05/2010
+- bugfix removed decrepated register_resource call in smarty_internal_template.php
+
+25/05/2010
+- rewrite of template function handling to improve speed
+- bugfix on file dependency when merge_compiled_includes = true
+
+
+16/05/2010
+- bugfix when passing parameter with numeric name like {foo 1='bar' 2='blar'}
+
+14/05/2010
+- bugfix compile new config files if compile_check and force_compile = false
+- added variable static classes names to template syntax
+
+11/05/2010
+- bugfix make sure that the cache resource is loaded in all conditions when template methods getCached... are called externally
+- reverted the change 0f 30/04/2010. With the exception of forward references template functions can be again called by a standard tag.
+
+10/05/2010
+- bugfix on {foreach} and {for} optimizations of 27/04/2010
+
+09/05/2010
+- update of template and config file parser because of minor parser generator bugs
+
+07/05/2010
+- bugfix on {insert}
+
+06/05/2010
+- bugfix when merging compiled templates and objects are passed as parameter of the {include} tag
+
+05/05/2010
+- bugfix on {insert} to cache parameter
+- implementation of $smarty->default_modifiers as in Smarty2
+- bugfix on getTemplateVars method
+
+01/05/2010
+- bugfix on handling of variable method names at object chaning
+
+30/04/2010
+- bugfix when comparing timestamps in sysplugins/smarty_internal_config.php
+- work around of a substr_compare bug in older PHP5 versions
+- bugfix on template inheritance for tag names starting with "block"
+- bugfix on {function} tag with name attribute in doublequoted strings
+- fix to make calling of template functions unambiguously by madatory usage of the {call} tag
+
+===== RC1 =====
+
+27/04/2010
+- change default of $debugging_ctrl to 'NONE'
+- optimization of compiled code of {foreach} and {for} loops
+- change of compiler for config variables
+
+27/04/2010
+- bugfix in $smarty->cache->clear() method. (do not cache template object)
+
+
+17/04/2010
+- security fix in {math} plugin
+
+
+12/04/2010
+- bugfix in smarty_internal_templatecompilerbase (overloaded property)
+- removed parser restrictions in using true,false and null as ID
+
+07/04/2010
+- bugfix typo in smarty_internal_templatecompilerbase
+
+31/03/2010
+- compile locking by touching old compiled files to avoid concurrent compilations
+
+29/03/2010
+- bugfix allow array definitions as modifier parameter
+- bugfix observe compile_check property when loading config files
+- added the template object as third filter parameter
+
+25/03/2010
+- change of utility->compileAllTemplates() log messages
+- bugfix on nocache code in {function} tags
+- new method utility->compileAllConfig() to compile all config files
+
+24/03/2010
+- bugfix on register->modifier() error messages
+
+23/03/2010
+- bugfix on template inheritance when calling multiple child/parent relations
+- bugfix on caching mode SMARTY_CACHING_LIFETIME_SAVED and cache_lifetime = 0
+
+22/03/2010
+- bugfix make directory separator operating system independend in compileAllTemplates()
+
+21/03/2010
+- removed unused code in compileAllTemplates()
+
+19/03/2010
+- bugfix for multiple {/block} tags on same line
+
+17/03/2010
+- bugfix make $smarty->cache->clear() function independent from caching status
+
+16/03/2010
+- bugfix on assign attribute at registered template objects
+- make handling of modifiers on expression BC to Smarty2
+
+15/03/2010
+- bugfix on block plugin calls
+
+11/03/2010
+- changed parsing of <?php and ?> back to Smarty2 behaviour
+
+08/03/2010
+- bugfix on uninitialized properties in smarty_internal_template
+- bugfix on $smarty->disableSecurity()
+
+04/03/2010
+- bugfix allow uppercase chars in registered resource names
+- bugfix on accessing chained objects of static classes
+
+01/03/2010
+- bugfix on nocache code in {block} tags if child template was included by {include}
+
+27/02/2010
+- allow block tags inside double quoted string
+
+26/02/2010
+- cache modified check implemented
+- support of access to a class constant from an object (since PHP 5.3)
+
+24/02/2010
+- bugfix on expressions in doublequoted string enclosed in backticks
+- added security property $static_classes for static class security
+
+18/02/2010
+- bugfix on parsing Smarty tags inside <?xml ... ?>
+- bugfix on truncate modifier
+
+17/02/2010
+- removed restriction that modifiers did require surrounding parenthesis in some cases
+- added {$smarty.block.child} special variable for template inheritance
+
+16/02/2010
+- bugfix on <?xml ... ?> tags for all php_handling modes
+- bugfix on parameter of variablefilter.htmlspecialchars.php plugin
+
+14/02/2010
+- added missing _plugins property in smarty.class.php
+- bugfix $smarty.const... inside doublequoted strings and backticks was compiled into wrong PHP code
+
+12/02/2010
+- bugfix on nested {block} tags
+- changed Smarty special variable $smarty.parent to $smarty.block.parent
+- added support of nested {bock} tags
+
+10/02/2010
+- avoid possible notice on $smarty->cache->clear(...), $smarty->clear_cache(....)
+- allow Smarty tags inside <? ... ?> tags in SMARTY_PHP_QUOTE and SMARTY_PHP_PASSTHRU mode
+- bugfix at new "for" syntax like {for $x=1 to 10 step 2}
+
+09/02/2010
+- added $smarty->_tag_stack for tracing block tag hierarchy
+
+08/02/2010
+- bugfix use template fullpath at §smarty->cache->clear(...), $smarty->clear_cache(....)
+- bugfix of cache filename on extended templates when force_compile=true
+
+07/02/2010
+- bugfix on changes of 05/02/2010
+- preserve line endings type form template source
+- API changes (see README file)
+
+05/02/2010
+- bugfix on modifier and block plugins with same name
+
+02/02/2010
+- retaining newlines at registered functions and function plugins
+
+01/25/2010
+- bugfix cache resource was not loaded when caching was globally off but enabled at a template object
+- added test that $_SERVER['SCRIPT_NAME'] does exist in Smarty.class.php
+
+01/22/2010
+- new method $smarty->createData([$parent]) for creating a data object (required for bugfixes below)
+- bugfix config_load() method now works also on a data object
+- bugfix get_config_vars() method now works also on a data and template objects
+- bugfix clear_config() method now works also on a data and template objects
+
+01/19/2010
+- bugfix on plugins if same plugin was called from a nocache section first and later from a cached section
+
+
+###beta 7###
+
+
+01/17/2010
+- bugfix on $smarty.const... in double quoted strings
+
+01/16/2010
+- internal change of config file lexer/parser on handling of section names
+- bugfix on registered objects (format parameter of register_object was not handled correctly)
+
+01/14/2010
+- bugfix on backslash within single quoted strings
+- bugfix allow absolute filepath for config files
+- bugfix on special Smarty variable $smarty.cookies
+- revert handling of newline on no output tags like {if...}
+- allow special characters in config file section names for Smarty2 BC
+
+01/13/2010
+- bugfix on {if} tags
+
+01/12/2010
+- changed back modifer handling in parser. Some restrictions still apply:
+ if modifiers are used in side {if...} expression or in mathematical expressions
+ parentheses must be used.
+- bugfix the {function..} tag did not accept the name attribute in double quotes
+- closed possible security hole at <?php ... ?> tags
+- bugfix of config file parser on large config files
+
+
+###beta 6####
+
+01/11/2010
+- added \n to the compiled code of the {if},{else},{elseif},{/if} tags to get output of newlines as expected by the template source
+- added missing support of insert plugins
+- added optional nocache attribute to {block} tags in parent template
+- updated <?php...?> handling supporting now heredocs and newdocs. (thanks to Thue Jnaus Kristensen)
+
+01/09/2010
+- bugfix on nocache {block} tags in parent templates
+
+01/08/2010
+- bugfix on variable filters. filter/nofilter attributes did not work on output statements
+
+01/07/2010
+- bugfix on file dependency at template inheritance
+- bugfix on nocache code at template inheritance
+
+01/06/2010
+- fixed typo in smarty_internal_resource_registered
+- bugfix for custom delimiter at extends resource and {extends} tag
+
+01/05/2010
+- bugfix sha1() calculations at extends resource and some general improvments on sha1() handling
+
+
+01/03/2010
+- internal change on building cache files
+
+01/02/2010
+- update cached_timestamp at the template object after cache file is written to avoid possible side effects
+- use internally always SMARTY_CACHING_LIFETIME_* constants
+
+01/01/2010
+- bugfix for obtaining plugins which must be included (related to change of 12/30/2009)
+- bugfix for {php} tag (trow an exception if allow_php_tag = false)
+
+12/31/2009
+- optimization of generated code for doublequoted strings containing variables
+- rewrite of {function} tag handling
+ - can now be declared in an external subtemplate
+ - can contain nocache sections (nocache_hash handling)
+ - can be called in noccache sections (nocache_hash handling)
+ - new {call..} tag to call template functions with a variable name {call name=$foo}
+- fixed nocache_hash handling in merged compiled templates
+
+12/30/2009
+- bugfix for plugins defined in the script as smarty_function_foo
+
+12/29/2009
+- use sha1() for filepath encoding
+- updates on nocache_hash handling
+- internal change on merging some data
+- fixed cache filename for custom resources
+
+12/28/2009
+- update for security fixes
+- make modifier plugins always trusted
+- fixed bug loading modifiers in child template at template inheritance
+
+12/27/2009
+--- this is a major update with a couple of internal changes ---
+- new config file lexer/parser (thanks to Thue Jnaus Kristensen)
+- template lexer/parser fixes for PHP and {literal} handing (thanks to Thue Jnaus Kristensen)
+- fix on registered plugins with different type but same name
+- rewrite of plugin handling (optimized execution speed)
+- closed a security hole regarding PHP code injection into cache files
+- fixed bug in clear cache handling
+- Renamed a couple of internal classes
+- code cleanup for merging compiled templates
+- couple of runtime optimizations (still not all done)
+- update of getCachedTimestamp()
+- fixed bug on modifier plugins at nocache output
+
+12/19/2009
+- bugfix on comment lines in config files
+
+12/17/2009
+- bugfix of parent/global variable update at included/merged subtemplates
+- encode final template filepath into filename of compiled and cached files
+- fixed {strip} handling in auto literals
+
+12/16/2009
+- update of changelog
+- added {include file='foo.tpl' inline} inline option to merge compiled code of subtemplate into the calling template
+
+12/14/2009
+- fixed sideefect of last modification (objects in array index did not work anymore)
+
+12/13/2009
+- allow boolean negation ("!") as operator on variables outside {if} tag
+
+12/12/2009
+- bugfix on single quotes inside {function} tag
+- fix short append/prepend attributes in {block} tags
+
+12/11/2009
+- bugfix on clear_compiled_tpl (avoid possible warning)
+
+12/10/2009
+- bugfix on {function} tags and template inheritance
+
+12/05/2009
+- fixed problem when a cached file was fetched several times
+- removed unneeded lexer code
+
+12/04/2009
+- added max attribute to for loop
+- added security mode allow_super_globals
+
+12/03/2009
+- template inheritance: child templates can now call functions defined by the {function} tag in the parent template
+- added {for $foo = 1 to 5 step 2} syntax
+- bugfix for {$foo.$x.$y.$z}
+
+12/01/2009
+- fixed parsing of names of special formated tags like if,elseif,while,for,foreach
+- removed direct access to constants in templates because of some syntax problems
+- removed cache resource plugin for mysql from the distribution
+- replaced most hard errors (exceptions) by softerrors(trigger_error) in plugins
+- use $template_class property for template class name when compiling {include},{eval} and {extends} tags
+
+11/30/2009
+- map 'true' to SMARTY_CACHING_LIFETIME_CURRENT for the $smarty->caching parameter
+- allow {function} tags within {block} tags
+
+11/28/2009
+- ignore compile_id at debug template
+- added direct access to constants in templates
+- some lexer/parser optimizations
+
+11/27/2009
+- added cache resource MYSQL plugin
+
+11/26/2009
+- bugfix on nested doublequoted strings
+- correct line number on unknown tag error message
+- changed {include} compiled code
+- fix on checking dynamic varibales with error_unassigned = true
+
+11/25/2009
+- allow the following writing for boolean: true, TRUE, True, false, FALSE, False
+- {strip} tag functionality rewritten
+
+11/24/2009
+- bugfix for $smarty->config_overwrite = false
+
+11/23/2009
+- suppress warnings on unlink caused by race conditions
+- correct line number on unknown tag error message
+
+------- beta 5
+11/23/2009
+- fixed configfile parser for text starting with a numeric char
+- the default_template_handler_func may now return a filepath to a template source
+
+11/20/2009
+- bugfix for empty config files
+- convert timestamps of registered resources to integer
+
+11/19/2009
+- compiled templates are no longer touched with the filemtime of template source
+
+11/18/2009
+- allow integer as attribute name in plugin calls
+
+------- beta 4
+11/18/2009
+- observe umask settings when setting file permissions
+- avoide unneeded cache file creation for subtemplates which did occur in some situations
+- make $smarty->_current_file available during compilation for Smarty2 BC
+
+11/17/2009
+- sanitize compile_id and cache_id (replace illegal chars with _)
+- use _dir_perms and _file_perms properties at file creation
+- new constant SMARTY_RESOURCE_DATE_FORMAT (default '%b %e, %Y') which is used as default format in modifier date_format
+- added {foreach $array as $key=>$value} syntax
+- renamed extend tag and resource to extends: {extends file='foo.tol'} , $smarty->display('extends:foo.tpl|bar.tpl);
+- bugfix cycle plugin
+
+11/15/2009
+- lexer/parser optimizations on quoted strings
+
+11/14/2009
+- bugfix on merging compiled templates when source files got removed or renamed.
+- bugfix modifiers on registered object tags
+- fixed locaion where outputfilters are running
+- fixed config file definitions at EOF
+- fix on merging compiled templates with nocache sections in nocache includes
+- parser could run into a PHP error on wrong file attribute
+
+11/12/2009
+- fixed variable filenames in {include_php} and {insert}
+- added scope to Smarty variables in the {block} tag compiler
+- fix on nocache code in child {block} tags
+
+11/11/2009
+- fixed {foreachelse}, {forelse}, {sectionelse} compiled code at nocache variables
+- removed checking for reserved variables
+- changed debugging handling
+
+11/10/2009
+- fixed preg_qoute on delimiters
+
+11/09/2009
+- lexer/parser bugfix
+- new SMARTY_SPL_AUTOLOAD constant to control the autoloader option
+- bugfix for {function} block tags in included templates
+
+11/08/2009
+- fixed alphanumeric array index
+- bugfix on complex double quoted strings
+
+11/05/2009
+- config_load method can now be called on data and template objects
+
+11/04/2009
+- added typecasting support for template variables
+- bugfix on complex indexed special Smarty variables
+
+11/03/2009
+- fixed parser error on objects with special smarty vars
+- fixed file dependency for {incude} inside {block} tag
+- fixed not compiling on non existing compiled templates when compile_check = false
+- renamed function names of autoloaded Smarty methods to Smarty_Method_....
+- new security_class property (default is Smarty_Security)
+
+11/02/2009
+- added neq,lte,gte,mod as aliases to if conditions
+- throw exception on illegal Smarty() constructor calls
+
+10/31/2009
+- change of filenames in sysplugins folder for internal spl_autoload function
+- lexer/parser changed for increased compilation speed
+
+10/27/2009
+- fixed missing quotes in include_php.php
+
+10/27/2009
+- fixed typo in method.register_resource
+- pass {} through as literal
+
+10/26/2009
+- merge only compiled subtemplates into the compiled code of the main template
+
+10/24/2009
+- fixed nocache vars at internal block tags
+- fixed merging of recursive includes
+
+10/23/2009
+- fixed nocache var problem
+
+10/22/2009
+- fix trimwhitespace outputfilter parameter
+
+10/21/2009
+- added {$foo++}{$foo--} syntax
+- buxfix changed PHP "if (..):" to "if (..){" because of possible bad code when concenating PHP tags
+- autoload Smarty internal classes
+- fixed file dependency for config files
+- some code optimizations
+- fixed function definitions on some autoloaded methods
+- fixed nocache variable inside if condition of {if} tag
+
+10/20/2009
+- check at compile time for variable filter to improve rendering speed if no filter is used
+- fixed bug at combination of {elseif} tag and {...} in double quoted strings of static class parameter
+
+10/19/2009
+- fixed compiled template merging on variable double quoted strings as name
+- fixed bug in caching mode 2 and cache_lifetime -1
+- fixed modifier support on block tags
+
+10/17/2009
+- remove ?>\n<?php and ?><?php sequences from compiled template
+
+10/15/2009
+- buxfix on assigning array elements inside templates
+- parser bugfix on array access
+
+10/15/2009
+- allow bit operator '&' inside {if} tag
+- implementation of ternary operator
+
+10/13/2009
+- do not recompile evaluated templates if reused just with other data
+- recompile config files when config properties did change
+- some lexer/parser otimizations
+
+10/11/2009
+- allow {block} tags inside included templates
+- bugfix for resource plugins in Smarty2 format
+- some optimizations of internal.template.php
+
+10/11/2009
+- fixed bug when template with same name is used with different data objects
+- fixed bug with double quoted name attribute at {insert} tag
+- reenabled assign_by_ref and append_by_ref methods
+
+10/07/2009
+- removed block nesting checks for {capture}
+
+10/05/2009
+- added support of "isinstance" to {if} tag
+
+10/03/2009
+- internal changes to improve performance
+- fix registering of filters for classes
+
+10/01/2009
+- removed default timezone setting
+- reactivated PHP resource for simple PHP templates. Must set allow_php_templates = true to enable
+- {PHP} tag can be enabled by allow_php_tag = true
+
+09/30/2009
+- fixed handling template_exits method for all resource types
+- bugfix for other cache resources than file
+- the methods assign_by_ref is now wrapped to assign, append_by_ref to append
+- allow arrays of variables pass in display, fetch and createTemplate calls
+ $data = array('foo'=>'bar','foo2'=>'blar');
+ $smarty->display('my.tpl',$data);
+
+09/29/2009
+- changed {php} tag handling
+- removed support of Smarty::instance()
+- removed support of PHP resource type
+- improved execution speed of {foreach} tags
+- fixed bug in {section} tag
+
+09/23/2009
+- improvements and bugfix on {include} tag handling
+NOTICE: existing compiled template and cache files must be deleted
+
+09/19/2009
+- replace internal "eval()" calls by "include" during rendering process
+- speed improvment for templates which have included subtemplates
+ the compiled code of included templates is merged into the compiled code of the parent template
+- added logical operator "xor" for {if} tag
+- changed parameter ordering for Smarty2 BC
+ fetch($template, $cache_id = null, $compile_id = null, $parent = null)
+ display($template, $cache_id = null, $compile_id = null, $parent = null)
+ createTemplate($template, $cache_id = null, $compile_id = null, $parent = null)
+- property resource_char_set is now replaced by constant SMARTY_RESOURCE_CHAR_SET
+- fixed handling of classes in registered blocks
+- speed improvement of lexer on text sections
+
+09/01/2009
+- dropped nl2br as plugin
+- added '<>' as comparission operator in {if} tags
+- cached caching_lifetime property to cache_liftime for backward compatibility with Smarty2.
+ {include} optional attribute is also now cache_lifetime
+- fixed trigger_error method (moved into Smarty class)
+- version is now Beta!!!
+
+
+08/30/2009
+- some speed optimizations on loading internal plugins
+
+
+08/29/2009
+- implemented caching of registered Resources
+- new property 'auto_literal'. if true(default) '{ ' and ' }' interpreted as literal, not as Smarty delimiter
+
+
+08/28/2009
+- Fix on line breaks inside {if} tags
+
+08/26/2009
+- implemented registered resources as in Smarty2. NOTE: caching does not work yet
+- new property 'force_cache'. if true it forces the creation of a new cache file
+- fixed modifiers on arrays
+- some speed optimization on loading internal classes
+
+
+08/24/2009
+- fixed typo in lexer definition for '!==' operator
+- bugfix - the ouput of plugins was not cached
+- added global variable SCRIPT_NAME
+
+08/21/2009
+- fixed problems whitespace in conjuction with custom delimiters
+- Smarty tags can now be used as value anywhere
+
+08/18/2009
+- definition of template class name moded in internal.templatebase.php
+- whitespace parser changes
+
+08/12/2009
+- fixed parser problems
+
+08/11/2009
+- fixed parser problems with custom delimiter
+
+08/10/2009
+- update of mb support in plugins
+
+
+08/09/2009
+- fixed problems with doublequoted strings at name attribute of {block} tag
+- bugfix at scope attribute of {append} tag
+
+08/08/2009
+- removed all internal calls of Smarty::instance()
+- fixed code in double quoted strings
+
+08/05/2009
+- bugfix mb_string support
+- bugfix of \n.\t etc in double quoted strings
+
+07/29/2009
+- added syntax for variable config vars like #$foo#
+
+07/28/2009
+- fixed parsing of $smarty.session vars containing objects
+
+07/22/2009
+- fix of "$" handling in double quoted strings
+
+07/21/2009
+- fix that {$smarty.current_dir} return correct value within {block} tags.
+
+07/20/2009
+- drop error message on unmatched {block} {/block} pairs
+
+07/01/2009
+- fixed smarty_function_html_options call in plugin function.html_select_date.php (missing ,)
+
+06/24/2009
+- fixed smarty_function_html_options call in plugin function.html_select_date.php
+
+06/22/2009
+- fix on \n and spaces inside smarty tags
+- removed request_use_auto_globals propert as it is no longer needed because Smarty 3 will always run under PHP 5
+
+
+06/18/2009
+- fixed compilation of block plugins when caching enabled
+- added $smarty.current_dir which returns the current working directory
+
+06/14/2009
+- fixed array access on super globals
+- allow smarty tags within xml tags
+
+06/13/2009
+- bugfix at extend resource: create unique files for compiled template and cache for each combination of template files
+- update extend resource to handle appen and prepend block attributes
+- instantiate classes of plugins instead of calling them static
+
+06/03/2009
+- fixed repeat at block plugins
+
+05/25/2009
+- fixed problem with caching of compiler plugins
+
+05/14/2009
+- fixed directory separator handling
+
+05/09/2009
+- syntax change for stream variables
+- fixed bug when using absolute template filepath and caching
+
+05/08/2009
+- fixed bug of {nocache} tag in included templates
+
+05/06/2009
+- allow that plugins_dir folder names can end without directory separator
+
+05/05/2009
+- fixed E_STRICT incompabilities
+- {function} tag bug fix
+- security policy definitions have been moved from plugins folder to file Security.class.php in libs folder
+- added allow_super_global configuration to security
+
+04/30/2009
+- functions defined with the {function} tag now always have global scope
+
+04/29/2009
+- fixed problem with directory setter methods
+- allow that cache_dir can end without directory separator
+
+04/28/2009
+- the {function} tag can no longer overwrite standard smarty tags
+- inherit functions defined by the {fuction} tag into subtemplates
+- added {while <statement>} sytax to while tag
+
+04/26/2009
+- added trusted stream checking to security
+- internal changes at file dependency check for caching
+
+04/24/2009
+- changed name of {template} tag to {function}
+- added new {template} tag
+
+04/23/2009
+- fixed access of special smarty variables from included template
+
+04/22/2009
+- unified template stream syntax with standard Smarty resource syntax $smarty->display('mystream:mytemplate')
+
+04/21/2009
+- change of new style syntax for forach. Now: {foreach $array as $var} like in PHP
+
+04/20/2009
+- fixed "$foo.bar ..." variable replacement in double quoted strings
+- fixed error in {include} tag with variable file attribute
+
+04/18/2009
+- added stream resources ($smarty->display('mystream://mytemplate'))
+- added stream variables {$mystream:myvar}
+
+04/14/2009
+- fixed compile_id handling on {include} tags
+- fixed append/prepend attributes in {block} tag
+- added {if 'expression' is in 'array'} syntax
+- use crc32 as hash for compiled config files.
+
+04/13/2009
+- fixed scope problem with parent variables when appending variables within templates.
+- fixed code for {block} without childs (possible sources for notice errors removed)
+
+04/12/2009
+- added append and prepend attribute to {block} tag
+
+04/11/2009
+- fixed variables in 'file' attribute of {extend} tag
+- fixed problems in modifiers (if mb string functions not present)
+
+04/10/2009
+- check if mb string functions available otherwise fallback to normal string functions
+- added global variable scope SMARTY_GLOBAL_SCOPE
+- enable 'variable' filter by default
+- fixed {$smarty.block.parent.foo}
+- implementation of a 'variable' filter as replacement for default modifier
+
+04/09/2009
+- fixed execution of filters defined by classes
+- compile the always the content of {block} tags to make shure that the filters are running over it
+- syntax corrections on variable object property
+- syntax corrections on array access in dot syntax
+
+04/08/2009
+- allow variable object property
+
+04/07/2009
+- changed variable scopes to SMARTY_LOCAL_SCOPE, SMARTY_PARENT_SCOPE, SMARTY_ROOT_SCOPE to avoid possible conflicts with user constants
+- Smarty variable global attribute replaced with scope attribute
+
+04/06/2009
+- variable scopes LOCAL_SCOPE, PARENT_SCOPE, ROOT_SCOPE
+- more getter/setter methods
+
+04/05/2009
+- replaced new array looping syntax {for $foo in $array} with {foreach $foo in $array} to avoid confusion
+- added append array for short form of assign {$foo[]='bar'} and allow assignments to nested arrays {$foo['bla']['blue']='bar'}
+
+04/04/2009
+- make output of template default handlers cachable and save compiled source
+- some fixes on yesterdays update
+
+04/03/2006
+- added registerDefaultTemplateHandler method and functionallity
+- added registerDefaultPluginHandler method and functionallity
+- added {append} tag to extend Smarty array variabled
+
+04/02/2009
+- added setter/getter methods
+- added $foo@first and $foo@last properties at {for} tag
+- added $set_timezone (true/false) property to setup optionally the default time zone
+
+03/31/2009
+- bugfix smarty.class and internal.security_handler
+- added compile_check configuration
+- added setter/getter methods
+
+03/30/2009
+- added all major setter/getter methods
+
+03/28/2009
+- {block} tags can be nested now
+- md5 hash function replace with crc32 for speed optimization
+- file order for exted resource inverted
+- clear_compiled_tpl and clear_cache_all will not touch .svn folder any longer
+
+03/27/2009
+- added extend resource
+
+03/26/2009
+- fixed parser not to create error on `word` in double quoted strings
+- allow PHP array(...)
+- implemented $smarty.block.name.parent to access parent block content
+- fixed smarty.class
+
+
+03/23/2009
+- fixed {foreachelse} and {forelse} tags
+
+03/22/2009
+- fixed possible sources for notice errors
+- rearrange SVN into distribution and development folders
+
+03/21/2009
+- fixed exceptions in function plugins
+- fixed notice error in Smarty.class.php
+- allow chained objects to span multiple lines
+- fixed error in modifers
+
+03/20/2009
+- moved /plugins folder into /libs folder
+- added noprint modifier
+- autoappend a directory separator if the xxxxx_dir definition have no trailing one
+
+03/19/2009
+- allow array definition as modifer parameter
+- changed modifier to use multi byte string funktions.
+
+03/17/2009
+- bugfix
+
+03/15/2009
+- added {include_php} tag for BC
+- removed @ error suppression
+- bugfix fetch did always repeat output of first call when calling same template several times
+- PHPunit tests extended
+
+03/13/2009
+- changed block syntax to be Smarty like {block:titel} -> {block name=titel}
+- compiling of {block} and {extend} tags rewriten for better performance
+- added special Smarty variable block ($smarty.block.foo} returns the parent definition of block foo
+- optimization of {block} tag compiled code.
+- fixed problem with escaped double quotes in double quoted strings
+
+03/12/2009
+- added support of template inheritance by {extend } and {block } tags.
+- bugfix comments within literals
+- added scope attribuie to {include} tag
+
+03/10/2009
+- couple of bugfixes and improvements
+- PHPunit tests extended
+
+03/09/2009
+- added support for global template vars. {assign_global...} $smarty->assign_global(...)
+- added direct_access_security
+- PHPunit tests extended
+- added missing {if} tag conditions like "is div by" etc.
+
+03/08/2009
+- splitted up the Compiler class to make it easier to use a coustom compiler
+- made default plugins_dir relative to Smarty root and not current working directory
+- some changes to make the lexer parser better configurable
+- implemented {section} tag for Smarty2 BC
+
+03/07/2009
+- fixed problem with comment tags
+- fixed problem with #xxxx in double quoted string
+- new {while} tag implemented
+- made lexer and paser class configurable as $smarty property
+- Smarty method get_template_vars implemented
+- Smarty method get_registered_object implemented
+- Smarty method trigger_error implemented
+- PHPunit tests extended
+
+03/06/2009
+- final changes on config variable handling
+- parser change - unquoted strings will by be converted into single quoted strings
+- PHPunit tests extended
+- some code cleanup
+- fixed problem on catenate strings with expression
+- update of count_words modifier
+- bugfix on comment tags
+
+
+03/05/2009
+- bugfix on <?xml...> tag with caching enabled
+- changes on exception handling (by Monte)
+
+03/04/2009
+- added support for config variables
+- bugfix on <?xml...> tag
+
+03/02/2009
+- fixed unqouted strings within modifier parameter
+- bugfix parsing of mofifier parameter
+
+03/01/2009
+- modifier chaining works now as in Smarty2
+
+02/28/2009
+- changed handling of unqouted strings
+
+02/26/2009
+- bugfix
+- changed $smarty.capture.foo to be global for Smarty2 BC.
+
+02/24/2009
+- bugfix {php} {/php} tags for backward compatibility
+- bugfix for expressions on arrays
+- fixed usage of "null" value
+- added $smarty.foreach.foo.first and $smarty.foreach.foo.last
+
+02/06/2009
+- bugfix for request variables without index for example $smarty.get
+- experimental solution for variable functions in static class
+
+02/05/2009
+- update of popup plugin
+- added config variables to template parser (load config functions still missing)
+- parser bugfix for empty quoted strings
+
+02/03/2009
+- allow array of objects as static class variabales.
+- use htmlentities at source output at template errors.
+
+02/02/2009
+- changed search order on modifiers to look at plugins folder first
+- parser bug fix for modifier on array elements $foo.bar|modifier
+- parser bug fix on single quoted srings
+- internal: splitted up compiler plugin files
+
+02/01/2009
+- allow method chaining on static classes
+- special Smarty variables $smarty.... implemented
+- added {PHP} {/PHP} tags for backward compatibility
+
+01/31/2009
+- added {math} plugin for Smarty2 BC
+- added template_exists method
+- changed Smarty3 method enable_security() to enableSecurity() to follow camelCase standards
+
+01/30/2009
+- bugfix in single quoted strings
+- changed syntax for variable property access from $foo:property to $foo@property because of ambiguous syntax at modifiers
+
+01/29/2009
+- syntax for array definition changed from (1,2,3) to [1,2,3] to remove ambiguous syntax
+- allow {for $foo in [1,2,3]} syntax
+- bugfix in double quoted strings
+- allow <?xml...?> tags in template even if short_tags are enabled
+
+01/28/2009
+- fixed '!==' if condition.
+
+01/28/2009
+- added support of {strip} {/strip} tag.
+
+01/27/2009
+- bug fix on backticks in double quoted strings at objects
+
+01/25/2009
+- Smarty2 modfiers added to SVN
+
+01/25/2009
+- bugfix allow arrays at object properties in Smarty syntax
+- the template object is now passed as additional parameter at plugin calls
+- clear_compiled_tpl method completed
+
+01/20/2009
+- access to class constants implemented ( class::CONSTANT )
+- access to static class variables implemented ( class::$variable )
+- call of static class methods implemented ( class::method() )
+
+01/16/2009
+- reallow leading _ in variable names {$_var}
+- allow array of objects {$array.index->method()} syntax
+- finished work on clear_cache and clear_cache_all methods
+
+01/11/2009
+- added support of {literal} tag
+- added support of {ldelim} and {rdelim} tags
+- make code compatible to run with E_STRICT error setting
+
+01/08/2009
+- moved clear_assign and clear_all_assign to internal.templatebase.php
+- added assign_by_ref, append and append_by_ref methods
+
+01/02/2009
+- added load_filter method
+- fished work on filter handling
+- optimization of plugin loading
+
+12/30/2008
+- added compiler support of registered object
+- added backtick support in doubled quoted strings for backward compatibility
+- some minor bug fixes and improvments
+
+12/23/2008
+- fixed problem of not working "not" operator in if-expressions
+- added handling of compiler function plugins
+- finished work on (un)register_compiler_function method
+- finished work on (un)register_modifier method
+- plugin handling from plugins folder changed for modifier plugins
+ deleted - internal.modifier.php
+- added modifier chaining to parser
+
+12/17/2008
+- finished (un)register_function method
+- finished (un)register_block method
+- added security checking for PHP functions in PHP templates
+- plugin handling from plugins folder rewritten
+ new - internal.plugin_handler.php
+ deleted - internal.block.php
+ deleted - internal.function.php
+- removed plugin checking from security handler
+
+12/16/2008
+
+- new start of this change_log file
diff --git a/include/smarty/libs/Config_File.class.php b/include/smarty/libs/Config_File.class.php
deleted file mode 100644
index 5787ad15f..000000000
--- a/include/smarty/libs/Config_File.class.php
+++ /dev/null
@@ -1,393 +0,0 @@
-<?php
-
-/**
- * Config_File class.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * For questions, help, comments, discussion, etc., please join the
- * Smarty mailing list. Send a blank e-mail to
- * smarty-discussion-subscribe@googlegroups.com
- *
- * @link http://www.smarty.net/
- * @version 2.6.26
- * @copyright Copyright: 2001-2005 New Digital Group, Inc.
- * @author Andrei Zmievski <andrei@php.net>
- * @access public
- * @package Smarty
- */
-
-/* $Id: Config_File.class.php 3149 2009-05-23 20:59:25Z monte.ohrt $ */
-
-/**
- * Config file reading class
- * @package Smarty
- */
-class Config_File {
- /**#@+
- * Options
- * @var boolean
- */
- /**
- * Controls whether variables with the same name overwrite each other.
- */
- var $overwrite = true;
-
- /**
- * Controls whether config values of on/true/yes and off/false/no get
- * converted to boolean values automatically.
- */
- var $booleanize = true;
-
- /**
- * Controls whether hidden config sections/vars are read from the file.
- */
- var $read_hidden = true;
-
- /**
- * Controls whether or not to fix mac or dos formatted newlines.
- * If set to true, \r or \r\n will be changed to \n.
- */
- var $fix_newlines = true;
- /**#@-*/
-
- /** @access private */
- var $_config_path = "";
- var $_config_data = array();
- /**#@-*/
-
- /**
- * Constructs a new config file class.
- *
- * @param string $config_path (optional) path to the config files
- */
- function Config_File($config_path = NULL)
- {
- if (isset($config_path))
- $this->set_path($config_path);
- }
-
-
- /**
- * Set the path where configuration files can be found.
- *
- * @param string $config_path path to the config files
- */
- function set_path($config_path)
- {
- if (!empty($config_path)) {
- if (!is_string($config_path) || !file_exists($config_path) || !is_dir($config_path)) {
- $this->_trigger_error_msg("Bad config file path '$config_path'");
- return;
- }
- if(substr($config_path, -1) != DIRECTORY_SEPARATOR) {
- $config_path .= DIRECTORY_SEPARATOR;
- }
-
- $this->_config_path = $config_path;
- }
- }
-
-
- /**
- * Retrieves config info based on the file, section, and variable name.
- *
- * @param string $file_name config file to get info for
- * @param string $section_name (optional) section to get info for
- * @param string $var_name (optional) variable to get info for
- * @return string|array a value or array of values
- */
- function get($file_name, $section_name = NULL, $var_name = NULL)
- {
- if (empty($file_name)) {
- $this->_trigger_error_msg('Empty config file name');
- return;
- } else {
- $file_name = $this->_config_path . $file_name;
- if (!isset($this->_config_data[$file_name]))
- $this->load_file($file_name, false);
- }
-
- if (!empty($var_name)) {
- if (empty($section_name)) {
- return $this->_config_data[$file_name]["vars"][$var_name];
- } else {
- if(isset($this->_config_data[$file_name]["sections"][$section_name]["vars"][$var_name]))
- return $this->_config_data[$file_name]["sections"][$section_name]["vars"][$var_name];
- else
- return array();
- }
- } else {
- if (empty($section_name)) {
- return (array)$this->_config_data[$file_name]["vars"];
- } else {
- if(isset($this->_config_data[$file_name]["sections"][$section_name]["vars"]))
- return (array)$this->_config_data[$file_name]["sections"][$section_name]["vars"];
- else
- return array();
- }
- }
- }
-
-
- /**
- * Retrieves config info based on the key.
- *
- * @param $file_name string config key (filename/section/var)
- * @return string|array same as get()
- * @uses get() retrieves information from config file and returns it
- */
- function &get_key($config_key)
- {
- list($file_name, $section_name, $var_name) = explode('/', $config_key, 3);
- $result = &$this->get($file_name, $section_name, $var_name);
- return $result;
- }
-
- /**
- * Get all loaded config file names.
- *
- * @return array an array of loaded config file names
- */
- function get_file_names()
- {
- return array_keys($this->_config_data);
- }
-
-
- /**
- * Get all section names from a loaded file.
- *
- * @param string $file_name config file to get section names from
- * @return array an array of section names from the specified file
- */
- function get_section_names($file_name)
- {
- $file_name = $this->_config_path . $file_name;
- if (!isset($this->_config_data[$file_name])) {
- $this->_trigger_error_msg("Unknown config file '$file_name'");
- return;
- }
-
- return array_keys($this->_config_data[$file_name]["sections"]);
- }
-
-
- /**
- * Get all global or section variable names.
- *
- * @param string $file_name config file to get info for
- * @param string $section_name (optional) section to get info for
- * @return array an array of variables names from the specified file/section
- */
- function get_var_names($file_name, $section = NULL)
- {
- if (empty($file_name)) {
- $this->_trigger_error_msg('Empty config file name');
- return;
- } else if (!isset($this->_config_data[$file_name])) {
- $this->_trigger_error_msg("Unknown config file '$file_name'");
- return;
- }
-
- if (empty($section))
- return array_keys($this->_config_data[$file_name]["vars"]);
- else
- return array_keys($this->_config_data[$file_name]["sections"][$section]["vars"]);
- }
-
-
- /**
- * Clear loaded config data for a certain file or all files.
- *
- * @param string $file_name file to clear config data for
- */
- function clear($file_name = NULL)
- {
- if ($file_name === NULL)
- $this->_config_data = array();
- else if (isset($this->_config_data[$file_name]))
- $this->_config_data[$file_name] = array();
- }
-
-
- /**
- * Load a configuration file manually.
- *
- * @param string $file_name file name to load
- * @param boolean $prepend_path whether current config path should be
- * prepended to the filename
- */
- function load_file($file_name, $prepend_path = true)
- {
- if ($prepend_path && $this->_config_path != "")
- $config_file = $this->_config_path . $file_name;
- else
- $config_file = $file_name;
-
- ini_set('track_errors', true);
- $fp = @fopen($config_file, "r");
- if (!is_resource($fp)) {
- $this->_trigger_error_msg("Could not open config file '$config_file'");
- return false;
- }
-
- $contents = ($size = filesize($config_file)) ? fread($fp, $size) : '';
- fclose($fp);
-
- $this->_config_data[$config_file] = $this->parse_contents($contents);
- return true;
- }
-
- /**
- * Store the contents of a file manually.
- *
- * @param string $config_file file name of the related contents
- * @param string $contents the file-contents to parse
- */
- function set_file_contents($config_file, $contents)
- {
- $this->_config_data[$config_file] = $this->parse_contents($contents);
- return true;
- }
-
- /**
- * parse the source of a configuration file manually.
- *
- * @param string $contents the file-contents to parse
- */
- function parse_contents($contents)
- {
- if($this->fix_newlines) {
- // fix mac/dos formatted newlines
- $contents = preg_replace('!\r\n?!', "\n", $contents);
- }
-
- $config_data = array();
- $config_data['sections'] = array();
- $config_data['vars'] = array();
-
- /* reference to fill with data */
- $vars =& $config_data['vars'];
-
- /* parse file line by line */
- preg_match_all('!^.*\r?\n?!m', $contents, $match);
- $lines = $match[0];
- for ($i=0, $count=count($lines); $i<$count; $i++) {
- $line = $lines[$i];
- if (empty($line)) continue;
-
- if ( substr($line, 0, 1) == '[' && preg_match('!^\[(.*?)\]!', $line, $match) ) {
- /* section found */
- if (substr($match[1], 0, 1) == '.') {
- /* hidden section */
- if ($this->read_hidden) {
- $section_name = substr($match[1], 1);
- } else {
- /* break reference to $vars to ignore hidden section */
- unset($vars);
- $vars = array();
- continue;
- }
- } else {
- $section_name = $match[1];
- }
- if (!isset($config_data['sections'][$section_name]))
- $config_data['sections'][$section_name] = array('vars' => array());
- $vars =& $config_data['sections'][$section_name]['vars'];
- continue;
- }
-
- if (preg_match('/^\s*(\.?\w+)\s*=\s*(.*)/s', $line, $match)) {
- /* variable found */
- $var_name = rtrim($match[1]);
- if (strpos($match[2], '"""') === 0) {
- /* handle multiline-value */
- $lines[$i] = substr($match[2], 3);
- $var_value = '';
- while ($i<$count) {
- if (($pos = strpos($lines[$i], '"""')) === false) {
- $var_value .= $lines[$i++];
- } else {
- /* end of multiline-value */
- $var_value .= substr($lines[$i], 0, $pos);
- break;
- }
- }
- $booleanize = false;
-
- } else {
- /* handle simple value */
- $var_value = preg_replace('/^([\'"])(.*)\1$/', '\2', rtrim($match[2]));
- $booleanize = $this->booleanize;
-
- }
- $this->_set_config_var($vars, $var_name, $var_value, $booleanize);
- }
- /* else unparsable line / means it is a comment / means ignore it */
- }
- return $config_data;
- }
-
- /**#@+ @access private */
- /**
- * @param array &$container
- * @param string $var_name
- * @param mixed $var_value
- * @param boolean $booleanize determines whether $var_value is converted to
- * to true/false
- */
- function _set_config_var(&$container, $var_name, $var_value, $booleanize)
- {
- if (substr($var_name, 0, 1) == '.') {
- if (!$this->read_hidden)
- return;
- else
- $var_name = substr($var_name, 1);
- }
-
- if (!preg_match("/^[a-zA-Z_]\w*$/", $var_name)) {
- $this->_trigger_error_msg("Bad variable name '$var_name'");
- return;
- }
-
- if ($booleanize) {
- if (preg_match("/^(on|true|yes)$/i", $var_value))
- $var_value = true;
- else if (preg_match("/^(off|false|no)$/i", $var_value))
- $var_value = false;
- }
-
- if (!isset($container[$var_name]) || $this->overwrite)
- $container[$var_name] = $var_value;
- else {
- settype($container[$var_name], 'array');
- $container[$var_name][] = $var_value;
- }
- }
-
- /**
- * @uses trigger_error() creates a PHP warning/error
- * @param string $error_msg
- * @param integer $error_type one of
- */
- function _trigger_error_msg($error_msg, $error_type = E_USER_WARNING)
- {
- trigger_error("Config_File error: $error_msg", $error_type);
- }
- /**#@-*/
-}
-
-?>
diff --git a/include/smarty/libs/Smarty.class.php b/include/smarty/libs/Smarty.class.php
index 2aaecbd93..40532fc2a 100644
--- a/include/smarty/libs/Smarty.class.php
+++ b/include/smarty/libs/Smarty.class.php
@@ -1,8 +1,8 @@
<?php
-
/**
* Project: Smarty: the PHP compiling template engine
* File: Smarty.class.php
+ * SVN: $Id: Smarty.class.php 4694 2013-01-13 21:13:14Z uwe.tews@googlemail.com $
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -23,1944 +23,1506 @@
* smarty-discussion-subscribe@googlegroups.com
*
* @link http://www.smarty.net/
- * @copyright 2001-2005 New Digital Group, Inc.
+ * @copyright 2008 New Digital Group, Inc.
* @author Monte Ohrt <monte at ohrt dot com>
- * @author Andrei Zmievski <andrei@php.net>
+ * @author Uwe Tews
+ * @author Rodney Rehm
* @package Smarty
- * @version 2.6.26
+ * @version 3.1.13
*/
-/* $Id: Smarty.class.php 3163 2009-06-17 14:39:24Z monte.ohrt $ */
-
/**
- * DIR_SEP isn't used anymore, but third party apps might
+ * define shorthand directory separator constant
*/
-if(!defined('DIR_SEP')) {
- define('DIR_SEP', DIRECTORY_SEPARATOR);
+if (!defined('DS')) {
+ define('DS', DIRECTORY_SEPARATOR);
}
/**
* set SMARTY_DIR to absolute path to Smarty library files.
- * if not defined, include_path will be used. Sets SMARTY_DIR only if user
- * application has not already defined it.
+ * Sets SMARTY_DIR only if user application has not already defined it.
*/
-
if (!defined('SMARTY_DIR')) {
- define('SMARTY_DIR', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+ define('SMARTY_DIR', dirname(__FILE__) . DS);
+}
+
+/**
+ * set SMARTY_SYSPLUGINS_DIR to absolute path to Smarty internal plugins.
+ * Sets SMARTY_SYSPLUGINS_DIR only if user application has not already defined it.
+ */
+if (!defined('SMARTY_SYSPLUGINS_DIR')) {
+ define('SMARTY_SYSPLUGINS_DIR', SMARTY_DIR . 'sysplugins' . DS);
+}
+if (!defined('SMARTY_PLUGINS_DIR')) {
+ define('SMARTY_PLUGINS_DIR', SMARTY_DIR . 'plugins' . DS);
+}
+if (!defined('SMARTY_MBSTRING')) {
+ define('SMARTY_MBSTRING', function_exists('mb_split'));
+}
+if (!defined('SMARTY_RESOURCE_CHAR_SET')) {
+ // UTF-8 can only be done properly when mbstring is available!
+ /**
+ * @deprecated in favor of Smarty::$_CHARSET
+ */
+ define('SMARTY_RESOURCE_CHAR_SET', SMARTY_MBSTRING ? 'UTF-8' : 'ISO-8859-1');
+}
+if (!defined('SMARTY_RESOURCE_DATE_FORMAT')) {
+ /**
+ * @deprecated in favor of Smarty::$_DATE_FORMAT
+ */
+ define('SMARTY_RESOURCE_DATE_FORMAT', '%b %e, %Y');
}
-if (!defined('SMARTY_CORE_DIR')) {
- define('SMARTY_CORE_DIR', SMARTY_DIR . 'internals' . DIRECTORY_SEPARATOR);
+/**
+ * register the class autoloader
+ */
+if (!defined('SMARTY_SPL_AUTOLOAD')) {
+ define('SMARTY_SPL_AUTOLOAD', 0);
+}
+
+if (SMARTY_SPL_AUTOLOAD && set_include_path(get_include_path() . PATH_SEPARATOR . SMARTY_SYSPLUGINS_DIR) !== false) {
+ $registeredAutoLoadFunctions = spl_autoload_functions();
+ if (!isset($registeredAutoLoadFunctions['spl_autoload'])) {
+ spl_autoload_register();
+ }
+} else {
+ spl_autoload_register('smartyAutoload');
}
-define('SMARTY_PHP_PASSTHRU', 0);
-define('SMARTY_PHP_QUOTE', 1);
-define('SMARTY_PHP_REMOVE', 2);
-define('SMARTY_PHP_ALLOW', 3);
+/**
+ * Load always needed external class files
+ */
+include_once SMARTY_SYSPLUGINS_DIR.'smarty_internal_data.php';
+include_once SMARTY_SYSPLUGINS_DIR.'smarty_internal_templatebase.php';
+include_once SMARTY_SYSPLUGINS_DIR.'smarty_internal_template.php';
+include_once SMARTY_SYSPLUGINS_DIR.'smarty_resource.php';
+include_once SMARTY_SYSPLUGINS_DIR.'smarty_internal_resource_file.php';
+include_once SMARTY_SYSPLUGINS_DIR.'smarty_cacheresource.php';
+include_once SMARTY_SYSPLUGINS_DIR.'smarty_internal_cacheresource_file.php';
/**
+ * This is the main Smarty class
* @package Smarty
*/
-class Smarty
-{
+class Smarty extends Smarty_Internal_TemplateBase {
+
/**#@+
- * Smarty Configuration Section
+ * constant definitions
*/
/**
- * The name of the directory where templates are located.
- *
- * @var string
+ * smarty version
*/
- var $template_dir = 'templates';
+ const SMARTY_VERSION = 'Smarty-3.1.13';
/**
- * The directory where compiled templates are located.
- *
- * @var string
+ * define variable scopes
*/
- var $compile_dir = 'templates_c';
-
+ const SCOPE_LOCAL = 0;
+ const SCOPE_PARENT = 1;
+ const SCOPE_ROOT = 2;
+ const SCOPE_GLOBAL = 3;
/**
- * The directory where config files are located.
- *
- * @var string
+ * define caching modes
+ */
+ const CACHING_OFF = 0;
+ const CACHING_LIFETIME_CURRENT = 1;
+ const CACHING_LIFETIME_SAVED = 2;
+ /**
+ * define compile check modes
+ */
+ const COMPILECHECK_OFF = 0;
+ const COMPILECHECK_ON = 1;
+ const COMPILECHECK_CACHEMISS = 2;
+ /**
+ * modes for handling of "<?php ... ?>" tags in templates.
*/
- var $config_dir = 'configs';
+ const PHP_PASSTHRU = 0; //-> print tags as plain text
+ const PHP_QUOTE = 1; //-> escape tags as entities
+ const PHP_REMOVE = 2; //-> escape tags as entities
+ const PHP_ALLOW = 3; //-> escape tags as entities
+ /**
+ * filter types
+ */
+ const FILTER_POST = 'post';
+ const FILTER_PRE = 'pre';
+ const FILTER_OUTPUT = 'output';
+ const FILTER_VARIABLE = 'variable';
+ /**
+ * plugin types
+ */
+ const PLUGIN_FUNCTION = 'function';
+ const PLUGIN_BLOCK = 'block';
+ const PLUGIN_COMPILER = 'compiler';
+ const PLUGIN_MODIFIER = 'modifier';
+ const PLUGIN_MODIFIERCOMPILER = 'modifiercompiler';
+
+ /**#@-*/
/**
- * An array of directories searched for plugins.
- *
- * @var array
+ * assigned global tpl vars
*/
- var $plugins_dir = array('plugins');
+ public static $global_tpl_vars = array();
/**
- * If debugging is enabled, a debug console window will display
- * when the page loads (make sure your browser allows unrequested
- * popup windows)
- *
- * @var boolean
+ * error handler returned by set_error_hanlder() in Smarty::muteExpectedErrors()
+ */
+ public static $_previous_error_handler = null;
+ /**
+ * contains directories outside of SMARTY_DIR that are to be muted by muteExpectedErrors()
+ */
+ public static $_muted_directories = array();
+ /**
+ * Flag denoting if Multibyte String functions are available
+ */
+ public static $_MBSTRING = SMARTY_MBSTRING;
+ /**
+ * The character set to adhere to (e.g. "UTF-8")
+ */
+ public static $_CHARSET = SMARTY_RESOURCE_CHAR_SET;
+ /**
+ * The date format to be used internally
+ * (accepts date() and strftime())
+ */
+ public static $_DATE_FORMAT = SMARTY_RESOURCE_DATE_FORMAT;
+ /**
+ * Flag denoting if PCRE should run in UTF-8 mode
*/
- var $debugging = false;
+ public static $_UTF8_MODIFIER = 'u';
/**
- * When set, smarty does uses this value as error_reporting-level.
- *
- * @var integer
+ * Flag denoting if operating system is windows
+ */
+ public static $_IS_WINDOWS = false;
+
+ /**#@+
+ * variables
*/
- var $error_reporting = null;
/**
- * This is the path to the debug console template. If not set,
- * the default one will be used.
- *
+ * auto literal on delimiters with whitspace
+ * @var boolean
+ */
+ public $auto_literal = true;
+ /**
+ * display error on not assigned variables
+ * @var boolean
+ */
+ public $error_unassigned = false;
+ /**
+ * look up relative filepaths in include_path
+ * @var boolean
+ */
+ public $use_include_path = false;
+ /**
+ * template directory
+ * @var array
+ */
+ private $template_dir = array();
+ /**
+ * joined template directory string used in cache keys
* @var string
*/
- var $debug_tpl = '';
-
+ public $joined_template_dir = null;
/**
- * This determines if debugging is enable-able from the browser.
- * <ul>
- * <li>NONE => no debugging control allowed</li>
- * <li>URL => enable debugging when SMARTY_DEBUG is found in the URL.</li>
- * </ul>
- * @link http://www.foo.dom/index.php?SMARTY_DEBUG
+ * joined config directory string used in cache keys
* @var string
*/
- var $debugging_ctrl = 'NONE';
-
+ public $joined_config_dir = null;
/**
- * This tells Smarty whether to check for recompiling or not. Recompiling
- * does not need to happen unless a template or config file is changed.
- * Typically you enable this during development, and disable for
- * production.
- *
+ * default template handler
+ * @var callable
+ */
+ public $default_template_handler_func = null;
+ /**
+ * default config handler
+ * @var callable
+ */
+ public $default_config_handler_func = null;
+ /**
+ * default plugin handler
+ * @var callable
+ */
+ public $default_plugin_handler_func = null;
+ /**
+ * compile directory
+ * @var string
+ */
+ private $compile_dir = null;
+ /**
+ * plugins directory
+ * @var array
+ */
+ private $plugins_dir = array();
+ /**
+ * cache directory
+ * @var string
+ */
+ private $cache_dir = null;
+ /**
+ * config directory
+ * @var array
+ */
+ private $config_dir = array();
+ /**
+ * force template compiling?
* @var boolean
*/
- var $compile_check = true;
-
+ public $force_compile = false;
/**
- * This forces templates to compile every time. Useful for development
- * or debugging.
- *
+ * check template for modifications?
* @var boolean
*/
- var $force_compile = false;
-
+ public $compile_check = true;
/**
- * This enables template caching.
- * <ul>
- * <li>0 = no caching</li>
- * <li>1 = use class cache_lifetime value</li>
- * <li>2 = use cache_lifetime in cache file</li>
- * </ul>
- * @var integer
+ * use sub dirs for compiled/cached files?
+ * @var boolean
*/
- var $caching = 0;
-
+ public $use_sub_dirs = false;
/**
- * The name of the directory for cache files.
- *
- * @var string
+ * allow ambiguous resources (that are made unique by the resource handler)
+ * @var boolean
*/
- var $cache_dir = 'cache';
-
+ public $allow_ambiguous_resources = false;
/**
- * This is the number of seconds cached content will persist.
- * <ul>
- * <li>0 = always regenerate cache</li>
- * <li>-1 = never expires</li>
- * </ul>
- *
- * @var integer
+ * caching enabled
+ * @var boolean
*/
- var $cache_lifetime = 3600;
-
+ public $caching = false;
/**
- * Only used when $caching is enabled. If true, then If-Modified-Since headers
- * are respected with cached content, and appropriate HTTP headers are sent.
- * This way repeated hits to a cached page do not send the entire page to the
- * client every time.
- *
+ * merge compiled includes
* @var boolean
*/
- var $cache_modified_check = false;
-
+ public $merge_compiled_includes = false;
/**
- * This determines how Smarty handles "<?php ... ?>" tags in templates.
- * possible values:
- * <ul>
- * <li>SMARTY_PHP_PASSTHRU -> print tags as plain text</li>
- * <li>SMARTY_PHP_QUOTE -> escape tags as entities</li>
- * <li>SMARTY_PHP_REMOVE -> remove php tags</li>
- * <li>SMARTY_PHP_ALLOW -> execute php tags</li>
- * </ul>
- *
+ * cache lifetime in seconds
* @var integer
*/
- var $php_handling = SMARTY_PHP_PASSTHRU;
-
+ public $cache_lifetime = 3600;
/**
- * This enables template security. When enabled, many things are restricted
- * in the templates that normally would go unchecked. This is useful when
- * untrusted parties are editing templates and you want a reasonable level
- * of security. (no direct execution of PHP in templates for example)
- *
+ * force cache file creation
* @var boolean
*/
- var $security = false;
-
+ public $force_cache = false;
/**
- * This is the list of template directories that are considered secure. This
- * is used only if {@link $security} is enabled. One directory per array
- * element. {@link $template_dir} is in this list implicitly.
+ * Set this if you want different sets of cache files for the same
+ * templates.
*
- * @var array
+ * @var string
*/
- var $secure_dir = array();
-
+ public $cache_id = null;
/**
- * These are the security settings for Smarty. They are used only when
- * {@link $security} is enabled.
+ * Set this if you want different sets of compiled files for the same
+ * templates.
*
- * @var array
+ * @var string
*/
- var $security_settings = array(
- 'PHP_HANDLING' => false,
- 'IF_FUNCS' => array('array', 'list',
- 'isset', 'empty',
- 'count', 'sizeof',
- 'in_array', 'is_array',
- 'true', 'false', 'null'),
- 'INCLUDE_ANY' => false,
- 'PHP_TAGS' => false,
- 'MODIFIER_FUNCS' => array('count'),
- 'ALLOW_CONSTANTS' => false,
- 'ALLOW_SUPER_GLOBALS' => true
- );
-
- /**
- * This is an array of directories where trusted php scripts reside.
- * {@link $security} is disabled during their inclusion/execution.
- *
- * @var array
+ public $compile_id = null;
+ /**
+ * template left-delimiter
+ * @var string
*/
- var $trusted_dir = array();
-
+ public $left_delimiter = "{";
/**
- * The left delimiter used for the template tags.
- *
+ * template right-delimiter
* @var string
*/
- var $left_delimiter = '{';
-
+ public $right_delimiter = "}";
+ /**#@+
+ * security
+ */
/**
- * The right delimiter used for the template tags.
+ * class name
+ *
+ * This should be instance of Smarty_Security.
*
* @var string
+ * @see Smarty_Security
*/
- var $right_delimiter = '}';
-
+ public $security_class = 'Smarty_Security';
/**
- * The order in which request variables are registered, similar to
- * variables_order in php.ini E = Environment, G = GET, P = POST,
- * C = Cookies, S = Server
+ * implementation of security class
*
- * @var string
+ * @var Smarty_Security
*/
- var $request_vars_order = 'EGPCS';
-
+ public $security_policy = null;
/**
- * Indicates wether $HTTP_*_VARS[] (request_use_auto_globals=false)
- * are uses as request-vars or $_*[]-vars. note: if
- * request_use_auto_globals is true, then $request_vars_order has
- * no effect, but the php-ini-value "gpc_order"
+ * controls handling of PHP-blocks
*
- * @var boolean
+ * @var integer
*/
- var $request_use_auto_globals = true;
-
+ public $php_handling = self::PHP_PASSTHRU;
/**
- * Set this if you want different sets of compiled files for the same
- * templates. This is useful for things like different languages.
- * Instead of creating separate sets of templates per language, you
- * set different compile_ids like 'en' and 'de'.
+ * controls if the php template file resource is allowed
*
- * @var string
+ * @var bool
*/
- var $compile_id = null;
-
+ public $allow_php_templates = false;
/**
- * This tells Smarty whether or not to use sub dirs in the cache/ and
- * templates_c/ directories. sub directories better organized, but
- * may not work well with PHP safe mode enabled.
+ * Should compiled-templates be prevented from being called directly?
*
- * @var boolean
+ * {@internal
+ * Currently used by Smarty_Internal_Template only.
+ * }}
*
+ * @var boolean
*/
- var $use_sub_dirs = false;
-
+ public $direct_access_security = true;
+ /**#@-*/
/**
- * This is a list of the modifiers to apply to all template variables.
- * Put each modifier in a separate array element in the order you want
- * them applied. example: <code>array('escape:"htmlall"');</code>
+ * debug mode
*
- * @var array
+ * Setting this to true enables the debug-console.
+ *
+ * @var boolean
*/
- var $default_modifiers = array();
-
+ public $debugging = false;
/**
- * This is the resource type to be used when not specified
- * at the beginning of the resource path. examples:
- * $smarty->display('file:index.tpl');
- * $smarty->display('db:index.tpl');
- * $smarty->display('index.tpl'); // will use default resource type
- * {include file="file:index.tpl"}
- * {include file="db:index.tpl"}
- * {include file="index.tpl"} {* will use default resource type *}
- *
- * @var array
+ * This determines if debugging is enable-able from the browser.
+ * <ul>
+ * <li>NONE => no debugging control allowed</li>
+ * <li>URL => enable debugging when SMARTY_DEBUG is found in the URL.</li>
+ * </ul>
+ * @var string
*/
- var $default_resource_type = 'file';
-
+ public $debugging_ctrl = 'NONE';
/**
- * The function used for cache file handling. If not set, built-in caching is used.
+ * Name of debugging URL-param.
*
- * @var null|string function name
+ * Only used when $debugging_ctrl is set to 'URL'.
+ * The name of the URL-parameter that activates debugging.
+ *
+ * @var type
*/
- var $cache_handler_func = null;
-
+ public $smarty_debug_id = 'SMARTY_DEBUG';
/**
- * This indicates which filters are automatically loaded into Smarty.
- *
- * @var array array of filter names
+ * Path of debug template.
+ * @var string
+ */
+ public $debug_tpl = null;
+ /**
+ * When set, smarty uses this value as error_reporting-level.
+ * @var int
*/
- var $autoload_filters = array();
+ public $error_reporting = null;
+ /**
+ * Internal flag for getTags()
+ * @var boolean
+ */
+ public $get_used_tags = false;
/**#@+
+ * config var settings
+ */
+
+ /**
+ * Controls whether variables with the same name overwrite each other.
* @var boolean
*/
+ public $config_overwrite = true;
/**
- * This tells if config file vars of the same name overwrite each other or not.
- * if disabled, same name variables are accumulated in an array.
+ * Controls whether config values of on/true/yes and off/false/no get converted to boolean.
+ * @var boolean
*/
- var $config_overwrite = true;
-
+ public $config_booleanize = true;
/**
- * This tells whether or not to automatically booleanize config file variables.
- * If enabled, then the strings "on", "true", and "yes" are treated as boolean
- * true, and "off", "false" and "no" are treated as boolean false.
+ * Controls whether hidden config sections/vars are read from the file.
+ * @var boolean
*/
- var $config_booleanize = true;
+ public $config_read_hidden = false;
- /**
- * This tells whether hidden sections [.foobar] are readable from the
- * tempalates or not. Normally you would never allow this since that is
- * the point behind hidden sections: the application can access them, but
- * the templates cannot.
+ /**#@-*/
+
+ /**#@+
+ * resource locking
*/
- var $config_read_hidden = false;
/**
- * This tells whether or not automatically fix newlines in config files.
- * It basically converts \r (mac) or \r\n (dos) to \n
+ * locking concurrent compiles
+ * @var boolean
+ */
+ public $compile_locking = true;
+ /**
+ * Controls whether cache resources should emply locking mechanism
+ * @var boolean
+ */
+ public $cache_locking = false;
+ /**
+ * seconds to wait for acquiring a lock before ignoring the write lock
+ * @var float
*/
- var $config_fix_newlines = true;
+ public $locking_timeout = 10;
+
/**#@-*/
/**
- * If a template cannot be found, this PHP function will be executed.
- * Useful for creating templates on-the-fly or other special action.
- *
- * @var string function name
+ * global template functions
+ * @var array
*/
- var $default_template_handler_func = '';
-
+ public $template_functions = array();
/**
- * The file that contains the compiler class. This can a full
- * pathname, or relative to the php_include path.
+ * resource type used if none given
*
+ * Must be an valid key of $registered_resources.
* @var string
*/
- var $compiler_file = 'Smarty_Compiler.class.php';
-
+ public $default_resource_type = 'file';
/**
- * The class used for compiling templates.
+ * caching type
+ *
+ * Must be an element of $cache_resource_types.
*
* @var string
*/
- var $compiler_class = 'Smarty_Compiler';
-
+ public $caching_type = 'file';
/**
- * The class used to load config vars.
- *
+ * internal config properties
+ * @var array
+ */
+ public $properties = array();
+ /**
+ * config type
* @var string
*/
- var $config_class = 'Config_File';
-
-/**#@+
- * END Smarty Configuration Section
- * There should be no need to touch anything below this line.
- * @access private
- */
+ public $default_config_type = 'file';
/**
- * where assigned template vars are kept
- *
+ * cached template objects
* @var array
*/
- var $_tpl_vars = array();
-
+ public $template_objects = array();
/**
- * stores run-time $smarty.* vars
- *
- * @var null|array
+ * check If-Modified-Since headers
+ * @var boolean
*/
- var $_smarty_vars = null;
-
+ public $cache_modified_check = false;
/**
- * keeps track of sections
- *
+ * registered plugins
* @var array
*/
- var $_sections = array();
-
+ public $registered_plugins = array();
/**
- * keeps track of foreach blocks
- *
+ * plugin search order
* @var array
*/
- var $_foreach = array();
-
+ public $plugin_search_order = array('function', 'block', 'compiler', 'class');
/**
- * keeps track of tag hierarchy
- *
+ * registered objects
* @var array
*/
- var $_tag_stack = array();
-
+ public $registered_objects = array();
/**
- * configuration object
- *
- * @var Config_file
+ * registered classes
+ * @var array
*/
- var $_conf_obj = null;
-
+ public $registered_classes = array();
/**
- * loaded configuration settings
- *
+ * registered filters
* @var array
*/
- var $_config = array(array('vars' => array(), 'files' => array()));
-
+ public $registered_filters = array();
/**
- * md5 checksum of the string 'Smarty'
- *
- * @var string
+ * registered resources
+ * @var array
*/
- var $_smarty_md5 = 'f8d698aea36fcbead2b9d5359ffca76f';
-
+ public $registered_resources = array();
/**
- * Smarty version number
- *
- * @var string
+ * resource handler cache
+ * @var array
*/
- var $_version = '2.6.26';
-
+ public $_resource_handlers = array();
/**
- * current template inclusion depth
- *
- * @var integer
+ * registered cache resources
+ * @var array
*/
- var $_inclusion_depth = 0;
-
+ public $registered_cache_resources = array();
/**
- * for different compiled templates
- *
- * @var string
+ * cache resource handler cache
+ * @var array
*/
- var $_compile_id = null;
-
+ public $_cacheresource_handlers = array();
/**
- * text in URL to enable debug mode
- *
- * @var string
+ * autoload filter
+ * @var array
*/
- var $_smarty_debug_id = 'SMARTY_DEBUG';
-
+ public $autoload_filters = array();
/**
- * debugging information for debug console
- *
+ * default modifier
* @var array
*/
- var $_smarty_debug_info = array();
-
+ public $default_modifiers = array();
/**
- * info that makes up a cache file
- *
+ * autoescape variable output
+ * @var boolean
+ */
+ public $escape_html = false;
+ /**
+ * global internal smarty vars
* @var array
*/
- var $_cache_info = array();
-
+ public static $_smarty_vars = array();
+ /**
+ * start time for execution time calculation
+ * @var int
+ */
+ public $start_time = 0;
/**
* default file permissions
- *
- * @var integer
+ * @var int
*/
- var $_file_perms = 0644;
-
+ public $_file_perms = 0644;
/**
* default dir permissions
- *
- * @var integer
+ * @var int
*/
- var $_dir_perms = 0771;
-
+ public $_dir_perms = 0771;
/**
- * registered objects
- *
+ * block tag hierarchy
* @var array
*/
- var $_reg_objects = array();
-
+ public $_tag_stack = array();
/**
- * table keeping track of plugins
- *
- * @var array
+ * self pointer to Smarty object
+ * @var Smarty
*/
- var $_plugins = array(
- 'modifier' => array(),
- 'function' => array(),
- 'block' => array(),
- 'compiler' => array(),
- 'prefilter' => array(),
- 'postfilter' => array(),
- 'outputfilter' => array(),
- 'resource' => array(),
- 'insert' => array());
-
-
+ public $smarty;
/**
- * cache serials
- *
- * @var array
+ * required by the compiler for BC
+ * @var string
*/
- var $_cache_serials = array();
-
+ public $_current_file = null;
/**
- * name of optional cache include file
- *
- * @var string
+ * internal flag to enable parser debugging
+ * @var bool
*/
- var $_cache_include = null;
-
+ public $_parserdebug = false;
/**
- * indicate if the current code is used in a compiled
- * include
+ * Saved parameter of merged templates during compilation
*
- * @var string
+ * @var array
*/
- var $_cache_including = false;
-
+ public $merged_templates_func = array();
/**#@-*/
- /**
- * The class constructor.
- */
- function Smarty()
- {
- $this->assign('SCRIPT_NAME', isset($_SERVER['SCRIPT_NAME']) ? $_SERVER['SCRIPT_NAME']
- : @$GLOBALS['HTTP_SERVER_VARS']['SCRIPT_NAME']);
- }
/**
- * assigns values to template variables
+ * Initialize new Smarty object
*
- * @param array|string $tpl_var the template variable name(s)
- * @param mixed $value the value to assign
*/
- function assign($tpl_var, $value = null)
+ public function __construct()
{
- if (is_array($tpl_var)){
- foreach ($tpl_var as $key => $val) {
- if ($key != '') {
- $this->_tpl_vars[$key] = $val;
- }
- }
- } else {
- if ($tpl_var != '')
- $this->_tpl_vars[$tpl_var] = $value;
+ // selfpointer needed by some other class methods
+ $this->smarty = $this;
+ if (is_callable('mb_internal_encoding')) {
+ mb_internal_encoding(Smarty::$_CHARSET);
+ }
+ $this->start_time = microtime(true);
+ // set default dirs
+ $this->setTemplateDir('.' . DS . 'templates' . DS)
+ ->setCompileDir('.' . DS . 'templates_c' . DS)
+ ->setPluginsDir(SMARTY_PLUGINS_DIR)
+ ->setCacheDir('.' . DS . 'cache' . DS)
+ ->setConfigDir('.' . DS . 'configs' . DS);
+
+ $this->debug_tpl = 'file:' . dirname(__FILE__) . '/debug.tpl';
+ if (isset($_SERVER['SCRIPT_NAME'])) {
+ $this->assignGlobal('SCRIPT_NAME', $_SERVER['SCRIPT_NAME']);
}
}
- /**
- * assigns values to template variables by reference
- *
- * @param string $tpl_var the template variable name
- * @param mixed $value the referenced value to assign
- */
- function assign_by_ref($tpl_var, &$value)
- {
- if ($tpl_var != '')
- $this->_tpl_vars[$tpl_var] = &$value;
- }
/**
- * appends values to template variables
- *
- * @param array|string $tpl_var the template variable name(s)
- * @param mixed $value the value to append
+ * Class destructor
*/
- function append($tpl_var, $value=null, $merge=false)
+ public function __destruct()
{
- if (is_array($tpl_var)) {
- // $tpl_var is an array, ignore $value
- foreach ($tpl_var as $_key => $_val) {
- if ($_key != '') {
- if(!@is_array($this->_tpl_vars[$_key])) {
- settype($this->_tpl_vars[$_key],'array');
- }
- if($merge && is_array($_val)) {
- foreach($_val as $_mkey => $_mval) {
- $this->_tpl_vars[$_key][$_mkey] = $_mval;
- }
- } else {
- $this->_tpl_vars[$_key][] = $_val;
- }
- }
- }
- } else {
- if ($tpl_var != '' && isset($value)) {
- if(!@is_array($this->_tpl_vars[$tpl_var])) {
- settype($this->_tpl_vars[$tpl_var],'array');
- }
- if($merge && is_array($value)) {
- foreach($value as $_mkey => $_mval) {
- $this->_tpl_vars[$tpl_var][$_mkey] = $_mval;
- }
- } else {
- $this->_tpl_vars[$tpl_var][] = $value;
- }
- }
- }
+ // intentionally left blank
}
/**
- * appends values to template variables by reference
- *
- * @param string $tpl_var the template variable name
- * @param mixed $value the referenced value to append
+ * <<magic>> set selfpointer on cloned object
*/
- function append_by_ref($tpl_var, &$value, $merge=false)
+ public function __clone()
{
- if ($tpl_var != '' && isset($value)) {
- if(!@is_array($this->_tpl_vars[$tpl_var])) {
- settype($this->_tpl_vars[$tpl_var],'array');
- }
- if ($merge && is_array($value)) {
- foreach($value as $_key => $_val) {
- $this->_tpl_vars[$tpl_var][$_key] = &$value[$_key];
- }
- } else {
- $this->_tpl_vars[$tpl_var][] = &$value;
- }
- }
+ $this->smarty = $this;
}
/**
- * clear the given assigned template variable.
+ * <<magic>> Generic getter.
*
- * @param string $tpl_var the template variable to clear
- */
- function clear_assign($tpl_var)
- {
- if (is_array($tpl_var))
- foreach ($tpl_var as $curr_var)
- unset($this->_tpl_vars[$curr_var]);
- else
- unset($this->_tpl_vars[$tpl_var]);
- }
-
-
- /**
- * Registers custom function to be used in templates
+ * Calls the appropriate getter function.
+ * Issues an E_USER_NOTICE if no valid getter is found.
*
- * @param string $function the name of the template function
- * @param string $function_impl the name of the PHP function to register
+ * @param string $name property name
+ * @return mixed
*/
- function register_function($function, $function_impl, $cacheable=true, $cache_attrs=null)
+ public function __get($name)
{
- $this->_plugins['function'][$function] =
- array($function_impl, null, null, false, $cacheable, $cache_attrs);
+ $allowed = array(
+ 'template_dir' => 'getTemplateDir',
+ 'config_dir' => 'getConfigDir',
+ 'plugins_dir' => 'getPluginsDir',
+ 'compile_dir' => 'getCompileDir',
+ 'cache_dir' => 'getCacheDir',
+ );
+ if (isset($allowed[$name])) {
+ return $this->{$allowed[$name]}();
+ } else {
+ trigger_error('Undefined property: '. get_class($this) .'::$'. $name, E_USER_NOTICE);
+ }
}
/**
- * Unregisters custom function
+ * <<magic>> Generic setter.
*
- * @param string $function name of template function
- */
- function unregister_function($function)
- {
- unset($this->_plugins['function'][$function]);
- }
-
- /**
- * Registers object to be used in templates
+ * Calls the appropriate setter function.
+ * Issues an E_USER_NOTICE if no valid setter is found.
*
- * @param string $object name of template object
- * @param object &$object_impl the referenced PHP object to register
- * @param null|array $allowed list of allowed methods (empty = all)
- * @param boolean $smarty_args smarty argument format, else traditional
- * @param null|array $block_functs list of methods that are block format
+ * @param string $name property name
+ * @param mixed $value parameter passed to setter
*/
- function register_object($object, &$object_impl, $allowed = array(), $smarty_args = true, $block_methods = array())
+ public function __set($name, $value)
{
- settype($allowed, 'array');
- settype($smarty_args, 'boolean');
- $this->_reg_objects[$object] =
- array(&$object_impl, $allowed, $smarty_args, $block_methods);
+ $allowed = array(
+ 'template_dir' => 'setTemplateDir',
+ 'config_dir' => 'setConfigDir',
+ 'plugins_dir' => 'setPluginsDir',
+ 'compile_dir' => 'setCompileDir',
+ 'cache_dir' => 'setCacheDir',
+ );
+
+ if (isset($allowed[$name])) {
+ $this->{$allowed[$name]}($value);
+ } else {
+ trigger_error('Undefined property: ' . get_class($this) . '::$' . $name, E_USER_NOTICE);
+ }
}
/**
- * Unregisters object
+ * Check if a template resource exists
*
- * @param string $object name of template object
+ * @param string $resource_name template name
+ * @return boolean status
*/
- function unregister_object($object)
+ public function templateExists($resource_name)
{
- unset($this->_reg_objects[$object]);
+ // create template object
+ $save = $this->template_objects;
+ $tpl = new $this->template_class($resource_name, $this);
+ // check if it does exists
+ $result = $tpl->source->exists;
+ $this->template_objects = $save;
+ return $result;
}
-
/**
- * Registers block function to be used in templates
+ * Returns a single or all global variables
*
- * @param string $block name of template block
- * @param string $block_impl PHP function to register
+ * @param object $smarty
+ * @param string $varname variable name or null
+ * @return string variable value or or array of variables
*/
- function register_block($block, $block_impl, $cacheable=true, $cache_attrs=null)
+ public function getGlobal($varname = null)
{
- $this->_plugins['block'][$block] =
- array($block_impl, null, null, false, $cacheable, $cache_attrs);
+ if (isset($varname)) {
+ if (isset(self::$global_tpl_vars[$varname])) {
+ return self::$global_tpl_vars[$varname]->value;
+ } else {
+ return '';
+ }
+ } else {
+ $_result = array();
+ foreach (self::$global_tpl_vars AS $key => $var) {
+ $_result[$key] = $var->value;
+ }
+ return $_result;
+ }
}
/**
- * Unregisters block function
+ * Empty cache folder
*
- * @param string $block name of template function
+ * @param integer $exp_time expiration time
+ * @param string $type resource type
+ * @return integer number of cache files deleted
*/
- function unregister_block($block)
+ function clearAllCache($exp_time = null, $type = null)
{
- unset($this->_plugins['block'][$block]);
+ // load cache resource and call clearAll
+ $_cache_resource = Smarty_CacheResource::load($this, $type);
+ Smarty_CacheResource::invalidLoadedCache($this);
+ return $_cache_resource->clearAll($this, $exp_time);
}
/**
- * Registers compiler function
+ * Empty cache for a specific template
*
- * @param string $function name of template function
- * @param string $function_impl name of PHP function to register
+ * @param string $template_name template name
+ * @param string $cache_id cache id
+ * @param string $compile_id compile id
+ * @param integer $exp_time expiration time
+ * @param string $type resource type
+ * @return integer number of cache files deleted
*/
- function register_compiler_function($function, $function_impl, $cacheable=true)
+ public function clearCache($template_name, $cache_id = null, $compile_id = null, $exp_time = null, $type = null)
{
- $this->_plugins['compiler'][$function] =
- array($function_impl, null, null, false, $cacheable);
+ // load cache resource and call clear
+ $_cache_resource = Smarty_CacheResource::load($this, $type);
+ Smarty_CacheResource::invalidLoadedCache($this);
+ return $_cache_resource->clear($this, $template_name, $cache_id, $compile_id, $exp_time);
}
/**
- * Unregisters compiler function
+ * Loads security class and enables security
*
- * @param string $function name of template function
+ * @param string|Smarty_Security $security_class if a string is used, it must be class-name
+ * @return Smarty current Smarty instance for chaining
+ * @throws SmartyException when an invalid class name is provided
*/
- function unregister_compiler_function($function)
+ public function enableSecurity($security_class = null)
{
- unset($this->_plugins['compiler'][$function]);
+ if ($security_class instanceof Smarty_Security) {
+ $this->security_policy = $security_class;
+ return $this;
+ } elseif (is_object($security_class)) {
+ throw new SmartyException("Class '" . get_class($security_class) . "' must extend Smarty_Security.");
+ }
+ if ($security_class == null) {
+ $security_class = $this->security_class;
+ }
+ if (!class_exists($security_class)) {
+ throw new SmartyException("Security class '$security_class' is not defined");
+ } elseif ($security_class !== 'Smarty_Security' && !is_subclass_of($security_class, 'Smarty_Security')) {
+ throw new SmartyException("Class '$security_class' must extend Smarty_Security.");
+ } else {
+ $this->security_policy = new $security_class($this);
+ }
+
+ return $this;
}
/**
- * Registers modifier to be used in templates
- *
- * @param string $modifier name of template modifier
- * @param string $modifier_impl name of PHP function to register
+ * Disable security
+ * @return Smarty current Smarty instance for chaining
*/
- function register_modifier($modifier, $modifier_impl)
+ public function disableSecurity()
{
- $this->_plugins['modifier'][$modifier] =
- array($modifier_impl, null, null, false);
+ $this->security_policy = null;
+
+ return $this;
}
/**
- * Unregisters modifier
+ * Set template directory
*
- * @param string $modifier name of template modifier
+ * @param string|array $template_dir directory(s) of template sources
+ * @return Smarty current Smarty instance for chaining
*/
- function unregister_modifier($modifier)
+ public function setTemplateDir($template_dir)
{
- unset($this->_plugins['modifier'][$modifier]);
+ $this->template_dir = array();
+ foreach ((array) $template_dir as $k => $v) {
+ $this->template_dir[$k] = rtrim($v, '/\\') . DS;
+ }
+
+ $this->joined_template_dir = join(DIRECTORY_SEPARATOR, $this->template_dir);
+ return $this;
}
/**
- * Registers a resource to fetch a template
+ * Add template directory(s)
*
- * @param string $type name of resource
- * @param array $functions array of functions to handle resource
+ * @param string|array $template_dir directory(s) of template sources
+ * @param string $key of the array element to assign the template dir to
+ * @return Smarty current Smarty instance for chaining
+ * @throws SmartyException when the given template directory is not valid
*/
- function register_resource($type, $functions)
+ public function addTemplateDir($template_dir, $key=null)
{
- if (count($functions)==4) {
- $this->_plugins['resource'][$type] =
- array($functions, false);
-
- } elseif (count($functions)==5) {
- $this->_plugins['resource'][$type] =
- array(array(array(&$functions[0], $functions[1])
- ,array(&$functions[0], $functions[2])
- ,array(&$functions[0], $functions[3])
- ,array(&$functions[0], $functions[4]))
- ,false);
-
+ // make sure we're dealing with an array
+ $this->template_dir = (array) $this->template_dir;
+
+ if (is_array($template_dir)) {
+ foreach ($template_dir as $k => $v) {
+ if (is_int($k)) {
+ // indexes are not merged but appended
+ $this->template_dir[] = rtrim($v, '/\\') . DS;
+ } else {
+ // string indexes are overridden
+ $this->template_dir[$k] = rtrim($v, '/\\') . DS;
+ }
+ }
+ } elseif ($key !== null) {
+ // override directory at specified index
+ $this->template_dir[$key] = rtrim($template_dir, '/\\') . DS;
} else {
- $this->trigger_error("malformed function-list for '$type' in register_resource");
-
+ // append new directory
+ $this->template_dir[] = rtrim($template_dir, '/\\') . DS;
}
+ $this->joined_template_dir = join(DIRECTORY_SEPARATOR, $this->template_dir);
+ return $this;
}
/**
- * Unregisters a resource
+ * Get template directories
*
- * @param string $type name of resource
+ * @param mixed index of directory to get, null to get all
+ * @return array|string list of template directories, or directory of $index
*/
- function unregister_resource($type)
+ public function getTemplateDir($index=null)
{
- unset($this->_plugins['resource'][$type]);
- }
+ if ($index !== null) {
+ return isset($this->template_dir[$index]) ? $this->template_dir[$index] : null;
+ }
- /**
- * Registers a prefilter function to apply
- * to a template before compiling
- *
- * @param callback $function
- */
- function register_prefilter($function)
- {
- $this->_plugins['prefilter'][$this->_get_filter_name($function)]
- = array($function, null, null, false);
+ return (array)$this->template_dir;
}
/**
- * Unregisters a prefilter function
+ * Set config directory
*
- * @param callback $function
+ * @param string|array $template_dir directory(s) of configuration sources
+ * @return Smarty current Smarty instance for chaining
*/
- function unregister_prefilter($function)
+ public function setConfigDir($config_dir)
{
- unset($this->_plugins['prefilter'][$this->_get_filter_name($function)]);
- }
+ $this->config_dir = array();
+ foreach ((array) $config_dir as $k => $v) {
+ $this->config_dir[$k] = rtrim($v, '/\\') . DS;
+ }
- /**
- * Registers a postfilter function to apply
- * to a compiled template after compilation
- *
- * @param callback $function
- */
- function register_postfilter($function)
- {
- $this->_plugins['postfilter'][$this->_get_filter_name($function)]
- = array($function, null, null, false);
+ $this->joined_config_dir = join(DIRECTORY_SEPARATOR, $this->config_dir);
+ return $this;
}
/**
- * Unregisters a postfilter function
+ * Add config directory(s)
*
- * @param callback $function
+ * @param string|array $config_dir directory(s) of config sources
+ * @param string key of the array element to assign the config dir to
+ * @return Smarty current Smarty instance for chaining
*/
- function unregister_postfilter($function)
+ public function addConfigDir($config_dir, $key=null)
{
- unset($this->_plugins['postfilter'][$this->_get_filter_name($function)]);
- }
+ // make sure we're dealing with an array
+ $this->config_dir = (array) $this->config_dir;
+
+ if (is_array($config_dir)) {
+ foreach ($config_dir as $k => $v) {
+ if (is_int($k)) {
+ // indexes are not merged but appended
+ $this->config_dir[] = rtrim($v, '/\\') . DS;
+ } else {
+ // string indexes are overridden
+ $this->config_dir[$k] = rtrim($v, '/\\') . DS;
+ }
+ }
+ } elseif( $key !== null ) {
+ // override directory at specified index
+ $this->config_dir[$key] = rtrim($config_dir, '/\\') . DS;
+ } else {
+ // append new directory
+ $this->config_dir[] = rtrim($config_dir, '/\\') . DS;
+ }
- /**
- * Registers an output filter function to apply
- * to a template output
- *
- * @param callback $function
- */
- function register_outputfilter($function)
- {
- $this->_plugins['outputfilter'][$this->_get_filter_name($function)]
- = array($function, null, null, false);
+ $this->joined_config_dir = join(DIRECTORY_SEPARATOR, $this->config_dir);
+ return $this;
}
/**
- * Unregisters an outputfilter function
+ * Get config directory
*
- * @param callback $function
+ * @param mixed index of directory to get, null to get all
+ * @return array|string configuration directory
*/
- function unregister_outputfilter($function)
+ public function getConfigDir($index=null)
{
- unset($this->_plugins['outputfilter'][$this->_get_filter_name($function)]);
+ if ($index !== null) {
+ return isset($this->config_dir[$index]) ? $this->config_dir[$index] : null;
+ }
+
+ return (array)$this->config_dir;
}
/**
- * load a filter of specified type and name
+ * Set plugins directory
*
- * @param string $type filter type
- * @param string $name filter name
+ * @param string|array $plugins_dir directory(s) of plugins
+ * @return Smarty current Smarty instance for chaining
*/
- function load_filter($type, $name)
+ public function setPluginsDir($plugins_dir)
{
- switch ($type) {
- case 'output':
- $_params = array('plugins' => array(array($type . 'filter', $name, null, null, false)));
- require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');
- smarty_core_load_plugins($_params, $this);
- break;
-
- case 'pre':
- case 'post':
- if (!isset($this->_plugins[$type . 'filter'][$name]))
- $this->_plugins[$type . 'filter'][$name] = false;
- break;
+ $this->plugins_dir = array();
+ foreach ((array)$plugins_dir as $k => $v) {
+ $this->plugins_dir[$k] = rtrim($v, '/\\') . DS;
}
+
+ return $this;
}
/**
- * clear cached content for the given template and cache id
+ * Adds directory of plugin files
*
- * @param string $tpl_file name of template file
- * @param string $cache_id name of cache_id
- * @param string $compile_id name of compile_id
- * @param string $exp_time expiration time
- * @return boolean
+ * @param object $smarty
+ * @param string $ |array $ plugins folder
+ * @return Smarty current Smarty instance for chaining
*/
- function clear_cache($tpl_file = null, $cache_id = null, $compile_id = null, $exp_time = null)
+ public function addPluginsDir($plugins_dir)
{
-
- if (!isset($compile_id))
- $compile_id = $this->compile_id;
-
- if (!isset($tpl_file))
- $compile_id = null;
-
- $_auto_id = $this->_get_auto_id($cache_id, $compile_id);
-
- if (!empty($this->cache_handler_func)) {
- return call_user_func_array($this->cache_handler_func,
- array('clear', &$this, &$dummy, $tpl_file, $cache_id, $compile_id, $exp_time));
+ // make sure we're dealing with an array
+ $this->plugins_dir = (array) $this->plugins_dir;
+
+ if (is_array($plugins_dir)) {
+ foreach ($plugins_dir as $k => $v) {
+ if (is_int($k)) {
+ // indexes are not merged but appended
+ $this->plugins_dir[] = rtrim($v, '/\\') . DS;
+ } else {
+ // string indexes are overridden
+ $this->plugins_dir[$k] = rtrim($v, '/\\') . DS;
+ }
+ }
} else {
- $_params = array('auto_base' => $this->cache_dir,
- 'auto_source' => $tpl_file,
- 'auto_id' => $_auto_id,
- 'exp_time' => $exp_time);
- require_once(SMARTY_CORE_DIR . 'core.rm_auto.php');
- return smarty_core_rm_auto($_params, $this);
+ // append new directory
+ $this->plugins_dir[] = rtrim($plugins_dir, '/\\') . DS;
}
+ $this->plugins_dir = array_unique($this->plugins_dir);
+ return $this;
}
-
/**
- * clear the entire contents of cache (all templates)
+ * Get plugin directories
*
- * @param string $exp_time expire time
- * @return boolean results of {@link smarty_core_rm_auto()}
+ * @return array list of plugin directories
*/
- function clear_all_cache($exp_time = null)
+ public function getPluginsDir()
{
- return $this->clear_cache(null, null, null, $exp_time);
+ return (array)$this->plugins_dir;
}
-
/**
- * test to see if valid cache exists for this template
+ * Set compile directory
*
- * @param string $tpl_file name of template file
- * @param string $cache_id
- * @param string $compile_id
- * @return string|false results of {@link _read_cache_file()}
+ * @param string $compile_dir directory to store compiled templates in
+ * @return Smarty current Smarty instance for chaining
*/
- function is_cached($tpl_file, $cache_id = null, $compile_id = null)
+ public function setCompileDir($compile_dir)
{
- if (!$this->caching)
- return false;
-
- if (!isset($compile_id))
- $compile_id = $this->compile_id;
-
- $_params = array(
- 'tpl_file' => $tpl_file,
- 'cache_id' => $cache_id,
- 'compile_id' => $compile_id
- );
- require_once(SMARTY_CORE_DIR . 'core.read_cache_file.php');
- return smarty_core_read_cache_file($_params, $this);
+ $this->compile_dir = rtrim($compile_dir, '/\\') . DS;
+ if (!isset(Smarty::$_muted_directories[$this->compile_dir])) {
+ Smarty::$_muted_directories[$this->compile_dir] = null;
+ }
+ return $this;
}
-
/**
- * clear all the assigned template variables.
+ * Get compiled directory
*
+ * @return string path to compiled templates
*/
- function clear_all_assign()
+ public function getCompileDir()
{
- $this->_tpl_vars = array();
+ return $this->compile_dir;
}
/**
- * clears compiled version of specified template resource,
- * or all compiled template files if one is not specified.
- * This function is for advanced use only, not normally needed.
+ * Set cache directory
*
- * @param string $tpl_file
- * @param string $compile_id
- * @param string $exp_time
- * @return boolean results of {@link smarty_core_rm_auto()}
+ * @param string $cache_dir directory to store cached templates in
+ * @return Smarty current Smarty instance for chaining
*/
- function clear_compiled_tpl($tpl_file = null, $compile_id = null, $exp_time = null)
+ public function setCacheDir($cache_dir)
{
- if (!isset($compile_id)) {
- $compile_id = $this->compile_id;
+ $this->cache_dir = rtrim($cache_dir, '/\\') . DS;
+ if (!isset(Smarty::$_muted_directories[$this->cache_dir])) {
+ Smarty::$_muted_directories[$this->cache_dir] = null;
}
- $_params = array('auto_base' => $this->compile_dir,
- 'auto_source' => $tpl_file,
- 'auto_id' => $compile_id,
- 'exp_time' => $exp_time,
- 'extensions' => array('.inc', '.php'));
- require_once(SMARTY_CORE_DIR . 'core.rm_auto.php');
- return smarty_core_rm_auto($_params, $this);
+ return $this;
}
/**
- * Checks whether requested template exists.
+ * Get cache directory
*
- * @param string $tpl_file
- * @return boolean
+ * @return string path of cache directory
*/
- function template_exists($tpl_file)
+ public function getCacheDir()
{
- $_params = array('resource_name' => $tpl_file, 'quiet'=>true, 'get_source'=>false);
- return $this->_fetch_resource_info($_params);
+ return $this->cache_dir;
}
/**
- * Returns an array containing template variables
+ * Set default modifiers
*
- * @param string $name
- * @param string $type
- * @return array
+ * @param array|string $modifiers modifier or list of modifiers to set
+ * @return Smarty current Smarty instance for chaining
*/
- function &get_template_vars($name=null)
+ public function setDefaultModifiers($modifiers)
{
- if(!isset($name)) {
- return $this->_tpl_vars;
- } elseif(isset($this->_tpl_vars[$name])) {
- return $this->_tpl_vars[$name];
- } else {
- // var non-existant, return valid reference
- $_tmp = null;
- return $_tmp;
- }
+ $this->default_modifiers = (array) $modifiers;
+ return $this;
}
/**
- * Returns an array containing config variables
+ * Add default modifiers
*
- * @param string $name
- * @param string $type
- * @return array
+ * @param array|string $modifiers modifier or list of modifiers to add
+ * @return Smarty current Smarty instance for chaining
*/
- function &get_config_vars($name=null)
+ public function addDefaultModifiers($modifiers)
{
- if(!isset($name) && is_array($this->_config[0])) {
- return $this->_config[0]['vars'];
- } else if(isset($this->_config[0]['vars'][$name])) {
- return $this->_config[0]['vars'][$name];
+ if (is_array($modifiers)) {
+ $this->default_modifiers = array_merge($this->default_modifiers, $modifiers);
} else {
- // var non-existant, return valid reference
- $_tmp = null;
- return $_tmp;
+ $this->default_modifiers[] = $modifiers;
}
+
+ return $this;
}
/**
- * trigger Smarty error
+ * Get default modifiers
*
- * @param string $error_msg
- * @param integer $error_type
+ * @return array list of default modifiers
*/
- function trigger_error($error_msg, $error_type = E_USER_WARNING)
+ public function getDefaultModifiers()
{
- trigger_error("Smarty error: $error_msg", $error_type);
+ return $this->default_modifiers;
}
/**
- * executes & displays the template results
+ * Set autoload filters
*
- * @param string $resource_name
- * @param string $cache_id
- * @param string $compile_id
+ * @param array $filters filters to load automatically
+ * @param string $type "pre", "output", … specify the filter type to set. Defaults to none treating $filters' keys as the appropriate types
+ * @return Smarty current Smarty instance for chaining
*/
- function display($resource_name, $cache_id = null, $compile_id = null)
+ public function setAutoloadFilters($filters, $type=null)
{
- $this->fetch($resource_name, $cache_id, $compile_id, true);
+ if ($type !== null) {
+ $this->autoload_filters[$type] = (array) $filters;
+ } else {
+ $this->autoload_filters = (array) $filters;
+ }
+
+ return $this;
}
/**
- * executes & returns or displays the template results
+ * Add autoload filters
*
- * @param string $resource_name
- * @param string $cache_id
- * @param string $compile_id
- * @param boolean $display
+ * @param array $filters filters to load automatically
+ * @param string $type "pre", "output", … specify the filter type to set. Defaults to none treating $filters' keys as the appropriate types
+ * @return Smarty current Smarty instance for chaining
*/
- function fetch($resource_name, $cache_id = null, $compile_id = null, $display = false)
+ public function addAutoloadFilters($filters, $type=null)
{
- static $_cache_info = array();
-
- $_smarty_old_error_level = $this->debugging ? error_reporting() : error_reporting(isset($this->error_reporting)
- ? $this->error_reporting : error_reporting() & ~E_NOTICE);
-
- if (!$this->debugging && $this->debugging_ctrl == 'URL') {
- $_query_string = $this->request_use_auto_globals ? $_SERVER['QUERY_STRING'] : $GLOBALS['HTTP_SERVER_VARS']['QUERY_STRING'];
- if (@strstr($_query_string, $this->_smarty_debug_id)) {
- if (@strstr($_query_string, $this->_smarty_debug_id . '=on')) {
- // enable debugging for this browser session
- @setcookie('SMARTY_DEBUG', true);
- $this->debugging = true;
- } elseif (@strstr($_query_string, $this->_smarty_debug_id . '=off')) {
- // disable debugging for this browser session
- @setcookie('SMARTY_DEBUG', false);
- $this->debugging = false;
- } else {
- // enable debugging for this page
- $this->debugging = true;
- }
+ if ($type !== null) {
+ if (!empty($this->autoload_filters[$type])) {
+ $this->autoload_filters[$type] = array_merge($this->autoload_filters[$type], (array) $filters);
} else {
- $this->debugging = (bool)($this->request_use_auto_globals ? @$_COOKIE['SMARTY_DEBUG'] : @$GLOBALS['HTTP_COOKIE_VARS']['SMARTY_DEBUG']);
+ $this->autoload_filters[$type] = (array) $filters;
}
- }
-
- if ($this->debugging) {
- // capture time for debugging info
- $_params = array();
- require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
- $_debug_start_time = smarty_core_get_microtime($_params, $this);
- $this->_smarty_debug_info[] = array('type' => 'template',
- 'filename' => $resource_name,
- 'depth' => 0);
- $_included_tpls_idx = count($this->_smarty_debug_info) - 1;
- }
-
- if (!isset($compile_id)) {
- $compile_id = $this->compile_id;
- }
-
- $this->_compile_id = $compile_id;
- $this->_inclusion_depth = 0;
-
- if ($this->caching) {
- // save old cache_info, initialize cache_info
- array_push($_cache_info, $this->_cache_info);
- $this->_cache_info = array();
- $_params = array(
- 'tpl_file' => $resource_name,
- 'cache_id' => $cache_id,
- 'compile_id' => $compile_id,
- 'results' => null
- );
- require_once(SMARTY_CORE_DIR . 'core.read_cache_file.php');
- if (smarty_core_read_cache_file($_params, $this)) {
- $_smarty_results = $_params['results'];
- if (!empty($this->_cache_info['insert_tags'])) {
- $_params = array('plugins' => $this->_cache_info['insert_tags']);
- require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');
- smarty_core_load_plugins($_params, $this);
- $_params = array('results' => $_smarty_results);
- require_once(SMARTY_CORE_DIR . 'core.process_cached_inserts.php');
- $_smarty_results = smarty_core_process_cached_inserts($_params, $this);
- }
- if (!empty($this->_cache_info['cache_serials'])) {
- $_params = array('results' => $_smarty_results);
- require_once(SMARTY_CORE_DIR . 'core.process_compiled_include.php');
- $_smarty_results = smarty_core_process_compiled_include($_params, $this);
- }
-
-
- if ($display) {
- if ($this->debugging)
- {
- // capture time for debugging info
- $_params = array();
- require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
- $this->_smarty_debug_info[$_included_tpls_idx]['exec_time'] = smarty_core_get_microtime($_params, $this) - $_debug_start_time;
- require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php');
- $_smarty_results .= smarty_core_display_debug_console($_params, $this);
- }
- if ($this->cache_modified_check) {
- $_server_vars = ($this->request_use_auto_globals) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS'];
- $_last_modified_date = @substr($_server_vars['HTTP_IF_MODIFIED_SINCE'], 0, strpos($_server_vars['HTTP_IF_MODIFIED_SINCE'], 'GMT') + 3);
- $_gmt_mtime = gmdate('D, d M Y H:i:s', $this->_cache_info['timestamp']).' GMT';
- if (@count($this->_cache_info['insert_tags']) == 0
- && !$this->_cache_serials
- && $_gmt_mtime == $_last_modified_date) {
- if (php_sapi_name()=='cgi')
- header('Status: 304 Not Modified');
- else
- header('HTTP/1.1 304 Not Modified');
-
- } else {
- header('Last-Modified: '.$_gmt_mtime);
- echo $_smarty_results;
- }
- } else {
- echo $_smarty_results;
- }
- error_reporting($_smarty_old_error_level);
- // restore initial cache_info
- $this->_cache_info = array_pop($_cache_info);
- return true;
+ } else {
+ foreach ((array) $filters as $key => $value) {
+ if (!empty($this->autoload_filters[$key])) {
+ $this->autoload_filters[$key] = array_merge($this->autoload_filters[$key], (array) $value);
} else {
- error_reporting($_smarty_old_error_level);
- // restore initial cache_info
- $this->_cache_info = array_pop($_cache_info);
- return $_smarty_results;
- }
- } else {
- $this->_cache_info['template'][$resource_name] = true;
- if ($this->cache_modified_check && $display) {
- header('Last-Modified: '.gmdate('D, d M Y H:i:s', time()).' GMT');
- }
- }
- }
-
- // load filters that are marked as autoload
- if (count($this->autoload_filters)) {
- foreach ($this->autoload_filters as $_filter_type => $_filters) {
- foreach ($_filters as $_filter) {
- $this->load_filter($_filter_type, $_filter);
+ $this->autoload_filters[$key] = (array) $value;
}
}
}
- $_smarty_compile_path = $this->_get_compile_path($resource_name);
-
- // if we just need to display the results, don't perform output
- // buffering - for speed
- $_cache_including = $this->_cache_including;
- $this->_cache_including = false;
- if ($display && !$this->caching && count($this->_plugins['outputfilter']) == 0) {
- if ($this->_is_compiled($resource_name, $_smarty_compile_path)
- || $this->_compile_resource($resource_name, $_smarty_compile_path))
- {
- include($_smarty_compile_path);
- }
- } else {
- ob_start();
- if ($this->_is_compiled($resource_name, $_smarty_compile_path)
- || $this->_compile_resource($resource_name, $_smarty_compile_path))
- {
- include($_smarty_compile_path);
- }
- $_smarty_results = ob_get_contents();
- ob_end_clean();
-
- foreach ((array)$this->_plugins['outputfilter'] as $_output_filter) {
- $_smarty_results = call_user_func_array($_output_filter[0], array($_smarty_results, &$this));
- }
- }
-
- if ($this->caching) {
- $_params = array('tpl_file' => $resource_name,
- 'cache_id' => $cache_id,
- 'compile_id' => $compile_id,
- 'results' => $_smarty_results);
- require_once(SMARTY_CORE_DIR . 'core.write_cache_file.php');
- smarty_core_write_cache_file($_params, $this);
- require_once(SMARTY_CORE_DIR . 'core.process_cached_inserts.php');
- $_smarty_results = smarty_core_process_cached_inserts($_params, $this);
-
- if ($this->_cache_serials) {
- // strip nocache-tags from output
- $_smarty_results = preg_replace('!(\{/?nocache\:[0-9a-f]{32}#\d+\})!s'
- ,''
- ,$_smarty_results);
- }
- // restore initial cache_info
- $this->_cache_info = array_pop($_cache_info);
- }
- $this->_cache_including = $_cache_including;
-
- if ($display) {
- if (isset($_smarty_results)) { echo $_smarty_results; }
- if ($this->debugging) {
- // capture time for debugging info
- $_params = array();
- require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
- $this->_smarty_debug_info[$_included_tpls_idx]['exec_time'] = (smarty_core_get_microtime($_params, $this) - $_debug_start_time);
- require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php');
- echo smarty_core_display_debug_console($_params, $this);
- }
- error_reporting($_smarty_old_error_level);
- return;
- } else {
- if ($this->debugging) {
- // capture time for debugging info
- require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
- $this->_smarty_debug_info[$_included_tpls_idx]['exec_time'] = (smarty_core_get_microtime(array(), $this) - $_debug_start_time);
- }
- error_reporting($_smarty_old_error_level);
- if (isset($_smarty_results)) { return $_smarty_results; }
- }
+ return $this;
}
/**
- * load configuration values
+ * Get autoload filters
*
- * @param string $file
- * @param string $section
- * @param string $scope
+ * @param string $type type of filter to get autoloads for. Defaults to all autoload filters
+ * @return array array( 'type1' => array( 'filter1', 'filter2', … ) ) or array( 'filter1', 'filter2', …) if $type was specified
*/
- function config_load($file, $section = null, $scope = 'global')
+ public function getAutoloadFilters($type=null)
{
- require_once($this->_get_plugin_filepath('function', 'config_load'));
- smarty_function_config_load(array('file' => $file, 'section' => $section, 'scope' => $scope), $this);
- }
-
- /**
- * return a reference to a registered object
- *
- * @param string $name
- * @return object
- */
- function &get_registered_object($name) {
- if (!isset($this->_reg_objects[$name]))
- $this->_trigger_fatal_error("'$name' is not a registered object");
-
- if (!is_object($this->_reg_objects[$name][0]))
- $this->_trigger_fatal_error("registered '$name' is not an object");
+ if ($type !== null) {
+ return isset($this->autoload_filters[$type]) ? $this->autoload_filters[$type] : array();
+ }
- return $this->_reg_objects[$name][0];
+ return $this->autoload_filters;
}
/**
- * clear configuration values
+ * return name of debugging template
*
- * @param string $var
+ * @return string
*/
- function clear_config($var = null)
+ public function getDebugTemplate()
{
- if(!isset($var)) {
- // clear all values
- $this->_config = array(array('vars' => array(),
- 'files' => array()));
- } else {
- unset($this->_config[0]['vars'][$var]);
- }
+ return $this->debug_tpl;
}
/**
- * get filepath of requested plugin
+ * set the debug template
*
- * @param string $type
- * @param string $name
- * @return string|false
+ * @param string $tpl_name
+ * @return Smarty current Smarty instance for chaining
+ * @throws SmartyException if file is not readable
*/
- function _get_plugin_filepath($type, $name)
+ public function setDebugTemplate($tpl_name)
{
- $_params = array('type' => $type, 'name' => $name);
- require_once(SMARTY_CORE_DIR . 'core.assemble_plugin_filepath.php');
- return smarty_core_assemble_plugin_filepath($_params, $this);
- }
-
- /**
- * test if resource needs compiling
- *
- * @param string $resource_name
- * @param string $compile_path
- * @return boolean
- */
- function _is_compiled($resource_name, $compile_path)
- {
- if (!$this->force_compile && file_exists($compile_path)) {
- if (!$this->compile_check) {
- // no need to check compiled file
- return true;
- } else {
- // get file source and timestamp
- $_params = array('resource_name' => $resource_name, 'get_source'=>false);
- if (!$this->_fetch_resource_info($_params)) {
- return false;
- }
- if ($_params['resource_timestamp'] <= filemtime($compile_path)) {
- // template not expired, no recompile
- return true;
- } else {
- // compile template
- return false;
- }
- }
- } else {
- // compiled template does not exist, or forced compile
- return false;
+ if (!is_readable($tpl_name)) {
+ throw new SmartyException("Unknown file '{$tpl_name}'");
}
+ $this->debug_tpl = $tpl_name;
+
+ return $this;
}
- /**
- * compile the template
+ /**
+ * creates a template object
*
- * @param string $resource_name
- * @param string $compile_path
- * @return boolean
+ * @param string $template the resource handle of the template file
+ * @param mixed $cache_id cache id to be used with this template
+ * @param mixed $compile_id compile id to be used with this template
+ * @param object $parent next higher level of Smarty variables
+ * @param boolean $do_clone flag is Smarty object shall be cloned
+ * @return object template object
*/
- function _compile_resource($resource_name, $compile_path)
+ public function createTemplate($template, $cache_id = null, $compile_id = null, $parent = null, $do_clone = true)
{
-
- $_params = array('resource_name' => $resource_name);
- if (!$this->_fetch_resource_info($_params)) {
- return false;
+ if (!empty($cache_id) && (is_object($cache_id) || is_array($cache_id))) {
+ $parent = $cache_id;
+ $cache_id = null;
}
-
- $_source_content = $_params['source_content'];
- $_cache_include = substr($compile_path, 0, -4).'.inc';
-
- if ($this->_compile_source($resource_name, $_source_content, $_compiled_content, $_cache_include)) {
- // if a _cache_serial was set, we also have to write an include-file:
- if ($this->_cache_include_info) {
- require_once(SMARTY_CORE_DIR . 'core.write_compiled_include.php');
- smarty_core_write_compiled_include(array_merge($this->_cache_include_info, array('compiled_content'=>$_compiled_content, 'resource_name'=>$resource_name)), $this);
- }
-
- $_params = array('compile_path'=>$compile_path, 'compiled_content' => $_compiled_content);
- require_once(SMARTY_CORE_DIR . 'core.write_compiled_resource.php');
- smarty_core_write_compiled_resource($_params, $this);
-
- return true;
+ if (!empty($parent) && is_array($parent)) {
+ $data = $parent;
+ $parent = null;
} else {
- return false;
+ $data = null;
}
-
- }
-
- /**
- * compile the given source
- *
- * @param string $resource_name
- * @param string $source_content
- * @param string $compiled_content
- * @return boolean
- */
- function _compile_source($resource_name, &$source_content, &$compiled_content, $cache_include_path=null)
- {
- if (file_exists(SMARTY_DIR . $this->compiler_file)) {
- require_once(SMARTY_DIR . $this->compiler_file);
+ // default to cache_id and compile_id of Smarty object
+ $cache_id = $cache_id === null ? $this->cache_id : $cache_id;
+ $compile_id = $compile_id === null ? $this->compile_id : $compile_id;
+ // already in template cache?
+ if ($this->allow_ambiguous_resources) {
+ $_templateId = Smarty_Resource::getUniqueTemplateName($this, $template) . $cache_id . $compile_id;
} else {
- // use include_path
- require_once($this->compiler_file);
- }
-
-
- $smarty_compiler = new $this->compiler_class;
-
- $smarty_compiler->template_dir = $this->template_dir;
- $smarty_compiler->compile_dir = $this->compile_dir;
- $smarty_compiler->plugins_dir = $this->plugins_dir;
- $smarty_compiler->config_dir = $this->config_dir;
- $smarty_compiler->force_compile = $this->force_compile;
- $smarty_compiler->caching = $this->caching;
- $smarty_compiler->php_handling = $this->php_handling;
- $smarty_compiler->left_delimiter = $this->left_delimiter;
- $smarty_compiler->right_delimiter = $this->right_delimiter;
- $smarty_compiler->_version = $this->_version;
- $smarty_compiler->security = $this->security;
- $smarty_compiler->secure_dir = $this->secure_dir;
- $smarty_compiler->security_settings = $this->security_settings;
- $smarty_compiler->trusted_dir = $this->trusted_dir;
- $smarty_compiler->use_sub_dirs = $this->use_sub_dirs;
- $smarty_compiler->_reg_objects = &$this->_reg_objects;
- $smarty_compiler->_plugins = &$this->_plugins;
- $smarty_compiler->_tpl_vars = &$this->_tpl_vars;
- $smarty_compiler->default_modifiers = $this->default_modifiers;
- $smarty_compiler->compile_id = $this->_compile_id;
- $smarty_compiler->_config = $this->_config;
- $smarty_compiler->request_use_auto_globals = $this->request_use_auto_globals;
-
- if (isset($cache_include_path) && isset($this->_cache_serials[$cache_include_path])) {
- $smarty_compiler->_cache_serial = $this->_cache_serials[$cache_include_path];
+ $_templateId = $this->joined_template_dir . '#' . $template . $cache_id . $compile_id;
}
- $smarty_compiler->_cache_include = $cache_include_path;
-
-
- $_results = $smarty_compiler->_compile_file($resource_name, $source_content, $compiled_content);
-
- if ($smarty_compiler->_cache_serial) {
- $this->_cache_include_info = array(
- 'cache_serial'=>$smarty_compiler->_cache_serial
- ,'plugins_code'=>$smarty_compiler->_plugins_code
- ,'include_file_path' => $cache_include_path);
-
- } else {
- $this->_cache_include_info = null;
-
+ if (isset($_templateId[150])) {
+ $_templateId = sha1($_templateId);
}
-
- return $_results;
- }
-
- /**
- * Get the compile path for this resource
- *
- * @param string $resource_name
- * @return string results of {@link _get_auto_filename()}
- */
- function _get_compile_path($resource_name)
- {
- return $this->_get_auto_filename($this->compile_dir, $resource_name,
- $this->_compile_id) . '.php';
- }
-
- /**
- * fetch the template info. Gets timestamp, and source
- * if get_source is true
- *
- * sets $source_content to the source of the template, and
- * $resource_timestamp to its time stamp
- * @param string $resource_name
- * @param string $source_content
- * @param integer $resource_timestamp
- * @param boolean $get_source
- * @param boolean $quiet
- * @return boolean
- */
-
- function _fetch_resource_info(&$params)
- {
- if(!isset($params['get_source'])) { $params['get_source'] = true; }
- if(!isset($params['quiet'])) { $params['quiet'] = false; }
-
- $_return = false;
- $_params = array('resource_name' => $params['resource_name']) ;
- if (isset($params['resource_base_path']))
- $_params['resource_base_path'] = $params['resource_base_path'];
- else
- $_params['resource_base_path'] = $this->template_dir;
-
- if ($this->_parse_resource_name($_params)) {
- $_resource_type = $_params['resource_type'];
- $_resource_name = $_params['resource_name'];
- switch ($_resource_type) {
- case 'file':
- if ($params['get_source']) {
- $params['source_content'] = $this->_read_file($_resource_name);
- }
- $params['resource_timestamp'] = filemtime($_resource_name);
- $_return = is_file($_resource_name) && is_readable($_resource_name);
- break;
-
- default:
- // call resource functions to fetch the template source and timestamp
- if ($params['get_source']) {
- $_source_return = isset($this->_plugins['resource'][$_resource_type]) &&
- call_user_func_array($this->_plugins['resource'][$_resource_type][0][0],
- array($_resource_name, &$params['source_content'], &$this));
- } else {
- $_source_return = true;
- }
-
- $_timestamp_return = isset($this->_plugins['resource'][$_resource_type]) &&
- call_user_func_array($this->_plugins['resource'][$_resource_type][0][1],
- array($_resource_name, &$params['resource_timestamp'], &$this));
-
- $_return = $_source_return && $_timestamp_return;
- break;
+ if ($do_clone) {
+ if (isset($this->template_objects[$_templateId])) {
+ // return cached template object
+ $tpl = clone $this->template_objects[$_templateId];
+ $tpl->smarty = clone $tpl->smarty;
+ $tpl->parent = $parent;
+ $tpl->tpl_vars = array();
+ $tpl->config_vars = array();
+ } else {
+ $tpl = new $this->template_class($template, clone $this, $parent, $cache_id, $compile_id);
}
- }
-
- if (!$_return) {
- // see if we can get a template with the default template handler
- if (!empty($this->default_template_handler_func)) {
- if (!is_callable($this->default_template_handler_func)) {
- $this->trigger_error("default template handler function \"$this->default_template_handler_func\" doesn't exist.");
- } else {
- $_return = call_user_func_array(
- $this->default_template_handler_func,
- array($_params['resource_type'], $_params['resource_name'], &$params['source_content'], &$params['resource_timestamp'], &$this));
- }
+ } else {
+ if (isset($this->template_objects[$_templateId])) {
+ // return cached template object
+ $tpl = $this->template_objects[$_templateId];
+ $tpl->parent = $parent;
+ $tpl->tpl_vars = array();
+ $tpl->config_vars = array();
+ } else {
+ $tpl = new $this->template_class($template, $this, $parent, $cache_id, $compile_id);
}
}
-
- if (!$_return) {
- if (!$params['quiet']) {
- $this->trigger_error('unable to read resource: "' . $params['resource_name'] . '"');
- }
- } else if ($_return && $this->security) {
- require_once(SMARTY_CORE_DIR . 'core.is_secure.php');
- if (!smarty_core_is_secure($_params, $this)) {
- if (!$params['quiet'])
- $this->trigger_error('(secure mode) accessing "' . $params['resource_name'] . '" is not allowed');
- $params['source_content'] = null;
- $params['resource_timestamp'] = null;
- return false;
+ // fill data if present
+ if (!empty($data) && is_array($data)) {
+ // set up variable values
+ foreach ($data as $_key => $_val) {
+ $tpl->tpl_vars[$_key] = new Smarty_variable($_val);
}
}
- return $_return;
+ return $tpl;
}
/**
- * parse out the type and name from the resource
+ * Takes unknown classes and loads plugin files for them
+ * class name format: Smarty_PluginType_PluginName
+ * plugin filename format: plugintype.pluginname.php
*
- * @param string $resource_base_path
- * @param string $resource_name
- * @param string $resource_type
- * @param string $resource_name
- * @return boolean
+ * @param string $plugin_name class plugin name to load
+ * @param bool $check check if already loaded
+ * @return string |boolean filepath of loaded file or false
*/
-
- function _parse_resource_name(&$params)
+ public function loadPlugin($plugin_name, $check = true)
{
-
- // split tpl_path by the first colon
- $_resource_name_parts = explode(':', $params['resource_name'], 2);
-
- if (count($_resource_name_parts) == 1) {
- // no resource type given
- $params['resource_type'] = $this->default_resource_type;
- $params['resource_name'] = $_resource_name_parts[0];
- } else {
- if(strlen($_resource_name_parts[0]) == 1) {
- // 1 char is not resource type, but part of filepath
- $params['resource_type'] = $this->default_resource_type;
- $params['resource_name'] = $params['resource_name'];
+ // if function or class exists, exit silently (already loaded)
+ if ($check && (is_callable($plugin_name) || class_exists($plugin_name, false))) {
+ return true;
+ }
+ // Plugin name is expected to be: Smarty_[Type]_[Name]
+ $_name_parts = explode('_', $plugin_name, 3);
+ // class name must have three parts to be valid plugin
+ // count($_name_parts) < 3 === !isset($_name_parts[2])
+ if (!isset($_name_parts[2]) || strtolower($_name_parts[0]) !== 'smarty') {
+ throw new SmartyException("plugin {$plugin_name} is not a valid name format");
+ return false;
+ }
+ // if type is "internal", get plugin from sysplugins
+ if (strtolower($_name_parts[1]) == 'internal') {
+ $file = SMARTY_SYSPLUGINS_DIR . strtolower($plugin_name) . '.php';
+ if (file_exists($file)) {
+ require_once($file);
+ return $file;
} else {
- $params['resource_type'] = $_resource_name_parts[0];
- $params['resource_name'] = $_resource_name_parts[1];
+ return false;
}
}
+ // plugin filename is expected to be: [type].[name].php
+ $_plugin_filename = "{$_name_parts[1]}.{$_name_parts[2]}.php";
- if ($params['resource_type'] == 'file') {
- if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $params['resource_name'])) {
- // relative pathname to $params['resource_base_path']
- // use the first directory where the file is found
- foreach ((array)$params['resource_base_path'] as $_curr_path) {
- $_fullpath = $_curr_path . DIRECTORY_SEPARATOR . $params['resource_name'];
- if (file_exists($_fullpath) && is_file($_fullpath)) {
- $params['resource_name'] = $_fullpath;
- return true;
+ $_stream_resolve_include_path = function_exists('stream_resolve_include_path');
+
+ // loop through plugin dirs and find the plugin
+ foreach($this->getPluginsDir() as $_plugin_dir) {
+ $names = array(
+ $_plugin_dir . $_plugin_filename,
+ $_plugin_dir . strtolower($_plugin_filename),
+ );
+ foreach ($names as $file) {
+ if (file_exists($file)) {
+ require_once($file);
+ return $file;
+ }
+ if ($this->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_plugin_dir)) {
+ // try PHP include_path
+ if ($_stream_resolve_include_path) {
+ $file = stream_resolve_include_path($file);
+ } else {
+ $file = Smarty_Internal_Get_Include_Path::getIncludePath($file);
}
- // didn't find the file, try include_path
- $_params = array('file_path' => $_fullpath);
- require_once(SMARTY_CORE_DIR . 'core.get_include_path.php');
- if(smarty_core_get_include_path($_params, $this)) {
- $params['resource_name'] = $_params['new_file_path'];
- return true;
+
+ if ($file !== false) {
+ require_once($file);
+ return $file;
}
}
- return false;
- } else {
- /* absolute path */
- return file_exists($params['resource_name']);
}
- } elseif (empty($this->_plugins['resource'][$params['resource_type']])) {
- $_params = array('type' => $params['resource_type']);
- require_once(SMARTY_CORE_DIR . 'core.load_resource_plugin.php');
- smarty_core_load_resource_plugin($_params, $this);
}
-
- return true;
+ // no plugin loaded
+ return false;
}
-
/**
- * Handle modifiers
+ * Compile all template files
*
- * @param string|null $modifier_name
- * @param array|null $map_array
- * @return string result of modifiers
+ * @param string $extension file extension
+ * @param bool $force_compile force all to recompile
+ * @param int $time_limit
+ * @param int $max_errors
+ * @return integer number of template files recompiled
*/
- function _run_mod_handler()
+ public function compileAllTemplates($extention = '.tpl', $force_compile = false, $time_limit = 0, $max_errors = null)
{
- $_args = func_get_args();
- list($_modifier_name, $_map_array) = array_splice($_args, 0, 2);
- list($_func_name, $_tpl_file, $_tpl_line) =
- $this->_plugins['modifier'][$_modifier_name];
-
- $_var = $_args[0];
- foreach ($_var as $_key => $_val) {
- $_args[0] = $_val;
- $_var[$_key] = call_user_func_array($_func_name, $_args);
- }
- return $_var;
+ return Smarty_Internal_Utility::compileAllTemplates($extention, $force_compile, $time_limit, $max_errors, $this);
}
/**
- * Remove starting and ending quotes from the string
+ * Compile all config files
*
- * @param string $string
- * @return string
+ * @param string $extension file extension
+ * @param bool $force_compile force all to recompile
+ * @param int $time_limit
+ * @param int $max_errors
+ * @return integer number of template files recompiled
*/
- function _dequote($string)
+ public function compileAllConfig($extention = '.conf', $force_compile = false, $time_limit = 0, $max_errors = null)
{
- if ((substr($string, 0, 1) == "'" || substr($string, 0, 1) == '"') &&
- substr($string, -1) == substr($string, 0, 1))
- return substr($string, 1, -1);
- else
- return $string;
+ return Smarty_Internal_Utility::compileAllConfig($extention, $force_compile, $time_limit, $max_errors, $this);
}
-
/**
- * read in a file
+ * Delete compiled template file
*
- * @param string $filename
- * @return string
+ * @param string $resource_name template name
+ * @param string $compile_id compile id
+ * @param integer $exp_time expiration time
+ * @return integer number of template files deleted
*/
- function _read_file($filename)
+ public function clearCompiledTemplate($resource_name = null, $compile_id = null, $exp_time = null)
{
- if ( file_exists($filename) && is_readable($filename) && ($fd = @fopen($filename, 'rb')) ) {
- $contents = '';
- while (!feof($fd)) {
- $contents .= fread($fd, 8192);
- }
- fclose($fd);
- return $contents;
- } else {
- return false;
- }
+ return Smarty_Internal_Utility::clearCompiledTemplate($resource_name, $compile_id, $exp_time, $this);
}
- /**
- * get a concrete filename for automagically created content
- *
- * @param string $auto_base
- * @param string $auto_source
- * @param string $auto_id
- * @return string
- * @staticvar string|null
- * @staticvar string|null
- */
- function _get_auto_filename($auto_base, $auto_source = null, $auto_id = null)
- {
- $_compile_dir_sep = $this->use_sub_dirs ? DIRECTORY_SEPARATOR : '^';
- $_return = $auto_base . DIRECTORY_SEPARATOR;
-
- if(isset($auto_id)) {
- // make auto_id safe for directory names
- $auto_id = str_replace('%7C',$_compile_dir_sep,(urlencode($auto_id)));
- // split into separate directories
- $_return .= $auto_id . $_compile_dir_sep;
- }
-
- if(isset($auto_source)) {
- // make source name safe for filename
- $_filename = urlencode(basename($auto_source));
- $_crc32 = sprintf('%08X', crc32($auto_source));
- // prepend %% to avoid name conflicts with
- // with $params['auto_id'] names
- $_crc32 = substr($_crc32, 0, 2) . $_compile_dir_sep .
- substr($_crc32, 0, 3) . $_compile_dir_sep . $_crc32;
- $_return .= '%%' . $_crc32 . '%%' . $_filename;
- }
-
- return $_return;
- }
/**
- * unlink a file, possibly using expiration time
+ * Return array of tag/attributes of all tags used by an template
*
- * @param string $resource
- * @param integer $exp_time
+ * @param object $templae template object
+ * @return array of tag/attributes
*/
- function _unlink($resource, $exp_time = null)
+ public function getTags(Smarty_Internal_Template $template)
{
- if(isset($exp_time)) {
- if(time() - @filemtime($resource) >= $exp_time) {
- return @unlink($resource);
- }
- } else {
- return @unlink($resource);
- }
- }
-
- /**
- * returns an auto_id for auto-file-functions
- *
- * @param string $cache_id
- * @param string $compile_id
- * @return string|null
- */
- function _get_auto_id($cache_id=null, $compile_id=null) {
- if (isset($cache_id))
- return (isset($compile_id)) ? $cache_id . '|' . $compile_id : $cache_id;
- elseif(isset($compile_id))
- return $compile_id;
- else
- return null;
+ return Smarty_Internal_Utility::getTags($template);
}
/**
- * trigger Smarty plugin error
+ * Run installation test
*
- * @param string $error_msg
- * @param string $tpl_file
- * @param integer $tpl_line
- * @param string $file
- * @param integer $line
- * @param integer $error_type
- */
- function _trigger_fatal_error($error_msg, $tpl_file = null, $tpl_line = null,
- $file = null, $line = null, $error_type = E_USER_ERROR)
- {
- if(isset($file) && isset($line)) {
- $info = ' ('.basename($file).", line $line)";
- } else {
- $info = '';
- }
- if (isset($tpl_line) && isset($tpl_file)) {
- $this->trigger_error('[in ' . $tpl_file . ' line ' . $tpl_line . "]: $error_msg$info", $error_type);
- } else {
- $this->trigger_error($error_msg . $info, $error_type);
- }
- }
-
-
- /**
- * callback function for preg_replace, to call a non-cacheable block
- * @return string
+ * @param array $errors Array to write errors into, rather than outputting them
+ * @return boolean true if setup is fine, false if something is wrong
*/
- function _process_compiled_include_callback($match) {
- $_func = '_smarty_tplfunc_'.$match[2].'_'.$match[3];
- ob_start();
- $_func($this);
- $_ret = ob_get_contents();
- ob_end_clean();
- return $_ret;
+ public function testInstall(&$errors=null)
+ {
+ return Smarty_Internal_Utility::testInstall($this, $errors);
}
-
/**
- * called for included templates
+ * Error Handler to mute expected messages
*
- * @param string $_smarty_include_tpl_file
- * @param string $_smarty_include_vars
+ * @link http://php.net/set_error_handler
+ * @param integer $errno Error level
+ * @return boolean
*/
-
- // $_smarty_include_tpl_file, $_smarty_include_vars
-
- function _smarty_include($params)
+ public static function mutingErrorHandler($errno, $errstr, $errfile, $errline, $errcontext)
{
- if ($this->debugging) {
- $_params = array();
- require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
- $debug_start_time = smarty_core_get_microtime($_params, $this);
- $this->_smarty_debug_info[] = array('type' => 'template',
- 'filename' => $params['smarty_include_tpl_file'],
- 'depth' => ++$this->_inclusion_depth);
- $included_tpls_idx = count($this->_smarty_debug_info) - 1;
- }
-
- $this->_tpl_vars = array_merge($this->_tpl_vars, $params['smarty_include_vars']);
-
- // config vars are treated as local, so push a copy of the
- // current ones onto the front of the stack
- array_unshift($this->_config, $this->_config[0]);
-
- $_smarty_compile_path = $this->_get_compile_path($params['smarty_include_tpl_file']);
-
-
- if ($this->_is_compiled($params['smarty_include_tpl_file'], $_smarty_compile_path)
- || $this->_compile_resource($params['smarty_include_tpl_file'], $_smarty_compile_path))
- {
- include($_smarty_compile_path);
- }
-
- // pop the local vars off the front of the stack
- array_shift($this->_config);
-
- $this->_inclusion_depth--;
-
- if ($this->debugging) {
- // capture time for debugging info
- $_params = array();
- require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
- $this->_smarty_debug_info[$included_tpls_idx]['exec_time'] = smarty_core_get_microtime($_params, $this) - $debug_start_time;
+ $_is_muted_directory = false;
+
+ // add the SMARTY_DIR to the list of muted directories
+ if (!isset(Smarty::$_muted_directories[SMARTY_DIR])) {
+ $smarty_dir = realpath(SMARTY_DIR);
+ if ($smarty_dir !== false) {
+ Smarty::$_muted_directories[SMARTY_DIR] = array(
+ 'file' => $smarty_dir,
+ 'length' => strlen($smarty_dir),
+ );
+ }
}
- if ($this->caching) {
- $this->_cache_info['template'][$params['smarty_include_tpl_file']] = true;
+ // walk the muted directories and test against $errfile
+ foreach (Smarty::$_muted_directories as $key => &$dir) {
+ if (!$dir) {
+ // resolve directory and length for speedy comparisons
+ $file = realpath($key);
+ if ($file === false) {
+ // this directory does not exist, remove and skip it
+ unset(Smarty::$_muted_directories[$key]);
+ continue;
+ }
+ $dir = array(
+ 'file' => $file,
+ 'length' => strlen($file),
+ );
+ }
+ if (!strncmp($errfile, $dir['file'], $dir['length'])) {
+ $_is_muted_directory = true;
+ break;
+ }
}
- }
-
-
- /**
- * get or set an array of cached attributes for function that is
- * not cacheable
- * @return array
- */
- function &_smarty_cache_attrs($cache_serial, $count) {
- $_cache_attrs =& $this->_cache_info['cache_attrs'][$cache_serial][$count];
-
- if ($this->_cache_including) {
- /* return next set of cache_attrs */
- $_return = current($_cache_attrs);
- next($_cache_attrs);
- return $_return;
-
- } else {
- /* add a reference to a new set of cache_attrs */
- $_cache_attrs[] = array();
- return $_cache_attrs[count($_cache_attrs)-1];
+ // pass to next error handler if this error did not occur inside SMARTY_DIR
+ // or the error was within smarty but masked to be ignored
+ if (!$_is_muted_directory || ($errno && $errno & error_reporting())) {
+ if (Smarty::$_previous_error_handler) {
+ return call_user_func(Smarty::$_previous_error_handler, $errno, $errstr, $errfile, $errline, $errcontext);
+ } else {
+ return false;
+ }
}
-
}
-
/**
- * wrapper for include() retaining $this
- * @return mixed
+ * Enable error handler to mute expected messages
+ *
+ * @return void
*/
- function _include($filename, $once=false, $params=null)
+ public static function muteExpectedErrors()
{
- if ($once) {
- return include_once($filename);
- } else {
- return include($filename);
+ /*
+ error muting is done because some people implemented custom error_handlers using
+ http://php.net/set_error_handler and for some reason did not understand the following paragraph:
+
+ It is important to remember that the standard PHP error handler is completely bypassed for the
+ error types specified by error_types unless the callback function returns FALSE.
+ error_reporting() settings will have no effect and your error handler will be called regardless -
+ however you are still able to read the current value of error_reporting and act appropriately.
+ Of particular note is that this value will be 0 if the statement that caused the error was
+ prepended by the @ error-control operator.
+
+ Smarty deliberately uses @filemtime() over file_exists() and filemtime() in some places. Reasons include
+ - @filemtime() is almost twice as fast as using an additional file_exists()
+ - between file_exists() and filemtime() a possible race condition is opened,
+ which does not exist using the simple @filemtime() approach.
+ */
+ $error_handler = array('Smarty', 'mutingErrorHandler');
+ $previous = set_error_handler($error_handler);
+
+ // avoid dead loops
+ if ($previous !== $error_handler) {
+ Smarty::$_previous_error_handler = $previous;
}
}
-
/**
- * wrapper for eval() retaining $this
- * @return mixed
+ * Disable error handler muting expected messages
+ *
+ * @return void
*/
- function _eval($code, $params=null)
+ public static function unmuteExpectedErrors()
{
- return eval($code);
+ restore_error_handler();
}
+}
- /**
- * Extracts the filter name from the given callback
- *
- * @param callback $function
- * @return string
- */
- function _get_filter_name($function)
- {
- if (is_array($function)) {
- $_class_name = (is_object($function[0]) ?
- get_class($function[0]) : $function[0]);
- return $_class_name . '_' . $function[1];
- }
- else {
- return $function;
- }
- }
+// Check if we're running on windows
+Smarty::$_IS_WINDOWS = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN';
- /**#@-*/
+// let PCRE (preg_*) treat strings as ISO-8859-1 if we're not dealing with UTF-8
+if (Smarty::$_CHARSET !== 'UTF-8') {
+ Smarty::$_UTF8_MODIFIER = '';
+}
+/**
+ * Smarty exception class
+ * @package Smarty
+ */
+class SmartyException extends Exception {
+ public static $escape = true;
+ public function __construct($message) {
+ $this->message = self::$escape ? htmlentities($message) : $message;
+ }
}
-/* vim: set expandtab: */
+/**
+ * Smarty compiler exception class
+ * @package Smarty
+ */
+class SmartyCompilerException extends SmartyException {
+}
+
+/**
+ * Autoloader
+ */
+function smartyAutoload($class)
+{
+ $_class = strtolower($class);
+ $_classes = array(
+ 'smarty_config_source' => true,
+ 'smarty_config_compiled' => true,
+ 'smarty_security' => true,
+ 'smarty_cacheresource' => true,
+ 'smarty_cacheresource_custom' => true,
+ 'smarty_cacheresource_keyvaluestore' => true,
+ 'smarty_resource' => true,
+ 'smarty_resource_custom' => true,
+ 'smarty_resource_uncompiled' => true,
+ 'smarty_resource_recompiled' => true,
+ );
+
+ if (!strncmp($_class, 'smarty_internal_', 16) || isset($_classes[$_class])) {
+ include SMARTY_SYSPLUGINS_DIR . $_class . '.php';
+ }
+}
?>
diff --git a/include/smarty/libs/SmartyBC.class.php b/include/smarty/libs/SmartyBC.class.php
new file mode 100644
index 000000000..589dcca27
--- /dev/null
+++ b/include/smarty/libs/SmartyBC.class.php
@@ -0,0 +1,460 @@
+<?php
+/**
+ * Project: Smarty: the PHP compiling template engine
+ * File: SmartyBC.class.php
+ * SVN: $Id: $
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * For questions, help, comments, discussion, etc., please join the
+ * Smarty mailing list. Send a blank e-mail to
+ * smarty-discussion-subscribe@googlegroups.com
+ *
+ * @link http://www.smarty.net/
+ * @copyright 2008 New Digital Group, Inc.
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @author Uwe Tews
+ * @author Rodney Rehm
+ * @package Smarty
+ */
+/**
+ * @ignore
+ */
+require(dirname(__FILE__) . '/Smarty.class.php');
+
+/**
+ * Smarty Backward Compatability Wrapper Class
+ *
+ * @package Smarty
+ */
+class SmartyBC extends Smarty {
+
+ /**
+ * Smarty 2 BC
+ * @var string
+ */
+ public $_version = self::SMARTY_VERSION;
+
+ /**
+ * Initialize new SmartyBC object
+ *
+ * @param array $options options to set during initialization, e.g. array( 'forceCompile' => false )
+ */
+ public function __construct(array $options=array())
+ {
+ parent::__construct($options);
+ // register {php} tag
+ $this->registerPlugin('block', 'php', 'smarty_php_tag');
+ }
+
+ /**
+ * wrapper for assign_by_ref
+ *
+ * @param string $tpl_var the template variable name
+ * @param mixed &$value the referenced value to assign
+ */
+ public function assign_by_ref($tpl_var, &$value)
+ {
+ $this->assignByRef($tpl_var, $value);
+ }
+
+ /**
+ * wrapper for append_by_ref
+ *
+ * @param string $tpl_var the template variable name
+ * @param mixed &$value the referenced value to append
+ * @param boolean $merge flag if array elements shall be merged
+ */
+ public function append_by_ref($tpl_var, &$value, $merge = false)
+ {
+ $this->appendByRef($tpl_var, $value, $merge);
+ }
+
+ /**
+ * clear the given assigned template variable.
+ *
+ * @param string $tpl_var the template variable to clear
+ */
+ public function clear_assign($tpl_var)
+ {
+ $this->clearAssign($tpl_var);
+ }
+
+ /**
+ * Registers custom function to be used in templates
+ *
+ * @param string $function the name of the template function
+ * @param string $function_impl the name of the PHP function to register
+ * @param bool $cacheable
+ * @param mixed $cache_attrs
+ */
+ public function register_function($function, $function_impl, $cacheable=true, $cache_attrs=null)
+ {
+ $this->registerPlugin('function', $function, $function_impl, $cacheable, $cache_attrs);
+ }
+
+ /**
+ * Unregisters custom function
+ *
+ * @param string $function name of template function
+ */
+ public function unregister_function($function)
+ {
+ $this->unregisterPlugin('function', $function);
+ }
+
+ /**
+ * Registers object to be used in templates
+ *
+ * @param string $object name of template object
+ * @param object $object_impl the referenced PHP object to register
+ * @param array $allowed list of allowed methods (empty = all)
+ * @param boolean $smarty_args smarty argument format, else traditional
+ * @param array $block_functs list of methods that are block format
+ */
+ public function register_object($object, $object_impl, $allowed = array(), $smarty_args = true, $block_methods = array())
+ {
+ settype($allowed, 'array');
+ settype($smarty_args, 'boolean');
+ $this->registerObject($object, $object_impl, $allowed, $smarty_args, $block_methods);
+ }
+
+ /**
+ * Unregisters object
+ *
+ * @param string $object name of template object
+ */
+ public function unregister_object($object)
+ {
+ $this->unregisterObject($object);
+ }
+
+ /**
+ * Registers block function to be used in templates
+ *
+ * @param string $block name of template block
+ * @param string $block_impl PHP function to register
+ * @param bool $cacheable
+ * @param mixed $cache_attrs
+ */
+ public function register_block($block, $block_impl, $cacheable=true, $cache_attrs=null)
+ {
+ $this->registerPlugin('block', $block, $block_impl, $cacheable, $cache_attrs);
+ }
+
+ /**
+ * Unregisters block function
+ *
+ * @param string $block name of template function
+ */
+ public function unregister_block($block)
+ {
+ $this->unregisterPlugin('block', $block);
+ }
+
+ /**
+ * Registers compiler function
+ *
+ * @param string $function name of template function
+ * @param string $function_impl name of PHP function to register
+ * @param bool $cacheable
+ */
+ public function register_compiler_function($function, $function_impl, $cacheable=true)
+ {
+ $this->registerPlugin('compiler', $function, $function_impl, $cacheable);
+ }
+
+ /**
+ * Unregisters compiler function
+ *
+ * @param string $function name of template function
+ */
+ public function unregister_compiler_function($function)
+ {
+ $this->unregisterPlugin('compiler', $function);
+ }
+
+ /**
+ * Registers modifier to be used in templates
+ *
+ * @param string $modifier name of template modifier
+ * @param string $modifier_impl name of PHP function to register
+ */
+ public function register_modifier($modifier, $modifier_impl)
+ {
+ $this->registerPlugin('modifier', $modifier, $modifier_impl);
+ }
+
+ /**
+ * Unregisters modifier
+ *
+ * @param string $modifier name of template modifier
+ */
+ public function unregister_modifier($modifier)
+ {
+ $this->unregisterPlugin('modifier', $modifier);
+ }
+
+ /**
+ * Registers a resource to fetch a template
+ *
+ * @param string $type name of resource
+ * @param array $functions array of functions to handle resource
+ */
+ public function register_resource($type, $functions)
+ {
+ $this->registerResource($type, $functions);
+ }
+
+ /**
+ * Unregisters a resource
+ *
+ * @param string $type name of resource
+ */
+ public function unregister_resource($type)
+ {
+ $this->unregisterResource($type);
+ }
+
+ /**
+ * Registers a prefilter function to apply
+ * to a template before compiling
+ *
+ * @param callable $function
+ */
+ public function register_prefilter($function)
+ {
+ $this->registerFilter('pre', $function);
+ }
+
+ /**
+ * Unregisters a prefilter function
+ *
+ * @param callable $function
+ */
+ public function unregister_prefilter($function)
+ {
+ $this->unregisterFilter('pre', $function);
+ }
+
+ /**
+ * Registers a postfilter function to apply
+ * to a compiled template after compilation
+ *
+ * @param callable $function
+ */
+ public function register_postfilter($function)
+ {
+ $this->registerFilter('post', $function);
+ }
+
+ /**
+ * Unregisters a postfilter function
+ *
+ * @param callable $function
+ */
+ public function unregister_postfilter($function)
+ {
+ $this->unregisterFilter('post', $function);
+ }
+
+ /**
+ * Registers an output filter function to apply
+ * to a template output
+ *
+ * @param callable $function
+ */
+ public function register_outputfilter($function)
+ {
+ $this->registerFilter('output', $function);
+ }
+
+ /**
+ * Unregisters an outputfilter function
+ *
+ * @param callable $function
+ */
+ public function unregister_outputfilter($function)
+ {
+ $this->unregisterFilter('output', $function);
+ }
+
+ /**
+ * load a filter of specified type and name
+ *
+ * @param string $type filter type
+ * @param string $name filter name
+ */
+ public function load_filter($type, $name)
+ {
+ $this->loadFilter($type, $name);
+ }
+
+ /**
+ * clear cached content for the given template and cache id
+ *
+ * @param string $tpl_file name of template file
+ * @param string $cache_id name of cache_id
+ * @param string $compile_id name of compile_id
+ * @param string $exp_time expiration time
+ * @return boolean
+ */
+ public function clear_cache($tpl_file = null, $cache_id = null, $compile_id = null, $exp_time = null)
+ {
+ return $this->clearCache($tpl_file, $cache_id, $compile_id, $exp_time);
+ }
+
+ /**
+ * clear the entire contents of cache (all templates)
+ *
+ * @param string $exp_time expire time
+ * @return boolean
+ */
+ public function clear_all_cache($exp_time = null)
+ {
+ return $this->clearCache(null, null, null, $exp_time);
+ }
+
+ /**
+ * test to see if valid cache exists for this template
+ *
+ * @param string $tpl_file name of template file
+ * @param string $cache_id
+ * @param string $compile_id
+ * @return boolean
+ */
+ public function is_cached($tpl_file, $cache_id = null, $compile_id = null)
+ {
+ return $this->isCached($tpl_file, $cache_id, $compile_id);
+ }
+
+ /**
+ * clear all the assigned template variables.
+ */
+ public function clear_all_assign()
+ {
+ $this->clearAllAssign();
+ }
+
+ /**
+ * clears compiled version of specified template resource,
+ * or all compiled template files if one is not specified.
+ * This function is for advanced use only, not normally needed.
+ *
+ * @param string $tpl_file
+ * @param string $compile_id
+ * @param string $exp_time
+ * @return boolean results of {@link smarty_core_rm_auto()}
+ */
+ public function clear_compiled_tpl($tpl_file = null, $compile_id = null, $exp_time = null)
+ {
+ return $this->clearCompiledTemplate($tpl_file, $compile_id, $exp_time);
+ }
+
+ /**
+ * Checks whether requested template exists.
+ *
+ * @param string $tpl_file
+ * @return boolean
+ */
+ public function template_exists($tpl_file)
+ {
+ return $this->templateExists($tpl_file);
+ }
+
+ /**
+ * Returns an array containing template variables
+ *
+ * @param string $name
+ * @return array
+ */
+ public function get_template_vars($name=null)
+ {
+ return $this->getTemplateVars($name);
+ }
+
+ /**
+ * Returns an array containing config variables
+ *
+ * @param string $name
+ * @return array
+ */
+ public function get_config_vars($name=null)
+ {
+ return $this->getConfigVars($name);
+ }
+
+ /**
+ * load configuration values
+ *
+ * @param string $file
+ * @param string $section
+ * @param string $scope
+ */
+ public function config_load($file, $section = null, $scope = 'global')
+ {
+ $this->ConfigLoad($file, $section, $scope);
+ }
+
+ /**
+ * return a reference to a registered object
+ *
+ * @param string $name
+ * @return object
+ */
+ public function get_registered_object($name)
+ {
+ return $this->getRegisteredObject($name);
+ }
+
+ /**
+ * clear configuration values
+ *
+ * @param string $var
+ */
+ public function clear_config($var = null)
+ {
+ $this->clearConfig($var);
+ }
+
+ /**
+ * trigger Smarty error
+ *
+ * @param string $error_msg
+ * @param integer $error_type
+ */
+ public function trigger_error($error_msg, $error_type = E_USER_WARNING)
+ {
+ trigger_error("Smarty error: $error_msg", $error_type);
+ }
+
+}
+
+/**
+ * Smarty {php}{/php} block function
+ *
+ * @param array $params parameter list
+ * @param string $content contents of the block
+ * @param object $template template object
+ * @param boolean &$repeat repeat flag
+ * @return string content re-formatted
+ */
+function smarty_php_tag($params, $content, $template, &$repeat)
+{
+ eval($content);
+ return '';
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/Smarty_Compiler.class.php b/include/smarty/libs/Smarty_Compiler.class.php
deleted file mode 100644
index 62a467bea..000000000
--- a/include/smarty/libs/Smarty_Compiler.class.php
+++ /dev/null
@@ -1,2365 +0,0 @@
-<?php
-
-/**
- * Project: Smarty: the PHP compiling template engine
- * File: Smarty_Compiler.class.php
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * @link http://smarty.php.net/
- * @author Monte Ohrt <monte at ohrt dot com>
- * @author Andrei Zmievski <andrei@php.net>
- * @version 2.6.26
- * @copyright 2001-2005 New Digital Group, Inc.
- * @package Smarty
- */
-
-/* $Id: Smarty_Compiler.class.php 3163 2009-06-17 14:39:24Z monte.ohrt $ */
-
-/**
- * Template compiling class
- * @package Smarty
- */
-class Smarty_Compiler extends Smarty {
-
- // internal vars
- /**#@+
- * @access private
- */
- var $_folded_blocks = array(); // keeps folded template blocks
- var $_current_file = null; // the current template being compiled
- var $_current_line_no = 1; // line number for error messages
- var $_capture_stack = array(); // keeps track of nested capture buffers
- var $_plugin_info = array(); // keeps track of plugins to load
- var $_init_smarty_vars = false;
- var $_permitted_tokens = array('true','false','yes','no','on','off','null');
- var $_db_qstr_regexp = null; // regexps are setup in the constructor
- var $_si_qstr_regexp = null;
- var $_qstr_regexp = null;
- var $_func_regexp = null;
- var $_reg_obj_regexp = null;
- var $_var_bracket_regexp = null;
- var $_num_const_regexp = null;
- var $_dvar_guts_regexp = null;
- var $_dvar_regexp = null;
- var $_cvar_regexp = null;
- var $_svar_regexp = null;
- var $_avar_regexp = null;
- var $_mod_regexp = null;
- var $_var_regexp = null;
- var $_parenth_param_regexp = null;
- var $_func_call_regexp = null;
- var $_obj_ext_regexp = null;
- var $_obj_start_regexp = null;
- var $_obj_params_regexp = null;
- var $_obj_call_regexp = null;
- var $_cacheable_state = 0;
- var $_cache_attrs_count = 0;
- var $_nocache_count = 0;
- var $_cache_serial = null;
- var $_cache_include = null;
-
- var $_strip_depth = 0;
- var $_additional_newline = "\n";
-
- /**#@-*/
- /**
- * The class constructor.
- */
- function Smarty_Compiler()
- {
- // matches double quoted strings:
- // "foobar"
- // "foo\"bar"
- $this->_db_qstr_regexp = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"';
-
- // matches single quoted strings:
- // 'foobar'
- // 'foo\'bar'
- $this->_si_qstr_regexp = '\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'';
-
- // matches single or double quoted strings
- $this->_qstr_regexp = '(?:' . $this->_db_qstr_regexp . '|' . $this->_si_qstr_regexp . ')';
-
- // matches bracket portion of vars
- // [0]
- // [foo]
- // [$bar]
- $this->_var_bracket_regexp = '\[\$?[\w\.]+\]';
-
- // matches numerical constants
- // 30
- // -12
- // 13.22
- $this->_num_const_regexp = '(?:\-?\d+(?:\.\d+)?)';
-
- // matches $ vars (not objects):
- // $foo
- // $foo.bar
- // $foo.bar.foobar
- // $foo[0]
- // $foo[$bar]
- // $foo[5][blah]
- // $foo[5].bar[$foobar][4]
- $this->_dvar_math_regexp = '(?:[\+\*\/\%]|(?:-(?!>)))';
- $this->_dvar_math_var_regexp = '[\$\w\.\+\-\*\/\%\d\>\[\]]';
- $this->_dvar_guts_regexp = '\w+(?:' . $this->_var_bracket_regexp
- . ')*(?:\.\$?\w+(?:' . $this->_var_bracket_regexp . ')*)*(?:' . $this->_dvar_math_regexp . '(?:' . $this->_num_const_regexp . '|' . $this->_dvar_math_var_regexp . ')*)?';
- $this->_dvar_regexp = '\$' . $this->_dvar_guts_regexp;
-
- // matches config vars:
- // #foo#
- // #foobar123_foo#
- $this->_cvar_regexp = '\#\w+\#';
-
- // matches section vars:
- // %foo.bar%
- $this->_svar_regexp = '\%\w+\.\w+\%';
-
- // matches all valid variables (no quotes, no modifiers)
- $this->_avar_regexp = '(?:' . $this->_dvar_regexp . '|'
- . $this->_cvar_regexp . '|' . $this->_svar_regexp . ')';
-
- // matches valid variable syntax:
- // $foo
- // $foo
- // #foo#
- // #foo#
- // "text"
- // "text"
- $this->_var_regexp = '(?:' . $this->_avar_regexp . '|' . $this->_qstr_regexp . ')';
-
- // matches valid object call (one level of object nesting allowed in parameters):
- // $foo->bar
- // $foo->bar()
- // $foo->bar("text")
- // $foo->bar($foo, $bar, "text")
- // $foo->bar($foo, "foo")
- // $foo->bar->foo()
- // $foo->bar->foo->bar()
- // $foo->bar($foo->bar)
- // $foo->bar($foo->bar())
- // $foo->bar($foo->bar($blah,$foo,44,"foo",$foo[0].bar))
- $this->_obj_ext_regexp = '\->(?:\$?' . $this->_dvar_guts_regexp . ')';
- $this->_obj_restricted_param_regexp = '(?:'
- . '(?:' . $this->_var_regexp . '|' . $this->_num_const_regexp . ')(?:' . $this->_obj_ext_regexp . '(?:\((?:(?:' . $this->_var_regexp . '|' . $this->_num_const_regexp . ')'
- . '(?:\s*,\s*(?:' . $this->_var_regexp . '|' . $this->_num_const_regexp . '))*)?\))?)*)';
- $this->_obj_single_param_regexp = '(?:\w+|' . $this->_obj_restricted_param_regexp . '(?:\s*,\s*(?:(?:\w+|'
- . $this->_var_regexp . $this->_obj_restricted_param_regexp . ')))*)';
- $this->_obj_params_regexp = '\((?:' . $this->_obj_single_param_regexp
- . '(?:\s*,\s*' . $this->_obj_single_param_regexp . ')*)?\)';
- $this->_obj_start_regexp = '(?:' . $this->_dvar_regexp . '(?:' . $this->_obj_ext_regexp . ')+)';
- $this->_obj_call_regexp = '(?:' . $this->_obj_start_regexp . '(?:' . $this->_obj_params_regexp . ')?(?:' . $this->_dvar_math_regexp . '(?:' . $this->_num_const_regexp . '|' . $this->_dvar_math_var_regexp . ')*)?)';
-
- // matches valid modifier syntax:
- // |foo
- // |@foo
- // |foo:"bar"
- // |foo:$bar
- // |foo:"bar":$foobar
- // |foo|bar
- // |foo:$foo->bar
- $this->_mod_regexp = '(?:\|@?\w+(?::(?:\w+|' . $this->_num_const_regexp . '|'
- . $this->_obj_call_regexp . '|' . $this->_avar_regexp . '|' . $this->_qstr_regexp .'))*)';
-
- // matches valid function name:
- // foo123
- // _foo_bar
- $this->_func_regexp = '[a-zA-Z_]\w*';
-
- // matches valid registered object:
- // foo->bar
- $this->_reg_obj_regexp = '[a-zA-Z_]\w*->[a-zA-Z_]\w*';
-
- // matches valid parameter values:
- // true
- // $foo
- // $foo|bar
- // #foo#
- // #foo#|bar
- // "text"
- // "text"|bar
- // $foo->bar
- $this->_param_regexp = '(?:\s*(?:' . $this->_obj_call_regexp . '|'
- . $this->_var_regexp . '|' . $this->_num_const_regexp . '|\w+)(?>' . $this->_mod_regexp . '*)\s*)';
-
- // matches valid parenthesised function parameters:
- //
- // "text"
- // $foo, $bar, "text"
- // $foo|bar, "foo"|bar, $foo->bar($foo)|bar
- $this->_parenth_param_regexp = '(?:\((?:\w+|'
- . $this->_param_regexp . '(?:\s*,\s*(?:(?:\w+|'
- . $this->_param_regexp . ')))*)?\))';
-
- // matches valid function call:
- // foo()
- // foo_bar($foo)
- // _foo_bar($foo,"bar")
- // foo123($foo,$foo->bar(),"foo")
- $this->_func_call_regexp = '(?:' . $this->_func_regexp . '\s*(?:'
- . $this->_parenth_param_regexp . '))';
- }
-
- /**
- * compile a resource
- *
- * sets $compiled_content to the compiled source
- * @param string $resource_name
- * @param string $source_content
- * @param string $compiled_content
- * @return true
- */
- function _compile_file($resource_name, $source_content, &$compiled_content)
- {
-
- if ($this->security) {
- // do not allow php syntax to be executed unless specified
- if ($this->php_handling == SMARTY_PHP_ALLOW &&
- !$this->security_settings['PHP_HANDLING']) {
- $this->php_handling = SMARTY_PHP_PASSTHRU;
- }
- }
-
- $this->_load_filters();
-
- $this->_current_file = $resource_name;
- $this->_current_line_no = 1;
- $ldq = preg_quote($this->left_delimiter, '~');
- $rdq = preg_quote($this->right_delimiter, '~');
-
- // run template source through prefilter functions
- if (count($this->_plugins['prefilter']) > 0) {
- foreach ($this->_plugins['prefilter'] as $filter_name => $prefilter) {
- if ($prefilter === false) continue;
- if ($prefilter[3] || is_callable($prefilter[0])) {
- $source_content = call_user_func_array($prefilter[0],
- array($source_content, &$this));
- $this->_plugins['prefilter'][$filter_name][3] = true;
- } else {
- $this->_trigger_fatal_error("[plugin] prefilter '$filter_name' is not implemented");
- }
- }
- }
-
- /* fetch all special blocks */
- $search = "~{$ldq}\*(.*?)\*{$rdq}|{$ldq}\s*literal\s*{$rdq}(.*?){$ldq}\s*/literal\s*{$rdq}|{$ldq}\s*php\s*{$rdq}(.*?){$ldq}\s*/php\s*{$rdq}~s";
-
- preg_match_all($search, $source_content, $match, PREG_SET_ORDER);
- $this->_folded_blocks = $match;
- reset($this->_folded_blocks);
-
- /* replace special blocks by "{php}" */
- $source_content = preg_replace($search.'e', "'"
- . $this->_quote_replace($this->left_delimiter) . 'php'
- . "' . str_repeat(\"\n\", substr_count('\\0', \"\n\")) .'"
- . $this->_quote_replace($this->right_delimiter)
- . "'"
- , $source_content);
-
- /* Gather all template tags. */
- preg_match_all("~{$ldq}\s*(.*?)\s*{$rdq}~s", $source_content, $_match);
- $template_tags = $_match[1];
- /* Split content by template tags to obtain non-template content. */
- $text_blocks = preg_split("~{$ldq}.*?{$rdq}~s", $source_content);
-
- /* loop through text blocks */
- for ($curr_tb = 0, $for_max = count($text_blocks); $curr_tb < $for_max; $curr_tb++) {
- /* match anything resembling php tags */
- if (preg_match_all('~(<\?(?:\w+|=)?|\?>|language\s*=\s*[\"\']?\s*php\s*[\"\']?)~is', $text_blocks[$curr_tb], $sp_match)) {
- /* replace tags with placeholders to prevent recursive replacements */
- $sp_match[1] = array_unique($sp_match[1]);
- usort($sp_match[1], '_smarty_sort_length');
- for ($curr_sp = 0, $for_max2 = count($sp_match[1]); $curr_sp < $for_max2; $curr_sp++) {
- $text_blocks[$curr_tb] = str_replace($sp_match[1][$curr_sp],'%%%SMARTYSP'.$curr_sp.'%%%',$text_blocks[$curr_tb]);
- }
- /* process each one */
- for ($curr_sp = 0, $for_max2 = count($sp_match[1]); $curr_sp < $for_max2; $curr_sp++) {
- if ($this->php_handling == SMARTY_PHP_PASSTHRU) {
- /* echo php contents */
- $text_blocks[$curr_tb] = str_replace('%%%SMARTYSP'.$curr_sp.'%%%', '<?php echo \''.str_replace("'", "\'", $sp_match[1][$curr_sp]).'\'; ?>'."\n", $text_blocks[$curr_tb]);
- } else if ($this->php_handling == SMARTY_PHP_QUOTE) {
- /* quote php tags */
- $text_blocks[$curr_tb] = str_replace('%%%SMARTYSP'.$curr_sp.'%%%', htmlspecialchars($sp_match[1][$curr_sp]), $text_blocks[$curr_tb]);
- } else if ($this->php_handling == SMARTY_PHP_REMOVE) {
- /* remove php tags */
- $text_blocks[$curr_tb] = str_replace('%%%SMARTYSP'.$curr_sp.'%%%', '', $text_blocks[$curr_tb]);
- } else {
- /* SMARTY_PHP_ALLOW, but echo non php starting tags */
- $sp_match[1][$curr_sp] = preg_replace('~(<\?(?!php|=|$))~i', '<?php echo \'\\1\'?>'."\n", $sp_match[1][$curr_sp]);
- $text_blocks[$curr_tb] = str_replace('%%%SMARTYSP'.$curr_sp.'%%%', $sp_match[1][$curr_sp], $text_blocks[$curr_tb]);
- }
- }
- }
- }
-
- /* Compile the template tags into PHP code. */
- $compiled_tags = array();
- for ($i = 0, $for_max = count($template_tags); $i < $for_max; $i++) {
- $this->_current_line_no += substr_count($text_blocks[$i], "\n");
- $compiled_tags[] = $this->_compile_tag($template_tags[$i]);
- $this->_current_line_no += substr_count($template_tags[$i], "\n");
- }
- if (count($this->_tag_stack)>0) {
- list($_open_tag, $_line_no) = end($this->_tag_stack);
- $this->_syntax_error("unclosed tag \{$_open_tag} (opened line $_line_no).", E_USER_ERROR, __FILE__, __LINE__);
- return;
- }
-
- /* Reformat $text_blocks between 'strip' and '/strip' tags,
- removing spaces, tabs and newlines. */
- $strip = false;
- for ($i = 0, $for_max = count($compiled_tags); $i < $for_max; $i++) {
- if ($compiled_tags[$i] == '{strip}') {
- $compiled_tags[$i] = '';
- $strip = true;
- /* remove leading whitespaces */
- $text_blocks[$i + 1] = ltrim($text_blocks[$i + 1]);
- }
- if ($strip) {
- /* strip all $text_blocks before the next '/strip' */
- for ($j = $i + 1; $j < $for_max; $j++) {
- /* remove leading and trailing whitespaces of each line */
- $text_blocks[$j] = preg_replace('![\t ]*[\r\n]+[\t ]*!', ' ', $text_blocks[$j]);
- if ($compiled_tags[$j] == '{/strip}') {
- /* remove trailing whitespaces from the last text_block */
- $text_blocks[$j] = rtrim($text_blocks[$j]);
- }
- $text_blocks[$j] = "<?php echo '" . strtr($text_blocks[$j], array("'"=>"\'", "\\"=>"\\\\")) . "'; ?>";
- if ($compiled_tags[$j] == '{/strip}') {
- $compiled_tags[$j] = "\n"; /* slurped by php, but necessary
- if a newline is following the closing strip-tag */
- $strip = false;
- $i = $j;
- break;
- }
- }
- }
- }
- $compiled_content = '';
-
- $tag_guard = '%%%SMARTYOTG' . md5(uniqid(rand(), true)) . '%%%';
-
- /* Interleave the compiled contents and text blocks to get the final result. */
- for ($i = 0, $for_max = count($compiled_tags); $i < $for_max; $i++) {
- if ($compiled_tags[$i] == '') {
- // tag result empty, remove first newline from following text block
- $text_blocks[$i+1] = preg_replace('~^(\r\n|\r|\n)~', '', $text_blocks[$i+1]);
- }
- // replace legit PHP tags with placeholder
- $text_blocks[$i] = str_replace('<?', $tag_guard, $text_blocks[$i]);
- $compiled_tags[$i] = str_replace('<?', $tag_guard, $compiled_tags[$i]);
-
- $compiled_content .= $text_blocks[$i] . $compiled_tags[$i];
- }
- $compiled_content .= str_replace('<?', $tag_guard, $text_blocks[$i]);
-
- // escape php tags created by interleaving
- $compiled_content = str_replace('<?', "<?php echo '<?' ?>\n", $compiled_content);
- $compiled_content = preg_replace("~(?<!')language\s*=\s*[\"\']?\s*php\s*[\"\']?~", "<?php echo 'language=php' ?>\n", $compiled_content);
-
- // recover legit tags
- $compiled_content = str_replace($tag_guard, '<?', $compiled_content);
-
- // remove \n from the end of the file, if any
- if (strlen($compiled_content) && (substr($compiled_content, -1) == "\n") ) {
- $compiled_content = substr($compiled_content, 0, -1);
- }
-
- if (!empty($this->_cache_serial)) {
- $compiled_content = "<?php \$this->_cache_serials['".$this->_cache_include."'] = '".$this->_cache_serial."'; ?>" . $compiled_content;
- }
-
- // run compiled template through postfilter functions
- if (count($this->_plugins['postfilter']) > 0) {
- foreach ($this->_plugins['postfilter'] as $filter_name => $postfilter) {
- if ($postfilter === false) continue;
- if ($postfilter[3] || is_callable($postfilter[0])) {
- $compiled_content = call_user_func_array($postfilter[0],
- array($compiled_content, &$this));
- $this->_plugins['postfilter'][$filter_name][3] = true;
- } else {
- $this->_trigger_fatal_error("Smarty plugin error: postfilter '$filter_name' is not implemented");
- }
- }
- }
-
- // put header at the top of the compiled template
- $template_header = "<?php /* Smarty version ".$this->_version.", created on ".strftime("%Y-%m-%d %H:%M:%S")."\n";
- $template_header .= " compiled from ".strtr(urlencode($resource_name), array('%2F'=>'/', '%3A'=>':'))." */ ?>\n";
-
- /* Emit code to load needed plugins. */
- $this->_plugins_code = '';
- if (count($this->_plugin_info)) {
- $_plugins_params = "array('plugins' => array(";
- foreach ($this->_plugin_info as $plugin_type => $plugins) {
- foreach ($plugins as $plugin_name => $plugin_info) {
- $_plugins_params .= "array('$plugin_type', '$plugin_name', '" . strtr($plugin_info[0], array("'" => "\\'", "\\" => "\\\\")) . "', $plugin_info[1], ";
- $_plugins_params .= $plugin_info[2] ? 'true),' : 'false),';
- }
- }
- $_plugins_params .= '))';
- $plugins_code = "<?php require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');\nsmarty_core_load_plugins($_plugins_params, \$this); ?>\n";
- $template_header .= $plugins_code;
- $this->_plugin_info = array();
- $this->_plugins_code = $plugins_code;
- }
-
- if ($this->_init_smarty_vars) {
- $template_header .= "<?php require_once(SMARTY_CORE_DIR . 'core.assign_smarty_interface.php');\nsmarty_core_assign_smarty_interface(null, \$this); ?>\n";
- $this->_init_smarty_vars = false;
- }
-
- $compiled_content = $template_header . $compiled_content;
- return true;
- }
-
- /**
- * Compile a template tag
- *
- * @param string $template_tag
- * @return string
- */
- function _compile_tag($template_tag)
- {
- /* Matched comment. */
- if (substr($template_tag, 0, 1) == '*' && substr($template_tag, -1) == '*')
- return '';
-
- /* Split tag into two three parts: command, command modifiers and the arguments. */
- if(! preg_match('~^(?:(' . $this->_num_const_regexp . '|' . $this->_obj_call_regexp . '|' . $this->_var_regexp
- . '|\/?' . $this->_reg_obj_regexp . '|\/?' . $this->_func_regexp . ')(' . $this->_mod_regexp . '*))
- (?:\s+(.*))?$
- ~xs', $template_tag, $match)) {
- $this->_syntax_error("unrecognized tag: $template_tag", E_USER_ERROR, __FILE__, __LINE__);
- }
-
- $tag_command = $match[1];
- $tag_modifier = isset($match[2]) ? $match[2] : null;
- $tag_args = isset($match[3]) ? $match[3] : null;
-
- if (preg_match('~^' . $this->_num_const_regexp . '|' . $this->_obj_call_regexp . '|' . $this->_var_regexp . '$~', $tag_command)) {
- /* tag name is a variable or object */
- $_return = $this->_parse_var_props($tag_command . $tag_modifier);
- return "<?php echo $_return; ?>" . $this->_additional_newline;
- }
-
- /* If the tag name is a registered object, we process it. */
- if (preg_match('~^\/?' . $this->_reg_obj_regexp . '$~', $tag_command)) {
- return $this->_compile_registered_object_tag($tag_command, $this->_parse_attrs($tag_args), $tag_modifier);
- }
-
- switch ($tag_command) {
- case 'include':
- return $this->_compile_include_tag($tag_args);
-
- case 'include_php':
- return $this->_compile_include_php_tag($tag_args);
-
- case 'if':
- $this->_push_tag('if');
- return $this->_compile_if_tag($tag_args);
-
- case 'else':
- list($_open_tag) = end($this->_tag_stack);
- if ($_open_tag != 'if' && $_open_tag != 'elseif')
- $this->_syntax_error('unexpected {else}', E_USER_ERROR, __FILE__, __LINE__);
- else
- $this->_push_tag('else');
- return '<?php else: ?>';
-
- case 'elseif':
- list($_open_tag) = end($this->_tag_stack);
- if ($_open_tag != 'if' && $_open_tag != 'elseif')
- $this->_syntax_error('unexpected {elseif}', E_USER_ERROR, __FILE__, __LINE__);
- if ($_open_tag == 'if')
- $this->_push_tag('elseif');
- return $this->_compile_if_tag($tag_args, true);
-
- case '/if':
- $this->_pop_tag('if');
- return '<?php endif; ?>';
-
- case 'capture':
- return $this->_compile_capture_tag(true, $tag_args);
-
- case '/capture':
- return $this->_compile_capture_tag(false);
-
- case 'ldelim':
- return $this->left_delimiter;
-
- case 'rdelim':
- return $this->right_delimiter;
-
- case 'section':
- $this->_push_tag('section');
- return $this->_compile_section_start($tag_args);
-
- case 'sectionelse':
- $this->_push_tag('sectionelse');
- return "<?php endfor; else: ?>";
- break;
-
- case '/section':
- $_open_tag = $this->_pop_tag('section');
- if ($_open_tag == 'sectionelse')
- return "<?php endif; ?>";
- else
- return "<?php endfor; endif; ?>";
-
- case 'foreach':
- $this->_push_tag('foreach');
- return $this->_compile_foreach_start($tag_args);
- break;
-
- case 'foreachelse':
- $this->_push_tag('foreachelse');
- return "<?php endforeach; else: ?>";
-
- case '/foreach':
- $_open_tag = $this->_pop_tag('foreach');
- if ($_open_tag == 'foreachelse')
- return "<?php endif; unset(\$_from); ?>";
- else
- return "<?php endforeach; endif; unset(\$_from); ?>";
- break;
-
- case 'strip':
- case '/strip':
- if (substr($tag_command, 0, 1)=='/') {
- $this->_pop_tag('strip');
- if (--$this->_strip_depth==0) { /* outermost closing {/strip} */
- $this->_additional_newline = "\n";
- return '{' . $tag_command . '}';
- }
- } else {
- $this->_push_tag('strip');
- if ($this->_strip_depth++==0) { /* outermost opening {strip} */
- $this->_additional_newline = "";
- return '{' . $tag_command . '}';
- }
- }
- return '';
-
- case 'php':
- /* handle folded tags replaced by {php} */
- list(, $block) = each($this->_folded_blocks);
- $this->_current_line_no += substr_count($block[0], "\n");
- /* the number of matched elements in the regexp in _compile_file()
- determins the type of folded tag that was found */
- switch (count($block)) {
- case 2: /* comment */
- return '';
-
- case 3: /* literal */
- return "<?php echo '" . strtr($block[2], array("'"=>"\'", "\\"=>"\\\\")) . "'; ?>" . $this->_additional_newline;
-
- case 4: /* php */
- if ($this->security && !$this->security_settings['PHP_TAGS']) {
- $this->_syntax_error("(secure mode) php tags not permitted", E_USER_WARNING, __FILE__, __LINE__);
- return;
- }
- return '<?php ' . $block[3] .' ?>';
- }
- break;
-
- case 'insert':
- return $this->_compile_insert_tag($tag_args);
-
- default:
- if ($this->_compile_compiler_tag($tag_command, $tag_args, $output)) {
- return $output;
- } else if ($this->_compile_block_tag($tag_command, $tag_args, $tag_modifier, $output)) {
- return $output;
- } else if ($this->_compile_custom_tag($tag_command, $tag_args, $tag_modifier, $output)) {
- return $output;
- } else {
- $this->_syntax_error("unrecognized tag '$tag_command'", E_USER_ERROR, __FILE__, __LINE__);
- }
-
- }
- }
-
-
- /**
- * compile the custom compiler tag
- *
- * sets $output to the compiled custom compiler tag
- * @param string $tag_command
- * @param string $tag_args
- * @param string $output
- * @return boolean
- */
- function _compile_compiler_tag($tag_command, $tag_args, &$output)
- {
- $found = false;
- $have_function = true;
-
- /*
- * First we check if the compiler function has already been registered
- * or loaded from a plugin file.
- */
- if (isset($this->_plugins['compiler'][$tag_command])) {
- $found = true;
- $plugin_func = $this->_plugins['compiler'][$tag_command][0];
- if (!is_callable($plugin_func)) {
- $message = "compiler function '$tag_command' is not implemented";
- $have_function = false;
- }
- }
- /*
- * Otherwise we need to load plugin file and look for the function
- * inside it.
- */
- else if ($plugin_file = $this->_get_plugin_filepath('compiler', $tag_command)) {
- $found = true;
-
- include_once $plugin_file;
-
- $plugin_func = 'smarty_compiler_' . $tag_command;
- if (!is_callable($plugin_func)) {
- $message = "plugin function $plugin_func() not found in $plugin_file\n";
- $have_function = false;
- } else {
- $this->_plugins['compiler'][$tag_command] = array($plugin_func, null, null, null, true);
- }
- }
-
- /*
- * True return value means that we either found a plugin or a
- * dynamically registered function. False means that we didn't and the
- * compiler should now emit code to load custom function plugin for this
- * tag.
- */
- if ($found) {
- if ($have_function) {
- $output = call_user_func_array($plugin_func, array($tag_args, &$this));
- if($output != '') {
- $output = '<?php ' . $this->_push_cacheable_state('compiler', $tag_command)
- . $output
- . $this->_pop_cacheable_state('compiler', $tag_command) . ' ?>';
- }
- } else {
- $this->_syntax_error($message, E_USER_WARNING, __FILE__, __LINE__);
- }
- return true;
- } else {
- return false;
- }
- }
-
-
- /**
- * compile block function tag
- *
- * sets $output to compiled block function tag
- * @param string $tag_command
- * @param string $tag_args
- * @param string $tag_modifier
- * @param string $output
- * @return boolean
- */
- function _compile_block_tag($tag_command, $tag_args, $tag_modifier, &$output)
- {
- if (substr($tag_command, 0, 1) == '/') {
- $start_tag = false;
- $tag_command = substr($tag_command, 1);
- } else
- $start_tag = true;
-
- $found = false;
- $have_function = true;
-
- /*
- * First we check if the block function has already been registered
- * or loaded from a plugin file.
- */
- if (isset($this->_plugins['block'][$tag_command])) {
- $found = true;
- $plugin_func = $this->_plugins['block'][$tag_command][0];
- if (!is_callable($plugin_func)) {
- $message = "block function '$tag_command' is not implemented";
- $have_function = false;
- }
- }
- /*
- * Otherwise we need to load plugin file and look for the function
- * inside it.
- */
- else if ($plugin_file = $this->_get_plugin_filepath('block', $tag_command)) {
- $found = true;
-
- include_once $plugin_file;
-
- $plugin_func = 'smarty_block_' . $tag_command;
- if (!function_exists($plugin_func)) {
- $message = "plugin function $plugin_func() not found in $plugin_file\n";
- $have_function = false;
- } else {
- $this->_plugins['block'][$tag_command] = array($plugin_func, null, null, null, true);
-
- }
- }
-
- if (!$found) {
- return false;
- } else if (!$have_function) {
- $this->_syntax_error($message, E_USER_WARNING, __FILE__, __LINE__);
- return true;
- }
-
- /*
- * Even though we've located the plugin function, compilation
- * happens only once, so the plugin will still need to be loaded
- * at runtime for future requests.
- */
- $this->_add_plugin('block', $tag_command);
-
- if ($start_tag)
- $this->_push_tag($tag_command);
- else
- $this->_pop_tag($tag_command);
-
- if ($start_tag) {
- $output = '<?php ' . $this->_push_cacheable_state('block', $tag_command);
- $attrs = $this->_parse_attrs($tag_args);
- $_cache_attrs='';
- $arg_list = $this->_compile_arg_list('block', $tag_command, $attrs, $_cache_attrs);
- $output .= "$_cache_attrs\$this->_tag_stack[] = array('$tag_command', array(".implode(',', $arg_list).')); ';
- $output .= '$_block_repeat=true;' . $this->_compile_plugin_call('block', $tag_command).'($this->_tag_stack[count($this->_tag_stack)-1][1], null, $this, $_block_repeat);';
- $output .= 'while ($_block_repeat) { ob_start(); ?>';
- } else {
- $output = '<?php $_block_content = ob_get_contents(); ob_end_clean(); ';
- $_out_tag_text = $this->_compile_plugin_call('block', $tag_command).'($this->_tag_stack[count($this->_tag_stack)-1][1], $_block_content, $this, $_block_repeat)';
- if ($tag_modifier != '') {
- $this->_parse_modifiers($_out_tag_text, $tag_modifier);
- }
- $output .= '$_block_repeat=false;echo ' . $_out_tag_text . '; } ';
- $output .= " array_pop(\$this->_tag_stack); " . $this->_pop_cacheable_state('block', $tag_command) . '?>';
- }
-
- return true;
- }
-
-
- /**
- * compile custom function tag
- *
- * @param string $tag_command
- * @param string $tag_args
- * @param string $tag_modifier
- * @return string
- */
- function _compile_custom_tag($tag_command, $tag_args, $tag_modifier, &$output)
- {
- $found = false;
- $have_function = true;
-
- /*
- * First we check if the custom function has already been registered
- * or loaded from a plugin file.
- */
- if (isset($this->_plugins['function'][$tag_command])) {
- $found = true;
- $plugin_func = $this->_plugins['function'][$tag_command][0];
- if (!is_callable($plugin_func)) {
- $message = "custom function '$tag_command' is not implemented";
- $have_function = false;
- }
- }
- /*
- * Otherwise we need to load plugin file and look for the function
- * inside it.
- */
- else if ($plugin_file = $this->_get_plugin_filepath('function', $tag_command)) {
- $found = true;
-
- include_once $plugin_file;
-
- $plugin_func = 'smarty_function_' . $tag_command;
- if (!function_exists($plugin_func)) {
- $message = "plugin function $plugin_func() not found in $plugin_file\n";
- $have_function = false;
- } else {
- $this->_plugins['function'][$tag_command] = array($plugin_func, null, null, null, true);
-
- }
- }
-
- if (!$found) {
- return false;
- } else if (!$have_function) {
- $this->_syntax_error($message, E_USER_WARNING, __FILE__, __LINE__);
- return true;
- }
-
- /* declare plugin to be loaded on display of the template that
- we compile right now */
- $this->_add_plugin('function', $tag_command);
-
- $_cacheable_state = $this->_push_cacheable_state('function', $tag_command);
- $attrs = $this->_parse_attrs($tag_args);
- $_cache_attrs = '';
- $arg_list = $this->_compile_arg_list('function', $tag_command, $attrs, $_cache_attrs);
-
- $output = $this->_compile_plugin_call('function', $tag_command).'(array('.implode(',', $arg_list)."), \$this)";
- if($tag_modifier != '') {
- $this->_parse_modifiers($output, $tag_modifier);
- }
-
- if($output != '') {
- $output = '<?php ' . $_cacheable_state . $_cache_attrs . 'echo ' . $output . ';'
- . $this->_pop_cacheable_state('function', $tag_command) . "?>" . $this->_additional_newline;
- }
-
- return true;
- }
-
- /**
- * compile a registered object tag
- *
- * @param string $tag_command
- * @param array $attrs
- * @param string $tag_modifier
- * @return string
- */
- function _compile_registered_object_tag($tag_command, $attrs, $tag_modifier)
- {
- if (substr($tag_command, 0, 1) == '/') {
- $start_tag = false;
- $tag_command = substr($tag_command, 1);
- } else {
- $start_tag = true;
- }
-
- list($object, $obj_comp) = explode('->', $tag_command);
-
- $arg_list = array();
- if(count($attrs)) {
- $_assign_var = false;
- foreach ($attrs as $arg_name => $arg_value) {
- if($arg_name == 'assign') {
- $_assign_var = $arg_value;
- unset($attrs['assign']);
- continue;
- }
- if (is_bool($arg_value))
- $arg_value = $arg_value ? 'true' : 'false';
- $arg_list[] = "'$arg_name' => $arg_value";
- }
- }
-
- if($this->_reg_objects[$object][2]) {
- // smarty object argument format
- $args = "array(".implode(',', (array)$arg_list)."), \$this";
- } else {
- // traditional argument format
- $args = implode(',', array_values($attrs));
- if (empty($args)) {
- $args = '';
- }
- }
-
- $prefix = '';
- $postfix = '';
- $newline = '';
- if(!is_object($this->_reg_objects[$object][0])) {
- $this->_trigger_fatal_error("registered '$object' is not an object" , $this->_current_file, $this->_current_line_no, __FILE__, __LINE__);
- } elseif(!empty($this->_reg_objects[$object][1]) && !in_array($obj_comp, $this->_reg_objects[$object][1])) {
- $this->_trigger_fatal_error("'$obj_comp' is not a registered component of object '$object'", $this->_current_file, $this->_current_line_no, __FILE__, __LINE__);
- } elseif(method_exists($this->_reg_objects[$object][0], $obj_comp)) {
- // method
- if(in_array($obj_comp, $this->_reg_objects[$object][3])) {
- // block method
- if ($start_tag) {
- $prefix = "\$this->_tag_stack[] = array('$obj_comp', $args); ";
- $prefix .= "\$_block_repeat=true; \$this->_reg_objects['$object'][0]->$obj_comp(\$this->_tag_stack[count(\$this->_tag_stack)-1][1], null, \$this, \$_block_repeat); ";
- $prefix .= "while (\$_block_repeat) { ob_start();";
- $return = null;
- $postfix = '';
- } else {
- $prefix = "\$_obj_block_content = ob_get_contents(); ob_end_clean(); \$_block_repeat=false;";
- $return = "\$this->_reg_objects['$object'][0]->$obj_comp(\$this->_tag_stack[count(\$this->_tag_stack)-1][1], \$_obj_block_content, \$this, \$_block_repeat)";
- $postfix = "} array_pop(\$this->_tag_stack);";
- }
- } else {
- // non-block method
- $return = "\$this->_reg_objects['$object'][0]->$obj_comp($args)";
- }
- } else {
- // property
- $return = "\$this->_reg_objects['$object'][0]->$obj_comp";
- }
-
- if($return != null) {
- if($tag_modifier != '') {
- $this->_parse_modifiers($return, $tag_modifier);
- }
-
- if(!empty($_assign_var)) {
- $output = "\$this->assign('" . $this->_dequote($_assign_var) ."', $return);";
- } else {
- $output = 'echo ' . $return . ';';
- $newline = $this->_additional_newline;
- }
- } else {
- $output = '';
- }
-
- return '<?php ' . $prefix . $output . $postfix . "?>" . $newline;
- }
-
- /**
- * Compile {insert ...} tag
- *
- * @param string $tag_args
- * @return string
- */
- function _compile_insert_tag($tag_args)
- {
- $attrs = $this->_parse_attrs($tag_args);
- $name = $this->_dequote($attrs['name']);
-
- if (empty($name)) {
- return $this->_syntax_error("missing insert name", E_USER_ERROR, __FILE__, __LINE__);
- }
-
- if (!preg_match('~^\w+$~', $name)) {
- return $this->_syntax_error("'insert: 'name' must be an insert function name", E_USER_ERROR, __FILE__, __LINE__);
- }
-
- if (!empty($attrs['script'])) {
- $delayed_loading = true;
- } else {
- $delayed_loading = false;
- }
-
- foreach ($attrs as $arg_name => $arg_value) {
- if (is_bool($arg_value))
- $arg_value = $arg_value ? 'true' : 'false';
- $arg_list[] = "'$arg_name' => $arg_value";
- }
-
- $this->_add_plugin('insert', $name, $delayed_loading);
-
- $_params = "array('args' => array(".implode(', ', (array)$arg_list)."))";
-
- return "<?php require_once(SMARTY_CORE_DIR . 'core.run_insert_handler.php');\necho smarty_core_run_insert_handler($_params, \$this); ?>" . $this->_additional_newline;
- }
-
- /**
- * Compile {include ...} tag
- *
- * @param string $tag_args
- * @return string
- */
- function _compile_include_tag($tag_args)
- {
- $attrs = $this->_parse_attrs($tag_args);
- $arg_list = array();
-
- if (empty($attrs['file'])) {
- $this->_syntax_error("missing 'file' attribute in include tag", E_USER_ERROR, __FILE__, __LINE__);
- }
-
- foreach ($attrs as $arg_name => $arg_value) {
- if ($arg_name == 'file') {
- $include_file = $arg_value;
- continue;
- } else if ($arg_name == 'assign') {
- $assign_var = $arg_value;
- continue;
- }
- if (is_bool($arg_value))
- $arg_value = $arg_value ? 'true' : 'false';
- $arg_list[] = "'$arg_name' => $arg_value";
- }
-
- $output = '<?php ';
-
- if (isset($assign_var)) {
- $output .= "ob_start();\n";
- }
-
- $output .=
- "\$_smarty_tpl_vars = \$this->_tpl_vars;\n";
-
-
- $_params = "array('smarty_include_tpl_file' => " . $include_file . ", 'smarty_include_vars' => array(".implode(',', (array)$arg_list)."))";
- $output .= "\$this->_smarty_include($_params);\n" .
- "\$this->_tpl_vars = \$_smarty_tpl_vars;\n" .
- "unset(\$_smarty_tpl_vars);\n";
-
- if (isset($assign_var)) {
- $output .= "\$this->assign(" . $assign_var . ", ob_get_contents()); ob_end_clean();\n";
- }
-
- $output .= ' ?>';
-
- return $output;
-
- }
-
- /**
- * Compile {include ...} tag
- *
- * @param string $tag_args
- * @return string
- */
- function _compile_include_php_tag($tag_args)
- {
- $attrs = $this->_parse_attrs($tag_args);
-
- if (empty($attrs['file'])) {
- $this->_syntax_error("missing 'file' attribute in include_php tag", E_USER_ERROR, __FILE__, __LINE__);
- }
-
- $assign_var = (empty($attrs['assign'])) ? '' : $this->_dequote($attrs['assign']);
- $once_var = (empty($attrs['once']) || $attrs['once']=='false') ? 'false' : 'true';
-
- $arg_list = array();
- foreach($attrs as $arg_name => $arg_value) {
- if($arg_name != 'file' AND $arg_name != 'once' AND $arg_name != 'assign') {
- if(is_bool($arg_value))
- $arg_value = $arg_value ? 'true' : 'false';
- $arg_list[] = "'$arg_name' => $arg_value";
- }
- }
-
- $_params = "array('smarty_file' => " . $attrs['file'] . ", 'smarty_assign' => '$assign_var', 'smarty_once' => $once_var, 'smarty_include_vars' => array(".implode(',', $arg_list)."))";
-
- return "<?php require_once(SMARTY_CORE_DIR . 'core.smarty_include_php.php');\nsmarty_core_smarty_include_php($_params, \$this); ?>" . $this->_additional_newline;
- }
-
-
- /**
- * Compile {section ...} tag
- *
- * @param string $tag_args
- * @return string
- */
- function _compile_section_start($tag_args)
- {
- $attrs = $this->_parse_attrs($tag_args);
- $arg_list = array();
-
- $output = '<?php ';
- $section_name = $attrs['name'];
- if (empty($section_name)) {
- $this->_syntax_error("missing section name", E_USER_ERROR, __FILE__, __LINE__);
- }
-
- $output .= "unset(\$this->_sections[$section_name]);\n";
- $section_props = "\$this->_sections[$section_name]";
-
- foreach ($attrs as $attr_name => $attr_value) {
- switch ($attr_name) {
- case 'loop':
- $output .= "{$section_props}['loop'] = is_array(\$_loop=$attr_value) ? count(\$_loop) : max(0, (int)\$_loop); unset(\$_loop);\n";
- break;
-
- case 'show':
- if (is_bool($attr_value))
- $show_attr_value = $attr_value ? 'true' : 'false';
- else
- $show_attr_value = "(bool)$attr_value";
- $output .= "{$section_props}['show'] = $show_attr_value;\n";
- break;
-
- case 'name':
- $output .= "{$section_props}['$attr_name'] = $attr_value;\n";
- break;
-
- case 'max':
- case 'start':
- $output .= "{$section_props}['$attr_name'] = (int)$attr_value;\n";
- break;
-
- case 'step':
- $output .= "{$section_props}['$attr_name'] = ((int)$attr_value) == 0 ? 1 : (int)$attr_value;\n";
- break;
-
- default:
- $this->_syntax_error("unknown section attribute - '$attr_name'", E_USER_ERROR, __FILE__, __LINE__);
- break;
- }
- }
-
- if (!isset($attrs['show']))
- $output .= "{$section_props}['show'] = true;\n";
-
- if (!isset($attrs['loop']))
- $output .= "{$section_props}['loop'] = 1;\n";
-
- if (!isset($attrs['max']))
- $output .= "{$section_props}['max'] = {$section_props}['loop'];\n";
- else
- $output .= "if ({$section_props}['max'] < 0)\n" .
- " {$section_props}['max'] = {$section_props}['loop'];\n";
-
- if (!isset($attrs['step']))
- $output .= "{$section_props}['step'] = 1;\n";
-
- if (!isset($attrs['start']))
- $output .= "{$section_props}['start'] = {$section_props}['step'] > 0 ? 0 : {$section_props}['loop']-1;\n";
- else {
- $output .= "if ({$section_props}['start'] < 0)\n" .
- " {$section_props}['start'] = max({$section_props}['step'] > 0 ? 0 : -1, {$section_props}['loop'] + {$section_props}['start']);\n" .
- "else\n" .
- " {$section_props}['start'] = min({$section_props}['start'], {$section_props}['step'] > 0 ? {$section_props}['loop'] : {$section_props}['loop']-1);\n";
- }
-
- $output .= "if ({$section_props}['show']) {\n";
- if (!isset($attrs['start']) && !isset($attrs['step']) && !isset($attrs['max'])) {
- $output .= " {$section_props}['total'] = {$section_props}['loop'];\n";
- } else {
- $output .= " {$section_props}['total'] = min(ceil(({$section_props}['step'] > 0 ? {$section_props}['loop'] - {$section_props}['start'] : {$section_props}['start']+1)/abs({$section_props}['step'])), {$section_props}['max']);\n";
- }
- $output .= " if ({$section_props}['total'] == 0)\n" .
- " {$section_props}['show'] = false;\n" .
- "} else\n" .
- " {$section_props}['total'] = 0;\n";
-
- $output .= "if ({$section_props}['show']):\n";
- $output .= "
- for ({$section_props}['index'] = {$section_props}['start'], {$section_props}['iteration'] = 1;
- {$section_props}['iteration'] <= {$section_props}['total'];
- {$section_props}['index'] += {$section_props}['step'], {$section_props}['iteration']++):\n";
- $output .= "{$section_props}['rownum'] = {$section_props}['iteration'];\n";
- $output .= "{$section_props}['index_prev'] = {$section_props}['index'] - {$section_props}['step'];\n";
- $output .= "{$section_props}['index_next'] = {$section_props}['index'] + {$section_props}['step'];\n";
- $output .= "{$section_props}['first'] = ({$section_props}['iteration'] == 1);\n";
- $output .= "{$section_props}['last'] = ({$section_props}['iteration'] == {$section_props}['total']);\n";
-
- $output .= "?>";
-
- return $output;
- }
-
-
- /**
- * Compile {foreach ...} tag.
- *
- * @param string $tag_args
- * @return string
- */
- function _compile_foreach_start($tag_args)
- {
- $attrs = $this->_parse_attrs($tag_args);
- $arg_list = array();
-
- if (empty($attrs['from'])) {
- return $this->_syntax_error("foreach: missing 'from' attribute", E_USER_ERROR, __FILE__, __LINE__);
- }
- $from = $attrs['from'];
-
- if (empty($attrs['item'])) {
- return $this->_syntax_error("foreach: missing 'item' attribute", E_USER_ERROR, __FILE__, __LINE__);
- }
- $item = $this->_dequote($attrs['item']);
- if (!preg_match('~^\w+$~', $item)) {
- return $this->_syntax_error("foreach: 'item' must be a variable name (literal string)", E_USER_ERROR, __FILE__, __LINE__);
- }
-
- if (isset($attrs['key'])) {
- $key = $this->_dequote($attrs['key']);
- if (!preg_match('~^\w+$~', $key)) {
- return $this->_syntax_error("foreach: 'key' must to be a variable name (literal string)", E_USER_ERROR, __FILE__, __LINE__);
- }
- $key_part = "\$this->_tpl_vars['$key'] => ";
- } else {
- $key = null;
- $key_part = '';
- }
-
- if (isset($attrs['name'])) {
- $name = $attrs['name'];
- } else {
- $name = null;
- }
-
- $output = '<?php ';
- $output .= "\$_from = $from; if (!is_array(\$_from) && !is_object(\$_from)) { settype(\$_from, 'array'); }";
- if (isset($name)) {
- $foreach_props = "\$this->_foreach[$name]";
- $output .= "{$foreach_props} = array('total' => count(\$_from), 'iteration' => 0);\n";
- $output .= "if ({$foreach_props}['total'] > 0):\n";
- $output .= " foreach (\$_from as $key_part\$this->_tpl_vars['$item']):\n";
- $output .= " {$foreach_props}['iteration']++;\n";
- } else {
- $output .= "if (count(\$_from)):\n";
- $output .= " foreach (\$_from as $key_part\$this->_tpl_vars['$item']):\n";
- }
- $output .= '?>';
-
- return $output;
- }
-
-
- /**
- * Compile {capture} .. {/capture} tags
- *
- * @param boolean $start true if this is the {capture} tag
- * @param string $tag_args
- * @return string
- */
-
- function _compile_capture_tag($start, $tag_args = '')
- {
- $attrs = $this->_parse_attrs($tag_args);
-
- if ($start) {
- $buffer = isset($attrs['name']) ? $attrs['name'] : "'default'";
- $assign = isset($attrs['assign']) ? $attrs['assign'] : null;
- $append = isset($attrs['append']) ? $attrs['append'] : null;
-
- $output = "<?php ob_start(); ?>";
- $this->_capture_stack[] = array($buffer, $assign, $append);
- } else {
- list($buffer, $assign, $append) = array_pop($this->_capture_stack);
- $output = "<?php \$this->_smarty_vars['capture'][$buffer] = ob_get_contents(); ";
- if (isset($assign)) {
- $output .= " \$this->assign($assign, ob_get_contents());";
- }
- if (isset($append)) {
- $output .= " \$this->append($append, ob_get_contents());";
- }
- $output .= "ob_end_clean(); ?>";
- }
-
- return $output;
- }
-
- /**
- * Compile {if ...} tag
- *
- * @param string $tag_args
- * @param boolean $elseif if true, uses elseif instead of if
- * @return string
- */
- function _compile_if_tag($tag_args, $elseif = false)
- {
-
- /* Tokenize args for 'if' tag. */
- preg_match_all('~(?>
- ' . $this->_obj_call_regexp . '(?:' . $this->_mod_regexp . '*)? | # valid object call
- ' . $this->_var_regexp . '(?:' . $this->_mod_regexp . '*)? | # var or quoted string
- \-?0[xX][0-9a-fA-F]+|\-?\d+(?:\.\d+)?|\.\d+|!==|===|==|!=|<>|<<|>>|<=|>=|\&\&|\|\||\(|\)|,|\!|\^|=|\&|\~|<|>|\||\%|\+|\-|\/|\*|\@ | # valid non-word token
- \b\w+\b | # valid word token
- \S+ # anything else
- )~x', $tag_args, $match);
-
- $tokens = $match[0];
-
- if(empty($tokens)) {
- $_error_msg = $elseif ? "'elseif'" : "'if'";
- $_error_msg .= ' statement requires arguments';
- $this->_syntax_error($_error_msg, E_USER_ERROR, __FILE__, __LINE__);
- }
-
-
- // make sure we have balanced parenthesis
- $token_count = array_count_values($tokens);
- if(isset($token_count['(']) && $token_count['('] != $token_count[')']) {
- $this->_syntax_error("unbalanced parenthesis in if statement", E_USER_ERROR, __FILE__, __LINE__);
- }
-
- $is_arg_stack = array();
-
- for ($i = 0; $i < count($tokens); $i++) {
-
- $token = &$tokens[$i];
-
- switch (strtolower($token)) {
- case '!':
- case '%':
- case '!==':
- case '==':
- case '===':
- case '>':
- case '<':
- case '!=':
- case '<>':
- case '<<':
- case '>>':
- case '<=':
- case '>=':
- case '&&':
- case '||':
- case '|':
- case '^':
- case '&':
- case '~':
- case ')':
- case ',':
- case '+':
- case '-':
- case '*':
- case '/':
- case '@':
- break;
-
- case 'eq':
- $token = '==';
- break;
-
- case 'ne':
- case 'neq':
- $token = '!=';
- break;
-
- case 'lt':
- $token = '<';
- break;
-
- case 'le':
- case 'lte':
- $token = '<=';
- break;
-
- case 'gt':
- $token = '>';
- break;
-
- case 'ge':
- case 'gte':
- $token = '>=';
- break;
-
- case 'and':
- $token = '&&';
- break;
-
- case 'or':
- $token = '||';
- break;
-
- case 'not':
- $token = '!';
- break;
-
- case 'mod':
- $token = '%';
- break;
-
- case '(':
- array_push($is_arg_stack, $i);
- break;
-
- case 'is':
- /* If last token was a ')', we operate on the parenthesized
- expression. The start of the expression is on the stack.
- Otherwise, we operate on the last encountered token. */
- if ($tokens[$i-1] == ')') {
- $is_arg_start = array_pop($is_arg_stack);
- if ($is_arg_start != 0) {
- if (preg_match('~^' . $this->_func_regexp . '$~', $tokens[$is_arg_start-1])) {
- $is_arg_start--;
- }
- }
- } else
- $is_arg_start = $i-1;
- /* Construct the argument for 'is' expression, so it knows
- what to operate on. */
- $is_arg = implode(' ', array_slice($tokens, $is_arg_start, $i - $is_arg_start));
-
- /* Pass all tokens from next one until the end to the
- 'is' expression parsing function. The function will
- return modified tokens, where the first one is the result
- of the 'is' expression and the rest are the tokens it
- didn't touch. */
- $new_tokens = $this->_parse_is_expr($is_arg, array_slice($tokens, $i+1));
-
- /* Replace the old tokens with the new ones. */
- array_splice($tokens, $is_arg_start, count($tokens), $new_tokens);
-
- /* Adjust argument start so that it won't change from the
- current position for the next iteration. */
- $i = $is_arg_start;
- break;
-
- default:
- if(preg_match('~^' . $this->_func_regexp . '$~', $token) ) {
- // function call
- if($this->security &&
- !in_array($token, $this->security_settings['IF_FUNCS'])) {
- $this->_syntax_error("(secure mode) '$token' not allowed in if statement", E_USER_ERROR, __FILE__, __LINE__);
- }
- } elseif(preg_match('~^' . $this->_var_regexp . '$~', $token) && (strpos('+-*/^%&|', substr($token, -1)) === false) && isset($tokens[$i+1]) && $tokens[$i+1] == '(') {
- // variable function call
- $this->_syntax_error("variable function call '$token' not allowed in if statement", E_USER_ERROR, __FILE__, __LINE__);
- } elseif(preg_match('~^' . $this->_obj_call_regexp . '|' . $this->_var_regexp . '(?:' . $this->_mod_regexp . '*)$~', $token)) {
- // object or variable
- $token = $this->_parse_var_props($token);
- } elseif(is_numeric($token)) {
- // number, skip it
- } else {
- $this->_syntax_error("unidentified token '$token'", E_USER_ERROR, __FILE__, __LINE__);
- }
- break;
- }
- }
-
- if ($elseif)
- return '<?php elseif ('.implode(' ', $tokens).'): ?>';
- else
- return '<?php if ('.implode(' ', $tokens).'): ?>';
- }
-
-
- function _compile_arg_list($type, $name, $attrs, &$cache_code) {
- $arg_list = array();
-
- if (isset($type) && isset($name)
- && isset($this->_plugins[$type])
- && isset($this->_plugins[$type][$name])
- && empty($this->_plugins[$type][$name][4])
- && is_array($this->_plugins[$type][$name][5])
- ) {
- /* we have a list of parameters that should be cached */
- $_cache_attrs = $this->_plugins[$type][$name][5];
- $_count = $this->_cache_attrs_count++;
- $cache_code = "\$_cache_attrs =& \$this->_smarty_cache_attrs('$this->_cache_serial','$_count');";
-
- } else {
- /* no parameters are cached */
- $_cache_attrs = null;
- }
-
- foreach ($attrs as $arg_name => $arg_value) {
- if (is_bool($arg_value))
- $arg_value = $arg_value ? 'true' : 'false';
- if (is_null($arg_value))
- $arg_value = 'null';
- if ($_cache_attrs && in_array($arg_name, $_cache_attrs)) {
- $arg_list[] = "'$arg_name' => (\$this->_cache_including) ? \$_cache_attrs['$arg_name'] : (\$_cache_attrs['$arg_name']=$arg_value)";
- } else {
- $arg_list[] = "'$arg_name' => $arg_value";
- }
- }
- return $arg_list;
- }
-
- /**
- * Parse is expression
- *
- * @param string $is_arg
- * @param array $tokens
- * @return array
- */
- function _parse_is_expr($is_arg, $tokens)
- {
- $expr_end = 0;
- $negate_expr = false;
-
- if (($first_token = array_shift($tokens)) == 'not') {
- $negate_expr = true;
- $expr_type = array_shift($tokens);
- } else
- $expr_type = $first_token;
-
- switch ($expr_type) {
- case 'even':
- if (isset($tokens[$expr_end]) && $tokens[$expr_end] == 'by') {
- $expr_end++;
- $expr_arg = $tokens[$expr_end++];
- $expr = "!(1 & ($is_arg / " . $this->_parse_var_props($expr_arg) . "))";
- } else
- $expr = "!(1 & $is_arg)";
- break;
-
- case 'odd':
- if (isset($tokens[$expr_end]) && $tokens[$expr_end] == 'by') {
- $expr_end++;
- $expr_arg = $tokens[$expr_end++];
- $expr = "(1 & ($is_arg / " . $this->_parse_var_props($expr_arg) . "))";
- } else
- $expr = "(1 & $is_arg)";
- break;
-
- case 'div':
- if (@$tokens[$expr_end] == 'by') {
- $expr_end++;
- $expr_arg = $tokens[$expr_end++];
- $expr = "!($is_arg % " . $this->_parse_var_props($expr_arg) . ")";
- } else {
- $this->_syntax_error("expecting 'by' after 'div'", E_USER_ERROR, __FILE__, __LINE__);
- }
- break;
-
- default:
- $this->_syntax_error("unknown 'is' expression - '$expr_type'", E_USER_ERROR, __FILE__, __LINE__);
- break;
- }
-
- if ($negate_expr) {
- $expr = "!($expr)";
- }
-
- array_splice($tokens, 0, $expr_end, $expr);
-
- return $tokens;
- }
-
-
- /**
- * Parse attribute string
- *
- * @param string $tag_args
- * @return array
- */
- function _parse_attrs($tag_args)
- {
-
- /* Tokenize tag attributes. */
- preg_match_all('~(?:' . $this->_obj_call_regexp . '|' . $this->_qstr_regexp . ' | (?>[^"\'=\s]+)
- )+ |
- [=]
- ~x', $tag_args, $match);
- $tokens = $match[0];
-
- $attrs = array();
- /* Parse state:
- 0 - expecting attribute name
- 1 - expecting '='
- 2 - expecting attribute value (not '=') */
- $state = 0;
-
- foreach ($tokens as $token) {
- switch ($state) {
- case 0:
- /* If the token is a valid identifier, we set attribute name
- and go to state 1. */
- if (preg_match('~^\w+$~', $token)) {
- $attr_name = $token;
- $state = 1;
- } else
- $this->_syntax_error("invalid attribute name: '$token'", E_USER_ERROR, __FILE__, __LINE__);
- break;
-
- case 1:
- /* If the token is '=', then we go to state 2. */
- if ($token == '=') {
- $state = 2;
- } else
- $this->_syntax_error("expecting '=' after attribute name '$last_token'", E_USER_ERROR, __FILE__, __LINE__);
- break;
-
- case 2:
- /* If token is not '=', we set the attribute value and go to
- state 0. */
- if ($token != '=') {
- /* We booleanize the token if it's a non-quoted possible
- boolean value. */
- if (preg_match('~^(on|yes|true)$~', $token)) {
- $token = 'true';
- } else if (preg_match('~^(off|no|false)$~', $token)) {
- $token = 'false';
- } else if ($token == 'null') {
- $token = 'null';
- } else if (preg_match('~^' . $this->_num_const_regexp . '|0[xX][0-9a-fA-F]+$~', $token)) {
- /* treat integer literally */
- } else if (!preg_match('~^' . $this->_obj_call_regexp . '|' . $this->_var_regexp . '(?:' . $this->_mod_regexp . ')*$~', $token)) {
- /* treat as a string, double-quote it escaping quotes */
- $token = '"'.addslashes($token).'"';
- }
-
- $attrs[$attr_name] = $token;
- $state = 0;
- } else
- $this->_syntax_error("'=' cannot be an attribute value", E_USER_ERROR, __FILE__, __LINE__);
- break;
- }
- $last_token = $token;
- }
-
- if($state != 0) {
- if($state == 1) {
- $this->_syntax_error("expecting '=' after attribute name '$last_token'", E_USER_ERROR, __FILE__, __LINE__);
- } else {
- $this->_syntax_error("missing attribute value", E_USER_ERROR, __FILE__, __LINE__);
- }
- }
-
- $this->_parse_vars_props($attrs);
-
- return $attrs;
- }
-
- /**
- * compile multiple variables and section properties tokens into
- * PHP code
- *
- * @param array $tokens
- */
- function _parse_vars_props(&$tokens)
- {
- foreach($tokens as $key => $val) {
- $tokens[$key] = $this->_parse_var_props($val);
- }
- }
-
- /**
- * compile single variable and section properties token into
- * PHP code
- *
- * @param string $val
- * @param string $tag_attrs
- * @return string
- */
- function _parse_var_props($val)
- {
- $val = trim($val);
-
- if(preg_match('~^(' . $this->_obj_call_regexp . '|' . $this->_dvar_regexp . ')(' . $this->_mod_regexp . '*)$~', $val, $match)) {
- // $ variable or object
- $return = $this->_parse_var($match[1]);
- $modifiers = $match[2];
- if (!empty($this->default_modifiers) && !preg_match('~(^|\|)smarty:nodefaults($|\|)~',$modifiers)) {
- $_default_mod_string = implode('|',(array)$this->default_modifiers);
- $modifiers = empty($modifiers) ? $_default_mod_string : $_default_mod_string . '|' . $modifiers;
- }
- $this->_parse_modifiers($return, $modifiers);
- return $return;
- } elseif (preg_match('~^' . $this->_db_qstr_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) {
- // double quoted text
- preg_match('~^(' . $this->_db_qstr_regexp . ')('. $this->_mod_regexp . '*)$~', $val, $match);
- $return = $this->_expand_quoted_text($match[1]);
- if($match[2] != '') {
- $this->_parse_modifiers($return, $match[2]);
- }
- return $return;
- }
- elseif(preg_match('~^' . $this->_num_const_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) {
- // numerical constant
- preg_match('~^(' . $this->_num_const_regexp . ')('. $this->_mod_regexp . '*)$~', $val, $match);
- if($match[2] != '') {
- $this->_parse_modifiers($match[1], $match[2]);
- return $match[1];
- }
- }
- elseif(preg_match('~^' . $this->_si_qstr_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) {
- // single quoted text
- preg_match('~^(' . $this->_si_qstr_regexp . ')('. $this->_mod_regexp . '*)$~', $val, $match);
- if($match[2] != '') {
- $this->_parse_modifiers($match[1], $match[2]);
- return $match[1];
- }
- }
- elseif(preg_match('~^' . $this->_cvar_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) {
- // config var
- return $this->_parse_conf_var($val);
- }
- elseif(preg_match('~^' . $this->_svar_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) {
- // section var
- return $this->_parse_section_prop($val);
- }
- elseif(!in_array($val, $this->_permitted_tokens) && !is_numeric($val)) {
- // literal string
- return $this->_expand_quoted_text('"' . strtr($val, array('\\' => '\\\\', '"' => '\\"')) .'"');
- }
- return $val;
- }
-
- /**
- * expand quoted text with embedded variables
- *
- * @param string $var_expr
- * @return string
- */
- function _expand_quoted_text($var_expr)
- {
- // if contains unescaped $, expand it
- if(preg_match_all('~(?:\`(?<!\\\\)\$' . $this->_dvar_guts_regexp . '(?:' . $this->_obj_ext_regexp . ')*\`)|(?:(?<!\\\\)\$\w+(\[[a-zA-Z0-9]+\])*)~', $var_expr, $_match)) {
- $_match = $_match[0];
- $_replace = array();
- foreach($_match as $_var) {
- $_replace[$_var] = '".(' . $this->_parse_var(str_replace('`','',$_var)) . ')."';
- }
- $var_expr = strtr($var_expr, $_replace);
- $_return = preg_replace('~\.""|(?<!\\\\)""\.~', '', $var_expr);
- } else {
- $_return = $var_expr;
- }
- // replace double quoted literal string with single quotes
- $_return = preg_replace('~^"([\s\w]+)"$~',"'\\1'",$_return);
- return $_return;
- }
-
- /**
- * parse variable expression into PHP code
- *
- * @param string $var_expr
- * @param string $output
- * @return string
- */
- function _parse_var($var_expr)
- {
- $_has_math = false;
- $_math_vars = preg_split('~('.$this->_dvar_math_regexp.'|'.$this->_qstr_regexp.')~', $var_expr, -1, PREG_SPLIT_DELIM_CAPTURE);
-
- if(count($_math_vars) > 1) {
- $_first_var = "";
- $_complete_var = "";
- $_output = "";
- // simple check if there is any math, to stop recursion (due to modifiers with "xx % yy" as parameter)
- foreach($_math_vars as $_k => $_math_var) {
- $_math_var = $_math_vars[$_k];
-
- if(!empty($_math_var) || is_numeric($_math_var)) {
- // hit a math operator, so process the stuff which came before it
- if(preg_match('~^' . $this->_dvar_math_regexp . '$~', $_math_var)) {
- $_has_math = true;
- if(!empty($_complete_var) || is_numeric($_complete_var)) {
- $_output .= $this->_parse_var($_complete_var);
- }
-
- // just output the math operator to php
- $_output .= $_math_var;
-
- if(empty($_first_var))
- $_first_var = $_complete_var;
-
- $_complete_var = "";
- } else {
- $_complete_var .= $_math_var;
- }
- }
- }
- if($_has_math) {
- if(!empty($_complete_var) || is_numeric($_complete_var))
- $_output .= $this->_parse_var($_complete_var);
-
- // get the modifiers working (only the last var from math + modifier is left)
- $var_expr = $_complete_var;
- }
- }
-
- // prevent cutting of first digit in the number (we _definitly_ got a number if the first char is a digit)
- if(is_numeric(substr($var_expr, 0, 1)))
- $_var_ref = $var_expr;
- else
- $_var_ref = substr($var_expr, 1);
-
- if(!$_has_math) {
-
- // get [foo] and .foo and ->foo and (...) pieces
- preg_match_all('~(?:^\w+)|' . $this->_obj_params_regexp . '|(?:' . $this->_var_bracket_regexp . ')|->\$?\w+|\.\$?\w+|\S+~', $_var_ref, $match);
-
- $_indexes = $match[0];
- $_var_name = array_shift($_indexes);
-
- /* Handle $smarty.* variable references as a special case. */
- if ($_var_name == 'smarty') {
- /*
- * If the reference could be compiled, use the compiled output;
- * otherwise, fall back on the $smarty variable generated at
- * run-time.
- */
- if (($smarty_ref = $this->_compile_smarty_ref($_indexes)) !== null) {
- $_output = $smarty_ref;
- } else {
- $_var_name = substr(array_shift($_indexes), 1);
- $_output = "\$this->_smarty_vars['$_var_name']";
- }
- } elseif(is_numeric($_var_name) && is_numeric(substr($var_expr, 0, 1))) {
- // because . is the operator for accessing arrays thru inidizes we need to put it together again for floating point numbers
- if(count($_indexes) > 0)
- {
- $_var_name .= implode("", $_indexes);
- $_indexes = array();
- }
- $_output = $_var_name;
- } else {
- $_output = "\$this->_tpl_vars['$_var_name']";
- }
-
- foreach ($_indexes as $_index) {
- if (substr($_index, 0, 1) == '[') {
- $_index = substr($_index, 1, -1);
- if (is_numeric($_index)) {
- $_output .= "[$_index]";
- } elseif (substr($_index, 0, 1) == '$') {
- if (strpos($_index, '.') !== false) {
- $_output .= '[' . $this->_parse_var($_index) . ']';
- } else {
- $_output .= "[\$this->_tpl_vars['" . substr($_index, 1) . "']]";
- }
- } else {
- $_var_parts = explode('.', $_index);
- $_var_section = $_var_parts[0];
- $_var_section_prop = isset($_var_parts[1]) ? $_var_parts[1] : 'index';
- $_output .= "[\$this->_sections['$_var_section']['$_var_section_prop']]";
- }
- } else if (substr($_index, 0, 1) == '.') {
- if (substr($_index, 1, 1) == '$')
- $_output .= "[\$this->_tpl_vars['" . substr($_index, 2) . "']]";
- else
- $_output .= "['" . substr($_index, 1) . "']";
- } else if (substr($_index,0,2) == '->') {
- if(substr($_index,2,2) == '__') {
- $this->_syntax_error('call to internal object members is not allowed', E_USER_ERROR, __FILE__, __LINE__);
- } elseif($this->security && substr($_index, 2, 1) == '_') {
- $this->_syntax_error('(secure) call to private object member is not allowed', E_USER_ERROR, __FILE__, __LINE__);
- } elseif (substr($_index, 2, 1) == '$') {
- if ($this->security) {
- $this->_syntax_error('(secure) call to dynamic object member is not allowed', E_USER_ERROR, __FILE__, __LINE__);
- } else {
- $_output .= '->{(($_var=$this->_tpl_vars[\''.substr($_index,3).'\']) && substr($_var,0,2)!=\'__\') ? $_var : $this->trigger_error("cannot access property \\"$_var\\"")}';
- }
- } else {
- $_output .= $_index;
- }
- } elseif (substr($_index, 0, 1) == '(') {
- $_index = $this->_parse_parenth_args($_index);
- $_output .= $_index;
- } else {
- $_output .= $_index;
- }
- }
- }
-
- return $_output;
- }
-
- /**
- * parse arguments in function call parenthesis
- *
- * @param string $parenth_args
- * @return string
- */
- function _parse_parenth_args($parenth_args)
- {
- preg_match_all('~' . $this->_param_regexp . '~',$parenth_args, $match);
- $orig_vals = $match = $match[0];
- $this->_parse_vars_props($match);
- $replace = array();
- for ($i = 0, $count = count($match); $i < $count; $i++) {
- $replace[$orig_vals[$i]] = $match[$i];
- }
- return strtr($parenth_args, $replace);
- }
-
- /**
- * parse configuration variable expression into PHP code
- *
- * @param string $conf_var_expr
- */
- function _parse_conf_var($conf_var_expr)
- {
- $parts = explode('|', $conf_var_expr, 2);
- $var_ref = $parts[0];
- $modifiers = isset($parts[1]) ? $parts[1] : '';
-
- $var_name = substr($var_ref, 1, -1);
-
- $output = "\$this->_config[0]['vars']['$var_name']";
-
- $this->_parse_modifiers($output, $modifiers);
-
- return $output;
- }
-
- /**
- * parse section property expression into PHP code
- *
- * @param string $section_prop_expr
- * @return string
- */
- function _parse_section_prop($section_prop_expr)
- {
- $parts = explode('|', $section_prop_expr, 2);
- $var_ref = $parts[0];
- $modifiers = isset($parts[1]) ? $parts[1] : '';
-
- preg_match('!%(\w+)\.(\w+)%!', $var_ref, $match);
- $section_name = $match[1];
- $prop_name = $match[2];
-
- $output = "\$this->_sections['$section_name']['$prop_name']";
-
- $this->_parse_modifiers($output, $modifiers);
-
- return $output;
- }
-
-
- /**
- * parse modifier chain into PHP code
- *
- * sets $output to parsed modified chain
- * @param string $output
- * @param string $modifier_string
- */
- function _parse_modifiers(&$output, $modifier_string)
- {
- preg_match_all('~\|(@?\w+)((?>:(?:'. $this->_qstr_regexp . '|[^|]+))*)~', '|' . $modifier_string, $_match);
- list(, $_modifiers, $modifier_arg_strings) = $_match;
-
- for ($_i = 0, $_for_max = count($_modifiers); $_i < $_for_max; $_i++) {
- $_modifier_name = $_modifiers[$_i];
-
- if($_modifier_name == 'smarty') {
- // skip smarty modifier
- continue;
- }
-
- preg_match_all('~:(' . $this->_qstr_regexp . '|[^:]+)~', $modifier_arg_strings[$_i], $_match);
- $_modifier_args = $_match[1];
-
- if (substr($_modifier_name, 0, 1) == '@') {
- $_map_array = false;
- $_modifier_name = substr($_modifier_name, 1);
- } else {
- $_map_array = true;
- }
-
- if (empty($this->_plugins['modifier'][$_modifier_name])
- && !$this->_get_plugin_filepath('modifier', $_modifier_name)
- && function_exists($_modifier_name)) {
- if ($this->security && !in_array($_modifier_name, $this->security_settings['MODIFIER_FUNCS'])) {
- $this->_trigger_fatal_error("[plugin] (secure mode) modifier '$_modifier_name' is not allowed" , $this->_current_file, $this->_current_line_no, __FILE__, __LINE__);
- } else {
- $this->_plugins['modifier'][$_modifier_name] = array($_modifier_name, null, null, false);
- }
- }
- $this->_add_plugin('modifier', $_modifier_name);
-
- $this->_parse_vars_props($_modifier_args);
-
- if($_modifier_name == 'default') {
- // supress notifications of default modifier vars and args
- if(substr($output, 0, 1) == '$') {
- $output = '@' . $output;
- }
- if(isset($_modifier_args[0]) && substr($_modifier_args[0], 0, 1) == '$') {
- $_modifier_args[0] = '@' . $_modifier_args[0];
- }
- }
- if (count($_modifier_args) > 0)
- $_modifier_args = ', '.implode(', ', $_modifier_args);
- else
- $_modifier_args = '';
-
- if ($_map_array) {
- $output = "((is_array(\$_tmp=$output)) ? \$this->_run_mod_handler('$_modifier_name', true, \$_tmp$_modifier_args) : " . $this->_compile_plugin_call('modifier', $_modifier_name) . "(\$_tmp$_modifier_args))";
-
- } else {
-
- $output = $this->_compile_plugin_call('modifier', $_modifier_name)."($output$_modifier_args)";
-
- }
- }
- }
-
-
- /**
- * add plugin
- *
- * @param string $type
- * @param string $name
- * @param boolean? $delayed_loading
- */
- function _add_plugin($type, $name, $delayed_loading = null)
- {
- if (!isset($this->_plugin_info[$type])) {
- $this->_plugin_info[$type] = array();
- }
- if (!isset($this->_plugin_info[$type][$name])) {
- $this->_plugin_info[$type][$name] = array($this->_current_file,
- $this->_current_line_no,
- $delayed_loading);
- }
- }
-
-
- /**
- * Compiles references of type $smarty.foo
- *
- * @param string $indexes
- * @return string
- */
- function _compile_smarty_ref(&$indexes)
- {
- /* Extract the reference name. */
- $_ref = substr($indexes[0], 1);
- foreach($indexes as $_index_no=>$_index) {
- if (substr($_index, 0, 1) != '.' && $_index_no<2 || !preg_match('~^(\.|\[|->)~', $_index)) {
- $this->_syntax_error('$smarty' . implode('', array_slice($indexes, 0, 2)) . ' is an invalid reference', E_USER_ERROR, __FILE__, __LINE__);
- }
- }
-
- switch ($_ref) {
- case 'now':
- $compiled_ref = 'time()';
- $_max_index = 1;
- break;
-
- case 'foreach':
- array_shift($indexes);
- $_var = $this->_parse_var_props(substr($indexes[0], 1));
- $_propname = substr($indexes[1], 1);
- $_max_index = 1;
- switch ($_propname) {
- case 'index':
- array_shift($indexes);
- $compiled_ref = "(\$this->_foreach[$_var]['iteration']-1)";
- break;
-
- case 'first':
- array_shift($indexes);
- $compiled_ref = "(\$this->_foreach[$_var]['iteration'] <= 1)";
- break;
-
- case 'last':
- array_shift($indexes);
- $compiled_ref = "(\$this->_foreach[$_var]['iteration'] == \$this->_foreach[$_var]['total'])";
- break;
-
- case 'show':
- array_shift($indexes);
- $compiled_ref = "(\$this->_foreach[$_var]['total'] > 0)";
- break;
-
- default:
- unset($_max_index);
- $compiled_ref = "\$this->_foreach[$_var]";
- }
- break;
-
- case 'section':
- array_shift($indexes);
- $_var = $this->_parse_var_props(substr($indexes[0], 1));
- $compiled_ref = "\$this->_sections[$_var]";
- break;
-
- case 'get':
- if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) {
- $this->_syntax_error("(secure mode) super global access not permitted",
- E_USER_WARNING, __FILE__, __LINE__);
- return;
- }
- $compiled_ref = "\$_GET";
- break;
-
- case 'post':
- if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) {
- $this->_syntax_error("(secure mode) super global access not permitted",
- E_USER_WARNING, __FILE__, __LINE__);
- return;
- }
- $compiled_ref = "\$_POST";
- break;
-
- case 'cookies':
- if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) {
- $this->_syntax_error("(secure mode) super global access not permitted",
- E_USER_WARNING, __FILE__, __LINE__);
- return;
- }
- $compiled_ref = "\$_COOKIE";
- break;
-
- case 'env':
- if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) {
- $this->_syntax_error("(secure mode) super global access not permitted",
- E_USER_WARNING, __FILE__, __LINE__);
- return;
- }
- $compiled_ref = "\$_ENV";
- break;
-
- case 'server':
- if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) {
- $this->_syntax_error("(secure mode) super global access not permitted",
- E_USER_WARNING, __FILE__, __LINE__);
- return;
- }
- $compiled_ref = "\$_SERVER";
- break;
-
- case 'session':
- if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) {
- $this->_syntax_error("(secure mode) super global access not permitted",
- E_USER_WARNING, __FILE__, __LINE__);
- return;
- }
- $compiled_ref = "\$_SESSION";
- break;
-
- /*
- * These cases are handled either at run-time or elsewhere in the
- * compiler.
- */
- case 'request':
- if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) {
- $this->_syntax_error("(secure mode) super global access not permitted",
- E_USER_WARNING, __FILE__, __LINE__);
- return;
- }
- if ($this->request_use_auto_globals) {
- $compiled_ref = "\$_REQUEST";
- break;
- } else {
- $this->_init_smarty_vars = true;
- }
- return null;
-
- case 'capture':
- return null;
-
- case 'template':
- $compiled_ref = "'$this->_current_file'";
- $_max_index = 1;
- break;
-
- case 'version':
- $compiled_ref = "'$this->_version'";
- $_max_index = 1;
- break;
-
- case 'const':
- if ($this->security && !$this->security_settings['ALLOW_CONSTANTS']) {
- $this->_syntax_error("(secure mode) constants not permitted",
- E_USER_WARNING, __FILE__, __LINE__);
- return;
- }
- array_shift($indexes);
- if (preg_match('!^\.\w+$!', $indexes[0])) {
- $compiled_ref = '@' . substr($indexes[0], 1);
- } else {
- $_val = $this->_parse_var_props(substr($indexes[0], 1));
- $compiled_ref = '@constant(' . $_val . ')';
- }
- $_max_index = 1;
- break;
-
- case 'config':
- $compiled_ref = "\$this->_config[0]['vars']";
- $_max_index = 3;
- break;
-
- case 'ldelim':
- $compiled_ref = "'$this->left_delimiter'";
- break;
-
- case 'rdelim':
- $compiled_ref = "'$this->right_delimiter'";
- break;
-
- default:
- $this->_syntax_error('$smarty.' . $_ref . ' is an unknown reference', E_USER_ERROR, __FILE__, __LINE__);
- break;
- }
-
- if (isset($_max_index) && count($indexes) > $_max_index) {
- $this->_syntax_error('$smarty' . implode('', $indexes) .' is an invalid reference', E_USER_ERROR, __FILE__, __LINE__);
- }
-
- array_shift($indexes);
- return $compiled_ref;
- }
-
- /**
- * compiles call to plugin of type $type with name $name
- * returns a string containing the function-name or method call
- * without the paramter-list that would have follow to make the
- * call valid php-syntax
- *
- * @param string $type
- * @param string $name
- * @return string
- */
- function _compile_plugin_call($type, $name) {
- if (isset($this->_plugins[$type][$name])) {
- /* plugin loaded */
- if (is_array($this->_plugins[$type][$name][0])) {
- return ((is_object($this->_plugins[$type][$name][0][0])) ?
- "\$this->_plugins['$type']['$name'][0][0]->" /* method callback */
- : (string)($this->_plugins[$type][$name][0][0]).'::' /* class callback */
- ). $this->_plugins[$type][$name][0][1];
-
- } else {
- /* function callback */
- return $this->_plugins[$type][$name][0];
-
- }
- } else {
- /* plugin not loaded -> auto-loadable-plugin */
- return 'smarty_'.$type.'_'.$name;
-
- }
- }
-
- /**
- * load pre- and post-filters
- */
- function _load_filters()
- {
- if (count($this->_plugins['prefilter']) > 0) {
- foreach ($this->_plugins['prefilter'] as $filter_name => $prefilter) {
- if ($prefilter === false) {
- unset($this->_plugins['prefilter'][$filter_name]);
- $_params = array('plugins' => array(array('prefilter', $filter_name, null, null, false)));
- require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');
- smarty_core_load_plugins($_params, $this);
- }
- }
- }
- if (count($this->_plugins['postfilter']) > 0) {
- foreach ($this->_plugins['postfilter'] as $filter_name => $postfilter) {
- if ($postfilter === false) {
- unset($this->_plugins['postfilter'][$filter_name]);
- $_params = array('plugins' => array(array('postfilter', $filter_name, null, null, false)));
- require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');
- smarty_core_load_plugins($_params, $this);
- }
- }
- }
- }
-
-
- /**
- * Quote subpattern references
- *
- * @param string $string
- * @return string
- */
- function _quote_replace($string)
- {
- return strtr($string, array('\\' => '\\\\', '$' => '\\$'));
- }
-
- /**
- * display Smarty syntax error
- *
- * @param string $error_msg
- * @param integer $error_type
- * @param string $file
- * @param integer $line
- */
- function _syntax_error($error_msg, $error_type = E_USER_ERROR, $file=null, $line=null)
- {
- $this->_trigger_fatal_error("syntax error: $error_msg", $this->_current_file, $this->_current_line_no, $file, $line, $error_type);
- }
-
-
- /**
- * check if the compilation changes from cacheable to
- * non-cacheable state with the beginning of the current
- * plugin. return php-code to reflect the transition.
- * @return string
- */
- function _push_cacheable_state($type, $name) {
- $_cacheable = !isset($this->_plugins[$type][$name]) || $this->_plugins[$type][$name][4];
- if ($_cacheable
- || 0<$this->_cacheable_state++) return '';
- if (!isset($this->_cache_serial)) $this->_cache_serial = md5(uniqid('Smarty'));
- $_ret = 'if ($this->caching && !$this->_cache_including): echo \'{nocache:'
- . $this->_cache_serial . '#' . $this->_nocache_count
- . '}\'; endif;';
- return $_ret;
- }
-
-
- /**
- * check if the compilation changes from non-cacheable to
- * cacheable state with the end of the current plugin return
- * php-code to reflect the transition.
- * @return string
- */
- function _pop_cacheable_state($type, $name) {
- $_cacheable = !isset($this->_plugins[$type][$name]) || $this->_plugins[$type][$name][4];
- if ($_cacheable
- || --$this->_cacheable_state>0) return '';
- return 'if ($this->caching && !$this->_cache_including): echo \'{/nocache:'
- . $this->_cache_serial . '#' . ($this->_nocache_count++)
- . '}\'; endif;';
- }
-
-
- /**
- * push opening tag-name, file-name and line-number on the tag-stack
- * @param string the opening tag's name
- */
- function _push_tag($open_tag)
- {
- array_push($this->_tag_stack, array($open_tag, $this->_current_line_no));
- }
-
- /**
- * pop closing tag-name
- * raise an error if this stack-top doesn't match with the closing tag
- * @param string the closing tag's name
- * @return string the opening tag's name
- */
- function _pop_tag($close_tag)
- {
- $message = '';
- if (count($this->_tag_stack)>0) {
- list($_open_tag, $_line_no) = array_pop($this->_tag_stack);
- if ($close_tag == $_open_tag) {
- return $_open_tag;
- }
- if ($close_tag == 'if' && ($_open_tag == 'else' || $_open_tag == 'elseif' )) {
- return $this->_pop_tag($close_tag);
- }
- if ($close_tag == 'section' && $_open_tag == 'sectionelse') {
- $this->_pop_tag($close_tag);
- return $_open_tag;
- }
- if ($close_tag == 'foreach' && $_open_tag == 'foreachelse') {
- $this->_pop_tag($close_tag);
- return $_open_tag;
- }
- if ($_open_tag == 'else' || $_open_tag == 'elseif') {
- $_open_tag = 'if';
- } elseif ($_open_tag == 'sectionelse') {
- $_open_tag = 'section';
- } elseif ($_open_tag == 'foreachelse') {
- $_open_tag = 'foreach';
- }
- $message = " expected {/$_open_tag} (opened line $_line_no).";
- }
- $this->_syntax_error("mismatched tag {/$close_tag}.$message",
- E_USER_ERROR, __FILE__, __LINE__);
- }
-
-}
-
-/**
- * compare to values by their string length
- *
- * @access private
- * @param string $a
- * @param string $b
- * @return 0|-1|1
- */
-function _smarty_sort_length($a, $b)
-{
- if($a == $b)
- return 0;
-
- if(strlen($a) == strlen($b))
- return ($a > $b) ? -1 : 1;
-
- return (strlen($a) > strlen($b)) ? -1 : 1;
-}
-
-
-/* vim: set et: */
-
-?>
diff --git a/include/smarty/libs/debug.tpl b/include/smarty/libs/debug.tpl
index c05ef5d0b..12eef0ffd 100644
--- a/include/smarty/libs/debug.tpl
+++ b/include/smarty/libs/debug.tpl
@@ -1,14 +1,10 @@
-{* Smarty *}
-{* debug.tpl, last updated version 2.1.0 *}
-{assign_debug_info}
-{capture assign=debug_output}
+{capture name='_smarty_debug' assign=debug_output}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>Smarty Debug Console</title>
-{literal}
<style type="text/css">
-/* <![CDATA[ */
+{literal}
body, h1, h2, td, th, p {
font-family: sans-serif;
font-weight: normal;
@@ -85,73 +81,53 @@ td {
#table_config_vars th {
color: maroon;
}
-/* ]]> */
-</style>
{/literal}
+</style>
</head>
<body>
-<h1>Smarty Debug Console</h1>
+<h1>Smarty Debug Console - {if isset($template_name)}{$template_name|debug_print_var nofilter}{else}Total Time {$execution_time|string_format:"%.5f"}{/if}</h1>
+{if !empty($template_data)}
<h2>included templates &amp; config files (load time in seconds)</h2>
<div>
-{section name=templates loop=$_debug_tpls}
- {section name=indent loop=$_debug_tpls[templates].depth}&nbsp;&nbsp;&nbsp;{/section}
- <font color={if $_debug_tpls[templates].type eq "template"}brown{elseif $_debug_tpls[templates].type eq "insert"}black{else}green{/if}>
- {$_debug_tpls[templates].filename|escape:html}</font>
- {if isset($_debug_tpls[templates].exec_time)}
- <span class="exectime">
- ({$_debug_tpls[templates].exec_time|string_format:"%.5f"})
- {if %templates.index% eq 0}(total){/if}
- </span>
- {/if}
- <br />
-{sectionelse}
- <p>no templates included</p>
-{/section}
+{foreach $template_data as $template}
+ <font color=brown>{$template.name}</font>
+ <span class="exectime">
+ (compile {$template['compile_time']|string_format:"%.5f"}) (render {$template['render_time']|string_format:"%.5f"}) (cache {$template['cache_time']|string_format:"%.5f"})
+ </span>
+ <br>
+{/foreach}
</div>
+{/if}
<h2>assigned template variables</h2>
<table id="table_assigned_vars">
- {section name=vars loop=$_debug_keys}
- <tr class="{cycle values="odd,even"}">
- <th>{ldelim}${$_debug_keys[vars]|escape:'html'}{rdelim}</th>
- <td>{$_debug_vals[vars]|@debug_print_var}</td></tr>
- {sectionelse}
- <tr><td><p>no template variables assigned</p></td></tr>
- {/section}
+ {foreach $assigned_vars as $vars}
+ <tr class="{if $vars@iteration % 2 eq 0}odd{else}even{/if}">
+ <th>${$vars@key|escape:'html'}</th>
+ <td>{$vars|debug_print_var nofilter}</td></tr>
+ {/foreach}
</table>
<h2>assigned config file variables (outer template scope)</h2>
<table id="table_config_vars">
- {section name=config_vars loop=$_debug_config_keys}
- <tr class="{cycle values="odd,even"}">
- <th>{ldelim}#{$_debug_config_keys[config_vars]|escape:'html'}#{rdelim}</th>
- <td>{$_debug_config_vals[config_vars]|@debug_print_var}</td></tr>
- {sectionelse}
- <tr><td><p>no config vars assigned</p></td></tr>
- {/section}
+ {foreach $config_vars as $vars}
+ <tr class="{if $vars@iteration % 2 eq 0}odd{else}even{/if}">
+ <th>{$vars@key|escape:'html'}</th>
+ <td>{$vars|debug_print_var nofilter}</td></tr>
+ {/foreach}
+
</table>
</body>
</html>
{/capture}
-{if isset($_smarty_debug_output) and $_smarty_debug_output eq "html"}
- {$debug_output}
-{else}
<script type="text/javascript">
-// <![CDATA[
- if ( self.name == '' ) {ldelim}
- var title = 'Console';
- {rdelim}
- else {ldelim}
- var title = 'Console_' + self.name;
- {rdelim}
- _smarty_console = window.open("",title.value,"width=680,height=600,resizable,scrollbars=yes");
- _smarty_console.document.write('{$debug_output|escape:'javascript'}');
+{$id = $template_name|default:''|md5}
+ _smarty_console = window.open("","console{$id}","width=680,height=600,resizable,scrollbars=yes");
+ _smarty_console.document.write("{$debug_output|escape:'javascript' nofilter}");
_smarty_console.document.close();
-// ]]>
</script>
-{/if} \ No newline at end of file
diff --git a/include/smarty/libs/internals/core.assemble_plugin_filepath.php b/include/smarty/libs/internals/core.assemble_plugin_filepath.php
deleted file mode 100644
index 690d3ddbc..000000000
--- a/include/smarty/libs/internals/core.assemble_plugin_filepath.php
+++ /dev/null
@@ -1,67 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * assemble filepath of requested plugin
- *
- * @param string $type
- * @param string $name
- * @return string|false
- */
-function smarty_core_assemble_plugin_filepath($params, &$smarty)
-{
- static $_filepaths_cache = array();
-
- $_plugin_filename = $params['type'] . '.' . $params['name'] . '.php';
- if (isset($_filepaths_cache[$_plugin_filename])) {
- return $_filepaths_cache[$_plugin_filename];
- }
- $_return = false;
-
- foreach ((array)$smarty->plugins_dir as $_plugin_dir) {
-
- $_plugin_filepath = $_plugin_dir . DIRECTORY_SEPARATOR . $_plugin_filename;
-
- // see if path is relative
- if (!preg_match("/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/", $_plugin_dir)) {
- $_relative_paths[] = $_plugin_dir;
- // relative path, see if it is in the SMARTY_DIR
- if (@is_readable(SMARTY_DIR . $_plugin_filepath)) {
- $_return = SMARTY_DIR . $_plugin_filepath;
- break;
- }
- }
- // try relative to cwd (or absolute)
- if (@is_readable($_plugin_filepath)) {
- $_return = $_plugin_filepath;
- break;
- }
- }
-
- if($_return === false) {
- // still not found, try PHP include_path
- if(isset($_relative_paths)) {
- foreach ((array)$_relative_paths as $_plugin_dir) {
-
- $_plugin_filepath = $_plugin_dir . DIRECTORY_SEPARATOR . $_plugin_filename;
-
- $_params = array('file_path' => $_plugin_filepath);
- require_once(SMARTY_CORE_DIR . 'core.get_include_path.php');
- if(smarty_core_get_include_path($_params, $smarty)) {
- $_return = $_params['new_file_path'];
- break;
- }
- }
- }
- }
- $_filepaths_cache[$_plugin_filename] = $_return;
- return $_return;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/internals/core.assign_smarty_interface.php b/include/smarty/libs/internals/core.assign_smarty_interface.php
deleted file mode 100644
index 7e65a73ec..000000000
--- a/include/smarty/libs/internals/core.assign_smarty_interface.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Smarty assign_smarty_interface core plugin
- *
- * Type: core<br>
- * Name: assign_smarty_interface<br>
- * Purpose: assign the $smarty interface variable
- * @param array Format: null
- * @param Smarty
- */
-function smarty_core_assign_smarty_interface($params, &$smarty)
-{
- if (isset($smarty->_smarty_vars) && isset($smarty->_smarty_vars['request'])) {
- return;
- }
-
- $_globals_map = array('g' => 'HTTP_GET_VARS',
- 'p' => 'HTTP_POST_VARS',
- 'c' => 'HTTP_COOKIE_VARS',
- 's' => 'HTTP_SERVER_VARS',
- 'e' => 'HTTP_ENV_VARS');
-
- $_smarty_vars_request = array();
-
- foreach (preg_split('!!', strtolower($smarty->request_vars_order)) as $_c) {
- if (isset($_globals_map[$_c])) {
- $_smarty_vars_request = array_merge($_smarty_vars_request, $GLOBALS[$_globals_map[$_c]]);
- }
- }
- $_smarty_vars_request = @array_merge($_smarty_vars_request, $GLOBALS['HTTP_SESSION_VARS']);
-
- $smarty->_smarty_vars['request'] = $_smarty_vars_request;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/internals/core.create_dir_structure.php b/include/smarty/libs/internals/core.create_dir_structure.php
deleted file mode 100644
index 3eecc4972..000000000
--- a/include/smarty/libs/internals/core.create_dir_structure.php
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * create full directory structure
- *
- * @param string $dir
- */
-
-// $dir
-
-function smarty_core_create_dir_structure($params, &$smarty)
-{
- if (!file_exists($params['dir'])) {
- $_open_basedir_ini = ini_get('open_basedir');
-
- if (DIRECTORY_SEPARATOR=='/') {
- /* unix-style paths */
- $_dir = $params['dir'];
- $_dir_parts = preg_split('!/+!', $_dir, -1, PREG_SPLIT_NO_EMPTY);
- $_new_dir = (substr($_dir, 0, 1)=='/') ? '/' : getcwd().'/';
- if($_use_open_basedir = !empty($_open_basedir_ini)) {
- $_open_basedirs = explode(':', $_open_basedir_ini);
- }
-
- } else {
- /* other-style paths */
- $_dir = str_replace('\\','/', $params['dir']);
- $_dir_parts = preg_split('!/+!', $_dir, -1, PREG_SPLIT_NO_EMPTY);
- if (preg_match('!^((//)|([a-zA-Z]:/))!', $_dir, $_root_dir)) {
- /* leading "//" for network volume, or "[letter]:/" for full path */
- $_new_dir = $_root_dir[1];
- /* remove drive-letter from _dir_parts */
- if (isset($_root_dir[3])) array_shift($_dir_parts);
-
- } else {
- $_new_dir = str_replace('\\', '/', getcwd()).'/';
-
- }
-
- if($_use_open_basedir = !empty($_open_basedir_ini)) {
- $_open_basedirs = explode(';', str_replace('\\', '/', $_open_basedir_ini));
- }
-
- }
-
- /* all paths use "/" only from here */
- foreach ($_dir_parts as $_dir_part) {
- $_new_dir .= $_dir_part;
-
- if ($_use_open_basedir) {
- // do not attempt to test or make directories outside of open_basedir
- $_make_new_dir = false;
- foreach ($_open_basedirs as $_open_basedir) {
- if (substr($_new_dir, 0, strlen($_open_basedir)) == $_open_basedir) {
- $_make_new_dir = true;
- break;
- }
- }
- } else {
- $_make_new_dir = true;
- }
-
- if ($_make_new_dir && !file_exists($_new_dir) && !@mkdir($_new_dir, $smarty->_dir_perms) && !is_dir($_new_dir)) {
- $smarty->trigger_error("problem creating directory '" . $_new_dir . "'");
- return false;
- }
- $_new_dir .= '/';
- }
- }
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/internals/core.display_debug_console.php b/include/smarty/libs/internals/core.display_debug_console.php
deleted file mode 100644
index 1a80f3909..000000000
--- a/include/smarty/libs/internals/core.display_debug_console.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Smarty debug_console function plugin
- *
- * Type: core<br>
- * Name: display_debug_console<br>
- * Purpose: display the javascript debug console window
- * @param array Format: null
- * @param Smarty
- */
-function smarty_core_display_debug_console($params, &$smarty)
-{
- // we must force compile the debug template in case the environment
- // changed between separate applications.
-
- if(empty($smarty->debug_tpl)) {
- // set path to debug template from SMARTY_DIR
- $smarty->debug_tpl = SMARTY_DIR . 'debug.tpl';
- if($smarty->security && is_file($smarty->debug_tpl)) {
- $smarty->secure_dir[] = realpath($smarty->debug_tpl);
- }
- $smarty->debug_tpl = 'file:' . SMARTY_DIR . 'debug.tpl';
- }
-
- $_ldelim_orig = $smarty->left_delimiter;
- $_rdelim_orig = $smarty->right_delimiter;
-
- $smarty->left_delimiter = '{';
- $smarty->right_delimiter = '}';
-
- $_compile_id_orig = $smarty->_compile_id;
- $smarty->_compile_id = null;
-
- $_compile_path = $smarty->_get_compile_path($smarty->debug_tpl);
- if ($smarty->_compile_resource($smarty->debug_tpl, $_compile_path))
- {
- ob_start();
- $smarty->_include($_compile_path);
- $_results = ob_get_contents();
- ob_end_clean();
- } else {
- $_results = '';
- }
-
- $smarty->_compile_id = $_compile_id_orig;
-
- $smarty->left_delimiter = $_ldelim_orig;
- $smarty->right_delimiter = $_rdelim_orig;
-
- return $_results;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/internals/core.get_include_path.php b/include/smarty/libs/internals/core.get_include_path.php
deleted file mode 100644
index 43432412b..000000000
--- a/include/smarty/libs/internals/core.get_include_path.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Get path to file from include_path
- *
- * @param string $file_path
- * @param string $new_file_path
- * @return boolean
- * @staticvar array|null
- */
-
-// $file_path, &$new_file_path
-
-function smarty_core_get_include_path(&$params, &$smarty)
-{
- static $_path_array = null;
-
- if(!isset($_path_array)) {
- $_ini_include_path = ini_get('include_path');
-
- if(strstr($_ini_include_path,';')) {
- // windows pathnames
- $_path_array = explode(';',$_ini_include_path);
- } else {
- $_path_array = explode(':',$_ini_include_path);
- }
- }
- foreach ($_path_array as $_include_path) {
- if (@is_readable($_include_path . DIRECTORY_SEPARATOR . $params['file_path'])) {
- $params['new_file_path'] = $_include_path . DIRECTORY_SEPARATOR . $params['file_path'];
- return true;
- }
- }
- return false;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/internals/core.get_microtime.php b/include/smarty/libs/internals/core.get_microtime.php
deleted file mode 100644
index f1a28e042..000000000
--- a/include/smarty/libs/internals/core.get_microtime.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Get seconds and microseconds
- * @return double
- */
-function smarty_core_get_microtime($params, &$smarty)
-{
- $mtime = microtime();
- $mtime = explode(" ", $mtime);
- $mtime = (double)($mtime[1]) + (double)($mtime[0]);
- return ($mtime);
-}
-
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/internals/core.get_php_resource.php b/include/smarty/libs/internals/core.get_php_resource.php
deleted file mode 100644
index 786d4e78e..000000000
--- a/include/smarty/libs/internals/core.get_php_resource.php
+++ /dev/null
@@ -1,80 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Retrieves PHP script resource
- *
- * sets $php_resource to the returned resource
- * @param string $resource
- * @param string $resource_type
- * @param $php_resource
- * @return boolean
- */
-
-function smarty_core_get_php_resource(&$params, &$smarty)
-{
-
- $params['resource_base_path'] = $smarty->trusted_dir;
- $smarty->_parse_resource_name($params, $smarty);
-
- /*
- * Find out if the resource exists.
- */
-
- if ($params['resource_type'] == 'file') {
- $_readable = false;
- if(file_exists($params['resource_name']) && is_readable($params['resource_name'])) {
- $_readable = true;
- } else {
- // test for file in include_path
- $_params = array('file_path' => $params['resource_name']);
- require_once(SMARTY_CORE_DIR . 'core.get_include_path.php');
- if(smarty_core_get_include_path($_params, $smarty)) {
- $_include_path = $_params['new_file_path'];
- $_readable = true;
- }
- }
- } else if ($params['resource_type'] != 'file') {
- $_template_source = null;
- $_readable = is_callable($smarty->_plugins['resource'][$params['resource_type']][0][0])
- && call_user_func_array($smarty->_plugins['resource'][$params['resource_type']][0][0],
- array($params['resource_name'], &$_template_source, &$smarty));
- }
-
- /*
- * Set the error function, depending on which class calls us.
- */
- if (method_exists($smarty, '_syntax_error')) {
- $_error_funcc = '_syntax_error';
- } else {
- $_error_funcc = 'trigger_error';
- }
-
- if ($_readable) {
- if ($smarty->security) {
- require_once(SMARTY_CORE_DIR . 'core.is_trusted.php');
- if (!smarty_core_is_trusted($params, $smarty)) {
- $smarty->$_error_funcc('(secure mode) ' . $params['resource_type'] . ':' . $params['resource_name'] . ' is not trusted');
- return false;
- }
- }
- } else {
- $smarty->$_error_funcc($params['resource_type'] . ':' . $params['resource_name'] . ' is not readable');
- return false;
- }
-
- if ($params['resource_type'] == 'file') {
- $params['php_resource'] = $params['resource_name'];
- } else {
- $params['php_resource'] = $_template_source;
- }
- return true;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/internals/core.is_secure.php b/include/smarty/libs/internals/core.is_secure.php
deleted file mode 100644
index d54abd432..000000000
--- a/include/smarty/libs/internals/core.is_secure.php
+++ /dev/null
@@ -1,59 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * determines if a resource is secure or not.
- *
- * @param string $resource_type
- * @param string $resource_name
- * @return boolean
- */
-
-// $resource_type, $resource_name
-
-function smarty_core_is_secure($params, &$smarty)
-{
- if (!$smarty->security || $smarty->security_settings['INCLUDE_ANY']) {
- return true;
- }
-
- if ($params['resource_type'] == 'file') {
- $_rp = realpath($params['resource_name']);
- if (isset($params['resource_base_path'])) {
- foreach ((array)$params['resource_base_path'] as $curr_dir) {
- if ( ($_cd = realpath($curr_dir)) !== false &&
- strncmp($_rp, $_cd, strlen($_cd)) == 0 &&
- substr($_rp, strlen($_cd), 1) == DIRECTORY_SEPARATOR ) {
- return true;
- }
- }
- }
- if (!empty($smarty->secure_dir)) {
- foreach ((array)$smarty->secure_dir as $curr_dir) {
- if ( ($_cd = realpath($curr_dir)) !== false) {
- if($_cd == $_rp) {
- return true;
- } elseif (strncmp($_rp, $_cd, strlen($_cd)) == 0 &&
- substr($_rp, strlen($_cd), 1) == DIRECTORY_SEPARATOR) {
- return true;
- }
- }
- }
- }
- } else {
- // resource is not on local file system
- return call_user_func_array(
- $smarty->_plugins['resource'][$params['resource_type']][0][2],
- array($params['resource_name'], &$smarty));
- }
-
- return false;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/internals/core.is_trusted.php b/include/smarty/libs/internals/core.is_trusted.php
deleted file mode 100644
index 429973158..000000000
--- a/include/smarty/libs/internals/core.is_trusted.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * determines if a resource is trusted or not
- *
- * @param string $resource_type
- * @param string $resource_name
- * @return boolean
- */
-
- // $resource_type, $resource_name
-
-function smarty_core_is_trusted($params, &$smarty)
-{
- $_smarty_trusted = false;
- if ($params['resource_type'] == 'file') {
- if (!empty($smarty->trusted_dir)) {
- $_rp = realpath($params['resource_name']);
- foreach ((array)$smarty->trusted_dir as $curr_dir) {
- if (!empty($curr_dir) && is_readable ($curr_dir)) {
- $_cd = realpath($curr_dir);
- if (strncmp($_rp, $_cd, strlen($_cd)) == 0
- && substr($_rp, strlen($_cd), 1) == DIRECTORY_SEPARATOR ) {
- $_smarty_trusted = true;
- break;
- }
- }
- }
- }
-
- } else {
- // resource is not on local file system
- $_smarty_trusted = call_user_func_array($smarty->_plugins['resource'][$params['resource_type']][0][3],
- array($params['resource_name'], $smarty));
- }
-
- return $_smarty_trusted;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/internals/core.load_plugins.php b/include/smarty/libs/internals/core.load_plugins.php
deleted file mode 100644
index 6db1dc51d..000000000
--- a/include/smarty/libs/internals/core.load_plugins.php
+++ /dev/null
@@ -1,125 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Load requested plugins
- *
- * @param array $plugins
- */
-
-// $plugins
-
-function smarty_core_load_plugins($params, &$smarty)
-{
-
- foreach ($params['plugins'] as $_plugin_info) {
- list($_type, $_name, $_tpl_file, $_tpl_line, $_delayed_loading) = $_plugin_info;
- $_plugin = &$smarty->_plugins[$_type][$_name];
-
- /*
- * We do not load plugin more than once for each instance of Smarty.
- * The following code checks for that. The plugin can also be
- * registered dynamically at runtime, in which case template file
- * and line number will be unknown, so we fill them in.
- *
- * The final element of the info array is a flag that indicates
- * whether the dynamically registered plugin function has been
- * checked for existence yet or not.
- */
- if (isset($_plugin)) {
- if (empty($_plugin[3])) {
- if (!is_callable($_plugin[0])) {
- $smarty->_trigger_fatal_error("[plugin] $_type '$_name' is not implemented", $_tpl_file, $_tpl_line, __FILE__, __LINE__);
- } else {
- $_plugin[1] = $_tpl_file;
- $_plugin[2] = $_tpl_line;
- $_plugin[3] = true;
- if (!isset($_plugin[4])) $_plugin[4] = true; /* cacheable */
- }
- }
- continue;
- } else if ($_type == 'insert') {
- /*
- * For backwards compatibility, we check for insert functions in
- * the symbol table before trying to load them as a plugin.
- */
- $_plugin_func = 'insert_' . $_name;
- if (function_exists($_plugin_func)) {
- $_plugin = array($_plugin_func, $_tpl_file, $_tpl_line, true, false);
- continue;
- }
- }
-
- $_plugin_file = $smarty->_get_plugin_filepath($_type, $_name);
-
- if (! $_found = ($_plugin_file != false)) {
- $_message = "could not load plugin file '$_type.$_name.php'\n";
- }
-
- /*
- * If plugin file is found, it -must- provide the properly named
- * plugin function. In case it doesn't, simply output the error and
- * do not fall back on any other method.
- */
- if ($_found) {
- include_once $_plugin_file;
-
- $_plugin_func = 'smarty_' . $_type . '_' . $_name;
- if (!function_exists($_plugin_func)) {
- $smarty->_trigger_fatal_error("[plugin] function $_plugin_func() not found in $_plugin_file", $_tpl_file, $_tpl_line, __FILE__, __LINE__);
- continue;
- }
- }
- /*
- * In case of insert plugins, their code may be loaded later via
- * 'script' attribute.
- */
- else if ($_type == 'insert' && $_delayed_loading) {
- $_plugin_func = 'smarty_' . $_type . '_' . $_name;
- $_found = true;
- }
-
- /*
- * Plugin specific processing and error checking.
- */
- if (!$_found) {
- if ($_type == 'modifier') {
- /*
- * In case modifier falls back on using PHP functions
- * directly, we only allow those specified in the security
- * context.
- */
- if ($smarty->security && !in_array($_name, $smarty->security_settings['MODIFIER_FUNCS'])) {
- $_message = "(secure mode) modifier '$_name' is not allowed";
- } else {
- if (!function_exists($_name)) {
- $_message = "modifier '$_name' is not implemented";
- } else {
- $_plugin_func = $_name;
- $_found = true;
- }
- }
- } else if ($_type == 'function') {
- /*
- * This is a catch-all situation.
- */
- $_message = "unknown tag - '$_name'";
- }
- }
-
- if ($_found) {
- $smarty->_plugins[$_type][$_name] = array($_plugin_func, $_tpl_file, $_tpl_line, true, true);
- } else {
- // output error
- $smarty->_trigger_fatal_error('[plugin] ' . $_message, $_tpl_file, $_tpl_line, __FILE__, __LINE__);
- }
- }
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/internals/core.load_resource_plugin.php b/include/smarty/libs/internals/core.load_resource_plugin.php
deleted file mode 100644
index a7d37d1af..000000000
--- a/include/smarty/libs/internals/core.load_resource_plugin.php
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * load a resource plugin
- *
- * @param string $type
- */
-
-// $type
-
-function smarty_core_load_resource_plugin($params, &$smarty)
-{
- /*
- * Resource plugins are not quite like the other ones, so they are
- * handled differently. The first element of plugin info is the array of
- * functions provided by the plugin, the second one indicates whether
- * all of them exist or not.
- */
-
- $_plugin = &$smarty->_plugins['resource'][$params['type']];
- if (isset($_plugin)) {
- if (!$_plugin[1] && count($_plugin[0])) {
- $_plugin[1] = true;
- foreach ($_plugin[0] as $_plugin_func) {
- if (!is_callable($_plugin_func)) {
- $_plugin[1] = false;
- break;
- }
- }
- }
-
- if (!$_plugin[1]) {
- $smarty->_trigger_fatal_error("[plugin] resource '" . $params['type'] . "' is not implemented", null, null, __FILE__, __LINE__);
- }
-
- return;
- }
-
- $_plugin_file = $smarty->_get_plugin_filepath('resource', $params['type']);
- $_found = ($_plugin_file != false);
-
- if ($_found) { /*
- * If the plugin file is found, it -must- provide the properly named
- * plugin functions.
- */
- include_once($_plugin_file);
-
- /*
- * Locate functions that we require the plugin to provide.
- */
- $_resource_ops = array('source', 'timestamp', 'secure', 'trusted');
- $_resource_funcs = array();
- foreach ($_resource_ops as $_op) {
- $_plugin_func = 'smarty_resource_' . $params['type'] . '_' . $_op;
- if (!function_exists($_plugin_func)) {
- $smarty->_trigger_fatal_error("[plugin] function $_plugin_func() not found in $_plugin_file", null, null, __FILE__, __LINE__);
- return;
- } else {
- $_resource_funcs[] = $_plugin_func;
- }
- }
-
- $smarty->_plugins['resource'][$params['type']] = array($_resource_funcs, true);
- }
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/internals/core.process_cached_inserts.php b/include/smarty/libs/internals/core.process_cached_inserts.php
deleted file mode 100644
index 1d78edd93..000000000
--- a/include/smarty/libs/internals/core.process_cached_inserts.php
+++ /dev/null
@@ -1,71 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Replace cached inserts with the actual results
- *
- * @param string $results
- * @return string
- */
-function smarty_core_process_cached_inserts($params, &$smarty)
-{
- preg_match_all('!'.$smarty->_smarty_md5.'{insert_cache (.*)}'.$smarty->_smarty_md5.'!Uis',
- $params['results'], $match);
- list($cached_inserts, $insert_args) = $match;
-
- for ($i = 0, $for_max = count($cached_inserts); $i < $for_max; $i++) {
- if ($smarty->debugging) {
- $_params = array();
- require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
- $debug_start_time = smarty_core_get_microtime($_params, $smarty);
- }
-
- $args = unserialize($insert_args[$i]);
- $name = $args['name'];
-
- if (isset($args['script'])) {
- $_params = array('resource_name' => $smarty->_dequote($args['script']));
- require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php');
- if(!smarty_core_get_php_resource($_params, $smarty)) {
- return false;
- }
- $resource_type = $_params['resource_type'];
- $php_resource = $_params['php_resource'];
-
-
- if ($resource_type == 'file') {
- $smarty->_include($php_resource, true);
- } else {
- $smarty->_eval($php_resource);
- }
- }
-
- $function_name = $smarty->_plugins['insert'][$name][0];
- if (empty($args['assign'])) {
- $replace = $function_name($args, $smarty);
- } else {
- $smarty->assign($args['assign'], $function_name($args, $smarty));
- $replace = '';
- }
-
- $params['results'] = substr_replace($params['results'], $replace, strpos($params['results'], $cached_inserts[$i]), strlen($cached_inserts[$i]));
- if ($smarty->debugging) {
- $_params = array();
- require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
- $smarty->_smarty_debug_info[] = array('type' => 'insert',
- 'filename' => 'insert_'.$name,
- 'depth' => $smarty->_inclusion_depth,
- 'exec_time' => smarty_core_get_microtime($_params, $smarty) - $debug_start_time);
- }
- }
-
- return $params['results'];
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/internals/core.process_compiled_include.php b/include/smarty/libs/internals/core.process_compiled_include.php
deleted file mode 100644
index 904d59745..000000000
--- a/include/smarty/libs/internals/core.process_compiled_include.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Replace nocache-tags by results of the corresponding non-cacheable
- * functions and return it
- *
- * @param string $compiled_tpl
- * @param string $cached_source
- * @return string
- */
-
-function smarty_core_process_compiled_include($params, &$smarty)
-{
- $_cache_including = $smarty->_cache_including;
- $smarty->_cache_including = true;
-
- $_return = $params['results'];
-
- foreach ($smarty->_cache_info['cache_serials'] as $_include_file_path=>$_cache_serial) {
- $smarty->_include($_include_file_path, true);
- }
-
- foreach ($smarty->_cache_info['cache_serials'] as $_include_file_path=>$_cache_serial) {
- $_return = preg_replace_callback('!(\{nocache\:('.$_cache_serial.')#(\d+)\})!s',
- array(&$smarty, '_process_compiled_include_callback'),
- $_return);
- }
- $smarty->_cache_including = $_cache_including;
- return $_return;
-}
-
-?>
diff --git a/include/smarty/libs/internals/core.read_cache_file.php b/include/smarty/libs/internals/core.read_cache_file.php
deleted file mode 100644
index c60e113a7..000000000
--- a/include/smarty/libs/internals/core.read_cache_file.php
+++ /dev/null
@@ -1,101 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * read a cache file, determine if it needs to be
- * regenerated or not
- *
- * @param string $tpl_file
- * @param string $cache_id
- * @param string $compile_id
- * @param string $results
- * @return boolean
- */
-
-// $tpl_file, $cache_id, $compile_id, &$results
-
-function smarty_core_read_cache_file(&$params, &$smarty)
-{
- static $content_cache = array();
-
- if ($smarty->force_compile) {
- // force compile enabled, always regenerate
- return false;
- }
-
- if (isset($content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']])) {
- list($params['results'], $smarty->_cache_info) = $content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']];
- return true;
- }
-
- if (!empty($smarty->cache_handler_func)) {
- // use cache_handler function
- call_user_func_array($smarty->cache_handler_func,
- array('read', &$smarty, &$params['results'], $params['tpl_file'], $params['cache_id'], $params['compile_id'], null));
- } else {
- // use local cache file
- $_auto_id = $smarty->_get_auto_id($params['cache_id'], $params['compile_id']);
- $_cache_file = $smarty->_get_auto_filename($smarty->cache_dir, $params['tpl_file'], $_auto_id);
- $params['results'] = $smarty->_read_file($_cache_file);
- }
-
- if (empty($params['results'])) {
- // nothing to parse (error?), regenerate cache
- return false;
- }
-
- $_contents = $params['results'];
- $_info_start = strpos($_contents, "\n") + 1;
- $_info_len = (int)substr($_contents, 0, $_info_start - 1);
- $_cache_info = unserialize(substr($_contents, $_info_start, $_info_len));
- $params['results'] = substr($_contents, $_info_start + $_info_len);
-
- if ($smarty->caching == 2 && isset ($_cache_info['expires'])){
- // caching by expiration time
- if ($_cache_info['expires'] > -1 && (time() > $_cache_info['expires'])) {
- // cache expired, regenerate
- return false;
- }
- } else {
- // caching by lifetime
- if ($smarty->cache_lifetime > -1 && (time() - $_cache_info['timestamp'] > $smarty->cache_lifetime)) {
- // cache expired, regenerate
- return false;
- }
- }
-
- if ($smarty->compile_check) {
- $_params = array('get_source' => false, 'quiet'=>true);
- foreach (array_keys($_cache_info['template']) as $_template_dep) {
- $_params['resource_name'] = $_template_dep;
- if (!$smarty->_fetch_resource_info($_params) || $_cache_info['timestamp'] < $_params['resource_timestamp']) {
- // template file has changed, regenerate cache
- return false;
- }
- }
-
- if (isset($_cache_info['config'])) {
- $_params = array('resource_base_path' => $smarty->config_dir, 'get_source' => false, 'quiet'=>true);
- foreach (array_keys($_cache_info['config']) as $_config_dep) {
- $_params['resource_name'] = $_config_dep;
- if (!$smarty->_fetch_resource_info($_params) || $_cache_info['timestamp'] < $_params['resource_timestamp']) {
- // config file has changed, regenerate cache
- return false;
- }
- }
- }
- }
-
- $content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']] = array($params['results'], $_cache_info);
-
- $smarty->_cache_info = $_cache_info;
- return true;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/internals/core.rm_auto.php b/include/smarty/libs/internals/core.rm_auto.php
deleted file mode 100644
index b251f6491..000000000
--- a/include/smarty/libs/internals/core.rm_auto.php
+++ /dev/null
@@ -1,71 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * delete an automagically created file by name and id
- *
- * @param string $auto_base
- * @param string $auto_source
- * @param string $auto_id
- * @param integer $exp_time
- * @return boolean
- */
-
-// $auto_base, $auto_source = null, $auto_id = null, $exp_time = null
-
-function smarty_core_rm_auto($params, &$smarty)
-{
- if (!@is_dir($params['auto_base']))
- return false;
-
- if(!isset($params['auto_id']) && !isset($params['auto_source'])) {
- $_params = array(
- 'dirname' => $params['auto_base'],
- 'level' => 0,
- 'exp_time' => $params['exp_time']
- );
- require_once(SMARTY_CORE_DIR . 'core.rmdir.php');
- $_res = smarty_core_rmdir($_params, $smarty);
- } else {
- $_tname = $smarty->_get_auto_filename($params['auto_base'], $params['auto_source'], $params['auto_id']);
-
- if(isset($params['auto_source'])) {
- if (isset($params['extensions'])) {
- $_res = false;
- foreach ((array)$params['extensions'] as $_extension)
- $_res |= $smarty->_unlink($_tname.$_extension, $params['exp_time']);
- } else {
- $_res = $smarty->_unlink($_tname, $params['exp_time']);
- }
- } elseif ($smarty->use_sub_dirs) {
- $_params = array(
- 'dirname' => $_tname,
- 'level' => 1,
- 'exp_time' => $params['exp_time']
- );
- require_once(SMARTY_CORE_DIR . 'core.rmdir.php');
- $_res = smarty_core_rmdir($_params, $smarty);
- } else {
- // remove matching file names
- $_handle = opendir($params['auto_base']);
- $_res = true;
- while (false !== ($_filename = readdir($_handle))) {
- if($_filename == '.' || $_filename == '..') {
- continue;
- } elseif (substr($params['auto_base'] . DIRECTORY_SEPARATOR . $_filename, 0, strlen($_tname)) == $_tname) {
- $_res &= (bool)$smarty->_unlink($params['auto_base'] . DIRECTORY_SEPARATOR . $_filename, $params['exp_time']);
- }
- }
- }
- }
-
- return $_res;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/internals/core.rmdir.php b/include/smarty/libs/internals/core.rmdir.php
deleted file mode 100644
index 2166c44d2..000000000
--- a/include/smarty/libs/internals/core.rmdir.php
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * delete a dir recursively (level=0 -> keep root)
- * WARNING: no tests, it will try to remove what you tell it!
- *
- * @param string $dirname
- * @param integer $level
- * @param integer $exp_time
- * @return boolean
- */
-
-// $dirname, $level = 1, $exp_time = null
-
-function smarty_core_rmdir($params, &$smarty)
-{
- if(!isset($params['level'])) { $params['level'] = 1; }
- if(!isset($params['exp_time'])) { $params['exp_time'] = null; }
-
- if($_handle = @opendir($params['dirname'])) {
-
- while (false !== ($_entry = readdir($_handle))) {
- if ($_entry != '.' && $_entry != '..') {
- if (@is_dir($params['dirname'] . DIRECTORY_SEPARATOR . $_entry)) {
- $_params = array(
- 'dirname' => $params['dirname'] . DIRECTORY_SEPARATOR . $_entry,
- 'level' => $params['level'] + 1,
- 'exp_time' => $params['exp_time']
- );
- smarty_core_rmdir($_params, $smarty);
- }
- else {
- $smarty->_unlink($params['dirname'] . DIRECTORY_SEPARATOR . $_entry, $params['exp_time']);
- }
- }
- }
- closedir($_handle);
- }
-
- if ($params['level']) {
- return @rmdir($params['dirname']);
- }
- return (bool)$_handle;
-
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/internals/core.run_insert_handler.php b/include/smarty/libs/internals/core.run_insert_handler.php
deleted file mode 100644
index 71c384508..000000000
--- a/include/smarty/libs/internals/core.run_insert_handler.php
+++ /dev/null
@@ -1,71 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Handle insert tags
- *
- * @param array $args
- * @return string
- */
-function smarty_core_run_insert_handler($params, &$smarty)
-{
-
- require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
- if ($smarty->debugging) {
- $_params = array();
- $_debug_start_time = smarty_core_get_microtime($_params, $smarty);
- }
-
- if ($smarty->caching) {
- $_arg_string = serialize($params['args']);
- $_name = $params['args']['name'];
- if (!isset($smarty->_cache_info['insert_tags'][$_name])) {
- $smarty->_cache_info['insert_tags'][$_name] = array('insert',
- $_name,
- $smarty->_plugins['insert'][$_name][1],
- $smarty->_plugins['insert'][$_name][2],
- !empty($params['args']['script']) ? true : false);
- }
- return $smarty->_smarty_md5."{insert_cache $_arg_string}".$smarty->_smarty_md5;
- } else {
- if (isset($params['args']['script'])) {
- $_params = array('resource_name' => $smarty->_dequote($params['args']['script']));
- require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php');
- if(!smarty_core_get_php_resource($_params, $smarty)) {
- return false;
- }
-
- if ($_params['resource_type'] == 'file') {
- $smarty->_include($_params['php_resource'], true);
- } else {
- $smarty->_eval($_params['php_resource']);
- }
- unset($params['args']['script']);
- }
-
- $_funcname = $smarty->_plugins['insert'][$params['args']['name']][0];
- $_content = $_funcname($params['args'], $smarty);
- if ($smarty->debugging) {
- $_params = array();
- require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
- $smarty->_smarty_debug_info[] = array('type' => 'insert',
- 'filename' => 'insert_'.$params['args']['name'],
- 'depth' => $smarty->_inclusion_depth,
- 'exec_time' => smarty_core_get_microtime($_params, $smarty) - $_debug_start_time);
- }
-
- if (!empty($params['args']["assign"])) {
- $smarty->assign($params['args']["assign"], $_content);
- } else {
- return $_content;
- }
- }
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/internals/core.smarty_include_php.php b/include/smarty/libs/internals/core.smarty_include_php.php
deleted file mode 100644
index 30c6e7654..000000000
--- a/include/smarty/libs/internals/core.smarty_include_php.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * called for included php files within templates
- *
- * @param string $smarty_file
- * @param string $smarty_assign variable to assign the included template's
- * output into
- * @param boolean $smarty_once uses include_once if this is true
- * @param array $smarty_include_vars associative array of vars from
- * {include file="blah" var=$var}
- */
-
-// $file, $assign, $once, $_smarty_include_vars
-
-function smarty_core_smarty_include_php($params, &$smarty)
-{
- $_params = array('resource_name' => $params['smarty_file']);
- require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php');
- smarty_core_get_php_resource($_params, $smarty);
- $_smarty_resource_type = $_params['resource_type'];
- $_smarty_php_resource = $_params['php_resource'];
-
- if (!empty($params['smarty_assign'])) {
- ob_start();
- if ($_smarty_resource_type == 'file') {
- $smarty->_include($_smarty_php_resource, $params['smarty_once'], $params['smarty_include_vars']);
- } else {
- $smarty->_eval($_smarty_php_resource, $params['smarty_include_vars']);
- }
- $smarty->assign($params['smarty_assign'], ob_get_contents());
- ob_end_clean();
- } else {
- if ($_smarty_resource_type == 'file') {
- $smarty->_include($_smarty_php_resource, $params['smarty_once'], $params['smarty_include_vars']);
- } else {
- $smarty->_eval($_smarty_php_resource, $params['smarty_include_vars']);
- }
- }
-}
-
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/internals/core.write_cache_file.php b/include/smarty/libs/internals/core.write_cache_file.php
deleted file mode 100644
index fa3cdd746..000000000
--- a/include/smarty/libs/internals/core.write_cache_file.php
+++ /dev/null
@@ -1,96 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Prepend the cache information to the cache file
- * and write it
- *
- * @param string $tpl_file
- * @param string $cache_id
- * @param string $compile_id
- * @param string $results
- * @return true|null
- */
-
- // $tpl_file, $cache_id, $compile_id, $results
-
-function smarty_core_write_cache_file($params, &$smarty)
-{
-
- // put timestamp in cache header
- $smarty->_cache_info['timestamp'] = time();
- if ($smarty->cache_lifetime > -1){
- // expiration set
- $smarty->_cache_info['expires'] = $smarty->_cache_info['timestamp'] + $smarty->cache_lifetime;
- } else {
- // cache will never expire
- $smarty->_cache_info['expires'] = -1;
- }
-
- // collapse nocache.../nocache-tags
- if (preg_match_all('!\{(/?)nocache\:[0-9a-f]{32}#\d+\}!', $params['results'], $match, PREG_PATTERN_ORDER)) {
- // remove everything between every pair of outermost noache.../nocache-tags
- // and replace it by a single nocache-tag
- // this new nocache-tag will be replaced by dynamic contents in
- // smarty_core_process_compiled_includes() on a cache-read
-
- $match_count = count($match[0]);
- $results = preg_split('!(\{/?nocache\:[0-9a-f]{32}#\d+\})!', $params['results'], -1, PREG_SPLIT_DELIM_CAPTURE);
-
- $level = 0;
- $j = 0;
- for ($i=0, $results_count = count($results); $i < $results_count && $j < $match_count; $i++) {
- if ($results[$i] == $match[0][$j]) {
- // nocache tag
- if ($match[1][$j]) { // closing tag
- $level--;
- unset($results[$i]);
- } else { // opening tag
- if ($level++ > 0) unset($results[$i]);
- }
- $j++;
- } elseif ($level > 0) {
- unset($results[$i]);
- }
- }
- $params['results'] = implode('', $results);
- }
- $smarty->_cache_info['cache_serials'] = $smarty->_cache_serials;
-
- // prepend the cache header info into cache file
- $_cache_info = serialize($smarty->_cache_info);
- $params['results'] = strlen($_cache_info) . "\n" . $_cache_info . $params['results'];
-
- if (!empty($smarty->cache_handler_func)) {
- // use cache_handler function
- call_user_func_array($smarty->cache_handler_func,
- array('write', &$smarty, &$params['results'], $params['tpl_file'], $params['cache_id'], $params['compile_id'], $smarty->_cache_info['expires']));
- } else {
- // use local cache file
-
- if(!@is_writable($smarty->cache_dir)) {
- // cache_dir not writable, see if it exists
- if(!@is_dir($smarty->cache_dir)) {
- $smarty->trigger_error('the $cache_dir \'' . $smarty->cache_dir . '\' does not exist, or is not a directory.', E_USER_ERROR);
- return false;
- }
- $smarty->trigger_error('unable to write to $cache_dir \'' . realpath($smarty->cache_dir) . '\'. Be sure $cache_dir is writable by the web server user.', E_USER_ERROR);
- return false;
- }
-
- $_auto_id = $smarty->_get_auto_id($params['cache_id'], $params['compile_id']);
- $_cache_file = $smarty->_get_auto_filename($smarty->cache_dir, $params['tpl_file'], $_auto_id);
- $_params = array('filename' => $_cache_file, 'contents' => $params['results'], 'create_dirs' => true);
- require_once(SMARTY_CORE_DIR . 'core.write_file.php');
- smarty_core_write_file($_params, $smarty);
- return true;
- }
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/internals/core.write_compiled_include.php b/include/smarty/libs/internals/core.write_compiled_include.php
deleted file mode 100644
index c14adb5f4..000000000
--- a/include/smarty/libs/internals/core.write_compiled_include.php
+++ /dev/null
@@ -1,91 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Extract non-cacheable parts out of compiled template and write it
- *
- * @param string $compile_path
- * @param string $template_compiled
- * @return boolean
- */
-
-function smarty_core_write_compiled_include($params, &$smarty)
-{
- $_tag_start = 'if \(\$this->caching && \!\$this->_cache_including\)\: echo \'\{nocache\:('.$params['cache_serial'].')#(\d+)\}\'; endif;';
- $_tag_end = 'if \(\$this->caching && \!\$this->_cache_including\)\: echo \'\{/nocache\:(\\2)#(\\3)\}\'; endif;';
-
- preg_match_all('!('.$_tag_start.'(.*)'.$_tag_end.')!Us',
- $params['compiled_content'], $_match_source, PREG_SET_ORDER);
-
- // no nocache-parts found: done
- if (count($_match_source)==0) return;
-
- // convert the matched php-code to functions
- $_include_compiled = "<?php /* Smarty version ".$smarty->_version.", created on ".strftime("%Y-%m-%d %H:%M:%S")."\n";
- $_include_compiled .= " compiled from " . strtr(urlencode($params['resource_name']), array('%2F'=>'/', '%3A'=>':')) . " */\n\n";
-
- $_compile_path = $params['include_file_path'];
-
- $smarty->_cache_serials[$_compile_path] = $params['cache_serial'];
- $_include_compiled .= "\$this->_cache_serials['".$_compile_path."'] = '".$params['cache_serial']."';\n\n?>";
-
- $_include_compiled .= $params['plugins_code'];
- $_include_compiled .= "<?php";
-
- $this_varname = ((double)phpversion() >= 5.0) ? '_smarty' : 'this';
- for ($_i = 0, $_for_max = count($_match_source); $_i < $_for_max; $_i++) {
- $_match =& $_match_source[$_i];
- $source = $_match[4];
- if ($this_varname == '_smarty') {
- /* rename $this to $_smarty in the sourcecode */
- $tokens = token_get_all('<?php ' . $_match[4]);
-
- /* remove trailing <?php */
- $open_tag = '';
- while ($tokens) {
- $token = array_shift($tokens);
- if (is_array($token)) {
- $open_tag .= $token[1];
- } else {
- $open_tag .= $token;
- }
- if ($open_tag == '<?php ') break;
- }
-
- for ($i=0, $count = count($tokens); $i < $count; $i++) {
- if (is_array($tokens[$i])) {
- if ($tokens[$i][0] == T_VARIABLE && $tokens[$i][1] == '$this') {
- $tokens[$i] = '$' . $this_varname;
- } else {
- $tokens[$i] = $tokens[$i][1];
- }
- }
- }
- $source = implode('', $tokens);
- }
-
- /* add function to compiled include */
- $_include_compiled .= "
-function _smarty_tplfunc_$_match[2]_$_match[3](&\$$this_varname)
-{
-$source
-}
-
-";
- }
- $_include_compiled .= "\n\n?>\n";
-
- $_params = array('filename' => $_compile_path,
- 'contents' => $_include_compiled, 'create_dirs' => true);
-
- require_once(SMARTY_CORE_DIR . 'core.write_file.php');
- smarty_core_write_file($_params, $smarty);
- return true;
-}
-
-
-?>
diff --git a/include/smarty/libs/internals/core.write_compiled_resource.php b/include/smarty/libs/internals/core.write_compiled_resource.php
deleted file mode 100644
index b902eff3c..000000000
--- a/include/smarty/libs/internals/core.write_compiled_resource.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * write the compiled resource
- *
- * @param string $compile_path
- * @param string $compiled_content
- * @return true
- */
-function smarty_core_write_compiled_resource($params, &$smarty)
-{
- if(!@is_writable($smarty->compile_dir)) {
- // compile_dir not writable, see if it exists
- if(!@is_dir($smarty->compile_dir)) {
- $smarty->trigger_error('the $compile_dir \'' . $smarty->compile_dir . '\' does not exist, or is not a directory.', E_USER_ERROR);
- return false;
- }
- $smarty->trigger_error('unable to write to $compile_dir \'' . realpath($smarty->compile_dir) . '\'. Be sure $compile_dir is writable by the web server user.', E_USER_ERROR);
- return false;
- }
-
- $_params = array('filename' => $params['compile_path'], 'contents' => $params['compiled_content'], 'create_dirs' => true);
- require_once(SMARTY_CORE_DIR . 'core.write_file.php');
- smarty_core_write_file($_params, $smarty);
- return true;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/internals/core.write_file.php b/include/smarty/libs/internals/core.write_file.php
deleted file mode 100644
index 8a3a3b398..000000000
--- a/include/smarty/libs/internals/core.write_file.php
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * write out a file to disk
- *
- * @param string $filename
- * @param string $contents
- * @param boolean $create_dirs
- * @return boolean
- */
-function smarty_core_write_file($params, &$smarty)
-{
- $_dirname = dirname($params['filename']);
-
- if ($params['create_dirs']) {
- $_params = array('dir' => $_dirname);
- require_once(SMARTY_CORE_DIR . 'core.create_dir_structure.php');
- smarty_core_create_dir_structure($_params, $smarty);
- }
-
- // write to tmp file, then rename it to avoid file locking race condition
- $_tmp_file = tempnam($_dirname, 'wrt');
-
- if (!($fd = @fopen($_tmp_file, 'wb'))) {
- $_tmp_file = $_dirname . DIRECTORY_SEPARATOR . uniqid('wrt');
- if (!($fd = @fopen($_tmp_file, 'wb'))) {
- $smarty->trigger_error("problem writing temporary file '$_tmp_file'");
- return false;
- }
- }
-
- fwrite($fd, $params['contents']);
- fclose($fd);
-
- if (DIRECTORY_SEPARATOR == '\\' || !@rename($_tmp_file, $params['filename'])) {
- // On platforms and filesystems that cannot overwrite with rename()
- // delete the file before renaming it -- because windows always suffers
- // this, it is short-circuited to avoid the initial rename() attempt
- @unlink($params['filename']);
- @rename($_tmp_file, $params['filename']);
- }
- @chmod($params['filename'], $smarty->_file_perms);
-
- return true;
-}
-
-/* vim: set expandtab: */
-
-?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/block.textformat.php b/include/smarty/libs/plugins/block.textformat.php
index 8cd010acb..b22b104a5 100644
--- a/include/smarty/libs/plugins/block.textformat.php
+++ b/include/smarty/libs/plugins/block.textformat.php
@@ -1,8 +1,9 @@
<?php
/**
- * Smarty plugin
+ * Smarty plugin to format text blocks
+ *
* @package Smarty
- * @subpackage plugins
+ * @subpackage PluginsBlock
*/
/**
@@ -12,23 +13,26 @@
* Name: textformat<br>
* Purpose: format text a certain way with preset styles
* or custom wrap/indent settings<br>
- * @link http://smarty.php.net/manual/en/language.function.textformat.php {textformat}
- * (Smarty online manual)
- * @param array
+ * Params:
* <pre>
- * Params: style: string (email)
- * indent: integer (0)
- * wrap: integer (80)
- * wrap_char string ("\n")
- * indent_char: string (" ")
- * wrap_boundary: boolean (true)
+ * - style - string (email)
+ * - indent - integer (0)
+ * - wrap - integer (80)
+ * - wrap_char - string ("\n")
+ * - indent_char - string (" ")
+ * - wrap_boundary - boolean (true)
* </pre>
+ *
+ * @link http://www.smarty.net/manual/en/language.function.textformat.php {textformat}
+ * (Smarty online manual)
+ * @param array $params parameters
+ * @param string $content contents of the block
+ * @param Smarty_Internal_Template $template template object
+ * @param boolean &$repeat repeat flag
+ * @return string content re-formatted
* @author Monte Ohrt <monte at ohrt dot com>
- * @param string contents of the block
- * @param Smarty clever simulation of a method
- * @return string string $content re-formatted
*/
-function smarty_block_textformat($params, $content, &$smarty)
+function smarty_block_textformat($params, $content, $template, &$repeat)
{
if (is_null($content)) {
return;
@@ -42,7 +46,7 @@ function smarty_block_textformat($params, $content, &$smarty)
$wrap_char = "\n";
$wrap_cut = false;
$assign = null;
-
+
foreach ($params as $_key => $_val) {
switch ($_key) {
case 'style':
@@ -63,41 +67,47 @@ function smarty_block_textformat($params, $content, &$smarty)
break;
default:
- $smarty->trigger_error("textformat: unknown attribute '$_key'");
+ trigger_error("textformat: unknown attribute '$_key'");
}
}
if ($style == 'email') {
$wrap = 72;
}
-
// split into paragraphs
- $_paragraphs = preg_split('![\r\n][\r\n]!',$content);
+ $_paragraphs = preg_split('![\r\n]{2}!', $content);
$_output = '';
- for($_x = 0, $_y = count($_paragraphs); $_x < $_y; $_x++) {
- if ($_paragraphs[$_x] == '') {
+
+ foreach ($_paragraphs as &$_paragraph) {
+ if (!$_paragraph) {
continue;
}
// convert mult. spaces & special chars to single space
- $_paragraphs[$_x] = preg_replace(array('!\s+!','!(^\s+)|(\s+$)!'), array(' ',''), $_paragraphs[$_x]);
+ $_paragraph = preg_replace(array('!\s+!' . Smarty::$_UTF8_MODIFIER, '!(^\s+)|(\s+$)!' . Smarty::$_UTF8_MODIFIER), array(' ', ''), $_paragraph);
// indent first line
- if($indent_first > 0) {
- $_paragraphs[$_x] = str_repeat($indent_char, $indent_first) . $_paragraphs[$_x];
+ if ($indent_first > 0) {
+ $_paragraph = str_repeat($indent_char, $indent_first) . $_paragraph;
}
// wordwrap sentences
- $_paragraphs[$_x] = wordwrap($_paragraphs[$_x], $wrap - $indent, $wrap_char, $wrap_cut);
+ if (Smarty::$_MBSTRING) {
+ require_once(SMARTY_PLUGINS_DIR . 'shared.mb_wordwrap.php');
+ $_paragraph = smarty_mb_wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut);
+ } else {
+ $_paragraph = wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut);
+ }
// indent lines
- if($indent > 0) {
- $_paragraphs[$_x] = preg_replace('!^!m', str_repeat($indent_char, $indent), $_paragraphs[$_x]);
+ if ($indent > 0) {
+ $_paragraph = preg_replace('!^!m', str_repeat($indent_char, $indent), $_paragraph);
}
}
$_output = implode($wrap_char . $wrap_char, $_paragraphs);
-
- return $assign ? $smarty->assign($assign, $_output) : $_output;
-
+
+ if ($assign) {
+ $template->assign($assign, $_output);
+ } else {
+ return $_output;
+ }
}
-/* vim: set expandtab: */
-
-?>
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/compiler.assign.php b/include/smarty/libs/plugins/compiler.assign.php
deleted file mode 100644
index abef377f8..000000000
--- a/include/smarty/libs/plugins/compiler.assign.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Smarty {assign} compiler function plugin
- *
- * Type: compiler function<br>
- * Name: assign<br>
- * Purpose: assign a value to a template variable
- * @link http://smarty.php.net/manual/en/language.custom.functions.php#LANGUAGE.FUNCTION.ASSIGN {assign}
- * (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com> (initial author)
- * @author messju mohr <messju at lammfellpuschen dot de> (conversion to compiler function)
- * @param string containing var-attribute and value-attribute
- * @param Smarty_Compiler
- */
-function smarty_compiler_assign($tag_attrs, &$compiler)
-{
- $_params = $compiler->_parse_attrs($tag_attrs);
-
- if (!isset($_params['var'])) {
- $compiler->_syntax_error("assign: missing 'var' parameter", E_USER_WARNING);
- return;
- }
-
- if (!isset($_params['value'])) {
- $compiler->_syntax_error("assign: missing 'value' parameter", E_USER_WARNING);
- return;
- }
-
- return "\$this->assign({$_params['var']}, {$_params['value']});";
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/plugins/function.assign_debug_info.php b/include/smarty/libs/plugins/function.assign_debug_info.php
deleted file mode 100644
index 654049876..000000000
--- a/include/smarty/libs/plugins/function.assign_debug_info.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Smarty {assign_debug_info} function plugin
- *
- * Type: function<br>
- * Name: assign_debug_info<br>
- * Purpose: assign debug info to the template<br>
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param array unused in this plugin, this plugin uses {@link Smarty::$_config},
- * {@link Smarty::$_tpl_vars} and {@link Smarty::$_smarty_debug_info}
- * @param Smarty
- */
-function smarty_function_assign_debug_info($params, &$smarty)
-{
- $assigned_vars = $smarty->_tpl_vars;
- ksort($assigned_vars);
- if (@is_array($smarty->_config[0])) {
- $config_vars = $smarty->_config[0];
- ksort($config_vars);
- $smarty->assign("_debug_config_keys", array_keys($config_vars));
- $smarty->assign("_debug_config_vals", array_values($config_vars));
- }
-
- $included_templates = $smarty->_smarty_debug_info;
-
- $smarty->assign("_debug_keys", array_keys($assigned_vars));
- $smarty->assign("_debug_vals", array_values($assigned_vars));
-
- $smarty->assign("_debug_tpls", $included_templates);
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/plugins/function.config_load.php b/include/smarty/libs/plugins/function.config_load.php
deleted file mode 100644
index db89f638c..000000000
--- a/include/smarty/libs/plugins/function.config_load.php
+++ /dev/null
@@ -1,142 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Smarty {config_load} function plugin
- *
- * Type: function<br>
- * Name: config_load<br>
- * Purpose: load config file vars
- * @link http://smarty.php.net/manual/en/language.function.config.load.php {config_load}
- * (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @author messju mohr <messju at lammfellpuschen dot de> (added use of resources)
- * @param array Format:
- * <pre>
- * array('file' => required config file name,
- * 'section' => optional config file section to load
- * 'scope' => local/parent/global
- * 'global' => overrides scope, setting to parent if true)
- * </pre>
- * @param Smarty
- */
-function smarty_function_config_load($params, &$smarty)
-{
- if ($smarty->debugging) {
- $_params = array();
- require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
- $_debug_start_time = smarty_core_get_microtime($_params, $smarty);
- }
-
- $_file = isset($params['file']) ? $smarty->_dequote($params['file']) : null;
- $_section = isset($params['section']) ? $smarty->_dequote($params['section']) : null;
- $_scope = isset($params['scope']) ? $smarty->_dequote($params['scope']) : 'global';
- $_global = isset($params['global']) ? $smarty->_dequote($params['global']) : false;
-
- if (!isset($_file) || strlen($_file) == 0) {
- $smarty->trigger_error("missing 'file' attribute in config_load tag", E_USER_ERROR, __FILE__, __LINE__);
- }
-
- if (isset($_scope)) {
- if ($_scope != 'local' &&
- $_scope != 'parent' &&
- $_scope != 'global') {
- $smarty->trigger_error("invalid 'scope' attribute value", E_USER_ERROR, __FILE__, __LINE__);
- }
- } else {
- if ($_global) {
- $_scope = 'parent';
- } else {
- $_scope = 'local';
- }
- }
-
- $_params = array('resource_name' => $_file,
- 'resource_base_path' => $smarty->config_dir,
- 'get_source' => false);
- $smarty->_parse_resource_name($_params);
- $_file_path = $_params['resource_type'] . ':' . $_params['resource_name'];
- if (isset($_section))
- $_compile_file = $smarty->_get_compile_path($_file_path.'|'.$_section);
- else
- $_compile_file = $smarty->_get_compile_path($_file_path);
-
- if($smarty->force_compile || !file_exists($_compile_file)) {
- $_compile = true;
- } elseif ($smarty->compile_check) {
- $_params = array('resource_name' => $_file,
- 'resource_base_path' => $smarty->config_dir,
- 'get_source' => false);
- $_compile = $smarty->_fetch_resource_info($_params) &&
- $_params['resource_timestamp'] > filemtime($_compile_file);
- } else {
- $_compile = false;
- }
-
- if($_compile) {
- // compile config file
- if(!is_object($smarty->_conf_obj)) {
- require_once SMARTY_DIR . $smarty->config_class . '.class.php';
- $smarty->_conf_obj = new $smarty->config_class();
- $smarty->_conf_obj->overwrite = $smarty->config_overwrite;
- $smarty->_conf_obj->booleanize = $smarty->config_booleanize;
- $smarty->_conf_obj->read_hidden = $smarty->config_read_hidden;
- $smarty->_conf_obj->fix_newlines = $smarty->config_fix_newlines;
- }
-
- $_params = array('resource_name' => $_file,
- 'resource_base_path' => $smarty->config_dir,
- $_params['get_source'] = true);
- if (!$smarty->_fetch_resource_info($_params)) {
- return;
- }
- $smarty->_conf_obj->set_file_contents($_file, $_params['source_content']);
- $_config_vars = array_merge($smarty->_conf_obj->get($_file),
- $smarty->_conf_obj->get($_file, $_section));
- if(function_exists('var_export')) {
- $_output = '<?php $_config_vars = ' . var_export($_config_vars, true) . '; ?>';
- } else {
- $_output = '<?php $_config_vars = unserialize(\'' . strtr(serialize($_config_vars),array('\''=>'\\\'', '\\'=>'\\\\')) . '\'); ?>';
- }
- $_params = (array('compile_path' => $_compile_file, 'compiled_content' => $_output, 'resource_timestamp' => $_params['resource_timestamp']));
- require_once(SMARTY_CORE_DIR . 'core.write_compiled_resource.php');
- smarty_core_write_compiled_resource($_params, $smarty);
- } else {
- include($_compile_file);
- }
-
- if ($smarty->caching) {
- $smarty->_cache_info['config'][$_file] = true;
- }
-
- $smarty->_config[0]['vars'] = @array_merge($smarty->_config[0]['vars'], $_config_vars);
- $smarty->_config[0]['files'][$_file] = true;
-
- if ($_scope == 'parent') {
- $smarty->_config[1]['vars'] = @array_merge($smarty->_config[1]['vars'], $_config_vars);
- $smarty->_config[1]['files'][$_file] = true;
- } else if ($_scope == 'global') {
- for ($i = 1, $for_max = count($smarty->_config); $i < $for_max; $i++) {
- $smarty->_config[$i]['vars'] = @array_merge($smarty->_config[$i]['vars'], $_config_vars);
- $smarty->_config[$i]['files'][$_file] = true;
- }
- }
-
- if ($smarty->debugging) {
- $_params = array();
- require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
- $smarty->_smarty_debug_info[] = array('type' => 'config',
- 'filename' => $_file.' ['.$_section.'] '.$_scope,
- 'depth' => $smarty->_inclusion_depth,
- 'exec_time' => smarty_core_get_microtime($_params, $smarty) - $_debug_start_time);
- }
-
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/plugins/function.counter.php b/include/smarty/libs/plugins/function.counter.php
index 1f26db5fb..3906badf0 100644
--- a/include/smarty/libs/plugins/function.counter.php
+++ b/include/smarty/libs/plugins/function.counter.php
@@ -2,24 +2,24 @@
/**
* Smarty plugin
* @package Smarty
- * @subpackage plugins
+ * @subpackage PluginsFunction
*/
-
/**
* Smarty {counter} function plugin
*
* Type: function<br>
* Name: counter<br>
* Purpose: print out a counter value
+ *
* @author Monte Ohrt <monte at ohrt dot com>
- * @link http://smarty.php.net/manual/en/language.function.counter.php {counter}
+ * @link http://www.smarty.net/manual/en/language.function.counter.php {counter}
* (Smarty online manual)
- * @param array parameters
- * @param Smarty
+ * @param array $params parameters
+ * @param Smarty_Internal_Template $template template object
* @return string|null
*/
-function smarty_function_counter($params, &$smarty)
+function smarty_function_counter($params, $template)
{
static $counters = array();
@@ -43,7 +43,7 @@ function smarty_function_counter($params, &$smarty)
}
if (isset($counter['assign'])) {
- $smarty->assign($counter['assign'], $counter['count']);
+ $template->assign($counter['assign'], $counter['count']);
}
if (isset($params['print'])) {
@@ -75,6 +75,4 @@ function smarty_function_counter($params, &$smarty)
}
-/* vim: set expandtab: */
-
-?>
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/function.cycle.php b/include/smarty/libs/plugins/function.cycle.php
index fe78bb87d..1778ffb53 100644
--- a/include/smarty/libs/plugins/function.cycle.php
+++ b/include/smarty/libs/plugins/function.cycle.php
@@ -1,8 +1,9 @@
<?php
/**
* Smarty plugin
+ *
* @package Smarty
- * @subpackage plugins
+ * @subpackage PluginsFunction
*/
/**
@@ -12,47 +13,48 @@
* Name: cycle<br>
* Date: May 3, 2002<br>
* Purpose: cycle through given values<br>
- * Input:
- * - name = name of cycle (optional)
- * - values = comma separated list of values to cycle,
- * or an array of values to cycle
- * (this can be left out for subsequent calls)
- * - reset = boolean - resets given var to true
- * - print = boolean - print var or not. default is true
- * - advance = boolean - whether or not to advance the cycle
- * - delimiter = the value delimiter, default is ","
- * - assign = boolean, assigns to template var instead of
- * printed.
- *
+ * Params:
+ * <pre>
+ * - name - name of cycle (optional)
+ * - values - comma separated list of values to cycle, or an array of values to cycle
+ * (this can be left out for subsequent calls)
+ * - reset - boolean - resets given var to true
+ * - print - boolean - print var or not. default is true
+ * - advance - boolean - whether or not to advance the cycle
+ * - delimiter - the value delimiter, default is ","
+ * - assign - boolean, assigns to template var instead of printed.
+ * </pre>
* Examples:<br>
* <pre>
* {cycle values="#eeeeee,#d0d0d0d"}
* {cycle name=row values="one,two,three" reset=true}
* {cycle name=row}
* </pre>
- * @link http://smarty.php.net/manual/en/language.function.cycle.php {cycle}
+ *
+ * @link http://www.smarty.net/manual/en/language.function.cycle.php {cycle}
* (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
* @author credit to Mark Priatel <mpriatel@rogers.com>
* @author credit to Gerard <gerard@interfold.com>
* @author credit to Jason Sweat <jsweat_php@yahoo.com>
* @version 1.3
- * @param array
- * @param Smarty
+ * @param array $params parameters
+ * @param Smarty_Internal_Template $template template object
* @return string|null
*/
-function smarty_function_cycle($params, &$smarty)
+
+function smarty_function_cycle($params, $template)
{
static $cycle_vars;
-
+
$name = (empty($params['name'])) ? 'default' : $params['name'];
$print = (isset($params['print'])) ? (bool)$params['print'] : true;
$advance = (isset($params['advance'])) ? (bool)$params['advance'] : true;
$reset = (isset($params['reset'])) ? (bool)$params['reset'] : false;
-
- if (!in_array('values', array_keys($params))) {
+
+ if (!isset($params['values'])) {
if(!isset($cycle_vars[$name]['values'])) {
- $smarty->trigger_error("cycle: missing 'values' parameter");
+ trigger_error("cycle: missing 'values' parameter");
return;
}
} else {
@@ -63,23 +65,27 @@ function smarty_function_cycle($params, &$smarty)
$cycle_vars[$name]['values'] = $params['values'];
}
- $cycle_vars[$name]['delimiter'] = (isset($params['delimiter'])) ? $params['delimiter'] : ',';
-
+ if (isset($params['delimiter'])) {
+ $cycle_vars[$name]['delimiter'] = $params['delimiter'];
+ } elseif (!isset($cycle_vars[$name]['delimiter'])) {
+ $cycle_vars[$name]['delimiter'] = ',';
+ }
+
if(is_array($cycle_vars[$name]['values'])) {
$cycle_array = $cycle_vars[$name]['values'];
} else {
$cycle_array = explode($cycle_vars[$name]['delimiter'],$cycle_vars[$name]['values']);
}
-
+
if(!isset($cycle_vars[$name]['index']) || $reset ) {
$cycle_vars[$name]['index'] = 0;
}
-
+
if (isset($params['assign'])) {
$print = false;
- $smarty->assign($params['assign'], $cycle_array[$cycle_vars[$name]['index']]);
+ $template->assign($params['assign'], $cycle_array[$cycle_vars[$name]['index']]);
}
-
+
if($print) {
$retval = $cycle_array[$cycle_vars[$name]['index']];
} else {
@@ -93,10 +99,8 @@ function smarty_function_cycle($params, &$smarty)
$cycle_vars[$name]['index']++;
}
}
-
+
return $retval;
}
-/* vim: set expandtab: */
-
-?>
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/function.debug.php b/include/smarty/libs/plugins/function.debug.php
deleted file mode 100644
index 43452307b..000000000
--- a/include/smarty/libs/plugins/function.debug.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty {debug} function plugin
- *
- * Type: function<br>
- * Name: debug<br>
- * Date: July 1, 2002<br>
- * Purpose: popup debug window
- * @link http://smarty.php.net/manual/en/language.function.debug.php {debug}
- * (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @version 1.0
- * @param array
- * @param Smarty
- * @return string output from {@link Smarty::_generate_debug_output()}
- */
-function smarty_function_debug($params, &$smarty)
-{
- if (isset($params['output'])) {
- $smarty->assign('_smarty_debug_output', $params['output']);
- }
- require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php');
- return smarty_core_display_debug_console(null, $smarty);
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/plugins/function.eval.php b/include/smarty/libs/plugins/function.eval.php
deleted file mode 100644
index ff0472de2..000000000
--- a/include/smarty/libs/plugins/function.eval.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty {eval} function plugin
- *
- * Type: function<br>
- * Name: eval<br>
- * Purpose: evaluate a template variable as a template<br>
- * @link http://smarty.php.net/manual/en/language.function.eval.php {eval}
- * (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param array
- * @param Smarty
- */
-function smarty_function_eval($params, &$smarty)
-{
-
- if (!isset($params['var'])) {
- $smarty->trigger_error("eval: missing 'var' parameter");
- return;
- }
-
- if($params['var'] == '') {
- return;
- }
-
- $smarty->_compile_source('evaluated template', $params['var'], $_var_compiled);
-
- ob_start();
- $smarty->_eval('?>' . $_var_compiled);
- $_contents = ob_get_contents();
- ob_end_clean();
-
- if (!empty($params['assign'])) {
- $smarty->assign($params['assign'], $_contents);
- } else {
- return $_contents;
- }
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/plugins/function.fetch.php b/include/smarty/libs/plugins/function.fetch.php
index 81b1bfc6b..eca1182d5 100644
--- a/include/smarty/libs/plugins/function.fetch.php
+++ b/include/smarty/libs/plugins/function.fetch.php
@@ -1,221 +1,214 @@
<?php
/**
* Smarty plugin
+ *
* @package Smarty
- * @subpackage plugins
+ * @subpackage PluginsFunction
*/
-
/**
* Smarty {fetch} plugin
*
* Type: function<br>
* Name: fetch<br>
* Purpose: fetch file, web or ftp data and display results
- * @link http://smarty.php.net/manual/en/language.function.fetch.php {fetch}
+ *
+ * @link http://www.smarty.net/manual/en/language.function.fetch.php {fetch}
* (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
- * @param array
- * @param Smarty
- * @return string|null if the assign parameter is passed, Smarty assigns the
- * result to a template variable
+ * @param array $params parameters
+ * @param Smarty_Internal_Template $template template object
+ * @return string|null if the assign parameter is passed, Smarty assigns the result to a template variable
*/
-function smarty_function_fetch($params, &$smarty)
+function smarty_function_fetch($params, $template)
{
if (empty($params['file'])) {
- $smarty->_trigger_fatal_error("[plugin] parameter 'file' cannot be empty");
+ trigger_error("[plugin] fetch parameter 'file' cannot be empty",E_USER_NOTICE);
return;
}
-
- $content = '';
- if ($smarty->security && !preg_match('!^(http|ftp)://!i', $params['file'])) {
- $_params = array('resource_type' => 'file', 'resource_name' => $params['file']);
- require_once(SMARTY_CORE_DIR . 'core.is_secure.php');
- if(!smarty_core_is_secure($_params, $smarty)) {
- $smarty->_trigger_fatal_error('[plugin] (secure mode) fetch \'' . $params['file'] . '\' is not allowed');
- return;
- }
-
- // fetch the file
- if($fp = @fopen($params['file'],'r')) {
- while(!feof($fp)) {
- $content .= fgets ($fp,4096);
+
+ // strip file protocol
+ if (stripos($params['file'], 'file://') === 0) {
+ $params['file'] = substr($params['file'], 7);
+ }
+
+ $protocol = strpos($params['file'], '://');
+ if ($protocol !== false) {
+ $protocol = strtolower(substr($params['file'], 0, $protocol));
+ }
+
+ if (isset($template->smarty->security_policy)) {
+ if ($protocol) {
+ // remote resource (or php stream, …)
+ if(!$template->smarty->security_policy->isTrustedUri($params['file'])) {
+ return;
}
- fclose($fp);
} else {
- $smarty->_trigger_fatal_error('[plugin] fetch cannot read file \'' . $params['file'] . '\'');
- return;
+ // local file
+ if(!$template->smarty->security_policy->isTrustedResourceDir($params['file'])) {
+ return;
+ }
}
- } else {
- // not a local file
- if(preg_match('!^http://!i',$params['file'])) {
- // http fetch
- if($uri_parts = parse_url($params['file'])) {
- // set defaults
- $host = $server_name = $uri_parts['host'];
- $timeout = 30;
- $accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*";
- $agent = "Smarty Template Engine ".$smarty->_version;
- $referer = "";
- $uri = !empty($uri_parts['path']) ? $uri_parts['path'] : '/';
- $uri .= !empty($uri_parts['query']) ? '?' . $uri_parts['query'] : '';
- $_is_proxy = false;
- if(empty($uri_parts['port'])) {
- $port = 80;
- } else {
- $port = $uri_parts['port'];
- }
- if(!empty($uri_parts['user'])) {
- $user = $uri_parts['user'];
- }
- if(!empty($uri_parts['pass'])) {
- $pass = $uri_parts['pass'];
- }
- // loop through parameters, setup headers
- foreach($params as $param_key => $param_value) {
- switch($param_key) {
- case "file":
- case "assign":
- case "assign_headers":
- break;
- case "user":
- if(!empty($param_value)) {
- $user = $param_value;
- }
- break;
- case "pass":
- if(!empty($param_value)) {
- $pass = $param_value;
- }
- break;
- case "accept":
- if(!empty($param_value)) {
- $accept = $param_value;
- }
- break;
- case "header":
- if(!empty($param_value)) {
- if(!preg_match('![\w\d-]+: .+!',$param_value)) {
- $smarty->_trigger_fatal_error("[plugin] invalid header format '".$param_value."'");
- return;
- } else {
- $extra_headers[] = $param_value;
- }
- }
- break;
- case "proxy_host":
- if(!empty($param_value)) {
- $proxy_host = $param_value;
- }
- break;
- case "proxy_port":
- if(!preg_match('!\D!', $param_value)) {
- $proxy_port = (int) $param_value;
- } else {
- $smarty->_trigger_fatal_error("[plugin] invalid value for attribute '".$param_key."'");
+ }
+
+ $content = '';
+ if ($protocol == 'http') {
+ // http fetch
+ if($uri_parts = parse_url($params['file'])) {
+ // set defaults
+ $host = $server_name = $uri_parts['host'];
+ $timeout = 30;
+ $accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*";
+ $agent = "Smarty Template Engine ". Smarty::SMARTY_VERSION;
+ $referer = "";
+ $uri = !empty($uri_parts['path']) ? $uri_parts['path'] : '/';
+ $uri .= !empty($uri_parts['query']) ? '?' . $uri_parts['query'] : '';
+ $_is_proxy = false;
+ if(empty($uri_parts['port'])) {
+ $port = 80;
+ } else {
+ $port = $uri_parts['port'];
+ }
+ if(!empty($uri_parts['user'])) {
+ $user = $uri_parts['user'];
+ }
+ if(!empty($uri_parts['pass'])) {
+ $pass = $uri_parts['pass'];
+ }
+ // loop through parameters, setup headers
+ foreach($params as $param_key => $param_value) {
+ switch($param_key) {
+ case "file":
+ case "assign":
+ case "assign_headers":
+ break;
+ case "user":
+ if(!empty($param_value)) {
+ $user = $param_value;
+ }
+ break;
+ case "pass":
+ if(!empty($param_value)) {
+ $pass = $param_value;
+ }
+ break;
+ case "accept":
+ if(!empty($param_value)) {
+ $accept = $param_value;
+ }
+ break;
+ case "header":
+ if(!empty($param_value)) {
+ if(!preg_match('![\w\d-]+: .+!',$param_value)) {
+ trigger_error("[plugin] invalid header format '".$param_value."'",E_USER_NOTICE);
return;
- }
- break;
- case "agent":
- if(!empty($param_value)) {
- $agent = $param_value;
- }
- break;
- case "referer":
- if(!empty($param_value)) {
- $referer = $param_value;
- }
- break;
- case "timeout":
- if(!preg_match('!\D!', $param_value)) {
- $timeout = (int) $param_value;
} else {
- $smarty->_trigger_fatal_error("[plugin] invalid value for attribute '".$param_key."'");
- return;
+ $extra_headers[] = $param_value;
}
- break;
- default:
- $smarty->_trigger_fatal_error("[plugin] unrecognized attribute '".$param_key."'");
+ }
+ break;
+ case "proxy_host":
+ if(!empty($param_value)) {
+ $proxy_host = $param_value;
+ }
+ break;
+ case "proxy_port":
+ if(!preg_match('!\D!', $param_value)) {
+ $proxy_port = (int) $param_value;
+ } else {
+ trigger_error("[plugin] invalid value for attribute '".$param_key."'",E_USER_NOTICE);
return;
- }
- }
- if(!empty($proxy_host) && !empty($proxy_port)) {
- $_is_proxy = true;
- $fp = fsockopen($proxy_host,$proxy_port,$errno,$errstr,$timeout);
- } else {
- $fp = fsockopen($server_name,$port,$errno,$errstr,$timeout);
+ }
+ break;
+ case "agent":
+ if(!empty($param_value)) {
+ $agent = $param_value;
+ }
+ break;
+ case "referer":
+ if(!empty($param_value)) {
+ $referer = $param_value;
+ }
+ break;
+ case "timeout":
+ if(!preg_match('!\D!', $param_value)) {
+ $timeout = (int) $param_value;
+ } else {
+ trigger_error("[plugin] invalid value for attribute '".$param_key."'",E_USER_NOTICE);
+ return;
+ }
+ break;
+ default:
+ trigger_error("[plugin] unrecognized attribute '".$param_key."'",E_USER_NOTICE);
+ return;
}
+ }
+ if(!empty($proxy_host) && !empty($proxy_port)) {
+ $_is_proxy = true;
+ $fp = fsockopen($proxy_host,$proxy_port,$errno,$errstr,$timeout);
+ } else {
+ $fp = fsockopen($server_name,$port,$errno,$errstr,$timeout);
+ }
- if(!$fp) {
- $smarty->_trigger_fatal_error("[plugin] unable to fetch: $errstr ($errno)");
- return;
+ if(!$fp) {
+ trigger_error("[plugin] unable to fetch: $errstr ($errno)",E_USER_NOTICE);
+ return;
+ } else {
+ if($_is_proxy) {
+ fputs($fp, 'GET ' . $params['file'] . " HTTP/1.0\r\n");
} else {
- if($_is_proxy) {
- fputs($fp, 'GET ' . $params['file'] . " HTTP/1.0\r\n");
- } else {
- fputs($fp, "GET $uri HTTP/1.0\r\n");
- }
- if(!empty($host)) {
- fputs($fp, "Host: $host\r\n");
- }
- if(!empty($accept)) {
- fputs($fp, "Accept: $accept\r\n");
- }
- if(!empty($agent)) {
- fputs($fp, "User-Agent: $agent\r\n");
- }
- if(!empty($referer)) {
- fputs($fp, "Referer: $referer\r\n");
- }
- if(isset($extra_headers) && is_array($extra_headers)) {
- foreach($extra_headers as $curr_header) {
- fputs($fp, $curr_header."\r\n");
- }
- }
- if(!empty($user) && !empty($pass)) {
- fputs($fp, "Authorization: BASIC ".base64_encode("$user:$pass")."\r\n");
+ fputs($fp, "GET $uri HTTP/1.0\r\n");
+ }
+ if(!empty($host)) {
+ fputs($fp, "Host: $host\r\n");
+ }
+ if(!empty($accept)) {
+ fputs($fp, "Accept: $accept\r\n");
+ }
+ if(!empty($agent)) {
+ fputs($fp, "User-Agent: $agent\r\n");
+ }
+ if(!empty($referer)) {
+ fputs($fp, "Referer: $referer\r\n");
+ }
+ if(isset($extra_headers) && is_array($extra_headers)) {
+ foreach($extra_headers as $curr_header) {
+ fputs($fp, $curr_header."\r\n");
}
+ }
+ if(!empty($user) && !empty($pass)) {
+ fputs($fp, "Authorization: BASIC ".base64_encode("$user:$pass")."\r\n");
+ }
- fputs($fp, "\r\n");
- while(!feof($fp)) {
- $content .= fgets($fp,4096);
- }
- fclose($fp);
- $csplit = split("\r\n\r\n",$content,2);
+ fputs($fp, "\r\n");
+ while(!feof($fp)) {
+ $content .= fgets($fp,4096);
+ }
+ fclose($fp);
+ $csplit = preg_split("!\r\n\r\n!",$content,2);
- $content = $csplit[1];
+ $content = $csplit[1];
- if(!empty($params['assign_headers'])) {
- $smarty->assign($params['assign_headers'],split("\r\n",$csplit[0]));
- }
+ if(!empty($params['assign_headers'])) {
+ $template->assign($params['assign_headers'],preg_split("!\r\n!",$csplit[0]));
}
- } else {
- $smarty->_trigger_fatal_error("[plugin] unable to parse URL, check syntax");
- return;
}
} else {
- // ftp fetch
- if($fp = @fopen($params['file'],'r')) {
- while(!feof($fp)) {
- $content .= fgets ($fp,4096);
- }
- fclose($fp);
- } else {
- $smarty->_trigger_fatal_error('[plugin] fetch cannot read file \'' . $params['file'] .'\'');
- return;
- }
+ trigger_error("[plugin fetch] unable to parse URL, check syntax",E_USER_NOTICE);
+ return;
+ }
+ } else {
+ $content = @file_get_contents($params['file']);
+ if ($content === false) {
+ throw new SmartyException("{fetch} cannot read resource '" . $params['file'] ."'");
}
-
}
-
if (!empty($params['assign'])) {
- $smarty->assign($params['assign'],$content);
+ $template->assign($params['assign'], $content);
} else {
return $content;
}
}
-/* vim: set expandtab: */
-
-?>
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/function.html_checkboxes.php b/include/smarty/libs/plugins/function.html_checkboxes.php
index 7733eea74..1866bc2f3 100644
--- a/include/smarty/libs/plugins/function.html_checkboxes.php
+++ b/include/smarty/libs/plugins/function.html_checkboxes.php
@@ -1,11 +1,11 @@
<?php
/**
* Smarty plugin
+ *
* @package Smarty
- * @subpackage plugins
+ * @subpackage PluginsFunction
*/
-
/**
* Smarty {html_checkboxes} function plugin
*
@@ -14,40 +14,46 @@
* Name: html_checkboxes<br>
* Date: 24.Feb.2003<br>
* Purpose: Prints out a list of checkbox input types<br>
- * Input:<br>
- * - name (optional) - string default "checkbox"
- * - values (required) - array
- * - options (optional) - associative array
- * - checked (optional) - array default not set
- * - separator (optional) - ie <br> or &nbsp;
- * - output (optional) - the output next to each checkbox
- * - assign (optional) - assign the output as an array to this variable
* Examples:
* <pre>
* {html_checkboxes values=$ids output=$names}
* {html_checkboxes values=$ids name='box' separator='<br>' output=$names}
* {html_checkboxes values=$ids checked=$checked separator='<br>' output=$names}
* </pre>
- * @link http://smarty.php.net/manual/en/language.function.html.checkboxes.php {html_checkboxes}
+ * Params:
+ * <pre>
+ * - name (optional) - string default "checkbox"
+ * - values (required) - array
+ * - options (optional) - associative array
+ * - checked (optional) - array default not set
+ * - separator (optional) - ie <br> or &nbsp;
+ * - output (optional) - the output next to each checkbox
+ * - assign (optional) - assign the output as an array to this variable
+ * - escape (optional) - escape the content (not value), defaults to true
+ * </pre>
+ *
+ * @link http://www.smarty.net/manual/en/language.function.html.checkboxes.php {html_checkboxes}
* (Smarty online manual)
* @author Christopher Kvarme <christopher.kvarme@flashjab.com>
* @author credits to Monte Ohrt <monte at ohrt dot com>
* @version 1.0
- * @param array
- * @param Smarty
+ * @param array $params parameters
+ * @param object $template template object
* @return string
* @uses smarty_function_escape_special_chars()
*/
-function smarty_function_html_checkboxes($params, &$smarty)
+function smarty_function_html_checkboxes($params, $template)
{
- require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
+ require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php');
$name = 'checkbox';
$values = null;
$options = null;
- $selected = null;
+ $selected = array();
$separator = '';
+ $escape = true;
$labels = true;
+ $label_ids = false;
$output = null;
$extra = '';
@@ -56,40 +62,82 @@ function smarty_function_html_checkboxes($params, &$smarty)
switch($_key) {
case 'name':
case 'separator':
- $$_key = $_val;
+ $$_key = (string) $_val;
break;
+ case 'escape':
case 'labels':
- $$_key = (bool)$_val;
+ case 'label_ids':
+ $$_key = (bool) $_val;
break;
case 'options':
- $$_key = (array)$_val;
+ $$_key = (array) $_val;
break;
case 'values':
case 'output':
- $$_key = array_values((array)$_val);
+ $$_key = array_values((array) $_val);
break;
case 'checked':
case 'selected':
- $selected = array_map('strval', array_values((array)$_val));
+ if (is_array($_val)) {
+ $selected = array();
+ foreach ($_val as $_sel) {
+ if (is_object($_sel)) {
+ if (method_exists($_sel, "__toString")) {
+ $_sel = smarty_function_escape_special_chars((string) $_sel->__toString());
+ } else {
+ trigger_error("html_checkboxes: selected attribute contains an object of class '". get_class($_sel) ."' without __toString() method", E_USER_NOTICE);
+ continue;
+ }
+ } else {
+ $_sel = smarty_function_escape_special_chars((string) $_sel);
+ }
+ $selected[$_sel] = true;
+ }
+ } elseif (is_object($_val)) {
+ if (method_exists($_val, "__toString")) {
+ $selected = smarty_function_escape_special_chars((string) $_val->__toString());
+ } else {
+ trigger_error("html_checkboxes: selected attribute is an object of class '". get_class($_val) ."' without __toString() method", E_USER_NOTICE);
+ }
+ } else {
+ $selected = smarty_function_escape_special_chars((string) $_val);
+ }
break;
case 'checkboxes':
- $smarty->trigger_error('html_checkboxes: the use of the "checkboxes" attribute is deprecated, use "options" instead', E_USER_WARNING);
- $options = (array)$_val;
+ trigger_error('html_checkboxes: the use of the "checkboxes" attribute is deprecated, use "options" instead', E_USER_WARNING);
+ $options = (array) $_val;
break;
case 'assign':
break;
+ case 'strict': break;
+
+ case 'disabled':
+ case 'readonly':
+ if (!empty($params['strict'])) {
+ if (!is_scalar($_val)) {
+ trigger_error("html_options: $_key attribute must be a scalar, only boolean true or string '$_key' will actually add the attribute", E_USER_NOTICE);
+ }
+
+ if ($_val === true || $_val === $_key) {
+ $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"';
+ }
+
+ break;
+ }
+ // omit break; to fall through!
+
default:
if(!is_array($_val)) {
$extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"';
} else {
- $smarty->trigger_error("html_checkboxes: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
+ trigger_error("html_checkboxes: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
}
break;
}
@@ -98,46 +146,88 @@ function smarty_function_html_checkboxes($params, &$smarty)
if (!isset($options) && !isset($values))
return ''; /* raise error here? */
- settype($selected, 'array');
$_html_result = array();
if (isset($options)) {
-
- foreach ($options as $_key=>$_val)
- $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels);
-
-
+ foreach ($options as $_key=>$_val) {
+ $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids, $escape);
+ }
} else {
foreach ($values as $_i=>$_key) {
$_val = isset($output[$_i]) ? $output[$_i] : '';
- $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels);
+ $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids, $escape);
}
-
}
if(!empty($params['assign'])) {
- $smarty->assign($params['assign'], $_html_result);
+ $template->assign($params['assign'], $_html_result);
} else {
- return implode("\n",$_html_result);
+ return implode("\n", $_html_result);
}
}
-function smarty_function_html_checkboxes_output($name, $value, $output, $selected, $extra, $separator, $labels) {
+function smarty_function_html_checkboxes_output($name, $value, $output, $selected, $extra, $separator, $labels, $label_ids, $escape=true) {
$_output = '';
- if ($labels) $_output .= '<label>';
- $_output .= '<input type="checkbox" name="'
- . smarty_function_escape_special_chars($name) . '[]" value="'
- . smarty_function_escape_special_chars($value) . '"';
-
- if (in_array((string)$value, $selected)) {
+
+ if (is_object($value)) {
+ if (method_exists($value, "__toString")) {
+ $value = (string) $value->__toString();
+ } else {
+ trigger_error("html_options: value is an object of class '". get_class($value) ."' without __toString() method", E_USER_NOTICE);
+ return '';
+ }
+ } else {
+ $value = (string) $value;
+ }
+
+ if (is_object($output)) {
+ if (method_exists($output, "__toString")) {
+ $output = (string) $output->__toString();
+ } else {
+ trigger_error("html_options: output is an object of class '". get_class($output) ."' without __toString() method", E_USER_NOTICE);
+ return '';
+ }
+ } else {
+ $output = (string) $output;
+ }
+
+ if ($labels) {
+ if ($label_ids) {
+ $_id = smarty_function_escape_special_chars(preg_replace('![^\w\-\.]!' . Smarty::$_UTF8_MODIFIER, '_', $name . '_' . $value));
+ $_output .= '<label for="' . $_id . '">';
+ } else {
+ $_output .= '<label>';
+ }
+ }
+
+ $name = smarty_function_escape_special_chars($name);
+ $value = smarty_function_escape_special_chars($value);
+ if ($escape) {
+ $output = smarty_function_escape_special_chars($output);
+ }
+
+ $_output .= '<input type="checkbox" name="' . $name . '[]" value="' . $value . '"';
+
+ if ($labels && $label_ids) {
+ $_output .= ' id="' . $_id . '"';
+ }
+
+ if (is_array($selected)) {
+ if (isset($selected[$value])) {
+ $_output .= ' checked="checked"';
+ }
+ } elseif ($value === $selected) {
$_output .= ' checked="checked"';
}
- $_output .= $extra . '>' . $output;
- if ($labels) $_output .= '</label>';
+
+ $_output .= $extra . ' />' . $output;
+ if ($labels) {
+ $_output .= '</label>';
+ }
+
$_output .= $separator;
-
return $_output;
}
-?>
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/function.html_image.php b/include/smarty/libs/plugins/function.html_image.php
index 96cd795c2..6521966bb 100644
--- a/include/smarty/libs/plugins/function.html_image.php
+++ b/include/smarty/libs/plugins/function.html_image.php
@@ -1,43 +1,43 @@
<?php
/**
* Smarty plugin
+ *
* @package Smarty
- * @subpackage plugins
+ * @subpackage PluginsFunction
*/
-
/**
* Smarty {html_image} function plugin
- *
+ *
* Type: function<br>
* Name: html_image<br>
* Date: Feb 24, 2003<br>
* Purpose: format HTML tags for the image<br>
- * Input:<br>
- * - file = file (and path) of image (required)
- * - height = image height (optional, default actual height)
- * - width = image width (optional, default actual width)
- * - basedir = base directory for absolute paths, default
- * is environment variable DOCUMENT_ROOT
- * - path_prefix = prefix for path output (optional, default empty)
- *
- * Examples: {html_image file="/images/masthead.gif"}
- * Output: <img src="/images/masthead.gif" width=400 height=23>
- * @link http://smarty.php.net/manual/en/language.function.html.image.php {html_image}
+ * Examples: {html_image file="/images/masthead.gif"}<br>
+ * Output: <img src="/images/masthead.gif" width=400 height=23><br>
+ * Params:
+ * <pre>
+ * - file - (required) - file (and path) of image
+ * - height - (optional) - image height (default actual height)
+ * - width - (optional) - image width (default actual width)
+ * - basedir - (optional) - base directory for absolute paths, default is environment variable DOCUMENT_ROOT
+ * - path_prefix - prefix for path output (optional, default empty)
+ * </pre>
+ *
+ * @link http://www.smarty.net/manual/en/language.function.html.image.php {html_image}
* (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @author credits to Duda <duda@big.hu> - wrote first image function
- * in repository, helped with lots of functionality
- * @version 1.0
- * @param array
- * @param Smarty
- * @return string
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @author credits to Duda <duda@big.hu>
+ * @version 1.0
+ * @param array $params parameters
+ * @param Smarty_Internal_Template $template template object
+ * @return string
* @uses smarty_function_escape_special_chars()
*/
-function smarty_function_html_image($params, &$smarty)
+function smarty_function_html_image($params, $template)
{
- require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
-
+ require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php');
+
$alt = '';
$file = '';
$height = '';
@@ -46,10 +46,9 @@ function smarty_function_html_image($params, &$smarty)
$prefix = '';
$suffix = '';
$path_prefix = '';
- $server_vars = ($smarty->request_use_auto_globals) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS'];
- $basedir = isset($server_vars['DOCUMENT_ROOT']) ? $server_vars['DOCUMENT_ROOT'] : '';
+ $basedir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : '';
foreach($params as $_key => $_val) {
- switch($_key) {
+ switch ($_key) {
case 'file':
case 'height':
case 'width':
@@ -60,11 +59,11 @@ function smarty_function_html_image($params, &$smarty)
break;
case 'alt':
- if(!is_array($_val)) {
+ if (!is_array($_val)) {
$$_key = smarty_function_escape_special_chars($_val);
} else {
- $smarty->trigger_error("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
- }
+ throw new SmartyException ("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
+ }
break;
case 'link':
@@ -74,69 +73,87 @@ function smarty_function_html_image($params, &$smarty)
break;
default:
- if(!is_array($_val)) {
- $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"';
+ if (!is_array($_val)) {
+ $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"';
} else {
- $smarty->trigger_error("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
- }
+ throw new SmartyException ("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
+ }
break;
- }
- }
+ }
+ }
if (empty($file)) {
- $smarty->trigger_error("html_image: missing 'file' parameter", E_USER_NOTICE);
+ trigger_error("html_image: missing 'file' parameter", E_USER_NOTICE);
return;
- }
+ }
- if (substr($file,0,1) == '/') {
+ if ($file[0] == '/') {
$_image_path = $basedir . $file;
} else {
$_image_path = $file;
}
- if(!isset($params['width']) || !isset($params['height'])) {
- if(!$_image_data = @getimagesize($_image_path)) {
- if(!file_exists($_image_path)) {
- $smarty->trigger_error("html_image: unable to find '$_image_path'", E_USER_NOTICE);
+ // strip file protocol
+ if (stripos($params['file'], 'file://') === 0) {
+ $params['file'] = substr($params['file'], 7);
+ }
+
+ $protocol = strpos($params['file'], '://');
+ if ($protocol !== false) {
+ $protocol = strtolower(substr($params['file'], 0, $protocol));
+ }
+
+ if (isset($template->smarty->security_policy)) {
+ if ($protocol) {
+ // remote resource (or php stream, …)
+ if(!$template->smarty->security_policy->isTrustedUri($params['file'])) {
+ return;
+ }
+ } else {
+ // local file
+ if(!$template->smarty->security_policy->isTrustedResourceDir($params['file'])) {
+ return;
+ }
+ }
+ }
+
+ if (!isset($params['width']) || !isset($params['height'])) {
+ // FIXME: (rodneyrehm) getimagesize() loads the complete file off a remote resource, use custom [jpg,png,gif]header reader!
+ if (!$_image_data = @getimagesize($_image_path)) {
+ if (!file_exists($_image_path)) {
+ trigger_error("html_image: unable to find '$_image_path'", E_USER_NOTICE);
return;
- } else if(!is_readable($_image_path)) {
- $smarty->trigger_error("html_image: unable to read '$_image_path'", E_USER_NOTICE);
+ } else if (!is_readable($_image_path)) {
+ trigger_error("html_image: unable to read '$_image_path'", E_USER_NOTICE);
return;
} else {
- $smarty->trigger_error("html_image: '$_image_path' is not a valid image file", E_USER_NOTICE);
+ trigger_error("html_image: '$_image_path' is not a valid image file", E_USER_NOTICE);
return;
- }
+ }
}
- if ($smarty->security &&
- ($_params = array('resource_type' => 'file', 'resource_name' => $_image_path)) &&
- (require_once(SMARTY_CORE_DIR . 'core.is_secure.php')) &&
- (!smarty_core_is_secure($_params, $smarty)) ) {
- $smarty->trigger_error("html_image: (secure) '$_image_path' not in secure directory", E_USER_NOTICE);
- }
-
- if(!isset($params['width'])) {
+
+ if (!isset($params['width'])) {
$width = $_image_data[0];
- }
- if(!isset($params['height'])) {
+ }
+ if (!isset($params['height'])) {
$height = $_image_data[1];
- }
-
- }
+ }
+ }
- if(isset($params['dpi'])) {
- if(strstr($server_vars['HTTP_USER_AGENT'], 'Mac')) {
+ if (isset($params['dpi'])) {
+ if (strstr($_SERVER['HTTP_USER_AGENT'], 'Mac')) {
+ // FIXME: (rodneyrehm) wrong dpi assumption
+ // don't know who thought this up… even if it was true in 1998, it's definitely wrong in 2011.
$dpi_default = 72;
} else {
$dpi_default = 96;
- }
- $_resize = $dpi_default/$params['dpi'];
+ }
+ $_resize = $dpi_default / $params['dpi'];
$width = round($width * $_resize);
$height = round($height * $_resize);
- }
-
- return $prefix . '<img src="'.$path_prefix.$file.'" alt="'.$alt.'" width="'.$width.'" height="'.$height.'"'.$extra.'>' . $suffix;
-}
+ }
-/* vim: set expandtab: */
+ return $prefix . '<img src="' . $path_prefix . $file . '" alt="' . $alt . '" width="' . $width . '" height="' . $height . '"' . $extra . ' />' . $suffix;
+}
-?>
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/function.html_options.php b/include/smarty/libs/plugins/function.html_options.php
index cebadde47..68fa0524a 100644
--- a/include/smarty/libs/plugins/function.html_options.php
+++ b/include/smarty/libs/plugins/function.html_options.php
@@ -1,122 +1,193 @@
<?php
/**
* Smarty plugin
+ *
* @package Smarty
- * @subpackage plugins
+ * @subpackage PluginsFunction
*/
-
/**
* Smarty {html_options} function plugin
- *
+ *
* Type: function<br>
* Name: html_options<br>
- * Input:<br>
- * - name (optional) - string default "select"
- * - values (required if no options supplied) - array
- * - options (required if no values supplied) - associative array
- * - selected (optional) - string default not set
- * - output (required if not options supplied) - array
* Purpose: Prints the list of <option> tags generated from
- * the passed parameters
- * @link http://smarty.php.net/manual/en/language.function.html.options.php {html_image}
+ * the passed parameters<br>
+ * Params:
+ * <pre>
+ * - name (optional) - string default "select"
+ * - values (required) - if no options supplied) - array
+ * - options (required) - if no values supplied) - associative array
+ * - selected (optional) - string default not set
+ * - output (required) - if not options supplied) - array
+ * - id (optional) - string default not set
+ * - class (optional) - string default not set
+ * </pre>
+ *
+ * @link http://www.smarty.net/manual/en/language.function.html.options.php {html_image}
* (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param array
- * @param Smarty
- * @return string
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @author Ralf Strehle (minor optimization) <ralf dot strehle at yahoo dot de>
+ * @param array $params parameters
+ * @param Smarty_Internal_Template $template template object
+ * @return string
* @uses smarty_function_escape_special_chars()
*/
-function smarty_function_html_options($params, &$smarty)
+function smarty_function_html_options($params, $template)
{
- require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
-
+ require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php');
+
$name = null;
$values = null;
$options = null;
- $selected = array();
+ $selected = null;
$output = null;
-
+ $id = null;
+ $class = null;
+
$extra = '';
-
- foreach($params as $_key => $_val) {
- switch($_key) {
+
+ foreach ($params as $_key => $_val) {
+ switch ($_key) {
case 'name':
- $$_key = (string)$_val;
+ case 'class':
+ case 'id':
+ $$_key = (string) $_val;
break;
-
+
case 'options':
- $$_key = (array)$_val;
+ $options = (array) $_val;
break;
-
+
case 'values':
case 'output':
- $$_key = array_values((array)$_val);
+ $$_key = array_values((array) $_val);
break;
case 'selected':
- $$_key = array_map('strval', array_values((array)$_val));
+ if (is_array($_val)) {
+ $selected = array();
+ foreach ($_val as $_sel) {
+ if (is_object($_sel)) {
+ if (method_exists($_sel, "__toString")) {
+ $_sel = smarty_function_escape_special_chars((string) $_sel->__toString());
+ } else {
+ trigger_error("html_options: selected attribute contains an object of class '". get_class($_sel) ."' without __toString() method", E_USER_NOTICE);
+ continue;
+ }
+ } else {
+ $_sel = smarty_function_escape_special_chars((string) $_sel);
+ }
+ $selected[$_sel] = true;
+ }
+ } elseif (is_object($_val)) {
+ if (method_exists($_val, "__toString")) {
+ $selected = smarty_function_escape_special_chars((string) $_val->__toString());
+ } else {
+ trigger_error("html_options: selected attribute is an object of class '". get_class($_val) ."' without __toString() method", E_USER_NOTICE);
+ }
+ } else {
+ $selected = smarty_function_escape_special_chars((string) $_val);
+ }
break;
-
+
+ case 'strict': break;
+
+ case 'disabled':
+ case 'readonly':
+ if (!empty($params['strict'])) {
+ if (!is_scalar($_val)) {
+ trigger_error("html_options: $_key attribute must be a scalar, only boolean true or string '$_key' will actually add the attribute", E_USER_NOTICE);
+ }
+
+ if ($_val === true || $_val === $_key) {
+ $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"';
+ }
+
+ break;
+ }
+ // omit break; to fall through!
+
default:
- if(!is_array($_val)) {
- $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"';
+ if (!is_array($_val)) {
+ $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"';
} else {
- $smarty->trigger_error("html_options: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
- }
+ trigger_error("html_options: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
+ }
break;
- }
+ }
}
- if (!isset($options) && !isset($values))
- return ''; /* raise error here? */
+ if (!isset($options) && !isset($values)) {
+ /* raise error here? */
+ return '';
+ }
$_html_result = '';
+ $_idx = 0;
if (isset($options)) {
-
- foreach ($options as $_key=>$_val)
- $_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected);
-
+ foreach ($options as $_key => $_val) {
+ $_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected, $id, $class, $_idx);
+ }
} else {
-
- foreach ($values as $_i=>$_key) {
+ foreach ($values as $_i => $_key) {
$_val = isset($output[$_i]) ? $output[$_i] : '';
- $_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected);
- }
-
+ $_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected, $id, $class, $_idx);
+ }
}
- if(!empty($name)) {
- $_html_result = '<select name="' . $name . '"' . $extra . '>' . "\n" . $_html_result . '</select>' . "\n";
- }
+ if (!empty($name)) {
+ $_html_class = !empty($class) ? ' class="'.$class.'"' : '';
+ $_html_id = !empty($id) ? ' id="'.$id.'"' : '';
+ $_html_result = '<select name="' . $name . '"' . $_html_class . $_html_id . $extra . '>' . "\n" . $_html_result . '</select>' . "\n";
+ }
return $_html_result;
-
}
-function smarty_function_html_options_optoutput($key, $value, $selected) {
- if(!is_array($value)) {
- $_html_result = '<option label="' . smarty_function_escape_special_chars($value) . '" value="' .
- smarty_function_escape_special_chars($key) . '"';
- if (in_array((string)$key, $selected))
+function smarty_function_html_options_optoutput($key, $value, $selected, $id, $class, &$idx)
+{
+ if (!is_array($value)) {
+ $_key = smarty_function_escape_special_chars($key);
+ $_html_result = '<option value="' . $_key . '"';
+ if (is_array($selected)) {
+ if (isset($selected[$_key])) {
+ $_html_result .= ' selected="selected"';
+ }
+ } elseif ($_key === $selected) {
$_html_result .= ' selected="selected"';
- $_html_result .= '>' . smarty_function_escape_special_chars($value) . '</option>' . "\n";
+ }
+ $_html_class = !empty($class) ? ' class="'.$class.' option"' : '';
+ $_html_id = !empty($id) ? ' id="'.$id.'-'.$idx.'"' : '';
+ if (is_object($value)) {
+ if (method_exists($value, "__toString")) {
+ $value = smarty_function_escape_special_chars((string) $value->__toString());
+ } else {
+ trigger_error("html_options: value is an object of class '". get_class($value) ."' without __toString() method", E_USER_NOTICE);
+ return '';
+ }
+ } else {
+ $value = smarty_function_escape_special_chars((string) $value);
+ }
+ $_html_result .= $_html_class . $_html_id . '>' . $value . '</option>' . "\n";
+ $idx++;
} else {
- $_html_result = smarty_function_html_options_optgroup($key, $value, $selected);
+ $_idx = 0;
+ $_html_result = smarty_function_html_options_optgroup($key, $value, $selected, !empty($id) ? ($id.'-'.$idx) : null, $class, $_idx);
+ $idx++;
}
return $_html_result;
-}
+}
-function smarty_function_html_options_optgroup($key, $values, $selected) {
+function smarty_function_html_options_optgroup($key, $values, $selected, $id, $class, &$idx)
+{
$optgroup_html = '<optgroup label="' . smarty_function_escape_special_chars($key) . '">' . "\n";
foreach ($values as $key => $value) {
- $optgroup_html .= smarty_function_html_options_optoutput($key, $value, $selected);
- }
+ $optgroup_html .= smarty_function_html_options_optoutput($key, $value, $selected, $id, $class, $idx);
+ }
$optgroup_html .= "</optgroup>\n";
return $optgroup_html;
-}
-
-/* vim: set expandtab: */
+}
-?>
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/function.html_radios.php b/include/smarty/libs/plugins/function.html_radios.php
index c3bc903b0..a2741f68f 100644
--- a/include/smarty/libs/plugins/function.html_radios.php
+++ b/include/smarty/libs/plugins/function.html_radios.php
@@ -1,156 +1,217 @@
<?php
/**
* Smarty plugin
+ *
* @package Smarty
- * @subpackage plugins
+ * @subpackage PluginsFunction
*/
-
/**
* Smarty {html_radios} function plugin
- *
+ *
* File: function.html_radios.php<br>
* Type: function<br>
* Name: html_radios<br>
* Date: 24.Feb.2003<br>
* Purpose: Prints out a list of radio input types<br>
- * Input:<br>
- * - name (optional) - string default "radio"
- * - values (required) - array
- * - options (optional) - associative array
- * - checked (optional) - array default not set
- * - separator (optional) - ie <br> or &nbsp;
- * - output (optional) - the output next to each radio button
- * - assign (optional) - assign the output as an array to this variable
+ * Params:
+ * <pre>
+ * - name (optional) - string default "radio"
+ * - values (required) - array
+ * - options (required) - associative array
+ * - checked (optional) - array default not set
+ * - separator (optional) - ie <br> or &nbsp;
+ * - output (optional) - the output next to each radio button
+ * - assign (optional) - assign the output as an array to this variable
+ * - escape (optional) - escape the content (not value), defaults to true
+ * </pre>
* Examples:
* <pre>
* {html_radios values=$ids output=$names}
* {html_radios values=$ids name='box' separator='<br>' output=$names}
* {html_radios values=$ids checked=$checked separator='<br>' output=$names}
* </pre>
+ *
* @link http://smarty.php.net/manual/en/language.function.html.radios.php {html_radios}
* (Smarty online manual)
- * @author Christopher Kvarme <christopher.kvarme@flashjab.com>
- * @author credits to Monte Ohrt <monte at ohrt dot com>
- * @version 1.0
- * @param array
- * @param Smarty
- * @return string
+ * @author Christopher Kvarme <christopher.kvarme@flashjab.com>
+ * @author credits to Monte Ohrt <monte at ohrt dot com>
+ * @version 1.0
+ * @param array $params parameters
+ * @param Smarty_Internal_Template $template template object
+ * @return string
* @uses smarty_function_escape_special_chars()
*/
-function smarty_function_html_radios($params, &$smarty)
+function smarty_function_html_radios($params, $template)
{
- require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
-
+ require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php');
+
$name = 'radio';
$values = null;
$options = null;
$selected = null;
$separator = '';
+ $escape = true;
$labels = true;
$label_ids = false;
$output = null;
$extra = '';
foreach($params as $_key => $_val) {
- switch($_key) {
+ switch ($_key) {
case 'name':
case 'separator':
- $$_key = (string)$_val;
+ $$_key = (string) $_val;
break;
case 'checked':
case 'selected':
- if(is_array($_val)) {
- $smarty->trigger_error('html_radios: the "' . $_key . '" attribute cannot be an array', E_USER_WARNING);
+ if (is_array($_val)) {
+ trigger_error('html_radios: the "' . $_key . '" attribute cannot be an array', E_USER_WARNING);
+ } elseif (is_object($_val)) {
+ if (method_exists($_val, "__toString")) {
+ $selected = smarty_function_escape_special_chars((string) $_val->__toString());
+ } else {
+ trigger_error("html_radios: selected attribute is an object of class '". get_class($_val) ."' without __toString() method", E_USER_NOTICE);
+ }
} else {
- $selected = (string)$_val;
- }
+ $selected = (string) $_val;
+ }
break;
+ case 'escape':
case 'labels':
case 'label_ids':
- $$_key = (bool)$_val;
+ $$_key = (bool) $_val;
break;
case 'options':
- $$_key = (array)$_val;
+ $$_key = (array) $_val;
break;
case 'values':
case 'output':
- $$_key = array_values((array)$_val);
+ $$_key = array_values((array) $_val);
break;
case 'radios':
- $smarty->trigger_error('html_radios: the use of the "radios" attribute is deprecated, use "options" instead', E_USER_WARNING);
- $options = (array)$_val;
+ trigger_error('html_radios: the use of the "radios" attribute is deprecated, use "options" instead', E_USER_WARNING);
+ $options = (array) $_val;
break;
case 'assign':
break;
+ case 'strict': break;
+
+ case 'disabled':
+ case 'readonly':
+ if (!empty($params['strict'])) {
+ if (!is_scalar($_val)) {
+ trigger_error("html_options: $_key attribute must be a scalar, only boolean true or string '$_key' will actually add the attribute", E_USER_NOTICE);
+ }
+
+ if ($_val === true || $_val === $_key) {
+ $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"';
+ }
+
+ break;
+ }
+ // omit break; to fall through!
+
default:
- if(!is_array($_val)) {
- $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"';
+ if (!is_array($_val)) {
+ $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"';
} else {
- $smarty->trigger_error("html_radios: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
- }
+ trigger_error("html_radios: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
+ }
break;
- }
- }
+ }
+ }
- if (!isset($options) && !isset($values))
- return ''; /* raise error here? */
+ if (!isset($options) && !isset($values)) {
+ /* raise error here? */
+ return '';
+ }
$_html_result = array();
if (isset($options)) {
+ foreach ($options as $_key => $_val) {
+ $_html_result[] = smarty_function_html_radios_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids, $escape);
+ }
+ } else {
+ foreach ($values as $_i => $_key) {
+ $_val = isset($output[$_i]) ? $output[$_i] : '';
+ $_html_result[] = smarty_function_html_radios_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids, $escape);
+ }
+ }
- foreach ($options as $_key=>$_val)
- $_html_result[] = smarty_function_html_radios_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids);
-
+ if (!empty($params['assign'])) {
+ $template->assign($params['assign'], $_html_result);
} else {
+ return implode("\n", $_html_result);
+ }
+}
- foreach ($values as $_i=>$_key) {
- $_val = isset($output[$_i]) ? $output[$_i] : '';
- $_html_result[] = smarty_function_html_radios_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids);
+function smarty_function_html_radios_output($name, $value, $output, $selected, $extra, $separator, $labels, $label_ids, $escape)
+{
+ $_output = '';
+
+ if (is_object($value)) {
+ if (method_exists($value, "__toString")) {
+ $value = (string) $value->__toString();
+ } else {
+ trigger_error("html_options: value is an object of class '". get_class($value) ."' without __toString() method", E_USER_NOTICE);
+ return '';
}
-
+ } else {
+ $value = (string) $value;
}
-
- if(!empty($params['assign'])) {
- $smarty->assign($params['assign'], $_html_result);
+
+ if (is_object($output)) {
+ if (method_exists($output, "__toString")) {
+ $output = (string) $output->__toString();
+ } else {
+ trigger_error("html_options: output is an object of class '". get_class($output) ."' without __toString() method", E_USER_NOTICE);
+ return '';
+ }
} else {
- return implode("\n",$_html_result);
+ $output = (string) $output;
}
+
+ if ($labels) {
+ if ($label_ids) {
+ $_id = smarty_function_escape_special_chars(preg_replace('![^\w\-\.]!' . Smarty::$_UTF8_MODIFIER, '_', $name . '_' . $value));
+ $_output .= '<label for="' . $_id . '">';
+ } else {
+ $_output .= '<label>';
+ }
+ }
+
+ $name = smarty_function_escape_special_chars($name);
+ $value = smarty_function_escape_special_chars($value);
+ if ($escape) {
+ $output = smarty_function_escape_special_chars($output);
+ }
+
+ $_output .= '<input type="radio" name="' . $name . '" value="' . $value . '"';
-}
+ if ($labels && $label_ids) {
+ $_output .= ' id="' . $_id . '"';
+ }
-function smarty_function_html_radios_output($name, $value, $output, $selected, $extra, $separator, $labels, $label_ids) {
- $_output = '';
- if ($labels) {
- if($label_ids) {
- $_id = smarty_function_escape_special_chars(preg_replace('![^\w\-\.]!', '_', $name . '_' . $value));
- $_output .= '<label for="' . $_id . '">';
- } else {
- $_output .= '<label>';
- }
- }
- $_output .= '<input type="radio" name="'
- . smarty_function_escape_special_chars($name) . '" value="'
- . smarty_function_escape_special_chars($value) . '"';
-
- if ($labels && $label_ids) $_output .= ' id="' . $_id . '"';
-
- if ((string)$value==$selected) {
+ if ($value === $selected) {
$_output .= ' checked="checked"';
}
- $_output .= $extra . '>' . $output;
- if ($labels) $_output .= '</label>';
- $_output .= $separator;
-
+
+ $_output .= $extra . ' />' . $output;
+ if ($labels) {
+ $_output .= '</label>';
+ }
+
+ $_output .= $separator;
return $_output;
-}
+}
-?>
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/function.html_select_date.php b/include/smarty/libs/plugins/function.html_select_date.php
index ede9c7be1..13c500354 100644
--- a/include/smarty/libs/plugins/function.html_select_date.php
+++ b/include/smarty/libs/plugins/function.html_select_date.php
@@ -1,99 +1,142 @@
<?php
/**
* Smarty plugin
+ *
* @package Smarty
- * @subpackage plugins
+ * @subpackage PluginsFunction
*/
/**
+ * @ignore
+ */
+require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php');
+/**
+ * @ignore
+ */
+require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php');
+
+/**
* Smarty {html_select_date} plugin
- *
+ *
* Type: function<br>
* Name: html_select_date<br>
* Purpose: Prints the dropdowns for date selection.
- *
- * ChangeLog:<br>
- * - 1.0 initial release
- * - 1.1 added support for +/- N syntax for begin
- * and end year values. (Monte)
- * - 1.2 added support for yyyy-mm-dd syntax for
- * time value. (Jan Rosier)
- * - 1.3 added support for choosing format for
- * month values (Gary Loescher)
- * - 1.3.1 added support for choosing format for
- * day values (Marcus Bointon)
- * - 1.3.2 support negative timestamps, force year
- * dropdown to include given date unless explicitly set (Monte)
- * - 1.3.4 fix behaviour of 0000-00-00 00:00:00 dates to match that
- * of 0000-00-00 dates (cybot, boots)
- * @link http://smarty.php.net/manual/en/language.function.html.select.date.php {html_select_date}
+ *
+ * ChangeLog:
+ * <pre>
+ * - 1.0 initial release
+ * - 1.1 added support for +/- N syntax for begin
+ * and end year values. (Monte)
+ * - 1.2 added support for yyyy-mm-dd syntax for
+ * time value. (Jan Rosier)
+ * - 1.3 added support for choosing format for
+ * month values (Gary Loescher)
+ * - 1.3.1 added support for choosing format for
+ * day values (Marcus Bointon)
+ * - 1.3.2 support negative timestamps, force year
+ * dropdown to include given date unless explicitly set (Monte)
+ * - 1.3.4 fix behaviour of 0000-00-00 00:00:00 dates to match that
+ * of 0000-00-00 dates (cybot, boots)
+ * - 2.0 complete rewrite for performance,
+ * added attributes month_names, *_id
+ * </pre>
+ *
+ * @link http://www.smarty.net/manual/en/language.function.html.select.date.php {html_select_date}
* (Smarty online manual)
- * @version 1.3.4
- * @author Andrei Zmievski
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param array
- * @param Smarty
- * @return string
+ * @version 2.0
+ * @author Andrei Zmievski
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @author Rodney Rehm
+ * @param array $params parameters
+ * @param Smarty_Internal_Template $template template object
+ * @return string
*/
-function smarty_function_html_select_date($params, &$smarty)
+function smarty_function_html_select_date($params, $template)
{
- require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
- require_once $smarty->_get_plugin_filepath('shared','make_timestamp');
- require_once $smarty->_get_plugin_filepath('function','html_options');
+ // generate timestamps used for month names only
+ static $_month_timestamps = null;
+ static $_current_year = null;
+ if ($_month_timestamps === null) {
+ $_current_year = date('Y');
+ $_month_timestamps = array();
+ for ($i = 1; $i <= 12; $i++) {
+ $_month_timestamps[$i] = mktime(0, 0, 0, $i, 1, 2000);
+ }
+ }
+
/* Default values. */
- $prefix = "Date_";
- $start_year = strftime("%Y");
- $end_year = $start_year;
- $display_days = true;
- $display_months = true;
- $display_years = true;
- $month_format = "%B";
+ $prefix = "Date_";
+ $start_year = null;
+ $end_year = null;
+ $display_days = true;
+ $display_months = true;
+ $display_years = true;
+ $month_format = "%B";
/* Write months as numbers by default GL */
$month_value_format = "%m";
- $day_format = "%02d";
+ $day_format = "%02d";
/* Write day values using this format MB */
$day_value_format = "%d";
- $year_as_text = false;
+ $year_as_text = false;
/* Display years in reverse order? Ie. 2000,1999,.... */
- $reverse_years = false;
+ $reverse_years = false;
/* Should the select boxes be part of an array when returned from PHP?
e.g. setting it to "birthday", would create "birthday[Day]",
"birthday[Month]" & "birthday[Year]". Can be combined with prefix */
- $field_array = null;
+ $field_array = null;
/* <select size>'s of the different <select> tags.
If not set, uses default dropdown. */
- $day_size = null;
- $month_size = null;
- $year_size = null;
+ $day_size = null;
+ $month_size = null;
+ $year_size = null;
/* Unparsed attributes common to *ALL* the <select>/<input> tags.
An example might be in the template: all_extra ='class ="foo"'. */
- $all_extra = null;
+ $all_extra = null;
/* Separate attributes for the tags. */
- $day_extra = null;
- $month_extra = null;
- $year_extra = null;
+ $day_extra = null;
+ $month_extra = null;
+ $year_extra = null;
/* Order in which to display the fields.
"D" -> day, "M" -> month, "Y" -> year. */
- $field_order = 'MDY';
+ $field_order = 'MDY';
/* String printed between the different fields. */
$field_separator = "\n";
- $time = time();
- $all_empty = null;
- $day_empty = null;
- $month_empty = null;
- $year_empty = null;
- $extra_attrs = '';
+ $option_separator = "\n";
+ $time = null;
+ // $all_empty = null;
+ // $day_empty = null;
+ // $month_empty = null;
+ // $year_empty = null;
+ $extra_attrs = '';
+ $all_id = null;
+ $day_id = null;
+ $month_id = null;
+ $year_id = null;
- foreach ($params as $_key=>$_value) {
+ foreach ($params as $_key => $_value) {
switch ($_key) {
- case 'prefix':
case 'time':
+ if (!is_array($_value) && $_value !== null) {
+ $time = smarty_make_timestamp($_value);
+ }
+ break;
+
+ case 'month_names':
+ if (is_array($_value) && count($_value) == 12) {
+ $$_key = $_value;
+ } else {
+ trigger_error("html_select_date: month_names must be an array of 12 strings", E_USER_NOTICE);
+ }
+ break;
+
+ case 'prefix':
+ case 'field_array':
case 'start_year':
case 'end_year':
- case 'month_format':
case 'day_format':
case 'day_value_format':
- case 'field_array':
+ case 'month_format':
+ case 'month_value_format':
case 'day_size':
case 'month_size':
case 'year_size':
@@ -103,18 +146,18 @@ function smarty_function_html_select_date($params, &$smarty)
case 'year_extra':
case 'field_order':
case 'field_separator':
- case 'month_value_format':
+ case 'option_separator':
+ case 'all_empty':
case 'month_empty':
case 'day_empty':
case 'year_empty':
+ case 'all_id':
+ case 'month_id':
+ case 'day_id':
+ case 'year_id':
$$_key = (string)$_value;
break;
- case 'all_empty':
- $$_key = (string)$_value;
- $day_empty = $month_empty = $year_empty = $all_empty;
- break;
-
case 'display_days':
case 'display_months':
case 'display_years':
@@ -124,208 +167,228 @@ function smarty_function_html_select_date($params, &$smarty)
break;
default:
- if(!is_array($_value)) {
- $extra_attrs .= ' '.$_key.'="'.smarty_function_escape_special_chars($_value).'"';
+ if (!is_array($_value)) {
+ $extra_attrs .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_value) . '"';
} else {
- $smarty->trigger_error("html_select_date: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
- }
+ trigger_error("html_select_date: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
+ }
break;
- }
- }
-
- if (preg_match('!^-\d+$!', $time)) {
- // negative timestamp, use date()
- $time = date('Y-m-d', $time);
- }
- // If $time is not in format yyyy-mm-dd
- if (preg_match('/^(\d{0,4}-\d{0,2}-\d{0,2})/', $time, $found)) {
- $time = $found[1];
- } else {
- // use smarty_make_timestamp to get an unix timestamp and
- // strftime to make yyyy-mm-dd
- $time = strftime('%Y-%m-%d', smarty_make_timestamp($time));
+ }
}
- // Now split this in pieces, which later can be used to set the select
- $time = explode("-", $time);
-
- // make syntax "+N" or "-N" work with start_year and end_year
- if (preg_match('!^(\+|\-)\s*(\d+)$!', $end_year, $match)) {
- if ($match[1] == '+') {
- $end_year = strftime('%Y') + $match[2];
+
+ // Note: date() is faster than strftime()
+ // Note: explode(date()) is faster than date() date() date()
+ if (isset($params['time']) && is_array($params['time'])) {
+ if (isset($params['time'][$prefix . 'Year'])) {
+ // $_REQUEST[$field_array] given
+ foreach (array('Y' => 'Year', 'm' => 'Month', 'd' => 'Day') as $_elementKey => $_elementName) {
+ $_variableName = '_' . strtolower($_elementName);
+ $$_variableName = isset($params['time'][$prefix . $_elementName])
+ ? $params['time'][$prefix . $_elementName]
+ : date($_elementKey);
+ }
+ $time = mktime(0, 0, 0, $_month, $_day, $_year);
+ } elseif (isset($params['time'][$field_array][$prefix . 'Year'])) {
+ // $_REQUEST given
+ foreach (array('Y' => 'Year', 'm' => 'Month', 'd' => 'Day') as $_elementKey => $_elementName) {
+ $_variableName = '_' . strtolower($_elementName);
+ $$_variableName = isset($params['time'][$field_array][$prefix . $_elementName])
+ ? $params['time'][$field_array][$prefix . $_elementName]
+ : date($_elementKey);
+ }
+ $time = mktime(0, 0, 0, $_month, $_day, $_year);
} else {
- $end_year = strftime('%Y') - $match[2];
+ // no date found, use NOW
+ list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d'));
}
- }
- if (preg_match('!^(\+|\-)\s*(\d+)$!', $start_year, $match)) {
- if ($match[1] == '+') {
- $start_year = strftime('%Y') + $match[2];
+ } elseif ($time === null) {
+ if (array_key_exists('time', $params)) {
+ $_year = $_month = $_day = $time = null;
} else {
- $start_year = strftime('%Y') - $match[2];
+ list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d'));
}
+ } else {
+ list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d', $time));
}
- if (strlen($time[0]) > 0) {
- if ($start_year > $time[0] && !isset($params['start_year'])) {
- // force start year to include given date if not explicitly set
- $start_year = $time[0];
- }
- if($end_year < $time[0] && !isset($params['end_year'])) {
- // force end year to include given date if not explicitly set
- $end_year = $time[0];
+
+ // make syntax "+N" or "-N" work with $start_year and $end_year
+ // Note preg_match('!^(\+|\-)\s*(\d+)$!', $end_year, $match) is slower than trim+substr
+ foreach (array('start', 'end') as $key) {
+ $key .= '_year';
+ $t = $$key;
+ if ($t === null) {
+ $$key = (int)$_current_year;
+ } else if ($t[0] == '+') {
+ $$key = (int)($_current_year + trim(substr($t, 1)));
+ } else if ($t[0] == '-') {
+ $$key = (int)($_current_year - trim(substr($t, 1)));
+ } else {
+ $$key = (int)$$key;
}
}
- $field_order = strtoupper($field_order);
-
- $html_result = $month_result = $day_result = $year_result = "";
+ // flip for ascending or descending
+ if (($start_year > $end_year && !$reverse_years) || ($start_year < $end_year && $reverse_years)) {
+ $t = $end_year;
+ $end_year = $start_year;
+ $start_year = $t;
+ }
- $field_separator_count = -1;
- if ($display_months) {
- $field_separator_count++;
- $month_names = array();
- $month_values = array();
- if(isset($month_empty)) {
- $month_names[''] = $month_empty;
- $month_values[''] = '';
- }
- for ($i = 1; $i <= 12; $i++) {
- $month_names[$i] = strftime($month_format, mktime(0, 0, 0, $i, 1, 2000));
- $month_values[$i] = strftime($month_value_format, mktime(0, 0, 0, $i, 1, 2000));
+ // generate year <select> or <input>
+ if ($display_years) {
+ $_html_years = '';
+ $_extra = '';
+ $_name = $field_array ? ($field_array . '[' . $prefix . 'Year]') : ($prefix . 'Year');
+ if ($all_extra) {
+ $_extra .= ' ' . $all_extra;
+ }
+ if ($year_extra) {
+ $_extra .= ' ' . $year_extra;
}
-
- $month_result .= '<select name=';
- if (null !== $field_array){
- $month_result .= '"' . $field_array . '[' . $prefix . 'Month]"';
+
+ if ($year_as_text) {
+ $_html_years = '<input type="text" name="' . $_name . '" value="' . $_year . '" size="4" maxlength="4"' . $_extra . $extra_attrs . ' />';
} else {
- $month_result .= '"' . $prefix . 'Month"';
- }
- if (null !== $month_size){
- $month_result .= ' size="' . $month_size . '"';
- }
- if (null !== $month_extra){
- $month_result .= ' ' . $month_extra;
- }
- if (null !== $all_extra){
- $month_result .= ' ' . $all_extra;
+ $_html_years = '<select name="' . $_name . '"';
+ if ($year_id !== null || $all_id !== null) {
+ $_html_years .= ' id="' . smarty_function_escape_special_chars(
+ $year_id !== null ? ( $year_id ? $year_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name )
+ ) . '"';
+ }
+ if ($year_size) {
+ $_html_years .= ' size="' . $year_size . '"';
+ }
+ $_html_years .= $_extra . $extra_attrs . '>' . $option_separator;
+
+ if (isset($year_empty) || isset($all_empty)) {
+ $_html_years .= '<option value="">' . ( isset($year_empty) ? $year_empty : $all_empty ) . '</option>' . $option_separator;
+ }
+
+ $op = $start_year > $end_year ? -1 : 1;
+ for ($i=$start_year; $op > 0 ? $i <= $end_year : $i >= $end_year; $i += $op) {
+ $_html_years .= '<option value="' . $i . '"'
+ . ($_year == $i ? ' selected="selected"' : '')
+ . '>' . $i . '</option>' . $option_separator;
+ }
+
+ $_html_years .= '</select>';
}
- $month_result .= $extra_attrs . '>'."\n";
-
- $month_result .= smarty_function_html_options(array('output' => $month_names,
- 'values' => $month_values,
- 'selected' => (int)$time[1] ? strftime($month_value_format, mktime(0, 0, 0, (int)$time[1], 1, 2000)) : '',
- 'print_result' => false),
- $smarty);
- $month_result .= '</select>';
}
-
- if ($display_days) {
- $field_separator_count++;
- $days = array();
- if (isset($day_empty)) {
- $days[''] = $day_empty;
- $day_values[''] = '';
+
+ // generate month <select> or <input>
+ if ($display_months) {
+ $_html_month = '';
+ $_extra = '';
+ $_name = $field_array ? ($field_array . '[' . $prefix . 'Month]') : ($prefix . 'Month');
+ if ($all_extra) {
+ $_extra .= ' ' . $all_extra;
+ }
+ if ($month_extra) {
+ $_extra .= ' ' . $month_extra;
}
- for ($i = 1; $i <= 31; $i++) {
- $days[] = sprintf($day_format, $i);
- $day_values[] = sprintf($day_value_format, $i);
+
+ $_html_months = '<select name="' . $_name . '"';
+ if ($month_id !== null || $all_id !== null) {
+ $_html_months .= ' id="' . smarty_function_escape_special_chars(
+ $month_id !== null ? ( $month_id ? $month_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name )
+ ) . '"';
}
-
- $day_result .= '<select name=';
- if (null !== $field_array){
- $day_result .= '"' . $field_array . '[' . $prefix . 'Day]"';
- } else {
- $day_result .= '"' . $prefix . 'Day"';
+ if ($month_size) {
+ $_html_months .= ' size="' . $month_size . '"';
+ }
+ $_html_months .= $_extra . $extra_attrs . '>' . $option_separator;
+
+ if (isset($month_empty) || isset($all_empty)) {
+ $_html_months .= '<option value="">' . ( isset($month_empty) ? $month_empty : $all_empty ) . '</option>' . $option_separator;
}
- if (null !== $day_size){
- $day_result .= ' size="' . $day_size . '"';
+
+ for ($i = 1; $i <= 12; $i++) {
+ $_val = sprintf('%02d', $i);
+ $_text = isset($month_names) ? smarty_function_escape_special_chars($month_names[$i]) : ($month_format == "%m" ? $_val : strftime($month_format, $_month_timestamps[$i]));
+ $_value = $month_value_format == "%m" ? $_val : strftime($month_value_format, $_month_timestamps[$i]);
+ $_html_months .= '<option value="' . $_value . '"'
+ . ($_val == $_month ? ' selected="selected"' : '')
+ . '>' . $_text . '</option>' . $option_separator;
}
- if (null !== $all_extra){
- $day_result .= ' ' . $all_extra;
+
+ $_html_months .= '</select>';
+ }
+
+ // generate day <select> or <input>
+ if ($display_days) {
+ $_html_day = '';
+ $_extra = '';
+ $_name = $field_array ? ($field_array . '[' . $prefix . 'Day]') : ($prefix . 'Day');
+ if ($all_extra) {
+ $_extra .= ' ' . $all_extra;
+ }
+ if ($day_extra) {
+ $_extra .= ' ' . $day_extra;
}
- if (null !== $day_extra){
- $day_result .= ' ' . $day_extra;
+
+ $_html_days = '<select name="' . $_name . '"';
+ if ($day_id !== null || $all_id !== null) {
+ $_html_days .= ' id="' . smarty_function_escape_special_chars(
+ $day_id !== null ? ( $day_id ? $day_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name )
+ ) . '"';
}
- $day_result .= $extra_attrs . '>'."\n";
- $day_result .= smarty_function_html_options(array('output' => $days,
- 'values' => $day_values,
- 'selected' => $time[2],
- 'print_result' => false),
- $smarty);
- $day_result .= '</select>';
- }
-
- if ($display_years) {
- $field_separator_count++;
- if (null !== $field_array){
- $year_name = $field_array . '[' . $prefix . 'Year]';
- } else {
- $year_name = $prefix . 'Year';
+ if ($day_size) {
+ $_html_days .= ' size="' . $day_size . '"';
+ }
+ $_html_days .= $_extra . $extra_attrs . '>' . $option_separator;
+
+ if (isset($day_empty) || isset($all_empty)) {
+ $_html_days .= '<option value="">' . ( isset($day_empty) ? $day_empty : $all_empty ) . '</option>' . $option_separator;
}
- if ($year_as_text) {
- $year_result .= '<input type="text" name="' . $year_name . '" value="' . $time[0] . '" size="4" maxlength="4"';
- if (null !== $all_extra){
- $year_result .= ' ' . $all_extra;
- }
- if (null !== $year_extra){
- $year_result .= ' ' . $year_extra;
- }
- $year_result .= '>';
- } else {
- $years = range((int)$start_year, (int)$end_year);
- if ($reverse_years) {
- rsort($years, SORT_NUMERIC);
- } else {
- sort($years, SORT_NUMERIC);
- }
- $yearvals = $years;
- if(isset($year_empty)) {
- array_unshift($years, $year_empty);
- array_unshift($yearvals, '');
- }
- $year_result .= '<select name="' . $year_name . '"';
- if (null !== $year_size){
- $year_result .= ' size="' . $year_size . '"';
- }
- if (null !== $all_extra){
- $year_result .= ' ' . $all_extra;
- }
- if (null !== $year_extra){
- $year_result .= ' ' . $year_extra;
- }
- $year_result .= $extra_attrs . '>'."\n";
- $year_result .= smarty_function_html_options(array('output' => $years,
- 'values' => $yearvals,
- 'selected' => $time[0],
- 'print_result' => false),
- $smarty);
- $year_result .= '</select>';
+
+ for ($i = 1; $i <= 31; $i++) {
+ $_val = sprintf('%02d', $i);
+ $_text = $day_format == '%02d' ? $_val : sprintf($day_format, $i);
+ $_value = $day_value_format == '%02d' ? $_val : sprintf($day_value_format, $i);
+ $_html_days .= '<option value="' . $_value . '"'
+ . ($_val == $_day ? ' selected="selected"' : '')
+ . '>' . $_text . '</option>' . $option_separator;
}
+
+ $_html_days .= '</select>';
}
- // Loop thru the field_order field
- for ($i = 0; $i <= 2; $i++){
- $c = substr($field_order, $i, 1);
- switch ($c){
- case 'D':
- $html_result .= $day_result;
- break;
-
- case 'M':
- $html_result .= $month_result;
- break;
-
+ // order the fields for output
+ $_html = '';
+ for ($i=0; $i <= 2; $i++) {
+ switch ($field_order[$i]) {
case 'Y':
- $html_result .= $year_result;
- break;
- }
- // Add the field seperator
- if($i < $field_separator_count) {
- $html_result .= $field_separator;
+ case 'y':
+ if (isset($_html_years)) {
+ if ($_html) {
+ $_html .= $field_separator;
+ }
+ $_html .= $_html_years;
+ }
+ break;
+
+ case 'm':
+ case 'M':
+ if (isset($_html_months)) {
+ if ($_html) {
+ $_html .= $field_separator;
+ }
+ $_html .= $_html_months;
+ }
+ break;
+
+ case 'd':
+ case 'D':
+ if (isset($_html_days)) {
+ if ($_html) {
+ $_html .= $field_separator;
+ }
+ $_html .= $_html_days;
+ }
+ break;
}
}
-
- return $html_result;
+ return $_html;
}
-/* vim: set expandtab: */
-
-?>
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/function.html_select_time.php b/include/smarty/libs/plugins/function.html_select_time.php
index 2e5be7efe..9fb8038e4 100644
--- a/include/smarty/libs/plugins/function.html_select_time.php
+++ b/include/smarty/libs/plugins/function.html_select_time.php
@@ -1,10 +1,19 @@
<?php
/**
* Smarty plugin
+ *
* @package Smarty
- * @subpackage plugins
+ * @subpackage PluginsFunction
*/
+/**
+ * @ignore
+ */
+require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php');
+/**
+ * @ignore
+ */
+require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php');
/**
* Smarty {html_select_time} function plugin
@@ -12,50 +21,102 @@
* Type: function<br>
* Name: html_select_time<br>
* Purpose: Prints the dropdowns for time selection
- * @link http://smarty.php.net/manual/en/language.function.html.select.time.php {html_select_time}
+ *
+ * @link http://www.smarty.net/manual/en/language.function.html.select.time.php {html_select_time}
* (Smarty online manual)
* @author Roberto Berto <roberto@berto.net>
- * @credits Monte Ohrt <monte AT ohrt DOT com>
- * @param array
- * @param Smarty
+ * @author Monte Ohrt <monte AT ohrt DOT com>
+ * @param array $params parameters
+ * @param Smarty_Internal_Template $template template object
* @return string
* @uses smarty_make_timestamp()
*/
-function smarty_function_html_select_time($params, &$smarty)
+function smarty_function_html_select_time($params, $template)
{
- require_once $smarty->_get_plugin_filepath('shared','make_timestamp');
- require_once $smarty->_get_plugin_filepath('function','html_options');
- /* Default values. */
- $prefix = "Time_";
- $time = time();
- $display_hours = true;
- $display_minutes = true;
- $display_seconds = true;
- $display_meridian = true;
- $use_24_hours = true;
- $minute_interval = 1;
- $second_interval = 1;
- /* Should the select boxes be part of an array when returned from PHP?
- e.g. setting it to "birthday", would create "birthday[Hour]",
- "birthday[Minute]", "birthday[Seconds]" & "birthday[Meridian]".
- Can be combined with prefix. */
- $field_array = null;
- $all_extra = null;
- $hour_extra = null;
- $minute_extra = null;
- $second_extra = null;
- $meridian_extra = null;
-
- foreach ($params as $_key=>$_value) {
+ $prefix = "Time_";
+ $field_array = null;
+ $field_separator = "\n";
+ $option_separator = "\n";
+ $time = null;
+
+ $display_hours = true;
+ $display_minutes = true;
+ $display_seconds = true;
+ $display_meridian = true;
+
+ $hour_format = '%02d';
+ $hour_value_format = '%02d';
+ $minute_format = '%02d';
+ $minute_value_format = '%02d';
+ $second_format = '%02d';
+ $second_value_format = '%02d';
+
+ $hour_size = null;
+ $minute_size = null;
+ $second_size = null;
+ $meridian_size = null;
+
+ $all_empty = null;
+ $hour_empty = null;
+ $minute_empty = null;
+ $second_empty = null;
+ $meridian_empty = null;
+
+ $all_id = null;
+ $hour_id = null;
+ $minute_id = null;
+ $second_id = null;
+ $meridian_id = null;
+
+ $use_24_hours = true;
+ $minute_interval = 1;
+ $second_interval = 1;
+
+ $extra_attrs = '';
+ $all_extra = null;
+ $hour_extra = null;
+ $minute_extra = null;
+ $second_extra = null;
+ $meridian_extra = null;
+
+ foreach ($params as $_key => $_value) {
switch ($_key) {
- case 'prefix':
case 'time':
+ if (!is_array($_value) && $_value !== null) {
+ $time = smarty_make_timestamp($_value);
+ }
+ break;
+
+ case 'prefix':
case 'field_array':
+
+ case 'field_separator':
+ case 'option_separator':
+
case 'all_extra':
case 'hour_extra':
case 'minute_extra':
case 'second_extra':
case 'meridian_extra':
+
+ case 'all_empty':
+ case 'hour_empty':
+ case 'minute_empty':
+ case 'second_empty':
+ case 'meridian_empty':
+
+ case 'all_id':
+ case 'hour_id':
+ case 'minute_id':
+ case 'second_id':
+ case 'meridian_id':
+
+ case 'hour_format':
+ case 'hour_value_format':
+ case 'minute_format':
+ case 'minute_value_format':
+ case 'second_format':
+ case 'second_value_format':
$$_key = (string)$_value;
break;
@@ -69,126 +130,237 @@ function smarty_function_html_select_time($params, &$smarty)
case 'minute_interval':
case 'second_interval':
+
+ case 'hour_size':
+ case 'minute_size':
+ case 'second_size':
+ case 'meridian_size':
$$_key = (int)$_value;
break;
default:
- $smarty->trigger_error("[html_select_time] unknown parameter $_key", E_USER_WARNING);
+ if (!is_array($_value)) {
+ $extra_attrs .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_value) . '"';
+ } else {
+ trigger_error("html_select_date: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
+ }
+ break;
}
}
- $time = smarty_make_timestamp($time);
-
- $html_result = '';
+ if (isset($params['time']) && is_array($params['time'])) {
+ if (isset($params['time'][$prefix . 'Hour'])) {
+ // $_REQUEST[$field_array] given
+ foreach (array('H' => 'Hour', 'i' => 'Minute', 's' => 'Second') as $_elementKey => $_elementName) {
+ $_variableName = '_' . strtolower($_elementName);
+ $$_variableName = isset($params['time'][$prefix . $_elementName])
+ ? $params['time'][$prefix . $_elementName]
+ : date($_elementKey);
+ }
+ $_meridian = isset($params['time'][$prefix . 'Meridian'])
+ ? (' ' . $params['time'][$prefix . 'Meridian'])
+ : '';
+ $time = strtotime( $_hour . ':' . $_minute . ':' . $_second . $_meridian );
+ list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time));
+ } elseif (isset($params['time'][$field_array][$prefix . 'Hour'])) {
+ // $_REQUEST given
+ foreach (array('H' => 'Hour', 'i' => 'Minute', 's' => 'Second') as $_elementKey => $_elementName) {
+ $_variableName = '_' . strtolower($_elementName);
+ $$_variableName = isset($params['time'][$field_array][$prefix . $_elementName])
+ ? $params['time'][$field_array][$prefix . $_elementName]
+ : date($_elementKey);
+ }
+ $_meridian = isset($params['time'][$field_array][$prefix . 'Meridian'])
+ ? (' ' . $params['time'][$field_array][$prefix . 'Meridian'])
+ : '';
+ $time = strtotime( $_hour . ':' . $_minute . ':' . $_second . $_meridian );
+ list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time));
+ } else {
+ // no date found, use NOW
+ list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d'));
+ }
+ } elseif ($time === null) {
+ if (array_key_exists('time', $params)) {
+ $_hour = $_minute = $_second = $time = null;
+ } else {
+ list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s'));
+ }
+ } else {
+ list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time));
+ }
+ // generate hour <select>
if ($display_hours) {
- $hours = $use_24_hours ? range(0, 23) : range(1, 12);
- $hour_fmt = $use_24_hours ? '%H' : '%I';
- for ($i = 0, $for_max = count($hours); $i < $for_max; $i++)
- $hours[$i] = sprintf('%02d', $hours[$i]);
- $html_result .= '<select name=';
- if (null !== $field_array) {
- $html_result .= '"' . $field_array . '[' . $prefix . 'Hour]"';
- } else {
- $html_result .= '"' . $prefix . 'Hour"';
+ $_html_hours = '';
+ $_extra = '';
+ $_name = $field_array ? ($field_array . '[' . $prefix . 'Hour]') : ($prefix . 'Hour');
+ if ($all_extra) {
+ $_extra .= ' ' . $all_extra;
}
- if (null !== $hour_extra){
- $html_result .= ' ' . $hour_extra;
+ if ($hour_extra) {
+ $_extra .= ' ' . $hour_extra;
+ }
+
+ $_html_hours = '<select name="' . $_name . '"';
+ if ($hour_id !== null || $all_id !== null) {
+ $_html_hours .= ' id="' . smarty_function_escape_special_chars(
+ $hour_id !== null ? ( $hour_id ? $hour_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name )
+ ) . '"';
}
- if (null !== $all_extra){
- $html_result .= ' ' . $all_extra;
+ if ($hour_size) {
+ $_html_hours .= ' size="' . $hour_size . '"';
+ }
+ $_html_hours .= $_extra . $extra_attrs . '>' . $option_separator;
+
+ if (isset($hour_empty) || isset($all_empty)) {
+ $_html_hours .= '<option value="">' . ( isset($hour_empty) ? $hour_empty : $all_empty ) . '</option>' . $option_separator;
+ }
+
+ $start = $use_24_hours ? 0 : 1;
+ $end = $use_24_hours ? 23 : 12;
+ for ($i=$start; $i <= $end; $i++) {
+ $_val = sprintf('%02d', $i);
+ $_text = $hour_format == '%02d' ? $_val : sprintf($hour_format, $i);
+ $_value = $hour_value_format == '%02d' ? $_val : sprintf($hour_value_format, $i);
+
+ if (!$use_24_hours) {
+ $_hour12 = $_hour == 0
+ ? 12
+ : ($_hour <= 12 ? $_hour : $_hour -12);
+ }
+
+ $selected = $_hour !== null ? ($use_24_hours ? $_hour == $_val : $_hour12 == $_val) : null;
+ $_html_hours .= '<option value="' . $_value . '"'
+ . ($selected ? ' selected="selected"' : '')
+ . '>' . $_text . '</option>' . $option_separator;
}
- $html_result .= '>'."\n";
- $html_result .= smarty_function_html_options(array('output' => $hours,
- 'values' => $hours,
- 'selected' => strftime($hour_fmt, $time),
- 'print_result' => false),
- $smarty);
- $html_result .= "</select>\n";
+
+ $_html_hours .= '</select>';
}
+ // generate minute <select>
if ($display_minutes) {
- $all_minutes = range(0, 59);
- for ($i = 0, $for_max = count($all_minutes); $i < $for_max; $i+= $minute_interval)
- $minutes[] = sprintf('%02d', $all_minutes[$i]);
- $selected = intval(floor(strftime('%M', $time) / $minute_interval) * $minute_interval);
- $html_result .= '<select name=';
- if (null !== $field_array) {
- $html_result .= '"' . $field_array . '[' . $prefix . 'Minute]"';
- } else {
- $html_result .= '"' . $prefix . 'Minute"';
- }
- if (null !== $minute_extra){
- $html_result .= ' ' . $minute_extra;
- }
- if (null !== $all_extra){
- $html_result .= ' ' . $all_extra;
- }
- $html_result .= '>'."\n";
-
- $html_result .= smarty_function_html_options(array('output' => $minutes,
- 'values' => $minutes,
- 'selected' => $selected,
- 'print_result' => false),
- $smarty);
- $html_result .= "</select>\n";
+ $_html_minutes = '';
+ $_extra = '';
+ $_name = $field_array ? ($field_array . '[' . $prefix . 'Minute]') : ($prefix . 'Minute');
+ if ($all_extra) {
+ $_extra .= ' ' . $all_extra;
+ }
+ if ($minute_extra) {
+ $_extra .= ' ' . $minute_extra;
+ }
+
+ $_html_minutes = '<select name="' . $_name . '"';
+ if ($minute_id !== null || $all_id !== null) {
+ $_html_minutes .= ' id="' . smarty_function_escape_special_chars(
+ $minute_id !== null ? ( $minute_id ? $minute_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name )
+ ) . '"';
+ }
+ if ($minute_size) {
+ $_html_minutes .= ' size="' . $minute_size . '"';
+ }
+ $_html_minutes .= $_extra . $extra_attrs . '>' . $option_separator;
+
+ if (isset($minute_empty) || isset($all_empty)) {
+ $_html_minutes .= '<option value="">' . ( isset($minute_empty) ? $minute_empty : $all_empty ) . '</option>' . $option_separator;
+ }
+
+ $selected = $_minute !== null ? ($_minute - $_minute % $minute_interval) : null;
+ for ($i=0; $i <= 59; $i += $minute_interval) {
+ $_val = sprintf('%02d', $i);
+ $_text = $minute_format == '%02d' ? $_val : sprintf($minute_format, $i);
+ $_value = $minute_value_format == '%02d' ? $_val : sprintf($minute_value_format, $i);
+ $_html_minutes .= '<option value="' . $_value . '"'
+ . ($selected === $i ? ' selected="selected"' : '')
+ . '>' . $_text . '</option>' . $option_separator;
+ }
+
+ $_html_minutes .= '</select>';
}
+ // generate second <select>
if ($display_seconds) {
- $all_seconds = range(0, 59);
- for ($i = 0, $for_max = count($all_seconds); $i < $for_max; $i+= $second_interval)
- $seconds[] = sprintf('%02d', $all_seconds[$i]);
- $selected = intval(floor(strftime('%S', $time) / $second_interval) * $second_interval);
- $html_result .= '<select name=';
- if (null !== $field_array) {
- $html_result .= '"' . $field_array . '[' . $prefix . 'Second]"';
- } else {
- $html_result .= '"' . $prefix . 'Second"';
- }
-
- if (null !== $second_extra){
- $html_result .= ' ' . $second_extra;
- }
- if (null !== $all_extra){
- $html_result .= ' ' . $all_extra;
- }
- $html_result .= '>'."\n";
-
- $html_result .= smarty_function_html_options(array('output' => $seconds,
- 'values' => $seconds,
- 'selected' => $selected,
- 'print_result' => false),
- $smarty);
- $html_result .= "</select>\n";
+ $_html_seconds = '';
+ $_extra = '';
+ $_name = $field_array ? ($field_array . '[' . $prefix . 'Second]') : ($prefix . 'Second');
+ if ($all_extra) {
+ $_extra .= ' ' . $all_extra;
+ }
+ if ($second_extra) {
+ $_extra .= ' ' . $second_extra;
+ }
+
+ $_html_seconds = '<select name="' . $_name . '"';
+ if ($second_id !== null || $all_id !== null) {
+ $_html_seconds .= ' id="' . smarty_function_escape_special_chars(
+ $second_id !== null ? ( $second_id ? $second_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name )
+ ) . '"';
+ }
+ if ($second_size) {
+ $_html_seconds .= ' size="' . $second_size . '"';
+ }
+ $_html_seconds .= $_extra . $extra_attrs . '>' . $option_separator;
+
+ if (isset($second_empty) || isset($all_empty)) {
+ $_html_seconds .= '<option value="">' . ( isset($second_empty) ? $second_empty : $all_empty ) . '</option>' . $option_separator;
+ }
+
+ $selected = $_second !== null ? ($_second - $_second % $second_interval) : null;
+ for ($i=0; $i <= 59; $i += $second_interval) {
+ $_val = sprintf('%02d', $i);
+ $_text = $second_format == '%02d' ? $_val : sprintf($second_format, $i);
+ $_value = $second_value_format == '%02d' ? $_val : sprintf($second_value_format, $i);
+ $_html_seconds .= '<option value="' . $_value . '"'
+ . ($selected === $i ? ' selected="selected"' : '')
+ . '>' . $_text . '</option>' . $option_separator;
+ }
+
+ $_html_seconds .= '</select>';
}
+ // generate meridian <select>
if ($display_meridian && !$use_24_hours) {
- $html_result .= '<select name=';
- if (null !== $field_array) {
- $html_result .= '"' . $field_array . '[' . $prefix . 'Meridian]"';
- } else {
- $html_result .= '"' . $prefix . 'Meridian"';
- }
-
- if (null !== $meridian_extra){
- $html_result .= ' ' . $meridian_extra;
- }
- if (null !== $all_extra){
- $html_result .= ' ' . $all_extra;
- }
- $html_result .= '>'."\n";
-
- $html_result .= smarty_function_html_options(array('output' => array('AM', 'PM'),
- 'values' => array('am', 'pm'),
- 'selected' => strtolower(strftime('%p', $time)),
- 'print_result' => false),
- $smarty);
- $html_result .= "</select>\n";
+ $_html_meridian = '';
+ $_extra = '';
+ $_name = $field_array ? ($field_array . '[' . $prefix . 'Meridian]') : ($prefix . 'Meridian');
+ if ($all_extra) {
+ $_extra .= ' ' . $all_extra;
+ }
+ if ($meridian_extra) {
+ $_extra .= ' ' . $meridian_extra;
+ }
+
+ $_html_meridian = '<select name="' . $_name . '"';
+ if ($meridian_id !== null || $all_id !== null) {
+ $_html_meridian .= ' id="' . smarty_function_escape_special_chars(
+ $meridian_id !== null ? ( $meridian_id ? $meridian_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name )
+ ) . '"';
+ }
+ if ($meridian_size) {
+ $_html_meridian .= ' size="' . $meridian_size . '"';
+ }
+ $_html_meridian .= $_extra . $extra_attrs . '>' . $option_separator;
+
+ if (isset($meridian_empty) || isset($all_empty)) {
+ $_html_meridian .= '<option value="">' . ( isset($meridian_empty) ? $meridian_empty : $all_empty ) . '</option>' . $option_separator;
+ }
+
+ $_html_meridian .= '<option value="am"'. ($_hour < 12 ? ' selected="selected"' : '') .'>AM</option>' . $option_separator
+ . '<option value="pm"'. ($_hour < 12 ? '' : ' selected="selected"') .'>PM</option>' . $option_separator
+ . '</select>';
}
- return $html_result;
-}
+ $_html = '';
+ foreach (array('_html_hours', '_html_minutes', '_html_seconds', '_html_meridian') as $k) {
+ if (isset($$k)) {
+ if ($_html) {
+ $_html .= $field_separator;
+ }
+ $_html .= $$k;
+ }
+ }
-/* vim: set expandtab: */
+ return $_html;
+}
-?>
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/function.html_table.php b/include/smarty/libs/plugins/function.html_table.php
index 32aeba83c..6b9cb9d12 100644
--- a/include/smarty/libs/plugins/function.html_table.php
+++ b/include/smarty/libs/plugins/function.html_table.php
@@ -1,11 +1,11 @@
<?php
/**
* Smarty plugin
+ *
* @package Smarty
- * @subpackage plugins
+ * @subpackage PluginsFunction
*/
-
/**
* Smarty {html_table} function plugin
*
@@ -13,40 +13,41 @@
* Name: html_table<br>
* Date: Feb 17, 2003<br>
* Purpose: make an html table from an array of data<br>
- * Input:<br>
- * - loop = array to loop through
- * - cols = number of columns, comma separated list of column names
- * or array of column names
- * - rows = number of rows
- * - table_attr = table attributes
- * - th_attr = table heading attributes (arrays are cycled)
- * - tr_attr = table row attributes (arrays are cycled)
- * - td_attr = table cell attributes (arrays are cycled)
- * - trailpad = value to pad trailing cells with
- * - caption = text for caption element
- * - vdir = vertical direction (default: "down", means top-to-bottom)
- * - hdir = horizontal direction (default: "right", means left-to-right)
- * - inner = inner loop (default "cols": print $loop line by line,
- * $loop will be printed column by column otherwise)
- *
- *
+ * Params:
+ * <pre>
+ * - loop - array to loop through
+ * - cols - number of columns, comma separated list of column names
+ * or array of column names
+ * - rows - number of rows
+ * - table_attr - table attributes
+ * - th_attr - table heading attributes (arrays are cycled)
+ * - tr_attr - table row attributes (arrays are cycled)
+ * - td_attr - table cell attributes (arrays are cycled)
+ * - trailpad - value to pad trailing cells with
+ * - caption - text for caption element
+ * - vdir - vertical direction (default: "down", means top-to-bottom)
+ * - hdir - horizontal direction (default: "right", means left-to-right)
+ * - inner - inner loop (default "cols": print $loop line by line,
+ * $loop will be printed column by column otherwise)
+ * </pre>
* Examples:
* <pre>
* {table loop=$data}
* {table loop=$data cols=4 tr_attr='"bgcolor=red"'}
* {table loop=$data cols="first,second,third" tr_attr=$colors}
* </pre>
- * @author Monte Ohrt <monte at ohrt dot com>
+ *
+ * @author Monte Ohrt <monte at ohrt dot com>
* @author credit to Messju Mohr <messju at lammfellpuschen dot de>
* @author credit to boots <boots dot smarty at yahoo dot com>
- * @version 1.1
- * @link http://smarty.php.net/manual/en/language.function.html.table.php {html_table}
+ * @version 1.1
+ * @link http://www.smarty.net/manual/en/language.function.html.table.php {html_table}
* (Smarty online manual)
- * @param array
- * @param Smarty
+ * @param array $params parameters
+ * @param Smarty_Internal_Template $template template object
* @return string
*/
-function smarty_function_html_table($params, &$smarty)
+function smarty_function_html_table($params, $template)
{
$table_attr = 'border="1"';
$tr_attr = '';
@@ -59,13 +60,14 @@ function smarty_function_html_table($params, &$smarty)
$hdir = 'right';
$inner = 'cols';
$caption = '';
+ $loop = null;
if (!isset($params['loop'])) {
- $smarty->trigger_error("html_table: missing 'loop' parameter");
+ trigger_error("html_table: missing 'loop' parameter",E_USER_WARNING);
return;
}
- foreach ($params as $_key=>$_value) {
+ foreach ($params as $_key => $_value) {
switch ($_key) {
case 'loop':
$$_key = (array)$_value;
@@ -109,11 +111,11 @@ function smarty_function_html_table($params, &$smarty)
$loop_count = count($loop);
if (empty($params['rows'])) {
/* no rows specified */
- $rows = ceil($loop_count/$cols_count);
+ $rows = ceil($loop_count / $cols_count);
} elseif (empty($params['cols'])) {
if (!empty($params['rows'])) {
/* no cols specified, but rows */
- $cols_count = ceil($loop_count/$rows);
+ $cols_count = ceil($loop_count / $rows);
}
}
@@ -127,7 +129,7 @@ function smarty_function_html_table($params, &$smarty)
$cols = ($hdir == 'right') ? $cols : array_reverse($cols);
$output .= "<thead><tr>\n";
- for ($r=0; $r<$cols_count; $r++) {
+ for ($r = 0; $r < $cols_count; $r++) {
$output .= '<th' . smarty_function_html_table_cycle('th', $th_attr, $r) . '>';
$output .= $cols[$r];
$output .= "</th>\n";
@@ -136,18 +138,18 @@ function smarty_function_html_table($params, &$smarty)
}
$output .= "<tbody>\n";
- for ($r=0; $r<$rows; $r++) {
+ for ($r = 0; $r < $rows; $r++) {
$output .= "<tr" . smarty_function_html_table_cycle('tr', $tr_attr, $r) . ">\n";
- $rx = ($vdir == 'down') ? $r*$cols_count : ($rows-1-$r)*$cols_count;
+ $rx = ($vdir == 'down') ? $r * $cols_count : ($rows-1 - $r) * $cols_count;
- for ($c=0; $c<$cols_count; $c++) {
- $x = ($hdir == 'right') ? $rx+$c : $rx+$cols_count-1-$c;
- if ($inner!='cols') {
+ for ($c = 0; $c < $cols_count; $c++) {
+ $x = ($hdir == 'right') ? $rx + $c : $rx + $cols_count-1 - $c;
+ if ($inner != 'cols') {
/* shuffle x to loop over rows*/
- $x = floor($x/$cols_count) + ($x%$cols_count)*$rows;
+ $x = floor($x / $cols_count) + ($x % $cols_count) * $rows;
}
- if ($x<$loop_count) {
+ if ($x < $loop_count) {
$output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">" . $loop[$x] . "</td>\n";
} else {
$output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">$trailpad</td>\n";
@@ -157,21 +159,19 @@ function smarty_function_html_table($params, &$smarty)
}
$output .= "</tbody>\n";
$output .= "</table>\n";
-
+
return $output;
}
-function smarty_function_html_table_cycle($name, $var, $no) {
- if(!is_array($var)) {
+function smarty_function_html_table_cycle($name, $var, $no)
+{
+ if (!is_array($var)) {
$ret = $var;
} else {
$ret = $var[$no % count($var)];
}
-
- return ($ret) ? ' '.$ret : '';
-}
-
-/* vim: set expandtab: */
+ return ($ret) ? ' ' . $ret : '';
+}
-?>
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/function.mailto.php b/include/smarty/libs/plugins/function.mailto.php
index 20e9ed984..55d5c0602 100644
--- a/include/smarty/libs/plugins/function.mailto.php
+++ b/include/smarty/libs/plugins/function.mailto.php
@@ -1,34 +1,34 @@
<?php
/**
* Smarty plugin
+ *
* @package Smarty
- * @subpackage plugins
+ * @subpackage PluginsFunction
*/
-
/**
* Smarty {mailto} function plugin
*
* Type: function<br>
* Name: mailto<br>
* Date: May 21, 2002
- * Purpose: automate mailto address link creation, and optionally
- * encode them.<br>
- * Input:<br>
- * - address = e-mail address
- * - text = (optional) text to display, default is address
- * - encode = (optional) can be one of:
- * * none : no encoding (default)
- * * javascript : encode with javascript
- * * javascript_charcode : encode with javascript charcode
- * * hex : encode with hexidecimal (no javascript)
- * - cc = (optional) address(es) to carbon copy
- * - bcc = (optional) address(es) to blind carbon copy
- * - subject = (optional) e-mail subject
- * - newsgroups = (optional) newsgroup(s) to post to
- * - followupto = (optional) address(es) to follow up to
- * - extra = (optional) extra tags for the href link
- *
+ * Purpose: automate mailto address link creation, and optionally encode them.<br>
+ * Params:
+ * <pre>
+ * - address - (required) - e-mail address
+ * - text - (optional) - text to display, default is address
+ * - encode - (optional) - can be one of:
+ * * none : no encoding (default)
+ * * javascript : encode with javascript
+ * * javascript_charcode : encode with javascript charcode
+ * * hex : encode with hexidecimal (no javascript)
+ * - cc - (optional) - address(es) to carbon copy
+ * - bcc - (optional) - address(es) to blind carbon copy
+ * - subject - (optional) - e-mail subject
+ * - newsgroups - (optional) - newsgroup(s) to post to
+ * - followupto - (optional) - address(es) to follow up to
+ * - extra - (optional) - extra tags for the href link
+ * </pre>
* Examples:
* <pre>
* {mailto address="me@domain.com"}
@@ -38,45 +38,46 @@
* {mailto address="me@domain.com" cc="you@domain.com,they@domain.com"}
* {mailto address="me@domain.com" extra='class="mailto"'}
* </pre>
- * @link http://smarty.php.net/manual/en/language.function.mailto.php {mailto}
+ *
+ * @link http://www.smarty.net/manual/en/language.function.mailto.php {mailto}
* (Smarty online manual)
- * @version 1.2
- * @author Monte Ohrt <monte at ohrt dot com>
- * @author credits to Jason Sweat (added cc, bcc and subject functionality)
- * @param array
- * @param Smarty
- * @return string
+ * @version 1.2
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @author credits to Jason Sweat (added cc, bcc and subject functionality)
+ * @param array $params parameters
+ * @param Smarty_Internal_Template $template template object
+ * @return string
*/
-function smarty_function_mailto($params, &$smarty)
+function smarty_function_mailto($params, $template)
{
+ static $_allowed_encoding = array('javascript' => true, 'javascript_charcode' => true, 'hex' => true, 'none' => true);
$extra = '';
if (empty($params['address'])) {
- $smarty->trigger_error("mailto: missing 'address' parameter");
+ trigger_error("mailto: missing 'address' parameter",E_USER_WARNING);
return;
} else {
$address = $params['address'];
}
$text = $address;
-
// netscape and mozilla do not decode %40 (@) in BCC field (bug?)
// so, don't encode it.
$search = array('%40', '%2C');
- $replace = array('@', ',');
+ $replace = array('@', ',');
$mail_parms = array();
- foreach ($params as $var=>$value) {
+ foreach ($params as $var => $value) {
switch ($var) {
case 'cc':
case 'bcc':
case 'followupto':
if (!empty($value))
- $mail_parms[] = $var.'='.str_replace($search,$replace,rawurlencode($value));
+ $mail_parms[] = $var . '=' . str_replace($search, $replace, rawurlencode($value));
break;
-
+
case 'subject':
case 'newsgroups':
- $mail_parms[] = $var.'='.rawurlencode($value);
+ $mail_parms[] = $var . '=' . rawurlencode($value);
break;
case 'extra':
@@ -87,79 +88,65 @@ function smarty_function_mailto($params, &$smarty)
}
}
- $mail_parm_vals = '';
- for ($i=0; $i<count($mail_parms); $i++) {
- $mail_parm_vals .= (0==$i) ? '?' : '&';
- $mail_parm_vals .= $mail_parms[$i];
+ if ($mail_parms) {
+ $address .= '?' . join('&', $mail_parms);
}
- $address .= $mail_parm_vals;
-
+
$encode = (empty($params['encode'])) ? 'none' : $params['encode'];
- if (!in_array($encode,array('javascript','javascript_charcode','hex','none')) ) {
- $smarty->trigger_error("mailto: 'encode' parameter must be none, javascript or hex");
+ if (!isset($_allowed_encoding[$encode])) {
+ trigger_error("mailto: 'encode' parameter must be none, javascript, javascript_charcode or hex", E_USER_WARNING);
return;
}
-
- if ($encode == 'javascript' ) {
- $string = 'document.write(\'<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>\');';
+ // FIXME: (rodneyrehm) document.write() excues me what? 1998 has passed!
+ if ($encode == 'javascript') {
+ $string = 'document.write(\'<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>\');';
$js_encode = '';
- for ($x=0; $x < strlen($string); $x++) {
+ for ($x = 0, $_length = strlen($string); $x < $_length; $x++) {
$js_encode .= '%' . bin2hex($string[$x]);
}
- return '<script type="text/javascript">eval(unescape(\''.$js_encode.'\'))</script>';
-
- } elseif ($encode == 'javascript_charcode' ) {
- $string = '<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>';
+ return '<script type="text/javascript">eval(unescape(\'' . $js_encode . '\'))</script>';
+ } elseif ($encode == 'javascript_charcode') {
+ $string = '<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>';
- for($x = 0, $y = strlen($string); $x < $y; $x++ ) {
- $ord[] = ord($string[$x]);
+ for($x = 0, $y = strlen($string); $x < $y; $x++) {
+ $ord[] = ord($string[$x]);
}
- $_ret = "<script type=\"text/javascript\" language=\"javascript\">\n";
- $_ret .= "<!--\n";
- $_ret .= "{document.write(String.fromCharCode(";
- $_ret .= implode(',',$ord);
- $_ret .= "))";
- $_ret .= "}\n";
- $_ret .= "//-->\n";
- $_ret .= "</script>\n";
-
+ $_ret = "<script type=\"text/javascript\" language=\"javascript\">\n"
+ . "{document.write(String.fromCharCode("
+ . implode(',', $ord)
+ . "))"
+ . "}\n"
+ . "</script>\n";
+
return $_ret;
-
-
} elseif ($encode == 'hex') {
-
- preg_match('!^(.*)(\?.*)$!',$address,$match);
- if(!empty($match[2])) {
- $smarty->trigger_error("mailto: hex encoding does not work with extra attributes. Try javascript.");
+ preg_match('!^(.*)(\?.*)$!', $address, $match);
+ if (!empty($match[2])) {
+ trigger_error("mailto: hex encoding does not work with extra attributes. Try javascript.",E_USER_WARNING);
return;
}
$address_encode = '';
- for ($x=0; $x < strlen($address); $x++) {
- if(preg_match('!\w!',$address[$x])) {
+ for ($x = 0, $_length = strlen($address); $x < $_length; $x++) {
+ if (preg_match('!\w!' . Smarty::$_UTF8_MODIFIER, $address[$x])) {
$address_encode .= '%' . bin2hex($address[$x]);
} else {
$address_encode .= $address[$x];
}
}
$text_encode = '';
- for ($x=0; $x < strlen($text); $x++) {
- $text_encode .= '&#x' . bin2hex($text[$x]).';';
+ for ($x = 0, $_length = strlen($text); $x < $_length; $x++) {
+ $text_encode .= '&#x' . bin2hex($text[$x]) . ';';
}
$mailto = "&#109;&#97;&#105;&#108;&#116;&#111;&#58;";
- return '<a href="'.$mailto.$address_encode.'" '.$extra.'>'.$text_encode.'</a>';
-
+ return '<a href="' . $mailto . $address_encode . '" ' . $extra . '>' . $text_encode . '</a>';
} else {
// no encoding
- return '<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>';
-
+ return '<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>';
}
-
}
-/* vim: set expandtab: */
-
-?>
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/function.math.php b/include/smarty/libs/plugins/function.math.php
index bb78dac22..f4d3f05ee 100644
--- a/include/smarty/libs/plugins/function.math.php
+++ b/include/smarty/libs/plugins/function.math.php
@@ -1,49 +1,53 @@
<?php
/**
* Smarty plugin
+ *
+ * This plugin is only for Smarty2 BC
* @package Smarty
- * @subpackage plugins
+ * @subpackage PluginsFunction
*/
-
/**
* Smarty {math} function plugin
*
* Type: function<br>
* Name: math<br>
- * Purpose: handle math computations in template<br>
- * @link http://smarty.php.net/manual/en/language.function.math.php {math}
+ * Purpose: handle math computations in template
+ *
+ * @link http://www.smarty.net/manual/en/language.function.math.php {math}
* (Smarty online manual)
* @author Monte Ohrt <monte at ohrt dot com>
- * @param array
- * @param Smarty
- * @return string
+ * @param array $params parameters
+ * @param Smarty_Internal_Template $template template object
+ * @return string|null
*/
-function smarty_function_math($params, &$smarty)
+function smarty_function_math($params, $template)
{
+ static $_allowed_funcs = array(
+ 'int' => true, 'abs' => true, 'ceil' => true, 'cos' => true, 'exp' => true, 'floor' => true,
+ 'log' => true, 'log10' => true, 'max' => true, 'min' => true, 'pi' => true, 'pow' => true,
+ 'rand' => true, 'round' => true, 'sin' => true, 'sqrt' => true, 'srand' => true ,'tan' => true
+ );
// be sure equation parameter is present
if (empty($params['equation'])) {
- $smarty->trigger_error("math: missing equation parameter");
+ trigger_error("math: missing equation parameter",E_USER_WARNING);
return;
}
- // strip out backticks, not necessary for math
- $equation = str_replace('`','',$params['equation']);
+ $equation = $params['equation'];
// make sure parenthesis are balanced
if (substr_count($equation,"(") != substr_count($equation,")")) {
- $smarty->trigger_error("math: unbalanced parenthesis");
+ trigger_error("math: unbalanced parenthesis",E_USER_WARNING);
return;
}
// match all vars in equation, make sure all are passed
- preg_match_all("!(?:0x[a-fA-F0-9]+)|([a-zA-Z][a-zA-Z0-9_]+)!",$equation, $match);
- $allowed_funcs = array('int','abs','ceil','cos','exp','floor','log','log10',
- 'max','min','pi','pow','rand','round','sin','sqrt','srand','tan');
-
+ preg_match_all("!(?:0x[a-fA-F0-9]+)|([a-zA-Z][a-zA-Z0-9_]*)!",$equation, $match);
+
foreach($match[1] as $curr_var) {
- if ($curr_var && !in_array($curr_var, array_keys($params)) && !in_array($curr_var, $allowed_funcs)) {
- $smarty->trigger_error("math: function call $curr_var not allowed");
+ if ($curr_var && !isset($params[$curr_var]) && !isset($_allowed_funcs[$curr_var])) {
+ trigger_error("math: function call $curr_var not allowed",E_USER_WARNING);
return;
}
}
@@ -52,34 +56,32 @@ function smarty_function_math($params, &$smarty)
if ($key != "equation" && $key != "format" && $key != "assign") {
// make sure value is not empty
if (strlen($val)==0) {
- $smarty->trigger_error("math: parameter $key is empty");
+ trigger_error("math: parameter $key is empty",E_USER_WARNING);
return;
}
if (!is_numeric($val)) {
- $smarty->trigger_error("math: parameter $key: is not numeric");
+ trigger_error("math: parameter $key: is not numeric",E_USER_WARNING);
return;
}
$equation = preg_replace("/\b$key\b/", " \$params['$key'] ", $equation);
}
}
-
+ $smarty_math_result = null;
eval("\$smarty_math_result = ".$equation.";");
if (empty($params['format'])) {
if (empty($params['assign'])) {
return $smarty_math_result;
} else {
- $smarty->assign($params['assign'],$smarty_math_result);
+ $template->assign($params['assign'],$smarty_math_result);
}
} else {
if (empty($params['assign'])){
printf($params['format'],$smarty_math_result);
} else {
- $smarty->assign($params['assign'],sprintf($params['format'],$smarty_math_result));
+ $template->assign($params['assign'],sprintf($params['format'],$smarty_math_result));
}
}
}
-/* vim: set expandtab: */
-
-?>
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/function.popup.php b/include/smarty/libs/plugins/function.popup.php
deleted file mode 100644
index 3a76b785a..000000000
--- a/include/smarty/libs/plugins/function.popup.php
+++ /dev/null
@@ -1,119 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty {popup} function plugin
- *
- * Type: function<br>
- * Name: popup<br>
- * Purpose: make text pop up in windows via overlib
- * @link http://smarty.php.net/manual/en/language.function.popup.php {popup}
- * (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param array
- * @param Smarty
- * @return string
- */
-function smarty_function_popup($params, &$smarty)
-{
- $append = '';
- foreach ($params as $_key=>$_value) {
- switch ($_key) {
- case 'text':
- case 'trigger':
- case 'function':
- case 'inarray':
- $$_key = (string)$_value;
- if ($_key == 'function' || $_key == 'inarray')
- $append .= ',' . strtoupper($_key) . ",'$_value'";
- break;
-
- case 'caption':
- case 'closetext':
- case 'status':
- $append .= ',' . strtoupper($_key) . ",'" . str_replace("'","\'",$_value) . "'";
- break;
-
- case 'fgcolor':
- case 'bgcolor':
- case 'textcolor':
- case 'capcolor':
- case 'closecolor':
- case 'textfont':
- case 'captionfont':
- case 'closefont':
- case 'fgbackground':
- case 'bgbackground':
- case 'caparray':
- case 'capicon':
- case 'background':
- case 'frame':
- $append .= ',' . strtoupper($_key) . ",'$_value'";
- break;
-
- case 'textsize':
- case 'captionsize':
- case 'closesize':
- case 'width':
- case 'height':
- case 'border':
- case 'offsetx':
- case 'offsety':
- case 'snapx':
- case 'snapy':
- case 'fixx':
- case 'fixy':
- case 'padx':
- case 'pady':
- case 'timeout':
- case 'delay':
- $append .= ',' . strtoupper($_key) . ",$_value";
- break;
-
- case 'sticky':
- case 'left':
- case 'right':
- case 'center':
- case 'above':
- case 'below':
- case 'noclose':
- case 'autostatus':
- case 'autostatuscap':
- case 'fullhtml':
- case 'hauto':
- case 'vauto':
- case 'mouseoff':
- case 'followmouse':
- case 'closeclick':
- if ($_value) $append .= ',' . strtoupper($_key);
- break;
-
- default:
- $smarty->trigger_error("[popup] unknown parameter $_key", E_USER_WARNING);
- }
- }
-
- if (empty($text) && !isset($inarray) && empty($function)) {
- $smarty->trigger_error("overlib: attribute 'text' or 'inarray' or 'function' required");
- return false;
- }
-
- if (empty($trigger)) { $trigger = "onmouseover"; }
-
- $retval = $trigger . '="return overlib(\''.preg_replace(array("!'!","![\r\n]!"),array("\'",'\r'),$text).'\'';
- $retval .= $append . ');"';
- if ($trigger == 'onmouseover')
- $retval .= ' onmouseout="nd();"';
-
-
- return $retval;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/plugins/function.popup_init.php b/include/smarty/libs/plugins/function.popup_init.php
deleted file mode 100644
index 93cb45450..000000000
--- a/include/smarty/libs/plugins/function.popup_init.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty {popup_init} function plugin
- *
- * Type: function<br>
- * Name: popup_init<br>
- * Purpose: initialize overlib
- * @link http://smarty.php.net/manual/en/language.function.popup.init.php {popup_init}
- * (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param array
- * @param Smarty
- * @return string
- */
-function smarty_function_popup_init($params, &$smarty)
-{
- $zindex = 1000;
-
- if (!empty($params['zindex'])) {
- $zindex = $params['zindex'];
- }
-
- if (!empty($params['src'])) {
- return '<div id="overDiv" style="position:absolute; visibility:hidden; z-index:'.$zindex.';"></div>' . "\n"
- . '<script type="text/javascript" language="JavaScript" src="'.$params['src'].'"></script>' . "\n";
- } else {
- $smarty->trigger_error("popup_init: missing src parameter");
- }
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/plugins/modifier.capitalize.php b/include/smarty/libs/plugins/modifier.capitalize.php
index 4a611d9f0..a78e3632a 100644
--- a/include/smarty/libs/plugins/modifier.capitalize.php
+++ b/include/smarty/libs/plugins/modifier.capitalize.php
@@ -1,43 +1,65 @@
<?php
/**
* Smarty plugin
+ *
* @package Smarty
- * @subpackage plugins
+ * @subpackage PluginsModifier
*/
-
/**
* Smarty capitalize modifier plugin
- *
+ *
* Type: modifier<br>
* Name: capitalize<br>
* Purpose: capitalize words in the string
- * @link http://smarty.php.net/manual/en/language.modifiers.php#LANGUAGE.MODIFIER.CAPITALIZE
- * capitalize (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param string
- * @return string
+ *
+ * {@internal {$string|capitalize:true:true} is the fastest option for MBString enabled systems }}
+ *
+ * @param string $string string to capitalize
+ * @param boolean $uc_digits also capitalize "x123" to "X123"
+ * @param boolean $lc_rest capitalize first letters, lowercase all following letters "aAa" to "Aaa"
+ * @return string capitalized string
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @author Rodney Rehm
*/
-function smarty_modifier_capitalize($string, $uc_digits = false)
-{
- smarty_modifier_capitalize_ucfirst(null, $uc_digits);
- return preg_replace_callback('!\'?\b\w(\w|\')*\b!', 'smarty_modifier_capitalize_ucfirst', $string);
-}
-
-function smarty_modifier_capitalize_ucfirst($string, $uc_digits = null)
+function smarty_modifier_capitalize($string, $uc_digits = false, $lc_rest = false)
{
- static $_uc_digits = false;
-
- if(isset($uc_digits)) {
- $_uc_digits = $uc_digits;
- return;
+ if (Smarty::$_MBSTRING) {
+ if ($lc_rest) {
+ // uppercase (including hyphenated words)
+ $upper_string = mb_convert_case( $string, MB_CASE_TITLE, Smarty::$_CHARSET );
+ } else {
+ // uppercase word breaks
+ $upper_string = preg_replace("!(^|[^\p{L}'])([\p{Ll}])!eS" . Smarty::$_UTF8_MODIFIER, "stripslashes('\\1').mb_convert_case(stripslashes('\\2'),MB_CASE_UPPER, '" . addslashes(Smarty::$_CHARSET) . "')", $string);
+ }
+ // check uc_digits case
+ if (!$uc_digits) {
+ if (preg_match_all("!\b([\p{L}]*[\p{N}]+[\p{L}]*)\b!" . Smarty::$_UTF8_MODIFIER, $string, $matches, PREG_OFFSET_CAPTURE)) {
+ foreach($matches[1] as $match) {
+ $upper_string = substr_replace($upper_string, mb_strtolower($match[0], Smarty::$_CHARSET), $match[1], strlen($match[0]));
+ }
+ }
+ }
+ $upper_string = preg_replace("!((^|\s)['\"])(\w)!e" . Smarty::$_UTF8_MODIFIER, "stripslashes('\\1').mb_convert_case(stripslashes('\\3'),MB_CASE_UPPER, '" . addslashes(Smarty::$_CHARSET) . "')", $upper_string);
+ return $upper_string;
}
- if(substr($string[0],0,1) != "'" && !preg_match("!\d!",$string[0]) || $_uc_digits)
- return ucfirst($string[0]);
- else
- return $string[0];
-}
-
+ // lowercase first
+ if ($lc_rest) {
+ $string = strtolower($string);
+ }
+ // uppercase (including hyphenated words)
+ $upper_string = preg_replace("!(^|[^\p{L}'])([\p{Ll}])!eS" . Smarty::$_UTF8_MODIFIER, "stripslashes('\\1').ucfirst(stripslashes('\\2'))", $string);
+ // check uc_digits case
+ if (!$uc_digits) {
+ if (preg_match_all("!\b([\p{L}]*[\p{N}]+[\p{L}]*)\b!" . Smarty::$_UTF8_MODIFIER, $string, $matches, PREG_OFFSET_CAPTURE)) {
+ foreach($matches[1] as $match) {
+ $upper_string = substr_replace($upper_string, strtolower($match[0]), $match[1], strlen($match[0]));
+ }
+ }
+ }
+ $upper_string = preg_replace("!((^|\s)['\"])(\w)!e" . Smarty::$_UTF8_MODIFIER, "stripslashes('\\1').strtoupper(stripslashes('\\3'))", $upper_string);
+ return $upper_string;
+}
-?>
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/modifier.cat.php b/include/smarty/libs/plugins/modifier.cat.php
deleted file mode 100644
index 2e37940d4..000000000
--- a/include/smarty/libs/plugins/modifier.cat.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty cat modifier plugin
- *
- * Type: modifier<br>
- * Name: cat<br>
- * Date: Feb 24, 2003
- * Purpose: catenate a value to a variable
- * Input: string to catenate
- * Example: {$var|cat:"foo"}
- * @link http://smarty.php.net/manual/en/language.modifier.cat.php cat
- * (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @version 1.0
- * @param string
- * @param string
- * @return string
- */
-function smarty_modifier_cat($string, $cat)
-{
- return $string . $cat;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/plugins/modifier.count_characters.php b/include/smarty/libs/plugins/modifier.count_characters.php
deleted file mode 100644
index 5ed9a87cd..000000000
--- a/include/smarty/libs/plugins/modifier.count_characters.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty count_characters modifier plugin
- *
- * Type: modifier<br>
- * Name: count_characteres<br>
- * Purpose: count the number of characters in a text
- * @link http://smarty.php.net/manual/en/language.modifier.count.characters.php
- * count_characters (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param string
- * @param boolean include whitespace in the character count
- * @return integer
- */
-function smarty_modifier_count_characters($string, $include_spaces = false)
-{
- if ($include_spaces)
- return(strlen($string));
-
- return preg_match_all("/[^\s]/",$string, $match);
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/plugins/modifier.count_paragraphs.php b/include/smarty/libs/plugins/modifier.count_paragraphs.php
deleted file mode 100644
index e0e274da7..000000000
--- a/include/smarty/libs/plugins/modifier.count_paragraphs.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty count_paragraphs modifier plugin
- *
- * Type: modifier<br>
- * Name: count_paragraphs<br>
- * Purpose: count the number of paragraphs in a text
- * @link http://smarty.php.net/manual/en/language.modifier.count.paragraphs.php
- * count_paragraphs (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param string
- * @return integer
- */
-function smarty_modifier_count_paragraphs($string)
-{
- // count \r or \n characters
- return count(preg_split('/[\r\n]+/', $string));
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/plugins/modifier.count_sentences.php b/include/smarty/libs/plugins/modifier.count_sentences.php
deleted file mode 100644
index f66ea1703..000000000
--- a/include/smarty/libs/plugins/modifier.count_sentences.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty count_sentences modifier plugin
- *
- * Type: modifier<br>
- * Name: count_sentences
- * Purpose: count the number of sentences in a text
- * @link http://smarty.php.net/manual/en/language.modifier.count.paragraphs.php
- * count_sentences (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param string
- * @return integer
- */
-function smarty_modifier_count_sentences($string)
-{
- // find periods with a word before but not after.
- return preg_match_all('/[^\s]\.(?!\w)/', $string, $match);
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/plugins/modifier.count_words.php b/include/smarty/libs/plugins/modifier.count_words.php
deleted file mode 100644
index 9d339f542..000000000
--- a/include/smarty/libs/plugins/modifier.count_words.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty count_words modifier plugin
- *
- * Type: modifier<br>
- * Name: count_words<br>
- * Purpose: count the number of words in a text
- * @link http://smarty.php.net/manual/en/language.modifier.count.words.php
- * count_words (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param string
- * @return integer
- */
-function smarty_modifier_count_words($string)
-{
- // split text by ' ',\r,\n,\f,\t
- $split_array = preg_split('/\s+/',$string);
- // count matches that contain alphanumerics
- $word_count = preg_grep('/[a-zA-Z0-9\\x80-\\xff]/', $split_array);
-
- return count($word_count);
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/plugins/modifier.date_format.php b/include/smarty/libs/plugins/modifier.date_format.php
index 8cf7d5e14..f3eaba057 100644
--- a/include/smarty/libs/plugins/modifier.date_format.php
+++ b/include/smarty/libs/plugins/modifier.date_format.php
@@ -1,58 +1,65 @@
<?php
/**
* Smarty plugin
+ *
* @package Smarty
- * @subpackage plugins
+ * @subpackage PluginsModifier
*/
/**
- * Include the {@link shared.make_timestamp.php} plugin
- */
-require_once $smarty->_get_plugin_filepath('shared', 'make_timestamp');
-/**
* Smarty date_format modifier plugin
- *
+ *
* Type: modifier<br>
* Name: date_format<br>
* Purpose: format datestamps via strftime<br>
* Input:<br>
- * - string: input date string
- * - format: strftime format for output
- * - default_date: default date if $string is empty
- * @link http://smarty.php.net/manual/en/language.modifier.date.format.php
- * date_format (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param string
- * @param string
- * @param string
- * @return string|void
+ * - string: input date string
+ * - format: strftime format for output
+ * - default_date: default date if $string is empty
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.date.format.php date_format (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string $string input date string
+ * @param string $format strftime format for output
+ * @param string $default_date default date if $string is empty
+ * @param string $formatter either 'strftime' or 'auto'
+ * @return string |void
* @uses smarty_make_timestamp()
*/
-function smarty_modifier_date_format($string, $format = '%b %e, %Y', $default_date = '')
+function smarty_modifier_date_format($string, $format=null, $default_date='', $formatter='auto')
{
- if ($string != '') {
+ if ($format === null) {
+ $format = Smarty::$_DATE_FORMAT;
+ }
+ /**
+ * Include the {@link shared.make_timestamp.php} plugin
+ */
+ require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php');
+ if ($string != '' && $string != '0000-00-00' && $string != '0000-00-00 00:00:00') {
$timestamp = smarty_make_timestamp($string);
} elseif ($default_date != '') {
$timestamp = smarty_make_timestamp($default_date);
} else {
return;
+ }
+ if($formatter=='strftime'||($formatter=='auto'&&strpos($format,'%')!==false)) {
+ if (DS == '\\') {
+ $_win_from = array('%D', '%h', '%n', '%r', '%R', '%t', '%T');
+ $_win_to = array('%m/%d/%y', '%b', "\n", '%I:%M:%S %p', '%H:%M', "\t", '%H:%M:%S');
+ if (strpos($format, '%e') !== false) {
+ $_win_from[] = '%e';
+ $_win_to[] = sprintf('%\' 2d', date('j', $timestamp));
+ }
+ if (strpos($format, '%l') !== false) {
+ $_win_from[] = '%l';
+ $_win_to[] = sprintf('%\' 2d', date('h', $timestamp));
+ }
+ $format = str_replace($_win_from, $_win_to, $format);
+ }
+ return strftime($format, $timestamp);
+ } else {
+ return date($format, $timestamp);
}
- if (DIRECTORY_SEPARATOR == '\\') {
- $_win_from = array('%D', '%h', '%n', '%r', '%R', '%t', '%T');
- $_win_to = array('%m/%d/%y', '%b', "\n", '%I:%M:%S %p', '%H:%M', "\t", '%H:%M:%S');
- if (strpos($format, '%e') !== false) {
- $_win_from[] = '%e';
- $_win_to[] = sprintf('%\' 2d', date('j', $timestamp));
- }
- if (strpos($format, '%l') !== false) {
- $_win_from[] = '%l';
- $_win_to[] = sprintf('%\' 2d', date('h', $timestamp));
- }
- $format = str_replace($_win_from, $_win_to, $format);
- }
- return strftime($format, $timestamp);
-}
-
-/* vim: set expandtab: */
+}
-?>
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/modifier.debug_print_var.php b/include/smarty/libs/plugins/modifier.debug_print_var.php
index e4f7bc0cc..fa44100e8 100644
--- a/include/smarty/libs/plugins/modifier.debug_print_var.php
+++ b/include/smarty/libs/plugins/modifier.debug_print_var.php
@@ -1,53 +1,53 @@
<?php
/**
* Smarty plugin
+ *
* @package Smarty
- * @subpackage plugins
+ * @subpackage Debug
*/
-
/**
* Smarty debug_print_var modifier plugin
- *
+ *
* Type: modifier<br>
* Name: debug_print_var<br>
* Purpose: formats variable contents for display in the console
- * @link http://smarty.php.net/manual/en/language.modifier.debug.print.var.php
- * debug_print_var (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param array|object
- * @param integer
- * @param integer
- * @return string
+ *
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param array|object $var variable to be formatted
+ * @param integer $depth maximum recursion depth if $var is an array
+ * @param integer $length maximum string length if $var is a string
+ * @return string
*/
-function smarty_modifier_debug_print_var($var, $depth = 0, $length = 40)
+function smarty_modifier_debug_print_var ($var, $depth = 0, $length = 40)
{
- $_replace = array(
- "\n" => '<i>\n</i>',
+ $_replace = array("\n" => '<i>\n</i>',
"\r" => '<i>\r</i>',
"\t" => '<i>\t</i>'
- );
+ );
switch (gettype($var)) {
case 'array' :
$results = '<b>Array (' . count($var) . ')</b>';
foreach ($var as $curr_key => $curr_val) {
$results .= '<br>' . str_repeat('&nbsp;', $depth * 2)
- . '<b>' . strtr($curr_key, $_replace) . '</b> =&gt; '
- . smarty_modifier_debug_print_var($curr_val, ++$depth, $length);
- $depth--;
- }
+ . '<b>' . strtr($curr_key, $_replace) . '</b> =&gt; '
+ . smarty_modifier_debug_print_var($curr_val, ++$depth, $length);
+ $depth--;
+ }
break;
+
case 'object' :
$object_vars = get_object_vars($var);
$results = '<b>' . get_class($var) . ' Object (' . count($object_vars) . ')</b>';
foreach ($object_vars as $curr_key => $curr_val) {
$results .= '<br>' . str_repeat('&nbsp;', $depth * 2)
- . '<b> -&gt;' . strtr($curr_key, $_replace) . '</b> = '
- . smarty_modifier_debug_print_var($curr_val, ++$depth, $length);
- $depth--;
- }
+ . '<b> -&gt;' . strtr($curr_key, $_replace) . '</b> = '
+ . smarty_modifier_debug_print_var($curr_val, ++$depth, $length);
+ $depth--;
+ }
break;
+
case 'boolean' :
case 'NULL' :
case 'resource' :
@@ -59,32 +59,47 @@ function smarty_modifier_debug_print_var($var, $depth = 0, $length = 40)
$results = 'null';
} else {
$results = htmlspecialchars((string) $var);
- }
+ }
$results = '<i>' . $results . '</i>';
break;
+
case 'integer' :
case 'float' :
$results = htmlspecialchars((string) $var);
break;
+
case 'string' :
$results = strtr($var, $_replace);
- if (strlen($var) > $length ) {
- $results = substr($var, 0, $length - 3) . '...';
+ if (Smarty::$_MBSTRING) {
+ if (mb_strlen($var, Smarty::$_CHARSET) > $length) {
+ $results = mb_substr($var, 0, $length - 3, Smarty::$_CHARSET) . '...';
+ }
+ } else {
+ if (isset($var[$length])) {
+ $results = substr($var, 0, $length - 3) . '...';
+ }
}
+
$results = htmlspecialchars('"' . $results . '"');
break;
+
case 'unknown type' :
default :
$results = strtr((string) $var, $_replace);
- if (strlen($results) > $length ) {
- $results = substr($results, 0, $length - 3) . '...';
+ if (Smarty::$_MBSTRING) {
+ if (mb_strlen($results, Smarty::$_CHARSET) > $length) {
+ $results = mb_substr($results, 0, $length - 3, Smarty::$_CHARSET) . '...';
+ }
+ } else {
+ if (strlen($results) > $length) {
+ $results = substr($results, 0, $length - 3) . '...';
+ }
}
+
$results = htmlspecialchars($results);
- }
+ }
return $results;
-}
-
-/* vim: set expandtab: */
+}
-?>
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/modifier.default.php b/include/smarty/libs/plugins/modifier.default.php
deleted file mode 100644
index 70011fd6b..000000000
--- a/include/smarty/libs/plugins/modifier.default.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty default modifier plugin
- *
- * Type: modifier<br>
- * Name: default<br>
- * Purpose: designate default value for empty variables
- * @link http://smarty.php.net/manual/en/language.modifier.default.php
- * default (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param string
- * @param string
- * @return string
- */
-function smarty_modifier_default($string, $default = '')
-{
- if (!isset($string) || $string === '')
- return $default;
- else
- return $string;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/plugins/modifier.escape.php b/include/smarty/libs/plugins/modifier.escape.php
index a2f52b232..5ca8e7796 100644
--- a/include/smarty/libs/plugins/modifier.escape.php
+++ b/include/smarty/libs/plugins/modifier.escape.php
@@ -1,93 +1,188 @@
<?php
/**
* Smarty plugin
+ *
* @package Smarty
- * @subpackage plugins
+ * @subpackage PluginsModifier
*/
-
/**
* Smarty escape modifier plugin
*
* Type: modifier<br>
* Name: escape<br>
- * Purpose: Escape the string according to escapement type
- * @link http://smarty.php.net/manual/en/language.modifier.escape.php
- * escape (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param string
- * @param html|htmlall|url|quotes|hex|hexentity|javascript
- * @return string
+ * Purpose: escape string for output
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.count.characters.php count_characters (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string $string input string
+ * @param string $esc_type escape type
+ * @param string $char_set character set, used for htmlspecialchars() or htmlentities()
+ * @param boolean $double_encode encode already encoded entitites again, used for htmlspecialchars() or htmlentities()
+ * @return string escaped input string
*/
-function smarty_modifier_escape($string, $esc_type = 'html', $char_set = 'ISO-8859-1')
+function smarty_modifier_escape($string, $esc_type = 'html', $char_set = null, $double_encode = true)
{
+ static $_double_encode = null;
+ if ($_double_encode === null) {
+ $_double_encode = version_compare(PHP_VERSION, '5.2.3', '>=');
+ }
+
+ if (!$char_set) {
+ $char_set = Smarty::$_CHARSET;
+ }
+
switch ($esc_type) {
case 'html':
- return htmlspecialchars($string, ENT_QUOTES, $char_set);
+ if ($_double_encode) {
+ // php >=5.3.2 - go native
+ return htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode);
+ } else {
+ if ($double_encode) {
+ // php <5.2.3 - only handle double encoding
+ return htmlspecialchars($string, ENT_QUOTES, $char_set);
+ } else {
+ // php <5.2.3 - prevent double encoding
+ $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string);
+ $string = htmlspecialchars($string, ENT_QUOTES, $char_set);
+ $string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string);
+ return $string;
+ }
+ }
case 'htmlall':
- return htmlentities($string, ENT_QUOTES, $char_set);
+ if (Smarty::$_MBSTRING) {
+ // mb_convert_encoding ignores htmlspecialchars()
+ if ($_double_encode) {
+ // php >=5.3.2 - go native
+ $string = htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode);
+ } else {
+ if ($double_encode) {
+ // php <5.2.3 - only handle double encoding
+ $string = htmlspecialchars($string, ENT_QUOTES, $char_set);
+ } else {
+ // php <5.2.3 - prevent double encoding
+ $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string);
+ $string = htmlspecialchars($string, ENT_QUOTES, $char_set);
+ $string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string);
+ return $string;
+ }
+ }
+
+ // htmlentities() won't convert everything, so use mb_convert_encoding
+ return mb_convert_encoding($string, 'HTML-ENTITIES', $char_set);
+ }
+
+ // no MBString fallback
+ if ($_double_encode) {
+ return htmlentities($string, ENT_QUOTES, $char_set, $double_encode);
+ } else {
+ if ($double_encode) {
+ return htmlentities($string, ENT_QUOTES, $char_set);
+ } else {
+ $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string);
+ $string = htmlentities($string, ENT_QUOTES, $char_set);
+ $string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string);
+ return $string;
+ }
+ }
case 'url':
return rawurlencode($string);
case 'urlpathinfo':
- return str_replace('%2F','/',rawurlencode($string));
-
+ return str_replace('%2F', '/', rawurlencode($string));
+
case 'quotes':
// escape unescaped single quotes
return preg_replace("%(?<!\\\\)'%", "\\'", $string);
case 'hex':
- // escape every character into hex
+ // escape every byte into hex
+ // Note that the UTF-8 encoded character ä will be represented as %c3%a4
$return = '';
- for ($x=0; $x < strlen($string); $x++) {
+ $_length = strlen($string);
+ for ($x = 0; $x < $_length; $x++) {
$return .= '%' . bin2hex($string[$x]);
}
return $return;
-
+
case 'hexentity':
$return = '';
- for ($x=0; $x < strlen($string); $x++) {
+ if (Smarty::$_MBSTRING) {
+ require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php');
+ $return = '';
+ foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) {
+ $return .= '&#x' . strtoupper(dechex($unicode)) . ';';
+ }
+ return $return;
+ }
+ // no MBString fallback
+ $_length = strlen($string);
+ for ($x = 0; $x < $_length; $x++) {
$return .= '&#x' . bin2hex($string[$x]) . ';';
}
return $return;
case 'decentity':
$return = '';
- for ($x=0; $x < strlen($string); $x++) {
+ if (Smarty::$_MBSTRING) {
+ require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php');
+ $return = '';
+ foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) {
+ $return .= '&#' . $unicode . ';';
+ }
+ return $return;
+ }
+ // no MBString fallback
+ $_length = strlen($string);
+ for ($x = 0; $x < $_length; $x++) {
$return .= '&#' . ord($string[$x]) . ';';
}
return $return;
case 'javascript':
// escape quotes and backslashes, newlines, etc.
- return strtr($string, array('\\'=>'\\\\',"'"=>"\\'",'"'=>'\\"',"\r"=>'\\r',"\n"=>'\\n','</'=>'<\/'));
-
+ return strtr($string, array('\\' => '\\\\', "'" => "\\'", '"' => '\\"', "\r" => '\\r', "\n" => '\\n', '</' => '<\/'));
+
case 'mail':
- // safe way to display e-mail address on a web page
- return str_replace(array('@', '.'),array(' [AT] ', ' [DOT] '), $string);
-
+ if (Smarty::$_MBSTRING) {
+ require_once(SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php');
+ return smarty_mb_str_replace(array('@', '.'), array(' [AT] ', ' [DOT] '), $string);
+ }
+ // no MBString fallback
+ return str_replace(array('@', '.'), array(' [AT] ', ' [DOT] '), $string);
+
case 'nonstd':
- // escape non-standard chars, such as ms document quotes
- $_res = '';
- for($_i = 0, $_len = strlen($string); $_i < $_len; $_i++) {
- $_ord = ord(substr($string, $_i, 1));
- // non-standard char, escape it
- if($_ord >= 126){
- $_res .= '&#' . $_ord . ';';
- }
- else {
- $_res .= substr($string, $_i, 1);
- }
- }
- return $_res;
+ // escape non-standard chars, such as ms document quotes
+ $return = '';
+ if (Smarty::$_MBSTRING) {
+ require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php');
+ foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) {
+ if ($unicode >= 126) {
+ $return .= '&#' . $unicode . ';';
+ } else {
+ $return .= chr($unicode);
+ }
+ }
+ return $return;
+ }
+
+ $_length = strlen($string);
+ for ($_i = 0; $_i < $_length; $_i++) {
+ $_ord = ord(substr($string, $_i, 1));
+ // non-standard char, escape it
+ if ($_ord >= 126) {
+ $return .= '&#' . $_ord . ';';
+ } else {
+ $return .= substr($string, $_i, 1);
+ }
+ }
+ return $return;
default:
return $string;
}
}
-/* vim: set expandtab: */
-
-?>
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/modifier.indent.php b/include/smarty/libs/plugins/modifier.indent.php
deleted file mode 100644
index 394147a29..000000000
--- a/include/smarty/libs/plugins/modifier.indent.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty indent modifier plugin
- *
- * Type: modifier<br>
- * Name: indent<br>
- * Purpose: indent lines of text
- * @link http://smarty.php.net/manual/en/language.modifier.indent.php
- * indent (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param string
- * @param integer
- * @param string
- * @return string
- */
-function smarty_modifier_indent($string,$chars=4,$char=" ")
-{
- return preg_replace('!^!m',str_repeat($char,$chars),$string);
-}
-
-?>
diff --git a/include/smarty/libs/plugins/modifier.lower.php b/include/smarty/libs/plugins/modifier.lower.php
deleted file mode 100644
index 20e7a8d39..000000000
--- a/include/smarty/libs/plugins/modifier.lower.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty lower modifier plugin
- *
- * Type: modifier<br>
- * Name: lower<br>
- * Purpose: convert string to lowercase
- * @link http://smarty.php.net/manual/en/language.modifier.lower.php
- * lower (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param string
- * @return string
- */
-function smarty_modifier_lower($string)
-{
- return strtolower($string);
-}
-
-?>
diff --git a/include/smarty/libs/plugins/modifier.nl2br.php b/include/smarty/libs/plugins/modifier.nl2br.php
deleted file mode 100644
index d6fabff64..000000000
--- a/include/smarty/libs/plugins/modifier.nl2br.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty plugin
- *
- * Type: modifier<br>
- * Name: nl2br<br>
- * Date: Feb 26, 2003
- * Purpose: convert \r\n, \r or \n to <<br>>
- * Input:<br>
- * - contents = contents to replace
- * - preceed_test = if true, includes preceeding break tags
- * in replacement
- * Example: {$text|nl2br}
- * @link http://smarty.php.net/manual/en/language.modifier.nl2br.php
- * nl2br (Smarty online manual)
- * @version 1.0
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param string
- * @return string
- */
-function smarty_modifier_nl2br($string)
-{
- return nl2br($string);
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/plugins/modifier.regex_replace.php b/include/smarty/libs/plugins/modifier.regex_replace.php
index 100b58ce4..f9fd5fa53 100644
--- a/include/smarty/libs/plugins/modifier.regex_replace.php
+++ b/include/smarty/libs/plugins/modifier.regex_replace.php
@@ -1,48 +1,55 @@
<?php
/**
* Smarty plugin
+ *
* @package Smarty
- * @subpackage plugins
+ * @subpackage PluginsModifier
*/
-
/**
* Smarty regex_replace modifier plugin
*
* Type: modifier<br>
* Name: regex_replace<br>
* Purpose: regular expression search/replace
+ *
* @link http://smarty.php.net/manual/en/language.modifier.regex.replace.php
* regex_replace (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param string
- * @param string|array
- * @param string|array
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string $string input string
+ * @param string|array $search regular expression(s) to search for
+ * @param string|array $replace string(s) that should be replaced
* @return string
*/
function smarty_modifier_regex_replace($string, $search, $replace)
{
if(is_array($search)) {
- foreach($search as $idx => $s)
- $search[$idx] = _smarty_regex_replace_check($s);
+ foreach($search as $idx => $s) {
+ $search[$idx] = _smarty_regex_replace_check($s);
+ }
} else {
- $search = _smarty_regex_replace_check($search);
- }
-
+ $search = _smarty_regex_replace_check($search);
+ }
return preg_replace($search, $replace, $string);
}
+/**
+ * @param string $search string(s) that should be replaced
+ * @return string
+ * @ignore
+ */
function _smarty_regex_replace_check($search)
{
- if (($pos = strpos($search,"\0")) !== false)
- $search = substr($search,0,$pos);
+ // null-byte injection detection
+ // anything behind the first null-byte is ignored
+ if (($pos = strpos($search,"\0")) !== false) {
+ $search = substr($search,0,$pos);
+ }
+ // remove eval-modifier from $search
if (preg_match('!([a-zA-Z\s]+)$!s', $search, $match) && (strpos($match[1], 'e') !== false)) {
- /* remove eval-modifier from $search */
$search = substr($search, 0, -strlen($match[1])) . preg_replace('![e\s]+!', '', $match[1]);
}
return $search;
}
-/* vim: set expandtab: */
-
-?>
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/modifier.replace.php b/include/smarty/libs/plugins/modifier.replace.php
index df041c884..4d71a6e9b 100644
--- a/include/smarty/libs/plugins/modifier.replace.php
+++ b/include/smarty/libs/plugins/modifier.replace.php
@@ -2,29 +2,32 @@
/**
* Smarty plugin
* @package Smarty
- * @subpackage plugins
+ * @subpackage PluginsModifier
*/
-
/**
* Smarty replace modifier plugin
- *
+ *
* Type: modifier<br>
* Name: replace<br>
* Purpose: simple search/replace
- * @link http://smarty.php.net/manual/en/language.modifier.replace.php
- * replace (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param string
- * @param string
- * @param string
- * @return string
+ *
+ * @link http://smarty.php.net/manual/en/language.modifier.replace.php replace (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @author Uwe Tews
+ * @param string $string input string
+ * @param string $search text to search for
+ * @param string $replace replacement text
+ * @return string
*/
function smarty_modifier_replace($string, $search, $replace)
{
+ if (Smarty::$_MBSTRING) {
+ require_once(SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php');
+ return smarty_mb_str_replace($search, $replace, $string);
+ }
+
return str_replace($search, $replace, $string);
-}
-
-/* vim: set expandtab: */
+}
-?>
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/modifier.spacify.php b/include/smarty/libs/plugins/modifier.spacify.php
index c2423f4f2..a907232ff 100644
--- a/include/smarty/libs/plugins/modifier.spacify.php
+++ b/include/smarty/libs/plugins/modifier.spacify.php
@@ -2,29 +2,26 @@
/**
* Smarty plugin
* @package Smarty
- * @subpackage plugins
+ * @subpackage PluginsModifier
*/
-
/**
* Smarty spacify modifier plugin
- *
+ *
* Type: modifier<br>
* Name: spacify<br>
* Purpose: add spaces between characters in a string
- * @link http://smarty.php.net/manual/en/language.modifier.spacify.php
- * spacify (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param string
- * @param string
+ *
+ * @link http://smarty.php.net/manual/en/language.modifier.spacify.php spacify (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string $string input string
+ * @param string $spacify_char string to insert between characters.
* @return string
*/
function smarty_modifier_spacify($string, $spacify_char = ' ')
{
- return implode($spacify_char,
- preg_split('//', $string, -1, PREG_SPLIT_NO_EMPTY));
-}
-
-/* vim: set expandtab: */
+ // well… what about charsets besides latin and UTF-8?
+ return implode($spacify_char, preg_split('//' . Smarty::$_UTF8_MODIFIER, $string, -1, PREG_SPLIT_NO_EMPTY));
+}
-?>
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/modifier.string_format.php b/include/smarty/libs/plugins/modifier.string_format.php
deleted file mode 100644
index 9e051a578..000000000
--- a/include/smarty/libs/plugins/modifier.string_format.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty string_format modifier plugin
- *
- * Type: modifier<br>
- * Name: string_format<br>
- * Purpose: format strings via sprintf
- * @link http://smarty.php.net/manual/en/language.modifier.string.format.php
- * string_format (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param string
- * @param string
- * @return string
- */
-function smarty_modifier_string_format($string, $format)
-{
- return sprintf($format, $string);
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/plugins/modifier.strip.php b/include/smarty/libs/plugins/modifier.strip.php
deleted file mode 100644
index cc5c453c8..000000000
--- a/include/smarty/libs/plugins/modifier.strip.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty strip modifier plugin
- *
- * Type: modifier<br>
- * Name: strip<br>
- * Purpose: Replace all repeated spaces, newlines, tabs
- * with a single space or supplied replacement string.<br>
- * Example: {$var|strip} {$var|strip:"&nbsp;"}
- * Date: September 25th, 2002
- * @link http://smarty.php.net/manual/en/language.modifier.strip.php
- * strip (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @version 1.0
- * @param string
- * @param string
- * @return string
- */
-function smarty_modifier_strip($text, $replace = ' ')
-{
- return preg_replace('!\s+!', $replace, $text);
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/plugins/modifier.strip_tags.php b/include/smarty/libs/plugins/modifier.strip_tags.php
deleted file mode 100644
index 93011a892..000000000
--- a/include/smarty/libs/plugins/modifier.strip_tags.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty strip_tags modifier plugin
- *
- * Type: modifier<br>
- * Name: strip_tags<br>
- * Purpose: strip html tags from text
- * @link http://smarty.php.net/manual/en/language.modifier.strip.tags.php
- * strip_tags (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param string
- * @param boolean
- * @return string
- */
-function smarty_modifier_strip_tags($string, $replace_with_space = true)
-{
- if ($replace_with_space)
- return preg_replace('!<[^>]*?>!', ' ', $string);
- else
- return strip_tags($string);
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/libs/plugins/modifier.truncate.php b/include/smarty/libs/plugins/modifier.truncate.php
index 35c89690a..9a803ec99 100644
--- a/include/smarty/libs/plugins/modifier.truncate.php
+++ b/include/smarty/libs/plugins/modifier.truncate.php
@@ -1,50 +1,59 @@
<?php
/**
* Smarty plugin
+ *
* @package Smarty
- * @subpackage plugins
+ * @subpackage PluginsModifier
*/
-
-
+
/**
* Smarty truncate modifier plugin
- *
+ *
* Type: modifier<br>
* Name: truncate<br>
* Purpose: Truncate a string to a certain length if necessary,
- * optionally splitting in the middle of a word, and
- * appending the $etc string or inserting $etc into the middle.
- * @link http://smarty.php.net/manual/en/language.modifier.truncate.php
- * truncate (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param string
- * @param integer
- * @param string
- * @param boolean
- * @param boolean
- * @return string
+ * optionally splitting in the middle of a word, and
+ * appending the $etc string or inserting $etc into the middle.
+ *
+ * @link http://smarty.php.net/manual/en/language.modifier.truncate.php truncate (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string $string input string
+ * @param integer $length length of truncated text
+ * @param string $etc end string
+ * @param boolean $break_words truncate at word boundary
+ * @param boolean $middle truncate in the middle of text
+ * @return string truncated string
*/
-function smarty_modifier_truncate($string, $length = 80, $etc = '...',
- $break_words = false, $middle = false)
-{
+function smarty_modifier_truncate($string, $length = 80, $etc = '...', $break_words = false, $middle = false) {
if ($length == 0)
return '';
- if (strlen($string) > $length) {
+ if (Smarty::$_MBSTRING) {
+ if (mb_strlen($string, Smarty::$_CHARSET) > $length) {
+ $length -= min($length, mb_strlen($etc, Smarty::$_CHARSET));
+ if (!$break_words && !$middle) {
+ $string = preg_replace('/\s+?(\S+)?$/' . Smarty::$_UTF8_MODIFIER, '', mb_substr($string, 0, $length + 1, Smarty::$_CHARSET));
+ }
+ if (!$middle) {
+ return mb_substr($string, 0, $length, Smarty::$_CHARSET) . $etc;
+ }
+ return mb_substr($string, 0, $length / 2, Smarty::$_CHARSET) . $etc . mb_substr($string, - $length / 2, $length, Smarty::$_CHARSET);
+ }
+ return $string;
+ }
+
+ // no MBString fallback
+ if (isset($string[$length])) {
$length -= min($length, strlen($etc));
if (!$break_words && !$middle) {
- $string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length+1));
- }
- if(!$middle) {
+ $string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length + 1));
+ }
+ if (!$middle) {
return substr($string, 0, $length) . $etc;
- } else {
- return substr($string, 0, $length/2) . $etc . substr($string, -$length/2);
}
- } else {
- return $string;
+ return substr($string, 0, $length / 2) . $etc . substr($string, - $length / 2);
}
-}
-
-/* vim: set expandtab: */
+ return $string;
+}
-?>
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/modifier.upper.php b/include/smarty/libs/plugins/modifier.upper.php
deleted file mode 100644
index c12480fbd..000000000
--- a/include/smarty/libs/plugins/modifier.upper.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty upper modifier plugin
- *
- * Type: modifier<br>
- * Name: upper<br>
- * Purpose: convert string to uppercase
- * @link http://smarty.php.net/manual/en/language.modifier.upper.php
- * upper (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param string
- * @return string
- */
-function smarty_modifier_upper($string)
-{
- return strtoupper($string);
-}
-
-?>
diff --git a/include/smarty/libs/plugins/modifier.wordwrap.php b/include/smarty/libs/plugins/modifier.wordwrap.php
deleted file mode 100644
index ce0718156..000000000
--- a/include/smarty/libs/plugins/modifier.wordwrap.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty wordwrap modifier plugin
- *
- * Type: modifier<br>
- * Name: wordwrap<br>
- * Purpose: wrap a string of text at a given length
- * @link http://smarty.php.net/manual/en/language.modifier.wordwrap.php
- * wordwrap (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param string
- * @param integer
- * @param string
- * @param boolean
- * @return string
- */
-function smarty_modifier_wordwrap($string,$length=80,$break="\n",$cut=false)
-{
- return wordwrap($string,$length,$break,$cut);
-}
-
-?>
diff --git a/include/smarty/libs/plugins/modifiercompiler.cat.php b/include/smarty/libs/plugins/modifiercompiler.cat.php
new file mode 100644
index 000000000..5049c63e5
--- /dev/null
+++ b/include/smarty/libs/plugins/modifiercompiler.cat.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty cat modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: cat<br>
+ * Date: Feb 24, 2003<br>
+ * Purpose: catenate a value to a variable<br>
+ * Input: string to catenate<br>
+ * Example: {$var|cat:"foo"}
+ *
+ * @link http://smarty.php.net/manual/en/language.modifier.cat.php cat
+ * (Smarty online manual)
+ * @author Uwe Tews
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_cat($params, $compiler)
+{
+ return '('.implode(').(', $params).')';
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/modifiercompiler.count_characters.php b/include/smarty/libs/plugins/modifiercompiler.count_characters.php
new file mode 100644
index 000000000..0f269c9fa
--- /dev/null
+++ b/include/smarty/libs/plugins/modifiercompiler.count_characters.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty count_characters modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: count_characteres<br>
+ * Purpose: count the number of characters in a text
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.count.characters.php count_characters (Smarty online manual)
+ * @author Uwe Tews
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_count_characters($params, $compiler)
+{
+ if (!isset($params[1]) || $params[1] != 'true') {
+ return 'preg_match_all(\'/[^\s]/' . Smarty::$_UTF8_MODIFIER . '\',' . $params[0] . ', $tmp)';
+ }
+ if (Smarty::$_MBSTRING) {
+ return 'mb_strlen(' . $params[0] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')';
+ }
+ // no MBString fallback
+ return 'strlen(' . $params[0] . ')';
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/modifiercompiler.count_paragraphs.php b/include/smarty/libs/plugins/modifiercompiler.count_paragraphs.php
new file mode 100644
index 000000000..853f98f46
--- /dev/null
+++ b/include/smarty/libs/plugins/modifiercompiler.count_paragraphs.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty count_paragraphs modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: count_paragraphs<br>
+ * Purpose: count the number of paragraphs in a text
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.count.paragraphs.php
+ * count_paragraphs (Smarty online manual)
+ * @author Uwe Tews
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_count_paragraphs($params, $compiler)
+{
+ // count \r or \n characters
+ return '(preg_match_all(\'#[\r\n]+#\', ' . $params[0] . ', $tmp)+1)';
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/modifiercompiler.count_sentences.php b/include/smarty/libs/plugins/modifiercompiler.count_sentences.php
new file mode 100644
index 000000000..f8d79b3f2
--- /dev/null
+++ b/include/smarty/libs/plugins/modifiercompiler.count_sentences.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty count_sentences modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: count_sentences
+ * Purpose: count the number of sentences in a text
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.count.paragraphs.php
+ * count_sentences (Smarty online manual)
+ * @author Uwe Tews
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_count_sentences($params, $compiler)
+{
+ // find periods, question marks, exclamation marks with a word before but not after.
+ return 'preg_match_all("#\w[\.\?\!](\W|$)#S' . Smarty::$_UTF8_MODIFIER . '", ' . $params[0] . ', $tmp)';
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/modifiercompiler.count_words.php b/include/smarty/libs/plugins/modifiercompiler.count_words.php
new file mode 100644
index 000000000..f53443e24
--- /dev/null
+++ b/include/smarty/libs/plugins/modifiercompiler.count_words.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty count_words modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: count_words<br>
+ * Purpose: count the number of words in a text
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.count.words.php count_words (Smarty online manual)
+ * @author Uwe Tews
+ * @param array $params parameters
+ * @return string with compiled code
+*/
+function smarty_modifiercompiler_count_words($params, $compiler)
+{
+ if (Smarty::$_MBSTRING) {
+ // return 'preg_match_all(\'#[\w\pL]+#' . Smarty::$_UTF8_MODIFIER . '\', ' . $params[0] . ', $tmp)';
+ // expression taken from http://de.php.net/manual/en/function.str-word-count.php#85592
+ return 'preg_match_all(\'/\p{L}[\p{L}\p{Mn}\p{Pd}\\\'\x{2019}]*/' . Smarty::$_UTF8_MODIFIER . '\', ' . $params[0] . ', $tmp)';
+ }
+ // no MBString fallback
+ return 'str_word_count(' . $params[0] . ')';
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/modifiercompiler.default.php b/include/smarty/libs/plugins/modifiercompiler.default.php
new file mode 100644
index 000000000..3554964e4
--- /dev/null
+++ b/include/smarty/libs/plugins/modifiercompiler.default.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty default modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: default<br>
+ * Purpose: designate default value for empty variables
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.default.php default (Smarty online manual)
+ * @author Uwe Tews
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_default ($params, $compiler)
+{
+ $output = $params[0];
+ if (!isset($params[1])) {
+ $params[1] = "''";
+ }
+
+ array_shift($params);
+ foreach ($params as $param) {
+ $output = '(($tmp = @' . $output . ')===null||$tmp===\'\' ? ' . $param . ' : $tmp)';
+ }
+ return $output;
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/modifiercompiler.escape.php b/include/smarty/libs/plugins/modifiercompiler.escape.php
new file mode 100644
index 000000000..d38d12975
--- /dev/null
+++ b/include/smarty/libs/plugins/modifiercompiler.escape.php
@@ -0,0 +1,125 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * @ignore
+ */
+require_once( SMARTY_PLUGINS_DIR .'shared.literal_compiler_param.php' );
+
+/**
+ * Smarty escape modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: escape<br>
+ * Purpose: escape string for output
+ *
+ * @link http://www.smarty.net/docsv2/en/language.modifier.escape count_characters (Smarty online manual)
+ * @author Rodney Rehm
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_escape($params, $compiler)
+{
+ static $_double_encode = null;
+ if ($_double_encode === null) {
+ $_double_encode = version_compare(PHP_VERSION, '5.2.3', '>=');
+ }
+
+ try {
+ $esc_type = smarty_literal_compiler_param($params, 1, 'html');
+ $char_set = smarty_literal_compiler_param($params, 2, Smarty::$_CHARSET);
+ $double_encode = smarty_literal_compiler_param($params, 3, true);
+
+ if (!$char_set) {
+ $char_set = Smarty::$_CHARSET;
+ }
+
+ switch ($esc_type) {
+ case 'html':
+ if ($_double_encode) {
+ return 'htmlspecialchars('
+ . $params[0] .', ENT_QUOTES, '
+ . var_export($char_set, true) . ', '
+ . var_export($double_encode, true) . ')';
+ } else if ($double_encode) {
+ return 'htmlspecialchars('
+ . $params[0] .', ENT_QUOTES, '
+ . var_export($char_set, true) . ')';
+ } else {
+ // fall back to modifier.escape.php
+ }
+
+ case 'htmlall':
+ if (Smarty::$_MBSTRING) {
+ if ($_double_encode) {
+ // php >=5.2.3 - go native
+ return 'mb_convert_encoding(htmlspecialchars('
+ . $params[0] .', ENT_QUOTES, '
+ . var_export($char_set, true) . ', '
+ . var_export($double_encode, true)
+ . '), "HTML-ENTITIES", '
+ . var_export($char_set, true) . ')';
+ } else if ($double_encode) {
+ // php <5.2.3 - only handle double encoding
+ return 'mb_convert_encoding(htmlspecialchars('
+ . $params[0] .', ENT_QUOTES, '
+ . var_export($char_set, true)
+ . '), "HTML-ENTITIES", '
+ . var_export($char_set, true) . ')';
+ } else {
+ // fall back to modifier.escape.php
+ }
+ }
+
+ // no MBString fallback
+ if ($_double_encode) {
+ // php >=5.2.3 - go native
+ return 'htmlentities('
+ . $params[0] .', ENT_QUOTES, '
+ . var_export($char_set, true) . ', '
+ . var_export($double_encode, true) . ')';
+ } else if ($double_encode) {
+ // php <5.2.3 - only handle double encoding
+ return 'htmlentities('
+ . $params[0] .', ENT_QUOTES, '
+ . var_export($char_set, true) . ')';
+ } else {
+ // fall back to modifier.escape.php
+ }
+
+ case 'url':
+ return 'rawurlencode(' . $params[0] . ')';
+
+ case 'urlpathinfo':
+ return 'str_replace("%2F", "/", rawurlencode(' . $params[0] . '))';
+
+ case 'quotes':
+ // escape unescaped single quotes
+ return 'preg_replace("%(?<!\\\\\\\\)\'%", "\\\'",' . $params[0] . ')';
+
+ case 'javascript':
+ // escape quotes and backslashes, newlines, etc.
+ return 'strtr(' . $params[0] . ', array("\\\\" => "\\\\\\\\", "\'" => "\\\\\'", "\"" => "\\\\\"", "\\r" => "\\\\r", "\\n" => "\\\n", "</" => "<\/" ))';
+
+ }
+ } catch(SmartyException $e) {
+ // pass through to regular plugin fallback
+ }
+
+ // could not optimize |escape call, so fallback to regular plugin
+ if ($compiler->tag_nocache | $compiler->nocache) {
+ $compiler->template->required_plugins['nocache']['escape']['modifier']['file'] = SMARTY_PLUGINS_DIR .'modifier.escape.php';
+ $compiler->template->required_plugins['nocache']['escape']['modifier']['function'] = 'smarty_modifier_escape';
+ } else {
+ $compiler->template->required_plugins['compiled']['escape']['modifier']['file'] = SMARTY_PLUGINS_DIR .'modifier.escape.php';
+ $compiler->template->required_plugins['compiled']['escape']['modifier']['function'] = 'smarty_modifier_escape';
+ }
+ return 'smarty_modifier_escape(' . join( ', ', $params ) . ')';
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/modifiercompiler.from_charset.php b/include/smarty/libs/plugins/modifiercompiler.from_charset.php
new file mode 100644
index 000000000..5d6b7889a
--- /dev/null
+++ b/include/smarty/libs/plugins/modifiercompiler.from_charset.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty from_charset modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: from_charset<br>
+ * Purpose: convert character encoding from $charset to internal encoding
+ *
+ * @author Rodney Rehm
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_from_charset($params, $compiler)
+{
+ if (!Smarty::$_MBSTRING) {
+ // FIXME: (rodneyrehm) shouldn't this throw an error?
+ return $params[0];
+ }
+
+ if (!isset($params[1])) {
+ $params[1] = '"ISO-8859-1"';
+ }
+
+ return 'mb_convert_encoding(' . $params[0] . ', "' . addslashes(Smarty::$_CHARSET) . '", ' . $params[1] . ')';
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/modifiercompiler.indent.php b/include/smarty/libs/plugins/modifiercompiler.indent.php
new file mode 100644
index 000000000..26094b7ca
--- /dev/null
+++ b/include/smarty/libs/plugins/modifiercompiler.indent.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty indent modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: indent<br>
+ * Purpose: indent lines of text
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.indent.php indent (Smarty online manual)
+ * @author Uwe Tews
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+
+function smarty_modifiercompiler_indent($params, $compiler)
+{
+ if (!isset($params[1])) {
+ $params[1] = 4;
+ }
+ if (!isset($params[2])) {
+ $params[2] = "' '";
+ }
+ return 'preg_replace(\'!^!m\',str_repeat(' . $params[2] . ',' . $params[1] . '),' . $params[0] . ')';
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/modifiercompiler.lower.php b/include/smarty/libs/plugins/modifiercompiler.lower.php
new file mode 100644
index 000000000..bc3abd727
--- /dev/null
+++ b/include/smarty/libs/plugins/modifiercompiler.lower.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty lower modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: lower<br>
+ * Purpose: convert string to lowercase
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.lower.php lower (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @author Uwe Tews
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+
+function smarty_modifiercompiler_lower($params, $compiler)
+{
+ if (Smarty::$_MBSTRING) {
+ return 'mb_strtolower(' . $params[0] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')' ;
+ }
+ // no MBString fallback
+ return 'strtolower(' . $params[0] . ')';
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/modifiercompiler.noprint.php b/include/smarty/libs/plugins/modifiercompiler.noprint.php
new file mode 100644
index 000000000..d7433e985
--- /dev/null
+++ b/include/smarty/libs/plugins/modifiercompiler.noprint.php
@@ -0,0 +1,25 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty noprint modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: noprint<br>
+ * Purpose: return an empty string
+ *
+ * @author Uwe Tews
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_noprint($params, $compiler)
+{
+ return "''";
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/modifiercompiler.string_format.php b/include/smarty/libs/plugins/modifiercompiler.string_format.php
new file mode 100644
index 000000000..5a8d43578
--- /dev/null
+++ b/include/smarty/libs/plugins/modifiercompiler.string_format.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty string_format modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: string_format<br>
+ * Purpose: format strings via sprintf
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.string.format.php string_format (Smarty online manual)
+ * @author Uwe Tews
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_string_format($params, $compiler)
+{
+ return 'sprintf(' . $params[1] . ',' . $params[0] . ')';
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/modifiercompiler.strip.php b/include/smarty/libs/plugins/modifiercompiler.strip.php
new file mode 100644
index 000000000..8d15ca434
--- /dev/null
+++ b/include/smarty/libs/plugins/modifiercompiler.strip.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty strip modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: strip<br>
+ * Purpose: Replace all repeated spaces, newlines, tabs
+ * with a single space or supplied replacement string.<br>
+ * Example: {$var|strip} {$var|strip:"&nbsp;"}<br>
+ * Date: September 25th, 2002
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.strip.php strip (Smarty online manual)
+ * @author Uwe Tews
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+
+function smarty_modifiercompiler_strip($params, $compiler)
+{
+ if (!isset($params[1])) {
+ $params[1] = "' '";
+ }
+ return "preg_replace('!\s+!" . Smarty::$_UTF8_MODIFIER . "', {$params[1]},{$params[0]})";
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/modifiercompiler.strip_tags.php b/include/smarty/libs/plugins/modifiercompiler.strip_tags.php
new file mode 100644
index 000000000..9ba71e3d9
--- /dev/null
+++ b/include/smarty/libs/plugins/modifiercompiler.strip_tags.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty strip_tags modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: strip_tags<br>
+ * Purpose: strip html tags from text
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.strip.tags.php strip_tags (Smarty online manual)
+ * @author Uwe Tews
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_strip_tags($params, $compiler)
+{
+ if (!isset($params[1])) {
+ $params[1] = true;
+ }
+ if ($params[1] === true) {
+ return "preg_replace('!<[^>]*?>!', ' ', {$params[0]})";
+ } else {
+ return 'strip_tags(' . $params[0] . ')';
+ }
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/modifiercompiler.to_charset.php b/include/smarty/libs/plugins/modifiercompiler.to_charset.php
new file mode 100644
index 000000000..d6c0f296b
--- /dev/null
+++ b/include/smarty/libs/plugins/modifiercompiler.to_charset.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty to_charset modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: to_charset<br>
+ * Purpose: convert character encoding from internal encoding to $charset
+ *
+ * @author Rodney Rehm
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_to_charset($params, $compiler)
+{
+ if (!Smarty::$_MBSTRING) {
+ // FIXME: (rodneyrehm) shouldn't this throw an error?
+ return $params[0];
+ }
+
+ if (!isset($params[1])) {
+ $params[1] = '"ISO-8859-1"';
+ }
+
+ return 'mb_convert_encoding(' . $params[0] . ', ' . $params[1] . ', "' . addslashes(Smarty::$_CHARSET) . '")';
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/modifiercompiler.unescape.php b/include/smarty/libs/plugins/modifiercompiler.unescape.php
new file mode 100644
index 000000000..61354926f
--- /dev/null
+++ b/include/smarty/libs/plugins/modifiercompiler.unescape.php
@@ -0,0 +1,51 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty unescape modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: unescape<br>
+ * Purpose: unescape html entities
+ *
+ * @author Rodney Rehm
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_unescape($params, $compiler)
+{
+ if (!isset($params[1])) {
+ $params[1] = 'html';
+ }
+ if (!isset($params[2])) {
+ $params[2] = '\'' . addslashes(Smarty::$_CHARSET) . '\'';
+ } else {
+ $params[2] = "'" . $params[2] . "'";
+ }
+
+ switch (trim($params[1], '"\'')) {
+ case 'entity':
+ case 'htmlall':
+ if (Smarty::$_MBSTRING) {
+ return 'mb_convert_encoding(' . $params[0] . ', ' . $params[2] . ', \'HTML-ENTITIES\')';
+ }
+
+ return 'html_entity_decode(' . $params[0] . ', ENT_NOQUOTES, ' . $params[2] . ')';
+
+ case 'html':
+ return 'htmlspecialchars_decode(' . $params[0] . ', ENT_QUOTES)';
+
+ case 'url':
+ return 'rawurldecode(' . $params[0] . ')';
+
+ default:
+ return $params[0];
+ }
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/modifiercompiler.upper.php b/include/smarty/libs/plugins/modifiercompiler.upper.php
new file mode 100644
index 000000000..8611fa870
--- /dev/null
+++ b/include/smarty/libs/plugins/modifiercompiler.upper.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty upper modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: lower<br>
+ * Purpose: convert string to uppercase
+ *
+ * @link http://smarty.php.net/manual/en/language.modifier.upper.php lower (Smarty online manual)
+ * @author Uwe Tews
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_upper($params, $compiler)
+{
+ if (Smarty::$_MBSTRING) {
+ return 'mb_strtoupper(' . $params[0] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')' ;
+ }
+ // no MBString fallback
+ return 'strtoupper(' . $params[0] . ')';
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/modifiercompiler.wordwrap.php b/include/smarty/libs/plugins/modifiercompiler.wordwrap.php
new file mode 100644
index 000000000..8b524f32c
--- /dev/null
+++ b/include/smarty/libs/plugins/modifiercompiler.wordwrap.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty wordwrap modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: wordwrap<br>
+ * Purpose: wrap a string of text at a given length
+ *
+ * @link http://smarty.php.net/manual/en/language.modifier.wordwrap.php wordwrap (Smarty online manual)
+ * @author Uwe Tews
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_wordwrap($params, $compiler)
+{
+ if (!isset($params[1])) {
+ $params[1] = 80;
+ }
+ if (!isset($params[2])) {
+ $params[2] = '"\n"';
+ }
+ if (!isset($params[3])) {
+ $params[3] = 'false';
+ }
+ $function = 'wordwrap';
+ if (Smarty::$_MBSTRING) {
+ if ($compiler->tag_nocache | $compiler->nocache) {
+ $compiler->template->required_plugins['nocache']['wordwrap']['modifier']['file'] = SMARTY_PLUGINS_DIR .'shared.mb_wordwrap.php';
+ $compiler->template->required_plugins['nocache']['wordwrap']['modifier']['function'] = 'smarty_mb_wordwrap';
+ } else {
+ $compiler->template->required_plugins['compiled']['wordwrap']['modifier']['file'] = SMARTY_PLUGINS_DIR .'shared.mb_wordwrap.php';
+ $compiler->template->required_plugins['compiled']['wordwrap']['modifier']['function'] = 'smarty_mb_wordwrap';
+ }
+ $function = 'smarty_mb_wordwrap';
+ }
+ return $function . '(' . $params[0] . ',' . $params[1] . ',' . $params[2] . ',' . $params[3] . ')';
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/outputfilter.trimwhitespace.php b/include/smarty/libs/plugins/outputfilter.trimwhitespace.php
index 739fa39b0..87cf8c781 100644
--- a/include/smarty/libs/plugins/outputfilter.trimwhitespace.php
+++ b/include/smarty/libs/plugins/outputfilter.trimwhitespace.php
@@ -1,75 +1,94 @@
<?php
/**
* Smarty plugin
+ *
* @package Smarty
- * @subpackage plugins
+ * @subpackage PluginsFilter
*/
/**
* Smarty trimwhitespace outputfilter plugin
*
- * File: outputfilter.trimwhitespace.php<br>
- * Type: outputfilter<br>
- * Name: trimwhitespace<br>
- * Date: Jan 25, 2003<br>
- * Purpose: trim leading white space and blank lines from
- * template source after it gets interpreted, cleaning
- * up code and saving bandwidth. Does not affect
- * <<PRE>></PRE> and <SCRIPT></SCRIPT> blocks.<br>
- * Install: Drop into the plugin directory, call
- * <code>$smarty->load_filter('output','trimwhitespace');</code>
- * from application.
- * @author Monte Ohrt <monte at ohrt dot com>
- * @author Contributions from Lars Noschinski <lars@usenet.noschinski.de>
- * @version 1.3
- * @param string
- * @param Smarty
+ * Trim unnecessary whitespace from HTML markup.
+ *
+ * @author Rodney Rehm
+ * @param string $source input string
+ * @param Smarty_Internal_Template $smarty Smarty object
+ * @return string filtered output
+ * @todo substr_replace() is not overloaded by mbstring.func_overload - so this function might fail!
*/
-function smarty_outputfilter_trimwhitespace($source, &$smarty)
+function smarty_outputfilter_trimwhitespace($source, Smarty_Internal_Template $smarty)
{
- // Pull out the script blocks
- preg_match_all("!<script[^>]*?>.*?</script>!is", $source, $match);
- $_script_blocks = $match[0];
- $source = preg_replace("!<script[^>]*?>.*?</script>!is",
- '@@@SMARTY:TRIM:SCRIPT@@@', $source);
+ $store = array();
+ $_store = 0;
+ $_offset = 0;
- // Pull out the pre blocks
- preg_match_all("!<pre[^>]*?>.*?</pre>!is", $source, $match);
- $_pre_blocks = $match[0];
- $source = preg_replace("!<pre[^>]*?>.*?</pre>!is",
- '@@@SMARTY:TRIM:PRE@@@', $source);
-
- // Pull out the textarea blocks
- preg_match_all("!<textarea[^>]*?>.*?</textarea>!is", $source, $match);
- $_textarea_blocks = $match[0];
- $source = preg_replace("!<textarea[^>]*?>.*?</textarea>!is",
- '@@@SMARTY:TRIM:TEXTAREA@@@', $source);
+ // Unify Line-Breaks to \n
+ $source = preg_replace("/\015\012|\015|\012/", "\n", $source);
- // remove all leading spaces, tabs and carriage returns NOT
- // preceeded by a php close tag.
- $source = trim(preg_replace('/((?<!\?>)\n)[\s]+/m', '\1', $source));
+ // capture Internet Explorer Conditional Comments
+ if (preg_match_all('#<!--\[[^\]]+\]>.*?<!\[[^\]]+\]-->#is', $source, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) {
+ foreach ($matches as $match) {
+ $store[] = $match[0][0];
+ $_length = strlen($match[0][0]);
+ $replace = '@!@SMARTY:' . $_store . ':SMARTY@!@';
+ $source = substr_replace($source, $replace, $match[0][1] - $_offset, $_length);
- // replace textarea blocks
- smarty_outputfilter_trimwhitespace_replace("@@@SMARTY:TRIM:TEXTAREA@@@",$_textarea_blocks, $source);
+ $_offset += $_length - strlen($replace);
+ $_store++;
+ }
+ }
- // replace pre blocks
- smarty_outputfilter_trimwhitespace_replace("@@@SMARTY:TRIM:PRE@@@",$_pre_blocks, $source);
+ // Strip all HTML-Comments
+ // yes, even the ones in <script> - see http://stackoverflow.com/a/808850/515124
+ $source = preg_replace( '#<!--.*?-->#ms', '', $source );
- // replace script blocks
- smarty_outputfilter_trimwhitespace_replace("@@@SMARTY:TRIM:SCRIPT@@@",$_script_blocks, $source);
+ // capture html elements not to be messed with
+ $_offset = 0;
+ if (preg_match_all('#<(script|pre|textarea)[^>]*>.*?</\\1>#is', $source, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) {
+ foreach ($matches as $match) {
+ $store[] = $match[0][0];
+ $_length = strlen($match[0][0]);
+ $replace = '@!@SMARTY:' . $_store . ':SMARTY@!@';
+ $source = substr_replace($source, $replace, $match[0][1] - $_offset, $_length);
- return $source;
-}
+ $_offset += $_length - strlen($replace);
+ $_store++;
+ }
+ }
-function smarty_outputfilter_trimwhitespace_replace($search_str, $replace, &$subject) {
- $_len = strlen($search_str);
- $_pos = 0;
- for ($_i=0, $_count=count($replace); $_i<$_count; $_i++)
- if (($_pos=strpos($subject, $search_str, $_pos))!==false)
- $subject = substr_replace($subject, $replace[$_i], $_pos, $_len);
- else
- break;
+ $expressions = array(
+ // replace multiple spaces between tags by a single space
+ // can't remove them entirely, becaue that might break poorly implemented CSS display:inline-block elements
+ '#(:SMARTY@!@|>)\s+(?=@!@SMARTY:|<)#s' => '\1 \2',
+ // remove spaces between attributes (but not in attribute values!)
+ '#(([a-z0-9]\s*=\s*(["\'])[^\3]*?\3)|<[a-z0-9_]+)\s+([a-z/>])#is' => '\1 \4',
+ // note: for some very weird reason trim() seems to remove spaces inside attributes.
+ // maybe a \0 byte or something is interfering?
+ '#^\s+<#Ss' => '<',
+ '#>\s+$#Ss' => '>',
+ );
+ $source = preg_replace( array_keys($expressions), array_values($expressions), $source );
+ // note: for some very weird reason trim() seems to remove spaces inside attributes.
+ // maybe a \0 byte or something is interfering?
+ // $source = trim( $source );
+
+ // capture html elements not to be messed with
+ $_offset = 0;
+ if (preg_match_all('#@!@SMARTY:([0-9]+):SMARTY@!@#is', $source, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) {
+ foreach ($matches as $match) {
+ $store[] = $match[0][0];
+ $_length = strlen($match[0][0]);
+ $replace = array_shift($store);
+ $source = substr_replace($source, $replace, $match[0][1] + $_offset, $_length);
+
+ $_offset += strlen($replace) - $_length;
+ $_store++;
+ }
+ }
+
+ return $source;
}
-?>
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/shared.escape_special_chars.php b/include/smarty/libs/plugins/shared.escape_special_chars.php
index c07ce31be..d2609b674 100644
--- a/include/smarty/libs/plugins/shared.escape_special_chars.php
+++ b/include/smarty/libs/plugins/shared.escape_special_chars.php
@@ -1,31 +1,51 @@
<?php
/**
* Smarty shared plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * escape_special_chars common function
*
- * Function: smarty_function_escape_special_chars<br>
- * Purpose: used by other smarty functions to escape
- * special chars except for already escaped ones
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param string
- * @return string
+ * @package Smarty
+ * @subpackage PluginsShared
*/
-function smarty_function_escape_special_chars($string)
-{
- if(!is_array($string)) {
- $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string);
- $string = htmlspecialchars($string);
- $string = str_replace(array('%%%SMARTY_START%%%','%%%SMARTY_END%%%'), array('&',';'), $string);
- }
- return $string;
-}
-/* vim: set expandtab: */
+if (version_compare(PHP_VERSION, '5.2.3', '>=')) {
+ /**
+ * escape_special_chars common function
+ *
+ * Function: smarty_function_escape_special_chars<br>
+ * Purpose: used by other smarty functions to escape
+ * special chars except for already escaped ones
+ *
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string $string text that should by escaped
+ * @return string
+ */
+ function smarty_function_escape_special_chars($string)
+ {
+ if (!is_array($string)) {
+ $string = htmlspecialchars($string, ENT_COMPAT, Smarty::$_CHARSET, false);
+ }
+ return $string;
+ }
+} else {
+ /**
+ * escape_special_chars common function
+ *
+ * Function: smarty_function_escape_special_chars<br>
+ * Purpose: used by other smarty functions to escape
+ * special chars except for already escaped ones
+ *
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string $string text that should by escaped
+ * @return string
+ */
+ function smarty_function_escape_special_chars($string)
+ {
+ if (!is_array($string)) {
+ $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string);
+ $string = htmlspecialchars($string);
+ $string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string);
+ }
+ return $string;
+ }
+}
-?>
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/shared.literal_compiler_param.php b/include/smarty/libs/plugins/shared.literal_compiler_param.php
new file mode 100644
index 000000000..dbcd9374c
--- /dev/null
+++ b/include/smarty/libs/plugins/shared.literal_compiler_param.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsShared
+ */
+
+/**
+ * evaluate compiler parameter
+ *
+ * @param array $params parameter array as given to the compiler function
+ * @param integer $index array index of the parameter to convert
+ * @param mixed $default value to be returned if the parameter is not present
+ * @return mixed evaluated value of parameter or $default
+ * @throws SmartyException if parameter is not a literal (but an expression, variable, …)
+ * @author Rodney Rehm
+ */
+function smarty_literal_compiler_param($params, $index, $default=null)
+{
+ // not set, go default
+ if (!isset($params[$index])) {
+ return $default;
+ }
+ // test if param is a literal
+ if (!preg_match('/^([\'"]?)[a-zA-Z0-9]+(\\1)$/', $params[$index])) {
+ throw new SmartyException('$param[' . $index . '] is not a literal and is thus not evaluatable at compile time');
+ }
+
+ $t = null;
+ eval("\$t = " . $params[$index] . ";");
+ return $t;
+}
diff --git a/include/smarty/libs/plugins/shared.make_timestamp.php b/include/smarty/libs/plugins/shared.make_timestamp.php
index b42eb11d8..5d7c97e91 100644
--- a/include/smarty/libs/plugins/shared.make_timestamp.php
+++ b/include/smarty/libs/plugins/shared.make_timestamp.php
@@ -1,46 +1,42 @@
<?php
/**
* Smarty shared plugin
+ *
* @package Smarty
- * @subpackage plugins
+ * @subpackage PluginsShared
*/
-
/**
* Function: smarty_make_timestamp<br>
- * Purpose: used by other smarty functions to make a timestamp
- * from a string.
+ * Purpose: used by other smarty functions to make a timestamp from a string.
+ *
* @author Monte Ohrt <monte at ohrt dot com>
- * @param string
- * @return string
+ * @param DateTime|int|string $string date object, timestamp or string that can be converted using strtotime()
+ * @return int
*/
function smarty_make_timestamp($string)
{
- if(empty($string)) {
+ if (empty($string)) {
// use "now":
- $time = time();
-
- } elseif (preg_match('/^\d{14}$/', $string)) {
- // it is mysql timestamp format of YYYYMMDDHHMMSS?
- $time = mktime(substr($string, 8, 2),substr($string, 10, 2),substr($string, 12, 2),
+ return time();
+ } elseif ($string instanceof DateTime) {
+ return $string->getTimestamp();
+ } elseif (strlen($string) == 14 && ctype_digit($string)) {
+ // it is mysql timestamp format of YYYYMMDDHHMMSS?
+ return mktime(substr($string, 8, 2),substr($string, 10, 2),substr($string, 12, 2),
substr($string, 4, 2),substr($string, 6, 2),substr($string, 0, 4));
-
} elseif (is_numeric($string)) {
// it is a numeric string, we handle it as timestamp
- $time = (int)$string;
-
+ return (int) $string;
} else {
// strtotime should handle it
$time = strtotime($string);
if ($time == -1 || $time === false) {
// strtotime() was not able to parse $string, use "now":
- $time = time();
+ return time();
}
+ return $time;
}
- return $time;
-
}
-/* vim: set expandtab: */
-
?>
diff --git a/include/smarty/libs/plugins/shared.mb_str_replace.php b/include/smarty/libs/plugins/shared.mb_str_replace.php
new file mode 100644
index 000000000..ecafeb74a
--- /dev/null
+++ b/include/smarty/libs/plugins/shared.mb_str_replace.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Smarty shared plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsShared
+ */
+if (!function_exists('smarty_mb_str_replace')) {
+
+ /**
+ * Multibyte string replace
+ *
+ * @param string $search the string to be searched
+ * @param string $replace the replacement string
+ * @param string $subject the source string
+ * @param int &$count number of matches found
+ * @return string replaced string
+ * @author Rodney Rehm
+ */
+ function smarty_mb_str_replace($search, $replace, $subject, &$count=0)
+ {
+ if (!is_array($search) && is_array($replace)) {
+ return false;
+ }
+ if (is_array($subject)) {
+ // call mb_replace for each single string in $subject
+ foreach ($subject as &$string) {
+ $string = &smarty_mb_str_replace($search, $replace, $string, $c);
+ $count += $c;
+ }
+ } elseif (is_array($search)) {
+ if (!is_array($replace)) {
+ foreach ($search as &$string) {
+ $subject = smarty_mb_str_replace($string, $replace, $subject, $c);
+ $count += $c;
+ }
+ } else {
+ $n = max(count($search), count($replace));
+ while ($n--) {
+ $subject = smarty_mb_str_replace(current($search), current($replace), $subject, $c);
+ $count += $c;
+ next($search);
+ next($replace);
+ }
+ }
+ } else {
+ $parts = mb_split(preg_quote($search), $subject);
+ $count = count($parts) - 1;
+ $subject = implode($replace, $parts);
+ }
+ return $subject;
+ }
+
+}
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/shared.mb_unicode.php b/include/smarty/libs/plugins/shared.mb_unicode.php
new file mode 100644
index 000000000..e7f839ec8
--- /dev/null
+++ b/include/smarty/libs/plugins/shared.mb_unicode.php
@@ -0,0 +1,48 @@
+<?php
+/**
+ * Smarty shared plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsShared
+ */
+
+/**
+ * convert characters to their decimal unicode equivalents
+ *
+ * @link http://www.ibm.com/developerworks/library/os-php-unicode/index.html#listing3 for inspiration
+ * @param string $string characters to calculate unicode of
+ * @param string $encoding encoding of $string, if null mb_internal_encoding() is used
+ * @return array sequence of unicodes
+ * @author Rodney Rehm
+ */
+function smarty_mb_to_unicode($string, $encoding=null) {
+ if ($encoding) {
+ $expanded = mb_convert_encoding($string, "UTF-32BE", $encoding);
+ } else {
+ $expanded = mb_convert_encoding($string, "UTF-32BE");
+ }
+ return unpack("N*", $expanded);
+}
+
+/**
+ * convert unicodes to the character of given encoding
+ *
+ * @link http://www.ibm.com/developerworks/library/os-php-unicode/index.html#listing3 for inspiration
+ * @param integer|array $unicode single unicode or list of unicodes to convert
+ * @param string $encoding encoding of returned string, if null mb_internal_encoding() is used
+ * @return string unicode as character sequence in given $encoding
+ * @author Rodney Rehm
+ */
+function smarty_mb_from_unicode($unicode, $encoding=null) {
+ $t = '';
+ if (!$encoding) {
+ $encoding = mb_internal_encoding();
+ }
+ foreach((array) $unicode as $utf32be) {
+ $character = pack("N*", $utf32be);
+ $t .= mb_convert_encoding($character, $encoding, "UTF-32BE");
+ }
+ return $t;
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/shared.mb_wordwrap.php b/include/smarty/libs/plugins/shared.mb_wordwrap.php
new file mode 100644
index 000000000..ba3498c70
--- /dev/null
+++ b/include/smarty/libs/plugins/shared.mb_wordwrap.php
@@ -0,0 +1,83 @@
+<?php
+/**
+ * Smarty shared plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsShared
+ */
+
+if(!function_exists('smarty_mb_wordwrap')) {
+
+ /**
+ * Wrap a string to a given number of characters
+ *
+ * @link http://php.net/manual/en/function.wordwrap.php for similarity
+ * @param string $str the string to wrap
+ * @param int $width the width of the output
+ * @param string $break the character used to break the line
+ * @param boolean $cut ignored parameter, just for the sake of
+ * @return string wrapped string
+ * @author Rodney Rehm
+ */
+ function smarty_mb_wordwrap($str, $width=75, $break="\n", $cut=false)
+ {
+ // break words into tokens using white space as a delimiter
+ $tokens = preg_split('!(\s)!S' . Smarty::$_UTF8_MODIFIER, $str, -1, PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE);
+ $length = 0;
+ $t = '';
+ $_previous = false;
+
+ foreach ($tokens as $_token) {
+ $token_length = mb_strlen($_token, Smarty::$_CHARSET);
+ $_tokens = array($_token);
+ if ($token_length > $width) {
+ // remove last space
+ $t = mb_substr($t, 0, -1, Smarty::$_CHARSET);
+ $_previous = false;
+ $length = 0;
+
+ if ($cut) {
+ $_tokens = preg_split('!(.{' . $width . '})!S' . Smarty::$_UTF8_MODIFIER, $_token, -1, PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE);
+ // broken words go on a new line
+ $t .= $break;
+ }
+ }
+
+ foreach ($_tokens as $token) {
+ $_space = !!preg_match('!^\s$!S' . Smarty::$_UTF8_MODIFIER, $token);
+ $token_length = mb_strlen($token, Smarty::$_CHARSET);
+ $length += $token_length;
+
+ if ($length > $width) {
+ // remove space before inserted break
+ if ($_previous && $token_length < $width) {
+ $t = mb_substr($t, 0, -1, Smarty::$_CHARSET);
+ }
+
+ // add the break before the token
+ $t .= $break;
+ $length = $token_length;
+
+ // skip space after inserting a break
+ if ($_space) {
+ $length = 0;
+ continue;
+ }
+ } else if ($token == "\n") {
+ // hard break must reset counters
+ $_previous = 0;
+ $length = 0;
+ } else {
+ // remember if we had a space or not
+ $_previous = $_space;
+ }
+ // add the token
+ $t .= $token;
+ }
+ }
+
+ return $t;
+ }
+
+}
+?> \ No newline at end of file
diff --git a/include/smarty/libs/plugins/variablefilter.htmlspecialchars.php b/include/smarty/libs/plugins/variablefilter.htmlspecialchars.php
new file mode 100644
index 000000000..aff711e48
--- /dev/null
+++ b/include/smarty/libs/plugins/variablefilter.htmlspecialchars.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsFilter
+ */
+
+/**
+ * Smarty htmlspecialchars variablefilter plugin
+ *
+ * @param string $source input string
+ * @param Smarty_Internal_Template $smarty Smarty object
+ * @return string filtered output
+ */
+function smarty_variablefilter_htmlspecialchars($source, $smarty)
+{
+ return htmlspecialchars($source, ENT_QUOTES, Smarty::$_CHARSET);
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_cacheresource.php b/include/smarty/libs/sysplugins/smarty_cacheresource.php
new file mode 100644
index 000000000..ca18add5e
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_cacheresource.php
@@ -0,0 +1,381 @@
+<?php
+/**
+* Smarty Internal Plugin
+*
+* @package Smarty
+* @subpackage Cacher
+*/
+
+/**
+* Cache Handler API
+*
+* @package Smarty
+* @subpackage Cacher
+* @author Rodney Rehm
+*/
+abstract class Smarty_CacheResource {
+ /**
+ * cache for Smarty_CacheResource instances
+ * @var array
+ */
+ public static $resources = array();
+
+ /**
+ * resource types provided by the core
+ * @var array
+ */
+ protected static $sysplugins = array(
+ 'file' => true,
+ );
+
+ /**
+ * populate Cached Object with meta data from Resource
+ *
+ * @param Smarty_Template_Cached $cached cached object
+ * @param Smarty_Internal_Template $_template template object
+ * @return void
+ */
+ public abstract function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template);
+
+ /**
+ * populate Cached Object with timestamp and exists from Resource
+ *
+ * @param Smarty_Template_Cached $source cached object
+ * @return void
+ */
+ public abstract function populateTimestamp(Smarty_Template_Cached $cached);
+
+ /**
+ * Read the cached template and process header
+ *
+ * @param Smarty_Internal_Template $_template template object
+ * @param Smarty_Template_Cached $cached cached object
+ * @return booelan true or false if the cached content does not exist
+ */
+ public abstract function process(Smarty_Internal_Template $_template, Smarty_Template_Cached $cached=null);
+
+ /**
+ * Write the rendered template output to cache
+ *
+ * @param Smarty_Internal_Template $_template template object
+ * @param string $content content to cache
+ * @return boolean success
+ */
+ public abstract function writeCachedContent(Smarty_Internal_Template $_template, $content);
+
+ /**
+ * Return cached content
+ *
+ * @param Smarty_Internal_Template $_template template object
+ * @param string $content content of cache
+ */
+ public function getCachedContent(Smarty_Internal_Template $_template)
+ {
+ if ($_template->cached->handler->process($_template)) {
+ ob_start();
+ $_template->properties['unifunc']($_template);
+ return ob_get_clean();
+ }
+ return null;
+ }
+
+ /**
+ * Empty cache
+ *
+ * @param Smarty $smarty Smarty object
+ * @param integer $exp_time expiration time (number of seconds, not timestamp)
+ * @return integer number of cache files deleted
+ */
+ public abstract function clearAll(Smarty $smarty, $exp_time=null);
+
+ /**
+ * Empty cache for a specific template
+ *
+ * @param Smarty $smarty Smarty object
+ * @param string $resource_name template name
+ * @param string $cache_id cache id
+ * @param string $compile_id compile id
+ * @param integer $exp_time expiration time (number of seconds, not timestamp)
+ * @return integer number of cache files deleted
+ */
+ public abstract function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time);
+
+
+ public function locked(Smarty $smarty, Smarty_Template_Cached $cached)
+ {
+ // theoretically locking_timeout should be checked against time_limit (max_execution_time)
+ $start = microtime(true);
+ $hadLock = null;
+ while ($this->hasLock($smarty, $cached)) {
+ $hadLock = true;
+ if (microtime(true) - $start > $smarty->locking_timeout) {
+ // abort waiting for lock release
+ return false;
+ }
+ sleep(1);
+ }
+ return $hadLock;
+ }
+
+ public function hasLock(Smarty $smarty, Smarty_Template_Cached $cached)
+ {
+ // check if lock exists
+ return false;
+ }
+
+ public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached)
+ {
+ // create lock
+ return true;
+ }
+
+ public function releaseLock(Smarty $smarty, Smarty_Template_Cached $cached)
+ {
+ // release lock
+ return true;
+ }
+
+
+ /**
+ * Load Cache Resource Handler
+ *
+ * @param Smarty $smarty Smarty object
+ * @param string $type name of the cache resource
+ * @return Smarty_CacheResource Cache Resource Handler
+ */
+ public static function load(Smarty $smarty, $type = null)
+ {
+ if (!isset($type)) {
+ $type = $smarty->caching_type;
+ }
+
+ // try smarty's cache
+ if (isset($smarty->_cacheresource_handlers[$type])) {
+ return $smarty->_cacheresource_handlers[$type];
+ }
+
+ // try registered resource
+ if (isset($smarty->registered_cache_resources[$type])) {
+ // do not cache these instances as they may vary from instance to instance
+ return $smarty->_cacheresource_handlers[$type] = $smarty->registered_cache_resources[$type];
+ }
+ // try sysplugins dir
+ if (isset(self::$sysplugins[$type])) {
+ if (!isset(self::$resources[$type])) {
+ $cache_resource_class = 'Smarty_Internal_CacheResource_' . ucfirst($type);
+ self::$resources[$type] = new $cache_resource_class();
+ }
+ return $smarty->_cacheresource_handlers[$type] = self::$resources[$type];
+ }
+ // try plugins dir
+ $cache_resource_class = 'Smarty_CacheResource_' . ucfirst($type);
+ if ($smarty->loadPlugin($cache_resource_class)) {
+ if (!isset(self::$resources[$type])) {
+ self::$resources[$type] = new $cache_resource_class();
+ }
+ return $smarty->_cacheresource_handlers[$type] = self::$resources[$type];
+ }
+ // give up
+ throw new SmartyException("Unable to load cache resource '{$type}'");
+ }
+
+ /**
+ * Invalid Loaded Cache Files
+ *
+ * @param Smarty $smarty Smarty object
+ */
+ public static function invalidLoadedCache(Smarty $smarty)
+ {
+ foreach ($smarty->template_objects as $tpl) {
+ if (isset($tpl->cached)) {
+ $tpl->cached->valid = false;
+ $tpl->cached->processed = false;
+ }
+ }
+ }
+}
+
+/**
+* Smarty Resource Data Object
+*
+* Cache Data Container for Template Files
+*
+* @package Smarty
+* @subpackage TemplateResources
+* @author Rodney Rehm
+*/
+class Smarty_Template_Cached {
+ /**
+ * Source Filepath
+ * @var string
+ */
+ public $filepath = false;
+
+ /**
+ * Source Content
+ * @var string
+ */
+ public $content = null;
+
+ /**
+ * Source Timestamp
+ * @var integer
+ */
+ public $timestamp = false;
+
+ /**
+ * Source Existance
+ * @var boolean
+ */
+ public $exists = false;
+
+ /**
+ * Cache Is Valid
+ * @var boolean
+ */
+ public $valid = false;
+
+ /**
+ * Cache was processed
+ * @var boolean
+ */
+ public $processed = false;
+
+ /**
+ * CacheResource Handler
+ * @var Smarty_CacheResource
+ */
+ public $handler = null;
+
+ /**
+ * Template Compile Id (Smarty_Internal_Template::$compile_id)
+ * @var string
+ */
+ public $compile_id = null;
+
+ /**
+ * Template Cache Id (Smarty_Internal_Template::$cache_id)
+ * @var string
+ */
+ public $cache_id = null;
+
+ /**
+ * Id for cache locking
+ * @var string
+ */
+ public $lock_id = null;
+
+ /**
+ * flag that cache is locked by this instance
+ * @var bool
+ */
+ public $is_locked = false;
+
+ /**
+ * Source Object
+ * @var Smarty_Template_Source
+ */
+ public $source = null;
+
+ /**
+ * create Cached Object container
+ *
+ * @param Smarty_Internal_Template $_template template object
+ */
+ public function __construct(Smarty_Internal_Template $_template)
+ {
+ $this->compile_id = $_template->compile_id;
+ $this->cache_id = $_template->cache_id;
+ $this->source = $_template->source;
+ $_template->cached = $this;
+ $smarty = $_template->smarty;
+
+ //
+ // load resource handler
+ //
+ $this->handler = $handler = Smarty_CacheResource::load($smarty); // Note: prone to circular references
+
+ //
+ // check if cache is valid
+ //
+ if (!($_template->caching == Smarty::CACHING_LIFETIME_CURRENT || $_template->caching == Smarty::CACHING_LIFETIME_SAVED) || $_template->source->recompiled) {
+ $handler->populate($this, $_template);
+ return;
+ }
+ while (true) {
+ while (true) {
+ $handler->populate($this, $_template);
+ if ($this->timestamp === false || $smarty->force_compile || $smarty->force_cache) {
+ $this->valid = false;
+ } else {
+ $this->valid = true;
+ }
+ if ($this->valid && $_template->caching == Smarty::CACHING_LIFETIME_CURRENT && $_template->cache_lifetime >= 0 && time() > ($this->timestamp + $_template->cache_lifetime)) {
+ // lifetime expired
+ $this->valid = false;
+ }
+ if ($this->valid || !$_template->smarty->cache_locking) {
+ break;
+ }
+ if (!$this->handler->locked($_template->smarty, $this)) {
+ $this->handler->acquireLock($_template->smarty, $this);
+ break 2;
+ }
+ }
+ if ($this->valid) {
+ if (!$_template->smarty->cache_locking || $this->handler->locked($_template->smarty, $this) === null) {
+ // load cache file for the following checks
+ if ($smarty->debugging) {
+ Smarty_Internal_Debug::start_cache($_template);
+ }
+ if($handler->process($_template, $this) === false) {
+ $this->valid = false;
+ } else {
+ $this->processed = true;
+ }
+ if ($smarty->debugging) {
+ Smarty_Internal_Debug::end_cache($_template);
+ }
+ } else {
+ continue;
+ }
+ } else {
+ return;
+ }
+ if ($this->valid && $_template->caching === Smarty::CACHING_LIFETIME_SAVED && $_template->properties['cache_lifetime'] >= 0 && (time() > ($_template->cached->timestamp + $_template->properties['cache_lifetime']))) {
+ $this->valid = false;
+ }
+ if (!$this->valid && $_template->smarty->cache_locking) {
+ $this->handler->acquireLock($_template->smarty, $this);
+ return;
+ } else {
+ return;
+ }
+ }
+ }
+
+ /**
+ * Write this cache object to handler
+ *
+ * @param Smarty_Internal_Template $_template template object
+ * @param string $content content to cache
+ * @return boolean success
+ */
+ public function write(Smarty_Internal_Template $_template, $content)
+ {
+ if (!$_template->source->recompiled) {
+ if ($this->handler->writeCachedContent($_template, $content)) {
+ $this->timestamp = time();
+ $this->exists = true;
+ $this->valid = true;
+ if ($_template->smarty->cache_locking) {
+ $this->handler->releaseLock($_template->smarty, $this);
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_cacheresource_custom.php b/include/smarty/libs/sysplugins/smarty_cacheresource_custom.php
new file mode 100644
index 000000000..ee9de157b
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_cacheresource_custom.php
@@ -0,0 +1,237 @@
+<?php
+/**
+ * Smarty Internal Plugin
+ *
+ * @package Smarty
+ * @subpackage Cacher
+ */
+
+/**
+ * Cache Handler API
+ *
+ * @package Smarty
+ * @subpackage Cacher
+ * @author Rodney Rehm
+ */
+abstract class Smarty_CacheResource_Custom extends Smarty_CacheResource {
+
+ /**
+ * fetch cached content and its modification time from data source
+ *
+ * @param string $id unique cache content identifier
+ * @param string $name template name
+ * @param string $cache_id cache id
+ * @param string $compile_id compile id
+ * @param string $content cached content
+ * @param integer $mtime cache modification timestamp (epoch)
+ * @return void
+ */
+ protected abstract function fetch($id, $name, $cache_id, $compile_id, &$content, &$mtime);
+
+ /**
+ * Fetch cached content's modification timestamp from data source
+ *
+ * {@internal implementing this method is optional.
+ * Only implement it if modification times can be accessed faster than loading the complete cached content.}}
+ *
+ * @param string $id unique cache content identifier
+ * @param string $name template name
+ * @param string $cache_id cache id
+ * @param string $compile_id compile id
+ * @return integer|boolean timestamp (epoch) the template was modified, or false if not found
+ */
+ protected function fetchTimestamp($id, $name, $cache_id, $compile_id)
+ {
+ return null;
+ }
+
+ /**
+ * Save content to cache
+ *
+ * @param string $id unique cache content identifier
+ * @param string $name template name
+ * @param string $cache_id cache id
+ * @param string $compile_id compile id
+ * @param integer|null $exp_time seconds till expiration or null
+ * @param string $content content to cache
+ * @return boolean success
+ */
+ protected abstract function save($id, $name, $cache_id, $compile_id, $exp_time, $content);
+
+ /**
+ * Delete content from cache
+ *
+ * @param string $name template name
+ * @param string $cache_id cache id
+ * @param string $compile_id compile id
+ * @param integer|null $exp_time seconds till expiration time in seconds or null
+ * @return integer number of deleted caches
+ */
+ protected abstract function delete($name, $cache_id, $compile_id, $exp_time);
+
+ /**
+ * populate Cached Object with meta data from Resource
+ *
+ * @param Smarty_Template_Cached $cached cached object
+ * @param Smarty_Internal_Template $_template template object
+ * @return void
+ */
+ public function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template)
+ {
+ $_cache_id = isset($cached->cache_id) ? preg_replace('![^\w\|]+!', '_', $cached->cache_id) : null;
+ $_compile_id = isset($cached->compile_id) ? preg_replace('![^\w\|]+!', '_', $cached->compile_id) : null;
+
+ $cached->filepath = sha1($cached->source->filepath . $_cache_id . $_compile_id);
+ $this->populateTimestamp($cached);
+ }
+
+ /**
+ * populate Cached Object with timestamp and exists from Resource
+ *
+ * @param Smarty_Template_Cached $source cached object
+ * @return void
+ */
+ public function populateTimestamp(Smarty_Template_Cached $cached)
+ {
+ $mtime = $this->fetchTimestamp($cached->filepath, $cached->source->name, $cached->cache_id, $cached->compile_id);
+ if ($mtime !== null) {
+ $cached->timestamp = $mtime;
+ $cached->exists = !!$cached->timestamp;
+ return;
+ }
+ $timestamp = null;
+ $this->fetch($cached->filepath, $cached->source->name, $cached->cache_id, $cached->compile_id, $cached->content, $timestamp);
+ $cached->timestamp = isset($timestamp) ? $timestamp : false;
+ $cached->exists = !!$cached->timestamp;
+ }
+
+ /**
+ * Read the cached template and process the header
+ *
+ * @param Smarty_Internal_Template $_template template object
+ * @param Smarty_Template_Cached $cached cached object
+ * @return booelan true or false if the cached content does not exist
+ */
+ public function process(Smarty_Internal_Template $_template, Smarty_Template_Cached $cached=null)
+ {
+ if (!$cached) {
+ $cached = $_template->cached;
+ }
+ $content = $cached->content ? $cached->content : null;
+ $timestamp = $cached->timestamp ? $cached->timestamp : null;
+ if ($content === null || !$timestamp) {
+ $this->fetch(
+ $_template->cached->filepath,
+ $_template->source->name,
+ $_template->cache_id,
+ $_template->compile_id,
+ $content,
+ $timestamp
+ );
+ }
+ if (isset($content)) {
+ $_smarty_tpl = $_template;
+ eval("?>" . $content);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Write the rendered template output to cache
+ *
+ * @param Smarty_Internal_Template $_template template object
+ * @param string $content content to cache
+ * @return boolean success
+ */
+ public function writeCachedContent(Smarty_Internal_Template $_template, $content)
+ {
+ return $this->save(
+ $_template->cached->filepath,
+ $_template->source->name,
+ $_template->cache_id,
+ $_template->compile_id,
+ $_template->properties['cache_lifetime'],
+ $content
+ );
+ }
+
+ /**
+ * Empty cache
+ *
+ * @param Smarty $smarty Smarty object
+ * @param integer $exp_time expiration time (number of seconds, not timestamp)
+ * @return integer number of cache files deleted
+ */
+ public function clearAll(Smarty $smarty, $exp_time=null)
+ {
+ $this->cache = array();
+ return $this->delete(null, null, null, $exp_time);
+ }
+
+ /**
+ * Empty cache for a specific template
+ *
+ * @param Smarty $smarty Smarty object
+ * @param string $resource_name template name
+ * @param string $cache_id cache id
+ * @param string $compile_id compile id
+ * @param integer $exp_time expiration time (number of seconds, not timestamp)
+ * @return integer number of cache files deleted
+ */
+ public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time)
+ {
+ $this->cache = array();
+ return $this->delete($resource_name, $cache_id, $compile_id, $exp_time);
+ }
+
+ /**
+ * Check is cache is locked for this template
+ *
+ * @param Smarty $smarty Smarty object
+ * @param Smarty_Template_Cached $cached cached object
+ * @return booelan true or false if cache is locked
+ */
+ public function hasLock(Smarty $smarty, Smarty_Template_Cached $cached)
+ {
+ $id = $cached->filepath;
+ $name = $cached->source->name . '.lock';
+
+ $mtime = $this->fetchTimestamp($id, $name, null, null);
+ if ($mtime === null) {
+ $this->fetch($id, $name, null, null, $content, $mtime);
+ }
+
+ return $mtime && time() - $mtime < $smarty->locking_timeout;
+ }
+
+ /**
+ * Lock cache for this template
+ *
+ * @param Smarty $smarty Smarty object
+ * @param Smarty_Template_Cached $cached cached object
+ */
+ public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached)
+ {
+ $cached->is_locked = true;
+
+ $id = $cached->filepath;
+ $name = $cached->source->name . '.lock';
+ $this->save($id, $name, null, null, $smarty->locking_timeout, '');
+ }
+
+ /**
+ * Unlock cache for this template
+ *
+ * @param Smarty $smarty Smarty object
+ * @param Smarty_Template_Cached $cached cached object
+ */
+ public function releaseLock(Smarty $smarty, Smarty_Template_Cached $cached)
+ {
+ $cached->is_locked = false;
+
+ $name = $cached->source->name . '.lock';
+ $this->delete($name, null, null, null);
+ }
+}
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_cacheresource_keyvaluestore.php b/include/smarty/libs/sysplugins/smarty_cacheresource_keyvaluestore.php
new file mode 100644
index 000000000..dff9b65aa
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_cacheresource_keyvaluestore.php
@@ -0,0 +1,463 @@
+<?php
+/**
+ * Smarty Internal Plugin
+ *
+ * @package Smarty
+ * @subpackage Cacher
+ */
+
+/**
+ * Smarty Cache Handler Base for Key/Value Storage Implementations
+ *
+ * This class implements the functionality required to use simple key/value stores
+ * for hierarchical cache groups. key/value stores like memcache or APC do not support
+ * wildcards in keys, therefore a cache group cannot be cleared like "a|*" - which
+ * is no problem to filesystem and RDBMS implementations.
+ *
+ * This implementation is based on the concept of invalidation. While one specific cache
+ * can be identified and cleared, any range of caches cannot be identified. For this reason
+ * each level of the cache group hierarchy can have its own value in the store. These values
+ * are nothing but microtimes, telling us when a particular cache group was cleared for the
+ * last time. These keys are evaluated for every cache read to determine if the cache has
+ * been invalidated since it was created and should hence be treated as inexistent.
+ *
+ * Although deep hierarchies are possible, they are not recommended. Try to keep your
+ * cache groups as shallow as possible. Anything up 3-5 parents should be ok. So
+ * »a|b|c« is a good depth where »a|b|c|d|e|f|g|h|i|j|k« isn't. Try to join correlating
+ * cache groups: if your cache groups look somewhat like »a|b|$page|$items|$whatever«
+ * consider using »a|b|c|$page-$items-$whatever« instead.
+ *
+ * @package Smarty
+ * @subpackage Cacher
+ * @author Rodney Rehm
+ */
+abstract class Smarty_CacheResource_KeyValueStore extends Smarty_CacheResource {
+
+ /**
+ * cache for contents
+ * @var array
+ */
+ protected $contents = array();
+ /**
+ * cache for timestamps
+ * @var array
+ */
+ protected $timestamps = array();
+
+ /**
+ * populate Cached Object with meta data from Resource
+ *
+ * @param Smarty_Template_Cached $cached cached object
+ * @param Smarty_Internal_Template $_template template object
+ * @return void
+ */
+ public function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template)
+ {
+ $cached->filepath = $_template->source->uid
+ . '#' . $this->sanitize($cached->source->name)
+ . '#' . $this->sanitize($cached->cache_id)
+ . '#' . $this->sanitize($cached->compile_id);
+
+ $this->populateTimestamp($cached);
+ }
+
+ /**
+ * populate Cached Object with timestamp and exists from Resource
+ *
+ * @param Smarty_Template_Cached $cached cached object
+ * @return void
+ */
+ public function populateTimestamp(Smarty_Template_Cached $cached)
+ {
+ if (!$this->fetch($cached->filepath, $cached->source->name, $cached->cache_id, $cached->compile_id, $content, $timestamp, $cached->source->uid)) {
+ return;
+ }
+ $cached->content = $content;
+ $cached->timestamp = (int) $timestamp;
+ $cached->exists = $cached->timestamp;
+ }
+
+ /**
+ * Read the cached template and process the header
+ *
+ * @param Smarty_Internal_Template $_template template object
+ * @param Smarty_Template_Cached $cached cached object
+ * @return booelan true or false if the cached content does not exist
+ */
+ public function process(Smarty_Internal_Template $_template, Smarty_Template_Cached $cached=null)
+ {
+ if (!$cached) {
+ $cached = $_template->cached;
+ }
+ $content = $cached->content ? $cached->content : null;
+ $timestamp = $cached->timestamp ? $cached->timestamp : null;
+ if ($content === null || !$timestamp) {
+ if (!$this->fetch($_template->cached->filepath, $_template->source->name, $_template->cache_id, $_template->compile_id, $content, $timestamp, $_template->source->uid)) {
+ return false;
+ }
+ }
+ if (isset($content)) {
+ $_smarty_tpl = $_template;
+ eval("?>" . $content);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Write the rendered template output to cache
+ *
+ * @param Smarty_Internal_Template $_template template object
+ * @param string $content content to cache
+ * @return boolean success
+ */
+ public function writeCachedContent(Smarty_Internal_Template $_template, $content)
+ {
+ $this->addMetaTimestamp($content);
+ return $this->write(array($_template->cached->filepath => $content), $_template->properties['cache_lifetime']);
+ }
+
+ /**
+ * Empty cache
+ *
+ * {@internal the $exp_time argument is ignored altogether }}
+ *
+ * @param Smarty $smarty Smarty object
+ * @param integer $exp_time expiration time [being ignored]
+ * @return integer number of cache files deleted [always -1]
+ * @uses purge() to clear the whole store
+ * @uses invalidate() to mark everything outdated if purge() is inapplicable
+ */
+ public function clearAll(Smarty $smarty, $exp_time=null)
+ {
+ if (!$this->purge()) {
+ $this->invalidate(null);
+ }
+ return -1;
+ }
+
+ /**
+ * Empty cache for a specific template
+ *
+ * {@internal the $exp_time argument is ignored altogether}}
+ *
+ * @param Smarty $smarty Smarty object
+ * @param string $resource_name template name
+ * @param string $cache_id cache id
+ * @param string $compile_id compile id
+ * @param integer $exp_time expiration time [being ignored]
+ * @return integer number of cache files deleted [always -1]
+ * @uses buildCachedFilepath() to generate the CacheID
+ * @uses invalidate() to mark CacheIDs parent chain as outdated
+ * @uses delete() to remove CacheID from cache
+ */
+ public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time)
+ {
+ $uid = $this->getTemplateUid($smarty, $resource_name, $cache_id, $compile_id);
+ $cid = $uid . '#' . $this->sanitize($resource_name) . '#' . $this->sanitize($cache_id) . '#' . $this->sanitize($compile_id);
+ $this->delete(array($cid));
+ $this->invalidate($cid, $resource_name, $cache_id, $compile_id, $uid);
+ return -1;
+ }
+ /**
+ * Get template's unique ID
+ *
+ * @param Smarty $smarty Smarty object
+ * @param string $resource_name template name
+ * @param string $cache_id cache id
+ * @param string $compile_id compile id
+ * @return string filepath of cache file
+ */
+ protected function getTemplateUid(Smarty $smarty, $resource_name, $cache_id, $compile_id)
+ {
+ $uid = '';
+ if (isset($resource_name)) {
+ $tpl = new $smarty->template_class($resource_name, $smarty);
+ if ($tpl->source->exists) {
+ $uid = $tpl->source->uid;
+ }
+
+ // remove from template cache
+ if ($smarty->allow_ambiguous_resources) {
+ $_templateId = $tpl->source->unique_resource . $tpl->cache_id . $tpl->compile_id;
+ } else {
+ $_templateId = $smarty->joined_template_dir . '#' . $resource_name . $tpl->cache_id . $tpl->compile_id;
+ }
+ if (isset($_templateId[150])) {
+ $_templateId = sha1($_templateId);
+ }
+ unset($smarty->template_objects[$_templateId]);
+ }
+ return $uid;
+ }
+
+ /**
+ * Sanitize CacheID components
+ *
+ * @param string $string CacheID component to sanitize
+ * @return string sanitized CacheID component
+ */
+ protected function sanitize($string)
+ {
+ // some poeple smoke bad weed
+ $string = trim($string, '|');
+ if (!$string) {
+ return null;
+ }
+ return preg_replace('#[^\w\|]+#S', '_', $string);
+ }
+
+ /**
+ * Fetch and prepare a cache object.
+ *
+ * @param string $cid CacheID to fetch
+ * @param string $resource_name template name
+ * @param string $cache_id cache id
+ * @param string $compile_id compile id
+ * @param string $content cached content
+ * @param integer &$timestamp cached timestamp (epoch)
+ * @param string $resource_uid resource's uid
+ * @return boolean success
+ */
+ protected function fetch($cid, $resource_name = null, $cache_id = null, $compile_id = null, &$content = null, &$timestamp = null, $resource_uid = null)
+ {
+ $t = $this->read(array($cid));
+ $content = !empty($t[$cid]) ? $t[$cid] : null;
+ $timestamp = null;
+
+ if ($content && ($timestamp = $this->getMetaTimestamp($content))) {
+ $invalidated = $this->getLatestInvalidationTimestamp($cid, $resource_name, $cache_id, $compile_id, $resource_uid);
+ if ($invalidated > $timestamp) {
+ $timestamp = null;
+ $content = null;
+ }
+ }
+
+ return !!$content;
+ }
+
+ /**
+ * Add current microtime to the beginning of $cache_content
+ *
+ * {@internal the header uses 8 Bytes, the first 4 Bytes are the seconds, the second 4 Bytes are the microseconds}}
+ *
+ * @param string &$content the content to be cached
+ */
+ protected function addMetaTimestamp(&$content)
+ {
+ $mt = explode(" ", microtime());
+ $ts = pack("NN", $mt[1], (int) ($mt[0] * 100000000));
+ $content = $ts . $content;
+ }
+
+ /**
+ * Extract the timestamp the $content was cached
+ *
+ * @param string &$content the cached content
+ * @return float the microtime the content was cached
+ */
+ protected function getMetaTimestamp(&$content)
+ {
+ $s = unpack("N", substr($content, 0, 4));
+ $m = unpack("N", substr($content, 4, 4));
+ $content = substr($content, 8);
+ return $s[1] + ($m[1] / 100000000);
+ }
+
+ /**
+ * Invalidate CacheID
+ *
+ * @param string $cid CacheID
+ * @param string $resource_name template name
+ * @param string $cache_id cache id
+ * @param string $compile_id compile id
+ * @param string $resource_uid source's uid
+ * @return void
+ */
+ protected function invalidate($cid = null, $resource_name = null, $cache_id = null, $compile_id = null, $resource_uid = null)
+ {
+ $now = microtime(true);
+ $key = null;
+ // invalidate everything
+ if (!$resource_name && !$cache_id && !$compile_id) {
+ $key = 'IVK#ALL';
+ }
+ // invalidate all caches by template
+ else if ($resource_name && !$cache_id && !$compile_id) {
+ $key = 'IVK#TEMPLATE#' . $resource_uid . '#' . $this->sanitize($resource_name);
+ }
+ // invalidate all caches by cache group
+ else if (!$resource_name && $cache_id && !$compile_id) {
+ $key = 'IVK#CACHE#' . $this->sanitize($cache_id);
+ }
+ // invalidate all caches by compile id
+ else if (!$resource_name && !$cache_id && $compile_id) {
+ $key = 'IVK#COMPILE#' . $this->sanitize($compile_id);
+ }
+ // invalidate by combination
+ else {
+ $key = 'IVK#CID#' . $cid;
+ }
+ $this->write(array($key => $now));
+ }
+
+ /**
+ * Determine the latest timestamp known to the invalidation chain
+ *
+ * @param string $cid CacheID to determine latest invalidation timestamp of
+ * @param string $resource_name template name
+ * @param string $cache_id cache id
+ * @param string $compile_id compile id
+ * @param string $resource_uid source's filepath
+ * @return float the microtime the CacheID was invalidated
+ */
+ protected function getLatestInvalidationTimestamp($cid, $resource_name = null, $cache_id = null, $compile_id = null, $resource_uid = null)
+ {
+ // abort if there is no CacheID
+ if (false && !$cid) {
+ return 0;
+ }
+ // abort if there are no InvalidationKeys to check
+ if (!($_cid = $this->listInvalidationKeys($cid, $resource_name, $cache_id, $compile_id, $resource_uid))) {
+ return 0;
+ }
+
+ // there are no InValidationKeys
+ if (!($values = $this->read($_cid))) {
+ return 0;
+ }
+ // make sure we're dealing with floats
+ $values = array_map('floatval', $values);
+ return max($values);
+ }
+
+ /**
+ * Translate a CacheID into the list of applicable InvalidationKeys.
+ *
+ * Splits "some|chain|into|an|array" into array( '#clearAll#', 'some', 'some|chain', 'some|chain|into', ... )
+ *
+ * @param string $cid CacheID to translate
+ * @param string $resource_name template name
+ * @param string $cache_id cache id
+ * @param string $compile_id compile id
+ * @param string $resource_uid source's filepath
+ * @return array list of InvalidationKeys
+ * @uses $invalidationKeyPrefix to prepend to each InvalidationKey
+ */
+ protected function listInvalidationKeys($cid, $resource_name = null, $cache_id = null, $compile_id = null, $resource_uid = null)
+ {
+ $t = array('IVK#ALL');
+ $_name = $_compile = '#';
+ if ($resource_name) {
+ $_name .= $resource_uid . '#' . $this->sanitize($resource_name);
+ $t[] = 'IVK#TEMPLATE' . $_name;
+ }
+ if ($compile_id) {
+ $_compile .= $this->sanitize($compile_id);
+ $t[] = 'IVK#COMPILE' . $_compile;
+ }
+ $_name .= '#';
+ // some poeple smoke bad weed
+ $cid = trim($cache_id, '|');
+ if (!$cid) {
+ return $t;
+ }
+ $i = 0;
+ while (true) {
+ // determine next delimiter position
+ $i = strpos($cid, '|', $i);
+ // add complete CacheID if there are no more delimiters
+ if ($i === false) {
+ $t[] = 'IVK#CACHE#' . $cid;
+ $t[] = 'IVK#CID' . $_name . $cid . $_compile;
+ $t[] = 'IVK#CID' . $_name . $_compile;
+ break;
+ }
+ $part = substr($cid, 0, $i);
+ // add slice to list
+ $t[] = 'IVK#CACHE#' . $part;
+ $t[] = 'IVK#CID' . $_name . $part . $_compile;
+ // skip past delimiter position
+ $i++;
+ }
+ return $t;
+ }
+
+ /**
+ * Check is cache is locked for this template
+ *
+ * @param Smarty $smarty Smarty object
+ * @param Smarty_Template_Cached $cached cached object
+ * @return booelan true or false if cache is locked
+ */
+ public function hasLock(Smarty $smarty, Smarty_Template_Cached $cached)
+ {
+ $key = 'LOCK#' . $cached->filepath;
+ $data = $this->read(array($key));
+ return $data && time() - $data[$key] < $smarty->locking_timeout;
+ }
+
+ /**
+ * Lock cache for this template
+ *
+ * @param Smarty $smarty Smarty object
+ * @param Smarty_Template_Cached $cached cached object
+ */
+ public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached)
+ {
+ $cached->is_locked = true;
+ $key = 'LOCK#' . $cached->filepath;
+ $this->write(array($key => time()), $smarty->locking_timeout);
+ }
+
+ /**
+ * Unlock cache for this template
+ *
+ * @param Smarty $smarty Smarty object
+ * @param Smarty_Template_Cached $cached cached object
+ */
+ public function releaseLock(Smarty $smarty, Smarty_Template_Cached $cached)
+ {
+ $cached->is_locked = false;
+ $key = 'LOCK#' . $cached->filepath;
+ $this->delete(array($key));
+ }
+
+ /**
+ * Read values for a set of keys from cache
+ *
+ * @param array $keys list of keys to fetch
+ * @return array list of values with the given keys used as indexes
+ */
+ protected abstract function read(array $keys);
+
+ /**
+ * Save values for a set of keys to cache
+ *
+ * @param array $keys list of values to save
+ * @param int $expire expiration time
+ * @return boolean true on success, false on failure
+ */
+ protected abstract function write(array $keys, $expire=null);
+
+ /**
+ * Remove values from cache
+ *
+ * @param array $keys list of keys to delete
+ * @return boolean true on success, false on failure
+ */
+ protected abstract function delete(array $keys);
+
+ /**
+ * Remove *all* values from cache
+ *
+ * @return boolean true on success, false on failure
+ */
+ protected function purge()
+ {
+ return false;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_config_source.php b/include/smarty/libs/sysplugins/smarty_config_source.php
new file mode 100644
index 000000000..043ff13e9
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_config_source.php
@@ -0,0 +1,95 @@
+<?php
+/**
+ * Smarty Internal Plugin
+ *
+ * @package Smarty
+ * @subpackage TemplateResources
+ */
+
+/**
+ * Smarty Resource Data Object
+ *
+ * Meta Data Container for Config Files
+ *
+ * @package Smarty
+ * @subpackage TemplateResources
+ * @author Rodney Rehm
+ *
+ * @property string $content
+ * @property int $timestamp
+ * @property bool $exists
+ */
+class Smarty_Config_Source extends Smarty_Template_Source {
+
+ /**
+ * create Config Object container
+ *
+ * @param Smarty_Resource $handler Resource Handler this source object communicates with
+ * @param Smarty $smarty Smarty instance this source object belongs to
+ * @param string $resource full config_resource
+ * @param string $type type of resource
+ * @param string $name resource name
+ * @param string $unique_resource unqiue resource name
+ */
+ public function __construct(Smarty_Resource $handler, Smarty $smarty, $resource, $type, $name, $unique_resource)
+ {
+ $this->handler = $handler; // Note: prone to circular references
+
+ // Note: these may be ->config_compiler_class etc in the future
+ //$this->config_compiler_class = $handler->config_compiler_class;
+ //$this->config_lexer_class = $handler->config_lexer_class;
+ //$this->config_parser_class = $handler->config_parser_class;
+
+ $this->smarty = $smarty;
+ $this->resource = $resource;
+ $this->type = $type;
+ $this->name = $name;
+ $this->unique_resource = $unique_resource;
+ }
+
+ /**
+ * <<magic>> Generic setter.
+ *
+ * @param string $property_name valid: content, timestamp, exists
+ * @param mixed $value newly assigned value (not check for correct type)
+ * @throws SmartyException when the given property name is not valid
+ */
+ public function __set($property_name, $value)
+ {
+ switch ($property_name) {
+ case 'content':
+ case 'timestamp':
+ case 'exists':
+ $this->$property_name = $value;
+ break;
+
+ default:
+ throw new SmartyException("invalid config property '$property_name'.");
+ }
+ }
+
+ /**
+ * <<magic>> Generic getter.
+ *
+ * @param string $property_name valid: content, timestamp, exists
+ * @throws SmartyException when the given property name is not valid
+ */
+ public function __get($property_name)
+ {
+ switch ($property_name) {
+ case 'timestamp':
+ case 'exists':
+ $this->handler->populateTimestamp($this);
+ return $this->$property_name;
+
+ case 'content':
+ return $this->content = $this->handler->getContent($this);
+
+ default:
+ throw new SmartyException("config property '$property_name' does not exist.");
+ }
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_cacheresource_file.php b/include/smarty/libs/sysplugins/smarty_internal_cacheresource_file.php
new file mode 100644
index 000000000..04194b396
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_cacheresource_file.php
@@ -0,0 +1,266 @@
+<?php
+/**
+ * Smarty Internal Plugin CacheResource File
+ *
+ * @package Smarty
+ * @subpackage Cacher
+ * @author Uwe Tews
+ * @author Rodney Rehm
+ */
+
+/**
+ * This class does contain all necessary methods for the HTML cache on file system
+ *
+ * Implements the file system as resource for the HTML cache Version ussing nocache inserts.
+ *
+ * @package Smarty
+ * @subpackage Cacher
+ */
+class Smarty_Internal_CacheResource_File extends Smarty_CacheResource {
+
+ /**
+ * populate Cached Object with meta data from Resource
+ *
+ * @param Smarty_Template_Cached $cached cached object
+ * @param Smarty_Internal_Template $_template template object
+ * @return void
+ */
+ public function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template)
+ {
+ $_source_file_path = str_replace(':', '.', $_template->source->filepath);
+ $_cache_id = isset($_template->cache_id) ? preg_replace('![^\w\|]+!', '_', $_template->cache_id) : null;
+ $_compile_id = isset($_template->compile_id) ? preg_replace('![^\w\|]+!', '_', $_template->compile_id) : null;
+ $_filepath = $_template->source->uid;
+ // if use_sub_dirs, break file into directories
+ if ($_template->smarty->use_sub_dirs) {
+ $_filepath = substr($_filepath, 0, 2) . DS
+ . substr($_filepath, 2, 2) . DS
+ . substr($_filepath, 4, 2) . DS
+ . $_filepath;
+ }
+ $_compile_dir_sep = $_template->smarty->use_sub_dirs ? DS : '^';
+ if (isset($_cache_id)) {
+ $_cache_id = str_replace('|', $_compile_dir_sep, $_cache_id) . $_compile_dir_sep;
+ } else {
+ $_cache_id = '';
+ }
+ if (isset($_compile_id)) {
+ $_compile_id = $_compile_id . $_compile_dir_sep;
+ } else {
+ $_compile_id = '';
+ }
+ $_cache_dir = $_template->smarty->getCacheDir();
+ if ($_template->smarty->cache_locking) {
+ // create locking file name
+ // relative file name?
+ if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_cache_dir)) {
+ $_lock_dir = rtrim(getcwd(), '/\\') . DS . $_cache_dir;
+ } else {
+ $_lock_dir = $_cache_dir;
+ }
+ $cached->lock_id = $_lock_dir.sha1($_cache_id.$_compile_id.$_template->source->uid).'.lock';
+ }
+ $cached->filepath = $_cache_dir . $_cache_id . $_compile_id . $_filepath . '.' . basename($_source_file_path) . '.php';
+ $cached->timestamp = @filemtime($cached->filepath);
+ $cached->exists = !!$cached->timestamp;
+ }
+
+ /**
+ * populate Cached Object with timestamp and exists from Resource
+ *
+ * @param Smarty_Template_Cached $cached cached object
+ * @return void
+ */
+ public function populateTimestamp(Smarty_Template_Cached $cached)
+ {
+ $cached->timestamp = @filemtime($cached->filepath);
+ $cached->exists = !!$cached->timestamp;
+ }
+
+ /**
+ * Read the cached template and process its header
+ *
+ * @param Smarty_Internal_Template $_template template object
+ * @param Smarty_Template_Cached $cached cached object
+ * @return booelan true or false if the cached content does not exist
+ */
+ public function process(Smarty_Internal_Template $_template, Smarty_Template_Cached $cached=null)
+ {
+ $_smarty_tpl = $_template;
+ return @include $_template->cached->filepath;
+ }
+
+ /**
+ * Write the rendered template output to cache
+ *
+ * @param Smarty_Internal_Template $_template template object
+ * @param string $content content to cache
+ * @return boolean success
+ */
+ public function writeCachedContent(Smarty_Internal_Template $_template, $content)
+ {
+ if (Smarty_Internal_Write_File::writeFile($_template->cached->filepath, $content, $_template->smarty) === true) {
+ $_template->cached->timestamp = @filemtime($_template->cached->filepath);
+ $_template->cached->exists = !!$_template->cached->timestamp;
+ if ($_template->cached->exists) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Empty cache
+ *
+ * @param Smarty_Internal_Template $_template template object
+ * @param integer $exp_time expiration time (number of seconds, not timestamp)
+ * @return integer number of cache files deleted
+ */
+ public function clearAll(Smarty $smarty, $exp_time = null)
+ {
+ return $this->clear($smarty, null, null, null, $exp_time);
+ }
+
+ /**
+ * Empty cache for a specific template
+ *
+ * @param Smarty $_template template object
+ * @param string $resource_name template name
+ * @param string $cache_id cache id
+ * @param string $compile_id compile id
+ * @param integer $exp_time expiration time (number of seconds, not timestamp)
+ * @return integer number of cache files deleted
+ */
+ public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time)
+ {
+ $_cache_id = isset($cache_id) ? preg_replace('![^\w\|]+!', '_', $cache_id) : null;
+ $_compile_id = isset($compile_id) ? preg_replace('![^\w\|]+!', '_', $compile_id) : null;
+ $_dir_sep = $smarty->use_sub_dirs ? '/' : '^';
+ $_compile_id_offset = $smarty->use_sub_dirs ? 3 : 0;
+ $_dir = $smarty->getCacheDir();
+ $_dir_length = strlen($_dir);
+ if (isset($_cache_id)) {
+ $_cache_id_parts = explode('|', $_cache_id);
+ $_cache_id_parts_count = count($_cache_id_parts);
+ if ($smarty->use_sub_dirs) {
+ foreach ($_cache_id_parts as $id_part) {
+ $_dir .= $id_part . DS;
+ }
+ }
+ }
+ if (isset($resource_name)) {
+ $_save_stat = $smarty->caching;
+ $smarty->caching = true;
+ $tpl = new $smarty->template_class($resource_name, $smarty);
+ $smarty->caching = $_save_stat;
+
+ // remove from template cache
+ $tpl->source; // have the template registered before unset()
+ if ($smarty->allow_ambiguous_resources) {
+ $_templateId = $tpl->source->unique_resource . $tpl->cache_id . $tpl->compile_id;
+ } else {
+ $_templateId = $smarty->joined_template_dir . '#' . $resource_name . $tpl->cache_id . $tpl->compile_id;
+ }
+ if (isset($_templateId[150])) {
+ $_templateId = sha1($_templateId);
+ }
+ unset($smarty->template_objects[$_templateId]);
+
+ if ($tpl->source->exists) {
+ $_resourcename_parts = basename(str_replace('^', '/', $tpl->cached->filepath));
+ } else {
+ return 0;
+ }
+ }
+ $_count = 0;
+ $_time = time();
+ if (file_exists($_dir)) {
+ $_cacheDirs = new RecursiveDirectoryIterator($_dir);
+ $_cache = new RecursiveIteratorIterator($_cacheDirs, RecursiveIteratorIterator::CHILD_FIRST);
+ foreach ($_cache as $_file) {
+ if (substr(basename($_file->getPathname()),0,1) == '.' || strpos($_file, '.svn') !== false) continue;
+ // directory ?
+ if ($_file->isDir()) {
+ if (!$_cache->isDot()) {
+ // delete folder if empty
+ @rmdir($_file->getPathname());
+ }
+ } else {
+ $_parts = explode($_dir_sep, str_replace('\\', '/', substr((string)$_file, $_dir_length)));
+ $_parts_count = count($_parts);
+ // check name
+ if (isset($resource_name)) {
+ if ($_parts[$_parts_count-1] != $_resourcename_parts) {
+ continue;
+ }
+ }
+ // check compile id
+ if (isset($_compile_id) && (!isset($_parts[$_parts_count-2 - $_compile_id_offset]) || $_parts[$_parts_count-2 - $_compile_id_offset] != $_compile_id)) {
+ continue;
+ }
+ // check cache id
+ if (isset($_cache_id)) {
+ // count of cache id parts
+ $_parts_count = (isset($_compile_id)) ? $_parts_count - 2 - $_compile_id_offset : $_parts_count - 1 - $_compile_id_offset;
+ if ($_parts_count < $_cache_id_parts_count) {
+ continue;
+ }
+ for ($i = 0; $i < $_cache_id_parts_count; $i++) {
+ if ($_parts[$i] != $_cache_id_parts[$i]) continue 2;
+ }
+ }
+ // expired ?
+ if (isset($exp_time) && $_time - @filemtime($_file) < $exp_time) {
+ continue;
+ }
+ $_count += @unlink((string) $_file) ? 1 : 0;
+ }
+ }
+ }
+ return $_count;
+ }
+
+ /**
+ * Check is cache is locked for this template
+ *
+ * @param Smarty $smarty Smarty object
+ * @param Smarty_Template_Cached $cached cached object
+ * @return booelan true or false if cache is locked
+ */
+ public function hasLock(Smarty $smarty, Smarty_Template_Cached $cached)
+ {
+ if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
+ clearstatcache(true, $cached->lock_id);
+ } else {
+ clearstatcache();
+ }
+ $t = @filemtime($cached->lock_id);
+ return $t && (time() - $t < $smarty->locking_timeout);
+ }
+
+ /**
+ * Lock cache for this template
+ *
+ * @param Smarty $smarty Smarty object
+ * @param Smarty_Template_Cached $cached cached object
+ */
+ public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached)
+ {
+ $cached->is_locked = true;
+ touch($cached->lock_id);
+ }
+
+ /**
+ * Unlock cache for this template
+ *
+ * @param Smarty $smarty Smarty object
+ * @param Smarty_Template_Cached $cached cached object
+ */
+ public function releaseLock(Smarty $smarty, Smarty_Template_Cached $cached)
+ {
+ $cached->is_locked = false;
+ @unlink($cached->lock_id);
+ }
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_append.php b/include/smarty/libs/sysplugins/smarty_internal_compile_append.php
new file mode 100644
index 000000000..f6036e883
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_append.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Append
+ *
+ * Compiles the {append} tag
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Append Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Append extends Smarty_Internal_Compile_Assign {
+
+ /**
+ * Compiles code for the {append} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @return string compiled code
+ */
+ public function compile($args, $compiler, $parameter)
+ {
+ // the following must be assigned at runtime because it will be overwritten in parent class
+ $this->required_attributes = array('var', 'value');
+ $this->shorttag_order = array('var', 'value');
+ $this->optional_attributes = array('scope', 'index');
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+ // map to compile assign attributes
+ if (isset($_attr['index'])) {
+ $_params['smarty_internal_index'] = '[' . $_attr['index'] . ']';
+ unset($_attr['index']);
+ } else {
+ $_params['smarty_internal_index'] = '[]';
+ }
+ $_new_attr = array();
+ foreach ($_attr as $key => $value) {
+ $_new_attr[] = array($key => $value);
+ }
+ // call compile assign
+ return parent::compile($_new_attr, $compiler, $_params);
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_assign.php b/include/smarty/libs/sysplugins/smarty_internal_compile_assign.php
new file mode 100644
index 000000000..f2dfedfb8
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_assign.php
@@ -0,0 +1,88 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Assign
+ *
+ * Compiles the {assign} tag
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Assign Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Assign extends Smarty_Internal_CompileBase {
+
+ /**
+ * Compiles code for the {assign} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @return string compiled code
+ */
+ public function compile($args, $compiler, $parameter)
+ {
+ // the following must be assigned at runtime because it will be overwritten in Smarty_Internal_Compile_Append
+ $this->required_attributes = array('var', 'value');
+ $this->shorttag_order = array('var', 'value');
+ $this->optional_attributes = array('scope');
+ $_nocache = 'null';
+ $_scope = Smarty::SCOPE_LOCAL;
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+ // nocache ?
+ if ($compiler->tag_nocache || $compiler->nocache) {
+ $_nocache = 'true';
+ // create nocache var to make it know for further compiling
+ if (isset($compiler->template->tpl_vars[trim($_attr['var'], "'")])) {
+ $compiler->template->tpl_vars[trim($_attr['var'], "'")]->nocache = true;
+ } else {
+ $compiler->template->tpl_vars[trim($_attr['var'], "'")] = new Smarty_variable(null, true);
+ }
+ }
+ // scope setup
+ if (isset($_attr['scope'])) {
+ $_attr['scope'] = trim($_attr['scope'], "'\"");
+ if ($_attr['scope'] == 'parent') {
+ $_scope = Smarty::SCOPE_PARENT;
+ } elseif ($_attr['scope'] == 'root') {
+ $_scope = Smarty::SCOPE_ROOT;
+ } elseif ($_attr['scope'] == 'global') {
+ $_scope = Smarty::SCOPE_GLOBAL;
+ } else {
+ $compiler->trigger_template_error('illegal value for "scope" attribute', $compiler->lex->taglineno);
+ }
+ }
+ // compiled output
+ if (isset($parameter['smarty_internal_index'])) {
+ $output = "<?php \$_smarty_tpl->createLocalArrayVariable($_attr[var], $_nocache, $_scope);\n\$_smarty_tpl->tpl_vars[$_attr[var]]->value$parameter[smarty_internal_index] = $_attr[value];";
+ } else {
+ // implement Smarty2's behaviour of variables assigned by reference
+ if ($compiler->template->smarty instanceof SmartyBC) {
+ $output = "<?php if (isset(\$_smarty_tpl->tpl_vars[$_attr[var]])) {\$_smarty_tpl->tpl_vars[$_attr[var]] = clone \$_smarty_tpl->tpl_vars[$_attr[var]];";
+ $output .= "\n\$_smarty_tpl->tpl_vars[$_attr[var]]->value = $_attr[value]; \$_smarty_tpl->tpl_vars[$_attr[var]]->nocache = $_nocache; \$_smarty_tpl->tpl_vars[$_attr[var]]->scope = $_scope;";
+ $output .= "\n} else \$_smarty_tpl->tpl_vars[$_attr[var]] = new Smarty_variable($_attr[value], $_nocache, $_scope);";
+ } else {
+ $output = "<?php \$_smarty_tpl->tpl_vars[$_attr[var]] = new Smarty_variable($_attr[value], $_nocache, $_scope);";
+ }
+ }
+ if ($_scope == Smarty::SCOPE_PARENT) {
+ $output .= "\nif (\$_smarty_tpl->parent != null) \$_smarty_tpl->parent->tpl_vars[$_attr[var]] = clone \$_smarty_tpl->tpl_vars[$_attr[var]];";
+ } elseif ($_scope == Smarty::SCOPE_ROOT || $_scope == Smarty::SCOPE_GLOBAL) {
+ $output .= "\n\$_ptr = \$_smarty_tpl->parent; while (\$_ptr != null) {\$_ptr->tpl_vars[$_attr[var]] = clone \$_smarty_tpl->tpl_vars[$_attr[var]]; \$_ptr = \$_ptr->parent; }";
+ }
+ if ( $_scope == Smarty::SCOPE_GLOBAL) {
+ $output .= "\nSmarty::\$global_tpl_vars[$_attr[var]] = clone \$_smarty_tpl->tpl_vars[$_attr[var]];";
+ }
+ $output .= '?>';
+ return $output;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_block.php b/include/smarty/libs/sysplugins/smarty_internal_compile_block.php
new file mode 100644
index 000000000..f760e551d
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_block.php
@@ -0,0 +1,282 @@
+<?php
+
+/**
+ * Smarty Internal Plugin Compile Block
+ *
+ * Compiles the {block}{/block} tags
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Block Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Block extends Smarty_Internal_CompileBase {
+
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $required_attributes = array('name');
+
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $shorttag_order = array('name', 'hide');
+
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $optional_attributes = array('hide');
+
+ /**
+ * Compiles code for the {block} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @return boolean true
+ */
+ public function compile($args, $compiler) {
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+ $save = array($_attr, $compiler->parser->current_buffer, $compiler->nocache, $compiler->smarty->merge_compiled_includes, $compiler->merged_templates, $compiler->smarty->merged_templates_func, $compiler->template->properties, $compiler->template->has_nocache_code);
+ $this->openTag($compiler, 'block', $save);
+ if ($_attr['nocache'] == true) {
+ $compiler->nocache = true;
+ }
+ // set flag for {block} tag
+ $compiler->inheritance = true;
+ // must merge includes
+ $compiler->smarty->merge_compiled_includes = true;
+
+ $compiler->parser->current_buffer = new _smarty_template_buffer($compiler->parser);
+ $compiler->has_code = false;
+ return true;
+ }
+
+ /**
+ * Save or replace child block source by block name during parsing
+ *
+ * @param string $block_content block source content
+ * @param string $block_tag opening block tag
+ * @param object $template template object
+ * @param string $filepath filepath of template source
+ */
+ public static function saveBlockData($block_content, $block_tag, $template, $filepath) {
+ $_rdl = preg_quote($template->smarty->right_delimiter);
+ $_ldl = preg_quote($template->smarty->left_delimiter);
+ if (!$template->smarty->auto_literal) {
+ $al = '\s*';
+ } else {
+ $al = '';
+ }
+ if (0 == preg_match("!({$_ldl}{$al}block\s+)(name=)?(\w+|'.*'|\".*\")(\s*?)?((append|prepend|nocache)?(\s*)?(hide)?)?(\s*{$_rdl})!", $block_tag, $_match)) {
+ $error_text = 'Syntax Error in template "' . $template->source->filepath . '" "' . htmlspecialchars($block_tag) . '" illegal options';
+ throw new SmartyCompilerException($error_text);
+ } else {
+ $_name = trim($_match[3], '\'"');
+ if ($_match[8] != 'hide' || isset($template->block_data[$_name])) { // replace {$smarty.block.child}
+ // get nested block tags
+ if (0 != preg_match_all("!({$_ldl}{$al}block\s+)(name=)?(\w+|'.*'|\".*\")([\s\S]*?)(hide)?(\s*{$_rdl})([\s\S]*?)(.*)?({$_ldl}{$al}/block\s*{$_rdl})!", $block_content, $_match2)) {
+ foreach ($_match2[3] as $key => $name) {
+ // get it's replacement
+ $_name2 = trim($name, '\'"');
+ if ($_match2[5][$key] != 'hide' || isset($template->block_data[$_name2])) {
+ if (isset($template->block_data[$_name2])) {
+ $replacement = $template->block_data[$_name2]['source'];
+ } else {
+ $replacement = '';
+ }
+ // replace {$smarty.block.child} tag
+ if (preg_match("!{$_ldl}{$al}\\\$smarty\.block\.child\s*{$_rdl}!",$_match2[7][$key])) {
+ $replacement = preg_replace("!({$_ldl}{$al}\\\$smarty\.block\.child\s*{$_rdl})!", $replacement, $_match2[7][$key]);
+ $block_content = preg_replace("!(({$_ldl}{$al}block)(.*)?{$name}(.*)?({$_rdl}[\s\S]*?{$_ldl}{$al}/block\s*{$_rdl}))!", $replacement, $block_content);
+ }
+ if (preg_match("!{$_ldl}{$al}\\\$smarty\.block\.child\s*{$_rdl}!",$_match2[8][$key])) {
+ $replacement = preg_replace("!{$_ldl}{$al}\\\$smarty\.block\.child\s*{$_rdl}!", $replacement, $_match2[8][$key]);
+ $block_content = preg_replace("!(({$_ldl}{$al}block)(.*)?{$name}(.*)?({$_rdl})(.*)?({$_ldl}{$al}/block\s*{$_rdl}))!", $replacement, $block_content);
+ }
+ } else {
+ // remove hidden blocks
+ $block_content = preg_replace("!(({$_ldl}{$al}block)(.*)?{$name}(.*)?({$_rdl}[\s\S]*?{$_ldl}{$al}/block\s*{$_rdl}))!", '', $block_content);
+ }
+ }
+ }
+ // do we have not nested {$smart.block.child}
+ if (0 != preg_match("!({$_ldl}{$al}\\\$smarty\.block\.child\s*{$_rdl})!", $block_content, $_match2)) {
+ // get child replacement for this block
+ if (isset($template->block_data[$_name])) {
+ $replacement = $template->block_data[$_name]['source'];
+ unset($template->block_data[$_name]);
+ } else {
+ $replacement = '';
+ }
+ $block_content = preg_replace("!({$_ldl}{$al}\\\$smarty\.block\.child\s*{$_rdl})!", $replacement, $block_content);
+ }
+ if (isset($template->block_data[$_name])) {
+ if (strpos($template->block_data[$_name]['source'], '%%%%SMARTY_PARENT%%%%') !== false) {
+ $template->block_data[$_name]['source'] =
+ str_replace('%%%%SMARTY_PARENT%%%%', $block_content, $template->block_data[$_name]['source']);
+ } elseif ($template->block_data[$_name]['mode'] == 'prepend') {
+ $template->block_data[$_name]['source'] .= $block_content;
+ } elseif ($template->block_data[$_name]['mode'] == 'append') {
+ $template->block_data[$_name]['source'] = $block_content . $template->block_data[$_name]['source'];
+ }
+ } else {
+ $template->block_data[$_name]['source'] = $block_content;
+ $template->block_data[$_name]['file'] = $filepath;
+ }
+ if ($_match[6] == 'append') {
+ $template->block_data[$_name]['mode'] = 'append';
+ } elseif ($_match[6] == 'prepend') {
+ $template->block_data[$_name]['mode'] = 'prepend';
+ } else {
+ $template->block_data[$_name]['mode'] = 'replace';
+ }
+ }
+ }
+ }
+
+ /**
+ * Compile saved child block source
+ *
+ * @param object $compiler compiler object
+ * @param string $_name optional name of child block
+ * @return string compiled code of schild block
+ */
+ public static function compileChildBlock($compiler, $_name = null) {
+ $_output = '';
+ // if called by {$smarty.block.child} we must search the name of enclosing {block}
+ if ($_name == null) {
+ $stack_count = count($compiler->_tag_stack);
+ while (--$stack_count >= 0) {
+ if ($compiler->_tag_stack[$stack_count][0] == 'block') {
+ $_name = trim($compiler->_tag_stack[$stack_count][1][0]['name'], "'\"");
+ break;
+ }
+ }
+ // flag that child is already compile by {$smarty.block.child} inclusion
+ $compiler->template->block_data[$_name]['compiled'] = true;
+ }
+ if ($_name == null) {
+ $compiler->trigger_template_error('{$smarty.block.child} used out of context', $compiler->lex->taglineno);
+ }
+ // undefined child?
+ if (!isset($compiler->template->block_data[$_name]['source'])) {
+ return '';
+ }
+ $_tpl = new Smarty_Internal_template('string:' . $compiler->template->block_data[$_name]['source'], $compiler->smarty, $compiler->template, $compiler->template->cache_id,
+ $compiler->template->compile_id = null, $compiler->template->caching, $compiler->template->cache_lifetime);
+ $_tpl->variable_filters = $compiler->template->variable_filters;
+ $_tpl->properties['nocache_hash'] = $compiler->template->properties['nocache_hash'];
+ $_tpl->source->filepath = $compiler->template->block_data[$_name]['file'];
+ $_tpl->allow_relative_path = true;
+ if ($compiler->nocache) {
+ $_tpl->compiler->forceNocache = 2;
+ } else {
+ $_tpl->compiler->forceNocache = 1;
+ }
+ $_tpl->compiler->suppressHeader = true;
+ $_tpl->compiler->suppressTemplatePropertyHeader = true;
+ $_tpl->compiler->suppressMergedTemplates = true;
+ if (strpos($compiler->template->block_data[$_name]['source'], '%%%%SMARTY_PARENT%%%%') !== false) {
+ $_output = str_replace('%%%%SMARTY_PARENT%%%%', $compiler->parser->current_buffer->to_smarty_php(), $_tpl->compiler->compileTemplate($_tpl));
+ } elseif ($compiler->template->block_data[$_name]['mode'] == 'prepend') {
+ $_output = $_tpl->compiler->compileTemplate($_tpl) . $compiler->parser->current_buffer->to_smarty_php();
+ } elseif ($compiler->template->block_data[$_name]['mode'] == 'append') {
+ $_output = $compiler->parser->current_buffer->to_smarty_php() . $_tpl->compiler->compileTemplate($_tpl);
+ } elseif (!empty($compiler->template->block_data[$_name])) {
+ $_output = $_tpl->compiler->compileTemplate($_tpl);
+ }
+ $compiler->template->properties['file_dependency'] = array_merge($compiler->template->properties['file_dependency'], $_tpl->properties['file_dependency']);
+ $compiler->template->properties['function'] = array_merge($compiler->template->properties['function'], $_tpl->properties['function']);
+ $compiler->merged_templates = array_merge($compiler->merged_templates, $_tpl->compiler->merged_templates);
+ $compiler->template->variable_filters = $_tpl->variable_filters;
+ if ($_tpl->has_nocache_code) {
+ $compiler->template->has_nocache_code = true;
+ }
+ foreach ($_tpl->required_plugins as $key => $tmp1) {
+ if ($compiler->nocache && $compiler->template->caching) {
+ $code = 'nocache';
+ } else {
+ $code = $key;
+ }
+ foreach ($tmp1 as $name => $tmp) {
+ foreach ($tmp as $type => $data) {
+ $compiler->template->required_plugins[$code][$name][$type] = $data;
+ }
+ }
+ }
+ unset($_tpl);
+ return $_output;
+ }
+
+}
+
+/**
+ * Smarty Internal Plugin Compile BlockClose Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Blockclose extends Smarty_Internal_CompileBase {
+
+ /**
+ * Compiles code for the {/block} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @return string compiled code
+ */
+ public function compile($args, $compiler) {
+ $compiler->has_code = true;
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+ $saved_data = $this->closeTag($compiler, array('block'));
+ $_name = trim($saved_data[0]['name'], "\"'");
+ if (isset($compiler->template->block_data[$_name]) && !isset($compiler->template->block_data[$_name]['compiled'])) {
+ // restore to status before {block} tag as new subtemplate code of parent {block} is not needed
+ // TODO: Below code was disabled in 3.1.8 because of problems with {include} in nested {block} tags in child templates
+ // combined with append/prepend or $smarty.block.parent
+ // For later versions it should be checked under which conditions it could run for optimisation
+ //
+ //$compiler->merged_templates = $saved_data[4];
+ //$compiler->smarty->merged_templates_func = $saved_data[5];
+ //$compiler->template->properties = $saved_data[6];
+ //$compiler->template->has_nocache_code = $saved_data[7];
+ $_output = Smarty_Internal_Compile_Block::compileChildBlock($compiler, $_name);
+ } else {
+ if (isset($saved_data[0]['hide']) && !isset($compiler->template->block_data[$_name]['source'])) {
+ $_output = '';
+ } else {
+ $_output = $compiler->parser->current_buffer->to_smarty_php();
+ }
+ unset($compiler->template->block_data[$_name]['compiled']);
+ }
+ // reset flags
+ $compiler->parser->current_buffer = $saved_data[1];
+ $compiler->nocache = $saved_data[2];
+ $compiler->smarty->merge_compiled_includes = $saved_data[3];
+ // reset flag for {block} tag
+ $compiler->inheritance = false;
+ // $_output content has already nocache code processed
+ $compiler->suppressNocacheProcessing = true;
+ return $_output;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_break.php b/include/smarty/libs/sysplugins/smarty_internal_compile_break.php
new file mode 100644
index 000000000..b25bef6c4
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_break.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Break
+ *
+ * Compiles the {break} tag
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+/**
+ * Smarty Internal Plugin Compile Break Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Break extends Smarty_Internal_CompileBase {
+
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $optional_attributes = array('levels');
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $shorttag_order = array('levels');
+
+ /**
+ * Compiles code for the {break} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @return string compiled code
+ */
+ public function compile($args, $compiler, $parameter)
+ {
+ static $_is_loopy = array('for' => true, 'foreach' => true, 'while' => true, 'section' => true);
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+
+ if ($_attr['nocache'] === true) {
+ $compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno);
+ }
+
+ if (isset($_attr['levels'])) {
+ if (!is_numeric($_attr['levels'])) {
+ $compiler->trigger_template_error('level attribute must be a numeric constant', $compiler->lex->taglineno);
+ }
+ $_levels = $_attr['levels'];
+ } else {
+ $_levels = 1;
+ }
+ $level_count = $_levels;
+ $stack_count = count($compiler->_tag_stack) - 1;
+ while ($level_count > 0 && $stack_count >= 0) {
+ if (isset($_is_loopy[$compiler->_tag_stack[$stack_count][0]])) {
+ $level_count--;
+ }
+ $stack_count--;
+ }
+ if ($level_count != 0) {
+ $compiler->trigger_template_error("cannot break {$_levels} level(s)", $compiler->lex->taglineno);
+ }
+ $compiler->has_code = true;
+ return "<?php break {$_levels}?>";
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_call.php b/include/smarty/libs/sysplugins/smarty_internal_compile_call.php
new file mode 100644
index 000000000..af12a048c
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_call.php
@@ -0,0 +1,130 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Function_Call
+ *
+ * Compiles the calls of user defined tags defined by {function}
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Function_Call Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Call extends Smarty_Internal_CompileBase {
+
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $required_attributes = array('name');
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $shorttag_order = array('name');
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $optional_attributes = array('_any');
+
+ /**
+ * Compiles the calls of user defined tags defined by {function}
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @return string compiled code
+ */
+ public function compile($args, $compiler)
+ {
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+ // save possible attributes
+ if (isset($_attr['assign'])) {
+ // output will be stored in a smarty variable instead of beind displayed
+ $_assign = $_attr['assign'];
+ }
+ $_name = $_attr['name'];
+ if ($compiler->compiles_template_function) {
+ $compiler->called_functions[] = trim($_name, "'\"");
+ }
+ unset($_attr['name'], $_attr['assign'], $_attr['nocache']);
+ // set flag (compiled code of {function} must be included in cache file
+ if ($compiler->nocache || $compiler->tag_nocache) {
+ $_nocache = 'true';
+ } else {
+ $_nocache = 'false';
+ }
+ $_paramsArray = array();
+ foreach ($_attr as $_key => $_value) {
+ if (is_int($_key)) {
+ $_paramsArray[] = "$_key=>$_value";
+ } else {
+ $_paramsArray[] = "'$_key'=>$_value";
+ }
+ }
+ if (isset($compiler->template->properties['function'][$_name]['parameter'])) {
+ foreach ($compiler->template->properties['function'][$_name]['parameter'] as $_key => $_value) {
+ if (!isset($_attr[$_key])) {
+ if (is_int($_key)) {
+ $_paramsArray[] = "$_key=>$_value";
+ } else {
+ $_paramsArray[] = "'$_key'=>$_value";
+ }
+ }
+ }
+ } elseif (isset($compiler->smarty->template_functions[$_name]['parameter'])) {
+ foreach ($compiler->smarty->template_functions[$_name]['parameter'] as $_key => $_value) {
+ if (!isset($_attr[$_key])) {
+ if (is_int($_key)) {
+ $_paramsArray[] = "$_key=>$_value";
+ } else {
+ $_paramsArray[] = "'$_key'=>$_value";
+ }
+ }
+ }
+ }
+ //varibale name?
+ if (!(strpos($_name, '$') === false)) {
+ $call_cache = $_name;
+ $call_function = '$tmp = "smarty_template_function_".' . $_name . '; $tmp';
+ } else {
+ $_name = trim($_name, "'\"");
+ $call_cache = "'{$_name}'";
+ $call_function = 'smarty_template_function_' . $_name;
+ }
+
+ $_params = 'array(' . implode(",", $_paramsArray) . ')';
+ $_hash = str_replace('-', '_', $compiler->template->properties['nocache_hash']);
+ // was there an assign attribute
+ if (isset($_assign)) {
+ if ($compiler->template->caching) {
+ $_output = "<?php ob_start(); Smarty_Internal_Function_Call_Handler::call ({$call_cache},\$_smarty_tpl,{$_params},'{$_hash}',{$_nocache}); \$_smarty_tpl->assign({$_assign}, ob_get_clean());?>\n";
+ } else {
+ $_output = "<?php ob_start(); {$call_function}(\$_smarty_tpl,{$_params}); \$_smarty_tpl->assign({$_assign}, ob_get_clean());?>\n";
+ }
+ } else {
+ if ($compiler->template->caching) {
+ $_output = "<?php Smarty_Internal_Function_Call_Handler::call ({$call_cache},\$_smarty_tpl,{$_params},'{$_hash}',{$_nocache});?>\n";
+ } else {
+ $_output = "<?php {$call_function}(\$_smarty_tpl,{$_params});?>\n";
+ }
+ }
+ return $_output;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_capture.php b/include/smarty/libs/sysplugins/smarty_internal_compile_capture.php
new file mode 100644
index 000000000..9a5071ebe
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_capture.php
@@ -0,0 +1,98 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Capture
+ *
+ * Compiles the {capture} tag
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Capture Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Capture extends Smarty_Internal_CompileBase {
+
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $shorttag_order = array('name');
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $optional_attributes = array('name', 'assign', 'append');
+
+ /**
+ * Compiles code for the {capture} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @return string compiled code
+ */
+ public function compile($args, $compiler)
+ {
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+
+ $buffer = isset($_attr['name']) ? $_attr['name'] : "'default'";
+ $assign = isset($_attr['assign']) ? $_attr['assign'] : 'null';
+ $append = isset($_attr['append']) ? $_attr['append'] : 'null';
+
+ $compiler->_capture_stack[0][] = array($buffer, $assign, $append, $compiler->nocache);
+ // maybe nocache because of nocache variables
+ $compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
+ $_output = "<?php \$_smarty_tpl->_capture_stack[0][] = array($buffer, $assign, $append); ob_start(); ?>";
+
+ return $_output;
+ }
+
+}
+
+/**
+ * Smarty Internal Plugin Compile Captureclose Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_CaptureClose extends Smarty_Internal_CompileBase {
+
+ /**
+ * Compiles code for the {/capture} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @return string compiled code
+ */
+ public function compile($args, $compiler)
+ {
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+ // must endblock be nocache?
+ if ($compiler->nocache) {
+ $compiler->tag_nocache = true;
+ }
+
+ list($buffer, $assign, $append, $compiler->nocache) = array_pop($compiler->_capture_stack[0]);
+
+ $_output = "<?php list(\$_capture_buffer, \$_capture_assign, \$_capture_append) = array_pop(\$_smarty_tpl->_capture_stack[0]);\n";
+ $_output .= "if (!empty(\$_capture_buffer)) {\n";
+ $_output .= " if (isset(\$_capture_assign)) \$_smarty_tpl->assign(\$_capture_assign, ob_get_contents());\n";
+ $_output .= " if (isset( \$_capture_append)) \$_smarty_tpl->append( \$_capture_append, ob_get_contents());\n";
+ $_output .= " Smarty::\$_smarty_vars['capture'][\$_capture_buffer]=ob_get_clean();\n";
+ $_output .= "} else \$_smarty_tpl->capture_error();?>";
+ return $_output;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_config_load.php b/include/smarty/libs/sysplugins/smarty_internal_compile_config_load.php
new file mode 100644
index 000000000..deaa052c5
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_config_load.php
@@ -0,0 +1,85 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Config Load
+ *
+ * Compiles the {config load} tag
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Config Load Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Config_Load extends Smarty_Internal_CompileBase {
+
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $required_attributes = array('file');
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $shorttag_order = array('file','section');
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $optional_attributes = array('section', 'scope');
+
+ /**
+ * Compiles code for the {config_load} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @return string compiled code
+ */
+ public function compile($args, $compiler)
+ {
+ static $_is_legal_scope = array('local' => true,'parent' => true,'root' => true,'global' => true);
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+
+ if ($_attr['nocache'] === true) {
+ $compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno);
+ }
+
+
+ // save posible attributes
+ $conf_file = $_attr['file'];
+ if (isset($_attr['section'])) {
+ $section = $_attr['section'];
+ } else {
+ $section = 'null';
+ }
+ $scope = 'local';
+ // scope setup
+ if (isset($_attr['scope'])) {
+ $_attr['scope'] = trim($_attr['scope'], "'\"");
+ if (isset($_is_legal_scope[$_attr['scope']])) {
+ $scope = $_attr['scope'];
+ } else {
+ $compiler->trigger_template_error('illegal value for "scope" attribute', $compiler->lex->taglineno);
+ }
+ }
+ // create config object
+ $_output = "<?php \$_config = new Smarty_Internal_Config($conf_file, \$_smarty_tpl->smarty, \$_smarty_tpl);";
+ $_output .= "\$_config->loadConfigVars($section, '$scope'); ?>";
+ return $_output;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_continue.php b/include/smarty/libs/sysplugins/smarty_internal_compile_continue.php
new file mode 100644
index 000000000..72a5f8653
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_continue.php
@@ -0,0 +1,78 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Continue
+ *
+ * Compiles the {continue} tag
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Continue Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Continue extends Smarty_Internal_CompileBase {
+
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $optional_attributes = array('levels');
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $shorttag_order = array('levels');
+
+ /**
+ * Compiles code for the {continue} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @return string compiled code
+ */
+ public function compile($args, $compiler, $parameter)
+ {
+ static $_is_loopy = array('for' => true, 'foreach' => true, 'while' => true, 'section' => true);
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+
+ if ($_attr['nocache'] === true) {
+ $compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno);
+ }
+
+ if (isset($_attr['levels'])) {
+ if (!is_numeric($_attr['levels'])) {
+ $compiler->trigger_template_error('level attribute must be a numeric constant', $compiler->lex->taglineno);
+ }
+ $_levels = $_attr['levels'];
+ } else {
+ $_levels = 1;
+ }
+ $level_count = $_levels;
+ $stack_count = count($compiler->_tag_stack) - 1;
+ while ($level_count > 0 && $stack_count >= 0) {
+ if (isset($_is_loopy[$compiler->_tag_stack[$stack_count][0]])) {
+ $level_count--;
+ }
+ $stack_count--;
+ }
+ if ($level_count != 0) {
+ $compiler->trigger_template_error("cannot continue {$_levels} level(s)", $compiler->lex->taglineno);
+ }
+ $compiler->has_code = true;
+ return "<?php continue {$_levels}?>";
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_debug.php b/include/smarty/libs/sysplugins/smarty_internal_compile_debug.php
new file mode 100644
index 000000000..f50c7aee2
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_debug.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Debug
+ *
+ * Compiles the {debug} tag.
+ * It opens a window the the Smarty Debugging Console.
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Debug Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Debug extends Smarty_Internal_CompileBase {
+
+ /**
+ * Compiles code for the {debug} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @return string compiled code
+ */
+ public function compile($args, $compiler)
+ {
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+
+ // compile always as nocache
+ $compiler->tag_nocache = true;
+
+ // display debug template
+ $_output = "<?php \$_smarty_tpl->smarty->loadPlugin('Smarty_Internal_Debug'); Smarty_Internal_Debug::display_debug(\$_smarty_tpl); ?>";
+ return $_output;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_eval.php b/include/smarty/libs/sysplugins/smarty_internal_compile_eval.php
new file mode 100644
index 000000000..6cf481b50
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_eval.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Eval
+ *
+ * Compiles the {eval} tag.
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Eval Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Eval extends Smarty_Internal_CompileBase {
+
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $required_attributes = array('var');
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $optional_attributes = array('assign');
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $shorttag_order = array('var','assign');
+
+ /**
+ * Compiles code for the {eval} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @return string compiled code
+ */
+ public function compile($args, $compiler)
+ {
+ $this->required_attributes = array('var');
+ $this->optional_attributes = array('assign');
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+ if (isset($_attr['assign'])) {
+ // output will be stored in a smarty variable instead of beind displayed
+ $_assign = $_attr['assign'];
+ }
+
+ // create template object
+ $_output = "\$_template = new {$compiler->smarty->template_class}('eval:'.".$_attr['var'].", \$_smarty_tpl->smarty, \$_smarty_tpl);";
+ //was there an assign attribute?
+ if (isset($_assign)) {
+ $_output .= "\$_smarty_tpl->assign($_assign,\$_template->fetch());";
+ } else {
+ $_output .= "echo \$_template->fetch();";
+ }
+ return "<?php $_output ?>";
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_extends.php b/include/smarty/libs/sysplugins/smarty_internal_compile_extends.php
new file mode 100644
index 000000000..fe14a4081
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_extends.php
@@ -0,0 +1,133 @@
+<?php
+
+/**
+* Smarty Internal Plugin Compile extend
+*
+* Compiles the {extends} tag
+*
+* @package Smarty
+* @subpackage Compiler
+* @author Uwe Tews
+*/
+
+/**
+* Smarty Internal Plugin Compile extend Class
+*
+* @package Smarty
+* @subpackage Compiler
+*/
+class Smarty_Internal_Compile_Extends extends Smarty_Internal_CompileBase {
+
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $required_attributes = array('file');
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $shorttag_order = array('file');
+ /**
+ * mbstring.overload flag
+ *
+ * @var int
+ */
+ public $mbstring_overload = 0;
+
+ /**
+ * Compiles code for the {extends} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @return string compiled code
+ */
+ public function compile($args, $compiler)
+ {
+ static $_is_stringy = array('string' => true, 'eval' => true);
+ $this->_rdl = preg_quote($compiler->smarty->right_delimiter);
+ $this->_ldl = preg_quote($compiler->smarty->left_delimiter);
+ if (!$compiler->smarty->auto_literal) {
+ $al = '\s*';
+ } else {
+ $al = '';
+ }
+ $filepath = $compiler->template->source->filepath;
+ $this->mbstring_overload = ini_get('mbstring.func_overload') & 2;
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+ if ($_attr['nocache'] === true) {
+ $compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno);
+ }
+
+ $_smarty_tpl = $compiler->template;
+ $include_file = null;
+ if (strpos($_attr['file'], '$_tmp') !== false) {
+ $compiler->trigger_template_error('illegal value for file attribute', $compiler->lex->taglineno);
+ }
+ eval('$include_file = ' . $_attr['file'] . ';');
+ // create template object
+ $_template = new $compiler->smarty->template_class($include_file, $compiler->smarty, $compiler->template);
+ // save file dependency
+ if (isset($_is_stringy[$_template->source->type])) {
+ $template_sha1 = sha1($include_file);
+ } else {
+ $template_sha1 = sha1($_template->source->filepath);
+ }
+ if (isset($compiler->template->properties['file_dependency'][$template_sha1])) {
+ $compiler->trigger_template_error("illegal recursive call of \"{$include_file}\"", $compiler->lex->line - 1);
+ }
+ $compiler->template->properties['file_dependency'][$template_sha1] = array($_template->source->filepath, $_template->source->timestamp, $_template->source->type);
+ $_content = ($this->mbstring_overload ? mb_substr($compiler->lex->data, $compiler->lex->counter - 1, 20000000, 'latin1') : substr($compiler->lex->data, $compiler->lex->counter - 1));
+ if (preg_match_all("!({$this->_ldl}{$al}block\s(.+?)\s*{$this->_rdl})!", $_content, $s) !=
+ preg_match_all("!({$this->_ldl}{$al}/block\s*{$this->_rdl})!", $_content, $c)) {
+ $compiler->trigger_template_error('unmatched {block} {/block} pairs');
+ }
+ preg_match_all("!{$this->_ldl}{$al}block\s(.+?)\s*{$this->_rdl}|{$this->_ldl}{$al}/block\s*{$this->_rdl}|{$this->_ldl}\*([\S\s]*?)\*{$this->_rdl}!", $_content, $_result, PREG_OFFSET_CAPTURE);
+ $_result_count = count($_result[0]);
+ $_start = 0;
+ while ($_start+1 < $_result_count) {
+ $_end = 0;
+ $_level = 1;
+ if (($this->mbstring_overload ? mb_substr($_result[0][$_start][0],0,mb_strlen($compiler->smarty->left_delimiter,'latin1')+1, 'latin1') : substr($_result[0][$_start][0],0,strlen($compiler->smarty->left_delimiter)+1)) == $compiler->smarty->left_delimiter.'*') {
+ $_start++;
+ continue;
+ }
+ while ($_level != 0) {
+ $_end++;
+ if (($this->mbstring_overload ? mb_substr($_result[0][$_start + $_end][0],0,mb_strlen($compiler->smarty->left_delimiter,'latin1')+1, 'latin1') : substr($_result[0][$_start + $_end][0],0,strlen($compiler->smarty->left_delimiter)+1)) == $compiler->smarty->left_delimiter.'*') {
+ continue;
+ }
+ if (!strpos($_result[0][$_start + $_end][0], '/')) {
+ $_level++;
+ } else {
+ $_level--;
+ }
+ }
+ $_block_content = str_replace($compiler->smarty->left_delimiter . '$smarty.block.parent' . $compiler->smarty->right_delimiter, '%%%%SMARTY_PARENT%%%%',
+ ($this->mbstring_overload ? mb_substr($_content, $_result[0][$_start][1] + mb_strlen($_result[0][$_start][0], 'latin1'), $_result[0][$_start + $_end][1] - $_result[0][$_start][1] - + mb_strlen($_result[0][$_start][0], 'latin1'), 'latin1') : substr($_content, $_result[0][$_start][1] + strlen($_result[0][$_start][0]), $_result[0][$_start + $_end][1] - $_result[0][$_start][1] - + strlen($_result[0][$_start][0]))));
+ Smarty_Internal_Compile_Block::saveBlockData($_block_content, $_result[0][$_start][0], $compiler->template, $filepath);
+ $_start = $_start + $_end + 1;
+ }
+ if ($_template->source->type == 'extends') {
+ $_template->block_data = $compiler->template->block_data;
+ }
+ $compiler->template->source->content = $_template->source->content;
+ if ($_template->source->type == 'extends') {
+ $compiler->template->block_data = $_template->block_data;
+ foreach ($_template->source->components as $key => $component) {
+ $compiler->template->properties['file_dependency'][$key] = array($component->filepath, $component->timestamp, $component->type);
+ }
+ }
+ $compiler->template->source->filepath = $_template->source->filepath;
+ $compiler->abort_and_recompile = true;
+ return '';
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_for.php b/include/smarty/libs/sysplugins/smarty_internal_compile_for.php
new file mode 100644
index 000000000..057f4fb79
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_for.php
@@ -0,0 +1,151 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile For
+ *
+ * Compiles the {for} {forelse} {/for} tags
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile For Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_For extends Smarty_Internal_CompileBase {
+
+ /**
+ * Compiles code for the {for} tag
+ *
+ * Smarty 3 does implement two different sytaxes:
+ *
+ * - {for $var in $array}
+ * For looping over arrays or iterators
+ *
+ * - {for $x=0; $x<$y; $x++}
+ * For general loops
+ *
+ * The parser is gereration different sets of attribute by which this compiler can
+ * determin which syntax is used.
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @return string compiled code
+ */
+ public function compile($args, $compiler, $parameter)
+ {
+ if ($parameter == 0) {
+ $this->required_attributes = array('start', 'to');
+ $this->optional_attributes = array('max', 'step');
+ } else {
+ $this->required_attributes = array('start', 'ifexp', 'var', 'step');
+ $this->optional_attributes = array();
+ }
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+
+ $output = "<?php ";
+ if ($parameter == 1) {
+ foreach ($_attr['start'] as $_statement) {
+ $output .= " \$_smarty_tpl->tpl_vars[$_statement[var]] = new Smarty_Variable;";
+ $output .= " \$_smarty_tpl->tpl_vars[$_statement[var]]->value = $_statement[value];\n";
+ }
+ $output .= " if ($_attr[ifexp]){ for (\$_foo=true;$_attr[ifexp]; \$_smarty_tpl->tpl_vars[$_attr[var]]->value$_attr[step]){\n";
+ } else {
+ $_statement = $_attr['start'];
+ $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]] = new Smarty_Variable;";
+ if (isset($_attr['step'])) {
+ $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->step = $_attr[step];";
+ } else {
+ $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->step = 1;";
+ }
+ if (isset($_attr['max'])) {
+ $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->total = (int)min(ceil((\$_smarty_tpl->tpl_vars[$_statement[var]]->step > 0 ? $_attr[to]+1 - ($_statement[value]) : $_statement[value]-($_attr[to])+1)/abs(\$_smarty_tpl->tpl_vars[$_statement[var]]->step)),$_attr[max]);\n";
+ } else {
+ $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->total = (int)ceil((\$_smarty_tpl->tpl_vars[$_statement[var]]->step > 0 ? $_attr[to]+1 - ($_statement[value]) : $_statement[value]-($_attr[to])+1)/abs(\$_smarty_tpl->tpl_vars[$_statement[var]]->step));\n";
+ }
+ $output .= "if (\$_smarty_tpl->tpl_vars[$_statement[var]]->total > 0){\n";
+ $output .= "for (\$_smarty_tpl->tpl_vars[$_statement[var]]->value = $_statement[value], \$_smarty_tpl->tpl_vars[$_statement[var]]->iteration = 1;\$_smarty_tpl->tpl_vars[$_statement[var]]->iteration <= \$_smarty_tpl->tpl_vars[$_statement[var]]->total;\$_smarty_tpl->tpl_vars[$_statement[var]]->value += \$_smarty_tpl->tpl_vars[$_statement[var]]->step, \$_smarty_tpl->tpl_vars[$_statement[var]]->iteration++){\n";
+ $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->first = \$_smarty_tpl->tpl_vars[$_statement[var]]->iteration == 1;";
+ $output .= "\$_smarty_tpl->tpl_vars[$_statement[var]]->last = \$_smarty_tpl->tpl_vars[$_statement[var]]->iteration == \$_smarty_tpl->tpl_vars[$_statement[var]]->total;";
+ }
+ $output .= "?>";
+
+ $this->openTag($compiler, 'for', array('for', $compiler->nocache));
+ // maybe nocache because of nocache variables
+ $compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
+ // return compiled code
+ return $output;
+ }
+
+}
+
+/**
+ * Smarty Internal Plugin Compile Forelse Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Forelse extends Smarty_Internal_CompileBase {
+
+ /**
+ * Compiles code for the {forelse} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @return string compiled code
+ */
+ public function compile($args, $compiler, $parameter)
+ {
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+
+ list($openTag, $nocache) = $this->closeTag($compiler, array('for'));
+ $this->openTag($compiler, 'forelse', array('forelse', $nocache));
+ return "<?php }} else { ?>";
+ }
+
+}
+
+/**
+ * Smarty Internal Plugin Compile Forclose Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Forclose extends Smarty_Internal_CompileBase {
+
+ /**
+ * Compiles code for the {/for} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @return string compiled code
+ */
+ public function compile($args, $compiler, $parameter)
+ {
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+ // must endblock be nocache?
+ if ($compiler->nocache) {
+ $compiler->tag_nocache = true;
+ }
+
+ list($openTag, $compiler->nocache) = $this->closeTag($compiler, array('for', 'forelse'));
+
+ if ($openTag == 'forelse') {
+ return "<?php } ?>";
+ } else {
+ return "<?php }} ?>";
+ }
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_foreach.php b/include/smarty/libs/sysplugins/smarty_internal_compile_foreach.php
new file mode 100644
index 000000000..1354c89d5
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_foreach.php
@@ -0,0 +1,231 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Foreach
+ *
+ * Compiles the {foreach} {foreachelse} {/foreach} tags
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Foreach Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Foreach extends Smarty_Internal_CompileBase {
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $required_attributes = array('from', 'item');
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $optional_attributes = array('name', 'key');
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $shorttag_order = array('from','item','key','name');
+
+ /**
+ * Compiles code for the {foreach} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @return string compiled code
+ */
+ public function compile($args, $compiler, $parameter)
+ {
+ $tpl = $compiler->template;
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+
+ $from = $_attr['from'];
+ $item = $_attr['item'];
+ if (!strncmp("\$_smarty_tpl->tpl_vars[$item]", $from, strlen($item) + 24)) {
+ $compiler->trigger_template_error("item variable {$item} may not be the same variable as at 'from'", $compiler->lex->taglineno);
+ }
+
+ if (isset($_attr['key'])) {
+ $key = $_attr['key'];
+ } else {
+ $key = null;
+ }
+
+ $this->openTag($compiler, 'foreach', array('foreach', $compiler->nocache, $item, $key));
+ // maybe nocache because of nocache variables
+ $compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
+
+ if (isset($_attr['name'])) {
+ $name = $_attr['name'];
+ $has_name = true;
+ $SmartyVarName = '$smarty.foreach.' . trim($name, '\'"') . '.';
+ } else {
+ $name = null;
+ $has_name = false;
+ }
+ $ItemVarName = '$' . trim($item, '\'"') . '@';
+ // evaluates which Smarty variables and properties have to be computed
+ if ($has_name) {
+ $usesSmartyFirst = strpos($tpl->source->content, $SmartyVarName . 'first') !== false;
+ $usesSmartyLast = strpos($tpl->source->content, $SmartyVarName . 'last') !== false;
+ $usesSmartyIndex = strpos($tpl->source->content, $SmartyVarName . 'index') !== false;
+ $usesSmartyIteration = strpos($tpl->source->content, $SmartyVarName . 'iteration') !== false;
+ $usesSmartyShow = strpos($tpl->source->content, $SmartyVarName . 'show') !== false;
+ $usesSmartyTotal = strpos($tpl->source->content, $SmartyVarName . 'total') !== false;
+ } else {
+ $usesSmartyFirst = false;
+ $usesSmartyLast = false;
+ $usesSmartyTotal = false;
+ $usesSmartyShow = false;
+ }
+
+ $usesPropFirst = $usesSmartyFirst || strpos($tpl->source->content, $ItemVarName . 'first') !== false;
+ $usesPropLast = $usesSmartyLast || strpos($tpl->source->content, $ItemVarName . 'last') !== false;
+ $usesPropIndex = $usesPropFirst || strpos($tpl->source->content, $ItemVarName . 'index') !== false;
+ $usesPropIteration = $usesPropLast || strpos($tpl->source->content, $ItemVarName . 'iteration') !== false;
+ $usesPropShow = strpos($tpl->source->content, $ItemVarName . 'show') !== false;
+ $usesPropTotal = $usesSmartyTotal || $usesSmartyShow || $usesPropShow || $usesPropLast || strpos($tpl->source->content, $ItemVarName . 'total') !== false;
+ // generate output code
+ $output = "<?php ";
+ $output .= " \$_smarty_tpl->tpl_vars[$item] = new Smarty_Variable; \$_smarty_tpl->tpl_vars[$item]->_loop = false;\n";
+ if ($key != null) {
+ $output .= " \$_smarty_tpl->tpl_vars[$key] = new Smarty_Variable;\n";
+ }
+ $output .= " \$_from = $from; if (!is_array(\$_from) && !is_object(\$_from)) { settype(\$_from, 'array');}\n";
+ if ($usesPropTotal) {
+ $output .= " \$_smarty_tpl->tpl_vars[$item]->total= \$_smarty_tpl->_count(\$_from);\n";
+ }
+ if ($usesPropIteration) {
+ $output .= " \$_smarty_tpl->tpl_vars[$item]->iteration=0;\n";
+ }
+ if ($usesPropIndex) {
+ $output .= " \$_smarty_tpl->tpl_vars[$item]->index=-1;\n";
+ }
+ if ($usesPropShow) {
+ $output .= " \$_smarty_tpl->tpl_vars[$item]->show = (\$_smarty_tpl->tpl_vars[$item]->total > 0);\n";
+ }
+ if ($has_name) {
+ if ($usesSmartyTotal) {
+ $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['total'] = \$_smarty_tpl->tpl_vars[$item]->total;\n";
+ }
+ if ($usesSmartyIteration) {
+ $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['iteration']=0;\n";
+ }
+ if ($usesSmartyIndex) {
+ $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['index']=-1;\n";
+ }
+ if ($usesSmartyShow) {
+ $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['show']=(\$_smarty_tpl->tpl_vars[$item]->total > 0);\n";
+ }
+ }
+ $output .= "foreach (\$_from as \$_smarty_tpl->tpl_vars[$item]->key => \$_smarty_tpl->tpl_vars[$item]->value){\n\$_smarty_tpl->tpl_vars[$item]->_loop = true;\n";
+ if ($key != null) {
+ $output .= " \$_smarty_tpl->tpl_vars[$key]->value = \$_smarty_tpl->tpl_vars[$item]->key;\n";
+ }
+ if ($usesPropIteration) {
+ $output .= " \$_smarty_tpl->tpl_vars[$item]->iteration++;\n";
+ }
+ if ($usesPropIndex) {
+ $output .= " \$_smarty_tpl->tpl_vars[$item]->index++;\n";
+ }
+ if ($usesPropFirst) {
+ $output .= " \$_smarty_tpl->tpl_vars[$item]->first = \$_smarty_tpl->tpl_vars[$item]->index === 0;\n";
+ }
+ if ($usesPropLast) {
+ $output .= " \$_smarty_tpl->tpl_vars[$item]->last = \$_smarty_tpl->tpl_vars[$item]->iteration === \$_smarty_tpl->tpl_vars[$item]->total;\n";
+ }
+ if ($has_name) {
+ if ($usesSmartyFirst) {
+ $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['first'] = \$_smarty_tpl->tpl_vars[$item]->first;\n";
+ }
+ if ($usesSmartyIteration) {
+ $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['iteration']++;\n";
+ }
+ if ($usesSmartyIndex) {
+ $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['index']++;\n";
+ }
+ if ($usesSmartyLast) {
+ $output .= " \$_smarty_tpl->tpl_vars['smarty']->value['foreach'][$name]['last'] = \$_smarty_tpl->tpl_vars[$item]->last;\n";
+ }
+ }
+ $output .= "?>";
+
+ return $output;
+ }
+}
+
+/**
+ * Smarty Internal Plugin Compile Foreachelse Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Foreachelse extends Smarty_Internal_CompileBase {
+
+ /**
+ * Compiles code for the {foreachelse} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @return string compiled code
+ */
+ public function compile($args, $compiler, $parameter)
+ {
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+
+ list($openTag, $nocache, $item, $key) = $this->closeTag($compiler, array('foreach'));
+ $this->openTag($compiler, 'foreachelse', array('foreachelse', $nocache, $item, $key));
+
+ return "<?php }\nif (!\$_smarty_tpl->tpl_vars[$item]->_loop) {\n?>";
+ }
+
+}
+
+/**
+ * Smarty Internal Plugin Compile Foreachclose Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Foreachclose extends Smarty_Internal_CompileBase {
+
+ /**
+ * Compiles code for the {/foreach} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @return string compiled code
+ */
+ public function compile($args, $compiler, $parameter)
+ {
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+ // must endblock be nocache?
+ if ($compiler->nocache) {
+ $compiler->tag_nocache = true;
+ }
+
+ list($openTag, $compiler->nocache, $item, $key) = $this->closeTag($compiler, array('foreach', 'foreachelse'));
+
+ return "<?php } ?>";
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_function.php b/include/smarty/libs/sysplugins/smarty_internal_compile_function.php
new file mode 100644
index 000000000..7821d2038
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_function.php
@@ -0,0 +1,166 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Function
+ *
+ * Compiles the {function} {/function} tags
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Function Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Function extends Smarty_Internal_CompileBase {
+
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $required_attributes = array('name');
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $shorttag_order = array('name');
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $optional_attributes = array('_any');
+
+ /**
+ * Compiles code for the {function} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @return boolean true
+ */
+ public function compile($args, $compiler, $parameter)
+ {
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+
+ if ($_attr['nocache'] === true) {
+ $compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno);
+ }
+ unset($_attr['nocache']);
+ $save = array($_attr, $compiler->parser->current_buffer,
+ $compiler->template->has_nocache_code, $compiler->template->required_plugins);
+ $this->openTag($compiler, 'function', $save);
+ $_name = trim($_attr['name'], "'\"");
+ unset($_attr['name']);
+ // set flag that we are compiling a template function
+ $compiler->compiles_template_function = true;
+ $compiler->template->properties['function'][$_name]['parameter'] = array();
+ $_smarty_tpl = $compiler->template;
+ foreach ($_attr as $_key => $_data) {
+ eval ('$tmp='.$_data.';');
+ $compiler->template->properties['function'][$_name]['parameter'][$_key] = $tmp;
+ }
+ $compiler->smarty->template_functions[$_name]['parameter'] = $compiler->template->properties['function'][$_name]['parameter'];
+ if ($compiler->template->caching) {
+ $output = '';
+ } else {
+ $output = "<?php if (!function_exists('smarty_template_function_{$_name}')) {
+ function smarty_template_function_{$_name}(\$_smarty_tpl,\$params) {
+ \$saved_tpl_vars = \$_smarty_tpl->tpl_vars;
+ foreach (\$_smarty_tpl->smarty->template_functions['{$_name}']['parameter'] as \$key => \$value) {\$_smarty_tpl->tpl_vars[\$key] = new Smarty_variable(\$value);};
+ foreach (\$params as \$key => \$value) {\$_smarty_tpl->tpl_vars[\$key] = new Smarty_variable(\$value);}?>";
+ }
+ // Init temporay context
+ $compiler->template->required_plugins = array('compiled' => array(), 'nocache' => array());
+ $compiler->parser->current_buffer = new _smarty_template_buffer($compiler->parser);
+ $compiler->parser->current_buffer->append_subtree(new _smarty_tag($compiler->parser, $output));
+ $compiler->template->has_nocache_code = false;
+ $compiler->has_code = false;
+ $compiler->template->properties['function'][$_name]['compiled'] = '';
+ return true;
+ }
+
+}
+
+/**
+ * Smarty Internal Plugin Compile Functionclose Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Functionclose extends Smarty_Internal_CompileBase {
+
+ /**
+ * Compiles code for the {/function} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @return boolean true
+ */
+ public function compile($args, $compiler, $parameter)
+ {
+ $_attr = $this->getAttributes($compiler, $args);
+ $saved_data = $this->closeTag($compiler, array('function'));
+ $_name = trim($saved_data[0]['name'], "'\"");
+ // build plugin include code
+ $plugins_string = '';
+ if (!empty($compiler->template->required_plugins['compiled'])) {
+ $plugins_string = '<?php ';
+ foreach($compiler->template->required_plugins['compiled'] as $tmp) {
+ foreach($tmp as $data) {
+ $plugins_string .= "if (!is_callable('{$data['function']}')) include '{$data['file']}';\n";
+ }
+ }
+ $plugins_string .= '?>';
+ }
+ if (!empty($compiler->template->required_plugins['nocache'])) {
+ $plugins_string .= "<?php echo '/*%%SmartyNocache:{$compiler->template->properties['nocache_hash']}%%*/<?php ";
+ foreach($compiler->template->required_plugins['nocache'] as $tmp) {
+ foreach($tmp as $data) {
+ $plugins_string .= "if (!is_callable(\'{$data['function']}\')) include \'{$data['file']}\';\n";
+ }
+ }
+ $plugins_string .= "?>/*/%%SmartyNocache:{$compiler->template->properties['nocache_hash']}%%*/';?>\n";
+ }
+ // remove last line break from function definition
+ $last = count($compiler->parser->current_buffer->subtrees) - 1;
+ if ($compiler->parser->current_buffer->subtrees[$last] instanceof _smarty_linebreak) {
+ unset($compiler->parser->current_buffer->subtrees[$last]);
+ }
+ // if caching save template function for possible nocache call
+ if ($compiler->template->caching) {
+ $compiler->template->properties['function'][$_name]['compiled'] .= $plugins_string
+ . $compiler->parser->current_buffer->to_smarty_php();
+ $compiler->template->properties['function'][$_name]['nocache_hash'] = $compiler->template->properties['nocache_hash'];
+ $compiler->template->properties['function'][$_name]['has_nocache_code'] = $compiler->template->has_nocache_code;
+ $compiler->template->properties['function'][$_name]['called_functions'] = $compiler->called_functions;
+ $compiler->called_functions = array();
+ $compiler->smarty->template_functions[$_name] = $compiler->template->properties['function'][$_name];
+ $compiler->has_code = false;
+ $output = true;
+ } else {
+ $output = $plugins_string . $compiler->parser->current_buffer->to_smarty_php() . "<?php \$_smarty_tpl->tpl_vars = \$saved_tpl_vars;
+foreach (Smarty::\$global_tpl_vars as \$key => \$value) if(!isset(\$_smarty_tpl->tpl_vars[\$key])) \$_smarty_tpl->tpl_vars[\$key] = \$value;}}?>\n";
+ }
+ // reset flag that we are compiling a template function
+ $compiler->compiles_template_function = false;
+ // restore old compiler status
+ $compiler->parser->current_buffer = $saved_data[1];
+ $compiler->template->has_nocache_code = $compiler->template->has_nocache_code | $saved_data[2];
+ $compiler->template->required_plugins = $saved_data[3];
+ return $output;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_if.php b/include/smarty/libs/sysplugins/smarty_internal_compile_if.php
new file mode 100644
index 000000000..8794b014b
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_if.php
@@ -0,0 +1,207 @@
+<?php
+/**
+* Smarty Internal Plugin Compile If
+*
+* Compiles the {if} {else} {elseif} {/if} tags
+*
+* @package Smarty
+* @subpackage Compiler
+* @author Uwe Tews
+*/
+
+/**
+* Smarty Internal Plugin Compile If Class
+*
+* @package Smarty
+* @subpackage Compiler
+*/
+class Smarty_Internal_Compile_If extends Smarty_Internal_CompileBase {
+
+ /**
+ * Compiles code for the {if} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @return string compiled code
+ */
+ public function compile($args, $compiler, $parameter)
+ {
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+ $this->openTag($compiler, 'if', array(1, $compiler->nocache));
+ // must whole block be nocache ?
+ $compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
+
+ if (!array_key_exists("if condition",$parameter)) {
+ $compiler->trigger_template_error("missing if condition", $compiler->lex->taglineno);
+ }
+
+ if (is_array($parameter['if condition'])) {
+ if ($compiler->nocache) {
+ $_nocache = ',true';
+ // create nocache var to make it know for further compiling
+ if (is_array($parameter['if condition']['var'])) {
+ $compiler->template->tpl_vars[trim($parameter['if condition']['var']['var'], "'")] = new Smarty_variable(null, true);
+ } else {
+ $compiler->template->tpl_vars[trim($parameter['if condition']['var'], "'")] = new Smarty_variable(null, true);
+ }
+ } else {
+ $_nocache = '';
+ }
+ if (is_array($parameter['if condition']['var'])) {
+ $_output = "<?php if (!isset(\$_smarty_tpl->tpl_vars[".$parameter['if condition']['var']['var']."]) || !is_array(\$_smarty_tpl->tpl_vars[".$parameter['if condition']['var']['var']."]->value)) \$_smarty_tpl->createLocalArrayVariable(".$parameter['if condition']['var']['var']."$_nocache);\n";
+ $_output .= "if (\$_smarty_tpl->tpl_vars[".$parameter['if condition']['var']['var']."]->value".$parameter['if condition']['var']['smarty_internal_index']." = ".$parameter['if condition']['value']."){?>";
+ } else {
+ $_output = "<?php if (!isset(\$_smarty_tpl->tpl_vars[".$parameter['if condition']['var']."])) \$_smarty_tpl->tpl_vars[".$parameter['if condition']['var']."] = new Smarty_Variable(null{$_nocache});";
+ $_output .= "if (\$_smarty_tpl->tpl_vars[".$parameter['if condition']['var']."]->value = ".$parameter['if condition']['value']."){?>";
+ }
+ return $_output;
+ } else {
+ return "<?php if ({$parameter['if condition']}){?>";
+ }
+ }
+
+}
+
+/**
+* Smarty Internal Plugin Compile Else Class
+*
+* @package Smarty
+* @subpackage Compiler
+*/
+class Smarty_Internal_Compile_Else extends Smarty_Internal_CompileBase {
+
+ /**
+ * Compiles code for the {else} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @return string compiled code
+ */
+ public function compile($args, $compiler, $parameter)
+ {
+ list($nesting, $compiler->tag_nocache) = $this->closeTag($compiler, array('if', 'elseif'));
+ $this->openTag($compiler, 'else', array($nesting, $compiler->tag_nocache));
+
+ return "<?php }else{ ?>";
+ }
+
+}
+
+/**
+* Smarty Internal Plugin Compile ElseIf Class
+*
+* @package Smarty
+* @subpackage Compiler
+*/
+class Smarty_Internal_Compile_Elseif extends Smarty_Internal_CompileBase {
+
+ /**
+ * Compiles code for the {elseif} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @return string compiled code
+ */
+ public function compile($args, $compiler, $parameter)
+ {
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+
+ list($nesting, $compiler->tag_nocache) = $this->closeTag($compiler, array('if', 'elseif'));
+
+ if (!array_key_exists("if condition",$parameter)) {
+ $compiler->trigger_template_error("missing elseif condition", $compiler->lex->taglineno);
+ }
+
+ if (is_array($parameter['if condition'])) {
+ $condition_by_assign = true;
+ if ($compiler->nocache) {
+ $_nocache = ',true';
+ // create nocache var to make it know for further compiling
+ if (is_array($parameter['if condition']['var'])) {
+ $compiler->template->tpl_vars[trim($parameter['if condition']['var']['var'], "'")] = new Smarty_variable(null, true);
+ } else {
+ $compiler->template->tpl_vars[trim($parameter['if condition']['var'], "'")] = new Smarty_variable(null, true);
+ }
+ } else {
+ $_nocache = '';
+ }
+ } else {
+ $condition_by_assign = false;
+ }
+
+ if (empty($compiler->prefix_code)) {
+ if ($condition_by_assign) {
+ $this->openTag($compiler, 'elseif', array($nesting + 1, $compiler->tag_nocache));
+ if (is_array($parameter['if condition']['var'])) {
+ $_output = "<?php }else{ if (!isset(\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var']['var'] . "]) || !is_array(\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var']['var'] . "]->value)) \$_smarty_tpl->createLocalArrayVariable(" . $parameter['if condition']['var']['var'] . "$_nocache);\n";
+ $_output .= "if (\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var']['var'] . "]->value" . $parameter['if condition']['var']['smarty_internal_index'] . " = " . $parameter['if condition']['value'] . "){?>";
+ } else {
+ $_output = "<?php }else{ if (!isset(\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var'] . "])) \$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var'] . "] = new Smarty_Variable(null{$_nocache});";
+ $_output .= "if (\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var'] . "]->value = " . $parameter['if condition']['value'] . "){?>";
+ }
+ return $_output;
+ } else {
+ $this->openTag($compiler, 'elseif', array($nesting, $compiler->tag_nocache));
+ return "<?php }elseif({$parameter['if condition']}){?>";
+ }
+ } else {
+ $tmp = '';
+ foreach ($compiler->prefix_code as $code)
+ $tmp .= $code;
+ $compiler->prefix_code = array();
+ $this->openTag($compiler, 'elseif', array($nesting + 1, $compiler->tag_nocache));
+ if ($condition_by_assign) {
+ if (is_array($parameter['if condition']['var'])) {
+ $_output = "<?php }else{?>{$tmp}<?php if (!isset(\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var']['var'] . "]) || !is_array(\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var']['var'] . "]->value)) \$_smarty_tpl->createLocalArrayVariable(" . $parameter['if condition']['var']['var'] . "$_nocache);\n";
+ $_output .= "if (\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var']['var'] . "]->value" . $parameter['if condition']['var']['smarty_internal_index'] . " = " . $parameter['if condition']['value'] . "){?>";
+ } else {
+ $_output = "<?php }else{?>{$tmp}<?php if (!isset(\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var'] . "])) \$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var'] . "] = new Smarty_Variable(null{$_nocache});";
+ $_output .= "if (\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var'] . "]->value = " . $parameter['if condition']['value'] . "){?>";
+ }
+ return $_output;
+ } else {
+ return "<?php }else{?>{$tmp}<?php if ({$parameter['if condition']}){?>";
+ }
+ }
+ }
+
+}
+
+/**
+* Smarty Internal Plugin Compile Ifclose Class
+*
+* @package Smarty
+* @subpackage Compiler
+*/
+class Smarty_Internal_Compile_Ifclose extends Smarty_Internal_CompileBase {
+
+ /**
+ * Compiles code for the {/if} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @return string compiled code
+ */
+ public function compile($args, $compiler, $parameter)
+ {
+ // must endblock be nocache?
+ if ($compiler->nocache) {
+ $compiler->tag_nocache = true;
+ }
+ list($nesting, $compiler->nocache) = $this->closeTag($compiler, array('if', 'else', 'elseif'));
+ $tmp = '';
+ for ($i = 0; $i < $nesting; $i++) {
+ $tmp .= '}';
+ }
+ return "<?php {$tmp}?>";
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_include.php b/include/smarty/libs/sysplugins/smarty_internal_compile_include.php
new file mode 100644
index 000000000..43a144f94
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_include.php
@@ -0,0 +1,215 @@
+<?php
+/**
+* Smarty Internal Plugin Compile Include
+*
+* Compiles the {include} tag
+*
+* @package Smarty
+* @subpackage Compiler
+* @author Uwe Tews
+*/
+
+/**
+* Smarty Internal Plugin Compile Include Class
+*
+* @package Smarty
+* @subpackage Compiler
+*/
+class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase {
+
+ /**
+ * caching mode to create nocache code but no cache file
+ */
+ const CACHING_NOCACHE_CODE = 9999;
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $required_attributes = array('file');
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $shorttag_order = array('file');
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $option_flags = array('nocache', 'inline', 'caching');
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $optional_attributes = array('_any');
+
+ /**
+ * Compiles code for the {include} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @return string compiled code
+ */
+ public function compile($args, $compiler, $parameter)
+ {
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+ // save posible attributes
+ $include_file = $_attr['file'];
+
+ if (isset($_attr['assign'])) {
+ // output will be stored in a smarty variable instead of beind displayed
+ $_assign = $_attr['assign'];
+ }
+
+ $_parent_scope = Smarty::SCOPE_LOCAL;
+ if (isset($_attr['scope'])) {
+ $_attr['scope'] = trim($_attr['scope'], "'\"");
+ if ($_attr['scope'] == 'parent') {
+ $_parent_scope = Smarty::SCOPE_PARENT;
+ } elseif ($_attr['scope'] == 'root') {
+ $_parent_scope = Smarty::SCOPE_ROOT;
+ } elseif ($_attr['scope'] == 'global') {
+ $_parent_scope = Smarty::SCOPE_GLOBAL;
+ }
+ }
+ $_caching = 'null';
+ if ($compiler->nocache || $compiler->tag_nocache) {
+ $_caching = Smarty::CACHING_OFF;
+ }
+ // default for included templates
+ if ($compiler->template->caching && !$compiler->nocache && !$compiler->tag_nocache) {
+ $_caching = self::CACHING_NOCACHE_CODE;
+ }
+ /*
+ * if the {include} tag provides individual parameter for caching
+ * it will not be included into the common cache file and treated like
+ * a nocache section
+ */
+ if (isset($_attr['cache_lifetime'])) {
+ $_cache_lifetime = $_attr['cache_lifetime'];
+ $compiler->tag_nocache = true;
+ $_caching = Smarty::CACHING_LIFETIME_CURRENT;
+ } else {
+ $_cache_lifetime = 'null';
+ }
+ if (isset($_attr['cache_id'])) {
+ $_cache_id = $_attr['cache_id'];
+ $compiler->tag_nocache = true;
+ $_caching = Smarty::CACHING_LIFETIME_CURRENT;
+ } else {
+ $_cache_id = '$_smarty_tpl->cache_id';
+ }
+ if (isset($_attr['compile_id'])) {
+ $_compile_id = $_attr['compile_id'];
+ } else {
+ $_compile_id = '$_smarty_tpl->compile_id';
+ }
+ if ($_attr['caching'] === true) {
+ $_caching = Smarty::CACHING_LIFETIME_CURRENT;
+ }
+ if ($_attr['nocache'] === true) {
+ $compiler->tag_nocache = true;
+ $_caching = Smarty::CACHING_OFF;
+ }
+
+ $has_compiled_template = false;
+ if (($compiler->smarty->merge_compiled_includes || $_attr['inline'] === true) && !$compiler->template->source->recompiled
+ && !($compiler->template->caching && ($compiler->tag_nocache || $compiler->nocache)) && $_caching != Smarty::CACHING_LIFETIME_CURRENT) {
+ // check if compiled code can be merged (contains no variable part)
+ if (!$compiler->has_variable_string && (substr_count($include_file, '"') == 2 or substr_count($include_file, "'") == 2)
+ and substr_count($include_file, '(') == 0 and substr_count($include_file, '$_smarty_tpl->') == 0) {
+ $tpl_name = null;
+ eval("\$tpl_name = $include_file;");
+ if (!isset($compiler->smarty->merged_templates_func[$tpl_name]) || $compiler->inheritance) {
+ $tpl = new $compiler->smarty->template_class ($tpl_name, $compiler->smarty, $compiler->template, $compiler->template->cache_id, $compiler->template->compile_id);
+ // save unique function name
+ $compiler->smarty->merged_templates_func[$tpl_name]['func'] = $tpl->properties['unifunc'] = 'content_'. str_replace('.', '_', uniqid('', true));
+ // use current nocache hash for inlined code
+ $compiler->smarty->merged_templates_func[$tpl_name]['nocache_hash'] = $tpl->properties['nocache_hash'] = $compiler->template->properties['nocache_hash'];
+ if ($compiler->template->caching) {
+ // needs code for cached page but no cache file
+ $tpl->caching = self::CACHING_NOCACHE_CODE;
+ }
+ // make sure whole chain gest compiled
+ $tpl->mustCompile = true;
+ if (!($tpl->source->uncompiled) && $tpl->source->exists) {
+ // get compiled code
+ $compiled_code = $tpl->compiler->compileTemplate($tpl);
+ // release compiler object to free memory
+ unset($tpl->compiler);
+ // merge compiled code for {function} tags
+ $compiler->template->properties['function'] = array_merge($compiler->template->properties['function'], $tpl->properties['function']);
+ // merge filedependency
+ $tpl->properties['file_dependency'][$tpl->source->uid] = array($tpl->source->filepath, $tpl->source->timestamp,$tpl->source->type);
+ $compiler->template->properties['file_dependency'] = array_merge($compiler->template->properties['file_dependency'], $tpl->properties['file_dependency']);
+ // remove header code
+ $compiled_code = preg_replace("/(<\?php \/\*%%SmartyHeaderCode:{$tpl->properties['nocache_hash']}%%\*\/(.+?)\/\*\/%%SmartyHeaderCode%%\*\/\?>\n)/s", '', $compiled_code);
+ if ($tpl->has_nocache_code) {
+ // replace nocache_hash
+ $compiled_code = str_replace("{$tpl->properties['nocache_hash']}", $compiler->template->properties['nocache_hash'], $compiled_code);
+ $compiler->template->has_nocache_code = true;
+ }
+ $compiler->merged_templates[$tpl->properties['unifunc']] = $compiled_code;
+ $has_compiled_template = true;
+ }
+ } else {
+ $has_compiled_template = true;
+ }
+ }
+ }
+ // delete {include} standard attributes
+ unset($_attr['file'], $_attr['assign'], $_attr['cache_id'], $_attr['compile_id'], $_attr['cache_lifetime'], $_attr['nocache'], $_attr['caching'], $_attr['scope'], $_attr['inline']);
+ // remaining attributes must be assigned as smarty variable
+ if (!empty($_attr)) {
+ if ($_parent_scope == Smarty::SCOPE_LOCAL) {
+ // create variables
+ foreach ($_attr as $key => $value) {
+ $_pairs[] = "'$key'=>$value";
+ }
+ $_vars = 'array('.join(',',$_pairs).')';
+ $_has_vars = true;
+ } else {
+ $compiler->trigger_template_error('variable passing not allowed in parent/global scope', $compiler->lex->taglineno);
+ }
+ } else {
+ $_vars = 'array()';
+ $_has_vars = false;
+ }
+ if ($has_compiled_template) {
+ $_hash = $compiler->smarty->merged_templates_func[$tpl_name]['nocache_hash'];
+ $_output = "<?php /* Call merged included template \"" . $tpl_name . "\" */\n";
+ $_output .= "\$_tpl_stack[] = \$_smarty_tpl;\n";
+ $_output .= " \$_smarty_tpl = \$_smarty_tpl->setupInlineSubTemplate($include_file, $_cache_id, $_compile_id, $_caching, $_cache_lifetime, $_vars, $_parent_scope, '$_hash');\n";
+ if (isset($_assign)) {
+ $_output .= 'ob_start(); ';
+ }
+ $_output .= $compiler->smarty->merged_templates_func[$tpl_name]['func']. "(\$_smarty_tpl);\n";
+ $_output .= "\$_smarty_tpl = array_pop(\$_tpl_stack); ";
+ if (isset($_assign)) {
+ $_output .= " \$_smarty_tpl->tpl_vars[$_assign] = new Smarty_variable(ob_get_clean());";
+ }
+ $_output .= "/* End of included template \"" . $tpl_name . "\" */?>";
+ return $_output;
+ }
+
+ // was there an assign attribute
+ if (isset($_assign)) {
+ $_output = "<?php \$_smarty_tpl->tpl_vars[$_assign] = new Smarty_variable(\$_smarty_tpl->getSubTemplate ($include_file, $_cache_id, $_compile_id, $_caching, $_cache_lifetime, $_vars, $_parent_scope));?>\n";;
+ } else {
+ $_output = "<?php echo \$_smarty_tpl->getSubTemplate ($include_file, $_cache_id, $_compile_id, $_caching, $_cache_lifetime, $_vars, $_parent_scope);?>\n";
+ }
+ return $_output;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_include_php.php b/include/smarty/libs/sysplugins/smarty_internal_compile_include_php.php
new file mode 100644
index 000000000..d52712368
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_include_php.php
@@ -0,0 +1,108 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Include PHP
+ *
+ * Compiles the {include_php} tag
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Insert Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Include_Php extends Smarty_Internal_CompileBase {
+
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $required_attributes = array('file');
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $shorttag_order = array('file');
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $optional_attributes = array('once', 'assign');
+
+ /**
+ * Compiles code for the {include_php} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @return string compiled code
+ */
+ public function compile($args, $compiler)
+ {
+ if (!($compiler->smarty instanceof SmartyBC)) {
+ throw new SmartyException("{include_php} is deprecated, use SmartyBC class to enable");
+ }
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+
+ $_output = '<?php ';
+
+ $_smarty_tpl = $compiler->template;
+ $_filepath = false;
+ eval('$_file = ' . $_attr['file'] . ';');
+ if (!isset($compiler->smarty->security_policy) && file_exists($_file)) {
+ $_filepath = $_file;
+ } else {
+ if (isset($compiler->smarty->security_policy)) {
+ $_dir = $compiler->smarty->security_policy->trusted_dir;
+ } else {
+ $_dir = $compiler->smarty->trusted_dir;
+ }
+ if (!empty($_dir)) {
+ foreach((array)$_dir as $_script_dir) {
+ $_script_dir = rtrim($_script_dir, '/\\') . DS;
+ if (file_exists($_script_dir . $_file)) {
+ $_filepath = $_script_dir . $_file;
+ break;
+ }
+ }
+ }
+ }
+ if ($_filepath == false) {
+ $compiler->trigger_template_error("{include_php} file '{$_file}' is not readable", $compiler->lex->taglineno);
+ }
+
+ if (isset($compiler->smarty->security_policy)) {
+ $compiler->smarty->security_policy->isTrustedPHPDir($_filepath);
+ }
+
+ if (isset($_attr['assign'])) {
+ // output will be stored in a smarty variable instead of being displayed
+ $_assign = $_attr['assign'];
+ }
+ $_once = '_once';
+ if (isset($_attr['once'])) {
+ if ($_attr['once'] == 'false') {
+ $_once = '';
+ }
+ }
+
+ if (isset($_assign)) {
+ return "<?php ob_start(); include{$_once} ('{$_filepath}'); \$_smarty_tpl->assign({$_assign},ob_get_contents()); ob_end_clean();?>";
+ } else {
+ return "<?php include{$_once} ('{$_filepath}');?>\n";
+ }
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_insert.php b/include/smarty/libs/sysplugins/smarty_internal_compile_insert.php
new file mode 100644
index 000000000..e4d3f9355
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_insert.php
@@ -0,0 +1,142 @@
+<?php
+
+/**
+ * Smarty Internal Plugin Compile Insert
+ *
+ * Compiles the {insert} tag
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Insert Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase {
+
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $required_attributes = array('name');
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $shorttag_order = array('name');
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $optional_attributes = array('_any');
+
+ /**
+ * Compiles code for the {insert} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @return string compiled code
+ */
+ public function compile($args, $compiler)
+ {
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+ // never compile as nocache code
+ $compiler->suppressNocacheProcessing = true;
+ $compiler->tag_nocache = true;
+ $_smarty_tpl = $compiler->template;
+ $_name = null;
+ $_script = null;
+
+ $_output = '<?php ';
+ // save posible attributes
+ eval('$_name = ' . $_attr['name'] . ';');
+ if (isset($_attr['assign'])) {
+ // output will be stored in a smarty variable instead of being displayed
+ $_assign = $_attr['assign'];
+ // create variable to make shure that the compiler knows about its nocache status
+ $compiler->template->tpl_vars[trim($_attr['assign'], "'")] = new Smarty_Variable(null, true);
+ }
+ if (isset($_attr['script'])) {
+ // script which must be included
+ $_function = "smarty_insert_{$_name}";
+ $_smarty_tpl = $compiler->template;
+ $_filepath = false;
+ eval('$_script = ' . $_attr['script'] . ';');
+ if (!isset($compiler->smarty->security_policy) && file_exists($_script)) {
+ $_filepath = $_script;
+ } else {
+ if (isset($compiler->smarty->security_policy)) {
+ $_dir = $compiler->smarty->security_policy->trusted_dir;
+ } else {
+ $_dir = $compiler->smarty->trusted_dir;
+ }
+ if (!empty($_dir)) {
+ foreach((array)$_dir as $_script_dir) {
+ $_script_dir = rtrim($_script_dir, '/\\') . DS;
+ if (file_exists($_script_dir . $_script)) {
+ $_filepath = $_script_dir . $_script;
+ break;
+ }
+ }
+ }
+ }
+ if ($_filepath == false) {
+ $compiler->trigger_template_error("{insert} missing script file '{$_script}'", $compiler->lex->taglineno);
+ }
+ // code for script file loading
+ $_output .= "require_once '{$_filepath}' ;";
+ require_once $_filepath;
+ if (!is_callable($_function)) {
+ $compiler->trigger_template_error(" {insert} function '{$_function}' is not callable in script file '{$_script}'", $compiler->lex->taglineno);
+ }
+ } else {
+ $_filepath = 'null';
+ $_function = "insert_{$_name}";
+ // function in PHP script ?
+ if (!is_callable($_function)) {
+ // try plugin
+ if (!$_function = $compiler->getPlugin($_name, 'insert')) {
+ $compiler->trigger_template_error("{insert} no function or plugin found for '{$_name}'", $compiler->lex->taglineno);
+ }
+ }
+ }
+ // delete {insert} standard attributes
+ unset($_attr['name'], $_attr['assign'], $_attr['script'], $_attr['nocache']);
+ // convert attributes into parameter array string
+ $_paramsArray = array();
+ foreach ($_attr as $_key => $_value) {
+ $_paramsArray[] = "'$_key' => $_value";
+ }
+ $_params = 'array(' . implode(", ", $_paramsArray) . ')';
+ // call insert
+ if (isset($_assign)) {
+ if ($_smarty_tpl->caching) {
+ $_output .= "echo Smarty_Internal_Nocache_Insert::compile ('{$_function}',{$_params}, \$_smarty_tpl, '{$_filepath}',{$_assign});?>";
+ } else {
+ $_output .= "\$_smarty_tpl->assign({$_assign} , {$_function} ({$_params},\$_smarty_tpl), true);?>";
+ }
+ } else {
+ $compiler->has_output = true;
+ if ($_smarty_tpl->caching) {
+ $_output .= "echo Smarty_Internal_Nocache_Insert::compile ('{$_function}',{$_params}, \$_smarty_tpl, '{$_filepath}');?>";
+ } else {
+ $_output .= "echo {$_function}({$_params},\$_smarty_tpl);?>";
+ }
+ }
+ return $_output;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_ldelim.php b/include/smarty/libs/sysplugins/smarty_internal_compile_ldelim.php
new file mode 100644
index 000000000..990632590
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_ldelim.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Ldelim
+ *
+ * Compiles the {ldelim} tag
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Ldelim Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Ldelim extends Smarty_Internal_CompileBase {
+
+ /**
+ * Compiles code for the {ldelim} tag
+ *
+ * This tag does output the left delimiter
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @return string compiled code
+ */
+ public function compile($args, $compiler)
+ {
+ $_attr = $this->getAttributes($compiler, $args);
+ if ($_attr['nocache'] === true) {
+ $compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno);
+ }
+ // this tag does not return compiled code
+ $compiler->has_code = true;
+ return $compiler->smarty->left_delimiter;
+ }
+
+}
+
+?>
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_nocache.php b/include/smarty/libs/sysplugins/smarty_internal_compile_nocache.php
new file mode 100644
index 000000000..5fb71b71d
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_nocache.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Nocache
+ *
+ * Compiles the {nocache} {/nocache} tags.
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Nocache Classv
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Nocache extends Smarty_Internal_CompileBase {
+
+ /**
+ * Compiles code for the {nocache} tag
+ *
+ * This tag does not generate compiled output. It only sets a compiler flag.
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @return bool
+ */
+ public function compile($args, $compiler)
+ {
+ $_attr = $this->getAttributes($compiler, $args);
+ if ($_attr['nocache'] === true) {
+ $compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno);
+ }
+ // enter nocache mode
+ $compiler->nocache = true;
+ // this tag does not return compiled code
+ $compiler->has_code = false;
+ return true;
+ }
+
+}
+
+/**
+ * Smarty Internal Plugin Compile Nocacheclose Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Nocacheclose extends Smarty_Internal_CompileBase {
+
+ /**
+ * Compiles code for the {/nocache} tag
+ *
+ * This tag does not generate compiled output. It only sets a compiler flag.
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @return bool
+ */
+ public function compile($args, $compiler)
+ {
+ $_attr = $this->getAttributes($compiler, $args);
+ // leave nocache mode
+ $compiler->nocache = false;
+ // this tag does not return compiled code
+ $compiler->has_code = false;
+ return true;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_private_block_plugin.php b/include/smarty/libs/sysplugins/smarty_internal_compile_private_block_plugin.php
new file mode 100644
index 000000000..5288f4560
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_private_block_plugin.php
@@ -0,0 +1,87 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Block Plugin
+ *
+ * Compiles code for the execution of block plugin
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Block Plugin Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Private_Block_Plugin extends Smarty_Internal_CompileBase {
+
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $optional_attributes = array('_any');
+
+ /**
+ * Compiles code for the execution of block plugin
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @param string $tag name of block plugin
+ * @param string $function PHP function name
+ * @return string compiled code
+ */
+ public function compile($args, $compiler, $parameter, $tag, $function)
+ {
+ if (!isset($tag[5]) || substr($tag, -5) != 'close') {
+ // opening tag of block plugin
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+ if ($_attr['nocache'] === true) {
+ $compiler->tag_nocache = true;
+ }
+ unset($_attr['nocache']);
+ // convert attributes into parameter array string
+ $_paramsArray = array();
+ foreach ($_attr as $_key => $_value) {
+ if (is_int($_key)) {
+ $_paramsArray[] = "$_key=>$_value";
+ } else {
+ $_paramsArray[] = "'$_key'=>$_value";
+ }
+ }
+ $_params = 'array(' . implode(",", $_paramsArray) . ')';
+
+ $this->openTag($compiler, $tag, array($_params, $compiler->nocache));
+ // maybe nocache because of nocache variables or nocache plugin
+ $compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
+ // compile code
+ $output = "<?php \$_smarty_tpl->smarty->_tag_stack[] = array('{$tag}', {$_params}); \$_block_repeat=true; echo {$function}({$_params}, null, \$_smarty_tpl, \$_block_repeat);while (\$_block_repeat) { ob_start();?>";
+ } else {
+ // must endblock be nocache?
+ if ($compiler->nocache) {
+ $compiler->tag_nocache = true;
+ }
+ // closing tag of block plugin, restore nocache
+ list($_params, $compiler->nocache) = $this->closeTag($compiler, substr($tag, 0, -5));
+ // This tag does create output
+ $compiler->has_output = true;
+ // compile code
+ if (!isset($parameter['modifier_list'])) {
+ $mod_pre = $mod_post ='';
+ } else {
+ $mod_pre = ' ob_start(); ';
+ $mod_post = 'echo '.$compiler->compileTag('private_modifier',array(),array('modifierlist'=>$parameter['modifier_list'],'value'=>'ob_get_clean()')).';';
+ }
+ $output = "<?php \$_block_content = ob_get_clean(); \$_block_repeat=false;".$mod_pre." echo {$function}({$_params}, \$_block_content, \$_smarty_tpl, \$_block_repeat); ".$mod_post." } array_pop(\$_smarty_tpl->smarty->_tag_stack);?>";
+ }
+ return $output . "\n";
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_private_function_plugin.php b/include/smarty/libs/sysplugins/smarty_internal_compile_private_function_plugin.php
new file mode 100644
index 000000000..70e764318
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_private_function_plugin.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Function Plugin
+ *
+ * Compiles code for the execution of function plugin
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Function Plugin Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Private_Function_Plugin extends Smarty_Internal_CompileBase {
+
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $required_attributes = array();
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $optional_attributes = array('_any');
+
+ /**
+ * Compiles code for the execution of function plugin
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @param string $tag name of function plugin
+ * @param string $function PHP function name
+ * @return string compiled code
+ */
+ public function compile($args, $compiler, $parameter, $tag, $function)
+ {
+ // This tag does create output
+ $compiler->has_output = true;
+
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+ if ($_attr['nocache'] === true) {
+ $compiler->tag_nocache = true;
+ }
+ unset($_attr['nocache']);
+ // convert attributes into parameter array string
+ $_paramsArray = array();
+ foreach ($_attr as $_key => $_value) {
+ if (is_int($_key)) {
+ $_paramsArray[] = "$_key=>$_value";
+ } else {
+ $_paramsArray[] = "'$_key'=>$_value";
+ }
+ }
+ $_params = 'array(' . implode(",", $_paramsArray) . ')';
+ // compile code
+ $output = "<?php echo {$function}({$_params},\$_smarty_tpl);?>\n";
+ return $output;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_private_modifier.php b/include/smarty/libs/sysplugins/smarty_internal_compile_private_modifier.php
new file mode 100644
index 000000000..a33109cc0
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_private_modifier.php
@@ -0,0 +1,140 @@
+<?php
+
+/**
+ * Smarty Internal Plugin Compile Modifier
+ *
+ * Compiles code for modifier execution
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Modifier Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Private_Modifier extends Smarty_Internal_CompileBase {
+
+ /**
+ * Compiles code for modifier execution
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @return string compiled code
+ */
+ public function compile($args, $compiler, $parameter) {
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+ $output = $parameter['value'];
+ // loop over list of modifiers
+ foreach ($parameter['modifierlist'] as $single_modifier) {
+ $modifier = $single_modifier[0];
+ $single_modifier[0] = $output;
+ $params = implode(',', $single_modifier);
+ // check if we know already the type of modifier
+ if (isset($compiler->known_modifier_type[$modifier])) {
+ $modifier_types = array($compiler->known_modifier_type[$modifier]);
+ } else {
+ $modifier_types = array(1, 2, 3, 4, 5, 6);
+ }
+ foreach ($modifier_types as $type) {
+ switch ($type) {
+ case 1:
+ // registered modifier
+ if (isset($compiler->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][$modifier])) {
+ $function = $compiler->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][$modifier][0];
+ if (!is_array($function)) {
+ $output = "{$function}({$params})";
+ } else {
+ if (is_object($function[0])) {
+ $output = '$_smarty_tpl->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][\'' . $modifier . '\'][0][0]->' . $function[1] . '(' . $params . ')';
+ } else {
+ $output = $function[0] . '::' . $function[1] . '(' . $params . ')';
+ }
+ }
+ $compiler->known_modifier_type[$modifier] = $type;
+ break 2;
+ }
+ break;
+ case 2:
+ // registered modifier compiler
+ if (isset($compiler->smarty->registered_plugins[Smarty::PLUGIN_MODIFIERCOMPILER][$modifier][0])) {
+ $output = call_user_func($compiler->smarty->registered_plugins[Smarty::PLUGIN_MODIFIERCOMPILER][$modifier][0], $single_modifier, $compiler->smarty);
+ $compiler->known_modifier_type[$modifier] = $type;
+ break 2;
+ }
+ break;
+ case 3:
+ // modifiercompiler plugin
+ if ($compiler->smarty->loadPlugin('smarty_modifiercompiler_' . $modifier)) {
+ // check if modifier allowed
+ if (!is_object($compiler->smarty->security_policy) || $compiler->smarty->security_policy->isTrustedModifier($modifier, $compiler)) {
+ $plugin = 'smarty_modifiercompiler_' . $modifier;
+ $output = $plugin($single_modifier, $compiler);
+ }
+ $compiler->known_modifier_type[$modifier] = $type;
+ break 2;
+ }
+ break;
+ case 4:
+ // modifier plugin
+ if ($function = $compiler->getPlugin($modifier, Smarty::PLUGIN_MODIFIER)) {
+ // check if modifier allowed
+ if (!is_object($compiler->smarty->security_policy) || $compiler->smarty->security_policy->isTrustedModifier($modifier, $compiler)) {
+ $output = "{$function}({$params})";
+ }
+ $compiler->known_modifier_type[$modifier] = $type;
+ break 2;
+ }
+ break;
+ case 5:
+ // PHP function
+ if (is_callable($modifier)) {
+ // check if modifier allowed
+ if (!is_object($compiler->smarty->security_policy) || $compiler->smarty->security_policy->isTrustedPhpModifier($modifier, $compiler)) {
+ $output = "{$modifier}({$params})";
+ }
+ $compiler->known_modifier_type[$modifier] = $type;
+ break 2;
+ }
+ break;
+ case 6:
+ // default plugin handler
+ if (isset($compiler->default_handler_plugins[Smarty::PLUGIN_MODIFIER][$modifier]) || (is_callable($compiler->smarty->default_plugin_handler_func) && $compiler->getPluginFromDefaultHandler($modifier, Smarty::PLUGIN_MODIFIER))) {
+ $function = $compiler->default_handler_plugins[Smarty::PLUGIN_MODIFIER][$modifier][0];
+ // check if modifier allowed
+ if (!is_object($compiler->smarty->security_policy) || $compiler->smarty->security_policy->isTrustedModifier($modifier, $compiler)) {
+ if (!is_array($function)) {
+ $output = "{$function}({$params})";
+ } else {
+ if (is_object($function[0])) {
+ $output = '$_smarty_tpl->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][\'' . $modifier . '\'][0][0]->' . $function[1] . '(' . $params . ')';
+ } else {
+ $output = $function[0] . '::' . $function[1] . '(' . $params . ')';
+ }
+ }
+ }
+ if (isset($compiler->template->required_plugins['nocache'][$modifier][Smarty::PLUGIN_MODIFIER]['file']) || isset($compiler->template->required_plugins['compiled'][$modifier][Smarty::PLUGIN_MODIFIER]['file'])) {
+ // was a plugin
+ $compiler->known_modifier_type[$modifier] = 4;
+ } else {
+ $compiler->known_modifier_type[$modifier] = $type;
+ }
+ break 2;
+ }
+ }
+ }
+ if (!isset($compiler->known_modifier_type[$modifier])) {
+ $compiler->trigger_template_error("unknown modifier \"" . $modifier . "\"", $compiler->lex->taglineno);
+ }
+ }
+ return $output;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_private_object_block_function.php b/include/smarty/libs/sysplugins/smarty_internal_compile_private_object_block_function.php
new file mode 100644
index 000000000..cca924d10
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_private_object_block_function.php
@@ -0,0 +1,88 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Object Block Function
+ *
+ * Compiles code for registered objects as block function
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Object Block Function Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Private_Object_Block_Function extends Smarty_Internal_CompileBase {
+
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $optional_attributes = array('_any');
+
+ /**
+ * Compiles code for the execution of block plugin
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @param string $tag name of block object
+ * @param string $method name of method to call
+ * @return string compiled code
+ */
+ public function compile($args, $compiler, $parameter, $tag, $method)
+ {
+ if (!isset($tag[5]) || substr($tag, -5) != 'close') {
+ // opening tag of block plugin
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+ if ($_attr['nocache'] === true) {
+ $compiler->tag_nocache = true;
+ }
+ unset($_attr['nocache']);
+ // convert attributes into parameter array string
+ $_paramsArray = array();
+ foreach ($_attr as $_key => $_value) {
+ if (is_int($_key)) {
+ $_paramsArray[] = "$_key=>$_value";
+ } else {
+ $_paramsArray[] = "'$_key'=>$_value";
+ }
+ }
+ $_params = 'array(' . implode(",", $_paramsArray) . ')';
+
+ $this->openTag($compiler, $tag . '->' . $method, array($_params, $compiler->nocache));
+ // maybe nocache because of nocache variables or nocache plugin
+ $compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
+ // compile code
+ $output = "<?php \$_smarty_tpl->smarty->_tag_stack[] = array('{$tag}->{$method}', {$_params}); \$_block_repeat=true; echo \$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$method}({$_params}, null, \$_smarty_tpl, \$_block_repeat);while (\$_block_repeat) { ob_start();?>";
+ } else {
+ $base_tag = substr($tag, 0, -5);
+ // must endblock be nocache?
+ if ($compiler->nocache) {
+ $compiler->tag_nocache = true;
+ }
+ // closing tag of block plugin, restore nocache
+ list($_params, $compiler->nocache) = $this->closeTag($compiler, $base_tag . '->' . $method);
+ // This tag does create output
+ $compiler->has_output = true;
+ // compile code
+ if (!isset($parameter['modifier_list'])) {
+ $mod_pre = $mod_post = '';
+ } else {
+ $mod_pre = ' ob_start(); ';
+ $mod_post = 'echo ' . $compiler->compileTag('private_modifier', array(), array('modifierlist' => $parameter['modifier_list'], 'value' => 'ob_get_clean()')) . ';';
+ }
+ $output = "<?php \$_block_content = ob_get_contents(); ob_end_clean(); \$_block_repeat=false;" . $mod_pre . " echo \$_smarty_tpl->smarty->registered_objects['{$base_tag}'][0]->{$method}({$_params}, \$_block_content, \$_smarty_tpl, \$_block_repeat); " . $mod_post . " } array_pop(\$_smarty_tpl->smarty->_tag_stack);?>";
+ }
+ return $output . "\n";
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_private_object_function.php b/include/smarty/libs/sysplugins/smarty_internal_compile_private_object_function.php
new file mode 100644
index 000000000..f649084c3
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_private_object_function.php
@@ -0,0 +1,79 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Object Funtion
+ *
+ * Compiles code for registered objects as function
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Object Function Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Private_Object_Function extends Smarty_Internal_CompileBase {
+
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $optional_attributes = array('_any');
+
+ /**
+ * Compiles code for the execution of function plugin
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @param string $tag name of function
+ * @param string $method name of method to call
+ * @return string compiled code
+ */
+ public function compile($args, $compiler, $parameter, $tag, $method)
+ {
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+ if ($_attr['nocache'] === true) {
+ $compiler->tag_nocache = true;
+ }
+ unset($_attr['nocache']);
+ $_assign = null;
+ if (isset($_attr['assign'])) {
+ $_assign = $_attr['assign'];
+ unset($_attr['assign']);
+ }
+ // convert attributes into parameter array string
+ if ($compiler->smarty->registered_objects[$tag][2]) {
+ $_paramsArray = array();
+ foreach ($_attr as $_key => $_value) {
+ if (is_int($_key)) {
+ $_paramsArray[] = "$_key=>$_value";
+ } else {
+ $_paramsArray[] = "'$_key'=>$_value";
+ }
+ }
+ $_params = 'array(' . implode(",", $_paramsArray) . ')';
+ $return = "\$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$method}({$_params},\$_smarty_tpl)";
+ } else {
+ $_params = implode(",", $_attr);
+ $return = "\$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$method}({$_params})";
+ }
+ if (empty($_assign)) {
+ // This tag does create output
+ $compiler->has_output = true;
+ $output = "<?php echo {$return};?>\n";
+ } else {
+ $output = "<?php \$_smarty_tpl->assign({$_assign},{$return});?>\n";
+ }
+ return $output;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_private_print_expression.php b/include/smarty/libs/sysplugins/smarty_internal_compile_private_print_expression.php
new file mode 100644
index 000000000..a37119547
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_private_print_expression.php
@@ -0,0 +1,156 @@
+<?php
+/**
+* Smarty Internal Plugin Compile Print Expression
+*
+* Compiles any tag which will output an expression or variable
+*
+* @package Smarty
+* @subpackage Compiler
+* @author Uwe Tews
+*/
+
+/**
+* Smarty Internal Plugin Compile Print Expression Class
+*
+* @package Smarty
+* @subpackage Compiler
+*/
+class Smarty_Internal_Compile_Private_Print_Expression extends Smarty_Internal_CompileBase {
+
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $optional_attributes = array('assign');
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $option_flags = array('nocache', 'nofilter');
+
+ /**
+ * Compiles code for gererting output from any expression
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @return string compiled code
+ */
+ public function compile($args, $compiler, $parameter)
+ {
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+ // nocache option
+ if ($_attr['nocache'] === true) {
+ $compiler->tag_nocache = true;
+ }
+ // filter handling
+ if ($_attr['nofilter'] === true) {
+ $_filter = 'false';
+ } else {
+ $_filter = 'true';
+ }
+ if (isset($_attr['assign'])) {
+ // assign output to variable
+ $output = "<?php \$_smarty_tpl->assign({$_attr['assign']},{$parameter['value']});?>";
+ } else {
+ // display value
+ $output = $parameter['value'];
+ // tag modifier
+ if (!empty($parameter['modifierlist'])) {
+ $output = $compiler->compileTag('private_modifier', array(), array('modifierlist' => $parameter['modifierlist'], 'value' => $output));
+ }
+ if (!$_attr['nofilter']) {
+ // default modifier
+ if (!empty($compiler->smarty->default_modifiers)) {
+ if (empty($compiler->default_modifier_list)) {
+ $modifierlist = array();
+ foreach ($compiler->smarty->default_modifiers as $key => $single_default_modifier) {
+ preg_match_all('/(\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'|"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|:|[^:]+)/', $single_default_modifier, $mod_array);
+ for ($i = 0, $count = count($mod_array[0]);$i < $count;$i++) {
+ if ($mod_array[0][$i] != ':') {
+ $modifierlist[$key][] = $mod_array[0][$i];
+ }
+ }
+ }
+ $compiler->default_modifier_list = $modifierlist;
+ }
+ $output = $compiler->compileTag('private_modifier', array(), array('modifierlist' => $compiler->default_modifier_list, 'value' => $output));
+ }
+ // autoescape html
+ if ($compiler->template->smarty->escape_html) {
+ $output = "htmlspecialchars({$output}, ENT_QUOTES, '" . addslashes(Smarty::$_CHARSET) . "')";
+ }
+ // loop over registerd filters
+ if (!empty($compiler->template->smarty->registered_filters[Smarty::FILTER_VARIABLE])) {
+ foreach ($compiler->template->smarty->registered_filters[Smarty::FILTER_VARIABLE] as $key => $function) {
+ if (!is_array($function)) {
+ $output = "{$function}({$output},\$_smarty_tpl)";
+ } else if (is_object($function[0])) {
+ $output = "\$_smarty_tpl->smarty->registered_filters[Smarty::FILTER_VARIABLE][{$key}][0]->{$function[1]}({$output},\$_smarty_tpl)";
+ } else {
+ $output = "{$function[0]}::{$function[1]}({$output},\$_smarty_tpl)";
+ }
+ }
+ }
+ // auto loaded filters
+ if (isset($compiler->smarty->autoload_filters[Smarty::FILTER_VARIABLE])) {
+ foreach ((array)$compiler->template->smarty->autoload_filters[Smarty::FILTER_VARIABLE] as $name) {
+ $result = $this->compile_output_filter($compiler, $name, $output);
+ if ($result !== false) {
+ $output = $result;
+ } else {
+ // not found, throw exception
+ throw new SmartyException("Unable to load filter '{$name}'");
+ }
+ }
+ }
+ if (isset($compiler->template->variable_filters)) {
+ foreach ($compiler->template->variable_filters as $filter) {
+ if (count($filter) == 1 && ($result = $this->compile_output_filter($compiler, $filter[0], $output)) !== false) {
+ $output = $result;
+ } else {
+ $output = $compiler->compileTag('private_modifier', array(), array('modifierlist' => array($filter), 'value' => $output));
+ }
+ }
+ }
+ }
+
+ $compiler->has_output = true;
+ $output = "<?php echo {$output};?>";
+ }
+ return $output;
+ }
+
+ /**
+ * @param object $compiler compiler object
+ * @param string $name name of variable filter
+ * @param type $output embedded output
+ * @return string
+ */
+ private function compile_output_filter($compiler, $name, $output)
+ {
+ $plugin_name = "smarty_variablefilter_{$name}";
+ $path = $compiler->smarty->loadPlugin($plugin_name, false);
+ if ($path) {
+ if ($compiler->template->caching) {
+ $compiler->template->required_plugins['nocache'][$name][Smarty::FILTER_VARIABLE]['file'] = $path;
+ $compiler->template->required_plugins['nocache'][$name][Smarty::FILTER_VARIABLE]['function'] = $plugin_name;
+ } else {
+ $compiler->template->required_plugins['compiled'][$name][Smarty::FILTER_VARIABLE]['file'] = $path;
+ $compiler->template->required_plugins['compiled'][$name][Smarty::FILTER_VARIABLE]['function'] = $plugin_name;
+ }
+ } else {
+ // not found
+ return false;
+ }
+ return "{$plugin_name}({$output},\$_smarty_tpl)";
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_private_registered_block.php b/include/smarty/libs/sysplugins/smarty_internal_compile_private_registered_block.php
new file mode 100644
index 000000000..f104853a8
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_private_registered_block.php
@@ -0,0 +1,113 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Registered Block
+ *
+ * Compiles code for the execution of a registered block function
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Registered Block Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Private_Registered_Block extends Smarty_Internal_CompileBase {
+
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $optional_attributes = array('_any');
+
+ /**
+ * Compiles code for the execution of a block function
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @param string $tag name of block function
+ * @return string compiled code
+ */
+ public function compile($args, $compiler, $parameter, $tag)
+ {
+ if (!isset($tag[5]) || substr($tag,-5) != 'close') {
+ // opening tag of block plugin
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+ if ($_attr['nocache']) {
+ $compiler->tag_nocache = true;
+ }
+ unset($_attr['nocache']);
+ if (isset($compiler->smarty->registered_plugins[Smarty::PLUGIN_BLOCK][$tag])) {
+ $tag_info = $compiler->smarty->registered_plugins[Smarty::PLUGIN_BLOCK][$tag];
+ } else {
+ $tag_info = $compiler->default_handler_plugins[Smarty::PLUGIN_BLOCK][$tag];
+ }
+ // convert attributes into parameter array string
+ $_paramsArray = array();
+ foreach ($_attr as $_key => $_value) {
+ if (is_int($_key)) {
+ $_paramsArray[] = "$_key=>$_value";
+ } elseif ($compiler->template->caching && in_array($_key,$tag_info[2])) {
+ $_value = str_replace("'","^#^",$_value);
+ $_paramsArray[] = "'$_key'=>^#^.var_export($_value,true).^#^";
+ } else {
+ $_paramsArray[] = "'$_key'=>$_value";
+ }
+ }
+ $_params = 'array(' . implode(",", $_paramsArray) . ')';
+
+ $this->openTag($compiler, $tag, array($_params, $compiler->nocache));
+ // maybe nocache because of nocache variables or nocache plugin
+ $compiler->nocache = !$tag_info[1] | $compiler->nocache | $compiler->tag_nocache;
+ $function = $tag_info[0];
+ // compile code
+ if (!is_array($function)) {
+ $output = "<?php \$_smarty_tpl->smarty->_tag_stack[] = array('{$tag}', {$_params}); \$_block_repeat=true; echo {$function}({$_params}, null, \$_smarty_tpl, \$_block_repeat);while (\$_block_repeat) { ob_start();?>";
+ } else if (is_object($function[0])) {
+ $output = "<?php \$_smarty_tpl->smarty->_tag_stack[] = array('{$tag}', {$_params}); \$_block_repeat=true; echo \$_smarty_tpl->smarty->registered_plugins['block']['{$tag}'][0][0]->{$function[1]}({$_params}, null, \$_smarty_tpl, \$_block_repeat);while (\$_block_repeat) { ob_start();?>";
+ } else {
+ $output = "<?php \$_smarty_tpl->smarty->_tag_stack[] = array('{$tag}', {$_params}); \$_block_repeat=true; echo {$function[0]}::{$function[1]}({$_params}, null, \$_smarty_tpl, \$_block_repeat);while (\$_block_repeat) { ob_start();?>";
+ }
+ } else {
+ // must endblock be nocache?
+ if ($compiler->nocache) {
+ $compiler->tag_nocache = true;
+ }
+ $base_tag = substr($tag, 0, -5);
+ // closing tag of block plugin, restore nocache
+ list($_params, $compiler->nocache) = $this->closeTag($compiler, $base_tag);
+ // This tag does create output
+ $compiler->has_output = true;
+ if (isset($compiler->smarty->registered_plugins[Smarty::PLUGIN_BLOCK][$base_tag])) {
+ $function = $compiler->smarty->registered_plugins[Smarty::PLUGIN_BLOCK][$base_tag][0];
+ } else {
+ $function = $compiler->default_handler_plugins[Smarty::PLUGIN_BLOCK][$base_tag][0];
+ }
+ // compile code
+ if (!isset($parameter['modifier_list'])) {
+ $mod_pre = $mod_post ='';
+ } else {
+ $mod_pre = ' ob_start(); ';
+ $mod_post = 'echo '.$compiler->compileTag('private_modifier',array(),array('modifierlist'=>$parameter['modifier_list'],'value'=>'ob_get_clean()')).';';
+ }
+ if (!is_array($function)) {
+ $output = "<?php \$_block_content = ob_get_clean(); \$_block_repeat=false;".$mod_pre." echo {$function}({$_params}, \$_block_content, \$_smarty_tpl, \$_block_repeat);".$mod_post." } array_pop(\$_smarty_tpl->smarty->_tag_stack);?>";
+ } else if (is_object($function[0])) {
+ $output = "<?php \$_block_content = ob_get_clean(); \$_block_repeat=false;".$mod_pre." echo \$_smarty_tpl->smarty->registered_plugins['block']['{$base_tag}'][0][0]->{$function[1]}({$_params}, \$_block_content, \$_smarty_tpl, \$_block_repeat); ".$mod_post."} array_pop(\$_smarty_tpl->smarty->_tag_stack);?>";
+ } else {
+ $output = "<?php \$_block_content = ob_get_clean(); \$_block_repeat=false;".$mod_pre." echo {$function[0]}::{$function[1]}({$_params}, \$_block_content, \$_smarty_tpl, \$_block_repeat); ".$mod_post."} array_pop(\$_smarty_tpl->smarty->_tag_stack);?>";
+ }
+ }
+ return $output . "\n";
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_private_registered_function.php b/include/smarty/libs/sysplugins/smarty_internal_compile_private_registered_function.php
new file mode 100644
index 000000000..e68a0244d
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_private_registered_function.php
@@ -0,0 +1,81 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Registered Function
+ *
+ * Compiles code for the execution of a registered function
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Registered Function Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Private_Registered_Function extends Smarty_Internal_CompileBase {
+
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $optional_attributes = array('_any');
+
+ /**
+ * Compiles code for the execution of a registered function
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @param string $tag name of function
+ * @return string compiled code
+ */
+ public function compile($args, $compiler, $parameter, $tag)
+ {
+ // This tag does create output
+ $compiler->has_output = true;
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+ if ($_attr['nocache']) {
+ $compiler->tag_nocache = true;
+ }
+ unset($_attr['nocache']);
+ if (isset($compiler->smarty->registered_plugins[Smarty::PLUGIN_FUNCTION][$tag])) {
+ $tag_info = $compiler->smarty->registered_plugins[Smarty::PLUGIN_FUNCTION][$tag];
+ } else {
+ $tag_info = $compiler->default_handler_plugins[Smarty::PLUGIN_FUNCTION][$tag];
+ }
+ // not cachable?
+ $compiler->tag_nocache = $compiler->tag_nocache || !$tag_info[1];
+ // convert attributes into parameter array string
+ $_paramsArray = array();
+ foreach ($_attr as $_key => $_value) {
+ if (is_int($_key)) {
+ $_paramsArray[] = "$_key=>$_value";
+ } elseif ($compiler->template->caching && in_array($_key,$tag_info[2])) {
+ $_value = str_replace("'","^#^",$_value);
+ $_paramsArray[] = "'$_key'=>^#^.var_export($_value,true).^#^";
+ } else {
+ $_paramsArray[] = "'$_key'=>$_value";
+ }
+ }
+ $_params = 'array(' . implode(",", $_paramsArray) . ')';
+ $function = $tag_info[0];
+ // compile code
+ if (!is_array($function)) {
+ $output = "<?php echo {$function}({$_params},\$_smarty_tpl);?>\n";
+ } else if (is_object($function[0])) {
+ $output = "<?php echo \$_smarty_tpl->smarty->registered_plugins[Smarty::PLUGIN_FUNCTION]['{$tag}'][0][0]->{$function[1]}({$_params},\$_smarty_tpl);?>\n";
+ } else {
+ $output = "<?php echo {$function[0]}::{$function[1]}({$_params},\$_smarty_tpl);?>\n";
+ }
+ return $output;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_private_special_variable.php b/include/smarty/libs/sysplugins/smarty_internal_compile_private_special_variable.php
new file mode 100644
index 000000000..af8fcd372
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_private_special_variable.php
@@ -0,0 +1,111 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Special Smarty Variable
+ *
+ * Compiles the special $smarty variables
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile special Smarty Variable Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Private_Special_Variable extends Smarty_Internal_CompileBase {
+
+ /**
+ * Compiles code for the speical $smarty variables
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @return string compiled code
+ */
+ public function compile($args, $compiler, $parameter)
+ {
+ $_index = preg_split("/\]\[/",substr($parameter, 1, strlen($parameter)-2));
+ $compiled_ref = ' ';
+ $variable = trim($_index[0], "'");
+ switch ($variable) {
+ case 'foreach':
+ return "\$_smarty_tpl->getVariable('smarty')->value$parameter";
+ case 'section':
+ return "\$_smarty_tpl->getVariable('smarty')->value$parameter";
+ case 'capture':
+ return "Smarty::\$_smarty_vars$parameter";
+ case 'now':
+ return 'time()';
+ case 'cookies':
+ if (isset($compiler->smarty->security_policy) && !$compiler->smarty->security_policy->allow_super_globals) {
+ $compiler->trigger_template_error("(secure mode) super globals not permitted");
+ break;
+ }
+ $compiled_ref = '$_COOKIE';
+ break;
+
+ case 'get':
+ case 'post':
+ case 'env':
+ case 'server':
+ case 'session':
+ case 'request':
+ if (isset($compiler->smarty->security_policy) && !$compiler->smarty->security_policy->allow_super_globals) {
+ $compiler->trigger_template_error("(secure mode) super globals not permitted");
+ break;
+ }
+ $compiled_ref = '$_'.strtoupper($variable);
+ break;
+
+ case 'template':
+ return 'basename($_smarty_tpl->source->filepath)';
+
+ case 'template_object':
+ return '$_smarty_tpl';
+
+ case 'current_dir':
+ return 'dirname($_smarty_tpl->source->filepath)';
+
+ case 'version':
+ $_version = Smarty::SMARTY_VERSION;
+ return "'$_version'";
+
+ case 'const':
+ if (isset($compiler->smarty->security_policy) && !$compiler->smarty->security_policy->allow_constants) {
+ $compiler->trigger_template_error("(secure mode) constants not permitted");
+ break;
+ }
+ return "@constant({$_index[1]})";
+
+ case 'config':
+ if (isset($_index[2])) {
+ return "(is_array(\$tmp = \$_smarty_tpl->getConfigVariable($_index[1])) ? \$tmp[$_index[2]] : null)";
+ } else {
+ return "\$_smarty_tpl->getConfigVariable($_index[1])";
+ }
+ case 'ldelim':
+ $_ldelim = $compiler->smarty->left_delimiter;
+ return "'$_ldelim'";
+
+ case 'rdelim':
+ $_rdelim = $compiler->smarty->right_delimiter;
+ return "'$_rdelim'";
+
+ default:
+ $compiler->trigger_template_error('$smarty.' . trim($_index[0], "'") . ' is invalid');
+ break;
+ }
+ if (isset($_index[1])) {
+ array_shift($_index);
+ foreach ($_index as $_ind) {
+ $compiled_ref = $compiled_ref . "[$_ind]";
+ }
+ }
+ return $compiled_ref;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_rdelim.php b/include/smarty/libs/sysplugins/smarty_internal_compile_rdelim.php
new file mode 100644
index 000000000..807c7e2b9
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_rdelim.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Rdelim
+ *
+ * Compiles the {rdelim} tag
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Rdelim Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Rdelim extends Smarty_Internal_CompileBase {
+
+ /**
+ * Compiles code for the {rdelim} tag
+ *
+ * This tag does output the right delimiter.
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @return string compiled code
+ */
+ public function compile($args, $compiler)
+ {
+ $_attr = $this->getAttributes($compiler, $args);
+ if ($_attr['nocache'] === true) {
+ $compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno);
+ }
+ // this tag does not return compiled code
+ $compiler->has_code = true;
+ return $compiler->smarty->right_delimiter;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_section.php b/include/smarty/libs/sysplugins/smarty_internal_compile_section.php
new file mode 100644
index 000000000..ccb7673d8
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_section.php
@@ -0,0 +1,203 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Section
+ *
+ * Compiles the {section} {sectionelse} {/section} tags
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Section Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Section extends Smarty_Internal_CompileBase {
+
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $required_attributes = array('name', 'loop');
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $shorttag_order = array('name', 'loop');
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $optional_attributes = array('start', 'step', 'max', 'show');
+
+ /**
+ * Compiles code for the {section} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @return string compiled code
+ */
+ public function compile($args, $compiler)
+ {
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+
+ $this->openTag($compiler, 'section', array('section', $compiler->nocache));
+ // maybe nocache because of nocache variables
+ $compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
+
+ $output = "<?php ";
+
+ $section_name = $_attr['name'];
+
+ $output .= "if (isset(\$_smarty_tpl->tpl_vars['smarty']->value['section'][$section_name])) unset(\$_smarty_tpl->tpl_vars['smarty']->value['section'][$section_name]);\n";
+ $section_props = "\$_smarty_tpl->tpl_vars['smarty']->value['section'][$section_name]";
+
+ foreach ($_attr as $attr_name => $attr_value) {
+ switch ($attr_name) {
+ case 'loop':
+ $output .= "{$section_props}['loop'] = is_array(\$_loop=$attr_value) ? count(\$_loop) : max(0, (int)\$_loop); unset(\$_loop);\n";
+ break;
+
+ case 'show':
+ if (is_bool($attr_value))
+ $show_attr_value = $attr_value ? 'true' : 'false';
+ else
+ $show_attr_value = "(bool)$attr_value";
+ $output .= "{$section_props}['show'] = $show_attr_value;\n";
+ break;
+
+ case 'name':
+ $output .= "{$section_props}['$attr_name'] = $attr_value;\n";
+ break;
+
+ case 'max':
+ case 'start':
+ $output .= "{$section_props}['$attr_name'] = (int)$attr_value;\n";
+ break;
+
+ case 'step':
+ $output .= "{$section_props}['$attr_name'] = ((int)$attr_value) == 0 ? 1 : (int)$attr_value;\n";
+ break;
+ }
+ }
+
+ if (!isset($_attr['show']))
+ $output .= "{$section_props}['show'] = true;\n";
+
+ if (!isset($_attr['loop']))
+ $output .= "{$section_props}['loop'] = 1;\n";
+
+ if (!isset($_attr['max']))
+ $output .= "{$section_props}['max'] = {$section_props}['loop'];\n";
+ else
+ $output .= "if ({$section_props}['max'] < 0)\n" . " {$section_props}['max'] = {$section_props}['loop'];\n";
+
+ if (!isset($_attr['step']))
+ $output .= "{$section_props}['step'] = 1;\n";
+
+ if (!isset($_attr['start']))
+ $output .= "{$section_props}['start'] = {$section_props}['step'] > 0 ? 0 : {$section_props}['loop']-1;\n";
+ else {
+ $output .= "if ({$section_props}['start'] < 0)\n" . " {$section_props}['start'] = max({$section_props}['step'] > 0 ? 0 : -1, {$section_props}['loop'] + {$section_props}['start']);\n" . "else\n" . " {$section_props}['start'] = min({$section_props}['start'], {$section_props}['step'] > 0 ? {$section_props}['loop'] : {$section_props}['loop']-1);\n";
+ }
+
+ $output .= "if ({$section_props}['show']) {\n";
+ if (!isset($_attr['start']) && !isset($_attr['step']) && !isset($_attr['max'])) {
+ $output .= " {$section_props}['total'] = {$section_props}['loop'];\n";
+ } else {
+ $output .= " {$section_props}['total'] = min(ceil(({$section_props}['step'] > 0 ? {$section_props}['loop'] - {$section_props}['start'] : {$section_props}['start']+1)/abs({$section_props}['step'])), {$section_props}['max']);\n";
+ }
+ $output .= " if ({$section_props}['total'] == 0)\n" . " {$section_props}['show'] = false;\n" . "} else\n" . " {$section_props}['total'] = 0;\n";
+
+ $output .= "if ({$section_props}['show']):\n";
+ $output .= "
+ for ({$section_props}['index'] = {$section_props}['start'], {$section_props}['iteration'] = 1;
+ {$section_props}['iteration'] <= {$section_props}['total'];
+ {$section_props}['index'] += {$section_props}['step'], {$section_props}['iteration']++):\n";
+ $output .= "{$section_props}['rownum'] = {$section_props}['iteration'];\n";
+ $output .= "{$section_props}['index_prev'] = {$section_props}['index'] - {$section_props}['step'];\n";
+ $output .= "{$section_props}['index_next'] = {$section_props}['index'] + {$section_props}['step'];\n";
+ $output .= "{$section_props}['first'] = ({$section_props}['iteration'] == 1);\n";
+ $output .= "{$section_props}['last'] = ({$section_props}['iteration'] == {$section_props}['total']);\n";
+
+ $output .= "?>";
+ return $output;
+ }
+
+}
+
+/**
+ * Smarty Internal Plugin Compile Sectionelse Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Sectionelse extends Smarty_Internal_CompileBase {
+
+ /**
+ * Compiles code for the {sectionelse} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @return string compiled code
+ */
+ public function compile($args, $compiler)
+ {
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+
+ list($openTag, $nocache) = $this->closeTag($compiler, array('section'));
+ $this->openTag($compiler, 'sectionelse', array('sectionelse', $nocache));
+
+ return "<?php endfor; else: ?>";
+ }
+
+}
+
+/**
+ * Smarty Internal Plugin Compile Sectionclose Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Sectionclose extends Smarty_Internal_CompileBase {
+
+ /**
+ * Compiles code for the {/section} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @return string compiled code
+ */
+ public function compile($args, $compiler)
+ {
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+
+ // must endblock be nocache?
+ if ($compiler->nocache) {
+ $compiler->tag_nocache = true;
+ }
+
+ list($openTag, $compiler->nocache) = $this->closeTag($compiler, array('section', 'sectionelse'));
+
+ if ($openTag == 'sectionelse') {
+ return "<?php endif; ?>";
+ } else {
+ return "<?php endfor; endif; ?>";
+ }
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_setfilter.php b/include/smarty/libs/sysplugins/smarty_internal_compile_setfilter.php
new file mode 100644
index 000000000..50b4cab55
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_setfilter.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Setfilter
+ *
+ * Compiles code for setfilter tag
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Setfilter Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Setfilter extends Smarty_Internal_CompileBase {
+
+ /**
+ * Compiles code for setfilter tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @return string compiled code
+ */
+ public function compile($args, $compiler, $parameter)
+ {
+ $compiler->variable_filter_stack[] = $compiler->template->variable_filters;
+ $compiler->template->variable_filters = $parameter['modifier_list'];
+ // this tag does not return compiled code
+ $compiler->has_code = false;
+ return true;
+ }
+
+}
+
+/**
+ * Smarty Internal Plugin Compile Setfilterclose Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Setfilterclose extends Smarty_Internal_CompileBase {
+
+ /**
+ * Compiles code for the {/setfilter} tag
+ *
+ * This tag does not generate compiled output. It resets variable filter.
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @return string compiled code
+ */
+ public function compile($args, $compiler)
+ {
+ $_attr = $this->getAttributes($compiler, $args);
+ // reset variable filter to previous state
+ if (count($compiler->variable_filter_stack)) {
+ $compiler->template->variable_filters = array_pop($compiler->variable_filter_stack);
+ } else {
+ $compiler->template->variable_filters = array();
+ }
+ // this tag does not return compiled code
+ $compiler->has_code = false;
+ return true;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compile_while.php b/include/smarty/libs/sysplugins/smarty_internal_compile_while.php
new file mode 100644
index 000000000..d7d986c34
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compile_while.php
@@ -0,0 +1,94 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile While
+ *
+ * Compiles the {while} tag
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile While Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_While extends Smarty_Internal_CompileBase {
+
+ /**
+ * Compiles code for the {while} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @param array $parameter array with compilation parameter
+ * @return string compiled code
+ */
+ public function compile($args, $compiler, $parameter)
+ {
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+ $this->openTag($compiler, 'while', $compiler->nocache);
+
+ if (!array_key_exists("if condition",$parameter)) {
+ $compiler->trigger_template_error("missing while condition", $compiler->lex->taglineno);
+ }
+
+ // maybe nocache because of nocache variables
+ $compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
+ if (is_array($parameter['if condition'])) {
+ if ($compiler->nocache) {
+ $_nocache = ',true';
+ // create nocache var to make it know for further compiling
+ if (is_array($parameter['if condition']['var'])) {
+ $compiler->template->tpl_vars[trim($parameter['if condition']['var']['var'], "'")] = new Smarty_variable(null, true);
+ } else {
+ $compiler->template->tpl_vars[trim($parameter['if condition']['var'], "'")] = new Smarty_variable(null, true);
+ }
+ } else {
+ $_nocache = '';
+ }
+ if (is_array($parameter['if condition']['var'])) {
+ $_output = "<?php if (!isset(\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var']['var'] . "]) || !is_array(\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var']['var'] . "]->value)) \$_smarty_tpl->createLocalArrayVariable(" . $parameter['if condition']['var']['var'] . "$_nocache);\n";
+ $_output .= "while (\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var']['var'] . "]->value" . $parameter['if condition']['var']['smarty_internal_index'] . " = " . $parameter['if condition']['value'] . "){?>";
+ } else {
+ $_output = "<?php if (!isset(\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var'] . "])) \$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var'] . "] = new Smarty_Variable(null{$_nocache});";
+ $_output .= "while (\$_smarty_tpl->tpl_vars[" . $parameter['if condition']['var'] . "]->value = " . $parameter['if condition']['value'] . "){?>";
+ }
+ return $_output;
+ } else {
+ return "<?php while ({$parameter['if condition']}){?>";
+ }
+ }
+
+}
+
+/**
+ * Smarty Internal Plugin Compile Whileclose Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Whileclose extends Smarty_Internal_CompileBase {
+
+ /**
+ * Compiles code for the {/while} tag
+ *
+ * @param array $args array with attributes from parser
+ * @param object $compiler compiler object
+ * @return string compiled code
+ */
+ public function compile($args, $compiler)
+ {
+ // must endblock be nocache?
+ if ($compiler->nocache) {
+ $compiler->tag_nocache = true;
+ }
+ $compiler->nocache = $this->closeTag($compiler, array('while'));
+ return "<?php }?>";
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_compilebase.php b/include/smarty/libs/sysplugins/smarty_internal_compilebase.php
new file mode 100644
index 000000000..5fb56f371
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_compilebase.php
@@ -0,0 +1,176 @@
+<?php
+/**
+ * Smarty Internal Plugin CompileBase
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * This class does extend all internal compile plugins
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+abstract class Smarty_Internal_CompileBase {
+
+ /**
+ * Array of names of required attribute required by tag
+ *
+ * @var array
+ */
+ public $required_attributes = array();
+ /**
+ * Array of names of optional attribute required by tag
+ * use array('_any') if there is no restriction of attributes names
+ *
+ * @var array
+ */
+ public $optional_attributes = array();
+ /**
+ * Shorttag attribute order defined by its names
+ *
+ * @var array
+ */
+ public $shorttag_order = array();
+ /**
+ * Array of names of valid option flags
+ *
+ * @var array
+ */
+ public $option_flags = array('nocache');
+
+ /**
+ * This function checks if the attributes passed are valid
+ *
+ * The attributes passed for the tag to compile are checked against the list of required and
+ * optional attributes. Required attributes must be present. Optional attributes are check against
+ * the corresponding list. The keyword '_any' specifies that any attribute will be accepted
+ * as valid
+ *
+ * @param object $compiler compiler object
+ * @param array $attributes attributes applied to the tag
+ * @return array of mapped attributes for further processing
+ */
+ public function getAttributes($compiler, $attributes)
+ {
+ $_indexed_attr = array();
+ // loop over attributes
+ foreach ($attributes as $key => $mixed) {
+ // shorthand ?
+ if (!is_array($mixed)) {
+ // option flag ?
+ if (in_array(trim($mixed, '\'"'), $this->option_flags)) {
+ $_indexed_attr[trim($mixed, '\'"')] = true;
+ // shorthand attribute ?
+ } else if (isset($this->shorttag_order[$key])) {
+ $_indexed_attr[$this->shorttag_order[$key]] = $mixed;
+ } else {
+ // too many shorthands
+ $compiler->trigger_template_error('too many shorthand attributes', $compiler->lex->taglineno);
+ }
+ // named attribute
+ } else {
+ $kv = each($mixed);
+ // option flag?
+ if (in_array($kv['key'], $this->option_flags)) {
+ if (is_bool($kv['value'])) {
+ $_indexed_attr[$kv['key']] = $kv['value'];
+ } else if (is_string($kv['value']) && in_array(trim($kv['value'], '\'"'), array('true', 'false'))) {
+ if (trim($kv['value']) == 'true') {
+ $_indexed_attr[$kv['key']] = true;
+ } else {
+ $_indexed_attr[$kv['key']] = false;
+ }
+ } else if (is_numeric($kv['value']) && in_array($kv['value'], array(0, 1))) {
+ if ($kv['value'] == 1) {
+ $_indexed_attr[$kv['key']] = true;
+ } else {
+ $_indexed_attr[$kv['key']] = false;
+ }
+ } else {
+ $compiler->trigger_template_error("illegal value of option flag \"{$kv['key']}\"", $compiler->lex->taglineno);
+ }
+ // must be named attribute
+ } else {
+ reset($mixed);
+ $_indexed_attr[key($mixed)] = $mixed[key($mixed)];
+ }
+ }
+ }
+ // check if all required attributes present
+ foreach ($this->required_attributes as $attr) {
+ if (!array_key_exists($attr, $_indexed_attr)) {
+ $compiler->trigger_template_error("missing \"" . $attr . "\" attribute", $compiler->lex->taglineno);
+ }
+ }
+ // check for unallowed attributes
+ if ($this->optional_attributes != array('_any')) {
+ $tmp_array = array_merge($this->required_attributes, $this->optional_attributes, $this->option_flags);
+ foreach ($_indexed_attr as $key => $dummy) {
+ if (!in_array($key, $tmp_array) && $key !== 0) {
+ $compiler->trigger_template_error("unexpected \"" . $key . "\" attribute", $compiler->lex->taglineno);
+ }
+ }
+ }
+ // default 'false' for all option flags not set
+ foreach ($this->option_flags as $flag) {
+ if (!isset($_indexed_attr[$flag])) {
+ $_indexed_attr[$flag] = false;
+ }
+ }
+
+ return $_indexed_attr;
+ }
+
+ /**
+ * Push opening tag name on stack
+ *
+ * Optionally additional data can be saved on stack
+ *
+ * @param object $compiler compiler object
+ * @param string $openTag the opening tag's name
+ * @param mixed $data optional data saved
+ */
+ public function openTag($compiler, $openTag, $data = null)
+ {
+ array_push($compiler->_tag_stack, array($openTag, $data));
+ }
+
+ /**
+ * Pop closing tag
+ *
+ * Raise an error if this stack-top doesn't match with expected opening tags
+ *
+ * @param object $compiler compiler object
+ * @param array|string $expectedTag the expected opening tag names
+ * @return mixed any type the opening tag's name or saved data
+ */
+ public function closeTag($compiler, $expectedTag)
+ {
+ if (count($compiler->_tag_stack) > 0) {
+ // get stacked info
+ list($_openTag, $_data) = array_pop($compiler->_tag_stack);
+ // open tag must match with the expected ones
+ if (in_array($_openTag, (array) $expectedTag)) {
+ if (is_null($_data)) {
+ // return opening tag
+ return $_openTag;
+ } else {
+ // return restored data
+ return $_data;
+ }
+ }
+ // wrong nesting of tags
+ $compiler->trigger_template_error("unclosed {" . $_openTag . "} tag");
+ return;
+ }
+ // wrong nesting of tags
+ $compiler->trigger_template_error("unexpected closing tag", $compiler->lex->taglineno);
+ return;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_config.php b/include/smarty/libs/sysplugins/smarty_internal_config.php
new file mode 100644
index 000000000..bcb3ce054
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_config.php
@@ -0,0 +1,302 @@
+<?php
+/**
+ * Smarty Internal Plugin Config
+ *
+ * @package Smarty
+ * @subpackage Config
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Config
+ *
+ * Main class for config variables
+ *
+ * @package Smarty
+ * @subpackage Config
+ *
+ * @property Smarty_Config_Source $source
+ * @property Smarty_Config_Compiled $compiled
+ * @ignore
+ */
+class Smarty_Internal_Config {
+
+ /**
+ * Samrty instance
+ *
+ * @var Smarty object
+ */
+ public $smarty = null;
+ /**
+ * Object of config var storage
+ *
+ * @var object
+ */
+ public $data = null;
+ /**
+ * Config resource
+ * @var string
+ */
+ public $config_resource = null;
+ /**
+ * Compiled config file
+ *
+ * @var string
+ */
+ public $compiled_config = null;
+ /**
+ * filepath of compiled config file
+ *
+ * @var string
+ */
+ public $compiled_filepath = null;
+ /**
+ * Filemtime of compiled config Filemtime
+ *
+ * @var int
+ */
+ public $compiled_timestamp = null;
+ /**
+ * flag if compiled config file is invalid and must be (re)compiled
+ * @var bool
+ */
+ public $mustCompile = null;
+ /**
+ * Config file compiler object
+ *
+ * @var Smarty_Internal_Config_File_Compiler object
+ */
+ public $compiler_object = null;
+
+ /**
+ * Constructor of config file object
+ *
+ * @param string $config_resource config file resource name
+ * @param Smarty $smarty Smarty instance
+ * @param object $data object for config vars storage
+ */
+ public function __construct($config_resource, $smarty, $data = null)
+ {
+ $this->data = $data;
+ $this->smarty = $smarty;
+ $this->config_resource = $config_resource;
+ }
+
+ /**
+ * Returns the compiled filepath
+ *
+ * @return string the compiled filepath
+ */
+ public function getCompiledFilepath()
+ {
+ return $this->compiled_filepath === null ?
+ ($this->compiled_filepath = $this->buildCompiledFilepath()) :
+ $this->compiled_filepath;
+ }
+
+ /**
+ * Get file path.
+ *
+ * @return string
+ */
+ public function buildCompiledFilepath()
+ {
+ $_compile_id = isset($this->smarty->compile_id) ? preg_replace('![^\w\|]+!', '_', $this->smarty->compile_id) : null;
+ $_flag = (int) $this->smarty->config_read_hidden + (int) $this->smarty->config_booleanize * 2
+ + (int) $this->smarty->config_overwrite * 4;
+ $_filepath = sha1($this->source->name . $_flag);
+ // if use_sub_dirs, break file into directories
+ if ($this->smarty->use_sub_dirs) {
+ $_filepath = substr($_filepath, 0, 2) . DS
+ . substr($_filepath, 2, 2) . DS
+ . substr($_filepath, 4, 2) . DS
+ . $_filepath;
+ }
+ $_compile_dir_sep = $this->smarty->use_sub_dirs ? DS : '^';
+ if (isset($_compile_id)) {
+ $_filepath = $_compile_id . $_compile_dir_sep . $_filepath;
+ }
+ $_compile_dir = $this->smarty->getCompileDir();
+ return $_compile_dir . $_filepath . '.' . basename($this->source->name) . '.config' . '.php';
+ }
+
+ /**
+ * Returns the timpestamp of the compiled file
+ *
+ * @return integer the file timestamp
+ */
+ public function getCompiledTimestamp()
+ {
+ return $this->compiled_timestamp === null
+ ? ($this->compiled_timestamp = (file_exists($this->getCompiledFilepath())) ? filemtime($this->getCompiledFilepath()) : false)
+ : $this->compiled_timestamp;
+ }
+
+ /**
+ * Returns if the current config file must be compiled
+ *
+ * It does compare the timestamps of config source and the compiled config and checks the force compile configuration
+ *
+ * @return boolean true if the file must be compiled
+ */
+ public function mustCompile()
+ {
+ return $this->mustCompile === null ?
+ $this->mustCompile = ($this->smarty->force_compile || $this->getCompiledTimestamp () === false || $this->smarty->compile_check && $this->getCompiledTimestamp () < $this->source->timestamp):
+ $this->mustCompile;
+ }
+
+ /**
+ * Returns the compiled config file
+ *
+ * It checks if the config file must be compiled or just read the compiled version
+ *
+ * @return string the compiled config file
+ */
+ public function getCompiledConfig()
+ {
+ if ($this->compiled_config === null) {
+ // see if template needs compiling.
+ if ($this->mustCompile()) {
+ $this->compileConfigSource();
+ } else {
+ $this->compiled_config = file_get_contents($this->getCompiledFilepath());
+ }
+ }
+ return $this->compiled_config;
+ }
+
+ /**
+ * Compiles the config files
+ *
+ * @throws Exception
+ */
+ public function compileConfigSource()
+ {
+ // compile template
+ if (!is_object($this->compiler_object)) {
+ // load compiler
+ $this->compiler_object = new Smarty_Internal_Config_File_Compiler($this->smarty);
+ }
+ // compile locking
+ if ($this->smarty->compile_locking) {
+ if ($saved_timestamp = $this->getCompiledTimestamp()) {
+ touch($this->getCompiledFilepath());
+ }
+ }
+ // call compiler
+ try {
+ $this->compiler_object->compileSource($this);
+ } catch (Exception $e) {
+ // restore old timestamp in case of error
+ if ($this->smarty->compile_locking && $saved_timestamp) {
+ touch($this->getCompiledFilepath(), $saved_timestamp);
+ }
+ throw $e;
+ }
+ // compiling succeded
+ // write compiled template
+ Smarty_Internal_Write_File::writeFile($this->getCompiledFilepath(), $this->getCompiledConfig(), $this->smarty);
+ }
+
+ /**
+ * load config variables
+ *
+ * @param mixed $sections array of section names, single section or null
+ * @param object $scope global,parent or local
+ */
+ public function loadConfigVars($sections = null, $scope = 'local')
+ {
+ if ($this->data instanceof Smarty_Internal_Template) {
+ $this->data->properties['file_dependency'][sha1($this->source->filepath)] = array($this->source->filepath, $this->source->timestamp, 'file');
+ }
+ if ($this->mustCompile()) {
+ $this->compileConfigSource();
+ }
+ // pointer to scope
+ if ($scope == 'local') {
+ $scope_ptr = $this->data;
+ } elseif ($scope == 'parent') {
+ if (isset($this->data->parent)) {
+ $scope_ptr = $this->data->parent;
+ } else {
+ $scope_ptr = $this->data;
+ }
+ } elseif ($scope == 'root' || $scope == 'global') {
+ $scope_ptr = $this->data;
+ while (isset($scope_ptr->parent)) {
+ $scope_ptr = $scope_ptr->parent;
+ }
+ }
+ $_config_vars = array();
+ include($this->getCompiledFilepath());
+ // copy global config vars
+ foreach ($_config_vars['vars'] as $variable => $value) {
+ if ($this->smarty->config_overwrite || !isset($scope_ptr->config_vars[$variable])) {
+ $scope_ptr->config_vars[$variable] = $value;
+ } else {
+ $scope_ptr->config_vars[$variable] = array_merge((array) $scope_ptr->config_vars[$variable], (array) $value);
+ }
+ }
+ // scan sections
+ if (!empty($sections)) {
+ foreach ((array) $sections as $this_section) {
+ if (isset($_config_vars['sections'][$this_section])) {
+ foreach ($_config_vars['sections'][$this_section]['vars'] as $variable => $value) {
+ if ($this->smarty->config_overwrite || !isset($scope_ptr->config_vars[$variable])) {
+ $scope_ptr->config_vars[$variable] = $value;
+ } else {
+ $scope_ptr->config_vars[$variable] = array_merge((array) $scope_ptr->config_vars[$variable], (array) $value);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * set Smarty property in template context
+ *
+ * @param string $property_name property name
+ * @param mixed $value value
+ * @throws SmartyException if $property_name is not valid
+ */
+ public function __set($property_name, $value)
+ {
+ switch ($property_name) {
+ case 'source':
+ case 'compiled':
+ $this->$property_name = $value;
+ return;
+ }
+
+ throw new SmartyException("invalid config property '$property_name'.");
+ }
+
+ /**
+ * get Smarty property in template context
+ *
+ * @param string $property_name property name
+ * @throws SmartyException if $property_name is not valid
+ */
+ public function __get($property_name)
+ {
+ switch ($property_name) {
+ case 'source':
+ if (empty($this->config_resource)) {
+ throw new SmartyException("Unable to parse resource name \"{$this->config_resource}\"");
+ }
+ $this->source = Smarty_Resource::config($this);
+ return $this->source;
+
+ case 'compiled':
+ $this->compiled = $this->source->getCompiled($this);
+ return $this->compiled;
+ }
+
+ throw new SmartyException("config attribute '$property_name' does not exist.");
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_config_file_compiler.php b/include/smarty/libs/sysplugins/smarty_internal_config_file_compiler.php
new file mode 100644
index 000000000..b16a6940d
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_config_file_compiler.php
@@ -0,0 +1,144 @@
+<?php
+/**
+ * Smarty Internal Plugin Config File Compiler
+ *
+ * This is the config file compiler class. It calls the lexer and parser to
+ * perform the compiling.
+ *
+ * @package Smarty
+ * @subpackage Config
+ * @author Uwe Tews
+ */
+
+/**
+ * Main config file compiler class
+ *
+ * @package Smarty
+ * @subpackage Config
+ */
+class Smarty_Internal_Config_File_Compiler {
+
+ /**
+ * Lexer object
+ *
+ * @var object
+ */
+ public $lex;
+
+ /**
+ * Parser object
+ *
+ * @var object
+ */
+ public $parser;
+
+ /**
+ * Smarty object
+ *
+ * @var Smarty object
+ */
+ public $smarty;
+
+ /**
+ * Smarty object
+ *
+ * @var Smarty_Internal_Config object
+ */
+ public $config;
+
+ /**
+ * Compiled config data sections and variables
+ *
+ * @var array
+ */
+ public $config_data = array();
+
+ /**
+ * Initialize compiler
+ *
+ * @param Smarty $smarty base instance
+ */
+ public function __construct($smarty)
+ {
+ $this->smarty = $smarty;
+ $this->config_data['sections'] = array();
+ $this->config_data['vars'] = array();
+ }
+
+ /**
+ * Method to compile a Smarty template.
+ *
+ * @param Smarty_Internal_Config $config config object
+ * @return bool true if compiling succeeded, false if it failed
+ */
+ public function compileSource(Smarty_Internal_Config $config)
+ {
+ /* here is where the compiling takes place. Smarty
+ tags in the templates are replaces with PHP code,
+ then written to compiled files. */
+ $this->config = $config;
+ // get config file source
+ $_content = $config->source->content . "\n";
+ // on empty template just return
+ if ($_content == '') {
+ return true;
+ }
+ // init the lexer/parser to compile the config file
+ $lex = new Smarty_Internal_Configfilelexer($_content, $this->smarty);
+ $parser = new Smarty_Internal_Configfileparser($lex, $this);
+ if ($this->smarty->_parserdebug) $parser->PrintTrace();
+ // get tokens from lexer and parse them
+ while ($lex->yylex()) {
+ if ($this->smarty->_parserdebug) echo "<br>Parsing {$parser->yyTokenName[$lex->token]} Token {$lex->value} Line {$lex->line} \n";
+ $parser->doParse($lex->token, $lex->value);
+ }
+ // finish parsing process
+ $parser->doParse(0, 0);
+ $config->compiled_config = '<?php $_config_vars = ' . var_export($this->config_data, true) . '; ?>';
+ }
+
+ /**
+ * display compiler error messages without dying
+ *
+ * If parameter $args is empty it is a parser detected syntax error.
+ * In this case the parser is called to obtain information about exspected tokens.
+ *
+ * If parameter $args contains a string this is used as error message
+ *
+ * @param string $args individual error message or null
+ */
+ public function trigger_config_file_error($args = null)
+ {
+ $this->lex = Smarty_Internal_Configfilelexer::instance();
+ $this->parser = Smarty_Internal_Configfileparser::instance();
+ // get template source line which has error
+ $line = $this->lex->line;
+ if (isset($args)) {
+ // $line--;
+ }
+ $match = preg_split("/\n/", $this->lex->data);
+ $error_text = "Syntax error in config file '{$this->config->source->filepath}' on line {$line} '{$match[$line-1]}' ";
+ if (isset($args)) {
+ // individual error message
+ $error_text .= $args;
+ } else {
+ // exspected token from parser
+ foreach ($this->parser->yy_get_expected_tokens($this->parser->yymajor) as $token) {
+ $exp_token = $this->parser->yyTokenName[$token];
+ if (isset($this->lex->smarty_token_names[$exp_token])) {
+ // token type from lexer
+ $expect[] = '"' . $this->lex->smarty_token_names[$exp_token] . '"';
+ } else {
+ // otherwise internal token name
+ $expect[] = $this->parser->yyTokenName[$token];
+ }
+ }
+ // output parser error message
+ $error_text .= ' - Unexpected "' . $this->lex->value . '", expected one of: ' . implode(' , ', $expect);
+ }
+ throw new SmartyCompilerException($error_text);
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_configfilelexer.php b/include/smarty/libs/sysplugins/smarty_internal_configfilelexer.php
new file mode 100644
index 000000000..bade2fe74
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_configfilelexer.php
@@ -0,0 +1,622 @@
+<?php
+/**
+* Smarty Internal Plugin Configfilelexer
+*
+* This is the lexer to break the config file source into tokens
+* @package Smarty
+* @subpackage Config
+* @author Uwe Tews
+*/
+/**
+* Smarty Internal Plugin Configfilelexer
+*/
+class Smarty_Internal_Configfilelexer
+{
+
+ public $data;
+ public $counter;
+ public $token;
+ public $value;
+ public $node;
+ public $line;
+ private $state = 1;
+ public $smarty_token_names = array ( // Text for parser error messages
+ );
+
+
+ function __construct($data, $smarty)
+ {
+ // set instance object
+ self::instance($this);
+ $this->data = $data . "\n"; //now all lines are \n-terminated
+ $this->counter = 0;
+ $this->line = 1;
+ $this->smarty = $smarty;
+ $this->mbstring_overload = ini_get('mbstring.func_overload') & 2;
+ }
+ public static function &instance($new_instance = null)
+ {
+ static $instance = null;
+ if (isset($new_instance) && is_object($new_instance))
+ $instance = $new_instance;
+ return $instance;
+ }
+
+
+
+ private $_yy_state = 1;
+ private $_yy_stack = array();
+
+ function yylex()
+ {
+ return $this->{'yylex' . $this->_yy_state}();
+ }
+
+ function yypushstate($state)
+ {
+ array_push($this->_yy_stack, $this->_yy_state);
+ $this->_yy_state = $state;
+ }
+
+ function yypopstate()
+ {
+ $this->_yy_state = array_pop($this->_yy_stack);
+ }
+
+ function yybegin($state)
+ {
+ $this->_yy_state = $state;
+ }
+
+
+
+
+ function yylex1()
+ {
+ $tokenMap = array (
+ 1 => 0,
+ 2 => 0,
+ 3 => 0,
+ 4 => 0,
+ 5 => 0,
+ 6 => 0,
+ 7 => 0,
+ 8 => 0,
+ );
+ if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
+ return false; // end of input
+ }
+ $yy_global_pattern = "/\G(#|;)|\G(\\[)|\G(\\])|\G(=)|\G([ \t\r]+)|\G(\n)|\G([0-9]*[a-zA-Z_]\\w*)|\G([\S\s])/iS";
+
+ do {
+ if ($this->mbstring_overload ? preg_match($yy_global_pattern, mb_substr($this->data, $this->counter,2000000000,'latin1'), $yymatches) : preg_match($yy_global_pattern,$this->data, $yymatches, null, $this->counter)) {
+ $yysubmatches = $yymatches;
+ $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
+ if (!count($yymatches)) {
+ throw new Exception('Error: lexing failed because a rule matched' .
+ ' an empty string. Input "' . substr($this->data,
+ $this->counter, 5) . '... state START');
+ }
+ next($yymatches); // skip global match
+ $this->token = key($yymatches); // token number
+ if ($tokenMap[$this->token]) {
+ // extract sub-patterns for passing to lex function
+ $yysubmatches = array_slice($yysubmatches, $this->token + 1,
+ $tokenMap[$this->token]);
+ } else {
+ $yysubmatches = array();
+ }
+ $this->value = current($yymatches); // token value
+ $r = $this->{'yy_r1_' . $this->token}($yysubmatches);
+ if ($r === null) {
+ $this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
+ $this->line += substr_count($this->value, "\n");
+ // accept this token
+ return true;
+ } elseif ($r === true) {
+ // we have changed state
+ // process this token in the new state
+ return $this->yylex();
+ } elseif ($r === false) {
+ $this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
+ $this->line += substr_count($this->value, "\n");
+ if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
+ return false; // end of input
+ }
+ // skip this token
+ continue;
+ } } else {
+ throw new Exception('Unexpected input at line' . $this->line .
+ ': ' . $this->data[$this->counter]);
+ }
+ break;
+ } while (true);
+
+ } // end function
+
+
+ const START = 1;
+ function yy_r1_1($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_COMMENTSTART;
+ $this->yypushstate(self::COMMENT);
+ }
+ function yy_r1_2($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_OPENB;
+ $this->yypushstate(self::SECTION);
+ }
+ function yy_r1_3($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_CLOSEB;
+ }
+ function yy_r1_4($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_EQUAL;
+ $this->yypushstate(self::VALUE);
+ }
+ function yy_r1_5($yy_subpatterns)
+ {
+
+ return false;
+ }
+ function yy_r1_6($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_NEWLINE;
+ }
+ function yy_r1_7($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_ID;
+ }
+ function yy_r1_8($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_OTHER;
+ }
+
+
+
+ function yylex2()
+ {
+ $tokenMap = array (
+ 1 => 0,
+ 2 => 0,
+ 3 => 0,
+ 4 => 0,
+ 5 => 0,
+ 6 => 0,
+ 7 => 0,
+ 8 => 0,
+ 9 => 0,
+ );
+ if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
+ return false; // end of input
+ }
+ $yy_global_pattern = "/\G([ \t\r]+)|\G(\\d+\\.\\d+(?=[ \t\r]*[\n#;]))|\G(\\d+(?=[ \t\r]*[\n#;]))|\G(\"\"\")|\G('[^'\\\\]*(?:\\\\.[^'\\\\]*)*'(?=[ \t\r]*[\n#;]))|\G(\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"(?=[ \t\r]*[\n#;]))|\G([a-zA-Z]+(?=[ \t\r]*[\n#;]))|\G([^\n]+?(?=[ \t\r]*\n))|\G(\n)/iS";
+
+ do {
+ if ($this->mbstring_overload ? preg_match($yy_global_pattern, mb_substr($this->data, $this->counter,2000000000,'latin1'), $yymatches) : preg_match($yy_global_pattern,$this->data, $yymatches, null, $this->counter)) {
+ $yysubmatches = $yymatches;
+ $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
+ if (!count($yymatches)) {
+ throw new Exception('Error: lexing failed because a rule matched' .
+ ' an empty string. Input "' . substr($this->data,
+ $this->counter, 5) . '... state VALUE');
+ }
+ next($yymatches); // skip global match
+ $this->token = key($yymatches); // token number
+ if ($tokenMap[$this->token]) {
+ // extract sub-patterns for passing to lex function
+ $yysubmatches = array_slice($yysubmatches, $this->token + 1,
+ $tokenMap[$this->token]);
+ } else {
+ $yysubmatches = array();
+ }
+ $this->value = current($yymatches); // token value
+ $r = $this->{'yy_r2_' . $this->token}($yysubmatches);
+ if ($r === null) {
+ $this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
+ $this->line += substr_count($this->value, "\n");
+ // accept this token
+ return true;
+ } elseif ($r === true) {
+ // we have changed state
+ // process this token in the new state
+ return $this->yylex();
+ } elseif ($r === false) {
+ $this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
+ $this->line += substr_count($this->value, "\n");
+ if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
+ return false; // end of input
+ }
+ // skip this token
+ continue;
+ } } else {
+ throw new Exception('Unexpected input at line' . $this->line .
+ ': ' . $this->data[$this->counter]);
+ }
+ break;
+ } while (true);
+
+ } // end function
+
+
+ const VALUE = 2;
+ function yy_r2_1($yy_subpatterns)
+ {
+
+ return false;
+ }
+ function yy_r2_2($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_FLOAT;
+ $this->yypopstate();
+ }
+ function yy_r2_3($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_INT;
+ $this->yypopstate();
+ }
+ function yy_r2_4($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_QUOTES;
+ $this->yypushstate(self::TRIPPLE);
+ }
+ function yy_r2_5($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_SINGLE_QUOTED_STRING;
+ $this->yypopstate();
+ }
+ function yy_r2_6($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_DOUBLE_QUOTED_STRING;
+ $this->yypopstate();
+ }
+ function yy_r2_7($yy_subpatterns)
+ {
+
+ if (!$this->smarty->config_booleanize || !in_array(strtolower($this->value), Array("true", "false", "on", "off", "yes", "no")) ) {
+ $this->yypopstate();
+ $this->yypushstate(self::NAKED_STRING_VALUE);
+ return true; //reprocess in new state
+ } else {
+ $this->token = Smarty_Internal_Configfileparser::TPC_BOOL;
+ $this->yypopstate();
+ }
+ }
+ function yy_r2_8($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING;
+ $this->yypopstate();
+ }
+ function yy_r2_9($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING;
+ $this->value = "";
+ $this->yypopstate();
+ }
+
+
+
+ function yylex3()
+ {
+ $tokenMap = array (
+ 1 => 0,
+ );
+ if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
+ return false; // end of input
+ }
+ $yy_global_pattern = "/\G([^\n]+?(?=[ \t\r]*\n))/iS";
+
+ do {
+ if ($this->mbstring_overload ? preg_match($yy_global_pattern, mb_substr($this->data, $this->counter,2000000000,'latin1'), $yymatches) : preg_match($yy_global_pattern,$this->data, $yymatches, null, $this->counter)) {
+ $yysubmatches = $yymatches;
+ $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
+ if (!count($yymatches)) {
+ throw new Exception('Error: lexing failed because a rule matched' .
+ ' an empty string. Input "' . substr($this->data,
+ $this->counter, 5) . '... state NAKED_STRING_VALUE');
+ }
+ next($yymatches); // skip global match
+ $this->token = key($yymatches); // token number
+ if ($tokenMap[$this->token]) {
+ // extract sub-patterns for passing to lex function
+ $yysubmatches = array_slice($yysubmatches, $this->token + 1,
+ $tokenMap[$this->token]);
+ } else {
+ $yysubmatches = array();
+ }
+ $this->value = current($yymatches); // token value
+ $r = $this->{'yy_r3_' . $this->token}($yysubmatches);
+ if ($r === null) {
+ $this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
+ $this->line += substr_count($this->value, "\n");
+ // accept this token
+ return true;
+ } elseif ($r === true) {
+ // we have changed state
+ // process this token in the new state
+ return $this->yylex();
+ } elseif ($r === false) {
+ $this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
+ $this->line += substr_count($this->value, "\n");
+ if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
+ return false; // end of input
+ }
+ // skip this token
+ continue;
+ } } else {
+ throw new Exception('Unexpected input at line' . $this->line .
+ ': ' . $this->data[$this->counter]);
+ }
+ break;
+ } while (true);
+
+ } // end function
+
+
+ const NAKED_STRING_VALUE = 3;
+ function yy_r3_1($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING;
+ $this->yypopstate();
+ }
+
+
+
+ function yylex4()
+ {
+ $tokenMap = array (
+ 1 => 0,
+ 2 => 0,
+ 3 => 0,
+ );
+ if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
+ return false; // end of input
+ }
+ $yy_global_pattern = "/\G([ \t\r]+)|\G([^\n]+?(?=[ \t\r]*\n))|\G(\n)/iS";
+
+ do {
+ if ($this->mbstring_overload ? preg_match($yy_global_pattern, mb_substr($this->data, $this->counter,2000000000,'latin1'), $yymatches) : preg_match($yy_global_pattern,$this->data, $yymatches, null, $this->counter)) {
+ $yysubmatches = $yymatches;
+ $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
+ if (!count($yymatches)) {
+ throw new Exception('Error: lexing failed because a rule matched' .
+ ' an empty string. Input "' . substr($this->data,
+ $this->counter, 5) . '... state COMMENT');
+ }
+ next($yymatches); // skip global match
+ $this->token = key($yymatches); // token number
+ if ($tokenMap[$this->token]) {
+ // extract sub-patterns for passing to lex function
+ $yysubmatches = array_slice($yysubmatches, $this->token + 1,
+ $tokenMap[$this->token]);
+ } else {
+ $yysubmatches = array();
+ }
+ $this->value = current($yymatches); // token value
+ $r = $this->{'yy_r4_' . $this->token}($yysubmatches);
+ if ($r === null) {
+ $this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
+ $this->line += substr_count($this->value, "\n");
+ // accept this token
+ return true;
+ } elseif ($r === true) {
+ // we have changed state
+ // process this token in the new state
+ return $this->yylex();
+ } elseif ($r === false) {
+ $this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
+ $this->line += substr_count($this->value, "\n");
+ if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
+ return false; // end of input
+ }
+ // skip this token
+ continue;
+ } } else {
+ throw new Exception('Unexpected input at line' . $this->line .
+ ': ' . $this->data[$this->counter]);
+ }
+ break;
+ } while (true);
+
+ } // end function
+
+
+ const COMMENT = 4;
+ function yy_r4_1($yy_subpatterns)
+ {
+
+ return false;
+ }
+ function yy_r4_2($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING;
+ }
+ function yy_r4_3($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_NEWLINE;
+ $this->yypopstate();
+ }
+
+
+
+ function yylex5()
+ {
+ $tokenMap = array (
+ 1 => 0,
+ 2 => 0,
+ );
+ if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
+ return false; // end of input
+ }
+ $yy_global_pattern = "/\G(\\.)|\G(.*?(?=[\.=[\]\r\n]))/iS";
+
+ do {
+ if ($this->mbstring_overload ? preg_match($yy_global_pattern, mb_substr($this->data, $this->counter,2000000000,'latin1'), $yymatches) : preg_match($yy_global_pattern,$this->data, $yymatches, null, $this->counter)) {
+ $yysubmatches = $yymatches;
+ $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
+ if (!count($yymatches)) {
+ throw new Exception('Error: lexing failed because a rule matched' .
+ ' an empty string. Input "' . substr($this->data,
+ $this->counter, 5) . '... state SECTION');
+ }
+ next($yymatches); // skip global match
+ $this->token = key($yymatches); // token number
+ if ($tokenMap[$this->token]) {
+ // extract sub-patterns for passing to lex function
+ $yysubmatches = array_slice($yysubmatches, $this->token + 1,
+ $tokenMap[$this->token]);
+ } else {
+ $yysubmatches = array();
+ }
+ $this->value = current($yymatches); // token value
+ $r = $this->{'yy_r5_' . $this->token}($yysubmatches);
+ if ($r === null) {
+ $this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
+ $this->line += substr_count($this->value, "\n");
+ // accept this token
+ return true;
+ } elseif ($r === true) {
+ // we have changed state
+ // process this token in the new state
+ return $this->yylex();
+ } elseif ($r === false) {
+ $this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
+ $this->line += substr_count($this->value, "\n");
+ if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
+ return false; // end of input
+ }
+ // skip this token
+ continue;
+ } } else {
+ throw new Exception('Unexpected input at line' . $this->line .
+ ': ' . $this->data[$this->counter]);
+ }
+ break;
+ } while (true);
+
+ } // end function
+
+
+ const SECTION = 5;
+ function yy_r5_1($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_DOT;
+ }
+ function yy_r5_2($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_SECTION;
+ $this->yypopstate();
+ }
+
+
+ function yylex6()
+ {
+ $tokenMap = array (
+ 1 => 0,
+ 2 => 0,
+ );
+ if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
+ return false; // end of input
+ }
+ $yy_global_pattern = "/\G(\"\"\"(?=[ \t\r]*[\n#;]))|\G([\S\s])/iS";
+
+ do {
+ if ($this->mbstring_overload ? preg_match($yy_global_pattern, mb_substr($this->data, $this->counter,2000000000,'latin1'), $yymatches) : preg_match($yy_global_pattern,$this->data, $yymatches, null, $this->counter)) {
+ $yysubmatches = $yymatches;
+ $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
+ if (!count($yymatches)) {
+ throw new Exception('Error: lexing failed because a rule matched' .
+ ' an empty string. Input "' . substr($this->data,
+ $this->counter, 5) . '... state TRIPPLE');
+ }
+ next($yymatches); // skip global match
+ $this->token = key($yymatches); // token number
+ if ($tokenMap[$this->token]) {
+ // extract sub-patterns for passing to lex function
+ $yysubmatches = array_slice($yysubmatches, $this->token + 1,
+ $tokenMap[$this->token]);
+ } else {
+ $yysubmatches = array();
+ }
+ $this->value = current($yymatches); // token value
+ $r = $this->{'yy_r6_' . $this->token}($yysubmatches);
+ if ($r === null) {
+ $this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
+ $this->line += substr_count($this->value, "\n");
+ // accept this token
+ return true;
+ } elseif ($r === true) {
+ // we have changed state
+ // process this token in the new state
+ return $this->yylex();
+ } elseif ($r === false) {
+ $this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
+ $this->line += substr_count($this->value, "\n");
+ if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
+ return false; // end of input
+ }
+ // skip this token
+ continue;
+ } } else {
+ throw new Exception('Unexpected input at line' . $this->line .
+ ': ' . $this->data[$this->counter]);
+ }
+ break;
+ } while (true);
+
+ } // end function
+
+
+ const TRIPPLE = 6;
+ function yy_r6_1($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_QUOTES_END;
+ $this->yypopstate();
+ $this->yypushstate(self::START);
+ }
+ function yy_r6_2($yy_subpatterns)
+ {
+
+ if ($this->mbstring_overload) {
+ $to = mb_strlen($this->data,'latin1');
+ } else {
+ $to = strlen($this->data);
+ }
+ preg_match("/\"\"\"[ \t\r]*[\n#;]/",$this->data,$match,PREG_OFFSET_CAPTURE,$this->counter);
+ if (isset($match[0][1])) {
+ $to = $match[0][1];
+ } else {
+ $this->compiler->trigger_template_error ("missing or misspelled literal closing tag");
+ }
+ if ($this->mbstring_overload) {
+ $this->value = mb_substr($this->data,$this->counter,$to-$this->counter,'latin1');
+ } else {
+ $this->value = substr($this->data,$this->counter,$to-$this->counter);
+ }
+ $this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_TEXT;
+ }
+
+
+}
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_configfileparser.php b/include/smarty/libs/sysplugins/smarty_internal_configfileparser.php
new file mode 100644
index 000000000..784bc684d
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_configfileparser.php
@@ -0,0 +1,921 @@
+<?php
+/**
+* Smarty Internal Plugin Configfileparser
+*
+* This is the config file parser.
+* It is generated from the internal.configfileparser.y file
+* @package Smarty
+* @subpackage Compiler
+* @author Uwe Tews
+*/
+
+class TPC_yyToken implements ArrayAccess
+{
+ public $string = '';
+ public $metadata = array();
+
+ function __construct($s, $m = array())
+ {
+ if ($s instanceof TPC_yyToken) {
+ $this->string = $s->string;
+ $this->metadata = $s->metadata;
+ } else {
+ $this->string = (string) $s;
+ if ($m instanceof TPC_yyToken) {
+ $this->metadata = $m->metadata;
+ } elseif (is_array($m)) {
+ $this->metadata = $m;
+ }
+ }
+ }
+
+ function __toString()
+ {
+ return $this->_string;
+ }
+
+ function offsetExists($offset)
+ {
+ return isset($this->metadata[$offset]);
+ }
+
+ function offsetGet($offset)
+ {
+ return $this->metadata[$offset];
+ }
+
+ function offsetSet($offset, $value)
+ {
+ if ($offset === null) {
+ if (isset($value[0])) {
+ $x = ($value instanceof TPC_yyToken) ?
+ $value->metadata : $value;
+ $this->metadata = array_merge($this->metadata, $x);
+ return;
+ }
+ $offset = count($this->metadata);
+ }
+ if ($value === null) {
+ return;
+ }
+ if ($value instanceof TPC_yyToken) {
+ if ($value->metadata) {
+ $this->metadata[$offset] = $value->metadata;
+ }
+ } elseif ($value) {
+ $this->metadata[$offset] = $value;
+ }
+ }
+
+ function offsetUnset($offset)
+ {
+ unset($this->metadata[$offset]);
+ }
+}
+
+class TPC_yyStackEntry
+{
+ public $stateno; /* The state-number */
+ public $major; /* The major token value. This is the code
+ ** number for the token at this stack level */
+ public $minor; /* The user-supplied minor token value. This
+ ** is the value of the token */
+};
+
+
+#line 12 "smarty_internal_configfileparser.y"
+class Smarty_Internal_Configfileparser#line 79 "smarty_internal_configfileparser.php"
+{
+#line 14 "smarty_internal_configfileparser.y"
+
+ // states whether the parse was successful or not
+ public $successful = true;
+ public $retvalue = 0;
+ private $lex;
+ private $internalError = false;
+
+ function __construct($lex, $compiler) {
+ // set instance object
+ self::instance($this);
+ $this->lex = $lex;
+ $this->smarty = $compiler->smarty;
+ $this->compiler = $compiler;
+ }
+ public static function &instance($new_instance = null)
+ {
+ static $instance = null;
+ if (isset($new_instance) && is_object($new_instance))
+ $instance = $new_instance;
+ return $instance;
+ }
+
+ private function parse_bool($str) {
+ if (in_array(strtolower($str) ,array('on','yes','true'))) {
+ $res = true;
+ } else {
+ $res = false;
+ }
+ return $res;
+ }
+
+ private static $escapes_single = Array('\\' => '\\',
+ '\'' => '\'');
+ private static function parse_single_quoted_string($qstr) {
+ $escaped_string = substr($qstr, 1, strlen($qstr)-2); //remove outer quotes
+
+ $ss = preg_split('/(\\\\.)/', $escaped_string, -1, PREG_SPLIT_DELIM_CAPTURE);
+
+ $str = "";
+ foreach ($ss as $s) {
+ if (strlen($s) === 2 && $s[0] === '\\') {
+ if (isset(self::$escapes_single[$s[1]])) {
+ $s = self::$escapes_single[$s[1]];
+ }
+ }
+
+ $str .= $s;
+ }
+
+ return $str;
+ }
+
+ private static function parse_double_quoted_string($qstr) {
+ $inner_str = substr($qstr, 1, strlen($qstr)-2);
+ return stripcslashes($inner_str);
+ }
+
+ private static function parse_tripple_double_quoted_string($qstr) {
+ return stripcslashes($qstr);
+ }
+
+ private function set_var(Array $var, Array &$target_array) {
+ $key = $var["key"];
+ $value = $var["value"];
+
+ if ($this->smarty->config_overwrite || !isset($target_array['vars'][$key])) {
+ $target_array['vars'][$key] = $value;
+ } else {
+ settype($target_array['vars'][$key], 'array');
+ $target_array['vars'][$key][] = $value;
+ }
+ }
+
+ private function add_global_vars(Array $vars) {
+ if (!isset($this->compiler->config_data['vars'])) {
+ $this->compiler->config_data['vars'] = Array();
+ }
+ foreach ($vars as $var) {
+ $this->set_var($var, $this->compiler->config_data);
+ }
+ }
+
+ private function add_section_vars($section_name, Array $vars) {
+ if (!isset($this->compiler->config_data['sections'][$section_name]['vars'])) {
+ $this->compiler->config_data['sections'][$section_name]['vars'] = Array();
+ }
+ foreach ($vars as $var) {
+ $this->set_var($var, $this->compiler->config_data['sections'][$section_name]);
+ }
+ }
+#line 173 "smarty_internal_configfileparser.php"
+
+ const TPC_OPENB = 1;
+ const TPC_SECTION = 2;
+ const TPC_CLOSEB = 3;
+ const TPC_DOT = 4;
+ const TPC_ID = 5;
+ const TPC_EQUAL = 6;
+ const TPC_FLOAT = 7;
+ const TPC_INT = 8;
+ const TPC_BOOL = 9;
+ const TPC_SINGLE_QUOTED_STRING = 10;
+ const TPC_DOUBLE_QUOTED_STRING = 11;
+ const TPC_TRIPPLE_QUOTES = 12;
+ const TPC_TRIPPLE_TEXT = 13;
+ const TPC_TRIPPLE_QUOTES_END = 14;
+ const TPC_NAKED_STRING = 15;
+ const TPC_OTHER = 16;
+ const TPC_NEWLINE = 17;
+ const TPC_COMMENTSTART = 18;
+ const YY_NO_ACTION = 60;
+ const YY_ACCEPT_ACTION = 59;
+ const YY_ERROR_ACTION = 58;
+
+ const YY_SZ_ACTTAB = 38;
+static public $yy_action = array(
+ /* 0 */ 29, 30, 34, 33, 24, 13, 19, 25, 35, 21,
+ /* 10 */ 59, 8, 3, 1, 20, 12, 14, 31, 20, 12,
+ /* 20 */ 15, 17, 23, 18, 27, 26, 4, 5, 6, 32,
+ /* 30 */ 2, 11, 28, 22, 16, 9, 7, 10,
+ );
+ static public $yy_lookahead = array(
+ /* 0 */ 7, 8, 9, 10, 11, 12, 5, 27, 15, 16,
+ /* 10 */ 20, 21, 23, 23, 17, 18, 13, 14, 17, 18,
+ /* 20 */ 15, 2, 17, 4, 25, 26, 6, 3, 3, 14,
+ /* 30 */ 23, 1, 24, 17, 2, 25, 22, 25,
+);
+ const YY_SHIFT_USE_DFLT = -8;
+ const YY_SHIFT_MAX = 19;
+ static public $yy_shift_ofst = array(
+ /* 0 */ -8, 1, 1, 1, -7, -3, -3, 30, -8, -8,
+ /* 10 */ -8, 19, 5, 3, 15, 16, 24, 25, 32, 20,
+);
+ const YY_REDUCE_USE_DFLT = -21;
+ const YY_REDUCE_MAX = 10;
+ static public $yy_reduce_ofst = array(
+ /* 0 */ -10, -1, -1, -1, -20, 10, 12, 8, 14, 7,
+ /* 10 */ -11,
+);
+ static public $yyExpectedTokens = array(
+ /* 0 */ array(),
+ /* 1 */ array(5, 17, 18, ),
+ /* 2 */ array(5, 17, 18, ),
+ /* 3 */ array(5, 17, 18, ),
+ /* 4 */ array(7, 8, 9, 10, 11, 12, 15, 16, ),
+ /* 5 */ array(17, 18, ),
+ /* 6 */ array(17, 18, ),
+ /* 7 */ array(1, ),
+ /* 8 */ array(),
+ /* 9 */ array(),
+ /* 10 */ array(),
+ /* 11 */ array(2, 4, ),
+ /* 12 */ array(15, 17, ),
+ /* 13 */ array(13, 14, ),
+ /* 14 */ array(14, ),
+ /* 15 */ array(17, ),
+ /* 16 */ array(3, ),
+ /* 17 */ array(3, ),
+ /* 18 */ array(2, ),
+ /* 19 */ array(6, ),
+ /* 20 */ array(),
+ /* 21 */ array(),
+ /* 22 */ array(),
+ /* 23 */ array(),
+ /* 24 */ array(),
+ /* 25 */ array(),
+ /* 26 */ array(),
+ /* 27 */ array(),
+ /* 28 */ array(),
+ /* 29 */ array(),
+ /* 30 */ array(),
+ /* 31 */ array(),
+ /* 32 */ array(),
+ /* 33 */ array(),
+ /* 34 */ array(),
+ /* 35 */ array(),
+);
+ static public $yy_default = array(
+ /* 0 */ 44, 37, 41, 40, 58, 58, 58, 36, 39, 44,
+ /* 10 */ 44, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ /* 20 */ 55, 54, 57, 56, 50, 45, 43, 42, 38, 46,
+ /* 30 */ 47, 52, 51, 49, 48, 53,
+);
+ const YYNOCODE = 29;
+ const YYSTACKDEPTH = 100;
+ const YYNSTATE = 36;
+ const YYNRULE = 22;
+ const YYERRORSYMBOL = 19;
+ const YYERRSYMDT = 'yy0';
+ const YYFALLBACK = 0;
+ static public $yyFallback = array(
+ );
+ static function Trace($TraceFILE, $zTracePrompt)
+ {
+ if (!$TraceFILE) {
+ $zTracePrompt = 0;
+ } elseif (!$zTracePrompt) {
+ $TraceFILE = 0;
+ }
+ self::$yyTraceFILE = $TraceFILE;
+ self::$yyTracePrompt = $zTracePrompt;
+ }
+
+ static function PrintTrace()
+ {
+ self::$yyTraceFILE = fopen('php://output', 'w');
+ self::$yyTracePrompt = '<br>';
+ }
+
+ static public $yyTraceFILE;
+ static public $yyTracePrompt;
+ public $yyidx; /* Index of top element in stack */
+ public $yyerrcnt; /* Shifts left before out of the error */
+ public $yystack = array(); /* The parser's stack */
+
+ public $yyTokenName = array(
+ '$', 'OPENB', 'SECTION', 'CLOSEB',
+ 'DOT', 'ID', 'EQUAL', 'FLOAT',
+ 'INT', 'BOOL', 'SINGLE_QUOTED_STRING', 'DOUBLE_QUOTED_STRING',
+ 'TRIPPLE_QUOTES', 'TRIPPLE_TEXT', 'TRIPPLE_QUOTES_END', 'NAKED_STRING',
+ 'OTHER', 'NEWLINE', 'COMMENTSTART', 'error',
+ 'start', 'global_vars', 'sections', 'var_list',
+ 'section', 'newline', 'var', 'value',
+ );
+
+ static public $yyRuleName = array(
+ /* 0 */ "start ::= global_vars sections",
+ /* 1 */ "global_vars ::= var_list",
+ /* 2 */ "sections ::= sections section",
+ /* 3 */ "sections ::=",
+ /* 4 */ "section ::= OPENB SECTION CLOSEB newline var_list",
+ /* 5 */ "section ::= OPENB DOT SECTION CLOSEB newline var_list",
+ /* 6 */ "var_list ::= var_list newline",
+ /* 7 */ "var_list ::= var_list var",
+ /* 8 */ "var_list ::=",
+ /* 9 */ "var ::= ID EQUAL value",
+ /* 10 */ "value ::= FLOAT",
+ /* 11 */ "value ::= INT",
+ /* 12 */ "value ::= BOOL",
+ /* 13 */ "value ::= SINGLE_QUOTED_STRING",
+ /* 14 */ "value ::= DOUBLE_QUOTED_STRING",
+ /* 15 */ "value ::= TRIPPLE_QUOTES TRIPPLE_TEXT TRIPPLE_QUOTES_END",
+ /* 16 */ "value ::= TRIPPLE_QUOTES TRIPPLE_QUOTES_END",
+ /* 17 */ "value ::= NAKED_STRING",
+ /* 18 */ "value ::= OTHER",
+ /* 19 */ "newline ::= NEWLINE",
+ /* 20 */ "newline ::= COMMENTSTART NEWLINE",
+ /* 21 */ "newline ::= COMMENTSTART NAKED_STRING NEWLINE",
+ );
+
+ function tokenName($tokenType)
+ {
+ if ($tokenType === 0) {
+ return 'End of Input';
+ }
+ if ($tokenType > 0 && $tokenType < count($this->yyTokenName)) {
+ return $this->yyTokenName[$tokenType];
+ } else {
+ return "Unknown";
+ }
+ }
+
+ static function yy_destructor($yymajor, $yypminor)
+ {
+ switch ($yymajor) {
+ default: break; /* If no destructor action specified: do nothing */
+ }
+ }
+
+ function yy_pop_parser_stack()
+ {
+ if (!count($this->yystack)) {
+ return;
+ }
+ $yytos = array_pop($this->yystack);
+ if (self::$yyTraceFILE && $this->yyidx >= 0) {
+ fwrite(self::$yyTraceFILE,
+ self::$yyTracePrompt . 'Popping ' . $this->yyTokenName[$yytos->major] .
+ "\n");
+ }
+ $yymajor = $yytos->major;
+ self::yy_destructor($yymajor, $yytos->minor);
+ $this->yyidx--;
+ return $yymajor;
+ }
+
+ function __destruct()
+ {
+ while ($this->yystack !== Array()) {
+ $this->yy_pop_parser_stack();
+ }
+ if (is_resource(self::$yyTraceFILE)) {
+ fclose(self::$yyTraceFILE);
+ }
+ }
+
+ function yy_get_expected_tokens($token)
+ {
+ $state = $this->yystack[$this->yyidx]->stateno;
+ $expected = self::$yyExpectedTokens[$state];
+ if (in_array($token, self::$yyExpectedTokens[$state], true)) {
+ return $expected;
+ }
+ $stack = $this->yystack;
+ $yyidx = $this->yyidx;
+ do {
+ $yyact = $this->yy_find_shift_action($token);
+ if ($yyact >= self::YYNSTATE && $yyact < self::YYNSTATE + self::YYNRULE) {
+ // reduce action
+ $done = 0;
+ do {
+ if ($done++ == 100) {
+ $this->yyidx = $yyidx;
+ $this->yystack = $stack;
+ // too much recursion prevents proper detection
+ // so give up
+ return array_unique($expected);
+ }
+ $yyruleno = $yyact - self::YYNSTATE;
+ $this->yyidx -= self::$yyRuleInfo[$yyruleno]['rhs'];
+ $nextstate = $this->yy_find_reduce_action(
+ $this->yystack[$this->yyidx]->stateno,
+ self::$yyRuleInfo[$yyruleno]['lhs']);
+ if (isset(self::$yyExpectedTokens[$nextstate])) {
+ $expected = array_merge($expected, self::$yyExpectedTokens[$nextstate]);
+ if (in_array($token,
+ self::$yyExpectedTokens[$nextstate], true)) {
+ $this->yyidx = $yyidx;
+ $this->yystack = $stack;
+ return array_unique($expected);
+ }
+ }
+ if ($nextstate < self::YYNSTATE) {
+ // we need to shift a non-terminal
+ $this->yyidx++;
+ $x = new TPC_yyStackEntry;
+ $x->stateno = $nextstate;
+ $x->major = self::$yyRuleInfo[$yyruleno]['lhs'];
+ $this->yystack[$this->yyidx] = $x;
+ continue 2;
+ } elseif ($nextstate == self::YYNSTATE + self::YYNRULE + 1) {
+ $this->yyidx = $yyidx;
+ $this->yystack = $stack;
+ // the last token was just ignored, we can't accept
+ // by ignoring input, this is in essence ignoring a
+ // syntax error!
+ return array_unique($expected);
+ } elseif ($nextstate === self::YY_NO_ACTION) {
+ $this->yyidx = $yyidx;
+ $this->yystack = $stack;
+ // input accepted, but not shifted (I guess)
+ return $expected;
+ } else {
+ $yyact = $nextstate;
+ }
+ } while (true);
+ }
+ break;
+ } while (true);
+ $this->yyidx = $yyidx;
+ $this->yystack = $stack;
+ return array_unique($expected);
+ }
+
+ function yy_is_expected_token($token)
+ {
+ if ($token === 0) {
+ return true; // 0 is not part of this
+ }
+ $state = $this->yystack[$this->yyidx]->stateno;
+ if (in_array($token, self::$yyExpectedTokens[$state], true)) {
+ return true;
+ }
+ $stack = $this->yystack;
+ $yyidx = $this->yyidx;
+ do {
+ $yyact = $this->yy_find_shift_action($token);
+ if ($yyact >= self::YYNSTATE && $yyact < self::YYNSTATE + self::YYNRULE) {
+ // reduce action
+ $done = 0;
+ do {
+ if ($done++ == 100) {
+ $this->yyidx = $yyidx;
+ $this->yystack = $stack;
+ // too much recursion prevents proper detection
+ // so give up
+ return true;
+ }
+ $yyruleno = $yyact - self::YYNSTATE;
+ $this->yyidx -= self::$yyRuleInfo[$yyruleno]['rhs'];
+ $nextstate = $this->yy_find_reduce_action(
+ $this->yystack[$this->yyidx]->stateno,
+ self::$yyRuleInfo[$yyruleno]['lhs']);
+ if (isset(self::$yyExpectedTokens[$nextstate]) &&
+ in_array($token, self::$yyExpectedTokens[$nextstate], true)) {
+ $this->yyidx = $yyidx;
+ $this->yystack = $stack;
+ return true;
+ }
+ if ($nextstate < self::YYNSTATE) {
+ // we need to shift a non-terminal
+ $this->yyidx++;
+ $x = new TPC_yyStackEntry;
+ $x->stateno = $nextstate;
+ $x->major = self::$yyRuleInfo[$yyruleno]['lhs'];
+ $this->yystack[$this->yyidx] = $x;
+ continue 2;
+ } elseif ($nextstate == self::YYNSTATE + self::YYNRULE + 1) {
+ $this->yyidx = $yyidx;
+ $this->yystack = $stack;
+ if (!$token) {
+ // end of input: this is valid
+ return true;
+ }
+ // the last token was just ignored, we can't accept
+ // by ignoring input, this is in essence ignoring a
+ // syntax error!
+ return false;
+ } elseif ($nextstate === self::YY_NO_ACTION) {
+ $this->yyidx = $yyidx;
+ $this->yystack = $stack;
+ // input accepted, but not shifted (I guess)
+ return true;
+ } else {
+ $yyact = $nextstate;
+ }
+ } while (true);
+ }
+ break;
+ } while (true);
+ $this->yyidx = $yyidx;
+ $this->yystack = $stack;
+ return true;
+ }
+
+ function yy_find_shift_action($iLookAhead)
+ {
+ $stateno = $this->yystack[$this->yyidx]->stateno;
+
+ /* if ($this->yyidx < 0) return self::YY_NO_ACTION; */
+ if (!isset(self::$yy_shift_ofst[$stateno])) {
+ // no shift actions
+ return self::$yy_default[$stateno];
+ }
+ $i = self::$yy_shift_ofst[$stateno];
+ if ($i === self::YY_SHIFT_USE_DFLT) {
+ return self::$yy_default[$stateno];
+ }
+ if ($iLookAhead == self::YYNOCODE) {
+ return self::YY_NO_ACTION;
+ }
+ $i += $iLookAhead;
+ if ($i < 0 || $i >= self::YY_SZ_ACTTAB ||
+ self::$yy_lookahead[$i] != $iLookAhead) {
+ if (count(self::$yyFallback) && $iLookAhead < count(self::$yyFallback)
+ && ($iFallback = self::$yyFallback[$iLookAhead]) != 0) {
+ if (self::$yyTraceFILE) {
+ fwrite(self::$yyTraceFILE, self::$yyTracePrompt . "FALLBACK " .
+ $this->yyTokenName[$iLookAhead] . " => " .
+ $this->yyTokenName[$iFallback] . "\n");
+ }
+ return $this->yy_find_shift_action($iFallback);
+ }
+ return self::$yy_default[$stateno];
+ } else {
+ return self::$yy_action[$i];
+ }
+ }
+
+ function yy_find_reduce_action($stateno, $iLookAhead)
+ {
+ /* $stateno = $this->yystack[$this->yyidx]->stateno; */
+
+ if (!isset(self::$yy_reduce_ofst[$stateno])) {
+ return self::$yy_default[$stateno];
+ }
+ $i = self::$yy_reduce_ofst[$stateno];
+ if ($i == self::YY_REDUCE_USE_DFLT) {
+ return self::$yy_default[$stateno];
+ }
+ if ($iLookAhead == self::YYNOCODE) {
+ return self::YY_NO_ACTION;
+ }
+ $i += $iLookAhead;
+ if ($i < 0 || $i >= self::YY_SZ_ACTTAB ||
+ self::$yy_lookahead[$i] != $iLookAhead) {
+ return self::$yy_default[$stateno];
+ } else {
+ return self::$yy_action[$i];
+ }
+ }
+
+ function yy_shift($yyNewState, $yyMajor, $yypMinor)
+ {
+ $this->yyidx++;
+ if ($this->yyidx >= self::YYSTACKDEPTH) {
+ $this->yyidx--;
+ if (self::$yyTraceFILE) {
+ fprintf(self::$yyTraceFILE, "%sStack Overflow!\n", self::$yyTracePrompt);
+ }
+ while ($this->yyidx >= 0) {
+ $this->yy_pop_parser_stack();
+ }
+#line 125 "smarty_internal_configfileparser.y"
+
+ $this->internalError = true;
+ $this->compiler->trigger_config_file_error("Stack overflow in configfile parser");
+#line 593 "smarty_internal_configfileparser.php"
+ return;
+ }
+ $yytos = new TPC_yyStackEntry;
+ $yytos->stateno = $yyNewState;
+ $yytos->major = $yyMajor;
+ $yytos->minor = $yypMinor;
+ array_push($this->yystack, $yytos);
+ if (self::$yyTraceFILE && $this->yyidx > 0) {
+ fprintf(self::$yyTraceFILE, "%sShift %d\n", self::$yyTracePrompt,
+ $yyNewState);
+ fprintf(self::$yyTraceFILE, "%sStack:", self::$yyTracePrompt);
+ for($i = 1; $i <= $this->yyidx; $i++) {
+ fprintf(self::$yyTraceFILE, " %s",
+ $this->yyTokenName[$this->yystack[$i]->major]);
+ }
+ fwrite(self::$yyTraceFILE,"\n");
+ }
+ }
+
+ static public $yyRuleInfo = array(
+ array( 'lhs' => 20, 'rhs' => 2 ),
+ array( 'lhs' => 21, 'rhs' => 1 ),
+ array( 'lhs' => 22, 'rhs' => 2 ),
+ array( 'lhs' => 22, 'rhs' => 0 ),
+ array( 'lhs' => 24, 'rhs' => 5 ),
+ array( 'lhs' => 24, 'rhs' => 6 ),
+ array( 'lhs' => 23, 'rhs' => 2 ),
+ array( 'lhs' => 23, 'rhs' => 2 ),
+ array( 'lhs' => 23, 'rhs' => 0 ),
+ array( 'lhs' => 26, 'rhs' => 3 ),
+ array( 'lhs' => 27, 'rhs' => 1 ),
+ array( 'lhs' => 27, 'rhs' => 1 ),
+ array( 'lhs' => 27, 'rhs' => 1 ),
+ array( 'lhs' => 27, 'rhs' => 1 ),
+ array( 'lhs' => 27, 'rhs' => 1 ),
+ array( 'lhs' => 27, 'rhs' => 3 ),
+ array( 'lhs' => 27, 'rhs' => 2 ),
+ array( 'lhs' => 27, 'rhs' => 1 ),
+ array( 'lhs' => 27, 'rhs' => 1 ),
+ array( 'lhs' => 25, 'rhs' => 1 ),
+ array( 'lhs' => 25, 'rhs' => 2 ),
+ array( 'lhs' => 25, 'rhs' => 3 ),
+ );
+
+ static public $yyReduceMap = array(
+ 0 => 0,
+ 2 => 0,
+ 3 => 0,
+ 19 => 0,
+ 20 => 0,
+ 21 => 0,
+ 1 => 1,
+ 4 => 4,
+ 5 => 5,
+ 6 => 6,
+ 7 => 7,
+ 8 => 8,
+ 9 => 9,
+ 10 => 10,
+ 11 => 11,
+ 12 => 12,
+ 13 => 13,
+ 14 => 14,
+ 15 => 15,
+ 16 => 16,
+ 17 => 17,
+ 18 => 17,
+ );
+#line 131 "smarty_internal_configfileparser.y"
+ function yy_r0(){
+ $this->_retvalue = null;
+ }
+#line 666 "smarty_internal_configfileparser.php"
+#line 136 "smarty_internal_configfileparser.y"
+ function yy_r1(){
+ $this->add_global_vars($this->yystack[$this->yyidx + 0]->minor); $this->_retvalue = null;
+ }
+#line 671 "smarty_internal_configfileparser.php"
+#line 149 "smarty_internal_configfileparser.y"
+ function yy_r4(){
+ $this->add_section_vars($this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + 0]->minor);
+ $this->_retvalue = null;
+ }
+#line 677 "smarty_internal_configfileparser.php"
+#line 154 "smarty_internal_configfileparser.y"
+ function yy_r5(){
+ if ($this->smarty->config_read_hidden) {
+ $this->add_section_vars($this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + 0]->minor);
+ }
+ $this->_retvalue = null;
+ }
+#line 685 "smarty_internal_configfileparser.php"
+#line 162 "smarty_internal_configfileparser.y"
+ function yy_r6(){
+ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor;
+ }
+#line 690 "smarty_internal_configfileparser.php"
+#line 166 "smarty_internal_configfileparser.y"
+ function yy_r7(){
+ $this->_retvalue = array_merge($this->yystack[$this->yyidx + -1]->minor, Array($this->yystack[$this->yyidx + 0]->minor));
+ }
+#line 695 "smarty_internal_configfileparser.php"
+#line 170 "smarty_internal_configfileparser.y"
+ function yy_r8(){
+ $this->_retvalue = Array();
+ }
+#line 700 "smarty_internal_configfileparser.php"
+#line 176 "smarty_internal_configfileparser.y"
+ function yy_r9(){
+ $this->_retvalue = Array("key" => $this->yystack[$this->yyidx + -2]->minor, "value" => $this->yystack[$this->yyidx + 0]->minor);
+ }
+#line 705 "smarty_internal_configfileparser.php"
+#line 181 "smarty_internal_configfileparser.y"
+ function yy_r10(){
+ $this->_retvalue = (float) $this->yystack[$this->yyidx + 0]->minor;
+ }
+#line 710 "smarty_internal_configfileparser.php"
+#line 185 "smarty_internal_configfileparser.y"
+ function yy_r11(){
+ $this->_retvalue = (int) $this->yystack[$this->yyidx + 0]->minor;
+ }
+#line 715 "smarty_internal_configfileparser.php"
+#line 189 "smarty_internal_configfileparser.y"
+ function yy_r12(){
+ $this->_retvalue = $this->parse_bool($this->yystack[$this->yyidx + 0]->minor);
+ }
+#line 720 "smarty_internal_configfileparser.php"
+#line 193 "smarty_internal_configfileparser.y"
+ function yy_r13(){
+ $this->_retvalue = self::parse_single_quoted_string($this->yystack[$this->yyidx + 0]->minor);
+ }
+#line 725 "smarty_internal_configfileparser.php"
+#line 197 "smarty_internal_configfileparser.y"
+ function yy_r14(){
+ $this->_retvalue = self::parse_double_quoted_string($this->yystack[$this->yyidx + 0]->minor);
+ }
+#line 730 "smarty_internal_configfileparser.php"
+#line 201 "smarty_internal_configfileparser.y"
+ function yy_r15(){
+ $this->_retvalue = self::parse_tripple_double_quoted_string($this->yystack[$this->yyidx + -1]->minor);
+ }
+#line 735 "smarty_internal_configfileparser.php"
+#line 205 "smarty_internal_configfileparser.y"
+ function yy_r16(){
+ $this->_retvalue = '';
+ }
+#line 740 "smarty_internal_configfileparser.php"
+#line 209 "smarty_internal_configfileparser.y"
+ function yy_r17(){
+ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;
+ }
+#line 745 "smarty_internal_configfileparser.php"
+
+ private $_retvalue;
+
+ function yy_reduce($yyruleno)
+ {
+ $yymsp = $this->yystack[$this->yyidx];
+ if (self::$yyTraceFILE && $yyruleno >= 0
+ && $yyruleno < count(self::$yyRuleName)) {
+ fprintf(self::$yyTraceFILE, "%sReduce (%d) [%s].\n",
+ self::$yyTracePrompt, $yyruleno,
+ self::$yyRuleName[$yyruleno]);
+ }
+
+ $this->_retvalue = $yy_lefthand_side = null;
+ if (array_key_exists($yyruleno, self::$yyReduceMap)) {
+ // call the action
+ $this->_retvalue = null;
+ $this->{'yy_r' . self::$yyReduceMap[$yyruleno]}();
+ $yy_lefthand_side = $this->_retvalue;
+ }
+ $yygoto = self::$yyRuleInfo[$yyruleno]['lhs'];
+ $yysize = self::$yyRuleInfo[$yyruleno]['rhs'];
+ $this->yyidx -= $yysize;
+ for($i = $yysize; $i; $i--) {
+ // pop all of the right-hand side parameters
+ array_pop($this->yystack);
+ }
+ $yyact = $this->yy_find_reduce_action($this->yystack[$this->yyidx]->stateno, $yygoto);
+ if ($yyact < self::YYNSTATE) {
+ if (!self::$yyTraceFILE && $yysize) {
+ $this->yyidx++;
+ $x = new TPC_yyStackEntry;
+ $x->stateno = $yyact;
+ $x->major = $yygoto;
+ $x->minor = $yy_lefthand_side;
+ $this->yystack[$this->yyidx] = $x;
+ } else {
+ $this->yy_shift($yyact, $yygoto, $yy_lefthand_side);
+ }
+ } elseif ($yyact == self::YYNSTATE + self::YYNRULE + 1) {
+ $this->yy_accept();
+ }
+ }
+
+ function yy_parse_failed()
+ {
+ if (self::$yyTraceFILE) {
+ fprintf(self::$yyTraceFILE, "%sFail!\n", self::$yyTracePrompt);
+ }
+ while ($this->yyidx >= 0) {
+ $this->yy_pop_parser_stack();
+ }
+ }
+
+ function yy_syntax_error($yymajor, $TOKEN)
+ {
+#line 118 "smarty_internal_configfileparser.y"
+
+ $this->internalError = true;
+ $this->yymajor = $yymajor;
+ $this->compiler->trigger_config_file_error();
+#line 808 "smarty_internal_configfileparser.php"
+ }
+
+ function yy_accept()
+ {
+ if (self::$yyTraceFILE) {
+ fprintf(self::$yyTraceFILE, "%sAccept!\n", self::$yyTracePrompt);
+ }
+ while ($this->yyidx >= 0) {
+ $stack = $this->yy_pop_parser_stack();
+ }
+#line 110 "smarty_internal_configfileparser.y"
+
+ $this->successful = !$this->internalError;
+ $this->internalError = false;
+ $this->retvalue = $this->_retvalue;
+ //echo $this->retvalue."\n\n";
+#line 826 "smarty_internal_configfileparser.php"
+ }
+
+ function doParse($yymajor, $yytokenvalue)
+ {
+ $yyerrorhit = 0; /* True if yymajor has invoked an error */
+
+ if ($this->yyidx === null || $this->yyidx < 0) {
+ $this->yyidx = 0;
+ $this->yyerrcnt = -1;
+ $x = new TPC_yyStackEntry;
+ $x->stateno = 0;
+ $x->major = 0;
+ $this->yystack = array();
+ array_push($this->yystack, $x);
+ }
+ $yyendofinput = ($yymajor==0);
+
+ if (self::$yyTraceFILE) {
+ fprintf(self::$yyTraceFILE, "%sInput %s\n",
+ self::$yyTracePrompt, $this->yyTokenName[$yymajor]);
+ }
+
+ do {
+ $yyact = $this->yy_find_shift_action($yymajor);
+ if ($yymajor < self::YYERRORSYMBOL &&
+ !$this->yy_is_expected_token($yymajor)) {
+ // force a syntax error
+ $yyact = self::YY_ERROR_ACTION;
+ }
+ if ($yyact < self::YYNSTATE) {
+ $this->yy_shift($yyact, $yymajor, $yytokenvalue);
+ $this->yyerrcnt--;
+ if ($yyendofinput && $this->yyidx >= 0) {
+ $yymajor = 0;
+ } else {
+ $yymajor = self::YYNOCODE;
+ }
+ } elseif ($yyact < self::YYNSTATE + self::YYNRULE) {
+ $this->yy_reduce($yyact - self::YYNSTATE);
+ } elseif ($yyact == self::YY_ERROR_ACTION) {
+ if (self::$yyTraceFILE) {
+ fprintf(self::$yyTraceFILE, "%sSyntax Error!\n",
+ self::$yyTracePrompt);
+ }
+ if (self::YYERRORSYMBOL) {
+ if ($this->yyerrcnt < 0) {
+ $this->yy_syntax_error($yymajor, $yytokenvalue);
+ }
+ $yymx = $this->yystack[$this->yyidx]->major;
+ if ($yymx == self::YYERRORSYMBOL || $yyerrorhit ){
+ if (self::$yyTraceFILE) {
+ fprintf(self::$yyTraceFILE, "%sDiscard input token %s\n",
+ self::$yyTracePrompt, $this->yyTokenName[$yymajor]);
+ }
+ $this->yy_destructor($yymajor, $yytokenvalue);
+ $yymajor = self::YYNOCODE;
+ } else {
+ while ($this->yyidx >= 0 &&
+ $yymx != self::YYERRORSYMBOL &&
+ ($yyact = $this->yy_find_shift_action(self::YYERRORSYMBOL)) >= self::YYNSTATE
+ ){
+ $this->yy_pop_parser_stack();
+ }
+ if ($this->yyidx < 0 || $yymajor==0) {
+ $this->yy_destructor($yymajor, $yytokenvalue);
+ $this->yy_parse_failed();
+ $yymajor = self::YYNOCODE;
+ } elseif ($yymx != self::YYERRORSYMBOL) {
+ $u2 = 0;
+ $this->yy_shift($yyact, self::YYERRORSYMBOL, $u2);
+ }
+ }
+ $this->yyerrcnt = 3;
+ $yyerrorhit = 1;
+ } else {
+ if ($this->yyerrcnt <= 0) {
+ $this->yy_syntax_error($yymajor, $yytokenvalue);
+ }
+ $this->yyerrcnt = 3;
+ $this->yy_destructor($yymajor, $yytokenvalue);
+ if ($yyendofinput) {
+ $this->yy_parse_failed();
+ }
+ $yymajor = self::YYNOCODE;
+ }
+ } else {
+ $this->yy_accept();
+ $yymajor = self::YYNOCODE;
+ }
+ } while ($yymajor != self::YYNOCODE && $this->yyidx >= 0);
+ }
+}
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_data.php b/include/smarty/libs/sysplugins/smarty_internal_data.php
new file mode 100644
index 000000000..1d7b1d334
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_data.php
@@ -0,0 +1,556 @@
+<?php
+/**
+ * Smarty Internal Plugin Data
+ *
+ * This file contains the basic classes and methodes for template and variable creation
+ *
+ * @package Smarty
+ * @subpackage Template
+ * @author Uwe Tews
+ */
+
+/**
+ * Base class with template and variable methodes
+ *
+ * @package Smarty
+ * @subpackage Template
+ */
+class Smarty_Internal_Data {
+
+ /**
+ * name of class used for templates
+ *
+ * @var string
+ */
+ public $template_class = 'Smarty_Internal_Template';
+ /**
+ * template variables
+ *
+ * @var array
+ */
+ public $tpl_vars = array();
+ /**
+ * parent template (if any)
+ *
+ * @var Smarty_Internal_Template
+ */
+ public $parent = null;
+ /**
+ * configuration settings
+ *
+ * @var array
+ */
+ public $config_vars = array();
+
+ /**
+ * assigns a Smarty variable
+ *
+ * @param array|string $tpl_var the template variable name(s)
+ * @param mixed $value the value to assign
+ * @param boolean $nocache if true any output of this variable will be not cached
+ * @param boolean $scope the scope the variable will have (local,parent or root)
+ * @return Smarty_Internal_Data current Smarty_Internal_Data (or Smarty or Smarty_Internal_Template) instance for chaining
+ */
+ public function assign($tpl_var, $value = null, $nocache = false)
+ {
+ if (is_array($tpl_var)) {
+ foreach ($tpl_var as $_key => $_val) {
+ if ($_key != '') {
+ $this->tpl_vars[$_key] = new Smarty_variable($_val, $nocache);
+ }
+ }
+ } else {
+ if ($tpl_var != '') {
+ $this->tpl_vars[$tpl_var] = new Smarty_variable($value, $nocache);
+ }
+ }
+
+ return $this;
+ }
+
+ /**
+ * assigns a global Smarty variable
+ *
+ * @param string $varname the global variable name
+ * @param mixed $value the value to assign
+ * @param boolean $nocache if true any output of this variable will be not cached
+ * @return Smarty_Internal_Data current Smarty_Internal_Data (or Smarty or Smarty_Internal_Template) instance for chaining
+ */
+ public function assignGlobal($varname, $value = null, $nocache = false)
+ {
+ if ($varname != '') {
+ Smarty::$global_tpl_vars[$varname] = new Smarty_variable($value, $nocache);
+ $ptr = $this;
+ while ($ptr instanceof Smarty_Internal_Template) {
+ $ptr->tpl_vars[$varname] = clone Smarty::$global_tpl_vars[$varname];
+ $ptr = $ptr->parent;
+ }
+ }
+
+ return $this;
+ }
+ /**
+ * assigns values to template variables by reference
+ *
+ * @param string $tpl_var the template variable name
+ * @param mixed $ &$value the referenced value to assign
+ * @param boolean $nocache if true any output of this variable will be not cached
+ * @return Smarty_Internal_Data current Smarty_Internal_Data (or Smarty or Smarty_Internal_Template) instance for chaining
+ */
+ public function assignByRef($tpl_var, &$value, $nocache = false)
+ {
+ if ($tpl_var != '') {
+ $this->tpl_vars[$tpl_var] = new Smarty_variable(null, $nocache);
+ $this->tpl_vars[$tpl_var]->value = &$value;
+ }
+
+ return $this;
+ }
+
+ /**
+ * appends values to template variables
+ *
+ * @param array|string $tpl_var the template variable name(s)
+ * @param mixed $value the value to append
+ * @param boolean $merge flag if array elements shall be merged
+ * @param boolean $nocache if true any output of this variable will be not cached
+ * @return Smarty_Internal_Data current Smarty_Internal_Data (or Smarty or Smarty_Internal_Template) instance for chaining
+ */
+ public function append($tpl_var, $value = null, $merge = false, $nocache = false)
+ {
+ if (is_array($tpl_var)) {
+ // $tpl_var is an array, ignore $value
+ foreach ($tpl_var as $_key => $_val) {
+ if ($_key != '') {
+ if (!isset($this->tpl_vars[$_key])) {
+ $tpl_var_inst = $this->getVariable($_key, null, true, false);
+ if ($tpl_var_inst instanceof Undefined_Smarty_Variable) {
+ $this->tpl_vars[$_key] = new Smarty_variable(null, $nocache);
+ } else {
+ $this->tpl_vars[$_key] = clone $tpl_var_inst;
+ }
+ }
+ if (!(is_array($this->tpl_vars[$_key]->value) || $this->tpl_vars[$_key]->value instanceof ArrayAccess)) {
+ settype($this->tpl_vars[$_key]->value, 'array');
+ }
+ if ($merge && is_array($_val)) {
+ foreach($_val as $_mkey => $_mval) {
+ $this->tpl_vars[$_key]->value[$_mkey] = $_mval;
+ }
+ } else {
+ $this->tpl_vars[$_key]->value[] = $_val;
+ }
+ }
+ }
+ } else {
+ if ($tpl_var != '' && isset($value)) {
+ if (!isset($this->tpl_vars[$tpl_var])) {
+ $tpl_var_inst = $this->getVariable($tpl_var, null, true, false);
+ if ($tpl_var_inst instanceof Undefined_Smarty_Variable) {
+ $this->tpl_vars[$tpl_var] = new Smarty_variable(null, $nocache);
+ } else {
+ $this->tpl_vars[$tpl_var] = clone $tpl_var_inst;
+ }
+ }
+ if (!(is_array($this->tpl_vars[$tpl_var]->value) || $this->tpl_vars[$tpl_var]->value instanceof ArrayAccess)) {
+ settype($this->tpl_vars[$tpl_var]->value, 'array');
+ }
+ if ($merge && is_array($value)) {
+ foreach($value as $_mkey => $_mval) {
+ $this->tpl_vars[$tpl_var]->value[$_mkey] = $_mval;
+ }
+ } else {
+ $this->tpl_vars[$tpl_var]->value[] = $value;
+ }
+ }
+ }
+
+ return $this;
+ }
+
+ /**
+ * appends values to template variables by reference
+ *
+ * @param string $tpl_var the template variable name
+ * @param mixed &$value the referenced value to append
+ * @param boolean $merge flag if array elements shall be merged
+ * @return Smarty_Internal_Data current Smarty_Internal_Data (or Smarty or Smarty_Internal_Template) instance for chaining
+ */
+ public function appendByRef($tpl_var, &$value, $merge = false)
+ {
+ if ($tpl_var != '' && isset($value)) {
+ if (!isset($this->tpl_vars[$tpl_var])) {
+ $this->tpl_vars[$tpl_var] = new Smarty_variable();
+ }
+ if (!is_array($this->tpl_vars[$tpl_var]->value)) {
+ settype($this->tpl_vars[$tpl_var]->value, 'array');
+ }
+ if ($merge && is_array($value)) {
+ foreach($value as $_key => $_val) {
+ $this->tpl_vars[$tpl_var]->value[$_key] = &$value[$_key];
+ }
+ } else {
+ $this->tpl_vars[$tpl_var]->value[] = &$value;
+ }
+ }
+
+ return $this;
+ }
+
+ /**
+ * Returns a single or all template variables
+ *
+ * @param string $varname variable name or null
+ * @param string $_ptr optional pointer to data object
+ * @param boolean $search_parents include parent templates?
+ * @return string variable value or or array of variables
+ */
+ public function getTemplateVars($varname = null, $_ptr = null, $search_parents = true)
+ {
+ if (isset($varname)) {
+ $_var = $this->getVariable($varname, $_ptr, $search_parents, false);
+ if (is_object($_var)) {
+ return $_var->value;
+ } else {
+ return null;
+ }
+ } else {
+ $_result = array();
+ if ($_ptr === null) {
+ $_ptr = $this;
+ } while ($_ptr !== null) {
+ foreach ($_ptr->tpl_vars AS $key => $var) {
+ if (!array_key_exists($key, $_result)) {
+ $_result[$key] = $var->value;
+ }
+ }
+ // not found, try at parent
+ if ($search_parents) {
+ $_ptr = $_ptr->parent;
+ } else {
+ $_ptr = null;
+ }
+ }
+ if ($search_parents && isset(Smarty::$global_tpl_vars)) {
+ foreach (Smarty::$global_tpl_vars AS $key => $var) {
+ if (!array_key_exists($key, $_result)) {
+ $_result[$key] = $var->value;
+ }
+ }
+ }
+ return $_result;
+ }
+ }
+
+ /**
+ * clear the given assigned template variable.
+ *
+ * @param string|array $tpl_var the template variable(s) to clear
+ * @return Smarty_Internal_Data current Smarty_Internal_Data (or Smarty or Smarty_Internal_Template) instance for chaining
+ */
+ public function clearAssign($tpl_var)
+ {
+ if (is_array($tpl_var)) {
+ foreach ($tpl_var as $curr_var) {
+ unset($this->tpl_vars[$curr_var]);
+ }
+ } else {
+ unset($this->tpl_vars[$tpl_var]);
+ }
+
+ return $this;
+ }
+
+ /**
+ * clear all the assigned template variables.
+ * @return Smarty_Internal_Data current Smarty_Internal_Data (or Smarty or Smarty_Internal_Template) instance for chaining
+ */
+ public function clearAllAssign()
+ {
+ $this->tpl_vars = array();
+ return $this;
+ }
+
+ /**
+ * load a config file, optionally load just selected sections
+ *
+ * @param string $config_file filename
+ * @param mixed $sections array of section names, single section or null
+ * @return Smarty_Internal_Data current Smarty_Internal_Data (or Smarty or Smarty_Internal_Template) instance for chaining
+ */
+ public function configLoad($config_file, $sections = null)
+ {
+ // load Config class
+ $config = new Smarty_Internal_Config($config_file, $this->smarty, $this);
+ $config->loadConfigVars($sections);
+ return $this;
+ }
+
+ /**
+ * gets the object of a Smarty variable
+ *
+ * @param string $variable the name of the Smarty variable
+ * @param object $_ptr optional pointer to data object
+ * @param boolean $search_parents search also in parent data
+ * @return object the object of the variable
+ */
+ public function getVariable($variable, $_ptr = null, $search_parents = true, $error_enable = true)
+ {
+ if ($_ptr === null) {
+ $_ptr = $this;
+ } while ($_ptr !== null) {
+ if (isset($_ptr->tpl_vars[$variable])) {
+ // found it, return it
+ return $_ptr->tpl_vars[$variable];
+ }
+ // not found, try at parent
+ if ($search_parents) {
+ $_ptr = $_ptr->parent;
+ } else {
+ $_ptr = null;
+ }
+ }
+ if (isset(Smarty::$global_tpl_vars[$variable])) {
+ // found it, return it
+ return Smarty::$global_tpl_vars[$variable];
+ }
+ if ($this->smarty->error_unassigned && $error_enable) {
+ // force a notice
+ $x = $$variable;
+ }
+ return new Undefined_Smarty_Variable;
+ }
+
+ /**
+ * gets a config variable
+ *
+ * @param string $variable the name of the config variable
+ * @return mixed the value of the config variable
+ */
+ public function getConfigVariable($variable, $error_enable = true)
+ {
+ $_ptr = $this;
+ while ($_ptr !== null) {
+ if (isset($_ptr->config_vars[$variable])) {
+ // found it, return it
+ return $_ptr->config_vars[$variable];
+ }
+ // not found, try at parent
+ $_ptr = $_ptr->parent;
+ }
+ if ($this->smarty->error_unassigned && $error_enable) {
+ // force a notice
+ $x = $$variable;
+ }
+ return null;
+ }
+
+ /**
+ * gets a stream variable
+ *
+ * @param string $variable the stream of the variable
+ * @return mixed the value of the stream variable
+ */
+ public function getStreamVariable($variable)
+ {
+ $_result = '';
+ $fp = fopen($variable, 'r+');
+ if ($fp) {
+ while (!feof($fp) && ($current_line = fgets($fp)) !== false ) {
+ $_result .= $current_line;
+ }
+ fclose($fp);
+ return $_result;
+ }
+
+ if ($this->smarty->error_unassigned) {
+ throw new SmartyException('Undefined stream variable "' . $variable . '"');
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Returns a single or all config variables
+ *
+ * @param string $varname variable name or null
+ * @return string variable value or or array of variables
+ */
+ public function getConfigVars($varname = null, $search_parents = true)
+ {
+ $_ptr = $this;
+ $var_array = array();
+ while ($_ptr !== null) {
+ if (isset($varname)) {
+ if (isset($_ptr->config_vars[$varname])) {
+ return $_ptr->config_vars[$varname];
+ }
+ } else {
+ $var_array = array_merge($_ptr->config_vars, $var_array);
+ }
+ // not found, try at parent
+ if ($search_parents) {
+ $_ptr = $_ptr->parent;
+ } else {
+ $_ptr = null;
+ }
+ }
+ if (isset($varname)) {
+ return '';
+ } else {
+ return $var_array;
+ }
+ }
+
+ /**
+ * Deassigns a single or all config variables
+ *
+ * @param string $varname variable name or null
+ * @return Smarty_Internal_Data current Smarty_Internal_Data (or Smarty or Smarty_Internal_Template) instance for chaining
+ */
+ public function clearConfig($varname = null)
+ {
+ if (isset($varname)) {
+ unset($this->config_vars[$varname]);
+ } else {
+ $this->config_vars = array();
+ }
+ return $this;
+ }
+
+}
+
+/**
+ * class for the Smarty data object
+ *
+ * The Smarty data object will hold Smarty variables in the current scope
+ *
+ * @package Smarty
+ * @subpackage Template
+ */
+class Smarty_Data extends Smarty_Internal_Data {
+
+ /**
+ * Smarty object
+ *
+ * @var Smarty
+ */
+ public $smarty = null;
+
+ /**
+ * create Smarty data object
+ *
+ * @param Smarty|array $_parent parent template
+ * @param Smarty $smarty global smarty instance
+ */
+ public function __construct ($_parent = null, $smarty = null)
+ {
+ $this->smarty = $smarty;
+ if (is_object($_parent)) {
+ // when object set up back pointer
+ $this->parent = $_parent;
+ } elseif (is_array($_parent)) {
+ // set up variable values
+ foreach ($_parent as $_key => $_val) {
+ $this->tpl_vars[$_key] = new Smarty_variable($_val);
+ }
+ } elseif ($_parent != null) {
+ throw new SmartyException("Wrong type for template variables");
+ }
+ }
+
+}
+
+/**
+ * class for the Smarty variable object
+ *
+ * This class defines the Smarty variable object
+ *
+ * @package Smarty
+ * @subpackage Template
+ */
+class Smarty_Variable {
+
+ /**
+ * template variable
+ *
+ * @var mixed
+ */
+ public $value = null;
+ /**
+ * if true any output of this variable will be not cached
+ *
+ * @var boolean
+ */
+ public $nocache = false;
+ /**
+ * the scope the variable will have (local,parent or root)
+ *
+ * @var int
+ */
+ public $scope = Smarty::SCOPE_LOCAL;
+
+ /**
+ * create Smarty variable object
+ *
+ * @param mixed $value the value to assign
+ * @param boolean $nocache if true any output of this variable will be not cached
+ * @param int $scope the scope the variable will have (local,parent or root)
+ */
+ public function __construct($value = null, $nocache = false, $scope = Smarty::SCOPE_LOCAL)
+ {
+ $this->value = $value;
+ $this->nocache = $nocache;
+ $this->scope = $scope;
+ }
+
+ /**
+ * <<magic>> String conversion
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return (string) $this->value;
+ }
+
+}
+
+/**
+ * class for undefined variable object
+ *
+ * This class defines an object for undefined variable handling
+ *
+ * @package Smarty
+ * @subpackage Template
+ */
+class Undefined_Smarty_Variable {
+
+ /**
+ * Returns FALSE for 'nocache' and NULL otherwise.
+ *
+ * @param string $name
+ * @return bool
+ */
+ public function __get($name)
+ {
+ if ($name == 'nocache') {
+ return false;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Always returns an empty string.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return "";
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_debug.php b/include/smarty/libs/sysplugins/smarty_internal_debug.php
new file mode 100644
index 000000000..2aea13f30
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_debug.php
@@ -0,0 +1,206 @@
+<?php
+/**
+ * Smarty Internal Plugin Debug
+ *
+ * Class to collect data for the Smarty Debugging Consol
+ *
+ * @package Smarty
+ * @subpackage Debug
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Debug Class
+ *
+ * @package Smarty
+ * @subpackage Debug
+ */
+class Smarty_Internal_Debug extends Smarty_Internal_Data {
+
+ /**
+ * template data
+ *
+ * @var array
+ */
+ public static $template_data = array();
+
+ /**
+ * Start logging of compile time
+ *
+ * @param object $template
+ */
+ public static function start_compile($template)
+ {
+ $key = self::get_key($template);
+ self::$template_data[$key]['start_time'] = microtime(true);
+ }
+
+ /**
+ * End logging of compile time
+ *
+ * @param object $template
+ */
+ public static function end_compile($template)
+ {
+ $key = self::get_key($template);
+ self::$template_data[$key]['compile_time'] += microtime(true) - self::$template_data[$key]['start_time'];
+ }
+
+ /**
+ * Start logging of render time
+ *
+ * @param object $template
+ */
+ public static function start_render($template)
+ {
+ $key = self::get_key($template);
+ self::$template_data[$key]['start_time'] = microtime(true);
+ }
+
+ /**
+ * End logging of compile time
+ *
+ * @param object $template
+ */
+ public static function end_render($template)
+ {
+ $key = self::get_key($template);
+ self::$template_data[$key]['render_time'] += microtime(true) - self::$template_data[$key]['start_time'];
+ }
+
+ /**
+ * Start logging of cache time
+ *
+ * @param object $template cached template
+ */
+ public static function start_cache($template)
+ {
+ $key = self::get_key($template);
+ self::$template_data[$key]['start_time'] = microtime(true);
+ }
+
+ /**
+ * End logging of cache time
+ *
+ * @param object $template cached template
+ */
+ public static function end_cache($template)
+ {
+ $key = self::get_key($template);
+ self::$template_data[$key]['cache_time'] += microtime(true) - self::$template_data[$key]['start_time'];
+ }
+
+ /**
+ * Opens a window for the Smarty Debugging Consol and display the data
+ *
+ * @param Smarty_Internal_Template|Smarty $obj object to debug
+ */
+ public static function display_debug($obj)
+ {
+ // prepare information of assigned variables
+ $ptr = self::get_debug_vars($obj);
+ if ($obj instanceof Smarty) {
+ $smarty = clone $obj;
+ } else {
+ $smarty = clone $obj->smarty;
+ }
+ $_assigned_vars = $ptr->tpl_vars;
+ ksort($_assigned_vars);
+ $_config_vars = $ptr->config_vars;
+ ksort($_config_vars);
+ $smarty->registered_filters = array();
+ $smarty->autoload_filters = array();
+ $smarty->default_modifiers = array();
+ $smarty->force_compile = false;
+ $smarty->left_delimiter = '{';
+ $smarty->right_delimiter = '}';
+ $smarty->debugging = false;
+ $smarty->force_compile = false;
+ $_template = new Smarty_Internal_Template($smarty->debug_tpl, $smarty);
+ $_template->caching = false;
+ $_template->disableSecurity();
+ $_template->cache_id = null;
+ $_template->compile_id = null;
+ if ($obj instanceof Smarty_Internal_Template) {
+ $_template->assign('template_name', $obj->source->type . ':' . $obj->source->name);
+ }
+ if ($obj instanceof Smarty) {
+ $_template->assign('template_data', self::$template_data);
+ } else {
+ $_template->assign('template_data', null);
+ }
+ $_template->assign('assigned_vars', $_assigned_vars);
+ $_template->assign('config_vars', $_config_vars);
+ $_template->assign('execution_time', microtime(true) - $smarty->start_time);
+ echo $_template->fetch();
+ }
+
+ /**
+ * Recursively gets variables from all template/data scopes
+ *
+ * @param Smarty_Internal_Template|Smarty_Data $obj object to debug
+ * @return StdClass
+ */
+ public static function get_debug_vars($obj)
+ {
+ $config_vars = $obj->config_vars;
+ $tpl_vars = array();
+ foreach ($obj->tpl_vars as $key => $var) {
+ $tpl_vars[$key] = clone $var;
+ if ($obj instanceof Smarty_Internal_Template) {
+ $tpl_vars[$key]->scope = $obj->source->type . ':' . $obj->source->name;
+ } elseif ($obj instanceof Smarty_Data) {
+ $tpl_vars[$key]->scope = 'Data object';
+ } else {
+ $tpl_vars[$key]->scope = 'Smarty root';
+ }
+ }
+
+ if (isset($obj->parent)) {
+ $parent = self::get_debug_vars($obj->parent);
+ $tpl_vars = array_merge($parent->tpl_vars, $tpl_vars);
+ $config_vars = array_merge($parent->config_vars, $config_vars);
+ } else {
+ foreach (Smarty::$global_tpl_vars as $name => $var) {
+ if (!array_key_exists($name, $tpl_vars)) {
+ $clone = clone $var;
+ $clone->scope = 'Global';
+ $tpl_vars[$name] = $clone;
+ }
+ }
+ }
+ return (object) array('tpl_vars' => $tpl_vars, 'config_vars' => $config_vars);
+ }
+
+ /**
+ * Return key into $template_data for template
+ *
+ * @param object $template template object
+ * @return string key into $template_data
+ */
+ private static function get_key($template)
+ {
+ static $_is_stringy = array('string' => true, 'eval' => true);
+ // calculate Uid if not already done
+ if ($template->source->uid == '') {
+ $template->source->filepath;
+ }
+ $key = $template->source->uid;
+ if (isset(self::$template_data[$key])) {
+ return $key;
+ } else {
+ if (isset($_is_stringy[$template->source->type])) {
+ self::$template_data[$key]['name'] = '\''.substr($template->source->name,0,25).'...\'';
+ } else {
+ self::$template_data[$key]['name'] = $template->source->filepath;
+ }
+ self::$template_data[$key]['compile_time'] = 0;
+ self::$template_data[$key]['render_time'] = 0;
+ self::$template_data[$key]['cache_time'] = 0;
+ return $key;
+ }
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_filter_handler.php b/include/smarty/libs/sysplugins/smarty_internal_filter_handler.php
new file mode 100644
index 000000000..c9370e1ac
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_filter_handler.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * Smarty Internal Plugin Filter Handler
+ *
+ * Smarty filter handler class
+ *
+ * @package Smarty
+ * @subpackage PluginsInternal
+ * @author Uwe Tews
+ */
+
+/**
+ * Class for filter processing
+ *
+ * @package Smarty
+ * @subpackage PluginsInternal
+ */
+class Smarty_Internal_Filter_Handler {
+
+ /**
+ * Run filters over content
+ *
+ * The filters will be lazy loaded if required
+ * class name format: Smarty_FilterType_FilterName
+ * plugin filename format: filtertype.filtername.php
+ * Smarty2 filter plugins could be used
+ *
+ * @param string $type the type of filter ('pre','post','output') which shall run
+ * @param string $content the content which shall be processed by the filters
+ * @param Smarty_Internal_Template $template template object
+ * @return string the filtered content
+ */
+ public static function runFilter($type, $content, Smarty_Internal_Template $template)
+ {
+ $output = $content;
+ // loop over autoload filters of specified type
+ if (!empty($template->smarty->autoload_filters[$type])) {
+ foreach ((array)$template->smarty->autoload_filters[$type] as $name) {
+ $plugin_name = "Smarty_{$type}filter_{$name}";
+ if ($template->smarty->loadPlugin($plugin_name)) {
+ if (function_exists($plugin_name)) {
+ // use loaded Smarty2 style plugin
+ $output = $plugin_name($output, $template);
+ } elseif (class_exists($plugin_name, false)) {
+ // loaded class of filter plugin
+ $output = call_user_func(array($plugin_name, 'execute'), $output, $template);
+ }
+ } else {
+ // nothing found, throw exception
+ throw new SmartyException("Unable to load filter {$plugin_name}");
+ }
+ }
+ }
+ // loop over registerd filters of specified type
+ if (!empty($template->smarty->registered_filters[$type])) {
+ foreach ($template->smarty->registered_filters[$type] as $key => $name) {
+ if (is_array($template->smarty->registered_filters[$type][$key])) {
+ $output = call_user_func($template->smarty->registered_filters[$type][$key], $output, $template);
+ } else {
+ $output = $template->smarty->registered_filters[$type][$key]($output, $template);
+ }
+ }
+ }
+ // return filtered output
+ return $output;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_function_call_handler.php b/include/smarty/libs/sysplugins/smarty_internal_function_call_handler.php
new file mode 100644
index 000000000..fa4b43b2a
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_function_call_handler.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Smarty Internal Plugin Function Call Handler
+ *
+ * @package Smarty
+ * @subpackage PluginsInternal
+ * @author Uwe Tews
+ */
+
+/**
+ * This class does call function defined with the {function} tag
+ *
+ * @package Smarty
+ * @subpackage PluginsInternal
+ */
+class Smarty_Internal_Function_Call_Handler {
+
+ /**
+ * This function handles calls to template functions defined by {function}
+ * It does create a PHP function at the first call
+ *
+ * @param string $_name template function name
+ * @param Smarty_Internal_Template $_template template object
+ * @param array $_params Smarty variables passed as call parameter
+ * @param string $_hash nocache hash value
+ * @param bool $_nocache nocache flag
+ */
+ public static function call($_name, Smarty_Internal_Template $_template, $_params, $_hash, $_nocache)
+ {
+ if ($_nocache) {
+ $_function = "smarty_template_function_{$_name}_nocache";
+ } else {
+ $_function = "smarty_template_function_{$_hash}_{$_name}";
+ }
+ if (!is_callable($_function)) {
+ $_code = "function {$_function}(\$_smarty_tpl,\$params) {
+ \$saved_tpl_vars = \$_smarty_tpl->tpl_vars;
+ foreach (\$_smarty_tpl->smarty->template_functions['{$_name}']['parameter'] as \$key => \$value) {\$_smarty_tpl->tpl_vars[\$key] = new Smarty_variable(\$value);};
+ foreach (\$params as \$key => \$value) {\$_smarty_tpl->tpl_vars[\$key] = new Smarty_variable(\$value);}?>";
+ if ($_nocache) {
+ $_code .= preg_replace(array("!<\?php echo \\'/\*%%SmartyNocache:{$_template->smarty->template_functions[$_name]['nocache_hash']}%%\*/|/\*/%%SmartyNocache:{$_template->smarty->template_functions[$_name]['nocache_hash']}%%\*/\\';\?>!",
+ "!\\\'!"), array('', "'"), $_template->smarty->template_functions[$_name]['compiled']);
+ $_template->smarty->template_functions[$_name]['called_nocache'] = true;
+ } else {
+ $_code .= preg_replace("/{$_template->smarty->template_functions[$_name]['nocache_hash']}/", $_template->properties['nocache_hash'], $_template->smarty->template_functions[$_name]['compiled']);
+ }
+ $_code .= "<?php \$_smarty_tpl->tpl_vars = \$saved_tpl_vars;}";
+ eval($_code);
+ }
+ $_function($_template, $_params);
+ }
+
+}
+
+?>
diff --git a/include/smarty/libs/sysplugins/smarty_internal_get_include_path.php b/include/smarty/libs/sysplugins/smarty_internal_get_include_path.php
new file mode 100644
index 000000000..bafb72133
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_get_include_path.php
@@ -0,0 +1,48 @@
+<?php
+/**
+ * Smarty read include path plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsInternal
+ * @author Monte Ohrt
+ */
+
+/**
+ * Smarty Internal Read Include Path Class
+ *
+ * @package Smarty
+ * @subpackage PluginsInternal
+ */
+class Smarty_Internal_Get_Include_Path {
+
+ /**
+ * Return full file path from PHP include_path
+ *
+ * @param string $filepath filepath
+ * @return string|boolean full filepath or false
+ */
+ public static function getIncludePath($filepath)
+ {
+ static $_include_path = null;
+
+ if (function_exists('stream_resolve_include_path')) {
+ // available since PHP 5.3.2
+ return stream_resolve_include_path($filepath);
+ }
+
+ if ($_include_path === null) {
+ $_include_path = explode(PATH_SEPARATOR, get_include_path());
+ }
+
+ foreach ($_include_path as $_path) {
+ if (file_exists($_path . DS . $filepath)) {
+ return $_path . DS . $filepath;
+ }
+ }
+
+ return false;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_nocache_insert.php b/include/smarty/libs/sysplugins/smarty_internal_nocache_insert.php
new file mode 100644
index 000000000..64a2b1e1b
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_nocache_insert.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * Smarty Internal Plugin Nocache Insert
+ *
+ * Compiles the {insert} tag into the cache file
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Insert Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Nocache_Insert {
+
+ /**
+ * Compiles code for the {insert} tag into cache file
+ *
+ * @param string $_function insert function name
+ * @param array $_attr array with parameter
+ * @param Smarty_Internal_Template $_template template object
+ * @param string $_script script name to load or 'null'
+ * @param string $_assign optional variable name
+ * @return string compiled code
+ */
+ public static function compile($_function, $_attr, $_template, $_script, $_assign = null)
+ {
+ $_output = '<?php ';
+ if ($_script != 'null') {
+ // script which must be included
+ // code for script file loading
+ $_output .= "require_once '{$_script}';";
+ }
+ // call insert
+ if (isset($_assign)) {
+ $_output .= "\$_smarty_tpl->assign('{$_assign}' , {$_function} (" . var_export($_attr, true) . ",\$_smarty_tpl), true);?>";
+ } else {
+ $_output .= "echo {$_function}(" . var_export($_attr, true) . ",\$_smarty_tpl);?>";
+ }
+ $_tpl = $_template;
+ while ($_tpl->parent instanceof Smarty_Internal_Template) {
+ $_tpl = $_tpl->parent;
+ }
+ return "/*%%SmartyNocache:{$_tpl->properties['nocache_hash']}%%*/" . $_output . "/*/%%SmartyNocache:{$_tpl->properties['nocache_hash']}%%*/";
+ }
+
+}
+
+?>
diff --git a/include/smarty/libs/sysplugins/smarty_internal_parsetree.php b/include/smarty/libs/sysplugins/smarty_internal_parsetree.php
new file mode 100644
index 000000000..99f4c6566
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_parsetree.php
@@ -0,0 +1,395 @@
+<?php
+/**
+ * Smarty Internal Plugin Templateparser Parsetrees
+ *
+ * These are classes to build parsetrees in the template parser
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Thue Kristensen
+ * @author Uwe Tews
+ */
+
+/**
+ * @package Smarty
+ * @subpackage Compiler
+ * @ignore
+ */
+abstract class _smarty_parsetree {
+
+ /**
+ * Parser object
+ * @var object
+ */
+ public $parser;
+ /**
+ * Buffer content
+ * @var mixed
+ */
+ public $data;
+
+ /**
+ * Return buffer
+ *
+ * @return string buffer content
+ */
+ abstract public function to_smarty_php();
+
+}
+
+/**
+ * A complete smarty tag.
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @ignore
+ */
+class _smarty_tag extends _smarty_parsetree {
+
+ /**
+ * Saved block nesting level
+ * @var int
+ */
+ public $saved_block_nesting;
+
+ /**
+ * Create parse tree buffer for Smarty tag
+ *
+ * @param object $parser parser object
+ * @param string $data content
+ */
+ public function __construct($parser, $data)
+ {
+ $this->parser = $parser;
+ $this->data = $data;
+ $this->saved_block_nesting = $parser->block_nesting_level;
+ }
+
+ /**
+ * Return buffer content
+ *
+ * @return string content
+ */
+ public function to_smarty_php()
+ {
+ return $this->data;
+ }
+
+ /**
+ * Return complied code that loads the evaluated outout of buffer content into a temporary variable
+ *
+ * @return string template code
+ */
+ public function assign_to_var()
+ {
+ $var = sprintf('$_tmp%d', ++$this->parser->prefix_number);
+ $this->parser->compiler->prefix_code[] = sprintf('<?php ob_start();?>%s<?php %s=ob_get_clean();?>', $this->data, $var);
+ return $var;
+ }
+
+}
+
+/**
+ * Code fragment inside a tag.
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @ignore
+ */
+class _smarty_code extends _smarty_parsetree {
+
+
+ /**
+ * Create parse tree buffer for code fragment
+ *
+ * @param object $parser parser object
+ * @param string $data content
+ */
+ public function __construct($parser, $data)
+ {
+ $this->parser = $parser;
+ $this->data = $data;
+ }
+
+ /**
+ * Return buffer content in parentheses
+ *
+ * @return string content
+ */
+ public function to_smarty_php()
+ {
+ return sprintf("(%s)", $this->data);
+ }
+
+}
+
+/**
+ * Double quoted string inside a tag.
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @ignore
+ */
+class _smarty_doublequoted extends _smarty_parsetree {
+
+ /**
+ * Create parse tree buffer for double quoted string subtrees
+ *
+ * @param object $parser parser object
+ * @param _smarty_parsetree $subtree parsetree buffer
+ */
+ public function __construct($parser, _smarty_parsetree $subtree)
+ {
+ $this->parser = $parser;
+ $this->subtrees[] = $subtree;
+ if ($subtree instanceof _smarty_tag) {
+ $this->parser->block_nesting_level = count($this->parser->compiler->_tag_stack);
+ }
+ }
+
+ /**
+ * Append buffer to subtree
+ *
+ * @param _smarty_parsetree $subtree parsetree buffer
+ */
+ public function append_subtree(_smarty_parsetree $subtree)
+ {
+ $last_subtree = count($this->subtrees) - 1;
+ if ($last_subtree >= 0 && $this->subtrees[$last_subtree] instanceof _smarty_tag && $this->subtrees[$last_subtree]->saved_block_nesting < $this->parser->block_nesting_level) {
+ if ($subtree instanceof _smarty_code) {
+ $this->subtrees[$last_subtree]->data .= '<?php echo ' . $subtree->data . ';?>';
+ } elseif ($subtree instanceof _smarty_dq_content) {
+ $this->subtrees[$last_subtree]->data .= '<?php echo "' . $subtree->data . '";?>';
+ } else {
+ $this->subtrees[$last_subtree]->data .= $subtree->data;
+ }
+ } else {
+ $this->subtrees[] = $subtree;
+ }
+ if ($subtree instanceof _smarty_tag) {
+ $this->parser->block_nesting_level = count($this->parser->compiler->_tag_stack);
+ }
+ }
+
+ /**
+ * Merge subtree buffer content together
+ *
+ * @return string compiled template code
+ */
+ public function to_smarty_php()
+ {
+ $code = '';
+ foreach ($this->subtrees as $subtree) {
+ if ($code !== "") {
+ $code .= ".";
+ }
+ if ($subtree instanceof _smarty_tag) {
+ $more_php = $subtree->assign_to_var();
+ } else {
+ $more_php = $subtree->to_smarty_php();
+ }
+
+ $code .= $more_php;
+
+ if (!$subtree instanceof _smarty_dq_content) {
+ $this->parser->compiler->has_variable_string = true;
+ }
+ }
+ return $code;
+ }
+
+}
+
+/**
+ * Raw chars as part of a double quoted string.
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @ignore
+ */
+class _smarty_dq_content extends _smarty_parsetree {
+
+
+ /**
+ * Create parse tree buffer with string content
+ *
+ * @param object $parser parser object
+ * @param string $data string section
+ */
+ public function __construct($parser, $data)
+ {
+ $this->parser = $parser;
+ $this->data = $data;
+ }
+
+ /**
+ * Return content as double quoted string
+ *
+ * @return string doubled quoted string
+ */
+ public function to_smarty_php()
+ {
+ return '"' . $this->data . '"';
+ }
+
+}
+
+/**
+ * Template element
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @ignore
+ */
+class _smarty_template_buffer extends _smarty_parsetree {
+
+ /**
+ * Array of template elements
+ *
+ * @var array
+ */
+ public $subtrees = Array();
+
+ /**
+ * Create root of parse tree for template elements
+ *
+ * @param object $parser parse object
+ */
+ public function __construct($parser)
+ {
+ $this->parser = $parser;
+ }
+
+ /**
+ * Append buffer to subtree
+ *
+ * @param _smarty_parsetree $subtree
+ */
+ public function append_subtree(_smarty_parsetree $subtree)
+ {
+ $this->subtrees[] = $subtree;
+ }
+
+ /**
+ * Sanitize and merge subtree buffers together
+ *
+ * @return string template code content
+ */
+ public function to_smarty_php()
+ {
+ $code = '';
+ for ($key = 0, $cnt = count($this->subtrees); $key < $cnt; $key++) {
+ if ($key + 2 < $cnt) {
+ if ($this->subtrees[$key] instanceof _smarty_linebreak && $this->subtrees[$key + 1] instanceof _smarty_tag && $this->subtrees[$key + 1]->data == '' && $this->subtrees[$key + 2] instanceof _smarty_linebreak) {
+ $key = $key + 1;
+ continue;
+ }
+ if (substr($this->subtrees[$key]->data, -1) == '<' && $this->subtrees[$key + 1]->data == '' && substr($this->subtrees[$key + 2]->data, -1) == '?') {
+ $key = $key + 2;
+ continue;
+ }
+ }
+ if (substr($code, -1) == '<') {
+ $subtree = $this->subtrees[$key]->to_smarty_php();
+ if (substr($subtree, 0, 1) == '?') {
+ $code = substr($code, 0, strlen($code) - 1) . '<<?php ?>?' . substr($subtree, 1);
+ } elseif ($this->parser->asp_tags && substr($subtree, 0, 1) == '%') {
+ $code = substr($code, 0, strlen($code) - 1) . '<<?php ?>%' . substr($subtree, 1);
+ } else {
+ $code .= $subtree;
+ }
+ continue;
+ }
+ if ($this->parser->asp_tags && substr($code, -1) == '%') {
+ $subtree = $this->subtrees[$key]->to_smarty_php();
+ if (substr($subtree, 0, 1) == '>') {
+ $code = substr($code, 0, strlen($code) - 1) . '%<?php ?>>' . substr($subtree, 1);
+ } else {
+ $code .= $subtree;
+ }
+ continue;
+ }
+ if (substr($code, -1) == '?') {
+ $subtree = $this->subtrees[$key]->to_smarty_php();
+ if (substr($subtree, 0, 1) == '>') {
+ $code = substr($code, 0, strlen($code) - 1) . '?<?php ?>>' . substr($subtree, 1);
+ } else {
+ $code .= $subtree;
+ }
+ continue;
+ }
+ $code .= $this->subtrees[$key]->to_smarty_php();
+ }
+ return $code;
+ }
+
+}
+
+/**
+ * template text
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @ignore
+ */
+class _smarty_text extends _smarty_parsetree {
+
+
+ /**
+ * Create template text buffer
+ *
+ * @param object $parser parser object
+ * @param string $data text
+ */
+ public function __construct($parser, $data)
+ {
+ $this->parser = $parser;
+ $this->data = $data;
+ }
+
+ /**
+ * Return buffer content
+ *
+ * @return strint text
+ */
+ public function to_smarty_php()
+ {
+ return $this->data;
+ }
+
+}
+
+/**
+ * template linebreaks
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @ignore
+ */
+class _smarty_linebreak extends _smarty_parsetree {
+
+ /**
+ * Create buffer with linebreak content
+ *
+ * @param object $parser parser object
+ * @param string $data linebreak string
+ */
+ public function __construct($parser, $data)
+ {
+ $this->parser = $parser;
+ $this->data = $data;
+ }
+
+ /**
+ * Return linebrak
+ *
+ * @return string linebreak
+ */
+ public function to_smarty_php()
+ {
+ return $this->data;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_resource_eval.php b/include/smarty/libs/sysplugins/smarty_internal_resource_eval.php
new file mode 100644
index 000000000..c025dc26d
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_resource_eval.php
@@ -0,0 +1,94 @@
+<?php
+/**
+ * Smarty Internal Plugin Resource Eval
+ *
+ * @package Smarty
+ * @subpackage TemplateResources
+ * @author Uwe Tews
+ * @author Rodney Rehm
+ */
+
+/**
+ * Smarty Internal Plugin Resource Eval
+ *
+ * Implements the strings as resource for Smarty template
+ *
+ * {@internal unlike string-resources the compiled state of eval-resources is NOT saved for subsequent access}}
+ *
+ * @package Smarty
+ * @subpackage TemplateResources
+ */
+class Smarty_Internal_Resource_Eval extends Smarty_Resource_Recompiled {
+
+ /**
+ * populate Source Object with meta data from Resource
+ *
+ * @param Smarty_Template_Source $source source object
+ * @param Smarty_Internal_Template $_template template object
+ * @return void
+ */
+ public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template=null)
+ {
+ $source->uid = $source->filepath = sha1($source->name);
+ $source->timestamp = false;
+ $source->exists = true;
+ }
+
+ /**
+ * Load template's source from $resource_name into current template object
+ *
+ * @uses decode() to decode base64 and urlencoded template_resources
+ * @param Smarty_Template_Source $source source object
+ * @return string template source
+ */
+ public function getContent(Smarty_Template_Source $source)
+ {
+ return $this->decode($source->name);
+ }
+
+ /**
+ * decode base64 and urlencode
+ *
+ * @param string $string template_resource to decode
+ * @return string decoded template_resource
+ */
+ protected function decode($string)
+ {
+ // decode if specified
+ if (($pos = strpos($string, ':')) !== false) {
+ if (!strncmp($string, 'base64', 6)) {
+ return base64_decode(substr($string, 7));
+ } elseif (!strncmp($string, 'urlencode', 9)) {
+ return urldecode(substr($string, 10));
+ }
+ }
+
+ return $string;
+ }
+
+ /**
+ * modify resource_name according to resource handlers specifications
+ *
+ * @param Smarty $smarty Smarty instance
+ * @param string $resource_name resource_name to make unique
+ * @return string unique resource name
+ */
+ protected function buildUniqueResourceName(Smarty $smarty, $resource_name)
+ {
+ return get_class($this) . '#' .$this->decode($resource_name);
+ }
+
+ /**
+ * Determine basename for compiled filename
+ *
+ * @param Smarty_Template_Source $source source object
+ * @return string resource's basename
+ */
+ protected function getBasename(Smarty_Template_Source $source)
+ {
+ return '';
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_resource_extends.php b/include/smarty/libs/sysplugins/smarty_internal_resource_extends.php
new file mode 100644
index 000000000..29734ae05
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_resource_extends.php
@@ -0,0 +1,162 @@
+<?php
+/**
+* Smarty Internal Plugin Resource Extends
+*
+* @package Smarty
+* @subpackage TemplateResources
+* @author Uwe Tews
+* @author Rodney Rehm
+*/
+
+/**
+* Smarty Internal Plugin Resource Extends
+*
+* Implements the file system as resource for Smarty which {extend}s a chain of template files templates
+*
+* @package Smarty
+* @subpackage TemplateResources
+*/
+class Smarty_Internal_Resource_Extends extends Smarty_Resource {
+
+ /**
+ * mbstring.overload flag
+ *
+ * @var int
+ */
+ public $mbstring_overload = 0;
+
+ /**
+ * populate Source Object with meta data from Resource
+ *
+ * @param Smarty_Template_Source $source source object
+ * @param Smarty_Internal_Template $_template template object
+ */
+ public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template=null)
+ {
+ $uid = '';
+ $sources = array();
+ $components = explode('|', $source->name);
+ $exists = true;
+ foreach ($components as $component) {
+ $s = Smarty_Resource::source(null, $source->smarty, $component);
+ if ($s->type == 'php') {
+ throw new SmartyException("Resource type {$s->type} cannot be used with the extends resource type");
+ }
+ $sources[$s->uid] = $s;
+ $uid .= $s->filepath;
+ if ($_template && $_template->smarty->compile_check) {
+ $exists = $exists && $s->exists;
+ }
+ }
+ $source->components = $sources;
+ $source->filepath = $s->filepath;
+ $source->uid = sha1($uid);
+ if ($_template && $_template->smarty->compile_check) {
+ $source->timestamp = $s->timestamp;
+ $source->exists = $exists;
+ }
+ // need the template at getContent()
+ $source->template = $_template;
+ }
+
+ /**
+ * populate Source Object with timestamp and exists from Resource
+ *
+ * @param Smarty_Template_Source $source source object
+ */
+ public function populateTimestamp(Smarty_Template_Source $source)
+ {
+ $source->exists = true;
+ foreach ($source->components as $s) {
+ $source->exists = $source->exists && $s->exists;
+ }
+ $source->timestamp = $s->timestamp;
+ }
+
+ /**
+ * Load template's source from files into current template object
+ *
+ * @param Smarty_Template_Source $source source object
+ * @return string template source
+ * @throws SmartyException if source cannot be loaded
+ */
+ public function getContent(Smarty_Template_Source $source)
+ {
+ if (!$source->exists) {
+ throw new SmartyException("Unable to read template {$source->type} '{$source->name}'");
+ }
+
+ $this->mbstring_overload = ini_get('mbstring.func_overload') & 2;
+ $_rdl = preg_quote($source->smarty->right_delimiter);
+ $_ldl = preg_quote($source->smarty->left_delimiter);
+ if (!$source->smarty->auto_literal) {
+ $al = '\s*';
+ } else {
+ $al = '';
+ }
+ $_components = array_reverse($source->components);
+ $_first = reset($_components);
+ $_last = end($_components);
+
+ foreach ($_components as $_component) {
+ // register dependency
+ if ($_component != $_first) {
+ $source->template->properties['file_dependency'][$_component->uid] = array($_component->filepath, $_component->timestamp, $_component->type);
+ }
+
+ // read content
+ $source->filepath = $_component->filepath;
+ $_content = $_component->content;
+
+ // extend sources
+ if ($_component != $_last) {
+ if (preg_match_all("!({$_ldl}{$al}block\s(.+?)\s*{$_rdl})!", $_content, $_open) !=
+ preg_match_all("!({$_ldl}{$al}/block\s*{$_rdl})!", $_content, $_close)) {
+ throw new SmartyException("unmatched {block} {/block} pairs in template {$_component->type} '{$_component->name}'");
+ }
+ preg_match_all("!{$_ldl}{$al}block\s(.+?)\s*{$_rdl}|{$_ldl}{$al}/block\s*{$_rdl}|{$_ldl}\*([\S\s]*?)\*{$_rdl}!", $_content, $_result, PREG_OFFSET_CAPTURE);
+ $_result_count = count($_result[0]);
+ $_start = 0;
+ while ($_start+1 < $_result_count) {
+ $_end = 0;
+ $_level = 1;
+ if (($this->mbstring_overload ? mb_substr($_result[0][$_start][0],0,mb_strlen($source->smarty->left_delimiter,'latin1')+1, 'latin1') : substr($_result[0][$_start][0],0,strlen($source->smarty->left_delimiter)+1)) == $source->smarty->left_delimiter.'*') {
+ $_start++;
+ continue;
+ }
+ while ($_level != 0) {
+ $_end++;
+ if (($this->mbstring_overload ? mb_substr($_result[0][$_start + $_end][0],0,mb_strlen($source->smarty->left_delimiter,'latin1')+1, 'latin1') : substr($_result[0][$_start + $_end][0],0,strlen($source->smarty->left_delimiter)+1)) == $source->smarty->left_delimiter.'*') {
+ continue;
+ }
+ if (!strpos($_result[0][$_start + $_end][0], '/')) {
+ $_level++;
+ } else {
+ $_level--;
+ }
+ }
+ $_block_content = str_replace($source->smarty->left_delimiter . '$smarty.block.parent' . $source->smarty->right_delimiter, '%%%%SMARTY_PARENT%%%%',
+ ($this->mbstring_overload ? mb_substr($_content, $_result[0][$_start][1] + mb_strlen($_result[0][$_start][0], 'latin1'), $_result[0][$_start + $_end][1] - $_result[0][$_start][1] - + mb_strlen($_result[0][$_start][0], 'latin1'), 'latin1') : substr($_content, $_result[0][$_start][1] + strlen($_result[0][$_start][0]), $_result[0][$_start + $_end][1] - $_result[0][$_start][1] - + strlen($_result[0][$_start][0]))));
+ Smarty_Internal_Compile_Block::saveBlockData($_block_content, $_result[0][$_start][0], $source->template, $_component->filepath);
+ $_start = $_start + $_end + 1;
+ }
+ } else {
+ return $_content;
+ }
+ }
+ }
+
+ /**
+ * Determine basename for compiled filename
+ *
+ * @param Smarty_Template_Source $source source object
+ * @return string resource's basename
+ */
+ public function getBasename(Smarty_Template_Source $source)
+ {
+ return str_replace(':', '.', basename($source->filepath));
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_resource_file.php b/include/smarty/libs/sysplugins/smarty_internal_resource_file.php
new file mode 100644
index 000000000..48b391d20
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_resource_file.php
@@ -0,0 +1,90 @@
+<?php
+/**
+ * Smarty Internal Plugin Resource File
+ *
+ * @package Smarty
+ * @subpackage TemplateResources
+ * @author Uwe Tews
+ * @author Rodney Rehm
+ */
+
+/**
+ * Smarty Internal Plugin Resource File
+ *
+ * Implements the file system as resource for Smarty templates
+ *
+ * @package Smarty
+ * @subpackage TemplateResources
+ */
+class Smarty_Internal_Resource_File extends Smarty_Resource {
+
+ /**
+ * populate Source Object with meta data from Resource
+ *
+ * @param Smarty_Template_Source $source source object
+ * @param Smarty_Internal_Template $_template template object
+ */
+ public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template=null)
+ {
+ $source->filepath = $this->buildFilepath($source, $_template);
+
+ if ($source->filepath !== false) {
+ if (is_object($source->smarty->security_policy)) {
+ $source->smarty->security_policy->isTrustedResourceDir($source->filepath);
+ }
+
+ $source->uid = sha1($source->filepath);
+ if ($source->smarty->compile_check && !isset($source->timestamp)) {
+ $source->timestamp = @filemtime($source->filepath);
+ $source->exists = !!$source->timestamp;
+ }
+ }
+ }
+
+ /**
+ * populate Source Object with timestamp and exists from Resource
+ *
+ * @param Smarty_Template_Source $source source object
+ */
+ public function populateTimestamp(Smarty_Template_Source $source)
+ {
+ $source->timestamp = @filemtime($source->filepath);
+ $source->exists = !!$source->timestamp;
+ }
+
+ /**
+ * Load template's source from file into current template object
+ *
+ * @param Smarty_Template_Source $source source object
+ * @return string template source
+ * @throws SmartyException if source cannot be loaded
+ */
+ public function getContent(Smarty_Template_Source $source)
+ {
+ if ($source->timestamp) {
+ return file_get_contents($source->filepath);
+ }
+ if ($source instanceof Smarty_Config_Source) {
+ throw new SmartyException("Unable to read config {$source->type} '{$source->name}'");
+ }
+ throw new SmartyException("Unable to read template {$source->type} '{$source->name}'");
+ }
+
+ /**
+ * Determine basename for compiled filename
+ *
+ * @param Smarty_Template_Source $source source object
+ * @return string resource's basename
+ */
+ public function getBasename(Smarty_Template_Source $source)
+ {
+ $_file = $source->name;
+ if (($_pos = strpos($_file, ']')) !== false) {
+ $_file = substr($_file, $_pos + 1);
+ }
+ return basename($_file);
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_resource_php.php b/include/smarty/libs/sysplugins/smarty_internal_resource_php.php
new file mode 100644
index 000000000..7cd8baeec
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_resource_php.php
@@ -0,0 +1,114 @@
+<?php
+
+/**
+ * Smarty Internal Plugin Resource PHP
+ *
+ * Implements the file system as resource for PHP templates
+ *
+ * @package Smarty
+ * @subpackage TemplateResources
+ * @author Uwe Tews
+ * @author Rodney Rehm
+ */
+class Smarty_Internal_Resource_PHP extends Smarty_Resource_Uncompiled {
+ /**
+ * container for short_open_tag directive's value before executing PHP templates
+ * @var string
+ */
+ protected $short_open_tag;
+
+ /**
+ * Create a new PHP Resource
+ *
+ */
+ public function __construct()
+ {
+ $this->short_open_tag = ini_get( 'short_open_tag' );
+ }
+
+ /**
+ * populate Source Object with meta data from Resource
+ *
+ * @param Smarty_Template_Source $source source object
+ * @param Smarty_Internal_Template $_template template object
+ * @return void
+ */
+ public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template=null)
+ {
+ $source->filepath = $this->buildFilepath($source, $_template);
+
+ if ($source->filepath !== false) {
+ if (is_object($source->smarty->security_policy)) {
+ $source->smarty->security_policy->isTrustedResourceDir($source->filepath);
+ }
+
+ $source->uid = sha1($source->filepath);
+ if ($source->smarty->compile_check) {
+ $source->timestamp = @filemtime($source->filepath);
+ $source->exists = !!$source->timestamp;
+ }
+ }
+ }
+
+ /**
+ * populate Source Object with timestamp and exists from Resource
+ *
+ * @param Smarty_Template_Source $source source object
+ * @return void
+ */
+ public function populateTimestamp(Smarty_Template_Source $source)
+ {
+ $source->timestamp = @filemtime($source->filepath);
+ $source->exists = !!$source->timestamp;
+ }
+
+ /**
+ * Load template's source from file into current template object
+ *
+ * @param Smarty_Template_Source $source source object
+ * @return string template source
+ * @throws SmartyException if source cannot be loaded
+ */
+ public function getContent(Smarty_Template_Source $source)
+ {
+ if ($source->timestamp) {
+ return '';
+ }
+ throw new SmartyException("Unable to read template {$source->type} '{$source->name}'");
+ }
+
+ /**
+ * Render and output the template (without using the compiler)
+ *
+ * @param Smarty_Template_Source $source source object
+ * @param Smarty_Internal_Template $_template template object
+ * @return void
+ * @throws SmartyException if template cannot be loaded or allow_php_templates is disabled
+ */
+ public function renderUncompiled(Smarty_Template_Source $source, Smarty_Internal_Template $_template)
+ {
+ $_smarty_template = $_template;
+
+ if (!$source->smarty->allow_php_templates) {
+ throw new SmartyException("PHP templates are disabled");
+ }
+ if (!$source->exists) {
+ if ($_template->parent instanceof Smarty_Internal_Template) {
+ $parent_resource = " in '{$_template->parent->template_resource}'";
+ } else {
+ $parent_resource = '';
+ }
+ throw new SmartyException("Unable to load template {$source->type} '{$source->name}'{$parent_resource}");
+ }
+
+ // prepare variables
+ extract($_template->getTemplateVars());
+
+ // include PHP template with short open tags enabled
+ ini_set( 'short_open_tag', '1' );
+ include($source->filepath);
+ ini_set( 'short_open_tag', $this->short_open_tag );
+ }
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_resource_registered.php b/include/smarty/libs/sysplugins/smarty_internal_resource_registered.php
new file mode 100644
index 000000000..44497b922
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_resource_registered.php
@@ -0,0 +1,95 @@
+<?php
+/**
+ * Smarty Internal Plugin Resource Registered
+ *
+ * @package Smarty
+ * @subpackage TemplateResources
+ * @author Uwe Tews
+ * @author Rodney Rehm
+ */
+
+/**
+ * Smarty Internal Plugin Resource Registered
+ *
+ * Implements the registered resource for Smarty template
+ *
+ * @package Smarty
+ * @subpackage TemplateResources
+ * @deprecated
+ */
+class Smarty_Internal_Resource_Registered extends Smarty_Resource {
+
+ /**
+ * populate Source Object with meta data from Resource
+ *
+ * @param Smarty_Template_Source $source source object
+ * @param Smarty_Internal_Template $_template template object
+ * @return void
+ */
+ public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template=null)
+ {
+ $source->filepath = $source->type . ':' . $source->name;
+ $source->uid = sha1($source->filepath);
+ if ($source->smarty->compile_check) {
+ $source->timestamp = $this->getTemplateTimestamp($source);
+ $source->exists = !!$source->timestamp;
+ }
+ }
+
+ /**
+ * populate Source Object with timestamp and exists from Resource
+ *
+ * @param Smarty_Template_Source $source source object
+ * @return void
+ */
+ public function populateTimestamp(Smarty_Template_Source $source)
+ {
+ $source->timestamp = $this->getTemplateTimestamp($source);
+ $source->exists = !!$source->timestamp;
+ }
+
+ /**
+ * Get timestamp (epoch) the template source was modified
+ *
+ * @param Smarty_Template_Source $source source object
+ * @return integer|boolean timestamp (epoch) the template was modified, false if resources has no timestamp
+ */
+ public function getTemplateTimestamp(Smarty_Template_Source $source)
+ {
+ // return timestamp
+ $time_stamp = false;
+ call_user_func_array($source->smarty->registered_resources[$source->type][0][1], array($source->name, &$time_stamp, $source->smarty));
+ return is_numeric($time_stamp) ? (int) $time_stamp : $time_stamp;
+ }
+
+ /**
+ * Load template's source by invoking the registered callback into current template object
+ *
+ * @param Smarty_Template_Source $source source object
+ * @return string template source
+ * @throws SmartyException if source cannot be loaded
+ */
+ public function getContent(Smarty_Template_Source $source)
+ {
+ // return template string
+ $t = call_user_func_array($source->smarty->registered_resources[$source->type][0][0], array($source->name, &$source->content, $source->smarty));
+ if (is_bool($t) && !$t) {
+ throw new SmartyException("Unable to read template {$source->type} '{$source->name}'");
+ }
+ return $source->content;
+ }
+
+ /**
+ * Determine basename for compiled filename
+ *
+ * @param Smarty_Template_Source $source source object
+ * @return string resource's basename
+ */
+ protected function getBasename(Smarty_Template_Source $source)
+ {
+ return basename($source->name);
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_resource_stream.php b/include/smarty/libs/sysplugins/smarty_internal_resource_stream.php
new file mode 100644
index 000000000..58086c179
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_resource_stream.php
@@ -0,0 +1,78 @@
+<?php
+/**
+* Smarty Internal Plugin Resource Stream
+*
+* Implements the streams as resource for Smarty template
+*
+* @package Smarty
+* @subpackage TemplateResources
+* @author Uwe Tews
+* @author Rodney Rehm
+*/
+
+/**
+* Smarty Internal Plugin Resource Stream
+*
+* Implements the streams as resource for Smarty template
+*
+* @link http://php.net/streams
+* @package Smarty
+* @subpackage TemplateResources
+*/
+class Smarty_Internal_Resource_Stream extends Smarty_Resource_Recompiled {
+
+ /**
+ * populate Source Object with meta data from Resource
+ *
+ * @param Smarty_Template_Source $source source object
+ * @param Smarty_Internal_Template $_template template object
+ * @return void
+ */
+ public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template=null)
+ {
+ if(strpos($source->resource, '://') !== false) {
+ $source->filepath = $source->resource;
+ } else {
+ $source->filepath = str_replace(':', '://', $source->resource);
+ }
+ $source->uid = false;
+ $source->content = $this->getContent($source);
+ $source->timestamp = false;
+ $source->exists = !!$source->content;
+ }
+
+ /**
+ * Load template's source from stream into current template object
+ *
+ * @param Smarty_Template_Source $source source object
+ * @return string template source
+ * @throws SmartyException if source cannot be loaded
+ */
+ public function getContent(Smarty_Template_Source $source)
+ {
+ $t = '';
+ // the availability of the stream has already been checked in Smarty_Resource::fetch()
+ $fp = fopen($source->filepath, 'r+');
+ if ($fp) {
+ while (!feof($fp) && ($current_line = fgets($fp)) !== false) {
+ $t .= $current_line;
+ }
+ fclose($fp);
+ return $t;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * modify resource_name according to resource handlers specifications
+ *
+ * @param Smarty $smarty Smarty instance
+ * @param string $resource_name resource_name to make unique
+ * @return string unique resource name
+ */
+ protected function buildUniqueResourceName(Smarty $smarty, $resource_name)
+ {
+ return get_class($this) . '#' . $resource_name;
+ }
+}
diff --git a/include/smarty/libs/sysplugins/smarty_internal_resource_string.php b/include/smarty/libs/sysplugins/smarty_internal_resource_string.php
new file mode 100644
index 000000000..9571337b0
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_resource_string.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * Smarty Internal Plugin Resource String
+ *
+ * @package Smarty
+ * @subpackage TemplateResources
+ * @author Uwe Tews
+ * @author Rodney Rehm
+ */
+
+/**
+ * Smarty Internal Plugin Resource String
+ *
+ * Implements the strings as resource for Smarty template
+ *
+ * {@internal unlike eval-resources the compiled state of string-resources is saved for subsequent access}}
+ *
+ * @package Smarty
+ * @subpackage TemplateResources
+ */
+class Smarty_Internal_Resource_String extends Smarty_Resource {
+
+ /**
+ * populate Source Object with meta data from Resource
+ *
+ * @param Smarty_Template_Source $source source object
+ * @param Smarty_Internal_Template $_template template object
+ * @return void
+ */
+ public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template=null)
+ {
+ $source->uid = $source->filepath = sha1($source->name);
+ $source->timestamp = 0;
+ $source->exists = true;
+ }
+
+ /**
+ * Load template's source from $resource_name into current template object
+ *
+ * @uses decode() to decode base64 and urlencoded template_resources
+ * @param Smarty_Template_Source $source source object
+ * @return string template source
+ */
+ public function getContent(Smarty_Template_Source $source)
+ {
+ return $this->decode($source->name);
+ }
+
+ /**
+ * decode base64 and urlencode
+ *
+ * @param string $string template_resource to decode
+ * @return string decoded template_resource
+ */
+ protected function decode($string)
+ {
+ // decode if specified
+ if (($pos = strpos($string, ':')) !== false) {
+ if (!strncmp($string, 'base64', 6)) {
+ return base64_decode(substr($string, 7));
+ } elseif (!strncmp($string, 'urlencode', 9)) {
+ return urldecode(substr($string, 10));
+ }
+ }
+
+ return $string;
+ }
+
+ /**
+ * modify resource_name according to resource handlers specifications
+ *
+ * @param Smarty $smarty Smarty instance
+ * @param string $resource_name resource_name to make unique
+ * @return string unique resource name
+ */
+ protected function buildUniqueResourceName(Smarty $smarty, $resource_name)
+ {
+ return get_class($this) . '#' .$this->decode($resource_name);
+ }
+
+ /**
+ * Determine basename for compiled filename
+ *
+ * Always returns an empty string.
+ *
+ * @param Smarty_Template_Source $source source object
+ * @return string resource's basename
+ */
+ protected function getBasename(Smarty_Template_Source $source)
+ {
+ return '';
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php b/include/smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php
new file mode 100644
index 000000000..1ec1aa430
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php
@@ -0,0 +1,127 @@
+<?php
+/**
+ * Smarty Internal Plugin Smarty Template Compiler Base
+ *
+ * This file contains the basic classes and methodes for compiling Smarty templates with lexer/parser
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * @ignore
+ */
+include ("smarty_internal_parsetree.php");
+
+/**
+ * Class SmartyTemplateCompiler
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_SmartyTemplateCompiler extends Smarty_Internal_TemplateCompilerBase {
+
+ /**
+ * Lexer class name
+ *
+ * @var string
+ */
+ public $lexer_class;
+
+ /**
+ * Parser class name
+ *
+ * @var string
+ */
+ public $parser_class;
+
+ /**
+ * Lexer object
+ *
+ * @var object
+ */
+ public $lex;
+
+ /**
+ * Parser object
+ *
+ * @var object
+ */
+ public $parser;
+
+ /**
+ * Smarty object
+ *
+ * @var object
+ */
+ public $smarty;
+
+ /**
+ * array of vars which can be compiled in local scope
+ *
+ * @var array
+ */
+ public $local_var = array();
+
+ /**
+ * Initialize compiler
+ *
+ * @param string $lexer_class class name
+ * @param string $parser_class class name
+ * @param Smarty $smarty global instance
+ */
+ public function __construct($lexer_class, $parser_class, $smarty)
+ {
+ $this->smarty = $smarty;
+ parent::__construct();
+ // get required plugins
+ $this->lexer_class = $lexer_class;
+ $this->parser_class = $parser_class;
+ }
+
+ /**
+ * Methode to compile a Smarty template
+ *
+ * @param mixed $_content template source
+ * @return bool true if compiling succeeded, false if it failed
+ */
+ protected function doCompile($_content)
+ {
+ /* here is where the compiling takes place. Smarty
+ tags in the templates are replaces with PHP code,
+ then written to compiled files. */
+ // init the lexer/parser to compile the template
+ $this->lex = new $this->lexer_class($_content, $this);
+ $this->parser = new $this->parser_class($this->lex, $this);
+ if ($this->smarty->_parserdebug)
+ $this->parser->PrintTrace();
+ // get tokens from lexer and parse them
+ while ($this->lex->yylex() && !$this->abort_and_recompile) {
+ if ($this->smarty->_parserdebug) {
+ echo "<pre>Line {$this->lex->line} Parsing {$this->parser->yyTokenName[$this->lex->token]} Token " .
+ htmlentities($this->lex->value) . "</pre>";
+ }
+ $this->parser->doParse($this->lex->token, $this->lex->value);
+ }
+
+ if ($this->abort_and_recompile) {
+ // exit here on abort
+ return false;
+ }
+ // finish parsing process
+ $this->parser->doParse(0, 0);
+ // check for unclosed tags
+ if (count($this->_tag_stack) > 0) {
+ // get stacked info
+ list($openTag, $_data) = array_pop($this->_tag_stack);
+ $this->trigger_template_error("unclosed {" . $openTag . "} tag");
+ }
+ // return compiled code
+ // return str_replace(array("? >\n<?php","? ><?php"), array('',''), $this->parser->retvalue);
+ return $this->parser->retvalue;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_template.php b/include/smarty/libs/sysplugins/smarty_internal_template.php
new file mode 100644
index 000000000..29017edbb
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_template.php
@@ -0,0 +1,692 @@
+<?php
+/**
+ * Smarty Internal Plugin Template
+ *
+ * This file contains the Smarty template engine
+ *
+ * @package Smarty
+ * @subpackage Template
+ * @author Uwe Tews
+ */
+
+/**
+ * Main class with template data structures and methods
+ *
+ * @package Smarty
+ * @subpackage Template
+ *
+ * @property Smarty_Template_Source $source
+ * @property Smarty_Template_Compiled $compiled
+ * @property Smarty_Template_Cached $cached
+ */
+class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
+
+ /**
+ * cache_id
+ * @var string
+ */
+ public $cache_id = null;
+ /**
+ * $compile_id
+ * @var string
+ */
+ public $compile_id = null;
+ /**
+ * caching enabled
+ * @var boolean
+ */
+ public $caching = null;
+ /**
+ * cache lifetime in seconds
+ * @var integer
+ */
+ public $cache_lifetime = null;
+ /**
+ * Template resource
+ * @var string
+ */
+ public $template_resource = null;
+ /**
+ * flag if compiled template is invalid and must be (re)compiled
+ * @var bool
+ */
+ public $mustCompile = null;
+ /**
+ * flag if template does contain nocache code sections
+ * @var bool
+ */
+ public $has_nocache_code = false;
+ /**
+ * special compiled and cached template properties
+ * @var array
+ */
+ public $properties = array('file_dependency' => array(),
+ 'nocache_hash' => '',
+ 'function' => array());
+ /**
+ * required plugins
+ * @var array
+ */
+ public $required_plugins = array('compiled' => array(), 'nocache' => array());
+ /**
+ * Global smarty instance
+ * @var Smarty
+ */
+ public $smarty = null;
+ /**
+ * blocks for template inheritance
+ * @var array
+ */
+ public $block_data = array();
+ /**
+ * variable filters
+ * @var array
+ */
+ public $variable_filters = array();
+ /**
+ * optional log of tag/attributes
+ * @var array
+ */
+ public $used_tags = array();
+ /**
+ * internal flag to allow relative path in child template blocks
+ * @var bool
+ */
+ public $allow_relative_path = false;
+ /**
+ * internal capture runtime stack
+ * @var array
+ */
+ public $_capture_stack = array(0 => array());
+
+ /**
+ * Create template data object
+ *
+ * Some of the global Smarty settings copied to template scope
+ * It load the required template resources and cacher plugins
+ *
+ * @param string $template_resource template resource string
+ * @param Smarty $smarty Smarty instance
+ * @param Smarty_Internal_Template $_parent back pointer to parent object with variables or null
+ * @param mixed $_cache_id cache id or null
+ * @param mixed $_compile_id compile id or null
+ * @param bool $_caching use caching?
+ * @param int $_cache_lifetime cache life-time in seconds
+ */
+ public function __construct($template_resource, $smarty, $_parent = null, $_cache_id = null, $_compile_id = null, $_caching = null, $_cache_lifetime = null)
+ {
+ $this->smarty = &$smarty;
+ // Smarty parameter
+ $this->cache_id = $_cache_id === null ? $this->smarty->cache_id : $_cache_id;
+ $this->compile_id = $_compile_id === null ? $this->smarty->compile_id : $_compile_id;
+ $this->caching = $_caching === null ? $this->smarty->caching : $_caching;
+ if ($this->caching === true)
+ $this->caching = Smarty::CACHING_LIFETIME_CURRENT;
+ $this->cache_lifetime = $_cache_lifetime === null ? $this->smarty->cache_lifetime : $_cache_lifetime;
+ $this->parent = $_parent;
+ // Template resource
+ $this->template_resource = $template_resource;
+ // copy block data of template inheritance
+ if ($this->parent instanceof Smarty_Internal_Template) {
+ $this->block_data = $this->parent->block_data;
+ }
+ }
+
+ /**
+ * Returns if the current template must be compiled by the Smarty compiler
+ *
+ * It does compare the timestamps of template source and the compiled templates and checks the force compile configuration
+ *
+ * @return boolean true if the template must be compiled
+ */
+ public function mustCompile()
+ {
+ if (!$this->source->exists) {
+ if ($this->parent instanceof Smarty_Internal_Template) {
+ $parent_resource = " in '$this->parent->template_resource}'";
+ } else {
+ $parent_resource = '';
+ }
+ throw new SmartyException("Unable to load template {$this->source->type} '{$this->source->name}'{$parent_resource}");
+ }
+ if ($this->mustCompile === null) {
+ $this->mustCompile = (!$this->source->uncompiled && ($this->smarty->force_compile || $this->source->recompiled || $this->compiled->timestamp === false ||
+ ($this->smarty->compile_check && $this->compiled->timestamp < $this->source->timestamp)));
+ }
+ return $this->mustCompile;
+ }
+
+ /**
+ * Compiles the template
+ *
+ * If the template is not evaluated the compiled template is saved on disk
+ */
+ public function compileTemplateSource()
+ {
+ if (!$this->source->recompiled) {
+ $this->properties['file_dependency'] = array();
+ if ($this->source->components) {
+ // uses real resource for file dependency
+ $source = end($this->source->components);
+ $this->properties['file_dependency'][$this->source->uid] = array($this->source->filepath, $this->source->timestamp, $source->type);
+ } else {
+ $this->properties['file_dependency'][$this->source->uid] = array($this->source->filepath, $this->source->timestamp, $this->source->type);
+ }
+ }
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::start_compile($this);
+ }
+ // compile locking
+ if ($this->smarty->compile_locking && !$this->source->recompiled) {
+ if ($saved_timestamp = $this->compiled->timestamp) {
+ touch($this->compiled->filepath);
+ }
+ }
+ // call compiler
+ try {
+ $code = $this->compiler->compileTemplate($this);
+ } catch (Exception $e) {
+ // restore old timestamp in case of error
+ if ($this->smarty->compile_locking && !$this->source->recompiled && $saved_timestamp) {
+ touch($this->compiled->filepath, $saved_timestamp);
+ }
+ throw $e;
+ }
+ // compiling succeded
+ if (!$this->source->recompiled && $this->compiler->write_compiled_code) {
+ // write compiled template
+ $_filepath = $this->compiled->filepath;
+ if ($_filepath === false)
+ throw new SmartyException('getCompiledFilepath() did not return a destination to save the compiled template to');
+ Smarty_Internal_Write_File::writeFile($_filepath, $code, $this->smarty);
+ $this->compiled->exists = true;
+ $this->compiled->isCompiled = true;
+ }
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::end_compile($this);
+ }
+ // release compiler object to free memory
+ unset($this->compiler);
+ }
+
+ /**
+ * Writes the cached template output
+ *
+ * @return bool
+ */
+ public function writeCachedContent($content)
+ {
+ if ($this->source->recompiled || !($this->caching == Smarty::CACHING_LIFETIME_CURRENT || $this->caching == Smarty::CACHING_LIFETIME_SAVED)) {
+ // don't write cache file
+ return false;
+ }
+ $this->properties['cache_lifetime'] = $this->cache_lifetime;
+ $this->properties['unifunc'] = 'content_' . str_replace('.', '_', uniqid('', true));
+ $content = $this->createTemplateCodeFrame($content, true);
+ $_smarty_tpl = $this;
+ eval("?>" . $content);
+ $this->cached->valid = true;
+ $this->cached->processed = true;
+ return $this->cached->write($this, $content);
+ }
+
+ /**
+ * Template code runtime function to get subtemplate content
+ *
+ * @param string $template the resource handle of the template file
+ * @param mixed $cache_id cache id to be used with this template
+ * @param mixed $compile_id compile id to be used with this template
+ * @param integer $caching cache mode
+ * @param integer $cache_lifetime life time of cache data
+ * @param array $vars optional variables to assign
+ * @param int $parent_scope scope in which {include} should execute
+ * @returns string template content
+ */
+ public function getSubTemplate($template, $cache_id, $compile_id, $caching, $cache_lifetime, $data, $parent_scope)
+ {
+ // already in template cache?
+ if ($this->smarty->allow_ambiguous_resources) {
+ $_templateId = Smarty_Resource::getUniqueTemplateName($this->smarty, $template) . $cache_id . $compile_id;
+ } else {
+ $_templateId = $this->smarty->joined_template_dir . '#' . $template . $cache_id . $compile_id;
+ }
+
+ if (isset($_templateId[150])) {
+ $_templateId = sha1($_templateId);
+ }
+ if (isset($this->smarty->template_objects[$_templateId])) {
+ // clone cached template object because of possible recursive call
+ $tpl = clone $this->smarty->template_objects[$_templateId];
+ $tpl->parent = $this;
+ $tpl->caching = $caching;
+ $tpl->cache_lifetime = $cache_lifetime;
+ } else {
+ $tpl = new $this->smarty->template_class($template, $this->smarty, $this, $cache_id, $compile_id, $caching, $cache_lifetime);
+ }
+ // get variables from calling scope
+ if ($parent_scope == Smarty::SCOPE_LOCAL) {
+ $tpl->tpl_vars = $this->tpl_vars;
+ $tpl->tpl_vars['smarty'] = clone $this->tpl_vars['smarty'];
+ } elseif ($parent_scope == Smarty::SCOPE_PARENT) {
+ $tpl->tpl_vars = &$this->tpl_vars;
+ } elseif ($parent_scope == Smarty::SCOPE_GLOBAL) {
+ $tpl->tpl_vars = &Smarty::$global_tpl_vars;
+ } elseif (($scope_ptr = $this->getScopePointer($parent_scope)) == null) {
+ $tpl->tpl_vars = &$this->tpl_vars;
+ } else {
+ $tpl->tpl_vars = &$scope_ptr->tpl_vars;
+ }
+ $tpl->config_vars = $this->config_vars;
+ if (!empty($data)) {
+ // set up variable values
+ foreach ($data as $_key => $_val) {
+ $tpl->tpl_vars[$_key] = new Smarty_variable($_val);
+ }
+ }
+ return $tpl->fetch(null, null, null, null, false, false, true);
+ }
+
+ /**
+ * Template code runtime function to set up an inline subtemplate
+ *
+ * @param string $template the resource handle of the template file
+ * @param mixed $cache_id cache id to be used with this template
+ * @param mixed $compile_id compile id to be used with this template
+ * @param integer $caching cache mode
+ * @param integer $cache_lifetime life time of cache data
+ * @param array $vars optional variables to assign
+ * @param int $parent_scope scope in which {include} should execute
+ * @param string $hash nocache hash code
+ * @returns string template content
+ */
+ public function setupInlineSubTemplate($template, $cache_id, $compile_id, $caching, $cache_lifetime, $data, $parent_scope, $hash)
+ {
+ $tpl = new $this->smarty->template_class($template, $this->smarty, $this, $cache_id, $compile_id, $caching, $cache_lifetime);
+ $tpl->properties['nocache_hash'] = $hash;
+ // get variables from calling scope
+ if ($parent_scope == Smarty::SCOPE_LOCAL ) {
+ $tpl->tpl_vars = $this->tpl_vars;
+ $tpl->tpl_vars['smarty'] = clone $this->tpl_vars['smarty'];
+ } elseif ($parent_scope == Smarty::SCOPE_PARENT) {
+ $tpl->tpl_vars = &$this->tpl_vars;
+ } elseif ($parent_scope == Smarty::SCOPE_GLOBAL) {
+ $tpl->tpl_vars = &Smarty::$global_tpl_vars;
+ } elseif (($scope_ptr = $this->getScopePointer($parent_scope)) == null) {
+ $tpl->tpl_vars = &$this->tpl_vars;
+ } else {
+ $tpl->tpl_vars = &$scope_ptr->tpl_vars;
+ }
+ $tpl->config_vars = $this->config_vars;
+ if (!empty($data)) {
+ // set up variable values
+ foreach ($data as $_key => $_val) {
+ $tpl->tpl_vars[$_key] = new Smarty_variable($_val);
+ }
+ }
+ return $tpl;
+ }
+
+
+ /**
+ * Create code frame for compiled and cached templates
+ *
+ * @param string $content optional template content
+ * @param bool $cache flag for cache file
+ * @return string
+ */
+ public function createTemplateCodeFrame($content = '', $cache = false)
+ {
+ $plugins_string = '';
+ // include code for plugins
+ if (!$cache) {
+ if (!empty($this->required_plugins['compiled'])) {
+ $plugins_string = '<?php ';
+ foreach ($this->required_plugins['compiled'] as $tmp) {
+ foreach ($tmp as $data) {
+ $file = addslashes($data['file']);
+ if (is_Array($data['function'])){
+ $plugins_string .= "if (!is_callable(array('{$data['function'][0]}','{$data['function'][1]}'))) include '{$file}';\n";
+ } else {
+ $plugins_string .= "if (!is_callable('{$data['function']}')) include '{$file}';\n";
+ }
+ }
+ }
+ $plugins_string .= '?>';
+ }
+ if (!empty($this->required_plugins['nocache'])) {
+ $this->has_nocache_code = true;
+ $plugins_string .= "<?php echo '/*%%SmartyNocache:{$this->properties['nocache_hash']}%%*/<?php \$_smarty = \$_smarty_tpl->smarty; ";
+ foreach ($this->required_plugins['nocache'] as $tmp) {
+ foreach ($tmp as $data) {
+ $file = addslashes($data['file']);
+ if (is_Array($data['function'])){
+ $plugins_string .= addslashes("if (!is_callable(array('{$data['function'][0]}','{$data['function'][1]}'))) include '{$file}';\n");
+ } else {
+ $plugins_string .= addslashes("if (!is_callable('{$data['function']}')) include '{$file}';\n");
+ }
+ }
+ }
+ $plugins_string .= "?>/*/%%SmartyNocache:{$this->properties['nocache_hash']}%%*/';?>\n";
+ }
+ }
+ // build property code
+ $this->properties['has_nocache_code'] = $this->has_nocache_code;
+ $output = '';
+ if (!$this->source->recompiled) {
+ $output = "<?php /*%%SmartyHeaderCode:{$this->properties['nocache_hash']}%%*/";
+ if ($this->smarty->direct_access_security) {
+ $output .= "if(!defined('SMARTY_DIR')) exit('no direct access allowed');\n";
+ }
+ }
+ if ($cache) {
+ // remove compiled code of{function} definition
+ unset($this->properties['function']);
+ if (!empty($this->smarty->template_functions)) {
+ // copy code of {function} tags called in nocache mode
+ foreach ($this->smarty->template_functions as $name => $function_data) {
+ if (isset($function_data['called_nocache'])) {
+ foreach ($function_data['called_functions'] as $func_name) {
+ $this->smarty->template_functions[$func_name]['called_nocache'] = true;
+ }
+ }
+ }
+ foreach ($this->smarty->template_functions as $name => $function_data) {
+ if (isset($function_data['called_nocache'])) {
+ unset($function_data['called_nocache'], $function_data['called_functions'], $this->smarty->template_functions[$name]['called_nocache']);
+ $this->properties['function'][$name] = $function_data;
+ }
+ }
+ }
+ }
+ $this->properties['version'] = Smarty::SMARTY_VERSION;
+ if (!isset($this->properties['unifunc'])) {
+ $this->properties['unifunc'] = 'content_' . str_replace('.', '_', uniqid('', true));
+ }
+ if (!$this->source->recompiled) {
+ $output .= "\$_valid = \$_smarty_tpl->decodeProperties(" . var_export($this->properties, true) . ',' . ($cache ? 'true' : 'false') . "); /*/%%SmartyHeaderCode%%*/?>\n";
+ $output .= '<?php if ($_valid && !is_callable(\'' . $this->properties['unifunc'] . '\')) {function ' . $this->properties['unifunc'] . '($_smarty_tpl) {?>';
+ }
+ $output .= $plugins_string;
+ $output .= $content;
+ if (!$this->source->recompiled) {
+ $output .= '<?php }} ?>';
+ }
+ return $output;
+ }
+
+ /**
+ * This function is executed automatically when a compiled or cached template file is included
+ *
+ * - Decode saved properties from compiled template and cache files
+ * - Check if compiled or cache file is valid
+ *
+ * @param array $properties special template properties
+ * @param bool $cache flag if called from cache file
+ * @return bool flag if compiled or cache file is valid
+ */
+ public function decodeProperties($properties, $cache = false)
+ {
+ $this->has_nocache_code = $properties['has_nocache_code'];
+ $this->properties['nocache_hash'] = $properties['nocache_hash'];
+ if (isset($properties['cache_lifetime'])) {
+ $this->properties['cache_lifetime'] = $properties['cache_lifetime'];
+ }
+ if (isset($properties['file_dependency'])) {
+ $this->properties['file_dependency'] = array_merge($this->properties['file_dependency'], $properties['file_dependency']);
+ }
+ if (!empty($properties['function'])) {
+ $this->properties['function'] = array_merge($this->properties['function'], $properties['function']);
+ $this->smarty->template_functions = array_merge($this->smarty->template_functions, $properties['function']);
+ }
+ $this->properties['version'] = (isset($properties['version'])) ? $properties['version'] : '';
+ $this->properties['unifunc'] = $properties['unifunc'];
+ // check file dependencies at compiled code
+ $is_valid = true;
+ if ($this->properties['version'] != Smarty::SMARTY_VERSION) {
+ $is_valid = false;
+ } else if (((!$cache && $this->smarty->compile_check && empty($this->compiled->_properties) && !$this->compiled->isCompiled) || $cache && ($this->smarty->compile_check === true || $this->smarty->compile_check === Smarty::COMPILECHECK_ON)) && !empty($this->properties['file_dependency'])) {
+ foreach ($this->properties['file_dependency'] as $_file_to_check) {
+ if ($_file_to_check[2] == 'file' || $_file_to_check[2] == 'php') {
+ if ($this->source->filepath == $_file_to_check[0] && isset($this->source->timestamp)) {
+ // do not recheck current template
+ $mtime = $this->source->timestamp;
+ } else {
+ // file and php types can be checked without loading the respective resource handlers
+ $mtime = @filemtime($_file_to_check[0]);
+ }
+ } elseif ($_file_to_check[2] == 'string') {
+ continue;
+ } else {
+ $source = Smarty_Resource::source(null, $this->smarty, $_file_to_check[0]);
+ $mtime = $source->timestamp;
+ }
+ if (!$mtime || $mtime > $_file_to_check[1]) {
+ $is_valid = false;
+ break;
+ }
+ }
+ }
+ if ($cache) {
+ $this->cached->valid = $is_valid;
+ } else {
+ $this->mustCompile = !$is_valid;
+ }
+ // store data in reusable Smarty_Template_Compiled
+ if (!$cache) {
+ $this->compiled->_properties = $properties;
+ }
+ return $is_valid;
+ }
+
+ /**
+ * Template code runtime function to create a local Smarty variable for array assignments
+ *
+ * @param string $tpl_var tempate variable name
+ * @param bool $nocache cache mode of variable
+ * @param int $scope scope of variable
+ */
+ public function createLocalArrayVariable($tpl_var, $nocache = false, $scope = Smarty::SCOPE_LOCAL)
+ {
+ if (!isset($this->tpl_vars[$tpl_var])) {
+ $this->tpl_vars[$tpl_var] = new Smarty_variable(array(), $nocache, $scope);
+ } else {
+ $this->tpl_vars[$tpl_var] = clone $this->tpl_vars[$tpl_var];
+ if ($scope != Smarty::SCOPE_LOCAL) {
+ $this->tpl_vars[$tpl_var]->scope = $scope;
+ }
+ if (!(is_array($this->tpl_vars[$tpl_var]->value) || $this->tpl_vars[$tpl_var]->value instanceof ArrayAccess)) {
+ settype($this->tpl_vars[$tpl_var]->value, 'array');
+ }
+ }
+ }
+
+ /**
+ * Template code runtime function to get pointer to template variable array of requested scope
+ *
+ * @param int $scope requested variable scope
+ * @return array array of template variables
+ */
+ public function &getScope($scope)
+ {
+ if ($scope == Smarty::SCOPE_PARENT && !empty($this->parent)) {
+ return $this->parent->tpl_vars;
+ } elseif ($scope == Smarty::SCOPE_ROOT && !empty($this->parent)) {
+ $ptr = $this->parent;
+ while (!empty($ptr->parent)) {
+ $ptr = $ptr->parent;
+ }
+ return $ptr->tpl_vars;
+ } elseif ($scope == Smarty::SCOPE_GLOBAL) {
+ return Smarty::$global_tpl_vars;
+ }
+ $null = null;
+ return $null;
+ }
+
+ /**
+ * Get parent or root of template parent chain
+ *
+ * @param int $scope pqrent or root scope
+ * @return mixed object
+ */
+ public function getScopePointer($scope)
+ {
+ if ($scope == Smarty::SCOPE_PARENT && !empty($this->parent)) {
+ return $this->parent;
+ } elseif ($scope == Smarty::SCOPE_ROOT && !empty($this->parent)) {
+ $ptr = $this->parent;
+ while (!empty($ptr->parent)) {
+ $ptr = $ptr->parent;
+ }
+ return $ptr;
+ }
+ return null;
+ }
+
+ /**
+ * [util function] counts an array, arrayaccess/traversable or PDOStatement object
+ *
+ * @param mixed $value
+ * @return int the count for arrays and objects that implement countable, 1 for other objects that don't, and 0 for empty elements
+ */
+ public function _count($value)
+ {
+ if (is_array($value) === true || $value instanceof Countable) {
+ return count($value);
+ } elseif ($value instanceof IteratorAggregate) {
+ // Note: getIterator() returns a Traversable, not an Iterator
+ // thus rewind() and valid() methods may not be present
+ return iterator_count($value->getIterator());
+ } elseif ($value instanceof Iterator) {
+ return iterator_count($value);
+ } elseif ($value instanceof PDOStatement) {
+ return $value->rowCount();
+ } elseif ($value instanceof Traversable) {
+ return iterator_count($value);
+ } elseif ($value instanceof ArrayAccess) {
+ if ($value->offsetExists(0)) {
+ return 1;
+ }
+ } elseif (is_object($value)) {
+ return count($value);
+ }
+ return 0;
+ }
+
+ /**
+ * runtime error not matching capture tags
+ *
+ */
+ public function capture_error()
+ {
+ throw new SmartyException("Not matching {capture} open/close in \"{$this->template_resource}\"");
+ }
+
+ /**
+ * Empty cache for this template
+ *
+ * @param integer $exp_time expiration time
+ * @return integer number of cache files deleted
+ */
+ public function clearCache($exp_time=null)
+ {
+ Smarty_CacheResource::invalidLoadedCache($this->smarty);
+ return $this->cached->handler->clear($this->smarty, $this->template_name, $this->cache_id, $this->compile_id, $exp_time);
+ }
+
+ /**
+ * set Smarty property in template context
+ *
+ * @param string $property_name property name
+ * @param mixed $value value
+ */
+ public function __set($property_name, $value)
+ {
+ switch ($property_name) {
+ case 'source':
+ case 'compiled':
+ case 'cached':
+ case 'compiler':
+ $this->$property_name = $value;
+ return;
+
+ // FIXME: routing of template -> smarty attributes
+ default:
+ if (property_exists($this->smarty, $property_name)) {
+ $this->smarty->$property_name = $value;
+ return;
+ }
+ }
+
+ throw new SmartyException("invalid template property '$property_name'.");
+ }
+
+ /**
+ * get Smarty property in template context
+ *
+ * @param string $property_name property name
+ */
+ public function __get($property_name)
+ {
+ switch ($property_name) {
+ case 'source':
+ if (strlen($this->template_resource) == 0) {
+ throw new SmartyException('Missing template name');
+ }
+ $this->source = Smarty_Resource::source($this);
+ // cache template object under a unique ID
+ // do not cache eval resources
+ if ($this->source->type != 'eval') {
+ if ($this->smarty->allow_ambiguous_resources) {
+ $_templateId = $this->source->unique_resource . $this->cache_id . $this->compile_id;
+ } else {
+ $_templateId = $this->smarty->joined_template_dir . '#' . $this->template_resource . $this->cache_id . $this->compile_id;
+ }
+
+ if (isset($_templateId[150])) {
+ $_templateId = sha1($_templateId);
+ }
+ $this->smarty->template_objects[$_templateId] = $this;
+ }
+ return $this->source;
+
+ case 'compiled':
+ $this->compiled = $this->source->getCompiled($this);
+ return $this->compiled;
+
+ case 'cached':
+ if (!class_exists('Smarty_Template_Cached')) {
+ include SMARTY_SYSPLUGINS_DIR . 'smarty_cacheresource.php';
+ }
+ $this->cached = new Smarty_Template_Cached($this);
+ return $this->cached;
+
+ case 'compiler':
+ $this->smarty->loadPlugin($this->source->compiler_class);
+ $this->compiler = new $this->source->compiler_class($this->source->template_lexer_class, $this->source->template_parser_class, $this->smarty);
+ return $this->compiler;
+
+ // FIXME: routing of template -> smarty attributes
+ default:
+ if (property_exists($this->smarty, $property_name)) {
+ return $this->smarty->$property_name;
+ }
+ }
+
+ throw new SmartyException("template property '$property_name' does not exist.");
+ }
+
+ /**
+ * Template data object destrutor
+ *
+ */
+ public function __destruct()
+ {
+ if ($this->smarty->cache_locking && isset($this->cached) && $this->cached->is_locked) {
+ $this->cached->handler->releaseLock($this->smarty, $this->cached);
+ }
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_templatebase.php b/include/smarty/libs/sysplugins/smarty_internal_templatebase.php
new file mode 100644
index 000000000..1cb9bb949
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_templatebase.php
@@ -0,0 +1,811 @@
+<?php
+/**
+ * Smarty Internal Plugin Smarty Template Base
+ *
+ * This file contains the basic shared methodes for template handling
+ *
+ * @package Smarty
+ * @subpackage Template
+ * @author Uwe Tews
+ */
+
+/**
+ * Class with shared template methodes
+ *
+ * @package Smarty
+ * @subpackage Template
+ */
+abstract class Smarty_Internal_TemplateBase extends Smarty_Internal_Data {
+
+ /**
+ * fetches a rendered Smarty template
+ *
+ * @param string $template the resource handle of the template file or template object
+ * @param mixed $cache_id cache id to be used with this template
+ * @param mixed $compile_id compile id to be used with this template
+ * @param object $parent next higher level of Smarty variables
+ * @param bool $display true: display, false: fetch
+ * @param bool $merge_tpl_vars if true parent template variables merged in to local scope
+ * @param bool $no_output_filter if true do not run output filter
+ * @return string rendered template output
+ */
+ public function fetch($template = null, $cache_id = null, $compile_id = null, $parent = null, $display = false, $merge_tpl_vars = true, $no_output_filter = false)
+ {
+ if ($template === null && $this instanceof $this->template_class) {
+ $template = $this;
+ }
+ if (!empty($cache_id) && is_object($cache_id)) {
+ $parent = $cache_id;
+ $cache_id = null;
+ }
+ if ($parent === null && ($this instanceof Smarty || is_string($template))) {
+ $parent = $this;
+ }
+ // create template object if necessary
+ $_template = ($template instanceof $this->template_class)
+ ? $template
+ : $this->smarty->createTemplate($template, $cache_id, $compile_id, $parent, false);
+ // if called by Smarty object make sure we use current caching status
+ if ($this instanceof Smarty) {
+ $_template->caching = $this->caching;
+ }
+ // merge all variable scopes into template
+ if ($merge_tpl_vars) {
+ // save local variables
+ $save_tpl_vars = $_template->tpl_vars;
+ $save_config_vars = $_template->config_vars;
+ $ptr_array = array($_template);
+ $ptr = $_template;
+ while (isset($ptr->parent)) {
+ $ptr_array[] = $ptr = $ptr->parent;
+ }
+ $ptr_array = array_reverse($ptr_array);
+ $parent_ptr = reset($ptr_array);
+ $tpl_vars = $parent_ptr->tpl_vars;
+ $config_vars = $parent_ptr->config_vars;
+ while ($parent_ptr = next($ptr_array)) {
+ if (!empty($parent_ptr->tpl_vars)) {
+ $tpl_vars = array_merge($tpl_vars, $parent_ptr->tpl_vars);
+ }
+ if (!empty($parent_ptr->config_vars)) {
+ $config_vars = array_merge($config_vars, $parent_ptr->config_vars);
+ }
+ }
+ if (!empty(Smarty::$global_tpl_vars)) {
+ $tpl_vars = array_merge(Smarty::$global_tpl_vars, $tpl_vars);
+ }
+ $_template->tpl_vars = $tpl_vars;
+ $_template->config_vars = $config_vars;
+ }
+ // dummy local smarty variable
+ if (!isset($_template->tpl_vars['smarty'])) {
+ $_template->tpl_vars['smarty'] = new Smarty_Variable;
+ }
+ if (isset($this->smarty->error_reporting)) {
+ $_smarty_old_error_level = error_reporting($this->smarty->error_reporting);
+ }
+ // check URL debugging control
+ if (!$this->smarty->debugging && $this->smarty->debugging_ctrl == 'URL') {
+ if (isset($_SERVER['QUERY_STRING'])) {
+ $_query_string = $_SERVER['QUERY_STRING'];
+ } else {
+ $_query_string = '';
+ }
+ if (false !== strpos($_query_string, $this->smarty->smarty_debug_id)) {
+ if (false !== strpos($_query_string, $this->smarty->smarty_debug_id . '=on')) {
+ // enable debugging for this browser session
+ setcookie('SMARTY_DEBUG', true);
+ $this->smarty->debugging = true;
+ } elseif (false !== strpos($_query_string, $this->smarty->smarty_debug_id . '=off')) {
+ // disable debugging for this browser session
+ setcookie('SMARTY_DEBUG', false);
+ $this->smarty->debugging = false;
+ } else {
+ // enable debugging for this page
+ $this->smarty->debugging = true;
+ }
+ } else {
+ if (isset($_COOKIE['SMARTY_DEBUG'])) {
+ $this->smarty->debugging = true;
+ }
+ }
+ }
+ // must reset merge template date
+ $_template->smarty->merged_templates_func = array();
+ // get rendered template
+ // disable caching for evaluated code
+ if ($_template->source->recompiled) {
+ $_template->caching = false;
+ }
+ // checks if template exists
+ if (!$_template->source->exists) {
+ if ($_template->parent instanceof Smarty_Internal_Template) {
+ $parent_resource = " in '{$_template->parent->template_resource}'";
+ } else {
+ $parent_resource = '';
+ }
+ throw new SmartyException("Unable to load template {$_template->source->type} '{$_template->source->name}'{$parent_resource}");
+ }
+ // read from cache or render
+ if (!($_template->caching == Smarty::CACHING_LIFETIME_CURRENT || $_template->caching == Smarty::CACHING_LIFETIME_SAVED) || !$_template->cached->valid) {
+ // render template (not loaded and not in cache)
+ if (!$_template->source->uncompiled) {
+ $_smarty_tpl = $_template;
+ if ($_template->source->recompiled) {
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::start_compile($_template);
+ }
+ $code = $_template->compiler->compileTemplate($_template);
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::end_compile($_template);
+ }
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::start_render($_template);
+ }
+ try {
+ ob_start();
+ eval("?>" . $code);
+ unset($code);
+ } catch (Exception $e) {
+ ob_get_clean();
+ throw $e;
+ }
+ } else {
+ if (!$_template->compiled->exists || ($_template->smarty->force_compile && !$_template->compiled->isCompiled)) {
+ $_template->compileTemplateSource();
+ }
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::start_render($_template);
+ }
+ if (!$_template->compiled->loaded) {
+ include($_template->compiled->filepath);
+ if ($_template->mustCompile) {
+ // recompile and load again
+ $_template->compileTemplateSource();
+ include($_template->compiled->filepath);
+ }
+ $_template->compiled->loaded = true;
+ } else {
+ $_template->decodeProperties($_template->compiled->_properties, false);
+ }
+ try {
+ ob_start();
+ if (empty($_template->properties['unifunc']) || !is_callable($_template->properties['unifunc'])) {
+ throw new SmartyException("Invalid compiled template for '{$_template->template_resource}'");
+ }
+ array_unshift($_template->_capture_stack,array());
+ //
+ // render compiled template
+ //
+ $_template->properties['unifunc']($_template);
+ // any unclosed {capture} tags ?
+ if (isset($_template->_capture_stack[0][0])) {
+ $_template->capture_error();
+ }
+ array_shift($_template->_capture_stack);
+ } catch (Exception $e) {
+ ob_get_clean();
+ throw $e;
+ }
+ }
+ } else {
+ if ($_template->source->uncompiled) {
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::start_render($_template);
+ }
+ try {
+ ob_start();
+ $_template->source->renderUncompiled($_template);
+ } catch (Exception $e) {
+ ob_get_clean();
+ throw $e;
+ }
+ } else {
+ throw new SmartyException("Resource '$_template->source->type' must have 'renderUncompiled' method");
+ }
+ }
+ $_output = ob_get_clean();
+ if (!$_template->source->recompiled && empty($_template->properties['file_dependency'][$_template->source->uid])) {
+ $_template->properties['file_dependency'][$_template->source->uid] = array($_template->source->filepath, $_template->source->timestamp, $_template->source->type);
+ }
+ if ($_template->parent instanceof Smarty_Internal_Template) {
+ $_template->parent->properties['file_dependency'] = array_merge($_template->parent->properties['file_dependency'], $_template->properties['file_dependency']);
+ foreach ($_template->required_plugins as $code => $tmp1) {
+ foreach ($tmp1 as $name => $tmp) {
+ foreach ($tmp as $type => $data) {
+ $_template->parent->required_plugins[$code][$name][$type] = $data;
+ }
+ }
+ }
+ }
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::end_render($_template);
+ }
+ // write to cache when nessecary
+ if (!$_template->source->recompiled && ($_template->caching == Smarty::CACHING_LIFETIME_SAVED || $_template->caching == Smarty::CACHING_LIFETIME_CURRENT)) {
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::start_cache($_template);
+ }
+ $_template->properties['has_nocache_code'] = false;
+ // get text between non-cached items
+ $cache_split = preg_split("!/\*%%SmartyNocache:{$_template->properties['nocache_hash']}%%\*\/(.+?)/\*/%%SmartyNocache:{$_template->properties['nocache_hash']}%%\*/!s", $_output);
+ // get non-cached items
+ preg_match_all("!/\*%%SmartyNocache:{$_template->properties['nocache_hash']}%%\*\/(.+?)/\*/%%SmartyNocache:{$_template->properties['nocache_hash']}%%\*/!s", $_output, $cache_parts);
+ $output = '';
+ // loop over items, stitch back together
+ foreach ($cache_split as $curr_idx => $curr_split) {
+ // escape PHP tags in template content
+ $output .= preg_replace('/(<%|%>|<\?php|<\?|\?>)/', '<?php echo \'$1\'; ?>', $curr_split);
+ if (isset($cache_parts[0][$curr_idx])) {
+ $_template->properties['has_nocache_code'] = true;
+ // remove nocache tags from cache output
+ $output .= preg_replace("!/\*/?%%SmartyNocache:{$_template->properties['nocache_hash']}%%\*/!", '', $cache_parts[0][$curr_idx]);
+ }
+ }
+ if (!$no_output_filter && !$_template->has_nocache_code && (isset($this->smarty->autoload_filters['output']) || isset($this->smarty->registered_filters['output']))) {
+ $output = Smarty_Internal_Filter_Handler::runFilter('output', $output, $_template);
+ }
+ // rendering (must be done before writing cache file because of {function} nocache handling)
+ $_smarty_tpl = $_template;
+ try {
+ ob_start();
+ eval("?>" . $output);
+ $_output = ob_get_clean();
+ } catch (Exception $e) {
+ ob_get_clean();
+ throw $e;
+ }
+ // write cache file content
+ $_template->writeCachedContent($output);
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::end_cache($_template);
+ }
+ } else {
+ // var_dump('renderTemplate', $_template->has_nocache_code, $_template->template_resource, $_template->properties['nocache_hash'], $_template->parent->properties['nocache_hash'], $_output);
+ if (!empty($_template->properties['nocache_hash']) && !empty($_template->parent->properties['nocache_hash'])) {
+ // replace nocache_hash
+ $_output = str_replace("{$_template->properties['nocache_hash']}", $_template->parent->properties['nocache_hash'], $_output);
+ $_template->parent->has_nocache_code = $_template->parent->has_nocache_code || $_template->has_nocache_code;
+ }
+ }
+ } else {
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::start_cache($_template);
+ }
+ try {
+ ob_start();
+ array_unshift($_template->_capture_stack,array());
+ //
+ // render cached template
+ //
+ $_template->properties['unifunc']($_template);
+ // any unclosed {capture} tags ?
+ if (isset($_template->_capture_stack[0][0])) {
+ $_template->capture_error();
+ }
+ array_shift($_template->_capture_stack);
+ $_output = ob_get_clean();
+ } catch (Exception $e) {
+ ob_get_clean();
+ throw $e;
+ }
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::end_cache($_template);
+ }
+ }
+ if ((!$this->caching || $_template->has_nocache_code || $_template->source->recompiled) && !$no_output_filter && (isset($this->smarty->autoload_filters['output']) || isset($this->smarty->registered_filters['output']))) {
+ $_output = Smarty_Internal_Filter_Handler::runFilter('output', $_output, $_template);
+ }
+ if (isset($this->error_reporting)) {
+ error_reporting($_smarty_old_error_level);
+ }
+ // display or fetch
+ if ($display) {
+ if ($this->caching && $this->cache_modified_check) {
+ $_isCached = $_template->isCached() && !$_template->has_nocache_code;
+ $_last_modified_date = @substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 0, strpos($_SERVER['HTTP_IF_MODIFIED_SINCE'], 'GMT') + 3);
+ if ($_isCached && $_template->cached->timestamp <= strtotime($_last_modified_date)) {
+ switch (PHP_SAPI) {
+ case 'cgi': // php-cgi < 5.3
+ case 'cgi-fcgi': // php-cgi >= 5.3
+ case 'fpm-fcgi': // php-fpm >= 5.3.3
+ header('Status: 304 Not Modified');
+ break;
+
+ case 'cli':
+ if (/* ^phpunit */!empty($_SERVER['SMARTY_PHPUNIT_DISABLE_HEADERS'])/* phpunit$ */) {
+ $_SERVER['SMARTY_PHPUNIT_HEADERS'][] = '304 Not Modified';
+ }
+ break;
+
+ default:
+ header($_SERVER['SERVER_PROTOCOL'].' 304 Not Modified');
+ break;
+ }
+ } else {
+ switch (PHP_SAPI) {
+ case 'cli':
+ if (/* ^phpunit */!empty($_SERVER['SMARTY_PHPUNIT_DISABLE_HEADERS'])/* phpunit$ */) {
+ $_SERVER['SMARTY_PHPUNIT_HEADERS'][] = 'Last-Modified: ' . gmdate('D, d M Y H:i:s', $_template->cached->timestamp) . ' GMT';
+ }
+ break;
+
+ default:
+ header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $_template->cached->timestamp) . ' GMT');
+ break;
+ }
+ echo $_output;
+ }
+ } else {
+ echo $_output;
+ }
+ // debug output
+ if ($this->smarty->debugging) {
+ Smarty_Internal_Debug::display_debug($this);
+ }
+ if ($merge_tpl_vars) {
+ // restore local variables
+ $_template->tpl_vars = $save_tpl_vars;
+ $_template->config_vars = $save_config_vars;
+ }
+ return;
+ } else {
+ if ($merge_tpl_vars) {
+ // restore local variables
+ $_template->tpl_vars = $save_tpl_vars;
+ $_template->config_vars = $save_config_vars;
+ }
+ // return fetched content
+ return $_output;
+ }
+ }
+
+ /**
+ * displays a Smarty template
+ *
+ * @param string $template the resource handle of the template file or template object
+ * @param mixed $cache_id cache id to be used with this template
+ * @param mixed $compile_id compile id to be used with this template
+ * @param object $parent next higher level of Smarty variables
+ */
+ public function display($template = null, $cache_id = null, $compile_id = null, $parent = null)
+ {
+ // display template
+ $this->fetch($template, $cache_id, $compile_id, $parent, true);
+ }
+
+ /**
+ * test if cache is valid
+ *
+ * @param string|object $template the resource handle of the template file or template object
+ * @param mixed $cache_id cache id to be used with this template
+ * @param mixed $compile_id compile id to be used with this template
+ * @param object $parent next higher level of Smarty variables
+ * @return boolean cache status
+ */
+ public function isCached($template = null, $cache_id = null, $compile_id = null, $parent = null)
+ {
+ if ($template === null && $this instanceof $this->template_class) {
+ return $this->cached->valid;
+ }
+ if (!($template instanceof $this->template_class)) {
+ if ($parent === null) {
+ $parent = $this;
+ }
+ $template = $this->smarty->createTemplate($template, $cache_id, $compile_id, $parent, false);
+ }
+ // return cache status of template
+ return $template->cached->valid;
+ }
+
+ /**
+ * creates a data object
+ *
+ * @param object $parent next higher level of Smarty variables
+ * @returns Smarty_Data data object
+ */
+ public function createData($parent = null)
+ {
+ return new Smarty_Data($parent, $this);
+ }
+
+ /**
+ * Registers plugin to be used in templates
+ *
+ * @param string $type plugin type
+ * @param string $tag name of template tag
+ * @param callback $callback PHP callback to register
+ * @param boolean $cacheable if true (default) this fuction is cachable
+ * @param array $cache_attr caching attributes if any
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
+ * @throws SmartyException when the plugin tag is invalid
+ */
+ public function registerPlugin($type, $tag, $callback, $cacheable = true, $cache_attr = null)
+ {
+ if (isset($this->smarty->registered_plugins[$type][$tag])) {
+ throw new SmartyException("Plugin tag \"{$tag}\" already registered");
+ } elseif (!is_callable($callback)) {
+ throw new SmartyException("Plugin \"{$tag}\" not callable");
+ } else {
+ $this->smarty->registered_plugins[$type][$tag] = array($callback, (bool) $cacheable, (array) $cache_attr);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Unregister Plugin
+ *
+ * @param string $type of plugin
+ * @param string $tag name of plugin
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
+ */
+ public function unregisterPlugin($type, $tag)
+ {
+ if (isset($this->smarty->registered_plugins[$type][$tag])) {
+ unset($this->smarty->registered_plugins[$type][$tag]);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Registers a resource to fetch a template
+ *
+ * @param string $type name of resource type
+ * @param Smarty_Resource|array $callback or instance of Smarty_Resource, or array of callbacks to handle resource (deprecated)
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
+ */
+ public function registerResource($type, $callback)
+ {
+ $this->smarty->registered_resources[$type] = $callback instanceof Smarty_Resource ? $callback : array($callback, false);
+ return $this;
+ }
+
+ /**
+ * Unregisters a resource
+ *
+ * @param string $type name of resource type
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
+ */
+ public function unregisterResource($type)
+ {
+ if (isset($this->smarty->registered_resources[$type])) {
+ unset($this->smarty->registered_resources[$type]);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Registers a cache resource to cache a template's output
+ *
+ * @param string $type name of cache resource type
+ * @param Smarty_CacheResource $callback instance of Smarty_CacheResource to handle output caching
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
+ */
+ public function registerCacheResource($type, Smarty_CacheResource $callback)
+ {
+ $this->smarty->registered_cache_resources[$type] = $callback;
+ return $this;
+ }
+
+ /**
+ * Unregisters a cache resource
+ *
+ * @param string $type name of cache resource type
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
+ */
+ public function unregisterCacheResource($type)
+ {
+ if (isset($this->smarty->registered_cache_resources[$type])) {
+ unset($this->smarty->registered_cache_resources[$type]);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Registers object to be used in templates
+ *
+ * @param string $object name of template object
+ * @param object $object_impl the referenced PHP object to register
+ * @param array $allowed list of allowed methods (empty = all)
+ * @param boolean $smarty_args smarty argument format, else traditional
+ * @param array $block_methods list of block-methods
+ * @param array $block_functs list of methods that are block format
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
+ * @throws SmartyException if any of the methods in $allowed or $block_methods are invalid
+ */
+ public function registerObject($object_name, $object_impl, $allowed = array(), $smarty_args = true, $block_methods = array())
+ {
+ // test if allowed methodes callable
+ if (!empty($allowed)) {
+ foreach ((array) $allowed as $method) {
+ if (!is_callable(array($object_impl, $method))) {
+ throw new SmartyException("Undefined method '$method' in registered object");
+ }
+ }
+ }
+ // test if block methodes callable
+ if (!empty($block_methods)) {
+ foreach ((array) $block_methods as $method) {
+ if (!is_callable(array($object_impl, $method))) {
+ throw new SmartyException("Undefined method '$method' in registered object");
+ }
+ }
+ }
+ // register the object
+ $this->smarty->registered_objects[$object_name] =
+ array($object_impl, (array) $allowed, (boolean) $smarty_args, (array) $block_methods);
+ return $this;
+ }
+
+ /**
+ * return a reference to a registered object
+ *
+ * @param string $name object name
+ * @return object
+ * @throws SmartyException if no such object is found
+ */
+ public function getRegisteredObject($name)
+ {
+ if (!isset($this->smarty->registered_objects[$name])) {
+ throw new SmartyException("'$name' is not a registered object");
+ }
+ if (!is_object($this->smarty->registered_objects[$name][0])) {
+ throw new SmartyException("registered '$name' is not an object");
+ }
+ return $this->smarty->registered_objects[$name][0];
+ }
+
+ /**
+ * unregister an object
+ *
+ * @param string $name object name
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
+ */
+ public function unregisterObject($name)
+ {
+ if (isset($this->smarty->registered_objects[$name])) {
+ unset($this->smarty->registered_objects[$name]);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Registers static classes to be used in templates
+ *
+ * @param string $class name of template class
+ * @param string $class_impl the referenced PHP class to register
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
+ * @throws SmartyException if $class_impl does not refer to an existing class
+ */
+ public function registerClass($class_name, $class_impl)
+ {
+ // test if exists
+ if (!class_exists($class_impl)) {
+ throw new SmartyException("Undefined class '$class_impl' in register template class");
+ }
+ // register the class
+ $this->smarty->registered_classes[$class_name] = $class_impl;
+ return $this;
+ }
+
+ /**
+ * Registers a default plugin handler
+ *
+ * @param callable $callback class/method name
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
+ * @throws SmartyException if $callback is not callable
+ */
+ public function registerDefaultPluginHandler($callback)
+ {
+ if (is_callable($callback)) {
+ $this->smarty->default_plugin_handler_func = $callback;
+ } else {
+ throw new SmartyException("Default plugin handler '$callback' not callable");
+ }
+
+ return $this;
+ }
+
+ /**
+ * Registers a default template handler
+ *
+ * @param callable $callback class/method name
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
+ * @throws SmartyException if $callback is not callable
+ */
+ public function registerDefaultTemplateHandler($callback)
+ {
+ if (is_callable($callback)) {
+ $this->smarty->default_template_handler_func = $callback;
+ } else {
+ throw new SmartyException("Default template handler '$callback' not callable");
+ }
+
+ return $this;
+ }
+
+ /**
+ * Registers a default template handler
+ *
+ * @param callable $callback class/method name
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
+ * @throws SmartyException if $callback is not callable
+ */
+ public function registerDefaultConfigHandler($callback)
+ {
+ if (is_callable($callback)) {
+ $this->smarty->default_config_handler_func = $callback;
+ } else {
+ throw new SmartyException("Default config handler '$callback' not callable");
+ }
+
+ return $this;
+ }
+
+ /**
+ * Registers a filter function
+ *
+ * @param string $type filter type
+ * @param callback $callback
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
+ */
+ public function registerFilter($type, $callback)
+ {
+ $this->smarty->registered_filters[$type][$this->_get_filter_name($callback)] = $callback;
+ return $this;
+ }
+
+ /**
+ * Unregisters a filter function
+ *
+ * @param string $type filter type
+ * @param callback $callback
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
+ */
+ public function unregisterFilter($type, $callback)
+ {
+ $name = $this->_get_filter_name($callback);
+ if (isset($this->smarty->registered_filters[$type][$name])) {
+ unset($this->smarty->registered_filters[$type][$name]);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Return internal filter name
+ *
+ * @param callback $function_name
+ * @return string internal filter name
+ */
+ public function _get_filter_name($function_name)
+ {
+ if (is_array($function_name)) {
+ $_class_name = (is_object($function_name[0]) ?
+ get_class($function_name[0]) : $function_name[0]);
+ return $_class_name . '_' . $function_name[1];
+ } else {
+ return $function_name;
+ }
+ }
+
+ /**
+ * load a filter of specified type and name
+ *
+ * @param string $type filter type
+ * @param string $name filter name
+ * @throws SmartyException if filter could not be loaded
+ */
+ public function loadFilter($type, $name)
+ {
+ $_plugin = "smarty_{$type}filter_{$name}";
+ $_filter_name = $_plugin;
+ if ($this->smarty->loadPlugin($_plugin)) {
+ if (class_exists($_plugin, false)) {
+ $_plugin = array($_plugin, 'execute');
+ }
+ if (is_callable($_plugin)) {
+ $this->smarty->registered_filters[$type][$_filter_name] = $_plugin;
+ return true;
+ }
+ }
+ throw new SmartyException("{$type}filter \"{$name}\" not callable");
+ }
+
+ /**
+ * unload a filter of specified type and name
+ *
+ * @param string $type filter type
+ * @param string $name filter name
+ * @return Smarty_Internal_Templatebase current Smarty_Internal_Templatebase (or Smarty or Smarty_Internal_Template) instance for chaining
+ */
+ public function unloadFilter($type, $name)
+ {
+ $_filter_name = "smarty_{$type}filter_{$name}";
+ if (isset($this->smarty->registered_filters[$type][$_filter_name])) {
+ unset ($this->smarty->registered_filters[$type][$_filter_name]);
+ }
+
+ return $this;
+ }
+
+ /**
+ * preg_replace callback to convert camelcase getter/setter to underscore property names
+ *
+ * @param string $match match string
+ * @return string replacemant
+ */
+ private function replaceCamelcase($match) {
+ return "_" . strtolower($match[1]);
+ }
+
+ /**
+ * Handle unknown class methods
+ *
+ * @param string $name unknown method-name
+ * @param array $args argument array
+ */
+ public function __call($name, $args)
+ {
+ static $_prefixes = array('set' => true, 'get' => true);
+ static $_resolved_property_name = array();
+ static $_resolved_property_source = array();
+
+ // method of Smarty object?
+ if (method_exists($this->smarty, $name)) {
+ return call_user_func_array(array($this->smarty, $name), $args);
+ }
+ // see if this is a set/get for a property
+ $first3 = strtolower(substr($name, 0, 3));
+ if (isset($_prefixes[$first3]) && isset($name[3]) && $name[3] !== '_') {
+ if (isset($_resolved_property_name[$name])) {
+ $property_name = $_resolved_property_name[$name];
+ } else {
+ // try to keep case correct for future PHP 6.0 case-sensitive class methods
+ // lcfirst() not available < PHP 5.3.0, so improvise
+ $property_name = strtolower(substr($name, 3, 1)) . substr($name, 4);
+ // convert camel case to underscored name
+ $property_name = preg_replace_callback('/([A-Z])/', array($this,'replaceCamelcase'), $property_name);
+ $_resolved_property_name[$name] = $property_name;
+ }
+ if (isset($_resolved_property_source[$property_name])) {
+ $_is_this = $_resolved_property_source[$property_name];
+ } else {
+ $_is_this = null;
+ if (property_exists($this, $property_name)) {
+ $_is_this = true;
+ } else if (property_exists($this->smarty, $property_name)) {
+ $_is_this = false;
+ }
+ $_resolved_property_source[$property_name] = $_is_this;
+ }
+ if ($_is_this) {
+ if ($first3 == 'get')
+ return $this->$property_name;
+ else
+ return $this->$property_name = $args[0];
+ } else if ($_is_this === false) {
+ if ($first3 == 'get')
+ return $this->smarty->$property_name;
+ else
+ return $this->smarty->$property_name = $args[0];
+ } else {
+ throw new SmartyException("property '$property_name' does not exist.");
+ return false;
+ }
+ }
+ if ($name == 'Smarty') {
+ throw new SmartyException("PHP5 requires you to call __construct() instead of Smarty()");
+ }
+ // must be unknown
+ throw new SmartyException("Call of unknown method '$name'.");
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php b/include/smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php
new file mode 100644
index 000000000..c745d294d
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php
@@ -0,0 +1,670 @@
+<?php
+
+/**
+ * Smarty Internal Plugin Smarty Template Compiler Base
+ *
+ * This file contains the basic classes and methodes for compiling Smarty templates with lexer/parser
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
+
+/**
+ * Main abstract compiler class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
+abstract class Smarty_Internal_TemplateCompilerBase {
+
+ /**
+ * hash for nocache sections
+ *
+ * @var mixed
+ */
+ private $nocache_hash = null;
+
+ /**
+ * suppress generation of nocache code
+ *
+ * @var bool
+ */
+ public $suppressNocacheProcessing = false;
+
+ /**
+ * suppress generation of merged template code
+ *
+ * @var bool
+ */
+ public $suppressMergedTemplates = false;
+
+ /**
+ * compile tag objects
+ *
+ * @var array
+ */
+ public static $_tag_objects = array();
+
+ /**
+ * tag stack
+ *
+ * @var array
+ */
+ public $_tag_stack = array();
+
+ /**
+ * current template
+ *
+ * @var Smarty_Internal_Template
+ */
+ public $template = null;
+
+ /**
+ * merged templates
+ *
+ * @var array
+ */
+ public $merged_templates = array();
+
+ /**
+ * flag when compiling {block}
+ *
+ * @var bool
+ */
+ public $inheritance = false;
+
+ /**
+ * plugins loaded by default plugin handler
+ *
+ * @var array
+ */
+ public $default_handler_plugins = array();
+
+ /**
+ * saved preprocessed modifier list
+ *
+ * @var mixed
+ */
+ public $default_modifier_list = null;
+
+ /**
+ * force compilation of complete template as nocache
+ * @var boolean
+ */
+ public $forceNocache = false;
+
+ /**
+ * suppress Smarty header code in compiled template
+ * @var bool
+ */
+ public $suppressHeader = false;
+
+ /**
+ * suppress template property header code in compiled template
+ * @var bool
+ */
+ public $suppressTemplatePropertyHeader = false;
+
+ /**
+ * flag if compiled template file shall we written
+ * @var bool
+ */
+ public $write_compiled_code = true;
+
+ /**
+ * flag if currently a template function is compiled
+ * @var bool
+ */
+ public $compiles_template_function = false;
+
+ /**
+ * called subfuntions from template function
+ * @var array
+ */
+ public $called_functions = array();
+
+ /**
+ * flags for used modifier plugins
+ * @var array
+ */
+ public $modifier_plugins = array();
+
+ /**
+ * type of already compiled modifier
+ * @var array
+ */
+ public $known_modifier_type = array();
+
+ /**
+ * Methode to compile a Smarty template
+ *
+ * @param mixed $_content template source
+ * @return bool true if compiling succeeded, false if it failed
+ */
+ abstract protected function doCompile($_content);
+
+ /**
+ * Initialize compiler
+ */
+ public function __construct() {
+ $this->nocache_hash = str_replace('.', '-', uniqid(rand(), true));
+ }
+
+ /**
+ * Method to compile a Smarty template
+ *
+ * @param Smarty_Internal_Template $template template object to compile
+ * @return bool true if compiling succeeded, false if it failed
+ */
+ public function compileTemplate(Smarty_Internal_Template $template) {
+ if (empty($template->properties['nocache_hash'])) {
+ $template->properties['nocache_hash'] = $this->nocache_hash;
+ } else {
+ $this->nocache_hash = $template->properties['nocache_hash'];
+ }
+ // flag for nochache sections
+ $this->nocache = false;
+ $this->tag_nocache = false;
+ // save template object in compiler class
+ $this->template = $template;
+ // reset has noche code flag
+ $this->template->has_nocache_code = false;
+ $this->smarty->_current_file = $saved_filepath = $this->template->source->filepath;
+ // template header code
+ $template_header = '';
+ if (!$this->suppressHeader) {
+ $template_header .= "<?php /* Smarty version " . Smarty::SMARTY_VERSION . ", created on " . strftime("%Y-%m-%d %H:%M:%S") . "\n";
+ $template_header .= " compiled from \"" . $this->template->source->filepath . "\" */ ?>\n";
+ }
+
+ do {
+ // flag for aborting current and start recompile
+ $this->abort_and_recompile = false;
+ // get template source
+ $_content = $template->source->content;
+ // run prefilter if required
+ if (isset($this->smarty->autoload_filters['pre']) || isset($this->smarty->registered_filters['pre'])) {
+ $_content = Smarty_Internal_Filter_Handler::runFilter('pre', $_content, $template);
+ }
+ // on empty template just return header
+ if ($_content == '') {
+ if ($this->suppressTemplatePropertyHeader) {
+ $code = '';
+ } else {
+ $code = $template_header . $template->createTemplateCodeFrame();
+ }
+ return $code;
+ }
+ // call compiler
+ $_compiled_code = $this->doCompile($_content);
+ } while ($this->abort_and_recompile);
+ $this->template->source->filepath = $saved_filepath;
+ // free memory
+ unset($this->parser->root_buffer, $this->parser->current_buffer, $this->parser, $this->lex, $this->template);
+ self::$_tag_objects = array();
+ // return compiled code to template object
+ $merged_code = '';
+ if (!$this->suppressMergedTemplates && !empty($this->merged_templates)) {
+ foreach ($this->merged_templates as $code) {
+ $merged_code .= $code;
+ }
+ // run postfilter if required on merged code
+ if (isset($this->smarty->autoload_filters['post']) || isset($this->smarty->registered_filters['post'])) {
+ $merged_code = Smarty_Internal_Filter_Handler::runFilter('post', $merged_code, $template);
+ }
+ }
+ // run postfilter if required on compiled template code
+ if (isset($this->smarty->autoload_filters['post']) || isset($this->smarty->registered_filters['post'])) {
+ $_compiled_code = Smarty_Internal_Filter_Handler::runFilter('post', $_compiled_code, $template);
+ }
+ if ($this->suppressTemplatePropertyHeader) {
+ $code = $_compiled_code . $merged_code;
+ } else {
+ $code = $template_header . $template->createTemplateCodeFrame($_compiled_code) . $merged_code;
+ }
+ // unset content because template inheritance could have replace source with parent code
+ unset ($template->source->content);
+ return $code;
+ }
+
+ /**
+ * Compile Tag
+ *
+ * This is a call back from the lexer/parser
+ * It executes the required compile plugin for the Smarty tag
+ *
+ * @param string $tag tag name
+ * @param array $args array with tag attributes
+ * @param array $parameter array with compilation parameter
+ * @return string compiled code
+ */
+ public function compileTag($tag, $args, $parameter = array()) {
+ // $args contains the attributes parsed and compiled by the lexer/parser
+ // assume that tag does compile into code, but creates no HTML output
+ $this->has_code = true;
+ $this->has_output = false;
+ // log tag/attributes
+ if (isset($this->smarty->get_used_tags) && $this->smarty->get_used_tags) {
+ $this->template->used_tags[] = array($tag, $args);
+ }
+ // check nocache option flag
+ if (in_array("'nocache'", $args) || in_array(array('nocache' => 'true'), $args)
+ || in_array(array('nocache' => '"true"'), $args) || in_array(array('nocache' => "'true'"), $args)) {
+ $this->tag_nocache = true;
+ }
+ // compile the smarty tag (required compile classes to compile the tag are autoloaded)
+ if (($_output = $this->callTagCompiler($tag, $args, $parameter)) === false) {
+ if (isset($this->smarty->template_functions[$tag])) {
+ // template defined by {template} tag
+ $args['_attr']['name'] = "'" . $tag . "'";
+ $_output = $this->callTagCompiler('call', $args, $parameter);
+ }
+ }
+ if ($_output !== false) {
+ if ($_output !== true) {
+ // did we get compiled code
+ if ($this->has_code) {
+ // Does it create output?
+ if ($this->has_output) {
+ $_output .= "\n";
+ }
+ // return compiled code
+ return $_output;
+ }
+ }
+ // tag did not produce compiled code
+ return '';
+ } else {
+ // map_named attributes
+ if (isset($args['_attr'])) {
+ foreach ($args['_attr'] as $key => $attribute) {
+ if (is_array($attribute)) {
+ $args = array_merge($args, $attribute);
+ }
+ }
+ }
+ // not an internal compiler tag
+ if (strlen($tag) < 6 || substr($tag, -5) != 'close') {
+ // check if tag is a registered object
+ if (isset($this->smarty->registered_objects[$tag]) && isset($parameter['object_methode'])) {
+ $methode = $parameter['object_methode'];
+ if (!in_array($methode, $this->smarty->registered_objects[$tag][3]) &&
+ (empty($this->smarty->registered_objects[$tag][1]) || in_array($methode, $this->smarty->registered_objects[$tag][1]))) {
+ return $this->callTagCompiler('private_object_function', $args, $parameter, $tag, $methode);
+ } elseif (in_array($methode, $this->smarty->registered_objects[$tag][3])) {
+ return $this->callTagCompiler('private_object_block_function', $args, $parameter, $tag, $methode);
+ } else {
+ return $this->trigger_template_error('unallowed methode "' . $methode . '" in registered object "' . $tag . '"', $this->lex->taglineno);
+ }
+ }
+ // check if tag is registered
+ foreach (array(Smarty::PLUGIN_COMPILER, Smarty::PLUGIN_FUNCTION, Smarty::PLUGIN_BLOCK) as $plugin_type) {
+ if (isset($this->smarty->registered_plugins[$plugin_type][$tag])) {
+ // if compiler function plugin call it now
+ if ($plugin_type == Smarty::PLUGIN_COMPILER) {
+ $new_args = array();
+ foreach ($args as $key => $mixed) {
+ if (is_array($mixed)) {
+ $new_args = array_merge($new_args, $mixed);
+ } else {
+ $new_args[$key] = $mixed;
+ }
+ }
+ if (!$this->smarty->registered_plugins[$plugin_type][$tag][1]) {
+ $this->tag_nocache = true;
+ }
+ $function = $this->smarty->registered_plugins[$plugin_type][$tag][0];
+ if (!is_array($function)) {
+ return $function($new_args, $this);
+ } else if (is_object($function[0])) {
+ return $this->smarty->registered_plugins[$plugin_type][$tag][0][0]->$function[1]($new_args, $this);
+ } else {
+ return call_user_func_array($function, array($new_args, $this));
+ }
+ }
+ // compile registered function or block function
+ if ($plugin_type == Smarty::PLUGIN_FUNCTION || $plugin_type == Smarty::PLUGIN_BLOCK) {
+ return $this->callTagCompiler('private_registered_' . $plugin_type, $args, $parameter, $tag);
+ }
+ }
+ }
+ // check plugins from plugins folder
+ foreach ($this->smarty->plugin_search_order as $plugin_type) {
+ if ($plugin_type == Smarty::PLUGIN_BLOCK && $this->smarty->loadPlugin('smarty_compiler_' . $tag) && (!isset($this->smarty->security_policy) || $this->smarty->security_policy->isTrustedTag($tag, $this))) {
+ $plugin = 'smarty_compiler_' . $tag;
+ if (is_callable($plugin)) {
+ // convert arguments format for old compiler plugins
+ $new_args = array();
+ foreach ($args as $key => $mixed) {
+ if (is_array($mixed)) {
+ $new_args = array_merge($new_args, $mixed);
+ } else {
+ $new_args[$key] = $mixed;
+ }
+ }
+ return $plugin($new_args, $this->smarty);
+ }
+ if (class_exists($plugin, false)) {
+ $plugin_object = new $plugin;
+ if (method_exists($plugin_object, 'compile')) {
+ return $plugin_object->compile($args, $this);
+ }
+ }
+ throw new SmartyException("Plugin \"{$tag}\" not callable");
+ } else {
+ if ($function = $this->getPlugin($tag, $plugin_type)) {
+ if (!isset($this->smarty->security_policy) || $this->smarty->security_policy->isTrustedTag($tag, $this)) {
+ return $this->callTagCompiler('private_' . $plugin_type . '_plugin', $args, $parameter, $tag, $function);
+ }
+ }
+ }
+ }
+ if (is_callable($this->smarty->default_plugin_handler_func)) {
+ $found = false;
+ // look for already resolved tags
+ foreach ($this->smarty->plugin_search_order as $plugin_type) {
+ if (isset($this->default_handler_plugins[$plugin_type][$tag])) {
+ $found = true;
+ break;
+ }
+ }
+ if (!$found) {
+ // call default handler
+ foreach ($this->smarty->plugin_search_order as $plugin_type) {
+ if ($this->getPluginFromDefaultHandler($tag, $plugin_type)) {
+ $found = true;
+ break;
+ }
+ }
+ }
+ if ($found) {
+ // if compiler function plugin call it now
+ if ($plugin_type == Smarty::PLUGIN_COMPILER) {
+ $new_args = array();
+ foreach ($args as $mixed) {
+ $new_args = array_merge($new_args, $mixed);
+ }
+ $function = $this->default_handler_plugins[$plugin_type][$tag][0];
+ if (!is_array($function)) {
+ return $function($new_args, $this);
+ } else if (is_object($function[0])) {
+ return $this->default_handler_plugins[$plugin_type][$tag][0][0]->$function[1]($new_args, $this);
+ } else {
+ return call_user_func_array($function, array($new_args, $this));
+ }
+ } else {
+ return $this->callTagCompiler('private_registered_' . $plugin_type, $args, $parameter, $tag);
+ }
+ }
+ }
+ } else {
+ // compile closing tag of block function
+ $base_tag = substr($tag, 0, -5);
+ // check if closing tag is a registered object
+ if (isset($this->smarty->registered_objects[$base_tag]) && isset($parameter['object_methode'])) {
+ $methode = $parameter['object_methode'];
+ if (in_array($methode, $this->smarty->registered_objects[$base_tag][3])) {
+ return $this->callTagCompiler('private_object_block_function', $args, $parameter, $tag, $methode);
+ } else {
+ return $this->trigger_template_error('unallowed closing tag methode "' . $methode . '" in registered object "' . $base_tag . '"', $this->lex->taglineno);
+ }
+ }
+ // registered block tag ?
+ if (isset($this->smarty->registered_plugins[Smarty::PLUGIN_BLOCK][$base_tag]) || isset($this->default_handler_plugins[Smarty::PLUGIN_BLOCK][$base_tag])) {
+ return $this->callTagCompiler('private_registered_block', $args, $parameter, $tag);
+ }
+ // block plugin?
+ if ($function = $this->getPlugin($base_tag, Smarty::PLUGIN_BLOCK)) {
+ return $this->callTagCompiler('private_block_plugin', $args, $parameter, $tag, $function);
+ }
+ // registered compiler plugin ?
+ if (isset($this->smarty->registered_plugins[Smarty::PLUGIN_COMPILER][$tag])) {
+ // if compiler function plugin call it now
+ $args = array();
+ if (!$this->smarty->registered_plugins[Smarty::PLUGIN_COMPILER][$tag][1]) {
+ $this->tag_nocache = true;
+ }
+ $function = $this->smarty->registered_plugins[Smarty::PLUGIN_COMPILER][$tag][0];
+ if (!is_array($function)) {
+ return $function($args, $this);
+ } else if (is_object($function[0])) {
+ return $this->smarty->registered_plugins[Smarty::PLUGIN_COMPILER][$tag][0][0]->$function[1]($args, $this);
+ } else {
+ return call_user_func_array($function, array($args, $this));
+ }
+ }
+ if ($this->smarty->loadPlugin('smarty_compiler_' . $tag)) {
+ $plugin = 'smarty_compiler_' . $tag;
+ if (is_callable($plugin)) {
+ return $plugin($args, $this->smarty);
+ }
+ if (class_exists($plugin, false)) {
+ $plugin_object = new $plugin;
+ if (method_exists($plugin_object, 'compile')) {
+ return $plugin_object->compile($args, $this);
+ }
+ }
+ throw new SmartyException("Plugin \"{$tag}\" not callable");
+ }
+ }
+ $this->trigger_template_error("unknown tag \"" . $tag . "\"", $this->lex->taglineno);
+ }
+ }
+
+ /**
+ * lazy loads internal compile plugin for tag and calls the compile methode
+ *
+ * compile objects cached for reuse.
+ * class name format: Smarty_Internal_Compile_TagName
+ * plugin filename format: Smarty_Internal_Tagname.php
+ *
+ * @param string $tag tag name
+ * @param array $args list of tag attributes
+ * @param mixed $param1 optional parameter
+ * @param mixed $param2 optional parameter
+ * @param mixed $param3 optional parameter
+ * @return string compiled code
+ */
+ public function callTagCompiler($tag, $args, $param1 = null, $param2 = null, $param3 = null) {
+ // re-use object if already exists
+ if (isset(self::$_tag_objects[$tag])) {
+ // compile this tag
+ return self::$_tag_objects[$tag]->compile($args, $this, $param1, $param2, $param3);
+ }
+ // lazy load internal compiler plugin
+ $class_name = 'Smarty_Internal_Compile_' . $tag;
+ if ($this->smarty->loadPlugin($class_name)) {
+ // check if tag allowed by security
+ if (!isset($this->smarty->security_policy) || $this->smarty->security_policy->isTrustedTag($tag, $this)) {
+ // use plugin if found
+ self::$_tag_objects[$tag] = new $class_name;
+ // compile this tag
+ return self::$_tag_objects[$tag]->compile($args, $this, $param1, $param2, $param3);
+ }
+ }
+ // no internal compile plugin for this tag
+ return false;
+ }
+
+ /**
+ * Check for plugins and return function name
+ *
+ * @param string $pugin_name name of plugin or function
+ * @param string $plugin_type type of plugin
+ * @return string call name of function
+ */
+ public function getPlugin($plugin_name, $plugin_type) {
+ $function = null;
+ if ($this->template->caching && ($this->nocache || $this->tag_nocache)) {
+ if (isset($this->template->required_plugins['nocache'][$plugin_name][$plugin_type])) {
+ $function = $this->template->required_plugins['nocache'][$plugin_name][$plugin_type]['function'];
+ } else if (isset($this->template->required_plugins['compiled'][$plugin_name][$plugin_type])) {
+ $this->template->required_plugins['nocache'][$plugin_name][$plugin_type] = $this->template->required_plugins['compiled'][$plugin_name][$plugin_type];
+ $function = $this->template->required_plugins['nocache'][$plugin_name][$plugin_type]['function'];
+ }
+ } else {
+ if (isset($this->template->required_plugins['compiled'][$plugin_name][$plugin_type])) {
+ $function = $this->template->required_plugins['compiled'][$plugin_name][$plugin_type]['function'];
+ } else if (isset($this->template->required_plugins['nocache'][$plugin_name][$plugin_type])) {
+ $this->template->required_plugins['compiled'][$plugin_name][$plugin_type] = $this->template->required_plugins['nocache'][$plugin_name][$plugin_type];
+ $function = $this->template->required_plugins['compiled'][$plugin_name][$plugin_type]['function'];
+ }
+ }
+ if (isset($function)) {
+ if ($plugin_type == 'modifier') {
+ $this->modifier_plugins[$plugin_name] = true;
+ }
+ return $function;
+ }
+ // loop through plugin dirs and find the plugin
+ $function = 'smarty_' . $plugin_type . '_' . $plugin_name;
+ $file = $this->smarty->loadPlugin($function, false);
+
+ if (is_string($file)) {
+ if ($this->template->caching && ($this->nocache || $this->tag_nocache)) {
+ $this->template->required_plugins['nocache'][$plugin_name][$plugin_type]['file'] = $file;
+ $this->template->required_plugins['nocache'][$plugin_name][$plugin_type]['function'] = $function;
+ } else {
+ $this->template->required_plugins['compiled'][$plugin_name][$plugin_type]['file'] = $file;
+ $this->template->required_plugins['compiled'][$plugin_name][$plugin_type]['function'] = $function;
+ }
+ if ($plugin_type == 'modifier') {
+ $this->modifier_plugins[$plugin_name] = true;
+ }
+ return $function;
+ }
+ if (is_callable($function)) {
+ // plugin function is defined in the script
+ return $function;
+ }
+ return false;
+ }
+
+ /**
+ * Check for plugins by default plugin handler
+ *
+ * @param string $tag name of tag
+ * @param string $plugin_type type of plugin
+ * @return boolean true if found
+ */
+ public function getPluginFromDefaultHandler($tag, $plugin_type) {
+ $callback = null;
+ $script = null;
+ $cacheable = true;
+ $result = call_user_func_array(
+ $this->smarty->default_plugin_handler_func, array($tag, $plugin_type, $this->template, &$callback, &$script, &$cacheable)
+ );
+ if ($result) {
+ $this->tag_nocache = $this->tag_nocache || !$cacheable;
+ if ($script !== null) {
+ if (is_file($script)) {
+ if ($this->template->caching && ($this->nocache || $this->tag_nocache)) {
+ $this->template->required_plugins['nocache'][$tag][$plugin_type]['file'] = $script;
+ $this->template->required_plugins['nocache'][$tag][$plugin_type]['function'] = $callback;
+ } else {
+ $this->template->required_plugins['compiled'][$tag][$plugin_type]['file'] = $script;
+ $this->template->required_plugins['compiled'][$tag][$plugin_type]['function'] = $callback;
+ }
+ include_once $script;
+ } else {
+ $this->trigger_template_error("Default plugin handler: Returned script file \"{$script}\" for \"{$tag}\" not found");
+ }
+ }
+ if (!is_string($callback) && !(is_array($callback) && is_string($callback[0]) && is_string($callback[1]))) {
+ $this->trigger_template_error("Default plugin handler: Returned callback for \"{$tag}\" must be a static function name or array of class and function name");
+ }
+ if (is_callable($callback)) {
+ $this->default_handler_plugins[$plugin_type][$tag] = array($callback, true, array());
+ return true;
+ } else {
+ $this->trigger_template_error("Default plugin handler: Returned callback for \"{$tag}\" not callable");
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Inject inline code for nocache template sections
+ *
+ * This method gets the content of each template element from the parser.
+ * If the content is compiled code and it should be not cached the code is injected
+ * into the rendered output.
+ *
+ * @param string $content content of template element
+ * @param boolean $is_code true if content is compiled code
+ * @return string content
+ */
+ public function processNocacheCode($content, $is_code) {
+ // If the template is not evaluated and we have a nocache section and or a nocache tag
+ if ($is_code && !empty($content)) {
+ // generate replacement code
+ if ((!($this->template->source->recompiled) || $this->forceNocache) && $this->template->caching && !$this->suppressNocacheProcessing &&
+ ($this->nocache || $this->tag_nocache || $this->forceNocache == 2)) {
+ $this->template->has_nocache_code = true;
+ $_output = addcslashes($content,'\'\\');
+ $_output = str_replace("^#^", "'", $_output);
+ $_output = "<?php echo '/*%%SmartyNocache:{$this->nocache_hash}%%*/" . $_output . "/*/%%SmartyNocache:{$this->nocache_hash}%%*/';?>\n";
+ // make sure we include modifer plugins for nocache code
+ foreach ($this->modifier_plugins as $plugin_name => $dummy) {
+ if (isset($this->template->required_plugins['compiled'][$plugin_name]['modifier'])) {
+ $this->template->required_plugins['nocache'][$plugin_name]['modifier'] = $this->template->required_plugins['compiled'][$plugin_name]['modifier'];
+ }
+ }
+ } else {
+ $_output = $content;
+ }
+ } else {
+ $_output = $content;
+ }
+ $this->modifier_plugins = array();
+ $this->suppressNocacheProcessing = false;
+ $this->tag_nocache = false;
+ return $_output;
+ }
+
+ /**
+ * display compiler error messages without dying
+ *
+ * If parameter $args is empty it is a parser detected syntax error.
+ * In this case the parser is called to obtain information about expected tokens.
+ *
+ * If parameter $args contains a string this is used as error message
+ *
+ * @param string $args individual error message or null
+ * @param string $line line-number
+ * @throws SmartyCompilerException when an unexpected token is found
+ */
+ public function trigger_template_error($args = null, $line = null) {
+ // get template source line which has error
+ if (!isset($line)) {
+ $line = $this->lex->line;
+ }
+ $match = preg_split("/\n/", $this->lex->data);
+ $error_text = 'Syntax Error in template "' . $this->template->source->filepath . '" on line ' . $line . ' "' . htmlspecialchars(trim(preg_replace('![\t\r\n]+!', ' ', $match[$line - 1]))) . '" ';
+ if (isset($args)) {
+ // individual error message
+ $error_text .= $args;
+ } else {
+ // expected token from parser
+ $error_text .= ' - Unexpected "' . $this->lex->value . '"';
+ if (count($this->parser->yy_get_expected_tokens($this->parser->yymajor)) <= 4) {
+ foreach ($this->parser->yy_get_expected_tokens($this->parser->yymajor) as $token) {
+ $exp_token = $this->parser->yyTokenName[$token];
+ if (isset($this->lex->smarty_token_names[$exp_token])) {
+ // token type from lexer
+ $expect[] = '"' . $this->lex->smarty_token_names[$exp_token] . '"';
+ } else {
+ // otherwise internal token name
+ $expect[] = $this->parser->yyTokenName[$token];
+ }
+ }
+ $error_text .= ', expected one of: ' . implode(' , ', $expect);
+ }
+ }
+ throw new SmartyCompilerException($error_text);
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_templatelexer.php b/include/smarty/libs/sysplugins/smarty_internal_templatelexer.php
new file mode 100644
index 000000000..a7d5fa9a5
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_templatelexer.php
@@ -0,0 +1,1203 @@
+<?php
+/**
+* Smarty Internal Plugin Templatelexer
+*
+* This is the lexer to break the template source into tokens
+* @package Smarty
+* @subpackage Compiler
+* @author Uwe Tews
+*/
+/**
+* Smarty Internal Plugin Templatelexer
+*/
+class Smarty_Internal_Templatelexer
+{
+ public $data;
+ public $counter;
+ public $token;
+ public $value;
+ public $node;
+ public $line;
+ public $taglineno;
+ public $state = 1;
+ private $heredoc_id_stack = Array();
+ public $smarty_token_names = array ( // Text for parser error messages
+ 'IDENTITY' => '===',
+ 'NONEIDENTITY' => '!==',
+ 'EQUALS' => '==',
+ 'NOTEQUALS' => '!=',
+ 'GREATEREQUAL' => '(>=,ge)',
+ 'LESSEQUAL' => '(<=,le)',
+ 'GREATERTHAN' => '(>,gt)',
+ 'LESSTHAN' => '(<,lt)',
+ 'MOD' => '(%,mod)',
+ 'NOT' => '(!,not)',
+ 'LAND' => '(&&,and)',
+ 'LOR' => '(||,or)',
+ 'LXOR' => 'xor',
+ 'OPENP' => '(',
+ 'CLOSEP' => ')',
+ 'OPENB' => '[',
+ 'CLOSEB' => ']',
+ 'PTR' => '->',
+ 'APTR' => '=>',
+ 'EQUAL' => '=',
+ 'NUMBER' => 'number',
+ 'UNIMATH' => '+" , "-',
+ 'MATH' => '*" , "/" , "%',
+ 'INCDEC' => '++" , "--',
+ 'SPACE' => ' ',
+ 'DOLLAR' => '$',
+ 'SEMICOLON' => ';',
+ 'COLON' => ':',
+ 'DOUBLECOLON' => '::',
+ 'AT' => '@',
+ 'HATCH' => '#',
+ 'QUOTE' => '"',
+ 'BACKTICK' => '`',
+ 'VERT' => '|',
+ 'DOT' => '.',
+ 'COMMA' => '","',
+ 'ANDSYM' => '"&"',
+ 'QMARK' => '"?"',
+ 'ID' => 'identifier',
+ 'TEXT' => 'text',
+ 'FAKEPHPSTARTTAG' => 'Fake PHP start tag',
+ 'PHPSTARTTAG' => 'PHP start tag',
+ 'PHPENDTAG' => 'PHP end tag',
+ 'LITERALSTART' => 'Literal start',
+ 'LITERALEND' => 'Literal end',
+ 'LDELSLASH' => 'closing tag',
+ 'COMMENT' => 'comment',
+ 'AS' => 'as',
+ 'TO' => 'to',
+ );
+
+
+ function __construct($data,$compiler)
+ {
+// $this->data = preg_replace("/(\r\n|\r|\n)/", "\n", $data);
+ $this->data = $data;
+ $this->counter = 0;
+ $this->line = 1;
+ $this->smarty = $compiler->smarty;
+ $this->compiler = $compiler;
+ $this->ldel = preg_quote($this->smarty->left_delimiter,'/');
+ $this->ldel_length = strlen($this->smarty->left_delimiter);
+ $this->rdel = preg_quote($this->smarty->right_delimiter,'/');
+ $this->rdel_length = strlen($this->smarty->right_delimiter);
+ $this->smarty_token_names['LDEL'] = $this->smarty->left_delimiter;
+ $this->smarty_token_names['RDEL'] = $this->smarty->right_delimiter;
+ $this->mbstring_overload = ini_get('mbstring.func_overload') & 2;
+ }
+
+
+ private $_yy_state = 1;
+ private $_yy_stack = array();
+
+ function yylex()
+ {
+ return $this->{'yylex' . $this->_yy_state}();
+ }
+
+ function yypushstate($state)
+ {
+ array_push($this->_yy_stack, $this->_yy_state);
+ $this->_yy_state = $state;
+ }
+
+ function yypopstate()
+ {
+ $this->_yy_state = array_pop($this->_yy_stack);
+ }
+
+ function yybegin($state)
+ {
+ $this->_yy_state = $state;
+ }
+
+
+
+ function yylex1()
+ {
+ $tokenMap = array (
+ 1 => 0,
+ 2 => 0,
+ 3 => 1,
+ 5 => 0,
+ 6 => 0,
+ 7 => 0,
+ 8 => 0,
+ 9 => 0,
+ 10 => 0,
+ 11 => 1,
+ 13 => 0,
+ 14 => 0,
+ 15 => 0,
+ 16 => 0,
+ 17 => 0,
+ 18 => 0,
+ 19 => 0,
+ 20 => 0,
+ 21 => 0,
+ 22 => 0,
+ 23 => 0,
+ 24 => 0,
+ );
+ if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
+ return false; // end of input
+ }
+ $yy_global_pattern = "/\G(".$this->ldel."[$]smarty\\.block\\.child".$this->rdel.")|\G(\\{\\})|\G(".$this->ldel."\\*([\S\s]*?)\\*".$this->rdel.")|\G(".$this->ldel."strip".$this->rdel.")|\G(".$this->ldel."\\s{1,}strip\\s{1,}".$this->rdel.")|\G(".$this->ldel."\/strip".$this->rdel.")|\G(".$this->ldel."\\s{1,}\/strip\\s{1,}".$this->rdel.")|\G(".$this->ldel."\\s*literal\\s*".$this->rdel.")|\G(".$this->ldel."\\s{1,}\/)|\G(".$this->ldel."\\s*(if|elseif|else if|while)\\s+)|\G(".$this->ldel."\\s*for\\s+)|\G(".$this->ldel."\\s*foreach(?![^\s]))|\G(".$this->ldel."\\s*setfilter\\s+)|\G(".$this->ldel."\\s{1,})|\G(".$this->ldel."\/)|\G(".$this->ldel.")|\G(<\\?(?:php\\w+|=|[a-zA-Z]+)?)|\G(\\?>)|\G(".$this->rdel.")|\G(<%)|\G(%>)|\G([\S\s])/iS";
+
+ do {
+ if ($this->mbstring_overload ? preg_match($yy_global_pattern, mb_substr($this->data, $this->counter,2000000000,'latin1'), $yymatches) : preg_match($yy_global_pattern,$this->data, $yymatches, null, $this->counter)) {
+ $yysubmatches = $yymatches;
+ $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
+ if (!count($yymatches)) {
+ throw new Exception('Error: lexing failed because a rule matched' .
+ ' an empty string. Input "' . substr($this->data,
+ $this->counter, 5) . '... state TEXT');
+ }
+ next($yymatches); // skip global match
+ $this->token = key($yymatches); // token number
+ if ($tokenMap[$this->token]) {
+ // extract sub-patterns for passing to lex function
+ $yysubmatches = array_slice($yysubmatches, $this->token + 1,
+ $tokenMap[$this->token]);
+ } else {
+ $yysubmatches = array();
+ }
+ $this->value = current($yymatches); // token value
+ $r = $this->{'yy_r1_' . $this->token}($yysubmatches);
+ if ($r === null) {
+ $this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
+ $this->line += substr_count($this->value, "\n");
+ // accept this token
+ return true;
+ } elseif ($r === true) {
+ // we have changed state
+ // process this token in the new state
+ return $this->yylex();
+ } elseif ($r === false) {
+ $this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
+ $this->line += substr_count($this->value, "\n");
+ if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
+ return false; // end of input
+ }
+ // skip this token
+ continue;
+ } } else {
+ throw new Exception('Unexpected input at line' . $this->line .
+ ': ' . $this->data[$this->counter]);
+ }
+ break;
+ } while (true);
+
+ } // end function
+
+
+ const TEXT = 1;
+ function yy_r1_1($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_SMARTYBLOCKCHILD;
+ }
+ function yy_r1_2($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+ }
+ function yy_r1_3($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_COMMENT;
+ }
+ function yy_r1_5($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_STRIPON;
+ }
+ function yy_r1_6($yy_subpatterns)
+ {
+
+ if ($this->smarty->auto_literal) {
+ $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+ } else {
+ $this->token = Smarty_Internal_Templateparser::TP_STRIPON;
+ }
+ }
+ function yy_r1_7($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_STRIPOFF;
+ }
+ function yy_r1_8($yy_subpatterns)
+ {
+
+ if ($this->smarty->auto_literal) {
+ $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+ } else {
+ $this->token = Smarty_Internal_Templateparser::TP_STRIPOFF;
+ }
+ }
+ function yy_r1_9($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_LITERALSTART;
+ $this->yypushstate(self::LITERAL);
+ }
+ function yy_r1_10($yy_subpatterns)
+ {
+
+ if ($this->smarty->auto_literal) {
+ $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+ } else {
+ $this->token = Smarty_Internal_Templateparser::TP_LDELSLASH;
+ $this->yypushstate(self::SMARTY);
+ $this->taglineno = $this->line;
+ }
+ }
+ function yy_r1_11($yy_subpatterns)
+ {
+
+ if ($this->smarty->auto_literal && trim(substr($this->value,$this->ldel_length,1)) == '') {
+ $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+ } else {
+ $this->token = Smarty_Internal_Templateparser::TP_LDELIF;
+ $this->yypushstate(self::SMARTY);
+ $this->taglineno = $this->line;
+ }
+ }
+ function yy_r1_13($yy_subpatterns)
+ {
+
+ if ($this->smarty->auto_literal && trim(substr($this->value,$this->ldel_length,1)) == '') {
+ $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+ } else {
+ $this->token = Smarty_Internal_Templateparser::TP_LDELFOR;
+ $this->yypushstate(self::SMARTY);
+ $this->taglineno = $this->line;
+ }
+ }
+ function yy_r1_14($yy_subpatterns)
+ {
+
+ if ($this->smarty->auto_literal && trim(substr($this->value,$this->ldel_length,1)) == '') {
+ $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+ } else {
+ $this->token = Smarty_Internal_Templateparser::TP_LDELFOREACH;
+ $this->yypushstate(self::SMARTY);
+ $this->taglineno = $this->line;
+ }
+ }
+ function yy_r1_15($yy_subpatterns)
+ {
+
+ if ($this->smarty->auto_literal && trim(substr($this->value,$this->ldel_length,1)) == '') {
+ $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+ } else {
+ $this->token = Smarty_Internal_Templateparser::TP_LDELSETFILTER;
+ $this->yypushstate(self::SMARTY);
+ $this->taglineno = $this->line;
+ }
+ }
+ function yy_r1_16($yy_subpatterns)
+ {
+
+ if ($this->smarty->auto_literal) {
+ $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+ } else {
+ $this->token = Smarty_Internal_Templateparser::TP_LDEL;
+ $this->yypushstate(self::SMARTY);
+ $this->taglineno = $this->line;
+ }
+ }
+ function yy_r1_17($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_LDELSLASH;
+ $this->yypushstate(self::SMARTY);
+ $this->taglineno = $this->line;
+ }
+ function yy_r1_18($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_LDEL;
+ $this->yypushstate(self::SMARTY);
+ $this->taglineno = $this->line;
+ }
+ function yy_r1_19($yy_subpatterns)
+ {
+
+ if (in_array($this->value, Array('<?', '<?=', '<?php'))) {
+ $this->token = Smarty_Internal_Templateparser::TP_PHPSTARTTAG;
+ } elseif ($this->value == '<?xml') {
+ $this->token = Smarty_Internal_Templateparser::TP_XMLTAG;
+ } else {
+ $this->token = Smarty_Internal_Templateparser::TP_FAKEPHPSTARTTAG;
+ $this->value = substr($this->value, 0, 2);
+ }
+ }
+ function yy_r1_20($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_PHPENDTAG;
+ }
+ function yy_r1_21($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+ }
+ function yy_r1_22($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_ASPSTARTTAG;
+ }
+ function yy_r1_23($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_ASPENDTAG;
+ }
+ function yy_r1_24($yy_subpatterns)
+ {
+
+ if ($this->mbstring_overload) {
+ $to = mb_strlen($this->data,'latin1');
+ } else {
+ $to = strlen($this->data);
+ }
+ preg_match("/{$this->ldel}|<\?|\?>|<%|%>/",$this->data,$match,PREG_OFFSET_CAPTURE,$this->counter);
+ if (isset($match[0][1])) {
+ $to = $match[0][1];
+ }
+ if ($this->mbstring_overload) {
+ $this->value = mb_substr($this->data,$this->counter,$to-$this->counter,'latin1');
+ } else {
+ $this->value = substr($this->data,$this->counter,$to-$this->counter);
+ }
+ $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+ }
+
+
+ function yylex2()
+ {
+ $tokenMap = array (
+ 1 => 0,
+ 2 => 0,
+ 3 => 1,
+ 5 => 0,
+ 6 => 0,
+ 7 => 0,
+ 8 => 0,
+ 9 => 0,
+ 10 => 0,
+ 11 => 0,
+ 12 => 0,
+ 13 => 0,
+ 14 => 0,
+ 15 => 0,
+ 16 => 0,
+ 17 => 0,
+ 18 => 0,
+ 19 => 0,
+ 20 => 1,
+ 22 => 1,
+ 24 => 1,
+ 26 => 0,
+ 27 => 0,
+ 28 => 0,
+ 29 => 0,
+ 30 => 0,
+ 31 => 0,
+ 32 => 0,
+ 33 => 0,
+ 34 => 0,
+ 35 => 0,
+ 36 => 0,
+ 37 => 0,
+ 38 => 0,
+ 39 => 0,
+ 40 => 0,
+ 41 => 0,
+ 42 => 0,
+ 43 => 3,
+ 47 => 0,
+ 48 => 0,
+ 49 => 0,
+ 50 => 0,
+ 51 => 0,
+ 52 => 0,
+ 53 => 0,
+ 54 => 0,
+ 55 => 1,
+ 57 => 1,
+ 59 => 0,
+ 60 => 0,
+ 61 => 0,
+ 62 => 0,
+ 63 => 0,
+ 64 => 0,
+ 65 => 0,
+ 66 => 0,
+ 67 => 0,
+ 68 => 0,
+ 69 => 0,
+ 70 => 0,
+ 71 => 0,
+ 72 => 0,
+ 73 => 0,
+ 74 => 0,
+ 75 => 0,
+ 76 => 0,
+ 77 => 0,
+ );
+ if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
+ return false; // end of input
+ }
+ $yy_global_pattern = "/\G('[^'\\\\]*(?:\\\\.[^'\\\\]*)*')|\G(".$this->ldel."\\s{1,}\/)|\G(".$this->ldel."\\s*(if|elseif|else if|while)\\s+)|\G(".$this->ldel."\\s*for\\s+)|\G(".$this->ldel."\\s*foreach(?![^\s]))|\G(".$this->ldel."\\s{1,})|\G(\\s{1,}".$this->rdel.")|\G(".$this->ldel."\/)|\G(".$this->ldel.")|\G(".$this->rdel.")|\G(\\s+is\\s+in\\s+)|\G(\\s+as\\s+)|\G(\\s+to\\s+)|\G(\\s+step\\s+)|\G(\\s+instanceof\\s+)|\G(\\s*===\\s*)|\G(\\s*!==\\s*)|\G(\\s*==\\s*|\\s+eq\\s+)|\G(\\s*!=\\s*|\\s*<>\\s*|\\s+(ne|neq)\\s+)|\G(\\s*>=\\s*|\\s+(ge|gte)\\s+)|\G(\\s*<=\\s*|\\s+(le|lte)\\s+)|\G(\\s*>\\s*|\\s+gt\\s+)|\G(\\s*<\\s*|\\s+lt\\s+)|\G(\\s+mod\\s+)|\G(!\\s*|not\\s+)|\G(\\s*&&\\s*|\\s*and\\s+)|\G(\\s*\\|\\|\\s*|\\s*or\\s+)|\G(\\s*xor\\s+)|\G(\\s+is\\s+odd\\s+by\\s+)|\G(\\s+is\\s+not\\s+odd\\s+by\\s+)|\G(\\s+is\\s+odd)|\G(\\s+is\\s+not\\s+odd)|\G(\\s+is\\s+even\\s+by\\s+)|\G(\\s+is\\s+not\\s+even\\s+by\\s+)|\G(\\s+is\\s+even)|\G(\\s+is\\s+not\\s+even)|\G(\\s+is\\s+div\\s+by\\s+)|\G(\\s+is\\s+not\\s+div\\s+by\\s+)|\G(\\((int(eger)?|bool(ean)?|float|double|real|string|binary|array|object)\\)\\s*)|\G(\\s*\\(\\s*)|\G(\\s*\\))|\G(\\[\\s*)|\G(\\s*\\])|\G(\\s*->\\s*)|\G(\\s*=>\\s*)|\G(\\s*=\\s*)|\G(\\+\\+|--)|\G(\\s*(\\+|-)\\s*)|\G(\\s*(\\*|\/|%)\\s*)|\G(\\$)|\G(\\s*;)|\G(::)|\G(\\s*:\\s*)|\G(@)|\G(#)|\G(\")|\G(`)|\G(\\|)|\G(\\.)|\G(\\s*,\\s*)|\G(\\s*&\\s*)|\G(\\s*\\?\\s*)|\G(0[xX][0-9a-fA-F]+)|\G(\\s+[0-9]*[a-zA-Z_][a-zA-Z0-9_\-:]*\\s*=\\s*)|\G([0-9]*[a-zA-Z_]\\w*)|\G(\\d+)|\G(\\s+)|\G([\S\s])/iS";
+
+ do {
+ if ($this->mbstring_overload ? preg_match($yy_global_pattern, mb_substr($this->data, $this->counter,2000000000,'latin1'), $yymatches) : preg_match($yy_global_pattern,$this->data, $yymatches, null, $this->counter)) {
+ $yysubmatches = $yymatches;
+ $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
+ if (!count($yymatches)) {
+ throw new Exception('Error: lexing failed because a rule matched' .
+ ' an empty string. Input "' . substr($this->data,
+ $this->counter, 5) . '... state SMARTY');
+ }
+ next($yymatches); // skip global match
+ $this->token = key($yymatches); // token number
+ if ($tokenMap[$this->token]) {
+ // extract sub-patterns for passing to lex function
+ $yysubmatches = array_slice($yysubmatches, $this->token + 1,
+ $tokenMap[$this->token]);
+ } else {
+ $yysubmatches = array();
+ }
+ $this->value = current($yymatches); // token value
+ $r = $this->{'yy_r2_' . $this->token}($yysubmatches);
+ if ($r === null) {
+ $this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
+ $this->line += substr_count($this->value, "\n");
+ // accept this token
+ return true;
+ } elseif ($r === true) {
+ // we have changed state
+ // process this token in the new state
+ return $this->yylex();
+ } elseif ($r === false) {
+ $this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
+ $this->line += substr_count($this->value, "\n");
+ if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
+ return false; // end of input
+ }
+ // skip this token
+ continue;
+ } } else {
+ throw new Exception('Unexpected input at line' . $this->line .
+ ': ' . $this->data[$this->counter]);
+ }
+ break;
+ } while (true);
+
+ } // end function
+
+
+ const SMARTY = 2;
+ function yy_r2_1($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_SINGLEQUOTESTRING;
+ }
+ function yy_r2_2($yy_subpatterns)
+ {
+
+ if ($this->smarty->auto_literal) {
+ $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+ } else {
+ $this->token = Smarty_Internal_Templateparser::TP_LDELSLASH;
+ $this->yypushstate(self::SMARTY);
+ $this->taglineno = $this->line;
+ }
+ }
+ function yy_r2_3($yy_subpatterns)
+ {
+
+ if ($this->smarty->auto_literal && trim(substr($this->value,$this->ldel_length,1)) == '') {
+ $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+ } else {
+ $this->token = Smarty_Internal_Templateparser::TP_LDELIF;
+ $this->yypushstate(self::SMARTY);
+ $this->taglineno = $this->line;
+ }
+ }
+ function yy_r2_5($yy_subpatterns)
+ {
+
+ if ($this->smarty->auto_literal && trim(substr($this->value,$this->ldel_length,1)) == '') {
+ $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+ } else {
+ $this->token = Smarty_Internal_Templateparser::TP_LDELFOR;
+ $this->yypushstate(self::SMARTY);
+ $this->taglineno = $this->line;
+ }
+ }
+ function yy_r2_6($yy_subpatterns)
+ {
+
+ if ($this->smarty->auto_literal && trim(substr($this->value,$this->ldel_length,1)) == '') {
+ $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+ } else {
+ $this->token = Smarty_Internal_Templateparser::TP_LDELFOREACH;
+ $this->yypushstate(self::SMARTY);
+ $this->taglineno = $this->line;
+ }
+ }
+ function yy_r2_7($yy_subpatterns)
+ {
+
+ if ($this->smarty->auto_literal) {
+ $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+ } else {
+ $this->token = Smarty_Internal_Templateparser::TP_LDEL;
+ $this->yypushstate(self::SMARTY);
+ $this->taglineno = $this->line;
+ }
+ }
+ function yy_r2_8($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_RDEL;
+ $this->yypopstate();
+ }
+ function yy_r2_9($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_LDELSLASH;
+ $this->yypushstate(self::SMARTY);
+ $this->taglineno = $this->line;
+ }
+ function yy_r2_10($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_LDEL;
+ $this->yypushstate(self::SMARTY);
+ $this->taglineno = $this->line;
+ }
+ function yy_r2_11($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_RDEL;
+ $this->yypopstate();
+ }
+ function yy_r2_12($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_ISIN;
+ }
+ function yy_r2_13($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_AS;
+ }
+ function yy_r2_14($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_TO;
+ }
+ function yy_r2_15($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_STEP;
+ }
+ function yy_r2_16($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_INSTANCEOF;
+ }
+ function yy_r2_17($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_IDENTITY;
+ }
+ function yy_r2_18($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_NONEIDENTITY;
+ }
+ function yy_r2_19($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_EQUALS;
+ }
+ function yy_r2_20($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_NOTEQUALS;
+ }
+ function yy_r2_22($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_GREATEREQUAL;
+ }
+ function yy_r2_24($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_LESSEQUAL;
+ }
+ function yy_r2_26($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_GREATERTHAN;
+ }
+ function yy_r2_27($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_LESSTHAN;
+ }
+ function yy_r2_28($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_MOD;
+ }
+ function yy_r2_29($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_NOT;
+ }
+ function yy_r2_30($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_LAND;
+ }
+ function yy_r2_31($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_LOR;
+ }
+ function yy_r2_32($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_LXOR;
+ }
+ function yy_r2_33($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_ISODDBY;
+ }
+ function yy_r2_34($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_ISNOTODDBY;
+ }
+ function yy_r2_35($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_ISODD;
+ }
+ function yy_r2_36($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_ISNOTODD;
+ }
+ function yy_r2_37($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_ISEVENBY;
+ }
+ function yy_r2_38($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_ISNOTEVENBY;
+ }
+ function yy_r2_39($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_ISEVEN;
+ }
+ function yy_r2_40($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_ISNOTEVEN;
+ }
+ function yy_r2_41($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_ISDIVBY;
+ }
+ function yy_r2_42($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_ISNOTDIVBY;
+ }
+ function yy_r2_43($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_TYPECAST;
+ }
+ function yy_r2_47($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_OPENP;
+ }
+ function yy_r2_48($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_CLOSEP;
+ }
+ function yy_r2_49($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_OPENB;
+ }
+ function yy_r2_50($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_CLOSEB;
+ }
+ function yy_r2_51($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_PTR;
+ }
+ function yy_r2_52($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_APTR;
+ }
+ function yy_r2_53($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_EQUAL;
+ }
+ function yy_r2_54($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_INCDEC;
+ }
+ function yy_r2_55($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_UNIMATH;
+ }
+ function yy_r2_57($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_MATH;
+ }
+ function yy_r2_59($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_DOLLAR;
+ }
+ function yy_r2_60($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_SEMICOLON;
+ }
+ function yy_r2_61($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_DOUBLECOLON;
+ }
+ function yy_r2_62($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_COLON;
+ }
+ function yy_r2_63($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_AT;
+ }
+ function yy_r2_64($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_HATCH;
+ }
+ function yy_r2_65($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_QUOTE;
+ $this->yypushstate(self::DOUBLEQUOTEDSTRING);
+ }
+ function yy_r2_66($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_BACKTICK;
+ $this->yypopstate();
+ }
+ function yy_r2_67($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_VERT;
+ }
+ function yy_r2_68($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_DOT;
+ }
+ function yy_r2_69($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_COMMA;
+ }
+ function yy_r2_70($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_ANDSYM;
+ }
+ function yy_r2_71($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_QMARK;
+ }
+ function yy_r2_72($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_HEX;
+ }
+ function yy_r2_73($yy_subpatterns)
+ {
+
+ // resolve conflicts with shorttag and right_delimiter starting with '='
+ if (substr($this->data, $this->counter + strlen($this->value) - 1, $this->rdel_length) == $this->smarty->right_delimiter) {
+ preg_match("/\s+/",$this->value,$match);
+ $this->value = $match[0];
+ $this->token = Smarty_Internal_Templateparser::TP_SPACE;
+ } else {
+ $this->token = Smarty_Internal_Templateparser::TP_ATTR;
+ }
+ }
+ function yy_r2_74($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_ID;
+ }
+ function yy_r2_75($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_INTEGER;
+ }
+ function yy_r2_76($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_SPACE;
+ }
+ function yy_r2_77($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+ }
+
+
+
+ function yylex3()
+ {
+ $tokenMap = array (
+ 1 => 0,
+ 2 => 0,
+ 3 => 0,
+ 4 => 0,
+ 5 => 0,
+ 6 => 0,
+ 7 => 0,
+ );
+ if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
+ return false; // end of input
+ }
+ $yy_global_pattern = "/\G(".$this->ldel."\\s*literal\\s*".$this->rdel.")|\G(".$this->ldel."\\s*\/literal\\s*".$this->rdel.")|\G(<\\?(?:php\\w+|=|[a-zA-Z]+)?)|\G(\\?>)|\G(<%)|\G(%>)|\G([\S\s])/iS";
+
+ do {
+ if ($this->mbstring_overload ? preg_match($yy_global_pattern, mb_substr($this->data, $this->counter,2000000000,'latin1'), $yymatches) : preg_match($yy_global_pattern,$this->data, $yymatches, null, $this->counter)) {
+ $yysubmatches = $yymatches;
+ $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
+ if (!count($yymatches)) {
+ throw new Exception('Error: lexing failed because a rule matched' .
+ ' an empty string. Input "' . substr($this->data,
+ $this->counter, 5) . '... state LITERAL');
+ }
+ next($yymatches); // skip global match
+ $this->token = key($yymatches); // token number
+ if ($tokenMap[$this->token]) {
+ // extract sub-patterns for passing to lex function
+ $yysubmatches = array_slice($yysubmatches, $this->token + 1,
+ $tokenMap[$this->token]);
+ } else {
+ $yysubmatches = array();
+ }
+ $this->value = current($yymatches); // token value
+ $r = $this->{'yy_r3_' . $this->token}($yysubmatches);
+ if ($r === null) {
+ $this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
+ $this->line += substr_count($this->value, "\n");
+ // accept this token
+ return true;
+ } elseif ($r === true) {
+ // we have changed state
+ // process this token in the new state
+ return $this->yylex();
+ } elseif ($r === false) {
+ $this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
+ $this->line += substr_count($this->value, "\n");
+ if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
+ return false; // end of input
+ }
+ // skip this token
+ continue;
+ } } else {
+ throw new Exception('Unexpected input at line' . $this->line .
+ ': ' . $this->data[$this->counter]);
+ }
+ break;
+ } while (true);
+
+ } // end function
+
+
+ const LITERAL = 3;
+ function yy_r3_1($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_LITERALSTART;
+ $this->yypushstate(self::LITERAL);
+ }
+ function yy_r3_2($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_LITERALEND;
+ $this->yypopstate();
+ }
+ function yy_r3_3($yy_subpatterns)
+ {
+
+ if (in_array($this->value, Array('<?', '<?=', '<?php'))) {
+ $this->token = Smarty_Internal_Templateparser::TP_PHPSTARTTAG;
+ } else {
+ $this->token = Smarty_Internal_Templateparser::TP_FAKEPHPSTARTTAG;
+ $this->value = substr($this->value, 0, 2);
+ }
+ }
+ function yy_r3_4($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_PHPENDTAG;
+ }
+ function yy_r3_5($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_ASPSTARTTAG;
+ }
+ function yy_r3_6($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_ASPENDTAG;
+ }
+ function yy_r3_7($yy_subpatterns)
+ {
+
+ if ($this->mbstring_overload) {
+ $to = mb_strlen($this->data,'latin1');
+ } else {
+ $to = strlen($this->data);
+ }
+ preg_match("/{$this->ldel}\/?literal{$this->rdel}|<\?|<%|\?>|%>/",$this->data,$match,PREG_OFFSET_CAPTURE,$this->counter);
+ if (isset($match[0][1])) {
+ $to = $match[0][1];
+ } else {
+ $this->compiler->trigger_template_error ("missing or misspelled literal closing tag");
+ }
+ if ($this->mbstring_overload) {
+ $this->value = mb_substr($this->data,$this->counter,$to-$this->counter,'latin1');
+ } else {
+ $this->value = substr($this->data,$this->counter,$to-$this->counter);
+ }
+ $this->token = Smarty_Internal_Templateparser::TP_LITERAL;
+ }
+
+
+ function yylex4()
+ {
+ $tokenMap = array (
+ 1 => 0,
+ 2 => 1,
+ 4 => 0,
+ 5 => 0,
+ 6 => 0,
+ 7 => 0,
+ 8 => 0,
+ 9 => 0,
+ 10 => 0,
+ 11 => 0,
+ 12 => 0,
+ 13 => 3,
+ 17 => 0,
+ );
+ if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
+ return false; // end of input
+ }
+ $yy_global_pattern = "/\G(".$this->ldel."\\s{1,}\/)|\G(".$this->ldel."\\s*(if|elseif|else if|while)\\s+)|\G(".$this->ldel."\\s*for\\s+)|\G(".$this->ldel."\\s*foreach(?![^\s]))|\G(".$this->ldel."\\s{1,})|\G(".$this->ldel."\/)|\G(".$this->ldel.")|\G(\")|\G(`\\$)|\G(\\$[0-9]*[a-zA-Z_]\\w*)|\G(\\$)|\G(([^\"\\\\]*?)((?:\\\\.[^\"\\\\]*?)*?)(?=(".$this->ldel."|\\$|`\\$|\")))|\G([\S\s])/iS";
+
+ do {
+ if ($this->mbstring_overload ? preg_match($yy_global_pattern, mb_substr($this->data, $this->counter,2000000000,'latin1'), $yymatches) : preg_match($yy_global_pattern,$this->data, $yymatches, null, $this->counter)) {
+ $yysubmatches = $yymatches;
+ $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
+ if (!count($yymatches)) {
+ throw new Exception('Error: lexing failed because a rule matched' .
+ ' an empty string. Input "' . substr($this->data,
+ $this->counter, 5) . '... state DOUBLEQUOTEDSTRING');
+ }
+ next($yymatches); // skip global match
+ $this->token = key($yymatches); // token number
+ if ($tokenMap[$this->token]) {
+ // extract sub-patterns for passing to lex function
+ $yysubmatches = array_slice($yysubmatches, $this->token + 1,
+ $tokenMap[$this->token]);
+ } else {
+ $yysubmatches = array();
+ }
+ $this->value = current($yymatches); // token value
+ $r = $this->{'yy_r4_' . $this->token}($yysubmatches);
+ if ($r === null) {
+ $this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
+ $this->line += substr_count($this->value, "\n");
+ // accept this token
+ return true;
+ } elseif ($r === true) {
+ // we have changed state
+ // process this token in the new state
+ return $this->yylex();
+ } elseif ($r === false) {
+ $this->counter += ($this->mbstring_overload ? mb_strlen($this->value,'latin1'): strlen($this->value));
+ $this->line += substr_count($this->value, "\n");
+ if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
+ return false; // end of input
+ }
+ // skip this token
+ continue;
+ } } else {
+ throw new Exception('Unexpected input at line' . $this->line .
+ ': ' . $this->data[$this->counter]);
+ }
+ break;
+ } while (true);
+
+ } // end function
+
+
+ const DOUBLEQUOTEDSTRING = 4;
+ function yy_r4_1($yy_subpatterns)
+ {
+
+ if ($this->smarty->auto_literal) {
+ $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+ } else {
+ $this->token = Smarty_Internal_Templateparser::TP_LDELSLASH;
+ $this->yypushstate(self::SMARTY);
+ $this->taglineno = $this->line;
+ }
+ }
+ function yy_r4_2($yy_subpatterns)
+ {
+
+ if ($this->smarty->auto_literal && trim(substr($this->value,$this->ldel_length,1)) == '') {
+ $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+ } else {
+ $this->token = Smarty_Internal_Templateparser::TP_LDELIF;
+ $this->yypushstate(self::SMARTY);
+ $this->taglineno = $this->line;
+ }
+ }
+ function yy_r4_4($yy_subpatterns)
+ {
+
+ if ($this->smarty->auto_literal && trim(substr($this->value,$this->ldel_length,1)) == '') {
+ $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+ } else {
+ $this->token = Smarty_Internal_Templateparser::TP_LDELFOR;
+ $this->yypushstate(self::SMARTY);
+ $this->taglineno = $this->line;
+ }
+ }
+ function yy_r4_5($yy_subpatterns)
+ {
+
+ if ($this->smarty->auto_literal && trim(substr($this->value,$this->ldel_length,1)) == '') {
+ $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+ } else {
+ $this->token = Smarty_Internal_Templateparser::TP_LDELFOREACH;
+ $this->yypushstate(self::SMARTY);
+ $this->taglineno = $this->line;
+ }
+ }
+ function yy_r4_6($yy_subpatterns)
+ {
+
+ if ($this->smarty->auto_literal) {
+ $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+ } else {
+ $this->token = Smarty_Internal_Templateparser::TP_LDEL;
+ $this->yypushstate(self::SMARTY);
+ $this->taglineno = $this->line;
+ }
+ }
+ function yy_r4_7($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_LDELSLASH;
+ $this->yypushstate(self::SMARTY);
+ $this->taglineno = $this->line;
+ }
+ function yy_r4_8($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_LDEL;
+ $this->yypushstate(self::SMARTY);
+ $this->taglineno = $this->line;
+ }
+ function yy_r4_9($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_QUOTE;
+ $this->yypopstate();
+ }
+ function yy_r4_10($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_BACKTICK;
+ $this->value = substr($this->value,0,-1);
+ $this->yypushstate(self::SMARTY);
+ $this->taglineno = $this->line;
+ }
+ function yy_r4_11($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_DOLLARID;
+ }
+ function yy_r4_12($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+ }
+ function yy_r4_13($yy_subpatterns)
+ {
+
+ $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+ }
+ function yy_r4_17($yy_subpatterns)
+ {
+
+ if ($this->mbstring_overload) {
+ $to = mb_strlen($this->data,'latin1');
+ } else {
+ $to = strlen($this->data);
+ }
+ if ($this->mbstring_overload) {
+ $this->value = mb_substr($this->data,$this->counter,$to-$this->counter,'latin1');
+ } else {
+ $this->value = substr($this->data,$this->counter,$to-$this->counter);
+ }
+ $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+ }
+
+}
diff --git a/include/smarty/libs/sysplugins/smarty_internal_templateparser.php b/include/smarty/libs/sysplugins/smarty_internal_templateparser.php
new file mode 100644
index 000000000..b0393c694
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_templateparser.php
@@ -0,0 +1,3254 @@
+<?php
+/**
+* Smarty Internal Plugin Templateparser
+*
+* This is the template parser.
+* It is generated from the internal.templateparser.y file
+* @package Smarty
+* @subpackage Compiler
+* @author Uwe Tews
+*/
+
+class TP_yyToken implements ArrayAccess
+{
+ public $string = '';
+ public $metadata = array();
+
+ function __construct($s, $m = array())
+ {
+ if ($s instanceof TP_yyToken) {
+ $this->string = $s->string;
+ $this->metadata = $s->metadata;
+ } else {
+ $this->string = (string) $s;
+ if ($m instanceof TP_yyToken) {
+ $this->metadata = $m->metadata;
+ } elseif (is_array($m)) {
+ $this->metadata = $m;
+ }
+ }
+ }
+
+ function __toString()
+ {
+ return $this->_string;
+ }
+
+ function offsetExists($offset)
+ {
+ return isset($this->metadata[$offset]);
+ }
+
+ function offsetGet($offset)
+ {
+ return $this->metadata[$offset];
+ }
+
+ function offsetSet($offset, $value)
+ {
+ if ($offset === null) {
+ if (isset($value[0])) {
+ $x = ($value instanceof TP_yyToken) ?
+ $value->metadata : $value;
+ $this->metadata = array_merge($this->metadata, $x);
+ return;
+ }
+ $offset = count($this->metadata);
+ }
+ if ($value === null) {
+ return;
+ }
+ if ($value instanceof TP_yyToken) {
+ if ($value->metadata) {
+ $this->metadata[$offset] = $value->metadata;
+ }
+ } elseif ($value) {
+ $this->metadata[$offset] = $value;
+ }
+ }
+
+ function offsetUnset($offset)
+ {
+ unset($this->metadata[$offset]);
+ }
+}
+
+class TP_yyStackEntry
+{
+ public $stateno; /* The state-number */
+ public $major; /* The major token value. This is the code
+ ** number for the token at this stack level */
+ public $minor; /* The user-supplied minor token value. This
+ ** is the value of the token */
+};
+
+
+#line 12 "smarty_internal_templateparser.y"
+class Smarty_Internal_Templateparser#line 79 "smarty_internal_templateparser.php"
+{
+#line 14 "smarty_internal_templateparser.y"
+
+ const Err1 = "Security error: Call to private object member not allowed";
+ const Err2 = "Security error: Call to dynamic object member not allowed";
+ const Err3 = "PHP in template not allowed. Use SmartyBC to enable it";
+ // states whether the parse was successful or not
+ public $successful = true;
+ public $retvalue = 0;
+ private $lex;
+ private $internalError = false;
+ private $strip = false;
+
+ function __construct($lex, $compiler) {
+ $this->lex = $lex;
+ $this->compiler = $compiler;
+ $this->smarty = $this->compiler->smarty;
+ $this->template = $this->compiler->template;
+ $this->compiler->has_variable_string = false;
+ $this->compiler->prefix_code = array();
+ $this->prefix_number = 0;
+ $this->block_nesting_level = 0;
+ if ($this->security = isset($this->smarty->security_policy)) {
+ $this->php_handling = $this->smarty->security_policy->php_handling;
+ } else {
+ $this->php_handling = $this->smarty->php_handling;
+ }
+ $this->is_xml = false;
+ $this->asp_tags = (ini_get('asp_tags') != '0');
+ $this->current_buffer = $this->root_buffer = new _smarty_template_buffer($this);
+ }
+
+ public static function escape_start_tag($tag_text) {
+ $tag = preg_replace('/\A<\?(.*)\z/', '<<?php ?>?\1', $tag_text, -1 , $count); //Escape tag
+ return $tag;
+ }
+
+ public static function escape_end_tag($tag_text) {
+ return '?<?php ?>>';
+ }
+
+ public function compileVariable($variable) {
+ if (strpos($variable,'(') == 0) {
+ // not a variable variable
+ $var = trim($variable,'\'');
+ $this->compiler->tag_nocache=$this->compiler->tag_nocache|$this->template->getVariable($var, null, true, false)->nocache;
+ $this->template->properties['variables'][$var] = $this->compiler->tag_nocache|$this->compiler->nocache;
+ }
+// return '(isset($_smarty_tpl->tpl_vars['. $variable .'])?$_smarty_tpl->tpl_vars['. $variable .']->value:$_smarty_tpl->getVariable('. $variable .')->value)';
+ return '$_smarty_tpl->tpl_vars['. $variable .']->value';
+ }
+#line 132 "smarty_internal_templateparser.php"
+
+ const TP_VERT = 1;
+ const TP_COLON = 2;
+ const TP_COMMENT = 3;
+ const TP_PHPSTARTTAG = 4;
+ const TP_PHPENDTAG = 5;
+ const TP_ASPSTARTTAG = 6;
+ const TP_ASPENDTAG = 7;
+ const TP_FAKEPHPSTARTTAG = 8;
+ const TP_XMLTAG = 9;
+ const TP_TEXT = 10;
+ const TP_STRIPON = 11;
+ const TP_STRIPOFF = 12;
+ const TP_LITERALSTART = 13;
+ const TP_LITERALEND = 14;
+ const TP_LITERAL = 15;
+ const TP_LDEL = 16;
+ const TP_RDEL = 17;
+ const TP_DOLLAR = 18;
+ const TP_ID = 19;
+ const TP_EQUAL = 20;
+ const TP_PTR = 21;
+ const TP_LDELIF = 22;
+ const TP_LDELFOR = 23;
+ const TP_SEMICOLON = 24;
+ const TP_INCDEC = 25;
+ const TP_TO = 26;
+ const TP_STEP = 27;
+ const TP_LDELFOREACH = 28;
+ const TP_SPACE = 29;
+ const TP_AS = 30;
+ const TP_APTR = 31;
+ const TP_LDELSETFILTER = 32;
+ const TP_SMARTYBLOCKCHILD = 33;
+ const TP_LDELSLASH = 34;
+ const TP_ATTR = 35;
+ const TP_INTEGER = 36;
+ const TP_COMMA = 37;
+ const TP_OPENP = 38;
+ const TP_CLOSEP = 39;
+ const TP_MATH = 40;
+ const TP_UNIMATH = 41;
+ const TP_ANDSYM = 42;
+ const TP_ISIN = 43;
+ const TP_ISDIVBY = 44;
+ const TP_ISNOTDIVBY = 45;
+ const TP_ISEVEN = 46;
+ const TP_ISNOTEVEN = 47;
+ const TP_ISEVENBY = 48;
+ const TP_ISNOTEVENBY = 49;
+ const TP_ISODD = 50;
+ const TP_ISNOTODD = 51;
+ const TP_ISODDBY = 52;
+ const TP_ISNOTODDBY = 53;
+ const TP_INSTANCEOF = 54;
+ const TP_QMARK = 55;
+ const TP_NOT = 56;
+ const TP_TYPECAST = 57;
+ const TP_HEX = 58;
+ const TP_DOT = 59;
+ const TP_SINGLEQUOTESTRING = 60;
+ const TP_DOUBLECOLON = 61;
+ const TP_AT = 62;
+ const TP_HATCH = 63;
+ const TP_OPENB = 64;
+ const TP_CLOSEB = 65;
+ const TP_EQUALS = 66;
+ const TP_NOTEQUALS = 67;
+ const TP_GREATERTHAN = 68;
+ const TP_LESSTHAN = 69;
+ const TP_GREATEREQUAL = 70;
+ const TP_LESSEQUAL = 71;
+ const TP_IDENTITY = 72;
+ const TP_NONEIDENTITY = 73;
+ const TP_MOD = 74;
+ const TP_LAND = 75;
+ const TP_LOR = 76;
+ const TP_LXOR = 77;
+ const TP_QUOTE = 78;
+ const TP_BACKTICK = 79;
+ const TP_DOLLARID = 80;
+ const YY_NO_ACTION = 597;
+ const YY_ACCEPT_ACTION = 596;
+ const YY_ERROR_ACTION = 595;
+
+ const YY_SZ_ACTTAB = 2383;
+static public $yy_action = array(
+ /* 0 */ 225, 275, 263, 276, 259, 257, 260, 390, 356, 359,
+ /* 10 */ 353, 193, 18, 127, 42, 317, 381, 351, 196, 350,
+ /* 20 */ 6, 108, 24, 98, 128, 190, 134, 318, 41, 41,
+ /* 30 */ 249, 329, 231, 18, 43, 43, 317, 26, 298, 50,
+ /* 40 */ 47, 48, 44, 10, 13, 305, 306, 12, 11, 340,
+ /* 50 */ 341, 40, 20, 387, 308, 307, 309, 374, 254, 248,
+ /* 60 */ 252, 217, 193, 385, 291, 375, 376, 377, 373, 372,
+ /* 70 */ 368, 367, 369, 370, 371, 378, 379, 225, 312, 255,
+ /* 80 */ 225, 225, 118, 2, 207, 76, 135, 596, 95, 281,
+ /* 90 */ 271, 264, 2, 366, 315, 386, 461, 383, 232, 294,
+ /* 100 */ 303, 388, 313, 389, 227, 41, 144, 225, 461, 245,
+ /* 110 */ 282, 43, 218, 358, 461, 144, 50, 47, 48, 44,
+ /* 120 */ 10, 13, 305, 306, 12, 11, 340, 341, 40, 20,
+ /* 130 */ 105, 177, 522, 46, 46, 41, 19, 522, 143, 297,
+ /* 140 */ 325, 43, 375, 376, 377, 373, 372, 368, 367, 369,
+ /* 150 */ 370, 371, 378, 379, 225, 312, 293, 206, 225, 141,
+ /* 160 */ 124, 225, 54, 119, 123, 225, 459, 38, 173, 246,
+ /* 170 */ 319, 315, 386, 347, 455, 232, 294, 303, 459, 313,
+ /* 180 */ 139, 321, 41, 31, 459, 41, 41, 2, 43, 188,
+ /* 190 */ 2, 43, 43, 50, 47, 48, 44, 10, 13, 305,
+ /* 200 */ 306, 12, 11, 340, 341, 40, 20, 225, 136, 301,
+ /* 210 */ 144, 194, 350, 144, 46, 202, 206, 328, 198, 375,
+ /* 220 */ 376, 377, 373, 372, 368, 367, 369, 370, 371, 378,
+ /* 230 */ 379, 21, 9, 28, 185, 41, 318, 225, 265, 271,
+ /* 240 */ 264, 43, 206, 27, 173, 206, 50, 47, 48, 44,
+ /* 250 */ 10, 13, 305, 306, 12, 11, 340, 341, 40, 20,
+ /* 260 */ 225, 178, 18, 212, 330, 317, 17, 32, 8, 14,
+ /* 270 */ 325, 267, 375, 376, 377, 373, 372, 368, 367, 369,
+ /* 280 */ 370, 371, 378, 379, 136, 363, 363, 207, 41, 4,
+ /* 290 */ 46, 5, 131, 233, 43, 25, 186, 289, 318, 50,
+ /* 300 */ 47, 48, 44, 10, 13, 305, 306, 12, 11, 340,
+ /* 310 */ 341, 40, 20, 225, 100, 161, 18, 355, 361, 317,
+ /* 320 */ 26, 109, 360, 346, 325, 375, 376, 377, 373, 372,
+ /* 330 */ 368, 367, 369, 370, 371, 378, 379, 106, 201, 172,
+ /* 340 */ 25, 206, 288, 25, 18, 261, 181, 317, 325, 45,
+ /* 350 */ 339, 129, 50, 47, 48, 44, 10, 13, 305, 306,
+ /* 360 */ 12, 11, 340, 341, 40, 20, 225, 104, 162, 18,
+ /* 370 */ 16, 205, 317, 206, 248, 238, 43, 325, 375, 376,
+ /* 380 */ 377, 373, 372, 368, 367, 369, 370, 371, 378, 379,
+ /* 390 */ 255, 354, 243, 229, 206, 342, 18, 239, 242, 241,
+ /* 400 */ 248, 266, 300, 330, 240, 50, 47, 48, 44, 10,
+ /* 410 */ 13, 305, 306, 12, 11, 340, 341, 40, 20, 225,
+ /* 420 */ 165, 176, 184, 18, 18, 18, 253, 215, 251, 325,
+ /* 430 */ 325, 375, 376, 377, 373, 372, 368, 367, 369, 370,
+ /* 440 */ 371, 378, 379, 304, 268, 159, 207, 207, 247, 206,
+ /* 450 */ 148, 41, 195, 350, 325, 27, 33, 43, 50, 47,
+ /* 460 */ 48, 44, 10, 13, 305, 306, 12, 11, 340, 341,
+ /* 470 */ 40, 20, 163, 225, 328, 199, 133, 29, 187, 23,
+ /* 480 */ 250, 325, 101, 225, 375, 376, 377, 373, 372, 368,
+ /* 490 */ 367, 369, 370, 371, 378, 379, 225, 298, 207, 334,
+ /* 500 */ 225, 45, 312, 103, 299, 192, 154, 364, 18, 302,
+ /* 510 */ 135, 317, 285, 35, 173, 203, 320, 3, 236, 6,
+ /* 520 */ 108, 41, 232, 294, 303, 134, 313, 43, 130, 249,
+ /* 530 */ 329, 231, 250, 225, 280, 50, 47, 48, 44, 10,
+ /* 540 */ 13, 305, 306, 12, 11, 340, 341, 40, 20, 336,
+ /* 550 */ 36, 166, 212, 230, 332, 228, 338, 8, 132, 330,
+ /* 560 */ 325, 375, 376, 377, 373, 372, 368, 367, 369, 370,
+ /* 570 */ 371, 378, 379, 225, 312, 345, 37, 362, 141, 312,
+ /* 580 */ 94, 77, 135, 156, 236, 182, 173, 135, 122, 204,
+ /* 590 */ 315, 386, 365, 225, 232, 294, 303, 137, 313, 232,
+ /* 600 */ 294, 303, 125, 313, 41, 222, 333, 180, 277, 337,
+ /* 610 */ 43, 225, 50, 47, 48, 44, 10, 13, 305, 306,
+ /* 620 */ 12, 11, 340, 341, 40, 20, 136, 335, 316, 5,
+ /* 630 */ 22, 197, 269, 34, 173, 148, 126, 116, 375, 376,
+ /* 640 */ 377, 373, 372, 368, 367, 369, 370, 371, 378, 379,
+ /* 650 */ 225, 312, 298, 225, 292, 141, 312, 258, 77, 135,
+ /* 660 */ 153, 183, 318, 301, 135, 175, 284, 315, 386, 461,
+ /* 670 */ 117, 232, 294, 303, 325, 313, 232, 294, 303, 382,
+ /* 680 */ 313, 461, 220, 110, 329, 298, 318, 461, 329, 50,
+ /* 690 */ 47, 48, 44, 10, 13, 305, 306, 12, 11, 340,
+ /* 700 */ 341, 40, 20, 225, 30, 191, 46, 189, 314, 107,
+ /* 710 */ 329, 329, 146, 97, 102, 375, 376, 377, 373, 372,
+ /* 720 */ 368, 367, 369, 370, 371, 378, 379, 298, 298, 298,
+ /* 730 */ 329, 329, 329, 329, 329, 329, 329, 329, 329, 329,
+ /* 740 */ 329, 329, 50, 47, 48, 44, 10, 13, 305, 306,
+ /* 750 */ 12, 11, 340, 341, 40, 20, 225, 329, 329, 329,
+ /* 760 */ 329, 329, 329, 329, 329, 114, 160, 115, 375, 376,
+ /* 770 */ 377, 373, 372, 368, 367, 369, 370, 371, 378, 379,
+ /* 780 */ 298, 298, 298, 329, 329, 329, 329, 329, 329, 329,
+ /* 790 */ 329, 329, 329, 329, 283, 50, 47, 48, 44, 10,
+ /* 800 */ 13, 305, 306, 12, 11, 340, 341, 40, 20, 329,
+ /* 810 */ 225, 329, 329, 329, 329, 329, 329, 329, 329, 329,
+ /* 820 */ 329, 375, 376, 377, 373, 372, 368, 367, 369, 370,
+ /* 830 */ 371, 378, 379, 200, 329, 329, 329, 329, 329, 329,
+ /* 840 */ 329, 329, 329, 329, 329, 329, 329, 329, 329, 50,
+ /* 850 */ 47, 48, 44, 10, 13, 305, 306, 12, 11, 340,
+ /* 860 */ 341, 40, 20, 225, 329, 329, 329, 329, 329, 329,
+ /* 870 */ 329, 329, 329, 329, 329, 375, 376, 377, 373, 372,
+ /* 880 */ 368, 367, 369, 370, 371, 378, 379, 329, 329, 329,
+ /* 890 */ 329, 329, 329, 329, 329, 329, 329, 329, 329, 329,
+ /* 900 */ 329, 329, 50, 47, 48, 44, 10, 13, 305, 306,
+ /* 910 */ 12, 11, 340, 341, 40, 20, 329, 329, 329, 329,
+ /* 920 */ 329, 329, 329, 329, 329, 329, 329, 290, 375, 376,
+ /* 930 */ 377, 373, 372, 368, 367, 369, 370, 371, 378, 379,
+ /* 940 */ 225, 312, 329, 225, 329, 141, 312, 329, 77, 135,
+ /* 950 */ 152, 329, 329, 329, 135, 158, 208, 315, 386, 458,
+ /* 960 */ 329, 232, 294, 303, 325, 313, 232, 294, 303, 329,
+ /* 970 */ 313, 458, 223, 329, 329, 329, 318, 458, 329, 50,
+ /* 980 */ 47, 48, 44, 10, 13, 305, 306, 12, 11, 340,
+ /* 990 */ 341, 40, 20, 225, 329, 329, 46, 329, 329, 329,
+ /* 1000 */ 329, 329, 329, 329, 329, 375, 376, 377, 373, 372,
+ /* 1010 */ 368, 367, 369, 370, 371, 378, 379, 329, 329, 329,
+ /* 1020 */ 329, 329, 329, 329, 329, 329, 329, 329, 329, 329,
+ /* 1030 */ 329, 329, 50, 47, 48, 44, 10, 13, 305, 306,
+ /* 1040 */ 12, 11, 340, 341, 40, 20, 329, 329, 329, 329,
+ /* 1050 */ 329, 329, 329, 329, 329, 329, 329, 329, 375, 376,
+ /* 1060 */ 377, 373, 372, 368, 367, 369, 370, 371, 378, 379,
+ /* 1070 */ 329, 329, 329, 50, 47, 48, 44, 10, 13, 305,
+ /* 1080 */ 306, 12, 11, 340, 341, 40, 20, 329, 329, 329,
+ /* 1090 */ 329, 329, 329, 329, 329, 329, 329, 329, 329, 375,
+ /* 1100 */ 376, 377, 373, 372, 368, 367, 369, 370, 371, 378,
+ /* 1110 */ 379, 329, 329, 329, 329, 329, 42, 329, 145, 211,
+ /* 1120 */ 329, 329, 6, 108, 329, 279, 329, 312, 134, 329,
+ /* 1130 */ 329, 150, 249, 329, 231, 135, 235, 41, 39, 329,
+ /* 1140 */ 329, 52, 329, 43, 311, 329, 312, 232, 294, 303,
+ /* 1150 */ 147, 313, 329, 170, 135, 329, 51, 49, 331, 237,
+ /* 1160 */ 296, 329, 325, 106, 1, 278, 232, 294, 303, 329,
+ /* 1170 */ 313, 155, 329, 42, 318, 145, 216, 329, 96, 6,
+ /* 1180 */ 108, 18, 329, 226, 317, 134, 329, 313, 329, 249,
+ /* 1190 */ 329, 231, 329, 235, 41, 39, 256, 329, 52, 329,
+ /* 1200 */ 43, 329, 312, 329, 329, 329, 141, 329, 329, 66,
+ /* 1210 */ 119, 238, 329, 51, 49, 331, 237, 296, 315, 386,
+ /* 1220 */ 106, 1, 232, 294, 303, 329, 313, 270, 329, 329,
+ /* 1230 */ 42, 329, 140, 92, 329, 96, 6, 108, 18, 41,
+ /* 1240 */ 169, 317, 134, 329, 273, 43, 249, 329, 231, 325,
+ /* 1250 */ 235, 41, 39, 244, 329, 52, 41, 43, 329, 312,
+ /* 1260 */ 329, 318, 43, 141, 329, 329, 67, 135, 225, 329,
+ /* 1270 */ 51, 49, 331, 237, 296, 315, 386, 106, 1, 224,
+ /* 1280 */ 294, 303, 329, 313, 310, 329, 329, 42, 329, 145,
+ /* 1290 */ 213, 329, 96, 6, 108, 329, 41, 329, 329, 134,
+ /* 1300 */ 329, 323, 43, 249, 329, 231, 329, 235, 329, 39,
+ /* 1310 */ 329, 329, 52, 41, 329, 329, 312, 329, 329, 43,
+ /* 1320 */ 141, 46, 329, 86, 135, 329, 329, 51, 49, 331,
+ /* 1330 */ 237, 296, 315, 386, 106, 1, 232, 294, 303, 329,
+ /* 1340 */ 313, 274, 329, 329, 42, 329, 142, 216, 329, 96,
+ /* 1350 */ 6, 108, 329, 41, 329, 329, 134, 329, 348, 43,
+ /* 1360 */ 249, 329, 231, 329, 235, 329, 7, 329, 329, 52,
+ /* 1370 */ 41, 329, 329, 312, 329, 329, 43, 141, 329, 329,
+ /* 1380 */ 90, 135, 329, 329, 51, 49, 331, 237, 296, 315,
+ /* 1390 */ 386, 106, 1, 232, 294, 303, 329, 313, 295, 329,
+ /* 1400 */ 329, 42, 329, 138, 216, 329, 96, 6, 108, 329,
+ /* 1410 */ 41, 329, 329, 134, 329, 322, 43, 249, 329, 231,
+ /* 1420 */ 329, 235, 329, 39, 329, 329, 52, 41, 329, 329,
+ /* 1430 */ 312, 329, 329, 43, 141, 329, 329, 87, 135, 329,
+ /* 1440 */ 329, 51, 49, 331, 237, 296, 315, 386, 106, 1,
+ /* 1450 */ 232, 294, 303, 329, 313, 384, 329, 329, 42, 329,
+ /* 1460 */ 131, 216, 329, 96, 6, 108, 329, 41, 329, 329,
+ /* 1470 */ 134, 329, 380, 43, 249, 329, 231, 329, 235, 329,
+ /* 1480 */ 15, 329, 329, 52, 41, 329, 329, 312, 329, 329,
+ /* 1490 */ 43, 141, 329, 329, 79, 135, 329, 329, 51, 49,
+ /* 1500 */ 331, 237, 296, 315, 386, 106, 1, 232, 294, 303,
+ /* 1510 */ 329, 313, 272, 329, 329, 42, 329, 145, 210, 329,
+ /* 1520 */ 96, 6, 108, 329, 41, 329, 329, 134, 329, 349,
+ /* 1530 */ 43, 249, 329, 231, 329, 221, 329, 39, 329, 329,
+ /* 1540 */ 52, 41, 329, 329, 312, 329, 329, 43, 141, 329,
+ /* 1550 */ 329, 70, 135, 329, 329, 51, 49, 331, 237, 296,
+ /* 1560 */ 315, 386, 106, 1, 232, 294, 303, 329, 313, 324,
+ /* 1570 */ 329, 329, 42, 329, 145, 209, 329, 96, 6, 108,
+ /* 1580 */ 329, 41, 329, 329, 134, 329, 326, 43, 249, 329,
+ /* 1590 */ 231, 329, 235, 329, 39, 329, 329, 52, 41, 329,
+ /* 1600 */ 329, 312, 329, 329, 43, 141, 329, 329, 74, 135,
+ /* 1610 */ 329, 329, 51, 49, 331, 237, 296, 315, 386, 106,
+ /* 1620 */ 1, 232, 294, 303, 329, 313, 262, 329, 329, 42,
+ /* 1630 */ 329, 131, 214, 329, 96, 6, 108, 329, 41, 329,
+ /* 1640 */ 329, 134, 329, 327, 43, 249, 329, 231, 329, 235,
+ /* 1650 */ 329, 15, 329, 329, 52, 41, 329, 329, 312, 329,
+ /* 1660 */ 329, 43, 141, 329, 329, 53, 135, 329, 329, 51,
+ /* 1670 */ 49, 331, 237, 296, 315, 386, 106, 329, 232, 294,
+ /* 1680 */ 303, 329, 313, 286, 329, 329, 42, 329, 131, 216,
+ /* 1690 */ 329, 96, 6, 108, 329, 41, 329, 329, 134, 329,
+ /* 1700 */ 343, 43, 249, 329, 231, 329, 235, 329, 15, 329,
+ /* 1710 */ 329, 52, 41, 329, 329, 312, 329, 329, 43, 118,
+ /* 1720 */ 329, 329, 76, 135, 329, 329, 51, 49, 331, 237,
+ /* 1730 */ 296, 315, 386, 106, 329, 232, 294, 303, 329, 313,
+ /* 1740 */ 329, 329, 329, 329, 504, 329, 329, 329, 96, 329,
+ /* 1750 */ 357, 504, 329, 504, 504, 364, 504, 504, 329, 329,
+ /* 1760 */ 329, 35, 504, 329, 504, 2, 504, 6, 108, 329,
+ /* 1770 */ 198, 174, 329, 134, 329, 329, 329, 249, 329, 231,
+ /* 1780 */ 325, 504, 329, 21, 9, 329, 329, 329, 144, 329,
+ /* 1790 */ 329, 329, 504, 329, 312, 99, 179, 206, 141, 329,
+ /* 1800 */ 329, 58, 135, 329, 329, 325, 504, 329, 21, 9,
+ /* 1810 */ 315, 386, 329, 312, 232, 294, 303, 141, 313, 329,
+ /* 1820 */ 71, 135, 206, 344, 37, 362, 329, 329, 329, 315,
+ /* 1830 */ 386, 329, 329, 232, 294, 303, 312, 313, 329, 329,
+ /* 1840 */ 141, 329, 329, 72, 135, 329, 329, 312, 329, 329,
+ /* 1850 */ 329, 141, 315, 386, 65, 135, 232, 294, 303, 329,
+ /* 1860 */ 313, 329, 329, 315, 386, 329, 329, 232, 294, 303,
+ /* 1870 */ 329, 313, 329, 329, 312, 198, 167, 329, 141, 329,
+ /* 1880 */ 329, 69, 135, 329, 329, 325, 329, 329, 21, 9,
+ /* 1890 */ 315, 386, 329, 329, 232, 294, 303, 312, 313, 329,
+ /* 1900 */ 329, 141, 206, 329, 85, 135, 329, 312, 329, 329,
+ /* 1910 */ 329, 149, 329, 315, 386, 135, 312, 232, 294, 303,
+ /* 1920 */ 141, 313, 329, 81, 135, 329, 329, 232, 294, 303,
+ /* 1930 */ 329, 313, 315, 386, 329, 329, 232, 294, 303, 312,
+ /* 1940 */ 313, 329, 329, 141, 329, 329, 82, 135, 329, 329,
+ /* 1950 */ 312, 329, 329, 329, 141, 315, 386, 63, 135, 232,
+ /* 1960 */ 294, 303, 329, 313, 329, 329, 315, 386, 329, 329,
+ /* 1970 */ 232, 294, 303, 329, 313, 329, 312, 329, 329, 329,
+ /* 1980 */ 141, 329, 329, 73, 135, 329, 329, 312, 329, 329,
+ /* 1990 */ 329, 141, 315, 386, 83, 135, 232, 294, 303, 329,
+ /* 2000 */ 313, 329, 329, 315, 386, 329, 312, 232, 294, 303,
+ /* 2010 */ 141, 313, 329, 89, 135, 329, 329, 329, 329, 329,
+ /* 2020 */ 329, 329, 315, 386, 329, 312, 232, 294, 303, 111,
+ /* 2030 */ 313, 329, 68, 135, 329, 329, 312, 329, 329, 329,
+ /* 2040 */ 141, 315, 386, 62, 135, 232, 294, 303, 329, 313,
+ /* 2050 */ 329, 329, 315, 386, 329, 329, 232, 294, 303, 329,
+ /* 2060 */ 313, 329, 312, 329, 329, 329, 141, 329, 329, 61,
+ /* 2070 */ 135, 329, 329, 312, 329, 329, 329, 141, 315, 386,
+ /* 2080 */ 91, 135, 232, 294, 303, 329, 313, 329, 329, 315,
+ /* 2090 */ 386, 329, 312, 232, 294, 303, 141, 313, 329, 78,
+ /* 2100 */ 135, 329, 329, 329, 329, 329, 329, 329, 315, 386,
+ /* 2110 */ 329, 312, 232, 294, 303, 141, 313, 329, 66, 135,
+ /* 2120 */ 329, 329, 312, 329, 329, 329, 141, 315, 386, 80,
+ /* 2130 */ 135, 232, 294, 303, 329, 313, 329, 329, 315, 386,
+ /* 2140 */ 329, 329, 232, 294, 303, 329, 313, 329, 312, 329,
+ /* 2150 */ 329, 329, 113, 329, 329, 88, 135, 329, 329, 312,
+ /* 2160 */ 329, 329, 329, 112, 315, 386, 84, 135, 232, 294,
+ /* 2170 */ 303, 329, 313, 329, 329, 315, 386, 329, 312, 232,
+ /* 2180 */ 294, 303, 141, 313, 329, 57, 135, 329, 329, 329,
+ /* 2190 */ 329, 329, 329, 329, 315, 386, 329, 312, 232, 294,
+ /* 2200 */ 303, 93, 313, 329, 59, 121, 329, 329, 312, 329,
+ /* 2210 */ 329, 329, 141, 315, 386, 75, 135, 232, 294, 303,
+ /* 2220 */ 329, 313, 329, 329, 315, 386, 329, 329, 232, 294,
+ /* 2230 */ 303, 329, 313, 329, 312, 329, 329, 329, 141, 329,
+ /* 2240 */ 329, 60, 135, 329, 329, 312, 329, 329, 329, 141,
+ /* 2250 */ 315, 386, 64, 135, 232, 294, 303, 329, 313, 329,
+ /* 2260 */ 329, 315, 386, 329, 312, 232, 294, 303, 120, 313,
+ /* 2270 */ 329, 55, 135, 329, 329, 329, 329, 329, 329, 329,
+ /* 2280 */ 315, 386, 329, 312, 232, 294, 303, 93, 313, 329,
+ /* 2290 */ 56, 121, 225, 329, 312, 329, 198, 164, 157, 315,
+ /* 2300 */ 386, 329, 135, 219, 294, 303, 325, 313, 352, 21,
+ /* 2310 */ 9, 287, 234, 329, 232, 294, 303, 329, 313, 329,
+ /* 2320 */ 41, 329, 329, 206, 312, 329, 43, 329, 151, 2,
+ /* 2330 */ 329, 329, 135, 329, 329, 329, 329, 329, 329, 329,
+ /* 2340 */ 198, 168, 329, 329, 232, 294, 303, 329, 313, 329,
+ /* 2350 */ 325, 329, 144, 21, 9, 198, 171, 329, 329, 329,
+ /* 2360 */ 329, 329, 329, 329, 329, 325, 329, 206, 21, 9,
+ /* 2370 */ 329, 329, 329, 329, 329, 329, 329, 329, 329, 329,
+ /* 2380 */ 329, 329, 206,
+ );
+ static public $yy_lookahead = array(
+ /* 0 */ 1, 3, 4, 5, 6, 7, 8, 9, 10, 11,
+ /* 10 */ 12, 13, 16, 98, 16, 19, 17, 17, 113, 114,
+ /* 20 */ 22, 23, 16, 97, 18, 19, 28, 112, 29, 29,
+ /* 30 */ 32, 33, 34, 16, 35, 35, 19, 20, 112, 40,
+ /* 40 */ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
+ /* 50 */ 51, 52, 53, 4, 5, 6, 7, 8, 62, 93,
+ /* 60 */ 94, 95, 13, 14, 15, 66, 67, 68, 69, 70,
+ /* 70 */ 71, 72, 73, 74, 75, 76, 77, 1, 85, 62,
+ /* 80 */ 1, 1, 89, 38, 117, 92, 93, 82, 83, 84,
+ /* 90 */ 85, 86, 38, 17, 101, 102, 17, 17, 105, 106,
+ /* 100 */ 107, 86, 109, 88, 59, 29, 61, 1, 29, 30,
+ /* 110 */ 65, 35, 119, 120, 35, 61, 40, 41, 42, 43,
+ /* 120 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
+ /* 130 */ 90, 91, 59, 54, 54, 29, 16, 64, 18, 19,
+ /* 140 */ 100, 35, 66, 67, 68, 69, 70, 71, 72, 73,
+ /* 150 */ 74, 75, 76, 77, 1, 85, 36, 117, 1, 89,
+ /* 160 */ 18, 1, 92, 93, 94, 1, 17, 20, 21, 20,
+ /* 170 */ 17, 101, 102, 17, 17, 105, 106, 107, 29, 109,
+ /* 180 */ 38, 17, 29, 31, 35, 29, 29, 38, 35, 90,
+ /* 190 */ 38, 35, 35, 40, 41, 42, 43, 44, 45, 46,
+ /* 200 */ 47, 48, 49, 50, 51, 52, 53, 1, 61, 111,
+ /* 210 */ 61, 113, 114, 61, 54, 90, 117, 118, 90, 66,
+ /* 220 */ 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
+ /* 230 */ 77, 103, 104, 27, 110, 29, 112, 1, 84, 85,
+ /* 240 */ 86, 35, 117, 20, 21, 117, 40, 41, 42, 43,
+ /* 250 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
+ /* 260 */ 1, 91, 16, 59, 25, 19, 20, 31, 64, 16,
+ /* 270 */ 100, 25, 66, 67, 68, 69, 70, 71, 72, 73,
+ /* 280 */ 74, 75, 76, 77, 61, 85, 85, 117, 29, 37,
+ /* 290 */ 54, 38, 18, 19, 35, 37, 110, 39, 112, 40,
+ /* 300 */ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
+ /* 310 */ 51, 52, 53, 1, 90, 91, 16, 65, 79, 19,
+ /* 320 */ 20, 121, 122, 122, 100, 66, 67, 68, 69, 70,
+ /* 330 */ 71, 72, 73, 74, 75, 76, 77, 63, 24, 91,
+ /* 340 */ 37, 117, 39, 37, 16, 39, 90, 19, 100, 2,
+ /* 350 */ 19, 37, 40, 41, 42, 43, 44, 45, 46, 47,
+ /* 360 */ 48, 49, 50, 51, 52, 53, 1, 90, 91, 16,
+ /* 370 */ 29, 19, 19, 117, 93, 94, 35, 100, 66, 67,
+ /* 380 */ 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
+ /* 390 */ 62, 79, 96, 62, 117, 17, 16, 18, 19, 19,
+ /* 400 */ 93, 94, 19, 25, 39, 40, 41, 42, 43, 44,
+ /* 410 */ 45, 46, 47, 48, 49, 50, 51, 52, 53, 1,
+ /* 420 */ 91, 91, 90, 16, 16, 16, 19, 19, 19, 100,
+ /* 430 */ 100, 66, 67, 68, 69, 70, 71, 72, 73, 74,
+ /* 440 */ 75, 76, 77, 108, 29, 91, 117, 117, 30, 117,
+ /* 450 */ 115, 29, 113, 114, 100, 20, 96, 35, 40, 41,
+ /* 460 */ 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
+ /* 470 */ 52, 53, 91, 1, 118, 99, 18, 26, 110, 20,
+ /* 480 */ 2, 100, 97, 1, 66, 67, 68, 69, 70, 71,
+ /* 490 */ 72, 73, 74, 75, 76, 77, 1, 112, 117, 17,
+ /* 500 */ 1, 2, 85, 99, 19, 110, 89, 10, 16, 19,
+ /* 510 */ 93, 19, 17, 16, 21, 99, 17, 38, 59, 22,
+ /* 520 */ 23, 29, 105, 106, 107, 28, 109, 35, 18, 32,
+ /* 530 */ 33, 34, 2, 1, 65, 40, 41, 42, 43, 44,
+ /* 540 */ 45, 46, 47, 48, 49, 50, 51, 52, 53, 17,
+ /* 550 */ 20, 91, 59, 21, 36, 19, 19, 64, 19, 25,
+ /* 560 */ 100, 66, 67, 68, 69, 70, 71, 72, 73, 74,
+ /* 570 */ 75, 76, 77, 1, 85, 78, 79, 80, 89, 85,
+ /* 580 */ 19, 92, 93, 89, 59, 63, 21, 93, 19, 17,
+ /* 590 */ 101, 102, 17, 1, 105, 106, 107, 18, 109, 105,
+ /* 600 */ 106, 107, 18, 109, 29, 116, 36, 63, 19, 17,
+ /* 610 */ 35, 1, 40, 41, 42, 43, 44, 45, 46, 47,
+ /* 620 */ 48, 49, 50, 51, 52, 53, 61, 17, 108, 38,
+ /* 630 */ 2, 19, 39, 55, 21, 115, 18, 97, 66, 67,
+ /* 640 */ 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
+ /* 650 */ 1, 85, 112, 1, 100, 89, 85, 115, 92, 93,
+ /* 660 */ 89, 110, 112, 111, 93, 91, 17, 101, 102, 17,
+ /* 670 */ 97, 105, 106, 107, 100, 109, 105, 106, 107, 14,
+ /* 680 */ 109, 29, 116, 87, 123, 112, 112, 35, 123, 40,
+ /* 690 */ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
+ /* 700 */ 51, 52, 53, 1, 2, 110, 54, 110, 114, 110,
+ /* 710 */ 123, 123, 97, 97, 97, 66, 67, 68, 69, 70,
+ /* 720 */ 71, 72, 73, 74, 75, 76, 77, 112, 112, 112,
+ /* 730 */ 123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+ /* 740 */ 123, 123, 40, 41, 42, 43, 44, 45, 46, 47,
+ /* 750 */ 48, 49, 50, 51, 52, 53, 1, 123, 123, 123,
+ /* 760 */ 123, 123, 123, 123, 123, 97, 97, 97, 66, 67,
+ /* 770 */ 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
+ /* 780 */ 112, 112, 112, 123, 123, 123, 123, 123, 123, 123,
+ /* 790 */ 123, 123, 123, 123, 39, 40, 41, 42, 43, 44,
+ /* 800 */ 45, 46, 47, 48, 49, 50, 51, 52, 53, 123,
+ /* 810 */ 1, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+ /* 820 */ 123, 66, 67, 68, 69, 70, 71, 72, 73, 74,
+ /* 830 */ 75, 76, 77, 24, 123, 123, 123, 123, 123, 123,
+ /* 840 */ 123, 123, 123, 123, 123, 123, 123, 123, 123, 40,
+ /* 850 */ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
+ /* 860 */ 51, 52, 53, 1, 123, 123, 123, 123, 123, 123,
+ /* 870 */ 123, 123, 123, 123, 123, 66, 67, 68, 69, 70,
+ /* 880 */ 71, 72, 73, 74, 75, 76, 77, 123, 123, 123,
+ /* 890 */ 123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+ /* 900 */ 123, 123, 40, 41, 42, 43, 44, 45, 46, 47,
+ /* 910 */ 48, 49, 50, 51, 52, 53, 123, 123, 123, 123,
+ /* 920 */ 123, 123, 123, 123, 123, 123, 123, 65, 66, 67,
+ /* 930 */ 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
+ /* 940 */ 1, 85, 123, 1, 123, 89, 85, 123, 92, 93,
+ /* 950 */ 89, 123, 123, 123, 93, 91, 17, 101, 102, 17,
+ /* 960 */ 123, 105, 106, 107, 100, 109, 105, 106, 107, 123,
+ /* 970 */ 109, 29, 116, 123, 123, 123, 112, 35, 123, 40,
+ /* 980 */ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
+ /* 990 */ 51, 52, 53, 1, 123, 123, 54, 123, 123, 123,
+ /* 1000 */ 123, 123, 123, 123, 123, 66, 67, 68, 69, 70,
+ /* 1010 */ 71, 72, 73, 74, 75, 76, 77, 123, 123, 123,
+ /* 1020 */ 123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+ /* 1030 */ 123, 123, 40, 41, 42, 43, 44, 45, 46, 47,
+ /* 1040 */ 48, 49, 50, 51, 52, 53, 123, 123, 123, 123,
+ /* 1050 */ 123, 123, 123, 123, 123, 123, 123, 123, 66, 67,
+ /* 1060 */ 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
+ /* 1070 */ 123, 123, 123, 40, 41, 42, 43, 44, 45, 46,
+ /* 1080 */ 47, 48, 49, 50, 51, 52, 53, 123, 123, 123,
+ /* 1090 */ 123, 123, 123, 123, 123, 123, 123, 123, 123, 66,
+ /* 1100 */ 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
+ /* 1110 */ 77, 123, 123, 123, 123, 123, 16, 123, 18, 19,
+ /* 1120 */ 123, 123, 22, 23, 123, 17, 123, 85, 28, 123,
+ /* 1130 */ 123, 89, 32, 33, 34, 93, 36, 29, 38, 123,
+ /* 1140 */ 123, 41, 123, 35, 102, 123, 85, 105, 106, 107,
+ /* 1150 */ 89, 109, 123, 91, 93, 123, 56, 57, 58, 59,
+ /* 1160 */ 60, 123, 100, 63, 64, 65, 105, 106, 107, 123,
+ /* 1170 */ 109, 93, 123, 16, 112, 18, 19, 123, 78, 22,
+ /* 1180 */ 23, 16, 123, 105, 19, 28, 123, 109, 123, 32,
+ /* 1190 */ 33, 34, 123, 36, 29, 38, 31, 123, 41, 123,
+ /* 1200 */ 35, 123, 85, 123, 123, 123, 89, 123, 123, 92,
+ /* 1210 */ 93, 94, 123, 56, 57, 58, 59, 60, 101, 102,
+ /* 1220 */ 63, 64, 105, 106, 107, 123, 109, 17, 123, 123,
+ /* 1230 */ 16, 123, 18, 19, 123, 78, 22, 23, 16, 29,
+ /* 1240 */ 91, 19, 28, 123, 17, 35, 32, 33, 34, 100,
+ /* 1250 */ 36, 29, 38, 31, 123, 41, 29, 35, 123, 85,
+ /* 1260 */ 123, 112, 35, 89, 123, 123, 92, 93, 1, 123,
+ /* 1270 */ 56, 57, 58, 59, 60, 101, 102, 63, 64, 105,
+ /* 1280 */ 106, 107, 123, 109, 17, 123, 123, 16, 123, 18,
+ /* 1290 */ 19, 123, 78, 22, 23, 123, 29, 123, 123, 28,
+ /* 1300 */ 123, 17, 35, 32, 33, 34, 123, 36, 123, 38,
+ /* 1310 */ 123, 123, 41, 29, 123, 123, 85, 123, 123, 35,
+ /* 1320 */ 89, 54, 123, 92, 93, 123, 123, 56, 57, 58,
+ /* 1330 */ 59, 60, 101, 102, 63, 64, 105, 106, 107, 123,
+ /* 1340 */ 109, 17, 123, 123, 16, 123, 18, 19, 123, 78,
+ /* 1350 */ 22, 23, 123, 29, 123, 123, 28, 123, 17, 35,
+ /* 1360 */ 32, 33, 34, 123, 36, 123, 38, 123, 123, 41,
+ /* 1370 */ 29, 123, 123, 85, 123, 123, 35, 89, 123, 123,
+ /* 1380 */ 92, 93, 123, 123, 56, 57, 58, 59, 60, 101,
+ /* 1390 */ 102, 63, 64, 105, 106, 107, 123, 109, 17, 123,
+ /* 1400 */ 123, 16, 123, 18, 19, 123, 78, 22, 23, 123,
+ /* 1410 */ 29, 123, 123, 28, 123, 17, 35, 32, 33, 34,
+ /* 1420 */ 123, 36, 123, 38, 123, 123, 41, 29, 123, 123,
+ /* 1430 */ 85, 123, 123, 35, 89, 123, 123, 92, 93, 123,
+ /* 1440 */ 123, 56, 57, 58, 59, 60, 101, 102, 63, 64,
+ /* 1450 */ 105, 106, 107, 123, 109, 17, 123, 123, 16, 123,
+ /* 1460 */ 18, 19, 123, 78, 22, 23, 123, 29, 123, 123,
+ /* 1470 */ 28, 123, 17, 35, 32, 33, 34, 123, 36, 123,
+ /* 1480 */ 38, 123, 123, 41, 29, 123, 123, 85, 123, 123,
+ /* 1490 */ 35, 89, 123, 123, 92, 93, 123, 123, 56, 57,
+ /* 1500 */ 58, 59, 60, 101, 102, 63, 64, 105, 106, 107,
+ /* 1510 */ 123, 109, 17, 123, 123, 16, 123, 18, 19, 123,
+ /* 1520 */ 78, 22, 23, 123, 29, 123, 123, 28, 123, 17,
+ /* 1530 */ 35, 32, 33, 34, 123, 36, 123, 38, 123, 123,
+ /* 1540 */ 41, 29, 123, 123, 85, 123, 123, 35, 89, 123,
+ /* 1550 */ 123, 92, 93, 123, 123, 56, 57, 58, 59, 60,
+ /* 1560 */ 101, 102, 63, 64, 105, 106, 107, 123, 109, 17,
+ /* 1570 */ 123, 123, 16, 123, 18, 19, 123, 78, 22, 23,
+ /* 1580 */ 123, 29, 123, 123, 28, 123, 17, 35, 32, 33,
+ /* 1590 */ 34, 123, 36, 123, 38, 123, 123, 41, 29, 123,
+ /* 1600 */ 123, 85, 123, 123, 35, 89, 123, 123, 92, 93,
+ /* 1610 */ 123, 123, 56, 57, 58, 59, 60, 101, 102, 63,
+ /* 1620 */ 64, 105, 106, 107, 123, 109, 17, 123, 123, 16,
+ /* 1630 */ 123, 18, 19, 123, 78, 22, 23, 123, 29, 123,
+ /* 1640 */ 123, 28, 123, 17, 35, 32, 33, 34, 123, 36,
+ /* 1650 */ 123, 38, 123, 123, 41, 29, 123, 123, 85, 123,
+ /* 1660 */ 123, 35, 89, 123, 123, 92, 93, 123, 123, 56,
+ /* 1670 */ 57, 58, 59, 60, 101, 102, 63, 123, 105, 106,
+ /* 1680 */ 107, 123, 109, 17, 123, 123, 16, 123, 18, 19,
+ /* 1690 */ 123, 78, 22, 23, 123, 29, 123, 123, 28, 123,
+ /* 1700 */ 17, 35, 32, 33, 34, 123, 36, 123, 38, 123,
+ /* 1710 */ 123, 41, 29, 123, 123, 85, 123, 123, 35, 89,
+ /* 1720 */ 123, 123, 92, 93, 123, 123, 56, 57, 58, 59,
+ /* 1730 */ 60, 101, 102, 63, 123, 105, 106, 107, 123, 109,
+ /* 1740 */ 123, 123, 123, 123, 17, 123, 123, 123, 78, 123,
+ /* 1750 */ 120, 24, 123, 26, 27, 10, 29, 30, 123, 123,
+ /* 1760 */ 123, 16, 35, 123, 37, 38, 39, 22, 23, 123,
+ /* 1770 */ 90, 91, 123, 28, 123, 123, 123, 32, 33, 34,
+ /* 1780 */ 100, 54, 123, 103, 104, 123, 123, 123, 61, 123,
+ /* 1790 */ 123, 123, 65, 123, 85, 90, 91, 117, 89, 123,
+ /* 1800 */ 123, 92, 93, 123, 123, 100, 79, 123, 103, 104,
+ /* 1810 */ 101, 102, 123, 85, 105, 106, 107, 89, 109, 123,
+ /* 1820 */ 92, 93, 117, 78, 79, 80, 123, 123, 123, 101,
+ /* 1830 */ 102, 123, 123, 105, 106, 107, 85, 109, 123, 123,
+ /* 1840 */ 89, 123, 123, 92, 93, 123, 123, 85, 123, 123,
+ /* 1850 */ 123, 89, 101, 102, 92, 93, 105, 106, 107, 123,
+ /* 1860 */ 109, 123, 123, 101, 102, 123, 123, 105, 106, 107,
+ /* 1870 */ 123, 109, 123, 123, 85, 90, 91, 123, 89, 123,
+ /* 1880 */ 123, 92, 93, 123, 123, 100, 123, 123, 103, 104,
+ /* 1890 */ 101, 102, 123, 123, 105, 106, 107, 85, 109, 123,
+ /* 1900 */ 123, 89, 117, 123, 92, 93, 123, 85, 123, 123,
+ /* 1910 */ 123, 89, 123, 101, 102, 93, 85, 105, 106, 107,
+ /* 1920 */ 89, 109, 123, 92, 93, 123, 123, 105, 106, 107,
+ /* 1930 */ 123, 109, 101, 102, 123, 123, 105, 106, 107, 85,
+ /* 1940 */ 109, 123, 123, 89, 123, 123, 92, 93, 123, 123,
+ /* 1950 */ 85, 123, 123, 123, 89, 101, 102, 92, 93, 105,
+ /* 1960 */ 106, 107, 123, 109, 123, 123, 101, 102, 123, 123,
+ /* 1970 */ 105, 106, 107, 123, 109, 123, 85, 123, 123, 123,
+ /* 1980 */ 89, 123, 123, 92, 93, 123, 123, 85, 123, 123,
+ /* 1990 */ 123, 89, 101, 102, 92, 93, 105, 106, 107, 123,
+ /* 2000 */ 109, 123, 123, 101, 102, 123, 85, 105, 106, 107,
+ /* 2010 */ 89, 109, 123, 92, 93, 123, 123, 123, 123, 123,
+ /* 2020 */ 123, 123, 101, 102, 123, 85, 105, 106, 107, 89,
+ /* 2030 */ 109, 123, 92, 93, 123, 123, 85, 123, 123, 123,
+ /* 2040 */ 89, 101, 102, 92, 93, 105, 106, 107, 123, 109,
+ /* 2050 */ 123, 123, 101, 102, 123, 123, 105, 106, 107, 123,
+ /* 2060 */ 109, 123, 85, 123, 123, 123, 89, 123, 123, 92,
+ /* 2070 */ 93, 123, 123, 85, 123, 123, 123, 89, 101, 102,
+ /* 2080 */ 92, 93, 105, 106, 107, 123, 109, 123, 123, 101,
+ /* 2090 */ 102, 123, 85, 105, 106, 107, 89, 109, 123, 92,
+ /* 2100 */ 93, 123, 123, 123, 123, 123, 123, 123, 101, 102,
+ /* 2110 */ 123, 85, 105, 106, 107, 89, 109, 123, 92, 93,
+ /* 2120 */ 123, 123, 85, 123, 123, 123, 89, 101, 102, 92,
+ /* 2130 */ 93, 105, 106, 107, 123, 109, 123, 123, 101, 102,
+ /* 2140 */ 123, 123, 105, 106, 107, 123, 109, 123, 85, 123,
+ /* 2150 */ 123, 123, 89, 123, 123, 92, 93, 123, 123, 85,
+ /* 2160 */ 123, 123, 123, 89, 101, 102, 92, 93, 105, 106,
+ /* 2170 */ 107, 123, 109, 123, 123, 101, 102, 123, 85, 105,
+ /* 2180 */ 106, 107, 89, 109, 123, 92, 93, 123, 123, 123,
+ /* 2190 */ 123, 123, 123, 123, 101, 102, 123, 85, 105, 106,
+ /* 2200 */ 107, 89, 109, 123, 92, 93, 123, 123, 85, 123,
+ /* 2210 */ 123, 123, 89, 101, 102, 92, 93, 105, 106, 107,
+ /* 2220 */ 123, 109, 123, 123, 101, 102, 123, 123, 105, 106,
+ /* 2230 */ 107, 123, 109, 123, 85, 123, 123, 123, 89, 123,
+ /* 2240 */ 123, 92, 93, 123, 123, 85, 123, 123, 123, 89,
+ /* 2250 */ 101, 102, 92, 93, 105, 106, 107, 123, 109, 123,
+ /* 2260 */ 123, 101, 102, 123, 85, 105, 106, 107, 89, 109,
+ /* 2270 */ 123, 92, 93, 123, 123, 123, 123, 123, 123, 123,
+ /* 2280 */ 101, 102, 123, 85, 105, 106, 107, 89, 109, 123,
+ /* 2290 */ 92, 93, 1, 123, 85, 123, 90, 91, 89, 101,
+ /* 2300 */ 102, 123, 93, 105, 106, 107, 100, 109, 17, 103,
+ /* 2310 */ 104, 102, 21, 123, 105, 106, 107, 123, 109, 123,
+ /* 2320 */ 29, 123, 123, 117, 85, 123, 35, 123, 89, 38,
+ /* 2330 */ 123, 123, 93, 123, 123, 123, 123, 123, 123, 123,
+ /* 2340 */ 90, 91, 123, 123, 105, 106, 107, 123, 109, 123,
+ /* 2350 */ 100, 123, 61, 103, 104, 90, 91, 123, 123, 123,
+ /* 2360 */ 123, 123, 123, 123, 123, 100, 123, 117, 103, 104,
+ /* 2370 */ 123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
+ /* 2380 */ 123, 123, 117,
+);
+ const YY_SHIFT_USE_DFLT = -5;
+ const YY_SHIFT_MAX = 256;
+ static public $yy_shift_ofst = array(
+ /* 0 */ -2, 1271, 1157, 1157, 1271, 1157, 1328, 1328, 1100, 1157,
+ /* 10 */ 1157, 1157, 1157, 1157, 1157, 1157, 1499, 1157, 1157, 1157,
+ /* 20 */ 1157, 1157, 1556, 1157, 1157, 1157, 1157, 1157, 1157, 1157,
+ /* 30 */ 1157, 1157, 1157, 1157, 1385, 1214, 1157, 1157, 1157, 1157,
+ /* 40 */ 1157, 1499, 1214, 1157, 1442, 1442, 1613, 1670, 1670, 1670,
+ /* 50 */ 1670, 1670, 1670, 206, 153, 76, -1, 259, 259, 259,
+ /* 60 */ 809, 939, 755, 862, 702, 649, 365, 312, 418, 495,
+ /* 70 */ 572, 992, 992, 992, 992, 992, 992, 992, 992, 992,
+ /* 80 */ 992, 992, 992, 992, 992, 992, 992, 992, 992, 992,
+ /* 90 */ 1033, 1033, 2291, 1267, 106, -2, 1745, 1222, 1165, 157,
+ /* 100 */ 157, 492, 492, 499, 106, 106, 274, 493, 142, 497,
+ /* 110 */ 49, 79, 942, 652, 246, 17, 328, 300, 236, 223,
+ /* 120 */ 80, 147, 532, 1227, 353, 353, 353, 422, 407, 142,
+ /* 130 */ 353, 353, 610, 353, 341, 565, 379, 353, 380, 142,
+ /* 140 */ 408, 160, 409, 353, 379, 409, 353, 472, 613, 472,
+ /* 150 */ 472, 472, 472, 472, 472, 613, 472, -5, 1284, 1210,
+ /* 160 */ -4, 1108, 0, 156, 575, 1683, 1552, 1512, 1569, 1609,
+ /* 170 */ 1666, 1324, 1626, 6, 1495, 1398, 1381, 1341, 1438, 1455,
+ /* 180 */ 73, 482, 73, 204, 592, 204, 204, 204, 164, 204,
+ /* 190 */ 253, 204, 204, 665, 613, 613, 613, 479, 472, 347,
+ /* 200 */ 415, 415, 472, 347, -5, -5, -5, -5, -5, 1727,
+ /* 210 */ 149, 45, 120, 152, 54, 530, 54, 314, 252, 378,
+ /* 220 */ 306, 459, 258, 303, 239, 331, 522, 536, 469, 537,
+ /* 230 */ 539, 569, 534, 544, 561, 525, 518, 570, 593, 612,
+ /* 240 */ 578, 628, 591, 579, 510, 584, 589, 458, 435, 352,
+ /* 250 */ 485, 478, 451, 479, 490, 383, 618,
+);
+ const YY_REDUCE_USE_DFLT = -96;
+ const YY_REDUCE_MAX = 208;
+ static public $yy_reduce_ofst = array(
+ /* 0 */ 5, -7, 489, 566, 1630, 856, 70, 1117, 1865, 1854,
+ /* 10 */ 1831, 1812, 1891, 1902, 1977, 1951, 1940, 1921, 1789, 1762,
+ /* 20 */ 1402, 1345, 1288, 1231, 1459, 1516, 1751, 1728, 1709, 1573,
+ /* 30 */ 1988, 2007, 2123, 2149, 2160, 2198, 2179, 1174, 2093, 2026,
+ /* 40 */ 2037, 2063, 2112, 2074, 1042, 2209, 1822, 2239, 1061, 861,
+ /* 50 */ 494, 417, 571, 2265, 2250, 2206, 1705, 1785, 1680, 1705,
+ /* 60 */ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ /* 70 */ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ /* 80 */ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ /* 90 */ 128, 128, 277, 224, 40, 154, 200, 864, 1062, 170,
+ /* 100 */ 330, 574, 1149, 99, 329, 381, 1078, 98, -34, 201,
+ /* 110 */ 15, 125, 125, 125, -85, 124, 124, 124, 125, -95,
+ /* 120 */ 125, -95, 332, 354, 573, 616, 617, 460, 615, 307,
+ /* 130 */ 385, 540, 256, -74, 248, -95, 335, 668, 540, 281,
+ /* 140 */ 540, 125, 670, 669, 520, 540, 186, 125, 339, 125,
+ /* 150 */ 125, 125, 125, 125, 125, -95, 125, 125, 554, 554,
+ /* 160 */ 550, 554, 554, 554, 554, 554, 554, 554, 554, 554,
+ /* 170 */ 554, 554, 554, 542, 554, 554, 554, 554, 554, 554,
+ /* 180 */ 595, -33, 551, 552, -33, 552, 552, 552, -33, 552,
+ /* 190 */ 597, 552, 552, 596, 594, 594, 594, 599, -33, 356,
+ /* 200 */ 296, 360, -33, 356, 395, 404, 376, 416, 368,
+);
+ static public $yyExpectedTokens = array(
+ /* 0 */ array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 22, 23, 28, 32, 33, 34, ),
+ /* 1 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 2 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 3 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 4 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 5 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 6 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 7 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 8 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 65, 78, ),
+ /* 9 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 10 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 11 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 12 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 13 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 14 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 15 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 16 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 17 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 18 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 19 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 20 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 21 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 22 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 23 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 24 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 25 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 26 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 27 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 28 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 29 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 30 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 31 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 32 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 33 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 34 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 35 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 36 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 37 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 38 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 39 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 40 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 41 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 42 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 43 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 44 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 45 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+ /* 46 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 78, ),
+ /* 47 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 78, ),
+ /* 48 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 78, ),
+ /* 49 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 78, ),
+ /* 50 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 78, ),
+ /* 51 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 78, ),
+ /* 52 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 78, ),
+ /* 53 */ array(1, 27, 29, 35, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 54 */ array(1, 17, 29, 35, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 55 */ array(1, 17, 29, 35, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 56 */ array(1, 17, 29, 35, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 57 */ array(1, 29, 35, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 58 */ array(1, 29, 35, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 59 */ array(1, 29, 35, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 60 */ array(1, 24, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 61 */ array(1, 17, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 62 */ array(1, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 63 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 64 */ array(1, 2, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 65 */ array(1, 17, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 66 */ array(1, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 67 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 79, ),
+ /* 68 */ array(1, 30, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 69 */ array(1, 17, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 70 */ array(1, 17, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 71 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 72 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 73 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 74 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 75 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 76 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 77 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 78 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 79 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 80 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 81 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 82 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 83 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 84 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 85 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 86 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 87 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 88 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 89 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 90 */ array(40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 91 */ array(40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+ /* 92 */ array(1, 17, 21, 29, 35, 38, 61, ),
+ /* 93 */ array(1, 17, 29, 35, 54, ),
+ /* 94 */ array(1, 29, 35, ),
+ /* 95 */ array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 22, 23, 28, 32, 33, 34, ),
+ /* 96 */ array(10, 16, 22, 23, 28, 32, 33, 34, 78, 79, 80, ),
+ /* 97 */ array(16, 19, 29, 31, 35, ),
+ /* 98 */ array(16, 19, 29, 31, 35, ),
+ /* 99 */ array(1, 17, 29, 35, ),
+ /* 100 */ array(1, 17, 29, 35, ),
+ /* 101 */ array(16, 19, 29, 35, ),
+ /* 102 */ array(16, 19, 29, 35, ),
+ /* 103 */ array(1, 2, 17, ),
+ /* 104 */ array(1, 29, 35, ),
+ /* 105 */ array(1, 29, 35, ),
+ /* 106 */ array(18, 19, 63, ),
+ /* 107 */ array(21, 59, 64, ),
+ /* 108 */ array(18, 38, ),
+ /* 109 */ array(10, 16, 22, 23, 28, 32, 33, 34, 78, 79, 80, ),
+ /* 110 */ array(4, 5, 6, 7, 8, 13, 14, 15, ),
+ /* 111 */ array(1, 17, 29, 30, 35, 54, ),
+ /* 112 */ array(1, 17, 29, 35, 54, ),
+ /* 113 */ array(1, 17, 29, 35, 54, ),
+ /* 114 */ array(16, 19, 20, 25, ),
+ /* 115 */ array(16, 19, 20, 62, ),
+ /* 116 */ array(16, 19, 62, ),
+ /* 117 */ array(16, 19, 20, ),
+ /* 118 */ array(1, 31, 54, ),
+ /* 119 */ array(20, 21, 61, ),
+ /* 120 */ array(1, 17, 54, ),
+ /* 121 */ array(20, 21, 61, ),
+ /* 122 */ array(1, 17, 21, ),
+ /* 123 */ array(17, 29, 35, ),
+ /* 124 */ array(16, 19, ),
+ /* 125 */ array(16, 19, ),
+ /* 126 */ array(16, 19, ),
+ /* 127 */ array(29, 35, ),
+ /* 128 */ array(16, 19, ),
+ /* 129 */ array(18, 38, ),
+ /* 130 */ array(16, 19, ),
+ /* 131 */ array(16, 19, ),
+ /* 132 */ array(1, 17, ),
+ /* 133 */ array(16, 19, ),
+ /* 134 */ array(29, 35, ),
+ /* 135 */ array(21, 61, ),
+ /* 136 */ array(18, 19, ),
+ /* 137 */ array(16, 19, ),
+ /* 138 */ array(16, 19, ),
+ /* 139 */ array(18, 38, ),
+ /* 140 */ array(16, 19, ),
+ /* 141 */ array(1, 54, ),
+ /* 142 */ array(16, 19, ),
+ /* 143 */ array(16, 19, ),
+ /* 144 */ array(18, 19, ),
+ /* 145 */ array(16, 19, ),
+ /* 146 */ array(16, 19, ),
+ /* 147 */ array(1, ),
+ /* 148 */ array(21, ),
+ /* 149 */ array(1, ),
+ /* 150 */ array(1, ),
+ /* 151 */ array(1, ),
+ /* 152 */ array(1, ),
+ /* 153 */ array(1, ),
+ /* 154 */ array(1, ),
+ /* 155 */ array(21, ),
+ /* 156 */ array(1, ),
+ /* 157 */ array(),
+ /* 158 */ array(17, 29, 35, ),
+ /* 159 */ array(17, 29, 35, ),
+ /* 160 */ array(16, 19, 62, ),
+ /* 161 */ array(17, 29, 35, ),
+ /* 162 */ array(17, 29, 35, ),
+ /* 163 */ array(17, 29, 35, ),
+ /* 164 */ array(17, 29, 35, ),
+ /* 165 */ array(17, 29, 35, ),
+ /* 166 */ array(17, 29, 35, ),
+ /* 167 */ array(17, 29, 35, ),
+ /* 168 */ array(17, 29, 35, ),
+ /* 169 */ array(17, 29, 35, ),
+ /* 170 */ array(17, 29, 35, ),
+ /* 171 */ array(17, 29, 35, ),
+ /* 172 */ array(17, 29, 35, ),
+ /* 173 */ array(16, 18, 19, ),
+ /* 174 */ array(17, 29, 35, ),
+ /* 175 */ array(17, 29, 35, ),
+ /* 176 */ array(17, 29, 35, ),
+ /* 177 */ array(17, 29, 35, ),
+ /* 178 */ array(17, 29, 35, ),
+ /* 179 */ array(17, 29, 35, ),
+ /* 180 */ array(59, 64, ),
+ /* 181 */ array(1, 17, ),
+ /* 182 */ array(59, 64, ),
+ /* 183 */ array(59, 64, ),
+ /* 184 */ array(1, 17, ),
+ /* 185 */ array(59, 64, ),
+ /* 186 */ array(59, 64, ),
+ /* 187 */ array(59, 64, ),
+ /* 188 */ array(1, 17, ),
+ /* 189 */ array(59, 64, ),
+ /* 190 */ array(16, 38, ),
+ /* 191 */ array(59, 64, ),
+ /* 192 */ array(59, 64, ),
+ /* 193 */ array(14, ),
+ /* 194 */ array(21, ),
+ /* 195 */ array(21, ),
+ /* 196 */ array(21, ),
+ /* 197 */ array(38, ),
+ /* 198 */ array(1, ),
+ /* 199 */ array(2, ),
+ /* 200 */ array(29, ),
+ /* 201 */ array(29, ),
+ /* 202 */ array(1, ),
+ /* 203 */ array(2, ),
+ /* 204 */ array(),
+ /* 205 */ array(),
+ /* 206 */ array(),
+ /* 207 */ array(),
+ /* 208 */ array(),
+ /* 209 */ array(17, 24, 26, 27, 29, 30, 35, 37, 38, 39, 54, 61, 65, 79, ),
+ /* 210 */ array(17, 20, 29, 35, 38, 61, ),
+ /* 211 */ array(38, 59, 61, 65, ),
+ /* 212 */ array(16, 18, 19, 36, ),
+ /* 213 */ array(31, 38, 61, ),
+ /* 214 */ array(38, 61, ),
+ /* 215 */ array(2, 20, ),
+ /* 216 */ array(38, 61, ),
+ /* 217 */ array(24, 37, ),
+ /* 218 */ array(37, 65, ),
+ /* 219 */ array(17, 25, ),
+ /* 220 */ array(37, 39, ),
+ /* 221 */ array(20, 59, ),
+ /* 222 */ array(37, 39, ),
+ /* 223 */ array(37, 39, ),
+ /* 224 */ array(25, 79, ),
+ /* 225 */ array(19, 62, ),
+ /* 226 */ array(63, ),
+ /* 227 */ array(19, ),
+ /* 228 */ array(65, ),
+ /* 229 */ array(19, ),
+ /* 230 */ array(19, ),
+ /* 231 */ array(19, ),
+ /* 232 */ array(25, ),
+ /* 233 */ array(63, ),
+ /* 234 */ array(19, ),
+ /* 235 */ array(59, ),
+ /* 236 */ array(36, ),
+ /* 237 */ array(36, ),
+ /* 238 */ array(39, ),
+ /* 239 */ array(19, ),
+ /* 240 */ array(55, ),
+ /* 241 */ array(2, ),
+ /* 242 */ array(38, ),
+ /* 243 */ array(18, ),
+ /* 244 */ array(18, ),
+ /* 245 */ array(18, ),
+ /* 246 */ array(19, ),
+ /* 247 */ array(18, ),
+ /* 248 */ array(20, ),
+ /* 249 */ array(19, ),
+ /* 250 */ array(19, ),
+ /* 251 */ array(2, ),
+ /* 252 */ array(26, ),
+ /* 253 */ array(38, ),
+ /* 254 */ array(19, ),
+ /* 255 */ array(19, ),
+ /* 256 */ array(18, ),
+ /* 257 */ array(),
+ /* 258 */ array(),
+ /* 259 */ array(),
+ /* 260 */ array(),
+ /* 261 */ array(),
+ /* 262 */ array(),
+ /* 263 */ array(),
+ /* 264 */ array(),
+ /* 265 */ array(),
+ /* 266 */ array(),
+ /* 267 */ array(),
+ /* 268 */ array(),
+ /* 269 */ array(),
+ /* 270 */ array(),
+ /* 271 */ array(),
+ /* 272 */ array(),
+ /* 273 */ array(),
+ /* 274 */ array(),
+ /* 275 */ array(),
+ /* 276 */ array(),
+ /* 277 */ array(),
+ /* 278 */ array(),
+ /* 279 */ array(),
+ /* 280 */ array(),
+ /* 281 */ array(),
+ /* 282 */ array(),
+ /* 283 */ array(),
+ /* 284 */ array(),
+ /* 285 */ array(),
+ /* 286 */ array(),
+ /* 287 */ array(),
+ /* 288 */ array(),
+ /* 289 */ array(),
+ /* 290 */ array(),
+ /* 291 */ array(),
+ /* 292 */ array(),
+ /* 293 */ array(),
+ /* 294 */ array(),
+ /* 295 */ array(),
+ /* 296 */ array(),
+ /* 297 */ array(),
+ /* 298 */ array(),
+ /* 299 */ array(),
+ /* 300 */ array(),
+ /* 301 */ array(),
+ /* 302 */ array(),
+ /* 303 */ array(),
+ /* 304 */ array(),
+ /* 305 */ array(),
+ /* 306 */ array(),
+ /* 307 */ array(),
+ /* 308 */ array(),
+ /* 309 */ array(),
+ /* 310 */ array(),
+ /* 311 */ array(),
+ /* 312 */ array(),
+ /* 313 */ array(),
+ /* 314 */ array(),
+ /* 315 */ array(),
+ /* 316 */ array(),
+ /* 317 */ array(),
+ /* 318 */ array(),
+ /* 319 */ array(),
+ /* 320 */ array(),
+ /* 321 */ array(),
+ /* 322 */ array(),
+ /* 323 */ array(),
+ /* 324 */ array(),
+ /* 325 */ array(),
+ /* 326 */ array(),
+ /* 327 */ array(),
+ /* 328 */ array(),
+ /* 329 */ array(),
+ /* 330 */ array(),
+ /* 331 */ array(),
+ /* 332 */ array(),
+ /* 333 */ array(),
+ /* 334 */ array(),
+ /* 335 */ array(),
+ /* 336 */ array(),
+ /* 337 */ array(),
+ /* 338 */ array(),
+ /* 339 */ array(),
+ /* 340 */ array(),
+ /* 341 */ array(),
+ /* 342 */ array(),
+ /* 343 */ array(),
+ /* 344 */ array(),
+ /* 345 */ array(),
+ /* 346 */ array(),
+ /* 347 */ array(),
+ /* 348 */ array(),
+ /* 349 */ array(),
+ /* 350 */ array(),
+ /* 351 */ array(),
+ /* 352 */ array(),
+ /* 353 */ array(),
+ /* 354 */ array(),
+ /* 355 */ array(),
+ /* 356 */ array(),
+ /* 357 */ array(),
+ /* 358 */ array(),
+ /* 359 */ array(),
+ /* 360 */ array(),
+ /* 361 */ array(),
+ /* 362 */ array(),
+ /* 363 */ array(),
+ /* 364 */ array(),
+ /* 365 */ array(),
+ /* 366 */ array(),
+ /* 367 */ array(),
+ /* 368 */ array(),
+ /* 369 */ array(),
+ /* 370 */ array(),
+ /* 371 */ array(),
+ /* 372 */ array(),
+ /* 373 */ array(),
+ /* 374 */ array(),
+ /* 375 */ array(),
+ /* 376 */ array(),
+ /* 377 */ array(),
+ /* 378 */ array(),
+ /* 379 */ array(),
+ /* 380 */ array(),
+ /* 381 */ array(),
+ /* 382 */ array(),
+ /* 383 */ array(),
+ /* 384 */ array(),
+ /* 385 */ array(),
+ /* 386 */ array(),
+ /* 387 */ array(),
+ /* 388 */ array(),
+ /* 389 */ array(),
+ /* 390 */ array(),
+);
+ static public $yy_default = array(
+ /* 0 */ 394, 578, 549, 549, 595, 549, 595, 595, 595, 595,
+ /* 10 */ 595, 595, 595, 595, 595, 595, 595, 595, 595, 595,
+ /* 20 */ 595, 595, 595, 595, 595, 595, 595, 595, 595, 595,
+ /* 30 */ 595, 595, 595, 595, 595, 595, 595, 595, 595, 595,
+ /* 40 */ 595, 595, 595, 595, 595, 595, 595, 595, 595, 595,
+ /* 50 */ 595, 595, 595, 455, 595, 595, 595, 455, 455, 455,
+ /* 60 */ 595, 595, 595, 595, 595, 595, 595, 595, 460, 595,
+ /* 70 */ 595, 466, 465, 484, 547, 579, 581, 548, 580, 489,
+ /* 80 */ 488, 480, 479, 481, 457, 485, 462, 476, 460, 437,
+ /* 90 */ 492, 493, 504, 468, 455, 391, 595, 455, 455, 475,
+ /* 100 */ 512, 455, 455, 595, 455, 455, 595, 561, 595, 595,
+ /* 110 */ 595, 468, 468, 468, 595, 522, 522, 522, 468, 513,
+ /* 120 */ 468, 513, 595, 595, 595, 595, 595, 455, 595, 595,
+ /* 130 */ 595, 595, 595, 595, 455, 513, 595, 595, 595, 595,
+ /* 140 */ 595, 468, 595, 595, 595, 595, 522, 473, 558, 491,
+ /* 150 */ 478, 472, 497, 495, 496, 513, 471, 556, 595, 595,
+ /* 160 */ 523, 595, 595, 595, 595, 595, 595, 595, 595, 595,
+ /* 170 */ 595, 595, 595, 595, 595, 595, 595, 595, 595, 595,
+ /* 180 */ 516, 595, 518, 519, 595, 520, 540, 542, 595, 539,
+ /* 190 */ 522, 517, 541, 410, 562, 559, 536, 522, 475, 551,
+ /* 200 */ 594, 594, 512, 550, 522, 555, 555, 555, 522, 470,
+ /* 210 */ 504, 504, 595, 504, 490, 534, 504, 595, 595, 494,
+ /* 220 */ 595, 500, 595, 595, 494, 595, 595, 595, 595, 595,
+ /* 230 */ 595, 595, 494, 595, 595, 500, 502, 595, 595, 595,
+ /* 240 */ 506, 534, 560, 595, 595, 595, 595, 595, 595, 595,
+ /* 250 */ 595, 534, 463, 534, 595, 595, 595, 401, 543, 400,
+ /* 260 */ 402, 546, 445, 398, 397, 393, 464, 438, 593, 467,
+ /* 270 */ 435, 395, 440, 434, 439, 396, 399, 456, 531, 420,
+ /* 280 */ 529, 392, 528, 506, 527, 535, 444, 557, 545, 544,
+ /* 290 */ 530, 412, 453, 526, 505, 419, 507, 525, 532, 470,
+ /* 300 */ 514, 521, 524, 508, 510, 482, 483, 416, 415, 417,
+ /* 310 */ 418, 477, 511, 515, 538, 469, 509, 534, 533, 432,
+ /* 320 */ 446, 447, 443, 442, 436, 454, 433, 441, 554, 448,
+ /* 330 */ 498, 499, 501, 503, 452, 451, 449, 450, 552, 553,
+ /* 340 */ 486, 487, 589, 430, 582, 583, 584, 431, 429, 426,
+ /* 350 */ 537, 427, 428, 406, 587, 575, 404, 577, 576, 405,
+ /* 360 */ 585, 586, 588, 591, 592, 425, 424, 569, 568, 570,
+ /* 370 */ 571, 572, 567, 566, 414, 563, 564, 565, 573, 574,
+ /* 380 */ 422, 590, 407, 423, 421, 408, 474, 413, 411, 409,
+ /* 390 */ 403,
+);
+ const YYNOCODE = 124;
+ const YYSTACKDEPTH = 100;
+ const YYNSTATE = 391;
+ const YYNRULE = 204;
+ const YYERRORSYMBOL = 81;
+ const YYERRSYMDT = 'yy0';
+ const YYFALLBACK = 0;
+ static public $yyFallback = array(
+ );
+ static function Trace($TraceFILE, $zTracePrompt)
+ {
+ if (!$TraceFILE) {
+ $zTracePrompt = 0;
+ } elseif (!$zTracePrompt) {
+ $TraceFILE = 0;
+ }
+ self::$yyTraceFILE = $TraceFILE;
+ self::$yyTracePrompt = $zTracePrompt;
+ }
+
+ static function PrintTrace()
+ {
+ self::$yyTraceFILE = fopen('php://output', 'w');
+ self::$yyTracePrompt = '<br>';
+ }
+
+ static public $yyTraceFILE;
+ static public $yyTracePrompt;
+ public $yyidx; /* Index of top element in stack */
+ public $yyerrcnt; /* Shifts left before out of the error */
+ public $yystack = array(); /* The parser's stack */
+
+ public $yyTokenName = array(
+ '$', 'VERT', 'COLON', 'COMMENT',
+ 'PHPSTARTTAG', 'PHPENDTAG', 'ASPSTARTTAG', 'ASPENDTAG',
+ 'FAKEPHPSTARTTAG', 'XMLTAG', 'TEXT', 'STRIPON',
+ 'STRIPOFF', 'LITERALSTART', 'LITERALEND', 'LITERAL',
+ 'LDEL', 'RDEL', 'DOLLAR', 'ID',
+ 'EQUAL', 'PTR', 'LDELIF', 'LDELFOR',
+ 'SEMICOLON', 'INCDEC', 'TO', 'STEP',
+ 'LDELFOREACH', 'SPACE', 'AS', 'APTR',
+ 'LDELSETFILTER', 'SMARTYBLOCKCHILD', 'LDELSLASH', 'ATTR',
+ 'INTEGER', 'COMMA', 'OPENP', 'CLOSEP',
+ 'MATH', 'UNIMATH', 'ANDSYM', 'ISIN',
+ 'ISDIVBY', 'ISNOTDIVBY', 'ISEVEN', 'ISNOTEVEN',
+ 'ISEVENBY', 'ISNOTEVENBY', 'ISODD', 'ISNOTODD',
+ 'ISODDBY', 'ISNOTODDBY', 'INSTANCEOF', 'QMARK',
+ 'NOT', 'TYPECAST', 'HEX', 'DOT',
+ 'SINGLEQUOTESTRING', 'DOUBLECOLON', 'AT', 'HATCH',
+ 'OPENB', 'CLOSEB', 'EQUALS', 'NOTEQUALS',
+ 'GREATERTHAN', 'LESSTHAN', 'GREATEREQUAL', 'LESSEQUAL',
+ 'IDENTITY', 'NONEIDENTITY', 'MOD', 'LAND',
+ 'LOR', 'LXOR', 'QUOTE', 'BACKTICK',
+ 'DOLLARID', 'error', 'start', 'template',
+ 'template_element', 'smartytag', 'literal', 'literal_elements',
+ 'literal_element', 'value', 'modifierlist', 'attributes',
+ 'expr', 'varindexed', 'statement', 'statements',
+ 'optspace', 'varvar', 'foraction', 'modparameters',
+ 'attribute', 'ternary', 'array', 'ifcond',
+ 'lop', 'variable', 'function', 'doublequoted_with_quotes',
+ 'static_class_access', 'object', 'arrayindex', 'indexdef',
+ 'varvarele', 'objectchain', 'objectelement', 'method',
+ 'params', 'modifier', 'modparameter', 'arrayelements',
+ 'arrayelement', 'doublequoted', 'doublequotedcontent',
+ );
+
+ static public $yyRuleName = array(
+ /* 0 */ "start ::= template",
+ /* 1 */ "template ::= template_element",
+ /* 2 */ "template ::= template template_element",
+ /* 3 */ "template ::=",
+ /* 4 */ "template_element ::= smartytag",
+ /* 5 */ "template_element ::= COMMENT",
+ /* 6 */ "template_element ::= literal",
+ /* 7 */ "template_element ::= PHPSTARTTAG",
+ /* 8 */ "template_element ::= PHPENDTAG",
+ /* 9 */ "template_element ::= ASPSTARTTAG",
+ /* 10 */ "template_element ::= ASPENDTAG",
+ /* 11 */ "template_element ::= FAKEPHPSTARTTAG",
+ /* 12 */ "template_element ::= XMLTAG",
+ /* 13 */ "template_element ::= TEXT",
+ /* 14 */ "template_element ::= STRIPON",
+ /* 15 */ "template_element ::= STRIPOFF",
+ /* 16 */ "literal ::= LITERALSTART LITERALEND",
+ /* 17 */ "literal ::= LITERALSTART literal_elements LITERALEND",
+ /* 18 */ "literal_elements ::= literal_elements literal_element",
+ /* 19 */ "literal_elements ::=",
+ /* 20 */ "literal_element ::= literal",
+ /* 21 */ "literal_element ::= LITERAL",
+ /* 22 */ "literal_element ::= PHPSTARTTAG",
+ /* 23 */ "literal_element ::= FAKEPHPSTARTTAG",
+ /* 24 */ "literal_element ::= PHPENDTAG",
+ /* 25 */ "literal_element ::= ASPSTARTTAG",
+ /* 26 */ "literal_element ::= ASPENDTAG",
+ /* 27 */ "smartytag ::= LDEL value RDEL",
+ /* 28 */ "smartytag ::= LDEL value modifierlist attributes RDEL",
+ /* 29 */ "smartytag ::= LDEL value attributes RDEL",
+ /* 30 */ "smartytag ::= LDEL expr modifierlist attributes RDEL",
+ /* 31 */ "smartytag ::= LDEL expr attributes RDEL",
+ /* 32 */ "smartytag ::= LDEL DOLLAR ID EQUAL value RDEL",
+ /* 33 */ "smartytag ::= LDEL DOLLAR ID EQUAL expr RDEL",
+ /* 34 */ "smartytag ::= LDEL DOLLAR ID EQUAL expr attributes RDEL",
+ /* 35 */ "smartytag ::= LDEL varindexed EQUAL expr attributes RDEL",
+ /* 36 */ "smartytag ::= LDEL ID attributes RDEL",
+ /* 37 */ "smartytag ::= LDEL ID RDEL",
+ /* 38 */ "smartytag ::= LDEL ID PTR ID attributes RDEL",
+ /* 39 */ "smartytag ::= LDEL ID modifierlist attributes RDEL",
+ /* 40 */ "smartytag ::= LDEL ID PTR ID modifierlist attributes RDEL",
+ /* 41 */ "smartytag ::= LDELIF expr RDEL",
+ /* 42 */ "smartytag ::= LDELIF expr attributes RDEL",
+ /* 43 */ "smartytag ::= LDELIF statement RDEL",
+ /* 44 */ "smartytag ::= LDELIF statement attributes RDEL",
+ /* 45 */ "smartytag ::= LDELFOR statements SEMICOLON optspace expr SEMICOLON optspace DOLLAR varvar foraction attributes RDEL",
+ /* 46 */ "foraction ::= EQUAL expr",
+ /* 47 */ "foraction ::= INCDEC",
+ /* 48 */ "smartytag ::= LDELFOR statement TO expr attributes RDEL",
+ /* 49 */ "smartytag ::= LDELFOR statement TO expr STEP expr attributes RDEL",
+ /* 50 */ "smartytag ::= LDELFOREACH attributes RDEL",
+ /* 51 */ "smartytag ::= LDELFOREACH SPACE value AS DOLLAR varvar attributes RDEL",
+ /* 52 */ "smartytag ::= LDELFOREACH SPACE value AS DOLLAR varvar APTR DOLLAR varvar attributes RDEL",
+ /* 53 */ "smartytag ::= LDELFOREACH SPACE expr AS DOLLAR varvar attributes RDEL",
+ /* 54 */ "smartytag ::= LDELFOREACH SPACE expr AS DOLLAR varvar APTR DOLLAR varvar attributes RDEL",
+ /* 55 */ "smartytag ::= LDELSETFILTER ID modparameters RDEL",
+ /* 56 */ "smartytag ::= LDELSETFILTER ID modparameters modifierlist RDEL",
+ /* 57 */ "smartytag ::= SMARTYBLOCKCHILD",
+ /* 58 */ "smartytag ::= LDELSLASH ID RDEL",
+ /* 59 */ "smartytag ::= LDELSLASH ID modifierlist RDEL",
+ /* 60 */ "smartytag ::= LDELSLASH ID PTR ID RDEL",
+ /* 61 */ "smartytag ::= LDELSLASH ID PTR ID modifierlist RDEL",
+ /* 62 */ "attributes ::= attributes attribute",
+ /* 63 */ "attributes ::= attribute",
+ /* 64 */ "attributes ::=",
+ /* 65 */ "attribute ::= SPACE ID EQUAL ID",
+ /* 66 */ "attribute ::= ATTR expr",
+ /* 67 */ "attribute ::= ATTR value",
+ /* 68 */ "attribute ::= SPACE ID",
+ /* 69 */ "attribute ::= SPACE expr",
+ /* 70 */ "attribute ::= SPACE value",
+ /* 71 */ "attribute ::= SPACE INTEGER EQUAL expr",
+ /* 72 */ "statements ::= statement",
+ /* 73 */ "statements ::= statements COMMA statement",
+ /* 74 */ "statement ::= DOLLAR varvar EQUAL expr",
+ /* 75 */ "statement ::= varindexed EQUAL expr",
+ /* 76 */ "statement ::= OPENP statement CLOSEP",
+ /* 77 */ "expr ::= value",
+ /* 78 */ "expr ::= ternary",
+ /* 79 */ "expr ::= DOLLAR ID COLON ID",
+ /* 80 */ "expr ::= expr MATH value",
+ /* 81 */ "expr ::= expr UNIMATH value",
+ /* 82 */ "expr ::= expr ANDSYM value",
+ /* 83 */ "expr ::= array",
+ /* 84 */ "expr ::= expr modifierlist",
+ /* 85 */ "expr ::= expr ifcond expr",
+ /* 86 */ "expr ::= expr ISIN array",
+ /* 87 */ "expr ::= expr ISIN value",
+ /* 88 */ "expr ::= expr lop expr",
+ /* 89 */ "expr ::= expr ISDIVBY expr",
+ /* 90 */ "expr ::= expr ISNOTDIVBY expr",
+ /* 91 */ "expr ::= expr ISEVEN",
+ /* 92 */ "expr ::= expr ISNOTEVEN",
+ /* 93 */ "expr ::= expr ISEVENBY expr",
+ /* 94 */ "expr ::= expr ISNOTEVENBY expr",
+ /* 95 */ "expr ::= expr ISODD",
+ /* 96 */ "expr ::= expr ISNOTODD",
+ /* 97 */ "expr ::= expr ISODDBY expr",
+ /* 98 */ "expr ::= expr ISNOTODDBY expr",
+ /* 99 */ "expr ::= value INSTANCEOF ID",
+ /* 100 */ "expr ::= value INSTANCEOF value",
+ /* 101 */ "ternary ::= OPENP expr CLOSEP QMARK DOLLAR ID COLON expr",
+ /* 102 */ "ternary ::= OPENP expr CLOSEP QMARK expr COLON expr",
+ /* 103 */ "value ::= variable",
+ /* 104 */ "value ::= UNIMATH value",
+ /* 105 */ "value ::= NOT value",
+ /* 106 */ "value ::= TYPECAST value",
+ /* 107 */ "value ::= variable INCDEC",
+ /* 108 */ "value ::= HEX",
+ /* 109 */ "value ::= INTEGER",
+ /* 110 */ "value ::= INTEGER DOT INTEGER",
+ /* 111 */ "value ::= INTEGER DOT",
+ /* 112 */ "value ::= DOT INTEGER",
+ /* 113 */ "value ::= ID",
+ /* 114 */ "value ::= function",
+ /* 115 */ "value ::= OPENP expr CLOSEP",
+ /* 116 */ "value ::= SINGLEQUOTESTRING",
+ /* 117 */ "value ::= doublequoted_with_quotes",
+ /* 118 */ "value ::= ID DOUBLECOLON static_class_access",
+ /* 119 */ "value ::= varindexed DOUBLECOLON static_class_access",
+ /* 120 */ "value ::= smartytag",
+ /* 121 */ "value ::= value modifierlist",
+ /* 122 */ "variable ::= varindexed",
+ /* 123 */ "variable ::= DOLLAR varvar AT ID",
+ /* 124 */ "variable ::= object",
+ /* 125 */ "variable ::= HATCH ID HATCH",
+ /* 126 */ "variable ::= HATCH ID HATCH arrayindex",
+ /* 127 */ "variable ::= HATCH variable HATCH",
+ /* 128 */ "variable ::= HATCH variable HATCH arrayindex",
+ /* 129 */ "varindexed ::= DOLLAR varvar arrayindex",
+ /* 130 */ "arrayindex ::= arrayindex indexdef",
+ /* 131 */ "arrayindex ::=",
+ /* 132 */ "indexdef ::= DOT DOLLAR varvar",
+ /* 133 */ "indexdef ::= DOT DOLLAR varvar AT ID",
+ /* 134 */ "indexdef ::= DOT ID",
+ /* 135 */ "indexdef ::= DOT INTEGER",
+ /* 136 */ "indexdef ::= DOT LDEL expr RDEL",
+ /* 137 */ "indexdef ::= OPENB ID CLOSEB",
+ /* 138 */ "indexdef ::= OPENB ID DOT ID CLOSEB",
+ /* 139 */ "indexdef ::= OPENB expr CLOSEB",
+ /* 140 */ "indexdef ::= OPENB CLOSEB",
+ /* 141 */ "varvar ::= varvarele",
+ /* 142 */ "varvar ::= varvar varvarele",
+ /* 143 */ "varvarele ::= ID",
+ /* 144 */ "varvarele ::= LDEL expr RDEL",
+ /* 145 */ "object ::= varindexed objectchain",
+ /* 146 */ "objectchain ::= objectelement",
+ /* 147 */ "objectchain ::= objectchain objectelement",
+ /* 148 */ "objectelement ::= PTR ID arrayindex",
+ /* 149 */ "objectelement ::= PTR DOLLAR varvar arrayindex",
+ /* 150 */ "objectelement ::= PTR LDEL expr RDEL arrayindex",
+ /* 151 */ "objectelement ::= PTR ID LDEL expr RDEL arrayindex",
+ /* 152 */ "objectelement ::= PTR method",
+ /* 153 */ "function ::= ID OPENP params CLOSEP",
+ /* 154 */ "method ::= ID OPENP params CLOSEP",
+ /* 155 */ "method ::= DOLLAR ID OPENP params CLOSEP",
+ /* 156 */ "params ::= params COMMA expr",
+ /* 157 */ "params ::= expr",
+ /* 158 */ "params ::=",
+ /* 159 */ "modifierlist ::= modifierlist modifier modparameters",
+ /* 160 */ "modifierlist ::= modifier modparameters",
+ /* 161 */ "modifier ::= VERT AT ID",
+ /* 162 */ "modifier ::= VERT ID",
+ /* 163 */ "modparameters ::= modparameters modparameter",
+ /* 164 */ "modparameters ::=",
+ /* 165 */ "modparameter ::= COLON value",
+ /* 166 */ "modparameter ::= COLON array",
+ /* 167 */ "static_class_access ::= method",
+ /* 168 */ "static_class_access ::= method objectchain",
+ /* 169 */ "static_class_access ::= ID",
+ /* 170 */ "static_class_access ::= DOLLAR ID arrayindex",
+ /* 171 */ "static_class_access ::= DOLLAR ID arrayindex objectchain",
+ /* 172 */ "ifcond ::= EQUALS",
+ /* 173 */ "ifcond ::= NOTEQUALS",
+ /* 174 */ "ifcond ::= GREATERTHAN",
+ /* 175 */ "ifcond ::= LESSTHAN",
+ /* 176 */ "ifcond ::= GREATEREQUAL",
+ /* 177 */ "ifcond ::= LESSEQUAL",
+ /* 178 */ "ifcond ::= IDENTITY",
+ /* 179 */ "ifcond ::= NONEIDENTITY",
+ /* 180 */ "ifcond ::= MOD",
+ /* 181 */ "lop ::= LAND",
+ /* 182 */ "lop ::= LOR",
+ /* 183 */ "lop ::= LXOR",
+ /* 184 */ "array ::= OPENB arrayelements CLOSEB",
+ /* 185 */ "arrayelements ::= arrayelement",
+ /* 186 */ "arrayelements ::= arrayelements COMMA arrayelement",
+ /* 187 */ "arrayelements ::=",
+ /* 188 */ "arrayelement ::= value APTR expr",
+ /* 189 */ "arrayelement ::= ID APTR expr",
+ /* 190 */ "arrayelement ::= expr",
+ /* 191 */ "doublequoted_with_quotes ::= QUOTE QUOTE",
+ /* 192 */ "doublequoted_with_quotes ::= QUOTE doublequoted QUOTE",
+ /* 193 */ "doublequoted ::= doublequoted doublequotedcontent",
+ /* 194 */ "doublequoted ::= doublequotedcontent",
+ /* 195 */ "doublequotedcontent ::= BACKTICK variable BACKTICK",
+ /* 196 */ "doublequotedcontent ::= BACKTICK expr BACKTICK",
+ /* 197 */ "doublequotedcontent ::= DOLLARID",
+ /* 198 */ "doublequotedcontent ::= LDEL variable RDEL",
+ /* 199 */ "doublequotedcontent ::= LDEL expr RDEL",
+ /* 200 */ "doublequotedcontent ::= smartytag",
+ /* 201 */ "doublequotedcontent ::= TEXT",
+ /* 202 */ "optspace ::= SPACE",
+ /* 203 */ "optspace ::=",
+ );
+
+ function tokenName($tokenType)
+ {
+ if ($tokenType === 0) {
+ return 'End of Input';
+ }
+ if ($tokenType > 0 && $tokenType < count($this->yyTokenName)) {
+ return $this->yyTokenName[$tokenType];
+ } else {
+ return "Unknown";
+ }
+ }
+
+ static function yy_destructor($yymajor, $yypminor)
+ {
+ switch ($yymajor) {
+ default: break; /* If no destructor action specified: do nothing */
+ }
+ }
+
+ function yy_pop_parser_stack()
+ {
+ if (!count($this->yystack)) {
+ return;
+ }
+ $yytos = array_pop($this->yystack);
+ if (self::$yyTraceFILE && $this->yyidx >= 0) {
+ fwrite(self::$yyTraceFILE,
+ self::$yyTracePrompt . 'Popping ' . $this->yyTokenName[$yytos->major] .
+ "\n");
+ }
+ $yymajor = $yytos->major;
+ self::yy_destructor($yymajor, $yytos->minor);
+ $this->yyidx--;
+ return $yymajor;
+ }
+
+ function __destruct()
+ {
+ while ($this->yystack !== Array()) {
+ $this->yy_pop_parser_stack();
+ }
+ if (is_resource(self::$yyTraceFILE)) {
+ fclose(self::$yyTraceFILE);
+ }
+ }
+
+ function yy_get_expected_tokens($token)
+ {
+ $state = $this->yystack[$this->yyidx]->stateno;
+ $expected = self::$yyExpectedTokens[$state];
+ if (in_array($token, self::$yyExpectedTokens[$state], true)) {
+ return $expected;
+ }
+ $stack = $this->yystack;
+ $yyidx = $this->yyidx;
+ do {
+ $yyact = $this->yy_find_shift_action($token);
+ if ($yyact >= self::YYNSTATE && $yyact < self::YYNSTATE + self::YYNRULE) {
+ // reduce action
+ $done = 0;
+ do {
+ if ($done++ == 100) {
+ $this->yyidx = $yyidx;
+ $this->yystack = $stack;
+ // too much recursion prevents proper detection
+ // so give up
+ return array_unique($expected);
+ }
+ $yyruleno = $yyact - self::YYNSTATE;
+ $this->yyidx -= self::$yyRuleInfo[$yyruleno]['rhs'];
+ $nextstate = $this->yy_find_reduce_action(
+ $this->yystack[$this->yyidx]->stateno,
+ self::$yyRuleInfo[$yyruleno]['lhs']);
+ if (isset(self::$yyExpectedTokens[$nextstate])) {
+ $expected = array_merge($expected, self::$yyExpectedTokens[$nextstate]);
+ if (in_array($token,
+ self::$yyExpectedTokens[$nextstate], true)) {
+ $this->yyidx = $yyidx;
+ $this->yystack = $stack;
+ return array_unique($expected);
+ }
+ }
+ if ($nextstate < self::YYNSTATE) {
+ // we need to shift a non-terminal
+ $this->yyidx++;
+ $x = new TP_yyStackEntry;
+ $x->stateno = $nextstate;
+ $x->major = self::$yyRuleInfo[$yyruleno]['lhs'];
+ $this->yystack[$this->yyidx] = $x;
+ continue 2;
+ } elseif ($nextstate == self::YYNSTATE + self::YYNRULE + 1) {
+ $this->yyidx = $yyidx;
+ $this->yystack = $stack;
+ // the last token was just ignored, we can't accept
+ // by ignoring input, this is in essence ignoring a
+ // syntax error!
+ return array_unique($expected);
+ } elseif ($nextstate === self::YY_NO_ACTION) {
+ $this->yyidx = $yyidx;
+ $this->yystack = $stack;
+ // input accepted, but not shifted (I guess)
+ return $expected;
+ } else {
+ $yyact = $nextstate;
+ }
+ } while (true);
+ }
+ break;
+ } while (true);
+ $this->yyidx = $yyidx;
+ $this->yystack = $stack;
+ return array_unique($expected);
+ }
+
+ function yy_is_expected_token($token)
+ {
+ if ($token === 0) {
+ return true; // 0 is not part of this
+ }
+ $state = $this->yystack[$this->yyidx]->stateno;
+ if (in_array($token, self::$yyExpectedTokens[$state], true)) {
+ return true;
+ }
+ $stack = $this->yystack;
+ $yyidx = $this->yyidx;
+ do {
+ $yyact = $this->yy_find_shift_action($token);
+ if ($yyact >= self::YYNSTATE && $yyact < self::YYNSTATE + self::YYNRULE) {
+ // reduce action
+ $done = 0;
+ do {
+ if ($done++ == 100) {
+ $this->yyidx = $yyidx;
+ $this->yystack = $stack;
+ // too much recursion prevents proper detection
+ // so give up
+ return true;
+ }
+ $yyruleno = $yyact - self::YYNSTATE;
+ $this->yyidx -= self::$yyRuleInfo[$yyruleno]['rhs'];
+ $nextstate = $this->yy_find_reduce_action(
+ $this->yystack[$this->yyidx]->stateno,
+ self::$yyRuleInfo[$yyruleno]['lhs']);
+ if (isset(self::$yyExpectedTokens[$nextstate]) &&
+ in_array($token, self::$yyExpectedTokens[$nextstate], true)) {
+ $this->yyidx = $yyidx;
+ $this->yystack = $stack;
+ return true;
+ }
+ if ($nextstate < self::YYNSTATE) {
+ // we need to shift a non-terminal
+ $this->yyidx++;
+ $x = new TP_yyStackEntry;
+ $x->stateno = $nextstate;
+ $x->major = self::$yyRuleInfo[$yyruleno]['lhs'];
+ $this->yystack[$this->yyidx] = $x;
+ continue 2;
+ } elseif ($nextstate == self::YYNSTATE + self::YYNRULE + 1) {
+ $this->yyidx = $yyidx;
+ $this->yystack = $stack;
+ if (!$token) {
+ // end of input: this is valid
+ return true;
+ }
+ // the last token was just ignored, we can't accept
+ // by ignoring input, this is in essence ignoring a
+ // syntax error!
+ return false;
+ } elseif ($nextstate === self::YY_NO_ACTION) {
+ $this->yyidx = $yyidx;
+ $this->yystack = $stack;
+ // input accepted, but not shifted (I guess)
+ return true;
+ } else {
+ $yyact = $nextstate;
+ }
+ } while (true);
+ }
+ break;
+ } while (true);
+ $this->yyidx = $yyidx;
+ $this->yystack = $stack;
+ return true;
+ }
+
+ function yy_find_shift_action($iLookAhead)
+ {
+ $stateno = $this->yystack[$this->yyidx]->stateno;
+
+ /* if ($this->yyidx < 0) return self::YY_NO_ACTION; */
+ if (!isset(self::$yy_shift_ofst[$stateno])) {
+ // no shift actions
+ return self::$yy_default[$stateno];
+ }
+ $i = self::$yy_shift_ofst[$stateno];
+ if ($i === self::YY_SHIFT_USE_DFLT) {
+ return self::$yy_default[$stateno];
+ }
+ if ($iLookAhead == self::YYNOCODE) {
+ return self::YY_NO_ACTION;
+ }
+ $i += $iLookAhead;
+ if ($i < 0 || $i >= self::YY_SZ_ACTTAB ||
+ self::$yy_lookahead[$i] != $iLookAhead) {
+ if (count(self::$yyFallback) && $iLookAhead < count(self::$yyFallback)
+ && ($iFallback = self::$yyFallback[$iLookAhead]) != 0) {
+ if (self::$yyTraceFILE) {
+ fwrite(self::$yyTraceFILE, self::$yyTracePrompt . "FALLBACK " .
+ $this->yyTokenName[$iLookAhead] . " => " .
+ $this->yyTokenName[$iFallback] . "\n");
+ }
+ return $this->yy_find_shift_action($iFallback);
+ }
+ return self::$yy_default[$stateno];
+ } else {
+ return self::$yy_action[$i];
+ }
+ }
+
+ function yy_find_reduce_action($stateno, $iLookAhead)
+ {
+ /* $stateno = $this->yystack[$this->yyidx]->stateno; */
+
+ if (!isset(self::$yy_reduce_ofst[$stateno])) {
+ return self::$yy_default[$stateno];
+ }
+ $i = self::$yy_reduce_ofst[$stateno];
+ if ($i == self::YY_REDUCE_USE_DFLT) {
+ return self::$yy_default[$stateno];
+ }
+ if ($iLookAhead == self::YYNOCODE) {
+ return self::YY_NO_ACTION;
+ }
+ $i += $iLookAhead;
+ if ($i < 0 || $i >= self::YY_SZ_ACTTAB ||
+ self::$yy_lookahead[$i] != $iLookAhead) {
+ return self::$yy_default[$stateno];
+ } else {
+ return self::$yy_action[$i];
+ }
+ }
+
+ function yy_shift($yyNewState, $yyMajor, $yypMinor)
+ {
+ $this->yyidx++;
+ if ($this->yyidx >= self::YYSTACKDEPTH) {
+ $this->yyidx--;
+ if (self::$yyTraceFILE) {
+ fprintf(self::$yyTraceFILE, "%sStack Overflow!\n", self::$yyTracePrompt);
+ }
+ while ($this->yyidx >= 0) {
+ $this->yy_pop_parser_stack();
+ }
+#line 84 "smarty_internal_templateparser.y"
+
+ $this->internalError = true;
+ $this->compiler->trigger_template_error("Stack overflow in template parser");
+#line 1724 "smarty_internal_templateparser.php"
+ return;
+ }
+ $yytos = new TP_yyStackEntry;
+ $yytos->stateno = $yyNewState;
+ $yytos->major = $yyMajor;
+ $yytos->minor = $yypMinor;
+ array_push($this->yystack, $yytos);
+ if (self::$yyTraceFILE && $this->yyidx > 0) {
+ fprintf(self::$yyTraceFILE, "%sShift %d\n", self::$yyTracePrompt,
+ $yyNewState);
+ fprintf(self::$yyTraceFILE, "%sStack:", self::$yyTracePrompt);
+ for($i = 1; $i <= $this->yyidx; $i++) {
+ fprintf(self::$yyTraceFILE, " %s",
+ $this->yyTokenName[$this->yystack[$i]->major]);
+ }
+ fwrite(self::$yyTraceFILE,"\n");
+ }
+ }
+
+ static public $yyRuleInfo = array(
+ array( 'lhs' => 82, 'rhs' => 1 ),
+ array( 'lhs' => 83, 'rhs' => 1 ),
+ array( 'lhs' => 83, 'rhs' => 2 ),
+ array( 'lhs' => 83, 'rhs' => 0 ),
+ array( 'lhs' => 84, 'rhs' => 1 ),
+ array( 'lhs' => 84, 'rhs' => 1 ),
+ array( 'lhs' => 84, 'rhs' => 1 ),
+ array( 'lhs' => 84, 'rhs' => 1 ),
+ array( 'lhs' => 84, 'rhs' => 1 ),
+ array( 'lhs' => 84, 'rhs' => 1 ),
+ array( 'lhs' => 84, 'rhs' => 1 ),
+ array( 'lhs' => 84, 'rhs' => 1 ),
+ array( 'lhs' => 84, 'rhs' => 1 ),
+ array( 'lhs' => 84, 'rhs' => 1 ),
+ array( 'lhs' => 84, 'rhs' => 1 ),
+ array( 'lhs' => 84, 'rhs' => 1 ),
+ array( 'lhs' => 86, 'rhs' => 2 ),
+ array( 'lhs' => 86, 'rhs' => 3 ),
+ array( 'lhs' => 87, 'rhs' => 2 ),
+ array( 'lhs' => 87, 'rhs' => 0 ),
+ array( 'lhs' => 88, 'rhs' => 1 ),
+ array( 'lhs' => 88, 'rhs' => 1 ),
+ array( 'lhs' => 88, 'rhs' => 1 ),
+ array( 'lhs' => 88, 'rhs' => 1 ),
+ array( 'lhs' => 88, 'rhs' => 1 ),
+ array( 'lhs' => 88, 'rhs' => 1 ),
+ array( 'lhs' => 88, 'rhs' => 1 ),
+ array( 'lhs' => 85, 'rhs' => 3 ),
+ array( 'lhs' => 85, 'rhs' => 5 ),
+ array( 'lhs' => 85, 'rhs' => 4 ),
+ array( 'lhs' => 85, 'rhs' => 5 ),
+ array( 'lhs' => 85, 'rhs' => 4 ),
+ array( 'lhs' => 85, 'rhs' => 6 ),
+ array( 'lhs' => 85, 'rhs' => 6 ),
+ array( 'lhs' => 85, 'rhs' => 7 ),
+ array( 'lhs' => 85, 'rhs' => 6 ),
+ array( 'lhs' => 85, 'rhs' => 4 ),
+ array( 'lhs' => 85, 'rhs' => 3 ),
+ array( 'lhs' => 85, 'rhs' => 6 ),
+ array( 'lhs' => 85, 'rhs' => 5 ),
+ array( 'lhs' => 85, 'rhs' => 7 ),
+ array( 'lhs' => 85, 'rhs' => 3 ),
+ array( 'lhs' => 85, 'rhs' => 4 ),
+ array( 'lhs' => 85, 'rhs' => 3 ),
+ array( 'lhs' => 85, 'rhs' => 4 ),
+ array( 'lhs' => 85, 'rhs' => 12 ),
+ array( 'lhs' => 98, 'rhs' => 2 ),
+ array( 'lhs' => 98, 'rhs' => 1 ),
+ array( 'lhs' => 85, 'rhs' => 6 ),
+ array( 'lhs' => 85, 'rhs' => 8 ),
+ array( 'lhs' => 85, 'rhs' => 3 ),
+ array( 'lhs' => 85, 'rhs' => 8 ),
+ array( 'lhs' => 85, 'rhs' => 11 ),
+ array( 'lhs' => 85, 'rhs' => 8 ),
+ array( 'lhs' => 85, 'rhs' => 11 ),
+ array( 'lhs' => 85, 'rhs' => 4 ),
+ array( 'lhs' => 85, 'rhs' => 5 ),
+ array( 'lhs' => 85, 'rhs' => 1 ),
+ array( 'lhs' => 85, 'rhs' => 3 ),
+ array( 'lhs' => 85, 'rhs' => 4 ),
+ array( 'lhs' => 85, 'rhs' => 5 ),
+ array( 'lhs' => 85, 'rhs' => 6 ),
+ array( 'lhs' => 91, 'rhs' => 2 ),
+ array( 'lhs' => 91, 'rhs' => 1 ),
+ array( 'lhs' => 91, 'rhs' => 0 ),
+ array( 'lhs' => 100, 'rhs' => 4 ),
+ array( 'lhs' => 100, 'rhs' => 2 ),
+ array( 'lhs' => 100, 'rhs' => 2 ),
+ array( 'lhs' => 100, 'rhs' => 2 ),
+ array( 'lhs' => 100, 'rhs' => 2 ),
+ array( 'lhs' => 100, 'rhs' => 2 ),
+ array( 'lhs' => 100, 'rhs' => 4 ),
+ array( 'lhs' => 95, 'rhs' => 1 ),
+ array( 'lhs' => 95, 'rhs' => 3 ),
+ array( 'lhs' => 94, 'rhs' => 4 ),
+ array( 'lhs' => 94, 'rhs' => 3 ),
+ array( 'lhs' => 94, 'rhs' => 3 ),
+ array( 'lhs' => 92, 'rhs' => 1 ),
+ array( 'lhs' => 92, 'rhs' => 1 ),
+ array( 'lhs' => 92, 'rhs' => 4 ),
+ array( 'lhs' => 92, 'rhs' => 3 ),
+ array( 'lhs' => 92, 'rhs' => 3 ),
+ array( 'lhs' => 92, 'rhs' => 3 ),
+ array( 'lhs' => 92, 'rhs' => 1 ),
+ array( 'lhs' => 92, 'rhs' => 2 ),
+ array( 'lhs' => 92, 'rhs' => 3 ),
+ array( 'lhs' => 92, 'rhs' => 3 ),
+ array( 'lhs' => 92, 'rhs' => 3 ),
+ array( 'lhs' => 92, 'rhs' => 3 ),
+ array( 'lhs' => 92, 'rhs' => 3 ),
+ array( 'lhs' => 92, 'rhs' => 3 ),
+ array( 'lhs' => 92, 'rhs' => 2 ),
+ array( 'lhs' => 92, 'rhs' => 2 ),
+ array( 'lhs' => 92, 'rhs' => 3 ),
+ array( 'lhs' => 92, 'rhs' => 3 ),
+ array( 'lhs' => 92, 'rhs' => 2 ),
+ array( 'lhs' => 92, 'rhs' => 2 ),
+ array( 'lhs' => 92, 'rhs' => 3 ),
+ array( 'lhs' => 92, 'rhs' => 3 ),
+ array( 'lhs' => 92, 'rhs' => 3 ),
+ array( 'lhs' => 92, 'rhs' => 3 ),
+ array( 'lhs' => 101, 'rhs' => 8 ),
+ array( 'lhs' => 101, 'rhs' => 7 ),
+ array( 'lhs' => 89, 'rhs' => 1 ),
+ array( 'lhs' => 89, 'rhs' => 2 ),
+ array( 'lhs' => 89, 'rhs' => 2 ),
+ array( 'lhs' => 89, 'rhs' => 2 ),
+ array( 'lhs' => 89, 'rhs' => 2 ),
+ array( 'lhs' => 89, 'rhs' => 1 ),
+ array( 'lhs' => 89, 'rhs' => 1 ),
+ array( 'lhs' => 89, 'rhs' => 3 ),
+ array( 'lhs' => 89, 'rhs' => 2 ),
+ array( 'lhs' => 89, 'rhs' => 2 ),
+ array( 'lhs' => 89, 'rhs' => 1 ),
+ array( 'lhs' => 89, 'rhs' => 1 ),
+ array( 'lhs' => 89, 'rhs' => 3 ),
+ array( 'lhs' => 89, 'rhs' => 1 ),
+ array( 'lhs' => 89, 'rhs' => 1 ),
+ array( 'lhs' => 89, 'rhs' => 3 ),
+ array( 'lhs' => 89, 'rhs' => 3 ),
+ array( 'lhs' => 89, 'rhs' => 1 ),
+ array( 'lhs' => 89, 'rhs' => 2 ),
+ array( 'lhs' => 105, 'rhs' => 1 ),
+ array( 'lhs' => 105, 'rhs' => 4 ),
+ array( 'lhs' => 105, 'rhs' => 1 ),
+ array( 'lhs' => 105, 'rhs' => 3 ),
+ array( 'lhs' => 105, 'rhs' => 4 ),
+ array( 'lhs' => 105, 'rhs' => 3 ),
+ array( 'lhs' => 105, 'rhs' => 4 ),
+ array( 'lhs' => 93, 'rhs' => 3 ),
+ array( 'lhs' => 110, 'rhs' => 2 ),
+ array( 'lhs' => 110, 'rhs' => 0 ),
+ array( 'lhs' => 111, 'rhs' => 3 ),
+ array( 'lhs' => 111, 'rhs' => 5 ),
+ array( 'lhs' => 111, 'rhs' => 2 ),
+ array( 'lhs' => 111, 'rhs' => 2 ),
+ array( 'lhs' => 111, 'rhs' => 4 ),
+ array( 'lhs' => 111, 'rhs' => 3 ),
+ array( 'lhs' => 111, 'rhs' => 5 ),
+ array( 'lhs' => 111, 'rhs' => 3 ),
+ array( 'lhs' => 111, 'rhs' => 2 ),
+ array( 'lhs' => 97, 'rhs' => 1 ),
+ array( 'lhs' => 97, 'rhs' => 2 ),
+ array( 'lhs' => 112, 'rhs' => 1 ),
+ array( 'lhs' => 112, 'rhs' => 3 ),
+ array( 'lhs' => 109, 'rhs' => 2 ),
+ array( 'lhs' => 113, 'rhs' => 1 ),
+ array( 'lhs' => 113, 'rhs' => 2 ),
+ array( 'lhs' => 114, 'rhs' => 3 ),
+ array( 'lhs' => 114, 'rhs' => 4 ),
+ array( 'lhs' => 114, 'rhs' => 5 ),
+ array( 'lhs' => 114, 'rhs' => 6 ),
+ array( 'lhs' => 114, 'rhs' => 2 ),
+ array( 'lhs' => 106, 'rhs' => 4 ),
+ array( 'lhs' => 115, 'rhs' => 4 ),
+ array( 'lhs' => 115, 'rhs' => 5 ),
+ array( 'lhs' => 116, 'rhs' => 3 ),
+ array( 'lhs' => 116, 'rhs' => 1 ),
+ array( 'lhs' => 116, 'rhs' => 0 ),
+ array( 'lhs' => 90, 'rhs' => 3 ),
+ array( 'lhs' => 90, 'rhs' => 2 ),
+ array( 'lhs' => 117, 'rhs' => 3 ),
+ array( 'lhs' => 117, 'rhs' => 2 ),
+ array( 'lhs' => 99, 'rhs' => 2 ),
+ array( 'lhs' => 99, 'rhs' => 0 ),
+ array( 'lhs' => 118, 'rhs' => 2 ),
+ array( 'lhs' => 118, 'rhs' => 2 ),
+ array( 'lhs' => 108, 'rhs' => 1 ),
+ array( 'lhs' => 108, 'rhs' => 2 ),
+ array( 'lhs' => 108, 'rhs' => 1 ),
+ array( 'lhs' => 108, 'rhs' => 3 ),
+ array( 'lhs' => 108, 'rhs' => 4 ),
+ array( 'lhs' => 103, 'rhs' => 1 ),
+ array( 'lhs' => 103, 'rhs' => 1 ),
+ array( 'lhs' => 103, 'rhs' => 1 ),
+ array( 'lhs' => 103, 'rhs' => 1 ),
+ array( 'lhs' => 103, 'rhs' => 1 ),
+ array( 'lhs' => 103, 'rhs' => 1 ),
+ array( 'lhs' => 103, 'rhs' => 1 ),
+ array( 'lhs' => 103, 'rhs' => 1 ),
+ array( 'lhs' => 103, 'rhs' => 1 ),
+ array( 'lhs' => 104, 'rhs' => 1 ),
+ array( 'lhs' => 104, 'rhs' => 1 ),
+ array( 'lhs' => 104, 'rhs' => 1 ),
+ array( 'lhs' => 102, 'rhs' => 3 ),
+ array( 'lhs' => 119, 'rhs' => 1 ),
+ array( 'lhs' => 119, 'rhs' => 3 ),
+ array( 'lhs' => 119, 'rhs' => 0 ),
+ array( 'lhs' => 120, 'rhs' => 3 ),
+ array( 'lhs' => 120, 'rhs' => 3 ),
+ array( 'lhs' => 120, 'rhs' => 1 ),
+ array( 'lhs' => 107, 'rhs' => 2 ),
+ array( 'lhs' => 107, 'rhs' => 3 ),
+ array( 'lhs' => 121, 'rhs' => 2 ),
+ array( 'lhs' => 121, 'rhs' => 1 ),
+ array( 'lhs' => 122, 'rhs' => 3 ),
+ array( 'lhs' => 122, 'rhs' => 3 ),
+ array( 'lhs' => 122, 'rhs' => 1 ),
+ array( 'lhs' => 122, 'rhs' => 3 ),
+ array( 'lhs' => 122, 'rhs' => 3 ),
+ array( 'lhs' => 122, 'rhs' => 1 ),
+ array( 'lhs' => 122, 'rhs' => 1 ),
+ array( 'lhs' => 96, 'rhs' => 1 ),
+ array( 'lhs' => 96, 'rhs' => 0 ),
+ );
+
+ static public $yyReduceMap = array(
+ 0 => 0,
+ 1 => 1,
+ 2 => 1,
+ 4 => 4,
+ 5 => 5,
+ 6 => 6,
+ 7 => 7,
+ 8 => 8,
+ 9 => 9,
+ 10 => 10,
+ 11 => 11,
+ 12 => 12,
+ 13 => 13,
+ 14 => 14,
+ 15 => 15,
+ 16 => 16,
+ 19 => 16,
+ 203 => 16,
+ 17 => 17,
+ 76 => 17,
+ 18 => 18,
+ 104 => 18,
+ 106 => 18,
+ 107 => 18,
+ 130 => 18,
+ 168 => 18,
+ 20 => 20,
+ 21 => 20,
+ 47 => 20,
+ 69 => 20,
+ 70 => 20,
+ 77 => 20,
+ 78 => 20,
+ 83 => 20,
+ 103 => 20,
+ 108 => 20,
+ 109 => 20,
+ 114 => 20,
+ 116 => 20,
+ 117 => 20,
+ 124 => 20,
+ 141 => 20,
+ 167 => 20,
+ 169 => 20,
+ 185 => 20,
+ 190 => 20,
+ 202 => 20,
+ 22 => 22,
+ 23 => 22,
+ 24 => 24,
+ 25 => 25,
+ 26 => 26,
+ 27 => 27,
+ 28 => 28,
+ 29 => 29,
+ 31 => 29,
+ 30 => 30,
+ 32 => 32,
+ 33 => 32,
+ 34 => 34,
+ 35 => 35,
+ 36 => 36,
+ 37 => 37,
+ 38 => 38,
+ 39 => 39,
+ 40 => 40,
+ 41 => 41,
+ 42 => 42,
+ 44 => 42,
+ 43 => 43,
+ 45 => 45,
+ 46 => 46,
+ 48 => 48,
+ 49 => 49,
+ 50 => 50,
+ 51 => 51,
+ 52 => 52,
+ 53 => 53,
+ 54 => 54,
+ 55 => 55,
+ 56 => 56,
+ 57 => 57,
+ 58 => 58,
+ 59 => 59,
+ 60 => 60,
+ 61 => 61,
+ 62 => 62,
+ 63 => 63,
+ 72 => 63,
+ 157 => 63,
+ 161 => 63,
+ 165 => 63,
+ 166 => 63,
+ 64 => 64,
+ 158 => 64,
+ 164 => 64,
+ 65 => 65,
+ 66 => 66,
+ 67 => 66,
+ 68 => 68,
+ 71 => 71,
+ 73 => 73,
+ 74 => 74,
+ 75 => 74,
+ 79 => 79,
+ 80 => 80,
+ 81 => 80,
+ 82 => 80,
+ 84 => 84,
+ 121 => 84,
+ 85 => 85,
+ 88 => 85,
+ 99 => 85,
+ 86 => 86,
+ 87 => 87,
+ 89 => 89,
+ 90 => 90,
+ 91 => 91,
+ 96 => 91,
+ 92 => 92,
+ 95 => 92,
+ 93 => 93,
+ 98 => 93,
+ 94 => 94,
+ 97 => 94,
+ 100 => 100,
+ 101 => 101,
+ 102 => 102,
+ 105 => 105,
+ 110 => 110,
+ 111 => 111,
+ 112 => 112,
+ 113 => 113,
+ 115 => 115,
+ 118 => 118,
+ 119 => 119,
+ 120 => 120,
+ 122 => 122,
+ 123 => 123,
+ 125 => 125,
+ 126 => 126,
+ 127 => 127,
+ 128 => 128,
+ 129 => 129,
+ 131 => 131,
+ 187 => 131,
+ 132 => 132,
+ 133 => 133,
+ 134 => 134,
+ 135 => 135,
+ 136 => 136,
+ 139 => 136,
+ 137 => 137,
+ 138 => 138,
+ 140 => 140,
+ 142 => 142,
+ 143 => 143,
+ 144 => 144,
+ 145 => 145,
+ 146 => 146,
+ 147 => 147,
+ 148 => 148,
+ 149 => 149,
+ 150 => 150,
+ 151 => 151,
+ 152 => 152,
+ 153 => 153,
+ 154 => 154,
+ 155 => 155,
+ 156 => 156,
+ 159 => 159,
+ 160 => 160,
+ 162 => 162,
+ 163 => 163,
+ 170 => 170,
+ 171 => 171,
+ 172 => 172,
+ 173 => 173,
+ 174 => 174,
+ 175 => 175,
+ 176 => 176,
+ 177 => 177,
+ 178 => 178,
+ 179 => 179,
+ 180 => 180,
+ 181 => 181,
+ 182 => 182,
+ 183 => 183,
+ 184 => 184,
+ 186 => 186,
+ 188 => 188,
+ 189 => 189,
+ 191 => 191,
+ 192 => 192,
+ 193 => 193,
+ 194 => 194,
+ 195 => 195,
+ 196 => 195,
+ 198 => 195,
+ 197 => 197,
+ 199 => 199,
+ 200 => 200,
+ 201 => 201,
+ );
+#line 95 "smarty_internal_templateparser.y"
+ function yy_r0(){
+ $this->_retvalue = $this->root_buffer->to_smarty_php();
+ }
+#line 2160 "smarty_internal_templateparser.php"
+#line 103 "smarty_internal_templateparser.y"
+ function yy_r1(){
+ $this->current_buffer->append_subtree($this->yystack[$this->yyidx + 0]->minor);
+ }
+#line 2165 "smarty_internal_templateparser.php"
+#line 119 "smarty_internal_templateparser.y"
+ function yy_r4(){
+ if ($this->compiler->has_code) {
+ $tmp =''; foreach ($this->compiler->prefix_code as $code) {$tmp.=$code;} $this->compiler->prefix_code=array();
+ $this->_retvalue = new _smarty_tag($this, $this->compiler->processNocacheCode($tmp.$this->yystack[$this->yyidx + 0]->minor,true));
+ } else {
+ $this->_retvalue = new _smarty_tag($this, $this->yystack[$this->yyidx + 0]->minor);
+ }
+ $this->compiler->has_variable_string = false;
+ $this->block_nesting_level = count($this->compiler->_tag_stack);
+ }
+#line 2177 "smarty_internal_templateparser.php"
+#line 131 "smarty_internal_templateparser.y"
+ function yy_r5(){
+ $this->_retvalue = new _smarty_tag($this, '');
+ }
+#line 2182 "smarty_internal_templateparser.php"
+#line 136 "smarty_internal_templateparser.y"
+ function yy_r6(){
+ $this->_retvalue = new _smarty_text($this, $this->yystack[$this->yyidx + 0]->minor);
+ }
+#line 2187 "smarty_internal_templateparser.php"
+#line 141 "smarty_internal_templateparser.y"
+ function yy_r7(){
+ if ($this->php_handling == Smarty::PHP_PASSTHRU) {
+ $this->_retvalue = new _smarty_text($this, self::escape_start_tag($this->yystack[$this->yyidx + 0]->minor));
+ } elseif ($this->php_handling == Smarty::PHP_QUOTE) {
+ $this->_retvalue = new _smarty_text($this, htmlspecialchars($this->yystack[$this->yyidx + 0]->minor, ENT_QUOTES));
+ } elseif ($this->php_handling == Smarty::PHP_ALLOW) {
+ if (!($this->smarty instanceof SmartyBC)) {
+ $this->compiler->trigger_template_error (self::Err3);
+ }
+ $this->_retvalue = new _smarty_text($this, $this->compiler->processNocacheCode('<?php', true));
+ } elseif ($this->php_handling == Smarty::PHP_REMOVE) {
+ $this->_retvalue = new _smarty_text($this, '');
+ }
+ }
+#line 2203 "smarty_internal_templateparser.php"
+#line 157 "smarty_internal_templateparser.y"
+ function yy_r8(){
+ if ($this->is_xml) {
+ $this->compiler->tag_nocache = true;
+ $this->is_xml = false;
+ $save = $this->template->has_nocache_code;
+ $this->_retvalue = new _smarty_text($this, $this->compiler->processNocacheCode("<?php echo '?>';?>\n", $this->compiler, true));
+ $this->template->has_nocache_code = $save;
+ } elseif ($this->php_handling == Smarty::PHP_PASSTHRU) {
+ $this->_retvalue = new _smarty_text($this, '?<?php ?>>');
+ } elseif ($this->php_handling == Smarty::PHP_QUOTE) {
+ $this->_retvalue = new _smarty_text($this, htmlspecialchars('?>', ENT_QUOTES));
+ } elseif ($this->php_handling == Smarty::PHP_ALLOW) {
+ $this->_retvalue = new _smarty_text($this, $this->compiler->processNocacheCode('?>', true));
+ } elseif ($this->php_handling == Smarty::PHP_REMOVE) {
+ $this->_retvalue = new _smarty_text($this, '');
+ }
+ }
+#line 2222 "smarty_internal_templateparser.php"
+#line 176 "smarty_internal_templateparser.y"
+ function yy_r9(){
+ if ($this->php_handling == Smarty::PHP_PASSTHRU) {
+ $this->_retvalue = new _smarty_text($this, '<<?php ?>%');
+ } elseif ($this->php_handling == Smarty::PHP_QUOTE) {
+ $this->_retvalue = new _smarty_text($this, htmlspecialchars($this->yystack[$this->yyidx + 0]->minor, ENT_QUOTES));
+ } elseif ($this->php_handling == Smarty::PHP_ALLOW) {
+ if ($this->asp_tags) {
+ if (!($this->smarty instanceof SmartyBC)) {
+ $this->compiler->trigger_template_error (self::Err3);
+ }
+ $this->_retvalue = new _smarty_text($this, $this->compiler->processNocacheCode('<%', true));
+ } else {
+ $this->_retvalue = new _smarty_text($this, '<<?php ?>%');
+ }
+ } elseif ($this->php_handling == Smarty::PHP_REMOVE) {
+ if ($this->asp_tags) {
+ $this->_retvalue = new _smarty_text($this, '');
+ } else {
+ $this->_retvalue = new _smarty_text($this, '<<?php ?>%');
+ }
+ }
+ }
+#line 2246 "smarty_internal_templateparser.php"
+#line 200 "smarty_internal_templateparser.y"
+ function yy_r10(){
+ if ($this->php_handling == Smarty::PHP_PASSTHRU) {
+ $this->_retvalue = new _smarty_text($this, '%<?php ?>>');
+ } elseif ($this->php_handling == Smarty::PHP_QUOTE) {
+ $this->_retvalue = new _smarty_text($this, htmlspecialchars('%>', ENT_QUOTES));
+ } elseif ($this->php_handling == Smarty::PHP_ALLOW) {
+ if ($this->asp_tags) {
+ $this->_retvalue = new _smarty_text($this, $this->compiler->processNocacheCode('%>', true));
+ } else {
+ $this->_retvalue = new _smarty_text($this, '%<?php ?>>');
+ }
+ } elseif ($this->php_handling == Smarty::PHP_REMOVE) {
+ if ($this->asp_tags) {
+ $this->_retvalue = new _smarty_text($this, '');
+ } else {
+ $this->_retvalue = new _smarty_text($this, '%<?php ?>>');
+ }
+ }
+ }
+#line 2267 "smarty_internal_templateparser.php"
+#line 220 "smarty_internal_templateparser.y"
+ function yy_r11(){
+ if ($this->strip) {
+ $this->_retvalue = new _smarty_text($this, preg_replace('![\t ]*[\r\n]+[\t ]*!', ' ', self::escape_start_tag($this->yystack[$this->yyidx + 0]->minor)));
+ } else {
+ $this->_retvalue = new _smarty_text($this, self::escape_start_tag($this->yystack[$this->yyidx + 0]->minor));
+ }
+ }
+#line 2276 "smarty_internal_templateparser.php"
+#line 229 "smarty_internal_templateparser.y"
+ function yy_r12(){
+ $this->compiler->tag_nocache = true;
+ $this->is_xml = true;
+ $save = $this->template->has_nocache_code;
+ $this->_retvalue = new _smarty_text($this, $this->compiler->processNocacheCode("<?php echo '<?xml';?>", $this->compiler, true));
+ $this->template->has_nocache_code = $save;
+ }
+#line 2285 "smarty_internal_templateparser.php"
+#line 238 "smarty_internal_templateparser.y"
+ function yy_r13(){
+ if ($this->strip) {
+ $this->_retvalue = new _smarty_text($this, preg_replace('![\t ]*[\r\n]+[\t ]*!', ' ', $this->yystack[$this->yyidx + 0]->minor));
+ } else {
+ $this->_retvalue = new _smarty_text($this, $this->yystack[$this->yyidx + 0]->minor);
+ }
+ }
+#line 2294 "smarty_internal_templateparser.php"
+#line 247 "smarty_internal_templateparser.y"
+ function yy_r14(){
+ $this->strip = true;
+ $this->_retvalue = new _smarty_text($this, '');
+ }
+#line 2300 "smarty_internal_templateparser.php"
+#line 252 "smarty_internal_templateparser.y"
+ function yy_r15(){
+ $this->strip = false;
+ $this->_retvalue = new _smarty_text($this, '');
+ }
+#line 2306 "smarty_internal_templateparser.php"
+#line 258 "smarty_internal_templateparser.y"
+ function yy_r16(){
+ $this->_retvalue = '';
+ }
+#line 2311 "smarty_internal_templateparser.php"
+#line 262 "smarty_internal_templateparser.y"
+ function yy_r17(){
+ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor;
+ }
+#line 2316 "smarty_internal_templateparser.php"
+#line 266 "smarty_internal_templateparser.y"
+ function yy_r18(){
+ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;
+ }
+#line 2321 "smarty_internal_templateparser.php"
+#line 274 "smarty_internal_templateparser.y"
+ function yy_r20(){
+ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;
+ }
+#line 2326 "smarty_internal_templateparser.php"
+#line 282 "smarty_internal_templateparser.y"
+ function yy_r22(){
+ $this->_retvalue = self::escape_start_tag($this->yystack[$this->yyidx + 0]->minor);
+ }
+#line 2331 "smarty_internal_templateparser.php"
+#line 290 "smarty_internal_templateparser.y"
+ function yy_r24(){
+ $this->_retvalue = self::escape_end_tag($this->yystack[$this->yyidx + 0]->minor);
+ }
+#line 2336 "smarty_internal_templateparser.php"
+#line 294 "smarty_internal_templateparser.y"
+ function yy_r25(){
+ $this->_retvalue = '<<?php ?>%';
+ }
+#line 2341 "smarty_internal_templateparser.php"
+#line 298 "smarty_internal_templateparser.y"
+ function yy_r26(){
+ $this->_retvalue = '%<?php ?>>';
+ }
+#line 2346 "smarty_internal_templateparser.php"
+#line 307 "smarty_internal_templateparser.y"
+ function yy_r27(){
+ $this->_retvalue = $this->compiler->compileTag('private_print_expression',array(),array('value'=>$this->yystack[$this->yyidx + -1]->minor));
+ }
+#line 2351 "smarty_internal_templateparser.php"
+#line 311 "smarty_internal_templateparser.y"
+ function yy_r28(){
+ $this->_retvalue = $this->compiler->compileTag('private_print_expression',$this->yystack[$this->yyidx + -1]->minor,array('value'=>$this->yystack[$this->yyidx + -3]->minor, 'modifierlist'=>$this->yystack[$this->yyidx + -2]->minor));
+ }
+#line 2356 "smarty_internal_templateparser.php"
+#line 315 "smarty_internal_templateparser.y"
+ function yy_r29(){
+ $this->_retvalue = $this->compiler->compileTag('private_print_expression',$this->yystack[$this->yyidx + -1]->minor,array('value'=>$this->yystack[$this->yyidx + -2]->minor));
+ }
+#line 2361 "smarty_internal_templateparser.php"
+#line 319 "smarty_internal_templateparser.y"
+ function yy_r30(){
+ $this->_retvalue = $this->compiler->compileTag('private_print_expression',$this->yystack[$this->yyidx + -1]->minor,array('value'=>$this->yystack[$this->yyidx + -3]->minor,'modifierlist'=>$this->yystack[$this->yyidx + -2]->minor));
+ }
+#line 2366 "smarty_internal_templateparser.php"
+#line 332 "smarty_internal_templateparser.y"
+ function yy_r32(){
+ $this->_retvalue = $this->compiler->compileTag('assign',array(array('value'=>$this->yystack[$this->yyidx + -1]->minor),array('var'=>"'".$this->yystack[$this->yyidx + -3]->minor."'")));
+ }
+#line 2371 "smarty_internal_templateparser.php"
+#line 340 "smarty_internal_templateparser.y"
+ function yy_r34(){
+ $this->_retvalue = $this->compiler->compileTag('assign',array_merge(array(array('value'=>$this->yystack[$this->yyidx + -2]->minor),array('var'=>"'".$this->yystack[$this->yyidx + -4]->minor."'")),$this->yystack[$this->yyidx + -1]->minor));
+ }
+#line 2376 "smarty_internal_templateparser.php"
+#line 344 "smarty_internal_templateparser.y"
+ function yy_r35(){
+ $this->_retvalue = $this->compiler->compileTag('assign',array_merge(array(array('value'=>$this->yystack[$this->yyidx + -2]->minor),array('var'=>$this->yystack[$this->yyidx + -4]->minor['var'])),$this->yystack[$this->yyidx + -1]->minor),array('smarty_internal_index'=>$this->yystack[$this->yyidx + -4]->minor['smarty_internal_index']));
+ }
+#line 2381 "smarty_internal_templateparser.php"
+#line 349 "smarty_internal_templateparser.y"
+ function yy_r36(){
+ $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -2]->minor,$this->yystack[$this->yyidx + -1]->minor);
+ }
+#line 2386 "smarty_internal_templateparser.php"
+#line 353 "smarty_internal_templateparser.y"
+ function yy_r37(){
+ $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -1]->minor,array());
+ }
+#line 2391 "smarty_internal_templateparser.php"
+#line 358 "smarty_internal_templateparser.y"
+ function yy_r38(){
+ $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -4]->minor,$this->yystack[$this->yyidx + -1]->minor,array('object_methode'=>$this->yystack[$this->yyidx + -2]->minor));
+ }
+#line 2396 "smarty_internal_templateparser.php"
+#line 363 "smarty_internal_templateparser.y"
+ function yy_r39(){
+ $this->_retvalue = '<?php ob_start();?>'.$this->compiler->compileTag($this->yystack[$this->yyidx + -3]->minor,$this->yystack[$this->yyidx + -1]->minor).'<?php echo ';
+ $this->_retvalue .= $this->compiler->compileTag('private_modifier',array(),array('modifierlist'=>$this->yystack[$this->yyidx + -2]->minor,'value'=>'ob_get_clean()')).'?>';
+ }
+#line 2402 "smarty_internal_templateparser.php"
+#line 369 "smarty_internal_templateparser.y"
+ function yy_r40(){
+ $this->_retvalue = '<?php ob_start();?>'.$this->compiler->compileTag($this->yystack[$this->yyidx + -5]->minor,$this->yystack[$this->yyidx + -1]->minor,array('object_methode'=>$this->yystack[$this->yyidx + -3]->minor)).'<?php echo ';
+ $this->_retvalue .= $this->compiler->compileTag('private_modifier',array(),array('modifierlist'=>$this->yystack[$this->yyidx + -2]->minor,'value'=>'ob_get_clean()')).'?>';
+ }
+#line 2408 "smarty_internal_templateparser.php"
+#line 375 "smarty_internal_templateparser.y"
+ function yy_r41(){
+ $tag = trim(substr($this->yystack[$this->yyidx + -2]->minor,$this->lex->ldel_length));
+ $this->_retvalue = $this->compiler->compileTag(($tag == 'else if')? 'elseif' : $tag,array(),array('if condition'=>$this->yystack[$this->yyidx + -1]->minor));
+ }
+#line 2414 "smarty_internal_templateparser.php"
+#line 380 "smarty_internal_templateparser.y"
+ function yy_r42(){
+ $tag = trim(substr($this->yystack[$this->yyidx + -3]->minor,$this->lex->ldel_length));
+ $this->_retvalue = $this->compiler->compileTag(($tag == 'else if')? 'elseif' : $tag,$this->yystack[$this->yyidx + -1]->minor,array('if condition'=>$this->yystack[$this->yyidx + -2]->minor));
+ }
+#line 2420 "smarty_internal_templateparser.php"
+#line 385 "smarty_internal_templateparser.y"
+ function yy_r43(){
+ $tag = trim(substr($this->yystack[$this->yyidx + -2]->minor,$this->lex->ldel_length));
+ $this->_retvalue = $this->compiler->compileTag(($tag == 'else if')? 'elseif' : $tag,array(),array('if condition'=>$this->yystack[$this->yyidx + -1]->minor));
+ }
+#line 2426 "smarty_internal_templateparser.php"
+#line 396 "smarty_internal_templateparser.y"
+ function yy_r45(){
+ $this->_retvalue = $this->compiler->compileTag('for',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('start'=>$this->yystack[$this->yyidx + -10]->minor),array('ifexp'=>$this->yystack[$this->yyidx + -7]->minor),array('var'=>$this->yystack[$this->yyidx + -3]->minor),array('step'=>$this->yystack[$this->yyidx + -2]->minor))),1);
+ }
+#line 2431 "smarty_internal_templateparser.php"
+#line 400 "smarty_internal_templateparser.y"
+ function yy_r46(){
+ $this->_retvalue = '='.$this->yystack[$this->yyidx + 0]->minor;
+ }
+#line 2436 "smarty_internal_templateparser.php"
+#line 408 "smarty_internal_templateparser.y"
+ function yy_r48(){
+ $this->_retvalue = $this->compiler->compileTag('for',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('start'=>$this->yystack[$this->yyidx + -4]->minor),array('to'=>$this->yystack[$this->yyidx + -2]->minor))),0);
+ }
+#line 2441 "smarty_internal_templateparser.php"
+#line 412 "smarty_internal_templateparser.y"
+ function yy_r49(){
+ $this->_retvalue = $this->compiler->compileTag('for',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('start'=>$this->yystack[$this->yyidx + -6]->minor),array('to'=>$this->yystack[$this->yyidx + -4]->minor),array('step'=>$this->yystack[$this->yyidx + -2]->minor))),0);
+ }
+#line 2446 "smarty_internal_templateparser.php"
+#line 417 "smarty_internal_templateparser.y"
+ function yy_r50(){
+ $this->_retvalue = $this->compiler->compileTag('foreach',$this->yystack[$this->yyidx + -1]->minor);
+ }
+#line 2451 "smarty_internal_templateparser.php"
+#line 422 "smarty_internal_templateparser.y"
+ function yy_r51(){
+ $this->_retvalue = $this->compiler->compileTag('foreach',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('from'=>$this->yystack[$this->yyidx + -5]->minor),array('item'=>$this->yystack[$this->yyidx + -2]->minor))));
+ }
+#line 2456 "smarty_internal_templateparser.php"
+#line 426 "smarty_internal_templateparser.y"
+ function yy_r52(){
+ $this->_retvalue = $this->compiler->compileTag('foreach',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('from'=>$this->yystack[$this->yyidx + -8]->minor),array('item'=>$this->yystack[$this->yyidx + -2]->minor),array('key'=>$this->yystack[$this->yyidx + -5]->minor))));
+ }
+#line 2461 "smarty_internal_templateparser.php"
+#line 430 "smarty_internal_templateparser.y"
+ function yy_r53(){
+ $this->_retvalue = $this->compiler->compileTag('foreach',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('from'=>$this->yystack[$this->yyidx + -5]->minor),array('item'=>$this->yystack[$this->yyidx + -2]->minor))));
+ }
+#line 2466 "smarty_internal_templateparser.php"
+#line 434 "smarty_internal_templateparser.y"
+ function yy_r54(){
+ $this->_retvalue = $this->compiler->compileTag('foreach',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('from'=>$this->yystack[$this->yyidx + -8]->minor),array('item'=>$this->yystack[$this->yyidx + -2]->minor),array('key'=>$this->yystack[$this->yyidx + -5]->minor))));
+ }
+#line 2471 "smarty_internal_templateparser.php"
+#line 439 "smarty_internal_templateparser.y"
+ function yy_r55(){
+ $this->_retvalue = $this->compiler->compileTag('setfilter',array(),array('modifier_list'=>array(array_merge(array($this->yystack[$this->yyidx + -2]->minor),$this->yystack[$this->yyidx + -1]->minor))));
+ }
+#line 2476 "smarty_internal_templateparser.php"
+#line 443 "smarty_internal_templateparser.y"
+ function yy_r56(){
+ $this->_retvalue = $this->compiler->compileTag('setfilter',array(),array('modifier_list'=>array_merge(array(array_merge(array($this->yystack[$this->yyidx + -3]->minor),$this->yystack[$this->yyidx + -2]->minor)),$this->yystack[$this->yyidx + -1]->minor)));
+ }
+#line 2481 "smarty_internal_templateparser.php"
+#line 448 "smarty_internal_templateparser.y"
+ function yy_r57(){
+ $this->_retvalue = SMARTY_INTERNAL_COMPILE_BLOCK::compileChildBlock($this->compiler);
+ }
+#line 2486 "smarty_internal_templateparser.php"
+#line 454 "smarty_internal_templateparser.y"
+ function yy_r58(){
+ $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -1]->minor.'close',array());
+ }
+#line 2491 "smarty_internal_templateparser.php"
+#line 458 "smarty_internal_templateparser.y"
+ function yy_r59(){
+ $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -2]->minor.'close',array(),array('modifier_list'=>$this->yystack[$this->yyidx + -1]->minor));
+ }
+#line 2496 "smarty_internal_templateparser.php"
+#line 463 "smarty_internal_templateparser.y"
+ function yy_r60(){
+ $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -3]->minor.'close',array(),array('object_methode'=>$this->yystack[$this->yyidx + -1]->minor));
+ }
+#line 2501 "smarty_internal_templateparser.php"
+#line 467 "smarty_internal_templateparser.y"
+ function yy_r61(){
+ $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -4]->minor.'close',array(),array('object_methode'=>$this->yystack[$this->yyidx + -2]->minor, 'modifier_list'=>$this->yystack[$this->yyidx + -1]->minor));
+ }
+#line 2506 "smarty_internal_templateparser.php"
+#line 475 "smarty_internal_templateparser.y"
+ function yy_r62(){
+ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor;
+ $this->_retvalue[] = $this->yystack[$this->yyidx + 0]->minor;
+ }
+#line 2512 "smarty_internal_templateparser.php"
+#line 481 "smarty_internal_templateparser.y"
+ function yy_r63(){
+ $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor);
+ }
+#line 2517 "smarty_internal_templateparser.php"
+#line 486 "smarty_internal_templateparser.y"
+ function yy_r64(){
+ $this->_retvalue = array();
+ }
+#line 2522 "smarty_internal_templateparser.php"
+#line 491 "smarty_internal_templateparser.y"
+ function yy_r65(){
+ if (preg_match('~^true$~i', $this->yystack[$this->yyidx + 0]->minor)) {
+ $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor=>'true');
+ } elseif (preg_match('~^false$~i', $this->yystack[$this->yyidx + 0]->minor)) {
+ $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor=>'false');
+ } elseif (preg_match('~^null$~i', $this->yystack[$this->yyidx + 0]->minor)) {
+ $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor=>'null');
+ } else {
+ $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor=>"'".$this->yystack[$this->yyidx + 0]->minor."'");
+ }
+ }
+#line 2535 "smarty_internal_templateparser.php"
+#line 503 "smarty_internal_templateparser.y"
+ function yy_r66(){
+ $this->_retvalue = array(trim($this->yystack[$this->yyidx + -1]->minor," =\n\r\t")=>$this->yystack[$this->yyidx + 0]->minor);
+ }
+#line 2540 "smarty_internal_templateparser.php"
+#line 511 "smarty_internal_templateparser.y"
+ function yy_r68(){
+ $this->_retvalue = "'".$this->yystack[$this->yyidx + 0]->minor."'";
+ }
+#line 2545 "smarty_internal_templateparser.php"
+#line 523 "smarty_internal_templateparser.y"
+ function yy_r71(){
+ $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor=>$this->yystack[$this->yyidx + 0]->minor);
+ }
+#line 2550 "smarty_internal_templateparser.php"
+#line 536 "smarty_internal_templateparser.y"
+ function yy_r73(){
+ $this->yystack[$this->yyidx + -2]->minor[]=$this->yystack[$this->yyidx + 0]->minor;
+ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor;
+ }
+#line 2556 "smarty_internal_templateparser.php"
+#line 541 "smarty_internal_templateparser.y"
+ function yy_r74(){
+ $this->_retvalue = array('var' => $this->yystack[$this->yyidx + -2]->minor, 'value'=>$this->yystack[$this->yyidx + 0]->minor);
+ }
+#line 2561 "smarty_internal_templateparser.php"
+#line 569 "smarty_internal_templateparser.y"
+ function yy_r79(){
+ $this->_retvalue = '$_smarty_tpl->getStreamVariable(\''. $this->yystack[$this->yyidx + -2]->minor .'://'. $this->yystack[$this->yyidx + 0]->minor . '\')';
+ }
+#line 2566 "smarty_internal_templateparser.php"
+#line 574 "smarty_internal_templateparser.y"
+ function yy_r80(){
+ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor . trim($this->yystack[$this->yyidx + -1]->minor) . $this->yystack[$this->yyidx + 0]->minor;
+ }
+#line 2571 "smarty_internal_templateparser.php"
+#line 593 "smarty_internal_templateparser.y"
+ function yy_r84(){
+ $this->_retvalue = $this->compiler->compileTag('private_modifier',array(),array('value'=>$this->yystack[$this->yyidx + -1]->minor,'modifierlist'=>$this->yystack[$this->yyidx + 0]->minor));
+ }
+#line 2576 "smarty_internal_templateparser.php"
+#line 599 "smarty_internal_templateparser.y"
+ function yy_r85(){
+ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;
+ }
+#line 2581 "smarty_internal_templateparser.php"
+#line 603 "smarty_internal_templateparser.y"
+ function yy_r86(){
+ $this->_retvalue = 'in_array('.$this->yystack[$this->yyidx + -2]->minor.','.$this->yystack[$this->yyidx + 0]->minor.')';
+ }
+#line 2586 "smarty_internal_templateparser.php"
+#line 607 "smarty_internal_templateparser.y"
+ function yy_r87(){
+ $this->_retvalue = 'in_array('.$this->yystack[$this->yyidx + -2]->minor.',(array)'.$this->yystack[$this->yyidx + 0]->minor.')';
+ }
+#line 2591 "smarty_internal_templateparser.php"
+#line 615 "smarty_internal_templateparser.y"
+ function yy_r89(){
+ $this->_retvalue = '!('.$this->yystack[$this->yyidx + -2]->minor.' % '.$this->yystack[$this->yyidx + 0]->minor.')';
+ }
+#line 2596 "smarty_internal_templateparser.php"
+#line 619 "smarty_internal_templateparser.y"
+ function yy_r90(){
+ $this->_retvalue = '('.$this->yystack[$this->yyidx + -2]->minor.' % '.$this->yystack[$this->yyidx + 0]->minor.')';
+ }
+#line 2601 "smarty_internal_templateparser.php"
+#line 623 "smarty_internal_templateparser.y"
+ function yy_r91(){
+ $this->_retvalue = '!(1 & '.$this->yystack[$this->yyidx + -1]->minor.')';
+ }
+#line 2606 "smarty_internal_templateparser.php"
+#line 627 "smarty_internal_templateparser.y"
+ function yy_r92(){
+ $this->_retvalue = '(1 & '.$this->yystack[$this->yyidx + -1]->minor.')';
+ }
+#line 2611 "smarty_internal_templateparser.php"
+#line 631 "smarty_internal_templateparser.y"
+ function yy_r93(){
+ $this->_retvalue = '!(1 & '.$this->yystack[$this->yyidx + -2]->minor.' / '.$this->yystack[$this->yyidx + 0]->minor.')';
+ }
+#line 2616 "smarty_internal_templateparser.php"
+#line 635 "smarty_internal_templateparser.y"
+ function yy_r94(){
+ $this->_retvalue = '(1 & '.$this->yystack[$this->yyidx + -2]->minor.' / '.$this->yystack[$this->yyidx + 0]->minor.')';
+ }
+#line 2621 "smarty_internal_templateparser.php"
+#line 659 "smarty_internal_templateparser.y"
+ function yy_r100(){
+ $this->prefix_number++;
+ $this->compiler->prefix_code[] = '<?php $_tmp'.$this->prefix_number.'='.$this->yystack[$this->yyidx + 0]->minor.';?>';
+ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + -1]->minor.'$_tmp'.$this->prefix_number;
+ }
+#line 2628 "smarty_internal_templateparser.php"
+#line 668 "smarty_internal_templateparser.y"
+ function yy_r101(){
+ $this->_retvalue = $this->yystack[$this->yyidx + -6]->minor.' ? '. $this->compileVariable("'".$this->yystack[$this->yyidx + -2]->minor."'") . ' : '.$this->yystack[$this->yyidx + 0]->minor;
+ }
+#line 2633 "smarty_internal_templateparser.php"
+#line 672 "smarty_internal_templateparser.y"
+ function yy_r102(){
+ $this->_retvalue = $this->yystack[$this->yyidx + -5]->minor.' ? '.$this->yystack[$this->yyidx + -2]->minor.' : '.$this->yystack[$this->yyidx + 0]->minor;
+ }
+#line 2638 "smarty_internal_templateparser.php"
+#line 687 "smarty_internal_templateparser.y"
+ function yy_r105(){
+ $this->_retvalue = '!'.$this->yystack[$this->yyidx + 0]->minor;
+ }
+#line 2643 "smarty_internal_templateparser.php"
+#line 708 "smarty_internal_templateparser.y"
+ function yy_r110(){
+ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.'.'.$this->yystack[$this->yyidx + 0]->minor;
+ }
+#line 2648 "smarty_internal_templateparser.php"
+#line 712 "smarty_internal_templateparser.y"
+ function yy_r111(){
+ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.'.';
+ }
+#line 2653 "smarty_internal_templateparser.php"
+#line 716 "smarty_internal_templateparser.y"
+ function yy_r112(){
+ $this->_retvalue = '.'.$this->yystack[$this->yyidx + 0]->minor;
+ }
+#line 2658 "smarty_internal_templateparser.php"
+#line 721 "smarty_internal_templateparser.y"
+ function yy_r113(){
+ if (preg_match('~^true$~i', $this->yystack[$this->yyidx + 0]->minor)) {
+ $this->_retvalue = 'true';
+ } elseif (preg_match('~^false$~i', $this->yystack[$this->yyidx + 0]->minor)) {
+ $this->_retvalue = 'false';
+ } elseif (preg_match('~^null$~i', $this->yystack[$this->yyidx + 0]->minor)) {
+ $this->_retvalue = 'null';
+ } else {
+ $this->_retvalue = "'".$this->yystack[$this->yyidx + 0]->minor."'";
+ }
+ }
+#line 2671 "smarty_internal_templateparser.php"
+#line 739 "smarty_internal_templateparser.y"
+ function yy_r115(){
+ $this->_retvalue = "(". $this->yystack[$this->yyidx + -1]->minor .")";
+ }
+#line 2676 "smarty_internal_templateparser.php"
+#line 754 "smarty_internal_templateparser.y"
+ function yy_r118(){
+ if (!$this->security || isset($this->smarty->registered_classes[$this->yystack[$this->yyidx + -2]->minor]) || $this->smarty->security_policy->isTrustedStaticClass($this->yystack[$this->yyidx + -2]->minor, $this->compiler)) {
+ if (isset($this->smarty->registered_classes[$this->yystack[$this->yyidx + -2]->minor])) {
+ $this->_retvalue = $this->smarty->registered_classes[$this->yystack[$this->yyidx + -2]->minor].'::'.$this->yystack[$this->yyidx + 0]->minor;
+ } else {
+ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.'::'.$this->yystack[$this->yyidx + 0]->minor;
+ }
+ } else {
+ $this->compiler->trigger_template_error ("static class '".$this->yystack[$this->yyidx + -2]->minor."' is undefined or not allowed by security setting");
+ }
+ }
+#line 2689 "smarty_internal_templateparser.php"
+#line 766 "smarty_internal_templateparser.y"
+ function yy_r119(){
+ if ($this->yystack[$this->yyidx + -2]->minor['var'] == '\'smarty\'') {
+ $this->_retvalue = $this->compiler->compileTag('private_special_variable',array(),$this->yystack[$this->yyidx + -2]->minor['smarty_internal_index']).'::'.$this->yystack[$this->yyidx + 0]->minor;
+ } else {
+ $this->_retvalue = $this->compileVariable($this->yystack[$this->yyidx + -2]->minor['var']).$this->yystack[$this->yyidx + -2]->minor['smarty_internal_index'].'::'.$this->yystack[$this->yyidx + 0]->minor;
+ }
+ }
+#line 2698 "smarty_internal_templateparser.php"
+#line 775 "smarty_internal_templateparser.y"
+ function yy_r120(){
+ $this->prefix_number++;
+ $this->compiler->prefix_code[] = '<?php ob_start();?>'.$this->yystack[$this->yyidx + 0]->minor.'<?php $_tmp'.$this->prefix_number.'=ob_get_clean();?>';
+ $this->_retvalue = '$_tmp'.$this->prefix_number;
+ }
+#line 2705 "smarty_internal_templateparser.php"
+#line 790 "smarty_internal_templateparser.y"
+ function yy_r122(){
+ if ($this->yystack[$this->yyidx + 0]->minor['var'] == '\'smarty\'') {
+ $smarty_var = $this->compiler->compileTag('private_special_variable',array(),$this->yystack[$this->yyidx + 0]->minor['smarty_internal_index']);
+ $this->_retvalue = $smarty_var;
+ } else {
+ // used for array reset,next,prev,end,current
+ $this->last_variable = $this->yystack[$this->yyidx + 0]->minor['var'];
+ $this->last_index = $this->yystack[$this->yyidx + 0]->minor['smarty_internal_index'];
+ $this->_retvalue = $this->compileVariable($this->yystack[$this->yyidx + 0]->minor['var']).$this->yystack[$this->yyidx + 0]->minor['smarty_internal_index'];
+ }
+ }
+#line 2718 "smarty_internal_templateparser.php"
+#line 803 "smarty_internal_templateparser.y"
+ function yy_r123(){
+ $this->_retvalue = '$_smarty_tpl->tpl_vars['. $this->yystack[$this->yyidx + -2]->minor .']->'.$this->yystack[$this->yyidx + 0]->minor;
+ }
+#line 2723 "smarty_internal_templateparser.php"
+#line 813 "smarty_internal_templateparser.y"
+ function yy_r125(){
+ $this->_retvalue = '$_smarty_tpl->getConfigVariable(\''. $this->yystack[$this->yyidx + -1]->minor .'\')';
+ }
+#line 2728 "smarty_internal_templateparser.php"
+#line 817 "smarty_internal_templateparser.y"
+ function yy_r126(){
+ $this->_retvalue = '(is_array($tmp = $_smarty_tpl->getConfigVariable(\''. $this->yystack[$this->yyidx + -2]->minor .'\')) ? $tmp'.$this->yystack[$this->yyidx + 0]->minor.' :null)';
+ }
+#line 2733 "smarty_internal_templateparser.php"
+#line 821 "smarty_internal_templateparser.y"
+ function yy_r127(){
+ $this->_retvalue = '$_smarty_tpl->getConfigVariable('. $this->yystack[$this->yyidx + -1]->minor .')';
+ }
+#line 2738 "smarty_internal_templateparser.php"
+#line 825 "smarty_internal_templateparser.y"
+ function yy_r128(){
+ $this->_retvalue = '(is_array($tmp = $_smarty_tpl->getConfigVariable('. $this->yystack[$this->yyidx + -2]->minor .')) ? $tmp'.$this->yystack[$this->yyidx + 0]->minor.' : null)';
+ }
+#line 2743 "smarty_internal_templateparser.php"
+#line 829 "smarty_internal_templateparser.y"
+ function yy_r129(){
+ $this->_retvalue = array('var'=>$this->yystack[$this->yyidx + -1]->minor, 'smarty_internal_index'=>$this->yystack[$this->yyidx + 0]->minor);
+ }
+#line 2748 "smarty_internal_templateparser.php"
+#line 842 "smarty_internal_templateparser.y"
+ function yy_r131(){
+ return;
+ }
+#line 2753 "smarty_internal_templateparser.php"
+#line 848 "smarty_internal_templateparser.y"
+ function yy_r132(){
+ $this->_retvalue = '['.$this->compileVariable($this->yystack[$this->yyidx + 0]->minor).']';
+ }
+#line 2758 "smarty_internal_templateparser.php"
+#line 852 "smarty_internal_templateparser.y"
+ function yy_r133(){
+ $this->_retvalue = '['.$this->compileVariable($this->yystack[$this->yyidx + -2]->minor).'->'.$this->yystack[$this->yyidx + 0]->minor.']';
+ }
+#line 2763 "smarty_internal_templateparser.php"
+#line 856 "smarty_internal_templateparser.y"
+ function yy_r134(){
+ $this->_retvalue = "['". $this->yystack[$this->yyidx + 0]->minor ."']";
+ }
+#line 2768 "smarty_internal_templateparser.php"
+#line 860 "smarty_internal_templateparser.y"
+ function yy_r135(){
+ $this->_retvalue = "[". $this->yystack[$this->yyidx + 0]->minor ."]";
+ }
+#line 2773 "smarty_internal_templateparser.php"
+#line 864 "smarty_internal_templateparser.y"
+ function yy_r136(){
+ $this->_retvalue = "[". $this->yystack[$this->yyidx + -1]->minor ."]";
+ }
+#line 2778 "smarty_internal_templateparser.php"
+#line 869 "smarty_internal_templateparser.y"
+ function yy_r137(){
+ $this->_retvalue = '['.$this->compiler->compileTag('private_special_variable',array(),'[\'section\'][\''.$this->yystack[$this->yyidx + -1]->minor.'\'][\'index\']').']';
+ }
+#line 2783 "smarty_internal_templateparser.php"
+#line 873 "smarty_internal_templateparser.y"
+ function yy_r138(){
+ $this->_retvalue = '['.$this->compiler->compileTag('private_special_variable',array(),'[\'section\'][\''.$this->yystack[$this->yyidx + -3]->minor.'\'][\''.$this->yystack[$this->yyidx + -1]->minor.'\']').']';
+ }
+#line 2788 "smarty_internal_templateparser.php"
+#line 883 "smarty_internal_templateparser.y"
+ function yy_r140(){
+ $this->_retvalue = '[]';
+ }
+#line 2793 "smarty_internal_templateparser.php"
+#line 896 "smarty_internal_templateparser.y"
+ function yy_r142(){
+ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.'.'.$this->yystack[$this->yyidx + 0]->minor;
+ }
+#line 2798 "smarty_internal_templateparser.php"
+#line 901 "smarty_internal_templateparser.y"
+ function yy_r143(){
+ $this->_retvalue = '\''.$this->yystack[$this->yyidx + 0]->minor.'\'';
+ }
+#line 2803 "smarty_internal_templateparser.php"
+#line 906 "smarty_internal_templateparser.y"
+ function yy_r144(){
+ $this->_retvalue = '('.$this->yystack[$this->yyidx + -1]->minor.')';
+ }
+#line 2808 "smarty_internal_templateparser.php"
+#line 913 "smarty_internal_templateparser.y"
+ function yy_r145(){
+ if ($this->yystack[$this->yyidx + -1]->minor['var'] == '\'smarty\'') {
+ $this->_retvalue = $this->compiler->compileTag('private_special_variable',array(),$this->yystack[$this->yyidx + -1]->minor['smarty_internal_index']).$this->yystack[$this->yyidx + 0]->minor;
+ } else {
+ $this->_retvalue = $this->compileVariable($this->yystack[$this->yyidx + -1]->minor['var']).$this->yystack[$this->yyidx + -1]->minor['smarty_internal_index'].$this->yystack[$this->yyidx + 0]->minor;
+ }
+ }
+#line 2817 "smarty_internal_templateparser.php"
+#line 922 "smarty_internal_templateparser.y"
+ function yy_r146(){
+ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;
+ }
+#line 2822 "smarty_internal_templateparser.php"
+#line 927 "smarty_internal_templateparser.y"
+ function yy_r147(){
+ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;
+ }
+#line 2827 "smarty_internal_templateparser.php"
+#line 932 "smarty_internal_templateparser.y"
+ function yy_r148(){
+ if ($this->security && substr($this->yystack[$this->yyidx + -1]->minor,0,1) == '_') {
+ $this->compiler->trigger_template_error (self::Err1);
+ }
+ $this->_retvalue = '->'.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;
+ }
+#line 2835 "smarty_internal_templateparser.php"
+#line 939 "smarty_internal_templateparser.y"
+ function yy_r149(){
+ if ($this->security) {
+ $this->compiler->trigger_template_error (self::Err2);
+ }
+ $this->_retvalue = '->{'.$this->compileVariable($this->yystack[$this->yyidx + -1]->minor).$this->yystack[$this->yyidx + 0]->minor.'}';
+ }
+#line 2843 "smarty_internal_templateparser.php"
+#line 946 "smarty_internal_templateparser.y"
+ function yy_r150(){
+ if ($this->security) {
+ $this->compiler->trigger_template_error (self::Err2);
+ }
+ $this->_retvalue = '->{'.$this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + 0]->minor.'}';
+ }
+#line 2851 "smarty_internal_templateparser.php"
+#line 953 "smarty_internal_templateparser.y"
+ function yy_r151(){
+ if ($this->security) {
+ $this->compiler->trigger_template_error (self::Err2);
+ }
+ $this->_retvalue = '->{\''.$this->yystack[$this->yyidx + -4]->minor.'\'.'.$this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + 0]->minor.'}';
+ }
+#line 2859 "smarty_internal_templateparser.php"
+#line 961 "smarty_internal_templateparser.y"
+ function yy_r152(){
+ $this->_retvalue = '->'.$this->yystack[$this->yyidx + 0]->minor;
+ }
+#line 2864 "smarty_internal_templateparser.php"
+#line 969 "smarty_internal_templateparser.y"
+ function yy_r153(){
+ if (!$this->security || $this->smarty->security_policy->isTrustedPhpFunction($this->yystack[$this->yyidx + -3]->minor, $this->compiler)) {
+ if (strcasecmp($this->yystack[$this->yyidx + -3]->minor,'isset') === 0 || strcasecmp($this->yystack[$this->yyidx + -3]->minor,'empty') === 0 || strcasecmp($this->yystack[$this->yyidx + -3]->minor,'array') === 0 || is_callable($this->yystack[$this->yyidx + -3]->minor)) {
+ $func_name = strtolower($this->yystack[$this->yyidx + -3]->minor);
+ if ($func_name == 'isset') {
+ if (count($this->yystack[$this->yyidx + -1]->minor) == 0) {
+ $this->compiler->trigger_template_error ('Illegal number of paramer in "isset()"');
+ }
+ $par = implode(',',$this->yystack[$this->yyidx + -1]->minor);
+ if (strncasecmp($par,'$_smarty_tpl->getConfigVariable',strlen('$_smarty_tpl->getConfigVariable')) === 0) {
+ $this->prefix_number++;
+ $this->compiler->prefix_code[] = '<?php $_tmp'.$this->prefix_number.'='.str_replace(')',', false)',$par).';?>';
+ $isset_par = '$_tmp'.$this->prefix_number;
+ } else {
+ $isset_par=str_replace("')->value","',null,true,false)->value",$par);
+ }
+ $this->_retvalue = $this->yystack[$this->yyidx + -3]->minor . "(". $isset_par .")";
+ } elseif (in_array($func_name,array('empty','reset','current','end','prev','next'))){
+ if (count($this->yystack[$this->yyidx + -1]->minor) != 1) {
+ $this->compiler->trigger_template_error ('Illegal number of paramer in "empty()"');
+ }
+ if ($func_name == 'empty') {
+ $this->_retvalue = $func_name.'('.str_replace("')->value","',null,true,false)->value",$this->yystack[$this->yyidx + -1]->minor[0]).')';
+ } else {
+ $this->_retvalue = $func_name.'('.$this->yystack[$this->yyidx + -1]->minor[0].')';
+ }
+ } else {
+ $this->_retvalue = $this->yystack[$this->yyidx + -3]->minor . "(". implode(',',$this->yystack[$this->yyidx + -1]->minor) .")";
+ }
+ } else {
+ $this->compiler->trigger_template_error ("unknown function \"" . $this->yystack[$this->yyidx + -3]->minor . "\"");
+ }
+ }
+ }
+#line 2900 "smarty_internal_templateparser.php"
+#line 1007 "smarty_internal_templateparser.y"
+ function yy_r154(){
+ if ($this->security && substr($this->yystack[$this->yyidx + -3]->minor,0,1) == '_') {
+ $this->compiler->trigger_template_error (self::Err1);
+ }
+ $this->_retvalue = $this->yystack[$this->yyidx + -3]->minor . "(". implode(',',$this->yystack[$this->yyidx + -1]->minor) .")";
+ }
+#line 2908 "smarty_internal_templateparser.php"
+#line 1014 "smarty_internal_templateparser.y"
+ function yy_r155(){
+ if ($this->security) {
+ $this->compiler->trigger_template_error (self::Err2);
+ }
+ $this->prefix_number++;
+ $this->compiler->prefix_code[] = '<?php $_tmp'.$this->prefix_number.'='.$this->compileVariable("'".$this->yystack[$this->yyidx + -3]->minor."'").';?>';
+ $this->_retvalue = '$_tmp'.$this->prefix_number.'('. implode(',',$this->yystack[$this->yyidx + -1]->minor) .')';
+ }
+#line 2918 "smarty_internal_templateparser.php"
+#line 1025 "smarty_internal_templateparser.y"
+ function yy_r156(){
+ $this->_retvalue = array_merge($this->yystack[$this->yyidx + -2]->minor,array($this->yystack[$this->yyidx + 0]->minor));
+ }
+#line 2923 "smarty_internal_templateparser.php"
+#line 1042 "smarty_internal_templateparser.y"
+ function yy_r159(){
+ $this->_retvalue = array_merge($this->yystack[$this->yyidx + -2]->minor,array(array_merge($this->yystack[$this->yyidx + -1]->minor,$this->yystack[$this->yyidx + 0]->minor)));
+ }
+#line 2928 "smarty_internal_templateparser.php"
+#line 1046 "smarty_internal_templateparser.y"
+ function yy_r160(){
+ $this->_retvalue = array(array_merge($this->yystack[$this->yyidx + -1]->minor,$this->yystack[$this->yyidx + 0]->minor));
+ }
+#line 2933 "smarty_internal_templateparser.php"
+#line 1054 "smarty_internal_templateparser.y"
+ function yy_r162(){
+ $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor);
+ }
+#line 2938 "smarty_internal_templateparser.php"
+#line 1062 "smarty_internal_templateparser.y"
+ function yy_r163(){
+ $this->_retvalue = array_merge($this->yystack[$this->yyidx + -1]->minor,$this->yystack[$this->yyidx + 0]->minor);
+ }
+#line 2943 "smarty_internal_templateparser.php"
+#line 1096 "smarty_internal_templateparser.y"
+ function yy_r170(){
+ $this->_retvalue = '$'.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;
+ }
+#line 2948 "smarty_internal_templateparser.php"
+#line 1101 "smarty_internal_templateparser.y"
+ function yy_r171(){
+ $this->_retvalue = '$'.$this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;
+ }
+#line 2953 "smarty_internal_templateparser.php"
+#line 1107 "smarty_internal_templateparser.y"
+ function yy_r172(){
+ $this->_retvalue = '==';
+ }
+#line 2958 "smarty_internal_templateparser.php"
+#line 1111 "smarty_internal_templateparser.y"
+ function yy_r173(){
+ $this->_retvalue = '!=';
+ }
+#line 2963 "smarty_internal_templateparser.php"
+#line 1115 "smarty_internal_templateparser.y"
+ function yy_r174(){
+ $this->_retvalue = '>';
+ }
+#line 2968 "smarty_internal_templateparser.php"
+#line 1119 "smarty_internal_templateparser.y"
+ function yy_r175(){
+ $this->_retvalue = '<';
+ }
+#line 2973 "smarty_internal_templateparser.php"
+#line 1123 "smarty_internal_templateparser.y"
+ function yy_r176(){
+ $this->_retvalue = '>=';
+ }
+#line 2978 "smarty_internal_templateparser.php"
+#line 1127 "smarty_internal_templateparser.y"
+ function yy_r177(){
+ $this->_retvalue = '<=';
+ }
+#line 2983 "smarty_internal_templateparser.php"
+#line 1131 "smarty_internal_templateparser.y"
+ function yy_r178(){
+ $this->_retvalue = '===';
+ }
+#line 2988 "smarty_internal_templateparser.php"
+#line 1135 "smarty_internal_templateparser.y"
+ function yy_r179(){
+ $this->_retvalue = '!==';
+ }
+#line 2993 "smarty_internal_templateparser.php"
+#line 1139 "smarty_internal_templateparser.y"
+ function yy_r180(){
+ $this->_retvalue = '%';
+ }
+#line 2998 "smarty_internal_templateparser.php"
+#line 1143 "smarty_internal_templateparser.y"
+ function yy_r181(){
+ $this->_retvalue = '&&';
+ }
+#line 3003 "smarty_internal_templateparser.php"
+#line 1147 "smarty_internal_templateparser.y"
+ function yy_r182(){
+ $this->_retvalue = '||';
+ }
+#line 3008 "smarty_internal_templateparser.php"
+#line 1151 "smarty_internal_templateparser.y"
+ function yy_r183(){
+ $this->_retvalue = ' XOR ';
+ }
+#line 3013 "smarty_internal_templateparser.php"
+#line 1158 "smarty_internal_templateparser.y"
+ function yy_r184(){
+ $this->_retvalue = 'array('.$this->yystack[$this->yyidx + -1]->minor.')';
+ }
+#line 3018 "smarty_internal_templateparser.php"
+#line 1166 "smarty_internal_templateparser.y"
+ function yy_r186(){
+ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.','.$this->yystack[$this->yyidx + 0]->minor;
+ }
+#line 3023 "smarty_internal_templateparser.php"
+#line 1174 "smarty_internal_templateparser.y"
+ function yy_r188(){
+ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.'=>'.$this->yystack[$this->yyidx + 0]->minor;
+ }
+#line 3028 "smarty_internal_templateparser.php"
+#line 1178 "smarty_internal_templateparser.y"
+ function yy_r189(){
+ $this->_retvalue = '\''.$this->yystack[$this->yyidx + -2]->minor.'\'=>'.$this->yystack[$this->yyidx + 0]->minor;
+ }
+#line 3033 "smarty_internal_templateparser.php"
+#line 1190 "smarty_internal_templateparser.y"
+ function yy_r191(){
+ $this->_retvalue = "''";
+ }
+#line 3038 "smarty_internal_templateparser.php"
+#line 1194 "smarty_internal_templateparser.y"
+ function yy_r192(){
+ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor->to_smarty_php();
+ }
+#line 3043 "smarty_internal_templateparser.php"
+#line 1199 "smarty_internal_templateparser.y"
+ function yy_r193(){
+ $this->yystack[$this->yyidx + -1]->minor->append_subtree($this->yystack[$this->yyidx + 0]->minor);
+ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor;
+ }
+#line 3049 "smarty_internal_templateparser.php"
+#line 1204 "smarty_internal_templateparser.y"
+ function yy_r194(){
+ $this->_retvalue = new _smarty_doublequoted($this, $this->yystack[$this->yyidx + 0]->minor);
+ }
+#line 3054 "smarty_internal_templateparser.php"
+#line 1208 "smarty_internal_templateparser.y"
+ function yy_r195(){
+ $this->_retvalue = new _smarty_code($this, '(string)'.$this->yystack[$this->yyidx + -1]->minor);
+ }
+#line 3059 "smarty_internal_templateparser.php"
+#line 1216 "smarty_internal_templateparser.y"
+ function yy_r197(){
+ $this->_retvalue = new _smarty_code($this, '(string)$_smarty_tpl->tpl_vars[\''. substr($this->yystack[$this->yyidx + 0]->minor,1) .'\']->value');
+ }
+#line 3064 "smarty_internal_templateparser.php"
+#line 1224 "smarty_internal_templateparser.y"
+ function yy_r199(){
+ $this->_retvalue = new _smarty_code($this, '(string)('.$this->yystack[$this->yyidx + -1]->minor.')');
+ }
+#line 3069 "smarty_internal_templateparser.php"
+#line 1228 "smarty_internal_templateparser.y"
+ function yy_r200(){
+ $this->_retvalue = new _smarty_tag($this, $this->yystack[$this->yyidx + 0]->minor);
+ }
+#line 3074 "smarty_internal_templateparser.php"
+#line 1232 "smarty_internal_templateparser.y"
+ function yy_r201(){
+ $this->_retvalue = new _smarty_dq_content($this, $this->yystack[$this->yyidx + 0]->minor);
+ }
+#line 3079 "smarty_internal_templateparser.php"
+
+ private $_retvalue;
+
+ function yy_reduce($yyruleno)
+ {
+ $yymsp = $this->yystack[$this->yyidx];
+ if (self::$yyTraceFILE && $yyruleno >= 0
+ && $yyruleno < count(self::$yyRuleName)) {
+ fprintf(self::$yyTraceFILE, "%sReduce (%d) [%s].\n",
+ self::$yyTracePrompt, $yyruleno,
+ self::$yyRuleName[$yyruleno]);
+ }
+
+ $this->_retvalue = $yy_lefthand_side = null;
+ if (array_key_exists($yyruleno, self::$yyReduceMap)) {
+ // call the action
+ $this->_retvalue = null;
+ $this->{'yy_r' . self::$yyReduceMap[$yyruleno]}();
+ $yy_lefthand_side = $this->_retvalue;
+ }
+ $yygoto = self::$yyRuleInfo[$yyruleno]['lhs'];
+ $yysize = self::$yyRuleInfo[$yyruleno]['rhs'];
+ $this->yyidx -= $yysize;
+ for($i = $yysize; $i; $i--) {
+ // pop all of the right-hand side parameters
+ array_pop($this->yystack);
+ }
+ $yyact = $this->yy_find_reduce_action($this->yystack[$this->yyidx]->stateno, $yygoto);
+ if ($yyact < self::YYNSTATE) {
+ if (!self::$yyTraceFILE && $yysize) {
+ $this->yyidx++;
+ $x = new TP_yyStackEntry;
+ $x->stateno = $yyact;
+ $x->major = $yygoto;
+ $x->minor = $yy_lefthand_side;
+ $this->yystack[$this->yyidx] = $x;
+ } else {
+ $this->yy_shift($yyact, $yygoto, $yy_lefthand_side);
+ }
+ } elseif ($yyact == self::YYNSTATE + self::YYNRULE + 1) {
+ $this->yy_accept();
+ }
+ }
+
+ function yy_parse_failed()
+ {
+ if (self::$yyTraceFILE) {
+ fprintf(self::$yyTraceFILE, "%sFail!\n", self::$yyTracePrompt);
+ }
+ while ($this->yyidx >= 0) {
+ $this->yy_pop_parser_stack();
+ }
+ }
+
+ function yy_syntax_error($yymajor, $TOKEN)
+ {
+#line 77 "smarty_internal_templateparser.y"
+
+ $this->internalError = true;
+ $this->yymajor = $yymajor;
+ $this->compiler->trigger_template_error();
+#line 3142 "smarty_internal_templateparser.php"
+ }
+
+ function yy_accept()
+ {
+ if (self::$yyTraceFILE) {
+ fprintf(self::$yyTraceFILE, "%sAccept!\n", self::$yyTracePrompt);
+ }
+ while ($this->yyidx >= 0) {
+ $stack = $this->yy_pop_parser_stack();
+ }
+#line 69 "smarty_internal_templateparser.y"
+
+ $this->successful = !$this->internalError;
+ $this->internalError = false;
+ $this->retvalue = $this->_retvalue;
+ //echo $this->retvalue."\n\n";
+#line 3160 "smarty_internal_templateparser.php"
+ }
+
+ function doParse($yymajor, $yytokenvalue)
+ {
+ $yyerrorhit = 0; /* True if yymajor has invoked an error */
+
+ if ($this->yyidx === null || $this->yyidx < 0) {
+ $this->yyidx = 0;
+ $this->yyerrcnt = -1;
+ $x = new TP_yyStackEntry;
+ $x->stateno = 0;
+ $x->major = 0;
+ $this->yystack = array();
+ array_push($this->yystack, $x);
+ }
+ $yyendofinput = ($yymajor==0);
+
+ if (self::$yyTraceFILE) {
+ fprintf(self::$yyTraceFILE, "%sInput %s\n",
+ self::$yyTracePrompt, $this->yyTokenName[$yymajor]);
+ }
+
+ do {
+ $yyact = $this->yy_find_shift_action($yymajor);
+ if ($yymajor < self::YYERRORSYMBOL &&
+ !$this->yy_is_expected_token($yymajor)) {
+ // force a syntax error
+ $yyact = self::YY_ERROR_ACTION;
+ }
+ if ($yyact < self::YYNSTATE) {
+ $this->yy_shift($yyact, $yymajor, $yytokenvalue);
+ $this->yyerrcnt--;
+ if ($yyendofinput && $this->yyidx >= 0) {
+ $yymajor = 0;
+ } else {
+ $yymajor = self::YYNOCODE;
+ }
+ } elseif ($yyact < self::YYNSTATE + self::YYNRULE) {
+ $this->yy_reduce($yyact - self::YYNSTATE);
+ } elseif ($yyact == self::YY_ERROR_ACTION) {
+ if (self::$yyTraceFILE) {
+ fprintf(self::$yyTraceFILE, "%sSyntax Error!\n",
+ self::$yyTracePrompt);
+ }
+ if (self::YYERRORSYMBOL) {
+ if ($this->yyerrcnt < 0) {
+ $this->yy_syntax_error($yymajor, $yytokenvalue);
+ }
+ $yymx = $this->yystack[$this->yyidx]->major;
+ if ($yymx == self::YYERRORSYMBOL || $yyerrorhit ){
+ if (self::$yyTraceFILE) {
+ fprintf(self::$yyTraceFILE, "%sDiscard input token %s\n",
+ self::$yyTracePrompt, $this->yyTokenName[$yymajor]);
+ }
+ $this->yy_destructor($yymajor, $yytokenvalue);
+ $yymajor = self::YYNOCODE;
+ } else {
+ while ($this->yyidx >= 0 &&
+ $yymx != self::YYERRORSYMBOL &&
+ ($yyact = $this->yy_find_shift_action(self::YYERRORSYMBOL)) >= self::YYNSTATE
+ ){
+ $this->yy_pop_parser_stack();
+ }
+ if ($this->yyidx < 0 || $yymajor==0) {
+ $this->yy_destructor($yymajor, $yytokenvalue);
+ $this->yy_parse_failed();
+ $yymajor = self::YYNOCODE;
+ } elseif ($yymx != self::YYERRORSYMBOL) {
+ $u2 = 0;
+ $this->yy_shift($yyact, self::YYERRORSYMBOL, $u2);
+ }
+ }
+ $this->yyerrcnt = 3;
+ $yyerrorhit = 1;
+ } else {
+ if ($this->yyerrcnt <= 0) {
+ $this->yy_syntax_error($yymajor, $yytokenvalue);
+ }
+ $this->yyerrcnt = 3;
+ $this->yy_destructor($yymajor, $yytokenvalue);
+ if ($yyendofinput) {
+ $this->yy_parse_failed();
+ }
+ $yymajor = self::YYNOCODE;
+ }
+ } else {
+ $this->yy_accept();
+ $yymajor = self::YYNOCODE;
+ }
+ } while ($yymajor != self::YYNOCODE && $this->yyidx >= 0);
+ }
+}
diff --git a/include/smarty/libs/sysplugins/smarty_internal_utility.php b/include/smarty/libs/sysplugins/smarty_internal_utility.php
new file mode 100644
index 000000000..f19ca01f8
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_utility.php
@@ -0,0 +1,830 @@
+<?php
+/**
+ * Project: Smarty: the PHP compiling template engine
+ * File: smarty_internal_utility.php
+ * SVN: $Id: $
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * For questions, help, comments, discussion, etc., please join the
+ * Smarty mailing list. Send a blank e-mail to
+ * smarty-discussion-subscribe@googlegroups.com
+ *
+ * @link http://www.smarty.net/
+ * @copyright 2008 New Digital Group, Inc.
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @author Uwe Tews
+ * @package Smarty
+ * @subpackage PluginsInternal
+ * @version 3-SVN$Rev: 3286 $
+ */
+
+
+/**
+ * Utility class
+ *
+ * @package Smarty
+ * @subpackage Security
+ */
+class Smarty_Internal_Utility {
+
+ /**
+ * private constructor to prevent calls creation of new instances
+ */
+ private final function __construct()
+ {
+ // intentionally left blank
+ }
+
+ /**
+ * Compile all template files
+ *
+ * @param string $extension template file name extension
+ * @param bool $force_compile force all to recompile
+ * @param int $time_limit set maximum execution time
+ * @param int $max_errors set maximum allowed errors
+ * @param Smarty $smarty Smarty instance
+ * @return integer number of template files compiled
+ */
+ public static function compileAllTemplates($extention, $force_compile, $time_limit, $max_errors, Smarty $smarty)
+ {
+ // switch off time limit
+ if (function_exists('set_time_limit')) {
+ @set_time_limit($time_limit);
+ }
+ $smarty->force_compile = $force_compile;
+ $_count = 0;
+ $_error_count = 0;
+ // loop over array of template directories
+ foreach($smarty->getTemplateDir() as $_dir) {
+ $_compileDirs = new RecursiveDirectoryIterator($_dir);
+ $_compile = new RecursiveIteratorIterator($_compileDirs);
+ foreach ($_compile as $_fileinfo) {
+ $_file = $_fileinfo->getFilename();
+ if (substr(basename($_fileinfo->getPathname()),0,1) == '.' || strpos($_file, '.svn') !== false) continue;
+ if (!substr_compare($_file, $extention, - strlen($extention)) == 0) continue;
+ if ($_fileinfo->getPath() == substr($_dir, 0, -1)) {
+ $_template_file = $_file;
+ } else {
+ $_template_file = substr($_fileinfo->getPath(), strlen($_dir)) . DS . $_file;
+ }
+ echo '<br>', $_dir, '---', $_template_file;
+ flush();
+ $_start_time = microtime(true);
+ try {
+ $_tpl = $smarty->createTemplate($_template_file,null,null,null,false);
+ if ($_tpl->mustCompile()) {
+ $_tpl->compileTemplateSource();
+ $_count++;
+ echo ' compiled in ', microtime(true) - $_start_time, ' seconds';
+ flush();
+ } else {
+ echo ' is up to date';
+ flush();
+ }
+ }
+ catch (Exception $e) {
+ echo 'Error: ', $e->getMessage(), "<br><br>";
+ $_error_count++;
+ }
+ // free memory
+ $smarty->template_objects = array();
+ $_tpl->smarty->template_objects = array();
+ $_tpl = null;
+ if ($max_errors !== null && $_error_count == $max_errors) {
+ echo '<br><br>too many errors';
+ exit();
+ }
+ }
+ }
+ return $_count;
+ }
+
+ /**
+ * Compile all config files
+ *
+ * @param string $extension config file name extension
+ * @param bool $force_compile force all to recompile
+ * @param int $time_limit set maximum execution time
+ * @param int $max_errors set maximum allowed errors
+ * @param Smarty $smarty Smarty instance
+ * @return integer number of config files compiled
+ */
+ public static function compileAllConfig($extention, $force_compile, $time_limit, $max_errors, Smarty $smarty)
+ {
+ // switch off time limit
+ if (function_exists('set_time_limit')) {
+ @set_time_limit($time_limit);
+ }
+ $smarty->force_compile = $force_compile;
+ $_count = 0;
+ $_error_count = 0;
+ // loop over array of template directories
+ foreach($smarty->getConfigDir() as $_dir) {
+ $_compileDirs = new RecursiveDirectoryIterator($_dir);
+ $_compile = new RecursiveIteratorIterator($_compileDirs);
+ foreach ($_compile as $_fileinfo) {
+ $_file = $_fileinfo->getFilename();
+ if (substr(basename($_fileinfo->getPathname()),0,1) == '.' || strpos($_file, '.svn') !== false) continue;
+ if (!substr_compare($_file, $extention, - strlen($extention)) == 0) continue;
+ if ($_fileinfo->getPath() == substr($_dir, 0, -1)) {
+ $_config_file = $_file;
+ } else {
+ $_config_file = substr($_fileinfo->getPath(), strlen($_dir)) . DS . $_file;
+ }
+ echo '<br>', $_dir, '---', $_config_file;
+ flush();
+ $_start_time = microtime(true);
+ try {
+ $_config = new Smarty_Internal_Config($_config_file, $smarty);
+ if ($_config->mustCompile()) {
+ $_config->compileConfigSource();
+ $_count++;
+ echo ' compiled in ', microtime(true) - $_start_time, ' seconds';
+ flush();
+ } else {
+ echo ' is up to date';
+ flush();
+ }
+ }
+ catch (Exception $e) {
+ echo 'Error: ', $e->getMessage(), "<br><br>";
+ $_error_count++;
+ }
+ if ($max_errors !== null && $_error_count == $max_errors) {
+ echo '<br><br>too many errors';
+ exit();
+ }
+ }
+ }
+ return $_count;
+ }
+
+ /**
+ * Delete compiled template file
+ *
+ * @param string $resource_name template name
+ * @param string $compile_id compile id
+ * @param integer $exp_time expiration time
+ * @param Smarty $smarty Smarty instance
+ * @return integer number of template files deleted
+ */
+ public static function clearCompiledTemplate($resource_name, $compile_id, $exp_time, Smarty $smarty)
+ {
+ $_compile_dir = $smarty->getCompileDir();
+ $_compile_id = isset($compile_id) ? preg_replace('![^\w\|]+!', '_', $compile_id) : null;
+ $_dir_sep = $smarty->use_sub_dirs ? DS : '^';
+ if (isset($resource_name)) {
+ $_save_stat = $smarty->caching;
+ $smarty->caching = false;
+ $tpl = new $smarty->template_class($resource_name, $smarty);
+ $smarty->caching = $_save_stat;
+
+ // remove from template cache
+ $tpl->source; // have the template registered before unset()
+ if ($smarty->allow_ambiguous_resources) {
+ $_templateId = $tpl->source->unique_resource . $tpl->cache_id . $tpl->compile_id;
+ } else {
+ $_templateId = $smarty->joined_template_dir . '#' . $resource_name . $tpl->cache_id . $tpl->compile_id;
+ }
+ if (isset($_templateId[150])) {
+ $_templateId = sha1($_templateId);
+ }
+ unset($smarty->template_objects[$_templateId]);
+
+ if ($tpl->source->exists) {
+ $_resource_part_1 = basename(str_replace('^', '/', $tpl->compiled->filepath));
+ $_resource_part_1_length = strlen($_resource_part_1);
+ } else {
+ return 0;
+ }
+
+ $_resource_part_2 = str_replace('.php','.cache.php',$_resource_part_1);
+ $_resource_part_2_length = strlen($_resource_part_2);
+ }
+ $_dir = $_compile_dir;
+ if ($smarty->use_sub_dirs && isset($_compile_id)) {
+ $_dir .= $_compile_id . $_dir_sep;
+ }
+ if (isset($_compile_id)) {
+ $_compile_id_part = $_compile_dir . $_compile_id . $_dir_sep;
+ $_compile_id_part_length = strlen($_compile_id_part);
+ }
+ $_count = 0;
+ try {
+ $_compileDirs = new RecursiveDirectoryIterator($_dir);
+ // NOTE: UnexpectedValueException thrown for PHP >= 5.3
+ } catch (Exception $e) {
+ return 0;
+ }
+ $_compile = new RecursiveIteratorIterator($_compileDirs, RecursiveIteratorIterator::CHILD_FIRST);
+ foreach ($_compile as $_file) {
+ if (substr(basename($_file->getPathname()), 0, 1) == '.' || strpos($_file, '.svn') !== false)
+ continue;
+
+ $_filepath = (string) $_file;
+
+ if ($_file->isDir()) {
+ if (!$_compile->isDot()) {
+ // delete folder if empty
+ @rmdir($_file->getPathname());
+ }
+ } else {
+ $unlink = false;
+ if ((!isset($_compile_id) || (isset($_filepath[$_compile_id_part_length]) && !strncmp($_filepath, $_compile_id_part, $_compile_id_part_length)))
+ && (!isset($resource_name)
+ || (isset($_filepath[$_resource_part_1_length])
+ && substr_compare($_filepath, $_resource_part_1, -$_resource_part_1_length, $_resource_part_1_length) == 0)
+ || (isset($_filepath[$_resource_part_2_length])
+ && substr_compare($_filepath, $_resource_part_2, -$_resource_part_2_length, $_resource_part_2_length) == 0))) {
+ if (isset($exp_time)) {
+ if (time() - @filemtime($_filepath) >= $exp_time) {
+ $unlink = true;
+ }
+ } else {
+ $unlink = true;
+ }
+ }
+
+ if ($unlink && @unlink($_filepath)) {
+ $_count++;
+ }
+ }
+ }
+ // clear compiled cache
+ Smarty_Resource::$sources = array();
+ Smarty_Resource::$compileds = array();
+ return $_count;
+ }
+
+ /**
+ * Return array of tag/attributes of all tags used by an template
+ *
+ * @param Smarty_Internal_Template $templae template object
+ * @return array of tag/attributes
+ */
+ public static function getTags(Smarty_Internal_Template $template)
+ {
+ $template->smarty->get_used_tags = true;
+ $template->compileTemplateSource();
+ return $template->used_tags;
+ }
+
+
+ /**
+ * diagnose Smarty setup
+ *
+ * If $errors is secified, the diagnostic report will be appended to the array, rather than being output.
+ *
+ * @param Smarty $smarty Smarty instance to test
+ * @param array $errors array to push results into rather than outputting them
+ * @return bool status, true if everything is fine, false else
+ */
+ public static function testInstall(Smarty $smarty, &$errors=null)
+ {
+ $status = true;
+
+ if ($errors === null) {
+ echo "<PRE>\n";
+ echo "Smarty Installation test...\n";
+ echo "Testing template directory...\n";
+ }
+
+ $_stream_resolve_include_path = function_exists('stream_resolve_include_path');
+
+ // test if all registered template_dir are accessible
+ foreach($smarty->getTemplateDir() as $template_dir) {
+ $_template_dir = $template_dir;
+ $template_dir = realpath($template_dir);
+ // resolve include_path or fail existance
+ if (!$template_dir) {
+ if ($smarty->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_template_dir)) {
+ // try PHP include_path
+ if ($_stream_resolve_include_path) {
+ $template_dir = stream_resolve_include_path($_template_dir);
+ } else {
+ $template_dir = Smarty_Internal_Get_Include_Path::getIncludePath($_template_dir);
+ }
+
+ if ($template_dir !== false) {
+ if ($errors === null) {
+ echo "$template_dir is OK.\n";
+ }
+
+ continue;
+ } else {
+ $status = false;
+ $message = "FAILED: $_template_dir does not exist (and couldn't be found in include_path either)";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['template_dir'] = $message;
+ }
+
+ continue;
+ }
+ } else {
+ $status = false;
+ $message = "FAILED: $_template_dir does not exist";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['template_dir'] = $message;
+ }
+
+ continue;
+ }
+ }
+
+ if (!is_dir($template_dir)) {
+ $status = false;
+ $message = "FAILED: $template_dir is not a directory";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['template_dir'] = $message;
+ }
+ } elseif (!is_readable($template_dir)) {
+ $status = false;
+ $message = "FAILED: $template_dir is not readable";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['template_dir'] = $message;
+ }
+ } else {
+ if ($errors === null) {
+ echo "$template_dir is OK.\n";
+ }
+ }
+ }
+
+
+ if ($errors === null) {
+ echo "Testing compile directory...\n";
+ }
+
+ // test if registered compile_dir is accessible
+ $__compile_dir = $smarty->getCompileDir();
+ $_compile_dir = realpath($__compile_dir);
+ if (!$_compile_dir) {
+ $status = false;
+ $message = "FAILED: {$__compile_dir} does not exist";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['compile_dir'] = $message;
+ }
+ } elseif (!is_dir($_compile_dir)) {
+ $status = false;
+ $message = "FAILED: {$_compile_dir} is not a directory";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['compile_dir'] = $message;
+ }
+ } elseif (!is_readable($_compile_dir)) {
+ $status = false;
+ $message = "FAILED: {$_compile_dir} is not readable";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['compile_dir'] = $message;
+ }
+ } elseif (!is_writable($_compile_dir)) {
+ $status = false;
+ $message = "FAILED: {$_compile_dir} is not writable";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['compile_dir'] = $message;
+ }
+ } else {
+ if ($errors === null) {
+ echo "{$_compile_dir} is OK.\n";
+ }
+ }
+
+
+ if ($errors === null) {
+ echo "Testing plugins directory...\n";
+ }
+
+ // test if all registered plugins_dir are accessible
+ // and if core plugins directory is still registered
+ $_core_plugins_dir = realpath(dirname(__FILE__) .'/../plugins');
+ $_core_plugins_available = false;
+ foreach($smarty->getPluginsDir() as $plugin_dir) {
+ $_plugin_dir = $plugin_dir;
+ $plugin_dir = realpath($plugin_dir);
+ // resolve include_path or fail existance
+ if (!$plugin_dir) {
+ if ($smarty->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_plugin_dir)) {
+ // try PHP include_path
+ if ($_stream_resolve_include_path) {
+ $plugin_dir = stream_resolve_include_path($_plugin_dir);
+ } else {
+ $plugin_dir = Smarty_Internal_Get_Include_Path::getIncludePath($_plugin_dir);
+ }
+
+ if ($plugin_dir !== false) {
+ if ($errors === null) {
+ echo "$plugin_dir is OK.\n";
+ }
+
+ continue;
+ } else {
+ $status = false;
+ $message = "FAILED: $_plugin_dir does not exist (and couldn't be found in include_path either)";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['plugins_dir'] = $message;
+ }
+
+ continue;
+ }
+ } else {
+ $status = false;
+ $message = "FAILED: $_plugin_dir does not exist";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['plugins_dir'] = $message;
+ }
+
+ continue;
+ }
+ }
+
+ if (!is_dir($plugin_dir)) {
+ $status = false;
+ $message = "FAILED: $plugin_dir is not a directory";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['plugins_dir'] = $message;
+ }
+ } elseif (!is_readable($plugin_dir)) {
+ $status = false;
+ $message = "FAILED: $plugin_dir is not readable";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['plugins_dir'] = $message;
+ }
+ } elseif ($_core_plugins_dir && $_core_plugins_dir == realpath($plugin_dir)) {
+ $_core_plugins_available = true;
+ if ($errors === null) {
+ echo "$plugin_dir is OK.\n";
+ }
+ } else {
+ if ($errors === null) {
+ echo "$plugin_dir is OK.\n";
+ }
+ }
+ }
+ if (!$_core_plugins_available) {
+ $status = false;
+ $message = "WARNING: Smarty's own libs/plugins is not available";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } elseif (!isset($errors['plugins_dir'])) {
+ $errors['plugins_dir'] = $message;
+ }
+ }
+
+ if ($errors === null) {
+ echo "Testing cache directory...\n";
+ }
+
+
+ // test if all registered cache_dir is accessible
+ $__cache_dir = $smarty->getCacheDir();
+ $_cache_dir = realpath($__cache_dir);
+ if (!$_cache_dir) {
+ $status = false;
+ $message = "FAILED: {$__cache_dir} does not exist";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['cache_dir'] = $message;
+ }
+ } elseif (!is_dir($_cache_dir)) {
+ $status = false;
+ $message = "FAILED: {$_cache_dir} is not a directory";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['cache_dir'] = $message;
+ }
+ } elseif (!is_readable($_cache_dir)) {
+ $status = false;
+ $message = "FAILED: {$_cache_dir} is not readable";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['cache_dir'] = $message;
+ }
+ } elseif (!is_writable($_cache_dir)) {
+ $status = false;
+ $message = "FAILED: {$_cache_dir} is not writable";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['cache_dir'] = $message;
+ }
+ } else {
+ if ($errors === null) {
+ echo "{$_cache_dir} is OK.\n";
+ }
+ }
+
+
+ if ($errors === null) {
+ echo "Testing configs directory...\n";
+ }
+
+ // test if all registered config_dir are accessible
+ foreach($smarty->getConfigDir() as $config_dir) {
+ $_config_dir = $config_dir;
+ $config_dir = realpath($config_dir);
+ // resolve include_path or fail existance
+ if (!$config_dir) {
+ if ($smarty->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_config_dir)) {
+ // try PHP include_path
+ if ($_stream_resolve_include_path) {
+ $config_dir = stream_resolve_include_path($_config_dir);
+ } else {
+ $config_dir = Smarty_Internal_Get_Include_Path::getIncludePath($_config_dir);
+ }
+
+ if ($config_dir !== false) {
+ if ($errors === null) {
+ echo "$config_dir is OK.\n";
+ }
+
+ continue;
+ } else {
+ $status = false;
+ $message = "FAILED: $_config_dir does not exist (and couldn't be found in include_path either)";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['config_dir'] = $message;
+ }
+
+ continue;
+ }
+ } else {
+ $status = false;
+ $message = "FAILED: $_config_dir does not exist";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['config_dir'] = $message;
+ }
+
+ continue;
+ }
+ }
+
+ if (!is_dir($config_dir)) {
+ $status = false;
+ $message = "FAILED: $config_dir is not a directory";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['config_dir'] = $message;
+ }
+ } elseif (!is_readable($config_dir)) {
+ $status = false;
+ $message = "FAILED: $config_dir is not readable";
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['config_dir'] = $message;
+ }
+ } else {
+ if ($errors === null) {
+ echo "$config_dir is OK.\n";
+ }
+ }
+ }
+
+
+ if ($errors === null) {
+ echo "Testing sysplugin files...\n";
+ }
+ // test if sysplugins are available
+ $source = SMARTY_SYSPLUGINS_DIR;
+ if (is_dir($source)) {
+ $expected = array(
+ "smarty_cacheresource.php" => true,
+ "smarty_cacheresource_custom.php" => true,
+ "smarty_cacheresource_keyvaluestore.php" => true,
+ "smarty_config_source.php" => true,
+ "smarty_internal_cacheresource_file.php" => true,
+ "smarty_internal_compile_append.php" => true,
+ "smarty_internal_compile_assign.php" => true,
+ "smarty_internal_compile_block.php" => true,
+ "smarty_internal_compile_break.php" => true,
+ "smarty_internal_compile_call.php" => true,
+ "smarty_internal_compile_capture.php" => true,
+ "smarty_internal_compile_config_load.php" => true,
+ "smarty_internal_compile_continue.php" => true,
+ "smarty_internal_compile_debug.php" => true,
+ "smarty_internal_compile_eval.php" => true,
+ "smarty_internal_compile_extends.php" => true,
+ "smarty_internal_compile_for.php" => true,
+ "smarty_internal_compile_foreach.php" => true,
+ "smarty_internal_compile_function.php" => true,
+ "smarty_internal_compile_if.php" => true,
+ "smarty_internal_compile_include.php" => true,
+ "smarty_internal_compile_include_php.php" => true,
+ "smarty_internal_compile_insert.php" => true,
+ "smarty_internal_compile_ldelim.php" => true,
+ "smarty_internal_compile_nocache.php" => true,
+ "smarty_internal_compile_private_block_plugin.php" => true,
+ "smarty_internal_compile_private_function_plugin.php" => true,
+ "smarty_internal_compile_private_modifier.php" => true,
+ "smarty_internal_compile_private_object_block_function.php" => true,
+ "smarty_internal_compile_private_object_function.php" => true,
+ "smarty_internal_compile_private_print_expression.php" => true,
+ "smarty_internal_compile_private_registered_block.php" => true,
+ "smarty_internal_compile_private_registered_function.php" => true,
+ "smarty_internal_compile_private_special_variable.php" => true,
+ "smarty_internal_compile_rdelim.php" => true,
+ "smarty_internal_compile_section.php" => true,
+ "smarty_internal_compile_setfilter.php" => true,
+ "smarty_internal_compile_while.php" => true,
+ "smarty_internal_compilebase.php" => true,
+ "smarty_internal_config.php" => true,
+ "smarty_internal_config_file_compiler.php" => true,
+ "smarty_internal_configfilelexer.php" => true,
+ "smarty_internal_configfileparser.php" => true,
+ "smarty_internal_data.php" => true,
+ "smarty_internal_debug.php" => true,
+ "smarty_internal_filter_handler.php" => true,
+ "smarty_internal_function_call_handler.php" => true,
+ "smarty_internal_get_include_path.php" => true,
+ "smarty_internal_nocache_insert.php" => true,
+ "smarty_internal_parsetree.php" => true,
+ "smarty_internal_resource_eval.php" => true,
+ "smarty_internal_resource_extends.php" => true,
+ "smarty_internal_resource_file.php" => true,
+ "smarty_internal_resource_registered.php" => true,
+ "smarty_internal_resource_stream.php" => true,
+ "smarty_internal_resource_string.php" => true,
+ "smarty_internal_smartytemplatecompiler.php" => true,
+ "smarty_internal_template.php" => true,
+ "smarty_internal_templatebase.php" => true,
+ "smarty_internal_templatecompilerbase.php" => true,
+ "smarty_internal_templatelexer.php" => true,
+ "smarty_internal_templateparser.php" => true,
+ "smarty_internal_utility.php" => true,
+ "smarty_internal_write_file.php" => true,
+ "smarty_resource.php" => true,
+ "smarty_resource_custom.php" => true,
+ "smarty_resource_recompiled.php" => true,
+ "smarty_resource_uncompiled.php" => true,
+ "smarty_security.php" => true,
+ );
+ $iterator = new DirectoryIterator($source);
+ foreach ($iterator as $file) {
+ if (!$file->isDot()) {
+ $filename = $file->getFilename();
+ if (isset($expected[$filename])) {
+ unset($expected[$filename]);
+ }
+ }
+ }
+ if ($expected) {
+ $status = false;
+ $message = "FAILED: files missing from libs/sysplugins: ". join(', ', array_keys($expected));
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['sysplugins'] = $message;
+ }
+ } elseif ($errors === null) {
+ echo "... OK\n";
+ }
+ } else {
+ $status = false;
+ $message = "FAILED: ". SMARTY_SYSPLUGINS_DIR .' is not a directory';
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['sysplugins_dir_constant'] = $message;
+ }
+ }
+
+ if ($errors === null) {
+ echo "Testing plugin files...\n";
+ }
+ // test if core plugins are available
+ $source = SMARTY_PLUGINS_DIR;
+ if (is_dir($source)) {
+ $expected = array(
+ "block.textformat.php" => true,
+ "function.counter.php" => true,
+ "function.cycle.php" => true,
+ "function.fetch.php" => true,
+ "function.html_checkboxes.php" => true,
+ "function.html_image.php" => true,
+ "function.html_options.php" => true,
+ "function.html_radios.php" => true,
+ "function.html_select_date.php" => true,
+ "function.html_select_time.php" => true,
+ "function.html_table.php" => true,
+ "function.mailto.php" => true,
+ "function.math.php" => true,
+ "modifier.capitalize.php" => true,
+ "modifier.date_format.php" => true,
+ "modifier.debug_print_var.php" => true,
+ "modifier.escape.php" => true,
+ "modifier.regex_replace.php" => true,
+ "modifier.replace.php" => true,
+ "modifier.spacify.php" => true,
+ "modifier.truncate.php" => true,
+ "modifiercompiler.cat.php" => true,
+ "modifiercompiler.count_characters.php" => true,
+ "modifiercompiler.count_paragraphs.php" => true,
+ "modifiercompiler.count_sentences.php" => true,
+ "modifiercompiler.count_words.php" => true,
+ "modifiercompiler.default.php" => true,
+ "modifiercompiler.escape.php" => true,
+ "modifiercompiler.from_charset.php" => true,
+ "modifiercompiler.indent.php" => true,
+ "modifiercompiler.lower.php" => true,
+ "modifiercompiler.noprint.php" => true,
+ "modifiercompiler.string_format.php" => true,
+ "modifiercompiler.strip.php" => true,
+ "modifiercompiler.strip_tags.php" => true,
+ "modifiercompiler.to_charset.php" => true,
+ "modifiercompiler.unescape.php" => true,
+ "modifiercompiler.upper.php" => true,
+ "modifiercompiler.wordwrap.php" => true,
+ "outputfilter.trimwhitespace.php" => true,
+ "shared.escape_special_chars.php" => true,
+ "shared.literal_compiler_param.php" => true,
+ "shared.make_timestamp.php" => true,
+ "shared.mb_str_replace.php" => true,
+ "shared.mb_unicode.php" => true,
+ "shared.mb_wordwrap.php" => true,
+ "variablefilter.htmlspecialchars.php" => true,
+ );
+ $iterator = new DirectoryIterator($source);
+ foreach ($iterator as $file) {
+ if (!$file->isDot()) {
+ $filename = $file->getFilename();
+ if (isset($expected[$filename])) {
+ unset($expected[$filename]);
+ }
+ }
+ }
+ if ($expected) {
+ $status = false;
+ $message = "FAILED: files missing from libs/plugins: ". join(', ', array_keys($expected));
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['plugins'] = $message;
+ }
+ } elseif ($errors === null) {
+ echo "... OK\n";
+ }
+ } else {
+ $status = false;
+ $message = "FAILED: ". SMARTY_PLUGINS_DIR .' is not a directory';
+ if ($errors === null) {
+ echo $message . ".\n";
+ } else {
+ $errors['plugins_dir_constant'] = $message;
+ }
+ }
+
+ if ($errors === null) {
+ echo "Tests complete.\n";
+ echo "</PRE>\n";
+ }
+
+ return $status;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_internal_write_file.php b/include/smarty/libs/sysplugins/smarty_internal_write_file.php
new file mode 100644
index 000000000..e5d19ce8d
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_write_file.php
@@ -0,0 +1,88 @@
+<?php
+/**
+ * Smarty write file plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsInternal
+ * @author Monte Ohrt
+ */
+
+/**
+ * Smarty Internal Write File Class
+ *
+ * @package Smarty
+ * @subpackage PluginsInternal
+ */
+class Smarty_Internal_Write_File {
+
+ /**
+ * Writes file in a safe way to disk
+ *
+ * @param string $_filepath complete filepath
+ * @param string $_contents file content
+ * @param Smarty $smarty smarty instance
+ * @return boolean true
+ */
+ public static function writeFile($_filepath, $_contents, Smarty $smarty)
+ {
+ $_error_reporting = error_reporting();
+ error_reporting($_error_reporting & ~E_NOTICE & ~E_WARNING);
+ if ($smarty->_file_perms !== null) {
+ $old_umask = umask(0);
+ }
+
+ $_dirpath = dirname($_filepath);
+ // if subdirs, create dir structure
+ if ($_dirpath !== '.' && !file_exists($_dirpath)) {
+ mkdir($_dirpath, $smarty->_dir_perms === null ? 0777 : $smarty->_dir_perms, true);
+ }
+
+ // write to tmp file, then move to overt file lock race condition
+ $_tmp_file = $_dirpath . DS . uniqid('wrt', true);
+ if (!file_put_contents($_tmp_file, $_contents)) {
+ error_reporting($_error_reporting);
+ throw new SmartyException("unable to write file {$_tmp_file}");
+ return false;
+ }
+
+ /*
+ * Windows' rename() fails if the destination exists,
+ * Linux' rename() properly handles the overwrite.
+ * Simply unlink()ing a file might cause other processes
+ * currently reading that file to fail, but linux' rename()
+ * seems to be smart enough to handle that for us.
+ */
+ if (Smarty::$_IS_WINDOWS) {
+ // remove original file
+ @unlink($_filepath);
+ // rename tmp file
+ $success = @rename($_tmp_file, $_filepath);
+ } else {
+ // rename tmp file
+ $success = @rename($_tmp_file, $_filepath);
+ if (!$success) {
+ // remove original file
+ @unlink($_filepath);
+ // rename tmp file
+ $success = @rename($_tmp_file, $_filepath);
+ }
+ }
+
+ if (!$success) {
+ error_reporting($_error_reporting);
+ throw new SmartyException("unable to write file {$_filepath}");
+ return false;
+ }
+
+ if ($smarty->_file_perms !== null) {
+ // set file permissions
+ chmod($_filepath, $smarty->_file_perms);
+ umask($old_umask);
+ }
+ error_reporting($_error_reporting);
+ return true;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_resource.php b/include/smarty/libs/sysplugins/smarty_resource.php
new file mode 100644
index 000000000..55f1497fb
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_resource.php
@@ -0,0 +1,857 @@
+<?php
+/**
+ * Smarty Resource Plugin
+ *
+ * @package Smarty
+ * @subpackage TemplateResources
+ * @author Rodney Rehm
+ */
+
+/**
+ * Smarty Resource Plugin
+ *
+ * Base implementation for resource plugins
+ *
+ * @package Smarty
+ * @subpackage TemplateResources
+ */
+abstract class Smarty_Resource {
+ /**
+ * cache for Smarty_Template_Source instances
+ * @var array
+ */
+ public static $sources = array();
+ /**
+ * cache for Smarty_Template_Compiled instances
+ * @var array
+ */
+ public static $compileds = array();
+ /**
+ * cache for Smarty_Resource instances
+ * @var array
+ */
+ public static $resources = array();
+ /**
+ * resource types provided by the core
+ * @var array
+ */
+ protected static $sysplugins = array(
+ 'file' => true,
+ 'string' => true,
+ 'extends' => true,
+ 'stream' => true,
+ 'eval' => true,
+ 'php' => true
+ );
+
+ /**
+ * Name of the Class to compile this resource's contents with
+ * @var string
+ */
+ public $compiler_class = 'Smarty_Internal_SmartyTemplateCompiler';
+
+ /**
+ * Name of the Class to tokenize this resource's contents with
+ * @var string
+ */
+ public $template_lexer_class = 'Smarty_Internal_Templatelexer';
+
+ /**
+ * Name of the Class to parse this resource's contents with
+ * @var string
+ */
+ public $template_parser_class = 'Smarty_Internal_Templateparser';
+
+ /**
+ * Load template's source into current template object
+ *
+ * {@internal The loaded source is assigned to $_template->source->content directly.}}
+ *
+ * @param Smarty_Template_Source $source source object
+ * @return string template source
+ * @throws SmartyException if source cannot be loaded
+ */
+ public abstract function getContent(Smarty_Template_Source $source);
+
+ /**
+ * populate Source Object with meta data from Resource
+ *
+ * @param Smarty_Template_Source $source source object
+ * @param Smarty_Internal_Template $_template template object
+ */
+ public abstract function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template=null);
+
+ /**
+ * populate Source Object with timestamp and exists from Resource
+ *
+ * @param Smarty_Template_Source $source source object
+ */
+ public function populateTimestamp(Smarty_Template_Source $source)
+ {
+ // intentionally left blank
+ }
+
+
+ /**
+ * modify resource_name according to resource handlers specifications
+ *
+ * @param Smarty $smarty Smarty instance
+ * @param string $resource_name resource_name to make unique
+ * @return string unique resource name
+ */
+ protected function buildUniqueResourceName(Smarty $smarty, $resource_name)
+ {
+ return get_class($this) . '#' . $smarty->joined_template_dir . '#' . $resource_name;
+ }
+
+ /**
+ * populate Compiled Object with compiled filepath
+ *
+ * @param Smarty_Template_Compiled $compiled compiled object
+ * @param Smarty_Internal_Template $_template template object
+ */
+ public function populateCompiledFilepath(Smarty_Template_Compiled $compiled, Smarty_Internal_Template $_template)
+ {
+ $_compile_id = isset($_template->compile_id) ? preg_replace('![^\w\|]+!', '_', $_template->compile_id) : null;
+ $_filepath = $compiled->source->uid;
+ // if use_sub_dirs, break file into directories
+ if ($_template->smarty->use_sub_dirs) {
+ $_filepath = substr($_filepath, 0, 2) . DS
+ . substr($_filepath, 2, 2) . DS
+ . substr($_filepath, 4, 2) . DS
+ . $_filepath;
+ }
+ $_compile_dir_sep = $_template->smarty->use_sub_dirs ? DS : '^';
+ if (isset($_compile_id)) {
+ $_filepath = $_compile_id . $_compile_dir_sep . $_filepath;
+ }
+ // caching token
+ if ($_template->caching) {
+ $_cache = '.cache';
+ } else {
+ $_cache = '';
+ }
+ $_compile_dir = $_template->smarty->getCompileDir();
+ // set basename if not specified
+ $_basename = $this->getBasename($compiled->source);
+ if ($_basename === null) {
+ $_basename = basename( preg_replace('![^\w\/]+!', '_', $compiled->source->name) );
+ }
+ // separate (optional) basename by dot
+ if ($_basename) {
+ $_basename = '.' . $_basename;
+ }
+
+ $compiled->filepath = $_compile_dir . $_filepath . '.' . $compiled->source->type . $_basename . $_cache . '.php';
+ }
+
+ /**
+ * Normalize Paths "foo/../bar" to "bar"
+ *
+ * @param string $_path path to normalize
+ * @param boolean $ds respect windows directory separator
+ * @return string normalized path
+ */
+ protected function normalizePath($_path, $ds=true)
+ {
+ if ($ds) {
+ // don't we all just love windows?
+ $_path = str_replace('\\', '/', $_path);
+ }
+
+ $offset = 0;
+
+ // resolve simples
+ $_path = preg_replace('#(/\./(\./)*)|/{2,}#', '/', $_path);
+ // resolve parents
+ while (true) {
+ $_parent = strpos($_path, '/../', $offset);
+ if (!$_parent) {
+ break;
+ } else if ($_path[$_parent - 1] === '.') {
+ $offset = $_parent + 3;
+ continue;
+ }
+
+ $_pos = strrpos($_path, '/', $_parent - strlen($_path) - 1);
+ if ($_pos === false) {
+ // don't we all just love windows?
+ $_pos = $_parent;
+ }
+
+ $_path = substr_replace($_path, '', $_pos, $_parent + 3 - $_pos);
+ }
+
+ if ($ds && DS != '/') {
+ // don't we all just love windows?
+ $_path = str_replace('/', '\\', $_path);
+ }
+
+ return $_path;
+ }
+
+ /**
+ * build template filepath by traversing the template_dir array
+ *
+ * @param Smarty_Template_Source $source source object
+ * @param Smarty_Internal_Template $_template template object
+ * @return string fully qualified filepath
+ * @throws SmartyException if default template handler is registered but not callable
+ */
+ protected function buildFilepath(Smarty_Template_Source $source, Smarty_Internal_Template $_template=null)
+ {
+ $file = $source->name;
+ if ($source instanceof Smarty_Config_Source) {
+ $_directories = $source->smarty->getConfigDir();
+ $_default_handler = $source->smarty->default_config_handler_func;
+ } else {
+ $_directories = $source->smarty->getTemplateDir();
+ $_default_handler = $source->smarty->default_template_handler_func;
+ }
+
+ // go relative to a given template?
+ $_file_is_dotted = $file[0] == '.' && ($file[1] == '.' || $file[1] == '/' || $file[1] == "\\");
+ if ($_template && $_template->parent instanceof Smarty_Internal_Template && $_file_is_dotted) {
+ if ($_template->parent->source->type != 'file' && $_template->parent->source->type != 'extends' && !$_template->parent->allow_relative_path) {
+ throw new SmartyException("Template '{$file}' cannot be relative to template of resource type '{$_template->parent->source->type}'");
+ }
+ $file = dirname($_template->parent->source->filepath) . DS . $file;
+ $_file_exact_match = true;
+ if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $file)) {
+ // the path gained from the parent template is relative to the current working directory
+ // as expansions (like include_path) have already been done
+ $file = getcwd() . DS . $file;
+ }
+ }
+
+ // resolve relative path
+ if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $file)) {
+ // don't we all just love windows?
+ $_path = str_replace('\\', '/', $file);
+ $_path = DS . trim($file, '/');
+ $_was_relative = true;
+ } else {
+ // don't we all just love windows?
+ $_path = str_replace('\\', '/', $file);
+ }
+ $_path = $this->normalizePath($_path, false);
+ if (DS != '/') {
+ // don't we all just love windows?
+ $_path = str_replace('/', '\\', $_path);
+ }
+ // revert to relative
+ if (isset($_was_relative)) {
+ $_path = substr($_path, 1);
+ }
+
+ // this is only required for directories
+ $file = rtrim($_path, '/\\');
+
+ // files relative to a template only get one shot
+ if (isset($_file_exact_match)) {
+ return $this->fileExists($source, $file) ? $file : false;
+ }
+
+ // template_dir index?
+ if (preg_match('#^\[(?P<key>[^\]]+)\](?P<file>.+)$#', $file, $match)) {
+ $_directory = null;
+ // try string indexes
+ if (isset($_directories[$match['key']])) {
+ $_directory = $_directories[$match['key']];
+ } else if (is_numeric($match['key'])) {
+ // try numeric index
+ $match['key'] = (int) $match['key'];
+ if (isset($_directories[$match['key']])) {
+ $_directory = $_directories[$match['key']];
+ } else {
+ // try at location index
+ $keys = array_keys($_directories);
+ $_directory = $_directories[$keys[$match['key']]];
+ }
+ }
+
+ if ($_directory) {
+ $_file = substr($file, strpos($file, ']') + 1);
+ $_filepath = $_directory . $_file;
+ if ($this->fileExists($source, $_filepath)) {
+ return $_filepath;
+ }
+ }
+ }
+
+ $_stream_resolve_include_path = function_exists('stream_resolve_include_path');
+
+ // relative file name?
+ if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $file)) {
+ foreach ($_directories as $_directory) {
+ $_filepath = $_directory . $file;
+ if ($this->fileExists($source, $_filepath)) {
+ return $this->normalizePath($_filepath);
+ }
+ if ($source->smarty->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_directory)) {
+ // try PHP include_path
+ if ($_stream_resolve_include_path) {
+ $_filepath = stream_resolve_include_path($_filepath);
+ } else {
+ $_filepath = Smarty_Internal_Get_Include_Path::getIncludePath($_filepath);
+ }
+
+ if ($_filepath !== false) {
+ if ($this->fileExists($source, $_filepath)) {
+ return $this->normalizePath($_filepath);
+ }
+ }
+ }
+ }
+ }
+
+ // try absolute filepath
+ if ($this->fileExists($source, $file)) {
+ return $file;
+ }
+
+ // no tpl file found
+ if ($_default_handler) {
+ if (!is_callable($_default_handler)) {
+ if ($source instanceof Smarty_Config_Source) {
+ throw new SmartyException("Default config handler not callable");
+ } else {
+ throw new SmartyException("Default template handler not callable");
+ }
+ }
+ $_return = call_user_func_array($_default_handler,
+ array($source->type, $source->name, &$_content, &$_timestamp, $source->smarty));
+ if (is_string($_return)) {
+ $source->timestamp = @filemtime($_return);
+ $source->exists = !!$source->timestamp;
+ return $_return;
+ } elseif ($_return === true) {
+ $source->content = $_content;
+ $source->timestamp = $_timestamp;
+ $source->exists = true;
+ return $_filepath;
+ }
+ }
+
+ // give up
+ return false;
+ }
+
+ /**
+ * test is file exists and save timestamp
+ *
+ * @param Smarty_Template_Source $source source object
+ * @param string $file file name
+ * @return bool true if file exists
+ */
+ protected function fileExists(Smarty_Template_Source $source, $file)
+ {
+ $source->timestamp = @filemtime($file);
+ return $source->exists = !!$source->timestamp;
+
+ }
+
+ /**
+ * Determine basename for compiled filename
+ *
+ * @param Smarty_Template_Source $source source object
+ * @return string resource's basename
+ */
+ protected function getBasename(Smarty_Template_Source $source)
+ {
+ return null;
+ }
+
+ /**
+ * Load Resource Handler
+ *
+ * @param Smarty $smarty smarty object
+ * @param string $type name of the resource
+ * @return Smarty_Resource Resource Handler
+ */
+ public static function load(Smarty $smarty, $type)
+ {
+ // try smarty's cache
+ if (isset($smarty->_resource_handlers[$type])) {
+ return $smarty->_resource_handlers[$type];
+ }
+
+ // try registered resource
+ if (isset($smarty->registered_resources[$type])) {
+ if ($smarty->registered_resources[$type] instanceof Smarty_Resource) {
+ $smarty->_resource_handlers[$type] = $smarty->registered_resources[$type];
+ // note registered to smarty is not kept unique!
+ return $smarty->_resource_handlers[$type];
+ }
+
+ if (!isset(self::$resources['registered'])) {
+ self::$resources['registered'] = new Smarty_Internal_Resource_Registered();
+ }
+ if (!isset($smarty->_resource_handlers[$type])) {
+ $smarty->_resource_handlers[$type] = self::$resources['registered'];
+ }
+
+ return $smarty->_resource_handlers[$type];
+ }
+
+ // try sysplugins dir
+ if (isset(self::$sysplugins[$type])) {
+ if (!isset(self::$resources[$type])) {
+ $_resource_class = 'Smarty_Internal_Resource_' . ucfirst($type);
+ self::$resources[$type] = new $_resource_class();
+ }
+ return $smarty->_resource_handlers[$type] = self::$resources[$type];
+ }
+
+ // try plugins dir
+ $_resource_class = 'Smarty_Resource_' . ucfirst($type);
+ if ($smarty->loadPlugin($_resource_class)) {
+ if (isset(self::$resources[$type])) {
+ return $smarty->_resource_handlers[$type] = self::$resources[$type];
+ }
+
+ if (class_exists($_resource_class, false)) {
+ self::$resources[$type] = new $_resource_class();
+ return $smarty->_resource_handlers[$type] = self::$resources[$type];
+ } else {
+ $smarty->registerResource($type, array(
+ "smarty_resource_{$type}_source",
+ "smarty_resource_{$type}_timestamp",
+ "smarty_resource_{$type}_secure",
+ "smarty_resource_{$type}_trusted"
+ ));
+
+ // give it another try, now that the resource is registered properly
+ return self::load($smarty, $type);
+ }
+ }
+
+ // try streams
+ $_known_stream = stream_get_wrappers();
+ if (in_array($type, $_known_stream)) {
+ // is known stream
+ if (is_object($smarty->security_policy)) {
+ $smarty->security_policy->isTrustedStream($type);
+ }
+ if (!isset(self::$resources['stream'])) {
+ self::$resources['stream'] = new Smarty_Internal_Resource_Stream();
+ }
+ return $smarty->_resource_handlers[$type] = self::$resources['stream'];
+ }
+
+ // TODO: try default_(template|config)_handler
+
+ // give up
+ throw new SmartyException("Unkown resource type '{$type}'");
+ }
+
+ /**
+ * extract resource_type and resource_name from template_resource and config_resource
+ *
+ * @note "C:/foo.tpl" was forced to file resource up till Smarty 3.1.3 (including).
+ * @param string $resource_name template_resource or config_resource to parse
+ * @param string $default_resource the default resource_type defined in $smarty
+ * @param string &$name the parsed resource name
+ * @param string &$type the parsed resource type
+ * @return void
+ */
+ protected static function parseResourceName($resource_name, $default_resource, &$name, &$type)
+ {
+ $parts = explode(':', $resource_name, 2);
+ if (!isset($parts[1]) || !isset($parts[0][1])) {
+ // no resource given, use default
+ // or single character before the colon is not a resource type, but part of the filepath
+ $type = $default_resource;
+ $name = $resource_name;
+ } else {
+ $type = $parts[0];
+ $name = $parts[1];
+ }
+ }
+
+
+ /**
+ * modify resource_name according to resource handlers specifications
+ *
+ * @param Smarty $smarty Smarty instance
+ * @param string $resource_name resource_name to make unique
+ * @return string unique resource name
+ */
+
+ /**
+ * modify template_resource according to resource handlers specifications
+ *
+ * @param string $smarty Smarty instance
+ * @param string $template_resource template_resource to extracate resource handler and name of
+ * @return string unique resource name
+ */
+ public static function getUniqueTemplateName($smarty, $template_resource)
+ {
+ self::parseResourceName($template_resource, $smarty->default_resource_type, $name, $type);
+ // TODO: optimize for Smarty's internal resource types
+ $resource = Smarty_Resource::load($smarty, $type);
+ return $resource->buildUniqueResourceName($smarty, $name);
+ }
+
+ /**
+ * initialize Source Object for given resource
+ *
+ * Either [$_template] or [$smarty, $template_resource] must be specified
+ *
+ * @param Smarty_Internal_Template $_template template object
+ * @param Smarty $smarty smarty object
+ * @param string $template_resource resource identifier
+ * @return Smarty_Template_Source Source Object
+ */
+ public static function source(Smarty_Internal_Template $_template=null, Smarty $smarty=null, $template_resource=null)
+ {
+ if ($_template) {
+ $smarty = $_template->smarty;
+ $template_resource = $_template->template_resource;
+ }
+
+ // parse resource_name, load resource handler, identify unique resource name
+ self::parseResourceName($template_resource, $smarty->default_resource_type, $name, $type);
+ $resource = Smarty_Resource::load($smarty, $type);
+ $unique_resource_name = $resource->buildUniqueResourceName($smarty, $name);
+
+ // check runtime cache
+ $_cache_key = 'template|' . $unique_resource_name;
+ if ($smarty->compile_id) {
+ $_cache_key .= '|'.$smarty->compile_id;
+ }
+ if (isset(self::$sources[$_cache_key])) {
+ return self::$sources[$_cache_key];
+ }
+
+ // create source
+ $source = new Smarty_Template_Source($resource, $smarty, $template_resource, $type, $name, $unique_resource_name);
+ $resource->populate($source, $_template);
+
+ // runtime cache
+ self::$sources[$_cache_key] = $source;
+ return $source;
+ }
+
+ /**
+ * initialize Config Source Object for given resource
+ *
+ * @param Smarty_Internal_Config $_config config object
+ * @return Smarty_Config_Source Source Object
+ */
+ public static function config(Smarty_Internal_Config $_config)
+ {
+ static $_incompatible_resources = array('eval' => true, 'string' => true, 'extends' => true, 'php' => true);
+ $config_resource = $_config->config_resource;
+ $smarty = $_config->smarty;
+
+ // parse resource_name
+ self::parseResourceName($config_resource, $smarty->default_config_type, $name, $type);
+
+ // make sure configs are not loaded via anything smarty can't handle
+ if (isset($_incompatible_resources[$type])) {
+ throw new SmartyException ("Unable to use resource '{$type}' for config");
+ }
+
+ // load resource handler, identify unique resource name
+ $resource = Smarty_Resource::load($smarty, $type);
+ $unique_resource_name = $resource->buildUniqueResourceName($smarty, $name);
+
+ // check runtime cache
+ $_cache_key = 'config|' . $unique_resource_name;
+ if (isset(self::$sources[$_cache_key])) {
+ return self::$sources[$_cache_key];
+ }
+
+ // create source
+ $source = new Smarty_Config_Source($resource, $smarty, $config_resource, $type, $name, $unique_resource_name);
+ $resource->populate($source, null);
+
+ // runtime cache
+ self::$sources[$_cache_key] = $source;
+ return $source;
+ }
+
+}
+
+/**
+ * Smarty Resource Data Object
+ *
+ * Meta Data Container for Template Files
+ *
+ * @package Smarty
+ * @subpackage TemplateResources
+ * @author Rodney Rehm
+ *
+ * @property integer $timestamp Source Timestamp
+ * @property boolean $exists Source Existance
+ * @property boolean $template Extended Template reference
+ * @property string $content Source Content
+ */
+class Smarty_Template_Source {
+
+ /**
+ * Name of the Class to compile this resource's contents with
+ * @var string
+ */
+ public $compiler_class = null;
+
+ /**
+ * Name of the Class to tokenize this resource's contents with
+ * @var string
+ */
+ public $template_lexer_class = null;
+
+ /**
+ * Name of the Class to parse this resource's contents with
+ * @var string
+ */
+ public $template_parser_class = null;
+
+ /**
+ * Unique Template ID
+ * @var string
+ */
+ public $uid = null;
+
+ /**
+ * Template Resource (Smarty_Internal_Template::$template_resource)
+ * @var string
+ */
+ public $resource = null;
+
+ /**
+ * Resource Type
+ * @var string
+ */
+ public $type = null;
+
+ /**
+ * Resource Name
+ * @var string
+ */
+ public $name = null;
+
+ /**
+ * Unique Resource Name
+ * @var string
+ */
+ public $unique_resource = null;
+
+ /**
+ * Source Filepath
+ * @var string
+ */
+ public $filepath = null;
+
+ /**
+ * Source is bypassing compiler
+ * @var boolean
+ */
+ public $uncompiled = null;
+
+ /**
+ * Source must be recompiled on every occasion
+ * @var boolean
+ */
+ public $recompiled = null;
+
+ /**
+ * The Components an extended template is made of
+ * @var array
+ */
+ public $components = null;
+
+ /**
+ * Resource Handler
+ * @var Smarty_Resource
+ */
+ public $handler = null;
+
+ /**
+ * Smarty instance
+ * @var Smarty
+ */
+ public $smarty = null;
+
+ /**
+ * create Source Object container
+ *
+ * @param Smarty_Resource $handler Resource Handler this source object communicates with
+ * @param Smarty $smarty Smarty instance this source object belongs to
+ * @param string $resource full template_resource
+ * @param string $type type of resource
+ * @param string $name resource name
+ * @param string $unique_resource unqiue resource name
+ */
+ public function __construct(Smarty_Resource $handler, Smarty $smarty, $resource, $type, $name, $unique_resource)
+ {
+ $this->handler = $handler; // Note: prone to circular references
+
+ $this->compiler_class = $handler->compiler_class;
+ $this->template_lexer_class = $handler->template_lexer_class;
+ $this->template_parser_class = $handler->template_parser_class;
+ $this->uncompiled = $this->handler instanceof Smarty_Resource_Uncompiled;
+ $this->recompiled = $this->handler instanceof Smarty_Resource_Recompiled;
+
+ $this->smarty = $smarty;
+ $this->resource = $resource;
+ $this->type = $type;
+ $this->name = $name;
+ $this->unique_resource = $unique_resource;
+ }
+
+ /**
+ * get a Compiled Object of this source
+ *
+ * @param Smarty_Internal_Template $_template template objet
+ * @return Smarty_Template_Compiled compiled object
+ */
+ public function getCompiled(Smarty_Internal_Template $_template)
+ {
+ // check runtime cache
+ $_cache_key = $this->unique_resource . '#' . $_template->compile_id;
+ if (isset(Smarty_Resource::$compileds[$_cache_key])) {
+ return Smarty_Resource::$compileds[$_cache_key];
+ }
+
+ $compiled = new Smarty_Template_Compiled($this);
+ $this->handler->populateCompiledFilepath($compiled, $_template);
+ $compiled->timestamp = @filemtime($compiled->filepath);
+ $compiled->exists = !!$compiled->timestamp;
+
+ // runtime cache
+ Smarty_Resource::$compileds[$_cache_key] = $compiled;
+
+ return $compiled;
+ }
+
+ /**
+ * render the uncompiled source
+ *
+ * @param Smarty_Internal_Template $_template template object
+ */
+ public function renderUncompiled(Smarty_Internal_Template $_template)
+ {
+ return $this->handler->renderUncompiled($this, $_template);
+ }
+
+ /**
+ * <<magic>> Generic Setter.
+ *
+ * @param string $property_name valid: timestamp, exists, content, template
+ * @param mixed $value new value (is not checked)
+ * @throws SmartyException if $property_name is not valid
+ */
+ public function __set($property_name, $value)
+ {
+ switch ($property_name) {
+ // regular attributes
+ case 'timestamp':
+ case 'exists':
+ case 'content':
+ // required for extends: only
+ case 'template':
+ $this->$property_name = $value;
+ break;
+
+ default:
+ throw new SmartyException("invalid source property '$property_name'.");
+ }
+ }
+
+ /**
+ * <<magic>> Generic getter.
+ *
+ * @param string $property_name valid: timestamp, exists, content
+ * @return mixed
+ * @throws SmartyException if $property_name is not valid
+ */
+ public function __get($property_name)
+ {
+ switch ($property_name) {
+ case 'timestamp':
+ case 'exists':
+ $this->handler->populateTimestamp($this);
+ return $this->$property_name;
+
+ case 'content':
+ return $this->content = $this->handler->getContent($this);
+
+ default:
+ throw new SmartyException("source property '$property_name' does not exist.");
+ }
+ }
+
+}
+
+/**
+ * Smarty Resource Data Object
+ *
+ * Meta Data Container for Template Files
+ *
+ * @package Smarty
+ * @subpackage TemplateResources
+ * @author Rodney Rehm
+ *
+ * @property string $content compiled content
+ */
+class Smarty_Template_Compiled {
+
+ /**
+ * Compiled Filepath
+ * @var string
+ */
+ public $filepath = null;
+
+ /**
+ * Compiled Timestamp
+ * @var integer
+ */
+ public $timestamp = null;
+
+ /**
+ * Compiled Existance
+ * @var boolean
+ */
+ public $exists = false;
+
+ /**
+ * Compiled Content Loaded
+ * @var boolean
+ */
+ public $loaded = false;
+
+ /**
+ * Template was compiled
+ * @var boolean
+ */
+ public $isCompiled = false;
+
+ /**
+ * Source Object
+ * @var Smarty_Template_Source
+ */
+ public $source = null;
+
+ /**
+ * Metadata properties
+ *
+ * populated by Smarty_Internal_Template::decodeProperties()
+ * @var array
+ */
+ public $_properties = null;
+
+ /**
+ * create Compiled Object container
+ *
+ * @param Smarty_Template_Source $source source object this compiled object belongs to
+ */
+ public function __construct(Smarty_Template_Source $source)
+ {
+ $this->source = $source;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_resource_custom.php b/include/smarty/libs/sysplugins/smarty_resource_custom.php
new file mode 100644
index 000000000..9ec1f356b
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_resource_custom.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * Smarty Resource Plugin
+ *
+ * @package Smarty
+ * @subpackage TemplateResources
+ * @author Rodney Rehm
+ */
+
+/**
+ * Smarty Resource Plugin
+ *
+ * Wrapper Implementation for custom resource plugins
+ *
+ * @package Smarty
+ * @subpackage TemplateResources
+ */
+abstract class Smarty_Resource_Custom extends Smarty_Resource {
+
+ /**
+ * fetch template and its modification time from data source
+ *
+ * @param string $name template name
+ * @param string &$source template source
+ * @param integer &$mtime template modification timestamp (epoch)
+ */
+ protected abstract function fetch($name, &$source, &$mtime);
+
+ /**
+ * Fetch template's modification timestamp from data source
+ *
+ * {@internal implementing this method is optional.
+ * Only implement it if modification times can be accessed faster than loading the complete template source.}}
+ *
+ * @param string $name template name
+ * @return integer|boolean timestamp (epoch) the template was modified, or false if not found
+ */
+ protected function fetchTimestamp($name)
+ {
+ return null;
+ }
+
+ /**
+ * populate Source Object with meta data from Resource
+ *
+ * @param Smarty_Template_Source $source source object
+ * @param Smarty_Internal_Template $_template template object
+ */
+ public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template=null)
+ {
+ $source->filepath = strtolower($source->type . ':' . $source->name);
+ $source->uid = sha1($source->type . ':' . $source->name);
+
+ $mtime = $this->fetchTimestamp($source->name);
+ if ($mtime !== null) {
+ $source->timestamp = $mtime;
+ } else {
+ $this->fetch($source->name, $content, $timestamp);
+ $source->timestamp = isset($timestamp) ? $timestamp : false;
+ if( isset($content) )
+ $source->content = $content;
+ }
+ $source->exists = !!$source->timestamp;
+ }
+
+ /**
+ * Load template's source into current template object
+ *
+ * @param Smarty_Template_Source $source source object
+ * @return string template source
+ * @throws SmartyException if source cannot be loaded
+ */
+ public function getContent(Smarty_Template_Source $source)
+ {
+ $this->fetch($source->name, $content, $timestamp);
+ if (isset($content)) {
+ return $content;
+ }
+
+ throw new SmartyException("Unable to read template {$source->type} '{$source->name}'");
+ }
+
+ /**
+ * Determine basename for compiled filename
+ *
+ * @param Smarty_Template_Source $source source object
+ * @return string resource's basename
+ */
+ protected function getBasename(Smarty_Template_Source $source)
+ {
+ return basename($source->name);
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_resource_recompiled.php b/include/smarty/libs/sysplugins/smarty_resource_recompiled.php
new file mode 100644
index 000000000..ab55b93a6
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_resource_recompiled.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Smarty Resource Plugin
+ *
+ * @package Smarty
+ * @subpackage TemplateResources
+ * @author Rodney Rehm
+ */
+
+/**
+ * Smarty Resource Plugin
+ *
+ * Base implementation for resource plugins that don't compile cache
+ *
+ * @package Smarty
+ * @subpackage TemplateResources
+ */
+abstract class Smarty_Resource_Recompiled extends Smarty_Resource {
+
+ /**
+ * populate Compiled Object with compiled filepath
+ *
+ * @param Smarty_Template_Compiled $compiled compiled object
+ * @param Smarty_Internal_Template $_template template object
+ * @return void
+ */
+ public function populateCompiledFilepath(Smarty_Template_Compiled $compiled, Smarty_Internal_Template $_template)
+ {
+ $compiled->filepath = false;
+ $compiled->timestamp = false;
+ $compiled->exists = false;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_resource_uncompiled.php b/include/smarty/libs/sysplugins/smarty_resource_uncompiled.php
new file mode 100644
index 000000000..ea8023507
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_resource_uncompiled.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Smarty Resource Plugin
+ *
+ * @package Smarty
+ * @subpackage TemplateResources
+ * @author Rodney Rehm
+ */
+
+/**
+ * Smarty Resource Plugin
+ *
+ * Base implementation for resource plugins that don't use the compiler
+ *
+ * @package Smarty
+ * @subpackage TemplateResources
+ */
+abstract class Smarty_Resource_Uncompiled extends Smarty_Resource {
+
+ /**
+ * Render and output the template (without using the compiler)
+ *
+ * @param Smarty_Template_Source $source source object
+ * @param Smarty_Internal_Template $_template template object
+ * @throws SmartyException on failure
+ */
+ public abstract function renderUncompiled(Smarty_Template_Source $source, Smarty_Internal_Template $_template);
+
+ /**
+ * populate compiled object with compiled filepath
+ *
+ * @param Smarty_Template_Compiled $compiled compiled object
+ * @param Smarty_Internal_Template $_template template object (is ignored)
+ */
+ public function populateCompiledFilepath(Smarty_Template_Compiled $compiled, Smarty_Internal_Template $_template)
+ {
+ $compiled->filepath = false;
+ $compiled->timestamp = false;
+ $compiled->exists = false;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/smarty/libs/sysplugins/smarty_security.php b/include/smarty/libs/sysplugins/smarty_security.php
new file mode 100644
index 000000000..f8b31d963
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_security.php
@@ -0,0 +1,459 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage Security
+ * @author Uwe Tews
+ */
+
+/*
+ * FIXME: Smarty_Security API
+ * - getter and setter instead of public properties would allow cultivating an internal cache properly
+ * - current implementation of isTrustedResourceDir() assumes that Smarty::$template_dir and Smarty::$config_dir are immutable
+ * the cache is killed every time either of the variables change. That means that two distinct Smarty objects with differing
+ * $template_dir or $config_dir should NOT share the same Smarty_Security instance,
+ * as this would lead to (severe) performance penalty! how should this be handled?
+ */
+
+/**
+ * This class does contain the security settings
+ */
+class Smarty_Security {
+
+ /**
+ * This determines how Smarty handles "<?php ... ?>" tags in templates.
+ * possible values:
+ * <ul>
+ * <li>Smarty::PHP_PASSTHRU -> echo PHP tags as they are</li>
+ * <li>Smarty::PHP_QUOTE -> escape tags as entities</li>
+ * <li>Smarty::PHP_REMOVE -> remove php tags</li>
+ * <li>Smarty::PHP_ALLOW -> execute php tags</li>
+ * </ul>
+ *
+ * @var integer
+ */
+ public $php_handling = Smarty::PHP_PASSTHRU;
+ /**
+ * This is the list of template directories that are considered secure.
+ * $template_dir is in this list implicitly.
+ *
+ * @var array
+ */
+ public $secure_dir = array();
+ /**
+ * This is an array of directories where trusted php scripts reside.
+ * {@link $security} is disabled during their inclusion/execution.
+ *
+ * @var array
+ */
+ public $trusted_dir = array();
+ /**
+ * List of regular expressions (PCRE) that include trusted URIs
+ *
+ * @var array
+ */
+ public $trusted_uri = array();
+ /**
+ * This is an array of trusted static classes.
+ *
+ * If empty access to all static classes is allowed.
+ * If set to 'none' none is allowed.
+ * @var array
+ */
+ public $static_classes = array();
+ /**
+ * This is an array of trusted PHP functions.
+ *
+ * If empty all functions are allowed.
+ * To disable all PHP functions set $php_functions = null.
+ * @var array
+ */
+ public $php_functions = array(
+ 'isset', 'empty',
+ 'count', 'sizeof',
+ 'in_array', 'is_array',
+ 'time',
+ 'nl2br',
+ );
+ /**
+ * This is an array of trusted PHP modifers.
+ *
+ * If empty all modifiers are allowed.
+ * To disable all modifier set $modifiers = null.
+ * @var array
+ */
+ public $php_modifiers = array(
+ 'escape',
+ 'count'
+ );
+ /**
+ * This is an array of allowed tags.
+ *
+ * If empty no restriction by allowed_tags.
+ * @var array
+ */
+ public $allowed_tags = array();
+ /**
+ * This is an array of disabled tags.
+ *
+ * If empty no restriction by disabled_tags.
+ * @var array
+ */
+ public $disabled_tags = array();
+ /**
+ * This is an array of allowed modifier plugins.
+ *
+ * If empty no restriction by allowed_modifiers.
+ * @var array
+ */
+ public $allowed_modifiers = array();
+ /**
+ * This is an array of disabled modifier plugins.
+ *
+ * If empty no restriction by disabled_modifiers.
+ * @var array
+ */
+ public $disabled_modifiers = array();
+ /**
+ * This is an array of trusted streams.
+ *
+ * If empty all streams are allowed.
+ * To disable all streams set $streams = null.
+ * @var array
+ */
+ public $streams = array('file');
+ /**
+ * + flag if constants can be accessed from template
+ * @var boolean
+ */
+ public $allow_constants = true;
+ /**
+ * + flag if super globals can be accessed from template
+ * @var boolean
+ */
+ public $allow_super_globals = true;
+
+ /**
+ * Cache for $resource_dir lookups
+ * @var array
+ */
+ protected $_resource_dir = null;
+ /**
+ * Cache for $template_dir lookups
+ * @var array
+ */
+ protected $_template_dir = null;
+ /**
+ * Cache for $config_dir lookups
+ * @var array
+ */
+ protected $_config_dir = null;
+ /**
+ * Cache for $secure_dir lookups
+ * @var array
+ */
+ protected $_secure_dir = null;
+ /**
+ * Cache for $php_resource_dir lookups
+ * @var array
+ */
+ protected $_php_resource_dir = null;
+ /**
+ * Cache for $trusted_dir lookups
+ * @var array
+ */
+ protected $_trusted_dir = null;
+
+
+ /**
+ * @param Smarty $smarty
+ */
+ public function __construct($smarty)
+ {
+ $this->smarty = $smarty;
+ }
+
+ /**
+ * Check if PHP function is trusted.
+ *
+ * @param string $function_name
+ * @param object $compiler compiler object
+ * @return boolean true if function is trusted
+ * @throws SmartyCompilerException if php function is not trusted
+ */
+ public function isTrustedPhpFunction($function_name, $compiler)
+ {
+ if (isset($this->php_functions) && (empty($this->php_functions) || in_array($function_name, $this->php_functions))) {
+ return true;
+ }
+
+ $compiler->trigger_template_error("PHP function '{$function_name}' not allowed by security setting");
+ return false; // should not, but who knows what happens to the compiler in the future?
+ }
+
+ /**
+ * Check if static class is trusted.
+ *
+ * @param string $class_name
+ * @param object $compiler compiler object
+ * @return boolean true if class is trusted
+ * @throws SmartyCompilerException if static class is not trusted
+ */
+ public function isTrustedStaticClass($class_name, $compiler)
+ {
+ if (isset($this->static_classes) && (empty($this->static_classes) || in_array($class_name, $this->static_classes))) {
+ return true;
+ }
+
+ $compiler->trigger_template_error("access to static class '{$class_name}' not allowed by security setting");
+ return false; // should not, but who knows what happens to the compiler in the future?
+ }
+
+ /**
+ * Check if PHP modifier is trusted.
+ *
+ * @param string $modifier_name
+ * @param object $compiler compiler object
+ * @return boolean true if modifier is trusted
+ * @throws SmartyCompilerException if modifier is not trusted
+ */
+ public function isTrustedPhpModifier($modifier_name, $compiler)
+ {
+ if (isset($this->php_modifiers) && (empty($this->php_modifiers) || in_array($modifier_name, $this->php_modifiers))) {
+ return true;
+ }
+
+ $compiler->trigger_template_error("modifier '{$modifier_name}' not allowed by security setting");
+ return false; // should not, but who knows what happens to the compiler in the future?
+ }
+
+ /**
+ * Check if tag is trusted.
+ *
+ * @param string $tag_name
+ * @param object $compiler compiler object
+ * @return boolean true if tag is trusted
+ * @throws SmartyCompilerException if modifier is not trusted
+ */
+ public function isTrustedTag($tag_name, $compiler)
+ {
+ // check for internal always required tags
+ if (in_array($tag_name, array('assign', 'call', 'private_filter', 'private_block_plugin', 'private_function_plugin', 'private_object_block_function',
+ 'private_object_function', 'private_registered_function', 'private_registered_block', 'private_special_variable', 'private_print_expression', 'private_modifier'))) {
+ return true;
+ }
+ // check security settings
+ if (empty($this->allowed_tags)) {
+ if (empty($this->disabled_tags) || !in_array($tag_name, $this->disabled_tags)) {
+ return true;
+ } else {
+ $compiler->trigger_template_error("tag '{$tag_name}' disabled by security setting", $compiler->lex->taglineno);
+ }
+ } else if (in_array($tag_name, $this->allowed_tags) && !in_array($tag_name, $this->disabled_tags)) {
+ return true;
+ } else {
+ $compiler->trigger_template_error("tag '{$tag_name}' not allowed by security setting", $compiler->lex->taglineno);
+ }
+ return false; // should not, but who knows what happens to the compiler in the future?
+ }
+
+ /**
+ * Check if modifier plugin is trusted.
+ *
+ * @param string $modifier_name
+ * @param object $compiler compiler object
+ * @return boolean true if tag is trusted
+ * @throws SmartyCompilerException if modifier is not trusted
+ */
+ public function isTrustedModifier($modifier_name, $compiler)
+ {
+ // check for internal always allowed modifier
+ if (in_array($modifier_name, array('default'))) {
+ return true;
+ }
+ // check security settings
+ if (empty($this->allowed_modifiers)) {
+ if (empty($this->disabled_modifiers) || !in_array($modifier_name, $this->disabled_modifiers)) {
+ return true;
+ } else {
+ $compiler->trigger_template_error("modifier '{$modifier_name}' disabled by security setting", $compiler->lex->taglineno);
+ }
+ } else if (in_array($modifier_name, $this->allowed_modifiers) && !in_array($modifier_name, $this->disabled_modifiers)) {
+ return true;
+ } else {
+ $compiler->trigger_template_error("modifier '{$modifier_name}' not allowed by security setting", $compiler->lex->taglineno);
+ }
+ return false; // should not, but who knows what happens to the compiler in the future?
+ }
+
+ /**
+ * Check if stream is trusted.
+ *
+ * @param string $stream_name
+ * @return boolean true if stream is trusted
+ * @throws SmartyException if stream is not trusted
+ */
+ public function isTrustedStream($stream_name)
+ {
+ if (isset($this->streams) && (empty($this->streams) || in_array($stream_name, $this->streams))) {
+ return true;
+ }
+
+ throw new SmartyException("stream '{$stream_name}' not allowed by security setting");
+ }
+
+ /**
+ * Check if directory of file resource is trusted.
+ *
+ * @param string $filepath
+ * @return boolean true if directory is trusted
+ * @throws SmartyException if directory is not trusted
+ */
+ public function isTrustedResourceDir($filepath)
+ {
+ $_template = false;
+ $_config = false;
+ $_secure = false;
+
+ $_template_dir = $this->smarty->getTemplateDir();
+ $_config_dir = $this->smarty->getConfigDir();
+
+ // check if index is outdated
+ if ((!$this->_template_dir || $this->_template_dir !== $_template_dir)
+ || (!$this->_config_dir || $this->_config_dir !== $_config_dir)
+ || (!empty($this->secure_dir) && (!$this->_secure_dir || $this->_secure_dir !== $this->secure_dir))
+ ) {
+ $this->_resource_dir = array();
+ $_template = true;
+ $_config = true;
+ $_secure = !empty($this->secure_dir);
+ }
+
+ // rebuild template dir index
+ if ($_template) {
+ $this->_template_dir = $_template_dir;
+ foreach ($_template_dir as $directory) {
+ $directory = realpath($directory);
+ $this->_resource_dir[$directory] = true;
+ }
+ }
+
+ // rebuild config dir index
+ if ($_config) {
+ $this->_config_dir = $_config_dir;
+ foreach ($_config_dir as $directory) {
+ $directory = realpath($directory);
+ $this->_resource_dir[$directory] = true;
+ }
+ }
+
+ // rebuild secure dir index
+ if ($_secure) {
+ $this->_secure_dir = $this->secure_dir;
+ foreach ((array) $this->secure_dir as $directory) {
+ $directory = realpath($directory);
+ $this->_resource_dir[$directory] = true;
+ }
+ }
+
+ $_filepath = realpath($filepath);
+ $directory = dirname($_filepath);
+ $_directory = array();
+ while (true) {
+ // remember the directory to add it to _resource_dir in case we're successful
+ $_directory[$directory] = true;
+ // test if the directory is trusted
+ if (isset($this->_resource_dir[$directory])) {
+ // merge sub directories of current $directory into _resource_dir to speed up subsequent lookups
+ $this->_resource_dir = array_merge($this->_resource_dir, $_directory);
+ return true;
+ }
+ // abort if we've reached root
+ if (($pos = strrpos($directory, DS)) === false || !isset($directory[1])) {
+ break;
+ }
+ // bubble up one level
+ $directory = substr($directory, 0, $pos);
+ }
+
+ // give up
+ throw new SmartyException("directory '{$_filepath}' not allowed by security setting");
+ }
+
+ /**
+ * Check if URI (e.g. {fetch} or {html_image}) is trusted
+ *
+ * To simplify things, isTrustedUri() resolves all input to "{$PROTOCOL}://{$HOSTNAME}".
+ * So "http://username:password@hello.world.example.org:8080/some-path?some=query-string"
+ * is reduced to "http://hello.world.example.org" prior to applying the patters from {@link $trusted_uri}.
+ * @param string $uri
+ * @return boolean true if URI is trusted
+ * @throws SmartyException if URI is not trusted
+ * @uses $trusted_uri for list of patterns to match against $uri
+ */
+ public function isTrustedUri($uri)
+ {
+ $_uri = parse_url($uri);
+ if (!empty($_uri['scheme']) && !empty($_uri['host'])) {
+ $_uri = $_uri['scheme'] . '://' . $_uri['host'];
+ foreach ($this->trusted_uri as $pattern) {
+ if (preg_match($pattern, $_uri)) {
+ return true;
+ }
+ }
+ }
+
+ throw new SmartyException("URI '{$uri}' not allowed by security setting");
+ }
+
+ /**
+ * Check if directory of file resource is trusted.
+ *
+ * @param string $filepath
+ * @return boolean true if directory is trusted
+ * @throws SmartyException if PHP directory is not trusted
+ */
+ public function isTrustedPHPDir($filepath)
+ {
+ if (empty($this->trusted_dir)) {
+ throw new SmartyException("directory '{$filepath}' not allowed by security setting (no trusted_dir specified)");
+ }
+
+ // check if index is outdated
+ if (!$this->_trusted_dir || $this->_trusted_dir !== $this->trusted_dir) {
+ $this->_php_resource_dir = array();
+
+ $this->_trusted_dir = $this->trusted_dir;
+ foreach ((array) $this->trusted_dir as $directory) {
+ $directory = realpath($directory);
+ $this->_php_resource_dir[$directory] = true;
+ }
+ }
+
+ $_filepath = realpath($filepath);
+ $directory = dirname($_filepath);
+ $_directory = array();
+ while (true) {
+ // remember the directory to add it to _resource_dir in case we're successful
+ $_directory[] = $directory;
+ // test if the directory is trusted
+ if (isset($this->_php_resource_dir[$directory])) {
+ // merge sub directories of current $directory into _resource_dir to speed up subsequent lookups
+ $this->_php_resource_dir = array_merge($this->_php_resource_dir, $_directory);
+ return true;
+ }
+ // abort if we've reached root
+ if (($pos = strrpos($directory, DS)) === false || !isset($directory[2])) {
+ break;
+ }
+ // bubble up one level
+ $directory = substr($directory, 0, $pos);
+ }
+
+ throw new SmartyException("directory '{$_filepath}' not allowed by security setting");
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/include/template.class.php b/include/template.class.php
index 63133384f..74a1eb36d 100644
--- a/include/template.class.php
+++ b/include/template.class.php
@@ -21,42 +21,74 @@
// | USA. |
// +-----------------------------------------------------------------------+
+/**
+ * @package template
+ */
-class Template {
+//require_once( PHPWG_ROOT_PATH .'include/smarty/libs/Smarty.class.php');
+require_once( PHPWG_ROOT_PATH .'include/smarty/libs/SmartyBC.class.php');
- var $smarty;
+/** default rank for buttons */
+define('BUTTONS_RANK_NEUTRAL', 50);
+
+/**
+ * This a wrapper arround Smarty classes proving various custom mechanisms for templates.
+ */
+class Template
+{
+ /** @var Smarty */
+ var $smarty;
+ /** @var string */
var $output = '';
- // Hash of filenames for each template handle.
+ /** @var string[] - Hash of filenames for each template handle. */
var $files = array();
-
- // Template extents filenames for each template handle.
+ /** @var string[] - Template extents filenames for each template handle. */
var $extents = array();
-
- // Templates prefilter from external sources (plugins)
+ /** @var array - Templates prefilter from external sources (plugins) */
var $external_filters = array();
- // used by html_head smarty block to add content before </head>
+ /** @var string - Content to add before </head> tag */
var $html_head_elements = array();
+ /** @var string - Runtime CSS rules */
private $html_style = '';
+ /** @const string */
const COMBINED_SCRIPTS_TAG = '<!-- COMBINED_SCRIPTS -->';
+ /** @var ScriptLoader */
var $scriptLoader;
+ /** @const string */
const COMBINED_CSS_TAG = '<!-- COMBINED_CSS -->';
- var $css_by_priority = array();
-
+ /** @var CssLoader */
+ var $cssLoader;
+
+ /** @var array - Runtime buttons on picture page */
var $picture_buttons = array();
+ /** @var array - Runtime buttons on index page */
var $index_buttons = array();
- function Template($root = ".", $theme= "", $path = "template")
+
+ /**
+ * @var string $root
+ * @var string $theme
+ * @var string $path
+ */
+ function __construct($root=".", $theme="", $path="template")
{
global $conf, $lang_info;
+ SmartyException::$escape = false;
+
$this->scriptLoader = new ScriptLoader;
- $this->smarty = new Smarty;
+ $this->cssLoader = new CssLoader;
+ $this->smarty = new SmartyBC;
$this->smarty->debugging = $conf['debug_template'];
+ if (!$this->smarty->debugging)
+ {
+ $this->smarty->error_reporting = error_reporting() & ~E_NOTICE;
+ }
$this->smarty->compile_check = $conf['template_compile_check'];
$this->smarty->force_compile = $conf['template_force_compile'];
@@ -68,8 +100,8 @@ class Template {
{
load_language('admin.lang');
fatal_error(
- sprintf(
- l10n('Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'),
+ l10n(
+ 'Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation',
$conf['data_location']
),
l10n('an error happened'),
@@ -84,27 +116,28 @@ class Template {
$compile_dir = PHPWG_ROOT_PATH.$conf['data_location'].'templates_c';
mkgetdir( $compile_dir );
- $this->smarty->compile_dir = $compile_dir;
-
- $this->smarty->assign_by_ref( 'pwg', new PwgTemplateAdapter() );
- $this->smarty->register_modifier( 'translate', array('Template', 'mod_translate') );
- $this->smarty->register_modifier( 'explode', array('Template', 'mod_explode') );
- $this->smarty->register_modifier( 'get_extent', array(&$this, 'get_extent') );
- $this->smarty->register_block('html_head', array(&$this, 'block_html_head') );
- $this->smarty->register_block('html_style', array(&$this, 'block_html_style') );
- $this->smarty->register_function('combine_script', array(&$this, 'func_combine_script') );
- $this->smarty->register_function('get_combined_scripts', array(&$this, 'func_get_combined_scripts') );
- $this->smarty->register_function('combine_css', array(&$this, 'func_combine_css') );
- $this->smarty->register_function('define_derivative', array(&$this, 'func_define_derivative') );
- $this->smarty->register_compiler_function('get_combined_css', array(&$this, 'func_get_combined_css') );
- $this->smarty->register_block('footer_script', array(&$this, 'block_footer_script') );
- $this->smarty->register_prefilter( array('Template', 'prefilter_white_space') );
+ $this->smarty->setCompileDir($compile_dir);
+
+ $this->smarty->assign( 'pwg', new PwgTemplateAdapter() );
+ $this->smarty->registerPlugin('modifiercompiler', 'translate', array('Template', 'modcompiler_translate') );
+ $this->smarty->registerPlugin('modifiercompiler', 'translate_dec', array('Template', 'modcompiler_translate_dec') );
+ $this->smarty->registerPlugin('modifier', 'explode', array('Template', 'mod_explode') );
+ $this->smarty->registerPlugin('modifier', 'get_extent', array($this, 'get_extent') );
+ $this->smarty->registerPlugin('block', 'html_head', array($this, 'block_html_head') );
+ $this->smarty->registerPlugin('block', 'html_style', array($this, 'block_html_style') );
+ $this->smarty->registerPlugin('function', 'combine_script', array($this, 'func_combine_script') );
+ $this->smarty->registerPlugin('function', 'get_combined_scripts', array($this, 'func_get_combined_scripts') );
+ $this->smarty->registerPlugin('function', 'combine_css', array($this, 'func_combine_css') );
+ $this->smarty->registerPlugin('function', 'define_derivative', array($this, 'func_define_derivative') );
+ $this->smarty->registerPlugin('compiler', 'get_combined_css', array($this, 'func_get_combined_css') );
+ $this->smarty->registerPlugin('block', 'footer_script', array($this, 'block_footer_script') );
+ $this->smarty->registerFilter('pre', array('Template', 'prefilter_white_space') );
if ( $conf['compiled_template_cache_language'] )
{
- $this->smarty->register_prefilter( array('Template', 'prefilter_language') );
+ $this->smarty->registerFilter('post', array('Template', 'postfilter_language') );
}
- $this->smarty->template_dir = array();
+ $this->smarty->setTemplateDir(array());
if ( !empty($theme) )
{
$this->set_theme($root, $theme, $path);
@@ -126,7 +159,13 @@ class Template {
}
/**
- * Load theme's parameters.
+ * Loads theme's parameters.
+ *
+ * @param string $root
+ * @param string $theme
+ * @param string $path
+ * @param bool $load_css
+ * @param bool $load_local_head
*/
function set_theme($root, $theme, $path, $load_css=true, $load_local_head=true)
{
@@ -159,27 +198,31 @@ class Template {
}
/**
- * Add template directory for this Template object.
- * Set compile id if not exists.
+ * Adds template directory for this Template object.
+ * Also set compile id if not exists.
+ *
+ * @param string $dir
*/
function set_template_dir($dir)
{
- $this->smarty->template_dir[] = $dir;
+ $this->smarty->addTemplateDir($dir);
if (!isset($this->smarty->compile_id))
{
- $real_dir = realpath($dir);
- $compile_id = crc32( $real_dir===false ? $dir : $real_dir);
- $this->smarty->compile_id = base_convert($compile_id, 10, 36 );
+ $compile_id = "1";
+ $compile_id .= ($real_dir = realpath($dir))===false ? $dir : $real_dir;
+ $this->smarty->compile_id = base_convert(crc32($compile_id), 10, 36 );
}
}
/**
* Gets the template root directory for this Template object.
+ *
+ * @return string
*/
function get_template_dir()
{
- return $this->smarty->template_dir;
+ return $this->smarty->getTemplateDir();
}
/**
@@ -189,19 +232,29 @@ class Template {
{
$save_compile_id = $this->smarty->compile_id;
$this->smarty->compile_id = null;
- $this->smarty->clear_compiled_tpl();
+ $this->smarty->clearCompiledTemplate();
$this->smarty->compile_id = $save_compile_id;
- file_put_contents($this->smarty->compile_dir.'/index.htm', 'Not allowed!');
+ file_put_contents($this->smarty->getCompileDir().'/index.htm', 'Not allowed!');
}
+ /**
+ * Returns theme's parameter.
+ *
+ * @param string $val
+ * @return mixed
+ */
function get_themeconf($val)
{
- $tc = $this->smarty->get_template_vars('themeconf');
+ $tc = $this->smarty->getTemplateVars('themeconf');
return isset($tc[$val]) ? $tc[$val] : '';
}
/**
* Sets the template filename for handle.
+ *
+ * @param string $handle
+ * @param string $filename
+ * @return bool
*/
function set_filename($handle, $filename)
{
@@ -209,8 +262,10 @@ class Template {
}
/**
- * Sets the template filenames for handles. $filename_array should be a
- * hash of handle => filename pairs.
+ * Sets the template filenames for handles.
+ *
+ * @param string[] $filename_array hashmap of handle=>filename
+ * @return true
*/
function set_filenames($filename_array)
{
@@ -235,6 +290,13 @@ class Template {
/**
* Sets template extention filename for handles.
+ *
+ * @param string $filename
+ * @param mixed $param
+ * @param string $dir
+ * @param bool $overwrite
+ * @param string $theme
+ * @return bool
*/
function set_extent($filename, $param, $dir='', $overwrite=true, $theme='N/A')
{
@@ -243,7 +305,12 @@ class Template {
/**
* Sets template extentions filenames for handles.
- * $filename_array should be an hash of filename => array( handle, param) or filename => handle
+ *
+ * @param string[] $filename_array hashmap of handle=>filename
+ * @param string $dir
+ * @param bool $overwrite
+ * @param string $theme
+ * @return bool
*/
function set_extents($filename_array, $dir='', $overwrite=true, $theme='N/A')
{
@@ -281,7 +348,13 @@ class Template {
return true;
}
- /** return template extension if exists */
+ /**
+ * Returns template extension if exists.
+ *
+ * @param string $filename should be empty!
+ * @param string $handle
+ * @return string
+ */
function get_extent($filename='', $handle='')
{
if (isset($this->extents[$handle]))
@@ -291,17 +364,27 @@ class Template {
return $filename;
}
- /** see smarty assign http://www.smarty.net/manual/en/api.assign.php */
- function assign($tpl_var, $value = null)
+ /**
+ * Assigns a template variable.
+ * @see http://www.smarty.net/manual/en/api.assign.php
+ *
+ * @param string|array $tpl_var can be a var name or a hashmap of variables
+ * (in this case, do not use the _$value_ parameter)
+ * @param mixed $value
+ */
+ function assign($tpl_var, $value=null)
{
$this->smarty->assign( $tpl_var, $value );
}
/**
- * Inserts the uncompiled code for $handle as the value of $varname in the
- * root-level. This can be used to effectively include a template in the
- * middle of another template.
- * This is equivalent to assign($varname, $this->parse($handle, true))
+ * Defines _$varname_ as the compiled result of _$handle_.
+ * This can be used to effectively include a template in another template.
+ * This is equivalent to assign($varname, $this->parse($handle, true)).
+ *
+ * @param string $varname
+ * @param string $handle
+ * @return true
*/
function assign_var_from_handle($varname, $handle)
{
@@ -309,46 +392,60 @@ class Template {
return true;
}
- /** see smarty append http://www.smarty.net/manual/en/api.append.php */
+ /**
+ * Appends a new value in a template array variable, the variable is created if needed.
+ * @see http://www.smarty.net/manual/en/api.append.php
+ *
+ * @param string $tpl_var
+ * @param mixed $value
+ * @param bool $merge
+ */
function append($tpl_var, $value=null, $merge=false)
{
$this->smarty->append( $tpl_var, $value, $merge );
}
/**
- * Root-level variable concatenation. Appends a string to an existing
- * variable assignment with the same name.
+ * Performs a string concatenation.
+ *
+ * @param string $tpl_var
+ * @param string $value
*/
function concat($tpl_var, $value)
{
- $old_val = & $this->smarty->get_template_vars($tpl_var);
- if ( isset($old_val) )
- {
- $old_val .= $value;
- }
- else
- {
- $this->assign($tpl_var, $value);
- }
+ $this->assign($tpl_var,
+ $this->smarty->getTemplateVars($tpl_var) . $value);
}
- /** see smarty append http://www.smarty.net/manual/en/api.clear_assign.php */
+ /**
+ * Removes an assigned template variable.
+ * @see http://www.smarty.net/manual/en/api.clear_assign.php
+ *
+ * @param string $tpl_var
+ */
function clear_assign($tpl_var)
{
- $this->smarty->clear_assign( $tpl_var );
+ $this->smarty->clearAssign( $tpl_var );
}
- /** see smarty get_template_vars http://www.smarty.net/manual/en/api.get_template_vars.php */
- function &get_template_vars($name=null)
+ /**
+ * Returns an assigned template variable.
+ * @see http://www.smarty.net/manual/en/api.get_template_vars.php
+ *
+ * @param string $tpl_var
+ */
+ function get_template_vars($tpl_var=null)
{
- return $this->smarty->get_template_vars( $name );
+ return $this->smarty->getTemplateVars( $tpl_var );
}
-
/**
- * Load the file for the handle, eventually compile the file and run the compiled
- * code. This will add the output to the results or return the result if $return
- * is true.
+ * Loads the template file of the handle, compiles it and appends the result to the output
+ * (or returns it if _$return_ is true).
+ *
+ * @param string $handle
+ * @param bool $return
+ * @return null|string
*/
function parse($handle, $return=false)
{
@@ -365,10 +462,10 @@ class Template {
global $conf, $lang_info;
if ( $conf['compiled_template_cache_language'] and isset($lang_info['code']) )
{
- $this->smarty->compile_id .= '.'.$lang_info['code'];
+ $this->smarty->compile_id .= '_'.$lang_info['code'];
}
- $v = $this->smarty->fetch($this->files[$handle], null, null, false);
+ $v = $this->smarty->fetch($this->files[$handle]);
$this->smarty->compile_id = $save_compile_id;
$this->unload_external_filters($handle);
@@ -381,8 +478,10 @@ class Template {
}
/**
- * Load the file for the handle, eventually compile the file and run the compiled
- * code. This will print out the results of executing the template.
+ * Loads the template file of the handle, compiles it and appends the result to the output,
+ * then sends the output to the browser.
+ *
+ * @param string $handle
*/
function pparse($handle)
{
@@ -390,6 +489,9 @@ class Template {
$this->flush();
}
+ /**
+ * Load and compile JS & CSS into the template and sends the output to the browser.
+ */
function flush()
{
if (!$this->scriptLoader->did_head())
@@ -407,48 +509,26 @@ class Template {
.'"></script>';
}
- $this->output = substr_replace( $this->output, "\n".implode( "\n", $content ), $pos, strlen(self::COMBINED_SCRIPTS_TAG) );
+ $this->output = substr_replace( $this->output, implode( "\n", $content ), $pos, strlen(self::COMBINED_SCRIPTS_TAG) );
} //else maybe error or warning ?
}
- if(!empty($this->css_by_priority))
- {
- ksort($this->css_by_priority);
-
- global $conf;
- $css = array();
- if ($conf['template_combine_files'])
- {
- $combiner = new FileCombiner('css');
- foreach ($this->css_by_priority as $files)
- {
- foreach ($files as $file_ver)
- $combiner->add( $file_ver[0], $file_ver[1] );
- }
- if ( $combiner->combine( $out_file, $out_version) )
- $css[] = array($out_file, $out_version);
- }
- else
- {
- foreach ($this->css_by_priority as $files)
- $css = array_merge($css, $files);
- }
+ $css = $this->cssLoader->get_css();
- $content = array();
- foreach( $css as $file_ver )
- {
- $href = embellish_url(get_root_url().$file_ver[0]);
- if ($file_ver[1] !== false)
- $href .= '?v' . ($file_ver[1] ? $file_ver[1] : PHPWG_VERSION);
- // trigger the event for eventual use of a cdn
- $href = trigger_event('combined_css', $href, $file_ver[0], $file_ver[1]);
- $content[] = '<link rel="stylesheet" type="text/css" href="'.$href.'">';
- }
- $this->output = str_replace(self::COMBINED_CSS_TAG,
- implode( "\n", $content ),
- $this->output );
- $this->css_by_priority = array();
+ $content = array();
+ foreach( $css as $combi )
+ {
+ $href = embellish_url(get_root_url().$combi->path);
+ if ($combi->version !== false)
+ $href .= '?v' . ($combi->version ? $combi->version : PHPWG_VERSION);
+ // trigger the event for eventual use of a cdn
+ $href = trigger_event('combined_css', $href, $combi);
+ $content[] = '<link rel="stylesheet" type="text/css" href="'.$href.'">';
}
+ $this->output = str_replace(self::COMBINED_CSS_TAG,
+ implode( "\n", $content ),
+ $this->output );
+ $this->cssLoader->clear();
if ( count($this->html_head_elements) || strlen($this->html_style) )
{
@@ -471,7 +551,10 @@ class Template {
$this->output='';
}
- /** flushes the output */
+ /**
+ * Same as flush() but with optional debugging.
+ * @see Template::flush()
+ */
function p()
{
$this->flush();
@@ -484,23 +567,110 @@ class Template {
'AAAA_DEBUG_TOTAL_TIME__' => get_elapsed_time($t2, get_moment())
)
);
- require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php');
- echo smarty_core_display_debug_console(null, $this->smarty);
+ Smarty_Internal_Debug::display_debug($this->smarty);
}
}
/**
- * translate variable modifier - translates a text to the currently loaded
- * language
+ * Eval a temp string to retrieve the original PHP value.
+ *
+ * @param string $str
+ * @return mixed
*/
- static function mod_translate($text)
+ static function get_php_str_val($str)
{
- return l10n($text);
+ if (is_string($str) && strlen($str)>1)
+ {
+ if ( ($str[0]=='\'' && $str[strlen($str)-1]=='\'')
+ || ($str[0]=='"' && $str[strlen($str)-1]=='"'))
+ {
+ eval('$tmp='.$str.';');
+ return $tmp;
+ }
+ }
+ return null;
}
/**
- * explode variable modifier - similar to php explode
- * 'Yes;No'|@explode:';' -> array('Yes', 'No')
+ * "translate" variable modifier.
+ * Usage :
+ * - {'Comment'|translate}
+ * - {'%d comments'|translate:$count}
+ * @see l10n()
+ *
+ * @param array $params
+ * @return string
+ */
+ static function modcompiler_translate($params)
+ {
+ global $conf, $lang;
+
+ switch (count($params))
+ {
+ case 1:
+ if ($conf['compiled_template_cache_language']
+ && ($key=self::get_php_str_val($params[0])) !== null
+ && isset($lang[$key])
+ ) {
+ return var_export($lang[$key], true);
+ }
+ return 'l10n('.$params[0].')';
+
+ default:
+ if ($conf['compiled_template_cache_language'])
+ {
+ $ret = 'sprintf(';
+ $ret .= self::modcompiler_translate( array($params[0]) );
+ $ret .= ','. implode(',', array_slice($params, 1));
+ $ret .= ')';
+ return $ret;
+ }
+ return 'l10n('.$params[0].','.implode(',', array_slice($params, 1)).')';
+ }
+ }
+
+ /**
+ * "translate_dec" variable modifier.
+ * Usage :
+ * - {$count|translate_dec:'%d comment':'%d comments'}
+ * @see l10n_dec()
+ *
+ * @param array $params
+ * @return string
+ */
+ static function modcompiler_translate_dec($params)
+ {
+ global $conf, $lang, $lang_info;
+ if ($conf['compiled_template_cache_language'])
+ {
+ $ret = 'sprintf(';
+ if ($lang_info['zero_plural'])
+ {
+ $ret .= '($tmp=('.$params[0].'))>1||$tmp==0';
+ }
+ else
+ {
+ $ret .= '($tmp=('.$params[0].'))>1';
+ }
+ $ret .= '?';
+ $ret .= self::modcompiler_translate( array($params[2]) );
+ $ret .= ':';
+ $ret .= self::modcompiler_translate( array($params[1]) );
+ $ret .= ',$tmp';
+ $ret .= ')';
+ return $ret;
+ }
+ return 'l10n_dec('.$params[1].','.$params[2].','.$params[0].')';
+ }
+
+ /**
+ * "explode" variable modifier.
+ * Usage :
+ * - {assign var=valueExploded value=$value|@explode:','}
+ *
+ * @param string $text
+ * @param string $delimiter
+ * @return array
*/
static function mod_explode($text, $delimiter=',')
{
@@ -508,10 +678,11 @@ class Template {
}
/**
- * This smarty "html_head" block allows to add content just before
- * </head> element in the output after the head has been parsed. This is
- * handy in order to respect strict standards when <style> and <link>
- * html elements must appear in the <head> element
+ * The "html_head" block allows to add content just before
+ * </head> element in the output after the head has been parsed.
+ *
+ * @param array $params (unused)
+ * @param string $content
*/
function block_html_head($params, $content)
{
@@ -522,6 +693,13 @@ class Template {
}
}
+ /**
+ * The "html_style" block allows to add CSS juste before
+ * </head> element in the output after the head has been parsed.
+ *
+ * @param array $params (unused)
+ * @param string $content
+ */
function block_html_style($params, $content)
{
$content = trim($content);
@@ -531,13 +709,27 @@ class Template {
}
}
- function func_define_derivative($params)
+ /**
+ * The "define_derivative" function allows to define derivative from tpl file.
+ * It assigns a DerivativeParams object to _name_ template variable.
+ *
+ * @param array $params
+ * - name (required)
+ * - type (optional)
+ * - width (required if type is empty)
+ * - height (required if type is empty)
+ * - crop (optional, used if type is empty)
+ * - min_height (optional, used with crop)
+ * - min_height (optional, used with crop)
+ * @param Smarty $smarty
+ */
+ function func_define_derivative($params, $smarty)
{
!empty($params['name']) or fatal_error('define_derivative missing name');
if (isset($params['type']))
{
$derivative = ImageStdParams::get_by_type($params['type']);
- $this->smarty->assign( $params['name'], $derivative);
+ $smarty->assign( $params['name'], $derivative);
return;
}
!empty($params['width']) or fatal_error('define_derivative missing width');
@@ -569,26 +761,26 @@ class Template {
}
}
- $this->smarty->assign( $params['name'], ImageStdParams::get_custom($w, $h, $crop, $minw, $minh) );
+ $smarty->assign( $params['name'], ImageStdParams::get_custom($w, $h, $crop, $minw, $minh) );
}
- /**
- * combine_script smarty function allows inclusion of a javascript file in the current page.
- * The engine will combine several js files into a single one in order to reduce the number of
- * required http requests.
- * param id - required
- * param path - required - the path to js file RELATIVE to piwigo root dir
- * param load - optional - header|footer|async, default header
- * param require - optional - comma separated list of script ids required to be loaded and executed
- before this one
- * param version - optional - plugins could use this and change it in order to force a
- browser refresh
- */
+ /**
+ * The "combine_script" functions allows inclusion of a javascript file in the current page.
+ * The engine will combine several js files into a single one.
+ *
+ * @param array $params
+ * - id (required)
+ * - path (required)
+ * - load (optional) 'header', 'footer' or 'async'
+ * - require (optional) comma separated list of script ids required to be loaded
+ * and executed before this one
+ * - version (optional) used to force a browser refresh
+ */
function func_combine_script($params)
{
if (!isset($params['id']))
{
- $this->smarty->trigger_error("combine_script: missing 'id' parameter", E_USER_ERROR);
+ trigger_error("combine_script: missing 'id' parameter", E_USER_ERROR);
}
$load = 0;
if (isset($params['load']))
@@ -598,29 +790,29 @@ class Template {
case 'header': break;
case 'footer': $load=1; break;
case 'async': $load=2; break;
- default: $this->smarty->trigger_error("combine_script: invalid 'load' parameter", E_USER_ERROR);
+ default: trigger_error("combine_script: invalid 'load' parameter", E_USER_ERROR);
}
}
- // TEMP in 2.5 for backward compatibility
- if(!empty($params['require']))
- {
- $params['require'] = str_replace('jquery.effects.', 'jquery.ui.effect-', $params['require'] );
- $params['require'] = str_replace('jquery.effects', 'jquery.ui.effect', $params['require'] );
- }
-
$this->scriptLoader->add( $params['id'], $load,
empty($params['require']) ? array() : explode( ',', $params['require'] ),
@$params['path'],
- isset($params['version']) ? $params['version'] : 0 );
+ isset($params['version']) ? $params['version'] : 0,
+ @$params['template']);
}
-
+ /**
+ * The "get_combined_scripts" function returns HTML tag of combined scripts.
+ * It can returns a placeholder for delayed JS files combination and minification.
+ *
+ * @param array $params
+ * - load (required)
+ */
function func_get_combined_scripts($params)
{
if (!isset($params['load']))
{
- $this->smarty->trigger_error("get_combined_scripts: missing 'load' parameter", E_USER_ERROR);
+ trigger_error("get_combined_scripts: missing 'load' parameter", E_USER_ERROR);
}
$load = $params['load']=='header' ? 0 : 1;
$content = array();
@@ -667,8 +859,13 @@ var s,after = document.getElementsByTagName(\'script\')[document.getElementsByTa
return implode("\n", $content);
}
-
- private static function make_script_src( $script )
+ /**
+ * Returns clean relative URL to script file.
+ *
+ * @param Combinable $script
+ * @return string
+ */
+ private static function make_script_src($script)
{
$ret = '';
if ( $script->is_remote() )
@@ -686,19 +883,19 @@ var s,after = document.getElementsByTagName(\'script\')[document.getElementsByTa
return embellish_url($ret);
}
+ /**
+ * The "footer_script" block allows to add runtime script in the HTML page.
+ *
+ * @param array $params
+ * - require (optional) comma separated list of script ids
+ * @param string $content
+ */
function block_footer_script($params, $content)
{
$content = trim($content);
if ( !empty($content) )
{ // second call
- // TEMP in 2.5 for backward compatibility
- if(!empty($params['require']))
- {
- $params['require'] = str_replace('jquery.effects.', 'jquery.ui.effect-', $params['require'] );
- $params['require'] = str_replace('jquery.effects', 'jquery.ui.effect', $params['require'] );
- }
-
$this->scriptLoader->add_inline(
$content,
empty($params['require']) ? array() : explode(',', $params['require'])
@@ -707,55 +904,92 @@ var s,after = document.getElementsByTagName(\'script\')[document.getElementsByTa
}
/**
- * combine_css smarty function allows inclusion of a css stylesheet file in the current page.
- * The engine will combine several css files into a single one in order to reduce the number of
- * required http requests.
- * param path - required - the path to css file RELATIVE to piwigo root dir
- * param version - optional - plugins could use this and change it in order to force a
- browser refresh
- */
+ * The "combine_css" function allows inclusion of a css file in the current page.
+ * The engine will combine several css files into a single one.
+ *
+ * @param array $params
+ * - id (optional) used to deal with multiple inclusions from plugins
+ * - path (required)
+ * - version (optional) used to force a browser refresh
+ * - order (optional)
+ * - template (optional) set to true to allow smarty syntax in the css file
+ */
function func_combine_css($params)
{
- !empty($params['path']) || fatal_error('combine_css missing path');
- $order = (int)@$params['order'];
- $version = isset($params['version']) ? $params['version'] : 0;
- $this->css_by_priority[$order][] = array( $params['path'], $version);
+ if (empty($params['path']))
+ {
+ fatal_error('combine_css missing path');
+ }
+
+ if (!isset($params['id']))
+ {
+ $params['id'] = md5($params['path']);
+ }
+
+ $this->cssLoader->add($params['id'], $params['path'], isset($params['version']) ? $params['version'] : 0, (int)@$params['order'], (bool)@$params['template']);
}
+ /**
+ * The "get_combined_scripts" function returns a placeholder for delayed
+ * CSS files combination and minification.
+ *
+ * @param array $params (unused)
+ */
function func_get_combined_css($params)
{
- return 'echo '.var_export(self::COMBINED_CSS_TAG,true);
+ return self::COMBINED_CSS_TAG;
}
-
- /**
- * This function allows to declare a Smarty prefilter from a plugin, thus allowing
- * it to modify template source before compilation and without changing core files
+ /**
+ * Declares a Smarty prefilter from a plugin, allowing it to modify template
+ * source before compilation and without changing core files.
* They will be processed by weight ascending.
- * http://www.smarty.net/manual/en/advanced.features.prefilters.php
+ * @see http://www.smarty.net/manual/en/advanced.features.prefilters.php
+ *
+ * @param string $handle
+ * @param Callable $callback
+ * @param int $weight
*/
function set_prefilter($handle, $callback, $weight=50)
{
- $this->external_filters[$handle][$weight][] = array('prefilter', $callback);
+ $this->external_filters[$handle][$weight][] = array('pre', $callback);
ksort($this->external_filters[$handle]);
}
+ /**
+ * Declares a Smarty postfilter.
+ * They will be processed by weight ascending.
+ * @see http://www.smarty.net/manual/en/advanced.features.postfilters.php
+ *
+ * @param string $handle
+ * @param Callable $callback
+ * @param int $weight
+ */
function set_postfilter($handle, $callback, $weight=50)
{
- $this->external_filters[$handle][$weight][] = array('postfilter', $callback);
+ $this->external_filters[$handle][$weight][] = array('post', $callback);
ksort($this->external_filters[$handle]);
}
+ /**
+ * Declares a Smarty outputfilter.
+ * They will be processed by weight ascending.
+ * @see http://www.smarty.net/manual/en/advanced.features.outputfilters.php
+ *
+ * @param string $handle
+ * @param Callable $callback
+ * @param int $weight
+ */
function set_outputfilter($handle, $callback, $weight=50)
{
- $this->external_filters[$handle][$weight][] = array('outputfilter', $callback);
+ $this->external_filters[$handle][$weight][] = array('output', $callback);
ksort($this->external_filters[$handle]);
}
- /**
- * This function actually triggers the filters on the tpl files.
- * Called in the parse method.
- * http://www.smarty.net/manual/en/advanced.features.prefilters.php
+ /**
+ * Register the filters for the tpl file.
+ *
+ * @param string $handle
*/
function load_external_filters($handle)
{
@@ -768,13 +1002,18 @@ var s,after = document.getElementsByTagName(\'script\')[document.getElementsByTa
{
list($type, $callback) = $filter;
$compile_id .= $type.( is_array($callback) ? implode('', $callback) : $callback );
- call_user_func(array($this->smarty, 'register_'.$type), $callback);
+ $this->smarty->registerFilter($type, $callback);
}
}
$this->smarty->compile_id .= '.'.base_convert(crc32($compile_id), 10, 36);
}
}
+ /**
+ * Unregister the filters for the tpl file.
+ *
+ * @param string $handle
+ */
function unload_external_filters($handle)
{
if (isset($this->external_filters[$handle]))
@@ -784,13 +1023,20 @@ var s,after = document.getElementsByTagName(\'script\')[document.getElementsByTa
foreach ($filters as $filter)
{
list($type, $callback) = $filter;
- call_user_func(array($this->smarty, 'unregister_'.$type), $callback);
+ $this->smarty->unregisterFilter($type, $callback);
}
}
}
}
- static function prefilter_white_space($source, &$smarty)
+ /**
+ * @toto : description of Template::prefilter_white_space
+ *
+ * @param string $source
+ * @param Smarty $smarty
+ * @param return string
+ */
+ static function prefilter_white_space($source, $smarty)
{
$ld = $smarty->left_delimiter;
$rd = $smarty->right_delimiter;
@@ -801,55 +1047,57 @@ var s,after = document.getElementsByTagName(\'script\')[document.getElementsByTa
$tags = array('if','foreach','section','footer_script');
foreach($tags as $tag)
{
- array_push($regex, "#^[ \t]+($ldq$tag"."[^$ld$rd]*$rdq)\s*$#m");
- array_push($regex, "#^[ \t]+($ldq/$tag$rdq)\s*$#m");
+ $regex[] = "#^[ \t]+($ldq$tag"."[^$ld$rd]*$rdq)\s*$#m";
+ $regex[] = "#^[ \t]+($ldq/$tag$rdq)\s*$#m";
}
$tags = array('include','else','combine_script','html_head');
foreach($tags as $tag)
{
- array_push($regex, "#^[ \t]+($ldq$tag"."[^$ld$rd]*$rdq)\s*$#m");
+ $regex[] = "#^[ \t]+($ldq$tag"."[^$ld$rd]*$rdq)\s*$#m";
}
$source = preg_replace( $regex, "$1", $source);
return $source;
}
/**
- * Smarty prefilter to allow caching (whenever possible) language strings
- * from templates.
+ * Postfilter used when $conf['compiled_template_cache_language'] is true.
+ *
+ * @param string $source
+ * @param Smarty $smarty
+ * @param return string
*/
- static function prefilter_language($source, &$smarty)
+ static function postfilter_language($source, $smarty)
{
- global $lang;
- $ldq = preg_quote($smarty->left_delimiter, '~');
- $rdq = preg_quote($smarty->right_delimiter, '~');
-
- $regex = "~$ldq *\'([^'$]+)\'\|@translate *$rdq~";
- $source = preg_replace_callback( $regex, create_function('$m', 'global $lang; return isset($lang[$m[1]]) ? $lang[$m[1]] : $m[0];'), $source);
-
- $regex = "~$ldq *\'([^'$]+)\'\|@translate\|~";
- $source = preg_replace_callback( $regex, create_function('$m', 'global $lang; return isset($lang[$m[1]]) ? \'{\'.var_export($lang[$m[1]],true).\'|\' : $m[0];'), $source);
-
- $regex = "~($ldq *assign +var=.+ +value=)\'([^'$]+)\'\|@translate~";
- $source = preg_replace_callback( $regex, create_function('$m', 'global $lang; return isset($lang[$m[2]]) ? $m[1].var_export($lang[$m[2]],true) : $m[0];'), $source);
-
+ // replaces echo PHP_STRING_LITERAL; with the string literal value
+ $source = preg_replace_callback(
+ '/\\<\\?php echo ((?:\'(?:(?:\\\\.)|[^\'])*\')|(?:"(?:(?:\\\\.)|[^"])*"));\\?\\>\\n/',
+ create_function('$matches', 'eval(\'$tmp=\'.$matches[1].\';\');return $tmp;'),
+ $source);
return $source;
}
- static function prefilter_local_css($source, &$smarty)
+ /**
+ * Prefilter used to add theme local CSS files.
+ *
+ * @param string $source
+ * @param Smarty $smarty
+ * @param return string
+ */
+ static function prefilter_local_css($source, $smarty)
{
$css = array();
- foreach ($smarty->get_template_vars('themes') as $theme)
+ foreach ($smarty->getTemplateVars('themes') as $theme)
{
$f = PWG_LOCAL_DIR.'css/'.$theme['id'].'-rules.css';
if (file_exists(PHPWG_ROOT_PATH.$f))
{
- array_push($css, "{combine_css path='$f' order=10}");
+ $css[] = "{combine_css path='$f' order=10}";
}
}
$f = PWG_LOCAL_DIR.'css/rules.css';
if (file_exists(PHPWG_ROOT_PATH.$f))
{
- array_push($css, "{combine_css path='$f' order=10}");
+ $css[] = "{combine_css path='$f' order=10}";
}
if (!empty($css))
@@ -860,6 +1108,12 @@ var s,after = document.getElementsByTagName(\'script\')[document.getElementsByTa
return $source;
}
+ /**
+ * Loads the configuration file from a theme directory and returns it.
+ *
+ * @param string $dir
+ * @return array
+ */
function load_themeconf($dir)
{
global $themeconfs, $conf;
@@ -874,39 +1128,62 @@ var s,after = document.getElementsByTagName(\'script\')[document.getElementsByTa
}
return $themeconfs[$dir];
}
-
- function add_picture_button($content, $rank)
+
+ /**
+ * Registers a button to be displayed on picture page.
+ *
+ * @param string $content
+ * @param int $rank
+ */
+ function add_picture_button($content, $rank=BUTTONS_RANK_NEUTRAL)
{
$this->picture_buttons[$rank][] = $content;
}
-
- function add_index_button($content, $rank)
+
+ /**
+ * Registers a button to be displayed on index pages.
+ *
+ * @param string $content
+ * @param int $rank
+ */
+ function add_index_button($content, $rank=BUTTONS_RANK_NEUTRAL)
{
$this->index_buttons[$rank][] = $content;
}
-
+
+ /**
+ * Assigns PLUGIN_PICTURE_BUTTONS template variable with registered picture buttons.
+ */
function parse_picture_buttons()
{
if (!empty($this->picture_buttons))
{
ksort($this->picture_buttons);
- foreach ($this->picture_buttons as $ranked)
- foreach ($ranked as $content)
- $this->concat('PLUGIN_PICTURE_ACTIONS', $content);
+ $this->assign('PLUGIN_PICTURE_BUTTONS',
+ array_reduce(
+ $this->picture_buttons,
+ create_function('$v,$w', 'return array_merge($v, $w);'),
+ array()
+ ));
}
}
-
+
+ /**
+ * Assigns PLUGIN_INDEX_BUTTONS template variable with registered index buttons.
+ */
function parse_index_buttons()
{
if (!empty($this->index_buttons))
{
ksort($this->index_buttons);
- foreach ($this->index_buttons as $ranked)
- foreach ($ranked as $content)
- $this->concat('PLUGIN_INDEX_ACTIONS', $content);
+ $this->assign('PLUGIN_INDEX_BUTTONS',
+ array_reduce(
+ $this->index_buttons,
+ create_function('$v,$w', 'return array_merge($v, $w);'),
+ array()
+ ));
}
}
-
}
@@ -916,27 +1193,46 @@ var s,after = document.getElementsByTagName(\'script\')[document.getElementsByTa
*/
class PwgTemplateAdapter
{
+ /**
+ * @deprecated use "translate" modifier
+ */
function l10n($text)
{
return l10n($text);
}
+ /**
+ * @deprecated use "translate_dec" modifier
+ */
function l10n_dec($s, $p, $v)
{
return l10n_dec($s, $p, $v);
}
+ /**
+ * @deprecated use "translate" or "sprintf" modifier
+ */
function sprintf()
{
$args = func_get_args();
return call_user_func_array('sprintf', $args );
}
+ /**
+ * @param string $type
+ * @param array $img
+ * @return DerivativeImage
+ */
function derivative($type, $img)
{
return new DerivativeImage($type, $img);
}
+ /**
+ * @param string $type
+ * @param array $img
+ * @return string
+ */
function derivative_url($type, $img)
{
return DerivativeImage::url($type, $img);
@@ -944,47 +1240,189 @@ class PwgTemplateAdapter
}
-final class Script
+/**
+ * A Combinable represents a JS or CSS file ready for cobination and minification.
+ */
+class Combinable
{
+ /** @var string */
public $id;
- public $load_mode;
- public $precedents = array();
+ /** @var string */
public $path;
+ /** @var string */
public $version;
- public $extra = array();
+ /** @var bool */
+ public $is_template;
- function Script($load_mode, $id, $path, $version, $precedents)
+ /**
+ * @param string $id
+ * @param string $path
+ * @param string $version
+ */
+ function __construct($id, $path, $version=0)
{
$this->id = $id;
- $this->load_mode = $load_mode;
- $this->id = $id;
$this->set_path($path);
$this->version = $version;
- $this->precedents = $precedents;
+ $this->is_template = false;
}
+ /**
+ * @param string $path
+ */
function set_path($path)
{
if (!empty($path))
$this->path = $path;
}
+ /**
+ * @return bool
+ */
function is_remote()
{
- return url_is_remote( $this->path );
+ return url_is_remote($this->path) || strncmp($this->path, '//', 2)==0;
}
}
+/**
+ * Implementation of Combinable for JS files.
+ */
+final class Script extends Combinable
+{
+ /** @var int 0,1,2 */
+ public $load_mode;
+ /** @var array */
+ public $precedents;
+ /** @var array */
+ public $extra;
+
+ /**
+ * @param int 0,1,2
+ * @param string $id
+ * @param string $path
+ * @param string $version
+ * @param array $precedents
+ */
+ function __construct($load_mode, $id, $path, $version=0, $precedents=array())
+ {
+ parent::__construct($id, $path, $version);
+ $this->load_mode = $load_mode;
+ $this->precedents = $precedents;
+ $this->extra = array();
+ }
+}
+
+/**
+ * Implementation of Combinable for CSS files.
+ */
+final class Css extends Combinable
+{
+ /** @var int */
+ public $order;
+
+ /**
+ * @param string $id
+ * @param string $path
+ * @param string $version
+ * @param int $order
+ */
+ function __construct($id, $path, $version=0, $order=0)
+ {
+ parent::__construct($id, $path, $version);
+ $this->order = $order;
+ }
+}
+
+
+/**
+ * Manages a list of CSS files and combining them in a unique file.
+ */
+class CssLoader
+{
+ /** @param Css[] */
+ private $registered_css;
+ /** @param int used to keep declaration order */
+ private $counter;
+
+ function __construct()
+ {
+ $this->clear();
+ }
+
+ function clear()
+ {
+ $this->registered_css = array();
+ $this->counter = 0;
+ }
+
+ /**
+ * @return Combinable[] array of combined CSS.
+ */
+ function get_css()
+ {
+ uasort($this->registered_css, array('CssLoader', 'cmp_by_order'));
+ $combiner = new FileCombiner('css', $this->registered_css);
+ return $combiner->combine();
+ }
+
+ /**
+ * Callback for CSS files sorting.
+ */
+ private static function cmp_by_order($a, $b)
+ {
+ return $a->order - $b->order;
+ }
+
+ /**
+ * Adds a new file, if a file with the same $id already exsists, the one with
+ * the higher $order or higher $version is kept.
+ *
+ * @param string $id
+ * @param string $path
+ * @param string $version
+ * @param int $order
+ * @param bool $is_template
+ */
+ function add($id, $path, $version=0, $order=0, $is_template=false)
+ {
+ if (!isset($this->registered_css[$id]))
+ {
+ // costum order as an higher impact than declaration order
+ $css = new Css($id, $path, $version, $order*1000+$this->counter);
+ $css->is_template = $is_template;
+ $this->registered_css[$id] = $css;
+ $this->counter++;
+ }
+ else
+ {
+ $css = $this->registered_css[$id];
+ if ($css->order<$order*1000 || version_compare($css->version, $version)<0)
+ {
+ unset($this->registered_css[$id]);
+ $this->add($id, $path, $version, $order, $is_template);
+ }
+ }
+ }
+}
-/** Manage a list of required scripts for a page, by optimizing their loading location (head, bottom, async)
-and later on by combining them in a unique file respecting at the same time dependencies.*/
+
+/**
+ * Manage a list of required scripts for a page, by optimizing their loading location (head, footer, async)
+ * and later on by combining them in a unique file respecting at the same time dependencies.
+ */
class ScriptLoader
{
+ /** @var Script[] */
private $registered_scripts;
+ /** @var string[] */
public $inline_scripts;
+ /** @var bool */
private $did_head;
+ /** @var bool */
private $head_done_scripts;
+ /** @var bool */
private $did_footer;
private static $known_paths = array(
@@ -1013,11 +1451,26 @@ class ScriptLoader
$this->did_head = $this->did_footer = false;
}
+ /**
+ * @return bool
+ */
+ function did_head()
+ {
+ return $this->did_head;
+ }
+
+ /**
+ * @return Script[]
+ */
function get_all()
{
return $this->registered_scripts;
}
+ /**
+ * @param string $code
+ * @param string[] $require
+ */
function add_inline($code, $require)
{
!$this->did_footer || trigger_error("Attempt to add inline script but the footer has been written", E_USER_WARNING);
@@ -1035,7 +1488,14 @@ class ScriptLoader
$this->inline_scripts[] = $code;
}
- function add($id, $load_mode, $require, $path, $version=0)
+ /**
+ * @param string $id
+ * @param int $load_mode
+ * @param string[] $require
+ * @param string $path
+ * @param string $version
+ */
+ function add($id, $load_mode, $require, $path, $version=0, $is_template=false)
{
if ($this->did_head && $load_mode==0)
{
@@ -1048,6 +1508,7 @@ class ScriptLoader
if (! isset( $this->registered_scripts[$id] ) )
{
$script = new Script($load_mode, $id, $path, $version, $require);
+ $script->is_template = $is_template;
self::fill_well_known($id, $script);
$this->registered_scripts[$id] = $script;
@@ -1078,14 +1539,13 @@ class ScriptLoader
if ($load_mode < $script->load_mode)
$script->load_mode = $load_mode;
}
-
- }
-
- function did_head()
- {
- return $this->did_head;
}
+ /**
+ * Returns combined scripts loaded in header.
+ *
+ * @return Combinable[]
+ */
function get_head_scripts()
{
self::check_load_dep($this->registered_scripts);
@@ -1109,6 +1569,11 @@ class ScriptLoader
return self::do_combine($this->head_done_scripts, 0);
}
+ /**
+ * Returns combined scripts loaded in footer.
+ *
+ * @return Combinable[]
+ */
function get_footer_scripts()
{
if (!$this->did_head)
@@ -1140,34 +1605,23 @@ class ScriptLoader
return array( self::do_combine($result[0],1), self::do_combine($result[1],2) );
}
+ /**
+ * @param Script[] $scripts
+ * @param int $load_mode
+ * @return Combinable[]
+ */
private static function do_combine($scripts, $load_mode)
{
- global $conf;
- if (count($scripts)<2 or !$conf['template_combine_files'])
- return $scripts;
- $combiner = new FileCombiner('js');
- $result = array();
- foreach ($scripts as $script)
- {
- if ($script->is_remote())
- {
- if ( $combiner->combine( $out_file, $out_version) )
- {
- $results[] = new Script($load_mode, 'combi', $out_file, $out_version, array() );
- }
- $results[] = $script;
- }
- else
- $combiner->add( $script->path, $script->version );
- }
- if ( $combiner->combine( $out_file, $out_version) )
- {
- $results[] = new Script($load_mode, 'combi', $out_file, $out_version, array() );
- }
- return $results;
+ $combiner = new FileCombiner('js', $scripts);
+ return $combiner->combine();
}
- // checks that if B depends on A, then B->load_mode >= A->load_mode in order to respect execution order
+ /**
+ * Checks dependencies among Scripts.
+ * Checks that if B depends on A, then B->load_mode >= A->load_mode in order to respect execution order.
+ *
+ * @param Script[] $scripts
+ */
private static function check_load_dep($scripts)
{
global $conf;
@@ -1197,7 +1651,12 @@ class ScriptLoader
while ($changed);
}
-
+ /**
+ * Fill a script dependancies with the known jQuery UI scripts.
+ *
+ * @param string $id in FileCombiner::$known_paths
+ * @param Script $script
+ */
private static function fill_well_known($id, $script)
{
if ( empty($script->path) && isset(self::$known_paths[$id]))
@@ -1232,6 +1691,13 @@ class ScriptLoader
}
}
+ /**
+ * Add a known jQuery UI script to loaded scripts.
+ *
+ * @param string $id in FileCombiner::$known_paths
+ * @param int $load_mode
+ * @return bool
+ */
private function load_known_required_script($id, $load_mode)
{
if ( isset(self::$known_paths[$id]) or strncmp($id, 'jquery.ui.', 10)==0 )
@@ -1242,6 +1708,14 @@ class ScriptLoader
return false;
}
+ /**
+ * Compute script order depending on dependencies.
+ * Assigned to $script->extra['order'].
+ *
+ * @param string $script_id
+ * @param int $recursion_limiter
+ * @return int
+ */
private function compute_script_topological_order($script_id, $recursion_limiter=0)
{
if (!isset($this->registered_scripts[$script_id]))
@@ -1262,6 +1736,9 @@ class ScriptLoader
return ($script->extra['order'] = $max);
}
+ /**
+ * Callback for scripts sorter.
+ */
private static function cmp_by_mode_and_order($s1, $s2)
{
$ret = $s1->load_mode - $s2->load_mode;
@@ -1279,18 +1756,32 @@ class ScriptLoader
}
-/*Allows merging of javascript and css files into a single one.*/
+/**
+ * Allows merging of javascript and css files into a single one.
+ */
final class FileCombiner
{
- private $type; // js or css
- private $files = array();
- private $versions = array();
+ /** @var string 'js' or 'css' */
+ private $type;
+ /** @var bool */
+ private $is_css;
+ /** @var Combinable[] */
+ private $combinables;
- function FileCombiner($type)
+ /**
+ * @param string $type 'js' or 'css'
+ * @param Combinable[] $combinables
+ */
+ function __construct($type, $combinables=array())
{
$this->type = $type;
+ $this->is_css = $type=='css';
+ $this->combinables = $combinables;
}
+ /**
+ * Deletes all combined files from cache directory.
+ */
static function clear_combined_files()
{
$dir = opendir(PHPWG_ROOT_PATH.PWG_COMBINED_DIR);
@@ -1302,92 +1793,165 @@ final class FileCombiner
closedir($dir);
}
- function add($file, $version)
- {
- $this->files[] = $file;
- $this->versions[] = $version;
- }
-
- function clear()
- {
- $this->files = array();
- $this->versions = array();
- }
-
- function combine(&$out_file, &$out_version)
+ /**
+ * @param Combinable|Combinable[] $combinable
+ */
+ function add($combinable)
{
- if (count($this->files) == 0)
+ if (is_array($combinable))
{
- return false;
+ $this->combinables = array_merge($this->combinables, $combinable);
}
- if (count($this->files) == 1)
+ else
{
- $out_file = $this->files[0];
- $out_version = $this->versions[0];
- $this->clear();
- return 1;
+ $this->combinables[] = $combinable;
}
+ }
- $is_css = $this->type == "css";
+ /**
+ * @return Combinable[]
+ */
+ function combine()
+ {
global $conf;
- $key = array();
- if ($is_css)
- $key[] = get_absolute_root_url(false);//because we modify bg url
- for ($i=0; $i<count($this->files); $i++)
+ $force = false;
+ if (is_admin() && ($this->is_css || !$conf['template_compile_check']) )
{
- $key[] = $this->files[$i];
- $key[] = $this->versions[$i];
- if ($conf['template_compile_check']) $key[] = filemtime( PHPWG_ROOT_PATH . $this->files[$i] );
+ $force = (isset($_SERVER['HTTP_CACHE_CONTROL']) && strpos($_SERVER['HTTP_CACHE_CONTROL'], 'max-age=0') !== false)
+ || (isset($_SERVER['HTTP_PRAGMA']) && strpos($_SERVER['HTTP_PRAGMA'], 'no-cache'));
}
- $key = join('>', $key);
- $file = base_convert(crc32($key),10,36);
- $file = PWG_COMBINED_DIR . $file . '.' . $this->type;
+ $result = array();
+ $pending = array();
+ $ini_key = $this->is_css ? array(get_absolute_root_url(false)): array(); //because for css we modify bg url;
+ $key = $ini_key;
- $exists = file_exists( PHPWG_ROOT_PATH . $file );
- if ($exists)
+ foreach ($this->combinables as $combinable)
{
- $is_reload =
- (isset($_SERVER['HTTP_CACHE_CONTROL']) && strpos($_SERVER['HTTP_CACHE_CONTROL'], 'max-age=0') !== false)
- || (isset($_SERVER['HTTP_PRAGMA']) && strpos($_SERVER['HTTP_PRAGMA'], 'no-cache'));
- if (is_admin() && $is_reload)
- {// the user pressed F5 in the browser
- if ($is_css || $conf['template_compile_check']==false)
- $exists = false; // we foce regeneration of css because @import sub-files are never checked for modification
+ if ($combinable->is_remote())
+ {
+ $this->flush_pending($result, $pending, $key, $force);
+ $key = $ini_key;
+ $result[] = $combinable;
+ continue;
+ }
+ elseif (!$conf['template_combine_files'])
+ {
+ $this->flush_pending($result, $pending, $key, $force);
+ $key = $ini_key;
}
+
+ $key[] = $combinable->path;
+ $key[] = $combinable->version;
+ if ($conf['template_compile_check'])
+ $key[] = filemtime( PHPWG_ROOT_PATH . $combinable->path );
+ $pending[] = $combinable;
}
+ $this->flush_pending($result, $pending, $key, $force);
+ return $result;
+ }
- if ($exists)
+ /**
+ * Process a set of pending files.
+ *
+ * @param array &$result
+ * @param array &$pending
+ * @param string[] $key
+ * @param bool $force
+ */
+ private function flush_pending(&$result, &$pending, $key, $force)
+ {
+ if (count($pending)>1)
{
- $out_file = $file;
- $out_version = false;
- $this->clear();
- return 2;
+ $key = join('>', $key);
+ $file = PWG_COMBINED_DIR . base_convert(crc32($key),10,36) . '.' . $this->type;
+ if ($force || !file_exists(PHPWG_ROOT_PATH.$file) )
+ {
+ $output = '';
+ foreach ($pending as $combinable)
+ {
+ $output .= "/*BEGIN $combinable->path */\n";
+ $output .= $this->process_combinable($combinable, true, $force);
+ $output .= "\n";
+ }
+ mkgetdir( dirname(PHPWG_ROOT_PATH.$file) );
+ file_put_contents( PHPWG_ROOT_PATH.$file, $output );
+ @chmod(PHPWG_ROOT_PATH.$file, 0644);
+ }
+ $result[] = new Combinable("combi", $file, false);
+ }
+ elseif ( count($pending)==1)
+ {
+ $this->process_combinable($pending[0], false, $force);
+ $result[] = $pending[0];
}
+ $key = array();
+ $pending = array();
+ }
+
+ /**
+ * Process one combinable file.
+ *
+ * @param Combinable $combinable
+ * @param bool $return_content
+ * @param bool $force
+ * @return null|string
+ */
+ private function process_combinable($combinable, $return_content, $force)
+ {
+ global $conf;
+ if ($combinable->is_template)
+ {
+ if (!$return_content)
+ {
+ $key = array($combinable->path, $combinable->version);
+ if ($conf['template_compile_check'])
+ $key[] = filemtime( PHPWG_ROOT_PATH . $combinable->path );
+ $file = PWG_COMBINED_DIR . 't' . base_convert(crc32(implode(',',$key)),10,36) . '.' . $this->type;
+ if (!$force && file_exists(PHPWG_ROOT_PATH.$file) )
+ {
+ $combinable->path = $file;
+ $combinable->version = false;
+ return;
+ }
+ }
+
+ global $template;
+ $handle = $this->type. '.' .$combinable->id;
+ $template->set_filename($handle, realpath(PHPWG_ROOT_PATH.$combinable->path));
+ trigger_action( 'combinable_preparse', $template, $combinable, $this); //allow themes and plugins to set their own vars to template ...
+ $content = $template->parse($handle, true);
+
+ if ($this->is_css)
+ $content = self::process_css($content, $combinable->path );
+ else
+ $content = self::process_js($content, $combinable->path );
- $output = '';
- foreach ($this->files as $input_file)
+ if ($return_content)
+ return $content;
+ file_put_contents( PHPWG_ROOT_PATH.$file, $content );
+ $combinable->path = $file;
+ }
+ elseif ($return_content)
{
- $output .= "/*BEGIN $input_file */\n";
- if ($is_css)
- $output .= self::process_css($input_file);
+ $content = file_get_contents(PHPWG_ROOT_PATH . $combinable->path);
+ if ($this->is_css)
+ $content = self::process_css($content, $combinable->path );
else
- $output .= self::process_js($input_file);
- $output .= "\n";
+ $content = self::process_js($content, $combinable->path );
+ return $content;
}
-
- mkgetdir( dirname(PHPWG_ROOT_PATH.$file) );
- file_put_contents( PHPWG_ROOT_PATH.$file, $output );
- @chmod(PHPWG_ROOT_PATH.$file, 0644);
- $out_file = $file;
- $out_version = false;
- $this->clear();
- return 2;
}
- private static function process_js($file)
+ /**
+ * Process a JS file.
+ *
+ * @param string $js file content
+ * @param string $file
+ * @return string
+ */
+ private static function process_js($js, $file)
{
- $js = file_get_contents(PHPWG_ROOT_PATH . $file);
if (strpos($file, '.min')===false and strpos($file, '.packed')===false )
{
require_once(PHPWG_ROOT_PATH.'include/jshrink.class.php');
@@ -1396,10 +1960,17 @@ final class FileCombiner
return trim($js, " \t\r\n;").";\n";
}
- private static function process_css($file)
+ /**
+ * Process a CSS file.
+ *
+ * @param string $css file content
+ * @param string $file
+ * @return string
+ */
+ private static function process_css($css, $file)
{
- $css = self::process_css_rec($file);
- if (version_compare(PHP_VERSION, '5.2.4', '>='))
+ $css = self::process_css_rec($css, dirname($file));
+ if (strpos($file, '.min')===false and version_compare(PHP_VERSION, '5.2.4', '>='))
{
require_once(PHPWG_ROOT_PATH.'include/cssmin.class.php');
$css = CssMin::minify($css, array('Variables'=>false));
@@ -1408,18 +1979,26 @@ final class FileCombiner
return $css;
}
- private static function process_css_rec($file)
+ /**
+ * Resolves relative links in CSS file.
+ *
+ * @param string $css file content
+ * @param string $dir
+ * @return string
+ */
+ private static function process_css_rec($css, $dir)
{
- static $PATTERN = "#url\(\s*['|\"]{0,1}(.*?)['|\"]{0,1}\s*\)#";
- $css = file_get_contents(PHPWG_ROOT_PATH . $file);
- if (preg_match_all($PATTERN, $css, $matches, PREG_SET_ORDER))
+ static $PATTERN_URL = "#url\(\s*['|\"]{0,1}(.*?)['|\"]{0,1}\s*\)#";
+ static $PATTERN_IMPORT = "#@import\s*['|\"]{0,1}(.*?)['|\"]{0,1};#";
+
+ if (preg_match_all($PATTERN_URL, $css, $matches, PREG_SET_ORDER))
{
$search = $replace = array();
foreach ($matches as $match)
{
- if ( !url_is_remote($match[1]) && $match[1][0] != '/')
+ if ( !url_is_remote($match[1]) && $match[1][0] != '/' && strpos($match[1], 'data:image/')===false)
{
- $relative = dirname($file) . "/$match[1]";
+ $relative = $dir . "/$match[1]";
$search[] = $match[0];
$replace[] = 'url('.embellish_url(get_absolute_root_url(false).$relative).')';
}
@@ -1427,14 +2006,14 @@ final class FileCombiner
$css = str_replace($search, $replace, $css);
}
- $imports = preg_match_all("#@import\s*['|\"]{0,1}(.*?)['|\"]{0,1};#", $css, $matches, PREG_SET_ORDER);
- if ($imports)
+ if (preg_match_all($PATTERN_IMPORT, $css, $matches, PREG_SET_ORDER))
{
$search = $replace = array();
foreach ($matches as $match)
{
$search[] = $match[0];
- $replace[] = self::process_css_rec(dirname($file) . "/$match[1]");
+ $sub_css = file_get_contents(PHPWG_ROOT_PATH . $dir . "/$match[1]");
+ $replace[] = self::process_css_rec($sub_css, dirname($dir . "/$match[1]") );
}
$css = str_replace($search, $replace, $css);
}
diff --git a/include/user.inc.php b/include/user.inc.php
index 60117e776..bb9cbd41f 100644
--- a/include/user.inc.php
+++ b/include/user.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -60,8 +60,7 @@ if ($conf['apache_authentication'])
{
if (!($user['id'] = get_userid($remote_user)))
{
- register_user($remote_user, '', '', false);
- $user['id'] = get_userid($remote_user);
+ $user['id'] = register_user($remote_user, '', '', false);
}
}
}
diff --git a/include/ws_core.inc.php b/include/ws_core.inc.php
index 3e1db6647..a8c1b7f76 100644
--- a/include/ws_core.inc.php
+++ b/include/ws_core.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -35,12 +35,18 @@ define( 'WS_PARAM_ACCEPT_ARRAY', 0x010000 );
define( 'WS_PARAM_FORCE_ARRAY', 0x030000 );
define( 'WS_PARAM_OPTIONAL', 0x040000 );
+define( 'WS_TYPE_BOOL', 0x01 );
+define( 'WS_TYPE_INT', 0x02 );
+define( 'WS_TYPE_FLOAT', 0x04 );
+define( 'WS_TYPE_POSITIVE', 0x10 );
+define( 'WS_TYPE_NOTNULL', 0x20 );
+define( 'WS_TYPE_ID', WS_TYPE_INT | WS_TYPE_POSITIVE | WS_TYPE_NOTNULL);
+
define( 'WS_ERR_INVALID_METHOD', 501 );
define( 'WS_ERR_MISSING_PARAM', 1002 );
define( 'WS_ERR_INVALID_PARAM', 1003 );
define( 'WS_XML_ATTRIBUTES', 'attributes_xml_');
-define( 'WS_XML_CONTENT', 'content_xml_');
/**
* PwgError object can be returned from any web service function implementation.
@@ -98,7 +104,6 @@ class PwgNamedArray
class PwgNamedStruct
{
/*private*/ var $_content;
- /*private*/ var $_name;
/*private*/ var $_xmlAttributes;
/**
@@ -110,9 +115,8 @@ class PwgNamedStruct
* encoded as xml attributes (if null - automatically prefer xml attributes
* whenever possible)
*/
- function PwgNamedStruct($name, $content, $xmlAttributes=null, $xmlElements=null )
+ function PwgNamedStruct($content, $xmlAttributes=null, $xmlElements=null )
{
- $this->_name = $name;
$this->_content = $content;
if ( isset($xmlAttributes) )
{
@@ -139,28 +143,28 @@ class PwgNamedStruct
/**
* Abstract base class for request handlers.
*/
-class PwgRequestHandler
+abstract class PwgRequestHandler
{
/** Virtual abstract method. Decodes the request (GET or POST) handles the
* method invocation as well as response sending.
*/
- function handleRequest(&$server) { assert(false); }
+ abstract function handleRequest(&$service);
}
/**
*
* Base class for web service response encoder.
*/
-class PwgResponseEncoder
+abstract class PwgResponseEncoder
{
/** encodes the web service response to the appropriate output format
* @param response mixed the unencoded result of a service method call
*/
- function encodeResponse($response) { assert(false); }
+ abstract function encodeResponse($response);
/** default "Content-Type" http header for this kind of response format
*/
- function getContentType() { assert(false); }
+ abstract function getContentType();
/**
* returns true if the parameter is a 'struct' (php array type whose keys are
@@ -182,115 +186,42 @@ class PwgResponseEncoder
* removes all XML formatting from $response (named array, named structs, etc)
* usually called by every response encoder, except rest xml.
*/
- static function flattenResponse(&$response)
+ static function flattenResponse(&$value)
{
- PwgResponseEncoder::_mergeAttributesAndContent($response);
- PwgResponseEncoder::_removeNamedArray($response);
- PwgResponseEncoder::_removeNamedStruct($response);
- if (is_array($response))
- { // need to call 2 times (first time might add new arrays)
- array_walk_recursive($response, array('PwgResponseEncoder', '_remove_named_callback') );
- array_walk_recursive($response, array('PwgResponseEncoder', '_remove_named_callback') );
- }
-//print_r($response);
- PwgResponseEncoder::_mergeAttributesAndContent($response);
- }
-
- private static function _remove_named_callback(&$value, $key)
- {
- do
- {
- $changed = 0;
- $changed += PwgResponseEncoder::_removeNamedArray($value);
- $changed += PwgResponseEncoder::_removeNamedStruct($value);
- // print_r('walk '.$key."<br>\n");
- }
- while ($changed);
+ self::flatten($value);
}
- private static function _mergeAttributesAndContent(&$value)
+ private static function flatten(&$value)
{
- if ( !is_array($value) )
- return;
-/* $first_key = '';
- if (count($value)) { $ak = array_keys($value); $first_key = $ak[0]; }
-
- print_r( '_mergeAttributesAndContent is_struct='.PwgResponseEncoder::is_struct($value)
- .' count='.count($value)
- .' first_key='.$first_key
- ."<br>\n"
- );*/
- $ret = 0;
- if (PwgResponseEncoder::is_struct($value))
+ if (is_object($value))
{
- if ( isset($value[WS_XML_ATTRIBUTES]) )
+ $class = strtolower( @get_class($value) );
+ if ($class == 'pwgnamedarray')
{
- $value = array_merge( $value, $value[WS_XML_ATTRIBUTES] );
- unset( $value[WS_XML_ATTRIBUTES] );
- $ret=1;
+ $value = $value->_content;
}
- if ( isset($value[WS_XML_CONTENT]) )
+ if ($class == 'pwgnamedstruct')
{
- $cont_processed = 0;
- if ( count($value)==1 )
- {
- $value = $value[WS_XML_CONTENT];
- $cont_processed=1;
- }
- else
- {
- if (PwgResponseEncoder::is_struct($value[WS_XML_CONTENT]))
- {
- $value = array_merge( $value, $value[WS_XML_CONTENT] );
- unset( $value[WS_XML_CONTENT] );
- $cont_processed=1;
- }
- }
- $ret += $cont_processed;
- if (!$cont_processed)
- {
- $value['_content'] = $value[WS_XML_CONTENT];
- unset( $value[WS_XML_CONTENT] );
- $ret++;
- }
+ $value = $value->_content;
}
}
- foreach ($value as $key=>$v)
+ if (!is_array($value))
+ return;
+
+ if (self::is_struct($value))
{
- if ( PwgResponseEncoder::_mergeAttributesAndContent($v) )
+ if ( isset($value[WS_XML_ATTRIBUTES]) )
{
- $value[$key]=$v;
- $ret++;
+ $value = array_merge( $value, $value[WS_XML_ATTRIBUTES] );
+ unset( $value[WS_XML_ATTRIBUTES] );
}
}
- return $ret;
- }
-
- private static function _removeNamedArray(&$value)
- {
- if ( strtolower( @get_class($value) ) =='pwgnamedarray')
- {
- $value = $value->_content;
- return 1;
- }
- return 0;
- }
- private static function _removeNamedStruct(&$value)
- {
- if ( strtolower( @get_class($value) ) =='pwgnamedstruct')
+ foreach ($value as $key=>&$v)
{
- if ( isset($value->_content['']) )
- {
- $unknown = $value->_content[''];
- unset( $value->_content[''] );
- $value->_content[$value->_name] = $unknown;
- }
- $value = $value->_content;
- return 1;
+ self::flatten($v);
}
- return 0;
}
}
@@ -349,12 +280,16 @@ Request format: ".@$this->_requestFormat." Response format: ".@$this->_responseF
return;
}
- $this->addMethod('reflection.getMethodList',
- array('PwgServer', 'ws_getMethodList'),
- null, '' );
- $this->addMethod('reflection.getMethodDetails',
+ // add reflection methods
+ $this->addMethod(
+ 'reflection.getMethodList',
+ array('PwgServer', 'ws_getMethodList')
+ );
+ $this->addMethod(
+ 'reflection.getMethodDetails',
array('PwgServer', 'ws_getMethodDetails'),
- array('methodName'),'');
+ array('methodName')
+ );
trigger_action('ws_add_methods', array(&$this) );
uksort( $this->_methods, 'strnatcmp' );
@@ -378,16 +313,22 @@ Request format: ".@$this->_requestFormat." Response format: ".@$this->_responseF
* Registers a web service method.
* @param methodName string - the name of the method as seen externally
* @param callback mixed - php method to be invoked internally
- * @param params array - map of allowed parameter names with optional default
- * values and parameter flags. Example of $params:
- * array( 'param1' => array('default'=>523, 'flags'=>WS_PARAM_FORCE_ARRAY) ) .
- * Possible parameter flags are:
- * WS_PARAM_ALLOW_ARRAY - this parameter can be an array
- * WS_PARAM_FORCE_ARRAY - if this parameter is scalar, force it to an array
- * before invoking the method
+ * @param params array - map of allowed parameter names with options
+ * @option mixed default (optional)
+ * @option int flags (optional)
+ * possible values: WS_PARAM_ALLOW_ARRAY, WS_PARAM_FORCE_ARRAY, WS_PARAM_OPTIONAL
+ * @option int type (optional)
+ * possible values: WS_TYPE_BOOL, WS_TYPE_INT, WS_TYPE_FLOAT, WS_TYPE_ID
+ * WS_TYPE_POSITIVE, WS_TYPE_NOTNULL
+ * @option int|float maxValue (optional)
* @param description string - a description of the method.
+ * @param include_file string - a file to be included befaore the callback is executed
+ * @param options array
+ * @option bool hidden (optional) - if true, this method won't be visible by reflection.getMethodList
+ * @option bool admin_only (optional)
+ * @option bool post_only (optional)
*/
- function addMethod($methodName, $callback, $params=array(), $description, $include_file='')
+ function addMethod($methodName, $callback, $params=array(), $description='', $include_file='', $options=array())
{
if (!is_array($params))
{
@@ -399,25 +340,27 @@ Request format: ".@$this->_requestFormat." Response format: ".@$this->_responseF
$params = array_flip($params);
}
- foreach( $params as $param=>$options)
+ foreach( $params as $param=>$data)
{
- if ( !is_array($options) )
+ if ( !is_array($data) )
{
- $params[$param] = array('flags'=>0);
+ $params[$param] = array('flags'=>0,'type'=>0);
}
else
{
- $flags = isset($options['flags']) ? $options['flags'] : 0;
- if ( array_key_exists('default', $options) )
+ if ( !isset($data['flags']) )
+ {
+ $data['flags'] = 0;
+ }
+ if ( array_key_exists('default', $data) )
{
- $flags |= WS_PARAM_OPTIONAL;
+ $data['flags'] |= WS_PARAM_OPTIONAL;
}
- if ( $flags & WS_PARAM_FORCE_ARRAY )
+ if ( !isset($data['type']) )
{
- $flags |= WS_PARAM_ACCEPT_ARRAY;
+ $data['type'] = 0;
}
- $options['flags'] = $flags;
- $params[$param] = $options;
+ $params[$param] = $data;
}
}
@@ -426,6 +369,7 @@ Request format: ".@$this->_requestFormat." Response format: ".@$this->_responseF
'description' => $description,
'signature' => $params,
'include' => $include_file,
+ 'options' => $options,
);
}
@@ -445,13 +389,22 @@ Request format: ".@$this->_requestFormat." Response format: ".@$this->_responseF
$signature = @$this->_methods[$methodName]['signature'];
return isset($signature) ? $signature : array();
}
+
+ /**
+ * @since 2.6
+ */
+ function getMethodOptions($methodName)
+ {
+ $options = @$this->_methods[$methodName]['options'];
+ return isset($options) ? $options : array();
+ }
- /*static*/ function isPost()
+ static function isPost()
{
return isset($HTTP_RAW_POST_DATA) or !empty($_POST);
}
- /*static*/ function makeArrayParam(&$param)
+ static function makeArrayParam(&$param)
{
if ( $param==null )
{
@@ -459,12 +412,100 @@ Request format: ".@$this->_requestFormat." Response format: ".@$this->_responseF
}
else
{
- if (! is_array($param) )
+ if ( !is_array($param) )
{
$param = array($param);
}
}
}
+
+ static function checkType(&$param, $type, $name)
+ {
+ $opts = array();
+ $msg = '';
+ if ( self::hasFlag($type, WS_TYPE_POSITIVE | WS_TYPE_NOTNULL) )
+ {
+ $opts['options']['min_range'] = 1;
+ $msg = ' positive and not null';
+ }
+ else if ( self::hasFlag($type, WS_TYPE_POSITIVE) )
+ {
+ $opts['options']['min_range'] = 0;
+ $msg = ' positive';
+ }
+
+ if ( is_array($param) )
+ {
+ if ( self::hasFlag($type, WS_TYPE_BOOL) )
+ {
+ foreach ($param as &$value)
+ {
+ if ( ($value = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)) === null )
+ {
+ return new PwgError(WS_ERR_INVALID_PARAM, $name.' must only contain booleans' );
+ }
+ }
+ unset($value);
+ }
+ else if ( self::hasFlag($type, WS_TYPE_INT) )
+ {
+ foreach ($param as &$value)
+ {
+ if ( ($value = filter_var($value, FILTER_VALIDATE_INT, $opts)) === false )
+ {
+ return new PwgError(WS_ERR_INVALID_PARAM, $name.' must only contain'.$msg.' integers' );
+ }
+ }
+ unset($value);
+ }
+ else if ( self::hasFlag($type, WS_TYPE_FLOAT) )
+ {
+ foreach ($param as &$value)
+ {
+ if (
+ ($value = filter_var($value, FILTER_VALIDATE_FLOAT)) === false
+ or ( isset($opts['options']['min_range']) and $value < $opts['options']['min_range'] )
+ ) {
+ return new PwgError(WS_ERR_INVALID_PARAM, $name.' must only contain'.$msg.' floats' );
+ }
+ }
+ unset($value);
+ }
+ }
+ else if ( $param !== '' )
+ {
+ if ( self::hasFlag($type, WS_TYPE_BOOL) )
+ {
+ if ( ($param = filter_var($param, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)) === null )
+ {
+ return new PwgError(WS_ERR_INVALID_PARAM, $name.' must be a boolean' );
+ }
+ }
+ else if ( self::hasFlag($type, WS_TYPE_INT) )
+ {
+ if ( ($param = filter_var($param, FILTER_VALIDATE_INT, $opts)) === false )
+ {
+ return new PwgError(WS_ERR_INVALID_PARAM, $name.' must be an'.$msg.' integer' );
+ }
+ }
+ else if ( self::hasFlag($type, WS_TYPE_FLOAT) )
+ {
+ if (
+ ($param = filter_var($param, FILTER_VALIDATE_FLOAT)) === false
+ or ( isset($opts['options']['min_range']) and $param < $opts['options']['min_range'] )
+ ) {
+ return new PwgError(WS_ERR_INVALID_PARAM, $name.' must be a'.$msg.' float' );
+ }
+ }
+ }
+
+ return null;
+ }
+
+ static function hasFlag($val, $flag)
+ {
+ return ($val & $flag) == $flag;
+ }
/**
* Invokes a registered method. Returns the return of the method (or
@@ -476,54 +517,87 @@ Request format: ".@$this->_requestFormat." Response format: ".@$this->_responseF
{
$method = @$this->_methods[$methodName];
- if ( $method==null )
+ if ( $method == null )
{
return new PwgError(WS_ERR_INVALID_METHOD, 'Method name is not valid');
}
+
+ if ( isset($method['options']['post_only']) and $method['options']['post_only'] and !self::isPost() )
+ {
+ return new PwgError(405, 'This method requires HTTP POST');
+ }
+
+ if ( isset($method['options']['admin_only']) and $method['options']['admin_only'] and !is_admin() )
+ {
+ return new PwgError(401, 'Access denied');
+ }
- // parameter check and data coercion !
+ // parameter check and data correction
$signature = $method['signature'];
$missing_params = array();
- foreach($signature as $name=>$options)
+
+ foreach ($signature as $name => $options)
{
$flags = $options['flags'];
+
+ // parameter not provided in the request
if ( !array_key_exists($name, $params) )
- {// parameter not provided in the request
- if ( !($flags&WS_PARAM_OPTIONAL) )
+ {
+ if ( !self::hasFlag($flags, WS_PARAM_OPTIONAL) )
{
$missing_params[] = $name;
}
- else if ( array_key_exists('default',$options) )
+ else if ( array_key_exists('default', $options) )
{
$params[$name] = $options['default'];
- if ( ($flags&WS_PARAM_FORCE_ARRAY) )
+ if ( self::hasFlag($flags, WS_PARAM_FORCE_ARRAY) )
{
- $this->makeArrayParam( $params[$name] );
+ self::makeArrayParam($params[$name]);
}
}
}
+ // parameter provided but empty
+ else if ( $params[$name]==='' and !self::hasFlag($flags, WS_PARAM_OPTIONAL) )
+ {
+ $missing_params[] = $name;
+ }
+ // parameter provided - do some basic checks
else
- {// parameter provided - do some basic checks
+ {
$the_param = $params[$name];
- if ( is_array($the_param) and ($flags&WS_PARAM_ACCEPT_ARRAY)==0 )
+
+ if ( is_array($the_param) and !self::hasFlag($flags, WS_PARAM_ACCEPT_ARRAY) )
{
return new PwgError(WS_ERR_INVALID_PARAM, $name.' must be scalar' );
}
- if ( ($flags&WS_PARAM_FORCE_ARRAY) )
+
+ if ( self::hasFlag($flags, WS_PARAM_FORCE_ARRAY) )
+ {
+ self::makeArrayParam($the_param);
+ }
+
+ if ( $options['type'] > 0 )
{
- $this->makeArrayParam( $the_param );
+ if ( ($ret = self::checkType($the_param, $options['type'], $name)) !== null )
+ {
+ return $ret;
+ }
}
+
if ( isset($options['maxValue']) and $the_param>$options['maxValue'])
{
$the_param = $options['maxValue'];
}
+
$params[$name] = $the_param;
}
}
+
if (count($missing_params))
{
return new PwgError(WS_ERR_MISSING_PARAM, 'Missing parameters: '.implode(',',$missing_params));
}
+
$result = trigger_event('ws_invoke_allowed', true, $methodName, $params);
if ( strtolower( @get_class($result) )!='pwgerror')
{
@@ -533,6 +607,7 @@ Request format: ".@$this->_requestFormat." Response format: ".@$this->_responseF
}
$result = call_user_func_array($method['callback'], array($params, &$this) );
}
+
return $result;
}
@@ -541,7 +616,9 @@ Request format: ".@$this->_requestFormat." Response format: ".@$this->_responseF
*/
static function ws_getMethodList($params, &$service)
{
- return array('methods' => new PwgNamedArray( array_keys($service->_methods),'method' ) );
+ $methods = array_filter($service->_methods,
+ create_function('$m', 'return empty($m["options"]["hidden"]) || !$m["options"]["hidden"];'));
+ return array('methods' => new PwgNamedArray( array_keys($methods),'method' ) );
}
/**
@@ -550,32 +627,62 @@ Request format: ".@$this->_requestFormat." Response format: ".@$this->_responseF
static function ws_getMethodDetails($params, &$service)
{
$methodName = $params['methodName'];
+
if (!$service->hasMethod($methodName))
{
- return new PwgError(WS_ERR_INVALID_PARAM,
- 'Requested method does not exist');
+ return new PwgError(WS_ERR_INVALID_PARAM, 'Requested method does not exist');
}
+
$res = array(
'name' => $methodName,
'description' => $service->getMethodDescription($methodName),
'params' => array(),
+ 'options' => $service->getMethodOptions($methodName),
);
- $signature = $service->getMethodSignature($methodName);
- foreach ($signature as $name => $options)
+
+ foreach ($service->getMethodSignature($methodName) as $name => $options)
{
$param_data = array(
'name' => $name,
- 'optional' => ($options['flags']&WS_PARAM_OPTIONAL)?true:false,
- 'acceptArray' => ($options['flags']&WS_PARAM_ACCEPT_ARRAY)?true:false,
+ 'optional' => self::hasFlag($options['flags'], WS_PARAM_OPTIONAL),
+ 'acceptArray' => self::hasFlag($options['flags'], WS_PARAM_ACCEPT_ARRAY),
+ 'type' => 'mixed',
);
+
if (isset($options['default']))
{
$param_data['defaultValue'] = $options['default'];
}
+ if (isset($options['maxValue']))
+ {
+ $param_data['maxValue'] = $options['maxValue'];
+ }
if (isset($options['info']))
{
$param_data['info'] = $options['info'];
}
+
+ if ( self::hasFlag($options['type'], WS_TYPE_BOOL) )
+ {
+ $param_data['type'] = 'bool';
+ }
+ else if ( self::hasFlag($options['type'], WS_TYPE_INT) )
+ {
+ $param_data['type'] = 'int';
+ }
+ else if ( self::hasFlag($options['type'], WS_TYPE_FLOAT) )
+ {
+ $param_data['type'] = 'float';
+ }
+ if ( self::hasFlag($options['type'], WS_TYPE_POSITIVE) )
+ {
+ $param_data['type'].= ' positive';
+ }
+ if ( self::hasFlag($options['type'], WS_TYPE_NOTNULL) )
+ {
+ $param_data['type'].= ' notnull';
+ }
+
$res['params'][] = $param_data;
}
return $res;
diff --git a/include/ws_functions.inc.php b/include/ws_functions.inc.php
index 7a27b8ba0..17d15313c 100644
--- a/include/ws_functions.inc.php
+++ b/include/ws_functions.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,8 +21,6 @@
// | USA. |
// +-----------------------------------------------------------------------+
-/**** IMPLEMENTATION OF WEB SERVICE METHODS ***********************************/
-
/**
* Event handler for method invocation security check. Should return a PwgError
* if the preconditions are not satifsied for method invocation.
@@ -54,7 +52,7 @@ function ws_std_image_sql_filter( $params, $tbl_name='' )
$clauses = array();
if ( is_numeric($params['f_min_rate']) )
{
- $clauses[] = $tbl_name.'rating_score>'.$params['f_min_rate'];
+ $clauses[] = $tbl_name.'rating_score>='.$params['f_min_rate'];
}
if ( is_numeric($params['f_max_rate']) )
{
@@ -62,7 +60,7 @@ function ws_std_image_sql_filter( $params, $tbl_name='' )
}
if ( is_numeric($params['f_min_hit']) )
{
- $clauses[] = $tbl_name.'hit>'.$params['f_min_hit'];
+ $clauses[] = $tbl_name.'hit>='.$params['f_min_hit'];
}
if ( is_numeric($params['f_max_hit']) )
{
@@ -86,7 +84,7 @@ function ws_std_image_sql_filter( $params, $tbl_name='' )
}
if ( is_numeric($params['f_min_ratio']) )
{
- $clauses[] = $tbl_name.'width/'.$tbl_name.'height>'.$params['f_min_ratio'];
+ $clauses[] = $tbl_name.'width/'.$tbl_name.'height>='.$params['f_min_ratio'];
}
if ( is_numeric($params['f_max_ratio']) )
{
@@ -192,357 +190,39 @@ function ws_std_get_image_xml_attributes()
);
}
-function ws_getMissingDerivatives($params, &$service)
-{
- if (!is_admin())
- {
- return new PwgError(403, 'Forbidden');
- }
-
- if ( empty($params['types']) )
- {
- $types = array_keys(ImageStdParams::get_defined_type_map());
- }
- else
- {
- $types = array_intersect(array_keys(ImageStdParams::get_defined_type_map()), $params['types']);
- if (count($types)==0)
- {
- return new PwgError(WS_ERR_INVALID_PARAM, "Invalid types");
- }
- }
-
- if ( ($max_urls = intval($params['max_urls'])) <= 0)
- {
- return new PwgError(WS_ERR_INVALID_PARAM, "Invalid max_urls");
- }
-
- list($max_id, $image_count) = pwg_db_fetch_row( pwg_query('SELECT MAX(id)+1, COUNT(*) FROM '.IMAGES_TABLE) );
-
- if (0 == $image_count)
- {
- return array();
- }
-
- $start_id = intval($params['prev_page']);
- if ($start_id<=0)
- {
- $start_id = $max_id;
- }
-
- $uid = '&b='.time();
- global $conf;
- $conf['question_mark_in_urls'] = $conf['php_extension_in_urls'] = true;
- $conf['derivative_url_style']=2; //script
-
- $qlimit = min(5000, ceil(max($image_count/500, $max_urls/count($types))));
- $where_clauses = ws_std_image_sql_filter( $params, '' );
- $where_clauses[] = 'id<start_id';
- if ( !empty($params['ids']) )
- {
- $where_clauses[] = 'id IN ('.implode(',',$params['ids']).')';
- }
-
- $query_model = 'SELECT id, path, representative_ext, width,height,rotation
- FROM '.IMAGES_TABLE.'
- WHERE '.implode(' AND ', $where_clauses).'
- ORDER BY id DESC
- LIMIT '.$qlimit;
-
- $urls=array();
- do
- {
- $result = pwg_query( str_replace('start_id', $start_id, $query_model));
- $is_last = pwg_db_num_rows($result) < $qlimit;
- while ($row=pwg_db_fetch_assoc($result))
- {
- $start_id = $row['id'];
- $src_image = new SrcImage($row);
- if ($src_image->is_mimetype())
- continue;
- foreach($types as $type)
- {
- $derivative = new DerivativeImage($type, $src_image);
- if ($type != $derivative->get_type())
- continue;
- if (@filemtime($derivative->get_path())===false)
- {
- $urls[] = $derivative->get_url().$uid;
- }
- }
- if (count($urls)>=$max_urls && !$is_last)
- break;
- }
- if ($is_last)
- {
- $start_id = 0;
- }
- }while (count($urls)<$max_urls && $start_id);
-
- $ret = array();
- if ($start_id)
- {
- $ret['next_page']=$start_id;
- }
- $ret['urls']=$urls;
- return $ret;
-}
-
-/**
- * returns PWG version (web service method)
- */
-function ws_getVersion($params, &$service)
-{
- global $conf;
- if ($conf['show_version'] or is_admin() )
- return PHPWG_VERSION;
- else
- return new PwgError(403, 'Forbidden');
-}
-
-/**
- * returns general informations (web service method)
- */
-function ws_getInfos($params, &$service)
+function ws_std_get_category_xml_attributes()
{
- if (!is_admin())
- {
- return new PwgError(403, 'Forbidden');
- }
-
- $infos['version'] = PHPWG_VERSION;
-
- $query = 'SELECT COUNT(*) FROM '.IMAGES_TABLE.';';
- list($infos['nb_elements']) = pwg_db_fetch_row(pwg_query($query));
-
- $query = 'SELECT COUNT(*) FROM '.CATEGORIES_TABLE.';';
- list($infos['nb_categories']) = pwg_db_fetch_row(pwg_query($query));
-
- $query = 'SELECT COUNT(*) FROM '.CATEGORIES_TABLE.' WHERE dir IS NULL;';
- list($infos['nb_virtual']) = pwg_db_fetch_row(pwg_query($query));
-
- $query = 'SELECT COUNT(*) FROM '.CATEGORIES_TABLE.' WHERE dir IS NOT NULL;';
- list($infos['nb_physical']) = pwg_db_fetch_row(pwg_query($query));
-
- $query = 'SELECT COUNT(*) FROM '.IMAGE_CATEGORY_TABLE.';';
- list($infos['nb_image_category']) = pwg_db_fetch_row(pwg_query($query));
-
- $query = 'SELECT COUNT(*) FROM '.TAGS_TABLE.';';
- list($infos['nb_tags']) = pwg_db_fetch_row(pwg_query($query));
-
- $query = 'SELECT COUNT(*) FROM '.IMAGE_TAG_TABLE.';';
- list($infos['nb_image_tag']) = pwg_db_fetch_row(pwg_query($query));
-
- $query = 'SELECT COUNT(*) FROM '.USERS_TABLE.';';
- list($infos['nb_users']) = pwg_db_fetch_row(pwg_query($query));
-
- $query = 'SELECT COUNT(*) FROM '.GROUPS_TABLE.';';
- list($infos['nb_groups']) = pwg_db_fetch_row(pwg_query($query));
-
- $query = 'SELECT COUNT(*) FROM '.COMMENTS_TABLE.';';
- list($infos['nb_comments']) = pwg_db_fetch_row(pwg_query($query));
-
- // first element
- if ($infos['nb_elements'] > 0)
- {
- $query = 'SELECT MIN(date_available) FROM '.IMAGES_TABLE.';';
- list($infos['first_date']) = pwg_db_fetch_row(pwg_query($query));
- }
-
- // unvalidated comments
- if ($infos['nb_comments'] > 0)
- {
- $query = 'SELECT COUNT(*) FROM '.COMMENTS_TABLE.' WHERE validated=\'false\';';
- list($infos['nb_unvalidated_comments']) = pwg_db_fetch_row(pwg_query($query));
- }
-
- foreach ($infos as $name => $value)
- {
- $output[] = array(
- 'name' => $name,
- 'value' => $value,
+ return array(
+ 'id', 'url', 'nb_images', 'total_nb_images', 'nb_categories', 'date_last', 'max_date_last',
);
- }
-
- return array('infos' => new PwgNamedArray($output, 'item'));
}
-function ws_caddie_add($params, &$service)
+function ws_std_get_tag_xml_attributes()
{
- if (!is_admin())
- {
- return new PwgError(401, 'Access denied');
- }
- $params['image_id'] = array_map( 'intval',$params['image_id'] );
- if ( empty($params['image_id']) )
- {
- return new PwgError(WS_ERR_INVALID_PARAM, "Invalid image_id");
- }
- global $user;
- $query = '
-SELECT id
- FROM '.IMAGES_TABLE.' LEFT JOIN '.CADDIE_TABLE.' ON id=element_id AND user_id='.$user['id'].'
- WHERE id IN ('.implode(',',$params['image_id']).')
- AND element_id IS NULL';
- $datas = array();
- foreach ( array_from_query($query, 'id') as $id )
- {
- array_push($datas, array('element_id'=>$id, 'user_id'=>$user['id']) );
- }
- if (count($datas))
- {
- include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
- mass_inserts(CADDIE_TABLE, array('element_id','user_id'), $datas);
- }
- return count($datas);
+ return array(
+ 'id', 'name', 'url_name', 'counter', 'url', 'page_url',
+ );
}
/**
- * returns images per category (web service method)
+ * Writes info to the log file
*/
-function ws_categories_getImages($params, &$service)
+function ws_logfile($string)
{
- global $user, $conf;
-
- $images = array();
-
- //------------------------------------------------- get the related categories
- $where_clauses = array();
- foreach($params['cat_id'] as $cat_id)
- {
- $cat_id = (int)$cat_id;
- if ($cat_id<=0)
- continue;
- if ($params['recursive'])
- {
- $where_clauses[] = 'uppercats '.DB_REGEX_OPERATOR.' \'(^|,)'.$cat_id.'(,|$)\'';
- }
- else
- {
- $where_clauses[] = 'id='.$cat_id;
- }
- }
- if (!empty($where_clauses))
- {
- $where_clauses = array( '('.
- implode('
- OR ', $where_clauses) . ')'
- );
- }
- $where_clauses[] = get_sql_condition_FandF(
- array('forbidden_categories' => 'id'),
- NULL, true
- );
-
- $query = '
-SELECT id, name, permalink, image_order
- FROM '.CATEGORIES_TABLE.'
- WHERE '. implode('
- AND ', $where_clauses);
- $result = pwg_query($query);
- $cats = array();
- while ($row = pwg_db_fetch_assoc($result))
- {
- $row['id'] = (int)$row['id'];
- $cats[ $row['id'] ] = $row;
- }
+ global $conf;
- //-------------------------------------------------------- get the images
- if ( !empty($cats) )
+ if (!$conf['ws_enable_log'])
{
- $where_clauses = ws_std_image_sql_filter( $params, 'i.' );
- $where_clauses[] = 'category_id IN ('
- .implode(',', array_keys($cats) )
- .')';
- $where_clauses[] = get_sql_condition_FandF( array(
- 'visible_images' => 'i.id'
- ), null, true
- );
-
- $order_by = ws_std_image_sql_order($params, 'i.');
- if ( empty($order_by)
- and count($params['cat_id'])==1
- and isset($cats[ $params['cat_id'][0] ]['image_order'])
- )
- {
- $order_by = $cats[ $params['cat_id'][0] ]['image_order'];
- }
- $order_by = empty($order_by) ? $conf['order_by'] : 'ORDER BY '.$order_by;
-
- $query = '
-SELECT i.*, GROUP_CONCAT(category_id) AS cat_ids
- FROM '.IMAGES_TABLE.' i
- INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON i.id=image_id
- WHERE '. implode('
- AND ', $where_clauses).'
-GROUP BY i.id
-'.$order_by.'
-LIMIT '.(int)$params['per_page'].' OFFSET '.(int)($params['per_page']*$params['page']);
-
- $result = pwg_query($query);
- while ($row = pwg_db_fetch_assoc($result))
- {
- $image = array();
- foreach ( array('id', 'width', 'height', 'hit') as $k )
- {
- if (isset($row[$k]))
- {
- $image[$k] = (int)$row[$k];
- }
- }
- foreach ( array('file', 'name', 'comment', 'date_creation', 'date_available') as $k )
- {
- $image[$k] = $row[$k];
- }
- $image = array_merge( $image, ws_std_get_urls($row) );
-
- $image_cats = array();
- foreach ( explode(',', $row['cat_ids']) as $cat_id )
- {
- $url = make_index_url(
- array(
- 'category' => $cats[$cat_id],
- )
- );
- $page_url = make_picture_url(
- array(
- 'category' => $cats[$cat_id],
- 'image_id' => $row['id'],
- 'image_file' => $row['file'],
- )
- );
- array_push( $image_cats, array(
- WS_XML_ATTRIBUTES => array (
- 'id' => (int)$cat_id,
- 'url' => $url,
- 'page_url' => $page_url,
- )
- )
- );
- }
-
- $image['categories'] = new PwgNamedArray(
- $image_cats,'category', array('id','url','page_url')
- );
- array_push($images, $image);
- }
+ return true;
}
- return array( 'images' =>
- array (
- WS_XML_ATTRIBUTES =>
- array(
- 'page' => $params['page'],
- 'per_page' => $params['per_page'],
- 'count' => count($images)
- ),
- WS_XML_CONTENT => new PwgNamedArray($images, 'image',
- ws_std_get_image_xml_attributes() )
- )
+ file_put_contents(
+ $conf['ws_log_filepath'],
+ '['.date('c').'] '.$string."\n",
+ FILE_APPEND
);
}
-
/**
* create a tree from a flat list of categories, no recursivity for high speed
*/
@@ -557,2929 +237,21 @@ function categories_flatlist_to_tree($categories)
if (!isset($node['id_uppercat']))
{
- $tree[$key] = &$node;
+ $tree[] = &$node;
}
else
{
if (!isset($categories[ $key_of_cat[ $node['id_uppercat'] ] ]['sub_categories']))
{
- $categories[ $key_of_cat[ $node['id_uppercat'] ] ]['sub_categories'] = array();
+ $categories[ $key_of_cat[ $node['id_uppercat'] ] ]['sub_categories'] =
+ new PwgNamedArray(array(), 'category', ws_std_get_category_xml_attributes());
}
- $categories[ $key_of_cat[ $node['id_uppercat'] ] ]['sub_categories'][$key] = &$node;
+ $categories[ $key_of_cat[ $node['id_uppercat'] ] ]['sub_categories']->_content[] = &$node;
}
}
return $tree;
}
-/**
- * returns a list of categories (web service method)
- */
-function ws_categories_getList($params, &$service)
-{
- global $user,$conf;
-
- if ($params['tree_output'])
- {
- if (!isset($_GET['format']) or !in_array($_GET['format'], array('php', 'json')))
- {
- // the algorithm used to build a tree from a flat list of categories
- // keeps original array keys, which is not compatible with
- // PwgNamedArray.
- //
- // PwgNamedArray is useful to define which data is an attribute and
- // which is an element in the XML output. The "hierarchy" output is
- // only compatible with json/php output.
-
- return new PwgError(405, "The tree_output option is only compatible with json/php output formats");
- }
- }
-
- $where = array('1=1');
- $join_type = 'INNER';
- $join_user = $user['id'];
-
- if (!$params['recursive'])
- {
- if ($params['cat_id']>0)
- $where[] = '(id_uppercat='.(int)($params['cat_id']).'
- OR id='.(int)($params['cat_id']).')';
- else
- $where[] = 'id_uppercat IS NULL';
- }
- else if ($params['cat_id']>0)
- {
- $where[] = 'uppercats '.DB_REGEX_OPERATOR.' \'(^|,)'.
- (int)($params['cat_id'])
- .'(,|$)\'';
- }
-
- if ($params['public'])
- {
- $where[] = 'status = "public"';
- $where[] = 'visible = "true"';
-
- $join_user = $conf['guest_id'];
- }
- elseif (is_admin())
- {
- // in this very specific case, we don't want to hide empty
- // categories. Function calculate_permissions will only return
- // categories that are either locked or private and not permitted
- //
- // calculate_permissions does not consider empty categories as forbidden
- $forbidden_categories = calculate_permissions($user['id'], $user['status']);
- $where[]= 'id NOT IN ('.$forbidden_categories.')';
- $join_type = 'LEFT';
- }
-
- $query = '
-SELECT id, name, permalink, uppercats, global_rank, id_uppercat,
- comment,
- nb_images, count_images AS total_nb_images,
- representative_picture_id, user_representative_picture_id, count_images, count_categories,
- date_last, max_date_last, count_categories AS nb_categories
- FROM '.CATEGORIES_TABLE.'
- '.$join_type.' JOIN '.USER_CACHE_CATEGORIES_TABLE.' ON id=cat_id AND user_id='.$join_user.'
- WHERE '. implode('
- AND ', $where);
-
- $result = pwg_query($query);
-
- // management of the album thumbnail -- starts here
- $image_ids = array();
- $categories = array();
- $user_representative_updates_for = array();
- // management of the album thumbnail -- stops here
-
- $cats = array();
- while ($row = pwg_db_fetch_assoc($result))
- {
- $row['url'] = make_index_url(
- array(
- 'category' => $row
- )
- );
- foreach( array('id','nb_images','total_nb_images','nb_categories') as $key)
- {
- $row[$key] = (int)$row[$key];
- }
-
- if ($params['fullname'])
- {
- $row['name'] = strip_tags(get_cat_display_name_cache($row['uppercats'], null, false));
- }
- else
- {
- $row['name'] = strip_tags(
- trigger_event(
- 'render_category_name',
- $row['name'],
- 'ws_categories_getList'
- )
- );
- }
-
- $row['comment'] = strip_tags(
- trigger_event(
- 'render_category_description',
- $row['comment'],
- 'ws_categories_getList'
- )
- );
-
- // management of the album thumbnail -- starts here
- //
- // on branch 2.3, the algorithm is duplicated from
- // include/category_cats, but we should use a common code for Piwigo 2.4
- //
- // warning : if the API method is called with $params['public'], the
- // album thumbnail may be not accurate. The thumbnail can be viewed by
- // the connected user, but maybe not by the guest. Changing the
- // filtering method would be too complicated for now. We will simply
- // avoid to persist the user_representative_picture_id in the database
- // if $params['public']
- if (!empty($row['user_representative_picture_id']))
- {
- $image_id = $row['user_representative_picture_id'];
- }
- else if (!empty($row['representative_picture_id']))
- { // if a representative picture is set, it has priority
- $image_id = $row['representative_picture_id'];
- }
- else if ($conf['allow_random_representative'])
- {
- // searching a random representant among elements in sub-categories
- $image_id = get_random_image_in_category($row);
- }
- else
- { // searching a random representant among representant of sub-categories
- if ($row['count_categories']>0 and $row['count_images']>0)
- {
- $query = '
- SELECT representative_picture_id
- FROM '.CATEGORIES_TABLE.' INNER JOIN '.USER_CACHE_CATEGORIES_TABLE.'
- ON id = cat_id and user_id = '.$user['id'].'
- WHERE uppercats LIKE \''.$row['uppercats'].',%\'
- AND representative_picture_id IS NOT NULL'
- .get_sql_condition_FandF
- (
- array
- (
- 'visible_categories' => 'id',
- ),
- "\n AND"
- ).'
- ORDER BY '.DB_RANDOM_FUNCTION.'()
- LIMIT 1
- ;';
- $subresult = pwg_query($query);
- if (pwg_db_num_rows($subresult) > 0)
- {
- list($image_id) = pwg_db_fetch_row($subresult);
- }
- }
- }
-
- if (isset($image_id))
- {
- if ($conf['representative_cache_on_subcats'] and $row['user_representative_picture_id'] != $image_id)
- {
- $user_representative_updates_for[ $user['id'].'#'.$row['id'] ] = $image_id;
- }
-
- $row['representative_picture_id'] = $image_id;
- array_push($image_ids, $image_id);
- array_push($categories, $row);
- }
- unset($image_id);
- // management of the album thumbnail -- stops here
-
-
- array_push($cats, $row);
- }
- usort($cats, 'global_rank_compare');
-
- // management of the album thumbnail -- starts here
- if (count($categories) > 0)
- {
- $thumbnail_src_of = array();
- $new_image_ids = array();
-
- $query = '
-SELECT id, path, representative_ext, level
- FROM '.IMAGES_TABLE.'
- WHERE id IN ('.implode(',', $image_ids).')
-;';
- $result = pwg_query($query);
- while ($row = pwg_db_fetch_assoc($result))
- {
- if ($row['level'] <= $user['level'])
- {
- $thumbnail_src_of[$row['id']] = DerivativeImage::thumb_url($row);
- }
- else
- {
- // problem: we must not display the thumbnail of a photo which has a
- // higher privacy level than user privacy level
- //
- // * what is the represented category?
- // * find a random photo matching user permissions
- // * register it at user_representative_picture_id
- // * set it as the representative_picture_id for the category
-
- foreach ($categories as &$category)
- {
- if ($row['id'] == $category['representative_picture_id'])
- {
- // searching a random representant among elements in sub-categories
- $image_id = get_random_image_in_category($category);
-
- if (isset($image_id) and !in_array($image_id, $image_ids))
- {
- array_push($new_image_ids, $image_id);
- }
-
- if ($conf['representative_cache_on_level'])
- {
- $user_representative_updates_for[ $user['id'].'#'.$category['id'] ] = $image_id;
- }
-
- $category['representative_picture_id'] = $image_id;
- }
- }
- unset($category);
- }
- }
-
- if (count($new_image_ids) > 0)
- {
- $query = '
-SELECT id, path, representative_ext
- FROM '.IMAGES_TABLE.'
- WHERE id IN ('.implode(',', $new_image_ids).')
-;';
- $result = pwg_query($query);
- while ($row = pwg_db_fetch_assoc($result))
- {
- $thumbnail_src_of[$row['id']] = DerivativeImage::thumb_url($row);
- }
- }
- }
-
- // compared to code in include/category_cats, we only persist the new
- // user_representative if we have used $user['id'] and not the guest id,
- // or else the real guest may see thumbnail that he should not
- if (!$params['public'] and count($user_representative_updates_for))
- {
- $updates = array();
-
- foreach ($user_representative_updates_for as $user_cat => $image_id)
- {
- list($user_id, $cat_id) = explode('#', $user_cat);
-
- array_push(
- $updates,
- array(
- 'user_id' => $user_id,
- 'cat_id' => $cat_id,
- 'user_representative_picture_id' => $image_id,
- )
- );
- }
-
- mass_updates(
- USER_CACHE_CATEGORIES_TABLE,
- array(
- 'primary' => array('user_id', 'cat_id'),
- 'update' => array('user_representative_picture_id')
- ),
- $updates
- );
- }
-
- foreach ($cats as &$cat)
- {
- foreach ($categories as $category)
- {
- if ($category['id'] == $cat['id'] and isset($category['representative_picture_id']))
- {
- $cat['tn_url'] = $thumbnail_src_of[$category['representative_picture_id']];
- }
- }
- // we don't want them in the output
- unset($cat['user_representative_picture_id']);
- unset($cat['count_images']);
- unset($cat['count_categories']);
- }
- unset($cat);
- // management of the album thumbnail -- stops here
-
- if ($params['tree_output'])
- {
- return categories_flatlist_to_tree($cats);
- }
- else
- {
- return array(
- 'categories' => new PwgNamedArray(
- $cats,
- 'category',
- array(
- 'id',
- 'url',
- 'nb_images',
- 'total_nb_images',
- 'nb_categories',
- 'date_last',
- 'max_date_last',
- )
- )
- );
- }
-}
-
-/**
- * returns the list of categories as you can see them in administration (web
- * service method).
- *
- * Only admin can run this method and permissions are not taken into
- * account.
- */
-function ws_categories_getAdminList($params, &$service)
-{
- if (!is_admin())
- {
- return new PwgError(401, 'Access denied');
- }
-
- $query = '
-SELECT
- category_id,
- COUNT(*) AS counter
- FROM '.IMAGE_CATEGORY_TABLE.'
- GROUP BY category_id
-;';
- $nb_images_of = simple_hash_from_query($query, 'category_id', 'counter');
-
- $query = '
-SELECT
- id,
- name,
- comment,
- uppercats,
- global_rank
- FROM '.CATEGORIES_TABLE.'
-;';
- $result = pwg_query($query);
- $cats = array();
-
- while ($row = pwg_db_fetch_assoc($result))
- {
- $id = $row['id'];
- $row['nb_images'] = isset($nb_images_of[$id]) ? $nb_images_of[$id] : 0;
- $row['name'] = strip_tags(
- trigger_event(
- 'render_category_name',
- $row['name'],
- 'ws_categories_getAdminList'
- )
- );
- $row['comment'] = strip_tags(
- trigger_event(
- 'render_category_description',
- $row['comment'],
- 'ws_categories_getAdminList'
- )
- );
- array_push($cats, $row);
- }
-
- usort($cats, 'global_rank_compare');
- return array(
- 'categories' => new PwgNamedArray(
- $cats,
- 'category',
- array(
- 'id',
- 'nb_images',
- 'name',
- 'uppercats',
- 'global_rank',
- )
- )
- );
-}
-
-/**
- * returns detailed information for an element (web service method)
- */
-function ws_images_addComment($params, &$service)
-{
- if (!$service->isPost())
- {
- return new PwgError(405, "This method requires HTTP POST");
- }
- $params['image_id'] = (int)$params['image_id'];
- $query = '
-SELECT DISTINCT image_id
- FROM '.IMAGE_CATEGORY_TABLE.' INNER JOIN '.CATEGORIES_TABLE.' ON category_id=id
- WHERE commentable="true"
- AND image_id='.$params['image_id'].
- get_sql_condition_FandF(
- array(
- 'forbidden_categories' => 'id',
- 'visible_categories' => 'id',
- 'visible_images' => 'image_id'
- ),
- ' AND'
- );
- if ( !pwg_db_num_rows( pwg_query( $query ) ) )
- {
- return new PwgError(WS_ERR_INVALID_PARAM, "Invalid image_id");
- }
-
- $comm = array(
- 'author' => trim( $params['author'] ),
- 'content' => trim( $params['content'] ),
- 'image_id' => $params['image_id'],
- );
-
- include_once(PHPWG_ROOT_PATH.'include/functions_comment.inc.php');
-
- $comment_action = insert_user_comment(
- $comm, $params['key'], $infos
- );
-
- switch ($comment_action)
- {
- case 'reject':
- array_push($infos, l10n('Your comment has NOT been registered because it did not pass the validation rules') );
- return new PwgError(403, implode("; ", $infos) );
- case 'validate':
- case 'moderate':
- $ret = array(
- 'id' => $comm['id'],
- 'validation' => $comment_action=='validate',
- );
- return new PwgNamedStruct(
- 'comment',
- $ret,
- null, array()
- );
- default:
- return new PwgError(500, "Unknown comment action ".$comment_action );
- }
-}
-
-/**
- * returns detailed information for an element (web service method)
- */
-function ws_images_getInfo($params, &$service)
-{
- global $user, $conf;
- $params['image_id'] = (int)$params['image_id'];
- if ( $params['image_id']<=0 )
- {
- return new PwgError(WS_ERR_INVALID_PARAM, "Invalid image_id");
- }
-
- $query='
-SELECT * FROM '.IMAGES_TABLE.'
- WHERE id='.$params['image_id'].
- get_sql_condition_FandF(
- array('visible_images' => 'id'),
- ' AND'
- ).'
-LIMIT 1';
-
- $image_row = pwg_db_fetch_assoc(pwg_query($query));
- if ($image_row==null)
- {
- return new PwgError(404, "image_id not found");
- }
- $image_row = array_merge( $image_row, ws_std_get_urls($image_row) );
-
- //-------------------------------------------------------- related categories
- $query = '
-SELECT id, name, permalink, uppercats, global_rank, commentable
- FROM '.IMAGE_CATEGORY_TABLE.'
- INNER JOIN '.CATEGORIES_TABLE.' ON category_id = id
- WHERE image_id = '.$image_row['id'].
- get_sql_condition_FandF(
- array( 'forbidden_categories' => 'category_id' ),
- ' AND'
- ).'
-;';
- $result = pwg_query($query);
- $is_commentable = false;
- $related_categories = array();
- while ($row = pwg_db_fetch_assoc($result))
- {
- if ($row['commentable']=='true')
- {
- $is_commentable = true;
- }
- unset($row['commentable']);
- $row['url'] = make_index_url(
- array(
- 'category' => $row
- )
- );
-
- $row['page_url'] = make_picture_url(
- array(
- 'image_id' => $image_row['id'],
- 'image_file' => $image_row['file'],
- 'category' => $row
- )
- );
- $row['id']=(int)$row['id'];
- array_push($related_categories, $row);
- }
- usort($related_categories, 'global_rank_compare');
- if ( empty($related_categories) )
- {
- return new PwgError(401, 'Access denied');
- }
-
- //-------------------------------------------------------------- related tags
- $related_tags = get_common_tags( array($image_row['id']), -1 );
- foreach( $related_tags as $i=>$tag)
- {
- $tag['url'] = make_index_url(
- array(
- 'tags' => array($tag)
- )
- );
- $tag['page_url'] = make_picture_url(
- array(
- 'image_id' => $image_row['id'],
- 'image_file' => $image_row['file'],
- 'tags' => array($tag),
- )
- );
- unset($tag['counter']);
- $tag['id']=(int)$tag['id'];
- $related_tags[$i]=$tag;
- }
- //------------------------------------------------------------- related rates
- $rating = array('score'=>$image_row['rating_score'], 'count'=>0, 'average'=>null);
- if (isset($rating['score']))
- {
- $query = '
-SELECT COUNT(rate) AS count
- , ROUND(AVG(rate),2) AS average
- FROM '.RATE_TABLE.'
- WHERE element_id = '.$image_row['id'].'
-;';
- $row = pwg_db_fetch_assoc(pwg_query($query));
- $rating['score'] = (float)$rating['score'];
- $rating['average'] = (float)$row['average'];
- $rating['count'] = (int)$row['count'];
- }
-
- //---------------------------------------------------------- related comments
- $related_comments = array();
-
- $where_comments = 'image_id = '.$image_row['id'];
- if ( !is_admin() )
- {
- $where_comments .= '
- AND validated="true"';
- }
-
- $query = '
-SELECT COUNT(id) AS nb_comments
- FROM '.COMMENTS_TABLE.'
- WHERE '.$where_comments;
- list($nb_comments) = array_from_query($query, 'nb_comments');
- $nb_comments = (int)$nb_comments;
-
- if ( $nb_comments>0 and $params['comments_per_page']>0 )
- {
- $query = '
-SELECT id, date, author, content
- FROM '.COMMENTS_TABLE.'
- WHERE '.$where_comments.'
- ORDER BY date
- LIMIT '.(int)$params['comments_per_page'].
- ' OFFSET '.(int)($params['comments_per_page']*$params['comments_page']);
-
- $result = pwg_query($query);
- while ($row = pwg_db_fetch_assoc($result))
- {
- $row['id']=(int)$row['id'];
- array_push($related_comments, $row);
- }
- }
-
- $comment_post_data = null;
- if ($is_commentable and
- (!is_a_guest()
- or (is_a_guest() and $conf['comments_forall'] )
- )
- )
- {
- $comment_post_data['author'] = stripslashes($user['username']);
- $comment_post_data['key'] = get_ephemeral_key(2, $params['image_id']);
- }
-
- $ret = $image_row;
- foreach ( array('id','width','height','hit','filesize') as $k )
- {
- if (isset($ret[$k]))
- {
- $ret[$k] = (int)$ret[$k];
- }
- }
- foreach ( array('path', 'storage_category_id') as $k )
- {
- unset($ret[$k]);
- }
-
- $ret['rates'] = array( WS_XML_ATTRIBUTES => $rating );
- $ret['categories'] = new PwgNamedArray($related_categories, 'category', array('id','url', 'page_url') );
- $ret['tags'] = new PwgNamedArray($related_tags, 'tag', array('id','url_name','url','name','page_url') );
- if ( isset($comment_post_data) )
- {
- $ret['comment_post'] = array( WS_XML_ATTRIBUTES => $comment_post_data );
- }
- $ret['comments'] = array(
- WS_XML_ATTRIBUTES =>
- array(
- 'page' => $params['comments_page'],
- 'per_page' => $params['comments_per_page'],
- 'count' => count($related_comments),
- 'nb_comments' => $nb_comments,
- ),
- WS_XML_CONTENT => new PwgNamedArray($related_comments, 'comment', array('id','date') )
- );
-
- return new PwgNamedStruct('image',$ret, null, array('name','comment') );
-}
-
-
-/**
- * rates the image_id in the parameter
- */
-function ws_images_Rate($params, &$service)
-{
- $image_id = (int)$params['image_id'];
- $query = '
-SELECT DISTINCT id FROM '.IMAGES_TABLE.'
- INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON id=image_id
- WHERE id='.$image_id
- .get_sql_condition_FandF(
- array(
- 'forbidden_categories' => 'category_id',
- 'forbidden_images' => 'id',
- ),
- ' AND'
- ).'
- LIMIT 1';
- if ( pwg_db_num_rows( pwg_query($query) )==0 )
- {
- return new PwgError(404, "Invalid image_id or access denied" );
- }
- $rate = (int)$params['rate'];
- include_once(PHPWG_ROOT_PATH.'include/functions_rate.inc.php');
- $res = rate_picture( $image_id, $rate );
- if ($res==false)
- {
- global $conf;
- return new PwgError( 403, "Forbidden or rate not in ". implode(',',$conf['rate_items']));
- }
- return $res;
-}
-
-
-/**
- * returns a list of elements corresponding to a query search
- */
-function ws_images_search($params, &$service)
-{
- global $page;
- $images = array();
- include_once( PHPWG_ROOT_PATH .'include/functions_search.inc.php' );
-
- $where_clauses = ws_std_image_sql_filter( $params, 'i.' );
- $order_by = ws_std_image_sql_order($params, 'i.');
-
- $super_order_by = false;
- if ( !empty($order_by) )
- {
- global $conf;
- $conf['order_by'] = 'ORDER BY '.$order_by;
- $super_order_by=true; // quick_search_result might be faster
- }
-
- $search_result = get_quick_search_results($params['query'],
- $super_order_by,
- implode(' AND ', $where_clauses)
- );
-
- $image_ids = array_slice(
- $search_result['items'],
- $params['page']*$params['per_page'],
- $params['per_page']
- );
-
- if ( count($image_ids) )
- {
- $query = '
-SELECT * FROM '.IMAGES_TABLE.'
- WHERE id IN ('.implode(',', $image_ids).')';
-
- $image_ids = array_flip($image_ids);
- $result = pwg_query($query);
- while ($row = pwg_db_fetch_assoc($result))
- {
- $image = array();
- foreach ( array('id', 'width', 'height', 'hit') as $k )
- {
- if (isset($row[$k]))
- {
- $image[$k] = (int)$row[$k];
- }
- }
- foreach ( array('file', 'name', 'comment', 'date_creation', 'date_available') as $k )
- {
- $image[$k] = $row[$k];
- }
- $image = array_merge( $image, ws_std_get_urls($row) );
- $images[$image_ids[$image['id']]] = $image;
- }
- ksort($images, SORT_NUMERIC);
- $images = array_values($images);
- }
-
-
- return array( 'images' =>
- array (
- WS_XML_ATTRIBUTES =>
- array(
- 'page' => $params['page'],
- 'per_page' => $params['per_page'],
- 'count' => count($images)
- ),
- WS_XML_CONTENT => new PwgNamedArray($images, 'image',
- ws_std_get_image_xml_attributes() )
- )
- );
-}
-
-function ws_images_setPrivacyLevel($params, &$service)
-{
- if (!is_admin())
- {
- return new PwgError(401, 'Access denied');
- }
- if (!$service->isPost())
- {
- return new PwgError(405, "This method requires HTTP POST");
- }
- $params['image_id'] = array_map( 'intval',$params['image_id'] );
- if ( empty($params['image_id']) )
- {
- return new PwgError(WS_ERR_INVALID_PARAM, "Invalid image_id");
- }
- global $conf;
- if ( !in_array( (int)$params['level'], $conf['available_permission_levels']) )
- {
- return new PwgError(WS_ERR_INVALID_PARAM, "Invalid level");
- }
-
- $query = '
-UPDATE '.IMAGES_TABLE.'
- SET level='.(int)$params['level'].'
- WHERE id IN ('.implode(',',$params['image_id']).')';
- $result = pwg_query($query);
- $affected_rows = pwg_db_changes($result);
- if ($affected_rows)
- {
- include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
- invalidate_user_cache();
- }
- return $affected_rows;
-}
-
-function ws_images_setRank($params, &$service)
-{
- if (!is_admin())
- {
- return new PwgError(401, 'Access denied');
- }
-
- if (!$service->isPost())
- {
- return new PwgError(405, "This method requires HTTP POST");
- }
-
- // is the image_id valid?
- $params['image_id'] = (int)$params['image_id'];
- if ($params['image_id'] <= 0)
- {
- return new PwgError(WS_ERR_INVALID_PARAM, "Invalid image_id");
- }
-
- // is the category valid?
- $params['category_id'] = (int)$params['category_id'];
- if ($params['category_id'] <= 0)
- {
- return new PwgError(WS_ERR_INVALID_PARAM, "Invalid category_id");
- }
-
- // is the rank valid?
- $params['rank'] = (int)$params['rank'];
- if ($params['rank'] <= 0)
- {
- return new PwgError(WS_ERR_INVALID_PARAM, "Invalid rank");
- }
-
- // does the image really exist?
- $query='
-SELECT
- *
- FROM '.IMAGES_TABLE.'
- WHERE id = '.$params['image_id'].'
-;';
-
- $image_row = pwg_db_fetch_assoc(pwg_query($query));
- if ($image_row == null)
- {
- return new PwgError(404, "image_id not found");
- }
-
- // is the image associated to this category?
- $query = '
-SELECT
- image_id,
- category_id,
- rank
- FROM '.IMAGE_CATEGORY_TABLE.'
- WHERE image_id = '.$params['image_id'].'
- AND category_id = '.$params['category_id'].'
-;';
- $category_row = pwg_db_fetch_assoc(pwg_query($query));
- if ($category_row == null)
- {
- return new PwgError(404, "This image is not associated to this category");
- }
-
- // what is the current higher rank for this category?
- $query = '
-SELECT
- MAX(rank) AS max_rank
- FROM '.IMAGE_CATEGORY_TABLE.'
- WHERE category_id = '.$params['category_id'].'
-;';
- $result = pwg_query($query);
- $row = pwg_db_fetch_assoc($result);
-
- if (is_numeric($row['max_rank']))
- {
- if ($params['rank'] > $row['max_rank'])
- {
- $params['rank'] = $row['max_rank'] + 1;
- }
- }
- else
- {
- $params['rank'] = 1;
- }
-
- // update rank for all other photos in the same category
- $query = '
-UPDATE '.IMAGE_CATEGORY_TABLE.'
- SET rank = rank + 1
- WHERE category_id = '.$params['category_id'].'
- AND rank IS NOT NULL
- AND rank >= '.$params['rank'].'
-;';
- pwg_query($query);
-
- // set the new rank for the photo
- $query = '
-UPDATE '.IMAGE_CATEGORY_TABLE.'
- SET rank = '.$params['rank'].'
- WHERE image_id = '.$params['image_id'].'
- AND category_id = '.$params['category_id'].'
-;';
- pwg_query($query);
-
- // return data for client
- return array(
- 'image_id' => $params['image_id'],
- 'category_id' => $params['category_id'],
- 'rank' => $params['rank'],
- );
-}
-
-function ws_images_add_chunk($params, &$service)
-{
- global $conf;
-
- // data
- // original_sum
- // type {thumb, file, high}
- // position
-
- if (!is_admin())
- {
- return new PwgError(401, 'Access denied');
- }
-
- if (!$service->isPost())
- {
- return new PwgError(405, "This method requires HTTP POST");
- }
-
- foreach ($params as $param_key => $param_value) {
- if ('data' == $param_key) {
- continue;
- }
-
- ws_logfile(
- sprintf(
- '[ws_images_add_chunk] input param "%s" : "%s"',
- $param_key,
- is_null($param_value) ? 'NULL' : $param_value
- )
- );
- }
-
- $upload_dir = $conf['upload_dir'].'/buffer';
-
- // create the upload directory tree if not exists
- if (!mkgetdir($upload_dir, MKGETDIR_DEFAULT&~MKGETDIR_DIE_ON_ERROR))
- {
- return new PwgError(500, 'error during buffer directory creation');
- }
-
- $filename = sprintf(
- '%s-%s-%05u.block',
- $params['original_sum'],
- $params['type'],
- $params['position']
- );
-
- ws_logfile('[ws_images_add_chunk] data length : '.strlen($params['data']));
-
- $bytes_written = file_put_contents(
- $upload_dir.'/'.$filename,
- base64_decode($params['data'])
- );
-
- if (false === $bytes_written) {
- return new PwgError(
- 500,
- 'an error has occured while writting chunk '.$params['position'].' for '.$params['type']
- );
- }
-}
-
-function merge_chunks($output_filepath, $original_sum, $type)
-{
- global $conf;
-
- ws_logfile('[merge_chunks] input parameter $output_filepath : '.$output_filepath);
-
- if (is_file($output_filepath))
- {
- unlink($output_filepath);
-
- if (is_file($output_filepath))
- {
- return new PwgError(500, '[merge_chunks] error while trying to remove existing '.$output_filepath);
- }
- }
-
- $upload_dir = $conf['upload_dir'].'/buffer';
- $pattern = '/'.$original_sum.'-'.$type.'/';
- $chunks = array();
-
- if ($handle = opendir($upload_dir))
- {
- while (false !== ($file = readdir($handle)))
- {
- if (preg_match($pattern, $file))
- {
- ws_logfile($file);
- array_push($chunks, $upload_dir.'/'.$file);
- }
- }
- closedir($handle);
- }
-
- sort($chunks);
-
- if (function_exists('memory_get_usage')) {
- ws_logfile('[merge_chunks] memory_get_usage before loading chunks: '.memory_get_usage());
- }
-
- $i = 0;
-
- foreach ($chunks as $chunk)
- {
- $string = file_get_contents($chunk);
-
- if (function_exists('memory_get_usage')) {
- ws_logfile('[merge_chunks] memory_get_usage on chunk '.++$i.': '.memory_get_usage());
- }
-
- if (!file_put_contents($output_filepath, $string, FILE_APPEND))
- {
- return new PwgError(500, '[merge_chunks] error while writting chunks for '.$output_filepath);
- }
-
- unlink($chunk);
- }
-
- if (function_exists('memory_get_usage')) {
- ws_logfile('[merge_chunks] memory_get_usage after loading chunks: '.memory_get_usage());
- }
-}
-
-/**
- * Function introduced for Piwigo 2.4 and the new "multiple size"
- * (derivatives) feature. As we only need the biggest sent photo as
- * "original", we remove chunks for smaller sizes. We can't make it earlier
- * in ws_images_add_chunk because at this moment we don't know which $type
- * will be the biggest (we could remove the thumb, but let's use the same
- * algorithm)
- */
-function remove_chunks($original_sum, $type)
-{
- global $conf;
-
- $upload_dir = $conf['upload_dir'].'/buffer';
- $pattern = '/'.$original_sum.'-'.$type.'/';
- $chunks = array();
-
- if ($handle = opendir($upload_dir))
- {
- while (false !== ($file = readdir($handle)))
- {
- if (preg_match($pattern, $file))
- {
- array_push($chunks, $upload_dir.'/'.$file);
- }
- }
- closedir($handle);
- }
-
- foreach ($chunks as $chunk)
- {
- unlink($chunk);
- }
-}
-
-function ws_images_addFile($params, &$service)
-{
- ws_logfile(__FUNCTION__.', input : '.var_export($params, true));
- // image_id
- // type {thumb, file, high}
- // sum -> not used currently (Piwigo 2.4)
-
- global $conf;
- if (!is_admin())
- {
- return new PwgError(401, 'Access denied');
- }
-
- $params['image_id'] = (int)$params['image_id'];
- if ($params['image_id'] <= 0)
- {
- return new PwgError(WS_ERR_INVALID_PARAM, "Invalid image_id");
- }
-
- //
- // what is the path and other infos about the photo?
- //
- $query = '
-SELECT
- path,
- file,
- md5sum,
- width,
- height,
- filesize
- FROM '.IMAGES_TABLE.'
- WHERE id = '.$params['image_id'].'
-;';
- $image = pwg_db_fetch_assoc(pwg_query($query));
-
- if ($image == null)
- {
- return new PwgError(404, "image_id not found");
- }
-
- // since Piwigo 2.4 and derivatives, we do not take the imported "thumb"
- // into account
- if ('thumb' == $params['type'])
- {
- remove_chunks($image['md5sum'], $type);
- return true;
- }
-
- // since Piwigo 2.4 and derivatives, we only care about the "original"
- $original_type = 'file';
- if ('high' == $params['type'])
- {
- $original_type = 'high';
- }
-
- $file_path = $conf['upload_dir'].'/buffer/'.$image['md5sum'].'-original';
-
- merge_chunks($file_path, $image['md5sum'], $original_type);
- chmod($file_path, 0644);
-
- include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php');
-
- // if we receive the "file", we only update the original if the "file" is
- // bigger than current original
- if ('file' == $params['type'])
- {
- $do_update = false;
-
- $infos = pwg_image_infos($file_path);
-
- foreach (array('width', 'height', 'filesize') as $image_info)
- {
- if ($infos[$image_info] > $image[$image_info])
- {
- $do_update = true;
- }
- }
-
- if (!$do_update)
- {
- unlink($file_path);
- return true;
- }
- }
-
- $image_id = add_uploaded_file(
- $file_path,
- $image['file'],
- null,
- null,
- $params['image_id'],
- $image['md5sum'] // we force the md5sum to remain the same
- );
-}
-
-function ws_images_add($params, &$service)
-{
- global $conf, $user;
- if (!is_admin())
- {
- return new PwgError(401, 'Access denied');
- }
-
- foreach ($params as $param_key => $param_value) {
- ws_logfile(
- sprintf(
- '[pwg.images.add] input param "%s" : "%s"',
- $param_key,
- is_null($param_value) ? 'NULL' : $param_value
- )
- );
- }
-
- $params['image_id'] = (int)$params['image_id'];
- if ($params['image_id'] > 0)
- {
- include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
-
- $query='
-SELECT *
- FROM '.IMAGES_TABLE.'
- WHERE id = '.$params['image_id'].'
-;';
-
- $image_row = pwg_db_fetch_assoc(pwg_query($query));
- if ($image_row == null)
- {
- return new PwgError(404, "image_id not found");
- }
- }
-
- // does the image already exists ?
- if ($params['check_uniqueness'])
- {
- if ('md5sum' == $conf['uniqueness_mode'])
- {
- $where_clause = "md5sum = '".$params['original_sum']."'";
- }
- if ('filename' == $conf['uniqueness_mode'])
- {
- $where_clause = "file = '".$params['original_filename']."'";
- }
-
- $query = '
-SELECT
- COUNT(*) AS counter
- FROM '.IMAGES_TABLE.'
- WHERE '.$where_clause.'
-;';
- list($counter) = pwg_db_fetch_row(pwg_query($query));
- if ($counter != 0) {
- return new PwgError(500, 'file already exists');
- }
- }
-
- // due to the new feature "derivatives" (multiple sizes) introduced for
- // Piwigo 2.4, we only take the biggest photos sent on
- // pwg.images.addChunk. If "high" is available we use it as "original"
- // else we use "file".
- remove_chunks($params['original_sum'], 'thumb');
-
- if (isset($params['high_sum']))
- {
- $original_type = 'high';
- remove_chunks($params['original_sum'], 'file');
- }
- else
- {
- $original_type = 'file';
- }
-
- $file_path = $conf['upload_dir'].'/buffer/'.$params['original_sum'].'-original';
-
- merge_chunks($file_path, $params['original_sum'], $original_type);
- chmod($file_path, 0644);
-
- include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php');
-
- $image_id = add_uploaded_file(
- $file_path,
- $params['original_filename'],
- null, // categories
- isset($params['level']) ? $params['level'] : null,
- $params['image_id'] > 0 ? $params['image_id'] : null,
- $params['original_sum']
- );
-
- $info_columns = array(
- 'name',
- 'author',
- 'comment',
- 'date_creation',
- );
-
- $update = array();
-
- foreach ($info_columns as $key)
- {
- if (isset($params[$key]))
- {
- $update[$key] = $params[$key];
- }
- }
-
- if (count(array_keys($update)) > 0)
- {
- single_update(
- IMAGES_TABLE,
- $update,
- array('id' => $image_id)
- );
- }
-
- $url_params = array('image_id' => $image_id);
-
- // let's add links between the image and the categories
- if (isset($params['categories']))
- {
- ws_add_image_category_relations($image_id, $params['categories']);
-
- if (preg_match('/^\d+/', $params['categories'], $matches)) {
- $category_id = $matches[0];
-
- $query = '
-SELECT id, name, permalink
- FROM '.CATEGORIES_TABLE.'
- WHERE id = '.$category_id.'
-;';
- $result = pwg_query($query);
- $category = pwg_db_fetch_assoc($result);
-
- $url_params['section'] = 'categories';
- $url_params['category'] = $category;
- }
- }
-
- // and now, let's create tag associations
- if (isset($params['tag_ids']) and !empty($params['tag_ids']))
- {
- set_tags(
- explode(',', $params['tag_ids']),
- $image_id
- );
- }
-
- invalidate_user_cache();
-
- return array(
- 'image_id' => $image_id,
- 'url' => make_picture_url($url_params),
- );
-}
-
-function ws_images_addSimple($params, &$service)
-{
- global $conf;
- if (!is_admin())
- {
- return new PwgError(401, 'Access denied');
- }
-
- if (!$service->isPost())
- {
- return new PwgError(405, "This method requires HTTP POST");
- }
-
- if (!isset($_FILES['image']))
- {
- return new PwgError(405, "The image (file) parameter is missing");
- }
-
- $params['image_id'] = (int)$params['image_id'];
- if ($params['image_id'] > 0)
- {
- include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
-
- $query='
-SELECT *
- FROM '.IMAGES_TABLE.'
- WHERE id = '.$params['image_id'].'
-;';
-
- $image_row = pwg_db_fetch_assoc(pwg_query($query));
- if ($image_row == null)
- {
- return new PwgError(404, "image_id not found");
- }
- }
-
- // category
- $params['category'] = (int)$params['category'];
- if ($params['category'] <= 0 and $params['image_id'] <= 0)
- {
- return new PwgError(WS_ERR_INVALID_PARAM, "Invalid category_id");
- }
-
- include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php');
-
- $image_id = add_uploaded_file(
- $_FILES['image']['tmp_name'],
- $_FILES['image']['name'],
- $params['category'] > 0 ? array($params['category']) : null,
- 8,
- $params['image_id'] > 0 ? $params['image_id'] : null
- );
-
- $info_columns = array(
- 'name',
- 'author',
- 'comment',
- 'level',
- 'date_creation',
- );
-
- foreach ($info_columns as $key)
- {
- if (isset($params[$key]))
- {
- $update[$key] = $params[$key];
- }
- }
-
- if (count(array_keys($update)) > 0)
- {
- $update['id'] = $image_id;
-
- include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
- mass_updates(
- IMAGES_TABLE,
- array(
- 'primary' => array('id'),
- 'update' => array_diff(array_keys($update), array('id'))
- ),
- array($update)
- );
- }
-
-
- if (isset($params['tags']) and !empty($params['tags']))
- {
- $tag_ids = array();
- if (is_array($params[tags]))
- {
- foreach ($params[tags] as $tag_name)
- {
- $tag_id = tag_id_from_tag_name($tag_name);
- array_push($tag_ids, $tag_id);
- }
- }
- else
- {
- $tag_names = preg_split('~(?<!\\\),~', $params['tags']);
- foreach ($tag_names as $tag_name)
- {
- $tag_id = tag_id_from_tag_name(preg_replace('#\\\\*,#', ',', $tag_name));
- array_push($tag_ids, $tag_id);
- }
- }
-
- add_tags($tag_ids, array($image_id));
- }
-
- $url_params = array('image_id' => $image_id);
-
- if ($params['category'] > 0)
- {
- $query = '
-SELECT id, name, permalink
- FROM '.CATEGORIES_TABLE.'
- WHERE id = '.$params['category'].'
-;';
- $result = pwg_query($query);
- $category = pwg_db_fetch_assoc($result);
-
- $url_params['section'] = 'categories';
- $url_params['category'] = $category;
- }
-
- // update metadata from the uploaded file (exif/iptc), even if the sync
- // was already performed by add_uploaded_file().
-
- require_once(PHPWG_ROOT_PATH.'admin/include/functions_metadata.php');
- sync_metadata(array($image_id));
-
- return array(
- 'image_id' => $image_id,
- 'url' => make_picture_url($url_params),
- );
-}
-
-function ws_rates_delete($params, &$service)
-{
- global $conf;
-
- if (!$service->isPost())
- {
- return new PwgError(405, 'This method requires HTTP POST');
- }
-
- if (!is_admin())
- {
- return new PwgError(401, 'Access denied');
- }
-
- $user_id = (int)$params['user_id'];
- if ($user_id<=0)
- {
- return new PwgError(WS_ERR_INVALID_PARAM, 'Invalid user_id');
- }
-
- $query = '
-DELETE FROM '.RATE_TABLE.'
- WHERE user_id='.$user_id;
-
- if (!empty($params['anonymous_id']))
- {
- $query .= ' AND anonymous_id=\''.$params['anonymous_id'].'\'';
- }
-
- $changes = pwg_db_changes(pwg_query($query));
- if ($changes)
- {
- include_once(PHPWG_ROOT_PATH.'include/functions_rate.inc.php');
- update_rating_score();
- }
- return $changes;
-}
-
-
-/**
- * perform a login (web service method)
- */
-function ws_session_login($params, &$service)
-{
- global $conf;
-
- if (!$service->isPost())
- {
- return new PwgError(405, "This method requires HTTP POST");
- }
- if (try_log_user($params['username'], $params['password'],false))
- {
- return true;
- }
- return new PwgError(999, 'Invalid username/password');
-}
-
-
-/**
- * performs a logout (web service method)
- */
-function ws_session_logout($params, &$service)
-{
- if (!is_a_guest())
- {
- logout_user();
- }
- return true;
-}
-
-function ws_session_getStatus($params, &$service)
-{
- global $user;
- $res = array();
- $res['username'] = is_a_guest() ? 'guest' : stripslashes($user['username']);
- foreach ( array('status', 'theme', 'language') as $k )
- {
- $res[$k] = $user[$k];
- }
- $res['pwg_token'] = get_pwg_token();
- $res['charset'] = get_pwg_charset();
-
- list($dbnow) = pwg_db_fetch_row(pwg_query('SELECT NOW();'));
- $res['current_datetime'] = $dbnow;
-
- return $res;
-}
-
-
-/**
- * returns a list of tags (web service method)
- */
-function ws_tags_getList($params, &$service)
-{
- $tags = get_available_tags();
- if ($params['sort_by_counter'])
- {
- usort($tags, create_function('$a,$b', 'return -$a["counter"]+$b["counter"];') );
- }
- else
- {
- usort($tags, 'tag_alpha_compare');
- }
- for ($i=0; $i<count($tags); $i++)
- {
- $tags[$i]['id'] = (int)$tags[$i]['id'];
- $tags[$i]['counter'] = (int)$tags[$i]['counter'];
- $tags[$i]['url'] = make_index_url(
- array(
- 'section'=>'tags',
- 'tags'=>array($tags[$i])
- )
- );
- }
- return array('tags' => new PwgNamedArray($tags, 'tag', array('id','url_name','url', 'name', 'counter' )) );
-}
-
-/**
- * returns the list of tags as you can see them in administration (web
- * service method).
- *
- * Only admin can run this method and permissions are not taken into
- * account.
- */
-function ws_tags_getAdminList($params, &$service)
-{
- if (!is_admin())
- {
- return new PwgError(401, 'Access denied');
- }
-
- $tags = get_all_tags();
- return array(
- 'tags' => new PwgNamedArray(
- $tags,
- 'tag',
- array(
- 'name',
- 'id',
- 'url_name',
- )
- )
- );
-}
-
-/**
- * returns a list of images for tags (web service method)
- */
-function ws_tags_getImages($params, &$service)
-{
- global $conf;
-
- // first build all the tag_ids we are interested in
- $params['tag_id'] = array_map( 'intval',$params['tag_id'] );
- $tags = find_tags($params['tag_id'], $params['tag_url_name'], $params['tag_name']);
- $tags_by_id = array();
- foreach( $tags as $tag )
- {
- $tags['id'] = (int)$tag['id'];
- $tags_by_id[ $tag['id'] ] = $tag;
- }
- unset($tags);
- $tag_ids = array_keys($tags_by_id);
-
-
- $where_clauses = ws_std_image_sql_filter($params);
- if (!empty($where_clauses))
- {
- $where_clauses = implode( ' AND ', $where_clauses);
- }
- $image_ids = get_image_ids_for_tags(
- $tag_ids,
- $params['tag_mode_and'] ? 'AND' : 'OR',
- $where_clauses,
- ws_std_image_sql_order($params) );
-
-
- $image_ids = array_slice($image_ids, (int)($params['per_page']*$params['page']), (int)$params['per_page'] );
-
- $image_tag_map = array();
- if ( !empty($image_ids) and !$params['tag_mode_and'] )
- { // build list of image ids with associated tags per image
- $query = '
-SELECT image_id, GROUP_CONCAT(tag_id) AS tag_ids
- FROM '.IMAGE_TAG_TABLE.'
- WHERE tag_id IN ('.implode(',',$tag_ids).') AND image_id IN ('.implode(',',$image_ids).')
- GROUP BY image_id';
- $result = pwg_query($query);
- while ( $row=pwg_db_fetch_assoc($result) )
- {
- $row['image_id'] = (int)$row['image_id'];
- array_push( $image_ids, $row['image_id'] );
- $image_tag_map[ $row['image_id'] ] = explode(',', $row['tag_ids']);
- }
- }
-
- $images = array();
- if (!empty($image_ids))
- {
- $rank_of = array_flip($image_ids);
- $result = pwg_query('
-SELECT * FROM '.IMAGES_TABLE.'
- WHERE id IN ('.implode(',',$image_ids).')');
- while ($row = pwg_db_fetch_assoc($result))
- {
- $image = array();
- $image['rank'] = $rank_of[ $row['id'] ];
- foreach ( array('id', 'width', 'height', 'hit') as $k )
- {
- if (isset($row[$k]))
- {
- $image[$k] = (int)$row[$k];
- }
- }
- foreach ( array('file', 'name', 'comment', 'date_creation', 'date_available') as $k )
- {
- $image[$k] = $row[$k];
- }
- $image = array_merge( $image, ws_std_get_urls($row) );
-
- $image_tag_ids = ($params['tag_mode_and']) ? $tag_ids : $image_tag_map[$image['id']];
- $image_tags = array();
- foreach ($image_tag_ids as $tag_id)
- {
- $url = make_index_url(
- array(
- 'section'=>'tags',
- 'tags'=> array($tags_by_id[$tag_id])
- )
- );
- $page_url = make_picture_url(
- array(
- 'section'=>'tags',
- 'tags'=> array($tags_by_id[$tag_id]),
- 'image_id' => $row['id'],
- 'image_file' => $row['file'],
- )
- );
- array_push($image_tags, array(
- 'id' => (int)$tag_id,
- 'url' => $url,
- 'page_url' => $page_url,
- )
- );
- }
- $image['tags'] = new PwgNamedArray($image_tags, 'tag',
- array('id','url_name','url','page_url')
- );
- array_push($images, $image);
- }
- usort($images, 'rank_compare');
- unset($rank_of);
- }
-
- return array( 'images' =>
- array (
- WS_XML_ATTRIBUTES =>
- array(
- 'page' => $params['page'],
- 'per_page' => $params['per_page'],
- 'count' => count($images)
- ),
- WS_XML_CONTENT => new PwgNamedArray($images, 'image',
- ws_std_get_image_xml_attributes() )
- )
- );
-}
-
-function ws_categories_add($params, &$service)
-{
- if (!is_admin())
- {
- return new PwgError(401, 'Access denied');
- }
-
- include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
-
- $options = array();
- if (!empty($params['status']) and in_array($params['status'], array('private','public')))
- {
- $options['status'] = $params['status'];
- }
-
- if (!empty($params['visible']) and in_array($params['visible'], array('true','false')))
- {
- $options['visible'] = get_boolean($params['visible']);
- }
-
- if (!empty($params['commentable']) and in_array($params['commentable'], array('true','false')) )
- {
- $options['commentable'] = get_boolean($params['commentable']);
- }
-
- if (!empty($params['comment']))
- {
- $options['comment'] = $params['comment'];
- }
-
-
- $creation_output = create_virtual_category(
- $params['name'],
- $params['parent'],
- $options
- );
-
- if (isset($creation_output['error']))
- {
- return new PwgError(500, $creation_output['error']);
- }
-
- invalidate_user_cache();
-
- return $creation_output;
-}
-
-function ws_tags_add($params, &$service)
-{
- if (!is_admin())
- {
- return new PwgError(401, 'Access denied');
- }
-
- include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
-
- $creation_output = create_tag($params['name']);
-
- if (isset($creation_output['error']))
- {
- return new PwgError(500, $creation_output['error']);
- }
-
- return $creation_output;
-}
-
-function ws_images_exist($params, &$service)
-{
- ws_logfile(__FUNCTION__.' '.var_export($params, true));
-
- global $conf;
-
- if (!is_admin())
- {
- return new PwgError(401, 'Access denied');
- }
-
- $split_pattern = '/[\s,;\|]/';
-
- if ('md5sum' == $conf['uniqueness_mode'])
- {
- // search among photos the list of photos already added, based on md5sum
- // list
- $md5sums = preg_split(
- $split_pattern,
- $params['md5sum_list'],
- -1,
- PREG_SPLIT_NO_EMPTY
- );
-
- $query = '
-SELECT
- id,
- md5sum
- FROM '.IMAGES_TABLE.'
- WHERE md5sum IN (\''.implode("','", $md5sums).'\')
-;';
- $id_of_md5 = simple_hash_from_query($query, 'md5sum', 'id');
-
- $result = array();
-
- foreach ($md5sums as $md5sum)
- {
- $result[$md5sum] = null;
- if (isset($id_of_md5[$md5sum]))
- {
- $result[$md5sum] = $id_of_md5[$md5sum];
- }
- }
- }
-
- if ('filename' == $conf['uniqueness_mode'])
- {
- // search among photos the list of photos already added, based on
- // filename list
- $filenames = preg_split(
- $split_pattern,
- $params['filename_list'],
- -1,
- PREG_SPLIT_NO_EMPTY
- );
-
- $query = '
-SELECT
- id,
- file
- FROM '.IMAGES_TABLE.'
- WHERE file IN (\''.implode("','", $filenames).'\')
-;';
- $id_of_filename = simple_hash_from_query($query, 'file', 'id');
-
- $result = array();
-
- foreach ($filenames as $filename)
- {
- $result[$filename] = null;
- if (isset($id_of_filename[$filename]))
- {
- $result[$filename] = $id_of_filename[$filename];
- }
- }
- }
-
- return $result;
-}
-
-function ws_images_checkFiles($params, &$service)
-{
- ws_logfile(__FUNCTION__.', input : '.var_export($params, true));
-
- if (!is_admin())
- {
- return new PwgError(401, 'Access denied');
- }
-
- // input parameters
- //
- // image_id
- // thumbnail_sum
- // file_sum
- // high_sum
-
- $params['image_id'] = (int)$params['image_id'];
- if ($params['image_id'] <= 0)
- {
- return new PwgError(WS_ERR_INVALID_PARAM, "Invalid image_id");
- }
-
- $query = '
-SELECT
- path
- FROM '.IMAGES_TABLE.'
- WHERE id = '.$params['image_id'].'
-;';
- $result = pwg_query($query);
- if (pwg_db_num_rows($result) == 0)
- {
- return new PwgError(404, "image_id not found");
- }
- list($path) = pwg_db_fetch_row($result);
-
- $ret = array();
-
- if (isset($params['thumbnail_sum']))
- {
- // We always say the thumbnail is equal to create no reaction on the
- // other side. Since Piwigo 2.4 and derivatives, the thumbnails and web
- // sizes are always generated by Piwigo
- $ret['thumbnail'] = 'equals';
- }
-
- if (isset($params['high_sum']))
- {
- $ret['file'] = 'equals';
- $compare_type = 'high';
- }
- elseif (isset($params['file_sum']))
- {
- $compare_type = 'file';
- }
-
- if (isset($compare_type))
- {
- ws_logfile(__FUNCTION__.', md5_file($path) = '.md5_file($path));
- if (md5_file($path) != $params[$compare_type.'_sum'])
- {
- $ret[$compare_type] = 'differs';
- }
- else
- {
- $ret[$compare_type] = 'equals';
- }
- }
-
- ws_logfile(__FUNCTION__.', output : '.var_export($ret, true));
-
- return $ret;
-}
-
-function ws_images_setInfo($params, &$service)
-{
- global $conf;
- if (!is_admin())
- {
- return new PwgError(401, 'Access denied');
- }
-
- if (!$service->isPost())
- {
- return new PwgError(405, "This method requires HTTP POST");
- }
-
- $params['image_id'] = (int)$params['image_id'];
- if ($params['image_id'] <= 0)
- {
- return new PwgError(WS_ERR_INVALID_PARAM, "Invalid image_id");
- }
-
- include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
-
- $query='
-SELECT *
- FROM '.IMAGES_TABLE.'
- WHERE id = '.$params['image_id'].'
-;';
-
- $image_row = pwg_db_fetch_assoc(pwg_query($query));
- if ($image_row == null)
- {
- return new PwgError(404, "image_id not found");
- }
-
- // database registration
- $update = array();
-
- $info_columns = array(
- 'name',
- 'author',
- 'comment',
- 'level',
- 'date_creation',
- );
-
- foreach ($info_columns as $key)
- {
- if (isset($params[$key]))
- {
- if ('fill_if_empty' == $params['single_value_mode'])
- {
- if (empty($image_row[$key]))
- {
- $update[$key] = $params[$key];
- }
- }
- elseif ('replace' == $params['single_value_mode'])
- {
- $update[$key] = $params[$key];
- }
- else
- {
- return new PwgError(
- 500,
- '[ws_images_setInfo]'
- .' invalid parameter single_value_mode "'.$params['single_value_mode'].'"'
- .', possible values are {fill_if_empty, replace}.'
- );
- }
- }
- }
-
- if (isset($params['file']))
- {
- if (!empty($image_row['storage_category_id']))
- {
- return new PwgError(500, '[ws_images_setInfo] updating "file" is forbidden on photos added by synchronization');
- }
-
- $update['file'] = $params['file'];
- }
-
- if (count(array_keys($update)) > 0)
- {
- $update['id'] = $params['image_id'];
-
- mass_updates(
- IMAGES_TABLE,
- array(
- 'primary' => array('id'),
- 'update' => array_diff(array_keys($update), array('id'))
- ),
- array($update)
- );
- }
-
- if (isset($params['categories']))
- {
- ws_add_image_category_relations(
- $params['image_id'],
- $params['categories'],
- ('replace' == $params['multiple_value_mode'] ? true : false)
- );
- }
-
- // and now, let's create tag associations
- if (isset($params['tag_ids']))
- {
- $tag_ids = explode(',', $params['tag_ids']);
-
- if ('replace' == $params['multiple_value_mode'])
- {
- set_tags(
- $tag_ids,
- $params['image_id']
- );
- }
- elseif ('append' == $params['multiple_value_mode'])
- {
- add_tags(
- $tag_ids,
- array($params['image_id'])
- );
- }
- else
- {
- return new PwgError(
- 500,
- '[ws_images_setInfo]'
- .' invalid parameter multiple_value_mode "'.$params['multiple_value_mode'].'"'
- .', possible values are {replace, append}.'
- );
- }
- }
-
- invalidate_user_cache();
-}
-
-function ws_images_delete($params, &$service)
-{
- global $conf;
- if (!is_admin())
- {
- return new PwgError(401, 'Access denied');
- }
-
- if (!$service->isPost())
- {
- return new PwgError(405, "This method requires HTTP POST");
- }
-
- if (empty($params['pwg_token']) or get_pwg_token() != $params['pwg_token'])
- {
- return new PwgError(403, 'Invalid security token');
- }
-
- $params['image_id'] = preg_split(
- '/[\s,;\|]/',
- $params['image_id'],
- -1,
- PREG_SPLIT_NO_EMPTY
- );
- $params['image_id'] = array_map('intval', $params['image_id']);
-
- $image_ids = array();
- foreach ($params['image_id'] as $image_id)
- {
- if ($image_id > 0)
- {
- array_push($image_ids, $image_id);
- }
- }
-
- include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
- delete_elements($image_ids, true);
-}
-
-function ws_add_image_category_relations($image_id, $categories_string, $replace_mode=false)
-{
- // let's add links between the image and the categories
- //
- // $params['categories'] should look like 123,12;456,auto;789 which means:
- //
- // 1. associate with category 123 on rank 12
- // 2. associate with category 456 on automatic rank
- // 3. associate with category 789 on automatic rank
- $cat_ids = array();
- $rank_on_category = array();
- $search_current_ranks = false;
-
- $tokens = explode(';', $categories_string);
- foreach ($tokens as $token)
- {
- @list($cat_id, $rank) = explode(',', $token);
-
- if (!preg_match('/^\d+$/', $cat_id))
- {
- continue;
- }
-
- array_push($cat_ids, $cat_id);
-
- if (!isset($rank))
- {
- $rank = 'auto';
- }
- $rank_on_category[$cat_id] = $rank;
-
- if ($rank == 'auto')
- {
- $search_current_ranks = true;
- }
- }
-
- $cat_ids = array_unique($cat_ids);
-
- if (count($cat_ids) == 0)
- {
- return new PwgError(
- 500,
- '[ws_add_image_category_relations] there is no category defined in "'.$categories_string.'"'
- );
- }
-
- $query = '
-SELECT
- id
- FROM '.CATEGORIES_TABLE.'
- WHERE id IN ('.implode(',', $cat_ids).')
-;';
- $db_cat_ids = array_from_query($query, 'id');
-
- $unknown_cat_ids = array_diff($cat_ids, $db_cat_ids);
- if (count($unknown_cat_ids) != 0)
- {
- return new PwgError(
- 500,
- '[ws_add_image_category_relations] the following categories are unknown: '.implode(', ', $unknown_cat_ids)
- );
- }
-
- $to_update_cat_ids = array();
-
- // in case of replace mode, we first check the existing associations
- $query = '
-SELECT
- category_id
- FROM '.IMAGE_CATEGORY_TABLE.'
- WHERE image_id = '.$image_id.'
-;';
- $existing_cat_ids = array_from_query($query, 'category_id');
-
- if ($replace_mode)
- {
- $to_remove_cat_ids = array_diff($existing_cat_ids, $cat_ids);
- if (count($to_remove_cat_ids) > 0)
- {
- $query = '
-DELETE
- FROM '.IMAGE_CATEGORY_TABLE.'
- WHERE image_id = '.$image_id.'
- AND category_id IN ('.implode(', ', $to_remove_cat_ids).')
-;';
- pwg_query($query);
- update_category($to_remove_cat_ids);
- }
- }
-
- $new_cat_ids = array_diff($cat_ids, $existing_cat_ids);
- if (count($new_cat_ids) == 0)
- {
- return true;
- }
-
- if ($search_current_ranks)
- {
- $query = '
-SELECT
- category_id,
- MAX(rank) AS max_rank
- FROM '.IMAGE_CATEGORY_TABLE.'
- WHERE rank IS NOT NULL
- AND category_id IN ('.implode(',', $new_cat_ids).')
- GROUP BY category_id
-;';
- $current_rank_of = simple_hash_from_query(
- $query,
- 'category_id',
- 'max_rank'
- );
-
- foreach ($new_cat_ids as $cat_id)
- {
- if (!isset($current_rank_of[$cat_id]))
- {
- $current_rank_of[$cat_id] = 0;
- }
-
- if ('auto' == $rank_on_category[$cat_id])
- {
- $rank_on_category[$cat_id] = $current_rank_of[$cat_id] + 1;
- }
- }
- }
-
- $inserts = array();
-
- foreach ($new_cat_ids as $cat_id)
- {
- array_push(
- $inserts,
- array(
- 'image_id' => $image_id,
- 'category_id' => $cat_id,
- 'rank' => $rank_on_category[$cat_id],
- )
- );
- }
-
- include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
- mass_inserts(
- IMAGE_CATEGORY_TABLE,
- array_keys($inserts[0]),
- $inserts
- );
-
- update_category($new_cat_ids);
-}
-
-function ws_categories_setInfo($params, &$service)
-{
- global $conf;
- if (!is_admin())
- {
- return new PwgError(401, 'Access denied');
- }
-
- if (!$service->isPost())
- {
- return new PwgError(405, "This method requires HTTP POST");
- }
-
- // category_id
- // name
- // comment
-
- $params['category_id'] = (int)$params['category_id'];
- if ($params['category_id'] <= 0)
- {
- return new PwgError(WS_ERR_INVALID_PARAM, "Invalid category_id");
- }
-
- // database registration
- $update = array(
- 'id' => $params['category_id'],
- );
-
- $info_columns = array(
- 'name',
- 'comment',
- );
-
- $perform_update = false;
- foreach ($info_columns as $key)
- {
- if (isset($params[$key]))
- {
- $perform_update = true;
- $update[$key] = $params[$key];
- }
- }
-
- if ($perform_update)
- {
- include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
- mass_updates(
- CATEGORIES_TABLE,
- array(
- 'primary' => array('id'),
- 'update' => array_diff(array_keys($update), array('id'))
- ),
- array($update)
- );
- }
-
-}
-
-function ws_categories_setRepresentative($params, &$service)
-{
- global $conf;
-
- if (!is_admin())
- {
- return new PwgError(401, 'Access denied');
- }
-
- if (!$service->isPost())
- {
- return new PwgError(405, "This method requires HTTP POST");
- }
-
- // category_id
- // image_id
-
- $params['category_id'] = (int)$params['category_id'];
- if ($params['category_id'] <= 0)
- {
- return new PwgError(WS_ERR_INVALID_PARAM, "Invalid category_id");
- }
-
- // does the category really exist?
- $query='
-SELECT
- *
- FROM '.CATEGORIES_TABLE.'
- WHERE id = '.$params['category_id'].'
-;';
- $row = pwg_db_fetch_assoc(pwg_query($query));
- if ($row == null)
- {
- return new PwgError(404, "category_id not found");
- }
-
- $params['image_id'] = (int)$params['image_id'];
- if ($params['image_id'] <= 0)
- {
- return new PwgError(WS_ERR_INVALID_PARAM, "Invalid image_id");
- }
-
- // does the image really exist?
- $query='
-SELECT
- *
- FROM '.IMAGES_TABLE.'
- WHERE id = '.$params['image_id'].'
-;';
-
- $row = pwg_db_fetch_assoc(pwg_query($query));
- if ($row == null)
- {
- return new PwgError(404, "image_id not found");
- }
-
- // apply change
- $query = '
-UPDATE '.CATEGORIES_TABLE.'
- SET representative_picture_id = '.$params['image_id'].'
- WHERE id = '.$params['category_id'].'
-;';
- pwg_query($query);
-
- $query = '
-UPDATE '.USER_CACHE_CATEGORIES_TABLE.'
- SET user_representative_picture_id = NULL
- WHERE cat_id = '.$params['category_id'].'
-;';
- pwg_query($query);
-}
-
-function ws_categories_delete($params, &$service)
-{
- global $conf;
- if (!is_admin())
- {
- return new PwgError(401, 'Access denied');
- }
-
- if (!$service->isPost())
- {
- return new PwgError(405, "This method requires HTTP POST");
- }
-
- if (empty($params['pwg_token']) or get_pwg_token() != $params['pwg_token'])
- {
- return new PwgError(403, 'Invalid security token');
- }
-
- $modes = array('no_delete', 'delete_orphans', 'force_delete');
- if (!in_array($params['photo_deletion_mode'], $modes))
- {
- return new PwgError(
- 500,
- '[ws_categories_delete]'
- .' invalid parameter photo_deletion_mode "'.$params['photo_deletion_mode'].'"'
- .', possible values are {'.implode(', ', $modes).'}.'
- );
- }
-
- $params['category_id'] = preg_split(
- '/[\s,;\|]/',
- $params['category_id'],
- -1,
- PREG_SPLIT_NO_EMPTY
- );
- $params['category_id'] = array_map('intval', $params['category_id']);
-
- $category_ids = array();
- foreach ($params['category_id'] as $category_id)
- {
- if ($category_id > 0)
- {
- array_push($category_ids, $category_id);
- }
- }
-
- if (count($category_ids) == 0)
- {
- return;
- }
-
- $query = '
-SELECT id
- FROM '.CATEGORIES_TABLE.'
- WHERE id IN ('.implode(',', $category_ids).')
-;';
- $category_ids = array_from_query($query, 'id');
-
- if (count($category_ids) == 0)
- {
- return;
- }
-
- include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
- delete_categories($category_ids, $params['photo_deletion_mode']);
- update_global_rank();
-}
-
-function ws_categories_move($params, &$service)
-{
- global $conf, $page;
-
- if (!is_admin())
- {
- return new PwgError(401, 'Access denied');
- }
-
- if (!$service->isPost())
- {
- return new PwgError(405, "This method requires HTTP POST");
- }
-
- if (empty($params['pwg_token']) or get_pwg_token() != $params['pwg_token'])
- {
- return new PwgError(403, 'Invalid security token');
- }
-
- $params['category_id'] = preg_split(
- '/[\s,;\|]/',
- $params['category_id'],
- -1,
- PREG_SPLIT_NO_EMPTY
- );
- $params['category_id'] = array_map('intval', $params['category_id']);
-
- $category_ids = array();
- foreach ($params['category_id'] as $category_id)
- {
- if ($category_id > 0)
- {
- array_push($category_ids, $category_id);
- }
- }
-
- if (count($category_ids) == 0)
- {
- return new PwgError(403, 'Invalid category_id input parameter, no category to move');
- }
-
- // we can't move physical categories
- $categories_in_db = array();
-
- $query = '
-SELECT
- id,
- name,
- dir
- FROM '.CATEGORIES_TABLE.'
- WHERE id IN ('.implode(',', $category_ids).')
-;';
- $result = pwg_query($query);
- while ($row = pwg_db_fetch_assoc($result))
- {
- $categories_in_db[$row['id']] = $row;
- // we break on error at first physical category detected
- if (!empty($row['dir']))
- {
- $row['name'] = strip_tags(
- trigger_event(
- 'render_category_name',
- $row['name'],
- 'ws_categories_move'
- )
- );
-
- return new PwgError(
- 403,
- sprintf(
- 'Category %s (%u) is not a virtual category, you cannot move it',
- $row['name'],
- $row['id']
- )
- );
- }
- }
-
- if (count($categories_in_db) != count($category_ids))
- {
- $unknown_category_ids = array_diff($category_ids, array_keys($categories_in_db));
-
- return new PwgError(
- 403,
- sprintf(
- 'Category %u does not exist',
- $unknown_category_ids[0]
- )
- );
- }
-
- // does this parent exists? This check should be made in the
- // move_categories function, not here
- //
- // 0 as parent means "move categories at gallery root"
- if (!is_numeric($params['parent']))
- {
- return new PwgError(403, 'Invalid parent input parameter');
- }
-
- if (0 != $params['parent']) {
- $params['parent'] = intval($params['parent']);
- $subcat_ids = get_subcat_ids(array($params['parent']));
- if (count($subcat_ids) == 0)
- {
- return new PwgError(403, 'Unknown parent category id');
- }
- }
-
- $page['infos'] = array();
- $page['errors'] = array();
- include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
- move_categories($category_ids, $params['parent']);
- invalidate_user_cache();
-
- if (count($page['errors']) != 0)
- {
- return new PwgError(403, implode('; ', $page['errors']));
- }
-}
-
-function ws_logfile($string)
-{
- global $conf;
-
- if (!$conf['ws_enable_log']) {
- return true;
- }
-
- file_put_contents(
- $conf['ws_log_filepath'],
- '['.date('c').'] '.$string."\n",
- FILE_APPEND
- );
-}
-
-function ws_images_checkUpload($params, &$service)
-{
- global $conf;
-
- if (!is_admin())
- {
- return new PwgError(401, 'Access denied');
- }
-
- include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php');
- $ret['message'] = ready_for_upload_message();
- $ret['ready_for_upload'] = true;
-
- if (!empty($ret['message']))
- {
- $ret['ready_for_upload'] = false;
- }
-
- return $ret;
-}
-
-function ws_plugins_getList($params, &$service)
-{
- global $conf;
-
- if (!is_admin())
- {
- return new PwgError(401, 'Access denied');
- }
-
- include_once(PHPWG_ROOT_PATH.'admin/include/plugins.class.php');
- $plugins = new plugins();
- $plugins->sort_fs_plugins('name');
- $plugin_list = array();
-
- foreach($plugins->fs_plugins as $plugin_id => $fs_plugin)
- {
- if (isset($plugins->db_plugins_by_id[$plugin_id]))
- {
- $state = $plugins->db_plugins_by_id[$plugin_id]['state'];
- }
- else
- {
- $state = 'uninstalled';
- }
-
- array_push(
- $plugin_list,
- array(
- 'id' => $plugin_id,
- 'name' => $fs_plugin['name'],
- 'version' => $fs_plugin['version'],
- 'state' => $state,
- 'description' => $fs_plugin['description'],
- )
- );
- }
-
- return $plugin_list;
-}
-
-function ws_plugins_performAction($params, &$service)
-{
- global $template;
-
- if (!is_admin())
- {
- return new PwgError(401, 'Access denied');
- }
-
- if (empty($params['pwg_token']) or get_pwg_token() != $params['pwg_token'])
- {
- return new PwgError(403, 'Invalid security token');
- }
-
- define('IN_ADMIN', true);
- include_once(PHPWG_ROOT_PATH.'admin/include/plugins.class.php');
- $plugins = new plugins();
- $errors = $plugins->perform_action($params['action'], $params['plugin']);
-
-
- if (!empty($errors))
- {
- return new PwgError(500, $errors);
- }
- else
- {
- if (in_array($params['action'], array('activate', 'deactivate')))
- {
- $template->delete_compiled_templates();
- }
- return true;
- }
-}
-
-function ws_themes_performAction($params, &$service)
-{
- global $template;
-
- if (!is_admin())
- {
- return new PwgError(401, 'Access denied');
- }
-
- if (empty($params['pwg_token']) or get_pwg_token() != $params['pwg_token'])
- {
- return new PwgError(403, 'Invalid security token');
- }
-
- define('IN_ADMIN', true);
- include_once(PHPWG_ROOT_PATH.'admin/include/themes.class.php');
- $themes = new themes();
- $errors = $themes->perform_action($params['action'], $params['theme']);
-
- if (!empty($errors))
- {
- return new PwgError(500, $errors);
- }
- else
- {
- if (in_array($params['action'], array('activate', 'deactivate')))
- {
- $template->delete_compiled_templates();
- }
- return true;
- }
-}
-
-function ws_extensions_update($params, &$service)
-{
- if (!is_webmaster())
- {
- return new PwgError(401, l10n('Webmaster status is required.'));
- }
-
- if (empty($params['pwg_token']) or get_pwg_token() != $params['pwg_token'])
- {
- return new PwgError(403, 'Invalid security token');
- }
-
- if (empty($params['type']) or !in_array($params['type'], array('plugins', 'themes', 'languages')))
- {
- return new PwgError(403, "invalid extension type");
- }
-
- if (empty($params['id']) or empty($params['revision']))
- {
- return new PwgError(null, 'Wrong parameters');
- }
-
- include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
- include_once(PHPWG_ROOT_PATH.'admin/include/'.$params['type'].'.class.php');
-
- $type = $params['type'];
- $extension_id = $params['id'];
- $revision = $params['revision'];
-
- $extension = new $type();
-
- if ($type == 'plugins')
- {
- if (isset($extension->db_plugins_by_id[$extension_id]) and $extension->db_plugins_by_id[$extension_id]['state'] == 'active')
- {
- $extension->perform_action('deactivate', $extension_id);
-
- redirect(PHPWG_ROOT_PATH
- . 'ws.php'
- . '?method=pwg.extensions.update'
- . '&type=plugins'
- . '&id=' . $extension_id
- . '&revision=' . $revision
- . '&reactivate=true'
- . '&pwg_token=' . get_pwg_token()
- . '&format=json'
- );
- }
-
- $upgrade_status = $extension->extract_plugin_files('upgrade', $revision, $extension_id);
- $extension_name = $extension->fs_plugins[$extension_id]['name'];
-
- if (isset($params['reactivate']))
- {
- $extension->perform_action('activate', $extension_id);
- }
- }
- elseif ($type == 'themes')
- {
- $upgrade_status = $extension->extract_theme_files('upgrade', $revision, $extension_id);
- $extension_name = $extension->fs_themes[$extension_id]['name'];
- }
- elseif ($type == 'languages')
- {
- $upgrade_status = $extension->extract_language_files('upgrade', $revision, $extension_id);
- $extension_name = $extension->fs_languages[$extension_id]['name'];
- }
-
- global $template;
- $template->delete_compiled_templates();
-
- switch ($upgrade_status)
- {
- case 'ok':
- return sprintf(l10n('%s has been successfully updated.'), $extension_name);
-
- case 'temp_path_error':
- return new PwgError(null, l10n('Can\'t create temporary file.'));
-
- case 'dl_archive_error':
- return new PwgError(null, l10n('Can\'t download archive.'));
-
- case 'archive_error':
- return new PwgError(null, l10n('Can\'t read or extract archive.'));
-
- default:
- return new PwgError(null, sprintf(l10n('An error occured during extraction (%s).'), $upgrade_status));
- }
-}
-
-function ws_extensions_ignoreupdate($params, &$service)
-{
- global $conf;
-
- define('IN_ADMIN', true);
- include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
-
- if (!is_webmaster())
- {
- return new PwgError(401, 'Access denied');
- }
-
- if (empty($params['pwg_token']) or get_pwg_token() != $params['pwg_token'])
- {
- return new PwgError(403, 'Invalid security token');
- }
-
- $conf['updates_ignored'] = unserialize($conf['updates_ignored']);
-
- // Reset ignored extension
- if ($params['reset'])
- {
- if (!empty($params['type']) and isset($conf['updates_ignored'][$params['type']]))
- {
- $conf['updates_ignored'][$params['type']] = array();
- }
- else
- {
- $conf['updates_ignored'] = array(
- 'plugins'=>array(),
- 'themes'=>array(),
- 'languages'=>array()
- );
- }
- conf_update_param('updates_ignored', pwg_db_real_escape_string(serialize($conf['updates_ignored'])));
- unset($_SESSION['extensions_need_update']);
- return true;
- }
-
- if (empty($params['id']) or empty($params['type']) or !in_array($params['type'], array('plugins', 'themes', 'languages')))
- {
- return new PwgError(403, 'Invalid parameters');
- }
-
- // Add or remove extension from ignore list
- if (!in_array($params['id'], $conf['updates_ignored'][$params['type']]))
- {
- array_push($conf['updates_ignored'][$params['type']], $params['id']);
- }
- conf_update_param('updates_ignored', pwg_db_real_escape_string(serialize($conf['updates_ignored'])));
- unset($_SESSION['extensions_need_update']);
- return true;
-}
-
-function ws_extensions_checkupdates($params, &$service)
-{
- global $conf;
-
- define('IN_ADMIN', true);
- include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
- include_once(PHPWG_ROOT_PATH.'admin/include/updates.class.php');
- $update = new updates();
-
- if (!is_admin())
- {
- return new PwgError(401, 'Access denied');
- }
-
- $result = array();
-
- if (!isset($_SESSION['need_update']))
- $update->check_piwigo_upgrade();
-
- $result['piwigo_need_update'] = $_SESSION['need_update'];
-
- $conf['updates_ignored'] = unserialize($conf['updates_ignored']);
-
- if (!isset($_SESSION['extensions_need_update']))
- $update->check_extensions();
- else
- $update->check_updated_extensions();
-
- if (!is_array($_SESSION['extensions_need_update']))
- $result['ext_need_update'] = null;
- else
- $result['ext_need_update'] = !empty($_SESSION['extensions_need_update']);
-
- return $result;
-}
-?>
+?> \ No newline at end of file
diff --git a/include/ws_functions/index.php b/include/ws_functions/index.php
new file mode 100644
index 000000000..c8de97f60
--- /dev/null
+++ b/include/ws_functions/index.php
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/include/ws_functions/pwg.categories.php b/include/ws_functions/pwg.categories.php
new file mode 100644
index 000000000..d77b88580
--- /dev/null
+++ b/include/ws_functions/pwg.categories.php
@@ -0,0 +1,838 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+/**
+ * API method
+ * Returns images per category
+ * @param mixed[] $params
+ * @option int[] cat_id (optional)
+ * @option bool recursive
+ * @option int per_page
+ * @option int page
+ * @option string order (optional)
+ */
+function ws_categories_getImages($params, &$service)
+{
+ global $user, $conf;
+
+ $images = array();
+
+ //------------------------------------------------- get the related categories
+ $where_clauses = array();
+ foreach ($params['cat_id'] as $cat_id)
+ {
+ if ($params['recursive'])
+ {
+ $where_clauses[] = 'uppercats '.DB_REGEX_OPERATOR.' \'(^|,)'.$cat_id.'(,|$)\'';
+ }
+ else
+ {
+ $where_clauses[] = 'id='.$cat_id;
+ }
+ }
+ if (!empty($where_clauses))
+ {
+ $where_clauses = array('('. implode("\n OR ", $where_clauses) . ')');
+ }
+ $where_clauses[] = get_sql_condition_FandF(
+ array('forbidden_categories' => 'id'),
+ null, true
+ );
+
+ $query = '
+SELECT id, name, permalink, image_order
+ FROM '. CATEGORIES_TABLE .'
+ WHERE '. implode("\n AND ", $where_clauses) .'
+;';
+ $result = pwg_query($query);
+
+ $cats = array();
+ while ($row = pwg_db_fetch_assoc($result))
+ {
+ $row['id'] = (int)$row['id'];
+ $cats[ $row['id'] ] = $row;
+ }
+
+ //-------------------------------------------------------- get the images
+ if (!empty($cats))
+ {
+ $where_clauses = ws_std_image_sql_filter($params, 'i.');
+ $where_clauses[] = 'category_id IN ('. implode(',', array_keys($cats)) .')';
+ $where_clauses[] = get_sql_condition_FandF(
+ array('visible_images' => 'i.id'),
+ null, true
+ );
+
+ $order_by = ws_std_image_sql_order($params, 'i.');
+ if ( empty($order_by)
+ and count($params['cat_id'])==1
+ and isset($cats[ $params['cat_id'][0] ]['image_order'])
+ )
+ {
+ $order_by = $cats[ $params['cat_id'][0] ]['image_order'];
+ }
+ $order_by = empty($order_by) ? $conf['order_by'] : 'ORDER BY '.$order_by;
+
+ $query = '
+SELECT i.*, GROUP_CONCAT(category_id) AS cat_ids
+ FROM '. IMAGES_TABLE .' i
+ INNER JOIN '. IMAGE_CATEGORY_TABLE .' ON i.id=image_id
+ WHERE '. implode("\n AND ", $where_clauses) .'
+ GROUP BY i.id
+ '. $order_by .'
+ LIMIT '. $params['per_page'] .'
+ OFFSET '. ($params['per_page']*$params['page']) .'
+;';
+ $result = pwg_query($query);
+
+ while ($row = pwg_db_fetch_assoc($result))
+ {
+ $image = array();
+ foreach (array('id', 'width', 'height', 'hit') as $k)
+ {
+ if (isset($row[$k]))
+ {
+ $image[$k] = (int)$row[$k];
+ }
+ }
+ foreach (array('file', 'name', 'comment', 'date_creation', 'date_available') as $k)
+ {
+ $image[$k] = $row[$k];
+ }
+ $image = array_merge($image, ws_std_get_urls($row));
+
+ $image_cats = array();
+ foreach (explode(',', $row['cat_ids']) as $cat_id)
+ {
+ $url = make_index_url(
+ array(
+ 'category' => $cats[$cat_id],
+ )
+ );
+ $page_url = make_picture_url(
+ array(
+ 'category' => $cats[$cat_id],
+ 'image_id' => $row['id'],
+ 'image_file' => $row['file'],
+ )
+ );
+ $image_cats[] = array(
+ 'id' => (int)$cat_id,
+ 'url' => $url,
+ 'page_url' => $page_url,
+ );
+ }
+
+ $image['categories'] = new PwgNamedArray(
+ $image_cats,
+ 'category',
+ array('id', 'url', 'page_url')
+ );
+ $images[] = $image;
+ }
+ }
+
+ return array(
+ 'paging' => new PwgNamedStruct(
+ array(
+ 'page' => $params['page'],
+ 'per_page' => $params['per_page'],
+ 'count' => count($images)
+ )
+ ),
+ 'images' => new PwgNamedArray(
+ $images, 'image',
+ ws_std_get_image_xml_attributes()
+ )
+ );
+}
+
+/**
+ * API method
+ * Returns a list of categories
+ * @param mixed[] $params
+ * @option int cat_id (optional)
+ * @option bool recursive
+ * @option bool public
+ * @option bool tree_output
+ * @option bool fullname
+ */
+function ws_categories_getList($params, &$service)
+{
+ global $user, $conf;
+
+ $where = array('1=1');
+ $join_type = 'INNER';
+ $join_user = $user['id'];
+
+ if (!$params['recursive'])
+ {
+ if ($params['cat_id']>0)
+ {
+ $where[] = '(
+ id_uppercat = '. (int)($params['cat_id']) .'
+ OR id='.(int)($params['cat_id']).'
+ )';
+ }
+ else
+ {
+ $where[] = 'id_uppercat IS NULL';
+ }
+ }
+ else if ($params['cat_id']>0)
+ {
+ $where[] = 'uppercats '. DB_REGEX_OPERATOR .' \'(^|,)'.
+ (int)($params['cat_id']) .'(,|$)\'';
+ }
+
+ if ($params['public'])
+ {
+ $where[] = 'status = "public"';
+ $where[] = 'visible = "true"';
+
+ $join_user = $conf['guest_id'];
+ }
+ else if (is_admin())
+ {
+ // in this very specific case, we don't want to hide empty
+ // categories. Function calculate_permissions will only return
+ // categories that are either locked or private and not permitted
+ //
+ // calculate_permissions does not consider empty categories as forbidden
+ $forbidden_categories = calculate_permissions($user['id'], $user['status']);
+ $where[]= 'id NOT IN ('.$forbidden_categories.')';
+ $join_type = 'LEFT';
+ }
+
+ $query = '
+SELECT
+ id, name, comment, permalink,
+ uppercats, global_rank, id_uppercat,
+ nb_images, count_images AS total_nb_images,
+ representative_picture_id, user_representative_picture_id, count_images, count_categories,
+ date_last, max_date_last, count_categories AS nb_categories
+ FROM '. CATEGORIES_TABLE .'
+ '.$join_type.' JOIN '. USER_CACHE_CATEGORIES_TABLE .'
+ ON id=cat_id AND user_id='.$join_user.'
+ WHERE '. implode("\n AND ", $where) .'
+;';
+ $result = pwg_query($query);
+
+ // management of the album thumbnail -- starts here
+ $image_ids = array();
+ $categories = array();
+ $user_representative_updates_for = array();
+ // management of the album thumbnail -- stops here
+
+ $cats = array();
+ while ($row = pwg_db_fetch_assoc($result))
+ {
+ $row['url'] = make_index_url(
+ array(
+ 'category' => $row
+ )
+ );
+ foreach (array('id','nb_images','total_nb_images','nb_categories') as $key)
+ {
+ $row[$key] = (int)$row[$key];
+ }
+
+ if ($params['fullname'])
+ {
+ $row['name'] = strip_tags(get_cat_display_name_cache($row['uppercats'], null));
+ }
+ else
+ {
+ $row['name'] = strip_tags(
+ trigger_event(
+ 'render_category_name',
+ $row['name'],
+ 'ws_categories_getList'
+ )
+ );
+ }
+
+ $row['comment'] = strip_tags(
+ trigger_event(
+ 'render_category_description',
+ $row['comment'],
+ 'ws_categories_getList'
+ )
+ );
+
+ // management of the album thumbnail -- starts here
+ //
+ // on branch 2.3, the algorithm is duplicated from
+ // include/category_cats, but we should use a common code for Piwigo 2.4
+ //
+ // warning : if the API method is called with $params['public'], the
+ // album thumbnail may be not accurate. The thumbnail can be viewed by
+ // the connected user, but maybe not by the guest. Changing the
+ // filtering method would be too complicated for now. We will simply
+ // avoid to persist the user_representative_picture_id in the database
+ // if $params['public']
+ if (!empty($row['user_representative_picture_id']))
+ {
+ $image_id = $row['user_representative_picture_id'];
+ }
+ else if (!empty($row['representative_picture_id']))
+ { // if a representative picture is set, it has priority
+ $image_id = $row['representative_picture_id'];
+ }
+ else if ($conf['allow_random_representative'])
+ {
+ // searching a random representant among elements in sub-categories
+ $image_id = get_random_image_in_category($row);
+ }
+ else
+ { // searching a random representant among representant of sub-categories
+ if ($row['count_categories']>0 and $row['count_images']>0)
+ {
+ $query = '
+SELECT representative_picture_id
+ FROM '. CATEGORIES_TABLE .'
+ INNER JOIN '. USER_CACHE_CATEGORIES_TABLE .'
+ ON id=cat_id AND user_id='.$user['id'].'
+ WHERE uppercats LIKE \''.$row['uppercats'].',%\'
+ AND representative_picture_id IS NOT NULL
+ '.get_sql_condition_FandF(
+ array('visible_categories' => 'id'),
+ "\n AND"
+ ).'
+ ORDER BY '. DB_RANDOM_FUNCTION .'()
+ LIMIT 1
+;';
+ $subresult = pwg_query($query);
+
+ if (pwg_db_num_rows($subresult) > 0)
+ {
+ list($image_id) = pwg_db_fetch_row($subresult);
+ }
+ }
+ }
+
+ if (isset($image_id))
+ {
+ if ($conf['representative_cache_on_subcats'] and $row['user_representative_picture_id'] != $image_id)
+ {
+ $user_representative_updates_for[ $row['id'] ] = $image_id;
+ }
+
+ $row['representative_picture_id'] = $image_id;
+ $image_ids[] = $image_id;
+ $categories[] = $row;
+ }
+ unset($image_id);
+ // management of the album thumbnail -- stops here
+
+ $cats[] = $row;
+ }
+ usort($cats, 'global_rank_compare');
+
+ // management of the album thumbnail -- starts here
+ if (count($categories) > 0)
+ {
+ $thumbnail_src_of = array();
+ $new_image_ids = array();
+
+ $query = '
+SELECT id, path, representative_ext, level
+ FROM '. IMAGES_TABLE .'
+ WHERE id IN ('. implode(',', $image_ids) .')
+;';
+ $result = pwg_query($query);
+
+ while ($row = pwg_db_fetch_assoc($result))
+ {
+ if ($row['level'] <= $user['level'])
+ {
+ $thumbnail_src_of[$row['id']] = DerivativeImage::thumb_url($row);
+ }
+ else
+ {
+ // problem: we must not display the thumbnail of a photo which has a
+ // higher privacy level than user privacy level
+ //
+ // * what is the represented category?
+ // * find a random photo matching user permissions
+ // * register it at user_representative_picture_id
+ // * set it as the representative_picture_id for the category
+ foreach ($categories as &$category)
+ {
+ if ($row['id'] == $category['representative_picture_id'])
+ {
+ // searching a random representant among elements in sub-categories
+ $image_id = get_random_image_in_category($category);
+
+ if (isset($image_id) and !in_array($image_id, $image_ids))
+ {
+ $new_image_ids[] = $image_id;
+ }
+ if ($conf['representative_cache_on_level'])
+ {
+ $user_representative_updates_for[ $category['id'] ] = $image_id;
+ }
+
+ $category['representative_picture_id'] = $image_id;
+ }
+ }
+ unset($category);
+ }
+ }
+
+ if (count($new_image_ids) > 0)
+ {
+ $query = '
+SELECT id, path, representative_ext
+ FROM '. IMAGES_TABLE .'
+ WHERE id IN ('. implode(',', $new_image_ids) .')
+;';
+ $result = pwg_query($query);
+
+ while ($row = pwg_db_fetch_assoc($result))
+ {
+ $thumbnail_src_of[ $row['id'] ] = DerivativeImage::thumb_url($row);
+ }
+ }
+ }
+
+ // compared to code in include/category_cats, we only persist the new
+ // user_representative if we have used $user['id'] and not the guest id,
+ // or else the real guest may see thumbnail that he should not
+ if (!$params['public'] and count($user_representative_updates_for))
+ {
+ $updates = array();
+
+ foreach ($user_representative_updates_for as $cat_id => $image_id)
+ {
+ $updates[] = array(
+ 'user_id' => $user['id'],
+ 'cat_id' => $cat_id,
+ 'user_representative_picture_id' => $image_id,
+ );
+ }
+
+ mass_updates(
+ USER_CACHE_CATEGORIES_TABLE,
+ array(
+ 'primary' => array('user_id', 'cat_id'),
+ 'update' => array('user_representative_picture_id')
+ ),
+ $updates
+ );
+ }
+
+ foreach ($cats as &$cat)
+ {
+ foreach ($categories as $category)
+ {
+ if ($category['id'] == $cat['id'] and isset($category['representative_picture_id']))
+ {
+ $cat['tn_url'] = $thumbnail_src_of[$category['representative_picture_id']];
+ }
+ }
+ // we don't want them in the output
+ unset($cat['user_representative_picture_id'], $cat['count_images'], $cat['count_categories']);
+ }
+ unset($cat);
+ // management of the album thumbnail -- stops here
+
+ if ($params['tree_output'])
+ {
+ $cats = categories_flatlist_to_tree($cats);
+ }
+
+ return array(
+ 'categories' => new PwgNamedArray(
+ $cats,
+ 'category',
+ ws_std_get_category_xml_attributes()
+ )
+ );
+}
+
+/**
+ * API method
+ * Returns the list of categories as you can see them in administration
+ * @param mixed[] $params
+ *
+ * Only admin can run this method and permissions are not taken into
+ * account.
+ */
+function ws_categories_getAdminList($params, &$service)
+{
+ $query = '
+SELECT category_id, COUNT(*) AS counter
+ FROM '. IMAGE_CATEGORY_TABLE .'
+ GROUP BY category_id
+;';
+ $nb_images_of = simple_hash_from_query($query, 'category_id', 'counter');
+
+ $query = '
+SELECT id, name, comment, uppercats, global_rank
+ FROM '. CATEGORIES_TABLE .'
+;';
+ $result = pwg_query($query);
+
+ $cats = array();
+ while ($row = pwg_db_fetch_assoc($result))
+ {
+ $id = $row['id'];
+ $row['nb_images'] = isset($nb_images_of[$id]) ? $nb_images_of[$id] : 0;
+
+ $row['name'] = strip_tags(
+ trigger_event(
+ 'render_category_name',
+ $row['name'],
+ 'ws_categories_getAdminList'
+ )
+ );
+ $row['comment'] = strip_tags(
+ trigger_event(
+ 'render_category_description',
+ $row['comment'],
+ 'ws_categories_getAdminList'
+ )
+ );
+
+ $cats[] = $row;
+ }
+
+ usort($cats, 'global_rank_compare');
+ return array(
+ 'categories' => new PwgNamedArray(
+ $cats,
+ 'category',
+ array('id', 'nb_images', 'name', 'uppercats', 'global_rank')
+ )
+ );
+}
+
+/**
+ * API method
+ * Adds a category
+ * @param mixed[] $params
+ * @option string name
+ * @option int parent (optional)
+ * @option string comment (optional)
+ * @option bool visible
+ * @option string status (optional)
+ * @option bool commentable
+ */
+function ws_categories_add($params, &$service)
+{
+ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+ $options = array();
+ if (!empty($params['status']) and in_array($params['status'], array('private','public')))
+ {
+ $options['status'] = $params['status'];
+ }
+
+ if (!empty($params['comment']))
+ {
+ $options['comment'] = $params['comment'];
+ }
+
+ $creation_output = create_virtual_category(
+ $params['name'],
+ $params['parent'],
+ $options
+ );
+
+ if (isset($creation_output['error']))
+ {
+ return new PwgError(500, $creation_output['error']);
+ }
+
+ invalidate_user_cache();
+
+ return $creation_output;
+}
+
+/**
+ * API method
+ * Sets details of a category
+ * @param mixed[] $params
+ * @option int cat_id
+ * @option string name (optional)
+ * @option string comment (optional)
+ */
+function ws_categories_setInfo($params, &$service)
+{
+ $update = array(
+ 'id' => $params['category_id'],
+ );
+
+ $info_columns = array('name', 'comment',);
+
+ $perform_update = false;
+ foreach ($info_columns as $key)
+ {
+ if (isset($params[$key]))
+ {
+ $perform_update = true;
+ $update[$key] = $params[$key];
+ }
+ }
+
+ if ($perform_update)
+ {
+ single_update(
+ CATEGORIES_TABLE,
+ $update,
+ array('id' => $update['id'])
+ );
+ }
+}
+
+/**
+ * API method
+ * Sets representative image of a category
+ * @param mixed[] $params
+ * @option int category_id
+ * @option int image_id
+ */
+function ws_categories_setRepresentative($params, &$service)
+{
+ // does the category really exist?
+ $query = '
+SELECT COUNT(*)
+ FROM '. CATEGORIES_TABLE .'
+ WHERE id = '. $params['category_id'] .'
+;';
+ list($count) = pwg_db_fetch_row(pwg_query($query));
+ if ($count == 0)
+ {
+ return new PwgError(404, 'category_id not found');
+ }
+
+ // does the image really exist?
+ $query = '
+SELECT COUNT(*)
+ FROM '. IMAGES_TABLE .'
+ WHERE id = '. $params['image_id'] .'
+;';
+ list($count) = pwg_db_fetch_row(pwg_query($query));
+ if ($count == 0)
+ {
+ return new PwgError(404, 'image_id not found');
+ }
+
+ // apply change
+ $query = '
+UPDATE '. CATEGORIES_TABLE .'
+ SET representative_picture_id = '. $params['image_id'] .'
+ WHERE id = '. $params['category_id'] .'
+;';
+ pwg_query($query);
+
+ $query = '
+UPDATE '. USER_CACHE_CATEGORIES_TABLE .'
+ SET user_representative_picture_id = NULL
+ WHERE cat_id = '. $params['category_id'] .'
+;';
+ pwg_query($query);
+}
+
+/**
+ * API method
+ * Deletes a category
+ * @param mixed[] $params
+ * @option string|int[] category_id
+ * @option string photo_deletion_mode
+ * @option string pwg_token
+ */
+function ws_categories_delete($params, &$service)
+{
+ if (get_pwg_token() != $params['pwg_token'])
+ {
+ return new PwgError(403, 'Invalid security token');
+ }
+
+ $modes = array('no_delete', 'delete_orphans', 'force_delete');
+ if (!in_array($params['photo_deletion_mode'], $modes))
+ {
+ return new PwgError(500,
+ '[ws_categories_delete]'
+ .' invalid parameter photo_deletion_mode "'.$params['photo_deletion_mode'].'"'
+ .', possible values are {'.implode(', ', $modes).'}.'
+ );
+ }
+
+ if (!is_array($params['category_id']))
+ {
+ $params['category_id'] = preg_split(
+ '/[\s,;\|]/',
+ $params['category_id'],
+ -1,
+ PREG_SPLIT_NO_EMPTY
+ );
+ }
+ $params['category_id'] = array_map('intval', $params['category_id']);
+
+ $category_ids = array();
+ foreach ($params['category_id'] as $category_id)
+ {
+ if ($category_id > 0)
+ {
+ $category_ids[] = $category_id;
+ }
+ }
+
+ if (count($category_ids) == 0)
+ {
+ return;
+ }
+
+ $query = '
+SELECT id
+ FROM '. CATEGORIES_TABLE .'
+ WHERE id IN ('. implode(',', $category_ids) .')
+;';
+ $category_ids = array_from_query($query, 'id');
+
+ if (count($category_ids) == 0)
+ {
+ return;
+ }
+
+ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+ delete_categories($category_ids, $params['photo_deletion_mode']);
+ update_global_rank();
+}
+
+/**
+ * API method
+ * Moves a category
+ * @param mixed[] $params
+ * @option string|int[] category_id
+ * @option int parent
+ * @option string pwg_token
+ */
+function ws_categories_move($params, &$service)
+{
+ global $page;
+
+ if (get_pwg_token() != $params['pwg_token'])
+ {
+ return new PwgError(403, 'Invalid security token');
+ }
+
+ if (!is_array($params['category_id']))
+ {
+ $params['category_id'] = preg_split(
+ '/[\s,;\|]/',
+ $params['category_id'],
+ -1,
+ PREG_SPLIT_NO_EMPTY
+ );
+ }
+ $params['category_id'] = array_map('intval', $params['category_id']);
+
+ $category_ids = array();
+ foreach ($params['category_id'] as $category_id)
+ {
+ if ($category_id > 0)
+ {
+ $category_ids[] = $category_id;
+ }
+ }
+
+ if (count($category_ids) == 0)
+ {
+ return new PwgError(403, 'Invalid category_id input parameter, no category to move');
+ }
+
+ // we can't move physical categories
+ $categories_in_db = array();
+
+ $query = '
+SELECT id, name, dir
+ FROM '. CATEGORIES_TABLE .'
+ WHERE id IN ('. implode(',', $category_ids) .')
+;';
+ $result = pwg_query($query);
+ while ($row = pwg_db_fetch_assoc($result))
+ {
+ $categories_in_db[ $row['id'] ] = $row;
+
+ // we break on error at first physical category detected
+ if (!empty($row['dir']))
+ {
+ $row['name'] = strip_tags(
+ trigger_event(
+ 'render_category_name',
+ $row['name'],
+ 'ws_categories_move'
+ )
+ );
+
+ return new PwgError(403,
+ sprintf(
+ 'Category %s (%u) is not a virtual category, you cannot move it',
+ $row['name'],
+ $row['id']
+ )
+ );
+ }
+ }
+
+ if (count($categories_in_db) != count($category_ids))
+ {
+ $unknown_category_ids = array_diff($category_ids, array_keys($categories_in_db));
+
+ return new PwgError(403,
+ sprintf(
+ 'Category %u does not exist',
+ $unknown_category_ids[0]
+ )
+ );
+ }
+
+ // does this parent exists? This check should be made in the
+ // move_categories function, not here
+ // 0 as parent means "move categories at gallery root"
+ if (0 != $params['parent'])
+ {
+ $subcat_ids = get_subcat_ids(array($params['parent']));
+ if (count($subcat_ids) == 0)
+ {
+ return new PwgError(403, 'Unknown parent category id');
+ }
+ }
+
+ $page['infos'] = array();
+ $page['errors'] = array();
+
+ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+ move_categories($category_ids, $params['parent']);
+ invalidate_user_cache();
+
+ if (count($page['errors']) != 0)
+ {
+ return new PwgError(403, implode('; ', $page['errors']));
+ }
+}
+
+?> \ No newline at end of file
diff --git a/include/ws_functions/pwg.extensions.php b/include/ws_functions/pwg.extensions.php
new file mode 100644
index 000000000..a1c8ae1b8
--- /dev/null
+++ b/include/ws_functions/pwg.extensions.php
@@ -0,0 +1,343 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+/**
+ * API method
+ * Returns the list of all plugins
+ * @param mixed[] $params
+ */
+function ws_plugins_getList($params, &$service)
+{
+ include_once(PHPWG_ROOT_PATH.'admin/include/plugins.class.php');
+
+ $plugins = new plugins();
+ $plugins->sort_fs_plugins('name');
+ $plugin_list = array();
+
+ foreach ($plugins->fs_plugins as $plugin_id => $fs_plugin)
+ {
+ if (isset($plugins->db_plugins_by_id[$plugin_id]))
+ {
+ $state = $plugins->db_plugins_by_id[$plugin_id]['state'];
+ }
+ else
+ {
+ $state = 'uninstalled';
+ }
+
+ $plugin_list[] = array(
+ 'id' => $plugin_id,
+ 'name' => $fs_plugin['name'],
+ 'version' => $fs_plugin['version'],
+ 'state' => $state,
+ 'description' => $fs_plugin['description'],
+ );
+ }
+
+ return $plugin_list;
+}
+
+/**
+ * API method
+ * Performs an action on a plugin
+ * @param mixed[] $params
+ * @option string action
+ * @option string plugin
+ * @option string pwg_token
+ */
+function ws_plugins_performAction($params, &$service)
+{
+ global $template;
+
+ if (get_pwg_token() != $params['pwg_token'])
+ {
+ return new PwgError(403, 'Invalid security token');
+ }
+
+ define('IN_ADMIN', true);
+ include_once(PHPWG_ROOT_PATH.'admin/include/plugins.class.php');
+
+ $plugins = new plugins();
+ $errors = $plugins->perform_action($params['action'], $params['plugin']);
+
+ if (!empty($errors))
+ {
+ return new PwgError(500, $errors);
+ }
+ else
+ {
+ if (in_array($params['action'], array('activate', 'deactivate')))
+ {
+ $template->delete_compiled_templates();
+ }
+ return true;
+ }
+}
+
+/**
+ * API method
+ * Performs an action on a theme
+ * @param mixed[] $params
+ * @option string action
+ * @option string theme
+ * @option string pwg_token
+ */
+function ws_themes_performAction($params, &$service)
+{
+ global $template;
+
+ if (get_pwg_token() != $params['pwg_token'])
+ {
+ return new PwgError(403, 'Invalid security token');
+ }
+
+ define('IN_ADMIN', true);
+ include_once(PHPWG_ROOT_PATH.'admin/include/themes.class.php');
+
+ $themes = new themes();
+ $errors = $themes->perform_action($params['action'], $params['theme']);
+
+ if (!empty($errors))
+ {
+ return new PwgError(500, $errors);
+ }
+ else
+ {
+ if (in_array($params['action'], array('activate', 'deactivate')))
+ {
+ $template->delete_compiled_templates();
+ }
+ return true;
+ }
+}
+
+/**
+ * API method
+ * Updates an extension
+ * @param mixed[] $params
+ * @option string type
+ * @option string id
+ * @option string revision
+ * @option string pwg_token
+ * @option bool reactivate (optional - undocumented)
+ */
+function ws_extensions_update($params, &$service)
+{
+ if (!is_webmaster())
+ {
+ return new PwgError(401, l10n('Webmaster status is required.'));
+ }
+
+ if (get_pwg_token() != $params['pwg_token'])
+ {
+ return new PwgError(403, 'Invalid security token');
+ }
+
+ if (!in_array($params['type'], array('plugins', 'themes', 'languages')))
+ {
+ return new PwgError(403, "invalid extension type");
+ }
+
+ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+ include_once(PHPWG_ROOT_PATH.'admin/include/'.$params['type'].'.class.php');
+
+ $type = $params['type'];
+ $extension_id = $params['id'];
+ $revision = $params['revision'];
+
+ $extension = new $type();
+
+ if ($type == 'plugins')
+ {
+ if (
+ isset($extension->db_plugins_by_id[$extension_id])
+ and $extension->db_plugins_by_id[$extension_id]['state'] == 'active'
+ )
+ {
+ $extension->perform_action('deactivate', $extension_id);
+
+ redirect(PHPWG_ROOT_PATH
+ . 'ws.php'
+ . '?method=pwg.extensions.update'
+ . '&type=plugins'
+ . '&id=' . $extension_id
+ . '&revision=' . $revision
+ . '&reactivate=true'
+ . '&pwg_token=' . get_pwg_token()
+ . '&format=json'
+ );
+ }
+
+ $upgrade_status = $extension->extract_plugin_files('upgrade', $revision, $extension_id);
+ $extension_name = $extension->fs_plugins[$extension_id]['name'];
+
+ if (isset($params['reactivate']))
+ {
+ $extension->perform_action('activate', $extension_id);
+ }
+ }
+ else if ($type == 'themes')
+ {
+ $upgrade_status = $extension->extract_theme_files('upgrade', $revision, $extension_id);
+ $extension_name = $extension->fs_themes[$extension_id]['name'];
+ }
+ else if ($type == 'languages')
+ {
+ $upgrade_status = $extension->extract_language_files('upgrade', $revision, $extension_id);
+ $extension_name = $extension->fs_languages[$extension_id]['name'];
+ }
+
+ global $template;
+ $template->delete_compiled_templates();
+
+ switch ($upgrade_status)
+ {
+ case 'ok':
+ return l10n('%s has been successfully updated.', $extension_name);
+
+ case 'temp_path_error':
+ return new PwgError(null, l10n('Can\'t create temporary file.'));
+
+ case 'dl_archive_error':
+ return new PwgError(null, l10n('Can\'t download archive.'));
+
+ case 'archive_error':
+ return new PwgError(null, l10n('Can\'t read or extract archive.'));
+
+ default:
+ return new PwgError(null, l10n('An error occured during extraction (%s).', $upgrade_status));
+ }
+}
+
+/**
+ * API method
+ * Ignore an update
+ * @param mixed[] $params
+ * @option string type (optional)
+ * @option string id (optional)
+ * @option bool reset
+ * @option string pwg_token
+ */
+function ws_extensions_ignoreupdate($params, &$service)
+{
+ global $conf;
+
+ define('IN_ADMIN', true);
+ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+ if (!is_webmaster())
+ {
+ return new PwgError(401, 'Access denied');
+ }
+
+ if (get_pwg_token() != $params['pwg_token'])
+ {
+ return new PwgError(403, 'Invalid security token');
+ }
+
+ $conf['updates_ignored'] = unserialize($conf['updates_ignored']);
+
+ // Reset ignored extension
+ if ($params['reset'])
+ {
+ if (!empty($params['type']) and isset($conf['updates_ignored'][ $params['type'] ]))
+ {
+ $conf['updates_ignored'][$params['type']] = array();
+ }
+ else
+ {
+ $conf['updates_ignored'] = array(
+ 'plugins'=>array(),
+ 'themes'=>array(),
+ 'languages'=>array()
+ );
+ }
+
+ conf_update_param('updates_ignored', pwg_db_real_escape_string(serialize($conf['updates_ignored'])));
+ unset($_SESSION['extensions_need_update']);
+ return true;
+ }
+
+ if (empty($params['id']) or empty($params['type']) or !in_array($params['type'], array('plugins', 'themes', 'languages')))
+ {
+ return new PwgError(403, 'Invalid parameters');
+ }
+
+ // Add or remove extension from ignore list
+ if (!in_array($params['id'], $conf['updates_ignored'][ $params['type'] ]))
+ {
+ $conf['updates_ignored'][ $params['type'] ][] = $params['id'];
+ }
+
+ conf_update_param('updates_ignored', pwg_db_real_escape_string(serialize($conf['updates_ignored'])));
+ unset($_SESSION['extensions_need_update']);
+ return true;
+}
+
+/**
+ * API method
+ * Checks for updates (core and extensions)
+ * @param mixed[] $params
+ */
+function ws_extensions_checkupdates($params, &$service)
+{
+ global $conf;
+
+ define('IN_ADMIN', true);
+ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+ include_once(PHPWG_ROOT_PATH.'admin/include/updates.class.php');
+
+ $update = new updates();
+ $result = array();
+
+ if (!isset($_SESSION['need_update']))
+ {
+ $update->check_piwigo_upgrade();
+ }
+
+ $result['piwigo_need_update'] = $_SESSION['need_update'];
+
+ $conf['updates_ignored'] = unserialize($conf['updates_ignored']);
+
+ if (!isset($_SESSION['extensions_need_update']))
+ {
+ $update->check_extensions();
+ }
+ else
+ {
+ $update->check_updated_extensions();
+ }
+
+ if (!is_array($_SESSION['extensions_need_update']))
+ {
+ $result['ext_need_update'] = null;
+ }
+ else
+ {
+ $result['ext_need_update'] = !empty($_SESSION['extensions_need_update']);
+ }
+
+ return $result;
+}
+
+?> \ No newline at end of file
diff --git a/include/ws_functions/pwg.groups.php b/include/ws_functions/pwg.groups.php
new file mode 100644
index 000000000..773623eaf
--- /dev/null
+++ b/include/ws_functions/pwg.groups.php
@@ -0,0 +1,293 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+/**
+ * API method
+ * Returns the list of groups
+ * @param mixed[] $params
+ * @option int[] group_id (optional)
+ * @option string name (optional)
+ */
+function ws_groups_getList($params, &$service)
+{
+ $where_clauses = array('1=1');
+
+ if (!empty($params['name']))
+ {
+ $where_clauses[] = 'LOWER(name) LIKE \''. pwg_db_real_escape_string($params['name']) .'\'';
+ }
+
+ if (!empty($params['group_id']))
+ {
+ $where_clauses[] = 'id IN('. implode(',', $params['group_id']) .')';
+ }
+
+ $query = '
+SELECT
+ g.*, COUNT(user_id) AS nb_users
+ FROM '. GROUPS_TABLE .' AS g
+ LEFT JOIN '. USER_GROUP_TABLE .' AS ug
+ ON ug.group_id = g.id
+ WHERE '. implode(' AND ', $where_clauses) .'
+ GROUP BY id
+ ORDER BY '. $params['order'] .'
+ LIMIT '. $params['per_page'] .'
+ OFFSET '. ($params['per_page']*$params['page']) .'
+;';
+
+ $groups = array_from_query($query);
+
+ return array(
+ 'paging' => new PwgNamedStruct(array(
+ 'page' => $params['page'],
+ 'per_page' => $params['per_page'],
+ 'count' => count($groups)
+ )),
+ 'groups' => new PwgNamedArray($groups, 'group')
+ );
+}
+
+/**
+ * API method
+ * Adds a group
+ * @param mixed[] $params
+ * @option string name
+ * @option bool is_default
+ */
+function ws_groups_add($params, &$service)
+{
+ $params['name'] = pwg_db_real_escape_string($params['name']);
+
+ // is the name not already used ?
+ $query = '
+SELECT COUNT(*)
+ FROM '.GROUPS_TABLE.'
+ WHERE name = \''.$params['name'].'\'
+;';
+ list($count) = pwg_db_fetch_row(pwg_query($query));
+ if ($count != 0)
+ {
+ return new PwgError(WS_ERR_INVALID_PARAM, 'This name is already used by another group.');
+ }
+
+ // creating the group
+ single_insert(
+ GROUPS_TABLE,
+ array(
+ 'name' => $params['name'],
+ 'is_default' => boolean_to_string($params['is_default']),
+ )
+ );
+
+ return $service->invoke('pwg.groups.getList', array('group_id' => pwg_db_insert_id()));
+}
+
+/**
+ * API method
+ * Deletes a group
+ * @param mixed[] $params
+ * @option int[] group_id
+ * @option string pwg_token
+ */
+function ws_groups_delete($params, &$service)
+{
+ if (get_pwg_token() != $params['pwg_token'])
+ {
+ return new PwgError(403, 'Invalid security token');
+ }
+
+ $group_id_string = implode(',', $params['group_id']);
+
+ // destruction of the access linked to the group
+ $query = '
+DELETE
+ FROM '. GROUP_ACCESS_TABLE .'
+ WHERE group_id IN('. $group_id_string .')
+;';
+ pwg_query($query);
+
+ // destruction of the users links for this group
+ $query = '
+DELETE
+ FROM '. USER_GROUP_TABLE .'
+ WHERE group_id IN('. $group_id_string .')
+;';
+ pwg_query($query);
+
+ $query = '
+SELECT name
+ FROM '. GROUPS_TABLE .'
+ WHERE id IN('. $group_id_string .')
+;';
+ $groupnames = array_from_query($query, 'name');
+
+ // destruction of the group
+ $query = '
+DELETE
+ FROM '. GROUPS_TABLE .'
+ WHERE id IN('. $group_id_string .')
+;';
+ pwg_query($query);
+
+ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+ invalidate_user_cache();
+
+ return new PwgNamedArray($groupnames, 'group_deleted');
+}
+
+/**
+ * API method
+ * Updates a group
+ * @param mixed[] $params
+ * @option int group_id
+ * @option string name (optional)
+ * @option bool is_default (optional)
+ */
+function ws_groups_setInfo($params, &$service)
+{
+ $updates = array();
+
+ // does the group exist ?
+ $query = '
+SELECT COUNT(*)
+ FROM '. GROUPS_TABLE .'
+ WHERE id = '. $params['group_id'] .'
+;';
+ list($count) = pwg_db_fetch_row(pwg_query($query));
+ if ($count == 0)
+ {
+ return new PwgError(WS_ERR_INVALID_PARAM, 'This group does not exist.');
+ }
+
+ if (!empty($params['name']))
+ {
+ $params['name'] = pwg_db_real_escape_string($params['name']);
+
+ // is the name not already used ?
+ $query = '
+SELECT COUNT(*)
+ FROM '. GROUPS_TABLE .'
+ WHERE name = \''. $params['name'] .'\'
+;';
+ list($count) = pwg_db_fetch_row(pwg_query($query));
+ if ($count != 0)
+ {
+ return new PwgError(WS_ERR_INVALID_PARAM, 'This name is already used by another group.');
+ }
+
+ $updates['name'] = $params['name'];
+ }
+
+ if (!empty($params['is_default']) or @$params['is_default']===false)
+ {
+ $updates['is_default'] = boolean_to_string($params['is_default']);
+ }
+
+ single_update(
+ GROUPS_TABLE,
+ $updates,
+ array('id' => $params['group_id'])
+ );
+
+ return $service->invoke('pwg.groups.getList', array('group_id' => $params['group_id']));
+}
+
+/**
+ * API method
+ * Adds user(s) to a group
+ * @param mixed[] $params
+ * @option int group_id
+ * @option int[] user_id
+ */
+function ws_groups_addUser($params, &$service)
+{
+ // does the group exist ?
+ $query = '
+SELECT COUNT(*)
+ FROM '. GROUPS_TABLE .'
+ WHERE id = '. $params['group_id'] .'
+;';
+ list($count) = pwg_db_fetch_row(pwg_query($query));
+ if ($count == 0)
+ {
+ return new PwgError(WS_ERR_INVALID_PARAM, 'This group does not exist.');
+ }
+
+ $inserts = array();
+ foreach ($params['user_id'] as $user_id)
+ {
+ $inserts[] = array(
+ 'group_id' => $params['group_id'],
+ 'user_id' => $user_id,
+ );
+ }
+
+ mass_inserts(
+ USER_GROUP_TABLE,
+ array('group_id', 'user_id'),
+ $inserts,
+ array('ignore'=>true)
+ );
+
+ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+ invalidate_user_cache();
+
+ return $service->invoke('pwg.groups.getList', array('group_id' => $params['group_id']));
+}
+
+/**
+ * API method
+ * Removes user(s) from a group
+ * @param mixed[] $params
+ * @option int group_id
+ * @option int[] user_id
+ */
+function ws_groups_deleteUser($params, &$service)
+{
+ // does the group exist ?
+ $query = '
+SELECT COUNT(*)
+ FROM '. GROUPS_TABLE .'
+ WHERE id = '. $params['group_id'] .'
+;';
+ list($count) = pwg_db_fetch_row(pwg_query($query));
+ if ($count == 0)
+ {
+ return new PwgError(WS_ERR_INVALID_PARAM, 'This group does not exist.');
+ }
+
+ $query = '
+DELETE FROM '. USER_GROUP_TABLE .'
+ WHERE
+ group_id = '. $params['group_id'] .'
+ AND user_id IN('. implode(',', $params['user_id']) .')
+;';
+ pwg_query($query);
+
+ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+ invalidate_user_cache();
+
+ return $service->invoke('pwg.groups.getList', array('group_id' => $params['group_id']));
+}
+
+?> \ No newline at end of file
diff --git a/include/ws_functions/pwg.images.php b/include/ws_functions/pwg.images.php
new file mode 100644
index 000000000..6eebd4482
--- /dev/null
+++ b/include/ws_functions/pwg.images.php
@@ -0,0 +1,1582 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+// +-----------------------------------------------------------------------+
+// | UTILITIES |
+// +-----------------------------------------------------------------------+
+
+/**
+ * Sets associations of an image
+ * @param int $image_id
+ * @param string $categories_string - "cat_id[,rank];cat_id[,rank]"
+ * @param bool $replace_mode - removes old associations
+ */
+function ws_add_image_category_relations($image_id, $categories_string, $replace_mode=false)
+{
+ // let's add links between the image and the categories
+ //
+ // $params['categories'] should look like 123,12;456,auto;789 which means:
+ //
+ // 1. associate with category 123 on rank 12
+ // 2. associate with category 456 on automatic rank
+ // 3. associate with category 789 on automatic rank
+ $cat_ids = array();
+ $rank_on_category = array();
+ $search_current_ranks = false;
+
+ $tokens = explode(';', $categories_string);
+ foreach ($tokens as $token)
+ {
+ @list($cat_id, $rank) = explode(',', $token);
+
+ if (!preg_match('/^\d+$/', $cat_id))
+ {
+ continue;
+ }
+
+ $cat_ids[] = $cat_id;
+
+ if (!isset($rank))
+ {
+ $rank = 'auto';
+ }
+ $rank_on_category[$cat_id] = $rank;
+
+ if ($rank == 'auto')
+ {
+ $search_current_ranks = true;
+ }
+ }
+
+ $cat_ids = array_unique($cat_ids);
+
+ if (count($cat_ids) == 0)
+ {
+ return new PwgError(500,
+ '[ws_add_image_category_relations] there is no category defined in "'.$categories_string.'"'
+ );
+ }
+
+ $query = '
+SELECT id
+ FROM '.CATEGORIES_TABLE.'
+ WHERE id IN ('.implode(',', $cat_ids).')
+;';
+ $db_cat_ids = array_from_query($query, 'id');
+
+ $unknown_cat_ids = array_diff($cat_ids, $db_cat_ids);
+ if (count($unknown_cat_ids) != 0)
+ {
+ return new PwgError(500,
+ '[ws_add_image_category_relations] the following categories are unknown: '.implode(', ', $unknown_cat_ids)
+ );
+ }
+
+ $to_update_cat_ids = array();
+
+ // in case of replace mode, we first check the existing associations
+ $query = '
+SELECT category_id
+ FROM '.IMAGE_CATEGORY_TABLE.'
+ WHERE image_id = '.$image_id.'
+;';
+ $existing_cat_ids = array_from_query($query, 'category_id');
+
+ if ($replace_mode)
+ {
+ $to_remove_cat_ids = array_diff($existing_cat_ids, $cat_ids);
+ if (count($to_remove_cat_ids) > 0)
+ {
+ $query = '
+DELETE
+ FROM '.IMAGE_CATEGORY_TABLE.'
+ WHERE image_id = '.$image_id.'
+ AND category_id IN ('.implode(', ', $to_remove_cat_ids).')
+;';
+ pwg_query($query);
+ update_category($to_remove_cat_ids);
+ }
+ }
+
+ $new_cat_ids = array_diff($cat_ids, $existing_cat_ids);
+ if (count($new_cat_ids) == 0)
+ {
+ return true;
+ }
+
+ if ($search_current_ranks)
+ {
+ $query = '
+SELECT category_id, MAX(rank) AS max_rank
+ FROM '.IMAGE_CATEGORY_TABLE.'
+ WHERE rank IS NOT NULL
+ AND category_id IN ('.implode(',', $new_cat_ids).')
+ GROUP BY category_id
+;';
+ $current_rank_of = simple_hash_from_query(
+ $query,
+ 'category_id',
+ 'max_rank'
+ );
+
+ foreach ($new_cat_ids as $cat_id)
+ {
+ if (!isset($current_rank_of[$cat_id]))
+ {
+ $current_rank_of[$cat_id] = 0;
+ }
+
+ if ('auto' == $rank_on_category[$cat_id])
+ {
+ $rank_on_category[$cat_id] = $current_rank_of[$cat_id] + 1;
+ }
+ }
+ }
+
+ $inserts = array();
+
+ foreach ($new_cat_ids as $cat_id)
+ {
+ $inserts[] = array(
+ 'image_id' => $image_id,
+ 'category_id' => $cat_id,
+ 'rank' => $rank_on_category[$cat_id],
+ );
+ }
+
+ mass_inserts(
+ IMAGE_CATEGORY_TABLE,
+ array_keys($inserts[0]),
+ $inserts
+ );
+
+ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+ update_category($new_cat_ids);
+}
+
+/**
+ * Merge chunks added by pwg.images.addChunk
+ * @param string $output_filepath
+ * @param string $original_sum
+ * @param string $type
+ */
+function merge_chunks($output_filepath, $original_sum, $type)
+{
+ global $conf;
+
+ ws_logfile('[merge_chunks] input parameter $output_filepath : '.$output_filepath);
+
+ if (is_file($output_filepath))
+ {
+ unlink($output_filepath);
+
+ if (is_file($output_filepath))
+ {
+ return new PwgError(500, '[merge_chunks] error while trying to remove existing '.$output_filepath);
+ }
+ }
+
+ $upload_dir = $conf['upload_dir'].'/buffer';
+ $pattern = '/'.$original_sum.'-'.$type.'/';
+ $chunks = array();
+
+ if ($handle = opendir($upload_dir))
+ {
+ while (false !== ($file = readdir($handle)))
+ {
+ if (preg_match($pattern, $file))
+ {
+ ws_logfile($file);
+ $chunks[] = $upload_dir.'/'.$file;
+ }
+ }
+ closedir($handle);
+ }
+
+ sort($chunks);
+
+ if (function_exists('memory_get_usage')) {
+ ws_logfile('[merge_chunks] memory_get_usage before loading chunks: '.memory_get_usage());
+ }
+
+ $i = 0;
+
+ foreach ($chunks as $chunk)
+ {
+ $string = file_get_contents($chunk);
+
+ if (function_exists('memory_get_usage')) {
+ ws_logfile('[merge_chunks] memory_get_usage on chunk '.++$i.': '.memory_get_usage());
+ }
+
+ if (!file_put_contents($output_filepath, $string, FILE_APPEND))
+ {
+ return new PwgError(500, '[merge_chunks] error while writting chunks for '.$output_filepath);
+ }
+
+ unlink($chunk);
+ }
+
+ if (function_exists('memory_get_usage')) {
+ ws_logfile('[merge_chunks] memory_get_usage after loading chunks: '.memory_get_usage());
+ }
+}
+
+/**
+ * Deletes chunks added with pwg.images.addChunk
+ * @param string $original_sum
+ * @param string $type
+ *
+ * Function introduced for Piwigo 2.4 and the new "multiple size"
+ * (derivatives) feature. As we only need the biggest sent photo as
+ * "original", we remove chunks for smaller sizes. We can't make it earlier
+ * in ws_images_add_chunk because at this moment we don't know which $type
+ * will be the biggest (we could remove the thumb, but let's use the same
+ * algorithm)
+ */
+function remove_chunks($original_sum, $type)
+{
+ global $conf;
+
+ $upload_dir = $conf['upload_dir'].'/buffer';
+ $pattern = '/'.$original_sum.'-'.$type.'/';
+ $chunks = array();
+
+ if ($handle = opendir($upload_dir))
+ {
+ while (false !== ($file = readdir($handle)))
+ {
+ if (preg_match($pattern, $file))
+ {
+ $chunks[] = $upload_dir.'/'.$file;
+ }
+ }
+ closedir($handle);
+ }
+
+ foreach ($chunks as $chunk)
+ {
+ unlink($chunk);
+ }
+}
+
+
+// +-----------------------------------------------------------------------+
+// | METHODS |
+// +-----------------------------------------------------------------------+
+
+/**
+ * API method
+ * Adds a comment to an image
+ * @param mixed[] $params
+ * @option int image_id
+ * @option string author
+ * @option string content
+ * @option string key
+ */
+function ws_images_addComment($params, &$service)
+{
+ $query = '
+SELECT DISTINCT image_id
+ FROM '. IMAGE_CATEGORY_TABLE .'
+ INNER JOIN '.CATEGORIES_TABLE.' ON category_id=id
+ WHERE commentable="true"
+ AND image_id='.$params['image_id'].
+ get_sql_condition_FandF(
+ array(
+ 'forbidden_categories' => 'id',
+ 'visible_categories' => 'id',
+ 'visible_images' => 'image_id'
+ ),
+ ' AND'
+ ).'
+;';
+
+ if (!pwg_db_num_rows(pwg_query($query)))
+ {
+ return new PwgError(WS_ERR_INVALID_PARAM, 'Invalid image_id');
+ }
+
+ $comm = array(
+ 'author' => trim($params['author']),
+ 'content' => trim($params['content']),
+ 'image_id' => $params['image_id'],
+ );
+
+ include_once(PHPWG_ROOT_PATH.'include/functions_comment.inc.php');
+
+ $comment_action = insert_user_comment($comm, $params['key'], $infos);
+
+ switch ($comment_action)
+ {
+ case 'reject':
+ $infos[] = l10n('Your comment has NOT been registered because it did not pass the validation rules');
+ return new PwgError(403, implode("; ", $infos) );
+
+ case 'validate':
+ case 'moderate':
+ $ret = array(
+ 'id' => $comm['id'],
+ 'validation' => $comment_action=='validate',
+ );
+ return array('comment' => new PwgNamedStruct($ret));
+
+ default:
+ return new PwgError(500, "Unknown comment action ".$comment_action );
+ }
+}
+
+/**
+ * API method
+ * Returns detailed information for an element
+ * @param mixed[] $params
+ * @option int image_id
+ * @option int comments_page
+ * @option int comments_per_page
+ */
+function ws_images_getInfo($params, &$service)
+{
+ global $user, $conf;
+
+ $query='
+SELECT *
+ FROM '. IMAGES_TABLE .'
+ WHERE id='. $params['image_id'] .
+ get_sql_condition_FandF(
+ array('visible_images' => 'id'),
+ ' AND'
+ ).'
+LIMIT 1
+;';
+ $result = pwg_query($query);
+
+ if (pwg_db_num_rows($result) == 0)
+ {
+ return new PwgError(404, 'image_id not found');
+ }
+
+ $image_row = pwg_db_fetch_assoc($result);
+ $image_row = array_merge($image_row, ws_std_get_urls($image_row));
+
+ //-------------------------------------------------------- related categories
+ $query = '
+SELECT id, name, permalink, uppercats, global_rank, commentable
+ FROM '. IMAGE_CATEGORY_TABLE .'
+ INNER JOIN '. CATEGORIES_TABLE .' ON category_id = id
+ WHERE image_id = '. $image_row['id'] .
+ get_sql_condition_FandF(
+ array('forbidden_categories' => 'category_id'),
+ ' AND'
+ ).'
+;';
+ $result = pwg_query($query);
+
+ $is_commentable = false;
+ $related_categories = array();
+ while ($row = pwg_db_fetch_assoc($result))
+ {
+ if ($row['commentable']=='true')
+ {
+ $is_commentable = true;
+ }
+ unset($row['commentable']);
+
+ $row['url'] = make_index_url(
+ array(
+ 'category' => $row
+ )
+ );
+
+ $row['page_url'] = make_picture_url(
+ array(
+ 'image_id' => $image_row['id'],
+ 'image_file' => $image_row['file'],
+ 'category' => $row
+ )
+ );
+
+ $row['id']=(int)$row['id'];
+ $related_categories[] = $row;
+ }
+ usort($related_categories, 'global_rank_compare');
+
+ if (empty($related_categories))
+ {
+ return new PwgError(401, 'Access denied');
+ }
+
+ //-------------------------------------------------------------- related tags
+ $related_tags = get_common_tags(array($image_row['id']), -1);
+ foreach ($related_tags as $i=>$tag)
+ {
+ $tag['url'] = make_index_url(
+ array(
+ 'tags' => array($tag)
+ )
+ );
+ $tag['page_url'] = make_picture_url(
+ array(
+ 'image_id' => $image_row['id'],
+ 'image_file' => $image_row['file'],
+ 'tags' => array($tag),
+ )
+ );
+
+ unset($tag['counter']);
+ $tag['id'] = (int)$tag['id'];
+ $related_tags[$i] = $tag;
+ }
+
+ //------------------------------------------------------------- related rates
+ $rating = array(
+ 'score' => $image_row['rating_score'],
+ 'count' => 0,
+ 'average' => null,
+ );
+ if (isset($rating['score']))
+ {
+ $query = '
+SELECT COUNT(rate) AS count, ROUND(AVG(rate),2) AS average
+ FROM '. RATE_TABLE .'
+ WHERE element_id = '. $image_row['id'] .'
+;';
+ $row = pwg_db_fetch_assoc(pwg_query($query));
+
+ $rating['score'] = (float)$rating['score'];
+ $rating['average'] = (float)$row['average'];
+ $rating['count'] = (int)$row['count'];
+ }
+
+ //---------------------------------------------------------- related comments
+ $related_comments = array();
+
+ $where_comments = 'image_id = '.$image_row['id'];
+ if (!is_admin())
+ {
+ $where_comments .= ' AND validated="true"';
+ }
+
+ $query = '
+SELECT COUNT(id) AS nb_comments
+ FROM '. COMMENTS_TABLE .'
+ WHERE '. $where_comments .'
+;';
+ list($nb_comments) = array_from_query($query, 'nb_comments');
+ $nb_comments = (int)$nb_comments;
+
+ if ($nb_comments>0 and $params['comments_per_page']>0)
+ {
+ $query = '
+SELECT id, date, author, content
+ FROM '. COMMENTS_TABLE .'
+ WHERE '. $where_comments .'
+ ORDER BY date
+ LIMIT '. (int)$params['comments_per_page'] .'
+ OFFSET '. (int)($params['comments_per_page']*$params['comments_page']) .'
+;';
+ $result = pwg_query($query);
+
+ while ($row = pwg_db_fetch_assoc($result))
+ {
+ $row['id'] = (int)$row['id'];
+ $related_comments[] = $row;
+ }
+ }
+
+ $comment_post_data = null;
+ if ($is_commentable and
+ (!is_a_guest()
+ or (is_a_guest() and $conf['comments_forall'] )
+ )
+ )
+ {
+ $comment_post_data['author'] = stripslashes($user['username']);
+ $comment_post_data['key'] = get_ephemeral_key(2, $params['image_id']);
+ }
+
+ $ret = $image_row;
+ foreach (array('id','width','height','hit','filesize') as $k)
+ {
+ if (isset($ret[$k]))
+ {
+ $ret[$k] = (int)$ret[$k];
+ }
+ }
+ foreach (array('path', 'storage_category_id') as $k)
+ {
+ unset($ret[$k]);
+ }
+
+ $ret['rates'] = array(
+ WS_XML_ATTRIBUTES => $rating
+ );
+ $ret['categories'] = new PwgNamedArray(
+ $related_categories,
+ 'category',
+ array('id','url', 'page_url')
+ );
+ $ret['tags'] = new PwgNamedArray(
+ $related_tags,
+ 'tag',
+ ws_std_get_tag_xml_attributes()
+ );
+ if (isset($comment_post_data))
+ {
+ $ret['comment_post'] = array(
+ WS_XML_ATTRIBUTES => $comment_post_data
+ );
+ }
+ $ret['comments_paging'] = new PwgNamedStruct(
+ array(
+ 'page' => $params['comments_page'],
+ 'per_page' => $params['comments_per_page'],
+ 'count' => count($related_comments),
+ 'total_count' => $nb_comments,
+ )
+ );
+ $ret['comments'] = new PwgNamedArray(
+ $related_comments,
+ 'comment',
+ array('id','date')
+ );
+
+ if ($service->_responseFormat != 'rest')
+ {
+ return $ret; // for backward compatibility only
+ }
+ else
+ {
+ return array(
+ 'image' => new PwgNamedStruct($ret, null, array('name','comment'))
+ );
+ }
+}
+
+/**
+ * API method
+ * Rates an image
+ * @param mixed[] $params
+ * @option int image_id
+ * @option float rate
+ */
+function ws_images_rate($params, &$service)
+{
+ $query = '
+SELECT DISTINCT id
+ FROM '. IMAGES_TABLE .'
+ INNER JOIN '. IMAGE_CATEGORY_TABLE .' ON id=image_id
+ WHERE id='. $params['image_id']
+ .get_sql_condition_FandF(
+ array(
+ 'forbidden_categories' => 'category_id',
+ 'forbidden_images' => 'id',
+ ),
+ ' AND'
+ ).'
+ LIMIT 1
+;';
+ if (pwg_db_num_rows(pwg_query($query))==0)
+ {
+ return new PwgError(404, 'Invalid image_id or access denied');
+ }
+
+ include_once(PHPWG_ROOT_PATH.'include/functions_rate.inc.php');
+ $res = rate_picture($params['image_id'], (int)$params['rate']);
+
+ if ($res==false)
+ {
+ global $conf;
+ return new PwgError(403, 'Forbidden or rate not in '. implode(',', $conf['rate_items']));
+ }
+ return $res;
+}
+
+/**
+ * API method
+ * Returns a list of elements corresponding to a query search
+ * @param mixed[] $params
+ * @option string query
+ * @option int per_page
+ * @option int page
+ * @option string order (optional)
+ */
+function ws_images_search($params, &$service)
+{
+ include_once(PHPWG_ROOT_PATH .'include/functions_search.inc.php');
+
+ $images = array();
+ $where_clauses = ws_std_image_sql_filter($params, 'i.');
+ $order_by = ws_std_image_sql_order($params, 'i.');
+
+ $super_order_by = false;
+ if (!empty($order_by))
+ {
+ global $conf;
+ $conf['order_by'] = 'ORDER BY '.$order_by;
+ $super_order_by = true; // quick_search_result might be faster
+ }
+
+ $search_result = get_quick_search_results(
+ $params['query'],
+ $super_order_by,
+ implode(' AND ', $where_clauses)
+ );
+
+ $image_ids = array_slice(
+ $search_result['items'],
+ $params['page']*$params['per_page'],
+ $params['per_page']
+ );
+
+ if (count($image_ids))
+ {
+ $query = '
+SELECT *
+ FROM '. IMAGES_TABLE .'
+ WHERE id IN ('. implode(',', $image_ids) .')
+;';
+ $result = pwg_query($query);
+ $image_ids = array_flip($image_ids);
+
+ while ($row = pwg_db_fetch_assoc($result))
+ {
+ $image = array();
+ foreach (array('id', 'width', 'height', 'hit') as $k)
+ {
+ if (isset($row[$k]))
+ {
+ $image[$k] = (int)$row[$k];
+ }
+ }
+ foreach (array('file', 'name', 'comment', 'date_creation', 'date_available') as $k)
+ {
+ $image[$k] = $row[$k];
+ }
+
+ $image = array_merge($image, ws_std_get_urls($row));
+ $images[ $image_ids[ $image['id'] ] ] = $image;
+ }
+ ksort($images, SORT_NUMERIC);
+ $images = array_values($images);
+ }
+
+ return array (
+ 'paging' => new PwgNamedStruct(
+ array(
+ 'page' => $params['page'],
+ 'per_page' => $params['per_page'],
+ 'count' => count($images),
+ 'total_count' => count($search_result['items']),
+ )
+ ),
+ 'images' => new PwgNamedArray(
+ $images,
+ 'image',
+ ws_std_get_image_xml_attributes()
+ )
+ );
+}
+
+/**
+ * API method
+ * Sets the level of an image
+ * @param mixed[] $params
+ * @option int image_id
+ * @option int level
+ */
+function ws_images_setPrivacyLevel($params, &$service)
+{
+ global $conf;
+
+ if (!in_array($params['level'], $conf['available_permission_levels']))
+ {
+ return new PwgError(WS_ERR_INVALID_PARAM, 'Invalid level');
+ }
+
+ $query = '
+UPDATE '. IMAGES_TABLE .'
+ SET level='. (int)$params['level'] .'
+ WHERE id IN ('. implode(',',$params['image_id']) .')
+;';
+ $result = pwg_query($query);
+
+ $affected_rows = pwg_db_changes($result);
+ if ($affected_rows)
+ {
+ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+ invalidate_user_cache();
+ }
+ return $affected_rows;
+}
+
+/**
+ * API method
+ * Sets the rank of an image in a category
+ * @param mixed[] $params
+ * @option int image_id
+ * @option int category_id
+ * @option int rank
+ */
+function ws_images_setRank($params, &$service)
+{
+ // does the image really exist?
+ $query = '
+SELECT COUNT(*)
+ FROM '. IMAGES_TABLE .'
+ WHERE id = '. $params['image_id'] .'
+;';
+ list($count) = pwg_db_fetch_row(pwg_query($query));
+ if ($count == 0)
+ {
+ return new PwgError(404, 'image_id not found');
+ }
+
+ // is the image associated to this category?
+ $query = '
+SELECT COUNT(*)
+ FROM '. IMAGE_CATEGORY_TABLE .'
+ WHERE image_id = '. $params['image_id'] .'
+ AND category_id = '. $params['category_id'] .'
+;';
+ list($count) = pwg_db_fetch_row(pwg_query($query));
+ if ($count == 0)
+ {
+ return new PwgError(404, 'This image is not associated to this category');
+ }
+
+ // what is the current higher rank for this category?
+ $query = '
+SELECT MAX(rank) AS max_rank
+ FROM '. IMAGE_CATEGORY_TABLE .'
+ WHERE category_id = '. $params['category_id'] .'
+;';
+ $row = pwg_db_fetch_assoc(pwg_query($query));
+
+ if (is_numeric($row['max_rank']))
+ {
+ if ($params['rank'] > $row['max_rank'])
+ {
+ $params['rank'] = $row['max_rank'] + 1;
+ }
+ }
+ else
+ {
+ $params['rank'] = 1;
+ }
+
+ // update rank for all other photos in the same category
+ $query = '
+UPDATE '. IMAGE_CATEGORY_TABLE .'
+ SET rank = rank + 1
+ WHERE category_id = '. $params['category_id'] .'
+ AND rank IS NOT NULL
+ AND rank >= '. $params['rank'] .'
+;';
+ pwg_query($query);
+
+ // set the new rank for the photo
+ $query = '
+UPDATE '. IMAGE_CATEGORY_TABLE .'
+ SET rank = '. $params['rank'] .'
+ WHERE image_id = '. $params['image_id'] .'
+ AND category_id = '. $params['category_id'] .'
+;';
+ pwg_query($query);
+
+ // return data for client
+ return array(
+ 'image_id' => $params['image_id'],
+ 'category_id' => $params['category_id'],
+ 'rank' => $params['rank'],
+ );
+}
+
+/**
+ * API method
+ * Adds a file chunk
+ * @param mixed[] $params
+ * @option string data
+ * @option string original_sum
+ * @option string type = 'file'
+ * @option int position
+ */
+function ws_images_add_chunk($params, &$service)
+{
+ global $conf;
+
+ foreach ($params as $param_key => $param_value)
+ {
+ if ('data' == $param_key)
+ {
+ continue;
+ }
+ ws_logfile(
+ sprintf(
+ '[ws_images_add_chunk] input param "%s" : "%s"',
+ $param_key,
+ is_null($param_value) ? 'NULL' : $param_value
+ )
+ );
+ }
+
+ $upload_dir = $conf['upload_dir'].'/buffer';
+
+ // create the upload directory tree if not exists
+ if (!mkgetdir($upload_dir, MKGETDIR_DEFAULT&~MKGETDIR_DIE_ON_ERROR))
+ {
+ return new PwgError(500, 'error during buffer directory creation');
+ }
+
+ $filename = sprintf(
+ '%s-%s-%05u.block',
+ $params['original_sum'],
+ $params['type'],
+ $params['position']
+ );
+
+ ws_logfile('[ws_images_add_chunk] data length : '.strlen($params['data']));
+
+ $bytes_written = file_put_contents(
+ $upload_dir.'/'.$filename,
+ base64_decode($params['data'])
+ );
+
+ if (false === $bytes_written)
+ {
+ return new PwgError(500,
+ 'an error has occured while writting chunk '.$params['position'].' for '.$params['type']
+ );
+ }
+}
+
+/**
+ * API method
+ * Adds a file
+ * @param mixed[] $params
+ * @option int image_id
+ * @option string type = 'file'
+ * @option string sum
+ */
+function ws_images_addFile($params, &$service)
+{
+ ws_logfile(__FUNCTION__.', input : '.var_export($params, true));
+
+ global $conf;
+
+ // what is the path and other infos about the photo?
+ $query = '
+SELECT
+ path, file, md5sum,
+ width, height, filesize
+ FROM '. IMAGES_TABLE .'
+ WHERE id = '. $params['image_id'] .'
+;';
+ $result = pwg_query($query);
+
+ if (pwg_db_num_rows($result) == 0)
+ {
+ return new PwgError(404, "image_id not found");
+ }
+
+ $image = pwg_db_fetch_assoc($result);
+
+ // since Piwigo 2.4 and derivatives, we do not take the imported "thumb" into account
+ if ('thumb' == $params['type'])
+ {
+ remove_chunks($image['md5sum'], $type);
+ return true;
+ }
+
+ // since Piwigo 2.4 and derivatives, we only care about the "original"
+ $original_type = 'file';
+ if ('high' == $params['type'])
+ {
+ $original_type = 'high';
+ }
+
+ $file_path = $conf['upload_dir'].'/buffer/'.$image['md5sum'].'-original';
+
+ merge_chunks($file_path, $image['md5sum'], $original_type);
+ chmod($file_path, 0644);
+
+ include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php');
+
+ // if we receive the "file", we only update the original if the "file" is
+ // bigger than current original
+ if ('file' == $params['type'])
+ {
+ $do_update = false;
+
+ $infos = pwg_image_infos($file_path);
+
+ foreach (array('width', 'height', 'filesize') as $image_info)
+ {
+ if ($infos[$image_info] > $image[$image_info])
+ {
+ $do_update = true;
+ }
+ }
+
+ if (!$do_update)
+ {
+ unlink($file_path);
+ return true;
+ }
+ }
+
+ $image_id = add_uploaded_file(
+ $file_path,
+ $image['file'],
+ null,
+ null,
+ $params['image_id'],
+ $image['md5sum'] // we force the md5sum to remain the same
+ );
+}
+
+/**
+ * API method
+ * Adds an image
+ * @param mixed[] $params
+ * @option string original_sum
+ * @option string original_filename (optional)
+ * @option string name (optional)
+ * @option string author (optional)
+ * @option string date_creation (optional)
+ * @option string comment (optional)
+ * @option string categories (optional) - "cat_id[,rank];cat_id[,rank]"
+ * @option string tags_ids (optional) - "tag_id,tag_id"
+ * @option int level
+ * @option bool check_uniqueness
+ * @option int image_id (optional)
+ */
+function ws_images_add($params, &$service)
+{
+ global $conf, $user;
+
+ foreach ($params as $param_key => $param_value)
+ {
+ ws_logfile(
+ sprintf(
+ '[pwg.images.add] input param "%s" : "%s"',
+ $param_key,
+ is_null($param_value) ? 'NULL' : $param_value
+ )
+ );
+ }
+
+ if ($params['image_id'] > 0)
+ {
+ $query = '
+SELECT COUNT(*)
+ FROM '. IMAGES_TABLE .'
+ WHERE id = '. $params['image_id'] .'
+;';
+ list($count) = pwg_db_fetch_row(pwg_query($query));
+ if ($count == 0)
+ {
+ return new PwgError(404, 'image_id not found');
+ }
+ }
+
+ // does the image already exists ?
+ if ($params['check_uniqueness'])
+ {
+ if ('md5sum' == $conf['uniqueness_mode'])
+ {
+ $where_clause = "md5sum = '".$params['original_sum']."'";
+ }
+ if ('filename' == $conf['uniqueness_mode'])
+ {
+ $where_clause = "file = '".$params['original_filename']."'";
+ }
+
+ $query = '
+SELECT COUNT(*)
+ FROM '. IMAGES_TABLE .'
+ WHERE '. $where_clause .'
+;';
+ list($counter) = pwg_db_fetch_row(pwg_query($query));
+ if ($counter != 0)
+ {
+ return new PwgError(500, 'file already exists');
+ }
+ }
+
+ // due to the new feature "derivatives" (multiple sizes) introduced for
+ // Piwigo 2.4, we only take the biggest photos sent on
+ // pwg.images.addChunk. If "high" is available we use it as "original"
+ // else we use "file".
+ remove_chunks($params['original_sum'], 'thumb');
+
+ if (isset($params['high_sum']))
+ {
+ $original_type = 'high';
+ remove_chunks($params['original_sum'], 'file');
+ }
+ else
+ {
+ $original_type = 'file';
+ }
+
+ $file_path = $conf['upload_dir'].'/buffer/'.$params['original_sum'].'-original';
+
+ merge_chunks($file_path, $params['original_sum'], $original_type);
+ chmod($file_path, 0644);
+
+ include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php');
+
+ $image_id = add_uploaded_file(
+ $file_path,
+ $params['original_filename'],
+ null, // categories
+ isset($params['level']) ? $params['level'] : null,
+ $params['image_id'] > 0 ? $params['image_id'] : null,
+ $params['original_sum']
+ );
+
+ $info_columns = array(
+ 'name',
+ 'author',
+ 'comment',
+ 'date_creation',
+ );
+
+ $update = array();
+ foreach ($info_columns as $key)
+ {
+ if (isset($params[$key]))
+ {
+ $update[$key] = $params[$key];
+ }
+ }
+
+ if (count(array_keys($update)) > 0)
+ {
+ single_update(
+ IMAGES_TABLE,
+ $update,
+ array('id' => $image_id)
+ );
+ }
+
+ $url_params = array('image_id' => $image_id);
+
+ // let's add links between the image and the categories
+ if (isset($params['categories']))
+ {
+ ws_add_image_category_relations($image_id, $params['categories']);
+
+ if (preg_match('/^\d+/', $params['categories'], $matches))
+ {
+ $category_id = $matches[0];
+
+ $query = '
+SELECT id, name, permalink
+ FROM '. CATEGORIES_TABLE .'
+ WHERE id = '. $category_id .'
+;';
+ $result = pwg_query($query);
+ $category = pwg_db_fetch_assoc($result);
+
+ $url_params['section'] = 'categories';
+ $url_params['category'] = $category;
+ }
+ }
+
+ // and now, let's create tag associations
+ if (isset($params['tag_ids']) and !empty($params['tag_ids']))
+ {
+ set_tags(
+ explode(',', $params['tag_ids']),
+ $image_id
+ );
+ }
+
+ invalidate_user_cache();
+
+ return array(
+ 'image_id' => $image_id,
+ 'url' => make_picture_url($url_params),
+ );
+}
+
+/**
+ * API method
+ * Adds a image (simple way)
+ * @param mixed[] $params
+ * @option int[] category
+ * @option string name (optional)
+ * @option string author (optional)
+ * @option string comment (optional)
+ * @option int level
+ * @option string|string[] tags
+ * @option int image_id (optional)
+ */
+function ws_images_addSimple($params, &$service)
+{
+ global $conf;
+
+ if (!isset($_FILES['image']))
+ {
+ return new PwgError(405, 'The image (file) is missing');
+ }
+
+ if ($params['image_id'] > 0)
+ {
+ $query='
+SELECT COUNT(*)
+ FROM '. IMAGES_TABLE .'
+ WHERE id = '. $params['image_id'] .'
+;';
+ list($count) = pwg_db_fetch_row(pwg_query($query));
+ if ($count == 0)
+ {
+ return new PwgError(404, 'image_id not found');
+ }
+ }
+
+ include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php');
+
+ $image_id = add_uploaded_file(
+ $_FILES['image']['tmp_name'],
+ $_FILES['image']['name'],
+ $params['category'],
+ 8,
+ $params['image_id'] > 0 ? $params['image_id'] : null
+ );
+
+ $info_columns = array(
+ 'name',
+ 'author',
+ 'comment',
+ 'level',
+ 'date_creation',
+ );
+
+ $update = array();
+ foreach ($info_columns as $key)
+ {
+ if (isset($params[$key]))
+ {
+ $update[$key] = $params[$key];
+ }
+ }
+
+ single_update(
+ IMAGES_TABLE,
+ $update,
+ array('id' => $image_id)
+ );
+
+ if (isset($params['tags']) and !empty($params['tags']))
+ {
+ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+ $tag_ids = array();
+ if (is_array($params['tags']))
+ {
+ foreach ($params['tags'] as $tag_name)
+ {
+ $tag_ids[] = tag_id_from_tag_name($tag_name);
+ }
+ }
+ else
+ {
+ $tag_names = preg_split('~(?<!\\\),~', $params['tags']);
+ foreach ($tag_names as $tag_name)
+ {
+ $tag_ids[] = tag_id_from_tag_name(preg_replace('#\\\\*,#', ',', $tag_name));
+ }
+ }
+
+ add_tags($tag_ids, array($image_id));
+ }
+
+ $url_params = array('image_id' => $image_id);
+
+ if (!empty($params['category']))
+ {
+ $query = '
+SELECT id, name, permalink
+ FROM '. CATEGORIES_TABLE .'
+ WHERE id = '. $params['category'][0] .'
+;';
+ $result = pwg_query($query);
+ $category = pwg_db_fetch_assoc($result);
+
+ $url_params['section'] = 'categories';
+ $url_params['category'] = $category;
+ }
+
+ // update metadata from the uploaded file (exif/iptc), even if the sync
+ // was already performed by add_uploaded_file().
+ require_once(PHPWG_ROOT_PATH.'admin/include/functions_metadata.php');
+ sync_metadata(array($image_id));
+
+ return array(
+ 'image_id' => $image_id,
+ 'url' => make_picture_url($url_params),
+ );
+}
+
+/**
+ * API method
+ * Check if an image exists by it's name or md5 sum
+ * @param mixed[] $params
+ * @option string md5sum_list (optional)
+ * @option string filename_list (optional)
+ */
+function ws_images_exist($params, &$service)
+{
+ ws_logfile(__FUNCTION__.' '.var_export($params, true));
+
+ global $conf;
+
+ $split_pattern = '/[\s,;\|]/';
+ $result = array();
+
+ if ('md5sum' == $conf['uniqueness_mode'])
+ {
+ // search among photos the list of photos already added, based on md5sum list
+ $md5sums = preg_split(
+ $split_pattern,
+ $params['md5sum_list'],
+ -1,
+ PREG_SPLIT_NO_EMPTY
+ );
+
+ $query = '
+SELECT id, md5sum
+ FROM '. IMAGES_TABLE .'
+ WHERE md5sum IN (\''. implode("','", $md5sums) .'\')
+;';
+ $id_of_md5 = simple_hash_from_query($query, 'md5sum', 'id');
+
+ foreach ($md5sums as $md5sum)
+ {
+ $result[$md5sum] = null;
+ if (isset($id_of_md5[$md5sum]))
+ {
+ $result[$md5sum] = $id_of_md5[$md5sum];
+ }
+ }
+ }
+ else if ('filename' == $conf['uniqueness_mode'])
+ {
+ // search among photos the list of photos already added, based on
+ // filename list
+ $filenames = preg_split(
+ $split_pattern,
+ $params['filename_list'],
+ -1,
+ PREG_SPLIT_NO_EMPTY
+ );
+
+ $query = '
+SELECT id, file
+ FROM '.IMAGES_TABLE.'
+ WHERE file IN (\''. implode("','", $filenames) .'\')
+;';
+ $id_of_filename = simple_hash_from_query($query, 'file', 'id');
+
+ foreach ($filenames as $filename)
+ {
+ $result[$filename] = null;
+ if (isset($id_of_filename[$filename]))
+ {
+ $result[$filename] = $id_of_filename[$filename];
+ }
+ }
+ }
+
+ return $result;
+}
+
+/**
+ * API method
+ * Check is file has been update
+ * @param mixed[] $params
+ * @option int image_id
+ * @option string file_sum
+ */
+function ws_images_checkFiles($params, &$service)
+{
+ ws_logfile(__FUNCTION__.', input : '.var_export($params, true));
+
+ $query = '
+SELECT path
+ FROM '. IMAGES_TABLE .'
+ WHERE id = '. $params['image_id'] .'
+;';
+ $result = pwg_query($query);
+
+ if (pwg_db_num_rows($result) == 0)
+ {
+ return new PwgError(404, 'image_id not found');
+ }
+
+ list($path) = pwg_db_fetch_row($result);
+
+ $ret = array();
+
+ if (isset($params['thumbnail_sum']))
+ {
+ // We always say the thumbnail is equal to create no reaction on the
+ // other side. Since Piwigo 2.4 and derivatives, the thumbnails and web
+ // sizes are always generated by Piwigo
+ $ret['thumbnail'] = 'equals';
+ }
+
+ if (isset($params['high_sum']))
+ {
+ $ret['file'] = 'equals';
+ $compare_type = 'high';
+ }
+ else if (isset($params['file_sum']))
+ {
+ $compare_type = 'file';
+ }
+
+ if (isset($compare_type))
+ {
+ ws_logfile(__FUNCTION__.', md5_file($path) = '.md5_file($path));
+ if (md5_file($path) != $params[$compare_type.'_sum'])
+ {
+ $ret[$compare_type] = 'differs';
+ }
+ else
+ {
+ $ret[$compare_type] = 'equals';
+ }
+ }
+
+ ws_logfile(__FUNCTION__.', output : '.var_export($ret, true));
+
+ return $ret;
+}
+
+/**
+ * API method
+ * Sets details of an image
+ * @param mixed[] $params
+ * @option int image_id
+ * @option string file (optional)
+ * @option string name (optional)
+ * @option string author (optional)
+ * @option string date_creation (optional)
+ * @option string comment (optional)
+ * @option string categories (optional) - "cat_id[,rank];cat_id[,rank]"
+ * @option string tags_ids (optional) - "tag_id,tag_id"
+ * @option int level (optional)
+ * @option string single_value_mode
+ * @option string multiple_value_mode
+ */
+function ws_images_setInfo($params, &$service)
+{
+ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+ $query='
+SELECT *
+ FROM '. IMAGES_TABLE .'
+ WHERE id = '. $params['image_id'] .'
+;';
+ $result = pwg_query($query);
+
+ if (pwg_db_num_rows($result) == 0)
+ {
+ return new PwgError(404, 'image_id not found');
+ }
+
+ $image_row = pwg_db_fetch_assoc($result);
+
+ // database registration
+ $update = array();
+
+ $info_columns = array(
+ 'name',
+ 'author',
+ 'comment',
+ 'level',
+ 'date_creation',
+ );
+
+ foreach ($info_columns as $key)
+ {
+ if (isset($params[$key]))
+ {
+ if ('fill_if_empty' == $params['single_value_mode'])
+ {
+ if (empty($image_row[$key]))
+ {
+ $update[$key] = $params[$key];
+ }
+ }
+ elseif ('replace' == $params['single_value_mode'])
+ {
+ $update[$key] = $params[$key];
+ }
+ else
+ {
+ return new PwgError(500,
+ '[ws_images_setInfo]'
+ .' invalid parameter single_value_mode "'.$params['single_value_mode'].'"'
+ .', possible values are {fill_if_empty, replace}.'
+ );
+ }
+ }
+ }
+
+ if (isset($params['file']))
+ {
+ if (!empty($image_row['storage_category_id']))
+ {
+ return new PwgError(500,
+ '[ws_images_setInfo] updating "file" is forbidden on photos added by synchronization'
+ );
+ }
+
+ $update['file'] = $params['file'];
+ }
+
+ if (count(array_keys($update)) > 0)
+ {
+ $update['id'] = $params['image_id'];
+
+ single_update(
+ IMAGES_TABLE,
+ $update,
+ array('id' => $update['id'])
+ );
+ }
+
+ if (isset($params['categories']))
+ {
+ ws_add_image_category_relations(
+ $params['image_id'],
+ $params['categories'],
+ ('replace' == $params['multiple_value_mode'] ? true : false)
+ );
+ }
+
+ // and now, let's create tag associations
+ if (isset($params['tag_ids']))
+ {
+ $tag_ids = array();
+
+ foreach (explode(',', $params['tag_ids']) as $candidate)
+ {
+ $candidate = trim($candidate);
+
+ if (preg_match(PATTERN_ID, $candidate))
+ {
+ $tag_ids[] = $candidate;
+ }
+ }
+
+ if ('replace' == $params['multiple_value_mode'])
+ {
+ set_tags(
+ $tag_ids,
+ $params['image_id']
+ );
+ }
+ elseif ('append' == $params['multiple_value_mode'])
+ {
+ add_tags(
+ $tag_ids,
+ array($params['image_id'])
+ );
+ }
+ else
+ {
+ return new PwgError(500,
+ '[ws_images_setInfo]'
+ .' invalid parameter multiple_value_mode "'.$params['multiple_value_mode'].'"'
+ .', possible values are {replace, append}.'
+ );
+ }
+ }
+
+ invalidate_user_cache();
+}
+
+/**
+ * API method
+ * Deletes an image
+ * @param mixed[] $params
+ * @option int|int[] image_id
+ * @option string pwg_token
+ */
+function ws_images_delete($params, &$service)
+{
+ if (get_pwg_token() != $params['pwg_token'])
+ {
+ return new PwgError(403, 'Invalid security token');
+ }
+
+ if (!is_array($params['image_id']))
+ {
+ $params['image_id'] = preg_split(
+ '/[\s,;\|]/',
+ $params['image_id'],
+ -1,
+ PREG_SPLIT_NO_EMPTY
+ );
+ }
+ $params['image_id'] = array_map('intval', $params['image_id']);
+
+ $image_ids = array();
+ foreach ($params['image_id'] as $image_id)
+ {
+ if ($image_id > 0)
+ {
+ $image_ids[] = $image_id;
+ }
+ }
+
+ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+ delete_elements($image_ids, true);
+ invalidate_user_cache();
+}
+
+/**
+ * API method
+ * Checks if Piwigo is ready for upload
+ * @param mixed[] $params
+ */
+function ws_images_checkUpload($params, &$service)
+{
+ include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php');
+
+ $ret['message'] = ready_for_upload_message();
+ $ret['ready_for_upload'] = true;
+ if (!empty($ret['message']))
+ {
+ $ret['ready_for_upload'] = false;
+ }
+
+ return $ret;
+}
+
+?> \ No newline at end of file
diff --git a/include/ws_functions/pwg.permissions.php b/include/ws_functions/pwg.permissions.php
new file mode 100644
index 000000000..936999ab8
--- /dev/null
+++ b/include/ws_functions/pwg.permissions.php
@@ -0,0 +1,235 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+/**
+ * API method
+ * Returns permissions
+ * @param mixed[] $params
+ * @option int[] cat_id (optional)
+ * @option int[] group_id (optional)
+ * @option int[] user_id (optional)
+ */
+function ws_permissions_getList($params, &$service)
+{
+ $my_params = array_intersect(array_keys($params), array('cat_id','group_id','user_id'));
+ if (count($my_params) > 1)
+ {
+ return new PwgError(WS_ERR_INVALID_PARAM, 'Too many parameters, provide cat_id OR user_id OR group_id');
+ }
+
+ $cat_filter = '';
+ if (!empty($params['cat_id']))
+ {
+ $cat_filter = 'WHERE cat_id IN('. implode(',', $params['cat_id']) .')';
+ }
+
+ $perms = array();
+
+ // direct users
+ $query = '
+SELECT user_id, cat_id
+ FROM '. USER_ACCESS_TABLE .'
+ '. $cat_filter .'
+;';
+ $result = pwg_query($query);
+
+ while ($row = pwg_db_fetch_assoc($result))
+ {
+ if (!isset($perms[ $row['cat_id'] ]))
+ {
+ $perms[ $row['cat_id'] ]['id'] = intval($row['cat_id']);
+ }
+ $perms[ $row['cat_id'] ]['users'][] = intval($row['user_id']);
+ }
+
+ // indirect users
+ $query = '
+SELECT ug.user_id, ga.cat_id
+ FROM '. USER_GROUP_TABLE .' AS ug
+ INNER JOIN '. GROUP_ACCESS_TABLE .' AS ga
+ ON ug.group_id = ga.group_id
+ '. $cat_filter .'
+;';
+ $result = pwg_query($query);
+
+ while ($row = pwg_db_fetch_assoc($result))
+ {
+ if (!isset($perms[ $row['cat_id'] ]))
+ {
+ $perms[ $row['cat_id'] ]['id'] = intval($row['cat_id']);
+ }
+ $perms[ $row['cat_id'] ]['users_indirect'][] = intval($row['user_id']);
+ }
+
+ // groups
+ $query = '
+SELECT group_id, cat_id
+ FROM '. GROUP_ACCESS_TABLE .'
+ '. $cat_filter .'
+;';
+ $result = pwg_query($query);
+
+ while ($row = pwg_db_fetch_assoc($result))
+ {
+ if (!isset($perms[ $row['cat_id'] ]))
+ {
+ $perms[ $row['cat_id'] ]['id'] = intval($row['cat_id']);
+ }
+ $perms[ $row['cat_id'] ]['groups'][] = intval($row['group_id']);
+ }
+
+ // filter by group and user
+ foreach ($perms as $cat_id => &$cat)
+ {
+ if (isset($filters['group_id']))
+ {
+ if (empty($cat['groups']) or count(array_intersect($cat['groups'], $params['group_id'])) == 0)
+ {
+ unset($perms[$cat_id]);
+ continue;
+ }
+ }
+ if (isset($filters['user_id']))
+ {
+ if (
+ (empty($cat['users_indirect']) or count(array_intersect($cat['users_indirect'], $params['user_id'])) == 0)
+ and (empty($cat['users']) or count(array_intersect($cat['users'], $params['user_id'])) == 0)
+ ) {
+ unset($perms[$cat_id]);
+ continue;
+ }
+ }
+
+ $cat['groups'] = !empty($cat['groups']) ? array_values(array_unique($cat['groups'])) : array();
+ $cat['users'] = !empty($cat['users']) ? array_values(array_unique($cat['users'])) : array();
+ $cat['users_indirect'] = !empty($cat['users_indirect']) ? array_values(array_unique($cat['users_indirect'])) : array();
+ }
+ unset($cat);
+
+ return array(
+ 'categories' => new PwgNamedArray(
+ array_values($perms),
+ 'category',
+ array('id')
+ )
+ );
+}
+
+/**
+ * API method
+ * Add permissions
+ * @param mixed[] $params
+ * @option int[] cat_id
+ * @option int[] group_id (optional)
+ * @option int[] user_id (optional)
+ * @option bool recursive
+ */
+function ws_permissions_add($params, &$service)
+{
+ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+ if (!empty($params['group_id']))
+ {
+ $cat_ids = get_uppercat_ids($params['cat_id']);
+ if ($params['recursive'])
+ {
+ $cat_ids = array_merge($cat_ids, get_subcat_ids($params['cat_id']));
+ }
+
+ $query = '
+SELECT id
+ FROM '. CATEGORIES_TABLE .'
+ WHERE id IN ('. implode(',', $cat_ids) .')
+ AND status = \'private\'
+;';
+ $private_cats = array_from_query($query, 'id');
+
+ $inserts = array();
+ foreach ($private_cats as $cat_id)
+ {
+ foreach ($params['group_id'] as $group_id)
+ {
+ $inserts[] = array(
+ 'group_id' => $group_id,
+ 'cat_id' => $cat_id
+ );
+ }
+ }
+
+ mass_inserts(
+ GROUP_ACCESS_TABLE,
+ array('group_id','cat_id'),
+ $inserts,
+ array('ignore'=>true)
+ );
+ }
+
+ if (!empty($params['user_id']))
+ {
+ if ($params['recursive']) $_POST['apply_on_sub'] = true;
+ add_permission_on_category($params['cat_id'], $params['user_id']);
+ }
+
+ return $service->invoke('pwg.permissions.getList', array('cat_id'=>$params['cat_id']));
+}
+
+/**
+ * API method
+ * Removes permissions
+ * @param mixed[] $params
+ * @option int[] cat_id
+ * @option int[] group_id (optional)
+ * @option int[] user_id (optional)
+ */
+function ws_permissions_remove($params, &$service)
+{
+ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+ $cat_ids = get_subcat_ids($params['cat_id']);
+
+ if (!empty($params['group_id']))
+ {
+ $query = '
+DELETE
+ FROM '. GROUP_ACCESS_TABLE .'
+ WHERE group_id IN ('. implode(',', $params['group_id']).')
+ AND cat_id IN ('. implode(',', $cat_ids).')
+;';
+ pwg_query($query);
+ }
+
+ if (!empty($params['user_id']))
+ {
+ $query = '
+DELETE
+ FROM '. USER_ACCESS_TABLE .'
+ WHERE user_id IN ('. implode(',', $params['user_id']) .')
+ AND cat_id IN ('. implode(',', $cat_ids) .')
+;';
+ pwg_query($query);
+ }
+
+ return $service->invoke('pwg.permissions.getList', array('cat_id'=>$params['cat_id']));
+}
+
+?> \ No newline at end of file
diff --git a/include/ws_functions/pwg.php b/include/ws_functions/pwg.php
new file mode 100644
index 000000000..0def2031f
--- /dev/null
+++ b/include/ws_functions/pwg.php
@@ -0,0 +1,338 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+/**
+ * API method
+ * Returns a list of missing derivatives (not generated yet)
+ * @param mixed[] $params
+ * @option string types (optional)
+ * @option int[] ids
+ * @option int max_urls
+ * @option int prev_page (optional)
+ */
+function ws_getMissingDerivatives($params, &$service)
+{
+ global $conf;
+
+ if (empty($params['types']))
+ {
+ $types = array_keys(ImageStdParams::get_defined_type_map());
+ }
+ else
+ {
+ $types = array_intersect(array_keys(ImageStdParams::get_defined_type_map()), $params['types']);
+ if (count($types)==0)
+ {
+ return new PwgError(WS_ERR_INVALID_PARAM, "Invalid types");
+ }
+ }
+
+ $max_urls = $params['max_urls'];
+ $query = 'SELECT MAX(id)+1, COUNT(*) FROM '. IMAGES_TABLE .';';
+ list($max_id, $image_count) = pwg_db_fetch_row(pwg_query($query));
+
+ if (0 == $image_count)
+ {
+ return array();
+ }
+
+ $start_id = $params['prev_page'];
+ if ($start_id<=0)
+ {
+ $start_id = $max_id;
+ }
+
+ $uid = '&b='.time();
+
+ $conf['question_mark_in_urls'] = $conf['php_extension_in_urls'] = true;
+ $conf['derivative_url_style'] = 2; //script
+
+ $qlimit = min(5000, ceil(max($image_count/500, $max_urls/count($types))));
+ $where_clauses = ws_std_image_sql_filter( $params, '' );
+ $where_clauses[] = 'id<start_id';
+
+ if (!empty($params['ids']))
+ {
+ $where_clauses[] = 'id IN ('.implode(',',$params['ids']).')';
+ }
+
+ $query_model = '
+SELECT id, path, representative_ext, width, height, rotation
+ FROM '. IMAGES_TABLE .'
+ WHERE '. implode(' AND ', $where_clauses) .'
+ ORDER BY id DESC
+ LIMIT '. $qlimit .'
+;';
+
+ $urls = array();
+ do
+ {
+ $result = pwg_query(str_replace('start_id', $start_id, $query_model));
+ $is_last = pwg_db_num_rows($result) < $qlimit;
+
+ while ($row=pwg_db_fetch_assoc($result))
+ {
+ $start_id = $row['id'];
+ $src_image = new SrcImage($row);
+ if ($src_image->is_mimetype())
+ {
+ continue;
+ }
+
+ foreach($types as $type)
+ {
+ $derivative = new DerivativeImage($type, $src_image);
+ if ($type != $derivative->get_type())
+ {
+ continue;
+ }
+ if (@filemtime($derivative->get_path())===false)
+ {
+ $urls[] = $derivative->get_url().$uid;
+ }
+ }
+
+ if (count($urls)>=$max_urls and !$is_last)
+ {
+ break;
+ }
+ }
+ if ($is_last)
+ {
+ $start_id = 0;
+ }
+ } while (count($urls)<$max_urls and $start_id);
+
+ $ret = array();
+ if ($start_id)
+ {
+ $ret['next_page'] = $start_id;
+ }
+ $ret['urls'] = $urls;
+ return $ret;
+}
+
+/**
+ * API method
+ * Returns Piwigo version
+ * @param mixed[] $params
+ */
+function ws_getVersion($params, &$service)
+{
+ global $conf;
+
+ if ($conf['show_version'] or is_admin())
+ {
+ return PHPWG_VERSION;
+ }
+ else
+ {
+ return new PwgError(403, 'Forbidden');
+ }
+}
+
+/**
+ * API method
+ * Returns general informations about the installation
+ * @param mixed[] $params
+ */
+function ws_getInfos($params, &$service)
+{
+ $infos['version'] = PHPWG_VERSION;
+
+ $query = 'SELECT COUNT(*) FROM '.IMAGES_TABLE.';';
+ list($infos['nb_elements']) = pwg_db_fetch_row(pwg_query($query));
+
+ $query = 'SELECT COUNT(*) FROM '.CATEGORIES_TABLE.';';
+ list($infos['nb_categories']) = pwg_db_fetch_row(pwg_query($query));
+
+ $query = 'SELECT COUNT(*) FROM '.CATEGORIES_TABLE.' WHERE dir IS NULL;';
+ list($infos['nb_virtual']) = pwg_db_fetch_row(pwg_query($query));
+
+ $query = 'SELECT COUNT(*) FROM '.CATEGORIES_TABLE.' WHERE dir IS NOT NULL;';
+ list($infos['nb_physical']) = pwg_db_fetch_row(pwg_query($query));
+
+ $query = 'SELECT COUNT(*) FROM '.IMAGE_CATEGORY_TABLE.';';
+ list($infos['nb_image_category']) = pwg_db_fetch_row(pwg_query($query));
+
+ $query = 'SELECT COUNT(*) FROM '.TAGS_TABLE.';';
+ list($infos['nb_tags']) = pwg_db_fetch_row(pwg_query($query));
+
+ $query = 'SELECT COUNT(*) FROM '.IMAGE_TAG_TABLE.';';
+ list($infos['nb_image_tag']) = pwg_db_fetch_row(pwg_query($query));
+
+ $query = 'SELECT COUNT(*) FROM '.USERS_TABLE.';';
+ list($infos['nb_users']) = pwg_db_fetch_row(pwg_query($query));
+
+ $query = 'SELECT COUNT(*) FROM '.GROUPS_TABLE.';';
+ list($infos['nb_groups']) = pwg_db_fetch_row(pwg_query($query));
+
+ $query = 'SELECT COUNT(*) FROM '.COMMENTS_TABLE.';';
+ list($infos['nb_comments']) = pwg_db_fetch_row(pwg_query($query));
+
+ // first element
+ if ($infos['nb_elements'] > 0)
+ {
+ $query = 'SELECT MIN(date_available) FROM '.IMAGES_TABLE.';';
+ list($infos['first_date']) = pwg_db_fetch_row(pwg_query($query));
+ }
+
+ // unvalidated comments
+ if ($infos['nb_comments'] > 0)
+ {
+ $query = 'SELECT COUNT(*) FROM '.COMMENTS_TABLE.' WHERE validated=\'false\';';
+ list($infos['nb_unvalidated_comments']) = pwg_db_fetch_row(pwg_query($query));
+ }
+
+ foreach ($infos as $name => $value)
+ {
+ $output[] = array(
+ 'name' => $name,
+ 'value' => $value,
+ );
+ }
+
+ return array('infos' => new PwgNamedArray($output, 'item'));
+}
+
+/**
+ * API method
+ * Adds images to the caddie
+ * @param mixed[] $params
+ * @option int[] image_id
+ */
+function ws_caddie_add($params, &$service)
+{
+ global $user;
+
+ $query = '
+SELECT id
+ FROM '. IMAGES_TABLE .'
+ LEFT JOIN '. CADDIE_TABLE .'
+ ON id=element_id AND user_id='. $user['id'] .'
+ WHERE id IN ('. implode(',',$params['image_id']) .')
+ AND element_id IS NULL
+;';
+ $result = array_from_query($query, 'id');
+
+ $datas = array();
+ foreach ($result as $id)
+ {
+ $datas[] = array(
+ 'element_id' => $id,
+ 'user_id' => $user['id'],
+ );
+ }
+ if (count($datas))
+ {
+ mass_inserts(
+ CADDIE_TABLE,
+ array('element_id','user_id'),
+ $datas
+ );
+ }
+ return count($datas);
+}
+
+/**
+ * API method
+ * Deletes rates of an user
+ * @param mixed[] $params
+ * @option int user_id
+ * @option string anonymous_id (optional)
+ */
+function ws_rates_delete($params, &$service)
+{
+ $query = '
+DELETE FROM '. RATE_TABLE .'
+ WHERE user_id='. $params['user_id'];
+
+ if (!empty($params['anonymous_id']))
+ {
+ $query .= ' AND anonymous_id=\''.$params['anonymous_id'].'\'';
+ }
+
+ $changes = pwg_db_changes(pwg_query($query));
+ if ($changes)
+ {
+ include_once(PHPWG_ROOT_PATH.'include/functions_rate.inc.php');
+ update_rating_score();
+ }
+ return $changes;
+}
+
+/**
+ * API method
+ * Performs a login
+ * @param mixed[] $params
+ * @option string username
+ * @option string password
+ */
+function ws_session_login($params, &$service)
+{
+ if (try_log_user($params['username'], $params['password'], false))
+ {
+ return true;
+ }
+ return new PwgError(999, 'Invalid username/password');
+}
+
+
+/**
+ * API method
+ * Performs a logout
+ * @param mixed[] $params
+ */
+function ws_session_logout($params, &$service)
+{
+ if (!is_a_guest())
+ {
+ logout_user();
+ }
+ return true;
+}
+
+/**
+ * API method
+ * Returns info about the current user
+ * @param mixed[] $params
+ */
+function ws_session_getStatus($params, &$service)
+{
+ global $user;
+
+ $res['username'] = is_a_guest() ? 'guest' : stripslashes($user['username']);
+ foreach ( array('status', 'theme', 'language') as $k )
+ {
+ $res[$k] = $user[$k];
+ }
+ $res['pwg_token'] = get_pwg_token();
+ $res['charset'] = get_pwg_charset();
+
+ list($dbnow) = pwg_db_fetch_row(pwg_query('SELECT NOW();'));
+ $res['current_datetime'] = $dbnow;
+
+ return $res;
+}
+
+?> \ No newline at end of file
diff --git a/include/ws_functions/pwg.tags.php b/include/ws_functions/pwg.tags.php
new file mode 100644
index 000000000..09ce21bd0
--- /dev/null
+++ b/include/ws_functions/pwg.tags.php
@@ -0,0 +1,244 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+/**
+ * API method
+ * Returns a list of tags
+ * @param mixed[] $params
+ * @option bool sort_by_counter
+ */
+function ws_tags_getList($params, &$service)
+{
+ $tags = get_available_tags();
+ if ($params['sort_by_counter'])
+ {
+ usort($tags, create_function('$a,$b', 'return -$a["counter"]+$b["counter"];') );
+ }
+ else
+ {
+ usort($tags, 'tag_alpha_compare');
+ }
+
+ for ($i=0; $i<count($tags); $i++)
+ {
+ $tags[$i]['id'] = (int)$tags[$i]['id'];
+ $tags[$i]['counter'] = (int)$tags[$i]['counter'];
+ $tags[$i]['url'] = make_index_url(
+ array(
+ 'section'=>'tags',
+ 'tags'=>array($tags[$i])
+ )
+ );
+ }
+
+ return array(
+ 'tags' => new PwgNamedArray(
+ $tags,
+ 'tag',
+ ws_std_get_tag_xml_attributes()
+ )
+ );
+}
+
+/**
+ * API method
+ * Returns the list of tags as you can see them in administration
+ * @param mixed[] $params
+ *
+ * Only admin can run this method and permissions are not taken into
+ * account.
+ */
+function ws_tags_getAdminList($params, &$service)
+{
+ return array(
+ 'tags' => new PwgNamedArray(
+ get_all_tags(),
+ 'tag',
+ ws_std_get_tag_xml_attributes()
+ )
+ );
+}
+
+/**
+ * API method
+ * Returns a list of images for tags
+ * @param mixed[] $params
+ * @option int[] tag_id (optional)
+ * @option string[] tag_url_name (optional)
+ * @option string[] tag_name (optional)
+ * @option bool tag_mode_and
+ * @option int per_page
+ * @option int page
+ * @option string order
+ */
+function ws_tags_getImages($params, &$service)
+{
+ // first build all the tag_ids we are interested in
+ $tags = find_tags($params['tag_id'], $params['tag_url_name'], $params['tag_name']);
+ $tags_by_id = array();
+ foreach ($tags as $tag)
+ {
+ $tags['id'] = (int)$tag['id'];
+ $tags_by_id[ $tag['id'] ] = $tag;
+ }
+ unset($tags);
+ $tag_ids = array_keys($tags_by_id);
+
+ $where_clauses = ws_std_image_sql_filter($params);
+ if (!empty($where_clauses))
+ {
+ $where_clauses = implode(' AND ', $where_clauses);
+ }
+
+ $image_ids = get_image_ids_for_tags(
+ $tag_ids,
+ $params['tag_mode_and'] ? 'AND' : 'OR',
+ $where_clauses,
+ ws_std_image_sql_order($params)
+ );
+
+ $count_set = count($image_ids);
+ $image_ids = array_slice($image_ids, $params['per_page']*$params['page'], $params['per_page'] );
+
+ $image_tag_map = array();
+ // build list of image ids with associated tags per image
+ if (!empty($image_ids) and !$params['tag_mode_and'])
+ {
+ $query = '
+SELECT image_id, GROUP_CONCAT(tag_id) AS tag_ids
+ FROM '. IMAGE_TAG_TABLE .'
+ WHERE tag_id IN ('. implode(',', $tag_ids) .')
+ AND image_id IN ('. implode(',', $image_ids) .')
+ GROUP BY image_id
+;';
+ $result = pwg_query($query);
+
+ while ($row = pwg_db_fetch_assoc($result))
+ {
+ $row['image_id'] = (int)$row['image_id'];
+ $image_ids[] = $row['image_id'];
+ $image_tag_map[ $row['image_id'] ] = explode(',', $row['tag_ids']);
+ }
+ }
+
+ $images = array();
+ if (!empty($image_ids))
+ {
+ $rank_of = array_flip($image_ids);
+
+ $query = '
+SELECT *
+ FROM '. IMAGES_TABLE .'
+ WHERE id IN ('. implode(',',$image_ids) .')
+;';
+ $result = pwg_query($query);
+
+ while ($row = pwg_db_fetch_assoc($result))
+ {
+ $image = array();
+ $image['rank'] = $rank_of[ $row['id'] ];
+
+ foreach (array('id', 'width', 'height', 'hit') as $k)
+ {
+ if (isset($row[$k]))
+ {
+ $image[$k] = (int)$row[$k];
+ }
+ }
+ foreach (array('file', 'name', 'comment', 'date_creation', 'date_available') as $k)
+ {
+ $image[$k] = $row[$k];
+ }
+ $image = array_merge( $image, ws_std_get_urls($row) );
+
+ $image_tag_ids = ($params['tag_mode_and']) ? $tag_ids : $image_tag_map[$image['id']];
+ $image_tags = array();
+ foreach ($image_tag_ids as $tag_id)
+ {
+ $url = make_index_url(
+ array(
+ 'section'=>'tags',
+ 'tags'=> array($tags_by_id[$tag_id])
+ )
+ );
+ $page_url = make_picture_url(
+ array(
+ 'section'=>'tags',
+ 'tags'=> array($tags_by_id[$tag_id]),
+ 'image_id' => $row['id'],
+ 'image_file' => $row['file'],
+ )
+ );
+ $image_tags[] = array(
+ 'id' => (int)$tag_id,
+ 'url' => $url,
+ 'page_url' => $page_url,
+ );
+ }
+
+ $image['tags'] = new PwgNamedArray($image_tags, 'tag', ws_std_get_tag_xml_attributes() );
+ $images[] = $image;
+ }
+
+ usort($images, 'rank_compare');
+ unset($rank_of);
+ }
+
+ return array(
+ 'paging' => new PwgNamedStruct(
+ array(
+ 'page' => $params['page'],
+ 'per_page' => $params['per_page'],
+ 'count' => count($images),
+ 'total_count' => $count_set,
+ )
+ ),
+ 'images' => new PwgNamedArray(
+ $images,
+ 'image',
+ ws_std_get_image_xml_attributes()
+ )
+ );
+}
+
+/**
+ * API method
+ * Adds a tag
+ * @param mixed[] $params
+ * @option string name
+ */
+function ws_tags_add($params, &$service)
+{
+ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+ $creation_output = create_tag($params['name']);
+
+ if (isset($creation_output['error']))
+ {
+ return new PwgError(500, $creation_output['error']);
+ }
+
+ return $creation_output;
+}
+
+?> \ No newline at end of file
diff --git a/include/ws_functions/pwg.users.php b/include/ws_functions/pwg.users.php
new file mode 100644
index 000000000..d8b70c6ae
--- /dev/null
+++ b/include/ws_functions/pwg.users.php
@@ -0,0 +1,571 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+/**
+ * API method
+ * Returns a list of users
+ * @param mixed[] $params
+ * @option int[] user_id (optional)
+ * @option string username (optional)
+ * @option string[] status (optional)
+ * @option int min_level (optional)
+ * @option int[] group_id (optional)
+ * @option int per_page
+ * @option int page
+ * @option string order
+ * @option string display
+ */
+function ws_users_getList($params, &$service)
+{
+ global $conf;
+
+ $where_clauses = array('1=1');
+
+ if (!empty($params['user_id']))
+ {
+ $where_clauses[] = 'u.'.$conf['user_fields']['id'].' IN('. implode(',', $params['user_id']) .')';
+ }
+
+ if (!empty($params['username']))
+ {
+ $where_clauses[] = 'u.'.$conf['user_fields']['username'].' LIKE \''.pwg_db_real_escape_string($params['username']).'\'';
+ }
+
+ if (!empty($params['status']))
+ {
+ $params['status'] = array_intersect($params['status'], get_enums(USER_INFOS_TABLE, 'status'));
+ if (count($params['status']) > 0)
+ {
+ $where_clauses[] = 'ui.status IN("'. implode('","', $params['status']) .'")';
+ }
+ }
+
+ if (!empty($params['min_level']))
+ {
+ if ( !in_array($params['min_level'], $conf['available_permission_levels']) )
+ {
+ return new PwgError(WS_ERR_INVALID_PARAM, 'Invalid level');
+ }
+ $where_clauses[] = 'ui.level >= '.$params['min_level'];
+ }
+
+ if (!empty($params['group_id']))
+ {
+ $where_clauses[] = 'ug.group_id IN('. implode(',', $params['group_id']) .')';
+ }
+
+ $display = array('u.'.$conf['user_fields']['id'] => 'id');
+
+ if ($params['display'] != 'none')
+ {
+ $params['display'] = array_map('trim', explode(',', $params['display']));
+
+ if (in_array('all', $params['display']))
+ {
+ $params['display'] = array(
+ 'username','email','status','level','groups','language','theme',
+ 'nb_image_page','recent_period','expand','show_nb_comments','show_nb_hits',
+ 'enabled_high','registration_date','registration_date_string',
+ 'registration_date_since', 'last_visit', 'last_visit_string',
+ 'last_visit_since'
+ );
+ }
+ else if (in_array('basics', $params['display']))
+ {
+ $params['display'] = array_merge($params['display'], array(
+ 'username','email','status','level','groups',
+ ));
+ }
+ $params['display'] = array_flip($params['display']);
+
+ // if registration_date_string or registration_date_since is requested,
+ // then registration_date is automatically added
+ if (isset($params['display']['registration_date_string']) or isset($params['display']['registration_date_since']))
+ {
+ $params['display']['registration_date'] = true;
+ }
+
+ // if last_visit_string or last_visit_since is requested, then
+ // last_visit is automatically added
+ if (isset($params['display']['last_visit_string']) or isset($params['display']['last_visit_since']))
+ {
+ $params['display']['last_visit'] = true;
+ }
+
+ if (isset($params['display']['username']))
+ {
+ $display['u.'.$conf['user_fields']['username']] = 'username';
+ }
+ if (isset($params['display']['email']))
+ {
+ $display['u.'.$conf['user_fields']['email']] = 'email';
+ }
+
+ $ui_fields = array(
+ 'status','level','language','theme','nb_image_page','recent_period','expand',
+ 'show_nb_comments','show_nb_hits','enabled_high','registration_date'
+ );
+ foreach ($ui_fields as $field)
+ {
+ if (isset($params['display'][$field]))
+ {
+ $display['ui.'.$field] = $field;
+ }
+ }
+ }
+ else
+ {
+ $params['display'] = array();
+ }
+
+ $query = '
+SELECT DISTINCT ';
+
+ $first = true;
+ foreach ($display as $field => $name)
+ {
+ if (!$first) $query.= ', ';
+ else $first = false;
+ $query.= $field .' AS '. $name;
+ }
+ if (isset($params['display']['groups']))
+ {
+ if (!$first) $query.= ', ';
+ $query.= '"" AS groups';
+ }
+
+ $query.= '
+ FROM '. USERS_TABLE .' AS u
+ INNER JOIN '. USER_INFOS_TABLE .' AS ui
+ ON u.'. $conf['user_fields']['id'] .' = ui.user_id
+ LEFT JOIN '. USER_GROUP_TABLE .' AS ug
+ ON u.'. $conf['user_fields']['id'] .' = ug.user_id
+ WHERE
+ '. implode(' AND ', $where_clauses) .'
+ ORDER BY '. $params['order'] .'
+ LIMIT '. $params['per_page'] .'
+ OFFSET '. ($params['per_page']*$params['page']) .'
+;';
+
+ $users = array();
+ $result = pwg_query($query);
+ while ($row = pwg_db_fetch_assoc($result))
+ {
+ $row['id'] = intval($row['id']);
+ $users[ $row['id'] ] = $row;
+ }
+
+ if (count($users) > 0)
+ {
+ if (isset($params['display']['groups']))
+ {
+ $query = '
+SELECT user_id, group_id
+ FROM '. USER_GROUP_TABLE .'
+ WHERE user_id IN ('. implode(',', array_keys($users)) .')
+;';
+ $result = pwg_query($query);
+
+ while ($row = pwg_db_fetch_assoc($result))
+ {
+ $users[ $row['user_id'] ]['groups'][] = intval($row['group_id']);
+ }
+ }
+
+ if (isset($params['display']['registration_date_string']))
+ {
+ foreach ($users as $cur_user)
+ {
+ $users[$cur_user['id']]['registration_date_string'] = format_date($cur_user['registration_date'], false, false);
+ }
+ }
+
+ if (isset($params['display']['registration_date_since']))
+ {
+ foreach ($users as $cur_user)
+ {
+ $users[ $cur_user['id'] ]['registration_date_since'] = time_since($cur_user['registration_date'], 'month');
+ }
+ }
+
+ if (isset($params['display']['last_visit']))
+ {
+ $query = '
+SELECT
+ MAX(id) as history_id
+ FROM '.HISTORY_TABLE.'
+ WHERE user_id IN ('.implode(',', array_keys($users)).')
+ GROUP BY user_id
+;';
+ $history_ids = array_from_query($query, 'history_id');
+
+ if (count($history_ids) == 0)
+ {
+ $history_ids[] = -1;
+ }
+
+ $query = '
+SELECT
+ user_id,
+ date,
+ time
+ FROM '.HISTORY_TABLE.'
+ WHERE id IN ('.implode(',', $history_ids).')
+;';
+ $result = pwg_query($query);
+ while ($row = pwg_db_fetch_assoc($result))
+ {
+ $last_visit = $row['date'].' '.$row['time'];
+ $users[ $row['user_id'] ]['last_visit'] = $last_visit;
+
+ if (isset($params['display']['last_visit_string']))
+ {
+ $users[ $row['user_id'] ]['last_visit_string'] = format_date($last_visit, false, false);
+ }
+
+ if (isset($params['display']['last_visit_since']))
+ {
+ $users[ $row['user_id'] ]['last_visit_since'] = time_since($last_visit, 'day');
+ }
+ }
+ }
+ }
+
+ return array(
+ 'paging' => new PwgNamedStruct(
+ array(
+ 'page' => $params['page'],
+ 'per_page' => $params['per_page'],
+ 'count' => count($users)
+ )
+ ),
+ 'users' => new PwgNamedArray(array_values($users), 'user')
+ );
+}
+
+/**
+ * API method
+ * Adds a user
+ * @param mixed[] $params
+ * @option string username
+ * @option string password (optional)
+ * @option string email (optional)
+ */
+function ws_users_add($params, &$service)
+{
+ global $conf;
+
+ if ($conf['double_password_type_in_admin'])
+ {
+ if ($params['password'] != $params['password_confirm'])
+ {
+ return new PwgError(WS_ERR_INVALID_PARAM, l10n('The passwords do not match'));
+ }
+ }
+
+ $user_id = register_user(
+ $params['username'],
+ $params['password'],
+ $params['email'],
+ false, // notify admin
+ $errors,
+ $params['send_password_by_mail']
+ );
+
+ if (!$user_id)
+ {
+ return new PwgError(WS_ERR_INVALID_PARAM, $errors[0]);
+ }
+
+ return $service->invoke('pwg.users.getList', array('user_id'=>$user_id));
+}
+
+/**
+ * API method
+ * Deletes users
+ * @param mixed[] $params
+ * @option int[] user_id
+ * @option string pwg_token
+ */
+function ws_users_delete($params, &$service)
+{
+ if (get_pwg_token() != $params['pwg_token'])
+ {
+ return new PwgError(403, 'Invalid security token');
+ }
+
+ global $conf, $user;
+
+ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+ // protect some users
+ $params['user_id'] = array_diff(
+ $params['user_id'],
+ array(
+ $user['id'],
+ $conf['guest_id'],
+ $conf['default_user_id'],
+ $conf['webmaster_id'],
+ )
+ );
+
+ foreach ($params['user_id'] as $user_id)
+ {
+ delete_user($user_id);
+ }
+
+ return l10n_dec(
+ '%d user deleted', '%d users deleted',
+ count($params['user_id'])
+ );
+}
+
+/**
+ * API method
+ * Updates users
+ * @param mixed[] $params
+ * @option int[] user_id
+ * @option string username (optional)
+ * @option string password (optional)
+ * @option string email (optional)
+ * @option string status (optional)
+ * @option int level (optional)
+ * @option string language (optional)
+ * @option string theme (optional)
+ * @option int nb_image_page (optional)
+ * @option int recent_period (optional)
+ * @option bool expand (optional)
+ * @option bool show_nb_comments (optional)
+ * @option bool show_nb_hits (optional)
+ * @option bool enabled_high (optional)
+ */
+function ws_users_setInfo($params, &$service)
+{
+ global $conf, $user;
+
+ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+ $updates = $updates_infos = array();
+ $update_status = null;
+
+ if (count($params['user_id']) == 1)
+ {
+ if (get_username($params['user_id'][0]) === false)
+ {
+ return new PwgError(WS_ERR_INVALID_PARAM, 'This user does not exist.');
+ }
+
+ if (!empty($params['username']))
+ {
+ $user_id = get_userid($params['username']);
+ if ($user_id and $user_id != $params['user_id'][0])
+ {
+ return new PwgError(WS_ERR_INVALID_PARAM, l10n('this login is already used'));
+ }
+ if ($params['username'] != strip_tags($params['username']))
+ {
+ return new PwgError(WS_ERR_INVALID_PARAM, l10n('html tags are not allowed in login'));
+ }
+ $updates[ $conf['user_fields']['username'] ] = $params['username'];
+ }
+
+ if (!empty($params['email']))
+ {
+ if ( ($error = validate_mail_address($params['user_id'][0], $params['email'])) != '')
+ {
+ return new PwgError(WS_ERR_INVALID_PARAM, $error);
+ }
+ $updates[ $conf['user_fields']['email'] ] = $params['email'];
+ }
+
+ if (!empty($params['password']))
+ {
+ $updates[ $conf['user_fields']['password'] ] = $conf['password_hash']($params['password']);
+ }
+ }
+
+ if (!empty($params['status']))
+ {
+ if ( $params['status'] == 'webmaster' and !is_webmaster() )
+ {
+ return new PwgError(403, 'Only webmasters can grant "webmaster" status');
+ }
+ if ( !in_array($params['status'], array('guest','generic','normal','admin','webmaster')) )
+ {
+ return new PwgError(WS_ERR_INVALID_PARAM, 'Invalid status');
+ }
+
+ // status update query is separated from the rest as not applying to the same
+ // set of users (current, guest and webmaster can't be changed)
+ $params['user_id_for_status'] = array_diff(
+ $params['user_id'],
+ array(
+ $user['id'],
+ $conf['guest_id'],
+ $conf['webmaster_id'],
+ )
+ );
+
+ $update_status = $params['status'];
+ }
+
+ if (!empty($params['level']) or @$params['level']===0)
+ {
+ if ( !in_array($params['level'], $conf['available_permission_levels']) )
+ {
+ return new PwgError(WS_ERR_INVALID_PARAM, 'Invalid level');
+ }
+ $updates_infos['level'] = $params['level'];
+ }
+
+ if (!empty($params['language']))
+ {
+ if ( !in_array($params['language'], array_keys(get_languages())) )
+ {
+ return new PwgError(WS_ERR_INVALID_PARAM, 'Invalid language');
+ }
+ $updates_infos['language'] = $params['language'];
+ }
+
+ if (!empty($params['theme']))
+ {
+ if ( !in_array($params['theme'], array_keys(get_pwg_themes())) )
+ {
+ return new PwgError(WS_ERR_INVALID_PARAM, 'Invalid theme');
+ }
+ $updates_infos['theme'] = $params['theme'];
+ }
+
+ if (!empty($params['nb_image_page']))
+ {
+ $updates_infos['nb_image_page'] = $params['nb_image_page'];
+ }
+
+ if (!empty($params['recent_period']) or @$params['recent_period']===0)
+ {
+ $updates_infos['recent_period'] = $params['recent_period'];
+ }
+
+ if (!empty($params['expand']) or @$params['expand']===false)
+ {
+ $updates_infos['expand'] = boolean_to_string($params['expand']);
+ }
+
+ if (!empty($params['show_nb_comments']) or @$params['show_nb_comments']===false)
+ {
+ $updates_infos['show_nb_comments'] = boolean_to_string($params['show_nb_comments']);
+ }
+
+ if (!empty($params['show_nb_hits']) or @$params['show_nb_hits']===false)
+ {
+ $updates_infos['show_nb_hits'] = boolean_to_string($params['show_nb_hits']);
+ }
+
+ if (!empty($params['enabled_high']) or @$params['enabled_high']===false)
+ {
+ $updates_infos['enabled_high'] = boolean_to_string($params['enabled_high']);
+ }
+
+ // perform updates
+ single_update(
+ USERS_TABLE,
+ $updates,
+ array($conf['user_fields']['id'] => $params['user_id'][0])
+ );
+
+ if (isset($update_status) and count($params['user_id_for_status']) > 0)
+ {
+ $query = '
+UPDATE '. USER_INFOS_TABLE .' SET
+ status = "'. $update_status .'"
+ WHERE user_id IN('. implode(',', $params['user_id_for_status']) .')
+;';
+ pwg_query($query);
+ }
+
+ if (count($updates_infos) > 0)
+ {
+ $query = '
+UPDATE '. USER_INFOS_TABLE .' SET ';
+
+ $first = true;
+ foreach ($updates_infos as $field => $value)
+ {
+ if (!$first) $query.= ', ';
+ else $first = false;
+ $query.= $field .' = "'. $value .'"';
+ }
+
+ $query.= '
+ WHERE user_id IN('. implode(',', $params['user_id']) .')
+;';
+ pwg_query($query);
+ }
+
+ // manage association to groups
+ if (!empty($params['group_id']))
+ {
+ $query = '
+DELETE
+ FROM '.USER_GROUP_TABLE.'
+ WHERE user_id IN ('.implode(',', $params['user_id']).')
+;';
+ pwg_query($query);
+
+ // we remove all provided groups that do not really exist
+ $query = '
+SELECT
+ id
+ FROM '.GROUPS_TABLE.'
+ WHERE id IN ('.implode(',', $params['group_id']).')
+;';
+ $group_ids = array_from_query($query, 'id');
+
+ // if only -1 (a group id that can't exist) is in the list, then no
+ // group is associated
+
+ if (count($group_ids) > 0)
+ {
+ $inserts = array();
+
+ foreach ($group_ids as $group_id)
+ {
+ foreach ($params['user_id'] as $user_id)
+ {
+ $inserts[] = array('user_id' => $user_id, 'group_id' => $group_id);
+ }
+ }
+
+ mass_inserts(USER_GROUP_TABLE, array_keys($inserts[0]), $inserts);
+ }
+ }
+
+ invalidate_user_cache();
+
+ return $service->invoke('pwg.users.getList', array(
+ 'user_id' => $params['user_id'],
+ 'display' => 'basics,'.implode(',', array_keys($updates_infos)),
+ ));
+}
+
+?> \ No newline at end of file
diff --git a/include/ws_protocols/index.php b/include/ws_protocols/index.php
index 41732f2fd..c8de97f60 100644
--- a/include/ws_protocols/index.php
+++ b/include/ws_protocols/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/include/ws_protocols/json_encoder.php b/include/ws_protocols/json_encoder.php
index 7d400aae8..695498b74 100644
--- a/include/ws_protocols/json_encoder.php
+++ b/include/ws_protocols/json_encoder.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/include/ws_protocols/php_encoder.php b/include/ws_protocols/php_encoder.php
index 5d18d680c..485ad89ea 100644
--- a/include/ws_protocols/php_encoder.php
+++ b/include/ws_protocols/php_encoder.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/include/ws_protocols/rest_encoder.php b/include/ws_protocols/rest_encoder.php
index 5f86acb6d..2c8dbd698 100644
--- a/include/ws_protocols/rest_encoder.php
+++ b/include/ws_protocols/rest_encoder.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -66,7 +66,7 @@ class PwgXmlWriter
}
$this->_output( '<'.$name );
$this->_lastTagOpen = true;
- array_push( $this->_elementStack, $name);
+ $this->_elementStack[] = $name;
}
function end_element($x)
@@ -226,11 +226,9 @@ class PwgRestEncoder extends PwgResponseEncoder
continue;
if ( is_null($value) )
continue; // null means we dont put it
- if ($name!=WS_XML_CONTENT)
- $this->_writer->start_element($name);
+ $this->_writer->start_element($name);
$this->encode($value);
- if ($name!=WS_XML_CONTENT)
- $this->_writer->end_element($name);
+ $this->_writer->end_element($name);
}
}
@@ -270,7 +268,7 @@ class PwgRestEncoder extends PwgResponseEncoder
$this->encode_array($data->_content, $data->_itemName, $data->_xmlAttributes);
break;
case 'pwgnamedstruct':
- $this->encode_array( array($data->_content), $data->_name, $data->_xmlAttributes);
+ $this->encode_struct($data->_content, false, $data->_xmlAttributes);
break;
default:
$this->encode_struct(get_object_vars($data), true);
diff --git a/include/ws_protocols/rest_handler.php b/include/ws_protocols/rest_handler.php
index b00987e02..e706ef7fa 100644
--- a/include/ws_protocols/rest_handler.php
+++ b/include/ws_protocols/rest_handler.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,7 +21,7 @@
// | USA. |
// +-----------------------------------------------------------------------+
-class PwgRestRequestHandler
+class PwgRestRequestHandler extends PwgRequestHandler
{
function handleRequest(&$service)
{
diff --git a/include/ws_protocols/xmlrpc_encoder.php b/include/ws_protocols/xmlrpc_encoder.php
index 629b77e75..d081f6d27 100644
--- a/include/ws_protocols/xmlrpc_encoder.php
+++ b/include/ws_protocols/xmlrpc_encoder.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/index.php b/index.php
index fe79bc9f0..289059227 100644
--- a/index.php
+++ b/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -68,8 +68,8 @@ if (isset($_GET['display']))
pwg_set_session_var('index_deriv', $_GET['display']);
}
}
-//-------------------------------------------------------------- initialization
+//-------------------------------------------------------------- initialization
// navigation bar
$page['navigation_bar'] = array();
if (count($page['items']) > $page['nb_image_page'])
@@ -107,15 +107,8 @@ else
}
$template->assign('U_CANONICAL', $canonical_url);
-//----------------------------------------------------- template initialization
-//
-// Start output of page
-//
+//-------------------------------------------------------------- page title
$title = $page['title'];
-$page['body_id'] = 'theCategoryPage';
-
-$template->set_filenames( array('index'=>'index.tpl') );
-//-------------------------------------------------------------- category title
$template_title = $page['section_title'];
if (count($page['items']) > 0)
{
@@ -123,219 +116,250 @@ if (count($page['items']) > 0)
}
$template->assign('TITLE', $template_title);
-if (isset($page['flat']) or isset($page['chronology_field']))
-{
- $template->assign(
- 'U_MODE_NORMAL',
- duplicate_index_url( array(), array('chronology_field', 'start', 'flat') )
- );
-}
+//-------------------------------------------------------------- menubar
+include( PHPWG_ROOT_PATH.'include/menubar.inc.php');
-if ($conf['index_flat_icon'] and !isset($page['flat']) and 'categories' == $page['section'])
-{
- $template->assign(
- 'U_MODE_FLAT',
- duplicate_index_url(array('flat' => ''), array('start', 'chronology_field'))
- );
-}
+$template->set_filename('index', 'index.tpl');
-if (!isset($page['chronology_field']))
+// +-----------------------------------------------------------------------+
+// | index page (categories, thumbnails, search, calendar, random, etc.) |
+// +-----------------------------------------------------------------------+
+if ( empty($page['is_external']) or !$page['is_external'] )
{
- $chronology_params =
- array(
- 'chronology_field' => 'created',
- 'chronology_style' => 'monthly',
- 'chronology_view' => 'list',
- );
- if ($conf['index_created_date_icon'])
+ //----------------------------------------------------- template initialization
+ $page['body_id'] = 'theCategoryPage';
+
+ if (isset($page['flat']) or isset($page['chronology_field']))
{
$template->assign(
- 'U_MODE_CREATED',
- duplicate_index_url( $chronology_params, array('start', 'flat') )
+ 'U_MODE_NORMAL',
+ duplicate_index_url( array(), array('chronology_field', 'start', 'flat') )
);
}
- if ($conf['index_posted_date_icon'])
+
+ if ($conf['index_flat_icon'] and !isset($page['flat']) and 'categories' == $page['section'])
{
- $chronology_params['chronology_field'] = 'posted';
$template->assign(
- 'U_MODE_POSTED',
- duplicate_index_url( $chronology_params, array('start', 'flat') )
+ 'U_MODE_FLAT',
+ duplicate_index_url(array('flat' => ''), array('start', 'chronology_field'))
);
}
-}
-else
-{
- if ($page['chronology_field'] == 'created')
+
+ if (!isset($page['chronology_field']))
{
- $chronology_field = 'posted';
+ $chronology_params = array(
+ 'chronology_field' => 'created',
+ 'chronology_style' => 'monthly',
+ 'chronology_view' => 'list',
+ );
+ if ($conf['index_created_date_icon'])
+ {
+ $template->assign(
+ 'U_MODE_CREATED',
+ duplicate_index_url( $chronology_params, array('start', 'flat') )
+ );
+ }
+ if ($conf['index_posted_date_icon'])
+ {
+ $chronology_params['chronology_field'] = 'posted';
+ $template->assign(
+ 'U_MODE_POSTED',
+ duplicate_index_url( $chronology_params, array('start', 'flat') )
+ );
+ }
}
else
{
- $chronology_field = 'created';
+ if ($page['chronology_field'] == 'created')
+ {
+ $chronology_field = 'posted';
+ }
+ else
+ {
+ $chronology_field = 'created';
+ }
+ if ($conf['index_'.$chronology_field.'_date_icon'])
+ {
+ $url = duplicate_index_url(
+ array('chronology_field'=>$chronology_field ),
+ array('chronology_date', 'start', 'flat')
+ );
+ $template->assign(
+ 'U_MODE_'.strtoupper($chronology_field),
+ $url
+ );
+ }
}
- if ($conf['index_'.$chronology_field.'_date_icon'])
+
+ if ('search' == $page['section'])
{
- $url = duplicate_index_url(
- array('chronology_field'=>$chronology_field ),
- array('chronology_date', 'start', 'flat')
- );
$template->assign(
- 'U_MODE_'.strtoupper($chronology_field),
- $url
+ 'U_SEARCH_RULES',
+ get_root_url().'search_rules.php?search_id='.$page['search']
);
}
-}
-
-if ('search' == $page['section'])
-{
- $template->assign(
- 'U_SEARCH_RULES',
- get_root_url().'search_rules.php?search_id='.$page['search']
- );
-}
-if (isset($page['category']) and is_admin())
-{
- $template->assign(
- 'U_EDIT',
- get_root_url().'admin.php?page=album-'.$page['category']['id']
- );
-}
-
-if (is_admin() and !empty($page['items']))
-{
- $template->assign(
- 'U_CADDIE',
- add_url_params(duplicate_index_url(), array('caddie'=>1) )
- );
-}
+ if (isset($page['category']) and is_admin())
+ {
+ $template->assign(
+ 'U_EDIT',
+ get_root_url().'admin.php?page=album-'.$page['category']['id']
+ );
+ }
-if ( $page['section']=='search' and $page['start']==0 and
- !isset($page['chronology_field']) and isset($page['qsearch_details']) )
-{
- $template->assign('QUERY_SEARCH',
- htmlspecialchars($page['qsearch_details']['q']) );
+ if (is_admin() and !empty($page['items']))
+ {
+ $template->assign(
+ 'U_CADDIE',
+ add_url_params(duplicate_index_url(), array('caddie'=>1) )
+ );
+ }
- $cats = array_merge(
- (array)@$page['qsearch_details']['matching_cats_no_images'],
- (array)@$page['qsearch_details']['matching_cats'] );
- if (count($cats))
+ if ( $page['section']=='search' and $page['start']==0 and
+ !isset($page['chronology_field']) and isset($page['qsearch_details']) )
{
- usort($cats, 'name_compare');
- $hints = array();
- foreach ( $cats as $cat )
+ $template->assign('QUERY_SEARCH',
+ htmlspecialchars($page['qsearch_details']['q']) );
+
+ $cats = array_merge(
+ (array)@$page['qsearch_details']['matching_cats_no_images'],
+ (array)@$page['qsearch_details']['matching_cats'] );
+ if (count($cats))
{
- $hints[] = get_cat_display_name( array($cat), '', false );
+ usort($cats, 'name_compare');
+ $hints = array();
+ foreach ( $cats as $cat )
+ {
+ $hints[] = get_cat_display_name( array($cat), '' );
+ }
+ $template->assign( 'category_search_results', $hints);
}
- $template->assign( 'category_search_results', $hints);
- }
- $tags = (array)@$page['qsearch_details']['matching_tags'];
- foreach ( $tags as $tag )
- {
- $tag['URL'] = make_index_url(array('tags'=>array($tag)));
- $template->append( 'tag_search_results', $tag);
+ $tags = (array)@$page['qsearch_details']['matching_tags'];
+ foreach ( $tags as $tag )
+ {
+ $tag['URL'] = make_index_url(array('tags'=>array($tag)));
+ $template->append( 'tag_search_results', $tag);
+ }
}
-}
-
-if ( $conf['index_sort_order_input']
- and count($page['items']) > 0
- and $page['section'] != 'most_visited'
- and $page['section'] != 'best_rated')
-{
// image order
- $order_idx = pwg_get_session_var( 'image_order', 0 );
-
- $url = add_url_params(
- duplicate_index_url(),
- array('image_order' => '')
- );
- foreach (get_category_preferred_image_orders() as $order_id => $order)
+ if ( $conf['index_sort_order_input']
+ and count($page['items']) > 0
+ and $page['section'] != 'most_visited'
+ and $page['section'] != 'best_rated')
{
- if ($order[2])
+ $preferred_image_orders = get_category_preferred_image_orders();
+ $order_idx = pwg_get_session_var( 'image_order', 0 );
+
+ // get first order field and direction
+ $first_order = substr($conf['order_by'], 9);
+ if (($pos = strpos($first_order, ',')) !== false)
{
- $template->append(
- 'image_orders',
- array(
+ $first_order = substr($first_order, 0, $pos);
+ }
+ $first_order = trim($first_order);
+
+ $url = add_url_params(
+ duplicate_index_url(),
+ array('image_order' => '')
+ );
+ $tpl_orders = array();
+ $order_selected = false;
+
+ foreach ($preferred_image_orders as $order_id => $order)
+ {
+ if ($order[2])
+ {
+ // force select if the field is the first field of order_by
+ if (!$order_selected && $order[1]==$first_order)
+ {
+ $order_idx = $order_id;
+ $order_selected = true;
+ }
+
+ $tpl_orders[ $order_id ] = array(
'DISPLAY' => $order[0],
'URL' => $url.$order_id,
- 'SELECTED' => ($order_idx == $order_id ? true:false),
- )
- );
+ 'SELECTED' => $order_idx==$order_id,
+ );
+ }
}
+
+ $tpl_orders[0]['SELECTED'] = !$order_selected; // unselect "Default" if another one is selected
+ $template->assign('image_orders', $tpl_orders);
}
-}
-
-// category comment
-if ($page['start']==0 and !isset($page['chronology_field']) and !empty($page['comment']) )
-{
- $template->assign('CONTENT_DESCRIPTION', $page['comment'] );
-}
-// include menubar
-include( PHPWG_ROOT_PATH.'include/menubar.inc.php');
-
-if ( isset($page['category']['count_categories']) and $page['category']['count_categories']==0 )
-{// count_categories might be computed by menubar - if the case unassign flat link if no sub albums
- $template->clear_assign('U_MODE_FLAT');
-}
+ // category comment
+ if ($page['start']==0 and !isset($page['chronology_field']) and !empty($page['comment']) )
+ {
+ $template->assign('CONTENT_DESCRIPTION', $page['comment'] );
+ }
-//------------------------------------------------------ main part : thumbnails
-if ( 0==$page['start']
- and !isset($page['flat'])
- and !isset($page['chronology_field'])
- and ('recent_cats'==$page['section'] or 'categories'==$page['section'])
- and (!isset($page['category']['count_categories']) or $page['category']['count_categories']>0 )
-)
-{
- include(PHPWG_ROOT_PATH.'include/category_cats.inc.php');
-}
+ if ( isset($page['category']['count_categories']) and $page['category']['count_categories']==0 )
+ {// count_categories might be computed by menubar - if the case unassign flat link if no sub albums
+ $template->clear_assign('U_MODE_FLAT');
+ }
-if ( !empty($page['items']) )
-{
- include(PHPWG_ROOT_PATH.'include/category_default.inc.php');
- $url = add_url_params(
- duplicate_index_url(),
- array('display' => '')
- );
- $selected_type = $template->get_template_vars('derivative_params')->type;
- $template->clear_assign( 'derivative_params' );
- $type_map = ImageStdParams::get_defined_type_map();
- unset($type_map[IMG_XXLARGE], $type_map[IMG_XLARGE]);
- foreach($type_map as $params)
+ //------------------------------------------------------ main part : thumbnails
+ if ( 0==$page['start']
+ and !isset($page['flat'])
+ and !isset($page['chronology_field'])
+ and ('recent_cats'==$page['section'] or 'categories'==$page['section'])
+ and (!isset($page['category']['count_categories']) or $page['category']['count_categories']>0 )
+ )
{
- $template->append(
- 'image_derivatives',
- array(
- 'DISPLAY' => l10n($params->type),
- 'URL' => $url.$params->type,
- 'SELECTED' => ($params->type == $selected_type ? true:false),
- )
- );
+ include(PHPWG_ROOT_PATH.'include/category_cats.inc.php');
}
-}
-//------------------------------------------------------- category informations
-// slideshow
-// execute after init thumbs in order to have all picture informations
-if (!empty($page['cat_slideshow_url']))
-{
- if (isset($_GET['slideshow']))
+ if ( !empty($page['items']) )
{
- redirect($page['cat_slideshow_url']);
+ include(PHPWG_ROOT_PATH.'include/category_default.inc.php');
+ $url = add_url_params(
+ duplicate_index_url(),
+ array('display' => '')
+ );
+
+ $selected_type = $template->get_template_vars('derivative_params')->type;
+ $template->clear_assign( 'derivative_params' );
+ $type_map = ImageStdParams::get_defined_type_map();
+ unset($type_map[IMG_XXLARGE], $type_map[IMG_XLARGE]);
+
+ foreach($type_map as $params)
+ {
+ $template->append(
+ 'image_derivatives',
+ array(
+ 'DISPLAY' => l10n($params->type),
+ 'URL' => $url.$params->type,
+ 'SELECTED' => ($params->type == $selected_type ? true:false),
+ )
+ );
+ }
}
- elseif ($conf['index_slideshow_icon'])
+
+ // slideshow
+ // execute after init thumbs in order to have all picture informations
+ if (!empty($page['cat_slideshow_url']))
{
- $template->assign('U_SLIDESHOW', $page['cat_slideshow_url']);
+ if (isset($_GET['slideshow']))
+ {
+ redirect($page['cat_slideshow_url']);
+ }
+ elseif ($conf['index_slideshow_icon'])
+ {
+ $template->assign('U_SLIDESHOW', $page['cat_slideshow_url']);
+ }
}
}
+//------------------------------------------------------------ end
include(PHPWG_ROOT_PATH.'include/page_header.php');
trigger_action('loc_end_index');
flush_page_messages();
$template->parse_index_buttons();
$template->pparse('index');
+
//------------------------------------------------------------ log informations
pwg_log();
include(PHPWG_ROOT_PATH.'include/page_tail.php');
diff --git a/install.php b/install.php
index bd391eea5..bfa695644 100644
--- a/install.php
+++ b/install.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -221,6 +221,9 @@ else if ('tr_TR' == $language) {
else if ('da_DK' == $language) {
define('PHPWG_DOMAIN', 'da.piwigo.org');
}
+else if ('pt_BR' == $language) {
+ define('PHPWG_DOMAIN', 'br.piwigo.org');
+}
else {
define('PHPWG_DOMAIN', 'piwigo.org');
}
@@ -249,25 +252,35 @@ include(PHPWG_ROOT_PATH .'include/dblayer/functions_'.$dblayer.'.inc.php');
include(PHPWG_ROOT_PATH . 'admin/include/functions_install.inc.php');
include(PHPWG_ROOT_PATH . 'admin/include/functions_upgrade.php');
-if ( isset( $_POST['install'] ))
+if (isset($_POST['install']))
{
install_db_connect($infos, $errors);
pwg_db_check_charset();
- $webmaster = trim(preg_replace( '/\s{2,}/', ' ', $admin_name ));
- if ( empty($webmaster))
- array_push( $errors, l10n('enter a login for webmaster') );
- else if ( preg_match( '/[\'"]/', $webmaster ) )
- array_push( $errors, l10n('webmaster login can\'t contain characters \' or "') );
- if ( $admin_pass1 != $admin_pass2 || empty($admin_pass1) )
- array_push( $errors, l10n('please enter your password again') );
- if ( empty($admin_mail))
- array_push( $errors, l10n('mail address must be like xxx@yyy.eee (example : jack@altern.org)') );
+ $webmaster = trim(preg_replace('/\s{2,}/', ' ', $admin_name));
+ if (empty($webmaster))
+ {
+ $errors[] = l10n('enter a login for webmaster');
+ }
+ else if (preg_match( '/[\'"]/', $webmaster))
+ {
+ $errors[] = l10n('webmaster login can\'t contain characters \' or "');
+ }
+ if ($admin_pass1 != $admin_pass2 || empty($admin_pass1))
+ {
+ $errors[] = l10n('please enter your password again');
+ }
+ if (empty($admin_mail))
+ {
+ $errors[] = l10n('mail address must be like xxx@yyy.eee (example : jack@altern.org)');
+ }
else
{
$error_mail_address = validate_mail_address(null, $admin_mail);
if (!empty($error_mail_address))
- array_push( $errors, $error_mail_address );
+ {
+ $errors[] = $error_mail_address;
+ }
}
if ( count( $errors ) == 0 )
@@ -385,13 +398,10 @@ INSERT INTO '.$prefixeTable.'config (param,value,comment)
$datas = array();
foreach (get_available_upgrade_ids() as $upgrade_id)
{
- array_push(
- $datas,
- array(
- 'id' => $upgrade_id,
- 'applied' => CURRENT_DATE,
- 'description' => 'upgrade included in installation',
- )
+ $datas[] = array(
+ 'id' => $upgrade_id,
+ 'applied' => CURRENT_DATE,
+ 'description' => 'upgrade included in installation',
);
}
mass_inserts(
@@ -436,7 +446,7 @@ $template->assign(
'F_ADMIN_EMAIL' => $admin_mail,
'EMAIL' => '<span class="adminEmail">'.$admin_mail.'</span>',
'F_NEWSLETTER_SUBSCRIBE' => $is_newsletter_subscribe,
- 'L_INSTALL_HELP' => sprintf(l10n('Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'), PHPWG_URL.'/forum'),
+ 'L_INSTALL_HELP' => l10n('Need help ? Ask your question on <a href="%s">Piwigo message board</a>.', PHPWG_URL.'/forum'),
));
//------------------------------------------------------ errors & infos display
@@ -446,14 +456,11 @@ if ($step == 1)
}
else
{
- array_push(
- $infos,
- l10n('Congratulations, Piwigo installation is completed')
- );
+ $infos[] = l10n('Congratulations, Piwigo installation is completed');
if (isset($error_copy))
{
- array_push($errors, $error_copy);
+ $errors[] = $error_copy;
}
else
{
diff --git a/install/config.sql b/install/config.sql
index eba9c60ff..3783d0130 100644
--- a/install/config.sql
+++ b/install/config.sql
@@ -63,3 +63,4 @@ INSERT INTO piwigo_config (param,value) VALUES ('original_resize_maxwidth','2016
INSERT INTO piwigo_config (param,value) VALUES ('original_resize_maxheight','2016');
INSERT INTO piwigo_config (param,value) VALUES ('original_resize_quality','95');
INSERT INTO piwigo_config (param,value) VALUES ('mobile_theme',null);
+INSERT INTO piwigo_config (param,value) VALUES ('mail_theme','clear');
diff --git a/install/db/100-database.php b/install/db/100-database.php
index 8e72b9fc9..2c1945433 100644
--- a/install/db/100-database.php
+++ b/install/db/100-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/101-database.php b/install/db/101-database.php
index 849a08455..f1fdbe3c0 100644
--- a/install/db/101-database.php
+++ b/install/db/101-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/102-database.php b/install/db/102-database.php
index 69031e62d..99bf97f8b 100644
--- a/install/db/102-database.php
+++ b/install/db/102-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/103-database.php b/install/db/103-database.php
index f6a0e7226..ed1c24d0b 100644
--- a/install/db/103-database.php
+++ b/install/db/103-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/104-database.php b/install/db/104-database.php
index dab30dfeb..a3c17b1e9 100644
--- a/install/db/104-database.php
+++ b/install/db/104-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/105-database.php b/install/db/105-database.php
index ea0609222..793eb07c2 100644
--- a/install/db/105-database.php
+++ b/install/db/105-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/106-database.php b/install/db/106-database.php
index 08c25bcdb..dcd3a9b81 100644
--- a/install/db/106-database.php
+++ b/install/db/106-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/107-database.php b/install/db/107-database.php
index b24a8d1f1..15bdda56e 100644
--- a/install/db/107-database.php
+++ b/install/db/107-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/108-database.php b/install/db/108-database.php
index 322d26cdd..e31aeb17a 100644
--- a/install/db/108-database.php
+++ b/install/db/108-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/109-database.php b/install/db/109-database.php
index e60b2b917..b994c3213 100644
--- a/install/db/109-database.php
+++ b/install/db/109-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/110-database.php b/install/db/110-database.php
index bd0d3ccef..62608a26f 100644
--- a/install/db/110-database.php
+++ b/install/db/110-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/111-database.php b/install/db/111-database.php
index 8050b4a15..abc09c757 100644
--- a/install/db/111-database.php
+++ b/install/db/111-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/112-database.php b/install/db/112-database.php
index a1ae60354..7ff37fb16 100644
--- a/install/db/112-database.php
+++ b/install/db/112-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/113-database.php b/install/db/113-database.php
index 2b2840046..cb6c779c9 100644
--- a/install/db/113-database.php
+++ b/install/db/113-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/114-database.php b/install/db/114-database.php
index be4824d96..96f52e320 100644
--- a/install/db/114-database.php
+++ b/install/db/114-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/115-database.php b/install/db/115-database.php
index bd8c42d48..5d7b5e01f 100644
--- a/install/db/115-database.php
+++ b/install/db/115-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/116-database.php b/install/db/116-database.php
index aef3d7831..79ebeb762 100644
--- a/install/db/116-database.php
+++ b/install/db/116-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/117-database.php b/install/db/117-database.php
index 5ce6176c6..68ef15d1c 100644
--- a/install/db/117-database.php
+++ b/install/db/117-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/118-database.php b/install/db/118-database.php
index c47c9e54b..5925a32b6 100644
--- a/install/db/118-database.php
+++ b/install/db/118-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/119-database.php b/install/db/119-database.php
index 49c72a59b..7da1b68bc 100644
--- a/install/db/119-database.php
+++ b/install/db/119-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/120-database.php b/install/db/120-database.php
index a304cd82f..b156c1398 100644
--- a/install/db/120-database.php
+++ b/install/db/120-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/121-database.php b/install/db/121-database.php
index e396a4468..66a3e53f3 100644
--- a/install/db/121-database.php
+++ b/install/db/121-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/122-database.php b/install/db/122-database.php
index 5a2401725..f8dc1077c 100644
--- a/install/db/122-database.php
+++ b/install/db/122-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/123-database.php b/install/db/123-database.php
index 1d6993c9b..8717a7ab9 100644
--- a/install/db/123-database.php
+++ b/install/db/123-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/124-database.php b/install/db/124-database.php
index e51ebb166..d7671fc47 100644
--- a/install/db/124-database.php
+++ b/install/db/124-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/125-database.php b/install/db/125-database.php
index 6e5808b52..b5034cccf 100644
--- a/install/db/125-database.php
+++ b/install/db/125-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/126-database.php b/install/db/126-database.php
index c0afbe712..1c21ac93a 100644
--- a/install/db/126-database.php
+++ b/install/db/126-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/127-database.php b/install/db/127-database.php
index b14d770ed..e8c893978 100644
--- a/install/db/127-database.php
+++ b/install/db/127-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/128-database.php b/install/db/128-database.php
index f5dbe1022..fd1bb06e0 100644
--- a/install/db/128-database.php
+++ b/install/db/128-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/129-database.php b/install/db/129-database.php
index 8cbc1320a..bb0bec5d5 100644
--- a/install/db/129-database.php
+++ b/install/db/129-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/130-database.php b/install/db/130-database.php
index 52ee19458..14250e12a 100644
--- a/install/db/130-database.php
+++ b/install/db/130-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/131-database.php b/install/db/131-database.php
index 0437219b6..6045104c2 100644
--- a/install/db/131-database.php
+++ b/install/db/131-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/132-database.php b/install/db/132-database.php
index 7bc6508b4..63400dc6b 100644
--- a/install/db/132-database.php
+++ b/install/db/132-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/133-database.php b/install/db/133-database.php
index 994096825..71233810c 100644
--- a/install/db/133-database.php
+++ b/install/db/133-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/134-database.php b/install/db/134-database.php
index 235a72331..bb333700c 100644
--- a/install/db/134-database.php
+++ b/install/db/134-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/135-database.php b/install/db/135-database.php
new file mode 100644
index 000000000..97920813c
--- /dev/null
+++ b/install/db/135-database.php
@@ -0,0 +1,47 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+defined('PHPWG_ROOT_PATH') or die('Hacking attempt!');
+
+$upgrade_description = 'add nb available comments/tags';
+
+$query = 'ALTER TABLE '.USER_INFOS_TABLE.'
+ADD PRIMARY KEY (`user_id`)
+, DROP INDEX `user_infos_ui1`';
+pwg_query($query);
+
+$query = 'ALTER TABLE '.USER_CACHE_TABLE.'
+ ADD COLUMN `last_photo_date` datetime DEFAULT NULL AFTER `nb_total_images`';
+pwg_query($query);
+invalidate_user_cache();
+
+$query = 'ALTER TABLE '.USER_CACHE_TABLE.'
+ ADD COLUMN `nb_available_tags` INT(5) DEFAULT NULL AFTER `last_photo_date`';
+pwg_query($query);
+
+$query = 'ALTER TABLE '.USER_CACHE_TABLE.'
+ ADD COLUMN `nb_available_comments` INT(5) DEFAULT NULL AFTER `nb_available_tags`';
+pwg_query($query);
+
+echo "\n".$upgrade_description."\n";
+?> \ No newline at end of file
diff --git a/install/db/136-database.php b/install/db/136-database.php
new file mode 100644
index 000000000..27062ec85
--- /dev/null
+++ b/install/db/136-database.php
@@ -0,0 +1,37 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+defined('PHPWG_ROOT_PATH') or die('Hacking attempt!');
+
+$upgrade_description = 'add nb direct child categories';
+
+$query = '
+ALTER TABLE '.USER_CACHE_CATEGORIES_TABLE.'
+ ADD COLUMN nb_categories mediumint(8) unsigned NOT NULL default 0 AFTER count_images';
+pwg_query($query);
+
+invalidate_user_cache();
+
+
+echo "\n".$upgrade_description."\n";
+?> \ No newline at end of file
diff --git a/install/db/137-database.php b/install/db/137-database.php
new file mode 100644
index 000000000..f96fba750
--- /dev/null
+++ b/install/db/137-database.php
@@ -0,0 +1,62 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+defined('PHPWG_ROOT_PATH') or die('Hacking attempt!');
+
+$upgrade_description = 'add ASC keyword to categories image_order field';
+
+
+$query = '
+SELECT id, image_order
+ FROM '.CATEGORIES_TABLE.'
+ WHERE image_order != ""
+;';
+$cats = hash_from_query($query, 'id');
+
+foreach ($cats as $id => &$data)
+{
+ $image_order = explode(',',$data['image_order']);
+ foreach ($image_order as &$order)
+ {
+ if (strpos($order, ' ASC')===false && strpos($order, ' DESC')===false)
+ {
+ $order.= ' ASC';
+ }
+ }
+ unset($order);
+ $data['image_order'] = implode(',',$image_order);
+}
+unset($data);
+
+mass_updates(CATEGORIES_TABLE,
+ array(
+ 'primary' => array('id'),
+ 'update' => array('image_order'),
+ ),
+ $cats
+ );
+
+
+echo "\n".$upgrade_description."\n";
+
+?> \ No newline at end of file
diff --git a/install/db/138-database.php b/install/db/138-database.php
new file mode 100644
index 000000000..59606d0cd
--- /dev/null
+++ b/install/db/138-database.php
@@ -0,0 +1,35 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+ die('Hacking attempt!');
+}
+
+$upgrade_description = 'add "mail_theme" parameter';
+
+conf_update_param('mail_theme', 'clear');
+
+echo "\n".$upgrade_description."\n";
+
+?>
diff --git a/install/db/139-database.php b/install/db/139-database.php
new file mode 100644
index 000000000..e1c994fc0
--- /dev/null
+++ b/install/db/139-database.php
@@ -0,0 +1,64 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+ die('Hacking attempt!');
+}
+
+$upgrade_description = 'add "latitude" and "longitude" fields';
+
+// add fields
+$query = '
+ALTER TABLE '. IMAGES_TABLE .'
+ ADD `latitude` DOUBLE(8, 6) DEFAULT NULL,
+ ADD `longitude` DOUBLE(9, 6) DEFAULT NULL
+;';
+pwg_query($query);
+
+// add index
+$query = '
+ALTER TABLE '. IMAGES_TABLE .'
+ ADD INDEX `images_i6` (`latitude`)
+;';
+pwg_query($query);
+
+// search for old "lat" field
+$query = 'SHOW COLUMNS FROM '. IMAGES_TABLE .' LIKE "lat";';
+
+if (pwg_db_num_rows(pwg_query($query)))
+{
+ // duplicate non-null values
+ $query = '
+UPDATE '. IMAGES_TABLE .'
+ SET latitude = lat,
+ longitude = lon
+ WHERE lat IS NOT NULL
+ AND lon IS NOT NULL
+;';
+ pwg_query($query);
+}
+
+echo "\n".$upgrade_description."\n";
+
+?>
diff --git a/install/db/61-database.php b/install/db/61-database.php
index 2621be550..e6ac8b095 100644
--- a/install/db/61-database.php
+++ b/install/db/61-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/62-database.php b/install/db/62-database.php
index 40e2cbd9c..f384aa96b 100644
--- a/install/db/62-database.php
+++ b/install/db/62-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/63-database.php b/install/db/63-database.php
index f25cc29ed..eb5235bcf 100644
--- a/install/db/63-database.php
+++ b/install/db/63-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/64-database.php b/install/db/64-database.php
index add976882..2b8b1037b 100644
--- a/install/db/64-database.php
+++ b/install/db/64-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/65-database.php b/install/db/65-database.php
index cf892343b..64482d63e 100644
--- a/install/db/65-database.php
+++ b/install/db/65-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/66-database.php b/install/db/66-database.php
index 21f9613e9..99cc18e01 100644
--- a/install/db/66-database.php
+++ b/install/db/66-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/67-database.php b/install/db/67-database.php
index 974e57e1b..77b071a27 100644
--- a/install/db/67-database.php
+++ b/install/db/67-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/68-database.php b/install/db/68-database.php
index 6acb762ab..a1b69f628 100644
--- a/install/db/68-database.php
+++ b/install/db/68-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/69-database.php b/install/db/69-database.php
index 59a15178d..d4d826cdb 100644
--- a/install/db/69-database.php
+++ b/install/db/69-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/70-database.php b/install/db/70-database.php
index 2134cafc4..ed6b37ca1 100644
--- a/install/db/70-database.php
+++ b/install/db/70-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/71-database.php b/install/db/71-database.php
index b2d38bbf1..0e3795528 100644
--- a/install/db/71-database.php
+++ b/install/db/71-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/72-database.php b/install/db/72-database.php
index 65f9fdcbf..85af1da93 100644
--- a/install/db/72-database.php
+++ b/install/db/72-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/73-database.php b/install/db/73-database.php
index cdea5d5da..b8377acac 100644
--- a/install/db/73-database.php
+++ b/install/db/73-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/74-database.php b/install/db/74-database.php
index 59dc5506f..76182aff1 100644
--- a/install/db/74-database.php
+++ b/install/db/74-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/75-database.php b/install/db/75-database.php
index 5cc3e2c50..34eae6e93 100644
--- a/install/db/75-database.php
+++ b/install/db/75-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/76-database.php b/install/db/76-database.php
index c2430335d..9691363f2 100644
--- a/install/db/76-database.php
+++ b/install/db/76-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/77-database.php b/install/db/77-database.php
index edf93c475..6d7352d41 100644
--- a/install/db/77-database.php
+++ b/install/db/77-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/78-database.php b/install/db/78-database.php
index 702951995..7073cf5e1 100644
--- a/install/db/78-database.php
+++ b/install/db/78-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/79-database.php b/install/db/79-database.php
index 539c5ef27..f03c9323a 100644
--- a/install/db/79-database.php
+++ b/install/db/79-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/80-database.php b/install/db/80-database.php
index eab1a22da..7a30de753 100644
--- a/install/db/80-database.php
+++ b/install/db/80-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/81-database.php b/install/db/81-database.php
index 8adcdde97..afaa372e5 100644
--- a/install/db/81-database.php
+++ b/install/db/81-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/82-database.php b/install/db/82-database.php
index 166b4d394..3be20212b 100644
--- a/install/db/82-database.php
+++ b/install/db/82-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/83-database.php b/install/db/83-database.php
index 350642f4c..88b2a7710 100644
--- a/install/db/83-database.php
+++ b/install/db/83-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/84-database.php b/install/db/84-database.php
index 1cbc7bf38..79901731d 100644
--- a/install/db/84-database.php
+++ b/install/db/84-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/85-database.php b/install/db/85-database.php
index 046a78a45..583d10405 100644
--- a/install/db/85-database.php
+++ b/install/db/85-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/86-database.php b/install/db/86-database.php
index a2b12e19f..66b6ee575 100644
--- a/install/db/86-database.php
+++ b/install/db/86-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/87-database.php b/install/db/87-database.php
index ea94cdc03..232468b18 100644
--- a/install/db/87-database.php
+++ b/install/db/87-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/88-database.php b/install/db/88-database.php
index 0a8e14409..9bcc5a3ef 100644
--- a/install/db/88-database.php
+++ b/install/db/88-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/89-database.php b/install/db/89-database.php
index a11e9c9b7..aba1b70c0 100644
--- a/install/db/89-database.php
+++ b/install/db/89-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/90-database.php b/install/db/90-database.php
index 7da2e13b3..2e315140f 100644
--- a/install/db/90-database.php
+++ b/install/db/90-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/91-database.php b/install/db/91-database.php
index b3e156399..a3a466cc3 100644
--- a/install/db/91-database.php
+++ b/install/db/91-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/92-database.php b/install/db/92-database.php
index 284b58e10..972d84d51 100644
--- a/install/db/92-database.php
+++ b/install/db/92-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/93-database.php b/install/db/93-database.php
index 972f62659..579151a79 100644
--- a/install/db/93-database.php
+++ b/install/db/93-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/94-database.php b/install/db/94-database.php
index 77fb42b75..27ca62d4d 100644
--- a/install/db/94-database.php
+++ b/install/db/94-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/95-database.php b/install/db/95-database.php
index 673c371a9..f79e83855 100644
--- a/install/db/95-database.php
+++ b/install/db/95-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/96-database.php b/install/db/96-database.php
index 97d5268c9..dad166e17 100644
--- a/install/db/96-database.php
+++ b/install/db/96-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/97-database.php b/install/db/97-database.php
index f30843fe0..535005a11 100644
--- a/install/db/97-database.php
+++ b/install/db/97-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/98-database.php b/install/db/98-database.php
index 13f4899e7..69c11d395 100644
--- a/install/db/98-database.php
+++ b/install/db/98-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/99-database.php b/install/db/99-database.php
index 87406f000..c85336289 100644
--- a/install/db/99-database.php
+++ b/install/db/99-database.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/db/index.php b/install/db/index.php
index 41732f2fd..c8de97f60 100644
--- a/install/db/index.php
+++ b/install/db/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/hosting.php b/install/hosting.php
index c84576a40..9b7704481 100644
--- a/install/hosting.php
+++ b/install/hosting.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/index.php b/install/index.php
index 41732f2fd..c8de97f60 100644
--- a/install/index.php
+++ b/install/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/php5_apache_configuration.php b/install/php5_apache_configuration.php
index 11fb03967..4a6ca31d1 100644
--- a/install/php5_apache_configuration.php
+++ b/install/php5_apache_configuration.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/piwigo_structure-mysql.sql b/install/piwigo_structure-mysql.sql
index 0a0d9e611..dadad1d1b 100644
--- a/install/piwigo_structure-mysql.sql
+++ b/install/piwigo_structure-mysql.sql
@@ -196,13 +196,16 @@ CREATE TABLE `piwigo_images` (
`level` tinyint unsigned NOT NULL default '0',
`md5sum` char(32) default NULL,
`added_by` smallint(5) NOT NULL default '0',
- `rotation` tinyint unsigned default null,
+ `rotation` tinyint unsigned default NULL,
+ `latitude` double(8, 6) default NULL,
+ `longitude` double(9, 6) default NULL,
PRIMARY KEY (`id`),
KEY `images_i2` (`date_available`),
KEY `images_i3` (`rating_score`),
KEY `images_i4` (`hit`),
KEY `images_i5` (`date_creation`),
- KEY `images_i1` (`storage_category_id`)
+ KEY `images_i1` (`storage_category_id`),
+ KEY `images_i6` (`latitude`)
) ENGINE=MyISAM;
--
@@ -352,6 +355,9 @@ CREATE TABLE `piwigo_user_cache` (
`cache_update_time` integer unsigned NOT NULL default 0,
`forbidden_categories` mediumtext,
`nb_total_images` mediumint(8) unsigned default NULL,
+ `last_photo_date` datetime DEFAULT NULL,
+ `nb_available_tags` INT(5) DEFAULT NULL,
+ `nb_available_comments` INT(5) DEFAULT NULL,
`image_access_type` enum('NOT IN','IN') NOT NULL default 'NOT IN',
`image_access_list` mediumtext default NULL,
PRIMARY KEY (`user_id`)
@@ -369,6 +375,7 @@ CREATE TABLE `piwigo_user_cache_categories` (
`max_date_last` datetime default NULL,
`nb_images` mediumint(8) unsigned NOT NULL default '0',
`count_images` mediumint(8) unsigned default '0',
+ `nb_categories` mediumint(8) unsigned default '0',
`count_categories` mediumint(8) unsigned default '0',
`user_representative_picture_id` mediumint(8) unsigned default NULL,
PRIMARY KEY (`user_id`,`cat_id`)
@@ -416,7 +423,7 @@ CREATE TABLE `piwigo_user_infos` (
`enabled_high` enum('true','false') NOT NULL default 'true',
`level` tinyint unsigned NOT NULL default '0',
`activation_key` char(20) default NULL,
- UNIQUE KEY `user_infos_ui1` (`user_id`)
+ PRIMARY KEY (`user_id`)
) ENGINE=MyISAM;
--
diff --git a/install/upgrade_1.3.0.php b/install/upgrade_1.3.0.php
index f6424bf64..c7f461812 100644
--- a/install/upgrade_1.3.0.php
+++ b/install/upgrade_1.3.0.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/upgrade_1.3.1.php b/install/upgrade_1.3.1.php
index e7734447f..2ecec0186 100644
--- a/install/upgrade_1.3.1.php
+++ b/install/upgrade_1.3.1.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/upgrade_1.4.0.php b/install/upgrade_1.4.0.php
index e5649a88d..f83c34acc 100644
--- a/install/upgrade_1.4.0.php
+++ b/install/upgrade_1.4.0.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/upgrade_1.5.0.php b/install/upgrade_1.5.0.php
index 685e8ad82..5b9c7f393 100644
--- a/install/upgrade_1.5.0.php
+++ b/install/upgrade_1.5.0.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/upgrade_1.6.0.php b/install/upgrade_1.6.0.php
index a15f307f3..7acb45dc9 100644
--- a/install/upgrade_1.6.0.php
+++ b/install/upgrade_1.6.0.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/upgrade_1.6.2.php b/install/upgrade_1.6.2.php
index a6559f478..87c14e22e 100644
--- a/install/upgrade_1.6.2.php
+++ b/install/upgrade_1.6.2.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/upgrade_1.7.0.php b/install/upgrade_1.7.0.php
index 28ac541f9..9e69b4f8a 100644
--- a/install/upgrade_1.7.0.php
+++ b/install/upgrade_1.7.0.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/upgrade_2.0.0.php b/install/upgrade_2.0.0.php
index e3b442c2b..401e5c24f 100644
--- a/install/upgrade_2.0.0.php
+++ b/install/upgrade_2.0.0.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/upgrade_2.1.0.php b/install/upgrade_2.1.0.php
index 2730644cf..ed63d9731 100644
--- a/install/upgrade_2.1.0.php
+++ b/install/upgrade_2.1.0.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/upgrade_2.2.0.php b/install/upgrade_2.2.0.php
index 4a81a037a..832d09140 100644
--- a/install/upgrade_2.2.0.php
+++ b/install/upgrade_2.2.0.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/upgrade_2.3.0.php b/install/upgrade_2.3.0.php
index 7e8946b37..0ce63304d 100644
--- a/install/upgrade_2.3.0.php
+++ b/install/upgrade_2.3.0.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/install/upgrade_2.4.0.php b/install/upgrade_2.4.0.php
index 20f5d9c29..554f76185 100644
--- a/install/upgrade_2.4.0.php
+++ b/install/upgrade_2.4.0.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -121,5 +121,5 @@ echo '</pre>';
ob_end_clean();
// now we upgrade from 2.5.0
-// include_once(PHPWG_ROOT_PATH.'install/upgrade_2.5.0.php');
+include_once(PHPWG_ROOT_PATH.'install/upgrade_2.5.0.php');
?>
diff --git a/install/upgrade_2.5.0.php b/install/upgrade_2.5.0.php
new file mode 100644
index 000000000..43125aa0e
--- /dev/null
+++ b/install/upgrade_2.5.0.php
@@ -0,0 +1,125 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+ die ('This page cannot be loaded directly, load upgrade.php');
+}
+else
+{
+ if (!defined('PHPWG_IN_UPGRADE') or !PHPWG_IN_UPGRADE)
+ {
+ die ('Hacking attempt!');
+ }
+}
+
+// +-----------------------------------------------------------------------+
+// | Fill upgrade table without applying upgrade |
+// +-----------------------------------------------------------------------+
+
+// retrieve already applied upgrades
+$query = '
+SELECT id
+ FROM '.PREFIX_TABLE.'upgrade
+;';
+$applied = array_from_query($query, 'id');
+
+// retrieve existing upgrades
+$existing = get_available_upgrade_ids();
+
+// which upgrades need to be applied?
+$to_apply = array_diff($existing, $applied);
+$inserts = array();
+foreach ($to_apply as $upgrade_id)
+{
+ if ($upgrade_id >= 135) // TODO change on each release
+ {
+ break;
+ }
+
+ array_push(
+ $inserts,
+ array(
+ 'id' => $upgrade_id,
+ 'applied' => CURRENT_DATE,
+ 'description' => '[migration from 2.5.0 to '.PHPWG_VERSION.'] not applied', // TODO change on each release
+ )
+ );
+}
+
+if (!empty($inserts))
+{
+ mass_inserts(
+ '`'.UPGRADE_TABLE.'`',
+ array_keys($inserts[0]),
+ $inserts
+ );
+}
+
+// +-----------------------------------------------------------------------+
+// | Perform upgrades |
+// +-----------------------------------------------------------------------+
+
+ob_start();
+echo '<pre>';
+
+for ($upgrade_id = 135; $upgrade_id <= 139; $upgrade_id++) // TODO change on each release
+{
+ if (!file_exists(UPGRADES_PATH.'/'.$upgrade_id.'-database.php'))
+ {
+ continue;
+ }
+
+ // maybe the upgrade task has already been applied in a previous and
+ // incomplete upgrade
+ if (in_array($upgrade_id, $applied))
+ {
+ continue;
+ }
+
+ unset($upgrade_description);
+
+ echo "\n\n";
+ echo '=== upgrade '.$upgrade_id."\n";
+
+ // include & execute upgrade script. Each upgrade script must contain
+ // $upgrade_description variable which describe briefly what the upgrade
+ // script does.
+ include(UPGRADES_PATH.'/'.$upgrade_id.'-database.php');
+
+ // notify upgrade (TODO change on each release)
+ $query = '
+INSERT INTO `'.PREFIX_TABLE.'upgrade`
+ (id, applied, description)
+ VALUES
+ (\''.$upgrade_id.'\', NOW(), \'[migration from 2.5.0 to '.PHPWG_VERSION.'] '.$upgrade_description.'\')
+;';
+ pwg_query($query);
+}
+
+echo '</pre>';
+ob_end_clean();
+
+// now we upgrade from 2.6.0
+// include_once(PHPWG_ROOT_PATH.'install/upgrade_2.6.0.php');
+?>
diff --git a/language/af_ZA/admin.lang.php b/language/af_ZA/admin.lang.php
index c9f3fb706..1cae11083 100644
--- a/language/af_ZA/admin.lang.php
+++ b/language/af_ZA/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -516,7 +516,6 @@ $lang['Minimum privacy level'] = 'Minimum privaatvlak';
$lang['default values'] = 'verstekwaardes';
$lang['default'] = 'verstek';
$lang['delete album'] = 'verwyder album';
-$lang['email'] = 'E-pos';
$lang['errors during synchronization'] = 'foute gedurende sinchronisasie';
$lang['existing album'] = 'Bestaande album';
$lang['include child albums'] = 'sluit subalbums in';
@@ -945,4 +944,6 @@ $lang['Type here the name of the new group'] = 'Tik hier die naam van die nuwe g
$lang['View in gallery'] = 'Wys in gallery';
$lang['between %.2f and %.2f'] = 'tussen %.2f en %.2f';
$lang['Purge user cache'] = 'Maak pakstoor leeg';
+$lang['Select at least one tag'] = 'Kies ten minste een etiket';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'Die beeld se grootte sal verminder word tot %dx%d piksels.';
?> \ No newline at end of file
diff --git a/language/af_ZA/common.lang.php b/language/af_ZA/common.lang.php
index a1bca0966..b18554724 100644
--- a/language/af_ZA/common.lang.php
+++ b/language/af_ZA/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Afrikaans [ZA]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=572
Author: Marius Loots and Mignon Smit
Author URI: http://piwigo.org
@@ -244,10 +244,6 @@ $lang['last %d days'] = "laaste %d dae";
$lang['Last'] = "Laaste";
$lang['Logout'] = "Teken uit";
$lang['obligatory'] = "verplig";
-$lang['Maximum photo height'] = "Maksimum foto hoogte";
-$lang['Maximum height must be a number superior to 50'] = "Maksimum hoogte moet 'n getal groter as 50 wees";
-$lang['Maximum photo width'] = "Maksimum foto wydte";
-$lang['Maximum width must be a number superior to 50'] = "Maksimum wydte moet 'n getal groter as 50 wees";
$lang['display a calendar by creation date'] = "vertoon 'n kalender volgens datum geskep";
$lang['display all photos in all sub-albums'] = "vertoon alle fotos in alle sub-albums";
$lang['return to normal view mode'] = "gaan terug na normale voorkoms";
@@ -294,7 +290,6 @@ $lang['login mustn\'t end with a space character'] = "Aanteken naam mag nie op '
$lang['login mustn\'t start with a space character'] = "Aanteken naam kan nie met 'n spasie begin nie";
$lang['this login is already used'] = "die aanteken naam is reeds in gebruik";
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = "epos adres moet wees soos xxx@yyy.ee.ee (voorbeeld : koos@vlooi.co.za)";
-$lang['please enter your password again'] = "Sleutel jou wagwoord weer in";
$lang['Auto login'] = 'Automatiese aanteken';
$lang['Contact'] = "Kontak";
$lang['set as album representative'] = "Stel as album verteenwoordiger";
@@ -307,7 +302,6 @@ $lang['SQL queries in'] = "SQL navrae in";
$lang['display only recently posted photos'] = "Vertoon slegs fotos wat onlangs gepos is";
$lang['return to the display of all photos'] = "gaan terug na vertoning van alle fotos";
$lang['the beginning'] = "die begin";
-$lang['Interface theme'] = "Koppelvlak tema";
$lang['Thumbnails'] = "Duimnale";
$lang['Menu'] = "Keusepaneel";
$lang['A comment on your site'] = "Kommentaar op u werf";
@@ -416,4 +410,10 @@ $lang['Username is mandatory'] = 'Gebruikersnaam is nie opsioneel nie';
$lang['mandatory'] = 'verpligtend';
$lang['Website'] = 'Webblad';
$lang['Your website URL is invalid'] = 'Jou webblad URL is ongeldig';
+$lang['Email'] = 'Epos';
+$lang['First Page'] = 'Eerste blad';
+$lang['Go back to the album'] = 'Gaan terug na die album';
+$lang['Last Page'] = 'Laaste blad';
+$lang['Password is missing. Please enter the password.'] = 'Wagwoord nie ingevul nie. Vul asseblief die wagwoord in.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Wagwoord bevestiging nie gedoen. Bevestig asseblief die gekose wagwoord.';
?> \ No newline at end of file
diff --git a/language/af_ZA/help/search.html b/language/af_ZA/help/search.html
new file mode 100755
index 000000000..e4a33f427
--- /dev/null
+++ b/language/af_ZA/help/search.html
@@ -0,0 +1,19 @@
+<h2>Soek</h2>
+
+<p>Hierdie blad laat jou soek deur al die fotos op die gallery.</p>
+
+<dl>
+
+ <dt>Soek vir woorde</dt>
+ <dd>Soek vir een of meer woorde binne die attribute wat verband hou met die fotos in die gallery. Gebruik * as 'n paskaart vir gedeeltelike ooreenstemmings.</dd>
+
+ <dt>Soek vir 'n outeur</dt>
+ <dd>Gebruik * as 'n paskaart vir gedeeltelike ooreenstemmings.</dd>
+
+ <dt>Soek deur datums</dt>
+ <dd>Kies 'n datum/of eind datum vir jou navraag. Laat die datum veld leeg as jy 'n "voor" soektog wil doen. Die jaar in die laaste veld moet in die volgende formaat wees : AAAA (i.e. 2004)</dd>
+
+ <dt>Soek in albums</dt>
+ <dd>Kies een of meer albums om te deursoek. Alle sub-albums kan deursoek word deur die ouer album te kies en die sub-album keuse te merk.</dd>
+
+</dl> \ No newline at end of file
diff --git a/language/af_ZA/index.php b/language/af_ZA/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/af_ZA/index.php
+++ b/language/af_ZA/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/af_ZA/install.lang.php b/language/af_ZA/install.lang.php
index 2ae6234d8..d6e819503 100644
--- a/language/af_ZA/install.lang.php
+++ b/language/af_ZA/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2009 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -20,6 +20,7 @@
// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
// | USA. |
// +-----------------------------------------------------------------------+
+
$lang['Admin configuration'] = 'Admin konfigurasie';
$lang['Basic configuration'] = 'Basiese konfigurasie';
$lang['Congratulations, Piwigo installation is completed'] = 'Baie geluk, Piwigo installasie is voltooi';
@@ -33,8 +34,6 @@ $lang['Sorry!'] = 'Jammer!';
$lang['Start Install'] = 'Begin installasie';
$lang['User'] = 'Gebruiker';
$lang['verification'] = 'verifikasie';
-$lang['Webmaster login'] = 'Webmeester login';
-$lang['Webmaster mail address'] = 'Webmeester epos adres';
$lang['Welcome to my photo gallery'] = 'Welkom by my fotogallery';
$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Jy kan die konfigurasie lêer aflaai en oplaai na die local/config gids van jou installasie';
$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Alternatiewelik kan die teks in die boksie hier bo gekopiëer word en in die lêer "local/config/database.inc.php" gestoor word. Maak seker die lêer bevat slegs die teks hier bo en geen nuwe-lyn karakters of spasies nie.';
@@ -52,21 +51,18 @@ $lang['It will be shown to the visitors. It is necessary for website administrat
$lang['Keep it confidential, it enables you to access administration panel'] = 'Hou dit geheim. Dit laat jou toe om administrasieblasye te sien';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Benodig hulp? Vra jou vraag op die <a href="%s">Piwigo aanplakbord</a>';
$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Let op dat jy self die opstelling kan verander en daarna Piwigo heruitvoer.';
-$lang['Password'] = 'Wagwoord';
$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo kan probeer om PHP 5 te gebruik deur \'n .htaccess-lêer te skep of te verander.';
$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo kon nie PHP 5 opstel nie.';
$lang['Try to configure PHP 5'] = 'Probeer PHP 5 op te stel';
$lang['Visitors will be able to contact site administrator with this mail'] = 'Besoekers sal hierdie adres kan gebruik om die webmeester te kontak';
-$lang['Webmaster password'] = 'Webmeester wagwoord';
$lang['Welcome to your new installation of Piwigo!'] = 'Welkom by jou nuwe Piwigo webtuiste!';
$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Verwys na jou diensverskaffer om uit te vind hoe jy PHP 5 kan gebruik.';
$lang['also given by your host provider'] = 'ook deur diensverskaffer voorsien';
$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'dit sal vooraan tabelname geheg word om tabelle beter te bestuur';
$lang['enter a login for webmaster'] = 'kies \'n gebruikersnaam vir die webmeester';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'e-pos-adresse moet in die vorm aaa@bbb.ccc wees (voorbeeld: jack@altern.org)';
$lang['please enter your password again'] = 'tike assblief weer jou wagwoord in';
$lang['user login given by your host provider'] = 'gebruikersnaam deur diensverskaffer voorsien';
$lang['user password given by your host provider'] = 'wagwoord deur diensverskaffer voorsien';
$lang['webmaster login can\'t contain characters \' or "'] = 'gebruikersnaam kan nie die karakter \' en " bevat nie';
+$lang['localhost or other, supplied by your host provider'] = 'localhost of ander, voorsien deur jou diensverskaffer';
?> \ No newline at end of file
diff --git a/language/af_ZA/upgrade.lang.php b/language/af_ZA/upgrade.lang.php
index c981e923b..4b4ccdfa4 100644
--- a/language/af_ZA/upgrade.lang.php
+++ b/language/af_ZA/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/ar_MA/ar_MA.jpg b/language/ar_MA/ar_MA.jpg
new file mode 100644
index 000000000..1c8fe89b0
--- /dev/null
+++ b/language/ar_MA/ar_MA.jpg
Binary files differ
diff --git a/language/ar_MA/common.lang.php b/language/ar_MA/common.lang.php
new file mode 100644
index 000000000..158463485
--- /dev/null
+++ b/language/ar_MA/common.lang.php
@@ -0,0 +1,39 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: العربية [MA]
+Version: 2.5.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Arabic';
+$lang_info['country'] = 'Morocco';
+$lang_info['direction'] = 'rtl';
+$lang_info['code'] = 'ar';
+$lang_info['zero_plural'] = true;
+$lang_info['parent']= "ar_SA";
+
+?> \ No newline at end of file
diff --git a/language/ar_MA/index.php b/language/ar_MA/index.php
new file mode 100644
index 000000000..c8de97f60
--- /dev/null
+++ b/language/ar_MA/index.php
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/language/ar_MA/iso.txt b/language/ar_MA/iso.txt
new file mode 100644
index 000000000..7914a4d33
--- /dev/null
+++ b/language/ar_MA/iso.txt
@@ -0,0 +1 @@
+العربية [MA] \ No newline at end of file
diff --git a/language/ar_SA/admin.lang.php b/language/ar_SA/admin.lang.php
index 7e8a9ba2a..38db88e1f 100644
--- a/language/ar_SA/admin.lang.php
+++ b/language/ar_SA/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -189,7 +189,6 @@ $lang['Information data registered in database'] = ' تم تحديث المØ
$lang['Default display'] = 'العرض الاÙتراضي';
$lang['History'] = 'السجل';
$lang['The gallery URL is not valid.'] = 'رابط المعرض غير صحيح';
-$lang['Main'] = 'الرئيسية';
$lang['The number of comments a page must be between 5 and 50 included.'] = 'عدد التعليقات ÙÙŠ الصÙحة يجب أن تكون ما بين 5 Ùˆ 50.';
$lang['Configuration'] = 'التهيئة';
$lang['confirm'] = 'تـأكيد';
@@ -224,7 +223,6 @@ $lang['Prepared time for list of users to send mail is limited. Others users are
$lang['Time to send mail is limited. Others mails are skipped.'] = 'الوقت للارسال محدود ، تم تجاهل بعض العناوين.';
$lang['To send ?'] = 'إرسـال؟';
$lang['Last send'] = 'الارسال الاخير';
-$lang['email'] = 'البريدالالكتروني';
$lang['User'] = 'المستخدم';
$lang['See you soon,'] = 'ستسعدنا جدا زيارتك';
$lang['Go to'] = 'يمكنك زيارتنا من خلال هذا الرابط ';
@@ -927,8 +925,6 @@ $lang['Duplicate selected tags'] = 'كرر الكلمه الدائليه المØ
$lang['Name of the duplicate'] = 'تسميه المكرر';
$lang['Source tag'] = 'مصدر الكلمه الدلائليه';
$lang['Tag "%s" is now a duplicate of "%s"'] = 'الكلمه الدلائليه "%s" كررت لـ "%s"';
-$lang['Format'] = 'تهيئة';
-$lang['Invalid dimension'] = 'ابعاذ غير صحيحة';
$lang['Landscape'] = 'منظر طبيعي';
$lang['Manage photos'] = 'إدارة الصور';
$lang['Minimum height'] = 'الحد الأدني للارتÙاع';
@@ -951,4 +947,32 @@ $lang['Type here the name of the new group'] = 'أكتب هنا أسم المجÙ
$lang['Rename'] = 'إعادة تسمية';
$lang['This group will be set to default'] = 'هذا المجموعة ستستخدم كمجموعة اÙتراضية';
$lang['Purge user cache'] = 'مسح الذاكرة المؤقتة للمستخدم';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'تغيير حجم بعد تعطيل الرÙع نتيجة لاستخدام GD كما مكتبة الرسم';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'سيتم تخÙيض أبعاد الصورة لل %dx%d بكسل.';
+$lang['Select at least one tag'] = 'حدد علامة واحدة على الأقل';
+$lang['Mail theme'] = 'طراز بريد';
+$lang['General'] = 'عام';
+$lang['Basic settings'] = 'الإعدادات الأساسية';
+$lang['Change password'] = 'تغيير كلمة السر';
+$lang['Registered on %s, %s.'] = 'سÙجّÙÙ„ ÙÙŠ%s, %s';
+$lang['Change username'] = 'تغيير اسم المستخدم';
+$lang['Loading...'] = 'تحميل ...';
+$lang['No matching user found'] = 'لم يتم العثور على مستخدم مطابق';
+$lang['No user selected, no action possible.'] = 'لم يتم إختيار المستخدم، أي إجراء غير ممكن';
+$lang['Password updated'] = 'كلمة السر تم تحديثها';
+$lang['Update user'] = 'تحديث المستعمل';
+$lang['Users modified'] = 'المستخدمين تم تعديلهم';
+$lang['%d of %d users selected'] = '%d من %d المستخدمين المحددين';
+$lang['(filtered from %s total users)'] = '(التي تمت تصÙيتها من إجمالي المستخدمين %s)';
+$lang['All %d users are selected'] = 'يتم تحديد كاÙØ© المستخدمين %d';
+$lang['Close user details'] = 'تÙاصيل المستخدم إغلاق';
+$lang['Last visit on %s, %s.'] = 'آخر زيارة على %s %s.';
+$lang['Open user details'] = 'Ø£Ùتح تÙاصيل المستخدم';
+$lang['User %s added'] = 'تم إضاÙØ© المستخدم %s';
+$lang['User %s updated'] = 'تم تحديث المستخدم %s';
+$lang['close'] = 'إغلاق';
+$lang['on the %d selected users'] = 'على %d المستخدمين المحددين';
+$lang['Show %s users'] = 'أظهر المستخدم %s';
+$lang['Showing %s to %s of %s users'] = 'إظهار%s إلي %s من %s المستخدمين ';
+$lang['No user selected of %d users'] = 'لا يوجد مستخدم محدد من %d المستخدمين';
?> \ No newline at end of file
diff --git a/language/ar_SA/common.lang.php b/language/ar_SA/common.lang.php
index 740724807..50a951de1 100644
--- a/language/ar_SA/common.lang.php
+++ b/language/ar_SA/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: العربية [AR]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=412
Author: Piwigo team
Author URI: http://piwigo.org
@@ -247,7 +247,6 @@ $lang['this login is already used'] = 'this login is already used';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'mail address must be like xxx@yyy.eee (example : jack@altern.org)';
$lang['this login is already used'] = 'هذا المستخدم موجود حاليا';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'يجب ان يكون البريد بهذه الكيÙيةxxx@yyy.eee (مثلا : jack@altern.org)';
-$lang['please enter your password again'] = 'من Ùضلك أعد كتابة كلمة المرور مرة أخرى';
$lang['Auto login'] = 'دخول آلي';
$lang['remove this tag from the list'] = 'حذ٠هذه الكلمات من القائمة';
$lang['representative'] = 'صÙÙ‡ /نموذجي';
@@ -275,7 +274,6 @@ $lang['SQL queries in'] = 'استÙسارات ÙÙŠ SQL';
$lang['display only recently posted photos'] = 'عرض الصور المضاÙØ© حديثا';
$lang['return to the display of all photos'] = 'العودة لعرض جميع الصورة';
$lang['the beginning'] = 'البداية';
-$lang['Interface theme'] = 'واجة العرض';
$lang['Thumbnails'] = 'الصور المصغرة';
$lang['Menu'] = 'القائمة الرئيسية';
$lang['A comment on your site'] = 'استÙسار مهم';
@@ -419,4 +417,12 @@ $lang['Username is mandatory'] = 'أسم المستخدم إلزامي';
$lang['mandatory'] = 'إلزامي';
$lang['Website'] = 'الموقع';
$lang['Your website URL is invalid'] = 'URL موقع الويب الخاص بك غير صالح';
+$lang['Email'] = 'البريد الإلكتروني';
+$lang['First Page'] = 'الصÙحة الأولى';
+$lang['Go back to the album'] = 'إرجع للألبوم';
+$lang['Last Page'] = 'الصÙحة الأخيرة';
+$lang['Password is missing. Please enter the password.'] = 'لم تكتب كلمة المرور، Ùضلا Ù‹ أكتب كلمة المرور';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'لم يتم تأكيد كلمة المرور، Ùضلا Ù‹ لا أمر أكد المرور رحم الله والديك';
+$lang['%d photos per page'] = 'عدد الصور ÙÙŠ كل صÙحة %d';
+$lang['Theme'] = 'الواجهة';
?> \ No newline at end of file
diff --git a/language/ar_SA/index.php b/language/ar_SA/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/ar_SA/index.php
+++ b/language/ar_SA/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/ar_SA/install.lang.php b/language/ar_SA/install.lang.php
index ba1d1dddc..6c429eec3 100644
--- a/language/ar_SA/install.lang.php
+++ b/language/ar_SA/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -27,16 +27,12 @@ $lang['Default gallery language'] = 'اللغة الاÙتراضية للمعرØ
$lang['Database configuration'] = 'تكوين قاعدة البيانات';
$lang['Admin configuration'] = 'اعدادات المدير';
$lang['Start Install'] = 'ابدأ التثبيت';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'البريد يجب ان يكون على هذه الهيئة xxx@yyy.ee ( مثلاً : Jack@altern.org)';
-$lang['Webmaster login'] = 'دخول المدير';
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'سو٠تظهر للزوار ، ضرورية للادارة و لوحة التحكم';
$lang['Connection to server succeed, but it was impossible to connect to database'] = 'تم الاتصال بالخادم الموقع ، لكن لم يتم يتم الاتصال بقاعدة البيانات';
$lang['Can\'t connect to server'] = 'لا يمكن الاتصال بالخادم';
$lang['Host'] = 'المضيÙ';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
$lang['User'] = 'المستخدم';
$lang['user login given by your host provider'] = 'اصرح للمستخدم الدخول بواسطة المضي٠الخاص بك';
-$lang['Password'] = 'كلمة المرور';
$lang['user password given by your host provider'] = 'اعطي للمستخدم كلمة المرور بواسطة المضي٠الخاص بك';
$lang['Database name'] = 'أسم قاعدة البيانات';
$lang['also given by your host provider'] = 'ايضا بواسط المضي٠الخاص بك ';
@@ -45,12 +41,10 @@ $lang['database tables names will be prefixed with it (enables you to manage bet
$lang['enter a login for webmaster'] = 'دخول مدير الموقع';
$lang['webmaster login can\'t contain characters \' or "'] = 'دخول المدر لا \ يمكن تتضمن الأحر٠\' أو "';
$lang['please enter your password again'] = 'Ùضلا Ù‹ أعد كتابة كلمة المرور مرةأخرى';
-$lang['Webmaster password'] = 'كلمة مرور مدير الموقع';
$lang['Keep it confidential, it enables you to access administration panel'] = 'ابقائه سريا، Ùإنه يتيح لك الوصول إلى لوحة الإدارة';
$lang['Password [confirm]'] = 'كلمة المرور [confirm]';
$lang['verification'] = 'التحقق';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'هل تحتاج لمساعده؟ يمكنك السؤال <a href="%s">Piwigo لجنة الأسئلة ÙÙŠ </a>.';
-$lang['Webmaster mail address'] = 'بريد مدير الموقع';
$lang['Visitors will be able to contact site administrator with this mail'] = ' سيتمكن الزوار لاستخدام هذا البريد إلى الاتصال بالمسؤول عن الموقع';
$lang['PHP 5 is required'] = 'مطلوب PHP 5 ';
$lang['It appears your webhost is currently running PHP %s.'] = 'PHP %s يبدوا أن المضي٠يستخدم حاليا ';
@@ -66,9 +60,9 @@ $lang['An alternate solution is to copy the text in the box above and paste it i
$lang['Creation of config file local/config/database.inc.php failed.'] = 'Ùشل ÙÙŠ إنشاء مل٠التكوين local/config/database.inc.php ';
$lang['Download the config file'] = 'تحميل مل٠التكوين';
$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'يمكنك تحميل مل٠التكوين وتحميله إلى الدليل المحلي';
-
$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'لاتتردد ÙÙŠ طلب الإستشارة Ùˆ الاستÙسار من خلال منتدانا للمساعده : %s';
$lang['Just another Piwigo gallery'] = 'معرض آخر من Piwigo';
$lang['Welcome to my photo gallery'] = 'مرحباً بك ÙÙŠ معرض الصور';
$lang['Welcome to your new installation of Piwigo!'] = 'مرحبا بكم ÙÙŠ التثبيت الجديد من Piwigo!';
+$lang['localhost or other, supplied by your host provider'] = 'المضي٠المحلي او المقدم من قبل موÙر الخدمة الخاص بك';
?> \ No newline at end of file
diff --git a/language/ar_SA/upgrade.lang.php b/language/ar_SA/upgrade.lang.php
index dafbc358c..56117b70f 100644
--- a/language/ar_SA/upgrade.lang.php
+++ b/language/ar_SA/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/az_AZ/common.lang.php b/language/az_AZ/common.lang.php
index 19bf167e4..8096e5f00 100644
--- a/language/az_AZ/common.lang.php
+++ b/language/az_AZ/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -61,28 +61,23 @@ $lang['... or please deactivate this message, I will find my way by myself'] = '
$lang['A comment on your site'] = 'Saytınızdakı şərh';
$lang['About Piwigo'] = 'Piwigo haqqında';
$lang['About'] = 'Haqqında';
-$lang['Album'] = 'albom
-';
+$lang['Album'] = 'albom';
$lang['File'] = 'fayl';
$lang['Display'] = 'göstər';
-$lang['Delete'] = 'sil
-';
+$lang['Delete'] = 'sil';
$lang['Date'] = 'tarix';
$lang['Contact'] = 'təmas';
$lang['Calendar'] = 'təqvim';
$lang['Are you sure?'] = 'əminsinizmi?';
$lang['All'] = 'Bütün';
-$lang['Author'] = 'Müəllif
-';
+$lang['Author'] = 'Müəllif';
$lang['Album: %s'] = 'Albom: %5';
$lang['Administration'] = 'Müdiriyyət';
-$lang['Accelerate diaporama speed'] = 'Sürətin artır
-';
+$lang['Accelerate diaporama speed'] = 'Sürətin artır';
$lang['Add a comment'] = 'Geyd əlavə et';
$lang['Admin: %s'] = 'Müdir: %5';
$lang['%d rate'] = '%d norma';
$lang['2small'] = 'XXS-bapbalaca';
-$lang['Comment'] = '
-qeyd';
+$lang['Comment'] = 'qeyd';
$lang['Albums'] = 'Albomlar';
?> \ No newline at end of file
diff --git a/language/bg_BG/admin.lang.php b/language/bg_BG/admin.lang.php
index 56fc0c0ff..d0c9d2a86 100644
--- a/language/bg_BG/admin.lang.php
+++ b/language/bg_BG/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -385,7 +385,6 @@ $lang['High definition'] = 'ВиÑока разделителна ÑпоÑобн
$lang['delete'] = 'изтриване';
$lang['deleted'] = 'изтрито';
$lang['directories + files'] = 'директории + файлове';
-$lang['email'] = 'Имейл';
$lang['existing album'] = 'ÑъщеÑтвуващ албум';
$lang['guest'] = 'гоÑÑ‚';
$lang['hide details'] = 'Ñкриване на детайли';
@@ -558,7 +557,6 @@ $lang['Graphics Library'] = 'Графична библиотека';
$lang['General statistics'] = 'Обща ÑтатиÑтика';
$lang['Installed Languages'] = 'ИнÑталирани езици';
$lang['Install on your computer,'] = 'ИнÑталирай на Ñ‚Ð²Ð¾Ñ ÐºÐ¾Ð¼Ð¿ÑŽÑ‚ÑŠÑ€,';
-$lang['Main'] = 'ОÑновен';
$lang['Invert'] = 'Обърни';
$lang['Maximum width'] = 'МакÑимална ширина';
$lang['Maximum height'] = 'МакÑимална виÑочина';
@@ -949,4 +947,32 @@ $lang['Plugin has been successfully copied'] = 'Този плъгин беше Ð
$lang['Piwigo publish plugin for digiKam'] = 'Piwigo издаде плъгин за digiKam';
$lang['Piwigo publish plugin for Shotwell'] = 'Piwigo издаде плъгин за Shotwell';
$lang['Piwigo export plugin for iPhoto'] = 'Piwigo издаде плъгин за iPhoto';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'Размерите на Ñнимката ще бъдат редуцирани до %dx%d пикÑела.';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'ПреоразмерÑване Ñлед качването е забранено ако ползвате GD за графична библиотека';
+$lang['Select at least one tag'] = 'Изберете поне един таг';
+$lang['General'] = 'Общо';
+$lang['Mail theme'] = 'Mail тема';
+$lang['Basic settings'] = 'ОÑновни наÑтройки';
+$lang['on the %d selected users'] = 'на %d избраните потребители';
+$lang['Users modified'] = 'Потребителите Ñа променени';
+$lang['User %s updated'] = 'Обновени %s потребители';
+$lang['User %s added'] = 'Добавени %s потребители';
+$lang['Update user'] = 'ОбновÑване на потребител';
+$lang['Showing %s to %s of %s users'] = 'Показва %s за %s от %s потребители';
+$lang['Show %s users'] = 'Показани %s потребители';
+$lang['Registered on %s, %s.'] = 'РегиÑтриран на %s, %s.';
+$lang['Password updated'] = 'Паролата обновена';
+$lang['No user selected, no action possible.'] = 'ÐÑма избран потребител, невъзможна операциÑ.';
+$lang['No user selected of %d users'] = 'ÐÑма избран потребител от %d потребители';
+$lang['No matching user found'] = 'ÐÑма Ñъвпадение Ñ Ñ‚ÑŠÑ€ÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»';
+$lang['Loading...'] = 'Зареждане...';
+$lang['Last visit on %s, %s.'] = 'ПоÑледно поÑещение в %s, %s.';
+$lang['(filtered from %s total users)'] = '(отделени от %s общо потребители)';
+$lang['%d of %d users selected'] = '%d от %d потребители Ñа избрани';
+$lang['Change username'] = 'СмÑна на потребителÑко име';
+$lang['Change password'] = 'СмÑна на парола';
+$lang['All %d users are selected'] = 'Ð’Ñички %d потребители Ñа избрани';
+$lang['close'] = 'затвори';
+$lang['Close user details'] = 'ЗатварÑне на потребителÑки детайли';
+$lang['Open user details'] = 'ОтварÑне на потребителÑки детайли';
?> \ No newline at end of file
diff --git a/language/bg_BG/common.lang.php b/language/bg_BG/common.lang.php
index 84c43bd35..36de74077 100644
--- a/language/bg_BG/common.lang.php
+++ b/language/bg_BG/common.lang.php
@@ -1,8 +1,8 @@
<?php
// +-----------------------------------------------------------------------+
-// | Piwigo - a PHP based picture gallery |
+// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2010 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: БългарÑки [BG]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=510
Author: Piwigo team
Author URI: http://piwigo.org
@@ -108,7 +108,6 @@ $lang['SQL queries in'] = 'SQL Ð·Ð°Ð¿Ð¸Ñ‚Ð²Ð°Ð½Ð¸Ñ Ð²';
$lang['display only recently posted photos'] = 'покажи Ñамо наÑкоро добавени Ñнимки';
$lang['return to the display of all photos'] = 'върни Ñе на преглед на вÑички Ñнимки';
$lang['the beginning'] = 'началото';
-$lang['Interface theme'] = 'Тема на интерфейÑа';
$lang['Thumbnails'] = 'Умален преглед';
$lang['Menu'] = 'Меню';
$lang['A comment on your site'] = 'Коментар на ВашиÑÑ‚ Ñайт';
@@ -296,7 +295,6 @@ $lang['login mustn\'t end with a space character'] = 'потребителÑко
$lang['login mustn\'t start with a space character'] = 'потребителÑкото име неможе да започва Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð²Ð°Ð»';
$lang['this login is already used'] = 'потребителÑкото име е заето';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'мейл адреÑÑŠÑ‚ Ñ‚Ñ€Ñбва да бъде подобно на xxx@yyy.eee (пример : jack@altern.org)';
-$lang['please enter your password again'] = 'Ð¼Ð¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ Вашата парола отново';
$lang['Auto login'] = 'Ðвтоматично влизане';
$lang['remove this tag from the list'] = 'премахване на този маркер от ÑпиÑъка';
$lang['representative'] = 'предÑтавител';
@@ -413,4 +411,12 @@ $lang['Username is mandatory'] = 'ПотребителÑкото име е заÐ
$lang['Email address is mandatory'] = 'Имейл адреÑа е задължителен';
$lang['Your website URL is invalid'] = 'Ð’Ð°ÑˆÐ¸Ñ ÑƒÐµÐ±Ñайт Ð°Ð´Ñ€ÐµÑ Ðµ грешен';
$lang['Website'] = 'УебÑайт';
+$lang['Email'] = 'Имейл';
+$lang['First Page'] = 'Първа Ñтраница';
+$lang['Go back to the album'] = 'Връщане обратно към албума';
+$lang['Last Page'] = 'ПоÑледна Ñтраница';
+$lang['Password is missing. Please enter the password.'] = 'ЛипÑва парола. ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Потвърждение на паролата липÑва. ÐœÐ¾Ð»Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€ÐµÑ‚Ðµ паролата.';
+$lang['%d photos per page'] = '%d Ñнимки за Ñтраница';
+$lang['Theme'] = 'Тема';
?> \ No newline at end of file
diff --git a/language/bg_BG/help/cat_modify.html b/language/bg_BG/help/cat_modify.html
index 2ec657a41..bff41083a 100755
--- a/language/bg_BG/help/cat_modify.html
+++ b/language/bg_BG/help/cat_modify.html
@@ -24,109 +24,101 @@
вÑички под албуми Ñтават чаÑтни. Ðко направите албума публичен,
вÑички под албуми Ñтават публични.</li>
- <li><strong>Lock</strong>: The album and its sub-albums will
- be temporary disabled for maintenance.</li>
+ <li><strong>Заключване </strong>: Ðлбума и под-албумите
+ Ñа временно извън подръжка.</li>
- <li><strong>Comments</strong>: Authorize users to comment photos of this
- album.</li>
+ <li><strong>Коментари</strong>: Разрешаване на потребителите да коментират Ñнимки в този
+ албум.</li>
</ul>
-<p>You can also manage these options on the "Properties"
-management screen (screens <span
-class="pwgScreen">Comments</span>, <span class="pwgScreen">Lock</span>,
-<span class="pwgScreen">Public/Private</span>, <span
-class="pwgScreen">Representative</span> available from <span
-class="pwgScreen">Administration &raquo; Albums &raquo; Properties</span>).</p>
+<p>Също можете да управлÑвате тези опции от Ñтраницата "Properties"
+(Ñтраници <span
+class="pwgScreen">Коментари</span>, <span class="pwgScreen">Заключено</span>,
+<span class="pwgScreen">Публично/ЧаÑтно</span>, <span
+class="pwgScreen">ПредÑтавително</span> Ðалично от <span
+class="pwgScreen">ÐдминиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ &raquo; Ðлбуми &raquo; Опции </span>).</p>
-<h3>Sort order</h3>
+<h3>Подреди опции </h3>
-<p>Use the default images sort order.</p>
+<p>Използвай зададените Ñнимки подреди ред.</p>
-<p>Indicate whether this sort order will apply to subalbums also.</p>
+<p>ПоÑочете дали този ред важи и за вÑички подалбуми. </p>
-<p>Select specific sorting criteria to be used with this album.</p>
+<p>Изберете Ñпецифичен критерии за подредба, приложим за този албум.</p>
<ul>
-<li><strong>Creation date</strong>: Photo shooting date</li>
-<li><strong>Post date</strong>: Synchronization date</li>
-<li><strong>Average rate (*)</strong>: Average rate could be changed by the visitor rating</li>
-<li><strong>Most visited (*)</strong>: The current visit might change the most visited order</li>
-<li><strong>File name</strong>: Name given in information field</li>
-<li><strong>Id</strong>: Internal Id (recent categories have an higher id than previous ones.</li>
+<li><strong>Дата на Ñъздаване</strong>: Фото Дата на Ñнимане</li>
+<li><strong>Дата на поÑтване</strong>: Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð´Ð°Ñ‚Ð°</li>
+<li><strong>Среден рейт (*)</strong>:СредниÑÑ‚ рейт може да бъде променÑн в завиÑимоÑÑ‚ от оценките на потребителите</li>
+<li><strong>Ðай-поÑещавани(*)</strong>:ÐатоÑщото поÑещение може да промени реда на най-поÑещавани </li>
+<li><strong>Име на файла</strong>: Име,поÑочено в информационното поле</li>
+<li><strong>ИдентификациÑ</strong>:Вътрешна идентификациÑ(Ñкоро Ñъздадени/поÑетени категории имат по-виÑоко id от по-Ñтарите такива)</li>
</ul>
-<p><strong>(*)</strong>Warning: Be sure to test these sort orders by yourself as they can give unexpected results.</p>
+<p><strong>(*)</strong>Внимание:Прегледайте този ред на подредба,тъй като може да даде неочаквани резултати .</p>
-<h3>Representant</h3>
+<h3>ПредÑтавител</h3>
-<p>The album representative is the thumbnail displayed on the main page (<span class="pwgScreen">category.php</span>) to represent
-the album when
-it contains only sub-albums and no direct photo (just as the root album).</p>
-photo of a album :</p>
+<p>ПредÑтавителната икона за албума, Ñъвпада Ñ Ñ‚Ð°Ð·Ð¸,показана на главната Ñтраница(<span class="pwgScreen">category.php</span>) да предÑÑ‚Ð°Ð²Ñ Ð°Ð»Ð±ÑƒÐ¼Ð°,когато той Ñъдържа Ñамо подалбуми и никакви директни Ñними (както в Ð½Ð°Ñ‡Ð°Ð»Ð½Ð¸Ñ Ð°Ð»Ð±ÑƒÐ¼).</p>
+Ñнимка на албума :</p>
<ul>
- <li><span class="pwgScreen">Photo page</span>: one of the action buttons let you set the current photo as the representative for the
- displayed album. This button is available only for administrators.</li>
+ <li><span class="pwgScreen">Photo page</span>:един от бутоните ви позволÑва да направите наÑтоÑщата Ñнимка предÑтавителна за албума.Този бутон е активен Ñамо за админиÑтратори.</li>
- <li><span class="pwgScreen">Modify informations about a photo</span> in
- administration. This screen can be reached from <span
- class="pwgScreen">picture.php</span> or <span class="pwgScreen">Batch
- management</span> in <em>unit mode</em>. See the help of this screen for
- details.</li>
+ <li><span class="pwgScreen">Промени информациÑта за Ñнимката</span> в админиÑтрациÑта. До това поле може да Ñе доÑтигне чрез <span
+ class="pwgScreen">picture.php</span> или <span class="pwgScreen">Batch
+ management</span> in <em>unit mode</em>.Вижте помощното менщ за повече информациÑ</li>
+
+ <li><span class="pwgScreen">ÐдминиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ &raquo; Ðлбуми&raquo; Опции,
+ ПредÑтавител</span>.Вижте помощното менщ за повече информациÑ.</li>
- <li><span class="pwgScreen">Administration &raquo; Albums &raquo; Properties,
- Representative</span>. See the help of this screen for details.</li>
-
- <li><span class="pwgScreen">Edit album</span> (the present screen).</li>
+ <li><span class="pwgScreen"Промени наÑтройките на албума</span> (the present screen).</li>
</ul>
-<p>The choice of a representative depends on the
-<code>allow_random_representative</code> configuration parameter (see <span
+<p>Изборът на предÑтавителна Ñнимка завиÑи от
+<code>allow_random_representative</code> параметрите на конфигурациÑ(see <span
class="filename">include/config_default.inc.php</span>).</p>
-<p>In default mode (<code>allow_random_representative</code> set to false),
-each album containing at least one element is represented by a fixed
-element. Once set (at album creation), the representative changes only
-when an administrator ask for it. If the representative is not appropriate,
-you can ask to <strong>Find a new representant by random</strong>.</p>
+<p>Ð’ наÑтоÑщиÑÑ‚ модел (<code>allow_random_representative</code> set to false),
+вÑеки албум,Ñъдържащ поне един елемент е предÑтавен от Ñборен такъв.Веднъж наÑтроен (при Ñъздаването на албума), предтÑавителната Ñнимка Ñе Ð¿Ñ€Ð¾Ð¼ÐµÐ½Ñ Ñамо
+когато админиÑтраторът пожелае това. Ðко предÑтавителната Ñнимка не е подходÑща,
+може да пожелаете да <strong>бъде намерена нова произвелна предÑтавителна Ñнимка</strong>.</p>
<p>If the <code>allow_random_representative</code> configuration parameter is
set to true, a category containing photos may have no fixed
representant. Just use <strong>Delete representant</strong> button.</p>
-<p>If the album contains only sub-albums and no photo, it can nonetheless be represented by any element thanks to <span class="pwgScreen">Modify
-informations about a photo</span> screen. The only option on the current screen
-is the <strong>Delete representant</strong> button.</p>
+<p>Ðко албумът Ñъдържа Ñамо подалбуми и никакви Ñнимки, може да бъде предтавен от произволен елемент <span class="pwgScreen">Промени информациÑта за Ñнимка</span> екран. ЕдинÑтвената Ð¾Ð¿Ñ†Ð¸Ñ Ð² наÑтоÑщето поле е <strong>Изтрий предтавителна Ñнимка </strong> бутон.</p>
-<h3>Link all album photos to a new album</h3>
+<h3>Обвържете вÑички Ñнимки опт албума Ñ Ð½Ð¾Ð² албум</h3>
<ul>
-<li><strong>Virtual album name</strong>: Name of the new album to be created,
-all photos of the current category will be linked to the new one.</li>
+<li><strong>Виртуално име на албума</strong>:Име на новоÑÑŠÐ·Ð´Ð°Ð´ÐµÐ½Ð¸Ñ Ð°Ð»Ð±ÑƒÐ¼,
+вÑички Ñнимки от наÑтоÑщата ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Ñ‰Ðµ бъдат обвързани Ñ Ð½Ð¾Ð²Ð¸Ñ Ð°Ð»Ð±ÑƒÐ¼.</li>
-<li><strong>Parent album</strong>: Where the new album will be,
-leave empty to create it at root.</li>
+<li><strong>Ðлбум майка</strong>: Където ще Ñе намира новиÑÑ‚ албум,
+оÑтавете празно мÑÑто.</li>
</ul>
-<h3>Link all album photos to existing albums</h3>
+<h3>Връзка на вÑички албуми ÑÑŠÑ Ñнимки на ÑъщеÑтвуващите албуми</h3>
<ul>
-<li><strong>Ðлбуми</strong>: Choose the destination album.</li>
+<li><strong>Ðлбуми</strong>: Изберете деÑтинациÑта на албума.</li>
</ul>
-<h3>Send an information email to group members</h3>
+<h3>Изпрати имейл Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° членовете на групата</h3>
<ul>
-<li><strong>Group</strong>: recipients group</li>
+<li><strong>Група</strong>: Група получатели</li>
-<li><strong>Mail content</strong>: Free text to send to them.</li>
+<li><strong>Mail Ñъдържание</strong>: Свободен текÑÑ‚, за да изпрати на Ñ‚ÑÑ….</li>
</ul> \ No newline at end of file
diff --git a/language/bg_BG/help/cat_move.html b/language/bg_BG/help/cat_move.html
new file mode 100755
index 000000000..3723f159d
--- /dev/null
+++ b/language/bg_BG/help/cat_move.html
@@ -0,0 +1,14 @@
+<h2>ПремеÑтване на виртуални Ðлбуми</h2>
+
+<p>Само виртуални албуми може да има в нов албум майка.</p>
+
+<h3>Виртуални албуми за движение</h3>
+
+<p>Изберете един или нÑколко виртуални албуми, които иÑкате да премеÑтите.
+Ðко ÑпиÑъкът е празен, това означава, че не Ñа Ñъздали още албуми.</p>
+
+<h3>Ðов албум майка</h3>
+
+<p>Изберете Ð½Ð¾Ð²Ð¸Ñ Ð°Ð»Ð±ÑƒÐ¼-родител (виртуален или физичеÑки).
+Ðко не Ñте израли родител, избраните виртуални албуми ще бъдат премеÑтени като начални.
+Един албум не може да бъде премеÑтен в ÑÐ°Ð½Ð¸Ñ Ñебе Ñи или в нÑкой от дъщерните албуми.</p> \ No newline at end of file
diff --git a/language/bg_BG/help/cat_options.html b/language/bg_BG/help/cat_options.html
new file mode 100755
index 000000000..556d870cf
--- /dev/null
+++ b/language/bg_BG/help/cat_options.html
@@ -0,0 +1,21 @@
+<h2>Опции за Ðлбум</h2>
+
+<p>Опции за управление на нÑколко албуми едновременно</p>
+
+<dl>
+
+<dt>Коментари</dt>
+<dd>Снимка може да Ð¾Ñ‚Ð³Ð¾Ð²Ð°Ñ€Ñ Ð½Ð° коментар на вашите поÑетители ако това е зададено и активирано предварително.</dd>
+
+<dt>Заключване</dt>
+<dd>Заключените албуми Ñа Ñкрити. Само админиÑтраторите могат да ги виждат в галериÑта Ñи.</dd>
+
+<dt>Публично/ чаÑтно</dt>
+<dd>Веднъж обÑвен за чаÑтен албума позволÑва да му Ñе задават групи и потребители Ñ Ð´Ð¾Ñтъп</dd>
+
+<dt>ПредÑтавÑне</dt>
+<dd>Тази Ð¾Ð¿Ñ†Ð¸Ñ Ð¸ възможно когато зададете в конфигурационните наÑтройки <code>allow_random_representative</code>
+ (виж <span class="filename">include/config_defaults.inc.php</span>) за <em>true</em>.
+Ð’Ñеки албум може да бъде предÑтавлÑван от ÑменÑщи Ñе Ñнимки или от поÑтоÑнно зададана такава.</dd>
+
+</dl> \ No newline at end of file
diff --git a/language/bg_BG/help/synchronize.html b/language/bg_BG/help/synchronize.html
new file mode 100755
index 000000000..3e7d203ad
--- /dev/null
+++ b/language/bg_BG/help/synchronize.html
@@ -0,0 +1,14 @@
+<h2>Синхронизиране</h2>
+
+<p>Има два различни вида ÑинхронизациÑ:</p>
+<ul>
+ <li>директории/файлове</li>
+ <li>файлов мениджър</li>
+</ul>
+
+<p>Синхронизаране на директорите и файловете е когато ъпдейтвате дървовидната Ñтруктура на папките Ñи Ñ Ñ‚Ð°Ð·Ð¸ на базата данни (логичната).
+Синхронизиране на metadata на файловете е когато Ñе ъпдейтва инфо за Ñнимките като размер , пропорциÑ, пикÑели и прочие Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð² базата данни.</p>
+
+<p>Когато Ñинхронизирате файлове Ñ Ð±Ð°Ð·Ð°Ñ‚Ð° данни е необходимо първо да Ñе Ñинхронизират папките.</p>
+
+<p>СинхронизациÑта може да отнеме доÑтатъчно дълго време (завиÑи от Ñървъра и Ð±Ñ€Ð¾Ñ Ð½Ð° елеметите който ще Ñе Ñинхронизират), затова е удобно да го правите албум по албум.</p>
diff --git a/language/bg_BG/help/user_list.html b/language/bg_BG/help/user_list.html
new file mode 100755
index 000000000..74af743a9
--- /dev/null
+++ b/language/bg_BG/help/user_list.html
@@ -0,0 +1,23 @@
+<h2>СпиÑък потребители</h2>
+
+<p>Това е мÑÑтото където вие редактирате потребителите във вашата галериÑ.</p>
+
+<h3>ДобавÑне</h3>
+
+<p>ÐдминиÑтраторите могат да добавÑÑ‚ потрелбители ръчно. Ðужно е потребителÑко име, парола и имейл адреÑ.</p>
+
+<h3>СпиÑък на потребителите</h3>
+
+<p>СпиÑъка Ñ Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ‚Ðµ потребители може да бъде филтриран по име (използвайте * за нейзвеÑно), групи по ÑтатуÑ. Може да Ñе потреди по дата на региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¸Ð»Ð¸ потребителÑко име и прочие...</p>
+
+<p>Ð’ този екран може да редактирате нÑколко Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ ÐµÐ´Ð½Ð¾Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾, ползвайки различни дейÑтвиÑ:</p>
+
+<ul>
+ <li>изтриване (изиÑква потвърждение)</li>
+ <li>ÑмÑна на ÑтатуÑа</li>
+ <li>Ñвързване или премахване в групи</li>
+ <li>промÑна на визуалните наÑтройки</li>
+ <li>промÑна на допълнителните наÑтройки</li>
+</ul>
+
+<p>целта е избран потребител (по подразбиране) или вÑички потребители избрани по критерии.</p> \ No newline at end of file
diff --git a/language/bg_BG/index.php b/language/bg_BG/index.php
index 17747c927..47198ca08 100644
--- a/language/bg_BG/index.php
+++ b/language/bg_BG/index.php
@@ -1,6 +1,6 @@
<?php
// +-----------------------------------------------------------------------+
-// | Piwigo - a PHP based picture gallery |
+// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
// | Copyright(C) 2008-2010 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
diff --git a/language/bg_BG/install.lang.php b/language/bg_BG/install.lang.php
index b960c9451..9c450799e 100644
--- a/language/bg_BG/install.lang.php
+++ b/language/bg_BG/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -20,6 +20,7 @@
// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
// | USA. |
// +-----------------------------------------------------------------------+
+
$lang['also given by your host provider'] = 'Ñъщо предоÑтавена от доÑтавчика на уÑлугата';
$lang['Basic configuration'] = 'ОÑновно конфигуриране';
$lang['Database configuration'] = 'Конфигуриране на базата данни';
@@ -32,13 +33,11 @@ $lang['enter a login for webmaster'] = 'въведете потребителÑÐ
$lang['Installation'] = 'ИнÑталиране';
$lang['Just another Piwigo gallery'] = 'Още една Piwigo фотогалериÑ';
$lang['Keep it confidential, it enables you to access administration panel'] = 'Пазете Ñ Ð² тайна, Ñ‚Ñ Ð’Ð¸ дава доÑтъп до админиÑÑ‚Ñ€Ð°Ñ‚Ð¸Ð²Ð½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»';
-$lang['Password'] = 'Парола';
$lang['Password [confirm]'] = 'Парола [потвърждаване]';
$lang['please enter your password again'] = 'молÑ, въведете паролата още веднъж';
$lang['User'] = 'Потребител';
$lang['verification'] = 'проверка';
$lang['webmaster login can\'t contain characters \' or "'] = 'потребителÑкото име за уебмаÑтера, не може да Ñъдържа Ñимволите\' или "';
-$lang['Webmaster password'] = 'Парола на уебмаÑтера';
$lang['Welcome to my photo gallery'] = 'Здравейте и добре дошли в моÑта фотогалериÑ';
$lang['Welcome to your new installation of Piwigo!'] = 'Здравейте и добре дошли във вашата нова Piwigo инÑталациÑ! ';
$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Вие можете да изтеглите ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð» и да го качите в директориÑта local/config на вашата инÑталациÑ';
@@ -55,18 +54,15 @@ $lang['Try to configure PHP 5'] = 'Опитайте да наÑтройте PHP
$lang['user login given by your host provider'] = 'потребителÑко име за доÑтъп до Ð²Ð°ÑˆÐ¸Ñ Ð´Ð¾Ñтавчик';
$lang['user password given by your host provider'] = 'парола за доÑтъп до Ð²Ð°ÑˆÐ¸Ñ Ð´Ð¾Ñтавчик';
$lang['Visitors will be able to contact site administrator with this mail'] = 'Потребителите ще могат да използват този имейл за контакт Ñ ÐдминиÑтратора на Ñайта';
-$lang['Webmaster mail address'] = 'Webmaster имейл адреÑ';
$lang['Can\'t connect to server'] = 'Ðевъзможен доÑтъп до Ñървъра';
$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Връзката ÑÑŠÑ Ñървъра е уÑпешна, но доÑтъпа до базата данни е невъзможен';
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Това ще е видимо от потребителите. Ðеобходимо е за админиÑтриране на Ñайта';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'имейл адреÑа Ñ‚Ñ€Ñбва да е като xxx@yyy.eee (example : jack@altern.org)';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Ðужна ви е помощ? Задайте вашиÑÑ‚ Ð²ÑŠÐ¿Ñ€Ð¾Ñ Ð² <a href="%s">Piwigo борда за ÑъобщениÑ</a>.';
$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Вие може да промените конфигурациÑта и Ñами и да реÑтартирате Piwigo Ñлед това.';
-$lang['Webmaster login'] = 'Webmaster вход';
$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Ðлтернативно решение е да копирате текÑта от кутиÑта горе и да го добавите ръчно във файла "local/config/database.inc.php" (Ð’ÐИМÐÐИЕ: database.inc.php Ñ‚Ñ€Ñбва да Ñъдържа Ñамо това от текÑтовото поле, без празни знаци)';
$lang['Creation of config file local/config/database.inc.php failed.'] = 'Създаването на конфигурационен файл local/config/database.inc.php е неуÑпещно.';
$lang['It appears your webhost is currently running PHP %s.'] = 'Изглежда вашиÑÑ‚ уеб хоÑÑ‚ Ñе изпълнÑва в PHP %s';
$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo може да Ñе опита да превключите вашата ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð½Ð° PHP 5 като Ñъздаде или промени .htaccess файла.';
$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Обърнете Ñе към Ð²Ð°ÑˆÐ¸Ñ Ñ…Ð¾Ñтинг доÑтавчик и вижте как можете да преминете към PHP 5 ÑамоÑтоÑтелно.';
-?>
+$lang['localhost or other, supplied by your host provider'] = 'localhost или друг, предоÑтавен от вашиÑÑ‚ хоÑÑ‚ провайдер';
+?> \ No newline at end of file
diff --git a/language/bg_BG/upgrade.lang.php b/language/bg_BG/upgrade.lang.php
index 348526d6f..be2a26242 100644
--- a/language/bg_BG/upgrade.lang.php
+++ b/language/bg_BG/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/bn_IN/common.lang.php b/language/bn_IN/common.lang.php
index 81df57c8f..cb66ca738 100644
--- a/language/bn_IN/common.lang.php
+++ b/language/bn_IN/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/br_FR/about.html b/language/br_FR/about.html
new file mode 100644
index 000000000..f43a0d13e
--- /dev/null
+++ b/language/br_FR/about.html
@@ -0,0 +1,5 @@
+<p>Ar palier-luc'hskeudennoù-mañ a zo diazezet war Piwigo.</p>
+
+<p>Ur meziant palier-luc'hskeudennoù evit ar web eo Piwigo, savet gant ur gumuniezh bev a implijerien hag a ziorroerien. Aes eo da bersonelaat Piwigo gant an astennoù. Frank ha digoust eo Piwigo zoken.</p>
+
+<p id="linkToPiwigo"><a href="http://piwigo.org">Gweladenniñ lec'hienn web Piwigo</a></p> \ No newline at end of file
diff --git a/language/br_FR/admin.lang.php b/language/br_FR/admin.lang.php
new file mode 100755
index 000000000..b4e9ed652
--- /dev/null
+++ b/language/br_FR/admin.lang.php
@@ -0,0 +1,156 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang[' and %d virtual'] = 'ha %d galloudel';
+$lang[' and %d virtuals'] = 'ha %d galloudel';
+$lang['Add a virtual album'] = 'Ouzhpennañ ur rummad galloudel';
+$lang['Virtual Links'] = 'Liammoù galloudel';
+$lang['Virtual album'] = 'Rummad galloudel';
+$lang['Virtual album added'] = 'Rummad galloudel ouzhpennet';
+$lang['Virtual album deleted'] = 'Rummad galloudel dilimet';
+$lang['Virtual album name'] = 'Anv ar rummad galloudel';
+$lang['Virtual albums to move'] = 'Rummadoù galloudel da zilec\'hiañ';
+$lang['With no virtual album'] = 'Hep rummad galloudel';
+$lang['%d album moved'] = 'dilec\'hiet %d rummad';
+$lang['%d albums moved'] = 'dilec\'hiet %d rummad';
+$lang['%d day'] = '%d deiz';
+$lang['%d days'] = '%d deiz';
+$lang['%d anomalies have been detected corrected.'] = '%d direizhder a zo bet detektet ha reizhet.';
+$lang['%d anomalies have been detected.'] = '%d direizhder a zo bet detektet.';
+$lang['%d anomalies have been ignored.'] = '%d direizhder n\'int ket bet reizhet.';
+$lang['%d anomalies have not been corrected.'] = '%d direizhder n\'int ket bet posubl reizhañ.';
+$lang['%d anomaly has been corrected.'] = '%d direizhder a zo bet reizhet.';
+$lang['%d anomaly has been detected.'] = '%d direizhder a zo bet detektet.';
+$lang['%d anomaly has been ignored.'] = '%d direizhder n\'eo ket bet reizhet.';
+$lang['%d anomaly has not been corrected.'] = '%d direizhder n\'eo ket bet posubl reizhañ.';
+$lang['%d guest'] = '%d gweladenner';
+$lang['%d guests'] = '%d gweladenner';
+$lang['%d hour'] = '%d eurvezh';
+$lang['%d hours'] = '%d eurvezh';
+$lang['%d member'] = '%d ezel';
+$lang['%d members'] = '%d ezel';
+$lang['%d month'] = '%d mizvezh';
+$lang['%d months'] = '%d mizvezh';
+$lang['%d second'] = '%d eilenn';
+$lang['%d seconds'] = '%d eilenn';
+$lang['%d photo was deleted'] = '%d luc\'hskeudenn dilemet';
+$lang['%d photos uploaded'] = '%d luc\'hskeudenn pellgarget';
+$lang['%d photos were deleted'] = '%d luc\'hskeudenn dilemet';
+$lang['%d line filtered'] = '%d linenn silet';
+$lang['%d lines filtered'] = '%d linenn silet';
+$lang['%d minute'] = '%d munut';
+$lang['%d minutes'] = '%d munut';
+$lang['%d association'] = '%d kevredigez';
+$lang['%d associations'] = '%d kevredigez';
+$lang['%d group'] = '%d strollad';
+$lang['%d groups'] = '%d strollad';
+$lang['%d mail was not sent.'] = '%d postel n\'eo ket bet kaset.';
+$lang['%d mail was sent.'] = '%d postel a zo bet kaset.';
+$lang['%d mails were not sent.'] = '%d postel n\'int ket bet kaset.';
+$lang['%d mails were sent.'] = '%d postel a zo bet kaset.';
+$lang['%d album including'] = '%d rummad, dioutañ';
+$lang['%d albums including'] = '%d rummad, diouto';
+$lang['%d tag'] = '%d merker';
+$lang['%d week'] = '%d sizhunvezh';
+$lang['%d weeks'] = '%d sizhunvezh';
+$lang['%d year'] = '%d bloavezh';
+$lang['%d years'] = '%d bloavezh';
+$lang['%s ago'] = '%s zo';
+$lang['%s in the future'] = '%s en dazont';
+$lang['%d user'] = '%d implijer';
+$lang['%d user deleted'] = '%d implijer dilemet';
+$lang['%d users'] = '%d implijer';
+$lang['%d users deleted'] = '%d implijer dilemet';
+$lang['Notify administrators when a comment is'] = 'Kemenn ar merour pa vez un evezhiadenn';
+$lang['%d of %d photos selected'] = '%d luc\'hskeudenn etre %d diuzet';
+$lang['%d of %d users selected'] = '%d implijer etre %d diuzet';
+$lang['%d parameter was updated.'] = '%d arventenn hizivaet.';
+$lang['%d parameters were updated.'] = '%d arventenn hizivaet.';
+$lang['Status of user "%s" updated'] = 'Statud implijer "%s" hizivaet';
+$lang['Update user'] = 'Hizivaat implijer';
+$lang['Updates'] = 'Hizivadurioù';
+$lang['User %s updated'] = 'Implijer %s hizivaet';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Posubl eo hizivaat betek Piwigo %s war-eeun, hep hizivaat da Piwigo %s (erbedet).';
+$lang['photos updated in the database'] = 'luc\'hskeudennoù hizivaet en diaz roadennoù';
+$lang['update the database from files'] = 'Hizivaat an diaz roadennoù gant ar restroù';
+$lang['group "%s" updated'] = 'strollad "%s" hizivaet';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'Un hizivadur meur eo, gant <a href="%s">arc\'hweladurioù nevez a-feson</a>.';
+$lang['This is a minor update, with only bug corrections.'] = 'Un hizivadur bihan eo, gant reizhadurioù drein hepken.';
+$lang['Update photos information'] = 'Hizivaat titouroù al luc\'hskeudenn';
+$lang['Two updates are available'] = 'Daou hizivadur hergerzh';
+$lang['Update All'] = 'Hizivaat pep tra';
+$lang['Update Complete'] = 'Echu eo an hizivadur';
+$lang['Update albums informations'] = 'Hizivaat titouroù ar rummadoù';
+$lang['Update in progress... Please wait.'] = 'Hizivadur war ober… Gortozit.';
+$lang['Update to Piwigo %s'] = 'Hizivaat betek Piwigo %s';
+$lang['Reject'] = 'Dinac\'h';
+$lang['%d user comment validated'] = '%d evezhiadenn implijerien kadarnaet';
+$lang['%d user comments validated'] = '%d evezhiadenn implijerien kadarnaet';
+$lang['User comments validation'] = 'Kadarnaat evezhiadennoù an implijerien';
+$lang['%d user comment rejected'] = '%d evezhiadenn implijerien diwiriekaet';
+$lang['Activate comments'] = 'Gweredekaat an evezhiadennoù';
+$lang['Comments for all'] = 'Evezhiadennoù evit an holl';
+$lang['Default comments order'] = 'Urzh an evezhiadennoù dre ziouer';
+$lang['%d user comments rejected'] = '%d evezhiadenn implijerien diwiriekaet';
+$lang['Pending Comments'] = 'Evezhiadennoù o c\'hortoz';
+$lang['%d tags'] = '%d merker';
+$lang['%d physical'] = '%d fizikel';
+$lang['%d physicals'] = '%d fizikel';
+$lang['... or '] = '… pe';
+$lang['Photo informations updated'] = 'Hizivaet titouroù al luc\'hskeudenn';
+$lang['Password updated'] = 'Hizivaet ar ger-tremen';
+$lang['Check for updates'] = 'Sell ma vez hizivadurioù';
+$lang['%d user was not updated.'] = '%d implijer n\'eo ket bet hizivaet';
+$lang['%d users were not updated.'] = '%d implijer n\'int ket bet hizivaet';
+$lang['Ignore this update'] = 'Leuskel an hizivadur-mañ';
+$lang['%d user was updated.'] = '%d implijer hizivaet';
+$lang['Album updated successfully'] = 'Rummad hizivaet mat';
+$lang['Piwigo Update'] = 'Hizivadur Piwigo';
+$lang['%d users were updated.'] = '%d implijer hizivaet';
+$lang['%s has been successfully updated.'] = '%s a zo bet hizivaet';
+$lang['Reset ignored updates'] = 'Adderaouiñ an hizivadurioù dilezet';
+$lang['Add Photos'] = 'Lakaat luc\'hskeudennoù ouzhpenn';
+$lang['Add a tag'] = 'Lakaat ur merker ouzhpenn';
+$lang['Add a user'] = 'Lakaat un implijer ouzhpenn';
+$lang['%s photos can not be regenerated'] = '%s luc\'hskeudenn a zo bet adgraet';
+$lang['%s photos have been regenerated'] = '%s luc\'hskeudenn a zo bet adgraet';
+$lang['Photos generation in progress...'] = 'Oc\'h ober al luc\'hskeudennoù…';
+$lang['Thumbnails generation in progress...'] = 'Oc\'h ober ar skeudennoùigoù…';
+$lang['Email admins when a comment requires validation'] = 'Kas ur bostel pa vez ezhom da gadarnaat un evezhiadenn';
+$lang['Validate'] = 'Kadarnaat';
+$lang['Validation'] = 'Kadarnadur';
+$lang['pending validation'] = 'o c\'hortoz ar c\'hadarnadur';
+$lang['%d waiting for validation'] = '%d o c\'hortoz ar c\'hadarnadur';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'Ar restr ezkarget a zo pounneroc\'h eget sturiad MAX_FILE_SIZE lakaet e furmskrid HTML.';
+$lang['Start Upload'] = 'Kregiñ gant an ezkargañ';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'Ar restr ezkarget a zo pounneroc\'h eget sturiad upload_max_filesize e php.ini: %sB';
+$lang['The uploaded file was only partially uploaded'] = 'Ar restr da ezkargañ a zo bet ezkarget a-zarn hepken';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'Ar restroù ezkarget a zo pounneroc\'h eget sturiad post_max_size e php.ini: %sB';
+$lang['Unknown upload error'] = 'Fazi ezkargañ dianav';
+$lang['Upload'] = 'Ezkargañ';
+$lang['Upload Photos'] = 'Ezkargañ luc\'hskeudennoù';
+$lang['Uploaded Photos'] = 'Luc\'hskeudennoù ezkarget';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Oc\'h implij an ezkarger er merdeer emaoc\'h. Esaeit an <a href="%s">ezkarger Flash</a> kentoc\'h.';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Oc\'h implij an ezkarger Flash emaoc\'h. Kudennoù ? Esaeit an <a href="%s">ezkarger er merdeer</a> kentoc\'h.';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader a zo un <em>ezkarger Piwigo</em>. pLoader a brient hol luc\'hskeudennoù ha treuzkas anezho eus hoc\'h urzhiater d\'ho palier luc\'hskeudennoù Piwigo.';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = 'Ret eo arventennañ %s da false en ho restr local/config/config.inc.php';
+?> \ No newline at end of file
diff --git a/language/br_FR/br_FR.jpg b/language/br_FR/br_FR.jpg
new file mode 100644
index 000000000..2c6b6baed
--- /dev/null
+++ b/language/br_FR/br_FR.jpg
Binary files differ
diff --git a/language/br_FR/common.lang.php b/language/br_FR/common.lang.php
new file mode 100644
index 000000000..7baefb5a8
--- /dev/null
+++ b/language/br_FR/common.lang.php
@@ -0,0 +1,421 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Brezhoneg [FR]
+Version: 2.6.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=698
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Brezhoneg';
+$lang_info['country'] = 'Frañs';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'br';
+$lang_info['zero_plural'] = true;
+
+$lang['%d comments'] = '%d evezhiadenn';
+$lang['%d hit'] = '%d klik';
+$lang['%d hits'] = '%d klik';
+$lang['%d Kb'] = '%d Ko';
+$lang['%d new comment'] = '%d evezhiadenn nevez';
+$lang['%d new comments'] = '%d evezhiadenn nevez';
+$lang['%d new photo'] = '%d luc\'hskeudenn nevez';
+$lang['%d new photos'] = '%d luc\'hskeudenn nevez';
+$lang['%d new user'] = '%d implijer nevez';
+$lang['%d new users'] = '%d implijer nevez';
+$lang['Date'] = 'Deiziad';
+$lang['day'][0] = 'Sul';
+$lang['day'][1] = 'Lun';
+$lang['day'][2] = 'Meurzh';
+$lang['day'][3] = 'Merc\'her';
+$lang['day'][4] = 'Yaou';
+$lang['day'][5] = 'Gwener';
+$lang['day'][6] = 'Sadorn';
+$lang['month'][10] = 'Here';
+$lang['month'][11] = 'Du';
+$lang['month'][12] = 'Kerzu';
+$lang['month'][1] = 'Genver';
+$lang['month'][2] = 'C\'hwevrer';
+$lang['month'][3] = 'Meurzh';
+$lang['month'][4] = 'Ebrel';
+$lang['month'][5] = 'Mae';
+$lang['month'][6] = 'Mezheven';
+$lang['month'][7] = 'Gouere';
+$lang['month'][8] = 'Eost';
+$lang['month'][9] = 'Gwengolo';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... pe ziweredekait ar c\'hemenn-mañ, va-unan e tibabin';
+$lang['2small'] = 'XXS - bihan';
+$lang['... or browse your empty gallery'] = '... pe verdeit d\'ho palier goullo';
+$lang['(!) This comment requires validation'] = '(!) Ret eo kadarnaat an evezhiadenn-mañ';
+$lang['%d photos are also linked to current tags'] = '%d luc\'hskeudenn a zo liammet d\'ar merkerioù red ivez';
+$lang['%d rate'] = '%d notenn';
+$lang['%d rates'] = '%d notenn';
+$lang['%d photo is also linked to current tags'] = '%d luc\'hskeudenn a zo liammet d\'ar merkerioù red ivez';
+$lang['%d album updated'] = '%d rummad hizivaet';
+$lang['%d albums updated'] = '%d rummad hizivaet';
+$lang['%d comment'] = '%d evezhiadenn';
+$lang['%d comment to validate'] = '%d evezhiadenn implijer da gadarnaat';
+$lang['%d comments to validate'] = '%d evezhiadenn implijerien da gadarnaat';
+$lang['%d photo'] = '%d luc\'hskeudenn';
+$lang['%d photos'] = '%d luc\'hskeudenn';
+$lang['About Piwigo'] = 'Diwar-benn Piwigo';
+$lang['About'] = 'Diwar-benn';
+$lang['A comment on your site'] = 'Un evezhiadenn war ho lec\'hienn';
+$lang['All tags'] = 'An holl merkerioù';
+$lang['Album'] = 'Rummad';
+$lang['Album results for'] = 'Disoc\'hoù ar rummadoù evit';
+$lang['Album: %s'] = 'Rummad : %s';
+$lang['Albums'] = 'Rummadoù';
+$lang['All'] = 'Holl';
+$lang['Administration'] = 'Mererezh';
+$lang['Admin: %s'] = 'Mererezh : %s';
+$lang['Add a comment'] = 'Lakaat un evezhiadenn ouzhpenn';
+$lang['Accelerate diaporama speed'] = 'Buanaat an diaporama';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Gwelet vo hoc\'h evezhiadenn goude ma vo aotreet gant ur merour';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Lusker enepstrob : gortozit a-raok lakaat un evezhiadenn ouzhpenn';
+$lang['Any tag'] = 'Ur merker bennak';
+$lang['Best rated'] = 'Notet ar gwellañ';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Statud fall evit an implijer "guest", ar statud dre ziouer a vo implijet. Kemennit ar mestr-gwiad.';
+$lang['Bad request'] = 'Reked fall';
+$lang['Author'] = 'Oberour';
+$lang['Author: %s'] = 'Oberour: %s';
+$lang['Auto login'] = 'Kevreadenn emgefre';
+$lang['At least one listed rule must be satisfied.'] = 'Un dezverk d\'an neubeutañ a renk bezañ gwiriet';
+$lang['Are you sure?'] = 'Ha sur oc\'h ?';
+$lang['Calendar'] = 'Deiziadur';
+$lang['Browser: %s'] = 'Ergerzher: %s';
+$lang['Check your email for the confirmation link'] = 'Sellit ouzh ho posteloù evit al liamm-kadarnaat';
+$lang['Change my password'] = 'Cheñch va ger-tremen';
+$lang['Complete RSS feed (photos, comments)'] = 'Gwazh RSS klok (luc\'hskeudennoù, evezhiadennoù)';
+$lang['Comment'] = 'evezhiadenn';
+$lang['Comment by %s'] = 'evezhiadenn gant %s';
+$lang['Comment: %s'] = 'evezhiadenn : %s';
+$lang['Comments'] = 'Evezhiadennoù';
+$lang['Close this window'] = 'Serriñ ar prenestr-mañ';
+$lang['Click on the photo to see it in high definition'] = 'Klikit war al luc\'hskeudenn evit gwelet anezhi uhel e zespizadur';
+$lang['Click here if your browser does not automatically forward you'] = 'Klikit amañ ma ne vez ket kerzhet emgefreek';
+$lang['Confirm Password'] = 'Kadarnaat ar ger-tremen';
+$lang['Contact'] = 'Mont e darempred';
+$lang['Contact webmaster'] = 'Mont e darempred gant ar mestr-gwiad';
+$lang['Connection settings'] = 'Arventennoù kevreañ';
+$lang['Connected user: %s'] = 'Implijer enlinenn : %s';
+$lang['Default'] = 'Dre ziouer';
+$lang['Delete'] = 'Dilemel';
+$lang['Desktop'] = 'Klasel';
+$lang['Date posted, new &rarr; old'] = 'Deiziad ouzhpennañ, nevez &rarr; kozh';
+$lang['Date posted, old &rarr; new'] = 'Deiziad ouzhpennañ, kozh &rarr; nevez';
+$lang['Date created, new &rarr; old'] = 'Deiziad krouiñ, nevez &rarr; kozh';
+$lang['Date created, old &rarr; new'] = 'Deiziad krouiñ, kozh &rarr; nevez';
+$lang['Customize'] = 'Personelaat';
+$lang['Creation date'] = 'Deiziad krouiñ';
+$lang['Current password is wrong'] = 'Fazi gant ar ger-tremen a vremañ';
+$lang['Created on'] = 'Krouet d\'an';
+$lang['Create a new account'] = 'Krouiñ ur gont nevez';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Stanket eo an toupinoù pe n\'int ket skoret gant hoc\'h ergerzher. Ret eo deoc\'h aotren an toupinoù evit kevreañ.';
+$lang['Email: %s'] = 'Postel: %s';
+$lang['Email address is missing. Please specify an email address.'] = 'Mankout a ra ar chomlec\'h postel. Lakit ho postel mar-plij.';
+$lang['Each listed rule must be satisfied.'] = 'An holl dezverkoù a renk bezañ gwiriet';
+$lang['Edit'] = 'Aozañ';
+$lang['Edit a comment'] = 'Aozañ un evezhiadenn';
+$lang['Email address'] = 'Chomlec\'h postel';
+$lang['Email address is mandatory'] = 'Chomlec\'h postel a zo ret';
+$lang['EXIF Metadata'] = 'Metaroadennoù EXIF';
+$lang['Download this file'] = 'Pellgargañ ar restr-mañ';
+$lang['Download'] = 'Pellgargañ';
+$lang['Display'] = 'Diskwel';
+$lang['Dimensions'] = 'Mentoù';
+$lang['Password: %s'] = 'Ger-tremen: %s';
+$lang['Your password has been reset'] = 'Ho ger-tremen a zo bet adderaouekaet';
+$lang['Enter your new password below.'] = 'Lakait ho ger-tremen nevez amañ dindan.';
+$lang['Forgot your password?'] = 'Disoñjet ho ger-tremen ?';
+$lang['Password Reset'] = 'Adderaouekaat ar ger-tremen';
+$lang['Password forgotten'] = 'Ger-tremen disoñjet';
+$lang['Invalid password!'] = 'Ger-tremen direiz !';
+$lang['New password'] = 'Ger-tremen nevez';
+$lang['End-Date'] = 'Deizad an dibenn';
+$lang['Empty query. No criteria has been entered.'] = 'Reked goullo. Dezverk ebet a zo bet lakaet.';
+$lang['Search rules'] = 'Dezverk an enklask';
+$lang['Error sending email'] = 'Fazi en ur gas ar postel';
+$lang['this email address is already in use'] = 'En implij emañ ar postel-se dija';
+$lang['Please enter your username or email address.'] = 'Lakait ho anv implijer pe postel';
+$lang['Invalid username or email'] = 'Anv implijer pe postel direiz';
+$lang['Username or email'] = 'Anv implijer pe postel';
+$lang['Username: %s'] = 'Anv implijer: %s';
+$lang['Favorites'] = 'Pennrolloù';
+$lang['add this photo to your favorites'] = 'Lakaat al luc\'hskeudenn-mañ en ho pennrolloù';
+$lang['delete all photos from your favorites'] = 'Dilemel an holl luc\'hskeudennoù eus ho pennrolloù';
+$lang['delete this photo from your favorites'] = 'Dilemel al luc\'hskeudenn-mañ eus ho pennrolloù';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Prennet eo ar palier evit trezalc\'h. Deuit en-dro diwezhatoc\'h.';
+$lang['Go through the gallery as a visitor'] = 'Dedreuziñ ar palier evel un implijer';
+$lang['customize the appareance of the gallery'] = 'Personelaat neuz ar palier';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Demat %s, ho palier luc\'hskeudennoù Piwigo a zo goullo !';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Degemer mat war ho palier-luc\'hskeudennoù Piwigo !';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'Gwazh RSS a kemenn an darvoudoù ar palier : luc\'hskeudennoù nevez, rummadoù hizivaet, evezhiadennoù nevez an implijerien. Da vezañ implijet gant ul lenner-gwazhioù RSS.';
+$lang['Username "%s" on gallery %s'] = 'Implijer "%s" war palier %s';
+$lang['display recently updated albums'] = 'diskouez ar rummadoù krouet pe hizivaet nevez-zo';
+$lang['Search in sub-albums'] = 'Klask en iz-rummadoù';
+$lang['display this album'] = 'diskouez al luc\'hskeudennoù e pennelfenn ar rummad-mañ';
+$lang['in %d sub-album'] = 'e %d iz-rummad';
+$lang['in %d sub-albums'] = 'e %d iz-rummad';
+$lang['set as album representative'] = 'Dibab evel dileuriad ar rummad-mañ';
+$lang['Requested album does not exist'] = 'N\'ez eus ket ar rummad goulennet';
+$lang['in this album'] = 'er rummad-mañ';
+$lang['Search in albums'] = 'Klask er rummadoù';
+$lang['Permalink for album not found'] = 'N\'eo ket bet kavet peurliamm ar rummad ';
+$lang['Recent albums'] = 'Rummadoù a-nevez';
+$lang['Expand all albums'] = 'Displegañ an holl rummadoù';
+$lang['Please, enter a login'] = 'Lakait un anv implijer';
+$lang['Enter your personnal informations'] = 'Lakait ho titouroù personel';
+$lang['This author removed the comment with id %d'] = 'An oberour-mañ en deus dilemet an evezhiadenn gant an anavezer %d';
+$lang['author(s) : %s'] = 'oberour(ien) : %s';
+$lang['Here are your connection settings'] = 'Setu hoc\'h anavezerioù';
+$lang['Identification'] = 'Anaout';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Anavezer, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Anavezer, 9 &rarr; 1';
+$lang['Unknown feed identifier'] = 'Anavezer gwazh dianav';
+$lang['Unknown identifier'] = 'Anavezerioù dianav';
+$lang['Help'] = 'Skoazell';
+$lang['Hello'] = 'Demat';
+$lang['Hello %s,'] = 'Demat %s,';
+$lang['Forbidden'] = 'Berzet';
+$lang['First'] = 'Kentañ';
+$lang['Filter'] = 'Sil';
+$lang['Filter and display'] = 'Ober gant ar siloù ha diskouez';
+$lang['Show file metadata'] = 'Diskouez metaroadennoù ar restr';
+$lang['IPTC Metadata'] = 'Metaroadennoù IPTC';
+$lang['File name, A &rarr; Z'] = 'Anv ar restr, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'Anv ar restr, Z &rarr; A';
+$lang['File'] = 'Restr';
+$lang['File name'] = 'Anv ar restr';
+$lang['Filesize'] = 'Ment ar restr';
+$lang['Email'] = 'Postel';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Ma \'z eus bet ur fazi, ne grit netra ha netra a c\'hoarvezo.';
+$lang['User comments'] = 'Evezhiadennoù implijerien';
+$lang['comment date'] = 'deiziad an evezhiadenn';
+$lang['Show latest comments first'] = 'Diskouez an evezhiadennoù diwezhañ da gentañ';
+$lang['Show number of comments'] = 'Diskouez niver an evezhiadennoù';
+$lang['Show oldest comments first'] = 'Diskouez an evezhiadennoù kozhañ da gentañ';
+$lang['This author modified following comment:'] = 'An oberour-mañ en deus cheñchet an evezhiadenn-se :';
+$lang['Manage this user comment: %s'] = 'Merañ an evezhiadenn-mañ : %s';
+$lang['Keyword'] = 'Ger alc\'hwez ';
+$lang['Password'] = 'Ger-tremen';
+$lang['Menu'] = 'Lañser';
+$lang['Most visited'] = 'Muiañ-gwelet';
+$lang['New on %s'] = 'Nevez d\'an %s';
+$lang['Next'] = 'Da-heul';
+$lang['Logout'] = 'Digevreañ';
+$lang['Login'] = 'Kevreañ';
+$lang['Links'] = 'Liammoù';
+$lang['Last'] = 'Diwezhañ';
+$lang['Last Page'] = 'Pajenn diwezhañ';
+$lang['IP: %s'] = 'IP : %s';
+$lang['Language'] = 'Yezh';
+$lang['I want to add photos'] = 'C\'hoant am eus da lakaat luc\'hskeudennoù ouzhpenn';
+$lang['Home'] = 'Degemer';
+$lang['display all photos in all sub-albums'] = 'diskouez luc\'hskeudennoù ar rummadoù hag iz-rummadoù a-blad';
+$lang['Go back to the album'] = 'Distreiñ d\'ar rummad';
+$lang['First Page'] = 'Pajenn gentañ';
+$lang['Posted on'] = 'Ouzhpennet d\'an';
+$lang['photos posted during the last %d days'] = 'luc\'hskeudennoù ouzhpennet e-pad an %d devezh diwezhañ';
+$lang['posted after %s (%s)'] = 'ouzhpennet goude %s (%s)';
+$lang['posted before %s (%s)'] = 'ouzhpennet a-raok %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'ouzhpennet etre %s (%s) ha %s (%s)';
+$lang['posted on %s'] = 'ouzhpennet d\'an %s';
+$lang['Photos only RSS feed'] = 'Gwazh RSS gant al luc\'hskeudennoù hepken';
+$lang['RSS feed'] = 'Gwazh RSS';
+$lang['Photo sizes'] = 'Ment al luc\'hskeudennoù';
+$lang['Return to home page'] = 'Mont en-dro da bajenn-degemer';
+$lang['Number of photos per page'] = 'Niver a skeudennig e pep pajenn';
+$lang['Page generated in'] = 'Pajenn jedet e ';
+$lang['display a set of random photos'] = 'diskouez ur stroll dargouezhek a luc\'hskeudennoù';
+$lang['display only recently posted photos'] = 'diskouez luc\'hskeudennoù nevez hepken';
+$lang['display most visited photos'] = 'diskouez al luc\'hskeudennoù ar muiañ-gwelet';
+$lang['display most recent photos'] = 'diskouez al luc\'hskeudennoù nevezañ';
+$lang['Rate this photo'] = 'Reiñ un notenn d\'al luc\'hskeudenn-se';
+$lang['Recent photos'] = 'Luc\'hskeudennoù nevez';
+$lang['photo'] = 'luc\'hskeudenn';
+$lang['The number of photos per page must be a not null scalar'] = 'Niver al luc\'hskeudennoù a pep pajenn a rank bezañ un niver pegementiñ';
+$lang['display best rated photos'] = 'diskouez al luc\'hskeudennoù gant an notennoù uhelañ';
+$lang['Related tags'] = 'Merkerioù stag';
+$lang['Requested tag does not exist'] = 'N\'ez eus ket ar merker goulennet';
+$lang['Search tags'] = 'Klask merkerioù';
+$lang['Tag'] = 'Merker';
+$lang['Tags'] = 'Merkerioù';
+$lang['Page not found'] = 'N\'eo ket bet kavet ar bajenn';
+$lang['Rating score, high &rarr; low'] = 'Notenn, uhel &rarr; izel';
+$lang['Rating score, low &rarr; high'] = 'Notenn, izel &rarr; uhel';
+$lang['Previous'] = 'War-gil';
+$lang['Quick connect'] = 'Kevreadenn buan';
+$lang['Piwigo Help'] = 'Skoazell Piwigo';
+$lang['Manual sort order'] = 'Urzh dre zorn';
+$lang['Preferences'] = 'Dibaboù';
+$lang['Notification'] = 'Kemennoù RSS';
+$lang['Not repeat the slideshow'] = 'Harzañ adlenn an diaporama';
+$lang['Pause of slideshow'] = 'Ehanañ an diaporama';
+$lang['Play of slideshow'] = 'Lenn an diaporama';
+$lang['Post date'] = 'Deiziad-ouzhpennañ';
+$lang['Photo title, A &rarr; Z'] = 'Titl al luc\'hskeudenn, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = 'Titl al luc\'hskeudenn, Z &rarr; A';
+$lang['Original'] = 'Skouerenn orin';
+$lang['Original dimensions'] = 'Mentoù orin';
+$lang['Invalid key'] = 'Alc\'hwez direiz';
+$lang['Your website URL is invalid'] = 'Chomlec\'h hol lec\'hienn web a zo direiz';
+$lang['The passwords do not match'] = 'Ar gerioù-tremen n\'int ket mat';
+$lang['To reset your password, visit the following address:'] = 'Evit cheñch ho ger-tremen, kit d\'ar chomlec\'h-mañ :';
+$lang['User "%s" has no email address, password reset is not possible'] = 'N\'en deus ket an implijer "%s" a bostel, n\'eo ket posubl cheñch e ger-tremen';
+$lang['Password reset is not allowed for this user'] = 'N\'eo ket posubl cheñch ger-tremen an implijer-mañ';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Unan-bennak en deus goulennet cheñchamant ar ger-tremen evit an implijer :';
+$lang['Retrieve password'] = 'Adtapout ur ger-tremen';
+$lang['You will receive a link to create a new password via email.'] = 'Dre bostel, ul liamm a resevit da glikañ evit cheñch ho ger-tremen.';
+$lang['password updated'] = 'Ger-tremen hizivaet';
+$lang['useful when password forgotten'] = 'Talvoudus m\'ho peus ankounac\'haet ho ger-tremen';
+$lang['No'] = 'Ket';
+$lang['Powered by'] = 'Pajennoù graet gant';
+$lang['Profile'] = 'Profil';
+$lang['Rank'] = 'Renk';
+$lang['Rating score'] = 'Skor';
+$lang['Reset'] = 'Nullañ';
+$lang['Search'] = 'Klask';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'N\'eo ket bet enrollet hoc\'h evezhiadenn peogwir ne pleg ket d\'ar reolennoù kadarnaat';
+$lang['display last user comments'] = 'Gwelet evezhiadennoù diwezhañ an implijerien';
+$lang['Register'] = 'Enrollañ';
+$lang['Registration'] = 'Enrollañ';
+$lang['Registration of %s'] = 'Enrolladenn %s';
+$lang['Your comment has been registered'] = 'Enrollet eo bet hoc\'h evezhiadenn';
+$lang['Mobile'] = 'Hezoug';
+$lang['User: %s'] = 'Implijer: %s';
+$lang['Username'] = 'Anv implijer';
+$lang['Username modification'] = 'Cheñch anv an implijer';
+$lang['this login is already used'] = 'En implij emañ an anv-implijer-mañ dija';
+$lang['N/A'] = 'dizimplijadus';
+$lang['Sent by'] = 'Kaset gant';
+$lang['Submit'] = 'Gwiriekaat';
+$lang['Send my connection settings by email'] = 'Bezañ kelaouet gant ma anavezerioù dre bostel';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Enrollet mat out, kelaouet e voc\'h gant hoc\'h anavezerioù dre bostel. Degemer mat !';
+$lang['Thank you for registering at %s!'] = 'Trugarez evit bezañ enrollet war %s !';
+$lang['Tag results for'] = 'Disoc\'h ar merkerioù evit';
+$lang['display available tags'] = 'Gwelet ar merkerioù hegerz';
+$lang['display photos linked to this tag'] = 'Gwelet luc\'hskeudennoù liammet gant ar merker-mañ hepken';
+$lang['remove this tag from the list'] = 'Lemel ar merker-mañ diouzh al listenn';
+$lang['show tag cloud'] = 'Diskouez koumoulenn ar merkerioù';
+$lang['Recent period must be a positive integer value'] = 'Ar prantad diwezhañ a rank bezañ un niver pegementiñ muiel';
+$lang['Recent period'] = 'Prantad diwezhañ';
+$lang['Sort by'] = 'Rummañ dre';
+$lang['Sort order'] = 'Urzh rummañ';
+$lang['Kind of date'] = 'Seurt deiziad';
+$lang['display a calendar by creation date'] = 'diskouez un deiziadur dre deiziad krouiñ';
+$lang['display a calendar by posted date'] = 'diskouez un deiziadur dre deiziad ouzhpennañ';
+$lang['wrong date'] = 'deiziad fall';
+$lang['Quick search'] = 'Klask buan';
+$lang['Search by date'] = 'Klask dre deiziad';
+$lang['Search for words'] = 'Klask gerioù';
+$lang['Search results'] = 'Disoc\'hoù an enklask';
+$lang['search'] = 'enklask';
+$lang['Search for Author'] = 'Klask un oberour';
+$lang['Search for all terms'] = 'Klask an holl ger';
+$lang['Search for any term'] = 'Klask ur ger';
+$lang['Thumbnails'] = 'Skeudennoùigoù';
+$lang['thumb'] = 'Skeudennig';
+$lang['today'] = 'hiziv';
+$lang['Update your rating'] = 'Hizivaat ho notenn';
+$lang['no rate'] = 'Notenn ebet';
+$lang['Visits'] = 'Gweladennoù';
+$lang['Welcome'] = 'Degemer mat';
+$lang['Yes'] = 'Ya';
+$lang['This login is already used by another user'] = 'En implij emañ an anv-implijer-mañ dija';
+$lang['login mustn\'t end with a space character'] = 'Arabat eo echuiñ an anv implijer gant un arouezenn esaouiñ';
+$lang['login mustn\'t start with a space character'] = 'Arabat eo kregiñ an anv implijer gant un arouezenn esaouiñ';
+$lang['the username must be given'] = 'Ret eo lakaat an anv implijer';
+$lang['Username is mandatory'] = 'Anv implijer ret';
+$lang['Your username has been successfully changed to : %s'] = 'Hoc\'h anv implijer a zo bet cheñchet evit : %s';
+$lang['Since'] = 'Abaoe';
+$lang['Specials'] = 'Dibar';
+$lang['View'] = 'Gwellet';
+$lang['View in'] = 'Diskouez';
+$lang['Visits, high &rarr; low'] = 'Niver a gweladenn, bras &rarr; bihan';
+$lang['Visits, low &rarr; high'] = 'Niver a gweladenn, bihan &rarr; bras';
+$lang['Show number of hits'] = 'Diskouez niver a taolioù lagad';
+$lang['SQL queries in'] = 'rekedoù SQL e';
+$lang['Reset to default values'] = 'Adlakaat talvoudoù dre ziouer.';
+$lang['Reduce diaporama speed'] = 'Gorrekaat an diaporama';
+$lang['Repeat the slideshow'] = 'Adlenn an diaporama';
+$lang['slideshow'] = 'diaporama';
+$lang['stop the slideshow'] = 'Paouez an diaporama';
+$lang['Redirection...'] = 'O sturiañ d\'ul lec\'h all…';
+$lang['Random photos'] = 'Luc\'hskeudennoù dre zegouezh';
+$lang['Piwigo encountered a non recoverable error'] = 'Ur fazi diremed a zo c\'hoarvezet gant Piwigo';
+$lang['Photos posted within the last %d day.'] = 'Diskouez al luc\'hskeudennoù nevezoc\'h eget %d deizad';
+$lang['Photos posted within the last %d days.'] = 'Diskouez al luc\'hskeudennoù nevezoc\'h eget %d deizad';
+$lang['Number of items'] = 'Niver a elfennoù';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Ma soñjit ho peus resevet ar postel-mañ dre fazi, deuit e darempred ganeomp dre ';
+$lang['cloud'] = 'koumoulenn';
+$lang['created after %s (%s)'] = 'Krouet goude an %s (%s)';
+$lang['created before %s (%s)'] = 'Krouet a-raok an %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'Krouet etre an %s (%s) hag an %s (%s)';
+$lang['created on %s'] = 'Krouet d\'an %s';
+$lang['representative'] = 'Dileuriad ar rummad';
+$lang['available for administrators only'] = 'Hegerz evit merourien hepken';
+$lang['display your favorites photos'] = 'Diskouez luc\'hskeudennoù eus ho pennrolloù';
+$lang['Your favorites'] = 'Ho pennrolloù';
+$lang['chronology_weekly_list'] = 'Listenn ur Sizhunvezh';
+$lang['chronology_monthly_list'] = 'Listenn ur mizvezh';
+$lang['all'] = 'pep tra';
+$lang['Your Gallery Customization'] = 'Personeladur ho palier';
+$lang['chronology_monthly_calendar'] = 'Deiziadur ar mizvezh';
+$lang['You are not authorized to access the requested page'] = 'Difennet eo deoc\'h mont d\'ar bajenn-mañ';
+$lang['Week %d'] = 'Sizhun %d';
+$lang['Website'] = 'Lec\'hienn web';
+$lang['Webmaster'] = 'Mestr-gwiad';
+$lang['return to the display of all photos'] = 'distreiñ d\'ar gwel an holl luc\'hskeudenn';
+$lang['return to normal view mode'] = 'distreiñ d\'ar gwel reizh';
+$lang['last %d days'] = 'an %s dewezhioù diwezhañ';
+$lang['letters'] = 'lizherennoù';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'Ret eo ar chomlec\'h bostel bezhañ e stumm xxx@yyy.eee (da skouer jakez@altern.org)';
+$lang['mandatory'] = 'ret';
+$lang['obligatory'] = 'ret';
+$lang['searched words : %s'] = 'gerioù klasket : %s';
+$lang['square'] = 'Karrez';
+$lang['the beginning'] = 'penn-kentañ';
+$lang['included'] = 'e-barzh';
+$lang['large'] = 'L - bras';
+$lang['medium'] = 'M - krenn';
+$lang['small'] = 'S - bihan';
+$lang['xlarge'] = 'XL - bras-kenañ';
+$lang['xsmall'] = 'XS - bihan-kenañ';
+$lang['xxlarge'] = 'XXL - ramzeg';
+$lang['html tags are not allowed in login'] = 'Difennet eo lakaat balizennoù HTML en anv implijer';
+$lang['guest'] = 'implijer';
+$lang['ascending'] = 'war gresk';
+$lang['descending'] = 'war zigresk';
+$lang['display each day with photos, month per month'] = 'Diskouez dre vloaz, dre viz, dre zeiz';
+$lang['edit'] = 'aozañ';
+$lang['excluded'] = 'dispelled';
+$lang['from %s to %s'] = 'eus an %s betek an %s';
+$lang['group by letters'] = 'strollañ dre lizherenn';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'N\'ho peus ket kadarnaet ar ger-tremen. Kadarnait ar ger-tremen ho peus skrivet.';
+$lang['Password is missing. Please enter the password.'] = 'Mankout a ra ar ger-tremen. Skrivit ar ger-tremen.';
+$lang['%d photos per page'] = '%d luc\'hskeudenn e pep pajenn';
+$lang['Theme'] = 'Tem';
+?> \ No newline at end of file
diff --git a/language/br_FR/install.lang.php b/language/br_FR/install.lang.php
new file mode 100755
index 000000000..81eac2c06
--- /dev/null
+++ b/language/br_FR/install.lang.php
@@ -0,0 +1,67 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Posubl eo deoc\'h cheñch ho-unan kefluniadur PHP, ha adloc\'hañ Piwigo da c\'houde.';
+$lang['Download the config file'] = 'Pellgargañ ar restr gefluniañ';
+$lang['Try to configure PHP 5'] = 'Esaeit kefluniañ PHP 5';
+$lang['Basic configuration'] = 'Kefluniadur diazez';
+$lang['Database configuration'] = 'Kefluniadur an diaz roadennoù';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Un diskoulm all a zo eilañ an destenn eus boest a-us ha pegañ anezhañ da restr "local/config/database.inc.php" (Diwallit: ret eo lakaat e-barzh database.inc.php ar pezh a zo er framm-testenn, distro d\'al linenn ebet, hag arouezenn esaouiñ ebet)';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'An anavezer-mañ a vo gwellet gant an implijerien. Ret eo evit merañ al lec\'hienn.';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'Ret eo dezhañ chom kuzhut, gantañ e vez digoret skramm ar mererezh.';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'An implijerien a c\'hello dont e darempred gant merour al lec\'hienn gant ar bostel-mañ';
+$lang['Admin configuration'] = 'Kefluniadur ar mererezh';
+$lang['User'] = 'Implijer';
+$lang['please enter your password again'] = 'Lakait ho ger-tremen adarre';
+$lang['user password given by your host provider'] = 'ger-tremen roet gant ho pourvezer ostiz';
+$lang['Password ']['confirm'] = 'Ger-tremen [evit kadarnaat]';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo n\'eo ket deuet a-benn da gefluniañ PHP 5.';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo a c\'hell cheñch ho kefluniadur da PHP 5 en ur grouiñ pe kemmañ ur restr .htaccess.';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'C\'hwitet eo krouadur ar restr gefluniañ local/config/database.inc.php.';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Posubl eo deoc\'h pellgargañ ar restr gefluniañ, hag ezkargañ anezhañ da kavlec\'h local/config ho staliadur.';
+$lang['Congratulations, Piwigo installation is completed'] = 'Gourc\'hemennoù, echu eo staliadur Piwigo';
+$lang['Installation'] = 'Staliadur';
+$lang['Start Install'] = 'Kregiñ gant ar staliadur';
+$lang['Welcome to your new installation of Piwigo!'] = 'Degemer mat en ho staliadur nevez Piwigo !';
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Goulennit da skor ho pourvezer ostiz penaos e c\'hellit implij PHP 5.';
+$lang['It appears your webhost is currently running PHP %s.'] = 'PHP %s a zo o labourat war hoc\'h ostiz.';
+$lang['localhost or other, supplied by your host provider'] = 'localhost pe anv all, roet gant ho pourvezer ostiz';
+$lang['also given by your host provider'] = 'roet gant ho pourvezer ostiz ivez';
+$lang['user login given by your host provider'] = 'anv-implijer roet gant ho pourvezer ostiz';
+$lang['Host'] = 'Ostiz';
+$lang['Can\'t connect to server'] = 'Ne oa ket posubl kevreañ ouzh ar servijer';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Sikour ho peus ezhom? Savit ho goulennoù war <a href="%s">Forom Piwigo</a>.';
+$lang['verification'] = 'gwiriadur';
+$lang['Sorry!'] = 'Digarezit !';
+$lang['PHP 5 is required'] = 'Ret eo kaout PHP 5';
+$lang['Just another Piwigo gallery'] = 'Ur palier-luc\'hskeudennoù Piwigo all';
+$lang['Hope to see you back soon.'] = 'Ken ar wech all !';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Lennit hor foromoù evit kaout sikour: %s';
+$lang['enter a login for webmaster'] = 'Lakait anv implijer ar mestr-gwiad';
+$lang['webmaster login can\'t contain characters \' or "'] = 'Arabat eo lakaat lizherennoù \' pe " e-barzh anv implijer ar mestr-gwiad';
+$lang['Default gallery language'] = 'Yezh dre ziouer ar palier';
+$lang['Welcome to my photo gallery'] = 'Degemer mat war ma palier-luc\'hskeudennoù';
+$lang['Database table prefix'] = 'Rakger taolennoù an diaz roadennoù';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'Ar rakger-mañ a vo ouzhpennet da anvioù taolennoù an diaz roadennoù (Gwelloc\'h e vo mererezh ho taolennoù)';
+$lang['Database name'] = 'Anv an diaz roadennoù';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Kevreet mat ouzh ar servijer omp, met ne oa ket posubl kevreañ ouzh an diaz roadennoù.';
+?> \ No newline at end of file
diff --git a/language/br_FR/iso.txt b/language/br_FR/iso.txt
new file mode 100644
index 000000000..1e4b66d4a
--- /dev/null
+++ b/language/br_FR/iso.txt
@@ -0,0 +1 @@
+Brezhoneg [FR] \ No newline at end of file
diff --git a/language/br_FR/upgrade.lang.php b/language/br_FR/upgrade.lang.php
new file mode 100755
index 000000000..6d32e7864
--- /dev/null
+++ b/language/br_FR/upgrade.lang.php
@@ -0,0 +1,40 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Ar bajenn-mañ a ginnig hizivadur an diaz roadennoù eus ho stumm Piwigo kozh d\'ar stumm nevez. An ameiler hizivaat a soñj emañ <strong>stumm %s</strong> o labourat (pe gevatal).';
+$lang['User permissions and group permissions have been erased'] = 'Implijerien ha strolladoù a zo bet dilemet';
+$lang['You do not have access rights to run upgrade'] = 'Difennet eo deoc\'h hizivaat';
+$lang['Statistics'] = 'Stadegoù';
+$lang['total upgrade time'] = 'Hollad amzer an hizivadur';
+$lang['Upgrade'] = 'Hizivadur';
+$lang['Upgrade from version %s to %s'] = 'Hizivaat eus stumm %s betek %s';
+$lang['Upgrade informations'] = 'Titouroù hizivadur';
+$lang['total SQL time'] = 'Hollad an amzer SQL ';
+$lang['SQL queries'] = 'Rekedoù SQL';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'Ret eo bezañ merour evit hizivaat: kevreit amañ dindan mar plij.';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Gwiriit an trezalc\'h e [Mererezh>Ostilhoù>Trezalc\'h] m\'ho peus kudennoù.';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Nemet rakger ar skeudennoùigoù ha postel ar mestr-gwiad a zo bet saveteet eus ar c\'hefluniadur kozh';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'E <i>%s</i>, a-raok <b>?></b>, lakaat:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Evit diwall, an tenoù-se a zo bet diweredekaet. Ret e vo deoc\'h sellout ma\'z eus temoù da hizivaat a-raok gweredekaat anezho en-dro.';
+$lang['All sub-albums of private albums become private'] = 'An holl iz-rummadoù e-barzh rummadoù prevez a vo prevez';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'Evit diwall, al lugantoù-se a zo bet diweredekaet. Ret e vo deoc\'h sellout ma\'z eus lugantoù da hizivaat a-raok gweredekaat anezho en-dro.';
+?> \ No newline at end of file
diff --git a/language/ca_ES/admin.lang.php b/language/ca_ES/admin.lang.php
index 0afaf7a49..7c9c95d92 100644
--- a/language/ca_ES/admin.lang.php
+++ b/language/ca_ES/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -177,7 +177,6 @@ $lang['Information data registered in database'] = 'S\'ha registrat la informaci
$lang['Default display'] = 'Visualització predeterminada';
$lang['History'] = 'Historial';
$lang['The gallery URL is not valid.'] = 'La URL de la galeria no es vàlida.';
-$lang['Main'] = 'Principal';
$lang['The number of comments a page must be between 5 and 50 included.'] = 'El nombre de comentaris d\'una pàgina ha d\'estar entre 5 i 50 inclosos.';
$lang['Configuration'] = 'Configuració';
$lang['confirm'] = 'confirma';
@@ -201,14 +200,13 @@ $lang['leave'] = 'Deixa';
$lang['Lock'] = 'Bloquejos';
$lang['Locked'] = 'Bloquejat';
$lang['manage album photos'] = 'Gestiona les fotos de l\'àlbum';
-$lang['manage sub-albums'] = 'Gestiona els sub-àlbums';
+$lang['manage sub-albums'] = 'gestiona els sub-àlbums';
$lang['Manage'] = 'Gestiona';
$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'El temps d\'execució s\'ha acabat. El tractament ha de continuar [Temps estimat: %d segons].';
$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'El temps d\'execució s\'ha excedit. El processament ha de continuar [Temps estimat: %d segons].';
$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'El temps requerit per a processar la llista d\'usuaris a enviar-los correus és limitat. No s\'han pogut processar tots els usuaris.';
$lang['Time to send mail is limited. Others mails are skipped.'] = 'El temps d\'enviament del correu és limitat. No tots els missatges han pogut ser enviats. S\'han omès missatges de correu electrònic.';
$lang['To send ?'] = 'Enviar-ho?';
-$lang['email'] = 'Correu electrònic';
$lang['User'] = 'Usuari';
$lang['Complementary mail content'] = 'Contingut complementari del correu electrònic';
$lang['See you soon,'] = 'Fins aviat,';
@@ -550,7 +548,7 @@ $lang['+ Add an upload box'] = '<i>Afegir</i>';
$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Crea el directori "%s" a l\'arrel de la instal·lació Piwigo';
$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Cal concedir permisos d\'escriptura (chmod 777) al directori "%s" a l\'arrel de la instal·lació de Piwigo';
$lang['existing album'] = 'àlbum existent';
-$lang['create a new album'] = 'Afegeix un nou àlbum';
+$lang['create a new album'] = 'creeu un nou àlbum';
$lang['Album name'] = 'Nom de l\'àlbum';
$lang['Album "%s" has been added'] = 'S\'ha afegit l\'àlbum "%s"';
$lang['Uploaded Photos'] = 'Fotos penjades';
@@ -560,9 +558,9 @@ $lang['Album "%s" now contains %d photos'] = 'En aquests moments l\'àlbum "%s"
$lang['Manage this set of %d photos'] = 'Administra aquest conjunt de %d fotos';
$lang['Select files'] = 'Seleccioneu els arxius';
$lang['Everybody'] = 'Tothom';
-$lang['Who can see these photos?'] = 'Qui pot veure aquestes fotos?';
+$lang['Who can see these photos?'] = 'Qui podrà veure aquestes fotos?';
$lang['Settings'] = 'Configuració';
-$lang['Resize'] = 'Redimensiona';
+$lang['Resize'] = 'Redimensionar';
$lang['Maximum width'] = 'Amplada màxima';
$lang['pixels'] = 'píxels';
$lang['Maximum height'] = 'Altura máxima';
@@ -658,7 +656,7 @@ $lang['automatic order'] = 'Ordre automàtic';
$lang['manual order'] = 'ordre manual';
$lang['Albums automatically sorted'] = 'Àlbums ordenats automàticament';
$lang['Batch Manager'] = 'Gestor per lots';
-$lang['include child albums'] = 'Incloure els sub-àlbums';
+$lang['include child albums'] = 'incloure els sub-àlbums';
$lang['Selection'] = 'Selecció';
$lang['Action'] = 'Acció';
$lang['Set author'] = 'Estableix autor';
@@ -810,7 +808,7 @@ $lang['Photo name'] = 'Nom de la foto';
$lang['Piwigo for Android'] = 'Piwigo per Android';
$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo per iOS (iPhone, iPad, iPod Touch)';
$lang['Predefined filter'] = 'Filtre predeterminat';
-$lang['Resize after upload'] = 'Redimensiona després de penjar la foto al servidor';
+$lang['Resize after upload'] = 'Redimensionar després de penjar la foto al servidor';
$lang['Save manual order'] = 'Desa l\'ordre manual';
$lang['Save visits in history for'] = 'Desa les visites a l\'historial pels';
$lang['Select a file'] = 'Seleccioneu un arxiu';
@@ -888,7 +886,7 @@ $lang['Web Form'] = 'Formulari web';
$lang['X Position'] = 'Posició X';
$lang['X Repeat'] = 'Repeteix X';
$lang['Y Position'] = 'Posició Y';
-$lang['any visitor can see this album'] = 'cap visitant pot veure aquest àlbum';
+$lang['any visitor can see this album'] = 'qualsevol visitant pot veure aquest àlbum';
$lang['associate to group'] = 'Associa-ho al grup';
$lang['bottom left corner'] = 'Costat inferior esquerre';
$lang['bottom right corner'] = 'Costat inferior dret';
@@ -901,7 +899,7 @@ $lang['middle'] = 'al centre';
$lang['simple visitors'] = 'visitants únics';
$lang['top left corner'] = 'costat superior esquerre';
$lang['top right corner'] = 'costat superior dret';
-$lang['visitors need to login and have the appropriate permissions to see this album'] = 'Els visitants han d\'autenticar-se i disposar dels permisos adequats per veure aquest àlbum';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'els visitants han d\'autenticar-se i disposar dels permisos adequats per veure aquest àlbum';
$lang['Last send'] = 'Últim enviament';
$lang['group "%s" added'] = 'S\'ha afegit el grup "%s"';
$lang['group "%s" deleted'] = 'S\'ha eliminat el grup "%s"';
@@ -936,8 +934,6 @@ $lang['Duplicate selected tags'] = 'Duplica les etiquetes seleccionades';
$lang['Name of the duplicate'] = 'Nom del duplicat';
$lang['Source tag'] = 'Etiqueta font';
$lang['Tag "%s" is now a duplicate of "%s"'] = 'L\'etiqueta "%s" és ara un duplicat de "%s"';
-$lang['Format'] = 'Format';
-$lang['Invalid dimension'] = 'Dimensió no vàlida';
$lang['Landscape'] = 'Paisatge';
$lang['Manage photos'] = 'Administra les fotos';
$lang['Minimum height'] = 'Alçada mínima';
@@ -946,8 +942,6 @@ $lang['Panorama'] = 'Panorama';
$lang['Portrait'] = 'Retrat';
$lang['View in gallery'] = 'Veure en la galeria';
$lang['Number of albums per page'] = 'Nombre d\'àlbums per pàgina';
-$lang['Maximum'] = 'Màxim';
-$lang['Minimum'] = 'Mínim';
$lang['Ratio'] = 'Ràtio';
$lang['between %.2f and %.2f'] = 'entre %.2f i %.2f';
$lang['between %d and %d pixels'] = 'entre %d i %d píxels';
@@ -962,4 +956,32 @@ $lang['This group will be unset to default'] = 'Aquest grup deixarà de ser el p
$lang['Type here the name of the new group'] = 'Escriviu aquí el nom del nou grup';
$lang['Manage the members'] = 'Gestiona els membres';
$lang['Purge user cache'] = 'Elimina la memòria cau de l\'usuari';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'Es reduiran les mides de les fotos a %dx%d píxels.';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'Redimensionar després de penjar la foto al servidor deshabilitat degut a l\'ús de la llibreria gràfica GD';
+$lang['Select at least one tag'] = 'Seleccioneu almenys una etiqueta';
+$lang['Last visit on %s, %s.'] = 'L\'última visita el %s, %s.';
+$lang['No user selected, no action possible.'] = 'No hi ha usuaris seleccionats, l\'acció no ha estat possible';
+$lang['Registered on %s, %s.'] = 'Registrat el %s, %s';
+$lang['Show %s users'] = 'Mostra %s usuaris';
+$lang['Users modified'] = 'Usuaris que s\'han modificat';
+$lang['Basic settings'] = 'Configuració bàsica';
+$lang['Change password'] = 'Canvia la contrasenya';
+$lang['Change username'] = 'Canvia el nom d\'usuari';
+$lang['General'] = 'General';
+$lang['Loading...'] = 'S\'està carregant...';
+$lang['Mail theme'] = 'Tema del correu electrònic';
+$lang['Password updated'] = 'La contrasenya s\'ha actualitzat';
+$lang['Update user'] = 'Actualitza l\'usuari';
+$lang['User %s added'] = 'S\'ha afegit l\'usuari %s';
+$lang['User %s updated'] = 'S\'ha actualitzat l\'usuari %s';
+$lang['close'] = 'tancar';
+$lang['%d of %d users selected'] = '%d de %d usuaris seleccionats';
+$lang['(filtered from %s total users)'] = '(filtrat d\'un total de %s usuaris)';
+$lang['All %d users are selected'] = 'Tots els %d usuaris estan seleccionats';
+$lang['Close user details'] = 'Tanca detals de l\'usuari';
+$lang['No matching user found'] = 'No s\'ha trobat cap usuari coincident';
+$lang['No user selected of %d users'] = 'Cap usuari seleccionat de %d usuaris';
+$lang['Open user details'] = 'Obre detalls de l\'usuari';
+$lang['Showing %s to %s of %s users'] = 'Mostrant %s de %s de %s usuaris';
+$lang['on the %d selected users'] = 'sobre els %d usuaris seleccionats';
?> \ No newline at end of file
diff --git a/language/ca_ES/common.lang.php b/language/ca_ES/common.lang.php
index cd05e7efb..578fb762d 100644
--- a/language/ca_ES/common.lang.php
+++ b/language/ca_ES/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Català [CA]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=413
Author: Piwigo team
Author URI: http://piwigo.org
@@ -58,7 +58,7 @@ $lang['Albums'] = 'Àlbums';
$lang['Album'] = 'Àlbum';
$lang['Close this window'] = 'Tanca aquesta finestra';
$lang['Complete RSS feed (photos, comments)'] = 'Canal RSS complet (fotos, comentaris...)';
-$lang['Confirm Password'] = 'Confirmeu la contrasenya';
+$lang['Confirm Password'] = 'Confirmeu la nova contrasenya';
$lang['Connection settings'] = 'Paràmetres de connexió';
$lang['Login'] = 'Identificar-se';
$lang['Contact webmaster'] = 'Contacteu amb l\'administrador del web';
@@ -117,7 +117,7 @@ $lang['Username'] = 'Usuari';
$lang['Visits'] = 'Visites';
$lang['Webmaster'] = 'webmaster';
$lang['Week %d'] = 'Setmana %d';
-$lang['About Piwigo'] = 'Quant a Piwigo';
+$lang['About Piwigo'] = 'Quant al Piwigo';
$lang['You are not authorized to access the requested page'] = 'No esteu autoritzats a accedir en aquesta pàgina';
$lang['add this photo to your favorites'] = 'afegir a preferits';
$lang['Administration'] = 'Administració';
@@ -208,8 +208,8 @@ $lang['month'][8] = 'Agost';
$lang['month'][9] = 'Setembre';
$lang['Most visited'] = 'Més visitades';
$lang['display most visited photos'] = 'visualitza les fotos més visitades';
-$lang['The number of photos per page must be a not null scalar'] = 'El nombre de fotos per pàgina ha de ser un número enter diferent de zero';
-$lang['Number of photos per page'] = 'Nombre de fotos per pàgina';
+$lang['The number of photos per page must be a not null scalar'] = 'El nombre de fotos per pàgina ha de ser una xifra entera diferent de zero';
+$lang['Number of photos per page'] = 'Número de fotos per pàgina';
$lang['Unknown identifier'] = 'Identificador desconegut';
$lang['New password'] = 'Nova contrasenya';
$lang['Rate this photo'] = 'Valoreu aquesta foto';
@@ -240,7 +240,6 @@ $lang['login mustn\'t end with a space character'] = 'el nom d\'usuari no pot ac
$lang['login mustn\'t start with a space character'] = 'el nom d\'usuari no pot començar amb el caràcter \'espai\'';
$lang['this login is already used'] = 'aquest nom d\'usuari ja s\'està utilitzant';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'L\'adreça de correu ha de ser com xxx@yyy.eee (exemple: jack@altern.org)';
-$lang['please enter your password again'] = 'si us plau, introdueixi la seva contrasenya una altra vegada';
$lang['Auto login'] = 'Recordar';
$lang['remove this tag from the list'] = 'elimineu aquesta etiqueta de la llista';
$lang['representative'] = 'miniatura de l\'àlbum';
@@ -259,14 +258,13 @@ $lang['Contact'] = 'Contacta amb el';
$lang['set as album representative'] = 'estableix com a icona de l\'àlbum';
$lang['Show number of comments'] = 'Mostra el nombre de comentaris';
$lang['Show number of hits'] = 'Mostra el nombre de visualitzacions';
-$lang['slideshow'] = 'presentació de diapositives';
+$lang['slideshow'] = 'Presentació de diapositives';
$lang['stop the slideshow'] = 'aturar la presentació';
$lang['Specials'] = 'Especials';
$lang['SQL queries in'] = 'consultes SQL en';
$lang['display only recently posted photos'] = 'visualitza només les fotos publicades recentment';
$lang['return to the display of all photos'] = 'torna a la visualització de totes les fotos';
$lang['the beginning'] = 'principi';
-$lang['Interface theme'] = 'Tema predeterminat';
$lang['Thumbnails'] = 'Miniatures';
$lang['Menu'] = 'Menú';
$lang['A comment on your site'] = 'Un comentari sobre el vostre lloc web';
@@ -412,4 +410,12 @@ $lang['Username is mandatory'] = 'El nom d\'usuari és obligatori';
$lang['mandatory'] = 'obligatori';
$lang['Website'] = 'lloc web';
$lang['Your website URL is invalid'] = 'La URL del vostre lloc web és invàlida';
+$lang['Email'] = 'Correu elecrònic';
+$lang['First Page'] = 'Primera pàgina';
+$lang['Go back to the album'] = 'Tornar a l\'àlbum';
+$lang['Last Page'] = 'Última pàgina';
+$lang['Password is missing. Please enter the password.'] = 'Falta la clau d\'accès. Si us plau, introdueix-la.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Falta confirmar la contrasenya. Si us plau, confirmeu la contrasenya escollida.';
+$lang['%d photos per page'] = '%d fotos per pàgina';
+$lang['Theme'] = 'Tema';
?> \ No newline at end of file
diff --git a/language/ca_ES/help/search.html b/language/ca_ES/help/search.html
index 9af72d685..eb6a526f7 100755
--- a/language/ca_ES/help/search.html
+++ b/language/ca_ES/help/search.html
@@ -1,23 +1,23 @@
-<h2>Cerques</h2>
-
-<p>Cerca d'imatges a trav&eacute;s del conjunt de la galer&iacute;a.</p>
-
-<dl>
-
- <dt>Cerca per paraules</dt>
-
- <dd>Cercar una o diverses paraules entre els atributs relacionats amb les imatges de la galeria. Utilitza * com a comod&iacute; per a coincid&egrave;ncies parcials.</dd>
-
- <dt>Cerca per autor</dt>
-
- <dd>Utilitza * com a comod&iacute; per a coincid&egrave;ncies parcials.</dd>
-
- <dt>Cerca per data</dt>
-
- <dd>Seleccioneu una data d'inici i/o una data de finalitzaci&oacute; per a realitzar la consulta. Deixar el camp de data buit, per a fer una consulta "abans". L'any en l'&uacute;ltim camp s'ha d'introduir amb format de quatre xifres (per exemple, 2012).</dd>
-
- <dt>Cercar en els &agrave;lbums</dt>
-
- <dd>Seleccionar l'&agrave;lbum o els &agrave;lbums a cercar. Tots els sub-&agrave;lbums poden ser cercats seleccionant l'&agrave;lbum pare.</dd>
-
-</dl>
+<h2>Cerques</h2>
+
+<p>Cerca d'imatges a trav&eacute;s del conjunt de la galer&iacute;a.</p>
+
+<dl>
+
+ <dt>Cerca per paraules</dt>
+
+ <dd>Cercar una o diverses paraules entre els atributs relacionats amb les imatges de la galeria. Utilitza * com a comod&iacute; per a coincid&egrave;ncies parcials.</dd>
+
+ <dt>Cerca per autor</dt>
+
+ <dd>Utilitza * com a comod&iacute; per a coincid&egrave;ncies parcials.</dd>
+
+ <dt>Cerca per data</dt>
+
+ <dd>Seleccioneu una data d'inici i/o una data de finalitzaci&oacute; per a realitzar la consulta. Deixar el camp de data buit, per a fer una consulta "abans". L'any en l'&uacute;ltim camp s'ha d'introduir amb format de quatre xifres (per exemple, 2012).</dd>
+
+ <dt>Cerca en els &agrave;lbums</dt>
+
+ <dd>Seleccionar l'&agrave;lbum o els &agrave;lbums a cercar. Tots els sub-&agrave;lbums poden ser cercats seleccionant l'&agrave;lbum pare.</dd>
+
+</dl>
diff --git a/language/ca_ES/install.lang.php b/language/ca_ES/install.lang.php
index 626153310..a541fd4dc 100644
--- a/language/ca_ES/install.lang.php
+++ b/language/ca_ES/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,24 +21,18 @@
// | USA. |
// +-----------------------------------------------------------------------+
-
-
$lang['Installation'] = "Instal·lació";
$lang['Basic configuration'] = "Configuració bàsica";
$lang['Default gallery language'] = "Idioma predeterminat de la galeria";
$lang['Database configuration'] = "Configuració de la base de dades";
$lang['Admin configuration'] = "Configuració de l'administrador";
$lang['Start Install'] = "Inicia la instal·lació";
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = "l'adreça de correu electrònic ha de ser com xxx@yyy.eee (exemple : jack@altern.org)";
-$lang['Webmaster login'] = "Nom de l'usuari administrador";
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Això es mostrarà als visitants. És necessari pel web d\'administració';
$lang['Connection to server succeed, but it was impossible to connect to database'] = 'La connexió amb el servidor s\'ha establert correctament però no és possible connectar amb la base de dades.';
$lang['Can\'t connect to server'] = "No es pot connectar amb el servidor";
$lang['Host'] = 'Allotjament';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = "localhost, sql.multimania.com, toto.freesurf.fr";
$lang['User'] = "Usuari";
$lang['user login given by your host provider'] = 'nom d\'usuari facilitat pel teu proveïdor d\'allotjament';
-$lang['Password'] = 'Clau d\'accès';
$lang['user password given by your host provider'] = 'clau d\'accès de l\'usuari facilitada pel teu proveïdor d\'allotjament';
$lang['Database name'] = "Nom de la base de dades";
$lang['also given by your host provider'] = 'també el dóna el teu proveïdor d\'allotjament';
@@ -47,12 +41,10 @@ $lang['database tables names will be prefixed with it (enables you to manage bet
$lang['enter a login for webmaster'] = "Introdueix un nom d'usuari per l'administrador de la web";
$lang['webmaster login can\'t contain characters \' or "'] = "El nom d'usuari de l'administrador de la web no pot contenir caràcters \' o \"";
$lang['please enter your password again'] = "si us plau introduïu una altra vegada la vostra contrasenya";
-$lang['Webmaster password'] = "Contrasenya de l'administrador de la web";
$lang['Keep it confidential, it enables you to access administration panel'] = 'Manté la confidencialitat, permet accedir al panell d\'administració';
$lang['Password [confirm]'] = "Contrasenya [confirmeu]";
$lang['verification'] = "verificació";
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = "Necessiteu ajuda? Feu la vostra pregunta a <a href=\"%s\">Piwigo message board</a>.";
-$lang['Webmaster mail address'] = "Adreça de correu electrònic de l'administrador del web";
$lang['Visitors will be able to contact site administrator with this mail'] = "Els visitants poden utilitzar aquesta adreça de correu electrònic per a contactar amb l'administrador del lloc";
$lang['PHP 5 is required'] = "Es requereix PHP 5 ";
$lang['It appears your webhost is currently running PHP %s.'] = "Sembla que el vostre amfitrió web està executant la versió PHP %s.";
@@ -72,4 +64,5 @@ $lang['Don\'t hesitate to consult our forums for any help : %s'] = 'No dubtis en
$lang['Just another Piwigo gallery'] = 'Just another Piwigo gallery';
$lang['Welcome to my photo gallery'] = 'Benvingut a la meva galeria fotogràfica';
$lang['Welcome to your new installation of Piwigo!'] = 'Benvingut a la nova instal·lació de Piwigo!';
+$lang['localhost or other, supplied by your host provider'] = 'localhost o un altre, facilitat pel teu proveïdor d\'allotjament';
?> \ No newline at end of file
diff --git a/language/ca_ES/upgrade.lang.php b/language/ca_ES/upgrade.lang.php
index e2692f3ca..eb9c821c0 100644
--- a/language/ca_ES/upgrade.lang.php
+++ b/language/ca_ES/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/cs_CZ/admin.lang.php b/language/cs_CZ/admin.lang.php
index 32dd3357b..407a77166 100644
--- a/language/cs_CZ/admin.lang.php
+++ b/language/cs_CZ/admin.lang.php
@@ -5,7 +5,7 @@
// +-----------------------------------------------------------------------+
// | Copyright(C) 2009 Pavel Budka & Petr Jirsa http://pbudka.co.cc |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -38,8 +38,8 @@ $lang['%d group'] = '%d skupina';
$lang['%d groups'] = '%d skupin';
$lang['%d member'] = '%d úÄastník';
$lang['%d members'] = '%d úÄastníků';
-$lang['%d tag'] = '%d klíÄové slovo';
-$lang['%d tags'] = '%d klíÄových slov';
+$lang['%d tag'] = '%d štítek';
+$lang['%d tags'] = '%d štítků';
$lang['%d user comment rejected'] = '%d komentář uživatele odmítnut';
$lang['%d user comments rejected'] = '%d komentářů uživatelů odmítnuto';
$lang['%d user comment validated'] = '%d komentář uživatele schválen';
@@ -52,7 +52,7 @@ $lang['%d waiting for validation'] = '%d Äeká na schválení';
$lang['Actions'] = 'Akce';
$lang['Activate'] = 'Aktivovat';
$lang['Add/delete a permalink'] = 'Přidat/odebrat pernamentní odkaz';
-$lang['Add a tag'] = 'PÅ™idat klíÄové slovo';
+$lang['Add a tag'] = 'Přidat štítek';
$lang['Add a user'] = 'Přidat uživatele';
$lang['Add group'] = 'Přidat skupinu';
$lang['Add'] = 'Přidat';
@@ -70,7 +70,7 @@ $lang['Current name'] = 'SouÄasný název';
$lang['Database'] = 'Databáze';
$lang['Deactivate'] = 'Deaktivovat';
$lang['Delete Representant'] = 'Smazat reprezentativní obrázek';
-$lang['Delete selected tags'] = 'Smazat vybraná klíÄová slova';
+$lang['Delete selected tags'] = 'Smazat vybrané štítky';
$lang['Delete selected users'] = 'Smazat vybrané uživatele';
$lang['Deletions'] = 'Smazání';
$lang['Deny selected groups'] = 'Zakázat vybraným skupinám';
@@ -79,8 +79,8 @@ $lang['Description'] = 'Popis';
$lang['Display options'] = 'Nastavení zobrazení';
$lang['Dissociated'] = 'Vazba zrušena';
$lang['Does not represent'] = 'Nereprezentuje';
-$lang['Edit selected tags'] = 'Upravit vybraná klíÄová slova';
-$lang['Edit tags'] = 'Upravit klíÄová slova';
+$lang['Edit selected tags'] = 'Upravit vybrané štítky';
+$lang['Edit tags'] = 'Upravit štítky';
$lang['Email admins when a new user registers'] = 'Poslat e-mail administrátorovi při registraci nového uživatele';
$lang['Email admins when a valid comment is entered'] = 'Poslat e-mail administrátorovi při vložení nového komentáře';
$lang['Email admins when a comment requires validation'] = 'Poslat e-mail administrátorovi při vložení nového komentáře vyžadujícího schválení.';
@@ -103,7 +103,7 @@ $lang['Maintenance'] = 'Údržba';
$lang['Edit album permissions'] = 'Editace oprávnění pro dané album';
$lang['Manage permissions for group "%s"'] = 'Nastavit práva pro skupinu "%s"';
$lang['Manage permissions for user "%s"'] = 'Nastavit práva pro uživatele "%s"';
-$lang['Manage tags'] = 'Správa klíÄových slov';
+$lang['Manage tags'] = 'Správa štítků';
$lang['Members'] = 'Členové';
$lang['Metadata synchronized from file'] = 'Metadata synchronizována ze souboru';
$lang['Move albums'] = 'Přesun alb';
@@ -111,7 +111,7 @@ $lang['Move'] = 'Přesunout';
$lang['Name'] = 'Jméno';
$lang['New name'] = 'Nové jméno';
$lang['New parent album'] = 'Nové hlavní album';
-$lang['New tag'] = 'Nové klíÄové slovo';
+$lang['New tag'] = 'Nový štítek';
$lang['Number of comments per page'] = 'PoÄet komentářů na stránce';
$lang['Number of rates'] = 'PoÄet hodnocení';
$lang['Number of thumbnails to create'] = 'PoÄet náhledů k vytvoÅ™ení';
@@ -156,10 +156,10 @@ $lang['Status'] = 'Stav';
$lang['Statistics'] = 'Statistiky';
$lang['Storage album'] = 'Uložené album';
$lang['Sum of rates'] = 'SouÄet hodnot';
-$lang['Tag "%s" already exists'] = 'KlíÄové slovo "%" už existuje';
-$lang['Tag "%s" was added'] = '"%" klíÄových slov bylo pÅ™idáno';
-$lang['Tag selection'] = 'VýbÄ›r klíÄových slov';
-$lang['The %d following tags were deleted'] = 'Následujících %d klíÄových slov bylo odstranÄ›no';
+$lang['Tag "%s" already exists'] = 'Štítek "%" už existuje';
+$lang['Tag "%s" was added'] = '"%" štítků bylo přidáno';
+$lang['Tag selection'] = 'Výběr štítků';
+$lang['The %d following tags were deleted'] = 'Následujících %d štítků bylo odstraněno';
$lang['Unable to check for upgrade.'] = 'Unable to check for upgrade.';
$lang['Uninstall'] = 'Odinstalovat';
$lang['Use the default photo sort order (defined in the configuration file)'] = 'Použít výchozí Å™azení (definované v konfiguraÄním souboru)';
@@ -193,7 +193,6 @@ $lang['Access type'] = 'Druh přístupu';
$lang['Information data registered in database'] = 'Data byla uložena do databáze';
$lang['Default display'] = 'Výchozí zobrazení';
$lang['The gallery URL is not valid.'] = 'URL galerie není platné';
-$lang['Main'] = 'Hlavní';
$lang['The number of comments a page must be between 5 and 50 included.'] = 'PoÄet komentářů na stránku musí být Äíslo mezi 5 a 50 vÄetnÄ›';
$lang['Configuration'] = 'Konfigurace';
$lang['confirm'] = 'Potvrdit';
@@ -228,7 +227,6 @@ $lang['Prepared time for list of users to send mail is limited. Others users are
$lang['Time to send mail is limited. Others mails are skipped.'] = 'Nastavený Äas pro odeslání zprávy byl pÅ™ekroÄen. Další zprávy nebudou odeslány.';
$lang['To send ?'] = 'Odeslat?';
$lang['Last send'] = 'Naposledy odesláno';
-$lang['email'] = 'E-mail';
$lang['User'] = 'Uživatel';
$lang['See you soon,'] = 'Nashledanou';
$lang['Go to'] = 'Přejít na';
@@ -247,7 +245,7 @@ $lang['You have unsubscribed from receiving notifications by mail.'] = 'Odhláš
$lang[', click on'] = ', klikněte na ';
$lang['To unsubscribe'] = 'Pro odhlášení klikněte na %s .';
$lang['With blank value, gallery title will be used'] = 'Pokud není zadáno, použije se název galerie';
-$lang['Notification'] = 'Oznámení';
+$lang['Notification'] = 'Upozornění';
$lang['Error when sending email to %s [%s].'] = 'Chyba při odesílání zprávy příjemci %s [%s].';
$lang['Mail sent to %s [%s].'] = 'Zpráva odeslána příjemci %s [%s].';
$lang['%d mail was sent.'] = '%d zpráva odeslána.';
@@ -303,7 +301,7 @@ $lang['clean'] = 'VyÄistit';
$lang['Create this site'] = 'Vytvořit tuto stránku';
$lang['test'] = 'Test';
$lang['test this remote site'] = 'Otestovat vzdálenou stránku';
-$lang['remove tags'] = 'PÅ™esunout klíÄová slova';
+$lang['remove tags'] = 'Odebrat štítky';
$lang['Repair and optimize database'] = 'Opravit a optimalizovat databázi';
$lang['selection'] = 'Výběr';
$lang['set to'] = 'Nastavit ';
@@ -337,7 +335,7 @@ $lang['width must be a number superior to'] = 'Šířka musí být větší než
$lang['for the file format'] = 'pro formát souboru';
$lang['Photo unreachable or no support'] = 'Fotografie není dostupná nebo podporovaná';
$lang['GD version'] = 'Verze GD knihovny';
-$lang['General statistics'] = 'Celková statistika';
+$lang['General statistics'] = 'Všeobecné statistiky';
$lang['average time'] = 'průmÄ›rný Äas';
$lang['number of miniaturized photos'] = 'poÄet miniaturizovaných fotografií';
$lang['total time'] = 'celkový Äas';
@@ -535,7 +533,7 @@ $lang['Downloads'] = 'Staženo';
$lang['Released on'] = 'Vydáno';
$lang['Number of downloads'] = 'PoÄet stažení';
$lang['Upload Photos'] = 'Nahrát fotografie';
-$lang['Drop into album'] = 'Dát do alba';
+$lang['Drop into album'] = 'Vyber album';
$lang['+ Add an upload box'] = '+ Přidat pole';
$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Vytvořte "%s" adresáře v kořenovém adresáři instalace Piwigo';
$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Povolte zápis (chmod 777,644,atd.) do "%s" adresáře v kořenovém adresáři instalace Piwigo';
@@ -583,7 +581,7 @@ $lang['Resize'] = 'Změnit velikost';
$lang['Maximum width'] = 'Maximální šířka';
$lang['pixels'] = 'bodů';
$lang['Maximum height'] = 'Maximální výška';
-$lang['Image Quality'] = 'Kvalita formátu';
+$lang['Image Quality'] = 'Kvalita fotografie';
$lang['Save Settings'] = 'Uložit nastavení';
$lang['Your configuration settings are saved'] = 'Vaše nastavení bylo uloženo';
$lang['Active Themes'] = 'Aktivní témata';
@@ -645,7 +643,7 @@ $lang['Inactive Languages'] = 'Deaktivované jazyky';
$lang['Make this language available to users'] = 'Zpřístupnit tento jazyk uživatelům';
$lang['Set as default language for unregistered and new users'] = 'Nastavit jako výchozí jazyk pro nezaregistrované a nové uživatele';
$lang['Add Photos'] = 'Přidat fotografie';
-$lang['The following tag was deleted'] = 'Následující klíÄové slovo byl odstranÄ›n';
+$lang['The following tag was deleted'] = 'Následující štítek byl odstraněn';
$lang['Miscellaneous'] = 'Různé';
$lang['Virtual Links'] = 'Virtuální odkazy';
$lang['There is no other language available.'] = 'Není dostupný žádný další jazyk.';
@@ -688,7 +686,7 @@ $lang['%d of %d photos selected'] = '%d z %d fotografií vybráno';
$lang['No photo selected, %d photos in current set'] = 'Žádná fotografie nebyla vybrána, %d fotografií v množině';
$lang['All %d photos are selected'] = 'Všech %d fotografií bylo vybráno';
$lang['remove this filter'] = 'smazat tento filtr';
-$lang['Duplicates'] = 'duplikáty';
+$lang['Duplicates'] = 'Duplikáty';
$lang['Add a filter'] = 'Přidat filtr';
$lang['Remove all filters'] = 'Smazat všechny filtry';
$lang['Refresh photo set'] = 'Obnovit množinu fotografií';
@@ -703,12 +701,12 @@ $lang['remove title'] = 'smazat název';
$lang['Type here the title'] = 'Napište zde název';
$lang['remove creation date'] = 'smazat datum vytvoření';
$lang['Album photos associated to the following albums: %s'] = 'Fotky alba přiřazeny k následujícím albům: %s';
-$lang['Delete orphan tags'] = 'Smazat tagy';
+$lang['Delete orphan tags'] = 'Smazat štítky';
$lang['delete photo'] = 'smazat fotky';
-$lang['Orphan tags deleted'] = 'Tagy odstraněny';
+$lang['Orphan tags deleted'] = 'Štítky odstraněny';
$lang['Remove from caddie'] = 'Odebrat z košíku';
$lang['Week starts on'] = 'Týden zaÄíná v';
-$lang['You have %d orphan tags: %s.'] = 'Máte %d tagů: %s.';
+$lang['You have %d orphan tags: %s.'] = 'Máte %d štítků: %s.';
$lang['Themes which need upgrade'] = 'Šablony, které potřebují aktualizovat';
$lang['Languages which need upgrade'] = 'Jazyky které potřebují aktualizovat';
$lang['All themes are up to date.'] = 'Všechny šablony jsou akuální.';
@@ -785,14 +783,14 @@ $lang['Manage Permissions'] = 'Nastavení oprávnění';
$lang['Photo %s of %s'] = 'Fotografií %s ze %s';
$lang['show details'] = 'zobrazit detaily';
$lang['hide details'] = 'skrýt detaily';
-$lang['Merge tags'] = 'SlouÄit tagy';
-$lang['Select the destination tag'] = 'Vyberte cílový tag';
-$lang['(this tag will be deleted)'] = '(tento tag bude vymazán)';
+$lang['Merge tags'] = 'SlouÄit Å¡títky';
+$lang['Select the destination tag'] = 'Vyberte cílový štítek';
+$lang['(this tag will be deleted)'] = '(tento štítek bude vymazán)';
$lang['Confirm merge'] = 'Potvrdit slouÄení';
-$lang['Merge selected tags'] = 'SlouÄit vybrané tagy';
-$lang['No destination tag selected'] = 'Cílový tag nebyl vybrán';
-$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Tagy <em>%s</em> slouÄeny do tagu <em>%s</em>';
-$lang['Select at least two tags for merging'] = 'Vyberte alespoň 2 tagy pro slouÄení';
+$lang['Merge selected tags'] = 'SlouÄit vybrané Å¡títky';
+$lang['No destination tag selected'] = 'Cílový štítek nebyl vybrán';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Å títky <em>%s</em> slouÄeny do Å¡títku <em>%s</em>';
+$lang['Select at least two tags for merging'] = 'Vyberte alespoň 2 Å¡títky pro slouÄení';
$lang['Select an album'] = 'Vyberte album';
$lang['An error has occured during upgrade.'] = 'Během aktualizace došlo k chybě.';
$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'K chybě došlo během rozbalování. Prosím ověřte oprávnění na soubory Vaší instalace Piwigo.<br><a href="%s">Pro zobrazení chybového logu klikněte zde</a>.';
@@ -802,12 +800,12 @@ $lang['If no HD is available and if the current websize is bigger than resize di
$lang['Zoom'] = 'Přiblížit';
$lang['Add to caddie'] = 'Přidat do košíku';
$lang['%s has been successfully updated.'] = '%s: úspěšně aktualizováno.';
-$lang['Add tags'] = 'Přidat tagy';
+$lang['Add tags'] = 'Přidat štítky';
$lang['Last import'] = 'Poslední import';
$lang['Photo name'] = 'Název fotografie';
$lang['Predefined filter'] = 'Předdefinovaný filtr';
$lang['With no album'] = 'Bez alba';
-$lang['With no tag'] = 'Bez tagu';
+$lang['With no tag'] = 'Bez štítku';
$lang['With no virtual album'] = 'Bez virtuálního alba';
$lang['Activate comments'] = 'Aktivovat komentáře';
$lang['Default comments order'] = 'Výchozí řazení komentářů';
@@ -846,7 +844,7 @@ $lang['Available versions for'] = 'Dostupné verze pro';
$lang['Available on'] = 'K dispozici na';
$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo pro iOS (iPhone, iPad, iPod Touch)';
$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = '<em>Piwigo pro iOS</em> aplikace vám dává možnost se připojit do galerie Piwigo z vašeho iPhone, iPad nebo iPod Touch, vytvořit nějaké alba a nahrávat více fotografií najednou.';
-$lang['Piwigo for Android'] = 'Piwigo for Android';
+$lang['Piwigo for Android'] = 'Piwigo pro Android';
$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = '<em>Piwigo pro Android</em> aplikace vám dává možnost se připojit do galerie Piwigo z vašeho Android telefonu nebo tabletu, vytvořit nějaké alba a nahrávat více fotografií najednou.';
$lang['Piwigo Publish plugin for Lightroom'] = 'Piwigo PublikaÄní plugin pro Lightroom';
$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Photoshop Lightroom je fotografický software urÄený ke správÄ› velkého množství digitálních fotografií a postprodukÄních prací.';
@@ -881,7 +879,6 @@ $lang['include photos with lower privacy level'] = 'zahrnuje fotky s nižší ú
$lang['custom'] = 'Vlastní';
$lang['No group is permitted to see this private album'] = 'Žádná ze skupin nemá oprávnění prohlížet toto soukromé album';
$lang['Permission management'] = 'Správa pravidel přístupu';
-
$lang['add a new watermark'] = 'Přidej vodoznak';
$lang['Apply watermark if height is bigger than'] = 'Vlož vodoznak pokud je výška delší než';
$lang['Apply watermark if width is bigger than'] = 'Vlož vodoznak pokud je šířka delší než';
@@ -928,18 +925,16 @@ $lang['%d weeks'] = '%d týdny';
$lang['Edit photo'] = 'Upravit foto';
$lang['create a new site'] = 'vytvoř nové místo';
$lang['No order field selected'] = 'Není vybráno pole řazení';
-$lang['Duplicate selected tags'] = 'Duplikuj vybrané tagy';
+$lang['Duplicate selected tags'] = 'Duplikuj vybrané štítky';
$lang['Name of the duplicate'] = 'Název duplikátu';
-$lang['Source tag'] = 'Zdrojový tag';
-$lang['Tag "%s" is now a duplicate of "%s"'] = 'Tag "%s" je nyní duplikátem "%s"';
-$lang['Format'] = 'Formát';
-$lang['Invalid dimension'] = 'Neplatný rozměr';
+$lang['Source tag'] = 'Zdrojový štítek';
+$lang['Tag "%s" is now a duplicate of "%s"'] = 'Štítek "%s" je nyní duplikátem "%s"';
$lang['Landscape'] = 'Naležato';
$lang['Manage photos'] = 'Spravovat fotografie';
$lang['Minimum height'] = 'Minimální výška';
$lang['Minimum width'] = 'Minimální šířka';
$lang['Number of albums per page'] = 'PoÄet alb na stránku';
-$lang['Panorama'] = 'Panorama';
+$lang['Panorama'] = 'Panoráma';
$lang['Portrait'] = 'Na výšku';
$lang['View in gallery'] = 'Zobrazit v galerii';
$lang['Ratio'] = 'Poměr';
@@ -956,4 +951,32 @@ $lang['This group will be set to default'] = 'Tato skupina bude použita jako de
$lang['This group will be unset to default'] = 'Tato skupina nebude dále použita jako defaultní';
$lang['Type here the name of the new group'] = 'Napište sem jméno nové skupiny';
$lang['Purge user cache'] = 'Provést údržbu uživatelské mezipaměťi';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'Rozměry obrázku budou zmenšeny na %dx%d pixelů.';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'Změna velikosti po uploadu není aktivní, kvůli používání GD jako grafické knihovny.';
+$lang['Select at least one tag'] = 'vyberte alespoň jeden tag';
+$lang['Mail theme'] = 'E-mailové téma';
+$lang['%d of %d users selected'] = '%d z %d uživatelů vybráno';
+$lang['(filtered from %s total users)'] = '(vyfiltrováno z celkového poÄtu %s uživatelů)';
+$lang['All %d users are selected'] = 'Všech %d uživatelů bylo vybráno';
+$lang['No user selected of %d users'] = 'Nebyl vybrán žádny z %d uživatelů';
+$lang['Showing %s to %s of %s users'] = 'Jsou zobrazeni %s až %s z %s uživatelů';
+$lang['Basic settings'] = 'Základní nastavení';
+$lang['Change password'] = 'Změnit heslo';
+$lang['Change username'] = 'Změnit jméno uživatele';
+$lang['General'] = 'Všeobecné';
+$lang['Last visit on %s, %s.'] = 'Poslední návštěva v %s, %s.';
+$lang['Loading...'] = 'Nahrává se...';
+$lang['No matching user found'] = 'Uživatel odpovídající dotazu hledání nenalezen';
+$lang['No user selected, no action possible.'] = 'Nebyl zvolen uživatel, akce není možná.';
+$lang['Password updated'] = 'Heslo aktualizováno';
+$lang['Registered on %s, %s.'] = 'Zaregistrován v %s, %s.';
+$lang['Show %s users'] = 'Zobraz %s uživatele';
+$lang['Update user'] = 'Aktualizuj uživatele';
+$lang['User %s added'] = 'Uživatel %s přidán';
+$lang['User %s updated'] = 'Uživatel %s aktualizován';
+$lang['Users modified'] = 'Uživatelé pozměněni';
+$lang['on the %d selected users'] = 'na %d vybraných uživatelích';
+$lang['Close user details'] = 'Zavřít detajly uživatele';
+$lang['Open user details'] = 'Otevřít detajly uživatele';
+$lang['close'] = 'Zavřít';
?> \ No newline at end of file
diff --git a/language/cs_CZ/common.lang.php b/language/cs_CZ/common.lang.php
index f036da828..ceda132c5 100644
--- a/language/cs_CZ/common.lang.php
+++ b/language/cs_CZ/common.lang.php
@@ -5,7 +5,7 @@
// +-----------------------------------------------------------------------+
// | Copyright(C) 2009 Pavel Budka & Petr Jirsa http://pbudka.co.cc |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -25,7 +25,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: ÄŒesky [CZ]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=414
Author: Piwigo team
Author URI: http://piwigo.org
@@ -54,9 +54,9 @@ $lang['%d new photo'] = '%d nový objekt';
$lang['%d new photos'] = '%d nových objektů';
$lang['%d new user'] = '%d nový uživatel';
$lang['%d new users'] = '%d nových uživatelů';
-$lang['About'] = 'O mÄ›';
-$lang['All tags'] = 'VÅ¡echna klíÄová slova';
-$lang['Any tag'] = 'Kterékoliv klíÄové slovo';
+$lang['About'] = 'O aplikaci';
+$lang['All tags'] = 'Všechny štítky';
+$lang['Any tag'] = 'Kterýkoliv štítek';
$lang['At least one listed rule must be satisfied.'] = 'Alespoň jedno pravidlo ze seznamu musí být splněno.';
$lang['Author'] = 'Autor';
$lang['Albums'] = 'Alba';
@@ -104,18 +104,18 @@ $lang['Quick connect'] = 'Rychlé přihlášení';
$lang['RSS feed'] = 'RSS ÄteÄka';
$lang['Register'] = 'Zaregistrovat se';
$lang['Registration'] = 'Registrace';
-$lang['Related tags'] = 'Související klíÄová slova';
+$lang['Related tags'] = 'Související štítky';
$lang['Reset'] = 'Vynulovat';
$lang['Retrieve password'] = 'Obnovit heslo';
$lang['Search rules'] = 'Podmínky pro vyhledávání';
-$lang['Search tags'] = 'Hledat podle klíÄových slov';
+$lang['Search tags'] = 'Hledat podle štítků';
$lang['Search'] = 'Vyhledat';
-$lang['display available tags'] = 'Ukázat dostupná klíÄová slova';
+$lang['display available tags'] = 'Ukázat dostupné štítky';
$lang['Since'] = 'Od';
$lang['Sort by'] = 'Řadit podle';
$lang['Sort order'] = 'Směr řazení';
-$lang['Tag'] = 'KlíÄové slovo';
-$lang['Tags'] = 'KlíÄová slova';
+$lang['Tag'] = 'Štítek';
+$lang['Tags'] = 'Štítky';
$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS zdroj obsahuje upozornÄ›ní na nové události z tohoto webu: nové fotky, aktualizované galerie, nové komentáře. K použití se ÄteÄkami RSS kanálů.';
$lang['Unknown feed identifier'] = 'Neznámý identifikátor vlákna';
$lang['User comments'] = 'Komentáře uživatelů';
@@ -249,9 +249,8 @@ $lang['login mustn\'t end with a space character'] = 'uživatelské jméno nesmÃ
$lang['login mustn\'t start with a space character'] = 'uživatelské jméno nesmí zaÄínat mezerou';
$lang['this login is already used'] = 'tyto přihlašovací údaje už jsou používány';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'E-mail musí být ve formátu xxx@yyy.eee (například : novak@seznam.cz)';
-$lang['please enter your password again'] = 'prosím zadejte znovu heslo ';
$lang['Auto login'] = 'Automatické přihlášení';
-$lang['remove this tag from the list'] = 'odstranit toto klíÄové slovo ze seznamu';
+$lang['remove this tag from the list'] = 'odstranit tento štítek ze seznamu';
$lang['representative'] = 'Reprezentant';
$lang['Search for Author'] = 'Hledat autora';
$lang['Search in albums'] = 'Hledat v albech';
@@ -277,10 +276,9 @@ $lang['SQL queries in'] = 'SQL dotazů během';
$lang['display only recently posted photos'] = 'Zobrazí pouze nově vložené fotografie';
$lang['return to the display of all photos'] = 'Návrat ke zobrazení všech fotografií';
$lang['the beginning'] = 'zaÄátku';
-$lang['Interface theme'] = 'Å ablona vzhledu';
$lang['Thumbnails'] = 'Náhledy';
$lang['Menu'] = 'Další funkce';
-$lang['A comment on your site'] = 'komentář v Vašim stránkám';
+$lang['A comment on your site'] = 'Komentář k Vašim stránkám';
$lang['today'] = 'dnes';
$lang['Update your rating'] = 'Aktualizovat hodnocení';
$lang['the username must be given'] = 'Je nutné zadat uživatelské jméno';
@@ -300,7 +298,7 @@ $lang['Album: %s'] = 'Album: %s';
$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Špatný stav pro uživatele "host", bude použit výchozí stav. Prosím informujte administrátora.';
$lang['this email address is already in use'] = 'Tato e-mailová adresa je již používána';
$lang['Album results for'] = 'Alba výsledky pro';
-$lang['Tag results for'] = 'Výsledky pro klíÄová slova';
+$lang['Tag results for'] = 'Výsledky pro štítky';
$lang['from %s to %s'] = 'od %s do %s';
$lang['Play of slideshow'] = 'Spustit prezentaci';
$lang['Pause of slideshow'] = 'Zastavit prezentaci';
@@ -313,16 +311,16 @@ $lang['Yes'] = 'Ano';
$lang['No'] = 'Ne';
$lang['%d photo'] = '%d fotografie';
$lang['%d photos'] = '%d fotografií';
-$lang['%d photo is also linked to current tags'] = '%d fotografie je také spojena s aktuálními klíÄovými slovy';
-$lang['%d photos are also linked to current tags'] = '%d fotografií je také spojeno s aktuálními klíÄovými slovy';
-$lang['display photos linked to this tag'] = 'Ukázat pouze fotografie spojené s aktuálním klíÄovým slovem';
+$lang['%d photo is also linked to current tags'] = '%d fotografie je také spojena s aktuálními štítky';
+$lang['%d photos are also linked to current tags'] = '%d fotografií je také spojeno s aktuálními štítky';
+$lang['display photos linked to this tag'] = 'Ukázat pouze fotografie spojené s aktuálním štítkem';
$lang['photos posted during the last %d days'] = 'fotografie vložené za posledních %d dnů';
$lang['Piwigo Help'] = 'Nápověda Piwigo';
$lang['Rank'] = 'Hodnotit';
$lang['group by letters'] = 'Setřídit podle abecedy';
$lang['letters'] = 'Roztřídit dle poÄáteÄního písmene';
-$lang['show tag cloud'] = 'Zobrazit klíÄová slova pohromadÄ›';
-$lang['cloud'] = 'KlíÄová slova na jedné hromadÄ›';
+$lang['show tag cloud'] = 'Zobrazit shluk štítků';
+$lang['cloud'] = 'Shluk';
$lang['Are you sure?'] = 'Jste si jistý?';
$lang['Reset to default values'] = 'Obnovit výchozí hodnoty';
$lang['delete all photos from your favorites'] = 'vymazat všechny obrázky z Vašich oblíbených';
@@ -419,4 +417,12 @@ $lang['Username is mandatory'] = 'Uživatelské jméno je povinné';
$lang['mandatory'] = 'povinné';
$lang['Website'] = 'Webová stránka';
$lang['Your website URL is invalid'] = 'URL vaší stránky je neplatné';
+$lang['Last Page'] = 'Poslední stránka';
+$lang['Go back to the album'] = 'Zpět do alba';
+$lang['First Page'] = 'První stránka';
+$lang['Email'] = 'E-mail';
+$lang['Password is missing. Please enter the password.'] = 'Chybí heslo. Prosím napište heslo.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Chybí potvrzení hesla. Prosím potvrÄte vybrané heslo.';
+$lang['%d photos per page'] = '%d fotek na stránce';
+$lang['Theme'] = 'Téma';
?> \ No newline at end of file
diff --git a/language/cs_CZ/help/index.php b/language/cs_CZ/help/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/cs_CZ/help/index.php
+++ b/language/cs_CZ/help/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/cs_CZ/index.php b/language/cs_CZ/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/cs_CZ/index.php
+++ b/language/cs_CZ/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/cs_CZ/install.lang.php b/language/cs_CZ/install.lang.php
index 2e4ba328a..7f6d5897b 100644
--- a/language/cs_CZ/install.lang.php
+++ b/language/cs_CZ/install.lang.php
@@ -5,7 +5,7 @@
// +-----------------------------------------------------------------------+
// | Copyright(C) 2009 Pavel Budka & Petr Jirsa http://pbudka.co.cc |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -30,8 +30,6 @@ $lang['Default gallery language'] = 'Základní jazyk galerie';
$lang['Database configuration'] = 'Databázová konfigurace';
$lang['Admin configuration'] = 'Administrátorská konfigurace';
$lang['Start Install'] = 'Spustit instalaci';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'e-mailová adresa musí mít formát xxx@yyy.eee (například : novak@mail.cz)';
-$lang['Webmaster login'] = 'Uživatelské jméno správce';
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Bude zobrazen návštěvníkům. Je nutný pro administraci aplikace.';
$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Spojení na server se podařilo, ale nebylo možné připojit databázi';
$lang['Can\'t connect to server'] = 'Nebylo možné se připojit k serveru';
@@ -39,7 +37,6 @@ $lang['Host'] = 'MySQL server';
$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.cz';
$lang['User'] = 'Uživatel';
$lang['user login given by your host provider'] = 'uživatelské jméno, které Vám přidělil provozovatel serveru';
-$lang['Password'] = 'Heslo';
$lang['user password given by your host provider'] = 'heslo na tomto serveru';
$lang['Database name'] = 'Jméno databáze';
$lang['also given by your host provider'] = 'které na tomto serveru';
@@ -48,12 +45,10 @@ $lang['database tables names will be prefixed with it (enables you to manage bet
$lang['enter a login for webmaster'] = 'vložte uživatelské jméno správce';
$lang['webmaster login can\'t contain characters \' or "'] = 'uživatelské jméno správce nemůže obsahovat znak \' nebo "';
$lang['please enter your password again'] = 'prosím zadejte znovu heslo';
-$lang['Webmaster password'] = 'Heslo správce';
$lang['Keep it confidential, it enables you to access administration panel'] = 'Heslo mějte utajeno, umožní Vám přístup do administrace aplikace';
$lang['Password [confirm]'] = 'Heslo [potvrzení]';
$lang['verification'] = 'kontrola';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Potřebujete pomoc ? Zeptejte se na <a href="%s">Piwigo fóru</a>.';
-$lang['Webmaster mail address'] = 'E-mail správce';
$lang['Visitors will be able to contact site administrator with this mail'] = 'Návštěvníci mohou pomocí tohoto e-mailu správce kontaktovat';
$lang['PHP 5 is required'] = 'Je nutný PHP 5';
$lang['It appears your webhost is currently running PHP %s.'] = 'Na Vašem webhostingu je PHP %s.';
@@ -73,4 +68,5 @@ $lang['Just another Piwigo gallery'] = 'Jen další galerie Piwigo';
$lang['Welcome to my photo gallery'] = 'Vítejte na mé fotogalerii';
$lang['Welcome to your new installation of Piwigo!'] = 'Vítejte v nové instalaci Piwigo!';
$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Neváhejte navštívit naše fórum v případě jakýchkoliv dotazů: %s';
+$lang['localhost or other, supplied by your host provider'] = 'localhost, nebo jiný, dodaný poskytovatelem hostingu';
?> \ No newline at end of file
diff --git a/language/cs_CZ/upgrade.lang.php b/language/cs_CZ/upgrade.lang.php
index 40266a001..7d967f265 100644
--- a/language/cs_CZ/upgrade.lang.php
+++ b/language/cs_CZ/upgrade.lang.php
@@ -5,7 +5,7 @@
// +-----------------------------------------------------------------------+
// | Copyright(C) 2009 Pavel Budka & Petr Jirsa http://pbudka.co.cc |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/da_DK/about.html b/language/da_DK/about.html
index 7e064b8da..850678e9a 100644
--- a/language/da_DK/about.html
+++ b/language/da_DK/about.html
@@ -1,14 +1,15 @@
-<p>Dette foto-galleri er baseret på Piwigo.</p>
+<p>Dette fotogalleri er baseret på Piwigo.</p>
-<p>Piwigo er et foto galleri til webbrug, bygget af en aktiv gruppe af brugere og udviklere. Udvidelser gør at det er let at peronliggøre Piwigo. Piwigo er gratis og opensource.</p>
+<p>Piwigo er et fotogalleriprogram til webbrug, opbygget af et aktivt fællesskab bestående af brugere og udviklere. Udvidelser gør at det er let at tilpasse Piwigo. Som prikken over i'et er Piwigo frie software og Open Source.</p>
-<p id="linkToPiwigo"><a href="http://da.piwigo.org">Besøg Piwigos website</a></p>
+<p id="linkToPiwigo"><a href="http://da.piwigo.org">Besøg Piwigos websted</a></p>
-<p>Udgivelsen af den danske piwigo er vedligeholdt af (alfabetisk orden):
+<p>Den dansksprogede udgave af Piwigo vedligeholdes af følgende personer, i alfabetisk rækkefølge:
<ul>
<li><a href="http://piwigo.org/forum/profile.php?id=16630">Egorip</a></li>
<li><a href="http://piwigo.org/forum/profile.php?id=17434">Kaare</a></li>
- <li><a href="http://piwigo.org/forum/profile.php?id=4888">nile</a></li>
+ <li><a href="http://piwigo.org/forum/profile.php?id=4888">nileson</a></li>
+ <li><a href="http://piwigo.org/forum/profile.php?id=18218">pointman</a></li>
<li><a href="http://piwigo.org/forum/profile.php?id=14226">Rollike</a></li>
<li><a href="http://piwigo.org/forum/profile.php?id=11616">thomas1956</a></li>
</ul>
diff --git a/language/da_DK/admin.lang.php b/language/da_DK/admin.lang.php
index fe0fc1ee5..e0f8d1ba6 100644
--- a/language/da_DK/admin.lang.php
+++ b/language/da_DK/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -25,10 +25,10 @@
$lang['%d association'] = '%d tilknytning';
$lang['%d associations'] = '%d tilknytninger';
-$lang['%d album including'] = '%d album inklusiv';
-$lang['%d albums including'] = '%d albummer inklusiv';
+$lang['%d album including'] = '%d album herunder';
+$lang['%d albums including'] = '%d albummer herunder ';
$lang['%d physical'] = ' %d fysisk';
-$lang[' and %d virtual'] = ' Og %d virtuel';
+$lang[' and %d virtual'] = ' og %d virtuelt';
$lang['%d album moved'] = '%d album flyttet';
$lang['%d albums moved'] = '%d albummer flyttet';
$lang['%d group'] = '%d gruppe';
@@ -38,7 +38,7 @@ $lang['%d members'] = '%d medlemmer';
$lang['%d tag'] = '%d tag';
$lang['%d tags'] = '%d tags';
$lang['%d user comment rejected'] = '%d brugerkommentar afvist';
-$lang['%d user comments rejected'] = '%d brugerbemærkninger afvist';
+$lang['%d user comments rejected'] = '%d brugerkommentarer afvist';
$lang['%d user comment validated'] = '%d brugerkommentar godkendt';
$lang['%d user comments validated'] = '%d brugerkommentarer godkendt';
$lang['%d user deleted'] = '%d bruger slettet';
@@ -59,7 +59,7 @@ $lang['Associated'] = 'Tilknyttet ';
$lang['Caddie management'] = 'Administration af kurv';
$lang['Caddie'] = 'Kurv';
$lang['Albums authorized thanks to group associations'] = 'Albummer godkendt takket være gruppetilknytninger';
-$lang['Album manual order was saved'] = 'Manual albumrækkefølge blev gemt';
+$lang['Album manual order was saved'] = 'Manuel albumrækkefølge blev gemt';
$lang['Check for upgrade failed for unknown reasons.'] = 'Opgraderingtjek mislykkedes af ukendte årsager.';
$lang['Check for upgrade'] = 'Opgraderingtjek';
$lang['Comments for all'] = 'Kommentarer til alle';
@@ -191,7 +191,6 @@ $lang['Access type'] = 'Adgangstype';
$lang['Information data registered in database'] = 'Oplysningerne er gemt i databasen';
$lang['Default display'] = 'Standardvisning';
$lang['The gallery URL is not valid.'] = 'Galleri-URL\'en er ikke gyldig.';
-$lang['Main'] = 'Primært';
$lang['The number of comments a page must be between 5 and 50 included.'] = 'Antallet af kommentarer på en side skal være mellem 5 og 50.';
$lang['Configuration'] = 'Opsætning';
$lang['confirm'] = 'bekræft';
@@ -203,7 +202,7 @@ $lang['Album updated successfully'] = 'Album opdateret';
$lang['photos per page'] = 'fotografier pr. side';
$lang['High definition enabled'] = 'Højopløselig er slået til';
$lang['File'] = 'Fil';
-$lang['first photo added on %s'] = 'første fotografi tilføjet den %s';
+$lang['first photo added on %s'] = 'første fotografi tilføjet %s';
$lang['Forbidden'] = 'Forbudt';
$lang['global mode'] = 'global tilstand';
$lang['group "%s" added'] = 'gruppen "%s" tilføjet';
@@ -214,7 +213,7 @@ $lang['This name is already used by another group.'] = 'Dette navn anvendes alle
$lang['High definition'] = 'Højopløselig';
$lang['jump to album'] = 'hop til album';
$lang['jump to photo'] = 'Hop til fotografiet';
-$lang['leave'] = 'forlad';
+$lang['leave'] = 'uændret';
$lang['Lock'] = 'LÃ¥s';
$lang['Locked'] = 'LÃ¥st';
$lang['manage album photos'] = 'administrer fotografier i album';
@@ -226,7 +225,6 @@ $lang['Prepared time for list of users to send mail is limited. Others users are
$lang['Time to send mail is limited. Others mails are skipped.'] = 'Tiden til at sende mail er begrænset. Andre mails er sprunget over.';
$lang['To send ?'] = 'Vil du sende?';
$lang['Last send'] = 'Senest afsendt';
-$lang['email'] = 'E-mail';
$lang['User'] = 'Bruger';
$lang['See you soon,'] = 'Vi ses snart,';
$lang['Go to'] = 'GÃ¥ til';
@@ -302,7 +300,7 @@ $lang['clean'] = 'oprydning';
$lang['Create this site'] = 'Opret dette websted';
$lang['test'] = 'test';
$lang['test this remote site'] = 'test dette fjerne websted';
-$lang['remove tags'] = 'fjern tags';
+$lang['remove tags'] = 'Fjern tags';
$lang['Repair and optimize database'] = 'Reparer og optimer database';
$lang['selection'] = 'udvælgelse';
$lang['set to'] = 'opsat til';
@@ -371,7 +369,7 @@ $lang['Simulation'] = 'Simulering';
$lang['directories + files'] = 'mapper + filer';
$lang['only directories'] = 'kun mapper';
$lang['synchronize files structure with database'] = 'Synkroniser filstruktur med databasen';
-$lang['synchronize files metadata with database photos informations'] = 'synkroniser fotografier i databasen med filers metadata';
+$lang['synchronize files metadata with database photos informations'] = 'Synkroniser fotografier i databasen med filers metadata';
$lang['even already synchronized photos'] = 'allerede synkroniserede fotografier';
$lang['Used metadata'] = 'Metadata anvendes';
$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'Navnet på mapper og filer må kun bestå af bogstaver, tal, "-", "_" eller "."';
@@ -430,12 +428,12 @@ $lang['Automatic correction'] = 'Automatisk korrektion';
$lang['Impossible automatic correction'] = 'Automatisk korrektion ikke mulig';
$lang['Correction applied with success'] = 'Korrektion anvendt med succes';
$lang['Correction applied with error'] = 'Korrektion anvendt med fejl';
-$lang['%d anomaly has been detected.'] = ' %d afvigelse er konstateret.';
-$lang['%d anomalies have been detected.'] = ' %d afvigelser er påvist.';
-$lang['%d anomaly has been corrected.'] = ' %d afvigelse er korrigeret.';
-$lang['%d anomalies have been detected corrected.'] = ' %d afvigelser er blevet opdaget og rettet.';
-$lang['%d anomaly has not been corrected.'] = ' %d afvigelse er ikke blevet korrigeret.';
-$lang['%d anomalies have not been corrected.'] = ' %d afvigelser har ikke været korrigeret.';
+$lang['%d anomaly has been detected.'] = '%d afvigelse er konstateret.';
+$lang['%d anomalies have been detected.'] = '%d afvigelser er påvist.';
+$lang['%d anomaly has been corrected.'] = '%d afvigelse er korrigeret.';
+$lang['%d anomalies have been detected corrected.'] = '%d afvigelser er blevet opdaget og rettet.';
+$lang['%d anomaly has not been corrected.'] = '%d afvigelse er ikke blevet korrigeret.';
+$lang['%d anomalies have not been corrected.'] = '%d afvigelser har ikke været korrigeret.';
$lang['Go to %s or %s for more informations'] = 'GÃ¥ til %s eller %s for flere oplysninger';
$lang['the forum'] = 'forummet';
$lang['the wiki'] = 'wikien';
@@ -470,7 +468,7 @@ $lang['Refresh'] = 'Opfrisk';
$lang['The anomaly will be ignored until next application version'] = 'Afvigelsen vil blive ignoreret indtil næste applikationsversion';
$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'Korrigeret afvigelse vil efterfølgende ikke blive ignoreret';
$lang['%d anomaly has been ignored.'] = '%d afvigelse er blevet ignoreret.';
-$lang['%d anomalies have been ignored.'] = ' %d afvigelser er blevet ignoreret.';
+$lang['%d anomalies have been ignored.'] = '%d afvigelser er blevet ignoreret.';
$lang['Plugins which need upgrade'] = 'Plugins der skal opgraderes';
$lang['Plugin list'] = 'Pluginliste';
$lang['Check for updates'] = 'Se efter opdateringer';
@@ -498,7 +496,7 @@ $lang['Support'] = 'Support';
$lang['Documentation'] = 'Dokumentation';
$lang['A new version of Piwigo is available.'] = 'En ny version af Piwigo er tilgængelig.';
$lang['Piwigo Administration'] = 'Piwigo Administration';
-$lang['Piwigo version'] = 'Piwigo version';
+$lang['Piwigo version'] = 'Piwigo-version';
$lang['You are running the latest version of Piwigo.'] = 'Du kører den seneste version af Piwigo.';
$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'Den version af %s [%s] er installeret ikke er kompatibel med den krævede version [%s]';
$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'Du bør opgradere dit system for at drage fuld nytte af programmet, ellers risikerer du at programmet virke forkert, eller slet ikke';
@@ -506,7 +504,7 @@ $lang['Deleted on'] = 'Slettet den';
$lang['Last hit'] = 'Seneste hit';
$lang['GD library is missing'] = 'GD-biblioteket mangler';
$lang['Templates'] = 'Skabeloner';
-$lang['Extend for templates'] = 'Forlæng skabeloner';
+$lang['Extend for templates'] = 'Udvid skabeloner';
$lang['Replacement of original templates by customized templates from template-extension subfolder'] = 'Erstatning af originale skabeloner med tilpassede skabeloner fra undermappen template-extension';
$lang['Replacers (customized templates)'] = 'Stedfortrædere (tilpassede skabeloner)';
$lang['Original templates'] = 'Original skabelon';
@@ -517,7 +515,7 @@ $lang['Optimizations have been completed with some errors.'] = 'Optimeringer e
$lang['Modify information'] = 'Rediger oplysninger';
$lang['nothing'] = 'intet';
$lang['overrides existing values with empty ones'] = 'erstatter eksisterende værdier med tomme';
-$lang['Manage photo ranks'] = 'Administrer fotografikarakterer';
+$lang['Manage photo ranks'] = 'Sorteringsrækkefølge';
$lang['Edit ranks'] = 'Rediger karakterer';
$lang['No photo in this album'] = 'Ingen fotografier i dette album';
$lang['Images manual order was saved'] = 'Manuel billedrækkefølge gemt';
@@ -548,7 +546,7 @@ $lang['Hit'] = 'Hit';
$lang['Tools'] = 'Værktøjer';
$lang['Photos'] = 'Fotografier';
$lang['Themes'] = 'Temaer';
-$lang['Instructions to use Piwigo'] = 'Vejledning i af anvende Piwigo';
+$lang['Instructions to use Piwigo'] = 'Vejledning i at anvende Piwigo';
$lang['Installed Themes'] = 'Installerede temaer';
$lang['Add New Theme'] = 'Tilføj et nyt tema';
$lang['Forbid this theme to users'] = 'Forbyd dette tema til brugere';
@@ -578,7 +576,7 @@ $lang['Maximum width'] = 'Maksimal bredde';
$lang['pixels'] = 'pixels';
$lang['Maximum height'] = 'Maksimal højde';
$lang['Image Quality'] = 'Billedkvalitet ';
-$lang['Save Settings'] = 'Gem Indstillinger ';
+$lang['Save Settings'] = 'Gem indstillinger ';
$lang['Your configuration settings are saved'] = 'Din opsætning er gemt';
$lang['Active Themes'] = 'Aktive temaer';
$lang['Add write access to the "%s" directory'] = 'Tilføj skriveadgang til mappen "%s"';
@@ -630,7 +628,7 @@ $lang['Active Plugins'] = 'Aktive plugins ';
$lang['Inactive Plugins'] = 'Inaktive plugins ';
$lang['Missing Plugins'] = 'Manglende plugins';
$lang['Uninstalled Plugins'] = 'Afinstallerede plugins ';
-$lang['By %s'] = 'Ved %s';
+$lang['By %s'] = 'Af %s';
$lang['Visit plugin site'] = 'Besøg pluginwebstedet';
$lang['By rank'] = 'Efter bedømmelse';
$lang['Manual order'] = 'Manuel rækkefølge';
@@ -661,8 +659,8 @@ $lang['No photo in the current set.'] = 'Ingen fotografier i det aktuelle sæt.'
$lang['No photo selected, %d photos in current set'] = 'Ingen fotografier valgt, %d fotografier i nuværende sæt';
$lang['No photo selected, no action possible.'] = 'Ingen fotografier valgt, ingen mulige handlinger.';
$lang['No results'] = 'Ingen resultater';
-$lang['on the %d selected photos'] = 'på det %d valgte fotografi';
-$lang['Predefined filter'] = 'Foruddedineret filter';
+$lang['on the %d selected photos'] = 'på de %d valgte fotografier';
+$lang['Predefined filter'] = 'Foruddefineret filter';
$lang['Refresh photo set'] = 'Opfrisk fotosættet';
$lang['Remove all filters'] = 'Fjern alle filtre';
$lang['remove author'] = 'fjern forfatter';
@@ -745,7 +743,7 @@ $lang['Following plugins may not be compatible with the new version of Piwigo:']
$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'Følgende temaer er måske ikke kompatible med den nye version af Piwigo:';
$lang['Height'] = 'Højde';
$lang['hide details'] = 'skjul detaljer';
-$lang['Graphics Library'] = 'Graphics Library';
+$lang['Graphics Library'] = 'Grafikbibliotek';
$lang['I decide to update anyway'] = 'Jeg vil gerne opdatere alligevel';
$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'Hvis der ikke er HD tilgængelig, og hvis webstørrelsen er større end skaleringsdimensionerne, flytter Piwioi det som HD og danner en nedskaleret fotografi i webstørrelse af det.';
$lang['Ignore All'] = 'Ignorer alt';
@@ -794,7 +792,7 @@ $lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (rec
$lang['Zoom'] = 'Zoom';
$lang['Resize after upload'] = 'Størrelsesændring efter upload';
$lang['Original Size'] = 'Original størrelse';
-$lang['A locked gallery is only visible to administrators'] = 'Et låst gallery er kun synligt for administratorer';
+$lang['A locked gallery is only visible to administrators'] = 'Et låst galleri er kun synligt for administratorer';
$lang['Unlock gallery'] = 'LÃ¥s galleri op';
$lang['Gallery unlocked'] = 'Galleri er låst op';
$lang['Notify administrators when a comment is'] = 'Giv administratorer besked når en kommentar er';
@@ -857,7 +855,7 @@ $lang['apply automatic sort order'] = 'Aktiver automatisk sorteringsrækkefølge
$lang['cancel manual order'] = 'afbryd manuel rækkefølge';
$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam er et avanceret fri software-program til organisering af digitale fotografier til Linux, Windows og Mac OS X.';
$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam er designet til fotografer, der ønsker at se, organisere, redigere, optimere, indeksere og dele fotografier.';
-$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = 'App\'en <em>Piwigo for iOS</em> giver dig mulighed for at tilslutte en iPhone, iPad eller iPod Touch til dit Piwigo-galleri, oprette albummer og uploade flere fotografier på én gang.';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = 'App\'en <em>Piwigo for iOS</em> giver dig mulighed for at forbinde en iPhone, iPad eller iPod Touch til dit Piwigo-galleri, oprette albummer og uploade flere fotografier på én gang.';
$lang['Applications'] = 'Applikationer';
$lang['Available on'] = 'Tilgængelig på';
$lang['Available versions for'] = 'Tilgængelige versioner for';
@@ -868,7 +866,7 @@ $lang['visitors need to login and have the appropriate permissions to see this a
$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'Filstørrelsen på den uploadede fil overstiger MAX_FILE_SIZE-definitionen, som er angivet i HTML-formularen';
$lang['Multiple Size'] = 'Flere størrelser';
$lang['%u users have automatic permission because they belong to a granted group.'] = '%u brugere har automatisk tilladelse, fordi de tilhører en gruppe med tilladelser.';
-$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = 'App\'en <em>Piwigo for Android</em> giver dig mulighed for at tilslutte en Android-mobiltelelfon eller -tablet til dit Piwigo-galleri, oprette albummer og uploade flere fotografier på én gang.';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = 'App\'en <em>Piwigo for Android</em> giver dig mulighed for at forbinde en Android-mobiltelelfon eller -tablet med dit Piwigo-galleri, oprette albummer og uploade flere fotografier på én gang.';
$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Photoshop Lightroom er et fotografiprogram beregnet til at håndtere store mængder digitale billeder og foretage efterbehandling.';
$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture er et ydedygtigt værktøj til at forfine billeder og administrere store biblioteker på Mac.';
$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture er udviklet til professionelle fotografer med iPhoto-enkelhed.';
@@ -917,8 +915,8 @@ $lang['Rated %d times, score : %.2f'] = 'Bedømt %d gange, vurdering: %.2f';
$lang['Sharpen'] = 'Gør skarpere';
$lang['Visited %d times'] = 'Besøgt %d gange';
$lang['Watermark'] = 'Vandmærke';
-$lang[' and %d virtuals'] = 'og %d virtuel';
-$lang['%d physicals'] = ' %d fysisk';
+$lang[' and %d virtuals'] = ' og %d virtuelle';
+$lang['%d physicals'] = ' %d fysiske';
$lang['%d week'] = '%d uge';
$lang['%d weeks'] = '%d uger';
$lang['Edit photo'] = 'Rediger fotografi';
@@ -928,8 +926,6 @@ $lang['Duplicate selected tags'] = 'Kopier valgte tags';
$lang['Name of the duplicate'] = 'Navn på kopi';
$lang['Source tag'] = 'Kildetag';
$lang['Tag "%s" is now a duplicate of "%s"'] = 'Tagget "%s" er nu en kopi af "%s"';
-$lang['Format'] = 'Format';
-$lang['Invalid dimension'] = 'Ugyldig dimension';
$lang['Landscape'] = 'Landskab';
$lang['Minimum height'] = 'Minimal højde';
$lang['Minimum width'] = 'Minimal bredde';
@@ -939,8 +935,6 @@ $lang['The version of %s [%s] installed is not compatible with the version requi
$lang['Manage photos'] = 'HÃ¥ndter fotografier';
$lang['View in gallery'] = 'Se i galleri';
$lang['Number of albums per page'] = 'Antal albummer pr. side';
-$lang['Maximum'] = 'Maksimum';
-$lang['Minimum'] = 'Minimum';
$lang['Ratio'] = 'Faktor';
$lang['between %.2f and %.2f'] = 'mellem %.2f og %.2f';
$lang['between %d and %d pixels'] = 'mellem %d og %d pixels';
@@ -955,4 +949,32 @@ $lang['This group will be set to default'] = 'Denne gruppe vil blive opsat som s
$lang['This group will be unset to default'] = 'Denne gruppe vil ikke længere være opsat som standard';
$lang['Type here the name of the new group'] = 'Skriv navnet på den nye gruppe';
$lang['Purge user cache'] = 'Tøm brugercache';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'Billeddimensionerne vil blive reduceret til %dx%d pixels.';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'Størrelsesændring efter upload er deaktiveret, da grafikbiblioteket GD anvendes';
+$lang['Select at least one tag'] = 'Vælg mindst et tag';
+$lang['Basic settings'] = 'Grundlæggende indstillinger';
+$lang['General'] = 'Generelt';
+$lang['Mail theme'] = 'Mailtema';
+$lang['%d of %d users selected'] = '%d af %d brugere valgt';
+$lang['(filtered from %s total users)'] = '(filtreret fra totalt %s brugere)';
+$lang['All %d users are selected'] = 'Alle %d brugere er valgt';
+$lang['Change password'] = 'Ændring af adgangskode';
+$lang['Change username'] = 'Ændring af brugernavn';
+$lang['Last visit on %s, %s.'] = 'Seneste besøg kl. %s den %s.';
+$lang['Loading...'] = 'Indlæser ...';
+$lang['No matching user found'] = 'Ingen brugere fundet som opfylder kriteriet';
+$lang['No user selected of %d users'] = 'Ingen bruger valgt ud af %d brugere';
+$lang['No user selected, no action possible.'] = 'Ingen bruger valgt, ingen handling er mulig.';
+$lang['Password updated'] = 'Adgangskoden er opdateret';
+$lang['Registered on %s, %s.'] = 'Registreret kl. %s den %s.';
+$lang['Show %s users'] = 'Vis %s brugere';
+$lang['Showing %s to %s of %s users'] = 'Viser %s til %s af %s brugere';
+$lang['Update user'] = 'Opdatering af bruger';
+$lang['User %s added'] = 'Brugeren %s er tilføjet';
+$lang['User %s updated'] = 'Brugeren %s er opdateret';
+$lang['Users modified'] = 'Brugere ændret';
+$lang['on the %d selected users'] = 'på de %d valgte brugere';
+$lang['Close user details'] = 'Luk brugeroplysninger';
+$lang['Open user details'] = 'Ã…bn brugeroplysninger';
+$lang['close'] = 'luk';
?> \ No newline at end of file
diff --git a/language/da_DK/common.lang.php b/language/da_DK/common.lang.php
index 55fc0d6d6..be1fbf0e1 100644
--- a/language/da_DK/common.lang.php
+++ b/language/da_DK/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Dansk [DK]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=415
Author: Piwigo team
Author URI: http://piwigo.org
@@ -60,7 +60,7 @@ $lang['Album'] = 'Album';
$lang['Close this window'] = 'Luk dette vindue';
$lang['Complete RSS feed (photos, comments)'] = 'Komplet RSS-feed (fotografier, kommentarer)';
$lang['Confirm Password'] = 'Bekræft adgangskode';
-$lang['Connection settings'] = 'Loginindstillinger';
+$lang['Connection settings'] = 'Loginoplysninger';
$lang['Login'] = 'Log på';
$lang['Contact webmaster'] = 'Kontakt webmaster';
$lang['Create a new account'] = 'Opret en ny konto';
@@ -245,7 +245,6 @@ $lang['login mustn\'t end with a space character'] = 'login må ikke slutte med
$lang['login mustn\'t start with a space character'] = 'login må ikke begynde med mellemrum';
$lang['this login is already used'] = 'dette login er allerede i brug';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'mailadresse skal være på formen xxx@yyy.eee (eksempel: jack@altern.org)';
-$lang['please enter your password again'] = 'Indtast din adgangskode igen';
$lang['Auto login'] = 'Autologin';
$lang['remove this tag from the list'] = 'fjern dette tag fra listen';
$lang['representative'] = 'albums miniaturebillede';
@@ -273,10 +272,9 @@ $lang['SQL queries in'] = 'SQL-forespørgsler på';
$lang['display only recently posted photos'] = 'vis kun nyligt tilføjede fotografier';
$lang['return to the display of all photos'] = 'tilbage til alle fotoer';
$lang['the beginning'] = 'begyndelsen';
-$lang['Interface theme'] = 'Grænsefladetema';
$lang['Thumbnails'] = 'Miniaturebilleder';
$lang['Menu'] = 'Menu';
-$lang['A comment on your site'] = 'En kommentar på din side';
+$lang['A comment on your site'] = 'En kommentar vedrørende dit fotogalleri';
$lang['today'] = 'i dag';
$lang['Update your rating'] = 'Opdater din bedømmelse';
$lang['the username must be given'] = 'brugernavn skal angives';
@@ -415,4 +413,12 @@ $lang['Username is mandatory'] = 'Brugernavn er krævet';
$lang['mandatory'] = 'krævet';
$lang['Website'] = 'Websted';
$lang['Your website URL is invalid'] = 'Dit websteds URL er ugyldig';
+$lang['Email'] = 'E-mail';
+$lang['First Page'] = 'Første side';
+$lang['Go back to the album'] = 'GÃ¥ tilbage til albummet';
+$lang['Last Page'] = 'Sidste side';
+$lang['Password is missing. Please enter the password.'] = 'Adgangskoden mangler. Indtast adgangskoden.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Adgangskodebekræftelse mangler. Bekræft den valgte adgangskode.';
+$lang['%d photos per page'] = '%d fotografier pr. side';
+$lang['Theme'] = 'Tema';
?> \ No newline at end of file
diff --git a/language/da_DK/help/photos_add_ftp.html b/language/da_DK/help/photos_add_ftp.html
index fffeed2b4..ecac36763 100755
--- a/language/da_DK/help/photos_add_ftp.html
+++ b/language/da_DK/help/photos_add_ftp.html
@@ -4,7 +4,7 @@
<ol>
<li>Opret en mappe på din computer.</li>
- <li>Kopier nogle fotografier til mappen og ændr deres størrelser så de er velgende til webvisning. <em>Advarsel</em>: Navnet på mapperne og filerne må kun indeholde bogstaver, tal, "-", "_" eller ".". Ingen mellemrum eller accenttegn.</li>
+ <li>Kopier nogle fotografier til mappen og ændr deres størrelser så de er velegnede til webvisning. <em>Advarsel</em>: Navnet på mapperne og filerne må kun indeholde bogstaver, tal, "-", "_" eller ".". Ingen mellemrum eller accenttegn.</li>
<li>Med en ftp-klient kopieres mappen til "galleries"-mappen i din Piwigo-installation.</li>
@@ -30,10 +30,10 @@ galleries
|-- bryllup
| |-- fejring
| | |-- ankomst
-| | | |-- paul-alene.jpg
-| | | +-- sarah-alene.jpg
+| | | |-- mads-alene.jpg
+| | | +-- mette-alene.jpg
| | +-- afrejse
-| | +-- paul-og-sarah.jpg
+| | +-- mads-og-mette.jpg
| +-- fest
| |-- dansende001.jpg
| |-- dansende002.jpg
diff --git a/language/da_DK/index.php b/language/da_DK/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/da_DK/index.php
+++ b/language/da_DK/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/da_DK/install.lang.php b/language/da_DK/install.lang.php
index aa62bbd55..f20598967 100644
--- a/language/da_DK/install.lang.php
+++ b/language/da_DK/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -27,30 +27,24 @@ $lang['Default gallery language'] = 'Galleriets standardsprog';
$lang['Database configuration'] = 'Databaseopsætning';
$lang['Admin configuration'] = 'Admin-opsætning';
$lang['Start Install'] = 'Begynd installation';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'mailadresser skal være på formen xxx@yyy.eee (eksempel: jack@altern.org)';
-$lang['Webmaster login'] = 'Webmasters login';
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Det vil blive vist til de besøgende. Det er nødvendigt til administration af webstedet';
$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Forbindelsen til server er oprettet, men det var ikke muligt at få forbindelse til databasen';
$lang['Can\'t connect to server'] = 'Kan ikke få forbindelse til serveren';
$lang['Host'] = 'Host';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
$lang['User'] = 'Bruger';
$lang['user login given by your host provider'] = 'brugerlogin som du har fra din webhost';
-$lang['Password'] = 'Adgangskode';
$lang['user password given by your host provider'] = 'brugeradgangskode som du har fra din webhost';
$lang['Database name'] = 'Databasenavn';
$lang['also given by your host provider'] = 'som du også har fået af din webhost';
$lang['Database table prefix'] = 'Tabelpræfiks i databasen';
-$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'tabelnavne i databasen vil være fornynet med et præfiks (giver dig bedre mulighed for at administrere tabellerne)';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'tabelnavne i databasen vil være forsynet med et præfiks (giver dig bedre mulighed for at administrere tabellerne)';
$lang['enter a login for webmaster'] = 'indtast webmasters login';
$lang['webmaster login can\'t contain characters \' or "'] = 'webmasterlogin må ikke indeholde tegnene \' eller "';
$lang['please enter your password again'] = 'indtast din adgangskode igen';
-$lang['Webmaster password'] = 'Webmasters adgangskode';
$lang['Keep it confidential, it enables you to access administration panel'] = 'Hold det hemmeligt, det giver dig adgang til administrationspanelet.';
$lang['Password [confirm]'] = 'Password [bekræft]';
$lang['verification'] = 'bekræftelse';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Brug for hjælp? Stil dine spørgsmål i <a href="%s">Piwigos forum</a>.';
-$lang['Webmaster mail address'] = 'Webmasters mailadresse';
$lang['Visitors will be able to contact site administrator with this mail'] = 'Besøgende vil ved hjælp af denne e-mail have mulighed for at kontakte administratoren';
$lang['PHP 5 is required'] = 'PHP 5 er nødvendig';
$lang['It appears your webhost is currently running PHP %s.'] = 'Det lader til, at din webhost pt. kører PHP %s.';
@@ -68,9 +62,9 @@ $lang['Download the config file'] = 'Download opsætningsfilen';
$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Du kan downloade opsætningsfilen og uploade den til mappen local/config i din installation.';
$lang['Just another Piwigo gallery'] = 'Bare endnu et Piwigo-galleri';
$lang['Welcome to my photo gallery'] = 'Velkommen til mit fotogalleri';
-
$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Tøv ikke med at besøges vores forum for at få hjælp: %s';
$lang['Welcome to your new installation of Piwigo!'] = 'Velkommen til din nye Piwigo-installation';
$lang['Password ']['confirm'] = 'Adgangskode [bekræft]';
$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Du henvises til din webhosts support for at finde ud af, om du selv kan skifte til PHP 5.';
+$lang['localhost or other, supplied by your host provider'] = 'localhost eller andet, oplyst af din hostingleverandør';
?> \ No newline at end of file
diff --git a/language/da_DK/upgrade.lang.php b/language/da_DK/upgrade.lang.php
index 8f81a440c..1bc7d1922 100644
--- a/language/da_DK/upgrade.lang.php
+++ b/language/da_DK/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/de_DE/admin.lang.php b/language/de_DE/admin.lang.php
index fd06a74e3..666b286a5 100644
--- a/language/de_DE/admin.lang.php
+++ b/language/de_DE/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -191,7 +191,6 @@ $lang['Access type'] = 'Zugangsart';
$lang['Information data registered in database'] = 'Änderungen wurden gespeichert';
$lang['Default display'] = 'Standarddarstellung';
$lang['The gallery URL is not valid.'] = 'Die URL der Galerie ist falsch.';
-$lang['Main'] = 'Grundeinstellungen';
$lang['The number of comments a page must be between 5 and 50 included.'] = 'Die Anzahl der Kommentare pro Seite muss zwischen 5 und 50 liegen.';
$lang['Configuration'] = 'Konfiguration';
$lang['confirm'] = 'bestätigen';
@@ -225,7 +224,6 @@ $lang['Prepared time for list of users to send mail is limited. Others users are
$lang['Time to send mail is limited. Others mails are skipped.'] = 'Die Zeit zum E-Mail Versenden ist begrenzt. Nicht abgearbeitete E-Mails werden übersprungen';
$lang['To send ?'] = 'Info-E-Mail senden?';
$lang['Last send'] = 'Letzter Versand';
-$lang['email'] = 'E-Mail';
$lang['User'] = 'Benutzer';
$lang['See you soon,'] = 'Bis bald,';
$lang['Go to'] = 'Gehe zu ';
@@ -645,8 +643,7 @@ $lang['Impossible to deactivate this language, you need at least one language.']
$lang['Inactive Languages'] = 'Deaktivierte Sprachen';
$lang['Make this language available to users'] = 'Aktiviere diese Sprache für Benutzer';
$lang['Set as default language for unregistered and new users'] = 'Als Standardsprache für neue und unregistrierte Benutzer festlegen';
-$lang['delete'] = 'löschen
-';
+$lang['delete'] = 'löschen';
$lang['Add Photos'] = 'Fotos hinzufügen';
$lang['The following tag was deleted'] = 'Folgendes Schlagwort wurde gelöscht';
$lang['There is no other language available.'] = 'Es ist keine weitere Sprache verfügbar.';
@@ -930,8 +927,6 @@ $lang['Duplicate selected tags'] = 'Ausgewählte Schlagworte duplizieren';
$lang['Name of the duplicate'] = 'Name des Duplikats';
$lang['Source tag'] = 'Schlagwort Quelle';
$lang['Tag "%s" is now a duplicate of "%s"'] = 'Das Schlagwort "%s" ist jetzt ein Duplikat von "%s"';
-$lang['Format'] = 'Format';
-$lang['Invalid dimension'] = 'Ungültige Abmessungen';
$lang['Landscape'] = 'Quer-Format';
$lang['Minimum height'] = 'Minimum Höhe';
$lang['Minimum width'] = 'Minimum Breite';
@@ -940,8 +935,6 @@ $lang['Portrait'] = 'Hoch-Kant';
$lang['Manage photos'] = 'Fotos verwalten';
$lang['View in gallery'] = 'Gallerieansicht';
$lang['Number of albums per page'] = 'Anzahl der Alben pro Seite';
-$lang['Maximum'] = 'Maximum';
-$lang['Minimum'] = 'Minimum';
$lang['Ratio'] = 'Verhältnis';
$lang['between %.2f and %.2f'] = 'zwischen %.2f und %.2f';
$lang['between %d and %d pixels'] = 'zwischen %d und %d Pixel';
@@ -956,4 +949,32 @@ $lang['This group will be set to default'] = 'Diese Gruppe wird als Standard ver
$lang['This group will be unset to default'] = 'Dies Gruppe wird nicht länger als Standard verwendet';
$lang['Type here the name of the new group'] = 'Name der neuen Gruppe hier eingeben';
$lang['Purge user cache'] = 'Benutzer cache löschen';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'Die Bildgröße wird auf %dx%d Pixel reduziert.';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'Größenänderung nach hochladen deaktiviert, da die GD Library aktiviert ist. ';
+$lang['Select at least one tag'] = 'Wählen Sie mindesten einen Tag aus';
+$lang['Basic settings'] = 'Grundeinstellungen';
+$lang['General'] = 'Haupteinstellungen';
+$lang['Mail theme'] = 'Mail-Thema';
+$lang['%d of %d users selected'] = '%d von %d Benutzern ausgewählt';
+$lang['(filtered from %s total users)'] = '(von insgesamt %s Benutzern gefiltert)';
+$lang['All %d users are selected'] = 'Alle %d Benutzer sind ausgewählt';
+$lang['Change password'] = 'Passwort ändern';
+$lang['Change username'] = 'Benutzername ändern';
+$lang['Last visit on %s, %s.'] = 'Letzter Besuch am %s, %s.';
+$lang['Loading...'] = 'Lade...';
+$lang['No matching user found'] = 'Kein übereinstimmender Benutzer gefunden';
+$lang['No user selected of %d users'] = 'Kein Benutzer von %d Benutzern ausgewählt';
+$lang['No user selected, no action possible.'] = 'Kein Benutzer ausgewählt, keine Aktion möglich.';
+$lang['Password updated'] = 'Passwort geändert';
+$lang['Registered on %s, %s.'] = 'Registriert am %s, %s.';
+$lang['Show %s users'] = 'Zeige %s Benutzer';
+$lang['Showing %s to %s of %s users'] = 'Zeige %s bis %s von %s Benutzern';
+$lang['Update user'] = 'Aktualisiere Benutzer';
+$lang['User %s added'] = 'User %s hinzugefügt';
+$lang['User %s updated'] = 'User %s aktualisiert';
+$lang['Users modified'] = 'Benutzer geändert';
+$lang['on the %d selected users'] = 'der %d ausgewählten Benutzer';
+$lang['close'] = 'schließen';
+$lang['Close user details'] = 'Schließe Benutzerdetails';
+$lang['Open user details'] = 'Öffne Benutzerdetails';
?> \ No newline at end of file
diff --git a/language/de_DE/common.lang.php b/language/de_DE/common.lang.php
index c8618bb58..f0c1cfc07 100644
--- a/language/de_DE/common.lang.php
+++ b/language/de_DE/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Deutsch [DE]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=416
Author: Piwigo team
Author URI: http://piwigo.org
@@ -243,7 +243,6 @@ $lang['login mustn\'t end with a space character'] = 'Benutzername darf nicht mi
$lang['login mustn\'t start with a space character'] = 'Benutzername darf nicht mit einem Leerzeichen anfangen';
$lang['this login is already used'] = 'Dieser Benutzername ist bereits vergeben';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'E-Mail-Adresse muss dem Muster xxx@yyy.eee (Beispiel: jack@altern.org) entsprechen';
-$lang['please enter your password again'] = 'Bitte geben Sie erneut Ihr Passwort ein.';
$lang['Auto login'] = 'Auto-Login';
$lang['remove this tag from the list'] = 'Entferne dieses Schlagwort von der Liste.';
$lang['representative'] = 'Album-Vorschaubild';
@@ -271,7 +270,6 @@ $lang['SQL queries in'] = 'SQL-Abfragen in';
$lang['display only recently posted photos'] = 'Zeige nur kürzlich eingestellte Fotos';
$lang['return to the display of all photos'] = 'Zurück zu allen Fotos';
$lang['the beginning'] = 'Beginn';
-$lang['Interface theme'] = 'Galerie-Layout';
$lang['Thumbnails'] = 'Vorschaubilder';
$lang['Menu'] = 'Menü';
$lang['A comment on your site'] = 'Ein Kommentar auf Ihrer Website';
@@ -413,4 +411,12 @@ $lang['Username is mandatory'] = 'Benutzername ist erforderlich';
$lang['mandatory'] = 'erforderlich';
$lang['Website'] = 'Webseite';
$lang['Your website URL is invalid'] = 'Deine Webseiten URL ist falsch';
+$lang['Email'] = 'E-Mail';
+$lang['First Page'] = 'Erste Seite';
+$lang['Go back to the album'] = 'Zurück zum Album';
+$lang['Last Page'] = 'Letzte Seite';
+$lang['Password is missing. Please enter the password.'] = 'Das Kennwort fehlt. Bitte geben Sie Ihr Kennwort ein.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Das Kennwort zum Überprüfen fehlt. Bitte geben Sie ihr gewähltes Kennwort noch einmal ein.';
+$lang['%d photos per page'] = '%d Bilder pro Seite';
+$lang['Theme'] = 'Thema';
?> \ No newline at end of file
diff --git a/language/de_DE/help/index.php b/language/de_DE/help/index.php
index 10b477c03..c8de97f60 100644
--- a/language/de_DE/help/index.php
+++ b/language/de_DE/help/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2009 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/de_DE/index.php b/language/de_DE/index.php
index 10b477c03..c8de97f60 100644
--- a/language/de_DE/index.php
+++ b/language/de_DE/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2009 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/de_DE/install.lang.php b/language/de_DE/install.lang.php
index 31d93b8a1..110d59799 100644
--- a/language/de_DE/install.lang.php
+++ b/language/de_DE/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -27,19 +27,12 @@ $lang['Default gallery language'] = 'Standardsprache der Galerie';
$lang['Database configuration'] = 'Konfiguration der Datenbank';
$lang['Admin configuration'] = 'Konfiguration des Administrator-Accounts';
$lang['Start Install'] = 'Start der Installation';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'Die E-Mail-Adresse muss dem Muster xxx@yyy.eee (Beispiel: jack@altern.org) entsprechen.';
-
-$lang['Webmaster login'] = 'Webmaster-Login';
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Benutzername des Administrators';
-
$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Eine Verbindung zum Server konnte hergestellt werden, nicht aber zur Datenbank.';
$lang['Can\'t connect to server'] = 'Es konnte keine Verbindung zum Datenbankserver aufgebaut werden.';
-
$lang['Host'] = 'MySQL-Host';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
$lang['User'] = 'Benutzer';
$lang['user login given by your host provider'] = 'Benutzername Ihrer MySQL-Datenbank (wie von Ihrem Hosting-Provider angegeben)';
-$lang['Password'] = 'Passwort';
$lang['user password given by your host provider'] = 'Passwort Ihrer MySQL-Datenbank (wie von Ihrem Hosting-Provider angegeben)';
$lang['Database name'] = 'Name der Datenbank';
$lang['also given by your host provider'] = 'ebenso von Ihrem Host-Provider bereitgestellt';
@@ -48,14 +41,11 @@ $lang['database tables names will be prefixed with it (enables you to manage bet
$lang['enter a login for webmaster'] = 'Geben Sie einen Benutzernamen für den Webmaster an';
$lang['webmaster login can\'t contain characters \' or "'] = 'Der Benutzername des Webmasters darf nicht die Zeichen \' und " enthalten';
$lang['please enter your password again'] = 'Bitte geben Sie Ihr Passwort erneut ein';
-$lang['Webmaster password'] = 'Webmaster-Passwort';
$lang['Keep it confidential, it enables you to access administration panel'] = 'Administrator-Passwort';
$lang['Password [confirm]'] = 'Passwort [Bestätigung]';
$lang['verification'] = 'Wiederholen Sie das eingegebene Passwort';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Brauchen Sie Hilfe? Stellen Sie Ihre Fragen im <a href="%s"> Piwigo-Forum</ a>.';
-$lang['Webmaster mail address'] = 'Webmaster-E-Mail-Adresse';
$lang['Visitors will be able to contact site administrator with this mail'] = 'Kontakt-E-Mail-Adresse (nur für angemeldete Benutzer sichtbar)';
-
$lang['PHP 5 is required'] = 'PHP5 ist erforderlich';
$lang['It appears your webhost is currently running PHP %s.'] = 'Warscheinlich läuft auf Ihrem Server die PHP-Version %s.';
$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo wird versuchen, Ihre Konfiguration auf PHP5 umzustellen. Zu diesem Zweck wird eine .htaccess-Datei erstellt oder geändert.';
@@ -65,9 +55,7 @@ $lang['Sorry!'] = 'Sorry!';
$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo ist nicht in der Lage PHP5 zu konfigurieren.';
$lang["You may referer to your hosting provider's support and see how you could switch to PHP 5 by yourself."] = "Sie können Kontakt zu ihrem Hosting-Provider aufnehmen und um Unterstützung bitten zur Umstellung auf PHP 5.";
$lang['Hope to see you back soon.'] = 'Hoffentlich sehen wir uns bald wieder!';
-
$lang['Congratulations, Piwigo installation is completed'] = 'Glückwunsch! Sie haben Piwigo erfolgreich installiert.';
-
$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Sie können auch den Text in der Box unten kopieren und in die Datei local/config/database.inc.php einfügen. (Warnung: database.inc.php darf nur den reinen Text ohne Zeilenumbrüche und Leerzeichen enthalten.)';
$lang['Creation of config file local/config/database.inc.php failed.'] = 'Die Erstellung der Datei local/config/database.inc.php ist fehlgeschlagen.';
$lang['Download the config file'] = 'Lade die Konfigurationsdatei herunter';
@@ -77,4 +65,5 @@ $lang['Welcome to my photo gallery'] = 'Willkommen!';
$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Besuchen Sie unser Forum, wenn Sie Hilfe benötigen: %s';
$lang['Welcome to your new installation of Piwigo!'] = 'Ihre neue Piwigo-Installation heißt sie willkommen!';
$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Sie können Kontakt mit Ihrem Provider aufnehmen und um Unterstützung bei der Umstellung auf PHP5 bitten.';
+$lang['localhost or other, supplied by your host provider'] = 'Local Host oder andere, bereit gestellt von deinem Provider.';
?> \ No newline at end of file
diff --git a/language/de_DE/upgrade.lang.php b/language/de_DE/upgrade.lang.php
index 531faeec3..25e8c4710 100644
--- a/language/de_DE/upgrade.lang.php
+++ b/language/de_DE/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/dv_MV/common.lang.php b/language/dv_MV/common.lang.php
index 7d19db0e7..c5d6cc8da 100644
--- a/language/dv_MV/common.lang.php
+++ b/language/dv_MV/common.lang.php
@@ -1,8 +1,8 @@
<?php
// +-----------------------------------------------------------------------+
-// | Piwigo - a PHP based picture gallery |
+// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/dv_MV/index.php b/language/dv_MV/index.php
index 17747c927..c8de97f60 100644
--- a/language/dv_MV/index.php
+++ b/language/dv_MV/index.php
@@ -1,8 +1,8 @@
<?php
// +-----------------------------------------------------------------------+
-// | Piwigo - a PHP based picture gallery |
+// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2010 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/el_GR/admin.lang.php b/language/el_GR/admin.lang.php
index 01788e21d..f30047c0e 100644
--- a/language/el_GR/admin.lang.php
+++ b/language/el_GR/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -328,7 +328,6 @@ $lang['directories + files'] = 'κατάλογοι + αÏχεία';
$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'εμφανίζονται μέγιστες πληÏοφοÏίες (λευκώματα που Ï€Ïοστέθηκαν και φωτογÏαφίες, διαγÏαμένα λευκώματα και φωτογÏαφίες)';
$lang['display'] = 'Εμφάνιση';
$lang['dissociate from group'] = 'Αποσυνδέστε από την ομάδα';
-$lang['email'] = 'ΗλεκτÏονικό ταχυδÏομείο';
$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'ΣΦΑΛΜΑ: ΑΥΤΟ ΤΟ ΠΡΟΣΘΕΤΟ ΛΕΙΠΕΙ ΑΛΛΑ ΕΙÎΑΙ ΕΓΚΑΤΕΣΤΗΜΕÎΟ! ΑΠΕΓΚΑΤΑΣΤΗΣΤΕ ΤΩΡΑ.';
$lang['ERROR'] = 'ΣΦΑΛΜΑ';
$lang['Errors caption'] = 'Λάθος λεζάντες';
@@ -446,7 +445,6 @@ $lang['Main "guest" user status is incorrect'] = 'Η κατάσταση κÏÏι
$lang['Main "webmaster" user does not exist'] = 'Ο κÏÏιος χÏήστης "webmaster" δεν υπάÏχει';
$lang['Main "webmaster" user status is incorrect'] = 'H κατάσταση του κÏÏιου χÏήστη "webmaster" είναι εσφαλμένη';
$lang['Main Page'] = 'ΑÏχική σελίδα';
-$lang['Main'] = 'Ï€ÏωτεÏων';
$lang['Maintenance'] = 'ΣυντήÏηση';
$lang['Make this language available to users'] = 'Κάντε αυτή η γλώσσα διαθέσημη στους χÏήστες';
$lang['Make this theme available to users'] = 'Κάντε αυτό το θέμα διαθέσημο στους χÏήστες';
@@ -934,14 +932,10 @@ $lang['Panorama'] = 'ΠανοÏαμικό';
$lang['Minimum width'] = 'Ελάχιστο πλάτος';
$lang['Minimum height'] = 'Ελάχιστο Ïψος';
$lang['Landscape'] = 'ΚατακόÏυφα';
-$lang['Invalid dimension'] = 'Μη έγκυÏες διαστάσεις';
-$lang['Format'] = 'ΜοÏφή';
$lang['View in gallery'] = 'Δείτε στην γκαλεÏί';
$lang['Manage photos'] = 'ΔιαχειÏιστείτε τις φωτογÏαφίες';
$lang['Number of albums per page'] = 'ΑÏιθμός λευκωμάτων ανά σελίδα';
$lang['Ratio'] = 'Αναλογία';
-$lang['Minimum'] = 'Ελάχιστο';
-$lang['Maximum'] = 'Μέγιστο';
$lang['between %d and %d pixels'] = 'Î¼ÎµÏ„Î±Î¾Ï %d και %d πίξελ';
$lang['between %.2f and %.2f'] = 'Î¼ÎµÏ„Î±Î¾Ï %.2f και %.2f';
$lang['Type here the name of the new group'] = 'ΠληκτÏολογήστε εδώ το όνομα της νέας ομάδας';
@@ -955,4 +949,32 @@ $lang['Merge selected groups'] = 'Συγχώνευση επιλεγμένων ο
$lang['Duplicate'] = 'Διπλότυπο';
$lang['Manage the members'] = 'ΔιαχειÏιστείτε τα μέλη';
$lang['Purge user cache'] = 'ΕκκαθάÏιση cache χÏήστη';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'Το μέγεθος της εικόνας θα μικÏίνει κατα %dx%d pixels.';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'Η Αλλαγή μεγέθους μετά τη μεταφόÏτωση έχει απενεÏγοποιηθεί λόγω της χÏήσης της βιβλιοθήκης γÏαφικών GD ';
+$lang['Select at least one tag'] = 'Επιλέξτε τουλάχιστον μια ετικέτα. ';
+$lang['Mail theme'] = 'Θέμα Mail';
+$lang['General'] = 'Γενικά';
+$lang['Basic settings'] = 'Βασικές Ïυθμίσεις';
+$lang['on the %d selected users'] = 'σχετικά με τους %d επιλεγμένους χÏήστες';
+$lang['Users modified'] = 'Οι χÏήστες Ï„Ïοποποιήθηκαν';
+$lang['User %s updated'] = 'Ο ΧÏήστης %s ενημεÏώθηκε';
+$lang['User %s added'] = 'Ο χÏήστης %s Ï€Ïοστέθηκε';
+$lang['Update user'] = 'ΕνημέÏωση χÏήστη';
+$lang['Showing %s to %s of %s users'] = 'Εμφάνιση από %s ως %s των %s χÏηστών';
+$lang['Show %s users'] = 'Εμφάνιση %s χÏηστών';
+$lang['Registered on %s, %s.'] = 'ΕγγεγÏαμμένοι στις %s, %s.';
+$lang['Password updated'] = 'Ο κωδικό Ï€Ïόσβασης ενημεÏώθηκε';
+$lang['No user selected, no action possible.'] = 'Κανένας χÏήστης δεν επιλέχτηκε, καμία ενέÏγεια δεν είναι δυνατή.';
+$lang['No user selected of %d users'] = 'Κανένας χÏήστης δεν επιλέχτηκε από %d χÏήστες';
+$lang['No matching user found'] = 'Δεν βÏέθηκε χÏήστης';
+$lang['Loading...'] = 'ΦόÏτωση ...';
+$lang['Last visit on %s, %s.'] = 'Τελευταία επίσκεψη στο %s, %s.';
+$lang['Change username'] = 'Αλλαγή ονόματος χÏήστη';
+$lang['Change password'] = 'Αλλαγή ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης';
+$lang['All %d users are selected'] = 'Όλοι οι %d χÏήστες επιλέχτηκαν';
+$lang['(filtered from %s total users)'] = '(φιλτÏαÏισμένο από %s σÏνολο των χÏηστών)';
+$lang['%d of %d users selected'] = '%d από %d επιλεγμένους χÏήστες';
+$lang['close'] = 'κλείσιμο ';
+$lang['Open user details'] = 'Άνοιγμα ΛεπτομεÏιών χÏήστη';
+$lang['Close user details'] = 'Κλείστε τα στοιχεία χÏήστη';
?> \ No newline at end of file
diff --git a/language/el_GR/common.lang.php b/language/el_GR/common.lang.php
index 1f6593306..64b526804 100644
--- a/language/el_GR/common.lang.php
+++ b/language/el_GR/common.lang.php
@@ -1,6 +1,6 @@
<?php
// +-----------------------------------------------------------------------+
-// | Piwigo - a PHP based picture gallery |
+// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
// | Copyright(C) 2008-2010 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Ελληνικά [GR]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=508
Author: Piwigo team
Author URI: http://piwigo.org
@@ -100,7 +100,6 @@ $lang['login mustn\'t end with a space character'] = "το όνομα χÏήστ
$lang['login mustn\'t start with a space character'] = "το όνομα χÏήστη δεν Ï€Ïέπει να ξεκινάει με κενό";
$lang['this login is already used'] = "αυτό το όνομα χÏήστη χÏησιμοποιείται ήδη";
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = "η διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου Ï€Ïέπει να είναι της μοÏφής xxx@yyy.eee (παÏάδειγμα: jack@altern.org)";
-$lang['please enter your password again'] = "παÏακαλώ εισάγετε το κωδικό σας ξανά";
$lang['Auto login'] = "Αυτόματη σÏνδεση";
$lang['remove this tag from the list'] = "αφαίÏεση ετικέτας από τη λίστα";
$lang['representative'] = "αντιπÏοσωπευτική";
@@ -128,7 +127,6 @@ $lang['SQL queries in'] = 'ΕÏωτήματα SQL στη';
$lang['display only recently posted photos'] = "Ï€Ïοβολή μόνο Ï€Ïόσφατα αναÏτηθέντων φωτογÏαφιών";
$lang['return to the display of all photos'] = "επιστÏοφή στην Ï€Ïοβολή όλων των φωτογÏαφιών";
$lang['the beginning'] = "αÏχή";
-$lang['Interface theme'] = "Στυλ εμφάνισης";
$lang['Thumbnails'] = 'ΜικÏογÏαφίες';
$lang['Menu'] = "ΜενοÏ";
$lang['display a calendar by creation date'] = 'Ï€Ïοβολή ημεÏολογίου κατά ημέÏα λήψης';
@@ -413,4 +411,12 @@ $lang['Username is mandatory'] = 'Το όνομα χÏήστη είναι υπο
$lang['Email address is mandatory'] = 'Η διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου είναι υποχÏεωτική';
$lang['Your website URL is invalid'] = 'Το URL της ιστοσελίδας δεν είναι έγκυÏο';
$lang['Website'] = 'Ιστοσελίδα';
+$lang['Email'] = 'Email';
+$lang['Last Page'] = 'Τελευταία Σελίδα';
+$lang['Go back to the album'] = 'ΕπιστÏοφή Στο ΛεÏκωμα';
+$lang['First Page'] = 'ΑÏχική Σελίδα';
+$lang['Password is missing. Please enter the password.'] = 'Κωδικός λείπει. ΠαÏακαλώ εισάγετε τον κωδικό Ï€Ïόσβασης.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Η επιβεβαίωση ÎºÏ‰Î´Î¹ÎºÎ¿Ï Î»ÎµÎ¯Ï€ÎµÎ¹. Επιβεβαιώστε τον επιλεγμένο κωδικό Ï€Ïόσβασης';
+$lang['Theme'] = 'Θέμα';
+$lang['%d photos per page'] = '%d φωτογÏαφίες ανά σελίδα';
?> \ No newline at end of file
diff --git a/language/el_GR/index.php b/language/el_GR/index.php
index 17747c927..c8de97f60 100644
--- a/language/el_GR/index.php
+++ b/language/el_GR/index.php
@@ -1,8 +1,8 @@
<?php
// +-----------------------------------------------------------------------+
-// | Piwigo - a PHP based picture gallery |
+// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2010 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/el_GR/install.lang.php b/language/el_GR/install.lang.php
index c17406bed..b74925355 100644
--- a/language/el_GR/install.lang.php
+++ b/language/el_GR/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,18 +21,14 @@
// | USA. |
// +-----------------------------------------------------------------------+
-
-
$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = "τα ονόματα των πινάκων της βάσης δεδομένων θα πάÏουν αυτό το Ï€Ïόθεμα (σας επιτÏέπει να διαχειÏίζεστε τους πίνακες σας καλÏτεÏα)";
$lang['enter a login for webmaster'] = "Εισάγετε ένα όνομα χÏήστη για τον webmaster";
$lang['webmaster login can\'t contain characters \' or "'] = "Το όνομα χÏήστη δεν μποÏεί να πεÏιέχει τους χαÏακτήÏες ' ή \"";
$lang['please enter your password again'] = "ΠαÏακαλώ εισάγετε τον κωδικό πάλι";
-$lang['Webmaster password'] = "Ο κωδικός του Webmaster";
$lang['Keep it confidential, it enables you to access administration panel'] = "ΚÏατήστε το εμπιστευτικό, επιτÏέπει να έχετε Ï€Ïόσβαση σε πίνακα διαχείÏισης";
$lang['Password [confirm]'] = "Κωδικός [επιβεβαίωση]";
$lang['verification'] = "Επιβεβαίωση";
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = "ΧÏειάζεστε βοήθεια; Ρωτήστε στο <a href=\"%s\">Πίνακα μηνυμάτων του Piwigo</a>.";
-$lang['Webmaster mail address'] = "ΔιεÏθυνση ταχυδÏομείου του Webmaster";
$lang['Visitors will be able to contact site administrator with this mail'] = "Οι επισκέπτες θα μποÏοÏν να χÏησιμοποιήσουν αυτό το email για να επικοινωνήσουν με τον διαχειÏιστή του site";
$lang['PHP 5 is required'] = "Aπαιτείτε PHP 5";
$lang['It appears your webhost is currently running PHP %s.'] = "Φαίνετται ότι ο webhost Ï„ÏŽÏα Ï„Ïέχει PHP %s.";
@@ -50,9 +46,6 @@ $lang['Download the config file'] = 'Κατέβασμα του αÏχείου δ
$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'ΜποÏείς να κατεβάσεις το αÏχείο διαμόÏφωσης και να το ανεβάσεις στο local/config κατάλογο της εγκατάστασης σου.';
$lang['Just another Piwigo gallery'] = 'Ακόμα μια γκαλεÏί Piwigo';
$lang['Welcome to my photo gallery'] = 'Καλώς ήλθατε στη φωτογÏαφική μου γκαλεÏί';
-
-
-
$lang['Admin configuration'] = 'Ρυθμίσεις ΔιαχειÏιστή της ιστοσελίδας';
$lang['Basic configuration'] = 'Βασικές διαμόÏφωση';
$lang['Can\'t connect to server'] = 'Δεν είναι δυνατή η σÏνδεση με τον διακομιστή';
@@ -65,14 +58,11 @@ $lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Μην διÏ
$lang['Host'] = 'διακομιστήw υποδοχής';
$lang['Installation'] = 'Εγκατάσταση';
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Έτσι Θα δείχνει στους επισκέπτες. Είναι απαÏαίτητο για την διαχείÏιση της ιστοσελίδας';
-$lang['Password'] = 'Κωδικός Ï€Ïοσβασης';
$lang['Start Install'] = 'Ξεκινήστε την εγκατάσταση';
$lang['User'] = 'ΧÏήστης';
-$lang['Webmaster login'] = 'ΣÏνδεση ΥπεÏθυνου';
$lang['Welcome to your new installation of Piwigo!'] = 'Καλώς ήÏθατε στην νέα σας εγκατάσταση του Piwigo!';
$lang['also given by your host provider'] = 'Επίσης, δίνεται από την εταιÏία φιλοξενίας σας';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'Η διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου Ï€Ïέπει να είναι σαν xxx@yyy.eee (παÏάδειγμα: jack@altern.org)';
$lang['user login given by your host provider'] = 'Όνομα χÏήστη που έχει λάβει από το φοÏέα υποδοχής σας';
$lang['user password given by your host provider'] = 'Κωδικός Ï€Ïοσβασης χÏήστη που έχει λάβει από το φοÏέα υποδοχής σας';
+$lang['localhost or other, supplied by your host provider'] = 'localhost ή άλλο, που σας παÏέχεται από τον πάÏοχο φιλοξενίας σας';
?> \ No newline at end of file
diff --git a/language/el_GR/upgrade.lang.php b/language/el_GR/upgrade.lang.php
index 5782ebbfb..29b96352d 100755
--- a/language/el_GR/upgrade.lang.php
+++ b/language/el_GR/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/en_GB/about.html b/language/en_GB/about.html
new file mode 100644
index 000000000..305fef1a6
--- /dev/null
+++ b/language/en_GB/about.html
@@ -0,0 +1,5 @@
+<p>This photo gallery is based on Piwigo.</p>
+
+<p>Piwigo is photo gallery software for the web, built by an active community of users and developers. Extensions make Piwigo easily customisable. And, for icing on the cake, Piwigo is free and opensource.</p>
+
+<p id="linkToPiwigo"><a href="http://piwigo.org">Visit the Piwigo website</a></p> \ No newline at end of file
diff --git a/language/en_GB/admin.lang.php b/language/en_GB/admin.lang.php
new file mode 100644
index 000000000..26d69000e
--- /dev/null
+++ b/language/en_GB/admin.lang.php
@@ -0,0 +1,148 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['(this tag will be deleted)'] = '(this keyword will be deleted)';
+$lang['Add a criteria'] = 'Add a criterion';
+$lang['add new photos to caddie'] = 'add new photos to basket';
+$lang['Add to caddie'] = 'Add to basket';
+$lang['albums added in the database'] = "albums added to the database";
+$lang['Albums authorized thanks to group associations'] = "Albums authorised by group association";
+$lang['All optimizations have been successfully completed.'] = "All optimisations have been successfully completed.";
+$lang['Allow user customization'] = 'Allow user customisation';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = "Are you sure you want to install this upgrade? You must check if this version needs prior uninstallation.";
+$lang['Authorize users to add comments on selected albums'] = "Authorise users to add comments on selected albums";
+$lang['Authorized'] = "Authorised";
+$lang['Caddie management'] = 'Basket management';
+$lang['Caddie'] = 'Basket';
+$lang['Complementary mail content'] = "Extra mail content";
+$lang['Database synchronization with files'] = 'Database synchronisation with files';
+$lang['Does not represent'] = "Is not thumbnail for";
+$lang['Duplicate selected tags'] = 'Duplicate selected keywords';
+$lang['Edit selected tags'] = "Edit selected keywords";
+$lang['Edit tags'] = "Edit keyword";
+$lang['Errors caption'] = "Error legend";
+$lang['errors during synchronization'] = "errors during synchronisation";
+$lang['even already synchronized photos'] = "including already synchronised photos";
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = "Permitted execution time exceeded, operation will continue [Estimated time: %d seconds].";
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'The following plugins may not be compatible with the new version of Piwigo:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'The following themes may not be compatible with the new version of Piwigo:';
+$lang['FTP + Synchronization'] = 'FTP + Synchronisation';
+$lang['Group management'] = "Group management";
+$lang['I decide to update anyway'] = 'I choose to update anyway';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'This theme cannot be deleted because other themes depend on it: %s';
+$lang['Instructions to use Piwigo'] = "How to use Piwigo";
+$lang['Last hit'] = "Latest hit";
+$lang['Last import'] = 'Latest import';
+$lang['Last revisions'] = "Latest revisions";
+$lang['Last send'] = "Latest send";
+$lang['Link all album photos to some existing albums'] = "Link all album photos to some existing album";
+$lang['Manage tags'] = 'Manage keywords';
+$lang['Manage the members'] = 'Manage members';
+$lang['Merge selected tags'] = 'Merge selected keywords';
+$lang['Merge tags'] = 'Merge keywords';
+$lang['Metadata synchronization results'] = "Metadata synchronisation results";
+$lang['Metadata synchronized from file'] = "Metadata synchronised from file";
+$lang['only perform a simulation (no change in database will be made)'] = "perform a simulation only (nothing will be changed in the database)";
+$lang['Operation in progress'] = 'Operation in progress.';
+$lang['Optimizations have been completed with some errors.'] = "Optimisations have been completed with some errors.";
+$lang['Orphan tags deleted'] = 'Orphan keywords deleted';
+$lang['Photo informations updated'] = "Photo information updated";
+$lang['photos added in the database'] = "photos added to the database";
+$lang['photos candidates for metadata synchronization'] = "candidate photos for metadata synchronisation";
+$lang['photos informations synchronized with files metadata'] = "photo information synchronised with file metadata";
+$lang['Purge never used notification feeds'] = "Purge unused notification feeds";
+$lang['Quick Local Synchronization'] = 'Quick local synchronisation';
+$lang['reduce to single existing albums'] = "reduce to single existing album";
+$lang['Reinitialize check integrity'] = "Reinitialise integrity check";
+$lang['Remove from caddie'] = 'Remove from basket';
+$lang['remove tags'] = 'Remove keywords';
+$lang['Repair and optimize database'] = "Repair and optimise database";
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = "Replacement of original templates by customised templates from the template-extension subfolder";
+$lang['Replacers (customized templates)'] = "Substitutes (customised templates)";
+$lang['Select at least two tags for merging'] = 'Select at least two keywords for merging';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = "Subscribers listed (available) only if there are new elements to notify.";
+$lang['synchronize files metadata with database photos informations'] = "synchronise database photos with file metadata";
+$lang['synchronize files structure with database'] = "synchronise file structure with database";
+$lang['Synchronize metadata'] = "Synchronise metadata";
+$lang['Synchronize'] = "Synchronise";
+$lang['Tag "%s" already exists'] = "Keyword \"%s\" already exists";
+$lang['Tag "%s" is now a duplicate of "%s"'] = "Keyword \"%s\" is now a duplicate of \"%s\"";
+$lang['Tag "%s" was added'] = "Keyword \"%s\" has been added";
+$lang['Tag selection'] = "Keyword selection";
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Keywords <em>%s</em> merged into keyword <em>%s</em>';
+$lang['The %d following tags were deleted'] = "The following %d keywords have been deleted";
+$lang['The anomaly will be ignored until next application version'] = "The anomaly will be ignored until the next version of the application";
+$lang['The following tag was deleted'] = 'The following keyword was deleted';
+$lang['The number of comments a page must be between 5 and 50 included.'] = "The number of comments on a page must be between 5 and 50 inclusive.";
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = "The webmaster has added you to the mail notification list.";
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = "The webmaster has removed you from the list for receiving notifications by mail.";
+$lang['There is no available subscribers to mail.'] = "There are no subscribers to be notified by mail.";
+$lang['Thumbnails generation in progress...'] = 'Thumbnail generation in progress...';
+$lang['Time to send mail is limited. Others mails are skipped.'] = "The maximum time for sending mail has been exceeded. Remaining emails have been skipped.";
+$lang['Update albums informations'] = "Update album information";
+$lang['Update photos information'] = "Update photo information";
+$lang['User list'] = "User list";
+$lang['Virtual albums to move'] = "Virtual albums to be moved";
+$lang['With no tag'] = 'With no keyword';
+$lang['You are running on development sources, no check possible.'] = "You are running a development version, no check possible.";
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter is deprecated, please remove it or rename it to <i>$conf[\'order_by_custom\']</i> !';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = "Please upgrade your system to take full advantage of the application, otherwise it might work improperly, or not at all";
+
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam is designed for photographers who want to view, manage, edit, enhance, organise, tag, and share photographs.';
+$lang['You have %d orphan tags: %s.'] = 'You have %d orphan keywords: %s.';
+$lang['Source tag'] = 'Source keyword';
+$lang['Select the destination tag'] = 'Select the destination keyword';
+$lang['Select at least one tag'] = 'Select at least one keyword';
+$lang['No destination tag selected'] = 'No destination keyword selected';
+$lang['New tag'] = 'New keyword';
+$lang['Delete orphan tags'] = 'Delete orphan keywords';
+$lang['Delete selected tags'] = 'Deleted selected keywords';
+$lang['Add tags'] = 'Add keywords';
+$lang['Add a tag'] = 'Add a keyword';
+$lang['%d albums including'] = '%d albums included';
+$lang['%d album including'] = '%d album included';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'The Piwigo publish Plug-in allows you to export and synchronise photos from Lightroom directly to your Piwigo photo gallery.';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell is an open source digital photo organiser that runs on Linux. It is the default photo manager in Ubuntu and Fedora.';
+$lang['Select a zone with your mouse to define a new center of interest.'] = 'Select a zone with your mouse to define a new centre of interest.';
+$lang['Save Settings'] = 'Save settings';
+$lang['Read Piwigo Documentation'] = 'Read Piwigo documentation';
+$lang['New Version'] = 'New version';
+$lang['Missing Plugins'] = 'Missing plugins';
+$lang['Manage Permissions'] = 'Manage permissions';
+$lang['Manage authorizations for selected albums'] = 'Manage authorisations for selected albums';
+$lang['Installed Languages'] = 'Installed languages';
+$lang['Installed Themes'] = 'Installed themes';
+$lang['Inactive Languages'] = 'Inactive languages';
+$lang['Inactive Plugins'] = 'Inactive themes';
+$lang['Ignore All'] = 'Ignore all';
+$lang['Follow Orientation'] = 'Follow orientation ';
+$lang['Dump Database'] = 'Dump database';
+$lang['Center of interest'] = 'Centre of interest';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = 'By default, the centre of interest is placed in the middle of the photo.';
+$lang['Active Themes'] = 'Active themes';
+$lang['Add New Language'] = 'Add a new language';
+$lang['Active Languages'] = 'Active languages';
+$lang['Active Plugins'] = 'Active plugins';
+?> \ No newline at end of file
diff --git a/language/en_GB/common.lang.php b/language/en_GB/common.lang.php
new file mode 100644
index 000000000..2098c1d9c
--- /dev/null
+++ b/language/en_GB/common.lang.php
@@ -0,0 +1,70 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: English [GB]
+Version: 2.6.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=716
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+$lang_info['language_name'] = "English";
+$lang_info['country'] = "Great Britain";
+$lang_info['direction'] = "ltr";
+$lang_info['code'] = "en";
+$lang_info['zero_plural'] = true;
+$lang_info['parent']= "en_UK";
+
+$lang['%d photo is also linked to current tags'] = "%d photo is also linked to current keywords";
+$lang['%d photos are also linked to current tags'] = "%d photos are also linked to current keywords";
+$lang['add this photo to your favorites'] = "add this photo to your favourites";
+$lang['All tags'] = "All keywords";
+$lang['About Piwigo'] = "About this website";
+$lang['An administrator must authorize your comment before it is visible.'] = "An administrator must authorise your comment before it becomes visible.";
+$lang['Any tag'] = "Any keyword";
+$lang['customize the appareance of the gallery'] = "customise the look of the gallery";
+$lang['Customize'] = "Customise";
+$lang['delete all photos from your favorites'] = "delete all photos from your favourites";
+$lang['delete this photo from your favorites'] = "delete this photo from your favourites";
+$lang['Favorites'] = "Favourites";
+$lang['display available tags'] = "display available keywords";
+$lang['display photos linked to this tag'] = "display photos linked to this keyword";
+$lang['Related tags'] = "Related keywords";
+$lang['remove this tag from the list'] = "remove this keyword from the list";
+$lang['Requested tag does not exist'] = 'Requested keyword does not exist';
+$lang['Search tags'] = "Search keywords";
+$lang['show tag cloud'] = "show keywords ungrouped";
+$lang['Tag results for'] = "Keyword results for";
+$lang['Tag'] = "Keyword";
+$lang['Tags'] = "Keywords";
+$lang['Your favorites'] = "Your favourites";
+$lang['Your Gallery Customization'] = "Your gallery customisation";
+
+
+$lang['no rate'] = 'no rating';
+$lang['display your favorites photos'] = 'display your favourite photos';
+$lang['You are not authorized to access the requested page'] = 'You are not authorised to access the requested page';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Successfully registered; you will soon receive an email with your connection settings. Welcome!';
+$lang['Please, enter a login'] = 'Please enter a login';
+$lang['Piwigo encountered a non recoverable error'] = 'Piwigo encountered an irrecoverable error';
+?> \ No newline at end of file
diff --git a/language/en_GB/en_GB.jpg b/language/en_GB/en_GB.jpg
new file mode 100644
index 000000000..ad551d898
--- /dev/null
+++ b/language/en_GB/en_GB.jpg
Binary files differ
diff --git a/language/en_GB/index.php b/language/en_GB/index.php
new file mode 100644
index 000000000..c8de97f60
--- /dev/null
+++ b/language/en_GB/index.php
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/language/en_GB/iso.txt b/language/en_GB/iso.txt
new file mode 100644
index 000000000..e2ec2b6dc
--- /dev/null
+++ b/language/en_GB/iso.txt
@@ -0,0 +1 @@
+English [GB] \ No newline at end of file
diff --git a/language/en_UK/admin.lang.php b/language/en_UK/admin.lang.php
index 365cfd5ec..1cbc91929 100644
--- a/language/en_UK/admin.lang.php
+++ b/language/en_UK/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -205,6 +205,7 @@ $lang['Available only with HTML format'] = "Available only with HTML format";
$lang['Available versions for'] = 'Available versions for';
$lang['Average rate'] = "Average rate";
$lang['average time'] = "average time";
+$lang['Basic settings'] = 'Basic settings';
$lang['Batch Manager'] = 'Batch Manager';
$lang['between'] = "between";
$lang['between %d and %d pixels'] = 'between %d and %d pixels';
@@ -288,14 +289,14 @@ $lang['Deletions'] = "Deletions";
$lang['Deny selected groups'] = "Deny selected groups";
$lang['Deny selected users'] = "Deny selected users";
$lang['Description'] = "Description";
-$lang['Detailed informations'] = "Detailed informations";
+$lang['Detailed informations'] = 'Detailed information';
$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.';
$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.';
$lang['directories + files'] = "directories + files";
$lang['Directory does not exist'] = 'Directory does not exist';
$lang['Directory'] = "Directory";
$lang['Discover album:'] = "Discover album:";
-$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = "display maximum information (added albums and photos, deleted albums and photos)";
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'display maximal information (added albums and photos, deleted albums and photos)';
$lang['Display options'] = "Display options";
$lang['display'] = 'display';
$lang['Dissociate from album'] = "Dissociate from album";
@@ -326,7 +327,6 @@ $lang['Email administrators when a comment is modified'] = "Email administrators
$lang['Email admins when a comment requires validation'] = "Email admins when a comment requires validation";
$lang['Email admins when a new user registers'] = "Email admins when a new user registers";
$lang['Email admins when a valid comment is entered'] = "Email admins when a valid comment is entered";
-$lang['email'] = "Email";
$lang['Environment'] = "Environment";
$lang['Error list'] = "List of errors";
$lang['Error on file "%s" : %s'] = 'Error on file "%s" : %s';
@@ -365,12 +365,13 @@ $lang['Gallery title'] = "Gallery title";
$lang['Gallery unlocked'] = 'Gallery unlocked';
$lang['GD library is missing'] = "GD library is missing";
$lang['GD version'] = "GD version";
+$lang['General'] = "General";
$lang['General statistics'] = "General statistics";
$lang['Generate multiple size images']='Generate multiple size images';
$lang['Get Support on Piwigo Forum'] = 'Get support on Piwigo forum';
$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation';
$lang['global mode'] = "global mode";
-$lang['Go to %s or %s for more informations'] = "Go to %s or %s for more informations";
+$lang['Go to %s or %s for more informations'] = 'Go to %s or %s for more information';
$lang['Go to'] = "Go to";
$lang['Grant selected groups'] = "Grant selected groups";
$lang['Grant selected users'] = "Grant selected users";
@@ -464,12 +465,12 @@ $lang['Locked'] = "Locked";
$lang['Mail address is obligatory for all users'] = "Mail address is mandatory for all users";
$lang['Mail content'] = "Mail content";
$lang['Mail sent to %s [%s].'] = "Mail sent to %s [%s].";
+$lang['Mail theme'] = 'Mail theme';
$lang['Main "guest" user does not exist'] = "The main \"guest\" user does not exist";
$lang['Main "guest" user status is incorrect'] = "The main \"guest\" user status is incorrect";
$lang['Main "webmaster" user does not exist'] = "The main \"webmaster\" user does not exist";
$lang['Main "webmaster" user status is incorrect'] = "The main \"webmaster\" user status is incorrect";
$lang['Main Page'] = 'Main page';
-$lang['Main'] = "Main";
$lang['Maintenance'] = "Maintenance";
$lang['Make this language available to users'] = 'Make this language available to users';
$lang['Make this theme available to users'] = 'Make this theme available to users';
@@ -598,7 +599,7 @@ $lang['Permission granted'] = "Permission granted";
$lang['Permission management'] = 'Permission management';
$lang['Permissions'] = "Permissions";
$lang['Photo %s of %s'] = 'Photo %s of %s';
-$lang['Photo informations updated'] = "Photo informations updated";
+$lang['Photo informations updated'] = 'Photo information updated';
$lang['Photo name'] = 'Photo name';
$lang['Photo Page'] = 'Photo page';
$lang['Photo Properties'] = 'Photo properties';
@@ -608,7 +609,7 @@ $lang['photos added in the database'] = "photos added in the database";
$lang['photos candidates for metadata synchronization'] = "photos candidates for metadata synchronization";
$lang['photos deleted from the database'] = "photos deleted from the database";
$lang['Photos generation in progress...'] = 'Photos generation in progress...';
-$lang['photos informations synchronized with files metadata'] = "photos informations synchronized with files metadata";
+$lang['photos informations synchronized with files metadata'] = 'photos\' information synchronized with files metadata';
$lang['photos per page'] = "photos per page";
$lang['photos updated in the database'] = "photos updated in the database";
$lang['Photos'] = "Photos";
@@ -680,7 +681,7 @@ $lang['Remove all filters'] = 'Remove all filters';
$lang['remove author'] = 'remove author';
$lang['remove creation date'] = 'remove creation date';
$lang['Remove from caddie'] = 'Remove from caddie';
-$lang['remove tags'] = "remove tags";
+$lang['remove tags'] = 'Remove tags';
$lang['remove this filter'] = 'remove this filter';
$lang['remove title'] = 'remove title';
$lang['Rename'] = 'Rename';
@@ -693,6 +694,7 @@ $lang['Representative'] = 'Album thumbnail';
$lang['Represents'] = 'Is thumbnail for';
$lang['Reset ignored updates'] = 'Reset ignored updates';
$lang['Resize after upload'] = 'Resize after upload';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'Resize after upload disabled due to the use of GD as graphic library';
$lang['Resize'] = 'Resize';
$lang['Restore default configuration. You will lose your plugin settings!'] = "Restore default configuration. You will lose your plugin settings!";
$lang['Restore'] = "Restore";
@@ -714,6 +716,7 @@ $lang['Select at least one album'] = "Select at least one album";
$lang['Select at least one comment'] = 'Select at least one comment';
$lang['Select at least one photo'] = "Select at least one photo";
$lang['Select at least one user'] = "Select at least one user";
+$lang['Select at least one tag'] = "Select at least one tag";
$lang['Select at least two tags for merging'] = 'Select at least two tags for merging';
$lang['Select files'] = 'Select files';
$lang['Select groups...'] = 'Select groups...';
@@ -796,6 +799,7 @@ $lang['The original image quality must be a number between %d and %d'] = 'The or
$lang['The original maximum height must be a number between %d and %d'] = 'The original maximum height must be a number between %d and %d';
$lang['The original maximum width must be a number between %d and %d'] = 'The original maximum width must be a number between %d and %d';
$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = "The permalink name must be composed of a-z, A-Z, 0-9, \"-\", \"_\" or \"/\". It must not be numeric or begin with a number followed by \"-\"";
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'The picture dimensions will be reduced to %dx%d pixels.';
$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'The Piwigo export plugin allows you to create albums and export photos.';
$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.';
$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form';
@@ -842,9 +846,9 @@ $lang['top left corner'] = 'top left corner';
$lang['top right corner'] = 'top right corner';
$lang['total time'] = "total time";
$lang['Two updates are available'] = 'Two updates are available';
-$lang['Type here the author name'] = 'Type here the author name';
-$lang['Type here the title'] = 'Type here the title';
-$lang['Type here the name of the new group'] = 'Type here the name of the new group';
+$lang['Type here the author name'] = 'Type the author name here';
+$lang['Type here the title'] = 'Type the title here';
+$lang['Type here the name of the new group'] = 'Type the name of the new group here';
$lang['Type in a search term'] = "Type in a search term";
$lang['Unable to check for upgrade.'] = "Unable to check for upgrade.";
$lang['Unable to dump database.'] = 'Unable to dump database.';
@@ -859,11 +863,11 @@ $lang['Unlocked'] = "Unlocked";
$lang['unset'] = "unset";
$lang['Unsubscribe from notification by mail'] = "Unsubscribe from notification by mail";
$lang['Unsubscribed'] = "Unsubscribed";
-$lang['Update albums informations'] = "Update albums information";
+$lang['Update albums informations'] = 'Update albums\' information';
$lang['Update All'] = 'Update All';
$lang['Update Complete'] = 'Update Complete';
$lang['Update in progress... Please wait.'] = 'Update in progress... Please wait.';
-$lang['Update photos information'] = "Update photos information";
+$lang['Update photos information'] = 'Update photos\' information';
$lang['update the database from files'] = "update the database with files";
$lang['Update to Piwigo %s'] = 'Update to Piwigo %s';
$lang['Updates'] = 'Updates';
@@ -948,4 +952,26 @@ $lang['Zoom'] = 'Zoom';
$lang['[%s] Visit album %s'] = "[%s] Visit album %s";
$lang['[NBM] Problems or questions'] = "[NBM] Problems or questions";
$lang['Purge user cache'] = 'Purge user cache';
+$lang['Loading...'] = 'Loading...';
+$lang['Show %s users'] = 'Show %s users';
+$lang['No matching user found'] = 'No matching user found';
+$lang['Showing %s to %s of %s users'] = 'Showing %s to %s of %s users';
+$lang['(filtered from %s total users)'] = '(filtered from %s total users)';
+$lang['No user selected, no action possible.'] = 'No user selected, no action possible.';
+$lang['%d of %d users selected'] = '%d of %d users selected';
+$lang['No user selected of %d users'] = 'No user selected of %d users';
+$lang['All %d users are selected'] = 'All %d users are selected';
+$lang['on the %d selected users'] = 'on the %d selected users';
+$lang['User %s added'] = 'User %s added';
+$lang['Registered on %s, %s.'] = 'Registered on %s, %s.';
+$lang['Last visit on %s, %s.'] = 'Last visit on %s, %s.';
+$lang['Change password'] = 'Change password';
+$lang['Password updated'] = 'Password updated';
+$lang['Change username'] = 'Change username';
+$lang['Update user'] = 'Update user';
+$lang['User %s updated'] = 'User %s updated';
+$lang['Users modified'] = 'Users modified';
+$lang['close'] = 'close';
+$lang['Open user details'] = 'Open user details';
+$lang['Close user details'] = 'Close user details';
?> \ No newline at end of file
diff --git a/language/en_UK/common.lang.php b/language/en_UK/common.lang.php
index 84b4207e7..82dc5cd08 100644
--- a/language/en_UK/common.lang.php
+++ b/language/en_UK/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: English [UK]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=417
Author: Piwigo team
Author URI: http://piwigo.org
@@ -43,7 +43,7 @@ $lang['%d comments to validate'] = "%d comments to validate";
$lang['%d comments'] = "%d comments";
$lang['%d hit'] = "%d hit";
$lang['%d hits'] = "%d hits";
-$lang['%d Kb'] = "%d Kb";
+$lang['%d Kb'] = '%d KB';
$lang['%d new comment'] = "%d new comment";
$lang['%d new comments'] = "%d new comments";
$lang['%d new photo'] = "%d new photo";
@@ -184,9 +184,11 @@ $lang['Filesize'] = "Filesize";
$lang['Filter and display'] = "Filter and display";
$lang['Filter'] = "Filter";
$lang['First'] = "First";
+$lang['First Page'] = 'First page';
$lang['Forbidden'] = 'Forbidden';
$lang['Forgot your password?'] = 'Forgot your password?';
$lang['from %s to %s'] = "from %s to %s";
+$lang['Go back to the album'] = "Go back to the album";
$lang['Go through the gallery as a visitor'] = "Navigate the gallery as a visitor";
$lang['group by letters'] = "group by letters";
$lang['guest'] = "guest";
@@ -205,7 +207,6 @@ $lang['in %d sub-album'] = "in %d sub-album";
$lang['in %d sub-albums'] = "in %d sub-albums";
$lang['in this album'] = "in this album";
$lang['included'] = "included";
-$lang['Interface theme'] = "Interface theme";
$lang['Invalid key'] = 'Invalid key';
$lang['Invalid password!'] = "Invalid password!";
$lang['Invalid username or email'] = 'Invalid username or email';
@@ -217,6 +218,7 @@ $lang['Language'] = "Language";
$lang['large'] = 'L - large';
$lang['last %d days'] = "last %d days";
$lang['Last'] = "Last";
+$lang['Last Page'] = "Last page";
$lang['letters'] = "letters";
$lang['Links'] = "Links";
$lang['login mustn\'t end with a space character'] = "login must not end with a space character";
@@ -278,7 +280,6 @@ $lang['Photos posted within the last %d days.'] = "Photos posted within the last
$lang['Piwigo encountered a non recoverable error'] = 'Piwigo encountered an unrecoverable error';
$lang['Piwigo Help'] = "Piwigo help";
$lang['Play of slideshow'] = "Play slideshow";
-$lang['please enter your password again'] = "please enter your password again";
$lang['Please enter your username or email address.'] = 'Please enter your username or email address.';
$lang['Please, enter a login'] = "Please, enter a login";
$lang['Post date'] = "Post date";
@@ -412,4 +413,9 @@ $lang['Your password has been reset'] = 'Your password has been reset';
$lang['Your username has been successfully changed to : %s'] = 'Your username has been successfully changed to: %s';
$lang['Your website URL is invalid'] = 'Your website URL is invalid';
$lang['mandatory'] = 'mandatory';
+$lang['Email'] = "Email";
+$lang['Password is missing. Please enter the password.'] = "Password is missing. Please enter the password.";
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = "Password confirmation is missing. Please confirm the chosen password.";
+$lang['%d photos per page'] = '%d photos per page';
+$lang['Theme'] = 'Theme';
?> \ No newline at end of file
diff --git a/language/en_UK/help/index.php b/language/en_UK/help/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/en_UK/help/index.php
+++ b/language/en_UK/help/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/en_UK/index.php b/language/en_UK/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/en_UK/index.php
+++ b/language/en_UK/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/en_UK/install.lang.php b/language/en_UK/install.lang.php
index 5c8c927d4..17f94e12b 100644
--- a/language/en_UK/install.lang.php
+++ b/language/en_UK/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,38 +21,31 @@
// | USA. |
// +-----------------------------------------------------------------------+
-
-
$lang['Installation'] = "Installation";
$lang['Basic configuration'] = "Basic configuration";
$lang['Default gallery language'] = "Default gallery language";
$lang['Database configuration'] = "Database configuration";
-$lang['Admin configuration'] = "Admin configuration";
+$lang['Admin configuration'] = "Administration configuration";
$lang['Start Install'] = "Start installation";
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'mail address must in the format xxx@yyy.eee (example: jack@altern.org)';
-$lang['Webmaster login'] = "Webmaster login";
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'It will be shown to visitors. It is necessary for website administration';
$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Connection to server successful, but the connection to the database was not possible.';
$lang['Can\'t connect to server'] = "Cannot connect to server";
$lang['Host'] = "Host";
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = "localhost, sql.multimania.com, toto.freesurf.fr";
+$lang['localhost or other, supplied by your host provider'] = "localhost or other, supplied by your host provider";
$lang['User'] = "User";
$lang['user login given by your host provider'] = 'user login supplied by your host provider';
-$lang['Password'] = "Password";
$lang['user password given by your host provider'] = 'user password supplied by your host provider';
$lang['Database name'] = "Database name";
$lang['also given by your host provider'] = 'also supplied by your hosting provider';
$lang['Database table prefix'] = "Database tables prefix";
$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'database table names will be prefixed with it (enables you to manage your tables better)';
-$lang['enter a login for webmaster'] = 'enter a webmaster login';
+$lang['enter a login for webmaster'] = 'please enter the webmaster username';
$lang['webmaster login can\'t contain characters \' or "'] = 'the webmaster login may not contain the characters \' or "';
$lang['please enter your password again'] = "please enter your password again";
-$lang['Webmaster password'] = "Webmaster password";
$lang['Keep it confidential, it enables you to access administration panel'] = 'Keep it confidential, it enables you to access the administration panel';
$lang['Password [confirm]'] = "Password [confirm]";
$lang['verification'] = "verification";
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Need help? Ask your question on the <a href="%s">Piwigo message board</a>.';
-$lang['Webmaster mail address'] = "Webmaster mail address";
$lang['Visitors will be able to contact site administrator with this mail'] = 'Visitors will be able to use this email to contact the site administrator';
$lang['PHP 5 is required'] = "PHP 5 is required";
$lang['It appears your webhost is currently running PHP %s.'] = "It appears your webhost is currently running PHP %s.";
@@ -72,5 +65,4 @@ $lang['Just another Piwigo gallery'] = 'Just another Piwigo gallery';
$lang['Welcome to my photo gallery'] = 'Welcome to my photo gallery';
$lang['Welcome to your new installation of Piwigo!'] = 'Welcome to your new installation of Piwigo!';
$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Don\'t hesitate to consult our forums for any help: %s';
-
?> \ No newline at end of file
diff --git a/language/en_UK/upgrade.lang.php b/language/en_UK/upgrade.lang.php
index 5d2542336..3d40fcead 100644
--- a/language/en_UK/upgrade.lang.php
+++ b/language/en_UK/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/en_US/common.lang.php b/language/en_US/common.lang.php
new file mode 100644
index 000000000..7d4ce4cd7
--- /dev/null
+++ b/language/en_US/common.lang.php
@@ -0,0 +1,39 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: English [US]
+Version: 2.6.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=717
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+$lang_info['language_name'] = "English";
+$lang_info['country'] = "United States";
+$lang_info['direction'] = "ltr";
+$lang_info['code'] = "en";
+$lang_info['zero_plural'] = true;
+$lang_info['parent']= "en_UK";
+
+
+?> \ No newline at end of file
diff --git a/language/en_US/en_US.jpg b/language/en_US/en_US.jpg
new file mode 100644
index 000000000..d5926e407
--- /dev/null
+++ b/language/en_US/en_US.jpg
Binary files differ
diff --git a/language/en_US/index.php b/language/en_US/index.php
new file mode 100644
index 000000000..c8de97f60
--- /dev/null
+++ b/language/en_US/index.php
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/language/en_US/iso.txt b/language/en_US/iso.txt
new file mode 100644
index 000000000..753f271fd
--- /dev/null
+++ b/language/en_US/iso.txt
@@ -0,0 +1 @@
+English [US] \ No newline at end of file
diff --git a/language/eo_EO/admin.lang.php b/language/eo_EO/admin.lang.php
index b853be515..021c5989e 100644
--- a/language/eo_EO/admin.lang.php
+++ b/language/eo_EO/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -27,17 +27,17 @@ $lang['Caddie'] = 'Fot-stoko';
$lang['Notification'] = "Sciigo";
$lang['Upload Photos'] = 'Alsuti fotojn';
$lang['Select an album'] = 'Elekti fotaron';
-$lang['... or '] = '... au ';
+$lang['... or '] = '... aÅ­ ';
$lang['create a new album'] = 'krei novan fotaron';
$lang['Select files'] = 'Elekti dosierojn';
$lang['Start Upload'] = 'Ek-alsuti';
$lang['Learn more'] = 'Scii pli';
$lang['Maximum file size: %sB.'] = 'Maksimuma grando de la fotoj: %sB.';
-$lang['Allowed file types: %s.'] = 'dosiertipo permesita: %s.';
-$lang['+ Add an upload box'] = '+ Aldoni alsutan fenestron';
+$lang['Allowed file types: %s.'] = 'dosiertipoj permesitaj: %s.';
+$lang['+ Add an upload box'] = '+ Aldoni alÅutan fenestron';
$lang['Add another set of photos'] = 'Aldoni plian aron de fotoj';
$lang['Photo %s of %s'] = 'Foto %s de %s';
-$lang['%d photos uploaded'] = '%d fotoj alsutitaj';
+$lang['%d photos uploaded'] = '%d fotoj alÅutitaj';
$lang['All %d photos are selected'] = 'Ciuj %d fotoj estas elektitaj';
$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Vi uzas la foliumilan alsutilon, kaze de problemo, provu la <a href="%s">Flash alsutilon</a> anstatau.';
$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Vi uzas la Flash-alsutilon, kaze de problemo, provu la <a href="%s">Foliumilan alsutilon</a> anstatau.';
@@ -57,10 +57,10 @@ $lang['ACCESS_3'] = "Atingo por administrantoj";
$lang['ACCESS_4'] = "Atingo por retestroj";
$lang['ACCESS_5'] = "Neniu atingo";
$lang['Level 0'] = "---";
-$lang['Level 1'] = "Kontakto";
+$lang['Level 1'] = 'Kontaktoj';
$lang['Level 2'] = "Amikoj";
$lang['Level 4'] = "Familio";
-$lang['Level 8'] = "Administranto";
+$lang['Level 8'] = 'Administrantoj';
$lang['%d association'] = '%d asocio';
@@ -69,4 +69,908 @@ $lang['%d day'] = '%d tago';
$lang['%d days'] = '%d tagoj';
$lang['%d group'] = '%d grupo';
$lang['%d groups'] = '%d grupoj';
+$lang['%d hour'] = '%d horo';
+$lang['%d hours'] = '%d horoj';
+$lang['(this tag will be deleted)'] = '(tiu etikedo estos forigita)';
+$lang['%d week'] = '%d semajno';
+$lang['%d weeks'] = '%d semajnoj';
+$lang['%d year'] = '%d jaro';
+$lang['%d years'] = '%d jaroj';
+$lang['%s ago'] = '%s antaÅ­e';
+$lang['%s in the future'] = '%s venonte';
+$lang['%d line filtered'] = '%d filtrita linio';
+$lang['%d lines filtered'] = '%d filtritaj linioj';
+$lang['%d of %d photos selected'] = '%d fotoj el %d elektiÄis';
+$lang['%d parameter was updated.'] = '%d parametro ÄisdatiÄis.';
+$lang['%d parameters were updated.'] = '%d parametroj ÄisdatiÄis.';
+$lang['%d physical'] = '%d fizika';
+$lang['%d physicals'] = '%d fizikaj';
+$lang['%d photos were deleted'] = '%d foto forigitaj';
+$lang['%d second'] = '%d sekundo';
+$lang['%d seconds'] = '%d sekundoj';
+$lang['%d tag'] = '%d etikedo';
+$lang['%d tags'] = '%d etikedoj';
+$lang['%d user'] = '%d uzanto';
+$lang['%d user comment rejected'] = '%d komento de la uzanto malakceptita';
+$lang['%d user comment validated'] = '%d komento de la uzanto validigita';
+$lang['%d user comments rejected'] = '%d komentoj de la uzanto malakceptitaj';
+$lang['%d user comments validated'] = '%d komentoj de la uzanto validigitaj';
+$lang['%d user deleted'] = '%d uzanto forigita';
+$lang['%d user was not updated.'] = '%d uzanto ne Äisdatigita.';
+$lang['%d user was updated.'] = '%d uzanto Äisdatigita.';
+$lang['%d users'] = '%d uzantoj';
+$lang['%d users deleted'] = '%d uzantoj forigitaj';
+$lang['%d users were not updated.'] = '%d uzantoj ne Äisdatigitaj.';
+$lang['%d users were updated.'] = '%d uzantoj Äisdatigitaj.';
+$lang['%d mail was sent.'] = '%d retmesaÄo sendiÄis.';
+$lang['%d mails were not sent.'] = '%d retmesaÄoj ne sendiÄis.';
+$lang['%d mails were sent.'] = '%d retmesaÄoj sendiÄis.';
+$lang['%d member'] = '%d membro';
+$lang['%d members'] = '%d membroj';
+$lang['%d minute'] = '%d minuto';
+$lang['%d minutes'] = '%d minutoj';
+$lang['%d month'] = '%d monato';
+$lang['%d months'] = '%d monatoj';
+$lang['%d photo was deleted'] = '%d foto forigita';
+$lang['%d album moved'] = '%d albumo moviÄis';
+$lang['%d albums moved'] = '%d albumoj moviÄis';
+$lang['%d albums including'] = '%d albumoj inkluzive';
+$lang['%d album including'] = '%d albumo inkluzive';
+$lang[' and %d virtual'] = 'kaj %d virtuala';
+$lang[' and %d virtuals'] = 'kaj %d virtualaj';
+$lang['%d anomalies have been detected corrected.'] = '%d nenormalaĵoj troviÄis kaj korektiÄis.';
+$lang['%d anomalies have been detected.'] = '%d nenormalaĵoj troviÄis.';
+$lang['%d anomalies have been ignored.'] = '%d nenormalaĵoj ignoriÄis.';
+$lang['%d anomalies have not been corrected.'] = 'Ne eblis korektiÄi %d nenormalaĵojn.';
+$lang['%d anomaly has been corrected.'] = '%d nenormalaĵo korektiÄis.';
+$lang['%d anomaly has been detected.'] = '%d nenormalaĵo troviÄis.';
+$lang['%d anomaly has been ignored.'] = '%d nenormalaĵo ignoriÄis.';
+$lang['%d anomaly has not been corrected.'] = 'Ne eblis korektiÄi %d nenormalaĵon.';
+$lang['%d mail was not sent.'] = '%d retmesaÄo ne sendiÄis.';
+$lang['%d guests'] = '%d vizitantoj';
+$lang['%d guest'] = '%d vizitanto';
+$lang['user "%s" added'] = 'uzanto "%s" aldonita';
+$lang['user_status_admin'] = 'Administranto';
+$lang['user_status_generic'] = 'Komuna';
+$lang['user_status_guest'] = 'Gasto';
+$lang['user_status_normal'] = 'Uzanto';
+$lang['user_status_webmaster'] = 'Retestro';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'vizitantoj bezonas ensaluti kaj havas la taÅ­gajn permesojn por vidi tiun fotaron';
+$lang['width must be a number superior to'] = 'larÄeco devas esti nombro pli granda ol';
+$lang['wrong filename'] = 'maltaÅ­ga dosieronomo';
+$lang['Ignore this update'] = 'Malatentu tiun Äisdatigon';
+$lang['Image Quality'] = 'Bilda kvalito';
+$lang['Inactive Languages'] = 'Malaktivaj lingvoj';
+$lang['Inactive Plugins'] = 'Malaktivaj krom-programoj';
+$lang['Inactive Themes'] = 'Malavtivaj temoj';
+$lang['Informations'] = 'Informo';
+$lang['Install'] = 'Instali';
+$lang['Hello,'] = 'Saluton,';
+$lang['Help Me'] = 'Helpu min';
+$lang['History'] = 'Historio';
+$lang['Hour'] = 'Horo';
+$lang['Group'] = 'Grupo';
+$lang['Group name'] = 'Grup-nomo';
+$lang['Groups'] = 'Grupoj';
+$lang['Groups and users'] = 'Grupoj kaj uzantoj';
+$lang['Guest Settings'] = 'Agordoj por gastoj';
+$lang['Guest cannot be deleted'] = 'Gasto ne Äisdatigeblas';
+$lang['Guests'] = 'Gastoj';
+$lang['Hello'] = 'Saluton';
+$lang['Go to'] = 'Iri al';
+$lang['Forbidden'] = 'Malpermesitaj';
+$lang['Error when sending email to %s [%s].'] = 'Eraro dum sendado de retmesaÄo al %s [%s].';
+$lang['Everybody'] = 'Ĉiuj';
+$lang['Failed to write file to disk'] = 'Malsukcesis skribi la dosieron sur la diskon';
+$lang['File'] = 'Dosiero';
+$lang['Forbid this language to users'] = 'Malpermesi tiun lingvon al uzantoj';
+$lang['ERROR'] = 'ERARO';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'ERARO: TIU KROM-PROGRAMO MANKAS SED ÄœI INSTALIÄœIS! MALINSTALU ÄœIN SENPROKRASTE.';
+$lang['Edit album'] = 'Redakti fotaron';
+$lang['Edit album permissions'] = 'Redakti fotarajn permesojn';
+$lang['Edit photo'] = 'Modifi foton';
+$lang['Edit photo information'] = 'Redakti fotan informon';
+$lang['Edit ranks'] = 'Redakti rangojn';
+$lang['Edit selected tags'] = 'Redakti elektitajn etikedojn';
+$lang['Edit tags'] = 'Redakti etikedojn';
+$lang['Element'] = 'Eroj';
+$lang['Element type'] = 'Tipo de ero';
+$lang['Email administrators when a comment is deleted'] = 'Sendu retmesaÄon al la administrantoj kiam komento estis forigita';
+$lang['Email administrators when a comment is modified'] = 'Sendu retmesaÄon al la administrantoj kiam komento estis modifiita';
+$lang['Email admins when a comment requires validation'] = 'Sendu retmesaÄon al la administrantoj kiam komento bezonas validigo';
+$lang['Email admins when a new user registers'] = 'Sendu retmesaÄon al la administrantoj kiam nova uzanto registras';
+$lang['Email admins when a valid comment is entered'] = 'Sendu retmesaÄon al la administrantoj kiam valida komento entajpiÄas';
+$lang['Environment'] = 'Ĉirkaŭaĵo';
+$lang['Error list'] = 'Listo de eraroj';
+$lang['Download,'] = 'ElÅuti,';
+$lang['Downloads'] = 'ElÅutadoj';
+$lang['Drag to re-order'] = 'Åœovmetu por reorganizi';
+$lang['Drop into album'] = 'Elekti albumon';
+$lang['Delete orphan tags'] = 'Forigi orfajn etikedojn';
+$lang['Delete selected photos'] = 'Forigi elektitajn fotojn';
+$lang['Delete selected tags'] = 'Forigi elektitajn etikedojn';
+$lang['Delete selected users'] = 'Forigi elektitajn uzantojn';
+$lang['Delete this language'] = 'Forigi tiun lingvon';
+$lang['Delete this theme'] = 'Forigi tiun temon';
+$lang['Deletions'] = 'Forigadoj';
+$lang['Detailed informations'] = 'Detalaj informoj';
+$lang['Directory'] = 'Dosierujo';
+$lang['Directory does not exist'] = 'La dosierujo ne ekzistas';
+$lang['Crop'] = 'Stuci';
+$lang['Current name'] = 'Kurenta nomo';
+$lang['Database'] = 'Datenbazo';
+$lang['Date'] = 'Dato';
+$lang['Day'] = 'Tago';
+$lang['Deactivate'] = 'MalÅalti';
+$lang['Deactivate all'] = 'MalÅalti ĉiuj';
+$lang['Default display'] = 'Apriora vido';
+$lang['Default user cannot be deleted'] = 'Apriora uzanto ne forigeblas';
+$lang['Default user does not exist'] = 'La apriora uzanto ne ekzistas';
+$lang['Delete Representant'] = 'Forigi fotaran miniaturon';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'Korektita malnormalaĵo ne plu malatentiÄos';
+$lang['Correction applied with success'] = 'Korektado sukcese plenumiÄis';
+$lang['Correction applied with error'] = 'Korektado fuÅe plenumiÄis';
+$lang['Correction'] = 'Korektado';
+$lang['Add a criteria'] = 'Aldoni regulon';
+$lang['Associated'] = 'Asociita';
+$lang['Associate to album'] = 'Asocii kun fotaro';
+$lang['Add Photos'] = 'Aldoni fotojn';
+$lang['Add a filter'] = 'Aldoni filtrilon';
+$lang['Add a tag'] = 'Aldoni etikedon';
+$lang['Add a user'] = 'Aldoni uzanton';
+$lang['Add a virtual album'] = 'Aldoni virtualan fotaron';
+$lang['Add detailed content'] = 'Aldoni detalan enhavon';
+$lang['Add group'] = 'Aldoni grupon';
+$lang['A new version of Piwigo is available.'] = 'Nova versio de Piwigo disponeblas.';
+$lang['Activate Navigation Bar'] = 'Aktivigi navigan breton';
+$lang['Activate'] = 'Aktivigi';
+$lang['Actions'] = 'Agoj';
+$lang['Action'] = 'Ago';
+$lang[', click on'] = ', musklaku sur';
+$lang['%d waiting for validation'] = '%d atendanta validigon';
+$lang['Lock gallery'] = 'Åœlosi galerion';
+$lang['Gallery unlocked'] = 'MalÅlosita galerio';
+$lang['Gallery title'] = 'Galeria titolo';
+$lang['The gallery URL is not valid.'] = 'La galeria retadreso ne validas.';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader signifas <em>Piwigo Uploader</em>. De via komputilo, pLoader preparas viajn fotojn kaj transigas ilin al via photogalerio en Piwigo.';
+$lang['With blank value, gallery title will be used'] = 'Se malplenas, la galeria titolo uziÄos';
+$lang['Visit Gallery'] = 'Vizitu la galerion';
+$lang['There is no group in this gallery.'] = 'Ne estas grupo en tiu galerio';
+$lang['Unlock gallery'] = 'MalÅlosi galerion';
+$lang['View in gallery'] = 'Vidi en galerio';
+$lang['A locked gallery is only visible to administrators'] = 'Åœlosita galerio nur videblas al la administrantoj';
+$lang['Activate icon "%s"'] = 'Aktivigi la bildsimbolon "%s"';
+$lang['Activate icon "new" next to albums and pictures'] = 'Vidigi la bildsimbolon "nova" apud la albumoj kaj la fotoj';
+$lang['Active Plugins'] = 'Aktivaj kromprogramoj';
+$lang['Active Languages'] = 'Aktivaj lingvojn';
+$lang['Add tags'] = 'Aldoni etikedojn';
+$lang['Active Themes'] = 'Aktivaj temoj';
+$lang['%s photos have been regenerated'] = '%s fotoj regeneriÄis';
+$lang['%s photos can not be regenerated'] = '%s fotoj ne regeneriÄeblas';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s estu agordita je "false" en via dosiero local/config/config.inc.php';
+$lang['%s has been successfully updated.'] = '%s sukcese ÄisdatiÄis';
+$lang['Add New Theme'] = 'Aldoni novan temon';
+$lang['Add New Language'] = 'Aldoni novan lingvon';
+$lang['Add'] = 'Aldoni';
+$lang['Activate comments'] = 'Aktivigi komentojn';
+$lang['Hoverbox display'] = 'Vido dum musumo';
+$lang['Display options'] = 'Vidigaj opcioj';
+$lang['Include display of recent photos grouped by dates'] = 'AnkaÅ­ vidigu freÅajn fotojn grupitajn laÅ­ datoj';
+$lang['No display'] = 'Neniu vido';
+$lang['display'] = 'Vido';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'Vidigi kiel eble plej da informoj (aldonitaj fotaroj kaj fotoj, forigitaj fotaroj kaj fotoj) ';
+$lang['Update to Piwigo %s'] = 'Äœisdatigi al Piwigo %s';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'Restu en rilato kun la projekto Piwigo, aliÄu al la reta bulteno de Piwigo. RetmesaÄoj sendiÄos al vi kiam nova eldono disponeblos (foje enhavanta sekurecocimo-reparon gravan kaj Äisdatigendan) kaj kiam okazos eventoj gravaj por la projekto. Nur kelkaj retmesaÄoj jare.';
+$lang['An error has occured during upgrade.'] = 'Eraro okazis dum la plibonigado.';
+$lang['Check for upgrade failed for unknown reasons.'] = 'Kontrolserĉo de plibonigoj malsukcesis sen konataj kialoj.';
+$lang['Languages which need upgrade'] = 'Lingvoj bezonantaj plibonigojn';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Ĉu vi certe deziras instali tiun plibonigon? Vi devas kontroli, ĉu la kurenta versio ne bezonas antaŭan malinstaligon.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Vi povas rekte Äisdatigi al Piwigo %s, sen uzi na Piwigo %s (rekomendita).';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo ne povas kolekti la plibonigan dosieron el la servilo';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'Konsilindas plibonigi la sistemon por komplete profiti de la aplikaĵo, alie la aplikaĵo eble ne funkcios aŭ nur malkorekte.';
+$lang['Check for updates'] = 'Kontrolserĉi Äisdatigojn';
+$lang['Choose an action'] = 'Elekti agon';
+$lang['Choose an option'] = 'Elekti opcio';
+$lang['Classic display'] = 'Klasika vido';
+$lang['Check for upgrade'] = 'Kontrolserĉi plibonigojn';
+$lang['Plugins which need upgrade'] = 'Kromprogramoj bezonantaj plibonigojn';
+$lang['Some upgrades are available for extensions.'] = 'Plibonigoj disponeblas por etendaĵoj.';
+$lang['Unable to check for upgrade.'] = 'Maleblas kontrolserĉi plibonigojn.';
+$lang['Themes which need upgrade'] = 'Temoj bezonantaj plibonigojn';
+$lang['Check all'] = 'Kontroli ĉion';
+$lang['Change Admin Colors'] = 'ÅœanÄi la administrajn kolorojn';
+$lang['Can\'t read or extract archive.'] = 'Arĥivo ne legeblas aŭ eltireblas.';
+$lang['Can\'t download archive.'] = 'ArÄ¥ivo ne elÅuteblas.';
+$lang['Cannot delete the old permalink !'] = 'La malnova konstanta ligilo ne forigeblas!';
+$lang['Cancel'] = 'Nuligi';
+$lang['Album updated successfully'] = 'Fotaro sukcese Äisdatigita';
+$lang['Activate Navigation Thumbnails'] = 'Aktivigi navigajn miniaturojn';
+$lang['Added by %s'] = 'Aldonita de %s';
+$lang['Add/delete a permalink'] = 'Aldoni/forigi konstantan ligilon';
+$lang['Locked'] = 'Åœlositaj';
+$lang['Last send'] = 'Lasta sendo';
+$lang['Last revisions'] = 'Lastaj revizioj';
+$lang['Mail sent to %s [%s].'] = 'RetmesaÄo sendita al %s [%s]';
+$lang['Link all album photos to a new album'] = 'Ligi ĉiujn fotarojn al la nova';
+$lang['Link all album photos to some existing albums'] = 'Ligi ĉiujn fotarojn al la jam ekzistantaj';
+$lang['Linked albums'] = 'Ligitaj fotaroj';
+$lang['List'] = 'Listo';
+$lang['Local'] = 'Loka';
+$lang['Lock'] = 'Åœlosi';
+$lang['Lock albums'] = 'Åœlosi fotarojn';
+$lang['Mail address is obligatory for all users'] = 'Retadreso devigas por ĉiu uzanto';
+$lang['Mail content'] = 'MesaÄa enhavo';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'Inkluzivigi historidatumojn (Atentu! La limo de la servila memoro eble transpasiÄos)';
+$lang['Information data registered in database'] = 'Informo registriÄis en datumbazon';
+$lang['Install on your computer,'] = 'Instali sur la komputilon';
+$lang['Installed Languages'] = 'Instalitaj lingvoj';
+$lang['Installed Themes'] = 'Instalitaj temoj';
+$lang['Instructions to use Piwigo'] = 'Instrukcioj por uzi na Piwigo';
+$lang['Invert'] = 'Inversigi';
+$lang['Language has been successfully installed'] = 'La lingvo sukcese instaliÄis.';
+$lang['Languages'] = 'Lingvoj';
+$lang['Last hit'] = 'Lasta trafo';
+$lang['Last import'] = 'Lasta importo';
+$lang['Landscape'] = 'Horizontala';
+$lang['Hit'] = 'Trafo';
+$lang['Ignore All'] = 'Malatenti ĉion';
+$lang['Ignore selected anomalies'] = 'Malatenti selektitajn nenormalojn';
+$lang['Image id'] = 'Bilda nomo';
+$lang['Images manual order was saved'] = 'Permana bild-ordo konserviÄis';
+$lang['Go to %s or %s for more informations'] = 'Iri al %s aÅ­ %s por pliaj informoj';
+$lang['Grant selected groups'] = 'Doni atingon al la selektitaj groupoj';
+$lang['Grant selected users'] = 'Doni atingon al la selektitaj uzantoj';
+$lang['Graphics Library'] = 'Grafika biblioteko';
+$lang['High definition'] = 'Alta distingivo';
+$lang['High definition enabled'] = 'Alta distingivo Åaltita';
+$lang['Group management'] = 'Grupomastrumado';
+$lang['General statistics'] = 'Äœeneralaj statistikoj';
+$lang['Forbid this theme to users'] = 'Malpermesi tiun temon al uzantoj';
+$lang['Form'] = 'Respondilo';
+$lang['Apply watermark if height is bigger than'] = 'Apliki filigranon se la alto superas';
+$lang['Height'] = 'Alto';
+$lang['Maximum height'] = 'Maksimuma alto';
+$lang['Minimum height'] = 'Minimuma alto';
+$lang['The original maximum height must be a number between %d and %d'] = 'La originala maksimuma alto estu nombro inter %d and %d';
+$lang['height must be a number superior to'] = 'Alto estu nombro super';
+$lang['Configuration'] = 'Agordo';
+$lang['Confirm merge'] = 'Konfirmu la kunfandon';
+$lang['Continue processing treatment'] = 'PludaÅ­rigi okazantan traktadon';
+$lang['I decide to update anyway'] = 'Mi decidas ĉiel Äisdatigi';
+$lang['IP'] = 'IP';
+$lang['Administration Home'] = 'Administra hejmo';
+$lang['remove author'] = 'Forigi aÅ­toron';
+$lang['remove tags'] = 'Forigi etikedojn';
+$lang['remove this filter'] = 'Forigi tiun filtrilon';
+$lang['remove title'] = 'Forigi titolon';
+$lang['show details'] = 'Montri detalojn';
+$lang['the wiki'] = 'la vikio';
+$lang['top left corner'] = 'supra maldekstra angulo';
+$lang['top right corner'] = 'supra dekstra angulo';
+$lang['total time'] = 'tuta tempo';
+$lang['unknown'] = 'nekonata';
+$lang['the forum'] = 'la forumo';
+$lang['Duplicates'] = 'Duobloj';
+$lang['Error on file "%s" : %s'] = 'Eraro en dosiero "%s": %s';
+$lang['Errors caption'] = 'Klarigetoj de la eraroj';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'La plenumtempo transpasita, la traktado pludaÅ­ru [taksita tempo: %d sekundo].';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'La plenumtempo transpasita, la traktado pludaÅ­ru [taksita tempo: %d sekundoj].';
+$lang['Extend for templates'] = 'Etendi Åablonojn';
+$lang['Extensions Update'] = 'Ĝisdatigo de kromaĵoj';
+$lang['FTP + Synchronization'] = 'FTP + sinkronigo';
+$lang['Features include gallery browsing, album creation and photo upload.'] = 'Eblecoj inkluzivas foliumadon de galerio, kreadon de fotaroj kaj alÅutadon de fotoj.';
+$lang['File upload stopped by extension'] = 'La dosieran alÅuton finis kromaĵo';
+$lang['File/directory read error'] = 'Eraro je la legado de dosier(uj)o';
+$lang['Find a new representant by random'] = 'Hazarde trovi novan fotaran miniaturon';
+$lang['Follow Orientation'] = 'Sekvi orientiÄon';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'La jenaj kromprogramoj eble ne kongruos kun la nova versio de Piwigo:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'La jenaj temoj eble ne kongruos kun la nova versio de Piwigo:';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = 'Por la grandecoj de stucitaj fotoj, kiel "kvadrato", Piwigo klopodos por ĉeestigi la interescentron.';
+$lang['GD library is missing'] = 'La biblioteko GD mankas';
+$lang['GD version'] = 'GD versio';
+$lang['Generate multiple size images'] = 'Generi multoblajn grandecojn de bildoj';
+$lang['Get Support on Piwigo Forum'] = 'Obteni helpon ĉe la forumo de Piwigo';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = 'AnstataÅ­igado de originalaj Åablonoj per tajloritaj Åablonoj el la subdosierujo por Åablonaj etendaĵoj';
+$lang['All extensions are up to date.'] = 'Ĉiuj kromaĵoj estas Äisdataj.';
+$lang['All languages are up to date.'] = 'Ĉiuj lingvoj estas Äisdataj.';
+$lang['All plugins are up to date.'] = 'Ĉiuj kromaprogramoj estas Äisdataj.';
+$lang['All themes are up to date.'] = 'Ĉiuj temoj estas Äisdataj.';
+$lang['Album "%s" now contains %d photos'] = 'Fotaro "%s" nun enhavas %d fotojn';
+$lang['Album "%s" has been added'] = 'Fotaro "%s" aldoniÄis';
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Photoshop Lightroom estas fota programaro desegnita por administri grandajn kvantojn de ciferecaj bildoj kaj post-trakti ilin.';
+$lang['Add write access to the "%s" directory'] = 'Aldonu skribaliron al la dosierujo "%s"';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = 'La aplikaĵo <em>Piwigo por iOS<em> ebligas vin konektiÄi al via galerio Piwigo, por krei fotarojn kaj elÅuti plurajn fotojn unufoje el via iPhone, iPas aÅ­ iPod Touch.';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = 'La aplikaĵo <em>Piwigo por Android<em> ebligas vin konektiÄi al via galerio Piwigo, por krei fotarojn kaj elÅuti plurajn fotojn unufoje el via telefono aÅ­ tabuleto Android.';
+$lang['Advanced features'] = 'Specialaj funkcioj';
+$lang['Access type'] = 'Tipo de atingo';
+$lang['Allow user customization'] = 'Permesi al uzantoj tajloradon';
+$lang['Allow user registration'] = 'Permesi al uzantoj registriÄi';
+$lang['Allow users to edit their own comments'] = 'Permesi al uzantoj redakti iliajn proprajn komentojn';
+$lang['Authorized'] = 'Permesita';
+$lang['Authorize users to add comments on selected albums'] = 'Permesi al uzantoj aldoni komentojn sur selektitaj fotaroj';
+$lang['Average rate'] = 'Meza takso';
+$lang['Available versions for'] = 'Disponeblaj versioj por';
+$lang['Available only with HTML format'] = 'Nur disponebla HTML-formate';
+$lang['Available on'] = 'Disponebla ĉe';
+$lang['Applications'] = 'Aplikaĵoj';
+$lang['Apply action'] = 'Apliki agon';
+$lang['Apply selected corrections'] = 'Apliki selektitajn korektojn';
+$lang['Apply to sub-albums'] = 'Apliki al subfotaroj';
+$lang['All optimizations have been successfully completed.'] = 'Ĉiuj optimumigoj sucese plenumiÄis.';
+$lang['Albums authorized thanks to group associations'] = 'Fotaroj rajtigitaj dank\' al grupaparteno';
+$lang['Album photos associated to the following albums: %s'] = 'La fotoj de l\' fotaro asociiÄis al la jenaj fotaroj: %s';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '%u uzantoj aŭtomate havas permeson ĉar ili apartenas al permeshava grupo';
+$lang['%s value is not correct file because exif are not supported'] = 'La valoro de %s maltaÅ­gas ĉar "exif" ne akceptiÄas';
+$lang['Albums automatically sorted'] = 'Fotaroj aÅ­tomate ordigitaj';
+$lang['Anomaly'] = 'Nenormalo';
+$lang['Allow rating'] = 'Permesi pritakson';
+$lang['Allow users to delete their own comments'] = 'Permesi al uzantoj forigi iliajn proprajn komentojn';
+$lang['Album manual order was saved'] = 'La permana fotara ordo konserviÄis';
+$lang['Album list management'] = 'Administrado de la fotara listo';
+$lang['Check automatic corrections'] = 'Åœalti la aÅ­tomatajn korektojn';
+$lang['Comments for all'] = 'Komentoj al ĉiuj';
+$lang['Discover album:'] = 'Malkovru la fotaron:';
+$lang['Deleted on'] = 'Forigi ĉe';
+$lang['Create this site'] = 'Krei tiun retejon';
+$lang['Can\'t connect to server.'] = 'Konekto al la servilo ne disponeblas.';
+$lang['Can\'t create temporary file.'] = 'Ne eblas krei provizoran dosieron.';
+$lang['Caddie management'] = 'Administrado de la korbo';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'Piwigo apriore kreos novan retan grandon el la tredistingiva versio de via foto.';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = 'La interesa punkto apriore lokiÄas ĉe la mezo de la foto.';
+$lang['Automatic sort order'] = 'AÅ­tomata ordiga ordo';
+$lang['Center of interest'] = 'Interesa punkto';
+$lang['Are you sure you want to install this plugin?'] = 'Ĉu vi certe deziras instali tiun kromaĵon?';
+$lang['Batch Manager'] = 'Stapla administrilo';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Ĉirkaŭa maksimuma distingivo: %dM bilderoj (t.e. %dx%d bilderoj).';
+$lang['Apply watermark if width is bigger than'] = 'Apliki la filigranon se la larÄeco estas pli ol';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture estas desegnita por profesiaj fotistoj kun la simpleco de iPhoto.';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture estas potenca ilo por rafini bildojn kaj administri larÄegajn bibliotekojn ĉe komputiloj Mac.';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'Nur retestroj povas vidi tiun langeton, ne administrantoj.';
+$lang['An information email was sent to group "%s"'] = 'Informa retmesaÄo sendiÄis al la grupo "%s"';
+$lang['An error occured during extraction (%s).'] = 'Eraro okazi dum la eltirado de dosieroj (%s).';
+$lang['By rank'] = 'LaÅ­ rango';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Eraro okazis dum eltirado. Bonvolu kontroli la dosieropermesojn de via instalo de Piwigo.<br><ahref="%s">Musklaku ĉi tie por vidi la erarprotokolo</a>.';
+$lang['Are you sure you want to delete this plugin?'] = 'Ĉu vi certe deziras forigi tiun kromaĵon?';
+$lang['Bound Theme'] = 'Ligita temo';
+$lang['By %s'] = 'Per %s';
+$lang['Automatic correction'] = 'AÅ­tomata korekto';
+$lang['Main Page'] = 'Ĉefa paÄo';
+$lang['Maintenance'] = 'Funkciteno';
+$lang['Manage'] = 'Administri';
+$lang['Manage Permissions'] = 'Administri la permesojn';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Krei la "%s" dosierujon ĉe la radiko de via Piwigo-instalo';
+$lang['Delete multiple size images'] = 'Forigi la multoblan grandecon de fotoj';
+$lang['Documentation'] = 'Dokumentaro';
+$lang['Does not represent'] = 'Ne estas miniaturo por';
+$lang['Dump Database'] = 'Åœuti la datumbazon';
+$lang['Duplicate'] = 'Duobligi';
+$lang['Duplicate selected tags'] = 'Duobligi la selektitajn etikedojn';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Doni skribaliron (chmod777) al la "%s" dosierujo ĉe la radiko de via Piwigo-instalo';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'Se neniu tredistingiva versio disponeblas kaj se la kuranta retgrandeco plias ol la ĉisubaj grandecoj, Piwigo konsideros Äin kiel tredistingiva versio kaj kreos la novan retgrandecon de Äi.';
+$lang['If you encounter problems or have any question, please send a message to'] = 'En kazo de problemoj aÅ­ demandoj, bonvolu sendi mesaÄon al';
+$lang['Do you want to activate anyway?'] = 'Ĉu vi tamen volas aktivigi Äin?';
+$lang['Dissociated'] = 'Malligita';
+$lang['Dissociate from album'] = 'Malligi de la fotaro';
+$lang['Deny selected users'] = 'Rifuzi la selektitajn uzantojn';
+$lang['Deny selected groups'] = 'Rifuzi la selektitajn grupojn';
+$lang['Permission granted'] = 'Atingo permesita';
+$lang['Permission denied'] = 'Atingo malpermesita';
+$lang['Default photos order'] = 'Apriora ordo de fotoj';
+$lang['Default comments order'] = 'Apriora ordo de komentoj';
+$lang['Database synchronization with files'] = 'Sinkronigo de la datumbazo kun la dosieroj';
+$lang['Complementary mail content'] = 'Komplementa enhavo de retmesaÄo';
+$lang['Check integrity'] = 'Kontrolo pri integreco';
+$lang['Manage photos'] = 'Administri la fotojn';
+$lang['Manage tags'] = 'Administri la etikedojn';
+$lang['Manage the members'] = 'Administri la membrojn';
+$lang['Impossible automatic correction'] = 'Neeblas aÅ­tomata korektado';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'Neeblis malaktivigi tiun temon, ĉar la patra temo mankas: %s.';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'Neeblas malaktivigi tiun lingvon, unue elektu alian aprioran lingvon.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'Neeblas malaktivigi tiun lingvon, nepras almenaÅ­ unu lingvo.';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Neeblas malaktivigi tiun temon, nepras almenaÅ­ unu temo.';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'Neeblas forigi tiun temon, ĉar aliaj temoj dependas de Äi: %s.';
+$lang['Modify information'] = 'Modifi informon';
+$lang['Month'] = 'Monato';
+$lang['Move'] = 'Movi';
+$lang['Move albums'] = 'Movi fotarojn';
+$lang['Move to album'] = 'Movi al fotaro';
+$lang['Name of the duplicate'] = 'Nomo de la duoblo';
+$lang['New Version'] = 'Nova Versio';
+$lang['New name'] = 'Nova nomo';
+$lang['New parent album'] = 'Nova patra fotaro';
+$lang['New photos added'] = 'Novaj fotoj aldonitaj';
+$lang['New photos were added'] = 'Novaj fotoj aldoniÄis';
+$lang['New tag'] = 'Nova etikedo';
+$lang['No file was uploaded'] = 'Neniu dosiero alÅutiÄis';
+$lang['No group selected, no action possible.'] = 'Neniu grupo estis selektita, neniu ago eblas.';
+$lang['No mail to send.'] = 'Neniu mesaÄo sendenda.';
+$lang['No members to manage'] = 'Neniu membro administrenda ';
+$lang['Maximum width'] = 'Maksimuma larÄo';
+$lang['Members'] = 'Membroj';
+$lang['Menu Management'] = 'Menuoj';
+$lang['Merge selected groups'] = 'Kunfandi la selektitajn grupojn';
+$lang['Merge selected tags'] = 'Kunfandi la selektitajn etikedojn';
+$lang['Merge tags'] = 'Kunfandi etikedojn';
+$lang['No photo can be deleted'] = 'Eblas forigi neniun foton ';
+$lang['No photo in this album'] = 'Neniu foto en tiu fotaro';
+$lang['No photo selected, no action possible.'] = 'Sen foto selektita, neniu ago eblas.';
+$lang['No results'] = 'Neniu rezulto';
+$lang['No user to send notifications by mail.'] = 'Neniun uzanton oni sciigos retmesaÄe.';
+$lang['None'] = 'Nenio';
+$lang['Not cropped correctly?'] = 'Ĉu la foto ne estis taŭge stucita?';
+$lang['Multiple Size'] = 'Multopla grandeco';
+$lang['Number of albums per page'] = 'Nombro da fotaroj ĉe ĉiu paÄo';
+$lang['Number of comments per page'] = 'Nombro da komentoj ĉe ĉiu paÄo';
+$lang['Number of downloads'] = 'Nombro da elÅutadoj';
+$lang['Number of thumbnails to create'] = 'Nombro da miniaturoj kreendaj';
+$lang['Opacity'] = 'Opakeco';
+$lang['Permissions'] = 'Permisiloj';
+$lang['Photo Page'] = 'FotopaÄo';
+$lang['Photo informations updated'] = 'Fotoinformoj ÄisdatiÄis';
+$lang['Photos'] = 'Fotoj';
+$lang['Piwigo Administration'] = 'Administro de Piwigo';
+$lang['Piwigo Update'] = 'ÄœisdatiÄo de Piwigo';
+$lang['Permalinks'] = 'Konstantaj ligiloj';
+$lang['Permalink history'] = 'Historio pri la konstantaj ligiloj';
+$lang['Permalink %s is already used by album %s'] = 'La konstantan ligilon %s jam uzas la fotaro %s';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'La konstantan ligilon %s antaÅ­e uzis la fotaro %s. Unue forigu Äin de la historio pri konstantaj ligiloj.';
+$lang['Numeric identifier : %d'] = 'Nombra identigilo: %d';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = 'Ĉe via Linux, simple instalu na Shotwell kun via pako-administrilo kaj poste aktivigu la publikigan opcion de Piwigo.';
+$lang['Operating system'] = 'Operaciumo';
+$lang['Operation in progress'] = 'Prilaboro fariÄas';
+$lang['Obsolete Plugins'] = 'Malaktualaj kromprogramoj';
+$lang['Number of rates'] = 'Nombro da takso';
+$lang['Rate'] = 'Takso';
+$lang['Rated %d times, score : %.2f'] = 'Taskita %d fojoj, poetaro: %.2f';
+$lang['Sum of rates'] = 'Sumo da takso';
+$lang['Rate date'] = 'Taksdato';
+$lang['No photo selected, %d photos in current set'] = 'Neniu foto selektita, %d fotoj en la kuranta aro';
+$lang['No photo in the current set.'] = 'Neniu foto en la kuranta aro';
+$lang['No group is permitted to see this private album'] = 'Neniu grupo rajtas vidi tiun privatan fotaron';
+$lang['No order field selected'] = 'Neniu ordokampo selektiÄis';
+$lang['No destination tag selected'] = 'Neniu celetikedo selektiÄis';
+$lang['Options'] = 'Opcioj';
+$lang['Original Size'] = 'Originala grandeco';
+$lang['Original file : %s'] = 'Originala dosiero: %s';
+$lang['Original templates'] = 'Originalaj Åablonoj';
+$lang['Remove all filters'] = 'Forigi ĉiujn filtrilojn';
+$lang['Remove from caddie'] = 'Fortiri de la ĉareto';
+$lang['Rename'] = 'Renomi';
+$lang['Repair and optimize database'] = 'Repari kaj optimumigi la datumbazon';
+$lang['Replacers (customized templates)'] = 'AnstataÅ­igoj (tajloritaj Åablonoj)';
+$lang['Representant'] = 'Fotara Miniaturo';
+$lang['Representation of albums'] = 'Fotara miniaturo';
+$lang['Representative'] = 'Fotara miniaturo';
+$lang['Represents'] = 'Estas miniaturo por';
+$lang['Please wait...'] = 'Bonvolu atendi...';
+$lang['Plugin has been successfully copied'] = 'La kromaĵo sukcese kopiiÄis';
+$lang['Plugin list'] = 'Kromaĵolisto';
+$lang['Plugins'] = 'Kromaĵoj';
+$lang['Portrait'] = 'Portreto';
+$lang['Position'] = 'Pozicio';
+$lang['Posted %s on %s'] = 'AfiÅitaj %s je la %s';
+$lang['Predefined filter'] = 'AntaÅ­difinita filtrilo';
+$lang['Preferences'] = 'Preferoj';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'La tempo por prepari la liston de uzantoj, al kiuj retmesaÄo estos sendita, limiÄas. Aliaj uzantoj ne ĉeestas la liston.';
+$lang['Privacy level'] = 'Privateca nivelo';
+$lang['Privacy level set to "%s"'] = 'Privateca nivelo agordita je "%s"';
+$lang['Private'] = 'Privata';
+$lang['Properties'] = 'Propreco';
+$lang['Public'] = 'Publika';
+$lang['Public / Private'] = 'Publika / Privata';
+$lang['Send'] = 'Sendi';
+$lang['Send mail as'] = 'Sendi mesaÄon kiel';
+$lang['Send mail on HTML format'] = 'Sendi la mesaÄon laÅ­ HTML-formato';
+$lang['Send mail to users'] = 'Sendi mesaÄo al uzantoj';
+$lang['Set author'] = 'Defini aÅ­toron';
+$lang['Show menubar'] = 'Montri la menuzonon';
+$lang['Simulation'] = 'Simulado';
+$lang['Site manager'] = 'Retejadministrilo';
+$lang['Some themes and plugins may be not available yet.'] = 'Kelkaj temoj kaj kromaĵoj eble ne jam disponeblas';
+$lang['Source tag'] = 'Fonta etikedo';
+$lang['Start pLoader and add your photos.'] = 'Komenci pLoader kaj aldoni viajn fotojn.';
+$lang['Statistics'] = 'Statistiko';
+$lang['Status'] = 'Stato';
+$lang['Status of user "%s" updated'] = 'Stato de la uzanto "%s" ÄisdatiÄis';
+$lang['Storage album'] = 'Memorfotaro';
+$lang['Subscribe'] = 'Aboni';
+$lang['Subscribe %s'] = 'Abonigi %s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'Abonigi %s al la novaĵoletero de Piwigo';
+$lang['Subscribe to notification by mail'] = 'Aboni al retaj atentigoj';
+$lang['Subscribe/unsubscribe users'] = 'Abonigi/malabonigi uzantojn';
+$lang['Subscribed'] = 'Abonita';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'Eblas atentigi la abonantojn nur se ekzistas novaj elementoj atentigindaj.';
+$lang['Summary'] = 'Resumo';
+$lang['Support'] = 'Subteno';
+$lang['User status'] = 'Stato de la uzanto';
+$lang['Users'] = 'Uzantoj';
+$lang['Validate'] = 'Validigi';
+$lang['Validation'] = 'Validigo';
+$lang['Version'] = 'Versio';
+$lang['Virtual Links'] = 'Virtualaj ligiloj';
+$lang['Virtual album'] = 'Virtuala fotaro';
+$lang['Virtual album added'] = 'Virtuala fotaro aldoniÄis';
+$lang['Virtual album deleted'] = 'Virtuala fotaro forigita';
+$lang['Virtual album name'] = 'Nomo de la virtuala fotaro';
+$lang['Virtual albums to move'] = 'Virtualaj albumoj movendaj';
+$lang['Visit Piwigo project website'] = 'Viziti la retejon de la projekto Piwigo';
+$lang['Visit language site'] = 'Vizitu la lingvan retejon';
+$lang['Visit plugin site'] = 'Vizitu la kromaĵan retejon';
+$lang['Visit theme site'] = 'Vizitu la teman retejon';
+$lang['Visited %d times'] = 'Vizitita %d fojojn';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'ATENTU! Tiu kromaĵo Åajne ne kongruas kun tiu versio de Piwigo.';
+$lang['Waiting'] = 'Pritraktota';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'Atentu: je ekabono kaj malabono sendiÄos retmesaÄoj al la uzantoj';
+$lang['Watermark'] = 'Filigrano';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'La retestro abonigis vin al la retaj atentigoj.';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'La retestro malabonigis vin de la retaj atentigoj.';
+$lang['Title'] = 'Titolo';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = 'Por eksporti viajn fotojn de digiKam al Piwigo, simple instalu na digiKam kaj la Kipi-kromaĵojn.';
+$lang['To send ?'] = 'Ĉu sendi?';
+$lang['To subscribe'] = 'Por aboni';
+$lang['To unsubscribe'] = 'Por malaboni';
+$lang['Tools'] = 'Iloj';
+$lang['Two updates are available'] = 'Du Äisdatigoj disponeblas';
+$lang['Type here the author name'] = 'Entajpu la aŭtoran nomon ĉitien';
+$lang['Type here the name of the new group'] = 'Entajpu la nomon de la nova grupo ĉitien';
+$lang['Type here the title'] = 'Entajpu la titolon ĉitien';
+$lang['Type in a search term'] = 'Entajpu serĉoterminon';
+$lang['Unable to dump database.'] = 'Ne eblas Åuti la datumbazon.';
+$lang['Uncheck all'] = 'Malselekti ĉiujn';
+$lang['Uninstall'] = 'Malinstali';
+$lang['Uninstalled Plugins'] = 'Malinstalitaj kromprogramoj';
+$lang['Unknown upload error'] = 'Nekonata alÅuteraro';
+$lang['Unlocked'] = 'MalÅlosita';
+$lang['Unsubscribe from notification by mail'] = 'Malaboni de retaj atentigoj';
+$lang['Unsubscribed'] = 'Malabonita';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'La nomo de dosieroj kaj dosierujoj nur enhavu literojn, nombrojn, "-", "_" aÅ­ "."';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'La nombro da komentoj sur ĉiu paÄo estu inter 5 kaj 50.';
+$lang['The original image quality must be a number between %d and %d'] = 'La originala bilda kvalito estu nombro inter %d kaj %d';
+$lang['The original maximum width must be a number between %d and %d'] = 'La originala maksimuma larÄeco estu nombro inter %d kaj %d';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'La bildaj dimensioj malpligrandiÄos al %dx%d rastrumeroj.';
+$lang['The uploaded file was only partially uploaded'] = 'La alÅutita dosiero nur parte alÅutiÄis';
+$lang['The whole page'] = 'La tuta paÄo';
+$lang['The whole set'] = 'La tuta aro';
+$lang['Theme has been successfully installed'] = 'La temo sukcese instaliÄis';
+$lang['Themes'] = 'Temoj';
+$lang['There is no available subscribers to mail.'] = 'Ne estas abonantoj atentigindaj rete.';
+$lang['There is no other language available.'] = 'Ne estas alia lingvo disponebla.';
+$lang['There is no other plugin available.'] = 'Ne estas alia kromaĵo disponebla.';
+$lang['Select at least one comment'] = 'Selektu almenaÅ­ unu komenton';
+$lang['Select at least one photo'] = 'Selektu almenaÅ­ unu foton';
+$lang['Select at least one user'] = 'Selektu almenaÅ­ unu uzanton';
+$lang['Select at least two tags for merging'] = 'Selektu almenaÅ­ du etikedojn por kunfando';
+$lang['Select groups...'] = 'Selektu grupojn...';
+$lang['Select recipients'] = 'Selektu la ricevantojn';
+$lang['Select the destination tag'] = 'Selektu la destinetikedon';
+$lang['Select users...'] = 'Selekti uzantojn';
+$lang['Select:'] = 'Selekti:';
+$lang['Selection'] = 'Selekto';
+$lang['Send an information email to group members'] = 'Sendi informan retmesaÄon al grupaj membroj';
+$lang['Send connection settings by email'] = 'Sendi agordojn rete';
+$lang['Set as default language for unregistered and new users'] = 'Agordi kiel apriora lingvo por neregistritaj kaj novaj uzantoj';
+$lang['Set as default theme for unregistered and new users'] = 'Agordi kiel apriora temo por neregistritaj kaj novaj uzantoj';
+$lang['Set creation date'] = 'Agordi kreadodaton';
+$lang['Set title'] = 'Agordi titolon';
+$lang['Settings'] = 'Agordojn';
+$lang['Sharpen'] = 'Pliakrigi';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = '"Shotwell" estas malfermitkoda fotoorganizilo funkcianta ĉe Linux. Estas la apriora fotoadministrilo ĉe Ubuntu kaj Fedora.';
+$lang['Show info'] = 'Montri informaĵon';
+$lang['There is no other theme available.'] = 'Ne estas alia disponebla temo.';
+$lang['This album contains %d photos, added between %s and %s.'] = 'Tiu fotaro enhavas %d fotojn, aldonitajn inter la %s kaj la %s.';
+$lang['This album contains %d photos, added on %s.'] = 'Tiu fotaro enhavas %d fotojn, aldonitajn je la %s.';
+$lang['This album contains no photo.'] = 'Tiu fotaro enhavas neniun foton.';
+$lang['This group will be set to default'] = 'Tiu grupo uziÄos apriore';
+$lang['This group will be unset to default'] = 'Tiu grupo ne plu uziÄos apriore';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'Tiu estas grava Äisdatigo, kun <a href="%s">amaso da novaj trajtoj</a>.';
+$lang['This is a minor update, with only bug corrections.'] = 'Tiu estas malgrava Äisdatigo, kun nur cimoriparoj.';
+$lang['This name is already used by another group.'] = 'La nomon jam uzas alia grupo';
+$lang['This site already exists'] = 'Tiu retejo jam ekzistas';
+$lang['This theme was not designed to be directly activated'] = 'Tiu temo ne desegniÄis por rekte aktiviÄi';
+$lang['Thumbnail'] = 'Miniaturo';
+$lang['Thumbnails generation in progress...'] = 'Generado de miniaturoj farata...';
+$lang['Time'] = 'Tempo';
+$lang['User %s [%s] added.'] = 'Uzanto %s [%s] aldoniÄis.';
+$lang['User %s [%s] was added to the subscription list.'] = 'Uzanto %s [%s] aldoniÄis al la abonlisto.';
+$lang['User %s [%s] was not added to the subscription list.'] = 'Uzanto %s [%s] ne aldoniÄis al la abonlisto.';
+$lang['User %s [%s] was not removed from the subscription list.'] = 'Uzanto %s [%s] ne foriÄis de la abonlisto.';
+$lang['User %s [%s] was removed from the subscription list.'] = 'Uzanto %s [%s] foriÄis de la abonlisto.';
+$lang['User comments validation'] = 'Validigo de la komentoj de la uzanto';
+$lang['User list'] = 'Listo de uzantoj';
+$lang['Web Form'] = 'Retformularo';
+$lang['Webmaster cannot be deleted'] = 'Ne eblas forigi retejestron';
+$lang['Webmaster status is required.'] = 'Nepras retejestra stato';
+$lang['Week starts on'] = 'Semajno komenciÄas je la';
+$lang['Who can see these photos?'] = 'Kiu povas vidi tiujn fotojn?';
+$lang['Who can see this photo?'] = 'Kiu povas vidi tiun foton?';
+$lang['Width'] = 'LarÄo';
+$lang['With no album'] = 'Sen fotaro';
+$lang['With no tag'] = 'Sen etikedo';
+$lang['With no virtual album'] = 'Sen virtuala albumo';
+$lang['X Position'] = 'Pozicio X';
+$lang['X Repeat'] = 'Ripeto X';
+$lang['Y Position'] = 'Pozicio Y';
+$lang['created'] = 'kreita';
+$lang['custom'] = 'Tajlori';
+$lang['default'] = 'apriore';
+$lang['default values'] = 'aprioraj valoroj';
+$lang['delete'] = 'forigi';
+$lang['delete album'] = 'forigi la fotaron';
+$lang['delete photo'] = 'forigi la foton';
+$lang['deleted'] = 'forigita';
+$lang['directories + files'] = 'dosierujoj + dosieroj';
+$lang['dissociate from group'] = 'malkunigi el la grupo';
+$lang['administrators'] = 'administrantoj';
+$lang['albums added in the database'] = 'fotaroj aldonitaj al la datumbazo';
+$lang['albums deleted in the database'] = 'fotaroj forigitaj de la datumbazo';
+$lang['all'] = 'ĉio';
+$lang['an error happened'] = 'eraro okazis';
+$lang['and'] = 'kaj';
+$lang['any visitor can see this album'] = 'iu ajn vizitanto povas vidi tiun fotaron';
+$lang['apply automatic sort order'] = 'apliki aÅ­tomata ordiga ordo';
+$lang['associate to group'] = 'asocii al la grupo';
+$lang['automatic order'] = 'aÅ­tomata ordo';
+$lang['average time'] = 'meza tempo';
+$lang['between'] = 'inter';
+$lang['between %.2f and %.2f'] = 'inter %.2f kaj %.2f';
+$lang['between %d and %d pixels'] = 'inter %d kaj %d rastrumeroj';
+$lang['bottom left corner'] = 'malsupra maldekstra angulo';
+$lang['bottom right corner'] = 'malsupra dekstra angulo';
+$lang['cancel manual order'] = 'nuligi la permanan ordon';
+$lang['clean'] = 'purigi';
+$lang['confirm'] = 'Konfirmi';
+$lang['create a new site'] = 'Krei novan retejon';
+$lang['jump to photo'] = 'iri al la foto';
+$lang['leave'] = 'lasi';
+$lang['manage album photos'] = 'Administri fotarajn fotojn';
+$lang['manage sub-albums'] = 'Administri sub-fotarojn';
+$lang['manual order'] = 'permana ordo';
+$lang['middle'] = 'mezo';
+$lang['modified'] = 'modifita';
+$lang['new'] = 'nova';
+$lang['no write access'] = 'neniu skribaliro';
+$lang['none'] = 'neniu';
+$lang['nothing'] = 'nenio';
+$lang['number of miniaturized photos'] = 'nombro da miniaturoj kreitaj';
+$lang['on'] = 'je la';
+$lang['on the %d selected photos'] = 'sur la %d selektitaj fotoj';
+$lang['only directories'] = 'nur dosierujoj';
+$lang['only perform a simulation (no change in database will be made)'] = 'nur simuladi (nenio ÅanÄiÄos en la datumbazo)';
+$lang['other'] = 'alia';
+$lang['overrides existing values with empty ones'] = 'viÅskribi ekzistantajn valorojn de malplenaj';
+$lang['pending validation'] = 'pritaktata kontrolo';
+$lang['photos added in the database'] = 'fotoj aldonitaj al la datumbazo';
+$lang['photos candidates for metadata synchronization'] = 'fotoj elektitaj por metadatumsinkronigado';
+$lang['photos deleted from the database'] = 'fotoj forigitaj de la datumbazo';
+$lang['photos informations synchronized with files metadata'] = 'fotoinformoj sinkronigitaj kun la dosiermetadatumoj';
+$lang['photos per page'] = 'fotoj sur ĉiu paÄo';
+$lang['photos updated in the database'] = 'fotoj Äisdatigitaj en la datumbazo';
+$lang['pixels'] = 'rastrumeroj';
+$lang['private'] = 'privata';
+$lang['public'] = 'publika';
+$lang['randomly represented'] = 'hazarda fotara miniaturo';
+$lang['ranks'] = 'rangoj';
+$lang['registered users'] = 'registritaj uzantoj';
+$lang['registration date'] = 'registrodato';
+$lang['remove creation date'] = 'forigi la kreodaton';
+$lang['selection'] = 'selekto';
+$lang['set to'] = 'agordi kiel';
+$lang['simple visitors'] = 'simplaj vizitantoj';
+$lang['singly represented'] = 'fiksita fotara miniaturo';
+$lang['status'] = 'stato';
+$lang['sub-albums'] = 'subfotaroj';
+$lang['synchronize files metadata with database photos informations'] = 'sinkronigi la datumbazajn fotojn kun dosiermetadatumoj';
+$lang['synchronize files structure with database'] = 'sinkronigi la dosierstrukturon kun la datumbazo';
+$lang['test this remote site'] = 'testi tiun foran retejon';
+$lang['unit mode'] = 'unuopa modo';
+$lang['unset'] = 'malÅalti';
+$lang['update the database from files'] = 'Äisdatigi la datumbazon kun dosieroj';
+$lang['test'] = 'testo';
+$lang['target'] = 'celo';
+$lang['Main "guest" user does not exist'] = 'La ĉefa "invitita" uzanto ne ekzistas';
+$lang['Main "guest" user status is incorrect'] = 'La stato de la ĉefa "invitita" uzanto ne validas';
+$lang['Main "webmaster" user does not exist'] = 'La ĉefa "retestra" uzanto ne ekzistas';
+$lang['Main "webmaster" user status is incorrect'] = 'La stato de la ĉefa "retestra" uzanto ne validas';
+$lang['Make this language available to users'] = 'Igi tiun lingvon disponeblan al uzantoj';
+$lang['Make this theme available to users'] = 'Igi tiun temon disponeblan al uzantoj';
+$lang['Manage authorizations for selected albums'] = 'Administri la rajtigojn por la selektitaj fotaroj';
+$lang['Manage permissions for group "%s"'] = 'Administri la permesojn por la grupo "%s"';
+$lang['Manage permissions for user "%s"'] = 'Administri la permesojn por la uzanto "%s"';
+$lang['Manage photo ranks'] = 'Ordiga ordo de la fotoj';
+$lang['Manage this set of %d photos'] = 'Administri tiun aron de %d fotoj';
+$lang['Manual order'] = 'Permana ordo';
+$lang['Minimum width'] = 'Minimuma larÄeco';
+$lang['Miscellaneous'] = 'Diversaĵa';
+$lang['Metadata synchronization results'] = 'Rezultoj de la sinkronigo de metadatumoj';
+$lang['Metadata synchronized from file'] = 'Metadatumoj sinkronigitaj el la dosiero';
+$lang['Minimum privacy level'] = 'Minimuma privateconivelo';
+$lang['Missing Plugins'] = 'Mankantaj Kromaĵoj';
+$lang['Missing a temporary folder'] = 'Mankas provizora dosierujo';
+$lang['Notify administrators when a comment is'] = 'Sciigi la administrantojn kiam komento estas';
+$lang['Only private albums are listed'] = 'Nur privataj fotaroj listiÄas';
+$lang['Optimizations have been completed with some errors.'] = 'La finitaj optimumigoj enhavas erarojn.';
+$lang['Optional URL keyword'] = 'Opcia URL-Ålosilvorto';
+$lang['Order of menubar items has been updated successfully.'] = 'Ordo de la menubreteroj sukcese ÄisdatiÄis.';
+$lang['Orphan tags deleted'] = 'Orfaj etikedoj forigitaj';
+$lang['Other plugins'] = 'Aliaj kromprogramoj disponeblaj';
+$lang['Other private albums'] = 'Aliaj privataj fotaroj';
+$lang['Overall'] = 'Superrigardo';
+$lang['Page banner'] = 'PaÄa rubando';
+$lang['Page end'] = 'PaÄofino';
+$lang['Pages seen'] = 'PaÄoj viditaj';
+$lang['Panorama'] = 'Panoramo';
+$lang['Parameter'] = 'Agordoj';
+$lang['Parameters'] = 'Parametroj';
+$lang['Path'] = 'Vojo';
+$lang['Pending Comments'] = 'Pritraktataj komentoj';
+$lang['Permalink'] = 'Konstanta ligilo';
+$lang['Piwigo Uploader'] = 'AlÅutilo de Piwigo';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Mankas konfirmado de pasvorto. Bonvolu konfirmi la elektitan pasvorton.';
+$lang['Password is missing. Please enter the password.'] = 'Mankas pasvorto. Bonvolu redakti la pasvorton.';
+$lang['Permission granted for groups'] = 'Atingo permesita por grupoj';
+$lang['Permission granted for users'] = 'Atingo permesita por uzantoj';
+$lang['Permission granted thanks to a group'] = 'Atingo permesita dank\' al grupo';
+$lang['Permission management'] = 'Administrado de permesoj';
+$lang['Photo sizes with crop'] = 'Fotograndeco kun stuco';
+$lang['Photo unreachable or no support'] = 'Neatingebla foto aÅ­ neakceptita formato';
+$lang['Photos generation in progress...'] = 'Generado de fotoj okazanta...';
+$lang['Piwigo Announcements Newsletter'] = 'Novaĵoletero de Piwigo';
+$lang['Piwigo Publish plugin for Lightroom'] = 'publikigokromaĵo de Piwigo por Lightroom';
+$lang['Piwigo configuration'] = 'Agordo de Piwigo';
+$lang['Piwigo export plugin for Aperture'] = 'eksportokromaĵo por Aperture';
+$lang['Piwigo export plugin for iPhoto'] = 'eksportokromaĵo por iPhoto';
+$lang['Piwigo for Android'] = 'Piwigo por Android';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo por iOS (iPhone, iPad, iPod Touch)';
+$lang['Piwigo publish plugin for Shotwell'] = 'publikigokromaĵo de Piwigo por Shotwell';
+$lang['Piwigo publish plugin for digiKam'] = 'publikigokromaĵo de Piwigo por digiKam';
+$lang['Piwigo version'] = 'versio de Piwigo';
+$lang['Please select at least two groups'] = 'Bonvolu selekti almenaÅ­ du grupoj';
+$lang['Purge compiled templates'] = 'ViÅi la kompilitajn Åablonojn';
+$lang['Purge history detail'] = 'ViÅi la historiodetalojn';
+$lang['Purge history summary'] = 'ViÅi la historioresumon';
+$lang['Purge never used notification feeds'] = 'ViÅi la neuzitajn sciigofluojn';
+$lang['Purge search history'] = 'ViÅi la serĉohistorion';
+$lang['Purge sessions'] = 'ViÅi seancojn';
+$lang['Purge user cache'] = 'ViÅi ';
+$lang['Random photo'] = 'Hazarda foto';
+$lang['Rating'] = 'Pritakso';
+$lang['Ratio'] = 'Rilatumo';
+$lang['Read Piwigo Documentation'] = 'Legi dokumentaron pri Piwigo';
+$lang['Refresh'] = 'Aktualigi';
+$lang['Refresh photo set'] = 'Aktualigi la fotoloton';
+$lang['Resize'] = 'ÅœanÄi la grandecon';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'ÅœanÄo de grandecon malÅaltita pro uzo de GD kiel grafika biblioteko';
+$lang['Resize after upload'] = 'ÅœanÄi la grandecon post alÅuto';
+$lang['Reinitialize check integrity'] = 'Repravalorizi la integrecokontrolojn';
+$lang['Save Template Directory'] = 'Konservi la Åablonodosierujon';
+$lang['Save Settings'] = 'Konservi agordojn';
+$lang['Restore'] = 'RestaÅ­ri';
+$lang['Remote'] = 'Fora';
+$lang['Released on'] = 'Eldonita je la';
+$lang['Quick Local Synchronization'] = 'Rapida loka sinkronigado';
+$lang['Rating by guests'] = 'Pritakso de la vizitantoj';
+$lang['Reject'] = 'Malakcepti';
+$lang['Save order'] = 'Konservi ordon';
+$lang['Save manual order'] = 'Konservi permanan ordon';
+$lang['You cannot move an album in its own sub album'] = 'Vi ne povas movi fotaron en Äian propran subfotaron';
+$lang['Synchronize'] = 'Sinkronigi';
+$lang['Synchronize metadata'] = 'Sinkronigi metadatumojn';
+$lang['Tag "%s" already exists'] = 'La etikedo "%s" jam ekzistas';
+$lang['Tag "%s" is now a duplicate of "%s"'] = 'La etikedo "%s" nun estas la duoblo de "%s"';
+$lang['Tag "%s" was added'] = 'La etikedo "%s" aldoniÄis';
+$lang['Tag selection'] = 'Etikedoselekto';
+$lang['Templates'] = 'Åœablonoj';
+$lang['Basic settings'] = 'Bazaj agordoj';
+$lang['General'] = 'Äœenerala';
+$lang['Mail theme'] = 'Temo de la retmesaÄoj';
+$lang['Save to permalink history'] = 'Konservi en la historio de konstantaj ligiloj';
+$lang['Save visits in history for'] = 'Konservi la vizitojn en la historio por';
+$lang['Search for new images in the directories'] = 'Serĉi novajn bildojn en la dosierujoj';
+$lang['Searching...'] = 'Serĉanta...';
+$lang['Section'] = 'Sekcio';
+$lang['See you soon,'] = 'Äœis baldaÅ­,';
+$lang['See you soon.'] = 'Äœis baldaÅ­.';
+$lang['Select a file'] = 'Selekti dosieron';
+$lang['Select a zone with your mouse to define a new center of interest.'] = 'Selekti zonon per muso por difini la novan ĉefpunkton.';
+$lang['Select at least one album'] = 'Selekti almenaÅ­ unu fotaron';
+$lang['Select at least one tag'] = 'Selekti almenaÅ­ unu etikedon';
+$lang['Switch to clear or dark colors for administration'] = 'Åœalti al helaj aÅ­ malhelaj koloroj por administro';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'TIU KROMPROGRAMO NUN APARTENAS AL LA KERNO DE PIWIGO! MALINSTALIGU ÄœIN NUN!';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'La etikedoj <em>%s</em> kunfandiÄis en etikedon <em>%s</em>';
+$lang['Templates configuration has been recorded.'] = 'La Åablonoj registriÄis';
+$lang['The %d following tags were deleted'] = 'La jenaj %d etikedoj foriÄis';
+$lang['The following tag was deleted'] = 'La jena etikedo foriÄis';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'La grupnomo ne enhavu " or " aÅ­ ne malplenu.';
+$lang['The name of an album must not be empty'] = 'La fotaronomo ne malplenu';
+$lang['You have %d orphan tags: %s.'] = 'Vi havas %d ofajn etikedojn: %s';
+$lang['Update albums informations'] = 'Äœisdatigi fotarajn informojn';
+$lang['Update photos information'] = 'Äœisdatigi fotajn informojn';
+$lang['Year'] = 'Jaro';
+$lang['You are running the latest version of Piwigo.'] = 'Vi uzas la plej novan version de Piwigo.';
+$lang['You cannot delete your account'] = 'Vi ne povas forigi vian konton';
+$lang['Update in progress... Please wait.'] = 'Äœisdatigo okazanta... Bonvolu atendi.';
+$lang['Updates'] = 'Äœisdatigoj';
+$lang['Upload'] = 'ElÅuti';
+$lang['Uploaded Photos'] = 'ElÅutitaj fotoj';
+$lang['Used metadata'] = 'Metadatumoj uzitaj';
+$lang['User'] = 'Uzanto';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'Bonvolu kontroli la permesojn de la "kromprogramoj"-dosierujoj kaj subdosierujoj (CHMOD).';
+$lang['Reset ignored updates'] = 'Rekomencigi la preteratentitajn Äisdatigojn';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'Restaŭri aprioran agordon. Vi perdos viajn kromaĵajn agordojn!';
+$lang['The anomaly will be ignored until next application version'] = 'La anomalio estos malatentita Äis la venonta aplikaĵoversio';
+$lang['The center of interest is the most meaningful zone in the photo.'] = 'La ĉefpunkto estas la plej signifoplena fotozono. ';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'La dosiero aŭ dosierujo ne atingeblas (ĉu pro neekzisto, ĉu pro rifuzita atingo)';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'La nomo de la konstanta ligilo enhavu signojn a-z, A-Z, 0-9, "-", "_", aÅ­ "/". Äœi ne estu nur numera nek komenciÄu de nombro sekvata de "-"';
+$lang['Update All'] = 'Ĝisdatigi ĉion';
+$lang['Update Complete'] = 'Äœisdatigo finiÄis';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'La eksportokromaĵo de Piwigo permesas al vi krei fotarojn kaj eksporti fotojn.';
+$lang['Toggle \'default group\' property'] = 'Inversigi la econ \'apriora grupo\'';
+$lang['Your configuration settings are saved'] = 'Viaj agordoj konserviÄis';
+$lang['Zoom'] = 'Zomo';
+$lang['[%s] Visit album %s'] = '[%s] Viziti fotaron %s';
+$lang['[NBM] Problems or questions'] = '[NBM] Problemoj aÅ­ demandoj';
+$lang['add a new watermark'] = 'aldoni novan filigranon';
+$lang['add new photos to caddie'] = 'aldoni novajn fotojn al la korbo';
+$lang['User "%s" created with "%s" like password'] = 'Uzanto "%s" kreiÄis kun "%s" kiel pasvorto';
+$lang['You can activate only one mobile theme.'] = 'Vi povas aktivigi nur unu porteblan temon.';
+$lang['You have subscribed to receiving notifications by mail.'] = 'Vi abonis la retmesaÄan atentigon';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'Vi malabonis la retmesaÄan atentigon';
+$lang['You might go to plugin list to install and activate it.'] = 'Iru al la listo de kromprogramoj por instali kaj aktivigi Äin.';
+$lang['You need to confirm deletion'] = 'Vi devas konfirmi la forigon';
+$lang['delete this site and all its attached elements'] = 'forigi tiun retejon kaj ĉiujn koncernatajn informojn';
+$lang['errors during synchronization'] = 'eraroj dum la sinkronigado';
+$lang['even already synchronized photos'] = 'eĉ jam sinkronigitaj fotoj';
+$lang['existing album'] = 'ekzistanta fotaro';
+$lang['first photo added on %s'] = 'unua foto aldonita je la %s';
+$lang['Last visit on %s, %s.'] = 'Lasta vizito je la %s, %s.';
+$lang['Registered on %s, %s.'] = 'Registrita je la %s, %s.';
+$lang['Update user'] = 'ÄœisdatiÄi uzanton';
+$lang['User %s added'] = 'Uzanto %s aldoniÄis';
+$lang['User %s updated'] = 'Uzanto %s ÄisdatiÄis';
+$lang['Users modified'] = 'Uzantoj modifitaj';
+$lang['added'] = 'aldonitaj';
+$lang['%d of %d users selected'] = '%d el %d uzantoj selektitaj';
+$lang['(filtered from %s total users)'] = '(filtrita el %s totalaj uzantoj)';
+$lang['All %d users are selected'] = 'Ĉiuj %d uzantoj selektiÄis';
+$lang['Change password'] = 'ÅœanÄi pasvorton';
+$lang['Change username'] = 'ÅœanÄi salutnomon';
+$lang['Loading...'] = 'Åœutante...';
+$lang['No matching user found'] = 'Neniu kongruanta uzanto troviÄis';
+$lang['No user selected of %d users'] = 'Neniu uzanto selektita el %d uzantoj';
+$lang['No user selected, no action possible.'] = 'Sen uzanto selektita, neniu ago eblas.';
+$lang['Password updated'] = 'Pasvorto ÄisdatiÄis';
+$lang['Show %s users'] = 'Montri %s uzantojn';
+$lang['Showing %s to %s of %s users'] = 'Montrante %s Äis %s el %s uzantoj';
+$lang['guest'] = 'gasto';
+$lang['hide details'] = 'kaÅi detalojn';
+$lang['high'] = 'alta';
+$lang['include child albums'] = 'inkluzivi la idajn fotarojn';
+$lang['include photos with lower privacy level'] = 'inkluzivi fotojn kun malalta privateconivelo';
+$lang['jump to album'] = 'iri al fotaro';
+$lang['on the %d selected users'] = 'sur la %d selektitaj uzantoj';
+$lang['reduce to single existing albums'] = 'trakti nur unu ekzistantan fotaron ';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'La grandon de la alÅutita dosiero transpasas la valoron de MAX_FILE_SIZE precizigita en la HTML-a formularo';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'La grandon de la alÅutita dosiero transpasas la valoron de upload_max_filesize en via dosiero php.ini: %sB';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'La tutan grandon de la alÅutitaj dosieroj transpasas la valoron de post_max_size en via dosiero php.ini: %sB';
+$lang['The version of %s [%s] installed is not compatible with the version required ']['%s'] = 'La versio de %s [%s] instalita ne kongruas kun la necesa versio [%s]';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'La tempo por sendi mesaÄon estas limigita. Aliaj retmesaÄoj estis preterpasitaj.';
+$lang['Use the default photo sort order (defined in the configuration file)'] = 'Uzi la aprioran fotan ordigan ordon (difinita en la agorda dosiero)';
+$lang['You are running on development sources, no check possible.'] = 'Vi estas uzanta la disvolviÄajn fontojn, ne eblas kontroli la lastan version.';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'Vi ne povas difini aprioran fotoordon ĉar estas tajlorita agordo en via loka agordaro.';
+$lang['for the file format'] = 'por la dosieroformato';
+$lang['for this file format'] = 'por tiu dosieroformato';
+$lang['global mode'] = 'malloka reÄimo';
+$lang['group "%s" added'] = 'grupo "%s" aldoniÄis';
+$lang['group "%s" deleted'] = 'grupo "%s" foriÄis';
+$lang['group "%s" updated'] = 'grupo "%s" ÄisdatiÄis';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'En via dosiero php.ini, la grandeco upload_max_filesize (%sB) estas pli granda ol post_max_size (%sB), vi devus modifi tiun agordon';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (RemoteGallery Android) estas malfermitkoda kliento (GPL v3) por Piwigo sur Android.';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'La publikiga kromaĵo de Piwigo por Lightroom permesas al vi eksporti kaj sinkronigi viajn fotojn de Lightroom al via Piwigo-galerio.';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'Vi precizigis <i>$conf[\'order_by\']</i> en via loka agordodosiero, tiu parametro ne plu validas, bonvolu forigi Äin aÅ­ renomi Äin al <i>$conf[\'order_by_custom\']</i>!';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam estas ĉiesaĵo por altnivela administrado de ciferecaj fotoj por Linux, Windows kaj MacOSX.';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam estas kreita por la fotantoj kaj fotistoj dezirantaj vidi, administri, redakti, plibonigi, organizi, etikedi kaj kunhavigi siajn fotojn.';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto estas la apriora fotoadministrilo ĉe MacOSX. La eksportokromaĵo de Piwigo lasas vin krei novajn fotarojn kaj eksporti viajn fotojn rekte de iPhoto ak via Piwigo-galerio.';
+$lang['close'] = 'fermi';
+$lang['Close user details'] = 'Fermi la detalojn de la uzanto';
+$lang['Open user details'] = 'Malfermi la detalojn de la uzanto';
?> \ No newline at end of file
diff --git a/language/eo_EO/common.lang.php b/language/eo_EO/common.lang.php
index 177dedb34..0ad82b8ce 100644
--- a/language/eo_EO/common.lang.php
+++ b/language/eo_EO/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Esperanto [EO]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=596
Author: Piwigo team
Author URI: http://piwigo.org
@@ -35,7 +35,7 @@ $lang_info['direction'] = 'ltr';
$lang_info['code'] = 'eo';
$lang_info['zero_plural'] = false;
-$lang['%d Kb'] = '%d Ko';
+$lang['%d Kb'] = '%d ko';
$lang['%d album updated'] = '%d fotaro Äisdatigita';
$lang['%d albums updated'] = '%d fotaroj Äisdatigitaj';
$lang['%d comment to validate'] = '%d validigenda komento';
@@ -44,24 +44,24 @@ $lang['%d new comment'] = '%d nova komento';
$lang['%d new comments'] = '%d novaj komentoj';
$lang['%d comment'] = '%d komento';
$lang['%d comments'] = '%d komentoj';
-$lang['%d hit'] = 'vidi %d foje';
-$lang['%d hits'] = 'vidi %d foje';
+$lang['%d hit'] = 'vidita %d foje';
+$lang['%d hits'] = 'vidita %d foje';
$lang['%d new photo'] = '%d nova foto';
$lang['%d new photos'] = '%d novaj fotoj';
$lang['%d new user'] = '%d nova uzanto';
-$lang['%d new users'] = '%d novaj fotoj';
+$lang['%d new users'] = '%d novaj uzantoj';
$lang['About'] = 'Pri';
$lang['All tags'] = 'Ĉiuj etikedoj';
$lang['Any tag'] = 'Iu ajn etikedo';
-$lang['At least one listed rule must be satisfied.'] = 'AlmenaÅ­ unu regulo plenumiÄas.';
+$lang['At least one listed rule must be satisfied.'] = 'AlmenaÅ­ unu regulo devas kongrui.';
$lang['Albums'] = 'Fotaroj';
$lang['Album'] = 'Fotaro';
$lang['Close this window'] = 'Fermi la fenestron';
-$lang['Complete RSS feed (photos, comments)'] = 'Plena RSS Fadeno (fotoj kaj komentoj)';
+$lang['Complete RSS feed (photos, comments)'] = 'Plena RSS-fluo (fotoj kaj komentoj)';
$lang['Confirm Password'] = 'Konfirmi pasvorton';
$lang['Connection settings'] = 'Konekta agordo';
-$lang['Login'] = 'Konekto';
-$lang['Contact webmaster'] = 'Kontakti la respondeculon';
+$lang['Login'] = 'Ensaluti';
+$lang['Contact webmaster'] = 'Kontakti la retestron';
$lang['Create a new account'] = 'Krei novan konton';
$lang['Created on'] = 'Kreita je la ';
$lang['Creation date'] = 'Kreita dato';
@@ -70,32 +70,32 @@ $lang['Dimensions'] = 'Grandeco';
$lang['Display'] = 'Ekrano';
$lang['Each listed rule must be satisfied.'] = 'Ĉiuj reguloj devas kongrui';
$lang['Email address'] = 'Retadreso';
-$lang['Enter your personnal informations'] = 'Entajpi viajn personajn informojn';
-$lang['Error sending email'] = 'Eraro sendanta la retmesaÄon';
+$lang['Enter your personnal informations'] = 'Entajpu viajn personajn informojn';
+$lang['Error sending email'] = 'Eraro okazis dum sendo de la retmesaÄo';
$lang['File name'] = 'Dosiernomo';
$lang['File'] = 'Dosiero';
$lang['Filesize'] = 'Dosierpezo';
$lang['Filter and display'] = 'Filtri kaj surekranigi';
$lang['Filter'] = 'Filtrilo';
-$lang['Forgot your password?'] = 'Ĉu vi forgesis vian pasvorton ?';
+$lang['Forgot your password?'] = 'Ĉu vi forgesis vian pasvorton?';
$lang['Go through the gallery as a visitor'] = 'Trairi la galerion kiel vizitanto';
$lang['Help'] = 'Helpo';
$lang['Identification'] = 'Identigado';
-$lang['Photos only RSS feed'] = 'Nur fota RSS Fadeno';
+$lang['Photos only RSS feed'] = 'Nur fota RSS-fluo';
$lang['Keyword'] = 'Åœlosilvorto';
$lang['Links'] = 'Ligiloj';
$lang['N/A'] = 'ne disponeblas';
$lang['New on %s'] = 'Nova je la %s';
$lang['Notification'] = 'Sciigo';
-$lang['Number of items'] = 'Nombro de ero';
+$lang['Number of items'] = 'Nombro de eroj';
$lang['Original dimensions'] = 'Originala grandeco';
$lang['Password forgotten'] = 'Forgesita pasvorto';
$lang['Password'] = 'Pasvorto';
-$lang['Post date'] = 'Aldonita dato';
+$lang['Post date'] = 'Dato de aldonado';
$lang['Posted on'] = 'Aldonita je la';
$lang['Profile'] = 'Profilo';
$lang['Quick connect'] = 'Rapida konekto';
-$lang['RSS feed'] = 'RSS fadeno';
+$lang['RSS feed'] = 'RSS-fluo';
$lang['Register'] = 'Registri';
$lang['Registration'] = 'Registrado';
$lang['Related tags'] = 'Ligitaj etikedoj';
@@ -110,7 +110,7 @@ $lang['Sort by'] = 'Ordigi laÅ­';
$lang['Sort order'] = 'Ordigo';
$lang['Tag'] = 'Etikedo';
$lang['Tags'] = 'Etikedoj';
-$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'La RSS fadeno sciigas pri eventoj de la galerio : novaj fotoj, Äisdatigitaj fotaroj, novaj komentoj de uzantoj. Tio uziÄas per RSS legilo.';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'La RSS-fluo sciigas pri eventoj de la galerio: novaj fotoj, Äisdatigitaj fotaroj, novaj komentoj de uzantoj. Tio uziÄas per RSS-legilo.';
$lang['Unknown feed identifier'] = 'Nekonata fadena identigilo';
$lang['User comments'] = 'Uzantaj komentoj';
$lang['Username'] = 'Uzantnomo';
@@ -118,12 +118,12 @@ $lang['Visits'] = 'Vizitoj';
$lang['Webmaster'] = 'Retestro';
$lang['Week %d'] = 'Semajno %d';
$lang['About Piwigo'] = 'Pri Piwigo';
-$lang['You are not authorized to access the requested page'] = 'Vi ne rajtas legi tiun paÄon. ForfikiÄu !';
+$lang['You are not authorized to access the requested page'] = 'Vi ne rajtas legi tiun paÄon. ForfikiÄu!';
$lang['add this photo to your favorites'] = 'Aldoni tiun foton al via legosigno';
$lang['Administration'] = 'Administrado';
$lang['all'] = 'ĉio';
$lang['ascending'] = 'kreskanta';
-$lang['author(s) : %s'] = 'aÅ­toro(j) : %s';
+$lang['author(s) : %s'] = 'aÅ­toro(j): %s';
$lang['Expand all albums'] = 'Etendi ĉiujn fotarojn';
$lang['posted after %s (%s)'] = 'aldonita post la %s (%s)';
$lang['posted before %s (%s)'] = 'aldonita antaÅ­ la %s (%s)';
@@ -132,7 +132,7 @@ $lang['posted on %s'] = 'aldonita je la %s';
$lang['Best rated'] = 'Plej bonaj';
$lang['display best rated photos'] = 'Montri la plej bonajn fotojn';
$lang['Calendar'] = 'Kalendaro';
-$lang['All'] = 'Ĉiuj';
+$lang['All'] = 'Ĉio';
$lang['display each day with photos, month per month'] = 'Montri ĉiujn tagojn, laŭ monatoj';
$lang['View'] = 'Vido';
$lang['chronology_monthly_calendar'] = 'Monata kalendaro';
@@ -142,7 +142,7 @@ $lang['Click here if your browser does not automatically forward you'] = 'Muskla
$lang['comment date'] = 'dato de la komento';
$lang['Comment'] = 'Komento';
$lang['Your comment has been registered'] = 'Via komento estis registrita';
-$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'KontraÅ­-fekula sistemo : bonvolu pacienciÄi antaÅ­ aldoni novan komenton';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'KontraÅ­-fekula sistemo: bonvolu pacienciÄi antaÅ­ aldoni novan komenton';
$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Via komento ne validiÄis ĉar Äi ne kongruas al nia striktaj reguloj';
$lang['An administrator must authorize your comment before it is visible.'] = 'Administranto devas validigi vian komenton antaÅ­ ke Äi iÄu videbla.';
$lang['This login is already used by another user'] = 'Tiu uzanta nomo jam ekzistas';
@@ -173,7 +173,7 @@ $lang['display your favorites photos'] = 'montri fotojn de miaj legosignoj';
$lang['Favorites'] = 'Legosignoj';
$lang['First'] = 'Unua';
$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Ni Ålosis la galerion por plibonigi Äin, bonvolu reveni poste.';
-$lang['Page generated in'] = 'PaÄo kreita je la';
+$lang['Page generated in'] = 'PaÄo kreita en';
$lang['guest'] = 'Vizitanto';
$lang['Hello'] = 'Saluton';
$lang['available for administrators only'] = 'disponeblaj nur por la administrantoj';
@@ -186,7 +186,7 @@ $lang['in this album'] = 'en tiu fotaro';
$lang['in %d sub-album'] = 'en %d sub-fotaro';
$lang['in %d sub-albums'] = 'en %d sub-fotaroj';
$lang['included'] = 'inkluzivita';
-$lang['Invalid password!'] = 'Nevalidat pasvorto !';
+$lang['Invalid password!'] = 'Nevalida pasvorto!';
$lang['Language'] = 'Lingvo';
$lang['last %d days'] = '%d lastaj tagoj';
$lang['Last'] = 'Lasta';
@@ -211,7 +211,7 @@ $lang['month'][9] = 'Septembro';
$lang['Most visited'] = 'Plej ofte vizitita';
$lang['display most visited photos'] = 'montri la plej ofte vizititajn fotojn';
$lang['The number of photos per page must be a not null scalar'] = 'Nombro de fotoj en unu paÄo devas esti ne-nula nombro';
-$lang['Number of photos per page'] = 'Nombro de miniaturo';
+$lang['Number of photos per page'] = 'Nombro de miniaturoj sur paÄo';
$lang['Unknown identifier'] = 'Nekonata identigilo';
$lang['New password'] = 'Nova pasvorto';
$lang['Rate this photo'] = 'Taksu tiun foton';
@@ -220,14 +220,14 @@ $lang['no rate'] = 'neniu taksado';
$lang['Photos posted within the last %d day.'] = 'Montri nur fotojn aldonitaj dum la lasta %d tago.';
$lang['Photos posted within the last %d days.'] = 'Montri nur fotojn aldonitaj dum la lastaj %d tagoj.';
$lang['password updated'] = 'Äisdatigita pasvorto';
-$lang['Recent period must be a positive integer value'] = 'Tiu periodo devas esti pozitiva nombro';
+$lang['Recent period must be a positive integer value'] = 'Tiu periodo devas esti pozitiva entjera nombro';
$lang['photo'] = 'foto';
$lang['Click on the photo to see it in high definition'] = 'Musklaku la foton por grandigi Äin (aÅ­ proksimiÄu la ekranon)';
$lang['Show file metadata'] = 'Montri dosiermetadatumojn';
-$lang['Powered by'] = 'potencigita per';
+$lang['Powered by'] = 'Potencigita per';
$lang['Preferences'] = 'Agordo';
-$lang['Previous'] = 'Lasta';
-$lang['Random photos'] = 'Hazarda foto';
+$lang['Previous'] = 'AntaÅ­a';
+$lang['Random photos'] = 'Hazardaj fotoj';
$lang['display a set of random photos'] = 'montri hazarde plurajn fotojn';
$lang['Recent albums'] = 'Lastaj fotaroj';
$lang['display recently updated albums'] = 'montri la plej freÅajn fotarojn';
@@ -235,12 +235,11 @@ $lang['Recent period'] = 'Lasta periodo';
$lang['Recent photos'] = 'Lastaj fotoj';
$lang['display most recent photos'] = 'montri la plej lastajn fotojn';
$lang['Redirection...'] = 'Alidirektado...';
-$lang['Please, enter a login'] = 'Bonvolu entajpi uzantnomon';
+$lang['Please, enter a login'] = 'Bonvolu entajpi salutnomon';
$lang['login mustn\'t end with a space character'] = 'Uzantnomo ne finiÄu per spaceto';
$lang['login mustn\'t start with a space character'] = 'Uzantnomo ne komenciÄu per spaceto';
$lang['this login is already used'] = 'Tiu uzantnomo jam uziÄas';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'La retadreso devas simili al xxx@yyy.eee (ekzemple : zamenhof@bialistoko.pl)';
-$lang['please enter your password again'] = 'Bonvolu tajpi vian pasvorton denove (aÅ­ kopi-gluu Äin)';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'La retadreso devas simili al xxx@yyy.eee (ekzemple: zamenhof@bialistoko.pl)';
$lang['Auto login'] = 'AÅ­tomata konekto';
$lang['remove this tag from the list'] = 'forigi tiun etikedon de la listo';
$lang['representative'] = 'delegito';
@@ -248,13 +247,13 @@ $lang['Search for Author'] = 'Serĉi aŭtoron';
$lang['Search in albums'] = 'Serĉi en la fotaroj';
$lang['Date'] = 'Dato';
$lang['End-Date'] = 'Fin-dato';
-$lang['Kind of date'] = 'Type de date';
+$lang['Kind of date'] = 'Dato-tipo';
$lang['Search for words'] = 'Serĉi vorton';
$lang['Search for all terms'] = 'Serĉi ĉiujn vortojn';
$lang['Empty query. No criteria has been entered.'] = 'Malplena demando, neniu kritero entajpigita.';
$lang['Search results'] = 'Serĉa rezulto';
$lang['Search in sub-albums'] = 'Serĉi en la sub-fotaroj';
-$lang['searched words : %s'] = 'serĉitaj vortoj : %s';
+$lang['searched words : %s'] = 'serĉitaj vortoj: %s';
$lang['Contact'] = 'Kontakto';
$lang['set as album representative'] = 'Elekti kiel delegito de tiu fotaro';
$lang['Show number of comments'] = 'Montri la nombron de komentoj';
@@ -263,10 +262,9 @@ $lang['slideshow'] = 'bildoserio';
$lang['stop the slideshow'] = 'halti la bildoserion';
$lang['Specials'] = 'Apartaj';
$lang['SQL queries in'] = 'SQL peto en';
-$lang['display only recently posted photos'] = 'n\'montri nur la lastaj fotoj';
+$lang['display only recently posted photos'] = 'montri nur la lastaj fotoj';
$lang['return to the display of all photos'] = 'reiri al ĉiuj fotoj';
$lang['the beginning'] = 'la komenco';
-$lang['Interface theme'] = 'Etoso';
$lang['Thumbnails'] = 'Miniaturo';
$lang['Menu'] = 'Menuo';
$lang['A comment on your site'] = 'Komento sur via retejo';
@@ -275,8 +273,8 @@ $lang['Update your rating'] = 'Äœisdatigu vian taksadon';
$lang['the username must be given'] = 'vi devas indiki la uzantnomon';
$lang['useful when password forgotten'] = 'helpinda se vi forgesas vian pasvorton';
$lang['Quick search'] = 'Rapida serĉo';
-$lang['Connected user: %s'] = 'Konektita uzanto : %s';
-$lang['IP: %s'] = 'IP : %s';
+$lang['Connected user: %s'] = 'Konektita uzanto: %s';
+$lang['IP: %s'] = 'IP: %s';
$lang['Browser: %s'] = 'Foliumilo: %s';
$lang['Author: %s'] = 'AÅ­toro: %s';
$lang['Comment: %s'] = 'Komento: %s';
@@ -286,7 +284,7 @@ $lang['Email: %s'] = 'Retadreso: %s';
$lang['Admin: %s'] = 'Administrado: %s';
$lang['Registration of %s'] = 'Registris %s';
$lang['Album: %s'] = 'Fotaro: %s';
-$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Malbona stato por la uzanto "Vizitanto", uzo de la apriora stato. Bonvolu averti la retestro.';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Malbona stato por la uzanto "Vizitanto", uzo de la apriora stato. Bonvolu averti la retestron.';
$lang['this email address is already in use'] = 'tiu retadreso jam uziÄas';
$lang['Album results for'] = 'Rezulto de fotaro por';
$lang['Tag results for'] = 'Rezulto de la etikedoj por';
@@ -312,20 +310,20 @@ $lang['group by letters'] = 'grupigi per literoj';
$lang['letters'] = 'literoj';
$lang['show tag cloud'] = 'montri etikedoj nube';
$lang['cloud'] = 'nubo';
-$lang['Reset to default values'] = 'reÅarÄi la apriorajn valuojn';
+$lang['Reset to default values'] = 'ReÅarÄi la apriorajn valuojn';
$lang['delete all photos from your favorites'] = 'Forigi ĉiujn fotojn el viaj legosignoj';
$lang['Sent by'] = 'Senditaj de';
-$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'La kuketoj ne disponeblas sur mia komputilo. Aktivu ilin por konektiÄi.';
-$lang['Edit a comment'] = "redakti komenton";
-$lang['Are you sure?'] = "Ĉu vi certas ?";
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'La kuketoj ne disponeblas sur via komputilo. Aktivu ilin por ensaluti.';
+$lang['Edit a comment'] = 'Redakti komenton';
+$lang['Are you sure?'] = 'Ĉu vi certas?';
$lang['(!) This comment requires validation'] = '(!) Tiu komento validigendas';
$lang['Welcome'] = 'Bonvenon';
-$lang['Welcome to your Piwigo photo gallery!'] = 'Bonvenon en via Galerio Piwigo !';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Bonvenon en via Galerio Piwigo!';
$lang['... or browse your empty gallery'] = '... aÅ­ foliumu en via malplenan galerion';
$lang['... or please deactivate this message, I will find my way by myself'] = '... aÅ­ kaÅu tiun mesaÄon, mi mem elturniÄos';
-$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Saluton %s, via galerio Piwigo estas malplena !';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Saluton %s, via galerio Piwigo estas malplena!';
$lang['I want to add photos'] = 'Mi deziras aldoni fotojn';
-$lang['Manage this user comment: %s'] = 'Mastrumi tiun uzantan komenton : %s';
+$lang['Manage this user comment: %s'] = 'Mastrumi tiun uzantan komenton: %s';
$lang['Email address is missing. Please specify an email address.'] = "Retadreso mankas. Bonvolu specifi retadreson.";
$lang['This author modified following comment:'] = 'Tiu aÅ­toro ÅanÄis la jenan komenton:';
$lang['This author removed the comment with id %d'] = 'Tiu aÅ­toro forviÅis la komenton kies identigilo estas %d';
@@ -336,7 +334,7 @@ $lang['User "%s" has no email address, password reset is not possible'] = 'La uz
$lang['Someone requested that the password be reset for the following user account:'] = 'Iu petis renovigon de la pasvorto por la jena uzanto: ';
$lang['Username "%s" on gallery %s'] = 'Uzanto "%s" ĉe la galerio %s';
$lang['To reset your password, visit the following address:'] = 'Por renovigi vian pasvorton, musklaku la jenan ligilon:';
-$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Se vi erare petis, nur ignoru tiun mesaÄon kaj nenio okazos.';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Se vi ĵus eraris, nur ignoru tiun mesaÄon kaj nenio okazos.';
$lang['Password Reset'] = 'Renovigo de via pasvorto';
$lang['Check your email for the confirmation link'] = 'Kontrolu viajn retmesaÄojn por trovi la konfirman ligilon';
$lang['Invalid key'] = 'Nevalida Ålosilo';
@@ -354,15 +352,15 @@ $lang['Rating score'] = 'Poento';
$lang['EXIF Metadata'] = 'Datumoj EXIF';
$lang['IPTC Metadata'] = 'Datumoj IPTC';
$lang['Download this file'] = 'ElÅuti tiun dosieron';
-$lang['Download'] = 'elÅuti';
+$lang['Download'] = 'ElÅuti';
$lang['Edit'] = 'Redakti';
$lang['Hello %s,'] = 'Saluton %s,';
$lang['Search by date'] = 'Serĉi laŭ dato';
$lang['Search for any term'] = 'Serĉi por iu ajn vorto';
$lang['Send my connection settings by email'] = 'Sendi mian konektan agordon per retmesaÄo';
-$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Vi sukcese registris, vi baldaÅ­ ricevos retmesaÄe viajn konektajn agordojn. Bonvenon !';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Vi sukcese registris, vi baldaÅ­ ricevos retmesaÄe viajn konektajn agordojn. Bonvenon!';
$lang['Username modification'] = 'ÅanÄo de uzantnomo';
-$lang['Your username has been successfully changed to : %s'] = 'Via uzantnomo sukcese ÅanÄiÄis por : %s';
+$lang['Your username has been successfully changed to : %s'] = 'Via uzantnomo sukcese ÅanÄiÄis por: %s';
$lang['square'] = 'Kvadrata';
$lang['thumb'] = 'miniaturo';
$lang['small'] = 'Malgranda';
@@ -383,7 +381,7 @@ $lang['Mobile'] = 'Portebla';
$lang['Desktop'] = 'Komputila';
$lang['Photo sizes'] = 'Grandeco de la fotoj';
$lang['2small'] = 'XXS - malgrandega';
-$lang['xsmall'] = 'XS - tre malgranda';
+$lang['xsmall'] = 'Tre malgranda';
$lang['File name, A &rarr; Z'] = 'Dosiernomo, A &rarr; Z';
$lang['File name, Z &rarr; A'] = 'Dosiernomo, Z &rarr; A';
$lang['Photo title, A &rarr; Z'] = 'Fota titolo, A &rarr; Z';
@@ -407,9 +405,19 @@ $lang['Forbidden'] = 'Malpermesita';
$lang['Page not found'] = 'Ne trovebla paÄo';
$lang['Permalink for album not found'] = 'DaÅ­ra ligilo por tiu fotaro ne troviÄas';
$lang['Piwigo encountered a non recoverable error'] = 'Piwigo trafis ne ripareblan eraron';
-$lang['Requested album does not exist'] = 'Fotaro petita ne ekzistas';
+$lang['Requested album does not exist'] = 'Petita fotaro ne ekzistas';
$lang['Requested tag does not exist'] = 'Petita etikedo ne ekzistas';
$lang['Email address is mandatory'] = 'Retadreso estas deviga';
$lang['Username is mandatory'] = 'Uzantnomo estas deviga';
$lang['mandatory'] = 'deviga';
+$lang['Your website URL is invalid'] = 'Via reteja URL ne validas.';
+$lang['Website'] = 'Retejo';
+$lang['Email'] = 'RetmesaÄo';
+$lang['First Page'] = 'Unua paÄo';
+$lang['Go back to the album'] = 'Reiri al la fotaro';
+$lang['Last Page'] = 'Lasta paÄo';
+$lang['Password is missing. Please enter the password.'] = 'Mankas pasvorto. Bonvolu redakti la pasvorton.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Mankas konfirmado de pasvorto. Bonvolu konfirmi la elektitan pasvorton.';
+$lang['%d photos per page'] = '%d fotoj sur ĉiu paÄo';
+$lang['Theme'] = 'Temo';
?> \ No newline at end of file
diff --git a/language/eo_EO/help/cat_modify.html b/language/eo_EO/help/cat_modify.html
new file mode 100755
index 000000000..a79a5ad6c
--- /dev/null
+++ b/language/eo_EO/help/cat_modify.html
@@ -0,0 +1,132 @@
+<h2>Redakti fotaron</h2>
+
+<h3>Informoj</h3>
+
+<ul>
+
+ <li><strong>nomo</strong>: renomi la fotaron (virtuala renomo kaze
+ de fizika fotaro).</li>
+
+ <li><strong>priskribo</strong>: mallonga teksto montranta Äeneralan ideon de la enhavo,
+ tiu teksto vidiÄos malsupre de la miniaturopaÄo.</li>
+
+</ul>
+
+<h3>Movado</h3>
+
+<p>Se la fotaro estas virtuala, vi povas movi Äin. Movi fotaron signifas
+ÅanÄi Äian patran fotaron.</p>
+
+<h3>Opcioj</h3>
+
+<ul>
+
+ <li><strong>Atingotipo</strong>: Administrado de permesiloj. Se vi igas
+ fotaron privatan, ĉiuj idaj fotaroj Äiaj iÄas privataj. Se vi igas
+ fotaron publikan, ĉiuj idaj fotaroj Äiaj iÄas publikaj.</li>
+
+ <li><strong>Åœlosi</strong>: La fotaro kaj Äiaj subfotaroj estos
+ provizore malvalidigitaj pro funkciteno.</li>
+
+ <li><strong>Komentoj</strong>: Permesi al la uzantoj komenti la fotojn de ĉitiu
+ fotaro.</li>
+
+</ul>
+
+<p>Vi povas ankaŭ mastrumi tiujn opciojn ĉe la
+mastrumekrano "Ecoj" (ekranoj <span
+class="pwgScreen">Komentoj</span>, <span class="pwgScreen">Åœlosi</span>,
+<span class="pwgScreen">Publika/Privata</span>, <span
+class="pwgScreen">Reprezentanto</span> disponebla el <span
+class="pwgScreen">Administrado &raquo; Fotaroj &raquo; Ecoj</span>).</p>
+
+<h3>Ordiga ordo</h3>
+
+<p>Uzi la aprioran bildan ordigan ordon.</p>
+
+<p>Indiki ĉu tiu ordiga ordo will apply to subalbums also.</p>
+
+<p>Selekti la specifajn ordigokriteriojn uzendaj kun ĉitiu fotaro.</p>
+<ul>
+<li><strong>Kreodato</strong>: Fotadodato</li>
+<li><strong>AfiÅodato</strong>: Sinkronigadodato</li>
+<li><strong>Meza takso (*)</strong>: Meza takso ÅanÄus laÅ­ la taksado de la vizitantoj</li>
+<li><strong>Plej vizitita (*)</strong>: La kuranta vizito eble ÅanÄos la ordo de la plej vizititaj</li>
+<li><strong>Dosieronomo</strong>: Nomo donita en informokampo</li>
+<li><strong>Identigilo</strong>: Ena identigilo (freÅaj kategorioj havas pli altan identigilon ol la antaÅ­aj).</li>
+
+</ul>
+<p><strong>(*)</strong>Averto: Certu, ke vi testas tiujn ordigajn ordojn vi mem, ĉar eblas, ke ili montras neatenditajn rezultojn.</p>
+
+<h3>Reprezentanto</h3>
+
+<p>La fotaro-reprezentanto estas la miniaturo videbla sur la ĉefpaÄo (<span class="pwgScreen">category.php</span>) por reprezenti
+la fotaton kiam
+Äi enhavas nur sub-fotarojn kaj neniun direktan foton (rekte en la radiko-fotaro).</p>
+foto de fotaro:</p>
+
+<ul>
+
+ <li><span class="pwgScreen">Foto paÄo</span>: unu el la agobutonoj lasas vin agordi la kurantan foton kiel la reprezentanton por la
+ vidigita fotaro. Tiu butono disponeblas nur por la administrantoj.</li>
+
+ <li><span class="pwgScreen">Modifi informojn pri foto</span> en
+ administrado. Tiu ekrano atingeblas el <span
+ class="pwgScreen">picture.php</span> aÅ­ <span class="pwgScreen">Stapla
+ administrado</span> en <em>unureÄimo</em>. Vidi la helpon de tiu ekrano por
+ la detaloj.</li>
+
+ <li><span class="pwgScreen">Administrado &raquo; Fotaroj &raquo; Ecoj,
+ Reprezentanto</span>. Vidi la helpon de tiu ekrano por la detaloj.</li>
+
+ <li><span class="pwgScreen">Redakti fotaron</span> (la nuna ekrano).</li>
+
+</ul>
+
+<p>La elekto de reprezentanto dependas de la
+<code>allow_random_representative</code> agorda parametro (vidi <span
+class="filename">include/config_default.inc.php</span>).</p>
+
+<p>En apriora reÄimo (<code>allow_random_representative</code> Åaltita al falsa),
+ĉiu fotaro enhavanta almenaŭ unu eron estas reprezentita de fiksita
+ero. Post la agordo (je la fotara kreado), la reprezentanto ÅanÄiÄas nur
+kiam administranto petas tion. Se la reprezentanto ne taÅ­gas,
+vi povas peti por <strong>Trovi novan reprezentanton hazarde</strong>.</p>
+
+<p>Se la <code>allow_random_representative</code> agorda parametro estas Åaltita
+al vera, eblas ke kategorio enhavanta fotojn ne havu fiksitan
+reprezentanton. Nur uzu la <strong>Forigi reprezentanton</strong> butonon.</p>
+
+<p>Se la fotaro enhavas nur sub-fotarojn kaj neniu foto, Äin povas tamen reprezenti iu ajn elemento dank' al <span class="pwgScreen">Modifi
+informojn pri foto</span> ekrano. La nura opcio sur la kuranta ekrano
+estas la <strong>Forigi reprezentanton</strong> butono.</p>
+
+<h3>Ligi ĉiujn fotarajn fotojn al nova fotaro</h3>
+
+<ul>
+
+<li><strong>Nomo de virtuala fotaro</strong>: Nomo de la nova fotaro kreota,
+ĉiuj fotoj de la kuranta kategorio estos ligita al la nova.</li>
+
+<li><strong>Patra fotaro</strong>: Kie la nova fotaro kuÅos,
+lasu malplena por krei Äin ĉe la radiko.</li>
+
+</ul>
+
+<h3>Ligi ĉiujn fotojn de la fotaro al ekzistantaj fotaroj</h3>
+
+<ul>
+
+<li><strong>Fotaroj</strong>: Elekti la celata fotaro.</li>
+
+</ul>
+
+<h3>Sendi informan retmesaÄon al la grupanoj</h3>
+
+<ul>
+
+<li><strong>Grupo</strong>: grupo de ricevantoj</li>
+
+<li><strong>RetmesaÄoenhavo</strong>: Libera teksto sendota al ili.</li>
+
+</ul> \ No newline at end of file
diff --git a/language/eo_EO/help/cat_move.html b/language/eo_EO/help/cat_move.html
new file mode 100755
index 000000000..a5b7e1386
--- /dev/null
+++ b/language/eo_EO/help/cat_move.html
@@ -0,0 +1,16 @@
+Dosierenhavo
+
+<h2>Movi virtualajn Fotarojn</h2>
+
+<p>Nur virtualaj fotaroj povas havi novan patran fotaron.</p>
+
+<h3>Virtualaj fotaroj movendaj</h3>
+
+<p>Selektu unu aÅ­ plurajn virtualajn fotarojn, kiujn vi deziras movi.
+Se la listo malplenas, tio signifas, ke vi ankoraÅ­ ne kreis iun.</p>
+
+<h3>Nova patra fotaro</h3>
+
+<p>Selektu la novan patran fotaron (virtualan aÅ­ realan).
+Se vi ne selektas iun patran, la virtualaj fotaroj selektitaj moviÄos al la radiko.
+Ne eblas movi fotaron enen de Äi mem aÅ­ al unu el Äiaj idoj.</p> \ No newline at end of file
diff --git a/language/eo_EO/help/cat_options.html b/language/eo_EO/help/cat_options.html
new file mode 100755
index 000000000..f3ccd83ef
--- /dev/null
+++ b/language/eo_EO/help/cat_options.html
@@ -0,0 +1,22 @@
+<h2>Fotaraj opcioj</h2>
+
+<p>Administrado de la opcioj por pluraj fotaroj samtempe.</p>
+
+<dl>
+
+<dt>Komentoj</dt>
+<dd>Foto povas ricevi komentojn el viaj vizitantoj se Äi apartenas al fotaro kun aktivigitaj komentoj.</dd>
+
+<dt>Åœlosado</dt>
+<dd>Åœlositaj fotaroj malaktiviÄas dum funkciteno. Nur administrantoj povas vidi ilin en la galerio.</dd>
+
+<dt>Publika / privata</dt>
+<dd>Post kiam fotaro iÄas privata, rajtigas atingon al uzantoj kaj grupoj</dd>
+
+<dt>Reprezentanto</dt>
+<dd>Tiu opcio disponeblas, kiam vi Åaltas la agordilo
+<code>allow_random_representative</code> (vidu <span
+ class="filename">include/config_defaults.inc.php</span>) al
+<em>vera</em>. Ĉiu fotaro povas esti reprezentita de hazarda foto aŭ de selektita foto kiel nura reprezentanto.</dd>
+
+</dl> \ No newline at end of file
diff --git a/language/eo_EO/help/cat_perm.html b/language/eo_EO/help/cat_perm.html
new file mode 100755
index 000000000..d339be102
--- /dev/null
+++ b/language/eo_EO/help/cat_perm.html
@@ -0,0 +1,13 @@
+<h2>Redakti fotaran permesojn</h2>
+
+<p>Tiu ekrano nur disponeblas por privataj fotaroj. Ĉi tie vi povas selekti
+uzantojn kaj grupojn rajtigitajn por fotaro.</p>
+
+<h3>Grupoj</h3>
+
+<p>Vi povas rifuzi aÅ­ doni grupatingon al la kuranta fotaro. Modifante
+gruporajtigojn, atingo al la fotaro estos rifuzita aÅ­ donita al la uzantoj ene de tiuj grupoj.</p>
+
+<h3>Uzantoj</h3>
+
+<p>Vi povas rifuzi aÅ­ doni atingon al individuaj uzantoj. Atingo povas rifuziÄi al uzantoj kun grupatingo per escepto.</p> \ No newline at end of file
diff --git a/language/eo_EO/help/group_list.html b/language/eo_EO/help/group_list.html
new file mode 100755
index 000000000..0530d962d
--- /dev/null
+++ b/language/eo_EO/help/group_list.html
@@ -0,0 +1,22 @@
+<h2>Listo de grupoj</h2>
+
+<p>Tio estas la loko kie vi administras la grupojn.</p>
+
+<h3>Aldoni grupon</h3>
+
+<p>Administranto povas aldoni grupojn.</p>
+
+<h3>Listo de grupoj</h3>
+
+<p>Por ĉiu grupo, la jenaj agoj aplikeblas:</p>
+
+
+<ul>
+ <li>iri al administrado de uzantoj (Administrado &raquo; Uzantoj &raquo; Administri)</li>
+ <li>iri al la ekrano por administri la permesilojn por rajtigi aÅ­ rifuzi atingon al privataj fotaroj.</li>
+ <li>forigi la grupon (necesas konfirmo)</li>
+ <li>baskuligi la statuson al "apriora" (necesas konfirmo)</li>
+</ul>
+
+<h3>Aprioraj grupoj</h3>
+<p>Aprioraj grupoj estas grupoj aŭtomate asociigitaj al ĉiu nova uzanto dum registrado aŭ kreado de administranto.</p> \ No newline at end of file
diff --git a/language/eo_EO/help/help_groups.html b/language/eo_EO/help/help_groups.html
new file mode 100755
index 000000000..1403e3501
--- /dev/null
+++ b/language/eo_EO/help/help_groups.html
@@ -0,0 +1,11 @@
+<p>Grupoj estas oportuna metodo por doni permesojn al listo de uzantoj.</p>
+
+<p>Krei grupojn en <span class="pwgScreen">Administradon &raquo; Uzantojn
+&raquo; Grupojn</span> kaj asocii uzantojn al tiu grupo
+en <span class="pwgScreen">Administrado &raquo; Uzantoj &raquo;
+Administri</span>.</p>
+
+<p>Uzanto povas aparteni al pluraj grupoj. Rajtigoj havas prioritaton super
+malpermeso: se la uzanto "Joĉjo" apartenas al grupoj "familio" kaj "amikoj", kaj
+se nur la grupoj "familio" povas vidi la fotaron "Ferioj 2010", do
+"Joĉjo" povos vidi la fotaron "Ferioj 2010".</p> \ No newline at end of file
diff --git a/language/eo_EO/help/user_list.html b/language/eo_EO/help/user_list.html
new file mode 100755
index 000000000..48b4005aa
--- /dev/null
+++ b/language/eo_EO/help/user_list.html
@@ -0,0 +1,23 @@
+<h2>Listo de uzantoj</h2>
+
+<p>Tie estas, kie vi administras la uzantoj de via Piwigo-galerio.</p>
+
+<h3>Aldoni uzanton</h3>
+
+<p>Administranto povas permane aldoni uzantojn. Por ĉiu uzanto, kreu salutnomon, pasvorton kaj sendu validan retadreson.</p>
+
+<h3>Listo de uzantoj</h3>
+
+<p>Eblas filtri la liston de ekzistantaj uzantoj laÅ­ salutnomo (uzu * kiel ĵokeran signon), grupo aÅ­ stato. Eblas ordigi Äin laÅ­ registrodato aÅ­ salutnomo, en krska aÅ­ malkreska ordo.</p>
+
+<p>Tiu ekrano permesas la administradon de pluraj uzantoj unugrupe, uzante variajn agojn:</p>
+
+<ul>
+ <li>forigi uzantojn (necesas konfirmo)</li>
+ <li>ÅanÄi la staton de la uzanto</li>
+ <li>asocii al aÅ­ malasocii el grupoj</li>
+ <li>modifi vidigecojn</li>
+ <li>modifi aldonajn preferecojn</li>
+</ul>
+
+<p>Celas la selektitan uzanton (apriore) aŭ ĉiujn uzantojn kiel vidigitajn en la filtrita listo.</p> \ No newline at end of file
diff --git a/language/eo_EO/install.lang.php b/language/eo_EO/install.lang.php
new file mode 100755
index 000000000..7a80237d8
--- /dev/null
+++ b/language/eo_EO/install.lang.php
@@ -0,0 +1,68 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+$lang['webmaster login can\'t contain characters \' or "'] = 'la retejestra salutnomo ne devas enteni la signoj \' aÅ­ "';
+$lang['user password given by your host provider'] = 'uzanto-pasvorto provizita de via provizanto de gastigo';
+$lang['user login given by your host provider'] = 'uzanto-salutnomo provizita de via provizanto de gastigo';
+$lang['please enter your password again'] = 'bonvolu tajpi vian pasvorton denove';
+$lang['enter a login for webmaster'] = 'entajpu retestran salutnomon';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'per Äi, prefiksoj aldoniÄos sur la nomojn de la datumtabelo (ebligas al vi pli bone mastrumi viajn tabelojn)';
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Vi devus vin direkti al la subtenoservo de via provizanto de gastigo, kaj serĉi kiel vi mem povas interÅanÄi al PHP 5.';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Vi povas elÅuti la agordan dosieron kaj alÅuti Äin al la dosierujo "local/config" dum via instalado.';
+$lang['Just another Piwigo gallery'] = 'Nur alia bildogalerio ĉe Piwigo';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Eblas, ke Piwigo provos interÅanÄi vian agordon al PHP 5 kreante aÅ­ modifiante iun .htaccess-dosieron.';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Notu, ke eblas ÅanÄi vian agordon mem kaj poste restartigi Piwigo.';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'Gardu Äin sekreta, Äi ebligas al vi aliri la administran panelon';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Äœi montriÄos al vizitantoj. Necesas por reteja administrado';
+$lang['It appears your webhost is currently running PHP %s.'] = 'Åœajnas, ke via retejgastiganto nuntempe funkciigas PHP %s.';
+$lang['Welcome to your new installation of Piwigo!'] = 'Bonvenon al via nova instalado de Piwigo!';
+$lang['also given by your host provider'] = 'ankaÅ­ provizita de via provizanto de gastigo';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Ĉu vi bezonas helpon? Starigu demandon ĉe la <a href="%s">mesaÄtabulo de Piwigo</a>.';
+$lang['Try to configure PHP 5'] = 'Provu agordi PHP 5';
+$lang['Sorry!'] = 'Pardonu!';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'La vizitantoj povos uzi tiun retadreson por kontakti la retestron';
+$lang['Welcome to my photo gallery'] = 'Bonvenon al mia foto-galerio';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo ne kapablis agordi PHP 5.';
+$lang['verification'] = 'kontrolado';
+$lang['Hope to see you back soon.'] = 'Äœis baldaÅ­a vizito via.';
+$lang['Start Install'] = 'Komenci la instaladon';
+$lang['Password ']['confirm'] = 'Pasvorto [konfirmu]';
+$lang['PHP 5 is required'] = 'Necesas PHP 5';
+$lang['User'] = 'Uzanto';
+$lang['Download the config file'] = 'ElÅuti la agordan dosieron';
+$lang['Database table prefix'] = 'Prefikso de datumtabeloj';
+$lang['Host'] = 'Gastiga komputilo';
+$lang['Installation'] = 'Instalado';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Ne hezitu viziti niajn forumojn por obteni helpon: %s';
+$lang['Default gallery language'] = 'Apriora galeri-lingvo';
+$lang['Database name'] = 'Nomo de datumbazo';
+$lang['Database configuration'] = 'Agordo de datumbazo';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'AnstataÅ­a solvo estas kopii la tekston en la ĉisupra tekstujo kaj alglui Äin al la dosiero "local/config/database.inc.php" (Averto: nepras ke database.inc.php nur entenu tion, kio ĉeestas en la tekstujo, sen alineo nek spaceto)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'La kreado de local/config/database.inc.php malsukcesis.';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Sukcesis kontektado kun la servilo, sed ne eblis konektado kun la datumbazo';
+$lang['Congratulations, Piwigo installation is completed'] = 'Gratulon, la instalado de Piwigo plenumiÄis';
+$lang['Can\'t connect to server'] = 'Ne eblas konekti kun la servilo';
+$lang['Basic configuration'] = 'Baza agordo';
+$lang['Admin configuration'] = 'Administra agordo';
+$lang['localhost or other, supplied by your host provider'] = 'loka gasto (localhost) aÅ­ alia, provizita de via provizanto de gastigo';
+?> \ No newline at end of file
diff --git a/language/eo_EO/upgrade.lang.php b/language/eo_EO/upgrade.lang.php
new file mode 100755
index 000000000..4200e8d82
--- /dev/null
+++ b/language/eo_EO/upgrade.lang.php
@@ -0,0 +1,40 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['SQL queries'] = 'SQL petoj';
+$lang['Upgrade informations'] = 'Informoj pri la Äisdatigo';
+$lang['User permissions and group permissions have been erased'] = 'La permesoj de uzantoj kaj de grupoj viÅiÄis';
+$lang['You do not have access rights to run upgrade'] = 'Vi ne havas akcesrajtojn por lanĉi Äisdatigon';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Tiu-ĉi paÄo proponas Äisdatigi la datenbazon de via eksa Piwigo-versio al la nova. La Äisdatiga asistanto pensas ke vi nun funkciigas <strong>versio %s</strong> (aÅ­ simila).';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Plenumu funkcitenan kontrolon en [Administrado>Iloj>Funkciteno] se vi alfrontas problemon.';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Nur la miniatura prefikso kaj la retestra retadreso konserviÄis el la antaÅ­a agordo';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Kiel singardo, la jenaj temoj malaktiviÄis. Kontrolserĉu Äisdatigojn antaÅ­ ol reaktivigi ilin:';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'Kiel singardo, la jenaj krom-programoj malaktiviÄis. Kontrolserĉu Äisdatigojn antaÅ­ ol reaktivigi ilin:';
+$lang['total upgrade time'] = 'kompleta Äisdatigotempo';
+$lang['total SQL time'] = 'kompleta SQL-tempo';
+$lang['Upgrade from version %s to %s'] = 'Äœisdatigu de versio %s al %s';
+$lang['Upgrade'] = 'Äœisdatigi';
+$lang['Statistics'] = 'Statistikoj';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'Nur administranto povas lanĉi Äisdatigadon: bonvolu ensaluti ĉisube.';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'En <i>%s</i>, antaÅ­ <b>?></b>, enmetu:';
+$lang['All sub-albums of private albums become private'] = 'Ĉiuj sub-fotaroj el privataj fotaroj iÄas privataj';
+?> \ No newline at end of file
diff --git a/language/es_AR/common.lang.php b/language/es_AR/common.lang.php
index 262666a09..7fc05c7e3 100644
--- a/language/es_AR/common.lang.php
+++ b/language/es_AR/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Argentina [AR]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=418
Author: Piwigo team
Author URI: http://piwigo.org
@@ -34,6 +34,7 @@ $lang_info['country'] = 'Argentina';
$lang_info['direction'] = 'ltr';
$lang_info['code'] = 'es';
$lang_info['zero_plural'] = false;
+$lang_info['parent']= "es_ES";
$lang['%d Kb'] = '%d Kb';
$lang['%d album updated'] = '%d categoría actualizada';
@@ -244,7 +245,6 @@ $lang['login mustn\'t end with a space character'] = 'el nombre de usuario no de
$lang['login mustn\'t start with a space character'] = 'el nombre de usuario no debe empezar por un espacio';
$lang['this login is already used'] = 'ese nombre de usuario ya existe';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'la dirección de correo electrónico debe tener esta forma: xxx@yyy.eee (ejemplo : jack@altern.org)';
-$lang['please enter your password again'] = 'Por favor vuelva a ingresar su contraseña';
$lang['Auto login'] = 'Connexión automática';
$lang['remove this tag from the list'] = 'borrar este tag de la lista';
$lang['representative'] = 'Representante';
@@ -272,7 +272,6 @@ $lang['SQL queries in'] = 'pedidos SQL en';
$lang['display only recently posted photos'] = 'mostrar sólo los elementos recientes';
$lang['return to the display of all photos'] = 'volver a mostrar todos los elementos';
$lang['the beginning'] = 'principio';
-$lang['Interface theme'] = 'Tema de la interfaz';
$lang['Thumbnails'] = 'Diapositivas';
$lang['Menu'] = 'Menú';
$lang['A comment on your site'] = 'Hay un comentario en el sitio';
@@ -413,5 +412,13 @@ $lang['Username is mandatory'] = 'El nombre de usuario es obligatorio';
$lang['mandatory'] = 'obligatorio';
$lang['Website'] = 'Sitio web';
$lang['Your website URL is invalid'] = 'La dirección de su sitio web no es válida';
+$lang['First Page'] = 'Primera página';
+$lang['Go back to the album'] = 'Volver al álbum';
+$lang['Last Page'] = 'Última página';
+$lang['Email'] = 'Correo electrónico';
+$lang['%d photos per page'] = '%d fotos por página';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Falta confirmación de su contraseña. Por favor confirme la contraseña elegida.';
+$lang['Password is missing. Please enter the password.'] = 'Falta la contraseña. Por favor escriba su contraseña';
+$lang['Theme'] = 'Tema';
?> \ No newline at end of file
diff --git a/language/es_AR/index.php b/language/es_AR/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/es_AR/index.php
+++ b/language/es_AR/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/es_ES/about.html b/language/es_ES/about.html
index 5bf73381f..4fb65640b 100644
--- a/language/es_ES/about.html
+++ b/language/es_ES/about.html
@@ -1,18 +1,18 @@
-<p>Esta galeria foto esta basada en Piwigo</p>
+<p>Esta galeria fotográfica está basada en Piwigo.</p>
-<p>Piwigo es un programa de galeria foto para la web, desarollado por una comunidad activa de
-usuarios y desarolladores. Las extensiones hacen que Piwigo sea facilmente personalisable.
-Ginda sobre el pastel, Piwigo es libre y gratis.</p><p id="linkToPiwigo"><a href="http://es.piwigo.org">Visita el sitio web de Piwigo</a></p>
+<p>Piwigo es un programa de álbumes de fotos web, desarrollado por una comunidad activa de
+usuarios y desarrolladores. Las extensiones hacen que Piwigo sea fácilmente personalizable.
+Y lo mejor... Piwigo es de código abierto y gratuito.</p>
-<p>La traducción al español de Piwigo esta mantenida por :
+<p id="linkToPiwigo"><a href="http://es.piwigo.org">Visita el sitio web de Piwigo</a></p>
- <ul>
+<p>La traducción de Piwigo al español está mantenida por: (en orden alfabético)
+ <ul>
<li><a href="http://piwigo.org/forum/profile.php?id=4937">AM</a></li>
<li><a href="http://es.piwigo.org/forum/profile.php?id=4747">AlbertParera</a></li>
- <li><a href="http://fr.piwigo.org/forum/profile.php?id=16626">crazydark</a></li>
- <li><a href="http://fr.piwigo.org/forum/profile.php?id=5339">jpr928</a></li>
+ <li><a href="http://es.piwigo.org/forum/profile.php?id=4714">crazydark</a></li>
+ <li><a href="http://es.piwigo.org/forum/profile.php?id=4703">jpr928</a></li>
<li><a href="http://piwigo.org/forum/profile.php?id=15900">opinador</a></li>
<li><a href="http://piwigo.org/forum/profile.php?id=15398">petaqui</a></li>
</ul>
- ...Gracias a ellos</p>
-
+<p>Gracias por vuestra colaboración</p> \ No newline at end of file
diff --git a/language/es_ES/admin.lang.php b/language/es_ES/admin.lang.php
index 5626557cd..10382a782 100644
--- a/language/es_ES/admin.lang.php
+++ b/language/es_ES/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -187,7 +187,6 @@ $lang['Access type'] = 'Tipo de acceso';
$lang['Information data registered in database'] = 'Información registrada en la base de datos';
$lang['Default display'] = 'Visualización predeterminada';
$lang['The gallery URL is not valid.'] = 'La dirección de la galería no es válida.';
-$lang['Main'] = 'Principal';
$lang['The number of comments a page must be between 5 and 50 included.'] = 'El número de comentarios de usuarios por página debe estar comprendido entre 5 y 50.';
$lang['Configuration'] = 'Configuración';
$lang['confirm'] = 'Confirmar';
@@ -221,10 +220,9 @@ $lang['Prepared time for list of users to send mail is limited. Others users are
$lang['Time to send mail is limited. Others mails are skipped.'] = 'El tiempo de envío de los mails es limitado. Los otros envíos de mails han sido ignorados.';
$lang['To send ?'] = '¿Enviar?';
$lang['Last send'] = 'Último envío';
-$lang['email'] = 'e-mail';
$lang['User'] = 'Usuario';
$lang['See you soon,'] = 'Hasta pronto,';
-$lang['Go to'] = 'Vaya a ';
+$lang['Go to'] = 'Ir a ';
$lang['Hello'] = 'Hola ';
$lang['New photos were added'] = 'Han sido añadidas nuevas fotos';
$lang['on'] = 'en ';
@@ -424,14 +422,14 @@ $lang['Correction applied with error'] = 'Corrección aplicada con errores';
$lang['%d anomaly has been detected.'] = '%d anomalía ha sido detectada.';
$lang['%d anomalies have been detected.'] = '%d anomalías han sido detectadas.';
$lang['%d anomaly has been corrected.'] = '%d anomalía ha sido corregida.';
-$lang['%d anomalies have been detected corrected.'] = '%d anomalías han sido corregidas.';
+$lang['%d anomalies have been detected corrected.'] = '%d anomalías han sido detectadas y corregidas.';
$lang['%d anomaly has not been corrected.'] = '%d anomalía no pudo ser corregida.';
$lang['%d anomalies have not been corrected.'] = '%d anomalías no pudieron ser corregidas.';
-$lang['Go to %s or %s for more informations'] = 'Vaya a %s o %s para más información';
+$lang['Go to %s or %s for more informations'] = 'Ir a %s o %s para más información';
$lang['the forum'] = 'El foro';
$lang['the wiki'] = 'El wiki';
$lang['%s value is not correct file because exif are not supported'] = 'El valor %s no es correcto porque los datos Exif no están soportados';
-$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s debe ser puesto a "false" en su fichero config_local.inc.php';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s debe establecerse a "false" en su fichero config_local.inc.php';
$lang['Main "guest" user does not exist'] = 'El usuario principal "invitado" no existe.';
$lang['Main "guest" user status is incorrect'] = 'El estado del usuario principal "invitado" es incorrecto';
$lang['Default user does not exist'] = 'El usuario predeterminado no existe';
@@ -548,11 +546,11 @@ $lang['Add New Theme'] = 'Añadir nuevo tema';
$lang['Forbid this theme to users'] = 'Prohibir este tema a los usuarios';
$lang['Set as default theme for unregistered and new users'] = 'Establecer como tema predeterminado para visitantes no registrados y para nuevos usuarios';
$lang['unknown'] = 'desconocido';
-$lang['Upload Photos'] = 'Agregar fotos';
-$lang['Drop into album'] = 'Arrastrar a un álbum';
-$lang['+ Add an upload box'] = '+ Añadir otra caja de transferencia';
+$lang['Upload Photos'] = 'Añadir fotos';
+$lang['Drop into album'] = 'Seleccionar álbum';
+$lang['+ Add an upload box'] = '+ Añadir campo de subida';
$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Crear el directorio "%s" en la raíz de su instalación Piwigo';
-$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Dé permisos de escritura (chmod 777) al directorio "%s" en la raíz de su instalación Piwigo';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Concede permisos de escritura (chmod 777) al directorio "%s" en la raíz de su instalación Piwigo';
$lang['existing album'] = 'Ãlbum existente';
$lang['create a new album'] = 'Añadir un nuevo álbum';
$lang['Album name'] = 'Nombre del álbum';
@@ -597,7 +595,7 @@ $lang['Switch to clear or dark colors for administration'] = 'Contrasta escogien
$lang['Theme has been successfully installed'] = 'El tema ha sido instalado con éxito';
$lang['Visit Gallery'] = 'Volver a la galería';
$lang['Visit Piwigo project website'] = 'Visitar el sitio web del proyecto Piwigo';
-$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'PLoader significa <em>Piwigo Uploader</em>. Desde su ordenador, pLoader prepara sus fotos y los traslada hacia su galería foto Piwigo.';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader significa <em>Piwigo Uploader</em>. Desde su ordenador, prepare sus fotos con pLoader y transfiéralas a su galería fotográfica Piwigo.';
$lang['Guest Settings'] = 'Ajustes de los invitados';
$lang['Main Page'] = 'Página principal';
$lang['Photo Page'] = 'Página de la foto';
@@ -806,7 +804,7 @@ $lang['Send connection settings by email'] = 'Enviar credenciales por email';
$lang['The original image quality must be a number between %d and %d'] = 'La calidad de la foto original ha de ser un número entre %d y %d';
$lang['The original maximum height must be a number between %d and %d'] = 'La altura máxima de la foto original ha de ser un número entre %d y %d';
$lang['The original maximum width must be a number between %d and %d'] = 'La anchura máxima de la foto original ha de ser un número entre %d y %d';
-$lang['A locked gallery is only visible to administrators'] = 'Una galería bloqueada solo es visible por los administradores';
+$lang['A locked gallery is only visible to administrators'] = 'Una galería bloqueada sólo es visible por los administradores';
$lang['administrators'] = 'administradores';
$lang['Gallery unlocked'] = 'Galería desbloqueada';
$lang['modified'] = 'modifcado';
@@ -834,12 +832,12 @@ $lang['Not cropped correctly?'] = '¿No se ha recortado correctamente?';
$lang['Save manual order'] = 'Guardar orden manual';
$lang['Web Form'] = 'Formulario web';
$lang['You can activate only one mobile theme.'] = 'Sólo se puede activar un tema para dispositivos móviles.';
-$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = 'La aplicacion de <em>Piwigo para Android</em> te permite conectar tu galería Piwigo a tu dispositivo Android y poder crear álbumes y subir fotos desde estos dispositivos.';
-$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = 'Las aplicaciones de <em>Piwigo para iOS</em> te permiten conectar tu galería Piwigo a tu iPhone, iPad o iPod Touch y poder crear álbumes y subir fotos desde estos dispositivos.';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = 'La aplicación <em>Piwigo para Android</em> te permite conectarte a tu galería Piwigo desde tu teléfono o tablet Android, crear álbumes y subir varias fotos a la vez.';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = 'Las aplicación <em>Piwigo para iOS</em> te permite conectarte a tu galería Piwigo desde tu iPhone, iPad o iPod Touch, crear álbumes y subir varias fotos a la vez.';
$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Lightroom es un software fotográfico diseñado para administrar grandes cantidades de imágenes y realizar el procesado de las mismas.';
$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture es una potente herramienta para editar imágenes y administrar grandes colecciones en Mac.';
$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture está diseñada para fotógrafos profesionales con la simplicidad de iPhoto.';
-$lang['Available on'] = 'Disponible el';
+$lang['Available on'] = 'Disponible en';
$lang['Available versions for'] = 'Versión disponible para';
$lang['Delete multiple size images'] = 'Eliminar imágenes con múltiples tamaños';
$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam es un avanzado gestor de fotos gratuito para Linux, Windows y MacOSX.';
@@ -856,7 +854,7 @@ $lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo para iOS (iPhone, i
$lang['Piwigo publish plugin for digiKam'] = 'Plugin de Piwigo para digiKam';
$lang['Piwigo Publish plugin for Lightroom'] = 'Plugin de publicación de Piwigo para Lightroom';
$lang['Piwigo publish plugin for Shotwell'] = 'Plugin de Piwigo para Shotwell';
-$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (RemoteGallery para Android) es un software de código abierto (GPL v3) cliente de Piwigo para tu dispositivo Android.';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (cliente RemoteGallery para Android) es un software cliente de Piwigo de código abierto (GPL v3) para la plataforma Android.';
$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell es un software de código abierto para Linux que sirve para organizar colecciones de fotos. Es el software fotográfico por defecto en Ubuntu y Fedora.';
$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'El plugin Piwigo Export permite crear álbumes y exportar fotos.';
$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'El plugin de Piwigo Publish te permite exportar y sincronizar fotos de Lightroom directamente con tu galería fotográfica.';
@@ -924,8 +922,6 @@ $lang['Duplicate selected tags'] = 'Borrar etiquetas duplicadas';
$lang['Name of the duplicate'] = 'Nombre de los duplicados';
$lang['Source tag'] = 'Origen de las etiquetas';
$lang['Tag "%s" is now a duplicate of "%s"'] = 'La etiqueta "%s" es ahora un duplicado de "%s"';
-$lang['Format'] = 'Formato';
-$lang['Invalid dimension'] = 'Dimensión no valida';
$lang['Landscape'] = 'Paisaje';
$lang['Minimum height'] = 'Altura minima';
$lang['Minimum width'] = 'Anchura minima';
@@ -934,8 +930,6 @@ $lang['Portrait'] = 'Retrato';
$lang['Manage photos'] = 'Administrar fotos';
$lang['View in gallery'] = 'Ver en galería';
$lang['Number of albums per page'] = 'Numero de álbumes por paginas';
-$lang['Maximum'] = 'Máximo';
-$lang['Minimum'] = 'Mínimo';
$lang['Ratio'] = 'Proporción';
$lang['between %.2f and %.2f'] = 'entre %.2f y %.2f';
$lang['between %d and %d pixels'] = 'entre %d y %d pixels';
@@ -951,4 +945,32 @@ $lang['This group will be unset to default'] = 'Este grupo ya no se utiliza por
$lang['Type here the name of the new group'] = 'Escriba aquí el nombre del nuevo grupo';
$lang['Purge user cache'] = 'Limpiar cache de usuario';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'Las dimensiones de la imagen se reducirá a %dx%d píxeles.';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'Redimensionado después de la carga al servidor debido a la utilización de GD como librería gráfica.';
+$lang['Select at least one tag'] = 'Selecciona al menos una etiqueta';
+$lang['Basic settings'] = 'Configuración básica';
+$lang['General'] = 'General';
+$lang['Mail theme'] = 'tema de correo';
+$lang['%d of %d users selected'] = '%d de %d usuarios seleccionados';
+$lang['(filtered from %s total users)'] = '(filtrado de un total de %s usuarios';
+$lang['All %d users are selected'] = 'Los %d usuarios están seleccionados';
+$lang['Change password'] = 'Cambiar contraseñas';
+$lang['Change username'] = 'Cambiar nombre de usuarios';
+$lang['Last visit on %s, %s.'] = 'Ultima visita el %s, %s';
+$lang['Loading...'] = 'Cargando...';
+$lang['No matching user found'] = 'Ningún miembro coincidentes encontrados';
+$lang['No user selected of %d users'] = 'Ninguno de los %d usuarios seleccionados';
+$lang['No user selected, no action possible.'] = 'Ningún usuario seleccionado, ninguna acción posible. ';
+$lang['Password updated'] = 'Contraseña actualizado';
+$lang['Registered on %s, %s.'] = 'Registrado el %s, %s';
+$lang['Show %s users'] = 'Mostrar %s usuarios';
+$lang['Showing %s to %s of %s users'] = 'Mostrar de %s hasta %s de los %s usuarios';
+$lang['Update user'] = 'Actualizar usuario';
+$lang['User %s added'] = 'Usuario %s añadido';
+$lang['User %s updated'] = 'Usuario %s actualizado';
+$lang['Users modified'] = 'Usuarios modificados';
+$lang['on the %d selected users'] = 'en los %d usuarios seleccionados';
+$lang['close'] = 'cerrar';
+$lang['Close user details'] = 'Cerrar detalles de usuario';
+$lang['Open user details'] = 'Abrir detalles de usuario';
?> \ No newline at end of file
diff --git a/language/es_ES/common.lang.php b/language/es_ES/common.lang.php
index 9228eb947..908606a0d 100644
--- a/language/es_ES/common.lang.php
+++ b/language/es_ES/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Español [ES]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=169
Author: Piwigo team
Author URI: http://piwigo.org
@@ -60,10 +60,10 @@ $lang['Album'] = 'Ãlbum';
$lang['Close this window'] = 'Cerrar ventana';
$lang['Complete RSS feed (photos, comments)'] = 'Canal RSS completo (fotos y comentarios)';
$lang['Confirm Password'] = 'Confirmar contraseña';
-$lang['Connection settings'] = 'Paràmetros de conexión';
+$lang['Connection settings'] = 'Parámetros de conexión';
$lang['Login'] = 'Identificarse';
$lang['Contact webmaster'] = 'Contactar con el webmaster';
-$lang['Create a new account'] = 'Crear una nueva cuenta';
+$lang['Create a new account'] = 'Crear una cuenta nueva';
$lang['Created on'] = 'Creada el';
$lang['Creation date'] = 'Fecha de creación';
$lang['Current password is wrong'] = 'La contraseña actual es incorrecta';
@@ -252,7 +252,6 @@ $lang['login mustn\'t end with a space character'] = 'El nombre de usuario no pu
$lang['login mustn\'t start with a space character'] = 'El nombre de usuario no puede empezar por el carácter \'espacio\'';
$lang['this login is already used'] = 'Este nombre de usuario ya lo está utilizando otro usuario';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'El formato de la dirección e-mail debe ser xxx@yyy.eee (ejemplo: jack@altern.org)';
-$lang['please enter your password again'] = 'Por favor, escriba de nuevo su contraseña';
$lang['Auto login'] = 'Recordar';
$lang['remove this tag from the list'] = 'elimine esta etiqueta de la lista';
$lang['representative'] = 'Representar';
@@ -280,10 +279,9 @@ $lang['SQL queries in'] = 'consultas SQL en';
$lang['display only recently posted photos'] = 'Visualizar sólo las fotos publicadas recientemente';
$lang['return to the display of all photos'] = 'Volver a visualizar todas la imágenes';
$lang['the beginning'] = 'El principio';
-$lang['Interface theme'] = 'Tema predeterminado';
$lang['Thumbnails'] = 'Diapositivas';
$lang['Menu'] = 'Menú';
-$lang['A comment on your site'] = 'Un comentario acerca de este sitio web';
+$lang['A comment on your site'] = 'Un comentario de tu sitio web';
$lang['today'] = 'Hoy';
$lang['Update your rating'] = 'Cambiar valoración';
$lang['the username must be given'] = 'Debe indique el nombre de usuario';
@@ -310,7 +308,7 @@ $lang['Pause of slideshow'] = 'Pausa';
$lang['Repeat the slideshow'] = 'Activar repetición';
$lang['Not repeat the slideshow'] = 'Desactivar repetición';
$lang['Reduce diaporama speed'] = 'Disminuir velocidad';
-$lang['Accelerate diaporama speed'] = 'Incrementar velocidad';
+$lang['Accelerate diaporama speed'] = 'Aumentar la velocidad del pase de diapositivas';
$lang['Submit'] = 'Validar';
$lang['Yes'] = 'Si';
$lang['No'] = 'No';
@@ -401,8 +399,8 @@ $lang['File name, Z &rarr; A'] = 'Nombre de archivo, Z &rarr; A';
$lang['Manual sort order'] = 'Orden manual';
$lang['Numeric identifier, 1 &rarr; 9'] = 'Número de identificación, 1 &rarr; 9';
$lang['Numeric identifier, 9 &rarr; 1'] = 'Número de identificación, 9 &rarr; 1';
-$lang['Photo title, A &rarr; Z'] = 'Título de foto, A &rarr; Z';
-$lang['Photo title, Z &rarr; A'] = 'Título de foto, Z &rarr; A';
+$lang['Photo title, A &rarr; Z'] = 'Título de la foto, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = 'Título de la foto, Z &rarr; A';
$lang['Rating score, high &rarr; low'] = 'Puntuación, más alta &rarr; más baja';
$lang['Rating score, low &rarr; high'] = 'Puntuación, más baja &rarr; más alta';
$lang['Visits, high &rarr; low'] = 'Visitas, más &rarr; menos';
@@ -421,4 +419,12 @@ $lang['Username is mandatory'] = 'El nombre de usuario es obligatorio';
$lang['mandatory'] = 'obligatorio';
$lang['Website'] = 'Página web';
$lang['Your website URL is invalid'] = 'La url de tu página web es incorrecta';
+$lang['Email'] = 'Correo electrónico';
+$lang['First Page'] = 'Primera pagina';
+$lang['Go back to the album'] = 'Volver al álbum';
+$lang['Last Page'] = 'Ultima pagina';
+$lang['Password is missing. Please enter the password.'] = 'Falta la contraseña. Por favor, introdúzcala.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'La contraseña no ha sido confirmada. Por favor, confirme la contraseña elegida.';
+$lang['%d photos per page'] = '%d fotos por paginas';
+$lang['Theme'] = 'Tema';
?> \ No newline at end of file
diff --git a/language/es_ES/help/configuration.html b/language/es_ES/help/configuration.html
index a4571ca4f..6f378fe24 100644
--- a/language/es_ES/help/configuration.html
+++ b/language/es_ES/help/configuration.html
@@ -1,102 +1,99 @@
<h2>Configuración</h2>
-<p>Esta pantalla permite administrar la configuración básica. En efecto, sólo son mostrados los parámetros de configuración que deben ser sufisientes para la mayoría de los administradores. Si usted desea ver la lista de los numerosos (y avanzados) parámetros, leer el fichero <span
-class="filename">include/config_default.inc.php</span></p>
+<p>Esta pantalla permite realizar las tareas básicas de administración de la galería. De hecho, sólo se muestran los principales parámetros de configuración que debieran ser suficiente para la gran mayoría de administradores. Si desea ver los parámetros de configuración avanzados, lea el archivo de configuración <span class="filename">include/config_default.inc.php</span></p>
-<p>Esta pantalla es dividida en varias secciones, reagrupando los parámetros por tema.</p>
+<p>Esta pantalla está dividida en distintas secciones que agrupan parámetros de configuración por temas.</p>
-<h3>Principale</h3>
+<h3>Principal</h3>
<ul>
- <li><strong>Título de la galería</strong>: utilizado para el flujo RSS y la notificación por e-mail.</li>
+ <li><strong>Título de la galería</strong>: utilizado para el canal RSS y las notificaciones por email.</li>
- <li><strong>Bandera de las páginas</strong>: código html visible en lo alto de las páginas.</li>
+ <li><strong>Banner (cabecera de la página)</strong>: código html visible en la parte superior de cada página pública.</li>
- <li><strong>URL de la galería</strong>: utilizado para el flujo RSS.</li>
+ <li><strong>URL de la galería</strong>: usada para la fuente RSS.</li>
- <li><strong>Bloquear la galería</strong>: Bloquear el conjunto de las galerías para mantenimiento. Sólo los administradores podrán acceder a la galería.</li>
+ <li><strong>Bloquear la galería</strong>: Bloquea la galería entera por labores de mantenimiento. Sólo se permite el acceso a los administradores.</li>
- <li><strong>Notación</strong>: La notación de las fotos es posible.</li>
+ <li><strong>Valoración</strong>: Se habilita la característica para poder puntuar las imágenes.</li>
- <li><strong>Notación por los visitantes</strong>: Hasta los usuarios no registrados pueden anotar las imágenes.</li>
+ <li><strong>Valoración por los visitantes</strong>: Incluso los usuarios no registrados pueden puntuar las imágenes.</li>
- <li><strong>Notificar a los administradores en el momento de la inscripción de un usuario</strong>: Los administradores recibirán un mensaje a cada inscripción.</li>
+ <li><strong>Permitir el registro de usuarios</strong>: Cualquier usuario puede registrarse.</li>
- <li><strong>Permitir el registro de los usuarios</strong>: La inscripción es libre para todos ellos.</li>
+ <li><strong>Correo electrónico obligatorio para todos los usuarios</strong>: Se comprobará la dirección de correo electrónico en el registro o actualización de perfiles, excepto si la acción se lleva a cabo por un administrador.</li>
+ <li><strong>Email admins when a new user registers</strong>: administrators will be notified by mail for each registration.</li>
+
+ <li><strong>Notificar a los administradores en el momento de la inscripción de un usuario</strong>: Los administradores serán notificados por email para cada inscripción.</li>
+
+ <li><strong>Orden por defecto de las fotos</strong>: Se puede definir un orden personalizado con estos menús desplegables.</li>
+
</ul>
-<h3>Histórial</h3>
+<h3>Historial</h3>
- <p>Las visitas de las páginas <span
+ <p>Visitas en las páginas <span
class="pwgScreen">index.php</span> y <span
-class="pwgScreen">picture.php</span> Estan registrados en la tabla <code>history</code>.</p>
+class="pwgScreen">picture.php</span> se guardarán en la tabla <code>history</code>.</p>
- <p>Las visitas estan visualizadas en la pantalla <span class="pwgScreen">Administración, Classes de matemáticas superiores, Histórial</span>.</p>
+ <p>Las visitas se muestran en <span class="pwgScreen">Administración &raquo; Herramientas &raquo; Historial</span>.</p>
<ul>
- <li><strong>Registrar las páginas visitadas por los invitados</strong>: las visitas de las páginas por los invitados estan registradas.</li>
+ <li><strong>Registrar las páginas visitadas por los invitados</strong>: Se guardan las páginas visitadas por los invitados.</li>
- <li><strong>Registrar las páginas visitadas por los usuarios</strong>: las visitas del las paginas por los usuarios registrados estan registradas.</li>
+ <li><strong>Registrar las páginas visitadas por los usuarios</strong>: Se guardan las páginas visitadas por los usuarios.</li>
- <li><strong>Registrar las páginas visitadas por los administradores</strong>: Las visitas de las páginas por los administradores son registradas.</li>
+ <li><strong>Registrar las páginas visitadas por los administradores</strong>: Se guardan las páginas visitadas por los administradores.</li>
</ul>
<h3>Comentarios</h3>
<ul>
- <li><strong>Comentarios usuarios para todos</strong>: hasta los usuarios no registrados pueden registrar comentarios.</li>
+ <li><strong>Comentarios para todos</strong>: Incluso los usuarios no registrados pueden publicar comentarios.</li>
- <li><strong>Número de comentarios usuarios por página</strong>.</li>
+ <li><strong>Número de comentarios por página</strong>.</li>
- <li><strong>Validación</strong>: Un administrador debe validar los comentarios usuarios antes de que puedan volverse visibles en la partida pública. La validación de los comentarios usuarios se efectua en la pantalla <span class="pwgScreen">Administración, Imágenes, Comentarios</span>.</li>
+ <li><strong>Validación</strong>: Un administrador debe previamente validar los comentarios escritos por los usuarios antes de que sean visibles públicamente en la galería. La validación de los comentarios de los usuarios se realiza en la pantalla <span class="pwgScreen">Administración &raquo; Herramientas &raquo; Comentarios pendientes</span>.</li>
- <li><strong>Notificar a los administradores cuando un comentario es registrado</strong>:
-Envía un courriel a los administradores cuando un usuarios registra un comentario que es validado.</li>
+ <li><strong>Notificar a los administradores en el momento en que se escriba un comentario validado</strong>: Envía un correo electrónico a los administradores cuando un usuario escribe un comentario que ha sido validado.</li>
- <li><strong>Notificar a los administradores cuando un comentario requiere su validación </strong>:
-Envía un courriel a los administradores cuando un usuarios registra un comentario que necesita una validación por parte de los administradores.
-La validación de los comentarios usuarios se efectua en la pantalla <span class="pwgScreen">Administración, Imágenes, Comentarios</span>.</li>
+ <li><strong>Notificar a los administradores cuando un comentario requiere ser validado</strong>:
+Envía un correo electrónico a los administradores cuando un usuario escribe un comentario que requiere validación por parte del administrador.
+La validación de los comentarios se realiza en <span class="pwgScreen">Administración &raquo; Herramientas &raquo; Comentarios pendientes</span>.</li>
</ul>
-<h3>Descargar</h3>
-<ul>
- <li><strong>Visualizar el lazo de añadido de imagen todo el tiempo</strong>: Si existen unas categorías que permiten el añadido, el lazo de añadido de imagen será visualizado sea cual sea la categoría.</li>
- <li><strong>Nivel de acceso usuario para cargar</strong>: Permite restringirles el añadido a ciertos usuarios</li>
- <li><strong>Notificar a los administradores cuando una imagen es cargada</strong>: Los administradores recibirán un mensaje por cada imagen añadida por un usuario.</li>
-</ul>
<h3>Visualización por defecto</h3>
-<p>Modificar las opciones de visualización por defecto: para los visitantes no conectados. Una vez conectado, estas opciones son sobrecargadas por las del usuario, a las que puede modificar en la pantalla <span
-class="pwgScreen">perfil</span>.</p>
+<p>Aquí puede cambiar las opciones de visualización utilizadas por los invitados (usuarios no autenticados). Una vez hayan iniciado sesión, estas opciones son sobreescritas por las propias del usuario
+(modificable en <span class="pwgScreen">perfil</span>.</p>
-<p>Es posible cambiar estas opciones para los usuarios existentes, pero se trata de una otra pantalla : <span class="pwgScreen">Administración, Identificación, Usuarios</span>, en la cual usted puede modificar estas opciones para una lista de usuarios seleccionados.</p>
+<p>Es posible cambiar las opciones de visualización para todos los usuarios existentes en <span class="pwgScreen">Administración &raquo; Usuarios &raquo; Administrar</span> en la cual usted puede modificar estas opciones para una lista de usuarios seleccionados.</p>
<ul>
- <li><strong>Idioma</strong>: Concierne sólo a las redacciones de Piwigo. Los nombres de categorías, de imagen y las descripciones no son localizados (ie multilingüe).</li>
+ <li><strong>Idioma</strong>: Se aplica sólo a las etiquetas de Piwigo. En los campos de nombres de álbumes de fotos, nombres y descripciones no están localizados.</li>
- <li><strong>Número de miniaturas por línea</strong></li>
+ <li><strong>Número de fotos por fila</strong></li>
- <li><strong>Número de líneas por página</strong></li>
+ <li><strong>Número de filas por página</strong></li>
<li><strong>Tema de la interfaz</strong></li>
- <li><strong>Período reciente</strong>: En días. El período durante el cual una imagen es considerada cómo noticia. Este período debe ser superior a 1 día.</li>
+ <li><strong>Período reciente</strong>: En días. El período durante el cual una imagen es considerada como novedad. Este período debe ser superior a 1 día.</li>
- <li><strong>Desarrollar todas las categorías</strong>: ¿ Desarrollar todas las categorías en el menú? <em>Attention</em>: Esta opción es susceptible de consumir inútilmente recursos si su árbol de categorías contiene numerosos elementos.</li>
+ <li><strong>Expandir todos los álbumes</strong>: Expande todos los álbumes por defecto en el menú <em>Advertencia</em>: Esta opción es susceptible de consumir inútilmente recursos si su árbol de categorías contiene numerosos elementos.</li>
- <li><strong>Mostrar el número de comentarios</strong>: Mostrar número de comentarios usuario debajo de cada miniatura. Consume recursos.</li>
+ <li><strong>Mostrar el número de comentarios</strong>: Mostrar número de comentarios en cada foto debajo de cada miniatura. Consume recursos.</li>
- <li><strong>Mostrar el número de visualizaciones </strong>: Fija los "hits" rehechos sobre una imagen bajo su miniatura en la página de miniaturas.
- Únicamente válido si el parámetro de configuración avanzada es:<br />
+ <li><strong>Mostrar el número de isualizaciones</strong>: Muestra los accesos observados en la foto justo debajo de la miniatura en la página de miniaturas. Sólo cuando el parámetro de configuración avanzado es: <br />
$conf['show_nb_hits'] = true; <br />
- N.B.: por defaut es a false.</li>
+ Nota: es false por defecto.</li>
- <li><strong>Anchura máxima de las imágenes</strong>: A la visualización. Si la imagen es más ancha que este parámetro, entonces será redimensionada a la visualización. Si usted piensa en la necesidad de modificar este parametraje (pues para una visualización por defecto), sería pertinente redimensionar directamente sus imágenes almacenadas.</li>
+ <li><strong>Anchura máxima de las fotos</strong>: anchura máxima visualizada. Las fotos más grandes que este valor, se ajustarán al tamaño de la pantalla. En lugar de usar esta opción, una buena práctica sería que considerara modificar el ancho de sus fotos.</li>
- <li><strong>Altura máxima de las imágenes</strong>: misma observación que por la anchura.</li>
+ <li><strong>Altura máxima de las imágenes</strong>: la misma observación que en la anchura.</li>
-</ul>
+</ul> \ No newline at end of file
diff --git a/language/es_ES/help/index.php b/language/es_ES/help/index.php
index 10b477c03..c8de97f60 100644
--- a/language/es_ES/help/index.php
+++ b/language/es_ES/help/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2009 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/es_ES/help/photos_add_ftp.html b/language/es_ES/help/photos_add_ftp.html
index 6179d241a..9bc1dda1c 100644
--- a/language/es_ES/help/photos_add_ftp.html
+++ b/language/es_ES/help/photos_add_ftp.html
@@ -1,63 +1,43 @@
<fieldset>
- <legend>Introducción</legend>
-
-<ol>
- <li>Cree una carpeta en su ordenador.</li>
-
- <li>Copie las fotos dentro de esta carpeta, luego redimensionelas para una correcta visualización en la web. <em>Atención</em> : El nombre de las carpetas y de los ficheros debe contener sólo letras, cifras y los carácteres "-", "_" y ".". Ningún espacio o caracteres acentuados.</li>
-
- <li>Con un cliente FTP, copie la carpeta en la carpeta " galleries " de su instalación de Piwigo.</li>
-
- <li>Inicie sesión en su galería y vaya a <span class="pwgScreen">Administracion</span> y haga click en el botón grande que pone "Sincronización".</li>
-</ol>
-
-<p>¡Felicidades! Usted creó con éxito el primer álbum de su galería.</p>
-
+ <legend>Guía de inicio rápido</legend>
+ <ol>
+ <li>Crea una nueva carpeta en tu ordenador.</li>
+ <li>Copia las fotos que quieras dentro de esta carpeta, luego redimensiónalas si es preciso para una óptima visualización en la web. <em>Atención</em>: El nombre de las carpetas y de los archivos debe contener sólo letras, números y/o los carácteres "-", "_" y ".". Sin espacios ni caracteres acentuados. Truco: Sustituye los espacios por "_". Ejemplo: Renombra "Cumpleaños de Ana" por "Cumpleaños_de_Ana".</li>
+ <li>Con un cliente FTP, sube la carpeta dentro del directorio "galleries" de tu instalación de Piwigo.</li>
+ <li>Inicia sesión en tu galería y dirígete a <span class="pwgScreen">Administración</span> y haz click en el botón grande situado en la parte inferior derecha que pone "Sincronización Rápida".</li>
+ </ol>
+ <p>¡Felicidades! Acabas de crear con éxito el primer álbum de tu galería.</p>
</fieldset>
<fieldset>
- <legend>Organización de las carpetas y de los ficheros</legend>
-
-<ul>
-
- <li>
-
- <p>Las carpetas que representan las categorías están en la carpeta " galleries ". Más abajo está el árbol de las carpetas de una galería muy pequeña (pero utilizando muchas funcionalidades): </p>
-
- <pre>
-galleries
-|-- wedding
-| |-- celebration
-| | |-- arrival
-| | | |-- paul-alone.jpg
-| | | +-- sarah-alone.jpg
-| | +-- departure
-| | +-- paul-and-sarah.jpg
-| +-- party
-| |-- dancers001.jpg
-| |-- dancers002.jpg
-| +-- dancers003.jpg
-+-- honeymoon
- |-- hotel.png
- |-- video-from-plane.avi
- +-- pwg_representative
- +-- video-from-plane.jpg
-</pre>
-
- </li>
-
- <li>A parte de "pwg_representative" (ver la explicación más abajo), cada directorio debajo de "galleries" genera un álbum. No hay limite en el número de subniveles.</li>
-
- <li>Fundamentalmente, un elemento es representado por un fichero. Un fichero puede ser un elemento para Piwigo si la extensión del nombre del fichero está entre la lista del parámetro de configuración <code>file_ext</code> (Ver
- fichero <span class="filename">include/config.inc.php</span>). Un fichero puede ser una imagen si su extensión está entre el parámetro de configuración
-<code>picture_ext</code>.</li>
-
-
- <li>Los elementos que no son imagen (vídeos, sonidos, archivos de texto, todo lo que usted quiera) por defecto son representado por iconos que corresponden a la extensión del nombre del fichero. Opcionalmente puede asociar iconos a un archivo (ver video de abajo con ejemplo).</li>
-
- <li><em>Atención</em> : El nombre de un repertorio o de un fichero debe estar constituido sólo por letras, cifras, de "-", "_" o ".". Ningún espacio o carácteres acentuados.</li>
-
- <li>Cuando las fotos estén correctamente situadas en sus carpetas, ir a <span
-class="pwgScreen">Administración &raquo; Categorías &raquo; Sincronizar</span>.</li>
-
-</ul>
+ <legend>Organización de archivos y carpetas</legend>
+ <ul>
+ <li>
+ <p>Cada álbum se representa por una carpeta dentro del directorio "galleries".
+ He aquí un ejemplo del árbol de directorios de una galería muy pequeña (pero
+ utilizando muchas características):</p>
+ <pre>
+ galleries
+ |-- boda
+ | |-- celebracion
+ | | |-- llegada
+ | | | |-- paul-solo.jpg
+ | | | +-- sara-sola.jpg
+ | | +-- salida
+ | | +-- paul-y-sara.jpg
+ | +-- fiesta
+ | |-- baile001.jpg
+ | |-- baile002.jpg
+ | +-- baile003.jpg
+ +-- luna-de-miel
+ |-- hotel.png
+ |-- video-desde-el-avion.avi
+ +-- pwg_representative
+ +-- video-desde-el-avion.jpg
+ </pre>
+ </li>
+ <li>A excepción de "pwg_representative" (ver explicaciones debajo), cada subdirectorio de "galleries" genera un álbum. No hay limite de profundidad en cuanto el número de subniveles a crear.</li>
+ <li>Fundamentalmente, cada elemento es representado por un archivo. Piwigo sólo reconocerá los archivos cuyas extensiones figuren en los parámetros de configuración <code>file_ext</code> (Ver archivo <span class="filename">include/config_default.inc.php</span>). Para Piwigo, un archivo de imagen será reconocido como una imagen sólo si su extensión se encuentra dentro de los parámetros de configuración <code>picture_ext</code>.</li>
+ <li>Los elementos que no son imágenes (vídeos, sonidos, archivos de texto, todo lo que quieras...) son representados de forma predeterminada por iconos que corresponden a la extensión cada archivo. Opcionalmente, puedes asociar una miniatura y un archivo de representación (ver video.avi en el ejemplo anterior).</li>
+ <li>Una vez todas las fotos estén organizadas y correctamente situadas en sus correspondientes carpetas, ir a <span class="pwgScreen">Administración &raquo; Herramientas &raquo; Sincronizar</span>.</li>
+ </ul>
</fieldset>
diff --git a/language/es_ES/index.php b/language/es_ES/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/es_ES/index.php
+++ b/language/es_ES/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/es_ES/install.lang.php b/language/es_ES/install.lang.php
index e351b4483..84283b435 100644
--- a/language/es_ES/install.lang.php
+++ b/language/es_ES/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -27,19 +27,12 @@ $lang['Default gallery language'] = 'Idioma por defecto de la galería';
$lang['Database configuration'] = 'Configuración de la Base de datos';
$lang['Admin configuration'] = 'Configuración de la cuenta Administrador';
$lang['Start Install'] = 'Empezar la instalación';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'La dirección mail debe ser de la forma xxx@yyy.eee (ejemplo: jack@altern.org)';
-
-$lang['Webmaster login'] = 'Administrador';
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Este identificador aparecerá a todos sus visitantes. Le sirvira para administrar el sitio';
-
$lang['Connection to server succeed, but it was impossible to connect to database'] = 'La conexión al servidor es O.K., pero es imposible conectarse a esta base de datos';
$lang['Can\'t connect to server'] = 'Imposible conectarse al servidor';
-
$lang['Host'] = 'Huésped MySQL';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
$lang['User'] = 'Usuario';
$lang['user login given by your host provider'] = 'Nombre de usuario para su alojador web';
-$lang['Password'] = 'Palabra de paso';
$lang['user password given by your host provider'] = 'El proporcionado por su alojador web';
$lang['Database name'] = 'Nombre de la base';
$lang['also given by your host provider'] = 'El proporcionado por su alojador web';
@@ -48,14 +41,11 @@ $lang['database tables names will be prefixed with it (enables you to manage bet
$lang['enter a login for webmaster'] = 'Por favor, escriba un pseudo para el webmaster';
$lang['webmaster login can\'t contain characters \' or "'] = 'El pseudo del webmaster no debe contener carácter " y \'';
$lang['please enter your password again'] = 'Por favor, ponga su contraseña';
-$lang['Webmaster password'] = 'Contraseña';
$lang['Keep it confidential, it enables you to access administration panel'] = 'Debe quedar confidencial, permite acceder al panel de administración.';
$lang['Password [confirm]'] = 'Contraseña [Confirmar]';
$lang['verification'] = 'Comprobación';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = '¿ Necesidad de ayuda? Plantee su pregunta sobre él <a href="%s">foro de Piwigo</a>.';
-$lang['Webmaster mail address'] = 'E-mail del Administrador';
$lang['Visitors will be able to contact site administrator with this mail'] = 'Los visitantes podrán ponerse en contacto con usted por este mail';
-
$lang['PHP 5 is required'] = 'PHP 5 requerido';
$lang['It appears your webhost is currently running PHP %s.'] = 'Aparentemente, la versión PHP de su alojador web es PHP %s.';
$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo va a tratar de pasar en PHP 5 creando o modificando el fichero .htaccess.';
@@ -65,17 +55,14 @@ $lang['Sorry!'] = 'Lo siento!';
$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo no pudo configurar PHP 5.';
$lang["You may referer to your hosting provider's support and see how you could switch to PHP 5 by yourself."] = 'Usted debe ponerse en contacto con su alojador web con el fin de saber cómo configurar PHP 5';
$lang['Hope to see you back soon.'] = 'Esperando verle muy pronto...';
-
-
$lang['Congratulations, Piwigo installation is completed'] = 'Félicitation, Piwigo está completamente instalado';
-
$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Una solución alternativa es copiar el texto en la zona más abajo and de pegarlo en el fichero "local/config/database.inc.php" (Atención: database.inc.php debe contener sólo lo que se encuentra en la zona, no de regreso a la línea, ningún espacio';
$lang['Creation of config file local/config/database.inc.php failed.'] = 'La creación del fichero de configuración local/config/database.inc.php fue suspendido.';
$lang['Download the config file'] = 'Descargar el fichero de configuración';
$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Usted puede descargar el fichero de configuración y carga en el repertorio local/config de su instalación Piwigo.';
$lang['Just another Piwigo gallery'] = 'Una galería Piwigo más ';
$lang['Welcome to my photo gallery'] = 'Bienvenido a mi galería de fotos';
-
$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'No dudes en escribir en nuestros foros para cualquier duda: %s';
$lang['Welcome to your new installation of Piwigo!'] = '¡Bienvenid@ a la instalación de Piwigo!';
+$lang['localhost or other, supplied by your host provider'] = 'host local o de otro tipo, suministrado por el proveedor de alojamiento';
?> \ No newline at end of file
diff --git a/language/es_ES/upgrade.lang.php b/language/es_ES/upgrade.lang.php
index 12bb96a2e..fba1f4d5c 100644
--- a/language/es_ES/upgrade.lang.php
+++ b/language/es_ES/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,21 +22,20 @@
// +-----------------------------------------------------------------------+
$lang['Upgrade'] = 'Actualización';
-$lang['Upgrade from version %s to %s'] = 'Actualización de la versión %s a %s';
+$lang['Upgrade from version %s to %s'] = 'Actualización de la versión %s a la %s';
$lang['Statistics'] = 'Estadísticas';
$lang['total upgrade time'] = 'tiempo total de la actualización';
-$lang['total SQL time'] = 'tiempo total de la demanda SQL';
-$lang['SQL queries'] = 'número de demanda SQL';
-$lang['Upgrade informations'] = 'Informaciones sobre la actualización';
-$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Por favor, efectúes un mantenimiento en [Administración>herramientas>Mantenimiento] si usted encuentra problemas.';
-$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'Por precaución, el plugins siguiente han sido desactivados. Verifique si existen unas actualización antes de reactivarlos:';
-$lang['Only administrator can run upgrade: please sign in below.'] = 'Sólo un administrador puede lanzar la actualización: por favor, identifiqúese más abajo.';
-$lang['You do not have access rights to run upgrade'] = 'Usted no tiene los derechos necessaires para lanzar la actualización.';
-$lang['All sub-albums of private albums become private'] = 'Todos los sub-àlbumes de los àlbumes privados son privados';
-$lang['User permissions and group permissions have been erased'] = 'Las autorizaciones de los usuarios y de los grupos han sido borradas';
-$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Sólo el prefijo de las miniaturas y el email del webmestre han sido salvaguardados por la configuración precedente';
-$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Esta página le propone poner al día la base de datos de su antigua versión de piwigo hacia la nueva versión.
-El asistente de postura al día piensa que usted dispone actualmente del <strong>versión %s</strong> (o equivalente).';
+$lang['total SQL time'] = 'tiempo total de la consulta SQL';
+$lang['SQL queries'] = 'consultas SQL';
+$lang['Upgrade informations'] = 'Información acerca de la actualización';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Por favor, realice una comprobación de mantenimiento en [Administración>Herramientas>Mantenimiento] en caso de detectar algún problema.';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'Por precaución, se han desactivado los siguientes plugins. Verifique si existen actualizaciones de los mismos antes de reactivarlos:';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'Sólo un administrador puede lanzar la actualización: por favor, identifíquese a continuación.';
+$lang['You do not have access rights to run upgrade'] = 'No dispone de los permisos suficientes para realizar la actualización.';
+$lang['All sub-albums of private albums become private'] = 'Todos aquellos sub-álbumes pertenecientes a álbumes privados se convertirán en privados';
+$lang['User permissions and group permissions have been erased'] = 'Los permisos de usuarios y grupos han sido eliminados';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Sólo el prefijo de las miniaturas y el email del webmaster han sido guardados por la configuración anterior';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Esta página propone actualizar la base de datos de su antigua versión de Piwigo a la nueva versión. El asistente de actualización detecta que actualmente está ejecutando la <strong>versión %s</strong> (o equivalente).';
$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'En <i>%s</i>, antes <b>?></b>, insertar:';
-$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Como medida de precaución, los siguientes temas han sido desactivados. Compruebe si existe actualizaciones antes de reactivar:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Como medida de precaución, los siguientes temas han sido desactivados. Compruebe si existe actualizaciones antes de reactivarlos:';
?> \ No newline at end of file
diff --git a/language/et_EE/admin.lang.php b/language/et_EE/admin.lang.php
index 7f2261c28..bb85ceedd 100644
--- a/language/et_EE/admin.lang.php
+++ b/language/et_EE/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -415,7 +415,6 @@ $lang['Mail sent to %s [%s].'] = 'Epost saadetud aadressile %s [%s].';
$lang['Main "guest" user does not exist'] = 'Külaliskasutaja puudub';
$lang['Main "guest" user status is incorrect'] = 'Külaliskasutaja olek on vigane';
$lang['Main Page'] = 'Avaleht';
-$lang['Main'] = 'Peamine';
$lang['Maintenance'] = 'Hooldamine';
$lang['Make this language available to users'] = 'Tee see keel saadavaks kasutajatele';
$lang['Make this theme available to users'] = 'Tee see teema saadavaks kasutajatele';
@@ -552,7 +551,7 @@ $lang['guest'] = 'külaline';
$lang['user_status_guest'] = 'Külaline';
$lang['visitors need to login and have the appropriate permissions to see this album'] = 'Külalised peavad logima sisse ja omama õiged ligipääsuload, et kuvada seda albumit';
$lang['Optimizations have been completed with some errors.'] = 'Optimeeringud on läbiviidud mõne veaga.';
-$lang['Order of menubar items has been updated successfully.'] = 'Menüüde järjestus uuendati edukalt';
+$lang['Order of menubar items has been updated successfully.'] = 'Menüüde järjestus on muudetud';
$lang['Plugin list'] = 'Pluginate nimekiri';
$lang['Plugins which need upgrade'] = 'Uuendatavad pluginad';
$lang['Plugins'] = 'Pluginad';
@@ -832,7 +831,6 @@ $lang['directories + files'] = 'kaustad + failid';
$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'kuva võimalikult palju informatsiooni (lisatud albumid ja fotod, kustutad albumid ja fotod)';
$lang['display'] = 'kuva';
$lang['dissociate from group'] = 'eralda rühmast';
-$lang['email'] = 'Epost';
$lang['errors during synchronization'] = 'vigu sünkroniseerimisel';
$lang['even already synchronized photos'] = 'juba sünkroniseeritud fotod';
$lang['existing album'] = 'olemas-olev album';
@@ -913,8 +911,6 @@ $lang['user_status_normal'] = 'Kasutaja';
$lang['width must be a number superior to'] = 'laius peab olema suurem kui';
$lang['wrong filename'] = 'vigane failinimi';
$lang['Albums authorized thanks to group associations'] = 'Autoriseeritud ligipääs kaustadele kuna oled grupiliige';
-$lang['Format'] = 'Formaat';
-$lang['Invalid dimension'] = 'Vigased mõõdud';
$lang['Landscape'] = 'Maastik';
$lang['Manage photos'] = 'Halda fotosid';
$lang['Minimum height'] = 'Miinimum kõrgus';
@@ -951,4 +947,32 @@ $lang['This group will be set to default'] = 'See rühm valitakse vaikerühmaks'
$lang['Manage the members'] = 'Halda liikmeid';
$lang['Duplicate'] = 'Tee koopia';
$lang['Purge user cache'] = 'Tühjenda vahemälu';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'Pildi mõõtmed kahanetakse %dx%d piksli peale.';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'Pildu suuruse muutmine pärast üles laadimist on välja lülitatud, sest kasutusel on GD graafika arhiiv.';
+$lang['Select at least one tag'] = 'Vali vähemalt üks märksõna';
+$lang['Basic settings'] = 'Põhilised seaded';
+$lang['General'] = 'Ãœldine';
+$lang['Mail theme'] = 'Maili teema';
+$lang['on the %d selected users'] = 'valitud %d kasutajatest';
+$lang['Showing %s to %s of %s users'] = 'Kuvatakse kasutjatest %s kasutajad alates %s kuni %s';
+$lang['Update user'] = 'Uuenda kasutaja';
+$lang['User %s added'] = 'Kasutja %s lisatud';
+$lang['User %s updated'] = 'Ksautaja %s uuendatud';
+$lang['Users modified'] = 'Kasutaja muudetud';
+$lang['%d of %d users selected'] = 'kasutajaid %d kasutajatest %d valitud';
+$lang['(filtered from %s total users)'] = '(filtreeritud %s kasutajatest)';
+$lang['All %d users are selected'] = 'Kõik %d kasutajad on valitud';
+$lang['Change password'] = 'Muuda salasõna';
+$lang['Change username'] = 'Muuda kasutajanime';
+$lang['Last visit on %s, %s.'] = 'Viimane külastus %s, %s.';
+$lang['Loading...'] = 'Laadimine...';
+$lang['No matching user found'] = 'Vastet ei leitud';
+$lang['No user selected of %d users'] = 'Kasutajat ei valitud etteantud %d kasutajatest';
+$lang['No user selected, no action possible.'] = 'Kasutajaid pole valitud, ei saa midagi teha';
+$lang['Password updated'] = 'Parool uuendatud';
+$lang['Registered on %s, %s.'] = 'Registreeritud %s, %s.';
+$lang['Show %s users'] = 'Näita %s kasutajaid';
+$lang['Close user details'] = 'Peida kasutaja üksikasjad';
+$lang['Open user details'] = 'Ava kasutaja üksikasjad';
+$lang['close'] = 'sulge';
?> \ No newline at end of file
diff --git a/language/et_EE/common.lang.php b/language/et_EE/common.lang.php
index c9e644541..9e6b46db8 100644
--- a/language/et_EE/common.lang.php
+++ b/language/et_EE/common.lang.php
@@ -1,8 +1,8 @@
<?php
// +-----------------------------------------------------------------------+
-// | Piwigo - a PHP based picture gallery |
+// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2010 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Estonian [EE]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=569
Author: Piwigo team
Author URI: http://piwigo.org
@@ -243,10 +243,6 @@ $lang['Username "%s" on gallery %s'] = 'Kasutajanimi "%s" galeriis %s';
$lang['To reset your password, visit the following address:'] = 'Parooli algseadistamiseks külasta järgnevat aadressi:';
$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Kui see on eksitus, siis lihtsalt ignoreeri seda kirja ja midagi ei juhtu.';
$lang['Password Reset'] = 'Parooli algseadistamine';
-$lang['Maximum photo height'] = 'Foto maksimaalne kõrgus';
-$lang['Maximum height must be a number superior to 50'] = 'Maksimaalne kõrgus peab olema suurem kui 50';
-$lang['Maximum photo width'] = 'Foto maksimaalne kõrgus';
-$lang['Maximum width must be a number superior to 50'] = 'Maksimaalne laius peab olema suurem kui 50';
$lang['display a calendar by creation date'] = 'kuva kalender loomiskuupäeva järgi';
$lang['display all photos in all sub-albums'] = 'kuva kõikide allalbumite fotod korraga';
$lang['return to normal view mode'] = 'naase tavalisse kuvarežiimi';
@@ -329,7 +325,6 @@ $lang['Here are your connection settings'] = 'Sellised on su ühenduse määrang
$lang['IP: %s'] = 'IP: %s';
$lang['IPTC Metadata'] = 'IPTC metaandmed';
$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Kui arvad, et oled saanud selle eposti eksituse teel, palun teavita meid aadressil %s';
-$lang['Interface theme'] = 'Kasutajaliidese kujundus';
$lang['Invalid key'] = 'Vigane võti';
$lang['Kind of date'] = 'Kuupäeva välimus';
$lang['Links'] = 'Lingid';
@@ -415,7 +410,6 @@ $lang['login mustn\'t start with a space character'] = 'kasutajanimi ei saa alga
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'eposti aadress peab ühilduma malliga xxx@yyy.zzz (näiteks: keegi@siin.ee)';
$lang['medium'] = 'M — keskmine';
$lang['photos posted during the last %d days'] = 'fotod postitud viimase %d päeva vältel';
-$lang['please enter your password again'] = 'palun sisesta parool uuesti';
$lang['representative'] = 'albumi pisipilt';
$lang['return to the display of all photos'] = 'tagasi kõikide fotode kuvamisele';
$lang['searched words : %s'] = 'otsitud sõnad: %s';
@@ -439,4 +433,12 @@ $lang['Username is mandatory'] = 'Kasutajanimi on kohustuslik';
$lang['Website'] = 'Veebileht';
$lang['Your website URL is invalid'] = 'Antud veebilehe aadress on vigane';
$lang['mandatory'] = 'kohustuslik';
+$lang['Email'] = 'E-kiri';
+$lang['First Page'] = 'Esimene leht';
+$lang['Go back to the album'] = 'Mine tagasi albumi juurde';
+$lang['Last Page'] = 'Viimane leht';
+$lang['Password is missing. Please enter the password.'] = 'Parool puudub. Palun sisesta parool.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Parooli kinnitus puudub. Palun kinnita valitud parool.';
+$lang['%d photos per page'] = '%d pilte lehel';
+$lang['Theme'] = 'Teema';
?> \ No newline at end of file
diff --git a/language/et_EE/help/group_list.html b/language/et_EE/help/group_list.html
new file mode 100755
index 000000000..d6f3f8490
--- /dev/null
+++ b/language/et_EE/help/group_list.html
@@ -0,0 +1,22 @@
+<h2>Gruppide nimekiri</h2>
+
+<p>Siin saab hallata gruppe.</p>
+
+<h3>Lisa grupp</h3>
+
+<p>Administraatorid saavad gruppe lisada.</p>
+
+<h3>Gruppide nimekiri</h3>
+
+<p>Iaga grupiga saab teha järgnevaid tegevusi:</p>
+
+
+<ul>
+ <li>minna kasutajate halduse lehele(Administreeri &raquo; Kasutajad &raquo; Halda)</li>
+ <li>minna õiguste lehele et lubada või keelata juurdepääsu privaatalbumitele.</li>
+ <li>kustutada gruppe (vajab kinnitust)</li>
+ <li>valida vaikeväärtused (vajab kinnitust)</li>
+</ul>
+
+<h3>Vaikegrupid</h3>
+<p>Vaikegrupid on grupid, mis on automaatselt seotud iga loodud kasutajaga.</p> \ No newline at end of file
diff --git a/language/et_EE/install.lang.php b/language/et_EE/install.lang.php
index 622840b68..45e9d9101 100755
--- a/language/et_EE/install.lang.php
+++ b/language/et_EE/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -20,6 +20,7 @@
// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
// | USA. |
// +-----------------------------------------------------------------------+
+
$lang['Admin configuration'] = 'Halduri häälestamine';
$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Alternatiivne viis lahendada, on kopeerida üleval pool kastis oleva teksti faili "local/config/database.inc.php" (NB! fail peab sisaldama vaid selle teksti, ei midagi muud ega ühtki tühikutki)';
$lang['Basic configuration'] = 'Põhiline häälestamine';
@@ -41,14 +42,10 @@ $lang['Just another Piwigo gallery'] = 'Lihtsalt veel üks järjekordne Piwigo g
$lang['Keep it confidential, it enables you to access administration panel'] = 'Hoia seda salaja, sellega saad lehekülje haldurisse sisse';
$lang['PHP 5 is required'] = 'Vajatakse PHP versiooni 5';
$lang['Password ']['confirm'] = 'Kinnita parooli';
-$lang['Password'] = 'Parool';
$lang['Sorry!'] = 'Vabandust!';
$lang['Start Install'] = 'Alusta paigaldamist';
$lang['Try to configure PHP 5'] = 'Proovi häälestada PHP 5';
$lang['User'] = 'Kasutaja';
-$lang['Webmaster login'] = 'Veebimeistri sissepääs';
-$lang['Webmaster mail address'] = 'Veebimeistri eposti aadress';
-$lang['Webmaster password'] = 'Veebimeistri parool';
$lang['Welcome to my photo gallery'] = 'Tere tulemast mu fotogalleriisse';
$lang['Welcome to your new installation of Piwigo!'] = 'Tere tulemast äsja installitud Piwigosse!';
$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Sa võid laadida häälestusfaili alla ja ise paigaldada selle oma "local/config" kaustasse.';
@@ -62,11 +59,10 @@ $lang['Visitors will be able to contact site administrator with this mail'] = 'K
$lang['also given by your host provider'] = 'samuti antud veebimajutuse teenusepakkuja poolt';
$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'andmebaasi tabelite nimed alustatakse selle eesliitega (see hõlpsustab tabelite korraspidamist samas andmebaasis)';
$lang['enter a login for webmaster'] = 'sisesta veebimeistri jaoks kasutajanimi';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'eposti aadress peab ühilduma malliga xxx@yyy.zzz (näiteks: keegi@siin.ee)';
$lang['please enter your password again'] = 'palun sisesta parool uuesti';
$lang['user login given by your host provider'] = 'veebimajutuse kasutajanimi';
$lang['user password given by your host provider'] = 'veebimajutuse parool';
$lang['verification'] = 'kinnitamine';
$lang['webmaster login can\'t contain characters \' or "'] = 'veebimeistri kasutajanimi ei saa sisaldada jutumärke';
+$lang['localhost or other, supplied by your host provider'] = 'localhost või teised, antud teenusepakkuja poolt';
?> \ No newline at end of file
diff --git a/language/et_EE/upgrade.lang.php b/language/et_EE/upgrade.lang.php
index 069e625ad..b9c12e682 100755
--- a/language/et_EE/upgrade.lang.php
+++ b/language/et_EE/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/fa_IR/admin.lang.php b/language/fa_IR/admin.lang.php
index f73fc5d3c..5195bb324 100644
--- a/language/fa_IR/admin.lang.php
+++ b/language/fa_IR/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -190,7 +190,6 @@ $lang['Access type'] = "نوع دسترسی";
$lang['Information data registered in database'] = 'داده‌ی اطلاعات در پایگاه داده ثبت شد';
$lang['Default display'] = 'نمایش پیشÙرض';
$lang['The gallery URL is not valid.'] = 'آدرس URL معتبر نیست.';
-$lang['Main'] = "صÙحه اصلی";
$lang['The number of comments a page must be between 5 and 50 included.'] = 'تعداد دیدگاه ها در هر صÙحه باید عددی بین 5 تا 50 باشد.';
$lang['Configuration'] = "پیکربندی";
$lang['confirm'] = 'پذیرÙتن';
@@ -225,7 +224,6 @@ $lang['Prepared time for list of users to send mail is limited. Others users are
$lang['Time to send mail is limited. Others mails are skipped.'] = 'زمان برای Ùرستادن ایمیل محدود است. بقیه ÛŒ ایمیل ها نادیده گرÙته Ù…ÛŒ شوند.';
$lang['To send ?'] = 'Ùرستادن به؟';
$lang['Last send'] = 'آخرین Ùرستاده';
-$lang['email'] = "ایمیل";
$lang['User'] = "کاربر";
$lang['See you soon,'] = 'به امید دیدار،';
$lang['Go to'] = "برو به";
@@ -928,8 +926,6 @@ $lang['Duplicate selected tags'] = 'دوتایی کردن برچسب‌های ا
$lang['Name of the duplicate'] = 'نام پس از دوتایی شدن';
$lang['Source tag'] = 'برچسب اصلی';
$lang['Tag "%s" is now a duplicate of "%s"'] = 'برچسب "%s" از روی برچسب "%s" دوتایی شد';
-$lang['Format'] = 'قالب';
-$lang['Invalid dimension'] = 'ابعاد نامعتبر هستند';
$lang['Landscape'] = 'چشم انداز';
$lang['Manage photos'] = 'مدیریت عکس‌ها';
$lang['Minimum height'] = 'کمترین بلندا';
@@ -952,4 +948,32 @@ $lang['Type here the name of the new group'] = 'نام گروه تازه را ا
$lang['between %.2f and %.2f'] = 'میان %.2f و %.2f';
$lang['between %d and %d pixels'] = 'میان %d و %d پیکسل';
$lang['Purge user cache'] = 'پاک کردن مخزن کاربر (کش)';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'اندازه‌ی این عکس به %dx%d پیکسل کاهش خواهد یاÙت.';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'بدلیل استÙاده از کتابخانه‌ی گراÙیکی٠GDØŒ امکان ویرایش سایز عکس پس از آپلود وجود ندارد.';
+$lang['Select at least one tag'] = 'دست کم باید یک برچسب انتخاب کنید';
+$lang['Basic settings'] = 'تنظیمات٠پایه';
+$lang['General'] = 'همگانی';
+$lang['Mail theme'] = 'زمینه‌ی ایمیل';
+$lang['Loading...'] = 'در حال بارگذاری...';
+$lang['No matching user found'] = 'هیچ کاربر مشابهی پیدا نشد';
+$lang['Password updated'] = 'گذرواژه به روز شد';
+$lang['Update user'] = 'به روز رسانی٠کاربر';
+$lang['Users modified'] = 'کاربر ویرایش شد';
+$lang['on the %d selected users'] = 'تعداد %d كاربر انتخاب شده';
+$lang['close'] = 'بستن';
+$lang['User %s updated'] = 'كاربر %s بروز رساني شد.';
+$lang['User %s added'] = 'كاربر %s اضاÙÙ‡ شد.';
+$lang['Showing %s to %s of %s users'] = 'نمايش از %s تا %s از بين %s كاربر';
+$lang['Show %s users'] = 'نمايش %s كاربر';
+$lang['Registered on %s, %s.'] = 'ثبت شده در %s, %s.';
+$lang['Open user details'] = 'باز كردن مشخصات كاربر';
+$lang['No user selected, no action possible.'] = 'هيچ كاربري انتخاب نشده است، هيچ كاري ممكن نيست.';
+$lang['No user selected of %d users'] = 'هيچ كاربري از بين %d كاربر انتخاب نشده است.';
+$lang['Last visit on %s, %s.'] = 'آخرين بازديد در %s, %s.';
+$lang['Close user details'] = 'بستن مشخصات كاربر';
+$lang['Change username'] = 'تغيير نام كاربر';
+$lang['Change password'] = 'تغيير رمز';
+$lang['All %d users are selected'] = 'تمام %d كاربر انتخاب شده اند.';
+$lang['(filtered from %s total users)'] = '(Ùيلتر شده از بين %s كاربر)';
+$lang['%d of %d users selected'] = 'تعداد %d كاربر از %d كاربران انتخاب شده‌اند.';
?> \ No newline at end of file
diff --git a/language/fa_IR/common.lang.php b/language/fa_IR/common.lang.php
index 62a8504e6..646648f61 100644
--- a/language/fa_IR/common.lang.php
+++ b/language/fa_IR/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: پارسی [IR]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=419
Author: Piwigo team
Author URI: http://piwigo.org
@@ -58,26 +58,26 @@ $lang['Albums'] = "آلبوم ها";
$lang['Album'] = "آلبوم";
$lang['Close this window'] = "بستن این پنجره";
$lang['Complete RSS feed (photos, comments)'] = 'خوراک RSS کامل (عکس ها و دیدگاه ها)';
-$lang['Confirm Password'] = 'پذیرش گذرواژه';
+$lang['Confirm Password'] = 'تایید رمز عبور';
$lang['Connection settings'] = "تنظیمات اتصال";
$lang['Login'] = "ورود";
-$lang['Contact webmaster'] = 'تماس با مدیرکل';
+$lang['Contact webmaster'] = 'ارتباط مدیرکل';
$lang['Create a new account'] = "ایجاد حساب تازه";
$lang['Created on'] = "ایجاد شده در";
$lang['Creation date'] = "تاریخ ایجاد";
-$lang['Current password is wrong'] = "گذرواژه وارد شده اشتباه است.";
+$lang['Current password is wrong'] = '!!رمز وارد شده اشتباه است.';
$lang['Dimensions'] = "ابعاد";
$lang['Display'] = "نمایش";
$lang['Each listed rule must be satisfied.'] = 'همه ی معیارهای بیان شده باید کامل شوند.';
$lang['Email address'] = "آدرس های ایمیل";
$lang['Enter your personnal informations'] = "داده های خصوصی خود را وارد نمایید";
-$lang['Error sending email'] = "خطا در Ùرستادن ایمیل";
+$lang['Error sending email'] = 'خطا در Ùرستادن ایمیل :(';
$lang['File name'] = "نام Ùایل";
$lang['File'] = "Ùایل";
$lang['Filesize'] = "اندازه ÛŒ Ùایل";
$lang['Filter and display'] = "Ùیلتر Ú©Ù† Ùˆ نمایش بده";
$lang['Filter'] = "Ùیلتر";
-$lang['Forgot your password?'] = 'گذرواژه خود را Ùراموش کرده اید ØŸ';
+$lang['Forgot your password?'] = 'رمز ورود خود را Ùراموش کرده اید ØŸ';
$lang['Go through the gallery as a visitor'] = "بازدید از گالری به عنوان مهمان";
$lang['Help'] = "Ú©Ù…Ú©";
$lang['Identification'] = "شناسایی";
@@ -90,7 +90,7 @@ $lang['Notification'] = "خبرنامه";
$lang['Number of items'] = "تعداد آیتم ها";
$lang['Original dimensions'] = "ابعاد اصلی";
$lang['Password forgotten'] = "گذرواژه Ùراموش شده";
-$lang['Password'] = "گذرواژه";
+$lang['Password'] = 'رمز عبور';
$lang['Post date'] = 'تاریخ Ùرستاده شدن';
$lang['Posted on'] = "Ùرستاده شده در";
$lang['Profile'] = "پروÙایل";
@@ -100,7 +100,7 @@ $lang['Register'] = "نام نویسی";
$lang['Registration'] = "نام نویسی";
$lang['Related tags'] = "برچسب های مربوط";
$lang['Reset'] = 'بازنشانی';
-$lang['Retrieve password'] = "بازیابی گذرواژه";
+$lang['Retrieve password'] = 'بازیابی رمز عبور';
$lang['Search rules'] = "قوانین جستجو";
$lang['Search tags'] = "جستجوی برچسب ها";
$lang['Search'] = "جستجو";
@@ -144,7 +144,7 @@ $lang['Comment'] = "دیدگاه";
$lang['Your comment has been registered'] = "دیدگاه شما در سیستم ثبت شد";
$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = "سیستم ضد هرزنامه: خواهشمندم قبل از Ùرستادن دوباره ÛŒ دیدگاه چند لحظه شکیبا باشید";
$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'دیدگاه شما در سیستم ثبت نشد زیرا با قوانین پذیرش سازگار نیست';
-$lang['An administrator must authorize your comment before it is visible.'] = 'یک مدیر باید دیدگاه شما را بپذیرد تا قابل نمایش شود.';
+$lang['An administrator must authorize your comment before it is visible.'] = 'باتشکر , یک مدیر باید دیدگاه شما را بپذیرد تا قابل نمایش شود';
$lang['This login is already used by another user'] = "این نام کاربری برای کاربر دیگری ثبت شده است";
$lang['Comments'] = "دیدگاه ها";
$lang['Add a comment'] = "دیدگاهی بگذارید";
@@ -211,14 +211,14 @@ $lang['month'][9] = "سپتامبر";
$lang['Most visited'] = 'بیشترین بازدید شده';
$lang['display most visited photos'] = 'نمایش عکس هایی که بیشترین بازدید را داشته اند';
$lang['Unknown identifier'] = "ناشناخته";
-$lang['New password'] = "گذرواژه تازه";
+$lang['New password'] = 'رمز ورود تازه';
$lang['Rate this photo'] = "امتیاز دادن به این عکس";
$lang['Next'] = "بعدی";
$lang['no rate'] = "بدون امتیاز";
$lang['Photos posted within the last %d day.'] = 'Ùقط عکس هایی Ú©Ù‡ در %d روز قبل Ùرستاده شده.';
$lang['Photos posted within the last %d days.'] = 'Ùقط عکس هایی Ú©Ù‡ در %d روز قبل Ùرستاده شده اند.';
$lang['password updated'] = "گذرواژه بروزرسانی شد";
-$lang['Recent period must be a positive integer value'] = "Recent period must be a positive integer value";
+$lang['Recent period must be a positive integer value'] = 'مدت های اخیر باید مقداری عدد صحیح مثبت شود';
$lang['photo'] = "عکس";
$lang['Click on the photo to see it in high definition'] = "برای مشاهده هر عکس در اندازه ی اصلی روی آن کلیک کنید.";
$lang['Show file metadata'] = 'نمایش Ùایل ابرداده (Metadata)';
@@ -229,7 +229,7 @@ $lang['Random photos'] = 'عکس های تصادÙÛŒ';
$lang['display a set of random photos'] = "نمایش تعدادی عکس تصادÙÛŒ";
$lang['Recent albums'] = "آلبوم های تازه";
$lang['display recently updated albums'] = "نمایش آلبوم های تازه بروز رسانی شده";
-$lang['Recent period'] = "Recent period";
+$lang['Recent period'] = 'مدت های اخیر';
$lang['Recent photos'] = "عکس های تازه";
$lang['display most recent photos'] = 'نمایش تازه ترین عکس ها';
$lang['Redirection...'] = "در حال هدایت ...";
@@ -238,7 +238,6 @@ $lang['login mustn\'t end with a space character'] = 'اطلاعات ورود ن
$lang['login mustn\'t start with a space character'] = 'اطلاعات ورود نباید با Ùاصله آغاز شوند';
$lang['this login is already used'] = "این اطلاعات ورود از قبل وجود دارد";
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'آدرس ایمیل باید چیزی شبیه به xxx@yyy.eee باشد. (مانند: jack@altern.org)';
-$lang['please enter your password again'] = "خواهشمند است گذرواژه خود را دوباره وارد نمایید";
$lang['Auto login'] = "ورود اتوماتیک";
$lang['remove this tag from the list'] = "پاک کردن این برچسب از لیست";
$lang['representative'] = 'عکس بندانگشتی آلبوم';
@@ -249,7 +248,7 @@ $lang['End-Date'] = "تاریخ پایان";
$lang['Kind of date'] = 'نوع تاریخ';
$lang['Search for words'] = 'جستجوی واژه ها';
$lang['Search for all terms'] = 'جستجوی همه ی واژه ها';
-$lang['Empty query. No criteria has been entered.'] = 'شما هیچ معیاری برای جستجو تأیین نکرده اید.';
+$lang['Empty query. No criteria has been entered.'] = 'شما هیچ معیاری برای جستجو تعیین نکرده اید.';
$lang['Search results'] = "نتایج جستجو";
$lang['Search in sub-albums'] = "جستجو در زیرآلبوم ها";
$lang['searched words : %s'] = 'واژه های جستجو شده: %s';
@@ -264,7 +263,6 @@ $lang['SQL queries in'] = 'معیار های SQL در';
$lang['display only recently posted photos'] = "Ùقط آخرین عکس های Ùرستاده شده را نمایش بده";
$lang['return to the display of all photos'] = "بازگشت به نمایش همه ی عکس ها";
$lang['the beginning'] = "آغاز";
-$lang['Interface theme'] = "رابط قالب";
$lang['Thumbnails'] = 'عکس بندانگشتی';
$lang['Menu'] = "منو";
$lang['A comment on your site'] = "یادداشتی روی سایت شما";
@@ -285,7 +283,7 @@ $lang['Admin: %s'] = "مدیرکل: %s";
$lang['Registration of %s'] = "نام نویسی٠%s";
$lang['Album: %s'] = 'آلبوم: %s';
$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'وضعیت بد برای کاربر "مهمان"ØŒ وضعیت پیشÙرض استÙاده خواهد شد . خواهشمند است این موضوع را با مدیر‌کل در میان بگذارید.';
-$lang['this email address is already in use'] = 'یک کاربر دیگر این آدرس ایمیل را در سیستم ثبت کرده است';
+$lang['this email address is already in use'] = 'این ایمیل در سیستم ثبت بوده شما نمی توانید از ان استÙاده کنیدیک کاربر دیگر این آدرس ایمیل را در سیستم ثبت کرده است ';
$lang['Album results for'] = "نتایج آلبوم برای";
$lang['Tag results for'] = "نتایج برچسب برای";
$lang['from %s to %s'] = "از %s تا %s";
@@ -324,25 +322,25 @@ $lang['... or please deactivate this message, I will find my way by myself'] = '
$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'درود %s، گالری عکس شما خالی است!';
$lang['I want to add photos'] = 'می‌خواهم عکس تازه اضاÙÙ‡ کنم';
$lang['Manage this user comment: %s'] = 'مدیریت دیدگاه های %s';
-$lang['Email address is missing. Please specify an email address.'] = "کاربر آدرس ایمیل ندارد. خواهشمند است یک آدرس ایمیل مشخص کنید.";
+$lang['Email address is missing. Please specify an email address.'] = 'کاربر آدرس ایمیل ندارد. لطÙا یک آدرس ایمیل مشخص کنید.';
$lang['This author modified following comment:'] = 'این نویسنده دیدگاه زیر را تغییر داده است:';
$lang['This author removed the comment with id %d'] = 'این نویسنده، دیدگاهی با شناسه ی %d را پاک کرده است';
$lang['html tags are not allowed in login'] = 'شما در Ùرم ورود مجاز به استÙاده از كدهای HTML نیستید';
$lang['%d rates'] = '%d امتیاز';
-$lang['Change my password'] = 'ویرایش گذرواژه';
+$lang['Change my password'] = 'ویرایش رمز ورود';
$lang['Check your email for the confirmation link'] = 'برای مشاهده ی لینک پذیرش ایمیل خود را چک کنید';
$lang['Download this file'] = 'دانلود این Ùایل';
$lang['Download'] = 'دانلود';
$lang['Edit'] = 'ویرایش';
-$lang['Enter your new password below.'] = 'گذرواژه ی تازه ی خود را در زیر وارد کنید.';
-$lang['EXIF Metadata'] = 'EXIF Metadata';
+$lang['Enter your new password below.'] = 'رمز ورود تازه ی خود را در زیر وارد کنید.';
+$lang['EXIF Metadata'] = 'EXIFابرداده';
$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'اگر اشتباهی رخ داده است، این ایمیل را نادیده بگیرید و به آن پاسخ ندهید.';
-$lang['Invalid key'] = 'کلید اشتباه است';
+$lang['Invalid key'] = '!!کلید اشتباه است';
$lang['Invalid username or email'] = 'نام کاربری یا ایمیل نامعتبر است';
-$lang['IPTC Metadata'] = 'IPTC Metadata';
+$lang['IPTC Metadata'] = 'IPTC ابرداده';
$lang['Number of photos per page'] = 'تعداد عکس ها در هر صÙحه';
$lang['Password reset is not allowed for this user'] = 'بازنشانی گذرواژه برای این کاربر ممکن نیست';
-$lang['Password Reset'] = 'بازنشانی گذرواژه';
+$lang['Password Reset'] = 'بازنشانی رمز عبور';
$lang['Please enter your username or email address.'] = 'نام کاربری یا ایمیل خود را وارد کنید.';
$lang['Rating score'] = 'مقدار امتیاز';
$lang['Return to home page'] = 'بازگشت به صÙحه اصلی';
@@ -374,7 +372,7 @@ $lang['Mobile'] = 'موبایل';
$lang['Numeric identifier, 1 &rarr; 9'] = 'شناسه ÛŒ عددی، یک &rarr; Ù†ÙÙ‡';
$lang['Numeric identifier, 9 &rarr; 1'] = 'شناسه ÛŒ عددی، Ù†ÙÙ‡ &rarr; یک';
$lang['Original'] = 'اصلی';
-$lang['Password: %s'] = 'گذرواژه: %s';
+$lang['Password: %s'] = 'رمز عبور: %s';
$lang['Photo sizes'] = 'اندازه ی عکس ها';
$lang['Photo title, A &rarr; Z'] = 'عنوان عکس، A &rarr; Z';
$lang['Photo title, Z &rarr; A'] = 'عنوان عکس، Z &rarr; A';
@@ -383,8 +381,9 @@ $lang['Rating score, low &rarr; high'] = 'امتیاز عکس، کم &rarr; زی
$lang['Send my connection settings by email'] = 'اطلاعات ورود من را با ایمیل برایم بÙرست';
$lang['Show latest comments first'] = 'ابتدا تازه ترین دیدگاه ها را نشان بده';
$lang['Show oldest comments first'] = 'ابتدا قدیمی ترین دیدگاه ها را نشان بده';
-$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'با موÙقیت نام نویسی کردید، به زودی ایمیلی حاوی اطلاعات ورود برای شما Ùرستاده Ù…ÛŒ شود.
-خوش آمدید!';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'خوش آمدید
+ثبت نام شما با موÙقیت انجام شد ØŒ به زودی ایمیلی حاوی اطلاعات ورود برای شما Ùرستاده Ù…ÛŒ شود.
+';
$lang['Thank you for registering at %s!'] = 'با سپاس از نام نویسی شما در %s !';
$lang['Username modification'] = 'ویرایش نام کاربری';
$lang['Username: %s'] = 'نام کاربری: %s';
@@ -400,13 +399,13 @@ $lang['medium'] = 'M - متوسط';
$lang['small'] = 'S - Ú©ÙˆÚ†Ú©';
$lang['square'] = 'مربع';
$lang['thumb'] = 'عکس بندانگشتی';
-$lang['xlarge'] = 'XL - بسیار بزرگ';
-$lang['xsmall'] = 'XS - بسیار کوچک';
-$lang['xxlarge'] = 'XXL - بزرگترین';
+$lang['xlarge'] = ' بسیار بزرگ';
+$lang['xsmall'] = ' بسیار کوچک';
+$lang['xxlarge'] = ' بزرگترین';
$lang['%d rate'] = '%d امتیاز';
$lang['Bad request'] = 'درخواست اشتباه';
-$lang['Forbidden'] = 'اجازه ی دسترسی ندارید';
-$lang['Page not found'] = 'برگه پیدا نشد';
+$lang['Forbidden'] = 'اجازه ی دسترسی ندارید{گم شدید؟؟}';
+$lang['Page not found'] = 'برگه پیدا نشد !';
$lang['Permalink for album not found'] = 'لینک ثابتی برای این آلبوم پیدا نشد';
$lang['Piwigo encountered a non recoverable error'] = 'Piwigo با یک خطای غیر قابل بازیابی مواجه گردید';
$lang['Requested album does not exist'] = 'آلبوم مورد نظر شما وجود ندارد';
@@ -418,4 +417,12 @@ $lang['Your website URL is invalid'] = 'آدرس وب سایت شما نامعت
';
$lang['Website'] = 'سایت اینترنتی
';
+$lang['Email'] = 'ایمیل';
+$lang['First Page'] = 'نخستین برگه';
+$lang['Go back to the album'] = 'برگشتن به آلبوم';
+$lang['Last Page'] = 'آخرین برگه';
+$lang['Password is missing. Please enter the password.'] = 'گذرواژه ای نوشته نشده است. خواهشمندیم گذرواژه‌ای بنویسید.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'پذیرش گذرواژه با گذرواژه‌ی اصلی همخوانی ندارد. خواهشمندیم گذرواژه‌ی اصلی را در بخش پذیرش گذرواژه نیز بنویسید.';
+$lang['Theme'] = 'زمینه';
+$lang['%d photos per page'] = '%d عکس در هر برگ';
?> \ No newline at end of file
diff --git a/language/fa_IR/help/cat_modify.html b/language/fa_IR/help/cat_modify.html
new file mode 100755
index 000000000..d67997408
--- /dev/null
+++ b/language/fa_IR/help/cat_modify.html
@@ -0,0 +1,133 @@
+<h2> استÙاده کنید آلبوم </ H2 >
+
+<h3> اطلاعات </ H3 >
+
+<ul>
+
+ <li> <strong> برای نام </ قوی> : تغییر نام آلبوم (تغییر نام مجازی در مورد
+ از آلبوم Ùیزیکی ) . </ Ù„ÛŒ >
+
+ <li> <strong> برای توضیحات </ قوی> : متن های کوتاه به یک ایده کلی از محتوا،
+ این متن خواهد شد در پایین صÙحه ریز عکسها نمایش داده شود. </ Ù„ÛŒ >
+
+</ UL >
+
+<h3> حرکت </ H3 >
+
+<p> اگر آلبوم های مجازی است ، شما می توانید آن را حرکت می کند. حرکت یک آلبوم معنی
+تغییر آلبوم پدر و مادر خود . </ p>
+
+گزینه <h3> </ H3 >
+
+<ul>
+
+ <li> در نوع دسترسی <strong> </ قوی > : مدیریت و ویرایش . اگر شما به
+ آلبوم خصوصی ، همه آلبوم کودک خود را خصوصی می شود. اگر شما به
+ آلبوم عمومی، همه آلبوم پدر و مادر خود را عمومی می شود. </ لی >
+
+ <li> <strong> برای Ù‚ÙÙ„ است </ strong > : این آلبوم Ùˆ زیر آلبوم خواهد شد
+ به طور موقت غیر Ùعال شده است برای تعمیر Ùˆ نگهداری Ù…ÛŒ شود . </ Ù„ÛŒ >
+
+ <li> <strong> برای نظرات </ strong > : اجازه به کاربران برای اظهار نظر از مطالب این
+ آلبوم </ لی >
+
+</ UL >
+
+<p> شما همچنین می توانید این گزینه بر روی "خواص" مدیریت
+صÙحه مدیریت ( صÙحه نمایش < دهانه
+کلاس = " pwgScreen " > نظرات </ span> ØŒ <span class="pwgScreen"> Ù‚ÙÙ„ </ span> ØŒ
+<span class="pwgScreen"> عمومی / خصوصی </ span> ، < طول
+کلاس = " pwgScreen " > نماینده </ span> در دسترس از < طول
+کلاس = " pwgScreen " > دولت » آلبوم ها» خواص </ span> ) </ p>
+
+منظور مرتب سازی بر <h3> </ H3 >
+
+<P> استÙاده از تصاویر پیش Ùرض مرتب کردن . </ p>
+
+<P> نشان دهد که آیا این ترتیب نیز به subalbums اعمال خواهد شد. </ p>
+
+<P> معیارهای مرتب سازی خاص با این آلبوم مورد استÙاده قرار گیرد را انتخاب کنید. </ p>
+<ul>
+<li> <strong> برای تاریخ ایجاد </ قوی> : عکس تاریخ عکسبرداری است </ li >
+<li> <strong> برای تاریخ نوشته است </ strong > : تاریخ سنکرون </ لی >
+<li> <strong> برای متوسط ​​( * ) </ قوی> : متوسط ​​می تواند توسط رتبه بازدید کننده است </ li > تغییر
+<li> <strong> برای بیشترین بازدید ( * ) < / strong> در این بازدید در حال حاضر ممکن است به منظور بیشترین بازدید را تغییر دهید </ لی >
+<li> <strong> برای نام Ùایل </ قوی> : نام داده شده در زمینه اطلاعات </ Ù„ÛŒ >
+<li> <strong> برای کد </ قوی> : داخلی شناسه ( شاخه ها دارای یک شناسه (شماره) بالاتر از قبلی است </ li >
+
+</ UL >
+<P> <STRONG> ( * ) </ قوی> هشدار: مطمئن باشید Ú©Ù‡ برای تست این سÙارشات مرتب سازی بر اساس خودتان را به عنوان آنها Ù…ÛŒ توانند نتایج غیر منتظره را </ p>
+
+
+<h3> Representant </ H3 >
+
+<P> نماینده آلبومتصویر بند انگشتی نمایش داده شده در صÙحه اصلی ( <span class="pwgScreen"> category.php </ span> ) برای نشان دادن است
+آلبوم زمانی
+آن تنها شامل زیر آلبوم Ùˆ هیچ عکس مستقیم ( Ùقط به عنوان آلبوم ریشه ) . </ p>
+عکس از آلبوم : </ p>
+
+<ul>
+
+ <li> در <span صÙحه class="pwgScreen"> عکس </ span> : یکی از دکمه های اکشن به شما اجازه تنظیم عکس در حال حاضر به عنوان نماینده برای
+ آلبوم نمایش داده Ù…ÛŒ شود . این دکمه موجود است Ùقط برای مدیران است . </ Ù„ÛŒ >
+
+ <li> در <span اطلاعات class="pwgScreen"> اصلاح در مورد عکس </ span> در
+ دولت . این صÙحه نمایش را Ù…ÛŒ توان از < طول رسیده است
+ کلاس = " pwgScreen " > picture.php </ span> یا <span دسته class="pwgScreen">
+ مدیریت </ span> در حالت واحد را <em> </ EM > . مشاهده Ú©Ù…Ú© این صÙحه نمایش برای
+ جزئیات . </ لی >
+
+ <li> در <span class="pwgScreen"> دولت » آلبوم ها» خواص ،
+ نماینده </ span> . به Ú©Ù…Ú© این صÙحه نمایش برای جزئیات بیشتر را مشاهده کنید. </ Ù„ÛŒ >
+
+ <li> در <span class="pwgScreen"> ویرایش آلبوم </ span> ( روی صÙحه نمایش در حال حاضر ) . </ Ù„ÛŒ >
+
+</ UL >
+
+<P> انتخاب یک نماینده بستگی به
+به <code> allow_random_representative </ code> و پارامتر پیکربندی (نگاه کنید به < دهانه
+کلاس = "نام Ùایل " > شامل / config_default.inc.php </ SPAN> ) </ p>
+
+<P> در حالت پیش Ùرض ( به <code> allow_random_representative </ code> Ùˆ مجموعه را به غلط ) ØŒ
+هر آلبوم شامل حداقل یک عنصر است که توسط یک ثابت نشان داده شده است
+عنصر . هنگامی Ú©Ù‡ ( در ایجاد آلبوم ) تعیین Ù…ÛŒ کنند، نماینده Ùقط تغییر
+زمانی که یک مدیر از آنها بخواهید برای آن . اگر نماینده مناسب نیست،
+شما Ù…ÛŒ توانید بپرسید تا <strong> یاÙتنrepresentant جدید تصادÙÛŒ </ قوی> </ p>
+
+<p> اگر به <code> allow_random_representative </ code> و پارامتر پیکربندی است
+درست تنظیم کنید ، یک دسته شامل عکس ها ممکن است ثابت
+representant . Ùقط <STRONG> حذ٠representant </ قوی> دکمه استÙاده کنید. </ p>
+
+<p> اگر این آلبوم Ùقط شامل زیر آلبوم Ùˆ هیچ عکس، آن را Ù…ÛŒ توانید با این وجود توسط هر تشکر عنصر نشان داده شده به <span class="pwgScreen"> اصلاح
+اطلاعات در مورد یک عکس </ span> صÙحه نمایش. تنها گزینه بر روی صÙحه نمایش Ùعلی
+است <STRONG> حذ٠representant است </ strong > را Ùشار دهید. </ p>
+
+<h3> لینک تمام عکس های آلبوم به آلبوم </ H3 >
+
+<ul>
+
+<li> <strong> برای نام آلبوم مجازی است </ strong > : نام آلبوم جدید را ایجاد ،
+تمام عکس های از رده Ùعلی خواهد شد به یکی از جدید مرتبط است. </ Ù„ÛŒ >
+
+<li> <strong> برای آلبوم مرجع است </ strong > : از کجا آلبوم جدید خواهد بود ،
+خالی برای ایجاد آن را در ریشه را ترک کنند. </ لی >
+
+</ UL >
+
+<h3> لینک تمام عکس های آلبوم به آلبوم های موجود </ H3 >
+
+<ul>
+
+<li> <strong> برای آلبوم ها </ قوی> : . را انتخاب کنید آلبوم مقصد است </ li >
+
+</ UL >
+
+<h3> ارسال یک ایمیل به اطلاعات را به اعضای گروه </ H3 >
+
+<ul>
+
+<li> <strong> برای گروه < / strong> در گروه دریاÙت کننده است </ li >
+
+<li> <strong> برای محتوای ایمیل است </ strong > : متن رایگان برای ارسال به آنها را </ لی >
+
+</ UL > \ No newline at end of file
diff --git a/language/fa_IR/help/cat_move.html b/language/fa_IR/help/cat_move.html
new file mode 100755
index 000000000..c36b48a2f
--- /dev/null
+++ b/language/fa_IR/help/cat_move.html
@@ -0,0 +1,14 @@
+<h2> استÙاده از حرکت به آلبوم مجازی </ H2>
+
+<P> تنها در آلبوم های مجازی می توانید یک آلبوم والدین جدید داشته باشد. </ p>
+
+<h3> حرکت آلبوم مجازی </ H3>
+
+<P> یک یا چند آلبوم مجازی که می خواهید برای حرکت انتخاب کنید.
+اگر لیست خالی است، که منظور شما ایجاد یک نشده است. </ p>
+
+<h3> جدید آلبوم والدین </ H3>
+
+<P> آلبوم والدین جدید (مجازی یا Ùیزیکی) را انتخاب کنید.
+اگر شما هر پدر و مادر را انتخاب کنید، در آلبوم های مجازی انتخاب خواهد شد به ریشه منتقل شد.
+ </ p> \ No newline at end of file
diff --git a/language/fa_IR/help/cat_options.html b/language/fa_IR/help/cat_options.html
new file mode 100755
index 000000000..9c2874dca
--- /dev/null
+++ b/language/fa_IR/help/cat_options.html
@@ -0,0 +1,22 @@
+<h2> استÙاده از حرکت به آلبوم مجازی </ H2> <h2> استÙاده گزینه های آلبوم </ H2>
+
+مدیریت گزینه <P> برای چندین آلبوم در یک بار. </ p>
+
+<dl>
+
+<dt> نظرات </ DT>
+<dd> یک عکس Ù…ÛŒ تواند نظر از بازدید کنندگان خود را دریاÙت خواهید کرد اگر آن را به یک آلبوم با نظر Ùعال شده تعلق دارد. </ dd>
+
+<dt> Ù‚ÙÙ„ </ DT>
+آلبوم <dd> Ù‚ÙÙ„ شده غیر Ùعال برای تعمیر Ùˆ نگهداری Ù…ÛŒ باشد. Ùقط مدیران Ù…ÛŒ توانید آنها را در گالری ببینید. </ dd>
+
+<dt> عمومی / خصوصی </ DT>
+<dd> آغاز هنگامی که یک آلبوم تبدیل خصوصی، دادن حقوق دسترسی به کاربران و گروه های </ dd>
+
+ <dt> نماینده</ dt>
+<dd> آغاز این گزینه در دسترس است هنگامی که شما تنظیمات پیکربندی
+به <code> allow_random_representative </ code> و (نگاه کنید به <دهانه
+class = filename"> شامل / config_defaults.inc.php </ SPAN>) به
+را <em> واقعی </ EM>. هر آلبوم را Ù…ÛŒ توان با یک عکس به صورت تصادÙÛŒ Ùˆ یا یک عکس انتخاب به عنوان نماینده منحصر به Ùرد ارائه شده است. </ dd>
+
+</ DL> \ No newline at end of file
diff --git a/language/fa_IR/index.php b/language/fa_IR/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/fa_IR/index.php
+++ b/language/fa_IR/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/fa_IR/install.lang.php b/language/fa_IR/install.lang.php
index 4267928aa..26f0aeb2e 100644
--- a/language/fa_IR/install.lang.php
+++ b/language/fa_IR/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,24 +21,18 @@
// | USA. |
// +-----------------------------------------------------------------------+
-
-
$lang['Installation'] = "نصب";
$lang['Basic configuration'] = 'تنظیمات اساسی';
$lang['Default gallery language'] = 'زبان پیشÙرض گالری';
$lang['Database configuration'] = 'تنظیمات پایگاه داده';
$lang['Admin configuration'] = 'تنظیمات مدیریت';
$lang['Start Install'] = 'آغاز نصب';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'آدرس ایمیل باید چیزی شبیه به xxx@yyy.eee باشد. (مانند: jack@altern.org)';
-$lang['Webmaster login'] = 'ورود مدیرکل';
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'این برای بازدیدکنندگان نمایش داده می شود. برای مدیریت سایت ضروری است';
$lang['Connection to server succeed, but it was impossible to connect to database'] = 'ارتباط با سرور با موÙقیت انجام شد، اما ارتباط با پایگاه داده با مشکل مواجه شد';
$lang['Can\'t connect to server'] = 'ارتباط با سرور ممکن نیست';
$lang['Host'] = 'میزبان (Host)';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost، sql.multimania.com، toto.freesurf.fr';
$lang['User'] = 'نام کاربری';
$lang['user login given by your host provider'] = 'نام کاربری خود را باید از هاست دریاÙت نمایید';
-$lang['Password'] = "گذرواژه";
$lang['user password given by your host provider'] = 'گذرواژه را باید از هاست دریاÙت نمایید';
$lang['Database name'] = 'نام پایگاه داده';
$lang['also given by your host provider'] = 'نام پایگاه داده را باید از هاست دریاÙت نمایید';
@@ -47,12 +41,10 @@ $lang['database tables names will be prefixed with it (enables you to manage bet
$lang['enter a login for webmaster'] = 'مشخصات ورود مدیرکل را وارد نمایید';
$lang['webmaster login can\'t contain characters \' or "'] = 'مشخصات ورود نباید دارای کاراکترهای \' و " باشند';
$lang['please enter your password again'] = 'خواهشمند است گذرواژه خود را دوباره وارد نمایید';
-$lang['Webmaster password'] = 'گذرواژه ی مدیرکل';
$lang['Keep it confidential, it enables you to access administration panel'] = 'گذرواژه را محرمانه Ù†Ú¯Ù‡ دارید، آن دسترسی شما را به مدیریت Ùراهم Ù…ÛŒ کند';
$lang['Password [confirm]'] = "تاييد گذرواژه";
$lang['verification'] = 'تأیید';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'به کمک نیاز دارید ؟ پرسش خود را در <a href="%s">تالارهای پشتیبانی Piwigo</a> مطرح نمایید.';
-$lang['Webmaster mail address'] = 'آدرس ایمیل مدیرکل';
$lang['Visitors will be able to contact site administrator with this mail'] = 'بازدیدکنندگان می توانند بوسیله ی این ایمیل با مدیرکل ارتباط برقرار کنند';
$lang['PHP 5 is required'] = 'نگارش پنجم PHP لازم است';
$lang['It appears your webhost is currently running PHP %s.'] = 'به نظر می رسد هاست شما دارای نگارش PHP %s باشد.';
@@ -73,4 +65,5 @@ $lang['Just another Piwigo gallery'] = 'یک گالری دیگر با Piwigo';
$lang['Password ']['confirm'] = 'تأیید گذرواژه';
$lang['Welcome to my photo gallery'] = 'به گالری عکس من خوش آمدید';
$lang['Welcome to your new installation of Piwigo!'] = 'به گالری Piwigo ی خود خوش آمدید!';
+$lang['localhost or other, supplied by your host provider'] = 'localhost یا ادرس دیگر ØŒ این را باید از هاست دریاÙت نمایید(در حالت معمول localhost میباشد)';
?> \ No newline at end of file
diff --git a/language/fa_IR/iso.txt b/language/fa_IR/iso.txt
index 09c5e596f..fc3e26e63 100644
--- a/language/fa_IR/iso.txt
+++ b/language/fa_IR/iso.txt
@@ -1 +1 @@
-پارسی [IR] \ No newline at end of file
+Ùارسی [IR] \ No newline at end of file
diff --git a/language/fa_IR/upgrade.lang.php b/language/fa_IR/upgrade.lang.php
index 0216789a3..30f67f4ec 100644
--- a/language/fa_IR/upgrade.lang.php
+++ b/language/fa_IR/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -23,21 +23,21 @@
-$lang['Upgrade'] = 'آپگرید';
+$lang['Upgrade'] = 'بروز رسانی';
$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'پیشنهاد می‌شود Ú©Ù‡ با استÙاده از این صÙحه بانک اطلاعاتی نگارش قدیمی Piwigo خود را به نگارش تازه ÛŒ آن ارتقا دهید. سیستم آپگرید نگارش کنونی گالری شما را <strong>نگارش %s </strong> تشخیص داده است.';
-$lang['Upgrade from version %s to %s'] = 'آپگرید از نگارش %s به نگارش %s';
+$lang['Upgrade from version %s to %s'] = 'بروزرسانی از نگارش %s به نگارش %s';
$lang['Statistics'] = "آمار";
-$lang['total upgrade time'] = 'زمان کل آپگرید';
+$lang['total upgrade time'] = 'زمان کل بروز رسانی';
$lang['total SQL time'] = 'زمان کل SQL';
$lang['SQL queries'] = 'کوئری(Query) های SQL';
-$lang['Upgrade informations'] = 'اطلاعات آپگرید';
+$lang['Upgrade informations'] = 'اطلاعات بروز رسانی';
$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'اگر به مشکلی برخوردید به [مدیریت > ابزار ها > نگهداری] مراجعه نمایید.';
$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'هشدار، پلاگین های زیر در حال حاضر از کار اÙتاده اند. برای امنیت بیشتر، قبل از Ùعال کردن دوباره ÛŒ آن ها باید آپگرید های تازه آنها را بررسی کنید:';
-$lang['Only administrator can run upgrade: please sign in below.'] = 'Ùقط مدیران Ù…ÛŒ توانند سیستم را آپگرید کنند.';
-$lang['You do not have access rights to run upgrade'] = "شما دسترسی لازم برای آپگرید را ندارید";
+$lang['Only administrator can run upgrade: please sign in below.'] = 'Ùقط مدیران Ù…ÛŒ توانند سیستم را بروز رسانی کنند.';
+$lang['You do not have access rights to run upgrade'] = 'شما دسترسی لازم برای بروز رسانی را ندارید';
$lang['All sub-albums of private albums become private'] = 'تمام زیرآلبوم های مربوط به آلبوم های شخصی، شخصی شدند';
$lang['User permissions and group permissions have been erased'] = 'مجوز های کاربران و گروه ها پاک شد';
$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Ùقط پیشوند عکس های بندانگشتی Ùˆ آدرس ایمیل مدیرکل از تنظیمات قدیمی باقی خواهد ماند';
$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'در <i>%s</i>, قبل از <b>?></b>, اضاÙÙ‡ کنید:';
-$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'هشدار، قالب های زیر در حال حاضر از کار اÙتاده اند. برای امنیت بیشتر، قبل از Ùعال کردن دوباره ÛŒ آن ها باید آپگرید های تازه آنها را بررسی کنید:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'هشدار، قالب های زیر در حال حاضر از کار اÙتاده اند!!. برای امنیت بیشتر، قبل از Ùعال کردن دوباره ÛŒ آن ها باید بروزرسانی تازه آنها را بررسی کنید:';
?> \ No newline at end of file
diff --git a/language/fi_FI/admin.lang.php b/language/fi_FI/admin.lang.php
index 3b6e52e3e..a2d2fe80a 100755
--- a/language/fi_FI/admin.lang.php
+++ b/language/fi_FI/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -145,4 +145,325 @@ $lang['Duplicate'] = 'Kahdenna';
$lang['Delete selected users'] = 'Poista valitut käyttäjät';
$lang['Delete this language'] = 'Poista tämä kieli';
$lang['Delete Representant'] = 'Poista albumin esikatselukuva';
+$lang['%d anomalies have been detected corrected.'] = '%d epäkohtaa löydetty ja korjattu.';
+$lang['%d anomalies have been detected.'] = '%d epäkohtaa havaittu.';
+$lang['%d anomalies have been ignored.'] = '%d epäkohtaa ohitettu.';
+$lang['%d anomalies have not been corrected.'] = '%d epäkohtaa ei ole korjattu.';
+$lang['%d anomaly has been corrected.'] = '%d epäkohtaa korjattiin.';
+$lang['%d anomaly has been detected.'] = '%d epäkohtaa havaittiin.';
+$lang['%d anomaly has been ignored.'] = '%d epäkohtaa ohitettiin.';
+$lang['%d anomaly has not been corrected.'] = '%d ei olla korjattu.';
+$lang['%d association'] = '%d assosiaatiota';
+$lang['%d associations'] = '%d assosiaatiota';
+$lang['%d line filtered'] = '%d rivi rajattu';
+$lang['%d lines filtered'] = '%d riviä rajattu';
+$lang['%d of %d photos selected'] = '%d/%d kuvaa valittu';
+$lang['%d physical'] = '%d fyysistä';
+$lang['%d physicals'] = '%d fyysistä';
+$lang['%d tag'] = '%d tunniste';
+$lang['%d tags'] = '%d tunnistetta';
+$lang['%d user comment rejected'] = '%d kommentti hylätty';
+$lang['%d user comment validated'] = '%d kommentti hyväksytty';
+$lang['%d user comments rejected'] = '%d kommenttia hylätty';
+$lang['New tag'] = 'Uusi tägi';
+$lang['Number of comments per page'] = 'Kommenttien lukumäärä sivua kohden';
+$lang['Move albums'] = 'Siirrä albumeja';
+$lang['Move to album'] = 'Siirrä albumiin';
+$lang['Manage Permissions'] = 'Hallitse oikeuksia';
+$lang['Hide'] = 'Piilota';
+$lang['Gallery title'] = 'Gallerian otsikko';
+$lang['Default photos order'] = 'Kuvien oletusjärjestys';
+$lang['Default user cannot be deleted'] = 'Oletuskäyttäjää ei voi poistaa';
+$lang['Delete orphan tags'] = 'Poista käyttämättömät tägit';
+$lang['Delete selected photos'] = 'Poista valitut kuvat';
+$lang['Delete selected tags'] = 'Poista valitut tägit';
+$lang['Delete this theme'] = 'Poista tämä teema';
+$lang['Add a criteria'] = 'Lisää kriteeri';
+$lang['Add a filter'] = 'Lisää filtteri';
+$lang['Add a tag'] = 'Lisää tägi';
+$lang['Add a virtual album'] = 'Lisää virtuaalinen albumi';
+$lang['Add group'] = 'Lisää ryhmä';
+$lang['Add tags'] = 'Lisää tägejä';
+$lang['Added by %s'] = 'Lisännyt %s';
+$lang['Album "%s" has been added'] = 'Albumi "%s" lisätty';
+$lang['Album "%s" now contains %d photos'] = 'Albumi "%s" sisältää nyt %d kuvaa';
+$lang['Albums automatically sorted'] = 'Albumit järjestetty automaattisesti';
+$lang['All %d photos are selected'] = 'Kaikki %d kuvaa ovat valittuina';
+$lang['All extensions are up to date.'] = 'Kaikki laajennukset ovat ajan tasalla.';
+$lang['ACCESS_5'] = 'Ei pääsyä';
+$lang['Action'] = 'Toiminto';
+$lang['Actions'] = 'Toiminnot';
+$lang['Select an album'] = 'Valitse albumi';
+$lang['Select at least one album'] = 'Valitse vähintään yksi albumi';
+$lang['Select at least one comment'] = 'Valitse vähintään yksi kommentti';
+$lang['Select at least one photo'] = 'Valitse vähintään yksi kuva';
+$lang['Select at least one user'] = 'Valitse vähintään yksi käyttäjä';
+$lang['Select groups...'] = 'Valitse ryhmät...';
+$lang['Select users...'] = 'Valitse käyttäjät...';
+$lang['Two updates are available'] = 'Kaksi päivitystä on saatavilla';
+$lang['Thumbnails generation in progress...'] = 'Luodaan pienoiskuvia...';
+$lang['Virtual album added'] = 'Virtuaalinen albumi lisätty';
+$lang['Virtual album deleted'] = 'Virtuaalinen albumi poistettu';
+$lang['You are running the latest version of Piwigo.'] = 'Sinulla on uusin versio Piwigosta.';
+$lang['You cannot delete your account'] = 'Et voi poistaa omaa käyttäjätiliäsi';
+$lang['You cannot move an album in its own sub album'] = 'Et voi siirtää albumia omaan ala-albumiinsa';
+$lang['an error happened'] = 'tapahtui virhe';
+$lang['any visitor can see this album'] = 'kuka tahansa vierailija näkee tämän albumin';
+$lang['automatic order'] = 'automaattinen järjestys';
+$lang['default values'] = 'oletusarvot';
+$lang['unknown'] = 'tuntematon';
+$lang['user_status_admin'] = 'Ylläpitäjä';
+$lang['user_status_guest'] = 'Vieras';
+$lang['user_status_normal'] = 'Käyttäjä';
+$lang['Create'] = 'Luo';
+$lang['Change password'] = 'Vaihda salasana';
+$lang['Change username'] = 'Vaihda käyttäjätunnus';
+$lang['Check for upgrade'] = 'Tarkista päivitykset';
+$lang['Classic display'] = 'Klassinen näkymä';
+$lang['Configuration'] = 'Asetukset';
+$lang['Applications'] = 'Sovellukset';
+$lang['Activate'] = 'Aktivoi';
+$lang['Activate comments'] = 'Aktivoi kommentit';
+$lang['Active Languages'] = 'Aktiiviset kielet';
+$lang['Add New Language'] = 'Lisää kieli';
+$lang['Add Photos'] = 'Lisää valokuvia';
+$lang['Active Plugins'] = 'Aktiiviset liitännäiset';
+$lang['Active Themes'] = 'Aktiiviset teemat';
+$lang['Add New Theme'] = 'Lisää uusi teema';
+$lang['Album updated successfully'] = 'Albumi päivittyi onnistuneesti';
+$lang['All languages are up to date.'] = 'Kaikki kielet ovat päivitettyjä.';
+$lang['All plugins are up to date.'] = 'Kaikki liitännäiset ovat päivitettyjä.';
+$lang['%d of %d users selected'] = '%d/%d käyttäjistä valittu';
+$lang['%s in the future'] = '%s tulevaisuudessa';
+$lang['%s photos can not be regenerated'] = '%s ei voida regeneroida';
+$lang['%s photos have been regenerated'] = '%s on regeneroitu';
+$lang['bottom left corner'] = 'vasen alakulma';
+$lang['bottom right corner'] = 'oikea alakulma';
+$lang['clean'] = 'siivoa';
+$lang['confirm'] = 'hyväksy';
+$lang['create a new album'] = 'luo uusi albumi';
+$lang['create a new site'] = 'luo uusi sivusto';
+$lang['created'] = 'luotu';
+$lang['default'] = 'oletus';
+$lang['delete'] = 'poista';
+$lang['delete album'] = 'poista albumi';
+$lang['delete photo'] = 'poista valokuva';
+$lang['delete this site and all its attached elements'] = 'poista sivusto ja siihen liittyvät tiedot';
+$lang['deleted'] = 'poistettu';
+$lang['directories + files'] = 'kansiot + tiedostot';
+$lang['display'] = 'näytä';
+$lang['jump to photo'] = 'hyppää valokuvaan';
+$lang['manual order'] = 'manuaalinen järjestys';
+$lang['modified'] = 'muokattu';
+$lang['new'] = 'uusi';
+$lang['nothing'] = 'ei mitään';
+$lang['only directories'] = 'vain kansiot';
+$lang['other'] = 'muu';
+$lang['user "%s" added'] = 'käyttäjä "%s" lisätty';
+$lang['user_status_generic'] = 'Yleinen';
+$lang['width must be a number superior to'] = 'leveys on oltava suurempi kuin';
+$lang['wrong filename'] = 'väärä tiedostonimi';
+$lang['selection'] = 'valinta';
+$lang['set to'] = 'aseta';
+$lang['show details'] = 'näytä lisätiedot';
+$lang['synchronize files structure with database'] = 'syknronoi tiedostorakenne tietokannan kanssa';
+$lang['target'] = 'kohde';
+$lang['test'] = 'kokeile';
+$lang['the forum'] = 'foorumi';
+$lang['the wiki'] = 'wiki';
+$lang['top left corner'] = 'vasen yläkulma';
+$lang['top right corner'] = 'oikea yläkulma';
+$lang['total time'] = 'aika yhteensä';
+$lang['update the database from files'] = 'päivitä tietokanta tiedostoilla';
+$lang['Activate Navigation Bar'] = 'Aktivoi navigointi-palkki';
+$lang['Activate icon "%s"'] = 'Aktivoi kuvake "%s"';
+$lang['Activate icon "new" next to albums and pictures'] = 'Aktivoi "uusi" kuvake albumeihin ja kuviin';
+$lang['View in gallery'] = 'Katso galleriassa';
+$lang['Virtual Links'] = 'Virtuaaliset linkit';
+$lang['Virtual album'] = 'Virtuaalinen albumi';
+$lang['Virtual album name'] = 'Virtuaalisen albumin nimi';
+$lang['Virtual albums to move'] = 'Siirrettävät virtuaaliset albumit';
+$lang['Visit Gallery'] = 'Mene galleriaan';
+$lang['Waiting'] = 'Odottava';
+$lang['Width'] = 'Leveys';
+$lang['Year'] = 'Vuosi';
+$lang['photos per page'] = 'valokuvia per sivu';
+$lang['pixels'] = 'pikseleitä';
+$lang['private'] = 'yksityinen';
+$lang['public'] = 'julkinen';
+$lang['registered users'] = 'rekisteröityneet käyttäjät';
+$lang['registration date'] = 'rekisteröintipäivämäärä';
+$lang['remove creation date'] = 'poista luontipäivämäärä';
+$lang['remove tags'] = 'Poista tägit';
+$lang['remove this filter'] = 'poista tämä suodatin';
+$lang['remove title'] = 'poista otsikko';
+$lang['Grant selected groups'] = 'Salli valitut ryhmät';
+$lang['Grant selected users'] = 'Salli valitut käyttäjät';
+$lang['Extensions Update'] = 'Laajennusosien päivitys';
+$lang['FTP + Synchronization'] = 'FTP + Synkronointi';
+$lang['General'] = 'Yleinen';
+$lang['Generate multiple size images'] = 'Generoi useita kuvakokoja';
+$lang['Environment'] = 'Ympäristö';
+$lang['Error list'] = 'Lista virheistä';
+$lang['Everybody'] = 'Kaikki';
+$lang['Download,'] = 'Lataa,';
+$lang['Downloads'] = 'Lataukset';
+$lang['Edit album'] = 'Muokkaa albumia';
+$lang['Edit album permissions'] = 'Muokkaa albumin oikeuksia';
+$lang['Edit photo'] = 'Muokkaa valokuvaa';
+$lang['Edit photo information'] = 'Muokkaa valokuvan tietoja';
+$lang['Edit selected tags'] = 'Muokkaa valittuja tägejä';
+$lang['Edit tags'] = 'Muokkaa tägejä';
+$lang['Element'] = 'Elementti';
+$lang['Element type'] = 'Elementin tyypppi';
+$lang['Caddie'] = 'Caddie';
+$lang['Caddie management'] = 'Caddien hallinta';
+$lang['Can\'t download archive.'] = 'Arkistoa ei voida ladata.';
+$lang['Available versions for'] = 'Saatavilla olevia versioita';
+$lang['Basic settings'] = 'Perusasetukset';
+$lang['Can\'t connect to server.'] = 'Palvelimeen ei saada yhteyttä.';
+$lang['remove author'] = 'poista luoja';
+$lang['status'] = 'tila';
+$lang['jump to album'] = 'hyppää albumiin';
+$lang['leave'] = 'jätä';
+$lang['manage album photos'] = 'hallinnoi albumien valokuvia';
+$lang['none'] = 'ei mikään';
+$lang['photos added in the database'] = 'valokuvia lisätty tietokantaan';
+$lang['Email administrators when a comment is deleted'] = 'Lähetä sähköpostia ylläpitäjille poistettaessa kommentin.';
+$lang['Drag to re-order'] = 'Klikkaa ja raahaa järjestääksesi uudelleen';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'VIRHEILMOITUS: TÄMÄ LIITÄNNÄINEN PUUTTUU MUTTA ON ASENNETTU! POISTA SE NYT.';
+$lang['Deny selected groups'] = 'Kiellä valitut ryhmät';
+$lang['Deny selected users'] = 'Kiellä valitut käyttäjät';
+$lang['Detailed informations'] = 'Lisätiedot';
+$lang['Directory does not exist'] = 'Kansiota ei ole';
+$lang['Do you want to activate anyway?'] = 'Haluatko silti aktivoida?';
+$lang['Comments for all'] = 'Kommmentit kaikille';
+$lang['Confirm merge'] = 'Hyväksy yhdistäminen';
+$lang['Create this site'] = 'Luo tämä sivusto';
+$lang['Current name'] = 'Tämänhetkinen nimi';
+$lang['Database synchronization with files'] = 'Tietokannan tiedostosynkronointi';
+$lang['Date'] = 'Päivämäärä';
+$lang['Day'] = 'Päivä';
+$lang['Deactivate'] = 'Deaktivoi';
+$lang['Deactivate all'] = 'Deaktivoi kaikki';
+$lang['Default comments order'] = 'Kommenttien oletusjärjestys';
+$lang['Default display'] = 'Oletus esitystapa';
+$lang['(this tag will be deleted)'] = '(tämä tägi poistetaan)';
+$lang['Album list management'] = 'Albumilistojen hallinta';
+$lang['Album manual order was saved'] = 'Albumien manuaalinen järjestys tallennettiin';
+$lang['+ Add an upload box'] = '+ Lisää tiedostonlähetys-laatikko';
+$lang[', click on'] = ', klikkaa';
+$lang['A locked gallery is only visible to administrators'] = 'Lukittu galleria näkyy vain ylläpitäjille';
+$lang['ACCESS_1'] = 'Pääsy kaikille';
+$lang['ACCESS_2'] = 'Pääsy rekisteröidyille käyttäjille';
+$lang['ACCESS_3'] = 'Pääsy ylläpitäjille';
+$lang['Add another set of photos'] = 'Lisää toinen sarja valokuvia';
+$lang['Add to caddie'] = 'Lisää caddieen';
+$lang['Add/delete a permalink'] = 'Lisää/poista permalinkki';
+$lang['All %d users are selected'] = 'Kaikki %d käyttäjää ovat valittuna';
+$lang['(filtered from %s total users)'] = '(suodatettu yhteensä %s käyttäjästä)';
+$lang['%d user comments validated'] = '%d käyttäjien kommenttia varmistettu';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s täytyy olla asetettu arvoon false local/config/config.inc.php tiedostossa';
+$lang['%s value is not correct file because exif are not supported'] = '%s arvo on virheellinen, sillä exif-tuki puuttuu';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '%u käyttäjällä on oikeudet automaattisesti, sillä he kuuluvat oikeudet omaavaan ryhmään.';
+$lang['ACCESS_4'] = 'Pääsy webmastereille';
+$lang['Access type'] = 'Pääsyn tyyppi';
+$lang['Add detailed content'] = 'Lisää yksityiskohtaista sisältöä';
+$lang['Add write access to the "%s" directory'] = 'Lisää kirjoitusoikeudet "%s" hakemistoon.';
+$lang['Administration Home'] = 'Ylläpidon etusivu';
+$lang['Advanced features'] = 'Kehittyneet toiminnallisuudet';
+$lang['Album photos associated to the following albums: %s'] = 'Albumin kuvat liittyvät seuraaviin albumeihin: %s';
+$lang['Albums authorized thanks to group associations'] = 'Oikeudet albumeihin johtuen ryhmäoikeuksista';
+$lang['All optimizations have been successfully completed.'] = 'Kaikki optimoinnit on suoritettu onnistuneesti.';
+$lang['Allowed file types: %s.'] = 'Sallitut tiedostotyypit: %s.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Virhe purettaessa pakettia. Ole hyvä ja varmista oikeudet piwigon asennushakemistossa. <br><a href="%s">Klikkaa nähdäksesi virheloki</a>.';
+$lang['Missing a temporary folder'] = 'Tilapäiskansio puuttuu';
+$lang['Month'] = 'Kuukausi';
+$lang['Name'] = 'Nimi';
+$lang['Name of the duplicate'] = 'Duplikaatin nimi';
+$lang['New Version'] = 'Uusi versio';
+$lang['New name'] = 'Uusi nimi';
+$lang['New photos added'] = 'Uusia kuvia lisätty';
+$lang['New photos were added'] = 'Uusia kuvia on lisätty';
+$lang['Maximum file size: %sB.'] = 'Maksimi tiedostokoko: %sB.';
+$lang['Maximum height'] = 'Maksimi korkeus';
+$lang['Maximum width'] = 'Maksimi leveys';
+$lang['Members'] = 'Jäsenet';
+$lang['Menu Management'] = 'Valikot';
+$lang['Merge selected groups'] = 'Yhdistä valitut ryhmät';
+$lang['Merge selected tags'] = 'Yhdistä valitut tägit';
+$lang['Merge tags'] = 'Yhdistä tägit';
+$lang['Minimum width'] = 'Minimi leveys';
+$lang['Miscellaneous'] = 'Sekalaiset';
+$lang['Missing Plugins'] = 'Puuttuvat liitännäiset';
+$lang['Modify information'] = 'Muokkaa tietoja';
+$lang['Maintenance'] = 'Ylläpito';
+$lang['Last import'] = 'Viimeisin tuonti';
+$lang['Last send'] = 'Viimeisin lähetys';
+$lang['Linked albums'] = 'Linkitetyt albumit';
+$lang['List'] = 'Lista';
+$lang['Loading...'] = 'Lataa...';
+$lang['Local'] = 'Paikallinen';
+$lang['Lock'] = 'Lukitse';
+$lang['Mail address is obligatory for all users'] = 'Sähköpostiosoite on pakollinen kaikille käyttäjille';
+$lang['Mail content'] = 'Sähköpostin sisältö';
+$lang['Mail sent to %s [%s].'] = 'Sähköposti lähetetty %s [%s]';
+$lang['Mail theme'] = 'Sähköpostiteema';
+$lang['Informations'] = 'Tietoa';
+$lang['Install'] = 'Asenna';
+$lang['Install on your computer,'] = 'Asenna tietokoneellesi,';
+$lang['Instructions to use Piwigo'] = 'Piwigo käyttöohjeet';
+$lang['Ignore All'] = 'Jätä kaikki huomiotta';
+$lang['Ignore this update'] = 'Älä huomioi tätä päivitystä';
+$lang['Image Quality'] = 'Kuvanlaatu';
+$lang['Image id'] = 'Kuvan tunnus';
+$lang['Error on file "%s" : %s'] = 'Virhe tiedostossa "%s":%s';
+$lang['Choose an option'] = 'Valitse vaihtoehto';
+$lang['Close user details'] = 'Sulje käyttäjätiedot';
+$lang['Continue processing treatment'] = 'Jatka meneillään olevaa käsittelyä';
+$lang['Associated'] = 'Liitetty';
+$lang['Authorized'] = 'Valtuutettu';
+$lang['Automatic correction'] = 'Automaattinen korjaus';
+$lang['Available only with HTML format'] = 'Saatavilla vain HTML-formaatissa';
+$lang['An error occured during extraction (%s).'] = 'Tapahtui virhe tiedoston/tiedostojen (%s) purkauksessa.';
+$lang['An error has occured during upgrade.'] = 'Tapahtui virhe päivityksen yhteydessä.';
+$lang['Anomaly'] = 'Poikkeama';
+$lang['Apply action'] = 'Toteuta toimenpide';
+$lang['Apply selected corrections'] = 'Toteuta valitut korjaukset';
+$lang['Apply watermark if height is bigger than'] = 'Lisää vesileima jos korkeus on suurempi kuin';
+$lang['Apply watermark if width is bigger than'] = 'Lisää vesileima jos leveys on suurempi kuin';
+$lang['Are you sure you want to delete this plugin?'] = 'Haluatko varmasti poistaa tämän liitännäisen?';
+$lang['Are you sure you want to install this plugin?'] = 'Haluatko varmasti asentaa tämän liitännäisen?';
+$lang['Forbid this language to users'] = 'Kiellä tämä kieli käyttäjiltä';
+$lang['Extend for templates'] = 'Laajenna mallineet';
+$lang['File upload stopped by extension'] = 'Tiedoston lähetys pysäytetty laajennuksen toimesta';
+$lang['Find a new representant by random'] = 'Etsi uusi satunnainen näytekuva albumille';
+$lang['Update albums informations'] = 'Päivitä albumin tiedot';
+$lang['Update in progress... Please wait.'] = 'Päivitys käynnissä...odota hetki';
+$lang['Update to Piwigo %s'] = 'Päivitä Piwigo-versioon %s';
+$lang['Updates'] = 'Päivitykset';
+$lang['Upload'] = 'Lähetä';
+$lang['Upload Photos'] = 'Lähetä valokuvat';
+$lang['Uploaded Photos'] = 'Lähetetyt valokuvat';
+$lang['Update All'] = 'Päivitä kaikki';
+$lang['Update Complete'] = 'Päivitys valmis';
+$lang['Update user'] = 'Päivitä käyttäjä';
+$lang['User %s added'] = 'Käyttäjä %s lisätty';
+$lang['User %s updated'] = 'Käyttäjä %s päivitetty';
+$lang['Who can see these photos?'] = 'Ketkä voivat nähdä nämä valokuvat?';
+$lang['Who can see this photo?'] = 'Ketkä voivat nähdä tämän valokuvan?';
+$lang['User list'] = 'Lista käyttäjistä';
+$lang['Users'] = 'Käyttäjät';
+$lang['Visit language site'] = 'Käy kieli-sivustolla';
+$lang['Visit plugin site'] = 'Käy liitännäis-sivustolla';
+$lang['Visit theme site'] = 'Käy teema-sivustolla';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'VAROITUS! Tämä liitännäinen ei näytä olevan yhteensopiva tämän Piwigo-version kanssa.';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'vierailijoiden on kirjauduttava ja heillä on oltava käyttöoikeudet tähän albumiin';
+$lang['photos deleted from the database'] = 'tietokannasta poistetut valokuvat';
+$lang['photos updated in the database'] = 'tietokantaan päivitetyt valokuvat';
+$lang['group "%s" updated'] = 'ryhmä "%s" päivitetty';
+$lang['guest'] = 'vieras';
+$lang['height must be a number superior to'] = 'korkeus on oltava suurempi lukui kuin';
+$lang['hide details'] = 'piilota lisätiedot';
+$lang['high'] = 'korkea';
?> \ No newline at end of file
diff --git a/language/fi_FI/common.lang.php b/language/fi_FI/common.lang.php
index 43d3a85d8..8da7a4f5c 100644
--- a/language/fi_FI/common.lang.php
+++ b/language/fi_FI/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,8 +22,8 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Finnish [FI]
-Version: 2.5.0
-Language URI: http://piwigo.org/ext/extension_view.php?eid=
+Version: 2.6.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=686
Author: Piwigo team
Author URI: http://piwigo.org
*/
@@ -258,7 +258,6 @@ $lang['in %d sub-album'] = '%d ala-albumissa';
$lang['in %d sub-albums'] = '%d ala-albumissa';
$lang['in this album'] = 'tässä albumissa';
$lang['included'] = 'sisältyy';
-$lang['Interface theme'] = 'Käyttöliittymän teema';
$lang['Invalid key'] = 'Väärä avain';
$lang['Invalid password!'] = 'Väärä salasana!';
$lang['Invalid username or email'] = 'Väärä käyttäjätunnus tai sähköpostiosoite';
@@ -273,7 +272,6 @@ $lang['Page generated in'] = 'Sivu luotu';
$lang['Password reset is not allowed for this user'] = 'Salasanan palautus ei ole sallittu tälle käyttäjälle';
$lang['Password: %s'] = 'Salasana:%s';
$lang['Play of slideshow'] = 'Käynnistä diaesitys';
-$lang['please enter your password again'] = 'kirjoita salasanasi uudelleen';
$lang['Please enter your username or email address.'] = 'Kirjoita käyttäjätunnus tai sähköpostiosoite';
$lang['posted after %s (%s)'] = 'lähetetty %s(%s) jälkeen';
$lang['posted before %s (%s)'] = 'lähetetty ennen %s(%s)';
@@ -415,4 +413,12 @@ $lang['Username is mandatory'] = 'Käyttäjätunnus on pakollinen';
$lang['mandatory'] = 'pakollinen';
$lang['Your website URL is invalid'] = 'Sivustosi URL osoite on virheellinen';
$lang['Website'] = 'Verkkosivusto';
+$lang['Email'] = 'Sähköposti';
+$lang['First Page'] = 'Ensimmäinen sivu';
+$lang['Go back to the album'] = 'Takaisin albumiin';
+$lang['Last Page'] = 'Viimeinen sivu';
+$lang['%d photos per page'] = '%d kuvaa sivua kohti';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Salasanan vahvistus puuttuu. Ole hyvä ja vahvista salasanasi.';
+$lang['Password is missing. Please enter the password.'] = 'Salasana puuttuu. ';
+$lang['Theme'] = 'Teema';
?> \ No newline at end of file
diff --git a/language/fi_FI/install.lang.php b/language/fi_FI/install.lang.php
index 3b03d1c33..254dfeaaa 100755
--- a/language/fi_FI/install.lang.php
+++ b/language/fi_FI/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -20,6 +20,7 @@
// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
// | USA. |
// +-----------------------------------------------------------------------+
+
$lang['Admin configuration'] = 'Pääkäyttäjän konfiguroiminen';
$lang['Basic configuration'] = 'Perusasetukset';
$lang['Can\'t connect to server'] = 'Ei pysty yhdistämään palvelimeen';
@@ -31,13 +32,10 @@ $lang['Default gallery language'] = 'Gallerian oletuskieli';
$lang['Host'] = 'Isäntäkone';
$lang['Installation'] = 'Asennus';
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Tullaan näyttämään vierailijoille. Olennainen sivuston hallintaa ajatellen';
-$lang['Password'] = 'Salasana';
$lang['Start Install'] = 'Aloita asennus';
$lang['User'] = 'Käyttäjä';
-$lang['Webmaster login'] = 'Webmaster -kirjatuminen';
$lang['also given by your host provider'] = 'myöskin palveluntarjoajan määrittelemä';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'paikallinen isäntäkone';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'sähköpostin tulee olla muodossa xxx@yyy.eee (esim. jack@altern.org)';
+$lang['localhost or other, supplied by your host provider'] = 'paikallinen isäntäkone';
$lang['user login given by your host provider'] = 'käyttäjänimi, jonka palveluntarjoaja on määrittänyt';
$lang['user password given by your host provider'] = 'käyttäjän salasana, jonka palveluntarjoaja on määrittänyt';
$lang['Congratulations, Piwigo installation is completed'] = 'Onnittelut, Piwigon asennus on onnistunut';
@@ -49,8 +47,6 @@ $lang['PHP 5 is required'] = 'PHP 5 vaaditaan';
$lang['Password ']['confirm'] = 'Salasana [hyväksy]';
$lang['Try to configure PHP 5'] = 'Yritä määrittää PHP 5';
$lang['Visitors will be able to contact site administrator with this mail'] = 'Vierailijat voivat ottaa yhteyttä sivuston ylläpitäjään tätä sähköpostiosoitetta käyttäen';
-$lang['Webmaster mail address'] = 'Ylläpitäjän sähköpostiosoite';
-$lang['Webmaster password'] = 'Ylläpitäjän salasana';
$lang['Welcome to my photo gallery'] = 'Tervetuloa kuvagalleriaani';
$lang['enter a login for webmaster'] = 'Lisää käyttäjätunnus ylläpitäjälle';
$lang['please enter your password again'] = 'Salasana uudelleen';
diff --git a/language/fi_FI/upgrade.lang.php b/language/fi_FI/upgrade.lang.php
index c52545a3f..37112f61e 100755
--- a/language/fi_FI/upgrade.lang.php
+++ b/language/fi_FI/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/fr_CA/admin.lang.php b/language/fr_CA/admin.lang.php
index 273c9d1fd..f60e93f07 100644
--- a/language/fr_CA/admin.lang.php
+++ b/language/fr_CA/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -192,7 +192,6 @@ $lang['Access type'] = "Type d'accès";
$lang['Information data registered in database'] = "Informations enregistrées dans la base de données";
$lang['Default display'] = "Affichage par défaut";
$lang['The gallery URL is not valid.'] = "L'adresse de la galerie n'est pas valide.";
-$lang['Main'] = "Principale";
$lang['The number of comments a page must be between 5 and 50 included.'] = "Le nombre de commentaires d'utilisateurs par page doit être compris entre 5 et 50.";
$lang['Configuration'] = "Configuration";
$lang['confirm'] = "Confirmer";
@@ -228,7 +227,6 @@ $lang['Prepared time for list of users to send mail is limited. Others users are
$lang['Time to send mail is limited. Others mails are skipped.'] = "Le temps d'envoi des courriels est limité. Les autres envois de courriel ont été ignorés.";
$lang['To send ?'] = "À envoyer ?";
$lang['Last send'] = "Dernier envoi";
-$lang['email'] = "Courriel";
$lang['User'] = "Utilisateur";
$lang['See you soon,'] = "À bientôt,";
$lang['Go to'] = "Rendez-vous sur";
@@ -956,4 +954,33 @@ $lang['Ratio'] = 'Ratio';
$lang['View in gallery'] = 'Voir dans la galerie';
$lang['between %d and %d pixels'] = 'entre %d et %d pixels';
$lang['between %.2f and %.2f'] = 'entre %.2f et %.2f';
+$lang['Purge user cache'] = 'Purger le cache utilisateur';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'La tailles des images sera réduite à %dx%d pixels.';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'Redimensionnement après transfert désactivé car GD est la librairie graphique utilisée actuellement';
+$lang['Select at least one tag'] = 'Sélectionnez au moins un mot clé';
+$lang['Basic settings'] = 'Paramètres de base';
+$lang['General'] = 'Général';
+$lang['Mail theme'] = 'Thème des courriels';
+$lang['%d of %d users selected'] = '%d des %d utilisateurs sélectionnés';
+$lang['(filtered from %s total users)'] = '(filtré de %s utilisateurs au total)';
+$lang['All %d users are selected'] = 'Tous les %d utilisateurs sont sélectionnés';
+$lang['Change password'] = 'Changer le mot de passe';
+$lang['Change username'] = 'Changer le nom d\'utilisateur';
+$lang['Last visit on %s, %s.'] = 'Dernière visite le %s, %s.';
+$lang['Loading...'] = 'Chargement...';
+$lang['No matching user found'] = 'Aucun utilisateur à afficher';
+$lang['No user selected of %d users'] = 'Aucun utilisateur sélectionné sur les %d';
+$lang['No user selected, no action possible.'] = 'Aucun utilisateur sélectionné, aucune action possible.';
+$lang['Password updated'] = 'Mot de passe mis à jour';
+$lang['Registered on %s, %s.'] = 'Enregistré depuis le %s, %s.';
+$lang['Show %s users'] = 'Afficher %s utilisateurs';
+$lang['Showing %s to %s of %s users'] = 'Affichage des utilisateurs %s à %s sur %s';
+$lang['Update user'] = 'Mettre à jour l\'utilisateur';
+$lang['User %s added'] = 'Utilisateur %s ajouté';
+$lang['User %s updated'] = 'Utilisateur %s mis à jour';
+$lang['Users modified'] = 'Utilisateurs modifiés';
+$lang['on the %d selected users'] = 'sur les %d utilisateurs sélectionnés';
+$lang['Close user details'] = 'Fermer les détails de l\'utilisateur';
+$lang['Open user details'] = 'Ouvrir les détails de l\'utilisateur';
+$lang['close'] = 'Fermer';
?> \ No newline at end of file
diff --git a/language/fr_CA/common.lang.php b/language/fr_CA/common.lang.php
index c89e12423..6dbbb6d24 100644
--- a/language/fr_CA/common.lang.php
+++ b/language/fr_CA/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2009 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Français [QC]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=420
Author: Piwigo team
Author URI: http://piwigo.org
@@ -34,6 +34,7 @@ $lang_info['country'] = 'Québec';
$lang_info['direction'] = 'ltr';
$lang_info['code'] = 'fr';
$lang_info['zero_plural'] = false;
+$lang_info['parent']= "fr_FR";
$lang['%d Kb'] = '%d Ko';
$lang['%d album updated'] = '%d catégorie mise à jour';
@@ -244,7 +245,6 @@ $lang['login mustn\'t end with a space character'] = 'le nom d\'utilisateur ne d
$lang['login mustn\'t start with a space character'] = 'le nom d\'utilisateur ne doit pas commencer par un espace';
$lang['this login is already used'] = 'ce nom d\'utilisateur est déjà pris';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'l\'adresse de courriel doit être de la forme xxx@yyy.eee (exemple : luc@altern.org)';
-$lang['please enter your password again'] = 'Merci d\'entrer à nouveau votre mot de passe';
$lang['Auto login'] = 'Connexion auto';
$lang['remove this tag from the list'] = 'retirer ce mot clé de la liste';
$lang['representative'] = 'représentante';
@@ -273,7 +273,6 @@ $lang['SQL queries in'] = 'requêtes SQL en';
$lang['display only recently posted photos'] = 'n\'afficher que les éléments publiés récemment';
$lang['return to the display of all photos'] = 'retourner à l\'affichage de tous les éléments';
$lang['the beginning'] = 'le début';
-$lang['Interface theme'] = 'Thème de l\'interface';
$lang['Thumbnails'] = 'Miniatures';
$lang['Menu'] = 'Menu';
$lang['A comment on your site'] = 'Un commentaire sur le site';
@@ -416,5 +415,12 @@ $lang['Username is mandatory'] = 'Nom d\'utilisateur obligatoire';
$lang['mandatory'] = 'obligatoire';
$lang['Website'] = 'Site web';
$lang['Your website URL is invalid'] = 'L\'adresse de votre site web est invalide';
-
+$lang['First Page'] = 'Première page';
+$lang['Go back to the album'] = 'Retourner à l\'album';
+$lang['Last Page'] = 'Dernière page';
+$lang['Email'] = 'Courriel';
+$lang['Password is missing. Please enter the password.'] = "Le mot de passe manque. Veuillez saisir le mot de passe.";
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = "La confirmation du mot de passe manque. Veuillez confirmer le mot de passe choisi.";
+$lang['%d photos per page'] = '%d photos par page';
+$lang['Theme'] = 'Thème';
?> \ No newline at end of file
diff --git a/language/fr_CA/help/index.php b/language/fr_CA/help/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/fr_CA/help/index.php
+++ b/language/fr_CA/help/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/fr_CA/index.php b/language/fr_CA/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/fr_CA/index.php
+++ b/language/fr_CA/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/fr_CA/install.lang.php b/language/fr_CA/install.lang.php
index 4c1a88686..452322e1a 100644
--- a/language/fr_CA/install.lang.php
+++ b/language/fr_CA/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,24 +21,18 @@
// | USA. |
// +-----------------------------------------------------------------------+
-
-
$lang['Installation'] = "Installation";
$lang['Basic configuration'] = "Configuration de base";
$lang['Default gallery language'] = "Langue par défaut de la galerie";
$lang['Database configuration'] = "Configuration de la base de données";
$lang['Admin configuration'] = "Configuration du compte administrateur";
$lang['Start Install'] = "Démarrer l'installation";
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = "L'adresse de courriel doit être de la forme xxx@yyy.eee (exemple : jack@altern.org)";
-$lang['Webmaster login'] = "Identifiant de l'administrateur";
$lang['It will be shown to the visitors. It is necessary for website administration'] = "Cet identifiant apparaîtra à tous vos visiteurs. Il vous sert pour administrer le site";
$lang['Connection to server succeed, but it was impossible to connect to database'] = "La connexion au serveur est OK, mais la connection à cette base de données est impossible";
$lang['Can\'t connect to server'] = "Impossible de se connecter au serveur";
$lang['Host'] = "Hôte";
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = "localhost, sql.multimania.com, toto.freesurf.fr";
$lang['User'] = "Utilisateur";
$lang['user login given by your host provider'] = "nom d'utilisateur communiqué par votre hébergeur";
-$lang['Password'] = "Mot de passe";
$lang['user password given by your host provider'] = "mot de passe utilisateur communiqué par votre hébergeur";
$lang['Database name'] = "Nom de la base de données";
$lang['also given by your host provider'] = "également fourni par votre hébergeur";
@@ -47,12 +41,10 @@ $lang['database tables names will be prefixed with it (enables you to manage bet
$lang['enter a login for webmaster'] = "veuillez rentrer un pseudo pour le webmaster";
$lang['webmaster login can\'t contain characters \' or "'] = "le pseudo du webmaster ne doit pas comporter les caractères \" et '";
$lang['please enter your password again'] = "veuillez resaisir votre mot de passe";
-$lang['Webmaster password'] = "Mot de passe du webmaster";
$lang['Keep it confidential, it enables you to access administration panel'] = "Il doit rester confidentiel, il permet d'accéder à l'écran d'administration.";
$lang['Password [confirm]'] = "Mot de passe [Confirmer]";
$lang['verification'] = "vérification";
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = "Besoin d'aide ? Posez votre question sur le <a href=\"%s\">forum de Piwigo</a>.";
-$lang['Webmaster mail address'] = "Adresse de courriel de l'administrateur";
$lang['Visitors will be able to contact site administrator with this mail'] = "Les visiteurs pourront contacter l'administrateur du site par ce courriel";
$lang['PHP 5 is required'] = "PHP 5 est requis";
$lang['It appears your webhost is currently running PHP %s.'] = "Apparemment, la version PHP de votre hébergeur est PHP %s.";
@@ -72,5 +64,5 @@ $lang['Just another Piwigo gallery'] = 'Une galerie Piwigo de plus';
$lang['Welcome to my photo gallery'] = 'Bienvenue sur ma galerie photo';
$lang['Welcome to your new installation of Piwigo!'] = 'Bienvenue sur votre nouvelle installtion de Piwigo!';
$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'N\'hésitez pas à consulter bos forums si vous avez le moindre problème : %s';
-
+$lang['localhost or other, supplied by your host provider'] = 'localhost ou autre, communiqué par votre hébergeur';
?> \ No newline at end of file
diff --git a/language/fr_CA/upgrade.lang.php b/language/fr_CA/upgrade.lang.php
index e7aa0b191..00b613a2f 100644
--- a/language/fr_CA/upgrade.lang.php
+++ b/language/fr_CA/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/fr_FR/admin.lang.php b/language/fr_FR/admin.lang.php
index 209cc9b88..3a49ebca5 100644
--- a/language/fr_FR/admin.lang.php
+++ b/language/fr_FR/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -194,7 +194,7 @@ $lang['Access type'] = "Type d'accès";
$lang['Information data registered in database'] = "Informations enregistrées dans la base de données";
$lang['Default display'] = "Affichage par défaut";
$lang['The gallery URL is not valid.'] = "L'adresse de la galerie n'est pas valide.";
-$lang['Main'] = "Principale";
+$lang['General'] = "Général";
$lang['The number of comments a page must be between 5 and 50 included.'] = "Le nombre de commentaires d'utilisateurs par page doit être compris entre 5 et 50.";
$lang['Configuration'] = "Configuration";
$lang['confirm'] = "Confirmer";
@@ -229,7 +229,6 @@ $lang['Prepared time for list of users to send mail is limited. Others users are
$lang['Time to send mail is limited. Others mails are skipped.'] = "Le temps d'envoi des mails est limité. Les autres envois de mail ont été ignorés.";
$lang['To send ?'] = "A envoyer ?";
$lang['Last send'] = "Dernier envoi";
-$lang['email'] = "Email";
$lang['User'] = "Utilisateur";
$lang['See you soon,'] = "A bientôt,";
$lang['Go to'] = "Rendez-vous sur";
@@ -519,7 +518,7 @@ $lang['Optimizations have been completed with some errors.'] = "Les optimisation
$lang['Modify information'] = "Modifier les informations";
$lang['nothing'] = "Rien";
$lang['overrides existing values with empty ones'] = "Ecraser les données existantes avec des données vides";
-$lang['Manage photo ranks'] = 'Gérer l\'ordre des photos';
+$lang['Manage photo ranks'] = 'Ordre des photos';
$lang['Edit ranks'] = "Modifier l'ordre (le rang)";
$lang['No photo in this album'] = 'Aucune photo dans cet album';
$lang['Images manual order was saved'] = "L'ordre manuel des images a été sauvegardé";
@@ -806,6 +805,7 @@ $lang['Synchronize metadata'] = "Synchroniser les méta-données";
$lang['Add to caddie'] = 'Ajouter au panier';
$lang['Zoom'] = 'Zoom';
$lang['Resize after upload'] = 'Redimensionner après transfert';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'Redimensionnement après transfert désactivé car GD est la librairie graphique utilisée actuellement';
$lang['Original Size'] = 'Taille originale';
$lang['Send connection settings by email'] = 'Envoyer les identifiants par email';
$lang['Activate comments'] = 'Activer les commentaires';
@@ -950,4 +950,30 @@ $lang['This group will be unset to default'] = "Ce groupe ne sera plus par défa
$lang['No members to manage'] = "Aucun membre à gérer";
$lang['Rename'] = 'Renommer';
$lang['Purge user cache'] = 'Purger le cache utilisateur';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'La tailles des images sera réduite à %dx%d pixels.';
+$lang['Mail theme'] = 'Thème des mails';
+$lang['Select at least one tag'] = 'Sélectionnez au moins un tag';
+$lang['Basic settings'] = 'Paramètres de base';
+$lang['Loading...'] = 'Chargement...';
+$lang['Show %s users'] = 'Afficher %s utilisateurs';
+$lang['No matching user found'] = 'Aucun utilisateur à afficher';
+$lang['Showing %s to %s of %s users'] = 'Affichage des utilisateurs %s à %s sur %s';
+$lang['(filtered from %s total users)'] = '(filtré de %s utilisateurs au total)';
+$lang['No user selected, no action possible.'] = 'Aucun utilisateur sélectionné, aucune action possible.';
+$lang['%d of %d users selected'] = '%d des %d utilisateurs sélectionnés';
+$lang['No user selected of %d users'] = 'Aucun utilisateur sélectionné sur les %d';
+$lang['All %d users are selected'] = 'Tous les %d utilisateurs sont sélectionnés';
+$lang['on the %d selected users'] = 'sur les %d utilisateurs sélectionnés';
+$lang['User %s added'] = 'Utilisateur %s ajouté';
+$lang['Registered on %s, %s.'] = 'Enregistré depuis le %s, %s.';
+$lang['Last visit on %s, %s.'] = 'Dernière visite le %s, %s.';
+$lang['Change password'] = 'Changer le mot de passe';
+$lang['Password updated'] = 'Mot de passe mis à jour';
+$lang['Change username'] = 'Changer le nom d\'utilisateur';
+$lang['Update user'] = 'Mettre à jour l\'utilisateur';
+$lang['User %s updated'] = 'Utilisateur %s mis à jour';
+$lang['Users modified'] = 'Utilisateurs modifiés';
+$lang['Open user details'] = 'Ouvrir les détails de l\'utilisateur';
+$lang['Close user details'] = 'Fermer les détails de l\'utilisateur';
+$lang['close'] = 'fermer';
?> \ No newline at end of file
diff --git a/language/fr_FR/common.lang.php b/language/fr_FR/common.lang.php
index b605a3759..2430aea19 100644
--- a/language/fr_FR/common.lang.php
+++ b/language/fr_FR/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Français [FR]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=421
Author: Piwigo team
Author URI: http://piwigo.org
@@ -173,8 +173,10 @@ $lang['Filesize'] = 'Poids';
$lang['Filter and display'] = 'Filtrer et afficher';
$lang['Filter'] = 'Filtre';
$lang['First'] = 'Première';
+$lang['First Page'] = 'Première page';
$lang['Forgot your password?'] = 'Mot de passe oublié ?';
$lang['from %s to %s'] = 'du %s au %s';
+$lang['Go back to the album'] = "Retourner à l'album";
$lang['Go through the gallery as a visitor'] = 'Parcourir la galerie en tant que visiteur';
$lang['group by letters'] = 'regrouper par lettres';
$lang['guest'] = 'visiteur';
@@ -191,7 +193,6 @@ $lang['in %d sub-album'] = 'dans %d sous-album';
$lang['in %d sub-albums'] = 'dans %d sous-albums';
$lang['in this album'] = 'dans cet album';
$lang['included'] = 'inclus';
-$lang['Interface theme'] = 'Thème de l\'interface';
$lang['Invalid key'] = 'Clef invalide';
$lang['Invalid password!'] = 'Mot de passe invalide !';
$lang['Invalid username or email'] = 'Nom d\'utilisateur ou adresse email invalide';
@@ -202,6 +203,7 @@ $lang['Kind of date'] = 'Type de date';
$lang['Language'] = 'Langue';
$lang['last %d days'] = '%d derniers jours';
$lang['Last'] = 'Dernière';
+$lang['Last Page'] = "Dernière page";
$lang['letters'] = 'lettres';
$lang['Links'] = 'Liens';
$lang['login mustn\'t end with a space character'] = 'le nom d\'utilisateur ne doit pas se terminer par un espace';
@@ -238,7 +240,7 @@ $lang['obligatory'] = 'obligatoire';
$lang['Original dimensions'] = 'Dimensions d\'origine';
$lang['Page generated in'] = 'Page fabriquée en';
$lang['Password forgotten'] = 'Mot de passe oublié';
-$lang['Password reset is not allowed for this user'] = 'Le renouvellement du mot de passe n\'est pas permise pour cet utilisateur';
+$lang['Password reset is not allowed for this user'] = 'Le renouvellement du mot de passe n\'est pas permis pour cet utilisateur';
$lang['Password Reset'] = 'Renouvellement de votre mot de passe';
$lang['password updated'] = 'mot de passe mis à jour';
$lang['Password'] = 'Mot de passe';
@@ -250,7 +252,6 @@ $lang['Photos posted within the last %d day.'] = 'N\'afficher que les photos ré
$lang['Photos posted within the last %d days.'] = 'N\'afficher que les photos récentes de moins de %d jours.';
$lang['Piwigo Help'] = 'Aide de Piwigo';
$lang['Play of slideshow'] = 'Lecture du diaporama';
-$lang['please enter your password again'] = 'Merci d\'entrer à nouveau votre mot de passe';
$lang['Please enter your username or email address.'] = 'Merci d\'entrer votre nom d\'utilisateur ou votre adresse email.';
$lang['Please, enter a login'] = 'S\'il vous plaît, entrez un nom d\'utilisateur';
$lang['Post date'] = 'Date d\'ajout';
@@ -406,10 +407,15 @@ $lang['Forbidden'] = 'Interdit';
$lang['Piwigo encountered a non recoverable error'] = 'Piwigo a rencontré une erreur non récupérable';
$lang['Requested album does not exist'] = 'L\'album demandé n\'existe pas';
$lang['Permalink for album not found'] = 'Permalink pour l\'album non trouvé';
-$lang['Requested tag does not exist'] = 'Le tag demandée n\'existe pas';
+$lang['Requested tag does not exist'] = 'Le tag demandé n\'existe pas';
$lang['Username is mandatory'] = 'Nom d\'utilisateur obligatoire';
$lang['Email address is mandatory'] = 'Adresse email obligatoire';
$lang['mandatory'] = 'obligatoire';
$lang['Website'] = 'Site web';
$lang['Your website URL is invalid'] = 'L\'adresse de votre site web est invalide';
+$lang['Email'] = "Email";
+$lang['Password is missing. Please enter the password.'] = "Le mot de passe manque. Veuillez saisir le mot de passe.";
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = "La confirmation du mot de passe manque. Veuillez confirmer le mot de passe choisi.";
+$lang['%d photos per page'] = '%d photos par page';
+$lang['Theme'] = 'Thème';
?> \ No newline at end of file
diff --git a/language/fr_FR/help/index.php b/language/fr_FR/help/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/fr_FR/help/index.php
+++ b/language/fr_FR/help/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/fr_FR/index.php b/language/fr_FR/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/fr_FR/index.php
+++ b/language/fr_FR/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/fr_FR/install.lang.php b/language/fr_FR/install.lang.php
index ad93861ac..8143cf8d9 100644
--- a/language/fr_FR/install.lang.php
+++ b/language/fr_FR/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,38 +21,31 @@
// | USA. |
// +-----------------------------------------------------------------------+
-
-
$lang['Installation'] = "Installation";
$lang['Basic configuration'] = "Configuration de base";
$lang['Default gallery language'] = "Langue par défaut de la galerie";
$lang['Database configuration'] = "Configuration de la base de données";
$lang['Admin configuration'] = "Configuration du compte administrateur";
$lang['Start Install'] = "Démarrer l'installation";
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = "L'adresse mail doit être de la forme xxx@yyy.eee (exemple : jack@altern.org)";
-$lang['Webmaster login'] = "Identifiant de l'administrateur";
$lang['It will be shown to the visitors. It is necessary for website administration'] = "Cet identifiant apparaîtra à tous vos visiteurs. Il vous sert pour administrer le site";
$lang['Connection to server succeed, but it was impossible to connect to database'] = "La connexion au serveur est OK, mais la connection à cette base de données est impossible";
$lang['Can\'t connect to server'] = "Impossible de se connecter au serveur";
$lang['Host'] = "Hôte";
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = "localhost ou autre, donné par votre hébergeur";
+$lang['localhost or other, supplied by your host provider'] = "localhost ou autre, communiqué par votre hébergeur";
$lang['User'] = "Utilisateur";
$lang['user login given by your host provider'] = "nom d'utilisateur communiqué par votre hébergeur";
-$lang['Password'] = "Mot de passe";
$lang['user password given by your host provider'] = "mot de passe utilisateur communiqué par votre hébergeur";
$lang['Database name'] = "Nom de la base de données";
$lang['also given by your host provider'] = "également fourni par votre hébergeur";
$lang['Database table prefix'] = "Préfixe des noms de tables";
$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = "le nom des tables sera précédé de ce préfixe (permet de mieux gérer sa base de données)";
-$lang['enter a login for webmaster'] = "veuillez rentrer un pseudo pour le webmaster";
+$lang['enter a login for webmaster'] = "veuillez rentrer un nom d'utilisateur pour le webmaster";
$lang['webmaster login can\'t contain characters \' or "'] = 'le pseudo du webmestre ne doit pas comporter les caractères " et \'';
$lang['please enter your password again'] = "veuillez resaisir votre mot de passe";
-$lang['Webmaster password'] = 'Mot de passe du webmestre';
$lang['Keep it confidential, it enables you to access administration panel'] = "Il doit rester confidentiel, il permet d'accéder à l'écran d'administration.";
$lang['Password [confirm]'] = "Mot de passe [Confirmer]";
$lang['verification'] = "vérification";
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = "Besoin d'aide ? Posez votre question sur le <a href=\"%s\">forum de Piwigo</a>.";
-$lang['Webmaster mail address'] = "Adresse e-mail de l'administrateur";
$lang['Visitors will be able to contact site administrator with this mail'] = "Les visiteurs pourront contacter l'administrateur du site par ce mail";
$lang['PHP 5 is required'] = "PHP 5 est requis";
$lang['It appears your webhost is currently running PHP %s.'] = "Apparemment, la version PHP de votre hébergeur est PHP %s.";
@@ -64,7 +57,6 @@ $lang['Piwigo was not able to configure PHP 5.'] = "Piwigo n'a pas pu configurer
$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = "Il vous faut contacter le support de votre hébergeur pour savoir comment configurer vous-même PHP 5.";
$lang['Hope to see you back soon.'] = "En espérant vous revoir très prochainement.";
$lang['Congratulations, Piwigo installation is completed'] = 'Félicitations, l\'installation de Piwigo est terminée';
-
$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Une solution alternative est de copier le texte dans la zone ci-dessous et de le coller dans le fichier "local/config/database.inc.php" (Attention: database.inc.php ne doit contenir que ce qui se trouve dans la zone, pas de retour à la ligne, pas d\'espace)';
$lang['Creation of config file local/config/database.inc.php failed.'] = 'La création du fichier de configuration local/config/database.inc.php a échoué.';
$lang['Download the config file'] = 'Télécharger le fichier de configuration';
@@ -73,5 +65,4 @@ $lang['Just another Piwigo gallery'] = 'Une galerie Piwigo de plus';
$lang['Welcome to my photo gallery'] = 'Bienvenue sur ma galerie photo';
$lang['Welcome to your new installation of Piwigo!'] = 'Bienvenue sur votre nouvelle installation de Piwigo !';
$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'N\'hésitez pas à consulter nos forums si vous avez le moindre problème : %s';
-
?>
diff --git a/language/fr_FR/upgrade.lang.php b/language/fr_FR/upgrade.lang.php
index 2fabf1e6f..a99f79795 100644
--- a/language/fr_FR/upgrade.lang.php
+++ b/language/fr_FR/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/ga_IE/common.lang.php b/language/ga_IE/common.lang.php
new file mode 100644
index 000000000..f0bd62eb9
--- /dev/null
+++ b/language/ga_IE/common.lang.php
@@ -0,0 +1,83 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Gaeilge [IE]
+Version: 2.5.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=708
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Gaeilge';
+$lang_info['country'] = 'éire';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'ir';
+$lang_info['zero_plural'] = true;
+
+$lang['%d album updated'] = '%d albam suas chun dáta';
+$lang['%d albums updated'] = '%d albaim suas chun dáta';
+$lang['Hello'] = 'Dia Duit';
+$lang['month']['2'] = 'Feabhra';
+$lang['month']['3'] = 'Márta';
+$lang['month']['4'] = 'Aibreán';
+$lang['month']['5'] = 'Bealtaine';
+$lang['month']['6'] = 'Meitheamh';
+$lang['month']['7'] = 'Iúil';
+$lang['month']['8'] = 'Lúnasa';
+$lang['month']['9'] = 'Meán Fómhair';
+$lang['month']['10'] = 'Deireadh Fómhair';
+$lang['month']['11'] = 'Samhain';
+$lang['month']['12'] = 'Nollaig';
+$lang['month']['1'] = 'Eanáir';
+$lang['day']['0'] = 'Dé Domnaigh';
+$lang['day']['1'] = 'Dé Luan';
+$lang['day']['2'] = 'Dé Máirt';
+$lang['day']['3'] = 'Dé Céadaoin';
+$lang['day']['4'] = 'Déaordaoin';
+$lang['day']['5'] = 'De hAoine';
+$lang['day']['6'] = 'Dé Sathairn';
+$lang['Search'] = 'Cuardach';
+$lang['Hello %s,'] = 'Dia Duit a %s';
+$lang['Home'] = 'Leathaineach abhaile';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Dia Duit a %s, Níor aimsíodh ghrianraf ar bith';
+$lang['No'] = 'Nil';
+$lang['I want to add photos'] = 'Ba mhaith liom ....';
+$lang['Here are your connection settings'] = 'Seo duit conn sett...';
+$lang['First Page'] = 'Leathaineacht amhain';
+$lang['Email address'] = 'Seoladh Ríomhpoist';
+$lang['Email address is missing. Please specify an email address.'] = 'Chaill do Email, thug do email mais e do thoil e';
+$lang['Email'] = 'Ríomhpoist';
+$lang['Author: %s'] = 'Údar: %s';
+$lang['Author'] = 'Údar';
+$lang['Date'] = 'Data';
+$lang['Bad request'] = 'Ceist dana';
+$lang['Are you sure?'] = 'An bhfuil tu cinnte';
+$lang['Close this window'] = 'Dun bhfuinneog seo';
+$lang['All'] = 'Gach rud';
+$lang['Email: %s'] = 'Ríomhpoist: %s';
+$lang['square'] = 'Cearnóg';
+$lang['the beginning'] = 'an tús';
+$lang['small'] = 'B - beag';
+$lang['today'] = 'inniu';
+?> \ No newline at end of file
diff --git a/language/ga_IE/ga_IE.jpg b/language/ga_IE/ga_IE.jpg
new file mode 100644
index 000000000..6689b030e
--- /dev/null
+++ b/language/ga_IE/ga_IE.jpg
Binary files differ
diff --git a/language/ga_IE/iso.txt b/language/ga_IE/iso.txt
new file mode 100644
index 000000000..a53e0f158
--- /dev/null
+++ b/language/ga_IE/iso.txt
@@ -0,0 +1 @@
+Gaeilge [IE] \ No newline at end of file
diff --git a/language/gl_ES/admin.lang.php b/language/gl_ES/admin.lang.php
index 6868c19f1..fa1558b4f 100755
--- a/language/gl_ES/admin.lang.php
+++ b/language/gl_ES/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -274,7 +274,7 @@ $lang['Album photos associated to the following albums: %s'] = 'Ãlbum de fotos
$lang['Album updated successfully'] = 'O álbum actualizouse con éxito';
$lang['Albums authorized thanks to group associations'] = 'O álbum autorizouse grazas ás asociacións do grupo';
$lang['Albums automatically sorted'] = 'Os álbums ordenáronse automaticamente';
-$lang['All extensions are up to date.'] = 'Tódalas extensións están actualizados.';
+$lang['All extensions are up to date.'] = 'Tódolos engadidos están actualizad0s.';
$lang['All languages are up to date.'] = 'Tódolos idiomas están actualizados.';
$lang['All optimizations have been successfully completed.'] = 'Tódalas optimizacións foron completadas con éxito.';
$lang['All plugins are up to date.'] = 'Tódolos engadidos están actualizados.';
@@ -362,7 +362,7 @@ $lang['Parameters'] = 'Parámetros';
$lang['Parent album'] = 'Ãlbum pai';
$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Falta a confirmación da clave. Confirma a clave escollida.';
$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = 'No teu Linux, simplemente instala Shotwell co teu xestor de paquetes e activa a opción de publicación en Piwigo.';
-$lang['Notify administrators when a comment is'] = 'Notificar ós administradores cando un comentario está';
+$lang['Notify administrators when a comment is'] = 'Notificar ós administradores cando un comentario sexa';
$lang['Number of albums per page'] = 'Número de álbums por páxina';
$lang['Number of comments per page'] = 'Número de comentarios por páxina';
$lang['Number of downloads'] = 'Número de descargas';
@@ -421,7 +421,6 @@ $lang['Merge selected groups'] = 'Combinar os grupos seleccionados';
$lang['Merge selected tags'] = 'Combinar as etiquetas seleccionadas';
$lang['Merge tags'] = 'Combinar etiquetas';
$lang['Metadata synchronization results'] = 'Resultados da sincronización dos metadatos';
-$lang['Main'] = 'Principal';
$lang['Main "guest" user does not exist'] = 'O usuario principal "invitado" non existe';
$lang['Main "guest" user status is incorrect'] = 'O usuario principal "invitado" ten un estado incorrecto';
$lang['Main "webmaster" user does not exist'] = 'O usuario principal "administrador web" non existe';
@@ -430,7 +429,7 @@ $lang['Main Page'] = 'Páxina principal';
$lang['Maintenance'] = 'Mantemento';
$lang['Make this language available to users'] = 'Facer este idioma dispoñible para os usuarios';
$lang['Make this theme available to users'] = 'Facer este tema dispoñible para os usuarios';
-$lang['Manage'] = 'Xestionar';
+$lang['Manage'] = 'Xestión';
$lang['Manage Permissions'] = 'Xestionar permisos';
$lang['Manage authorizations for selected albums'] = 'Xestionar permisos para os álbums seleccionados';
$lang['Manage permissions for group "%s"'] = 'Xestionar permisos para o grupo "%s"';
@@ -635,7 +634,6 @@ $lang['Rating by guests'] = 'Valoración por usuarios';
$lang['global mode'] = 'modo global';
$lang['for the file format'] = 'para o formato de ficheiro';
$lang['for this file format'] = 'para este formato de ficheiro';
-$lang['email'] = 'Correo electrónico';
$lang['errors during synchronization'] = 'erros durante a sincronización';
$lang['even already synchronized photos'] = 'mesmas fotos xa sincronizadas';
$lang['existing album'] = 'álbum existente';
@@ -675,7 +673,7 @@ $lang['all'] = 'todos';
$lang['an error happened'] = 'produciuse un erro';
$lang['and'] = 'e';
$lang['any visitor can see this album'] = 'calquera visitante pode ver este álbum';
-$lang['added'] = 'engadida';
+$lang['added'] = 'engadido';
$lang['administrators'] = 'administradores';
$lang['[NBM] Problems or questions'] = '[NBM] Problemas ou cuestións';
$lang['Your configuration settings are saved'] = 'As opcións de configuración foron gardadas';
@@ -860,7 +858,7 @@ $lang['Shotwell is an open source digital photo organizer that runs on Linux. It
$lang['Show info'] = 'Amosar información';
$lang['Show menubar'] = 'Amosar a barra de menú';
$lang['Simulation'] = 'Simulación';
-$lang['Site manager'] = 'Xestor do sitio';
+$lang['Site manager'] = 'Xestión de sitios';
$lang['Some themes and plugins may be not available yet.'] = 'Algúns temas e engadidos poden non estar dispoñibles aínda.';
$lang['Environment'] = 'Ambiente';
$lang['visitors need to login and have the appropriate permissions to see this album'] = 'os visitantes precisan identificarse e ter os permisos apropiados para ver este álbum';
@@ -943,4 +941,32 @@ $lang['height must be a number superior to'] = 'a altura debe ser un número mai
$lang['hide details'] = 'agochar detalles';
$lang['high'] = 'alto';
$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto é o xestor de fotos predeterminado de MacOSX. O engadido de exportación Piwigo crea novos ábums e exporta túas fotos directamente de iPhoto á túa galería de fotos Piwigo.';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'As dimensións da imaxe reduciranse a %dx%d pixeis.';
+$lang['(filtered from %s total users)'] = '(filtrado dun total de %s usuarios)';
+$lang['All %d users are selected'] = 'Seleccionados %d usuarios (todos)';
+$lang['No matching user found'] = 'Non se atopou ningún usuario que coincida';
+$lang['No user selected of %d users'] = 'Non está seleccinado nugún dos %d usuarios';
+$lang['Showing %s to %s of %s users'] = 'Amosando de %s a %s de %s usuarios';
+$lang['No user selected, no action possible.'] = 'Sen usuario seleccionado non hai acción posible.';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'Mudar tamaño despois de enviar está desactivado debido ó uso da biblioteca gráfica GD.';
+$lang['Show %s users'] = 'Amosar %s usuarios';
+$lang['Last visit on %s, %s.'] = 'Última visita o %s, %s.';
+$lang['Registered on %s, %s.'] = 'Rexistrado o %s, %s.';
+$lang['User %s added'] = 'Engadiuse o usuario %s';
+$lang['User %s updated'] = 'Actualizouse o usuario %s';
+$lang['Users modified'] = 'Usuarios modificados';
+$lang['on the %d selected users'] = 'dos %d usuarios seleccionados';
+$lang['%d of %d users selected'] = '%d de %d usuarios seleccionados';
+$lang['Basic settings'] = 'Opcións básicas';
+$lang['Change password'] = 'Cambiar contrasinal';
+$lang['Change username'] = 'Cambiar nome de usuario';
+$lang['General'] = 'Xeral';
+$lang['Loading...'] = 'Cargando...';
+$lang['Mail theme'] = 'Tema do correo';
+$lang['Password updated'] = 'Contrasinal actualizado';
+$lang['Select at least one tag'] = 'Selecciona polo menos unha etiqueta';
+$lang['Update user'] = 'Actualizar usuario';
+$lang['Close user details'] = 'Pechar detalles de usuario';
+$lang['Open user details'] = 'Abrir detalles de usuario';
+$lang['close'] = 'pechar';
?> \ No newline at end of file
diff --git a/language/gl_ES/common.lang.php b/language/gl_ES/common.lang.php
index 98e00328d..13de6e8ff 100644
--- a/language/gl_ES/common.lang.php
+++ b/language/gl_ES/common.lang.php
@@ -1,8 +1,8 @@
<?php
// +-----------------------------------------------------------------------+
-// | Piwigo - a PHP based picture gallery |
+// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2010 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Galego [ES]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=681
Author: Piwigo team
Author URI: http://piwigo.org
@@ -248,7 +248,6 @@ $lang['Manual sort order'] = 'Orde manual';
$lang['Menu'] = 'Menú';
$lang['Mobile'] = 'dispositivos móbiles';
$lang['Most visited'] = 'Máis visitadas';
-$lang['Interface theme'] = 'Tema da interface';
$lang['Invalid key'] = 'Chave non válida';
$lang['Invalid password!'] = 'Clave non válida!';
$lang['Invalid username or email'] = 'O nome de usuario ou correo non é valido ';
@@ -344,7 +343,6 @@ $lang['obligatory'] = 'obrigatorio';
$lang['password updated'] = 'clave actualizada';
$lang['photo'] = 'foto';
$lang['photos posted during the last %d days'] = 'fotos enviadas durante os últimos %d días';
-$lang['please enter your password again'] = 'insire túa clave novamente';
$lang['posted after %s (%s)'] = 'enviada despois de %s (%s)';
$lang['posted before %s (%s)'] = 'enviada antes de %s (%s)';
$lang['posted between %s (%s) and %s (%s)'] = 'enviada entre %s (%s) e %s (%s)';
@@ -411,4 +409,12 @@ $lang['Week %d'] = 'Semana %d';
$lang['Welcome'] = 'Benvido';
$lang['Welcome to your Piwigo photo gallery!'] = 'Benvido a túa galería de fotos Piwigo!';
$lang['Yes'] = 'Si';
+$lang['Password is missing. Please enter the password.'] = 'Falta a clave. Insire unha clave.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Falta a confirmación da clave. Confirma a clave escollida.';
+$lang['%d photos per page'] = '%d fotos por páxina';
+$lang['Email'] = 'Correo electrónico';
+$lang['First Page'] = 'Primeira páxina';
+$lang['Go back to the album'] = 'Volver ó álbum';
+$lang['Last Page'] = 'Última páxina ';
+$lang['Theme'] = 'Tema';
?> \ No newline at end of file
diff --git a/language/gl_ES/help/configuration.html b/language/gl_ES/help/configuration.html
new file mode 100755
index 000000000..886832d11
--- /dev/null
+++ b/language/gl_ES/help/configuration.html
@@ -0,0 +1,96 @@
+<h2>Configuración</h2>
+
+<p>Esta pantalla permite ó administrador realizar unha configuración básica da galería. De feito, só se amosan as opcións básicas da configuración as cales deben ser suficientes para a gran maioría dos administradores. Se queres ver os outros numerosos (e avanzados) parámetros de configuración, lee o ficheiro de configuración predeterminado <span class="filename">include/config_default.inc.php</span>.</p>
+
+<p>Este pantalla está dividida en diferentes seccións, agrupando os parámetros de configuración por tema.</p>
+
+
+<h3>Principal</h3>
+<ul>
+ <li><strong>Título da galería</strong>: usado no alimentador RSS e por notificacións de correo electrónico.</li>
+
+ <li><strong>Cartel da páxina</strong>: amosado na parte de arriba de cada unha das páxinas públicas.</li>
+
+ <li><strong>URL da galería</strong>: usado para as semente RSS.</li>
+
+ <li><strong>Bloqueo da galería</strong>: bloquea a galería por completo para o mantemento. Só poderán acceder á galería para o mantemento os usuarios administradores.</li>
+
+ <li><strong>Valoración</strong>: activase a funcionalidade de valoración.</li>
+
+ <li><strong>Valoración por invitados</strong>: os usuarios aínda non rexistrados poden valorar as imaxes.</li>
+
+ <li><strong>Permitir o rexistro ós usuarios</strong>: calquera pode rexistrarse.</li>
+
+ <li><strong>Enderezo de correo obrigatorio para tódolos usuarios</strong>: o enderezo de correo electrónico será comprobado no rexistro ou actualización do perfil, exceptuase cando a acción é realizada por un administrador.</li>
+
+ <li><strong>Notificar mediante correo ós administradores cando se rexistra un novo usuario</strong>: notificarase ós administradores cada vez que produza un rexistro.</li>
+
+ <li><strong>Orde predeterminado das fotos</strong>: podes establecer unha orde predeterminada cos menús despregables.</li>
+
+</ul>
+
+<h3>Histórico</h3>
+
+ <p>Visitas nas páxinas <span
+ class="pwgScreen">category.php</span> e <span
+ class="pwgScreen">picture.php</span> hase gardar na táboa <code>history</code>.</p>
+
+ <p>Amosaranse as visitas en <span class="pwgScreen">Administration &raquo; Tools &raquo; History</span>.</p>
+
+<ul>
+ <li><strong>Gardar as páxinas visitadas polos invitados</strong>: lembraranse as páxinas visitadas polos usuarios sen identificar.</li>
+
+ <li><strong>Gardar as páxinas visitadas polos usuarios</strong>: lembraranse as páxinas visitadas polos usuarios rexistrados.</li>
+
+ <li><strong>Gardar páxinas visitadas polos administradores</strong>: lembraranse as páxinas visitadas polos administradores.</li>
+
+</ul>
+
+<h3>Comentarios</h3>
+<ul>
+
+ <li><strong>Comentarios para todos</strong>: mesmo os invitados poden enviar comentarios.</li>
+
+ <li><strong>Número de comentarios por páxina</strong>.</li>
+
+ <li><strong>Validación</strong>: un administrador debe validar os comentarios dos usuarios antes de que poidan ser visibles no sitio. A validación dos comentarios dos usuarios faise na pantalla <span class="pwgScreen">Administración &raquo; Ferramentas &raquo; Comentarios pendentes</span>.</li>
+
+ <li><strong>Correo electrónico ós administradores cando se insire un comentario válido</strong>: envía un correo electrónico ós administradores cando un usuario insire un comentario e este comentario é validado.</li>
+
+ <li><strong>Correo electrónico ós administradores cando un comentario require de validación</strong>: envía un correo electrónico ós administradores cando un usuario insire un comentario que require a validación dun administrador.
+A validación dos comentarios dos usuarios faise na pantalla <span class="pwgScreen">Administración &raquo; Ferramentas &raquo; Comentarios pendentes</span>.</li>
+
+</ul>
+
+<h3>Vista predeterminada</h3>
+
+<p>Aquí podes mudar as opcións da vista usada polos invitados, usuario predeterminado que non se conectou. Unha vez que se conecte, estas opcións serán substituídas polas propias opcións do usuario (modificable no <span class="pwgScreen">perfil</span>).</p>
+
+<p>É posible mudar as opcións da vista para todos os usuarios existentes na pantalla <span class="pwgScreen">Administración &raquo;
+Usuarios &raquo; Xestión </span> onde podes seleccionar unha lista de usuarios.</p>
+
+<ul>
+
+ <li><strong>Idioma</strong>: só se aplica as etiquetas de Piwigo. Non se localizan os nomes dos álbums nin os campos das descricións.</li>
+
+ <li><strong>Número de fotos por liña</strong></li>
+
+ <li><strong>Número de fotos por páxina</strong></li>
+
+ <li><strong>Tema da interface</strong></li>
+
+ <li><strong>Período recente</strong>: En dias. Período durante o cal unha foto é amosada como nova. Debe ser superior a un día.</li>
+
+ <li><strong>Expande tódolos álbums</strong>: de xeito predeterminado expande tódolos álbums no menú <em>Aviso</em>: esta opción pode consumir os recursos de xeito intensivo e xerar un enorme menú se a árbore ten moitos álbums.</li>
+
+ <li><strong>Amosar o número de comentarios</strong>: amosa o número de comentarios de cada foto na páxina de miniaturas. Isto produce un uso intensivo de recursos.</li>
+
+ <li><strong>Amosar a conta de accesos</strong>: amosa o número de veces que se ollou unha foto como miniatura na páxina de miniaturas. Só cando o parámetro de configuración avanzada é: <br>
+ $conf['show_nb_hits'] = true; <br>
+ Nota: por defecto é false.</li>
+
+ <li><strong>Largura máxima das fotos</strong>: máxima largura a amosar. As fotos con máis largura que o establecido serán redimensionadas na pantalla. Mellor que escoller esta opción, podes considerar a modificación da largura das fotos, o que sería unha mellor práctica.</li>
+
+ <li><strong>Altura máxima das fotos</strong>: o mesmo que para a configuración da largura máxima.</li>
+
+</ul>
diff --git a/language/gl_ES/help/extend_for_templates.html b/language/gl_ES/help/extend_for_templates.html
new file mode 100755
index 000000000..3c310b92a
--- /dev/null
+++ b/language/gl_ES/help/extend_for_templates.html
@@ -0,0 +1,51 @@
+<h2>Configuración para estender o modelo</h2>
+
+<h3>Sobre</h3>
+<p>A galería Piwigo pódese personalizar substituíndo os ficheiros do modelo con versións personalizadas. Por exemplo, a cabeceira predeterminada do modelo(header.tpl) pódese substituír por un modelo de cabeceira personalizado (my-header.tpl). Despois de enviar os cambios á base de datos a galería amosará a cabedeira personalizada no canto da orixinal.<br>
+As extensións dos modelos son un xeito poderoso de crear temas personalizados tanto para usuarios noveis como os avanzados. Empregado xunto co editor de ficheiros locais podes crear teus propios temas fillo.</p>
+
+<h3>Modeloo orixinal</h3>
+<p>O modelo contén un número de ficheiros modelo que compoñen as páxinas da galería. Estes son os modelos orixinais.</p>
+
+<h3>Palabra clave de URL opcional</h3>
+<p>Estas son palabras atopadas no URL da galería despois do módulo nome. Esta poden ser ligazóns permanentes activas (Ver a documentación das ligazóns permanentes para máis información). <a href="#warnings">Aviso:</a> se o mesmo modelo orixinal e mesma palabra clave son empregados en máis dun modelo personalizado, só estará activo o último.</p>
+
+<h3>Tema ligado</h3>
+<p>O tema ligado é o tema a partir do cal os ficheiros de modelo están sendo substituídos.</p>
+
+<h3Onde están os modelos orixinais?</h3>
+<p>Os modelos orixinais son os ficheiros de modelo fornecidos con cada tema. Estes están gardados en <em>/themes/default/template</em> (ou <em>themes/<theme name>/template</em>). Estes ficheiros de modelo non deberían ser modificados xa que as alteracións perderánse cando se actualice o tema.<br>
+A compatibilidade de modelos orixinais inclúe:</p>
+<ul>
+ <li><span class="filename">index.tpl</span></li>
+ <li><span class="filename">mainpage_categories.tpl</span> e <span class="filename">thumbnails.tpl</span></li>
+ <li><span class="filename">menubar.tpl</span></li>
+ <li><span class="filename">header.tpl</span> e <span class="filename">footer.tpl</span></li>
+ <li><span class="filename">picture_content.tpl</span> e <span class="filename">picture.tpl</span></li>
+ <!-- <li><span class="filename">slideshow.tpl</span></li> -->
+ <li><span class="filename">profile.tpl</span> e <span class="filename">profile_content.tpl</span></li>
+ <li><span class="filename">tags.tpl</span></li>
+ <li><span class="filename">upload.tpl</span></li>
+ <li><span class="filename">about.tpl</span></li>
+ <li><span class="filename">popuphelp.tpl</span></li>
+ <li><span class="filename">search.tpl</span> e <span class="filename">search_rules.tpl</span></li>
+ <li><span class="filename">nbm.tpl</span> e <span class="filename">notification.tpl</span></li>
+ <li><span class="filename">identification.tpl</span> e <span class="filename">register.tpl</span></li>
+ <li><span class="filename">redirect.tpl</span></li>
+</ul>
+<h3>Activando modelos personalizados</h3>
+<p>Os modelos personalizados deben gardarse no cartafol ou subcartafoles en template-extension. Por exemplo, <em>/template-extension/my-default/header.tpl</em> (ou <em>/template-extension/<my-theme-name>/header.tpl</em>) os ficheiros de modelo poden ter ter calquera nome con unha extenxión .tpl. Os ficheiros de modelo nos subcartafoles aparecen na pantalla de configuración do tema como temas dispoñibles.</p>
+<h3>Activando modelos personalizados</h3>
+<p>Seleccionar o modelo orixinal a ssubtituír. Opcionalmente escollese unha palabra clave de URL para asegurarse que só se amosa o tema personalizado nas páxinas coa palabra clave. Escoller un tema ligado e os cambios serán efectivos sobre ese tema. Enviar os cambios á base de datos.</p>
+<h3>Desactivando modelos personalizados</h3>
+<p>Desmarcar o modelo orixinal e enviar os cambios á base de dartos.<br>
+Borrar os ficheiros do tema personalizado do cartafol template-extension.</p>
+
+<a name="warnings"></a>
+<h3>Avisos</h3>
+<ul>
+ <li><strong>O modelo orixinal</strong> debe ser o orixinal de non selo pode ter resultados impredecibles.</li>
+ <li>Se o mesmo modelo orixinal e a mesma palabra clave de URL é usada en máis dun modelo personalizado, só último será o activo.</li>
+ <li>As mostras de ficheiros de modelo son distribuidas co único propósito de server para probas. Non modificarlos. Crea teus própios modelos ou copia modelos de tema existentes dentro de <em>/template-extension/<my-theme>/</em></li>
+ <li>Cando se borra o modelo personalizado, é reactivado inmediatamente o ficheiro do modelo orixinal.</li>
+</ul> \ No newline at end of file
diff --git a/language/gl_ES/install.lang.php b/language/gl_ES/install.lang.php
index bcd158f5d..1179cadc0 100755
--- a/language/gl_ES/install.lang.php
+++ b/language/gl_ES/install.lang.php
@@ -1,29 +1,28 @@
<?php
-// +-----------------------------------------------------------------------+
-// | Piwigo - a PHP based photo gallery |
-// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
-// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
-// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
-// +-----------------------------------------------------------------------+
-// | 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 |
-// | |
-// | This program is distributed in the hope that it will be useful, but |
-// | WITHOUT ANY WARRANTY; without even the implied warranty of |
-// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
-// | General Public License for more details. |
-// | |
-// | You should have received a copy of the GNU General Public License |
-// | along with this program; if not, write to the Free Software |
-// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
-// | USA. |
// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'os nomes das táboas da base de datos irán prefixadas con el (permite unha mellor xestión das táboas)';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
$lang['enter a login for webmaster'] = 'insire o nome de usuario do administrador web';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'o enderezo de correo debe ter o formato xxx@yyy.eee (exemplo: proxecto@trasno.net';
$lang['please enter your password again'] = 'insire a túa clave outra vez';
$lang['user login given by your host provider'] = 'nome de usuario fornecido polo teu provedor do aloxamento';
$lang['user password given by your host provider'] = 'clave de usuario fornecida polo teu provedor do aloxamento';
@@ -38,14 +37,10 @@ $lang['Start Install'] = 'Comezar a instalación';
$lang['Try to configure PHP 5'] = 'Tratar de configurar PHP 5';
$lang['User'] = 'Usuario';
$lang['Visitors will be able to contact site administrator with this mail'] = 'Os visitantes poderán empregar este correo electrónico para contactar co administrador do sitio';
-$lang['Webmaster login'] = 'Usuario do administrador web';
-$lang['Webmaster mail address'] = 'Correo electrónico do administrador web';
-$lang['Webmaster password'] = 'Clave do administrador web';
$lang['Welcome to my photo gallery'] = 'Benvido a miña galería de fotos';
$lang['Welcome to your new installation of Piwigo!'] = 'Benvido a túa nova instalación de piwigo!';
$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Podes descargar o ficheiro de configuración e subilo a local/config na túa instalación.';
$lang['PHP 5 is required'] = 'É preciso PHP 5';
-$lang['Password'] = 'Clave';
$lang['Password ']['confirm'] = 'Clave [confirmar]';
$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Fíxate que podes mudar ti mesmo a túa configuración e reiniciar o Piwigo despois.';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Precisas axuda? Pregunta as túas dúbidas no <a href="%s">panel de mensaxes Piwigo</a>. ';
@@ -69,4 +64,5 @@ $lang['Hope to see you back soon.'] = 'Esperamos verte de volta en breve.';
$lang['Host'] = 'Servidor';
$lang['Installation'] = 'Instalación';
$lang['Admin configuration'] = 'Configuración da adminstración';
+$lang['localhost or other, supplied by your host provider'] = 'aloxamento local ou outro, fornecido polo seu aloxador';
?> \ No newline at end of file
diff --git a/language/gl_ES/upgrade.lang.php b/language/gl_ES/upgrade.lang.php
index 04107f2de..5e5903131 100755
--- a/language/gl_ES/upgrade.lang.php
+++ b/language/gl_ES/upgrade.lang.php
@@ -1,24 +1,24 @@
<?php
-// +-----------------------------------------------------------------------+
-// | Piwigo - a PHP based photo gallery |
-// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
-// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
-// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
-// +-----------------------------------------------------------------------+
-// | 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 |
-// | |
-// | This program is distributed in the hope that it will be useful, but |
-// | WITHOUT ANY WARRANTY; without even the implied warranty of |
-// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
-// | General Public License for more details. |
-// | |
-// | You should have received a copy of the GNU General Public License |
-// | along with this program; if not, write to the Free Software |
-// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
-// | USA. |
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
// +-----------------------------------------------------------------------+
$lang['You do not have access rights to run upgrade'] = 'Non tes dereitos de acceso para actualizar';
$lang['Upgrade informations'] = 'Actualizar información';
@@ -36,5 +36,5 @@ $lang['Only administrator can run upgrade: please sign in below.'] = 'Só o admi
$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'En <i>%s</i>, antes de <b>?></b>, insira:';
$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'Por precaución, os seguintes engadidos foron desactivados. Tes que comprobar se teñen actualización antes de reactivalos:';
$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Por precaución, os seguintes temas foron desactivados. Tes que comprobar se teñen actualización antes de reactivalos:';
-$lang['All sub-albums of private albums become private'] = 'Todos os sub-álbums de álbums privados tórnanse privados';
+$lang['All sub-albums of private albums become private'] = 'Tódolos sub-álbums de álbums privados tórnanse privados';
?> \ No newline at end of file
diff --git a/language/he_IL/admin.lang.php b/language/he_IL/admin.lang.php
index e93a06431..48f7cffb4 100644
--- a/language/he_IL/admin.lang.php
+++ b/language/he_IL/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -223,7 +223,7 @@ $lang['Prepared time for list of users to send mail is limited. Others users are
$lang['Time to send mail is limited. Others mails are skipped.'] = 'הזמן כדי לשלוח דו×ר ×לקטרוני מוגבל ××—×¨×™× ×›×‘×¨ דילג..';
$lang['To send ?'] = 'כדי לשלוח?';
$lang['Last send'] = 'ל×חרונה שלחה';
-$lang['email'] = 'דו×ר ×לקטרוני';
+$lang['Email'] = 'דו×ר ×לקטרוני';
$lang['User'] = 'משתמש';
$lang['See you soon,'] = 'נתר××” בקרוב';
$lang['Go to'] = 'עבור';
@@ -917,4 +917,12 @@ $lang['Minimum height'] = 'גובה מינימלי';
$lang['Minimum width'] = 'רוחב מינימלי';
$lang['Number of albums per page'] = 'מספר ××œ×‘×•×ž×™× ×‘×¢×ž×•×“';
$lang['Opacity'] = '×טימות';
+$lang['Rename'] = 'שנה ש×';
+$lang['Duplicate'] = 'כפילות';
+$lang['Manage the members'] = 'נהל ×ת החברי×';
+$lang['Merge selected groups'] = 'מזג ×ת הקבוצות שנבחרו';
+$lang['No group selected, no action possible.'] = '××£ קבוצה ×œ× × ×‘×—×¨×”,××£ שינוי ×œ× ×‘×•×¦×¢.';
+$lang['No members to manage'] = '×ין ×—×‘×¨×™× ×œ× ×”×œ';
+$lang['Notify administrators when a comment is'] = 'עדכן ×ž× ×”×œ×™× ×›×שר נכתבת תגובה';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo ×œ× ×™×›×•×œ×” ×œ×”×•×¦×™× ×ת קבצי העדכון מהשרת';
?> \ No newline at end of file
diff --git a/language/he_IL/common.lang.php b/language/he_IL/common.lang.php
index ed2843b1b..a4572c71a 100644
--- a/language/he_IL/common.lang.php
+++ b/language/he_IL/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: עברית [IL]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=457
Author: Piwigo team
Author URI: http://piwigo.org
@@ -245,7 +245,6 @@ $lang['login mustn\'t end with a space character'] = "×©× ×ž×©×ª×ž×© ×œ× ×™×›×
$lang['login mustn\'t start with a space character'] = "×©× ×ž×©×ª×ž×© ×œ× ×™×›×•×œ להתחיל ×¢× ×¨×•×•×—";
$lang['this login is already used'] = "×”×©× ×ž×©×ª×ž×© ×”×–×” ×§×™×™× ×›×‘×¨";
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = "דו×ר ×לקטרוני חייב להיות כמו adir@biton.com (לדוגמה : adir@gmail.com)";
-$lang['please enter your password again'] = "הכנס בבקשה ×ת הסיסמה שוב";
$lang['Auto login'] = "התחברות ×וטומטית";
$lang['remove this tag from the list'] = "מחק ×ת התווית ×”×–×ת מהרשימה";
$lang['representative'] = "נבחר";
@@ -273,7 +272,6 @@ $lang['SQL queries in'] = "ש×ילתות SQL";
$lang['display only recently posted photos'] = "הר××” רק תמונות שפורסמו ל×חרונה";
$lang['return to the display of all photos'] = "חזור להצגת כל התמונות";
$lang['the beginning'] = "ההתחלה";
-$lang['Interface theme'] = "ממשק הערכה";
$lang['Thumbnails'] = "תמונות ממוזערות";
$lang['Menu'] = "תפריט";
$lang['A comment on your site'] = "תגובה ב×תר שלך";
@@ -417,4 +415,6 @@ $lang['Email address is mandatory'] = 'שדה דו×ר ×לקטרוני חובה
$lang['Username is mandatory'] = 'שדה ×©× ×ž×©×ª×ž×© חובה';
$lang['Website'] = '×תר';
$lang['mandatory'] = 'הכרחי';
+$lang['Password is missing. Please enter the password.'] = 'סיסמה חסרה, נה להזין סיסמה..';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = '×ישור סיסמה חסר, × ×” להזיר ×ישור סיסמה..';
?> \ No newline at end of file
diff --git a/language/he_IL/install.lang.php b/language/he_IL/install.lang.php
index e8c55ab2c..a6cddda22 100644
--- a/language/he_IL/install.lang.php
+++ b/language/he_IL/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,24 +21,18 @@
// | USA. |
// +-----------------------------------------------------------------------+
-
-
$lang['Installation'] = "התקנה";
$lang['Basic configuration'] = "הגדרות בסיסיות";
$lang['Default gallery language'] = "שפת גלריה ברירת מחדל";
$lang['Database configuration'] = "הגדרות בסיס נתוני×";
$lang['Admin configuration'] = "הגדרות מנהל";
$lang['Start Install'] = "התחל התקנה";
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = "כתובת דו×ר ×לקטרוני xxx@yyy.eee (example : jack@altern.com)";
-$lang['Webmaster login'] = "התחברות מנהל ×”×תר";
$lang['It will be shown to the visitors. It is necessary for website administration'] = "יוצג בפני המבקרי×. נחוץ בשביל מנהל ×”×תר";
$lang['Connection to server succeed, but it was impossible to connect to database'] = "התחבר לשרת בהצלחה, ×ך ×œ× ×”×¦×œ×™×— להתחבר לבסיס נתוני×";
$lang['Can\'t connect to server'] = "×œ× ×ž×¦×œ×™×— להתחבר לשרת";
$lang['Host'] = "שרת מ×רח";
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = "localhost, sql.multimania.com, toto.freesurf.fr";
$lang['User'] = "משתמש";
$lang['user login given by your host provider'] = "המשתמש שניתן לך על ידי השרת המ×רח שלך";
-$lang['Password'] = "סיסמה";
$lang['user password given by your host provider'] = "הסיסמה שניתנה לך על ידיד השרת המ×רח שלך";
$lang['Database name'] = "×©× ×‘×¡×™×¡ הנתוני×";
$lang['also given by your host provider'] = "×’× × ×™×ª×Ÿ על ידי השרת המ×רח שלך";
@@ -47,12 +41,10 @@ $lang['database tables names will be prefixed with it (enables you to manage bet
$lang['enter a login for webmaster'] = "הזן פרטי התחברות עבור מהל ×”×תר";
$lang['webmaster login can\'t contain characters \' or "'] = "משתמש מנהל ×”×תר ×œ× ×™×›×•×œ להחיל ×ת ×”×ª×•×•×™× \' ×ו מרח×ות";
$lang['please enter your password again'] = "הכנס בבקשה ×ת הסיסמה שוב";
-$lang['Webmaster password'] = "ססמת מנהל ×”×תר";
$lang['Keep it confidential, it enables you to access administration panel'] = "שמור ×–×ת בסוד, ×–×” מ×פשר לך להיכנס לפ×נל ניהול ×”×תר";
$lang['Password [confirm]'] = "סיסמה [×ושרה]";
$lang['verification'] = "×ימות";
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = "צריך עזרה? היעזר ב <a href=\"%s\">×”×¤×•×¨×•× ×©×œ Piwigo</a>.";
-$lang['Webmaster mail address'] = "דו×ר ×לקטרוני של מנהל ×”×תר";
$lang['Visitors will be able to contact site administrator with this mail'] = "××•×¨×—×™× ×™×•×›×œ×• להשתמש בדו×ר ×”×לקטרוני ×”×–×” כדי ליצור קשר ×¢× ×ž× ×”×œ ×”×תר";
$lang['PHP 5 is required'] = "נדרש גירסת PHP 5";
$lang['It appears your webhost is currently running PHP %s.'] = "שרת המ×רח שלך רץ על גירסת PHP %s.";
diff --git a/language/he_IL/upgrade.lang.php b/language/he_IL/upgrade.lang.php
index fedd97977..d1777b9e6 100644
--- a/language/he_IL/upgrade.lang.php
+++ b/language/he_IL/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -31,4 +31,11 @@ $lang['Upgrade informations'] = "מידע לשידרוג";
$lang['User permissions and group permissions have been erased'] = 'הרש×ות ×ž×©×ª×ž×©×™× ×•×§×‘×•×¦×•×ª נמחקו';
$lang['Only administrator can run upgrade: please sign in below.'] = 'רק מנהל יכול להריץ שדרוג : בבקשה התחבר למטה';
$lang['You do not have access rights to run upgrade'] = '×ין לך גישה להפעיל שדרוג';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'דף ×–×” מציע לשדרג ×ת מסד ×”× ×ª×•× ×™× ×ž×’×¨×¡×ª Piwigo הישנה לגרסה החדשה. עוזר השדרוג חושב ש×תה מפעיל כרגע <strong>שחרור %s</strong>.';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'רק תמונות ממוזערות, ודו×ר ×לקטרוני של מנהל ×”×תר נשמרו מהגירסה הקודמת';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'בצע בדיקת תחזוקה ב[ ניהול> כלי×> תחזוקה] ×× × ×ª×§×œ×ª בעיה כלשהי.';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = '×›×מצעי זהירות הערכות הב×ות בוטלו, בדוק ×¢×“×›×•× × ×œ×¤× ×™ ×”×¤×¢×œ×ª× ×”×ž×—×•×“×©×ª:';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'בתוך <i>%s</i>, לפני <b>?></b>, הכנס:';
+$lang['All sub-albums of private albums become private'] = 'כל ×לבומי משנה של ××œ×‘×•×ž×™× ×¤×¨×˜×™×™× ×™×”×¤×›×• לפרטי×';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = '×”×ª×•×¡×¤×™× ×”×‘××™× ×‘×•×˜×œ×• ×›×מצעי זהירות, בדוק ×פשרות ×œ×¢×“×›×•× × ×˜×¨× ×”×¤×¢×œ×ª× ×”×ž×—×•×“×©×ª:';
?> \ No newline at end of file
diff --git a/language/hr_HR/admin.lang.php b/language/hr_HR/admin.lang.php
index 38cf9d581..951982f14 100644
--- a/language/hr_HR/admin.lang.php
+++ b/language/hr_HR/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2009 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -224,7 +224,7 @@ $lang['Prepared time for list of users to send mail is limited. Others users are
$lang['Time to send mail is limited. Others mails are skipped.'] = 'Vrijeme za slanje poruke je ograniÄeno. Ostale poruke su preskoÄene.';
$lang['To send ?'] = 'Poslati ?';
$lang['Last send'] = 'Zadnje poslano';
-$lang['email'] = 'e-mail';
+$lang['Email'] = 'e-mail';
$lang['User'] = 'Korisnik';
$lang['See you soon,'] = 'Vidimo se uskoro,';
$lang['Go to'] = 'Idi na ';
diff --git a/language/hr_HR/common.lang.php b/language/hr_HR/common.lang.php
index 9baad1f46..e010aa69c 100644
--- a/language/hr_HR/common.lang.php
+++ b/language/hr_HR/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2009 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Hrvatski [HR]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=422
Author: Piwigo team
Author URI: http://piwigo.org
@@ -248,7 +248,6 @@ $lang['login mustn\'t end with a space character'] = 'prijava ne smije završava
$lang['login mustn\'t start with a space character'] = 'prijava ne smije poÄinjati razmakom';
$lang['this login is already used'] = 'ovo korisniÄko ime se već koristi';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'e-mail adresa mora biti oblika xxx@yyy.eee (npr : pasko@stranica.org)';
-$lang['please enter your password again'] = 'molimo unesite zaporku ponovo';
$lang['Auto login'] = 'Samoprijava';
$lang['remove this tag from the list'] = 'ukloni ovaj tag iz popisa';
$lang['representative'] = 'predstavnik';
@@ -276,7 +275,6 @@ $lang['SQL queries in'] = 'SQL upita u ';
$lang['display only recently posted photos'] = 'prikaz samo nedavno objavljenih slika';
$lang['return to the display of all photos'] = 'povratak u prikaz svih slika';
$lang['the beginning'] = 'poÄetak';
-$lang['Interface theme'] = 'tema suÄelja';
$lang['Thumbnails'] = 'Povezne sliÄice';
$lang['Menu'] = 'Izbornik';
$lang['A comment on your site'] = 'Komentar na vašem web mjestu';
@@ -417,4 +415,6 @@ $lang['Username is mandatory'] = 'KorisniÄko ime je obavezno';
$lang['Website'] = 'Web sjedište';
$lang['Your website URL is invalid'] = 'URL vašeg web sjedišta nije valjan';
$lang['mandatory'] = 'obavezno';
+$lang['Password is missing. Please enter the password.'] = 'Nedostaje zaporka. Molimo unesite zaporku.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Nedostaje potvrda zaporke. Molimo potvrdite odabranu zaporku.';
?> \ No newline at end of file
diff --git a/language/hr_HR/help/index.php b/language/hr_HR/help/index.php
index 10b477c03..c8de97f60 100644
--- a/language/hr_HR/help/index.php
+++ b/language/hr_HR/help/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2009 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/hr_HR/index.php b/language/hr_HR/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/hr_HR/index.php
+++ b/language/hr_HR/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/hr_HR/install.lang.php b/language/hr_HR/install.lang.php
index 8bc2a4f37..e9f9436f6 100644
--- a/language/hr_HR/install.lang.php
+++ b/language/hr_HR/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2009 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -27,16 +27,12 @@ $lang['Default gallery language'] = 'Pretpostavljeni jezik galerije';
$lang['Database configuration'] = 'Postava baze podataka';
$lang['Admin configuration'] = 'Upravna postava';
$lang['Start Install'] = 'Pokreni ugradbu';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'e-mail adresa mora biti kao xxx@yyy.eee (example : jere@stranica.org)';
-$lang['Webmaster login'] = 'Webmaster-ova prijava';
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Biti će prikazano posjetiteljima. Potrebno je za upravljanje web mjestom';
$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Povezivanje sa poslužiteljem uspješno, ali je nemoguće povezivanje sa bazom podataka';
$lang['Can\'t connect to server'] = 'Ne mogu se povezati sa poslužiteljem';
$lang['Host'] = 'MySQL poslužitelj';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
$lang['User'] = 'Korisnik';
$lang['user login given by your host provider'] = 'korisniÄko ime dobiveno od davatelja usluge smjeÅ¡taja';
-$lang['Password'] = 'Zaporka';
$lang['user password given by your host provider'] = 'korisniÄka zaporka dobivena od davatelja usluge smjeÅ¡taja';
$lang['Database name'] = 'Naziv baze podataka';
$lang['also given by your host provider'] = 'također dobivena od davatelja usluge smještaja';
@@ -45,12 +41,10 @@ $lang['database tables names will be prefixed with it (enables you to manage bet
$lang['enter a login for webmaster'] = 'upiÅ¡ite korisniÄko ime za webmaster-a';
$lang['webmaster login can\'t contain characters \' or "'] = 'webmaster-ovo korisniÄko ime ne može sadržavati znakove \' ili "';
$lang['please enter your password again'] = 'molimo upišite zaporku ponovo';
-$lang['Webmaster password'] = 'Webmaster-ova zaporka';
$lang['Keep it confidential, it enables you to access administration panel'] = 'ÄŒuvajte je na sigurnom mjestu, ona omogućava pristup upravnoj ploÄi';
$lang['Password [confirm]'] = 'Zaporka [potvrdi]';
$lang['verification'] = 'ovjera';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Trebate pomoć? Pitajte na <a href="%s">Piwigo message board</a>.';
-$lang['Webmaster mail address'] = 'Webmaster-ova e-mail adresa';
$lang['Visitors will be able to contact site administrator with this mail'] = 'Posjetitelji će moći pisati upravitelju galerije preko ove adrese';
$lang['PHP 5 is required'] = 'PHP 5 je obvezan';
$lang['It appears your webhost is currently running PHP %s.'] = 'ÄŒini se da vaÅ¡e web mjesto trenutno koristi PHP inaÄicu %s.';
@@ -68,7 +62,6 @@ $lang['Download the config file'] = 'Preuzmi zapis podešavanja';
$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Možete preuzeti zapis sustavnog podešavanja i prebaciti ga u local/config mapu vaše ugradnje.';
$lang['Just another Piwigo gallery'] = 'Samo još jedna Piwigo galerija';
$lang['Welcome to my photo gallery'] = 'Dobrodošli u moju fotogaleriju';
-
$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Ukoliko trebate pomoć slobodno pitajte na forumu: %s';
$lang['Welcome to your new installation of Piwigo!'] = 'Dobrodošli na vašu novu Piwigo instalaciju!';
?> \ No newline at end of file
diff --git a/language/hr_HR/upgrade.lang.php b/language/hr_HR/upgrade.lang.php
index 030c83ddd..0f25b865a 100644
--- a/language/hr_HR/upgrade.lang.php
+++ b/language/hr_HR/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2009 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/hu_HU/admin.lang.php b/language/hu_HU/admin.lang.php
index 5fbf377ab..e87f8ec72 100644
--- a/language/hu_HU/admin.lang.php
+++ b/language/hu_HU/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -187,7 +187,6 @@ $lang['Access type'] = 'Hozzáférés típusa';
$lang['Information data registered in database'] = 'Az információk bekerültek az adatbázisba';
$lang['Default display'] = 'Alapértelmezett megjelenítés';
$lang['The gallery URL is not valid.'] = 'A galéria URL nem létezik.';
-$lang['Main'] = 'Ãltalános';
$lang['The number of comments a page must be between 5 and 50 included.'] = 'A felhasználói hozzászólások száma egy oldalon 5 és 50 között.';
$lang['Configuration'] = 'Beállítások';
$lang['confirm'] = 'Megerősítés';
@@ -222,7 +221,6 @@ $lang['Prepared time for list of users to send mail is limited. Others users are
$lang['Time to send mail is limited. Others mails are skipped.'] = 'Az e-mail küldési idő korlátozott. További e-mail küldés megszakításra kerül.';
$lang['To send ?'] = 'Elküldjük?';
$lang['Last send'] = 'Utolsó küldése';
-$lang['email'] = 'E-mail';
$lang['User'] = 'Felhasználó';
$lang['See you soon,'] = 'Viszont látásra,';
$lang['Go to'] = 'Ugrás ';
@@ -928,8 +926,6 @@ $lang['Duplicate selected tags'] = 'Kiválasztott címkék kettőzése';
$lang['Name of the duplicate'] = 'A kettőzött címke neve';
$lang['Source tag'] = 'Forrás címke';
$lang['Tag "%s" is now a duplicate of "%s"'] = '"%s" címke kettőzve "%s" néven';
-$lang['Format'] = 'Formátum';
-$lang['Invalid dimension'] = 'Érvénytelen méret';
$lang['Landscape'] = 'Tájkép';
$lang['Minimum height'] = 'Legkisebb magasság';
$lang['Minimum width'] = 'Legkisebb szélesség';
@@ -938,8 +934,6 @@ $lang['Portrait'] = 'Portré';
$lang['Manage photos'] = 'Képek kezelése';
$lang['View in gallery'] = 'Megtekintés a galériában';
$lang['Number of albums per page'] = 'Albumok száma oldalanként';
-$lang['Maximum'] = 'Maximum';
-$lang['Minimum'] = 'Minimum';
$lang['Ratio'] = 'Arány';
$lang['between %.2f and %.2f'] = '%.2f és %.2f között';
$lang['between %d and %d pixels'] = '%d és %d pixel között';
@@ -954,4 +948,24 @@ $lang['This group will be set to default'] = 'Ez a csoport lesz az alapértelmez
$lang['This group will be unset to default'] = 'Ez a csoport nem lesz az alapértelmezett';
$lang['Type here the name of the new group'] = 'Ide írja be az új csoport nevét';
$lang['Purge user cache'] = 'Felhasználói gyorsítótár ürítése';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'A kép mérete csökken %dx%d pixel-re.';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'A feltöltés utáni átméretezés kikapcsolva, oka: a GD, mint grafikuskönyvtár használata';
+$lang['Select at least one tag'] = 'Válassz ki legalább egy cimkét';
+$lang['Basic settings'] = 'Alapbeállítások';
+$lang['General'] = 'Ãltalános';
+$lang['Mail theme'] = 'Levelező-sablon';
+$lang['Show %s users'] = '%s felhasználó megjelenítése';
+$lang['All %d users are selected'] = 'Összes, %d felhasználó kiválasztva
+
+';
+$lang['Change password'] = 'Jelszó módosítása';
+$lang['Change username'] = 'Felhasználónév módosítása';
+$lang['Loading...'] = 'Töltés...';
+$lang['No matching user found'] = 'Felhasználó nem található';
+$lang['No user selected, no action possible.'] = 'Választott felhasználó nem található, művelet nem lehetséges';
+$lang['Password updated'] = 'Jelszó frissítve';
+$lang['Update user'] = 'Felhasználó frissítése';
+$lang['User %s added'] = '%s felhasználó hozzáadva';
+$lang['User %s updated'] = '%s felhasználó frissítve';
+$lang['Users modified'] = 'Felhasználók módosítva';
?> \ No newline at end of file
diff --git a/language/hu_HU/common.lang.php b/language/hu_HU/common.lang.php
index c3be03c6c..5eb4d716e 100644
--- a/language/hu_HU/common.lang.php
+++ b/language/hu_HU/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Magyar [HU]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=423
Author: Piwigo team
Author URI: http://piwigo.org
@@ -246,7 +246,6 @@ $lang['login mustn\'t end with a space character'] = 'A felhasználói név nem
$lang['login mustn\'t start with a space character'] = 'A felhasználói név nem kezdődhet SPACE karakterrel';
$lang['this login is already used'] = 'Ilyen felhasználónk már van!';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'E-mail formátuma: xxx@yyy.eee (pl.: kedvenc@nyuszi.hu)';
-$lang['please enter your password again'] = 'Kérem, adja meg újra jelszavát';
$lang['Auto login'] = 'Jegyezz meg';
$lang['remove this tag from the list'] = 'Ezt a címkét távolítsa el a listáról';
$lang['representative'] = 'képviselő';
@@ -274,7 +273,6 @@ $lang['SQL queries in'] = 'adatbázis-lekérdezés';
$lang['display only recently posted photos'] = 'Csak nemrégiben küldött képek';
$lang['return to the display of all photos'] = 'Vissza (összes kép megjelenítése)';
$lang['the beginning'] = 'Kezdet';
-$lang['Interface theme'] = 'Megjelenítés témája';
$lang['Thumbnails'] = 'Bélyegképek';
$lang['Menu'] = 'Menü';
$lang['A comment on your site'] = 'Komment az oldalon';
@@ -417,4 +415,12 @@ $lang['Username is mandatory'] = 'Felhasználónév szükséges';
$lang['mandatory'] = 'szükséges';
$lang['Website'] = 'Weboldal';
$lang['Your website URL is invalid'] = 'A weboldal URL érvénytelen';
+$lang['Email'] = 'E-mail';
+$lang['First Page'] = 'Első oldal';
+$lang['Go back to the album'] = 'Vissza az albumhoz';
+$lang['Last Page'] = 'Utolsó oldal';
+$lang['Password is missing. Please enter the password.'] = 'Jelszó hiányzik. Kérem írja be a jelszót.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Jelszó megerősítése hiányzik. Kérem erősítse meg a választott jelszót.';
+$lang['%d photos per page'] = '%d kép/oldal';
+$lang['Theme'] = 'Téma';
?> \ No newline at end of file
diff --git a/language/hu_HU/help/index.php b/language/hu_HU/help/index.php
index 10b477c03..c8de97f60 100644
--- a/language/hu_HU/help/index.php
+++ b/language/hu_HU/help/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2009 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/hu_HU/index.php b/language/hu_HU/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/hu_HU/index.php
+++ b/language/hu_HU/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/hu_HU/install.lang.php b/language/hu_HU/install.lang.php
index a3488ff51..c1535568c 100644
--- a/language/hu_HU/install.lang.php
+++ b/language/hu_HU/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,24 +21,18 @@
// | USA. |
// +-----------------------------------------------------------------------+
-
-
$lang['Installation'] = 'Telepítés';
$lang['Basic configuration'] = 'Alap konfiguráció';
$lang['Default gallery language'] = 'Galéria alapértelmezett nyelve';
$lang['Database configuration'] = 'Adatbázis konfiguráció';
$lang['Admin configuration'] = 'Rendszergazda fiókjának beállítása';
$lang['Start Install'] = 'Telepítés indítása';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'E-mail formátuma: xxx@yyy.eee (pl.: kedvenc@nyuszi.hu)';
-$lang['Webmaster login'] = 'Webmester';
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'A látogatók látni fogják. Szükséges a weboldal adminisztrációjához';
$lang['Connection to server succeed, but it was impossible to connect to database'] = 'A kapcsolat a kiszolgálóval rendben, de nem sikerült csatlakozni az adatbázishoz';
$lang['Can\'t connect to server'] = 'Nem sikerült kapcsolódni a szerverhez';
$lang['Host'] = 'MySQL host';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql, stb.';
$lang['User'] = 'Felhasználó név';
$lang['user login given by your host provider'] = 'a tárhelyszolgáltató által adott felhasználónév';
-$lang['Password'] = 'Jelszó';
$lang['user password given by your host provider'] = 'a tárhelyen használt jelszó';
$lang['Database name'] = 'Adatbázis neve';
$lang['also given by your host provider'] = 'a szolgáltatótól kapott adatbázis név';
@@ -47,12 +41,10 @@ $lang['database tables names will be prefixed with it (enables you to manage bet
$lang['enter a login for webmaster'] = 'írja be a webmester bejelentkezési adatokat';
$lang['webmaster login can\'t contain characters \' or "'] = 'A webmester nevében nem használhatók a \' és " karakterek';
$lang['please enter your password again'] = 'kérjük, adja meg újra a jelszót';
-$lang['Webmaster password'] = 'Webmester jelszó';
$lang['Keep it confidential, it enables you to access administration panel'] = 'Kezelje bizalmasan az adatokat, ezek lehetővé teszik a hozzáférést az adminisztrációs felülethez';
$lang['Password [confirm]'] = 'Jelszó [megerősítés]';
$lang['verification'] = 'jelszó egyezőségének ellenőrzése';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Segítségre van szüksége ? Kérdéseit itt teheti fel: <a href="%s">Piwigo üzenőfal</a>.';
-$lang['Webmaster mail address'] = 'Webmester e-mail cím';
$lang['Visitors will be able to contact site administrator with this mail'] = 'A látogatók ezen az e-mail címen tudják felvenni a kapcsolatot az adminisztrátorral';
$lang['PHP 5 is required'] = 'PHP 5 szükséges';
$lang['It appears your webhost is currently running PHP %s.'] = 'Úgy tűnik, a tárhelyszolgáltatójánál jelenleg futó PHP %s.';
@@ -72,4 +64,5 @@ $lang['Just another Piwigo gallery'] = 'Csak egy újabb Piwigo galéria';
$lang['Welcome to my photo gallery'] = 'Üdvözöljük a képgalériában';
$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Kérdése van? Keresse fel fórumunkat: %s';
$lang['Welcome to your new installation of Piwigo!'] = 'Köszönt a frissen telepített Piwigo galéria!';
+$lang['localhost or other, supplied by your host provider'] = 'localhost vagy egyéb, a fogadó szolgáltató által megadott';
?> \ No newline at end of file
diff --git a/language/hu_HU/upgrade.lang.php b/language/hu_HU/upgrade.lang.php
index 36a26dddc..b2dfd4585 100644
--- a/language/hu_HU/upgrade.lang.php
+++ b/language/hu_HU/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/id_ID/common.lang.php b/language/id_ID/common.lang.php
new file mode 100644
index 000000000..ffe3eb68f
--- /dev/null
+++ b/language/id_ID/common.lang.php
@@ -0,0 +1,419 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Bahasa Indonesia [ID]
+Version: 2.6.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=707
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Bahasa Indonesia';
+$lang_info['country'] = 'Indonesia';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'id';
+$lang_info['zero_plural'] = true;
+
+$lang['%d comments'] = '%d komentar';
+$lang['%d hit'] = '%d pengunjung';
+$lang['%d hits'] = '%d pengunjung';
+$lang['%d Kb'] = '%d Kb';
+$lang['%d new comment'] = '%d komentar baru';
+$lang['%d new comments'] = '%d komentar baru';
+$lang['%d new photo'] = '%d foto baru';
+$lang['%d new photos'] = '%d foto baru';
+$lang['%d new user'] = '%d pengguna baru';
+$lang['%d new users'] = '%d pengguna baru';
+$lang['Date'] = 'Tanggal';
+$lang['day'][0] = 'Minggu';
+$lang['day'][1] = 'Senin';
+$lang['day'][2] = 'Selasa';
+$lang['day'][3] = 'Rabu';
+$lang['day'][4] = 'Kamis';
+$lang['day'][5] = 'Jumat';
+$lang['day'][6] = 'Sabtu';
+$lang['month'][10] = 'Oktober';
+$lang['month'][11] = 'November';
+$lang['month'][12] = 'Desember';
+$lang['month'][1] = 'Januari';
+$lang['month'][2] = 'Februari';
+$lang['month'][3] = 'Maret';
+$lang['month'][4] = 'April';
+$lang['month'][5] = 'Mei';
+$lang['month'][6] = 'Juni';
+$lang['month'][7] = 'Juli';
+$lang['month'][8] = 'Agustus';
+$lang['month'][9] = 'September';
+
+
+$lang['xlarge'] = 'XL - ekstra besar';
+$lang['xsmall'] = 'XS - ekstra kecil';
+$lang['xxlarge'] = 'XXL - besar sekali';
+$lang['Thumbnails'] = 'Tampilan besar';
+$lang['representative'] = 'tampilan besar album';
+$lang['return to normal view mode'] = 'kembali ke mode tampilan normal';
+$lang['return to the display of all photos'] = 'kembali ke tampilan semua foto';
+$lang['search'] = 'mencari';
+$lang['searched words : %s'] = 'kata-kata yang dicari: %s';
+$lang['set as album representative'] = 'setel album ini sebagai tampilan besar';
+$lang['show tag cloud'] = 'tunjukkan awan kata kunci';
+$lang['slideshow'] = 'gulir foto';
+$lang['small'] = 'S - Kecil';
+$lang['square'] = 'Kotak';
+$lang['stop the slideshow'] = 'hentikan pengguliran foto';
+$lang['the beginning'] = 'awal';
+$lang['the username must be given'] = 'nama pengguna diperlukan';
+$lang['this email address is already in use'] = 'alamat email ini telah digunakan';
+$lang['this login is already used'] = 'nama pengguna ini telah digunakan';
+$lang['thumb'] = 'Tampilan besar';
+$lang['today'] = 'hari ini';
+$lang['useful when password forgotten'] = 'berguna jika kata sandi terlupakan';
+$lang['wrong date'] = 'tanggal salah';
+$lang['large'] = 'L - Besar';
+$lang['last %d days'] = 'terakhir %d hari';
+$lang['letters'] = 'huruf';
+$lang['login mustn\'t end with a space character'] = 'nama pengguna tidak boleh berakhir dengan spasi';
+$lang['login mustn\'t start with a space character'] = 'nama pengguna tidak boleh diawali dengan spasi';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'alamat email haruslah seperti ini : namakamu@alamatemailkamu.com';
+$lang['mandatory'] = 'diperlukan';
+$lang['medium'] = 'M - Menengah';
+$lang['no rate'] = 'tidak diperingkat';
+$lang['obligatory'] = 'diperlukan';
+$lang['password updated'] = 'kata sandi diperbaharui';
+$lang['photo'] = 'foto';
+$lang['photos posted during the last %d days'] = 'foto dipublikasikan dalam %d hari terakhir';
+$lang['posted after %s (%s)'] = 'dipublikasikan setelah %s (%s)';
+$lang['posted before %s (%s)'] = 'dipublikasikan sebelum %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'dipublikasikan diantara %s (%s) dan %s (%s)';
+$lang['posted on %s'] = 'dipublikasikan pada %s';
+$lang['remove this tag from the list'] = 'buang kata kunci ini dari daftar';
+$lang['Email address is mandatory'] = 'Memerlukan alamat email';
+$lang['Username is mandatory'] = 'Memerlukan nama pengguna';
+$lang['display most recent photos'] = 'tampilkan foto terbaru';
+$lang['display most visited photos'] = 'tampilkan foto paling dikunjungi';
+$lang['display only recently posted photos'] = 'tampilkan hanya foto yang diposting terbaru';
+$lang['display photos linked to this tag'] = 'tampilkan foto yang terlink pada kata kunci ini';
+$lang['display recently updated albums'] = 'tampilkan album terbaru';
+$lang['display this album'] = 'tampilkan album ini';
+$lang['display your favorites photos'] = 'tampilkan foto favorit anda';
+$lang['edit'] = 'ubah';
+$lang['excluded'] = 'tidak termasuk';
+$lang['from %s to %s'] = 'dari %s ke %s';
+$lang['group by letters'] = 'kelompokkan berdasarkan huruf';
+$lang['guest'] = 'tamu';
+$lang['html tags are not allowed in login'] = 'kata kunci html tidak diperbolehkan';
+$lang['in %d sub-album'] = 'dalam %d sub-album';
+$lang['in %d sub-albums'] = 'dalam %d sub-album';
+$lang['in this album'] = 'dalam album ini';
+$lang['included'] = 'termasuk';
+$lang['comment date'] = 'Tanggal komentar';
+$lang['created after %s (%s)'] = 'dibuat setelah %s (%s)';
+$lang['created before %s (%s)'] = 'dibuat sebelum %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'dibuat diantara %s (%s) dan %s (%s)';
+$lang['created on %s'] = 'dibuat pada %s';
+$lang['customize the appareance of the gallery'] = 'kostumisasi tampilan galeri';
+$lang['delete all photos from your favorites'] = 'hapus semua foto dari favorit';
+$lang['delete this photo from your favorites'] = 'hapus foto ini dari favorit';
+$lang['descending'] = 'meningkat';
+$lang['display a calendar by creation date'] = 'tampilkan kalender melalui tanggal pembuatan';
+$lang['display a calendar by posted date'] = 'tampilkan kalender melalui tanggal publikasi';
+$lang['display a set of random photos'] = 'tampilkan susunan foto secara sembarangan';
+$lang['display all photos in all sub-albums'] = 'tampilkan semua foto di semua sub-album';
+$lang['display available tags'] = 'tampilkan kata kunci yang tersedia';
+$lang['display best rated photos'] = 'tampilkan foto dengan peringkat terbaik';
+$lang['display each day with photos, month per month'] = 'tampilkan tiap foto per hari, bulan per bulan ';
+$lang['display last user comments'] = 'tampilkan komentar pengguna terakhir';
+$lang['Username "%s" on gallery %s'] = 'Pengguna "%s" di galeri %s';
+$lang['Your Gallery Customization'] = 'Kostumisasi galeri anda';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Komentar anda BELUM didaftarkan karena tidak lolos dari peraturan validasi';
+$lang['Your comment has been registered'] = 'Komentar anda telah didaftarkan';
+$lang['Your favorites'] = 'Favorit anda';
+$lang['Your password has been reset'] = 'Kata sandi anda telah di setel ulang';
+$lang['Your username has been successfully changed to : %s'] = 'Nama pengguna anda telah berhasil diubah menjadi: %s';
+$lang['Your website URL is invalid'] = 'URL situs web anda tidak valid';
+$lang['add this photo to your favorites'] = 'tambahkan foto ini ke favorit anda';
+$lang['all'] = 'semua';
+$lang['ascending'] = 'susun';
+$lang['author(s) : %s'] = 'penulis: %s';
+$lang['available for administrators only'] = 'tersedia hanya untuk pengelola';
+$lang['chronology_monthly_calendar'] = 'Kalender bulanan';
+$lang['chronology_monthly_list'] = 'Daftar bulanan';
+$lang['chronology_weekly_list'] = 'Daftar mingguan';
+$lang['cloud'] = 'awan';
+$lang['Username modification'] = 'Modifikasi nama pengguna';
+$lang['Username or email'] = 'Nama pengguna atau email';
+$lang['Username: %s'] = 'Nama pengguna : %s';
+$lang['View'] = 'Lihat';
+$lang['View in'] = 'Lihat di';
+$lang['Visits'] = 'Kunjungi';
+$lang['Visits, high &rarr; low'] = 'Kunjungi, tinggi &rarr; rendah';
+$lang['Visits, low &rarr; high'] = 'Kunjungi, rendah &rarr; tinggi';
+$lang['Webmaster'] = 'Webmaster';
+$lang['Website'] = 'Situs web';
+$lang['Week %d'] = 'Pekan %s';
+$lang['Welcome'] = 'Selamat datang';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Selamat datang ke galeri foto Piwigo anda!';
+$lang['Yes'] = 'Ya';
+$lang['You are not authorized to access the requested page'] = 'Anda tidak diijinkan mengakses halama yang diminta';
+$lang['You will receive a link to create a new password via email.'] = 'Anda akan menerima sebuah link untuk membuat sebuah kata sandi baru melalui email. ';
+$lang['Tag results for'] = 'Hasil dari kata kunci';
+$lang['Tags'] = 'Kata kunci';
+$lang['Thank you for registering at %s!'] = 'Terima kasih telah mendaftar di %s!';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'Langganan RSS menyediakan pemberitahuan pada peristiwa terbaru dari situs web: dengan foto terbaru, album yang diperbaharui dan komentar baru. Digunakan bersama pembaca langganan RSS';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Galeri ini terkunci karena ada perbaikan, harap balik nanti.';
+$lang['The number of photos per page must be a not null scalar'] = 'Jumlah foto per halaman haruslah tidak boleh kurang dari nol';
+$lang['The passwords do not match'] = 'Kata sandi anda tidak cocok';
+$lang['This author modified following comment:'] = 'Penulis ini memodifikasi komentar berikut:';
+$lang['This author removed the comment with id %d'] = 'Penulis ini menghapus komentar dengan id %d';
+$lang['This login is already used by another user'] = 'Nama ini sudah digunakan oleh pengguna lain';
+$lang['To reset your password, visit the following address:'] = 'Untuk menyetel ulang kata sandi, harap kunjungi alamat berikut ini:';
+$lang['Unknown feed identifier'] = 'Pengenalan langganan yang tidak diketahui';
+$lang['Unknown identifier'] = 'Pengenalan tidak diketahui';
+$lang['Update your rating'] = 'Perbaharui rating anda';
+$lang['User "%s" has no email address, password reset is not possible'] = 'Pengguna "%s" tidak memiliki alamat email, pembaharuan kata sandi tidak memungkinkan';
+$lang['User comments'] = 'Komentar pengguna';
+$lang['User: %s'] = 'Pengguna: %s';
+$lang['Username'] = 'Nama pengguna';
+$lang['Search in sub-albums'] = 'Pencarian di sub-album';
+$lang['Search results'] = 'Hasil pencarian';
+$lang['Search rules'] = 'Kriteria pencarian';
+$lang['Search tags'] = 'Pencarian kata kunci';
+$lang['Send my connection settings by email'] = 'Kirim koneksi setelan melalui email';
+$lang['Sent by'] = 'Terkirim oleh';
+$lang['Show file metadata'] = 'Tunjukkan metadata dokumen';
+$lang['Show latest comments first'] = 'Tunjukkan komentar terbaru, paling awal';
+$lang['Show number of comments'] = 'Tunjukkan jumlah komentar';
+$lang['Show number of hits'] = 'Tunjukkan jumlah kunjungan';
+$lang['Show oldest comments first'] = 'Tunjukkan komentar lama, paling awal';
+$lang['Since'] = 'Sejak';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Seseorang sedang meminta kata sandi dari pengguna ini akan diubah :';
+$lang['Sort by'] = 'Penyusunan';
+$lang['Sort order'] = 'Disusun berdasarkan';
+$lang['Specials'] = 'Khusus';
+$lang['Submit'] = 'Kirim';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Berhasil terdaftar, sebentar lagi anda akan menerima konfirmasi dan pengaturan koneksi anda di email, Selamat Datang!';
+$lang['Tag'] = 'Kata kunci';
+$lang['Date created, new &rarr; old'] = 'Tanggal dibuat, baru &rarr; lama';
+$lang['Date created, old &rarr; new'] = 'Tanggal dibuat, lama &rarr; baru';
+$lang['Date posted, new &rarr; old'] = 'Tanggal dipublikasi, baru &rarr; lama';
+$lang['Date posted, old &rarr; new'] = 'Tanggal dipublikasi, lama &rarr; baru';
+$lang['File name, A &rarr; Z'] = 'Nama dokumen, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'Nama dokumen, Z &rarr; A';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Penomoran, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Penomoran, 9 &rarr; 1';
+$lang['Photo title, A &rarr; Z'] = 'Judul foto, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = 'Judul foto, Z &rarr; A';
+$lang['Rating score, high &rarr; low'] = 'Hasil peringkat, tinggi &rarr; rendah';
+$lang['Rating score, low &rarr; high'] = 'Hasil peringkat, rendah &rarr; tinggi';
+$lang['Search'] = 'Mencari';
+$lang['Search by date'] = 'Pencarian berdasar tanggal';
+$lang['Search for Author'] = 'Pencarian penulis';
+$lang['Search for all terms'] = 'Pencarian semuanya';
+$lang['Search for any term'] = 'Pencarian tertentu';
+$lang['Search for words'] = 'Pencarian kata-kata';
+$lang['Search in albums'] = 'Pencarian album';
+$lang['Reduce diaporama speed'] = 'Kurangi kecepatan gulir gambar';
+$lang['Requested tag does not exist'] = 'Permintaan kata kunci tidak tersedia';
+$lang['Reset'] = 'Setel ulang';
+$lang['Reset to default values'] = 'Setel ulang ke pengaturan standar';
+$lang['Retrieve password'] = 'Kembalikan kata sandi';
+$lang['Return to home page'] = 'Kembali ke halaman utama ';
+$lang['SQL queries in'] = 'Kueri SQL di';
+$lang['Register'] = 'Mendaftar';
+$lang['Registration'] = 'Pendaftaran';
+$lang['Registration of %s'] = 'Pendaftaran dari %s';
+$lang['Related tags'] = 'Kata kunci yang berkaitan';
+$lang['Repeat the slideshow'] = 'Ulangi gulir gambar';
+$lang['Requested album does not exist'] = 'Permintaan album belum ada';
+$lang['Rate this photo'] = 'Peringkatkan foto ini';
+$lang['Rating score'] = 'Skor peringkat';
+$lang['Recent albums'] = 'Album terakhir';
+$lang['Recent period'] = 'Periode terakhir';
+$lang['Recent period must be a positive integer value'] = 'Periode terakhir haruslah miliki nilai tambahan';
+$lang['Recent photos'] = 'Gambar terakhir';
+$lang['Redirection...'] = 'Mengarahkan...';
+$lang['Manage this user comment: %s'] = 'Atur komentar pengguna ini: %s';
+$lang['Permalink for album not found'] = 'Link permanen untuk album belum ditemukan';
+$lang['Photos only RSS feed'] = 'Berlangganan RSS khusus untuk foto';
+$lang['Photos posted within the last %d day.'] = 'Foto dipublikasikan hanya dalam akhir %d hari';
+$lang['Photos posted within the last %d days.'] = 'Foto dipublikasikan hanya dalam akhir %d hari';
+$lang['Quick search'] = 'Pencarian cepat';
+$lang['RSS feed'] = 'Langganan RSS';
+$lang['Random photos'] = 'Gambar sembarangan';
+$lang['Rank'] = 'Peringkat';
+$lang['Preferences'] = 'Preferensi';
+$lang['Previous'] = 'Sebelumnya';
+$lang['Profile'] = 'Profil';
+$lang['Quick connect'] = 'Penyambungan cepat';
+$lang['Please, enter a login'] = 'Mohon, pergi ke halaman masuk';
+$lang['Post date'] = 'Tanggal publikasi';
+$lang['Posted on'] = 'Dipulikasikan pada';
+$lang['Powered by'] = 'Didukung oleh';
+$lang['Piwigo Help'] = 'Bantuan Piwigo';
+$lang['Piwigo encountered a non recoverable error'] = 'Piwigo mengalami kesalahan yang belum dipulihkan';
+$lang['Play of slideshow'] = 'Mainkan gulir gambar';
+$lang['Please enter your username or email address.'] = 'Mohon masukkan nama pengguna atau alamat email';
+$lang['IP: %s'] = 'IP: %s';
+$lang['New on %s'] = 'Baru di %s';
+$lang['Pause of slideshow'] = 'Rehat menggulir gambar';
+$lang['Photo sizes'] = 'Ukuran foto';
+$lang['Original dimensions'] = 'Dimensi asli';
+$lang['Page generated in'] = 'Halaman dibuat di';
+$lang['Page not found'] = 'Halaman tidak ditemukan';
+$lang['Password'] = 'Kata sandi';
+$lang['Password Reset'] = 'Setel ulang kata sandi';
+$lang['Password forgotten'] = 'Lupa kata sandi';
+$lang['Password reset is not allowed for this user'] = 'Penyetelan ulang kata sandi tidak diperbolehkan kepada pengguna ini';
+$lang['Password: %s'] = 'Kata sandi %s';
+$lang['New password'] = 'Kata sandi berikutnya';
+$lang['Next'] = 'Berikutnya';
+$lang['No'] = 'Tidak';
+$lang['Not repeat the slideshow'] = 'Jangan mengulangi gulir gambar ';
+$lang['Notification'] = 'Pemberitahuan';
+$lang['Number of items'] = 'Jumlah dari benda';
+$lang['Number of photos per page'] = 'Jumlah dari foto per halaman';
+$lang['Original'] = 'Asal';
+$lang['Language'] = 'Bahasa';
+$lang['Last'] = 'Terakhir';
+$lang['Last Page'] = 'Halaman terakhir';
+$lang['Links'] = 'Link';
+$lang['Login'] = 'Masuk';
+$lang['Logout'] = 'Keluar';
+$lang['Manual sort order'] = 'Pengaturan secara manual';
+$lang['Menu'] = 'Menu';
+$lang['Mobile'] = 'Ponsel';
+$lang['Most visited'] = 'Paling banyak dikunjungi';
+$lang['N/A'] = 'Tidak tersedia';
+$lang['Home'] = 'Beranda';
+$lang['I want to add photos'] = 'Saya ingin menambahkan sebuah foto';
+$lang['IPTC Metadata'] = 'IPTC Metadata';
+$lang['Identification'] = 'Identifikasi';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Jika ini adalah sebuah kesalahan, harap abaikan email ini dan tidak ada perubahan yang terjadi';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Jika anda menerima email ini akibat sebuah kesalahan, harap hubungi webmaster di %s';
+$lang['Invalid key'] = 'Kata kunci salah';
+$lang['Invalid password!'] = 'Kata sandi salah';
+$lang['Invalid username or email'] = 'Kata sandi atau email yang salah';
+$lang['Keyword'] = 'Huruf';
+$lang['Kind of date'] = 'Jenis tanggal';
+$lang['Filter'] = 'Saring';
+$lang['Filter and display'] = 'Saring dan tampilkan';
+$lang['First'] = 'Pertama';
+$lang['First Page'] = 'Halaman pertama';
+$lang['Forbidden'] = 'Terlarang';
+$lang['Forgot your password?'] = 'Lupa kata sandi anda?';
+$lang['Go back to the album'] = 'Kembali ke album';
+$lang['Go through the gallery as a visitor'] = 'Navigasi galeri ini sebagai pengunjung';
+$lang['Hello'] = 'Halo';
+$lang['Hello %s,'] = 'Halo %s';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Halo %s, galeri foto Piwigo anda masih kosong!';
+$lang['Help'] = 'Bantuan';
+$lang['Here are your connection settings'] = 'Ini adalah pengaturan koneksi anda';
+$lang['Default'] = 'Kembali ke standar';
+$lang['Email address is missing. Please specify an email address.'] = 'Alamat email ini hilang, mohon berikan email yang aktif';
+$lang['Email: %s'] = 'Email: %s';
+$lang['Empty query. No criteria has been entered.'] = 'Kolom kosong. Belum ada kriteria yang dimasukan';
+$lang['End-Date'] = 'Kadaluarsa';
+$lang['Enter your new password below.'] = 'Masukkan kata sandi baru anda di bawah ini';
+$lang['Enter your personnal informations'] = 'Masukkan data pribadi anda';
+$lang['Error sending email'] = 'Kesalahan ketika mengirimkan email';
+$lang['Expand all albums'] = 'Lebarkan semua album';
+$lang['Favorites'] = 'Favorit';
+$lang['File'] = 'Dokumen';
+$lang['File name'] = 'Nama dokumen';
+$lang['Filesize'] = 'Ukuran dokumen';
+$lang['Current password is wrong'] = 'Kata sandi sat ini salah';
+$lang['Customize'] = 'Kostumisasi';
+$lang['Delete'] = 'Hapus';
+$lang['Desktop'] = 'Deskop';
+$lang['Dimensions'] = 'Dimensi';
+$lang['Display'] = 'Tampilkan';
+$lang['Download'] = 'unggah';
+$lang['Download this file'] = 'Unggah dokumen ini';
+$lang['EXIF Metadata'] = 'EXIF Metadata';
+$lang['Each listed rule must be satisfied.'] = 'Tiap kriteria yang terdaftar harus disempurnakan';
+$lang['Edit'] = 'Ubah';
+$lang['Edit a comment'] = 'Ubah sebuah komentar';
+$lang['Email'] = 'Email';
+$lang['Email address'] = 'Alamat email';
+$lang['Calendar'] = 'Kalender';
+$lang['Change my password'] = 'Ubah kata sandi saya';
+$lang['Check your email for the confirmation link'] = 'Periksa email anda untuk link konfirmasi';
+$lang['Click here if your browser does not automatically forward you'] = 'Klik disini jika browser anda tidak menuju langsung ke situs anda';
+$lang['Click on the photo to see it in high definition'] = 'Klik pada foto untuk melihat gambar versi kualitas tinggi';
+$lang['Close this window'] = 'Tutup jendela ini';
+$lang['Comment'] = 'Komentar';
+$lang['Comment by %s'] = 'Komentar oleh %s';
+$lang['Comment: %s'] = 'Komentar: %s';
+$lang['Comments'] = 'Komentar';
+$lang['Complete RSS feed (photos, comments)'] = 'Berlangganan RSS Feed (foto dan komentar)';
+$lang['Confirm Password'] = 'Konfirmasi kata sandi';
+$lang['Connected user: %s'] = 'Pengguna yang terhubung : %s';
+$lang['Connection settings'] = 'Pengaturan koneksi';
+$lang['Contact'] = 'Kontak';
+$lang['Contact webmaster'] = 'Hubungi Webmaster';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Kuki anda diblokir atau ini tidak didukung oleh browser anda. Anda diharuskan mengaktifkan kuki untuk masuk.';
+$lang['Create a new account'] = 'Buat akun baru';
+$lang['Created on'] = 'Terbuat';
+$lang['Creation date'] = 'Tanggal pembuatan';
+$lang['Admin: %s'] = 'Admin %s';
+$lang['Administration'] = 'Administrasi';
+$lang['Album'] = 'Album';
+$lang['Album results for'] = 'Hasil album untuk';
+$lang['Album: %s'] = 'Album %s';
+$lang['Albums'] = 'Album';
+$lang['All'] = 'Semua';
+$lang['All tags'] = 'Semua kata kunci';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Seorang administrator harus mengijinkan komentar anda sebelum terlihat oleh publik';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Sistem anti multi-komentar : harap tunggu sebentar sebelum anda mencoba menulis komentar yang baru ';
+$lang['Any tag'] = 'Kata kunci lain';
+$lang['Are you sure?'] = 'Apakah anda yakin?';
+$lang['At least one listed rule must be satisfied.'] = 'Sekurangnya satu kategori didaftarkan';
+$lang['Author'] = 'Penulis';
+$lang['Author: %s'] = 'Penulis %s';
+$lang['Auto login'] = 'Masuk otomatis';
+$lang['Bad request'] = 'Kesalahan permintaan ';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Kesalahan status untuk pengguna "tamu", status standar akan digunakan. Harap memberitahukan webmaster ';
+$lang['Best rated'] = 'Rating terbaik';
+$lang['Browser: %s'] = 'Cari: %s';
+$lang['%d album updated'] = '%d album diperbaharui';
+$lang['%d albums updated'] = '%d album diperbaharui';
+$lang['%d comment'] = '%d komentar';
+$lang['%d comment to validate'] = '%d komentar untuk divalidasi';
+$lang['%d comments to validate'] = '%d komentar untuk divalidasi';
+$lang['%d photo'] = '%d foto';
+$lang['%d photo is also linked to current tags'] = '%d foto juga dikaitkan dengan kata kunci yang ada';
+$lang['%d photos'] = '%d foto';
+$lang['%d photos are also linked to current tags'] = '%d foto juga dikaitkan dengan kata kunci yang ada';
+$lang['%d rate'] = '%d peringkat';
+$lang['%d rates'] = '%d peringkat';
+$lang['(!) This comment requires validation'] = '(!) Komentar ini memerlukan validasi';
+$lang['... or browse your empty gallery'] = '... atau cari di galeri kosong anda';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... atau nonaktifkan pesan ini, saya akan mencarinya sendiri';
+$lang['2small'] = 'XXS - kecil';
+$lang['A comment on your site'] = 'Sebuah komentar di situs anda';
+$lang['About'] = 'Tentang';
+$lang['About Piwigo'] = 'Tentang Piwigo';
+$lang['Accelerate diaporama speed'] = 'Tingkatkan kecepatan guliran gambar ';
+$lang['Add a comment'] = 'Tambahkan sebuah komentar';
+?> \ No newline at end of file
diff --git a/language/id_ID/id_ID.jpg b/language/id_ID/id_ID.jpg
new file mode 100644
index 000000000..ee52223f2
--- /dev/null
+++ b/language/id_ID/id_ID.jpg
Binary files differ
diff --git a/language/id_ID/index.php b/language/id_ID/index.php
new file mode 100644
index 000000000..ece585061
--- /dev/null
+++ b/language/id_ID/index.php
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?> \ No newline at end of file
diff --git a/language/id_ID/iso.txt b/language/id_ID/iso.txt
new file mode 100644
index 000000000..f8ac87eae
--- /dev/null
+++ b/language/id_ID/iso.txt
@@ -0,0 +1 @@
+Bahasa Indonesia [ID] \ No newline at end of file
diff --git a/language/index.php b/language/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/index.php
+++ b/language/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/is_IS/common.lang.php b/language/is_IS/common.lang.php
index 609d76997..39e3e2beb 100644
--- a/language/is_IS/common.lang.php
+++ b/language/is_IS/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2009 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,8 +22,8 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Ãslenska [IS]
-Version: 2.5.0
-Language URI: http://piwigo.org/ext/extension_view.php?eid=
+Version: 2.6.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=518
Author: Piwigo team
Author URI: http://piwigo.org
*/
@@ -250,7 +250,6 @@ $lang['login mustn\'t end with a space character'] = 'notendanafn má ekki enda
$lang['login mustn\'t start with a space character'] = 'notendanafn má ekki byrja á bili';
$lang['this login is already used'] = 'þetta notendanafn er nú þegar í notkun';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'netfang verður að vera xxx@yyy.eee (example : jack@altern.org)';
-$lang['please enter your password again'] = 'vinsamlegast sláið lykilorð aftur inn';
$lang['Auto login'] = 'Sjálfvirk innskráning';
$lang['remove this tag from the list'] = 'fjarlægja merki úr lista';
$lang['representative'] = 'Fulltrúi';
@@ -278,7 +277,6 @@ $lang['SQL queries in'] = 'SQL spurningar inn';
$lang['display only recently posted photos'] = 'aðeins sýna myndir sem nýlega voru settar inn';
$lang['return to the display of all photos'] = 'aftur í sýningu á öllum myndum';
$lang['the beginning'] = 'upphafið';
-$lang['Interface theme'] = 'Þema';
$lang['Thumbnails'] = 'Smámyndir';
$lang['Menu'] = 'Valmynd';
$lang['A comment on your site'] = 'Athugasemd á síðuni þinni';
diff --git a/language/is_IS/index.php b/language/is_IS/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/is_IS/index.php
+++ b/language/is_IS/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/it_IT/admin.lang.php b/language/it_IT/admin.lang.php
index 0d998dfd1..49ee97deb 100644
--- a/language/it_IT/admin.lang.php
+++ b/language/it_IT/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -194,7 +194,6 @@ $lang['Access type'] = 'Tipo di accesso';
$lang['Information data registered in database'] = 'Informazioni registrate nel database';
$lang['Default display'] = 'Visualizzazione predefinita';
$lang['The gallery URL is not valid.'] = 'L\'URL della galleria non è valido.';
-$lang['Main'] = 'Principale';
$lang['The number of comments a page must be between 5 and 50 included.'] = 'Il numero di commenti per pagina deve essere compreso tra 5 e 50.';
$lang['Configuration'] = 'Configurazione';
$lang['confirm'] = 'confermare';
@@ -229,7 +228,6 @@ $lang['Prepared time for list of users to send mail is limited. Others users are
$lang['Time to send mail is limited. Others mails are skipped.'] = 'Il tempo per l\'invio dell\'email è limitato. L\'invio delle altre email verra ignorato.';
$lang['To send ?'] = 'Inviare?';
$lang['Last send'] = 'Ultimo invio';
-$lang['email'] = 'Email';
$lang['User'] = 'Utente';
$lang['See you soon,'] = 'A presto,';
$lang['Go to'] = 'Andare a';
@@ -422,8 +420,8 @@ $lang['guest'] = 'ospite';
$lang['default values'] = 'valori predefiniti';
$lang['Guest cannot be deleted'] = 'L\'utente ospite non può essere cancellato';
$lang['Default user cannot be deleted'] = 'L\'utente predefinito non può essere cancellato';
-$lang['Purge history detail'] = 'Ripulire i dettagli dalla cronoligia';
-$lang['Purge history summary'] = 'Ripulire il sommario dalla cronoligia';
+$lang['Purge history detail'] = 'Ripulire i dettagli dalla cronologia';
+$lang['Purge history summary'] = 'Ripulire il sommario dalla cronologia';
$lang['Check integrity'] = 'Controllo d\'integrità ';
$lang['Anomaly'] = 'Anomalia';
$lang['Correction'] = 'Correzione';
@@ -771,7 +769,7 @@ $lang['... or '] = '... oppure ';
$lang['Create'] = 'Creare';
$lang['Start Upload'] = 'Avviare il caricamento';
$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Si sta utilizzando il Flash uploader. Problemi? Provare il <a href="%s">Browser uploader</a> invece.';
-$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Atate utilizzando il Browser uploader. Provate con il <a href="%s">Flash uploader</a> invece.';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'State utilizzando il Browser uploader. Provate con il <a href="%s">Flash uploader</a> invece.';
$lang['Maximum file size: %sB.'] = 'Grandezza massima dei file: %sB.';
$lang['Allowed file types: %s.'] = 'Tipi di file autorizzati: %s.';
$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Risoluzione massima approssimativa: %dM pixels (sia %dx%d pixels)';
@@ -927,7 +925,6 @@ $lang['Name of the duplicate'] = 'Nome del duplicato';
$lang['Source tag'] = 'Sorgente tag';
$lang['Tag "%s" is now a duplicate of "%s"'] = 'Il tag "%s" è ormai una copia di "%s"';
$lang['Duplicate selected tags'] = 'Duplicare i tags selezionati';
-$lang['Invalid dimension'] = 'Dimensione non valida';
$lang['Minimum height'] = 'Altezza minima';
$lang['Minimum width'] = 'Larghezza minima';
$lang['Portrait'] = 'Ritratto';
@@ -950,4 +947,32 @@ $lang['This group will be set to default'] = 'Questo gruppo sarà impostato sul
$lang['No members to manage'] = 'Nessun membro da gestire';
$lang['Rename'] = 'Rinomina';
$lang['Purge user cache'] = 'Svuotare la cache utente';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'Le dimensioni dell\'immagine saranno ridotte a %dx%d pixel.';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'Ridimensionamento dopo l\'upload disattivato a causa dell\'uso di GD come libreria grafica';
+$lang['Select at least one tag'] = 'Selezionare almeno un tag';
+$lang['Basic settings'] = 'Impostazioni base';
+$lang['General'] = 'Generale';
+$lang['Mail theme'] = 'Tema email';
+$lang['on the %d selected users'] = 'su %d utenti selezionati';
+$lang['Showing %s to %s of %s users'] = 'Mostra %s a %s di %s utenti';
+$lang['Registered on %s, %s.'] = 'Registrati su %s, %s.';
+$lang['No user selected of %d users'] = 'Nessun utente selezionato di %d utenti';
+$lang['User %s updated'] = 'Utente %s aggiornato';
+$lang['User %s added'] = 'Utente %s aggiunto';
+$lang['Show %s users'] = 'Mostra %s utenti';
+$lang['Users modified'] = 'Utenti modificati';
+$lang['Update user'] = 'Aggiorna utente';
+$lang['Password updated'] = 'Password aggiornata';
+$lang['No user selected, no action possible.'] = 'Nessun utente selezionato, nessuna azione è possibile.';
+$lang['No matching user found'] = 'Nessun utente corrispondente trovato';
+$lang['Loading...'] = 'Caricamento...';
+$lang['Last visit on %s, %s.'] = 'Ultima visita su %s, %s.';
+$lang['All %d users are selected'] = 'Tutti %d utenti sono selezionati';
+$lang['(filtered from %s total users)'] = '(filtrato da %s utenti totali)';
+$lang['%d of %d users selected'] = '%d di %d utenti selezionati';
+$lang['Change username'] = 'Cambia nome utente';
+$lang['Change password'] = 'Cambia password';
+$lang['close'] = 'chiudere';
+$lang['Close user details'] = 'Chiudi dettagli utente';
+$lang['Open user details'] = 'Aprire dettagli utente';
?> \ No newline at end of file
diff --git a/language/it_IT/common.lang.php b/language/it_IT/common.lang.php
index b666dad7d..f8aff06a6 100644
--- a/language/it_IT/common.lang.php
+++ b/language/it_IT/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Italiano [IT]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=424
Author: Piwigo team
Author URI: http://piwigo.org
@@ -37,22 +37,22 @@ $lang_info['zero_plural'] = false;
$lang['%d album updated'] = '%d album aggiornato';
$lang['%d albums updated'] = '%d album aggiornati';
-$lang['%d comment to validate'] = '%d commento utente da approvare';
+$lang['%d comment to validate'] = '%d commento da approvare';
$lang['%d comment'] = '%d commento';
-$lang['%d comments to validate'] = '%d commenti utente da approvare';
+$lang['%d comments to validate'] = '%d commenti da approvare';
$lang['%d comments'] = '%d commenti';
-$lang['%d hit'] = 'vista %d volte';
-$lang['%d hits'] = 'viste %d volte';
-$lang['%d Kb'] = '%d Kb';
-$lang['%d new comment'] = '%d nuovo commento utente';
-$lang['%d new comments'] = '%d nuovi commenti utente';
+$lang['%d hit'] = 'vista %d';
+$lang['%d hits'] = 'viste %d';
+$lang['%d Kb'] = '%d KB';
+$lang['%d new comment'] = '%d nuovo commento';
+$lang['%d new comments'] = '%d nuovi commenti';
$lang['%d new photo'] = '%d nuova foto';
$lang['%d new photos'] = '%d nuove foto';
$lang['%d new user'] = '%d nuovo utente';
$lang['%d new users'] = '%d nuovi utenti';
-$lang['%d photo is also linked to current tags'] = '%d foto è anche connessa ai tag correnti';
+$lang['%d photo is also linked to current tags'] = '%d foto è anche collegata ai tag correnti';
$lang['%d photo'] = '%d foto';
-$lang['%d photos are also linked to current tags'] = '%d foto sono anche connesse ai tag correnti';
+$lang['%d photos are also linked to current tags'] = '%d foto sono anche collegate ai tag correnti';
$lang['%d photos'] = '%d foto';
$lang['%d rates'] = '%d voti';
$lang['(!) This comment requires validation'] = '(!) Questo commento deve essere approvato';
@@ -62,9 +62,9 @@ $lang['A comment on your site'] = 'Un commento sul tuo sito';
$lang['About Piwigo'] = 'Informazioni su Piwigo';
$lang['About'] = 'Informazioni su';
$lang['Accelerate diaporama speed'] = 'Accelerare la velocità proiezione';
-$lang['Add a comment'] = 'Aggiungere un commento';
+$lang['Add a comment'] = 'Aggiungi un commento';
$lang['add this photo to your favorites'] = 'Aggiungi la pagina ai tuoi preferiti';
-$lang['Admin: %s'] = 'Amministrazione: %s';
+$lang['Admin: %s'] = 'Amministratore: %s';
$lang['Administration'] = 'Amministrazione';
$lang['Album results for'] = 'Risultati degli album per';
$lang['Album'] = 'Album';
@@ -84,7 +84,7 @@ $lang['author(s) : %s'] = 'autore(i): %s';
$lang['Author: %s'] = 'Autore: %s';
$lang['Auto login'] = 'Conessione automatica';
$lang['available for administrators only'] = 'disponibile solo per gli amministratori';
-$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Lo status dell\'utente "guest" non è conforme, viene usato lo status predefinito. Per favore avvisa il webmaster.';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Lo stato dell\'utente "guest" non è conforme, viene usato lo stato predefinito. Per favore avvisa il webmaster.';
$lang['Best rated'] = 'I più votati';
$lang['Browser: %s'] = 'Browser: %s';
$lang['Calendar'] = 'Calendario';
@@ -103,7 +103,7 @@ $lang['Comment'] = 'Commento';
$lang['Comment: %s'] = 'Commento: %s';
$lang['Comments'] = 'Commenti';
$lang['Complete RSS feed (photos, comments)'] = 'Feed RSS completo (foto, commenti)';
-$lang['Confirm Password'] = 'Conferma la Password';
+$lang['Confirm Password'] = 'Conferma Password';
$lang['Connected user: %s'] = 'Utente connesso : %s';
$lang['Connection settings'] = 'Parametri di connessione';
$lang['Contact webmaster'] = 'Contattare il webmaster';
@@ -116,9 +116,9 @@ $lang['created between %s (%s) and %s (%s)'] = 'creata tra il %s (%s) e il %s (%
$lang['created on %s'] = 'creata il %s';
$lang['Created on'] = 'Creato il';
$lang['Creation date'] = 'Data di creazione';
-$lang['Current password is wrong'] = 'La password non è esatta';
+$lang['Current password is wrong'] = 'La password non è corretta';
$lang['customize the appareance of the gallery'] = 'personalizzare l\'aspetto della galleria';
-$lang['Customize'] = 'Personalizzare';
+$lang['Customize'] = 'Personalizza';
$lang['Date'] = 'Data';
$lang['day'][0] = 'Domenica';
$lang['day'][1] = 'Lunedì';
@@ -149,22 +149,22 @@ $lang['display recently updated albums'] = 'mostrare gli album caricati di recen
$lang['display this album'] = 'Mostra le foto alle radici dell\'album';
$lang['display your favorites photos'] = 'mostra le mie foto preferite';
$lang['Display'] = 'Visualizzazione';
-$lang['Download this file'] = 'Scaricare questo file';
-$lang['Download'] = 'Scaricare';
+$lang['Download this file'] = 'Scarica questo file';
+$lang['Download'] = 'Scarica';
$lang['Each listed rule must be satisfied.'] = 'Tutti i criteri devono essere soddisfatti';
-$lang['Edit a comment'] = 'Modificare un commento';
+$lang['Edit a comment'] = 'Modifica un commento';
$lang['edit'] = 'modificare';
-$lang['Edit'] = 'Modificare';
-$lang['Email address is missing. Please specify an email address.'] = 'Manca l\'indirizzo Email. Per favore specificarne uno.';
+$lang['Edit'] = 'Modifica';
+$lang['Email address is missing. Please specify an email address.'] = 'Manca l\'indirizzo Email. Per favore specificane uno.';
$lang['Email address'] = 'Indirizzo email';
$lang['Email: %s'] = 'Email: %s';
$lang['Empty query. No criteria has been entered.'] = 'Ricerca incompleta. Nessun criterio di ricerca inserito.';
$lang['End-Date'] = 'Data di fine';
-$lang['Enter your new password below.'] = 'Immettere la nuova password qui sotto';
+$lang['Enter your new password below.'] = 'Immettere la nuova password qui sotto.';
$lang['Enter your personnal informations'] = 'Inserire le informazioni personali';
$lang['Error sending email'] = 'Errore durante l\'invio dell\'email';
$lang['excluded'] = 'escluso';
-$lang['EXIF Metadata'] = 'Dati EXIF';
+$lang['EXIF Metadata'] = 'Metadata EXIF';
$lang['Expand all albums'] = 'Espandere tutti gli album';
$lang['Favorites'] = 'Preferite';
$lang['File name'] = 'Nome file';
@@ -178,25 +178,24 @@ $lang['from %s to %s'] = 'da %s a %s';
$lang['Go through the gallery as a visitor'] = 'Visita la galleria come ospite';
$lang['group by letters'] = 'ragruppare per lettera';
$lang['guest'] = 'ospite';
-$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Salve %s, la vostra galleria fotografica Piwigo è vuota!';
-$lang['Hello'] = 'Buongiorno';
-$lang['Hello %s,'] = 'Buongiorno %s,';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Ciao %s, la tua galleria fotografica Piwigo è vuota!';
+$lang['Hello'] = 'Ciao';
+$lang['Hello %s,'] = 'Ciao %s,';
$lang['Help'] = 'Aiuto';
$lang['Home'] = 'Home';
$lang['html tags are not allowed in login'] = 'i tag HTML non sono ammessi nel login';
$lang['I want to add photos'] = 'Voglio aggiungere delle foto';
$lang['Identification'] = 'Identificazione';
-$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'se si tratta di un\'errore, ignorare questo messaggio e la richiesta non sarà presa in considerazione.';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Se si tratta di un\'errore, ignorare questa email e la richiesta non sarà presa in considerazione.';
$lang['in %d sub-album'] = 'in %d sub-album';
$lang['in %d sub-albums'] = 'in %d sub-album';
$lang['in this album'] = 'In questo album';
$lang['included'] = 'incluso';
-$lang['Interface theme'] = 'Tema dell\'interfaccia';
$lang['Invalid key'] = 'Chiave non valida';
$lang['Invalid password!'] = 'Password non valida!';
$lang['Invalid username or email'] = 'Nome utente o indirizzo email non valido';
$lang['IP: %s'] = 'IP: %s';
-$lang['IPTC Metadata'] = 'Dati IPTC';
+$lang['IPTC Metadata'] = 'Metadata IPTC';
$lang['Keyword'] = 'Parola chiave';
$lang['Kind of date'] = 'Tipo di data';
$lang['Language'] = 'Lingua';
@@ -238,8 +237,8 @@ $lang['obligatory'] = 'obbligatorio';
$lang['Original dimensions'] = 'Dimensioni originali';
$lang['Page generated in'] = 'Pagina generata in';
$lang['Password forgotten'] = 'Password dimenticata';
-$lang['Password reset is not allowed for this user'] = 'Il rinnovo della password non è consentito per questo utente';
-$lang['Password Reset'] = 'Rinnovare la vostra password';
+$lang['Password reset is not allowed for this user'] = 'La reimpostazione della password non è consentita per questo utente';
+$lang['Password Reset'] = 'Reimposta Password';
$lang['password updated'] = 'password aggiornata';
$lang['Password'] = 'Password';
$lang['Pause of slideshow'] = 'Pausa proiezione';
@@ -248,18 +247,17 @@ $lang['Photos only RSS feed'] = 'Feed RSS solo per le foto';
$lang['photos posted during the last %d days'] = 'foto aggiunte durante gli ultimi %d giorni';
$lang['Photos posted within the last %d day.'] = 'Foto pubblicate nelle ultime 24 ore.';
$lang['Photos posted within the last %d days.'] = 'Foto pubblicate negli ultimi %d giorni.';
-$lang['Piwigo Help'] = 'Help di Piwigo';
+$lang['Piwigo Help'] = 'Aiuto di Piwigo';
$lang['Play of slideshow'] = 'Avvia proiezione';
-$lang['please enter your password again'] = 'si prega di inserire nuovamente la password';
$lang['Please enter your username or email address.'] = 'Inserisci il tuo nome utente o indirizzo e-mail.';
-$lang['Please, enter a login'] = 'Inserire nome utente, grazie';
+$lang['Please, enter a login'] = 'Per favore, inserire nome utente';
$lang['Post date'] = 'Data d\'invio';
$lang['posted after %s (%s)'] = 'disponibile dopo il %s (%s)';
$lang['posted before %s (%s)'] = 'disponibile prima del %s (%s)';
$lang['posted between %s (%s) and %s (%s)'] = 'disponibile tra %s (%s) e il %s (%s)';
$lang['posted on %s'] = 'disponibile il %s';
$lang['Posted on'] = 'Inviato il';
-$lang['Powered by'] = 'Sito realizzato grazie a';
+$lang['Powered by'] = 'Realizzato grazie a';
$lang['Preferences'] = 'Preferenze';
$lang['Previous'] = 'Precendente';
$lang['Profile'] = 'Profilo';
@@ -273,48 +271,48 @@ $lang['Recent albums'] = 'Album recenti';
$lang['Recent period must be a positive integer value'] = 'Il periodo deve essere un valore intero positivo';
$lang['Recent period'] = 'Periodo recente';
$lang['Recent photos'] = 'Ultime foto';
-$lang['Redirection...'] = 'Reindirizzamento in corso...';
+$lang['Redirection...'] = 'Reindirizzamento...';
$lang['Reduce diaporama speed'] = 'Ralentare la velocità proiezione';
$lang['Register'] = 'Registrati';
$lang['Registration of %s'] = 'Registrazione di %s';
$lang['Registration'] = 'Registrazione';
$lang['Related tags'] = 'Tags correlati';
$lang['remove this tag from the list'] = 'eliminare questo tag dall\'elenco';
-$lang['Repeat the slideshow'] = 'Ricominciare proiezione';
+$lang['Repeat the slideshow'] = 'Ricomincia proiezione';
$lang['representative'] = 'miniatura dell\'album';
-$lang['Reset to default values'] = 'Ripristinare le impostazioni predefinite';
-$lang['Reset'] = 'Cancellare';
-$lang['Retrieve password'] = 'Recuperare la password';
-$lang['Return to home page'] = 'Ritornare alla home page';
+$lang['Reset to default values'] = 'Ripristina le impostazioni predefinite';
+$lang['Reset'] = 'Cancella';
+$lang['Retrieve password'] = 'Recupera la password';
+$lang['Return to home page'] = 'Ritorna alla home page';
$lang['return to normal view mode'] = 'ritorna alla visualizzazione normale';
$lang['return to the display of all photos'] = 'ritornare alla visualizzazione di tutte le foto';
$lang['RSS feed'] = 'Feed RSS';
-$lang['Search by date'] = 'Cercare per data';
-$lang['Search for all terms'] = 'Cercare tutte le parole';
-$lang['Search for any term'] = 'Cercare una qualsiasi delle parole';
-$lang['Search for Author'] = 'Cercare un Autore';
-$lang['Search for words'] = 'Cercare le parole';
-$lang['Search in albums'] = 'Cercare negli album';
-$lang['Search in sub-albums'] = 'Cercare nei sub-album';
+$lang['Search by date'] = 'Cerca per data';
+$lang['Search for all terms'] = 'Cerca tutte le parole';
+$lang['Search for any term'] = 'Cerca una qualsiasi delle parole';
+$lang['Search for Author'] = 'Cerca un Autore';
+$lang['Search for words'] = 'Cerca le parole';
+$lang['Search in albums'] = 'Cerca negli album';
+$lang['Search in sub-albums'] = 'Cerca nei sub-album';
$lang['Search results'] = 'Risultato della ricerca';
$lang['Search rules'] = 'Criteri di ricerca';
-$lang['Search tags'] = 'Ricercare i tags';
+$lang['Search tags'] = 'Cerca i tags';
$lang['search'] = 'cercare';
$lang['Search'] = 'Cerca';
$lang['searched words : %s'] = 'parole ricercate: %s';
-$lang['Sent by'] = 'Mandato da';
+$lang['Sent by'] = 'Inviato da';
$lang['Send my connection settings by email'] = 'Inviare le mie impostazioni di connessione tramite e-mail';
$lang['set as album representative'] = 'impostare come miniatura dell\'album';
-$lang['Show file metadata'] = 'Mostrare i metadati del file';
-$lang['Show number of comments'] = 'Mostrare il numero dei commenti';
-$lang['Show number of hits'] = 'Mostrare il numero di visualizzazioni';
+$lang['Show file metadata'] = 'Mostra i metadati del file';
+$lang['Show number of comments'] = 'Mostra il numero dei commenti';
+$lang['Show number of hits'] = 'Mostra il numero di visualizzazioni';
$lang['show tag cloud'] = 'mostrare la nuvola di tags';
$lang['Since'] = 'Dal';
$lang['slideshow'] = 'avviare proiezione di diapositive';
-$lang['Someone requested that the password be reset for the following user account:'] = 'Qualcuno ha chiesto di rinnovare la propria password per l\'utente seguente:';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Qualcuno ha chiesto di reimpostare la password per il seguente utente:';
$lang['Sort by'] = 'Ordina per';
$lang['Sort order'] = 'Ordinamento';
-$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Registrazione riuscita, riceverete presto una email con le vostre impostazioni di connessione.. Benvenuti!';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Registrazione riuscita, riceverai presto una email con le tue impostazioni di connessione.. Benvenuto!';
$lang['Specials'] = 'Speciale';
$lang['SQL queries in'] = 'Queries SQL in';
$lang['stop the slideshow'] = 'fermare le diapositive';
@@ -368,7 +366,7 @@ $lang['Thank you for registering at %s!'] = 'Grazie per esserti registrato su %s
$lang['Here are your connection settings'] = 'Qui ci sono le impostazioni di connessione';
$lang['Password: %s'] = 'Password: %s';
$lang['Username: %s'] = 'Nome utente: %s';
-$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'se pensate avere ricevuto questa email per sbaglio, contattateci %s';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Se pensi di avere ricevuto questa email per sbaglio, contattateci %s';
$lang['Photo sizes'] = 'Dimensioni delle foto';
$lang['square'] = 'Quadrata';
$lang['thumb'] = 'Miniatura';
@@ -379,8 +377,8 @@ $lang['medium'] = 'M - Media';
$lang['large'] = 'L - Grande';
$lang['xlarge'] = 'XL - grandissima';
$lang['xxlarge'] = 'XXL - enorme';
-$lang['Show latest comments first'] = 'Visualizzare i commenti i più recenti prima';
-$lang['Show oldest comments first'] = 'Visualizzare i commenti i meno recenti prima';
+$lang['Show latest comments first'] = 'Visualizza i commenti più recenti prima';
+$lang['Show oldest comments first'] = 'Visualizza i commenti meno recenti prima';
$lang['View in'] = 'Visualizzazione';
$lang['Mobile'] = 'Mobile';
$lang['Desktop'] = 'Desktop';
@@ -412,4 +410,12 @@ $lang['Email address is mandatory'] = 'L\'indirizzo email è obbligatorio';
$lang['mandatory'] = 'obbligatorio';
$lang['Website'] = 'Sito web';
$lang['Your website URL is invalid'] = 'L\'indirizzo del vostro sito web non è valido';
+$lang['Email'] = 'Email';
+$lang['Go back to the album'] = 'Ritorna all\'album';
+$lang['Last Page'] = 'Ultima pagina';
+$lang['First Page'] = 'Prima pagina';
+$lang['Password is missing. Please enter the password.'] = 'Campo password vuoto. Prego inserire la password.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Campo conferma della password vuoto. Si prega di confermare la password scelta.';
+$lang['%d photos per page'] = '%d foto per pagina';
+$lang['Theme'] = 'Tema';
?> \ No newline at end of file
diff --git a/language/it_IT/help/index.php b/language/it_IT/help/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/it_IT/help/index.php
+++ b/language/it_IT/help/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/it_IT/index.php b/language/it_IT/index.php
index df13f7e8e..ece585061 100644
--- a/language/it_IT/index.php
+++ b/language/it_IT/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/it_IT/install.lang.php b/language/it_IT/install.lang.php
index fab506714..bdd31be15 100644
--- a/language/it_IT/install.lang.php
+++ b/language/it_IT/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,24 +21,19 @@
// | USA. |
// +-----------------------------------------------------------------------+
-
-
$lang['Installation'] = 'Installazione';
$lang['Basic configuration'] = 'Configurazione di base';
$lang['Default gallery language'] = 'Lingua predefinita della galleria';
$lang['Database configuration'] = 'Configurazione database';
$lang['Admin configuration'] = 'Configurazione utente Amministratore';
$lang['Start Install'] = 'Inizia l\'installazione';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'l\'indirizzo email deve essere tipo xxx@yyy.eee (esempio: jack@altern.org)';
-$lang['Webmaster login'] = 'Nome utente webmaster';
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Esso verrà mostrato ai visitatori. E\' necessario per amministrare il vostro sito';
$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Connessione al server riuscita, ma non è stato possibile connettersi al database.';
$lang['Can\'t connect to server'] = 'Impossibile connettersi al server';
$lang['Host'] = 'Host';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
+$lang['localhost or other, supplied by your host provider'] = 'localhost o altro, datovi dal vostro provider';
$lang['User'] = 'Utente';
$lang['user login given by your host provider'] = 'login utente database fornito dal vostro provider';
-$lang['Password'] = 'Password';
$lang['user password given by your host provider'] = 'password d\'accesso al database fornita dal vostro provider';
$lang['Database name'] = 'Nome del database';
$lang['also given by your host provider'] = 'anche questo fornito dal vostro provider';
@@ -47,12 +42,10 @@ $lang['database tables names will be prefixed with it (enables you to manage bet
$lang['enter a login for webmaster'] = 'inserire un nome utente per il webmaster';
$lang['webmaster login can\'t contain characters \' or "'] = 'il nome utente del webmaster non può contenere caratteri come \' o "';
$lang['please enter your password again'] = 'reinserire la password';
-$lang['Webmaster password'] = 'Password del webmaster';
$lang['Keep it confidential, it enables you to access administration panel'] = 'Da conservare con cura. Permette l\'accesso al pannello d\'amministrazione';
$lang['Password [confirm]'] = 'Password [confermare]';
$lang['verification'] = 'verifica';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Avete bisogno di aiuto? Visitate il <a href="%s">forum di Piwigo</a>.';
-$lang['Webmaster mail address'] = 'Indirizzo email del Webmaster';
$lang['Visitors will be able to contact site administrator with this mail'] = 'I visitatori saranno in grado di contattarvi usando questa email';
$lang['PHP 5 is required'] = 'E\' richiesto PHP 5';
$lang['It appears your webhost is currently running PHP %s.'] = 'Sembra che la versione PHP del vostro server sia %s.';
@@ -64,7 +57,6 @@ $lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo non è stato in grado
$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Si consiglia di fare riferimento al supporto del vostro provider di hosting e vedere come potete passare a PHP 5 da soli.';
$lang['Hope to see you back soon.'] = 'Speriamo di rivedervi presto.';
$lang['Congratulations, Piwigo installation is completed'] = 'Congratulazioni, l\'installazione di Piwigo è completata';
-
$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Una soluzione alternativa è quella di copiare il testo della casella sopra e incollarlo nel file "local/config/database.inc.php" (Attenzione: database.inc.php deve contenere solo quello che c\'è nel box sopra, senza nessun ritorno a capo o spazio)';
$lang['Creation of config file local/config/database.inc.php failed.'] = 'Creazione del file di configurazione local/config/database.inc.php fallita.';
$lang['Download the config file'] = 'Scaricare il file di configurazione';
@@ -73,5 +65,4 @@ $lang['Just another Piwigo gallery'] = 'Una galleria Piwigo in più ';
$lang['Welcome to my photo gallery'] = 'Benvenuti nella mia galleria fotografica';
$lang['Welcome to your new installation of Piwigo!'] = 'Benvenuti sulla vostra nuova installazione di Piwigo!';
$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Non esitate a consultare i nostri forum se avete un qualunque problema: %s';
-
?> \ No newline at end of file
diff --git a/language/it_IT/upgrade.lang.php b/language/it_IT/upgrade.lang.php
index 5ef6e767b..fc18a602d 100644
--- a/language/it_IT/upgrade.lang.php
+++ b/language/it_IT/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -24,7 +24,8 @@
$lang['Upgrade'] = 'Aggiornamento';
-$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Questa pagina vi propone di aggiornare il vostro database corrispondente alla vecchia versione di Piwigo con la nuova versione. L\'assistente all\'aggiornamento ha identificato la vostra attuale <strong>versione %s</strong> (o equivalente).';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Questa pagina vi propone di aggiornare il vostro database corrispondente alla vecchia versione di Piwigo con la nuova versione.
+L\'assistente all\'aggiornamento ha identificato la vostra attuale <strong>versione %s</strong> (o equivalente).';
$lang['Upgrade from version %s to %s'] = 'Aggiornamento dalla versione %s alla %s';
$lang['Statistics'] = 'Statistiche';
$lang['total upgrade time'] = 'tempo totale aggiornamento';
diff --git a/language/ja_JP/admin.lang.php b/language/ja_JP/admin.lang.php
index ae1a720d3..bbac64200 100644
--- a/language/ja_JP/admin.lang.php
+++ b/language/ja_JP/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -188,7 +188,6 @@ $lang['Access type'] = 'アクセスタイプ';
$lang['Information data registered in database'] = 'データベースã«ç™»éŒ²ã•ã‚ŒãŸæƒ…報データ';
$lang['Default display'] = 'デフォルト表示';
$lang['The gallery URL is not valid.'] = 'ギャラリーURIãŒæœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“。';
-$lang['Main'] = 'メイン';
$lang['The number of comments a page must be between 5 and 50 included.'] = '1ページã‚ãŸã‚Šã®ã‚³ãƒ¡ãƒ³ãƒˆæ•°ã¯ã€5ã‹ã‚‰50ã®é–“ã«ã—ã¦ãã ã•ã„。';
$lang['Configuration'] = '設定';
$lang['confirm'] = '確èª';
@@ -223,7 +222,6 @@ $lang['Prepared time for list of users to send mail is limited. Others users are
$lang['Time to send mail is limited. Others mails are skipped.'] = 'メールé€ä¿¡æ™‚é–“ãŒåˆ¶é™ã•ã‚Œã¦ã„ã¾ã™ã€‚ä»–ã®ãƒ¡ãƒ¼ãƒ«ã¯ã‚¹ã‚­ãƒƒãƒ—ã•ã‚Œã¾ã™ã€‚';
$lang['To send ?'] = 'é€ä¿¡?';
$lang['Last send'] = '最終é€ä¿¡';
-$lang['email'] = 'メール';
$lang['User'] = 'ユーザ';
$lang['See you soon,'] = 'ãã‚Œã§ã¯ ';
$lang['Go to'] = '移動 ';
@@ -890,4 +888,20 @@ $lang['Duplicate selected tags'] = 'é¸æŠžã—ãŸã‚¿ã‚°ã‚’複製ã—ã¾ã™';
$lang['Apply watermark if height is bigger than'] = 'ã“れ以上ã®é«˜ã•ã®éš›ã«ã‚¦ã‚©ãƒ¼ã‚¿ãƒ¼ãƒžãƒ¼ã‚¯ã‚’付ã‘ã‚‹';
$lang['Apply watermark if width is bigger than'] = 'ã“れ以上ã®å¹…ã®éš›ã«ã‚¦ã‚©ãƒ¼ã‚¿ãƒ¼ãƒžãƒ¼ã‚¯ã‚’付ã‘ã‚‹';
$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Photoshop Lightroomã¯ã€å¤§é‡ã®ãƒ‡ã‚¸ã‚¿ãƒ«ç”»åƒã®ç®¡ç†ã¨ã€æ’®å½±å¾Œã®ä»•äº‹ã®ãŸã‚ã«è¨­è¨ˆã•ã‚Œã¦å†™çœŸç”¨ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã§ã™ã€‚';
+$lang['Permission granted for groups'] = 'グループ権é™';
+$lang['Panorama'] = 'パノラマ';
+$lang['Number of albums per page'] = '1ページ当りã®ã‚¢ãƒ«ãƒãƒ æ•°';
+$lang['Please select at least two groups'] = 'グループを2ã¤ä»¥ä¸Šé¸ã‚“ã§ä¸‹ã•ã„。';
+$lang['Permission granted for users'] = 'ユーザー権é™';
+$lang['Basic settings'] = '基本設定';
+$lang['General'] = '全般';
+$lang['Ratio'] = 'ートレート\'比率';
+$lang['Portrait'] = 'ãƒãƒ¼ãƒˆãƒ¬ãƒ¼ãƒˆ';
+$lang['Purge user cache'] = 'ユーザーã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’削除';
+$lang['Photo sizes with crop'] = '写真サイズ';
+$lang['Mail theme'] = 'メールã®ä»¶å';
+$lang['Numeric identifier : %d'] = '割り当ã¦ã‚‹æ•°å€¤ : æ•´æ•° : %d';
+$lang['Loading...'] = 'ロード中 ...';
+$lang['Change password'] = 'パスワードを変ãˆã‚‹';
+$lang['Change username'] = 'ユーザーåを変ãˆã‚‹';
?> \ No newline at end of file
diff --git a/language/ja_JP/common.lang.php b/language/ja_JP/common.lang.php
index b2e6ed632..4f5c97e59 100644
--- a/language/ja_JP/common.lang.php
+++ b/language/ja_JP/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: 日本語 [JP]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=425
Author: Piwigo team
Author URI: http://piwigo.org
@@ -196,10 +196,6 @@ $lang['last %d days'] = 'ç›´è¿‘ %d æ—¥';
$lang['Last'] = '最後ã¸';
$lang['Logout'] = 'ログアウト';
$lang['obligatory'] = 'å¿…é ˆ';
-$lang['Maximum photo height'] = '写真ã®æœ€å¤§é«˜';
-$lang['Maximum height must be a number superior to 50'] = '最大高ã¯ã€50以上ã«è¨­å®šã—ã¦ãã ã•ã„。';
-$lang['Maximum photo width'] = '写真ã®æœ€å¤§å¹…';
-$lang['Maximum width must be a number superior to 50'] = '最大幅ã¯ã€50以上ã«è¨­å®šã—ã¦ãã ã•ã„。';
$lang['display a calendar by creation date'] = '作æˆæ—¥ã®ã‚«ãƒ¬ãƒ³ãƒ€ãƒ¼ã‚’表示ã™ã‚‹';
$lang['display all photos in all sub-albums'] = 'ã™ã¹ã¦ã®ã‚µãƒ–カテゴリã®ã‚¨ãƒ¬ãƒ¡ãƒ³ãƒˆè¡¨ç¤ºã™ã‚‹';
$lang['return to normal view mode'] = 'ノーマルビューモードã«æˆ»ã‚‹';
@@ -246,7 +242,6 @@ $lang['login mustn\'t end with a space character'] = 'ユーザIDã®æœ«å°¾ã«ã‚¹
$lang['login mustn\'t start with a space character'] = 'ユーザIDã®æœ€åˆã«ã‚¹ãƒšãƒ¼ã‚¹ã‚’使用ã—ãªã„ã§ãã ã•ã„。';
$lang['this login is already used'] = 'ã“ã®ãƒ¦ãƒ¼ã‚¶IDã¯ã€ã™ã§ã«ä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã™ã€‚';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'メールアドレスã¯ã€xxx@yyy.eee ã®ã‚ˆã†ãªãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚’使用ã—ã¦ãã ã•ã„ (例 : jack@altern.org)。';
-$lang['please enter your password again'] = 'ã‚ãªãŸã®ãƒ‘スワードをå†åº¦å…¥åŠ›ã—ã¦ãã ã•ã„。';
$lang['Auto login'] = '自動ログイン';
$lang['remove this tag from the list'] = 'ã“ã®ã‚¿ã‚°ã‚’リストã‹ã‚‰å‰Šé™¤ã™ã‚‹';
$lang['representative'] = '見本';
@@ -274,7 +269,6 @@ $lang['SQL queries in'] = 'SQLクエリー:';
$lang['display only recently posted photos'] = '最近投稿ã•ã‚ŒãŸã‚¤ãƒ¡ãƒ¼ã‚¸ã®ã¿è¡¨ç¤ºã™ã‚‹';
$lang['return to the display of all photos'] = 'ã™ã¹ã¦ã®ã‚¤ãƒ¡ãƒ¼ã‚¸è¡¨ç¤ºã«æˆ»ã‚‹';
$lang['the beginning'] = '最åˆ';
-$lang['Interface theme'] = 'インターフェーステーマ';
$lang['Thumbnails'] = 'サムãƒã‚¤ãƒ«';
$lang['Menu'] = 'メニュー';
$lang['A comment on your site'] = 'ã‚ãªãŸã®ã‚µã‚¤ãƒˆã®ã‚³ãƒ¡ãƒ³ãƒˆ';
@@ -411,4 +405,17 @@ $lang['Permalink for album not found'] = 'ã“ã®ã‚¨ãƒ³ãƒˆãƒªãƒ¼ã®ã‚¢ãƒ«ãƒãƒ ã
$lang['Piwigo encountered a non recoverable error'] = 'Piwigoã¯ã€å›žå¾©ä¸èƒ½ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ';
$lang['Requested album does not exist'] = 'è¦æ±‚ã•ã‚ŒãŸã‚¢ãƒ«ãƒãƒ ã¯å­˜åœ¨ã—ã¾ã›ã‚“。';
$lang['Requested tag does not exist'] = 'è¦æ±‚ã•ã‚ŒãŸã‚¿ã‚°ã¯å­˜åœ¨ã—ã¾ã›ã‚“。';
+$lang['Email address is mandatory'] = 'é›»å­ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯å¿…é ˆã§ã™';
+$lang['Username is mandatory'] = 'ユーザーåã¯å¿…é ˆã§ã™';
+$lang['Website'] = 'ウェブサイト';
+$lang['Your website URL is invalid'] = 'ã‚ãªãŸã®ã‚¦ã‚§ãƒ–サイトã®URLãŒç„¡åŠ¹ã§ã™';
+$lang['mandatory'] = 'å¿…é ˆ';
+$lang['Email'] = 'メールアドレス';
+$lang['First Page'] = 'åˆã‚ã®ãƒšãƒ¼ã‚¸';
+$lang['Go back to the album'] = 'アルãƒãƒ ã«æˆ»ã‚‹';
+$lang['Last Page'] = '最後ã®ãƒšãƒ¼ã‚¸';
+$lang['Password is missing. Please enter the password.'] = 'パスワードãŒã‚ã‚Šã¾ã›ã‚“。パスワードを入力ã—ã¦ä¸‹ã•ã„。';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'パスワードã®å†ç¢ºèªãŒã‚ã‚Šã¾ã›ã‚“。パスワードã®å†ç¢ºèªã‚’確èªã—ã¦ä¸‹ã•ã„。';
+$lang['%d photos per page'] = '%d ページ当りã®å†™çœŸã®æ•°';
+$lang['Theme'] = '件å';
?> \ No newline at end of file
diff --git a/language/ja_JP/index.php b/language/ja_JP/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/ja_JP/index.php
+++ b/language/ja_JP/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/ja_JP/install.lang.php b/language/ja_JP/install.lang.php
index 84aabf519..2fa0d8569 100644
--- a/language/ja_JP/install.lang.php
+++ b/language/ja_JP/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -27,19 +27,12 @@ $lang['Default gallery language'] = 'ギャラリーã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®è¨€èªž'
$lang['Database configuration'] = 'データベース設定';
$lang['Admin configuration'] = '管ç†è¨­å®š';
$lang['Start Install'] = 'インストールを開始ã™ã‚‹';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'メールアドレスã¯ã€ xxx@yyy.eee ã®ã‚ˆã†ãªå½¢å¼ã«ã—ã¦ãã ã•ã„ (例: jack@altern.org)。';
-
-$lang['Webmaster login'] = 'ウェブマスタログイン';
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'ゲスト一覧ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ウェブサイト管ç†ã«å¿…è¦ã§ã™ã€‚';
-
$lang['Connection to server succeed, but it was impossible to connect to database'] = 'サーãƒã¸æŽ¥ç¶šã™ã‚‹ã“ã¨ãŒã§ãã¾ã—ãŸãŒã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«æŽ¥ç¶šã§ãã¾ã›ã‚“。';
$lang['Can\'t connect to server'] = 'サーãƒã«æŽ¥ç¶šã§ãã¾ã›ã‚“。';
-
$lang['Host'] = 'ホスト';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = '例) localhostã€sql.multimania.comã€toto.freesurf.fr';
$lang['User'] = 'ユーザー';
$lang['user login given by your host provider'] = 'ã‚ãªãŸã®ãƒ›ã‚¹ãƒ†ã‚£ãƒ³ã‚°æ¥­è€…ã‹ã‚‰æä¾›ã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãƒ¦ãƒ¼ã‚¶åã§ã™ã€‚';
-$lang['Password'] = 'パスワード';
$lang['user password given by your host provider'] = 'ã‚ãªãŸã®ãƒ›ã‚¹ãƒ†ã‚£ãƒ³ã‚°æ¥­è€…ã‹ã‚‰æä¾›ã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãƒ‘スワードã§ã™ã€‚';
$lang['Database name'] = 'データベースå';
$lang['also given by your host provider'] = 'ã“ã¡ã‚‰ã‚‚ã€ã‚ãªãŸã®ãƒ›ã‚¹ãƒ†ã‚£ãƒ³ã‚°æ¥­è€…ã‹ã‚‰æä¾›ã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹åã§ã™ã€‚';
@@ -48,12 +41,10 @@ $lang['database tables names will be prefixed with it (enables you to manage bet
$lang['enter a login for webmaster'] = 'ウェブマスタã®ãƒ¦ãƒ¼ã‚¶IDを入力ã—ã¦ãã ã•ã„。';
$lang['webmaster login can\'t contain characters \' or "'] = 'ウェブマスタã®ãƒ¦ãƒ¼ã‚¶IDã«ã¯ã€ã€Œ\'ã€ã¾ãŸã¯ã€Œ"ã€ã‚’å«ã¾ãªã„ã§ãã ã•ã„。';
$lang['please enter your password again'] = 'ã‚‚ã†ä¸€åº¦ã‚ãªãŸã®ãƒ‘スワードを入力ã—ã¦ãã ã•ã„。';
-$lang['Webmaster password'] = 'ウェブマスタパスワード';
$lang['Keep it confidential, it enables you to access administration panel'] = 'ウェブマスタパスワードã¯ã€ç§˜å¯†ã«ã—ã¦ãã ã•ã„。ウェブマスタパスワードを使用ã—ã¦ã€ç®¡ç†ãƒ‘ãƒãƒ«ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™ã€‚';
$lang['Password [confirm]'] = 'パスワード [ã‚‚ã†ä¸€åº¦]';
$lang['verification'] = '確èª';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'ヘルプãŒå¿…è¦ã§ã™ã‹? <a href="%s">Piwigoメッセージボード</a>ã«ã¦ã€ã‚ãªãŸã®è³ªå•ã‚’投稿ã—ã¦ãã ã•ã„。';
-$lang['Webmaster mail address'] = 'ウェブマスタメールアドレス';
$lang['Visitors will be able to contact site administrator with this mail'] = 'ゲストã¯ã€ã“ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã‚µã‚¤ãƒˆç®¡ç†è€…ã«é€£çµ¡ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚';
$lang['PHP 5 is required'] = 'PHP 5ãŒå¿…è¦ã§ã™';
$lang['It appears your webhost is currently running PHP %s.'] = 'ã‚ãªãŸã®ã‚¦ã‚§ãƒ–ホストã¯ç¾åœ¨PHP %sを使ã£ã¦ã„ã¾ã™ã€‚';
diff --git a/language/ja_JP/upgrade.lang.php b/language/ja_JP/upgrade.lang.php
index ed2d01a33..63b898432 100644
--- a/language/ja_JP/upgrade.lang.php
+++ b/language/ja_JP/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/ka_GE/admin.lang.php b/language/ka_GE/admin.lang.php
index 0295816e5..7710c725f 100644
--- a/language/ka_GE/admin.lang.php
+++ b/language/ka_GE/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -224,7 +224,7 @@ $lang['Prepared time for list of users to send mail is limited. Others users are
$lang['Time to send mail is limited. Others mails are skipped.'] = 'ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒ¡ დრრშეზღუდულიáƒ. სხვრწერილები გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბულიáƒ.';
$lang['To send ?'] = 'გáƒáƒ•áƒ’ზáƒáƒ•áƒœáƒáƒ—?';
$lang['Last send'] = 'ბáƒáƒšáƒ გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒšáƒ”ბი';
-$lang['email'] = 'email';
+$lang['Email'] = 'email';
$lang['User'] = 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი';
$lang['See you soon,'] = 'ნáƒáƒ®áƒ•áƒáƒ›áƒ“ის,';
$lang['Go to'] = 'გáƒáƒ“áƒáƒ•áƒ˜áƒ“ეთ ';
diff --git a/language/ka_GE/common.lang.php b/language/ka_GE/common.lang.php
index 4e2b7a1d5..48841d526 100644
--- a/language/ka_GE/common.lang.php
+++ b/language/ka_GE/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: ქáƒáƒ áƒ—ული [GE]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=426
Author: Piwigo team
Author URI: http://piwigo.org
@@ -248,7 +248,6 @@ $lang['login mustn\'t end with a space character'] = 'სáƒáƒ®áƒ”ლი(ლáƒá
$lang['login mustn\'t start with a space character'] = 'სáƒáƒ®áƒ”ლი(ლáƒáƒ’ინი) áƒáƒ  უნდრიწყებáƒáƒ“ეს ცáƒáƒ áƒ˜áƒ”ლი áƒáƒ“გილით(პრáƒáƒ‘ელით)';
$lang['this login is already used'] = 'ეს სáƒáƒ®áƒ”ლი(ლáƒáƒ’ინი) უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'ელ.ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი უნდრგáƒáƒ›áƒáƒ˜áƒ§áƒ£áƒ áƒ”ბáƒáƒ“ეს ესე xxx@yyy.eee (მáƒáƒ’áƒáƒšáƒ˜áƒ—áƒáƒ“: jack@altern.org)';
-$lang['please enter your password again'] = 'პáƒáƒ áƒáƒšáƒ˜ კიდევ ერთხელ';
$lang['Auto login'] = 'დáƒáƒ›áƒ˜áƒ›áƒáƒ®áƒ¡áƒáƒ•áƒ áƒ”';
$lang['remove this tag from the list'] = 'გáƒáƒ“áƒáƒ•áƒáƒ’დáƒáƒ— ეს ტეგი სიიდáƒáƒœ';
$lang['representative'] = 'წáƒáƒ áƒ›áƒáƒ›áƒáƒ“გენელი';
@@ -277,7 +276,6 @@ $lang['SQL queries in'] = 'SQL-მáƒáƒ—ხáƒáƒ•áƒœáƒ';
$lang['display only recently posted photos'] = ' ვნáƒáƒ®áƒáƒ— მხáƒáƒšáƒáƒ“ áƒáƒ®áƒšáƒáƒ®áƒáƒœáƒ¡ გáƒáƒ›áƒáƒ¥áƒ•áƒ”ყნებული ფáƒáƒ¢áƒáƒ”ბი';
$lang['return to the display of all photos'] = 'ყველრფáƒáƒ¢áƒáƒ¡ ნáƒáƒ®áƒ•áƒáƒ¡áƒ—áƒáƒœ დáƒáƒ‘რუნებáƒ';
$lang['the beginning'] = 'თáƒáƒ•áƒ˜áƒ“áƒáƒœ';
-$lang['Interface theme'] = 'გáƒáƒ¤áƒáƒ áƒ›áƒ”ბáƒ';
$lang['Thumbnails'] = 'მინიáƒáƒ¢áƒ£áƒ áƒ”ბი';
$lang['Menu'] = 'მენიუ';
$lang['A comment on your site'] = 'კáƒáƒ›áƒ”ნტáƒáƒ áƒ”ბი თქვენი სáƒáƒ˜áƒ¢áƒ˜áƒ“áƒáƒœ';
@@ -418,4 +416,6 @@ $lang['thumb'] = 'ხáƒáƒ¢áƒ£áƒšáƒ';
$lang['xlarge'] = 'XL -ძáƒáƒšáƒ˜áƒáƒœ დიდი';
$lang['xsmall'] = 'XS - ძáƒáƒšáƒ˜áƒáƒœ პáƒáƒ¢áƒáƒ áƒ';
$lang['xxlarge'] = 'XXL - უდიდესი';
+$lang['Password is missing. Please enter the password.'] = 'პáƒáƒ áƒáƒšáƒ˜ áƒáƒ áƒ სწáƒáƒ áƒ˜áƒ. გთხáƒáƒ•áƒ— გáƒáƒ˜áƒ›áƒ”áƒáƒ áƒáƒ—.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'პáƒáƒ áƒáƒšáƒ˜áƒ¡ დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბრáƒáƒ  áƒáƒ áƒ˜áƒ¡. გთხáƒáƒ•áƒ— დáƒáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”თ áƒáƒ áƒ©áƒ”ული პáƒáƒ áƒáƒšáƒ˜.';
?> \ No newline at end of file
diff --git a/language/ka_GE/index.php b/language/ka_GE/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/ka_GE/index.php
+++ b/language/ka_GE/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/ka_GE/install.lang.php b/language/ka_GE/install.lang.php
index 3191ee095..6d956ee28 100644
--- a/language/ka_GE/install.lang.php
+++ b/language/ka_GE/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -27,19 +27,12 @@ $lang['Default gallery language'] = 'პრიáƒáƒ áƒ˜áƒ¢áƒ”ტული ენ
$lang['Database configuration'] = 'მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის გáƒáƒ¡áƒ¬áƒáƒ áƒ”ბáƒ';
$lang['Admin configuration'] = 'áƒáƒ“მინისტრირების გáƒáƒ¡áƒ¬áƒáƒ áƒ”ბáƒ';
$lang['Start Install'] = 'დáƒáƒ•áƒ˜áƒ¬áƒ§áƒáƒ— დáƒáƒ§áƒ”ნებáƒ';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'ელ.ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი უნდრგáƒáƒ•áƒ“ეს xxx@yyy.eee (მáƒáƒ’áƒáƒšáƒ˜áƒ—áƒáƒ“: jack@altern.org)';
-
-$lang['Webmaster login'] = 'ვებმáƒáƒ¡áƒ¢áƒ”რის სáƒáƒ®áƒ”ლი(ლáƒáƒ’ინი)';
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'მáƒáƒ¡ დáƒáƒ˜áƒœáƒáƒ®áƒáƒ•áƒ”ნ მნáƒáƒ®áƒ•áƒ”ლები.სáƒáƒ­áƒ˜áƒ áƒáƒ სáƒáƒ˜áƒ¢áƒ˜áƒ¡ áƒáƒ“მინისტრირებისáƒáƒ—ვის';
-
$lang['Connection to server succeed, but it was impossible to connect to database'] = 'წáƒáƒ áƒ›áƒáƒ¢áƒ”ბით დáƒáƒ£áƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ“ით სერვერს,მáƒáƒ’რáƒáƒ› მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბრშეუძლებელიáƒ';
$lang['Can\'t connect to server'] = 'შეუძლებელირსერვერთáƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბáƒ';
-
$lang['Host'] = 'MySQL ხáƒáƒ¡áƒ¢áƒ˜';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
$lang['User'] = 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი';
$lang['user login given by your host provider'] = 'სáƒáƒ®áƒ”ლი(ლáƒáƒ’ინი),რáƒáƒ›áƒ”ლიც პრáƒáƒ•áƒáƒ˜áƒ“ერმრმáƒáƒ’ცáƒáƒ—';
-$lang['Password'] = 'პáƒáƒ áƒáƒšáƒ˜';
$lang['user password given by your host provider'] = 'პáƒáƒ áƒáƒšáƒ˜,რáƒáƒ›áƒ”ლიც პრáƒáƒ•áƒáƒ˜áƒ“ერმრმáƒáƒ’ცáƒáƒ—';
$lang['Database name'] = 'მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სáƒáƒ®áƒ”ლი';
$lang['also given by your host provider'] = 'áƒáƒ¡áƒ”ვე გáƒáƒ˜áƒªáƒ”მრპრáƒáƒ•áƒáƒ˜áƒ“ერის მიერ.ხშირáƒáƒ“ ემთხვევრსáƒáƒ®áƒ”ლს(ლáƒáƒ’ინს)';
@@ -48,14 +41,11 @@ $lang['database tables names will be prefixed with it (enables you to manage bet
$lang['enter a login for webmaster'] = 'სáƒáƒ­áƒ˜áƒ áƒáƒ შეიყვáƒáƒœáƒáƒ— ლáƒáƒ’ინი ვებმáƒáƒ¡áƒ¢áƒ”რისáƒáƒ—ვის';
$lang['webmaster login can\'t contain characters \' or "'] = 'ლáƒáƒ’ინი ვებმáƒáƒ¡áƒ¢áƒ”რისáƒáƒ—ვის áƒáƒ  უნდრშეიცáƒáƒ•áƒ“ეს სიმბáƒáƒšáƒáƒ”ბს \' áƒáƒœ "';
$lang['please enter your password again'] = 'პáƒáƒ áƒáƒšáƒ˜ კიდევ ერთხელ';
-$lang['Webmaster password'] = 'ვებმáƒáƒ¡áƒ¢áƒ”რის პáƒáƒ áƒ˜áƒšáƒ';
$lang['Keep it confidential, it enables you to access administration panel'] = 'áƒáƒ  გáƒáƒ£áƒ›áƒ®áƒ˜áƒšáƒáƒ— áƒáƒ áƒáƒ•áƒ˜áƒ¡,იგი სáƒáƒ­áƒ˜áƒ áƒáƒ áƒáƒ“მინისტრირების პáƒáƒœáƒ”ლთáƒáƒœ დáƒáƒ¡áƒáƒ¨áƒ•áƒ”ბáƒáƒ“';
$lang['Password [confirm]'] = 'გáƒáƒ˜áƒ›áƒ”áƒáƒ áƒ”თ პáƒáƒ áƒáƒšáƒ˜';
$lang['verification'] = 'კიდევ ერთხელ,შეცდáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ áƒ˜áƒªáƒ®áƒáƒ“';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'გჭირდებáƒáƒ— დáƒáƒ®áƒ›áƒáƒ áƒ”ბáƒ?დáƒáƒ¡áƒ•áƒ˜áƒ— შეკითხვები <a href="%s">Piwigo–ს ფáƒáƒ áƒ£áƒ›áƒ–ე</a>.';
-$lang['Webmaster mail address'] = 'ვებმáƒáƒ¡áƒ¢áƒ”რის ელ.ფáƒáƒ¡áƒ¢áƒ';
$lang['Visitors will be able to contact site administrator with this mail'] = 'გáƒáƒ›áƒáƒ§áƒ”ნებული იქნებრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების მიერ áƒáƒ“მინისტრáƒáƒ¢áƒáƒ áƒ—áƒáƒœ კáƒáƒ•áƒ¨áƒ˜áƒ áƒ˜áƒ¡áƒáƒ—ვის';
-
$lang['PHP 5 is required'] = 'სáƒáƒ­áƒ˜áƒ áƒáƒ PHP 5';
$lang['It appears your webhost is currently running PHP %s.'] = 'სáƒáƒ•áƒáƒ áƒáƒ£áƒ“áƒáƒ“ თქვენი ხáƒáƒ¡áƒ¢áƒ˜áƒœáƒ’ი áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ იყენებს PHP %s.';
$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo–ს შეუძლირშეეცáƒáƒ“áƒáƒ¡ გáƒáƒ“áƒáƒ áƒ—áƒáƒ¡ თქვენი კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ PHP 5, .htaccess ფáƒáƒ˜áƒšáƒ¡ შექმნით áƒáƒœ შეცვლით.';
diff --git a/language/ka_GE/upgrade.lang.php b/language/ka_GE/upgrade.lang.php
index 42012a477..41aab4c1a 100644
--- a/language/ka_GE/upgrade.lang.php
+++ b/language/ka_GE/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/km_KH/admin.lang.php b/language/km_KH/admin.lang.php
index fc62559d2..adeef55bb 100644
--- a/language/km_KH/admin.lang.php
+++ b/language/km_KH/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/km_KH/common.lang.php b/language/km_KH/common.lang.php
index 33bb80883..64020ffb0 100644
--- a/language/km_KH/common.lang.php
+++ b/language/km_KH/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: ភាសាážáŸ’មែរ [KH]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=579
Author: Piwigo team
Author URI: http://piwigo.org
@@ -246,7 +246,6 @@ $lang['login mustn\'t end with a space character'] = 'ការ​ភ្ជាáž
$lang['login mustn\'t start with a space character'] = 'ការ​ភ្ជាប់​ចូល​ážáŸ’រូវ​ážáŸ‚​ មិន​ចាប់​ផ្ážáž¾áž˜â€‹áž‡áž¶áž˜áž½áž™â€‹ážŠáž€â€‹ážƒáŸ’លា​';
$lang['this login is already used'] = 'ការ​ភ្ជាប់​ចូល​ជាមួយ​ឈ្មោះ​នáŸáŸ‡â€‹ បាន​ប្រើ​ប្រាស់​រួច​ហើយ';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'អាសáŸáž™ážŠáŸ’ឋាន​សារ​អáŸáž¡áž·áž…​ážáŸ’រូនិច​ážáŸ’រូវ​ážáŸ‚​ក្នុង​ទំ​រង់​ xxx@yyy.eee (example : jack@altern.org)';
-$lang['please enter your password again'] = 'សូម​បញ្ចូល​អក្សរ​សម្ងាážáŸ‹â€‹ážšáž”ស់​អ្នក​ម្ážáž„​ទៀážâ€‹';
$lang['Auto login'] = 'ភ្ជាប់​ចូល​ដោយ​ស្វáŸáž™â€‹áž”្រវážáŸ’ážáž·';
$lang['remove this tag from the list'] = 'លុបស្លាក​នáŸáŸ‡â€‹áž…áŸáž‰â€‹áž–ី​ážáž¶ážšáž¶áž„​';
$lang['representative'] = 'រូប​ជា​គំរប​នៃ​សៀវ​ភៅ​រូប​ážážâ€‹';
@@ -274,7 +273,6 @@ $lang['SQL queries in'] = 'SQL queries ក្នុង​';
$lang['display only recently posted photos'] = 'បង្ហាញ​ážáŸ‚​រូប​ážážâ€‹ážŠáŸ‚ល​ទើប​បាន​ប្រកាស​ážáŸ’មី​ៗ';
$lang['return to the display of all photos'] = 'ážáŸ’រឡប់​ទៅ​បង្ហាញ​រូប​ážážâ€‹áž‘ាំង​អស់​';
$lang['the beginning'] = 'ចាប់​ផ្ážáž¾áž˜â€‹ážŠáŸ†áž”ូង​';
-$lang['Interface theme'] = 'រូប​រាង​ផ្ទៃសំរាប់​​បង្ហាញ​';
$lang['Thumbnails'] = 'រូប​គំរប​ផ្ទៃ​លើ​';
$lang['Menu'] = 'មីនុយ​';
$lang['A comment on your site'] = 'មážáž·â€‹áž˜áž½áž™â€‹áž“ៅ​លើ​ប្រពáŸáž“្ធ​របស់​អ្នក​';
diff --git a/language/km_KH/index.php b/language/km_KH/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/km_KH/index.php
+++ b/language/km_KH/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/kn_IN/about.html b/language/kn_IN/about.html
new file mode 100644
index 000000000..319fbc1ec
--- /dev/null
+++ b/language/kn_IN/about.html
@@ -0,0 +1,5 @@
+<p>ಈ ಚಿತà³à²°à²¶à²¾à²²à³† (ಗà³à²¯à²¾à²²à²°à²¿) Piwigo ದಿಂದ ರಚನೆಯಾಗಿದೆ</p>
+
+<p>Piwigo ಒಂದೠಅಂತರà³à²œà²¾à²²à²¦ ಚಿತà³à²°à²¶à²¾à²²à³† (ಗà³à²¯à²¾à²²à²°à²¿) ತಂತà³à²°à²¾à²‚ಶವಾಗಿದà³à²¦à³, ಆಸಕà³à²¤ , ಕà³à²°à²¿à²¯à²¾à²¶à³€à²² ತಂತà³à²°à²œà³à²žà²°à³ ಹಾಗೂ ಬಳಕೆದಾರರ ಗà³à²‚ಪಿನಿಂದ ಬೆಂಬಲಿತವಾಗಿದೆ. ವಿಸà³à²¤à²°à²£à²¿à²•à³†à²—ಳ (Extensions) ಮೂಲಕ ಈ ತಂತà³à²°à²¾à²‚ಶವನà³à²¨à³ ಬಹಳ ಸà³à²²à²­à²µà²¾à²—ಿ ಗà³à²°à²¾à²¹à²•à²¸à³à²¨à³‡à²¹à²¿à²¯à²¾à²—ಿ ಮಾಡಬಹà³à²¦à²¾à²—ಿದೆ. ಎಲà³à²²à²•à³à²•à²¿à²‚ತ ಹೆಚà³à²šà²¾à²—ಿ Piwigo ಉಚಿತ ಹಾಗೂ ಓಪನೠಸೋರà³à²¸à³ ತಂತà³à²°à²¾à²‚ಶವಾಗಿದೆ.</p>
+
+<p id="linkToPiwigo"><a href="http://piwigo.org">Piwigo ಜಾಲತಾಣಕà³à²•à³† ಭೇಟಿ ಕೊಡಿ</a></p> \ No newline at end of file
diff --git a/language/kn_IN/admin.lang.php b/language/kn_IN/admin.lang.php
new file mode 100755
index 000000000..c338a50d3
--- /dev/null
+++ b/language/kn_IN/admin.lang.php
@@ -0,0 +1,264 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Manage the members'] = 'ಸದಸà³à²¯à²°à²¨à³à²¨à³ ನಿರà³à²µà²¹à²¿à²¸à²¿';
+$lang['Manage this set of %d photos'] = ' ಈ %d ಚಿತà³à²°à²—ಳ ಕಟà³à²Ÿà²¨à³à²¨à³ ನಿರà³à²µà²¹à²¿à²¸à²¿';
+$lang['Maximum file size: %sB.'] = 'ಗರಿಷà³à²  ಕಡತದ ಗಾತà³à²° : %sB.';
+$lang['Maximum height'] = 'ಗರಿಷà³à²  ಎತà³à²¤à²°';
+$lang['Maximum width'] = 'ಗರಿಷà³à²  ಅಗಲ';
+$lang['Members'] = 'ಸದಸà³à²¯à²°à³';
+$lang['Menu Management'] = 'ಆಯà³à²•à³†à²ªà²Ÿà³à²Ÿà²¿à²—ಳà³';
+$lang['Merge selected groups'] = 'ಆರಿಸಿದ ಗà³à²‚ಪà³à²—ಳನà³à²¨à³ ನಿರà³à²µà²¹à²¿à²¸à²¿';
+$lang['Maintenance'] = 'ನಿರà³à²µà²¹à²£à³†';
+$lang['Make this language available to users'] = 'ಈ ಭಾಷೆಯನà³à²¨à³ ಎಲà³à²²à²¾ ಬಳಕೆದಾರರಿಗೆ ಲಭà³à²¯à²µà²¿à²°à³à²µà²‚ತೆ ಮಾಡà³';
+$lang['Make this theme available to users'] = 'ಈ ಥೀಮೠಅನà³à²¨à³ ಎಲà³à²²à²¾ ಬಳಕೆದಾರರಿಗೆ ಲಭà³à²¯à²µà²¿à²°à³à²µà²‚ತೆ ಮಾಡà³';
+$lang['Manage'] = 'ನಿರà³à²µà²¹à²¿à²¸à³';
+$lang['Manage Permissions'] = 'ಅನà³à²®à²¤à²¿à²—ಳನà³à²¨à³ ನಿರà³à²µà²¹à²¿à²¸à²¿';
+$lang['Manage permissions for group "%s"'] = '"%s" ಗà³à²‚ಪà³à²—ಳ ಅನà³à²®à²¤à²¿à²—ಳನà³à²¨à³ ನಿರà³à²µà²¹à²¿à²¸à²¿';
+$lang['Manage permissions for user "%s"'] = '"%s" ಬಳಕೆದಾರರ ಅನà³à²®à²¤à²¿à²—ಳನà³à²¨à³ ನಿರà³à²µà²¹à²¿à²¸à²¿';
+$lang['Manage photos'] = 'ಚಿತà³à²°à²—ಳನà³à²¨à³ ನಿರà³à²µà²¹à²¿à²¸à²¿';
+$lang['Manage tags'] = 'ಟà³à²¯à²¾à²—ೠಗಳನà³à²¨à³ ನಿರà³à²µà²¹à²¿à²¸à²¿';
+$lang['List'] = 'ಪಟà³à²Ÿà²¿';
+$lang['Local'] = 'ಸà³à²¥à²³à³€à²¯';
+$lang['Mail address is obligatory for all users'] = 'ಎಲà³à²²à²¾ ಬಳಕೆದಾರರಿಗೂ ಮಿಂಚೆ ವಿಳಾಸ ಖಡà³à²¡à²¾à²¯';
+$lang['Mail content'] = 'ಮಿಂಚೆ ವಸà³à²¤à³à²µà²¿à²·à²¯';
+$lang['Mail sent to %s [%s].'] = '%s [%s] ರವರಿಗೆ ಮಿಂಚೆ ಕಳà³à²¹à²¿à²¸à²²à²¾à²—ಿದೆ.';
+$lang['Main'] = 'ಪà³à²°à²®à³à²–';
+$lang['Main "guest" user does not exist'] = 'ಪà³à²°à²®à³à²– "ಅತಿಥಿ" ಬಳಕೆದಾರರೠಅಸà³à²¤à²¿à²¤à³à²µà²¦à²²à³à²²à²¿à²²à³à²²';
+$lang['Main "guest" user status is incorrect'] = 'ಪà³à²°à²®à³à²– "ಅತಿಥಿ" ಬಳಕೆದಾರರ ಸà³à²¥à²¿à²¤à²¿à²—ತಿ ಸರಿಯಾಗಿಲà³à²²';
+$lang['Main "webmaster" user does not exist'] = 'ಪà³à²°à²®à³à²– "ವೆಬೠಮಾಸà³à²Ÿà²°à³" ಬಳಕೆದಾರರೠಅಸà³à²¤à²¿à²¤à³à²µà²¦à²²à³à²²à²¿à²²à³à²²';
+$lang['Main "webmaster" user status is incorrect'] = 'ಪà³à²°à²®à³à²– "ವೆಬೠಮಾಸà³à²Ÿà²°à³" ಬಳಕೆದಾರರ ಸà³à²¥à²¿à²¤à²¿à²—ತಿ ಸರಿಯಾಗಿಲà³à²²';
+$lang['Main Page'] = 'ಮà³à²– ಪà³à²Ÿ';
+$lang['Language has been successfully installed'] = 'ಭಾಷೆಯನà³à²¨à³ ಯಶಸà³à²µà²¿à²¯à²¾à²—ಿ ಸà³à²¥à²¾à²ªà²¿à²¸à²²à²¾à²—ಿದೆ';
+$lang['Languages'] = 'ಭಾಷೆಗಳà³';
+$lang['Languages which need upgrade'] = 'ನವೀಕರಣದ ಅಗತà³à²¯à²µà²¿à²°à²µ ಭಾಷೆಗಳà³';
+$lang['Last import'] = 'ಕೊನೆಯ ಆಮದà³';
+$lang['Last revisions'] = 'ಕೊನೆಯ ಪರಿಷà³à²•à²°à²£à²—ಳà³';
+$lang['Last send'] = 'ಕೊನೆಯದಾಗಿ ಕಳà³à²¹à²¿à²¸à²¿à²¦à³à²¦à³';
+$lang['Learn more'] = 'ಹೆಚà³à²šà³ ತಿಳಿಯಿರಿ';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = 'ಸಂಪರà³à²•à²—ಳà³';
+$lang['Level 2'] = 'ಸà³à²¨à³‡à²¹à²¿à²¤à²°à³';
+$lang['Level 4'] = 'ಬಳಗ';
+$lang['Level 8'] = 'ನಿರà³à²µà²¹à²£à³†à²—ಾರರà³';
+$lang['Link all album photos to a new album'] = 'ಎಲà³à²²à²¾ ಸಂಪà³à²Ÿà²¦ ಚಿತà³à²°à²—ಳನà³à²¨à³ ಹೊಸ ಸಂಪà³à²Ÿà²•à³à²•à³† ಲಿಂಕೠಮಾಡಿ';
+$lang['Link all album photos to some existing albums'] = 'ಎಲà³à²²à²¾ ಸಂಪà³à²Ÿà²¦ ಚಿತà³à²°à²—ಳನà³à²¨à³ ಕೆಲವೠಅಸà³à²¤à²¿à²¤à³à²µà²¦à²²à³à²²à²¿à²°à³à²µ ಸಂಪà³à²Ÿà²—ಳಿಗೆ ಲಿಂಕೠಮಾಡಿ';
+$lang['Linked albums'] = 'ಲಿಂಕೠಆದ ಸಂಪà³à²Ÿà²—ಳೠ';
+$lang['Hoverbox display'] = 'ಹೋವರೠಬಾಕà³à²¸à³ ಪà³à²°à²¦à²°à³à²¶à²¨';
+$lang['If you encounter problems or have any question, please send a message to'] = 'ನೀವೠತೊಂದರೆಗಳನà³à²¨à³ ಎದà³à²°à²¿à²¸à³à²¤à³à²¤à²¿à²¦à³à²¦à²²à³à²²à²¿ ಅಥವಾ ನಿಮಗೆ ಯಾವà³à²¦à³‡ ಪà³à²°à²¶à³à²¨à³†à²—ಳಿದà³à²¦à²²à³à²²à²¿, ದಯವಿಟà³à²Ÿà³ ಅವರಿಗೆ ಸಂದೇಶವನà³à²¨à³ ಕಳà³à²¹à²¿à²¸à²¿';
+$lang['Inactive Languages'] = 'ನಿಷà³à²•à³à²°à²¿à²¯ ಭಾಷೆಗಳà³';
+$lang['Inactive Plugins'] = 'ನಿಷà³à²•à³à²°à²¿à²¯ ಪà³à²²à²—ೠಇನೠಗಳà³';
+$lang['Inactive Themes'] = 'ನಿಷà³à²•à³à²°à²¿à²¯ ಥೀಮೠಗಳà³';
+$lang['Graphics Library'] = 'ಚಿತà³à²°à²¿à²•à³† ಸಂಗà³à²°à²¹';
+$lang['I decide to update anyway'] = 'ನಾನೠಹೇಗಿದà³à²¦à²°à³‚ ನವೀಕರಣಕà³à²•à³† ಒಪà³à²ªà²¿à²¦à³à²¦à³‡à²¨à³†';
+$lang['IP'] = 'IP';
+$lang['Ignore All'] = 'ಎಲà³à²²à²¾à²µà²¨à³à²¨à³‚ ನಿರà³à²²à²•à³à²·à²¿à²¸à²¿';
+$lang['Ignore selected anomalies'] = 'ಆರಿಸಿದ ಅಸಮಂಜಸತೆಗಳನà³à²¨à³ ನಿರà³à²²à²•à³à²·à²¿à²¸à²¿';
+$lang['Ignore this update'] = 'ಈ ನವೀಕರಣವನà³à²¨à³ ನಿರà³à²²à²•à³à²·à²¿à²¸à²¿';
+$lang['Image Quality'] = 'ಚಿತà³à²°à²¦ ಗà³à²£';
+$lang['Image id'] = 'ಚಿತà³à²°à²¦ à²à²¡à²¿';
+$lang['Impossible automatic correction'] = 'ಸà³à²µà²¯à²‚ಚಾಲಿತ ತಿದà³à²¦à³à²ªà²¡à²¿ ಅಸಾಧà³à²¯';
+$lang['Group'] = 'ಗà³à²‚ಪà³';
+$lang['Group management'] = 'ಗà³à²‚ಪà³à²—ಳ ನಿರà³à²µà²¹à²£à³†';
+$lang['Group name'] = 'ಗà³à²‚ಪಿನ ಹೆಸರà³';
+$lang['Groups'] = 'ಗà³à²‚ಪà³à²—ಳà³';
+$lang['Groups and users'] = 'ಗà³à²‚ಪà³à²—ಳೠಮತà³à²¤à³ ಬಳಕೆದಾರರà³';
+$lang['Guest Settings'] = 'ಅತಿಥಿಗಳ ಸಂಯೋಜನೆ';
+$lang['Guest cannot be deleted'] = 'ಅತಿಥಿಗಳನà³à²¨à³ ಅಳಿಸಲಾಗà³à²µà³à²¦à²¿à²²à³à²²';
+$lang['Guests'] = 'ಅತಿಥಿಗಳà³';
+$lang['Height'] = 'ಎತà³à²¤à²°';
+$lang['Hello'] = 'ನಮಸà³à²¤à³†';
+$lang['Hello,'] = 'ನಮಸà³à²¤à³†,';
+$lang['Help Me'] = 'ನನಗೆ ಸಹಾಯಮಾಡಿ';
+$lang['Hide'] = 'ಬಚà³à²šà²¿à²¡à²¿';
+$lang['History'] = 'ಇತಿಹಾಸ';
+$lang['Hour'] = 'ಗಂಟೆ';
+$lang['Edit album permissions'] = 'ಸಂಪà³à²Ÿà²¦ ಅನà³à²®à²¤à²¿à²—ಳನà³à²¨à³ ಸಂಪಾದಿಸಿ';
+$lang['Edit photo'] = 'ಚಿತà³à²°à²µà²¨à³à²¨à³ ಸಂಪಾದಿಸಿ';
+$lang['Edit photo information'] = 'ಚಿತà³à²°à²¦ ಮಾಹಿತಿಯ';
+$lang['Edit ranks'] = 'ದರà³à²œà³†à²—ಳನà³à²¨à³ ಸಂಪಾದಿಸಿ';
+$lang['Edit selected tags'] = 'ಆರಿಸಿದ ಟà³à²¯à²¾à²—ೠಗಳನà³à²¨à³ ಸಂಪಾದಿಸಿ';
+$lang['Edit tags'] = 'ಟà³à²¯à²¾à²—ೠಗಳನà³à²¨à³ ಸಂಪಾದಿಸಿ';
+$lang['Error list'] = 'ಗಳ ಪಟà³à²Ÿà²¿';
+$lang['Error on file "%s" : %s'] = 'ಕಡತದ ಮೇಲಿನ ದೋಷ "%s" : %s';
+$lang['Error when sending email to %s [%s].'] = '%s [%s]ರಿಗೆ ಮಿಂಚೆ ಕಳà³à²¹à²¿à²¸à³à²µà²¾à²—ಿನ ದೋಷ. ';
+$lang['Everybody'] = 'ಎಲà³à²²à²¾à²°à³‚';
+$lang['Directory'] = 'ಡೈರೆಕà³à²Ÿà²°à²¿';
+$lang['Directory does not exist'] = 'ಡೈರೆಕà³à²Ÿà²°à²¿ ಅಸà³à²¤à²¿à²¤à³à²µà²¦à²²à³à²²à²¿à²²à³à²²';
+$lang['Display options'] = 'ಪà³à²°à²¦à²°à³à²¶à²¨à²¦ ಆಯà³à²•à³†à²—ಳà³';
+$lang['Do you want to activate anyway?'] = 'ನೀವೠಹೇಗಿದà³à²¦à²°à³‚ ಸಕà³à²°à²¿à²¯à²—ೊಳಿಸಲೠಬಯಸà³à²¤à³à²¤à³€à²°à²¾?';
+$lang['Documentation'] = 'ದಾಖಲಾತಿ';
+$lang['Does not represent'] = 'ಗೆ ಇದೠಕಿರà³à²šà²¿à²¤à³à²°à²µà²²à³à²²';
+$lang['Download,'] = 'ಇಳಿಸಿಕೊಳà³à²³à²¿,';
+$lang['Downloads'] = 'ವರà³à²—ಾವಣೆಗಳà³';
+$lang['Delete orphan tags'] = 'ಅನಾಥ ಟà³à²¯à²¾à²—ೠಗಳನà³à²¨à³ ಅಳಿಸಿ';
+$lang['Delete selected photos'] = 'ಆರಿಸಿದ ಚಿತà³à²°à²—ಳನà³à²¨à³ ಅಳಿಸಿ';
+$lang['Delete selected tags'] = ' ಟà³à²¯à²¾à²—ೠಗಳನà³à²¨à³ ಅಳಿಸಿ';
+$lang['Delete selected users'] = 'ಆರಿಸಿದ ಬಳಕೆದಾರರನà³à²¨à³ ಅಳಿಸಿ';
+$lang['Delete this language'] = 'ಈ ಭಾಷೆಯನà³à²¨à³ ಅಳಿಸಿ';
+$lang['Delete this theme'] = 'ಈ ಥೀಮೠಅನà³à²¨à³ ಅಳಿಸಿ';
+$lang['Deleted on'] = 'ರಂದೠಅಳಿಸಿದà³à²¦à³';
+$lang['Deletions'] = 'ಅಳಿಸà³à²µà²¿à²•à³†à²—ಳà³';
+$lang['Deny selected groups'] = 'ಆರಿಸಿದ ಗà³à²‚ಪà³à²—ಳನà³à²¨à³ ನಿರà³à²­à²‚ಧಿಸಿ';
+$lang['Deny selected users'] = 'ಆರಿಸಿದ ಬಳಕೆದಾರರನà³à²¨à³ ನಿರà³à²­à²‚ಧಿಸಿ';
+$lang['Description'] = 'ವಿವರಗಳà³';
+$lang['Detailed informations'] = 'ವಿವರವಾದ ಮಾಹಿತಿಗಳà³';
+$lang['Current name'] = 'ಪà³à²°à²¸à³à²¤à³à²¤ ಹೆಸರà³';
+$lang['Database'] = 'ಡೇಟಾಬೇಸà³';
+$lang['Date'] = 'ದಿನಾಂಕೆ';
+$lang['Day'] = 'ದಿನ';
+$lang['Deactivate'] = 'ನಿಷà³à²•à³à²°à²¿à²¯à²—ೊಳಿಸಿ';
+$lang['Deactivate all'] = 'ಎಲà³à²²à²µà²¨à³à²¨à³‚ ನಿಷà³à²•à³à²°à²¿à²¯à²—ೊಳಿಸಿ';
+$lang['Default comments order'] = 'ಪೂರà³à²µà²¨à²¿à²¯à³‹à²œà²¿à²¤ ಟಿಪà³à²ªà²£à²¿ ಕà³à²°à²®';
+$lang['Default display'] = 'ಪೂರà³à²µà²¨à²¿à²¯à³‹à²œà²¿à²¤ ಪà³à²°à²¦à²°à³à²¶à²¨';
+$lang['Default photos order'] = 'ಪೂರà³à²µà²¨à²¿à²¯à³‹à²œà²¿à²¤ ಚಿತà³à²°à²—ಳ ಕà³à²°à²®';
+$lang['Default user cannot be deleted'] = 'ಪೂರà³à²µà²¨à²¿à²¯à³‹à²œà²¿à²¤ ಬಳಕೆದಾರರನà³à²¨à³ ಅಳಿಸಲಾಗà³à²µà³à²¦à²¿à²²à³à²²';
+$lang['Default user does not exist'] = 'ಪೂರà³à²µà²¨à²¿à²¯à³‹à²œà²¿à²¤ ಬಳಕೆದಾರರೠಅಸà³à²¤à²¿à²¤à³à²µà²¦à²²à³à²²à²¿à²²à³à²²';
+$lang['Delete Representant'] = 'ಸಂಪà³à²Ÿà²¦ ಕಿರà³à²šà²¿à²¤à³à²°à²µà²¨à³à²¨à³ ಅಳಿಸಿ';
+$lang['Check for updates'] = 'ನವೀಕರಣಕಗಳಿಗಾಗಿ ಪರೀಕà³à²·à²¿à²¸à²¿';
+$lang['Check for upgrade'] = 'ನವೀಕರಣಕà³à²•à²¾à²—ಿ ಪರೀಕà³à²·à²¿à²¸à²¿';
+$lang['Check for upgrade failed for unknown reasons.'] = 'ಅನಾಮಿಕ ಕಾರಣಗಳಿಂದಾದ ನವೀಕರಣ ವಿಫಲತೆಯನà³à²¨à³ ಪರೀಕà³à²·à²¿à²¸à²¿.';
+$lang['Check integrity'] = 'ಸಮಗà³à²°à²¤à³†à²¯ ಪರೀಕà³à²·à³†';
+$lang['Choose an action'] = 'ಕà³à²°à²¿à²¯à³†à²¯à²¨à³à²¨à³ ಆರಿಸಿರಿ';
+$lang['Choose an option'] = 'ಆಯà³à²•à³†à²¯à²¨à³à²¨à³ ಆರಿಸಿರಿ';
+$lang['Comments for all'] = 'ಎಲà³à²²à²°à²¿à²—ಾಗಿ ಟಿಪà³à²ªà²£à²¿';
+$lang['Confirm merge'] = 'ಕೂಡಿಸà³à²µà²¿à²•à³†à²¯à²¨à³à²¨à³ ಖಾತà³à²°à²¿à²—ೊಳಿಸಿ';
+$lang['Correction'] = 'ತಿದà³à²¦à³à²ªà²¡à²¿';
+$lang['Correction applied with error'] = 'ತಿದà³à²¦à³à²ªà²¡à²¿à²¯à²¨à³à²¨à³ ದೋಷದೊಂದಿಗೆ ಅನà³à²µà²¯à²¿à²¸à²²à²¾à²—ಿದೆ';
+$lang['Correction applied with success'] = 'ತಿದà³à²¦à³à²ªà²¡à²¿à²¯à²¨à³à²¨à³ ಯಶಸà³à²µà²¿à²¯à²¾à²—ಿ ಅನà³à²µà²¯à²¿à²¸à²²à²¾à²—ಿದೆ';
+$lang['Create'] = 'ರಚಿಸಿ';
+$lang['Create this site'] = 'ಈ ಜಾಲತಾಣವನà³à²¨à³ ರಚಿಸಿ';
+$lang['Crop'] = 'ಮà³à²‚ಡನ';
+$lang['Apply action'] = 'ಕà³à²°à²¿à²¯à³†à²¯à²¨à³à²¨à³ ಅನà³à²µà²¯à²¿à²¸à²¿';
+$lang['Apply selected corrections'] = 'ಆರಿಸಿದ ತಿದà³à²¦à³à²ªà²¡à²¿à²—ಳನà³à²¨à³ ಅನà³à²µà²¯à²¿à²¸à²¿';
+$lang['Apply to sub-albums'] = 'ಉಪ-ಸಂಪà³à²Ÿà²—ಳಿಗೆ ಅನà³à²µà²¯à²¿à²¸à²¿';
+$lang['Apply watermark if height is bigger than'] = 'ಎತà³à²¤à²° ಗಿಂತ ಹೆಚà³à²šà²¿à²¦à³à²¦à²°à³† ನೀರà³à²•à²²à³†à²¯à²¨à³à²¨à³ ಅನà³à²µà²¯à²¿à²¸à²¿';
+$lang['Apply watermark if width is bigger than'] = 'ಅಗಲ ಗಿಂತ ಹೆಚà³à²šà²¿à²¦à³à²¦à²°à³† ನೀರà³à²•à²²à³†à²¯à²¨à³à²¨à³ ಅನà³à²µà²¯à²¿à²¸à²¿';
+$lang['Are you sure you want to delete this plugin?'] = 'ಈ ಪà³à²²à²—ೠಇನೠಅನà³à²¨à³ ಅಳಿಸà³à²µ ನಿಮà³à²® ಇಚà³à²›à³† ನಿಮಗೆ ಸಮà³à²®à²¤à²µà³‡?';
+$lang['Are you sure you want to install this plugin?'] = 'ಈ ಪà³à²²à²—ೠಇನೠಅನà³à²¨à³ ಸà³à²¥à²¾à²ªà²¿à²¸à³à²µ ನಿಮà³à²® ಇಚà³à²›à³† ನಿಮಗೆ ಸಮà³à²®à²¤à²µà³‡?';
+$lang['Associate to album'] = 'ಸಂಪà³à²Ÿà²•à³à²•à³† ಹೊಂದಿಸಿ';
+$lang['Associated'] = 'ಹೊಂದಿಸಿದà³à²¦à³';
+$lang['Authorized'] = 'ಅಧಿಕೃತ';
+$lang['Automatic correction'] = 'ಸà³à²µà²¯à²‚ಚಾಲಿತ ತಿದà³à²¦à³à²ªà²¡à²¿';
+$lang['Automatic sort order'] = 'ಸà³à²µà²¯à²‚ಚಾಲಿತ ಅನà³à²•à³à²°à²®à²£à²¿à²•à³† ಕà³à²°à²®';
+$lang['Available on'] = 'ನಲà³à²²à²¿ ಲಭà³à²¯à²µà²¿à²¦à³†';
+$lang['Available only with HTML format'] = 'HTML ನಮೂನೆಯಲà³à²²à²¿ ಮಾತà³à²° ';
+$lang['Available versions for'] = 'ಗೆ ಲಭà³à²¯à²µà²¿à²°à³à²µ ಆವೃತà³à²¤à²¿à²—ಳà³';
+$lang['Average rate'] = 'ಸಾಧಾರಣ ದರà³à²œà³†';
+$lang['Batch Manager'] = 'ಸಗಟೠನಿರà³à²µà²¾à²¹à²•';
+$lang['Active Languages'] = 'ಸಕà³à²°à²¿à²¯ ಭಾಷೆಗಳà³';
+$lang['Active Plugins'] = 'ಸಕà³à²°à²¿à²¯ ಪà³à²²à²—ೠಇನೠಗಳà³';
+$lang['Active Themes'] = 'ಸಕà³à²°à²¿à²¯ ಥೀಮೠಗಳà³';
+$lang['Add'] = 'ಸೇರಿಸಿ';
+$lang['Add New Language'] = 'ಹೊಸ ಭಾಷೆಯನà³à²¨à³ ಸೇರಿಸಿ';
+$lang['Add New Theme'] = 'ಹೊಸ ಥೀಮೠಅನà³à²¨à³ ಸೇರಿಸಿ';
+$lang['Add Photos'] = 'ಚಿತà³à²°à²—ಳನà³à²¨à³ ಸೇರಿಸಿ';
+$lang['Add a filter'] = 'ಶೋಧಕ ವನà³à²¨à³ ಸೇರಿಸಿ';
+$lang['Add a tag'] = 'ಟà³à²¯à²¾à²—ೠಅನà³à²¨à³ ಸೇರಿಸಿ';
+$lang['Add a user'] = 'ಬಳಕೆದಾರರನà³à²¨à³ ಸೇರಿಸಿ';
+$lang['Add group'] = 'ಗà³à²‚ಪನà³à²¨à³ ಸೇರಿಸಿ';
+$lang['Add tags'] = 'ಟà³à²¯à²¾à²—ೠಗಳನà³à²¨à³ ಸೇರಿಸಿ';
+$lang['Added by %s'] = '%s ರಿಂದ ಸೇರಿಸಿದà³à²¦à³';
+$lang['%d week'] = '%d ವಾರ';
+$lang['%d weeks'] = '%d ವಾರ';
+$lang['%d year'] = '%d ವರà³à²·';
+$lang['%d years'] = '%d ವರà³à²·à²—ಳà³';
+$lang['%s ago'] = '%s ರ ಹಿಂದೆ';
+$lang['%s has been successfully updated.'] = '%s ರನà³à²¨à³ ಯಶಸà³à²µà²¿à²¯à²¾à²—ಿ ನವೀಕರಿಸಲಾಗಿದೆ.';
+$lang['Used metadata'] = 'ಬಳಸಿದ ಮೆಟಾಡೇಟಾ';
+$lang['User'] = 'ಕೆದಾರ';
+$lang['User list'] = 'ಬಳಕೆದಾರರ ಪಟà³à²Ÿà²¿';
+$lang['User status'] = 'ಬಳಕೆದಾರರ ಸà³à²¥à²¿à²¤à²¿à²—ತಿ';
+$lang['Users'] = 'ಬಳಕೆದಾರರà³';
+$lang['Version'] = 'ಆವೃತà³à²¤à²¿';
+$lang['View in gallery'] = 'ಚಿತà³à²°à²¾à²‚ಗಣದಲà³à²²à²¿ ನೋಡಿ';
+$lang['Visit Gallery'] = 'ಚಿತà³à²°à²¾à²‚ಗಣಕà³à²•à³† ಭೇಟಿಕೊಡಿ';
+$lang['Visit Piwigo project website'] = 'ಪಿವಿಗೋ ಪà³à²°à²¾à²œà³†à²•à³à²Ÿà³ ಜಾಲತಾಣಕà³à²•à³† ಭೇಟಿಕೊಡಿ';
+$lang['Visit language site'] = 'ಭಾಷಾತಾಣಕà³à²•à³† ಭೇಟಿಕೊಡಿ';
+$lang['Visit plugin site'] = 'ಪà³à²²à²—ೠಇನೠ';
+$lang['Visit theme site'] = 'ಥೀಮೠತಾಣಕà³à²•à³† ಭೇಟಿಕೊಡಿ';
+$lang['Watermark'] = 'ನೀರà³à²•à²²à³†';
+$lang['Web Form'] = 'ಜಾಲತಾಣ ನಮೂನೆ';
+$lang['Webmaster cannot be deleted'] = 'ವೆಬೠಮಾಸà³à²Ÿà²°à³ ರನà³à²¨à³ ಅಳಿಸಲಾಗà³à²µà³à²¦à²¿à²²à³à²²';
+$lang['Webmaster status is required.'] = 'ವೆಬೠಮಾಸà³à²Ÿà²°à³ ರ ಸà³à²¥à²¿à²¤à²¿à²—ತಿ ಯ ಅಗತà³à²¯à²µà²¿à²¦à³†.';
+$lang['Week starts on'] = 'ವಾರ ಶà³à²°à³à²µà²¾à²—à³à²µà³à²¦à³';
+$lang['Who can see these photos?'] = 'ಈ ಚಿತà³à²°à²—ಳನà³à²¨à³ ಯಾರೠನೋಡಬಹà³à²¦à³?';
+$lang['Who can see this photo?'] = 'ಈ ಚಿತà³à²°à²µà²¨à³à²¨à³ ಯಾರೠನೋಡಬಹà³à²¦à³?';
+$lang['Width'] = 'ಅಗಲ';
+$lang['With no album'] = 'ಸಂಪà³à²Ÿ ರಹಿತ';
+$lang['With no tag'] = 'ಟà³à²¯à²¾à²—ೠರಹಿತ';
+$lang['X Position'] = 'X ಸà³à²¥à²¾à²¨';
+$lang['Y Position'] = 'Y ಸà³à²¥à²¾à²¨';
+$lang['Year'] = 'ವರà³à²·';
+$lang['You need to confirm deletion'] = 'ನೀವೠಅಳಿಸà³à²µà²¿à²•à³†à²¯à²¨à³à²¨à³ ಖಾತà³à²°à²¿à²®à²¾à²¡à²²à³‡à²¬à³‡à²•à³';
+$lang['[%s] Visit album %s'] = '[%s] ಸಂಪà³à²Ÿà²µà²¨à³à²¨à³ ನೋಡಿ %s';
+$lang['add a new watermark'] = 'ಹೊಸ ನೀರà³à²•à²²à³†à²¯à²¨à³à²¨à³ ಸೇರಿಸಿ';
+$lang['added'] = 'ಸೇರಿಸಲಾಗಿದೆ';
+$lang['all'] = 'ಎಲà³à²²à²¾';
+$lang['and'] = 'ಮತà³à²¤à³';
+$lang['any visitor can see this album'] = 'ಯಾವà³à²¦à³‡ ಸಂದರà³à²¶à²•à²°à³ ಈ ಸಂಪà³à²Ÿà²µà²¨à³à²¨à³ ನೋಡಬಹà³à²¦à³';
+$lang['associate to group'] = 'ಗà³à²‚ಪಿಗೆ ಹೊಂದಿಸಿ';
+$lang['high'] = 'ಹೆಚà³à²šà³';
+$lang['jump to album'] = 'ಸಂಪà³à²Ÿà²•à³à²•à³† ಹೋಗಿ';
+$lang['jump to photo'] = 'ಚಿತà³à²°à²•à³à²•à³† ಹೋಗಿ';
+$lang['leave'] = 'ತೊರೆ';
+$lang['manage album photos'] = 'ಸಂಪà³à²Ÿà²¦ ಚಿತà³à²°à²—ಳನà³à²¨à³ ನಿರà³à²µà²¹à²¿à²¸à²¿';
+$lang['manage sub-albums'] = 'ಉಪ-ಸಂಪà³à²Ÿà²—ಳನà³à²¨à³ ನಿರà³à²µà²¹à²¿à²¸à²¿';
+$lang['middle'] = 'ಮಧà³à²¯à³†';
+$lang['modified'] = 'ಬದಲಾಯಿಸಲಾದ';
+$lang['new'] = 'ಹೊಸ';
+$lang['none'] = 'ಯಾವà³à²¦à³‚ ಇಲà³à²²';
+$lang['nothing'] = 'à²à²¨à³‚ ಇಲà³à²²';
+$lang['number of miniaturized photos'] = 'ರಚಿಸಲಾದ ಕಿರà³à²šà²¿à²¤à³à²°à²—ಳ ಸಂಖà³à²¯à³†';
+$lang['on'] = 'ಮೇಲೆ';
+$lang['only directories'] = 'ಡೈರೆಕà³à²Ÿà²°à²¿à²—ಳೠಮಾತà³à²°';
+$lang['%d of %d photos selected'] = '%d ರ %d ಚಿತà³à²°à²—ಳನà³à²¨à³ ಆರಿಸಲಾಗಿದೆ';
+$lang['%d parameter was updated.'] = '%d ನಿಯತಾಂಕ ನವೀಕರಿಸಿದೆ.';
+$lang['%d parameters were updated.'] = '%d ನಿಯತಾಂಕಗಳನà³à²¨à³ ನವೀಕರಿಸಿದೆ.';
+$lang['%d photo was deleted'] = '%d ಚಿತà³à²°à²µà²¨à³à²¨à³ ಅಳಿಸಲಾಗಿದೆ. ';
+$lang['%d photos uploaded'] = '%d ಚಿತà³à²°à²—ಳನà³à²¨à³ ನವೀಕರಿಸಿದೆ. ';
+$lang['%d photos were deleted'] = '%d ಚಿತà³à²°à²—ಳನà³à²¨à³ ಅಳಿಸಲಾಗಿದೆ. ';
+$lang['%d second'] = '%d ಸೆಕೆಂಡà³';
+$lang['%d seconds'] = '%d ಸೆಕೆಂಡà³à²—ಳà³';
+$lang['%d tag'] = '%d ಟà³à²¯à²¾à²—à³';
+$lang['%d tags'] = '%d ಟà³à²¯à²¾à²—ೠಗಳà³';
+$lang['%d user'] = '%d ಬಳಕೆದಾರ';
+$lang['%d user deleted'] = '%d ಬಳಕೆದಾರರನà³à²¨à³ ಅಳಿಸಲಾಗಿದೆ.';
+$lang['%d user was not updated.'] = '%d ಬಳಕೆದಾರರನà³à²¨à³ ನವೀಕರಿಸಲಾಗಿಲà³à²².';
+$lang['%d user was updated.'] = '%d ಬಳಕೆದಾರರನà³à²¨à³ ನವೀಕರಿಸಿದೆ.';
+$lang['%d mails were not sent.'] = '%d ಮಿಂಚೆಗಳನà³à²¨à³ ಕಳà³à²¹à²¿à²¸à²²à²¾à²—ಿಲà³à²².';
+$lang['%d mails were sent.'] = '%d ಮಿಂಚೆಗಳನà³à²¨à³ ಕಳà³à²¹à²¿à²¸à²²à²¾à²—ಿದೆ.';
+$lang['%d member'] = '%d ಸದಸà³à²¯';
+$lang['%d members'] = '%d ಸದಸà³à²¯à²°à³';
+$lang['%d line filtered'] = '%d ಸಾಲೠಶೋಧಿಸಿದೆ';
+$lang['%d lines filtered'] = '%d ಸಾಲà³à²—ಳನà³à²¨à³ ಶೋಧಿಸಿದೆ';
+$lang['%d mail was not sent.'] = '%d ಮಿಂಚೆಯನà³à²¨à³ ಕಳà³à²¹à²¿à²¸à²²à²¾à²—ಿಲà³à²².';
+$lang['%d mail was sent.'] = '%d ಮಿಂಚೆಯನà³à²¨à³ ಕಳà³à²¹à²¿à²¸à²²à²¾à²—ಿದೆ.';
+$lang['%d guest'] = '%d ಅತಿಥಿ';
+$lang['%d guests'] = '%d ಅತಿಥಿಗಳà³';
+$lang['%d hour'] = '%d ಗಂಟೆ';
+$lang['%d hours'] = '%d ಗಂಟೆಗಳà³';
+$lang['%d day'] = '%d ದಿನ';
+$lang['%d days'] = '%d ದಿನಗಳà³';
+$lang['%d group'] = '%d ಗà³à²‚ಪà³';
+$lang['%d groups'] = '%d ಗà³à²‚ಪà³à²—ಳà³';
+?> \ No newline at end of file
diff --git a/language/kn_IN/common.lang.php b/language/kn_IN/common.lang.php
new file mode 100644
index 000000000..3a799e01c
--- /dev/null
+++ b/language/kn_IN/common.lang.php
@@ -0,0 +1,421 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: ಕನà³à²¨à²¡ [IN]
+Version: 2.6.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=693
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+$lang_info['language_name'] = "ಕನà³à²¨à²¡";
+$lang_info['country'] = "ಭಾರತ";
+$lang_info['direction'] = "ltr";
+$lang_info['code'] = "kn";
+$lang_info['zero_plural'] = true;
+
+
+$lang['%d album updated'] = "%d ಸಂಪà³à²Ÿ ಸಂಪನà³à²¨à²µà²¾à²—ಿದೆ";
+$lang['%d albums updated'] = "%d ಸಂಪà³à²Ÿà²—ಳೠಸಂಪನà³à²¨à²µà²¾à²—ಿವೆ";
+$lang['%d comment to validate'] = "ಪರಿಶೀಲನೆಗಾಗಿ %d ಟಿಪà³à²ªà²£à²¿ ";
+$lang['%d comment'] = "%d ಟಿಪà³à²ªà²£à²¿";
+$lang['%d comments to validate'] = "ಪರಿಶೀಲನೆಗಾಗಿ %d ಟಿಪà³à²ªà²£à²¿à²—ಳೠ";
+$lang['%d comments'] = "%d ಟಿಪà³à²ªà²£à²¿à²—ಳà³";
+$lang['%d hit'] = "%d ಭೇಟಿ";
+$lang['%d hits'] = "%d ಭೇಟಿಗಳà³";
+$lang['%d new comment'] = "%d ಹೊಸ ಟಿಪà³à²ªà²£à²¿";
+$lang['%d new comments'] = "%d ಹೊಸ ಟಿಪà³à²ªà²£à²¿à²—ಳà³";
+$lang['%d new photo'] = "%d ಹೊಸ ಚಿತà³à²°";
+$lang['%d new photos'] = "%d ಹೊಸ ಚಿತà³à²°à²—ಳà³";
+$lang['%d new user'] = "%d ಹೊಸ ಬಳಕೆದಾರ";
+$lang['%d new users'] = "%d ಹೊಸ ಬಳಕೆದಾರರà³";
+$lang['%d photo is also linked to current tags'] = "%d ಚಿತà³à²°à²µà³ ಕೂಡ ಈ ಟà³à²¯à²¾à²—ೠನ ಜೊತೆ ಜೋಡಿಸಲà³à²ªà²Ÿà³à²Ÿà²¿à²¦à³†.";
+$lang['%d photo'] = "%d ಚಿತà³à²°";
+$lang['%d photos are also linked to current tags'] = "%d ಚಿತà³à²°à²—ಳೠಕೂಡ ಈ ಟà³à²¯à²¾à²—ೠಗಳ ಜೊತೆ ಜೋಡಿಸಲà³à²ªà²Ÿà³à²Ÿà²¿à²µà³†. ";
+$lang['%d photos'] = "%d ಚಿತà³à²°à²—ಳà³";
+$lang['%d rate'] = '%d ಗà³à²£à²¦à²°à³à²œà³†';
+$lang['%d rates'] = "%d ಗà³à²£à²¦à²°à³à²œà³†à²—ಳà³";
+$lang['(!) This comment requires validation'] = '(!) ಈ ಟಿಪà³à²ªà²£à²¿à²¯à²¨à³à²¨à³ ಪರಿಶೀಲಿಸಬೇಕಾಗಿದೆ';
+$lang['... or browse your empty gallery'] = '... ಅಥವಾ ನಿಮà³à²® ಖಾಲಿ ಚಿತà³à²°à²¶à²¾à²²à³† (ಗà³à²¯à²¾à²²à²°à²¿) ಯನà³à²¨à³ ವೀಕà³à²·à²¿à²¸à²¿ ';
+$lang['2small'] = 'XXS - ಅತಿ ಸಣà³à²£à²¦à³';
+$lang['A comment on your site'] = "ನಿಮà³à²® ಜಾಲತಾಣದ ಬಗà³à²—ೆ ಒಂದೠಟಿಪà³à²ªà²£à²¿";
+$lang['About Piwigo'] = "Piwigo ದ ಬಗà³à²—ೆ";
+$lang['About'] = "ಬಗà³à²—ೆ";
+$lang['Accelerate diaporama speed'] = "ಪà³à²°à²¦à²°à³à²¶à²¿à²•à³†à²¯ ವೇಗ ಹೆಚà³à²šà²¿à²¸à²¿";
+$lang['Add a comment'] = "ಟಿಪà³à²ªà²£à²¿ ಸೇರಿಸಿರಿ";
+$lang['add this photo to your favorites'] = "ಈ ಚಿತà³à²°à²µà²¨à³à²¨à³ ನಿಮà³à²® ಅಚà³à²šà³à²®à³†à²šà³à²šà²¿à²¨ ಪಟà³à²Ÿà²¿à²—ೆ ಸೇರಿಸಿ";
+$lang['Admin: %s'] = "ಅಡà³à²®à²¿à²¨à³: %s";
+$lang['Administration'] = "ನಿರà³à²µà²¹à²£à³†";
+$lang['Album results for'] = "ಸಂಪà³à²Ÿà²¦ ಫಲಿತಾಂಶಗಳà³";
+$lang['Album'] = "ಸಂಪà³à²Ÿ";
+$lang['Album: %s'] = "ಸಂಪà³à²Ÿ: %s";
+$lang['Albums'] = "ಸಂಪà³à²Ÿà²—ಳà³";
+$lang['All tags'] = "ಎಲà³à²²à²¾ ಟà³à²¯à²¾à²—ೠಗಳà³";
+$lang['all'] = "ಎಲà³à²²à²¾";
+$lang['All'] = "ಎಲà³à²²à²¾";
+$lang['An administrator must authorize your comment before it is visible.'] = "ನಿರà³à²µà²¹à²£à³†à²—ಾರರೠನಿಮà³à²® ಟಿಪà³à²ªà²£à²¿ ಯನà³à²¨à³ ಪರಿಶೀಲಿಸಿದ ನಂತರ ಅದೠನಿಮಗೆ ಲಭà³à²¯à²µà²¾à²—à³à²µà³à²¦à³.";
+$lang['Any tag'] = "ಯಾವà³à²¦à³‡ ಟà³à²¯à²¾à²—à³";
+$lang['Are you sure?'] = "ನಿಮಗೆ ಒಪà³à²ªà²¿à²—ೆಯೇ?";
+$lang['ascending'] = "ಆರೋಹಣ ಕà³à²°à²®";
+$lang['At least one listed rule must be satisfied.'] = "ಕೊನೇ ಪಕà³à²· ಮಾನದಂಡಗಳ ಪಟà³à²Ÿà²¿à²¯à²²à³à²²à²¿à²°à³à²µ ಒಂದಾದರೂ ಸಮà³à²®à²¤à²µà²¾à²—ಬೇಕà³.";
+$lang['Author'] = "ಲೇಖಕ";
+$lang['author(s) : %s'] = 'ಲೇಖಕ(ರà³): %s';
+$lang['Author: %s'] = "ಲೇಖಕ: %s";
+$lang['Auto login'] = "ಆಟೋ ಲಾಗಿನà³";
+$lang['available for administrators only'] = "ನಿರà³à²µà²¹à²£à³†à²—ಾರರ (ಅಡà³à²®à²¿à²¨à³ ಗಳ) ಉಪಯೋಗಕà³à²•à³† ಮಾತà³à²°";
+$lang['Bad request'] = 'ಕೋರಿಕೆ ತಪà³à²ªà²¾à²—ಿದೆ';
+$lang['Best rated'] = "ಅತà³à²¯à³à²¤à³à²¤à²®à²µà²¾à²¦à²µà³";
+$lang['Browser: %s'] = "ಬà³à²°à³Œà²¸à²°à³: %s";
+$lang['Calendar'] = "ದಿನದರà³à²¶à²¿à²•à³†";
+$lang['Change my password'] = 'ನನà³à²¨ ಪà³à²°à²µà³‡à²¶à²ªà²¦à²µà²¨à³à²¨à³ ಬದಲಿಸà³';
+$lang['Check your email for the confirmation link'] = 'ಒಪà³à²ªà²¿à²—ೆಯ ಲಿಂಕೠಗಾಗಿ ನಿಮà³à²® ಮಿಂಚೆಯನà³à²¨à³ ನೋಡಿ';
+$lang['chronology_monthly_calendar'] = "ತಿಂಗಳಿನ ದಿನದರà³à²¶à²¿à²•à³†";
+$lang['chronology_monthly_list'] = "ತಿಂಗಳಿನ ಪಟà³à²Ÿà²¿";
+$lang['chronology_weekly_list'] = "ವಾರದ ಪಟà³à²Ÿà²¿";
+$lang['Click here if your browser does not automatically forward you'] = "ನಿಮà³à²® ಬà³à²°à³Œà²¸à²°à³ ಆಯಾಚಿತವಾಗಿ ಮà³à²‚ದà³à²µà²°à³†à²¯à²¦à²¿à²¦à³à²¦à²²à³à²²à²¿, ಇಲà³à²²à²¿ ಕà³à²²à²¿à²•à³ ಮಾಡಿ. Click here if your browser does not automatically forward you";
+$lang['Click on the photo to see it in high definition'] = "ಉನà³à²¨à²¤ ದರà³à²œà³†à²¯à²²à³à²²à²¿ ವೀಕà³à²·à²¿à²¸à²²à³ ಚಿತà³à²°à²¦ ಮೇಲೆ ಕà³à²²à²¿à²•à³ ಮಾಡಿ";
+$lang['Close this window'] = "ಈ ವಿಂಡೋ ಅನà³à²¨à³ ಮà³à²šà³à²šà²¿à²°à²¿";
+$lang['cloud'] = "ಕà³à²²à³Œà²¡à³";
+$lang['Comment by %s'] = "%s ರವರ ಟಿಪà³à²ªà²£à²¿ ";
+$lang['comment date'] = "ಟಿಪà³à²ªà²£à²¿à²¯ ದಿನಾಂಕ";
+$lang['Comment'] = "ಟಿಪà³à²ªà²£à²¿";
+$lang['Comment: %s'] = "ಟಿಪà³à²ªà²£à²¿: %s";
+$lang['Comments'] = "ಟಿಪà³à²ªà²£à²¿à²—ಳà³";
+$lang['Complete RSS feed (photos, comments)'] = "ಸಂಪೂರà³à²£ RSS feed (ಚಿತà³à²°à²—ಳà³, ಟಿಪà³à²ªà²£à²¿à²—ಳà³)";
+$lang['Confirm Password'] = 'ಪà³à²°à²µà³‡à²¶à²ªà²¦à²µà²¨à³à²¨à³ ಖಾತà³à²°à²¿à²—ೊಳಿಸಿ.';
+$lang['Connected user: %s'] = "ಸಂಪರà³à²•à²¿à²¤à²µà²¾à²¦ ಬಳಕೆದಾರ: %s";
+$lang['Connection settings'] = "ಸಂಪರà³à²•à²¦ ವಿವರಗಳà³";
+$lang['Contact webmaster'] = "ವೆಬೠಮಾಸà³à²Ÿà²°à³ ಅವರನà³à²¨à³ ಸಂಪರà³à²•à²¿à²¸à²¿";
+$lang['Contact'] = "ಸಂಪರà³à²•à²¿à²¸à²¿";
+$lang['Create a new account'] = "ಹೊಸ ಖಾತೆಯನà³à²¨à³ ತೆರೆಯಿರಿ";
+$lang['created after %s (%s)'] = "%s (%s) ರ ನಂತರ ರಚಿಸಲಾಗಿದೆ ";
+$lang['created before %s (%s)'] = '%s (%s) ರ ಮà³à²‚ಚೆ ರಚಿಸಲಾಗಿದೆ ';
+$lang['created between %s (%s) and %s (%s)'] = '%s (%s) ರ ಮತà³à²¤à³ %s (%s) ರ ನಡà³à²µà³† ರಚಿಸಲಾಗಿದೆ';
+$lang['created on %s'] = "%s ರಂದೠತೆರೆಯಲಾಗಿದೆ";
+$lang['Created on'] = "ರಂದೠರಚಿಸಲಾಗಿದೆ";
+$lang['Creation date'] = "ರಚಿಸಲಾದ ದಿನಾಂಕ";
+$lang['Current password is wrong'] = "ಈಗಿನ ಗà³à²ªà³à²¤à²ªà²¦ ತಪà³à²ªà²¾à²—ಿದೆ";
+$lang['customize the appareance of the gallery'] = "ಚಿತà³à²°à²¶à²¾à²²à³† (ಗà³à²¯à²¾à²²à²°à²¿)ಯ ವಿನà³à²¯à²¾à²¸ ಬದಲಾಯಿಸಿ";
+$lang['Customize'] = "ವಿನà³à²¯à²¾à²¸ ಬದಲಿಸಿ";
+$lang['Date created, new &rarr; old'] = 'ರಚಿಸಲಾದ ದಿನಾಂಕ, ಹೊಸ &rarr; ಹಳೆಯ';
+$lang['Date created, old &rarr; new'] = 'ರಚಿಸಲಾದ ದಿನಾಂಕ, ಹಳೆಯ &rarr; ಹೊಸ';
+$lang['Date posted, new &rarr; old'] = 'ದಿನಾಂಕ, ಹೊಸ &rarr; ಹಳೆಯ';
+$lang['Date posted, old &rarr; new'] = 'ದಿನಾಂಕ, ಹಳೆಯ &rarr; ಹೊಸ';
+$lang['Date'] = "ದಿನಾಂಕ";
+$lang['day'][0] = "ಭಾನà³à²µà²¾à²°";
+$lang['day'][1] = "ಸೋಮವಾರ";
+$lang['day'][2] = "ಮಂಗಳವಾರ";
+$lang['day'][3] = "ಬà³à²§à²µà²¾à²°";
+$lang['day'][4] = "ಗà³à²°à³à²µà²¾à²°";
+$lang['day'][5] = "ಶà³à²•à³à²°à²µà²¾à²°";
+$lang['day'][6] = "ಶನಿವಾರ";
+$lang['delete all photos from your favorites'] = "ನಿಮà³à²® ಅಚà³à²šà³à²®à³†à²šà³à²šà²¿à²¨ ಪಟà³à²Ÿà²¿à²¯à²¿à²‚ದ ಎಲà³à²²à²¾ ಚಿತà³à²°à²—ಳನà³à²¨à³ ಅಳಿಸಿ.";
+$lang['delete this photo from your favorites'] = "ಈ ಚಿತà³à²°à²µà²¨à³à²¨à³ ನಿಮà³à²® ಅಚà³à²šà³à²®à³†à²šà³à²šà²¿à²¨ ಪಟà³à²Ÿà²¿à²¯à²¿à²‚ದ ಅಳಿಸಿ";
+$lang['Delete'] = "ಅಳಿಸಿ";
+$lang['descending'] = "ಅವರೋಹಣ ಕà³à²°à²®";
+$lang['Desktop'] = 'ಡೆಸà³à²•à³ ಟಾಪà³';
+$lang['Dimensions'] = "ಅಳತೆ";
+$lang['display a calendar by creation date'] = "ದಿನದರà³à²¶à²¿à²•à³†à²¯à²¨à³à²¨à³ ರಚಿತವಾದ ದಿನಾಂಕದಂತೆ ಪà³à²°à²¦à²°à³à²¶à²¿à²¸à²¿";
+$lang['display a calendar by posted date'] = "ದಿನದರà³à²¶à²¿à²•à³†à²¯à²¨à³à²¨à³ ಪà³à²°à²•à²Ÿà²£à³†à²¯ ದಿನಾಂಕದಂತೆ ಪà³à²°à²¦à²°à³à²¶à²¿à²¸à²¿";
+$lang['display a set of random photos'] = "a set of random ಚಿತà³à²°à²—ಳನà³à²¨à³ ಪà³à²°à²¦à²°à³à²¶à²¿à²¸à²¿";
+$lang['display all photos in all sub-albums'] = "ಎಲà³à²²à²¾ ಉಪ-ಸಂಪà³à²Ÿà²—ಳಲà³à²²à²¿à²¨ ಎಲà³à²²à²¾ ಚಿತà³à²°à²—ಳನà³à²¨à³ ಪà³à²°à²¦à²°à³à²¶à²¿à²¸à²¿";
+$lang['display available tags'] = "ಲಭà³à²¯à²µà²¿à²°à³à²µ ಎಲà³à²²à²¾ ಟà³à²¯à²¾à²—ೠಗಳನà³à²¨à³ ಪà³à²°à²¦à²°à³à²¶à²¿à²¸à²¿";
+$lang['display best rated photos'] = "ಅತà³à²¯à³à²¤à³à²¤à²® ಗà³à²£à²¦à²°à³à²œà³†à²¯ ಚಿತà³à²°à²—ಳನà³à²¨à³ ಪà³à²°à²¦à²°à³à²¶à²¿à²¸à²¿";
+$lang['display each day with photos, month per month'] = "ತಿಂಗಳಿನ ನಂತರ ತಿಂಗಳಿನಂತೆ, ಪà³à²°à²¤à²¿ ದಿನವನà³à²¨à³‚ ಚಿತà³à²°à²—ಳೊಂದಿಗೆ ಪà³à²°à²¦à²°à³à²¶à²¿à²¸à²¿";
+$lang['display last user comments'] = "ಕೊನೆಯ ಬಳಕೆದಾರರ ಟಿಪà³à²ªà²£à²¿à²—ಳನà³à²¨à³ ಪà³à²°à²¦à²°à³à²¶à²¿à²¸à²¿";
+$lang['display most recent photos'] = "ಇತà³à²¤à³€à²šà²¿à²¨ ಚಿತà³à²°à²—ಳನà³à²¨à³ ಪà³à²°à²¦à²°à³à²¶à²¿à²¸à²¿";
+$lang['display most visited photos'] = "ಅತಿ ಹೆಚà³à²šà³ ಕೋರಿಕೆಯ ಚಿತà³à²°à²—ಳನà³à²¨à³ ಪà³à²°à²¦à²°à³à²¶à²¿à²¸à²¿";
+$lang['display only recently posted photos'] = "ಇತà³à²¤à³€à²šà³†à²—ೆ ಸೇರಿಸಿದ ಚಿತà³à²°à²—ಳನà³à²¨à³ ಮಾತà³à²° ಪà³à²°à²¦à²°à³à²¶à²¿à²¸à²¿";
+$lang['display photos linked to this tag'] = "ಈ ಟà³à²¯à²¾à²—ೠನೊಂದಿಗೆ ಜೋಡಣೆಯಾದ ಚಿತà³à²°à²—ಳನà³à²¨à³ ಪà³à²°à²¦à²°à³à²¶à²¿à²¸à²¿";
+$lang['display recently updated albums'] = "ಇತà³à²¤à³€à²šà²¿à²—ೆ ಉನà³à²¨à²¤à³€à²•à²°à²¿à²¸à²¿à²¦ ಸಂಪà³à²Ÿà²—ಳನà³à²¨à³ ಪà³à²°à²¦à²°à³à²¶à²¿à²¸à²¿";
+$lang['display this album'] = "ಈ ಸಂಪà³à²Ÿà²µà²¨à³à²¨à³ ಪà³à²°à²¦à²°à³à²¶à²¿à²¸à²¿";
+$lang['display your favorites photos'] = "ನಿಮà³à²® ಅಚà³à²šà³à²®à³†à²šà³à²šà²¿à²¨ ಚಿತà³à²°à²—ಳನà³à²¨à³ ಪà³à²°à²¦à²°à³à²¶à²¿à²¸à²¿";
+$lang['Display'] = "ಪà³à²°à²¦à²°à³à²¶à²¿à²¸à²¿";
+$lang['Download this file'] = "ಈ ಕಡತ (ಫೈಲà³)ಆನà³à²¨à³ ಡೌನೠಲೋಡೠಮಾಡಿ";
+$lang['Download'] = "ಡೌನೠಲೋಡೠಮಾಡಿ";
+$lang['Each listed rule must be satisfied.'] = 'ಪಟà³à²Ÿà²¿à²®à²¾à²¡à²¿à²°à³à²µ ಪà³à²°à²¤à²¿à²¯à³Šà²‚ದೠಮಾನದಂಡವೂ ಸಮà³à²®à²¤à²µà²¾à²—ಬೇಕà³.';
+$lang['Edit a comment'] = "ಟಿಪà³à²ªà²£à²¿à²¯à²¨à³à²¨à³ ಸರಿಪಡಿಸಿ";
+$lang['edit'] = "ಸಂಪಾದಿಸಿ"; //TO remove
+$lang['Edit'] = 'ಸಂಪಾದಿಸಿ';
+$lang['Email address is missing. Please specify an email address.'] = "ದಯವಿಟà³à²Ÿà³ ಮಿಂಚೆ ವಿಳಾಸವನà³à²¨à³ ನಮೂದಿಸಿ.";
+$lang['Email address'] = "ಮಿಂಚೆ ವಿಳಾಸ";
+$lang['Email address is mandatory'] = 'ಮಿಂಚೆ ವಿಳಾಸ ಕಡà³à²¡à²¾à²¯à²µà²¾à²—ಿದೆ';
+$lang['Email: %s'] = "ಮಿಂಚೆ: %s";
+$lang['End-Date'] = "ಕೊನೆಯ ದಿನಾಂಕ";
+$lang['Enter your new password below.'] = 'ನಿಮà³à²® ಹೊಸ ಪà³à²°à²µà³‡à²¶à²ªà²¦à²µà²¨à³à²¨à³ ಈ ಕೆಳಗೆ ನಮೂದಿಸಿ.';
+$lang['Enter your personnal informations'] = "ನಿಮà³à²® ಸà³à²µà²µà²¿à²µà²°à²—ಳನà³à²¨à³ ನಮೂದಿಸಿ";
+$lang['Error sending email'] = "ಮಿಂಚೆ ಕಳà³à²¹à²¿à²¸à³à²µà²¾à²— ತಪà³à²ªà²¾à²—ಿದೆ";
+$lang['excluded'] = "ಹೊರತಾದ";
+$lang['EXIF Metadata'] = 'EXIF ವಿವರಗಳà³';
+$lang['Expand all albums'] = "ಎಲà³à²²à²¾ ಸಂಪà³à²Ÿà²—ಳನà³à²¨à³ ವಿಸà³à²¤à²°à²¿à²¸à²¿";
+$lang['Favorites'] = "ಅಚà³à²šà³à²®à³†à²šà³à²šà²¿à²¨à²µà³";
+$lang['File name'] = "ಕಡತದ (ಫೈಲೠನ) ಹೆಸರà³";
+$lang['File name, A &rarr; Z'] = 'ಕಡತದ (ಫೈಲೠನ) ಹೆಸರà³, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'ಕಡತದ (ಫೈಲೠನ) ಹೆಸರà³, Z &rarr; A';
+$lang['File'] = "ಕಡತ (ಫೈಲà³)";
+$lang['Filesize'] = "ಕಡತದ (ಫೈಲೠನ) ಗಾತà³à²°";
+$lang['Filter and display'] = "ಶೋಧಿಸಿ ಮತà³à²¤à³ ಪà³à²°à²¦à²°à³à²¶à²¿à²¸à²¿";
+$lang['Filter'] = "ಶೋಧನೆ";
+$lang['First'] = "ಮೊದಲಿನ";
+$lang['Forbidden'] = 'ನಿರà³à²¬à²‚ಧಿತ';
+$lang['Forgot your password?'] = 'ನಿಮà³à²® ಪà³à²°à²µà³‡à²¶à²ªà²¦ ಮರೆತೠಹೋಗಿದೆಯೆ?';
+$lang['from %s to %s'] = "ಇಂದ %s ಗೆ %s";
+$lang['Go through the gallery as a visitor'] = "ಸಂದರà³à²¶à²•à²°à²‚ತೆ ಚಿತà³à²°à²¶à²¾à²²à³† (ಗà³à²¯à²¾à²²à²°à²¿)ಯನà³à²¨à³ ವೀಕà³à²·à²¿à²¸à²¿";
+$lang['group by letters'] = "ಪತà³à²°à²—ಳಂತೆ ವಿಂಗಡಿಸಿ";
+$lang['guest'] = "ಅತಿಥಿ";
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'ನಮಸà³à²¤à³† %s ಅವರೆ, ನಿಮà³à²® Piwigo ಚಿತà³à²°à²¶à²¾à²²à³† (ಗà³à²¯à²¾à²²à²°à²¿) ಖಾಲಿ ಇದೆ!';
+$lang['Hello %s,'] = 'ನಮಸà³à²•à²¾à²° %s ಅವರೆ,';
+$lang['Hello'] = "ನಮಸà³à²•à²¾à²°";
+$lang['Help'] = "ಸಹಾಯ";
+$lang['Here are your connection settings'] = 'ನಿಮà³à²® ಸಂಪರà³à²•à²¦ ವಿವರಗಳೠಇಲà³à²²à²¿à²µà³† ';
+$lang['Home'] = 'ಮà³à²–ಪà³à²Ÿ';
+$lang['html tags are not allowed in login'] = 'html ಟà³à²¯à²¾à²—ೠಗಳನà³à²¨à³ ಲಾಗಿನೠನಲà³à²²à²¿ ಉಪಯೋಗಿಸà³à²µà²‚ತಿಲà³à²²';
+$lang['I want to add photos'] = 'ನಾನೠಚಿತà³à²°à²—ಳನà³à²¨à³ ಸೇರಿಸಬೇಕà³';
+$lang['Identification'] = "ಗà³à²°à³à²¤à³";
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'ಈ ಮಿಂಚೆ ಕಣà³à²¤à²ªà³à²ªà²¿à²¨à²¿à²‚ದ ಬಂದಿರಬಹà³à²¦à³ ಎಂದೠನಿಮಗನà³à²¨à²¿à²¸à²¿à²¦à³à²¦à²²à³à²²à²¿, ಇದನà³à²¨à³ ನಿರà³à²²à²•à³à²·à²¿à²¸à²¿, ಇದರಿಂದ ಯಾವ ತೊಂದರೆಯೂ ಉಂಟಾಗದà³.';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'ಈ ಮಿಂಚೆ ಕಣà³à²¤à²ªà³à²ªà²¿à²¨à²¿à²‚ದ ಬಂದಿರಬಹà³à²¦à³ ಎಂದೠನಿಮಗನà³à²¨à²¿à²¸à²¿à²¦à³à²¦à²²à³à²²à²¿, ದಯವಿಟà³à²Ÿà³ ನಮà³à²®à²¨à³à²¨à³ %s ರಲà³à²²à²¿ ಸಂಪರà³à²•à²¿à²¸à²¿.';
+$lang['in %d sub-album'] = "%d ಉಪ-ಸಂಪà³à²Ÿ ದಲà³à²²à²¿";
+$lang['in %d sub-albums'] = "%d ಉಪ-ಸಂಪà³à²Ÿà²—ಳಲà³à²²à²¿";
+$lang['in this album'] = "ಈ ಸಂಪà³à²Ÿà²¦à²²à³à²²à²¿";
+$lang['included'] = "ಸೇರಿಸಲಾದವà³";
+$lang['Invalid key'] = 'ಅಸಿಂಧà³à²µà²¾à²¦ ಕೀ';
+$lang['Invalid password!'] = 'ತಪà³à²ªà²¾à²¦ ಪà³à²°à²µà³‡à²¶à²ªà²¦!';
+$lang['Invalid username or email'] = 'ತಪà³à²ªà²¾à²¦ ಬಳಕೆದಾರರ ಹೆಸರೠಅಥವಾ ಮಿಂಚೆ ವಿಳಾಸ';
+$lang['IPTC Metadata'] = 'IPTC ಮೆಟಾಡೇಟಾ';
+$lang['Keyword'] = "ಮà³à²–à³à²¯ ಪದ (ಕೀ ವರà³à²¡à³)";
+$lang['Kind of date'] = "ದಿನಾಂಕದ ಬಗೆ";
+$lang['Language'] = "ಭಾಷೆ";
+$lang['large'] = 'L - ದೊಡà³à²¡à²¦à²¾à²¦';
+$lang['last %d days'] = "ಕೊನೆಯ %d ದಿನಗಳà³";
+$lang['Last'] = "ಕೊನೆಯ";
+$lang['letters'] = "ಪದಗಳೠ- ಪತà³à²°à²—ಳà³";
+$lang['Links'] = "ಲಿಂಕೠಗಳà³";
+$lang['login mustn\'t end with a space character'] = "ಲಾಗಿನà³, ಸà³à²ªà³‡à²¸à³ ಅಕà³à²·à²°à²—ಳಿಂದ ಕೊನೆಯಾಗಬಾರದà³";
+$lang['login mustn\'t start with a space character'] = "ಲಾಗಿನà³, ಸà³à²ªà³‡à²¸à³ ಅಕà³à²·à²°à²—ಳಿಂದ ಶà³à²°à³à²µà²¾à²—ಬಾರದà³";
+$lang['Login'] = "ಲಾಗಿನà³";
+$lang['Logout'] = "ಲಾಗೌಟà³";
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'ಮಿಂಚೆ ವಿಳಾಸ ಈ ರೀತಿಯಾಗಿರಲಿ : xxx@yyy.eee (example: jack@altern.org)';
+$lang['Manage this user comment: %s'] = 'ಈ ಬಳಕೆದಾರರ ಟಿಪà³à²ªà²£à²¿ ಯನà³à²¨à³ ನಿರà³à²µà²¹à²¿à²¸à²¿: %s';
+$lang['Manual sort order'] = 'Manual ಅನà³à²•à³à²°à²®à²£à²¿à²•à³†à²¯ ಕà³à²°à²®';
+$lang['medium'] = 'M - ಮಧà³à²¯à²®';
+$lang['Menu'] = "ಪಟà³à²Ÿà²¿";
+$lang['Mobile'] = 'ಮೊಬೈಲà³';
+$lang['month'][10] = "ಅಕà³à²Ÿà³‹à²¬à²°à³";
+$lang['month'][11] = "ನವೆಂಬರà³";
+$lang['month'][12] = "ಡಿಸೆಂಬರà³";
+$lang['month'][1] = "ಜನವರಿ";
+$lang['month'][2] = "ಫೆಬà³à²°à²µà²°à²¿";
+$lang['month'][3] = "ಮಾರà³à²šà³";
+$lang['month'][4] = "à²à²ªà³à²°à²¿à²²à³";
+$lang['month'][5] = "ಮೇ";
+$lang['month'][6] = "ಜೂನà³";
+$lang['month'][7] = "ಜà³à²²à³ˆ";
+$lang['month'][8] = "ಆಗಸà³à²Ÿà³";
+$lang['month'][9] = "ಸೆಪà³à²Ÿà³†à²‚ಬರà³";
+$lang['Most visited'] = "ಅತಿ ಹೆಚà³à²šà³ ಕೋರಿಕೆಯ";
+$lang['New on %s'] = "ಹೊಸತೠ%s";
+$lang['New password'] = 'ಹೊಸ ಪà³à²°à²µà³‡à²¶à²ªà²¦';
+$lang['Next'] = "ಮà³à²‚ದೆ";
+$lang['no rate'] = "ಯಾವà³à²¦à³‡ ಗà³à²£à²¦à²°à³à²œà³† ಇಲà³à²²";
+$lang['No'] = "ಇಲà³à²²";
+$lang['Not repeat the slideshow'] = "ಪà³à²°à²¦à²°à³à²¶à²¿à²•à³†à²¯ ಪà³à²¨à²°à²¾à²µà²°à³à²¤à²¨à³† ಬೇಡ";
+$lang['Notification'] = "ತಿಳà³à²µà²³à²¿à²•à³† (Notification)";
+$lang['Number of items'] = "ವಸà³à²¤à³à²—ಳ ಸಂಖà³à²¯à³†";
+$lang['Number of photos per page'] = "ಪà³à²°à²¤à²¿ ಪà³à²Ÿà²•à³à²•à³† ಚಿತà³à²°à²—ಳ ಸಂಖà³à²¯à³†";
+$lang['Numeric identifier, 1 &rarr; 9'] = 'ಸಂಖà³à²¯à²¾ ಗà³à²°à³à²¤à³, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'ಸಂಖà³à²¯à²¾ ಗà³à²°à³à²¤à³, 9 &rarr; 1';
+$lang['obligatory'] = "ಕಡà³à²¡à²¾à²¯";
+$lang['Original dimensions'] = "ಮೂಲ ಅಳತೆಗಳà³"; //unused?
+$lang['Original'] = 'ಮೂಲ';
+$lang['Page generated in'] = "ದಲà³à²²à²¿ ಪà³à²Ÿ ಪà³à²¨à²°à³à²°à²šà²¿à²¸à²²à²¾à²—ಿದೆ";
+$lang['Page not found'] = 'ಪà³à²Ÿ ಸಿಗà³à²¤à³à²¤à²¿à²²à³à²²';
+$lang['Password forgotten'] = 'ಪà³à²°à²µà³‡à²¶à²ªà²¦à²®à²°à³†à²¤à²¿à²¦à³†';
+$lang['Password reset is not allowed for this user'] = 'ಈ ಬಳಕೆದಾರರ ಪà³à²°à²µà³‡à²¶à²ªà²¦à²µà²¨à³à²¨à³ ಸರಿಪಡಿಸಲಾಗà³à²µà³à²¦à²¿à²²à³à²²';
+$lang['Password Reset'] = 'ಪà³à²°à²µà³‡à²¶à²ªà²¦à²µà²¨à³à²¨à³ ಸರಿಪಡಿಸಿ';
+$lang['password updated'] = 'ಪà³à²°à²µà³‡à²¶à²ªà²¦à²µà²¨à³à²¨à³ ತಿದà³à²¦à³à²ªà²¡à²¿à²¸à²²à²¾à²—ಿದೆ';
+$lang['Password'] = 'ಪà³à²°à²µà³‡à²¶à²ªà²¦';
+$lang['Password: %s'] = 'ಪà³à²°à²µà³‡à²¶à²ªà²¦: %s';
+$lang['Pause of slideshow'] = "ಪà³à²°à²¦à²°à³à²¶à²¿à²•à³†à²¯à²¨à³à²¨à³ ತಡೆಹಿಡಿ";
+$lang['Permalink for album not found'] = 'ಸಂಪà³à²Ÿà²¦ Permalink ಸಿಗà³à²¤à³à²¤à²¿à²²à³à²²';
+$lang['Photo sizes'] = 'ಚಿತà³à²°à²¦ ಗಾತà³à²°';
+$lang['Photo title, A &rarr; Z'] = 'ಚಿತà³à²°à²¦ ಶೀರà³à²·à²¿à²•à³†, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = 'ಚಿತà³à²°à²¦ ಶೀರà³à²·à²¿à²•à³†, Z &rarr; A';
+$lang['photo'] = "ಚಿತà³à²°";
+$lang['Photos only RSS feed'] = "'ಚಿತà³à²°à²—ಳೠಮಾತà³à²°' ದ RSS feed (Photos only RSS feed)";
+$lang['photos posted during the last %d days'] = "ಕಳೆದ %d ದಿನಗಳ ಅವಧಿಯಲà³à²²à²¿ ಪà³à²°à²•à²Ÿà²µà²¾à²¦ ಚಿತà³à²°à²—ಳà³";
+$lang['Photos posted within the last %d day.'] = "ಕಳೆದ %d ದಿನಗಳ ಅವಧಿಯೊಳಗೆ ಮಾತà³à²° ಪà³à²°à²•à²Ÿà²µà²¾à²¦ ಚಿತà³à²°à²—ಳà³";
+$lang['Photos posted within the last %d days.'] = "ಕಳೆದ %d ದಿನಗಳ ಅವಧಿಯೊಳಗೆ ಮಾತà³à²° ಪà³à²°à²•à²Ÿà²µà²¾à²¦ ಚಿತà³à²°à²—ಳà³";
+$lang['Piwigo encountered a non recoverable error'] = 'Piwigo ದಲà³à²²à²¿ ಮರà³à²¸à²°à²¿à²ªà²¡à²¿à²¸à²²à²¾à²—ದ ಒಂದೠತಪà³à²ªà³ ಉಂಟಾಗಿದೆ';
+$lang['Piwigo Help'] = "Piwigo ಸಹಾಯ";
+$lang['Play of slideshow'] = "ಪà³à²°à²¦à²°à³à²¶à²¿à²•à³†à²¯à²¨à³à²¨à³ ಚಾಲಿಸಿ";
+$lang['Please enter your username or email address.'] = 'ದಯವಿಟà³à²Ÿà³ ನಿಮà³à²® ಬಳಕೆದಾರರ ಹೆಸರೠಅಥವಾ ಮಿಂಚೆ ವಿಳಾಸವನà³à²¨à³ ನಮೂದಿಸಿ';
+$lang['Please, enter a login'] = "ದಯವಿಟà³à²Ÿà³ ಲಾಗಿನೠಅನà³à²¨à³ ನಮೂದಿಸಿ";
+$lang['Post date'] = "ಪà³à²°à²•à²Ÿà²£à³†à²¯ ದಿನಾಂಕ";
+$lang['posted after %s (%s)'] = '%s (%s) ರ ನಂತರ';
+$lang['posted before %s (%s)'] = "%s (%s) ಕà³à²•à³† ಮà³à²¨à³à²¨ ಪà³à²°à²•à²Ÿà²µà²¾à²¦à²µà³.";
+$lang['posted between %s (%s) and %s (%s)'] = "%s (%s) ಮತà³à²¤à³ %s (%s) ರ ಮಧà³à²¯à³† ಪà³à²°à²•à²Ÿà²µà²¾à²¦à²µà³";
+$lang['posted on %s'] = "%s ರಂದೠಪà³à²°à²•à²Ÿà²µà²¾à²¦à²µà³";
+$lang['Posted on'] = "ರಲà³à²²à²¿ ಪà³à²°à²•à²Ÿà²µà²¾à²—ಿದà³à²¦à³";
+$lang['Preferences'] = "ಆದà³à²¯à²¤à³†à²—ಳà³";
+$lang['Previous'] = "ಹಿಂದೆ";
+$lang['Profile'] = "ಸà³à²µà²µà²¿à²µà²°";
+$lang['Quick connect'] = "ವೇಗದ ಸಂಪರà³à²•";
+$lang['Quick search'] = "ವೇಗದ ಹà³à²¡à³à²•à²¾à²Ÿ";
+$lang['Random photos'] = 'ಯಾವà³à²¦à²¾à²¦à³Šà²°à³Šà²‚ದೠಚಿತà³à²°';
+$lang['Rank'] = "ದರà³à²œà³†";
+$lang['Rate this photo'] = "ಈ ಚಿತà³à²°à²¦ ಗà³à²£à²¦à²°à³à²œà³†à²¯à²¨à³à²¨à³ ಹೊಂದಿಸಿ";
+$lang['Rating score'] = "ಗà³à²£à²¦à²°à³à²œà³†à²¯ ಅಂಕ";
+$lang['Rating score, high &rarr; low'] = 'ಗà³à²£à²¦à²°à³à²œà³†à²¯ ಅಂಕ, ಹೆಚà³à²šà³ &rarr; ಕಡಿಮೆ';
+$lang['Rating score, low &rarr; high'] = 'ಗà³à²£à²¦à²°à³à²œà³†à²¯ ಅಂಕ, ಕಡಿಮೆ &rarr; ಹೆಚà³à²šà³';
+$lang['Recent albums'] = "ಇತà³à²¤à³€à²šà²¿à²¨ ಸಂಪà³à²Ÿà²—ಳà³";
+$lang['Recent period must be a positive integer value'] = "ಇತà³à²¤à³€à²šà²¿à²¨ ಅವಧಿಯ ";
+$lang['Recent period'] = "ಇತà³à²¤à³€à²šà²¿à²¨ ಅವಧಿ";
+$lang['Recent photos'] = "ಇತà³à²¤à³€à²šà²¿à²¨ ಚಿತà³à²°à²—ಳà³";
+$lang['Redirection...'] = "ಮರà³à²¨à²¿à²°à³à²¦à³‡à²¶à²¨...";
+$lang['Reduce diaporama speed'] = "ಪà³à²°à²¦à²°à³à²¶à²¿à²•à³†à²¯ ವೇಗವನà³à²¨à³ ಕಡಿಮೆಗೊಳಿಸಿ";
+$lang['Register'] = "ನೋಂದಾಯಿಸಿ";
+$lang['Registration of %s'] = " %s ರ ನೋಂದಣಿ";
+$lang['Registration'] = "ನೋಂದಣಿ";
+$lang['Related tags'] = "ಸಂಬಂಧಿಸಿದ ಟà³à²¯à²¾à²—ೠಗಳà³";
+$lang['remove this tag from the list'] = "ಪಟà³à²Ÿà²¿à²¯à²¿à²‚ದ ಈ ಟà³à²¯à²¾à²—ೠಅನà³à²¨à³ ತೆಗೆಯಿರಿ";
+$lang['Repeat the slideshow'] = "ಪà³à²°à²¦à²°à³à²¶à²¿à²•à³†à²¯à²¨à³à²¨à³ ಪà³à²¨à²°à²¾à²µà²°à³à²¤à²¿à²¸à²¿";
+$lang['representative'] = 'ಸಂಪà³à²Ÿà²¦ ಕಿರà³à²šà²¿à²¤à³à²°';
+$lang['Requested album does not exist'] = 'ಕೋರಿಕೆಯ ಸಂಪà³à²Ÿ ಅಸà³à²¤à²¿à²¤à³à²µà²¦à²²à³à²²à²¿à²²à³à²².';
+$lang['Requested tag does not exist'] = 'ಕೋರಿಕೆಯ ಟà³à²¯à²¾à²—ೠಅಸà³à²¤à²¿à²¤à³à²µà²¦à²²à³à²²à²¿à²²à³à²²';
+$lang['Reset to default values'] = "ಪೂರà³à²µà²¨à²¿à²¯à³‹à²œà²¿à²¤ ಮೌಲà³à²¯à²—ಳಿಗೆ ಮರà³à²¹à³Šà²‚ದಿಸಿ";
+$lang['Reset'] = "ಮರà³à²¹à³Šà²‚ದಿಸಿ";
+$lang['Retrieve password'] = 'ಗà³à²ªà³à²¤à²ªà²¦à²µà²¨à³à²¨à³ ಮರಳಿ ಪಡೆಯಿರಿ';
+$lang['Return to home page'] = 'ಮರಳಿ ಮà³à²–ಪà³à²Ÿà²•à³à²•à³†';
+$lang['return to normal view mode'] = "ಸಾಮಾನà³à²¯ ವೀಕà³à²·à²£à³†à²—ೆ ಮರಳಿ";
+$lang['return to the display of all photos'] = "ಎಲà³à²²à²¾ ಚಿತà³à²°à²—ಳ ಪà³à²°à²¦à²°à³à²¶à²¨à²•à³à²•à³† ಮರಳಿ";
+$lang['Search by date'] = "ದಿನಾಂಕದಂತೆ ಹà³à²¡à³à²•à²¿";
+$lang['Search for all terms'] = "ಎಲà³à²²à²¾ ಪದಗಳಿಗಾಗಿ ಹà³à²¡à³à²•à²¿";
+$lang['Search for any term'] = "ಯಾವà³à²¦à²¾à²¦à²°à³Šà²‚ದೠಪದಕà³à²•à²¾à²—ಿ ಹà³à²¡à³à²•à²¿";
+$lang['Search for Author'] = "ಲೇಖಕರ ಹೆಸರಿನಂತೆ ಹà³à²¡à³à²•à²¿";
+$lang['Search for words'] = "ಪದಗಳಂತೆ ಹà³à²¡à³à²•à²¿";
+$lang['Search in albums'] = "ಸಂಪà³à²Ÿà²—ಳಲà³à²²à²¿ ಹà³à²¡à³à²•à²¿";
+$lang['Search in sub-albums'] = "ಉಪ-ಸಂಪà³à²Ÿà²—ಳಲà³à²²à²¿ ಹà³à²¡à³à²•à²¿";
+$lang['Search results'] = "ಹà³à²¡à³à²•à²¾à²Ÿà²¦ ಫಲಿತಾಂಶಗಳà³";
+$lang['Search rules'] = "ಹà³à²¡à³à²•à²¾à²Ÿà²¦ ಮಾನದಂಡಗಳà³";
+$lang['Search tags'] = "ಟà³à²¯à²¾à²—ೠಗಳನà³à²¨à³ ಹà³à²¡à³à²•à²¿";
+$lang['Search'] = "ಹà³à²¡à³à²•à²¿";
+$lang['search'] = "ಹà³à²¡à³à²•à²¿";
+$lang['searched words : %s'] = 'ಹà³à²¡à³à²•à²²à³à²ªà²Ÿà³à²Ÿ ಪದಗಳà³: %s';
+$lang['Send my connection settings by email'] = 'ನನà³à²¨ ಸಂಪರà³à²•à²¦ ವಿವರಗಳನà³à²¨à³ ಮಿಂಚೆಯ ಜೊತೆ ಕಳà³à²¹à²¿à²¸à²¿.';
+$lang['Sent by'] = "ಇವರಿಂದ ಕಳà³à²¹à²¿à²¸à²²à²¾à²—ಿದೆ";
+$lang['set as album representative'] = "ಸಂಪà³à²Ÿà²¦ thumbnail ನಂತೆ ಹೊಂದಿಸಿ";
+$lang['Show file metadata'] = "ಕಡತದ ಮೆಟಾಡೇಟಾ ವನà³à²¨à³ ತೋರಿಸಿ";
+$lang['Show latest comments first'] = 'ಇತà³à²¤à³€à²šà²¿à²¨ ಟಿಪà³à²ªà²£à²¿à²—ಳನà³à²¨à³ ಮೊದಲೠತೋರಿಸಿ';
+$lang['Show number of comments'] = "ಟಿಪà³à²ªà²£à²¿à²—ಳ ಸಂಖà³à²¯à³†à²¯à²¨à³à²¨à³ ತೋರಿಸಿ";
+$lang['Show number of hits'] = "ಭೇಟಿಗಳ ಸಂಖà³à²¯à³†à²¯à²¨à³à²¨à³ ತೋರಿಸಿ";
+$lang['Show oldest comments first'] = 'ಹಳೆಯ ಟಿಪà³à²ªà²£à²¿à²—ಳನà³à²¨à³ ಮೊದಲೠತೋರಿಸಿ';
+$lang['show tag cloud'] = "ಟà³à²¯à²¾à²—ೠಕà³à²²à³Œà²¡à³ ಅನà³à²¨à³ ತೋರಿಸಿ";
+$lang['Since'] = "ತರà³à²µà²¾à²¯";
+$lang['slideshow'] = "ಚಿತà³à²° ಪà³à²°à²¦à²°à³à²¶à²¿à²•à³†";
+$lang['small'] = 'S - ಚಿಕà³à²•à²¦à²¾à²¦';
+$lang['Someone requested that the password be reset for the following user account:'] = 'ಈ ಕೆಳಗಿನ ಬಳಕೆದಾರರ ಖಾತೆಯ ಗà³à²ªà³à²¤à²ªà²¦à²µà²¨à³à²¨à³ ಬದಲಾಯಿಸಲೠಮನವಿ ಸಲà³à²²à²¿à²¸à²¿à²¦à³à²¦à²¾à²°à³†:';
+$lang['Sort order'] = "ಅನà³à²•à³à²°à²®à²£à²¿à²•à³†à²¯ ಕà³à²°à²®";
+$lang['Specials'] = "ವಿಶೇಷವಾದವà³à²—ಳà³";
+$lang['stop the slideshow'] = "ಪà³à²°à²¦à²°à³à²¶à²¿à²•à³†à²¯à²¨à³à²¨à³ ನಿಲà³à²²à²¿à²¸à²¿";
+$lang['Submit'] = "ಸಲà³à²²à²¿à²¸à²¿";
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'ಯಶಸà³à²µà²¿à²¯à²¾à²—ಿ ನೋಂದಾಯಿಸಲಾಗಿದೆ, ನಿಮà³à²® ಸಂಪರà³à²•à²¦ ವಿವರಗಳಿರà³à²µ ಮಿಂಚೆ ಸಧà³à²¯à²¦à²²à³à²²à³‡ ನಿಮಗೆ ಸೇರಲಿದೆ. ಸà³à²¸à³à²µà²¾à²—ತ!';
+$lang['Tag results for'] = "ಟà³à²¯à²¾à²—ೠನ ಫಲಿತಾಂಶಗಳೠ:";
+$lang['Tag'] = "ಟà³à²¯à²¾à²—à³";
+$lang['Tags'] = "ಟà³à²¯à²¾à²—ೠಗಳà³";
+$lang['Thank you for registering at %s!'] = '%s ರಲà³à²²à²¿ ನೋಂದಾಯಿಕೊಂಡಿದà³à²¦à²•à³à²•à²¾à²—ಿ ಧನà³à²¯à²µà²¾à²¦à²—ಳೠ!';
+$lang['the beginning'] = "ಆರಂಭ";
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'ಚಿತà³à²°à²¶à²¾à²²à³† (ಗà³à²¯à²¾à²²à²°à²¿) ಯನà³à²¨à³ ನಿರà³à²µà²¹à²£à³†à²—ಾಗಿ ತಾತà³à²•à²¾à²²à²¿à²•à²µà²¾à²—ಿ ತಡೆಹಿಡಿಯಲಾಗಿದೆ. ದಯವಿಟà³à²Ÿà³ ನಂತರ ಮತà³à²¤à³Šà²®à³à²®à³† ಭೇಟಿ ಕೊಡಿ.';
+$lang['The number of photos per page must be a not null scalar'] = 'ಪà³à²°à²¤à²¿ ಪà³à²Ÿà²¦à²²à³à²²à²¿à²¨ ಚಿತà³à²°à²—ಳ ಸಂಖà³à²¯à³† ಶೂನà³à²¯à²•à³à²•à²¿à²‚ತ ಹೆಚà³à²šà³ ಇರಬೇಕà³';
+$lang['The passwords do not match'] = 'ಪà³à²°à²µà³‡à²¶à²ªà²¦à²—ಳೠಹೊಂದಿಕೆಯಾಗà³à²¤à³à²¤à²¿à²²à³à²²';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = "ಈ RSS feed ಈ ಜಾಲತಾಣದ ಆ ಎಲà³à²²à²¾ ಹೊಸ ಸಂಗತಿಗಳ ತಿಳà³à²µà²³à²¿à²•à³† ನೀಡà³à²¤à³à²¤à²¦à³† : ಹೊಸ ಚಿತà³à²°à²—ಳà³, ಉನà³à²¨à²¤à³€à²•à²°à²¿à²¸à²¿à²¦ ಸಂಪà³à²Ÿà²—ಳà³,ಹೊಸ ಟಿಪà³à²ªà²£à²¿à²—ಳà³. RSS feed reader ನ ಜೊತೆ ಉಪಯೋಗಿಸಿ. (The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.)";
+$lang['the username must be given'] = "ಬಳಕೆದಾರರ ಹೆಸರೠಕಡà³à²¡à²¾à²¯";
+$lang['This author modified following comment:'] = 'ಈ ಲೇಖಕರೠಈ ಕೆಳಗಿನ ಟಿಪà³à²ªà²£à²¿à²¯à²¨à³à²¨à³ ತಿದà³à²¦à³à²ªà²¡à²¿à²®à²¾à²¡à²¿à²¦à³à²¦à²¾à²°à³†:';
+$lang['This author removed the comment with id %d'] = 'ಈ ಲೇಖಕರೠಟಿಪà³à²ªà²£à²¿ ಯನà³à²¨à³ ತೆಗೆದಿದà³à²¦à²¾à²°à³†, ಟಿಪà³à²ªà²£à²¿ id : %d';
+$lang['this email address is already in use'] = "ಈ ಮಿಂಚೆ ವಿಳಾಸ ಈಗಾಗಲೇ ಬಳಕೆಯಲà³à²²à²¿à²¦à³†";
+$lang['This login is already used by another user'] = "ಈ ಲಾಗಿನೠಅನà³à²¨à³ ಈಗಾಗಲೇ ಇನà³à²¨à³Šà²¬à³à²¬ ಬಳಕೆದಾರರೠಬಳಸà³à²¤à³à²¤à²¿à²¦à³à²¦à²¾à²°à³† ";
+$lang['this login is already used'] = "ಈ ಲಾಗಿನೠಈಗಾಗಲೇ ಬಳಕೆಯಲà³à²²à²¿à²¦à³†";
+$lang['To reset your password, visit the following address:'] = 'ನಿಮà³à²® ಪà³à²°à²µà³‡à²¶à²ªà²¦à²µà²¨à³à²¨à³ ಬದಲಾಯಿಸಲೠಈ ವಿಳಾಸಕà³à²•à³† ಭೇಟಿ ಕೊಡಿ :';
+$lang['today'] = "ಇಂದà³";
+$lang['Unknown feed identifier'] = "ಅನಾಮಿಕ feed ಗà³à²°à³à²¤à³";
+$lang['Unknown identifier'] = "ಅನಾಮಿಕ ಗà³à²°à³à²¤à³";
+$lang['Update your rating'] = "ನಿಮà³à²® ದರà³à²œà³†à²¯à²¨à³à²¨à³ ಉನà³à²¨à²¤à³€à²•à²°à²¿à²¸à²¿";
+$lang['useful when password forgotten'] = 'ಈ ಮಾಹಿತಿ, ಪà³à²°à²µà³‡à²¶à²ªà²¦ ಮರೆತà³à²¹à³‹à²¦ ಸಂದರà³à²­à²¦à²²à³à²²à²¿ ಉಪಯà³à²•à³à²¤';
+$lang['User "%s" has no email address, password reset is not possible'] = 'ಬಳಕೆದಾರ "%s" ಮಿಂಚೆ ವಿಳಾಸ ನಮೂದಿಸಿಲà³à²², ಪà³à²°à²µà³‡à²¶à²ªà²¦ ಬದಲಾವಣೆ ಸಾಧà³à²¯à²µà²¿à²²à³à²²';
+$lang['User comments'] = "ಬಳಕೆದಾರರ ಟಿಪà³à²ªà²£à²¿à²—ಳà³";
+$lang['User: %s'] = "ಬಳಕೆದಾರ: %s";
+$lang['Username "%s" on gallery %s'] = '%s ಚಿತà³à²°à²¶à²¾à²²à³† (ಗà³à²¯à²¾à²²à²°à²¿)ಯಲà³à²²à²¿ "%s" ಬಳಕೆದಾರ ';
+$lang['Username modification'] = 'ಬಳಕೆದಾರರ ತಿದà³à²¦à³à²ªà²¡à²¿';
+$lang['Username or email'] = 'ಬಳಕೆದಾರರ ಹೆಸರೠಅಥವಾ ಮಿಂಚೆ ವಿಳಾಸ';
+$lang['Username'] = "ಬಳಕೆದಾರರ ಹೆಸರà³";
+$lang['Username is mandatory'] = 'ಬಳಕೆದಾರರ ಹೆಸರೠಕಡà³à²¡à²¾à²¯';
+$lang['Username: %s'] = 'ಬಳಕೆದಾರರ ಹೆಸರà³: %s';
+$lang['View in'] = 'ರ ದರà³à²¶à²¨';
+$lang['View'] = "ದರà³à²¶à²¨";
+$lang['Visits'] = "ಭೇಟಿಗಳà³";
+$lang['Visits, high &rarr; low'] = 'ಭೇಟಿಗಳà³, ಹೆಚà³à²šà³ &rarr; ಕಡಿಮೆ';
+$lang['Visits, low &rarr; high'] = 'ಭೇಟಿಗಳà³, ಕಡಿಮೆ &rarr; ಹೆಚà³à²šà³';
+$lang['Website'] = 'ಜಾಲತಾಣ';
+$lang['Webmaster'] = "ವೆಬೠಮಾಸà³à²Ÿà²°à³";
+$lang['Week %d'] = "ವಾರ : %d";
+$lang['Welcome to your Piwigo photo gallery!'] = 'ನಿಮà³à²® Piwigo ಚಿತà³à²° ಶಾಲೆ (ಗà³à²¯à²¾à²²à²°à²¿) ಗೆ ಸà³à²µà²¾à²—ತ!';
+$lang['Welcome'] = 'ಸà³à²µà²¾à²—ತ';
+$lang['wrong date'] = "ದಿನಾಂಕ ತಪà³à²ªà²¾à²—ಿದೆ";
+$lang['xlarge'] = 'XL - ಅತಿ ದೊಡà³à²¡à²¦à³';
+$lang['xsmall'] = 'XS - ಅತಿ ಚಿಕà³à²•à²¦à³';
+$lang['xxlarge'] = 'XXL - ದೊಡà³à²¡à²¦à³';
+$lang['Yes'] = "ಹೌದà³";
+$lang['You are not authorized to access the requested page'] = "ನೀವೠಬಯಸà³à²¤à³à²¤à²¿à²¯à²°à³à²µ ಪà³à²Ÿà²µà²¨à³à²¨à³ ತಲà³à²ªà²²à³ ನಿಮಗೆ ಸಮà³à²®à²¤à²¿à²¯à²¿à²²à³à²². ";
+$lang['You will receive a link to create a new password via email.'] = 'ಹೊಸ ಪà³à²°à²µà³‡à²¶à²ªà²¦ ವನà³à²¨à³ ರಚಿಸà³à²µ ಲಿಂಕೠಅನà³à²¨à³ ನಿಮಗೆ ಮಿಂಚೆಯ ಮೂಲಕ ಕಳà³à²¹à²¿à²¸à²²à²¾à²—à³à²¤à³à²¤à²¦à³†.';
+$lang['Your comment has been registered'] = "ನಿಮà³à²® ಟಿಪà³à²ªà²£à²¿à²¯à²¨à³à²¨à³ ನೋಂದಾಯಿಸಲಾಗಿದೆ ";
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = "ನೋಂದಾವಣೆಯ ಮಾನದಂಡಗಳನà³à²¨à³ ನಿಮà³à²® ಟಿಪà³à²ªà²£à²¿ ಪೂರೈಸಿಲà³à²²à²µà²¾à²¦à³à²¦à²°à²¿à²‚ದ ಅದನà³à²¨à³ ನೋದಾಯಿಸಲಾಗಿಲà³à²².";
+$lang['Your favorites'] = "ನಿಮà³à²® ಅಚà³à²šà³à²®à³†à²šà³à²šà²¿à²¨à²µà³à²—ಳà³";
+$lang['Your Gallery Customization'] = "ನಿಮà³à²® ಚಿತà³à²°à²¶à²¾à²²à³† (ಗà³à²¯à²¾à²²à²°à²¿) ಯ ವಿನà³à²¯à²¾à²¸";
+$lang['Your password has been reset'] = 'ನಿಮà³à²® ಗà³à²ªà³à²¤à²ªà²¦à²µà²¨à³à²¨à³ ಬದಲಾಯಿಸಲಾಗಿದೆ';
+$lang['Your username has been successfully changed to : %s'] = 'ನಿಮà³à²® ಬಳಕೆದಾರರ ಹೆಸರನà³à²¨à³ %s ಗೆ ಬದಲಾಯಿಸಲಾಗಿದೆ';
+$lang['Your website URL is invalid'] = 'ನಿಮà³à²® ಜಾಲತಾಣ ಪà³à²Ÿà²¦ ವಿಳಾಸ (URL) ಅಸಿಂಧà³à²µà²¾à²—ಿದೆ';
+$lang['mandatory'] = 'ಕಡà³à²¡à²¾à²¯';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... or please deactivate this message, I will find my way by myself';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Anti-flood system: please wait a moment before trying to post another comment';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Bad status for user "guest", default status will be used. Please notify the webmaster.';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Cookies are blocked or not supported by your browser. You must enable cookies to log in.';
+$lang['Default'] = 'ಪೂರà³à²µà²¨à²¿à²¯à³‹à²œà²¿à²¤';
+$lang['Empty query. No criteria has been entered.'] = 'Empty query. No criteria have been entered.';
+$lang['IP: %s'] = 'IP: %s';
+$lang['%d Kb'] = '%d Kb';
+$lang['thumb'] = 'ಕಿರà³à²šà²¿à²¤à³à²°';
+$lang['square'] = 'ಚೌಕಟà³à²Ÿà³';
+$lang['Thumbnails'] = 'ಕಿರà³à²šà²¿à²¤à³à²°à²—ಳà³';
+$lang['Sort by'] = 'ಈ ಅನà³à²•à³à²°à²®à²£à²¿à²•à³†à²¯à²‚ತೆ';
+$lang['SQL queries in'] = 'SQL queries in';
+$lang['RSS feed'] = 'RSS feed';
+$lang['Powered by'] = 'Powered by';
+$lang['N/A'] = 'N/A';
+$lang['Email'] = 'ಮಿಂಚೆ';
+$lang['First Page'] = 'ಮೊದಲ ಪà³à²Ÿ';
+$lang['Go back to the album'] = 'ಸಂಪà³à²Ÿà²•à³à²•à³† ಹಿಂತಿರà³à²—ಿ';
+$lang['Last Page'] = 'ಕೊನೆಯ ಪà³à²Ÿ';
+$lang['%d photos per page'] = '%d ಚಿತà³à²°à²—ಳೠಪà³à²°à²¤à²¿ ಪà³à²Ÿà²•à³à²•à³†';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'ಪà³à²°à²µà³‡à²¶à²ªà²¦à²¦ ಅನà³à²®à³‹à²¦à²¨à³† ಕಾಣೆಯಾಗಿದೆ. ದಯವಿಟà³à²Ÿà³ ನಿಮà³à²® ಆಯà³à²•à³†à²¯ ಪà³à²°à²µà³‡à²¶à²ªà²¦à²µà²¨à³à²¨à³ ಅನà³à²®à³‹à²¦à²¿à²¸à²¿.';
+$lang['Password is missing. Please enter the password.'] = 'ಪà³à²°à²µà³‡à²¶à²ªà²¦ ಕಾಣೆಯಾಗಿದೆ. ದಯವಿಟà³à²Ÿà³ ಪà³à²°à²µà³‡à²¶à²ªà²¦à²µà²¨à³à²¨à³ ನಮೂದಿಸಿ.';
+$lang['Theme'] = 'ಥೀಮà³';
+?> \ No newline at end of file
diff --git a/language/kn_IN/install.lang.php b/language/kn_IN/install.lang.php
new file mode 100755
index 000000000..4ddad7b18
--- /dev/null
+++ b/language/kn_IN/install.lang.php
@@ -0,0 +1,68 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+$lang['Start Install'] = 'ಸà³à²¥à²¾à²ªà²¨à²¾ ಕಾರà³à²¯à²µà²¨à³à²¨à³ ಆರಂಭಿಸಿ';
+$lang['verification'] = 'ಪರಿಶೀಲನೆ';
+$lang['user password given by your host provider'] = 'ಹೋಸà³à²Ÿà³ ಪà³à²°à³Šà²µà³ˆà²¡à²°à³ ಒದಗಿಸಿರà³à²µ ನಿಮà³à²® ಬಳಕೆದಾರರ ಪà³à²°à²µà³‡à²¶à²ªà²¦ ';
+$lang['user login given by your host provider'] = 'ಹೋಸà³à²Ÿà³ ಪà³à²°à³Šà²µà³ˆà²¡à²°à³ ಒದಗಿಸಿರà³à²µ ನಿಮà³à²® ಬಳಕೆದಾರರ ಲಾಗಿನà³';
+$lang['please enter your password again'] = 'ನಿಮà³à²® ಪà³à²°à²µà³‡à²¶à²ªà²¦à²µà²¨à³à²¨à³ ಮತà³à²¤à³Šà²®à³à²®à³† ನಮೂದಿಸಿ';
+$lang['enter a login for webmaster'] = 'ವೆಬೠಮಾಸà³à²Ÿà²°à³ ನ ಲಾಗಿನೠಅನà³à²¨à³ ನಮೂದಿಸಿ';
+$lang['Welcome to your new installation of Piwigo!'] = 'ನಿಮà³à²® ಹೊಸ Piwigo ಸà³à²¥à²¾à²ªà²¨à²¾ ಕಾರà³à²¯à²•à³à²•à³† ಸà³à²¸à³à²µà²¾à²—ತ';
+$lang['Welcome to my photo gallery'] = 'ನನà³à²¨ ಚಿತà³à²°à²¶à²¾à²²à³† (ಗà³à²¯à²¾à²²à²°à²¿) ಗೆ ಸà³à²¸à³à²µà²¾à²—ತ.';
+$lang['User'] = 'ಬಳಕೆದಾರ';
+$lang['Sorry!'] = 'ಕà³à²·à²®à²¿à²¸à²¿!';
+$lang['Default gallery language'] = 'ಚಿತà³à²°à²¶à²¾à²²à³† (ಗà³à²¯à²¾à²²à²°à²¿)ಯ ಪೂರà³à²µà²¨à²¿à²¯à³‹à²œà²¿à²¤ ಭಾಷೆ';
+$lang['Host'] = 'ಹೋಸà³à²Ÿà³';
+$lang['Installation'] = 'ಸà³à²¥à²¾à²ªà²¨à³†';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'ಸಹಾಯ ಬೇಕೆ? ನಿಮà³à²® ಪà³à²°à²¶à³à²¨à³†à²—ಳನà³à²¨à³ <a href="%s">Piwigo message board</a> ನಲà³à²²à²¿ ಕೇಳಿ.';
+$lang['Just another Piwigo gallery'] = 'ಇದೠನಿಮà³à²®à²¦à³‡ Piwigo ಚಿತà³à²°à²¶à²¾à²²à³† (ಗà³à²¯à²¾à²²à²°à²¿)';
+$lang['Database name'] = 'ಡೇಟಾಬೇಸಿನ ಹೆಸರà³';
+$lang['Can\'t connect to server'] = 'ಸರà³à²µà²°à³ ನೊಂದಿಗೆ ಸಂಪರà³à²•à²¿à²¸à²²à³ ಸಾಧà³à²¯à²µà²¾à²—à³à²¤à³à²¤à²¿à²²à³à²².';
+$lang['Congratulations, Piwigo installation is completed'] = 'ಅಭಿನಂದನೆಗಳà³, ನಿಮà³à²® Piwigo ದ ಸà³à²¥à²¾à²ªà²¨à³† ಇದೀಗ ಯಶಸà³à²µà²¿à²¯à²¾à²—ಿ ಮà³à²—ಿದಿದೆ.';
+$lang['Admin configuration'] = 'ನಿರà³à²µà²¹à²£à³†à²—ಾರರ ಕಾರà³à²¯ ಸಿದà³à²§à²¤à³†à²—ಳೠ(Admin configuration)';
+$lang['Basic configuration'] = 'ಮೂಲ ಕಾರà³à²¯ ಸಿದà³à²§à²¤à³†à²—ಳೠ(Basic configuration)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'local/config/database.inc.php ಕಾರà³à²¯à²¸à²¿à²¦à³à²§à²¤à³† ಕಡತ ವನà³à²¨à³ ರೂಪಿಸà³à²µà²²à³à²²à²¿ ವಿಫಲ.';
+$lang['Database configuration'] = 'ಡೇಟಾಬೇಸೠಕಾರà³à²¯ ಸಿದà³à²§à²¤à³†à²—ಳೠ(Database configuration)';
+$lang['Download the config file'] = 'ಕಾರà³à²¯à²¸à²¿à²¦à³à²§à²¤à³† ಕಡತ (config file) ವನà³à²¨à³ ಇಳಿಸಿಕೊಳà³à²³à²¿';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'ಗಮನಿಸಿ : ನಿಮà³à²® ಕಾರà³à²¯ ಸಿದà³à²§à²¤à³†à²—ಳನà³à²¨à³ ನೀವೇ ಬದಲಾಯಿಸಬಹà³à²¦à³ ಮತà³à²¤à³ ಆನಂತರ ಅದರ ಬಳಕೆಗಾಗಿ Piwigo ಅನà³à²¨à³ ಮರà³à²šà²¾à²²à²¿à²¸à²¿.';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = '.htaccess ಕಡತವನà³à²¨à³ ರೂಪಿಸà³à²µà³à²¦à²° ಅಥವಾ ಮಾರà³à²ªà²¡à²¿à²¸à³à²µà³à²¦à²° ಮೂಲಕ Piwigo ನಿಮà³à²® ಕಾರà³à²¯ ಸಿದà³à²§à²¤à³†à²—ಳನà³à²¨à³ PHP 5 ಗೆ ವರà³à²—ಾಯಿಸಲೠಪà³à²°à²¯à²¤à³à²¨à²¿à²¸à³à²¤à³à²¤à²¦à³†.';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo ಗೆ PHP 5 ಅನà³à²¨à³ ಸಿಧà³à²§à²—ೊಳಿಸಲೠಸಾಧà³à²¯à²µà²¾à²—ಿಲà³à²².';
+$lang['Try to configure PHP 5'] = 'PHP 5 ಅನà³à²¨à³ ಸಿಧà³à²§à²—ೊಳಿಸಲೠಪà³à²°à²¯à²¤à³à²¨à²¿à²¸à²¿.';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'ಸà³à²¥à³à²ªà²¾à²ªà²¨à²¾ ಕಾರà³à²¯à²¦à²²à³à²²à²¿, ನೀವೠಕಾರà³à²¯à²¸à²¿à²¦à³à²§à²¤à³† ಕಡತ ವನà³à²¨à³ ಇಳಿಸಿಕೊಳà³à²³à²¬à²¹à³à²¦à³ ಮತà³à²¤à³ ಅದನà³à²¨à³ local/config ಡೈರಕà³à²Ÿà²°à²¿à²—ೆ ವರà³à²—ಾಯಿಸಬಹà³à²¦à³.';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning: database.inc.php must only contain what is in the textarea, no line return or space character)';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'ಡೇಟಾಬೇಸೠಟೇಬಲೠಗಳ ಹೆಸರà³à²—ಳಿಗೆ ಪೂರà³à²µà²ªà³à²°à²¤à³à²¯à²¯ ( prefix ) ಗಳನà³à²¨à³ ಅಳವಡಿಸà³à²¤à³à²¤à²¦à³†. (ಟೇಬಲೠಗಳನà³à²¨à³ ಉತà³à²¤à²® ರೀತಿಯಲà³à²²à²¿ ನಿರà³à²µà²¹à²¿à²¸à²²à³ ಇದೠನಿಮಗೆ ಸಹಾಯಕ)';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'ಯಾವà³à²¦à³‡ ಬಗೆಯ ಸಹಾಯಕà³à²•à³† ನಮà³à²® ಈ ಚರà³à²šà²¾à²µà³‡à²¦à²¿à²•à³† (forum) ಗಳನà³à²¨à³ ಬಳಸà³à²µà²²à³à²²à²¿ ಹಿಂಜರಿಯಬೇಡಿ : %s';
+$lang['Database table prefix'] = 'ಡೇಟಾಬೇಸೠಟೇಬಲೠಗಳ ಪೂರà³à²µà²ªà³à²°à²¤à³à²¯à²¯ ( prefix )';
+$lang['Password ']['confirm'] = 'ಪà³à²°à²µà³‡à²¶à²ªà²¦ [ಖಾತà³à²°à²¿]';
+$lang['PHP 5 is required'] = 'PHP 5 ಅತà³à²¯à²—ತà³à²¯à²µà²¾à²—ಿದೆ.';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'ಈ ವಿವರಗಳನà³à²¨à³ ಸà³à²°à²•à³à²·à²¿à²¤à²µà²¾à²—ಿ ಇಡಿ, ಇದೠನಿಮಗೆ ನಿರà³à²µà²¹à²£à²¾ ಪà³à²¯à²¾à²¨à³†à²²à³ ಅನà³à²¨à³ ಬಳಸà³à²µà²¾à²— ಉಪಯೊಗಕà³à²•à³† ಬರà³à²¤à³à²¤à²¦à³†.';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'ಈ ವಿವರಗಳೠನೋಡà³à²—ರಿಗೆ ಲಭà³à²¯à²µà²¿à²°à³à²¤à³à²¤à²µà³†, ಜಾಲತಾಣ ನಿರà³à²µà²¹à²£à²¾ ಕಾರà³à²¯à²•à³à²•à³† ಇದೠಅತà³à²¯à²—ತà³à²¯.';
+$lang['It appears your webhost is currently running PHP %s.'] = 'ನಿಮà³à²® ವೆಬೠಹೋಸà³à²Ÿà³ ಸಧà³à²¯à²•à³à²•à³† PHP %s ಅನà³à²¨à³ ಬಳಸà³à²¤à³à²¤à²¿à²¦à³†.';
+$lang['Hope to see you back soon.'] = 'ಮತà³à²¤à³† ಸಧà³à²¯à²¦à²²à³à²²à³‡ ಭೇಟಿಯಾಗೋಣ.';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'ಸರà³à²µà²°à³ ಅನà³à²¨à³ ಯಶಸà³à²µà²¿à²¯à²¾à²—ಿ ಸಂಪರà³à²•à²¿à²¸à²²à²¾à²—ಿದೆ, ಆದರೆ ಡೇಟಾಬೇಸೠಅನà³à²¨à³ ಸಂಪರà³à²•à²¿à²¸à²²à³ ಸಾಧà³à²¯à²µà²¾à²—à³à²¤à³à²¤à²¿à²²à³à²².';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'ತಾಣ ನಿರà³à²µà²¹à²£à³†à²—ಾರರ (ಸೈಟೠಅಡà³à²®à²¿à²¨à³) ನà³à²¨à³ ಸಂಪರà³à²•à²¿à²¸à²²à³ ಬಳಕೆದಾರರà³/ನೋಡà³à²—ರೠಈ ಮಿಂಚೆ ವಿಳಾಸವನà³à²¨à³ ಬಳಸಬಹà³à²¦à²¾à²—ಿದೆ';
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'PHP 5 ಗೆ ನೀವೠಹೇಗೆ ಬದಲಾಯಿಸಿಕೊಳà³à²³ ಬಹà³à²¦à³ ಎಂಬà³à²¦à²° ವಿವರಗಳನà³à²¨à³ ನಿಮà³à²® ಹೋಸà³à²Ÿà²¿à²‚ಗೠಪà³à²°à³Šà²µà³ˆà²¡à²°à³ ಅವರ ಸಹಾಯದಲà³à²²à²¿ ನೋಡಿರಿ.';
+$lang['also given by your host provider'] = 'ಹಾಗೂ ನಿಮà³à²® ಹೋಸà³à²Ÿà²¿à²‚ಗೠಪà³à²°à³Šà²µà³ˆà²¡à²°à³ ಅವರಿಂದ ಪೂರೈಸಿದೆ';
+$lang['webmaster login can\'t contain characters \' or "'] = 'ವೆಬೠಮಾಸà³à²Ÿà²°à³ ಲಾಗಿನೠ\' ಅಥವಾ " ಸಂಕೇತಾಕà³à²·à²°à²—ಳನà³à²¨à³ ಹೊಂದಿರಬಾರದà³';
+$lang['localhost or other, supplied by your host provider'] = 'ನಿಮà³à²® ಹೋಸà³à²Ÿà³ ಪà³à²°à³Šà²µà³ˆà²¡à²°à³ ಒದಗಿಸಿರà³à²µ ಲೋಕಲೠಹೋಸà³à²Ÿà³ ಅಥವಾ ಇತರೆ';
+?> \ No newline at end of file
diff --git a/language/kn_IN/iso.txt b/language/kn_IN/iso.txt
new file mode 100644
index 000000000..4168fbb49
--- /dev/null
+++ b/language/kn_IN/iso.txt
@@ -0,0 +1 @@
+ಕನà³à²¨à²¡ [IN] \ No newline at end of file
diff --git a/language/kn_IN/kn_IN.jpg b/language/kn_IN/kn_IN.jpg
new file mode 100644
index 000000000..a6d5c7e11
--- /dev/null
+++ b/language/kn_IN/kn_IN.jpg
Binary files differ
diff --git a/language/kn_IN/upgrade.lang.php b/language/kn_IN/upgrade.lang.php
new file mode 100755
index 000000000..c8e84f109
--- /dev/null
+++ b/language/kn_IN/upgrade.lang.php
@@ -0,0 +1,40 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Upgrade from version %s to %s'] = '%s ದಿಂದ %s ಕà³à²•à³† ಉನà³à²¨à²¤à³€à²•à²°à²¿à²¸à²¿';
+$lang['total SQL time'] = 'SQL ಸಮಯದ ಒಟà³à²Ÿà³ ಮೊತà³à²¤';
+$lang['total upgrade time'] = 'ಉನà³à²¨à²¤à³€à²•à²°à²£à²¦ ಸಮಯದ ಒಟà³à²Ÿà³ ಮೊತà³à²¤';
+$lang['You do not have access rights to run upgrade'] = 'ಉನà³à²¨à²¤à³€à²•à²°à²£à²µà²¨à³à²¨à³ ಕೈಗೊಳà³à²³à²²à³ ನಿಮಗೆ ಹಕà³à²•à³à²—ಳಿಲà³à²².';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'ಈ ಪà³à²Ÿà²µà³ ನಿಮà³à²® ಹಳೆಯ ಪಿವಿಗೋ ಆವೃತà³à²¤à²¿à²¯à²¿à²‚ದ ಹೊಸ ಆವೃತà³à²¤à²¿à²¯ ಡೇಟಾಬೇಸೠಗೆ ಉನà³à²¨à²¤à³€à²•à²°à²¿à²¸à²²à³ ಸೂಚಿಸà³à²¤à³à²¤à²¿à²¦à³†. ಉನà³à²¨à²¤à³€à²•à²°à²£à²¦ ಸಹಾಯಕವೠನೀವೠಸಧà³à²¯à²•à³à²•à³† <strong>release %s</strong> ಅಥವಾ ಅದರ ಸಮಾನವಾದà³à²¦à²¨à³à²¨à³ ಉಪಯೋಗಿಸà³à²¤à³à²¤à²¿à²¦à³à²¦à³€à²°à³†à²‚ದೠಅಂದà³à²•à³Šà²‚ಡಿದೆ.';
+$lang['User permissions and group permissions have been erased'] = 'ಬಳಕೆದಾರರ ಮತà³à²¤à³ ಗà³à²‚ಪà³à²—ಳ ಅನà³à²®à²¤à²¿à²—ಳನà³à²¨à³ ಅಳಿಸಲಾಗಿದೆ.';
+$lang['Upgrade'] = 'ಉನà³à²¨à²¤à³€à²•à²°à²¿à²¸à²¿';
+$lang['Upgrade informations'] = 'ಉನà³à²¨à²¤à³€à²•à²°à²£à²¦ ವಿವರಗಳà³';
+$lang['Statistics'] = 'ಅಂಕಿಅಂಶಗಳà³';
+$lang['SQL queries'] = 'SQL ಕà³à²µà³†à²°à²¿à²—ಳà³';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'à²à²¨à²¾à²¦à²¾à²°à³‚ ತೊಂದರೆ ಉಂಟಾಗಿದà³à²¦à²²à³à²²à²¿, ನಿರà³à²µà²¹à²£à³† ಚೆಕೠಇನೠಅನà³à²¨à³ ಮಾಡಿ [Administration>Tools>Maintenance] ';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'ಕಿರà³à²šà²¿à²¤à³à²°à²¦ ಪà³à²°à²¤à³à²¯à²¯ ಮತà³à²¤à³ ವೆಬೠಮಾಸà³à²Ÿà²°à³ ರ ಮಿಂಚೆ ವಿಳಾಸಗಳನà³à²¨à³ ಮಾತà³à²° ಈ ಹಿಂದಿನ ಕಾರà³à²¯à²¸à²¿à²¦à³à²§à²¤à²¾ ಪಟà³à²Ÿà²¿à²¯à²²à³à²²à²¿ ಉಳಿಸಲಾಗಿದೆ.';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'ಕೇವಲ ನಿರà³à²µà²¹à²£à³†à²—ಾರರೠಮಾತà³à²° ಉನà³à²¨à²¤à³€à²•à²°à²£ ಮಾಡಬಹà³à²¦à³. ದಯವಿಟà³à²Ÿà³ ಈ ಕೆಳಗೆ ಸೈನೠಇನೠಆಗಿರಿ.';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = '<i>%s</i> ನಲà³à²²à²¿, ಮà³à²‚ದೆ <b>?></b>, ಸೇರಿಸಿ:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'ಮà³à²¨à³à²¨à³†à²šà³à²šà²°à²¿à²•à³†à²¯à²¾à²—ಿ, ಈ ಕೆಳಕಂಡ ಥೀಮೠಗಳನà³à²¨à³ ನಿಷà³à²•à³à²°à²¿à²¯à²—ೊಳಿಸಲಾಗಿದೆ. ಇವà³à²—ಳನà³à²¨à³ ಮರà³à²¸à²•à³à²°à²¿à²¯à²—ೊಳಿಸà³à²µ ಮà³à²¨à³à²¨ ಉನà³à²¨à²¤à³€à²•à²°à²¿à²¸à²¬à²¹à³à²¦à²¾à²¦ ಥೀಮೠಗಳಿಗಾಗಿ ಪರೀಕà³à²·à²¿à²¸à²¿.';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'ಮà³à²¨à³à²¨à³†à²šà³à²šà²°à²¿à²•à³†à²¯à²¾à²—ಿ, ಈ ಕೆಳಕಂಡ ಪà³à²²à²—ೠಇನೠಗಳನà³à²¨à³ ನಿಷà³à²•à³à²°à²¿à²¯à²—ೊಳಿಸಲಾಗಿದೆ. ಇವà³à²—ಳನà³à²¨à³ ಮರà³à²¸à²•à³à²°à²¿à²¯à²—ೊಳಿಸà³à²µ ಮà³à²¨à³à²¨ ಉನà³à²¨à²¤à³€à²•à²°à²¿à²¸à²¬à²¹à³à²¦à²¾à²¦ ಪà³à²²à²—ೠಇನೠಗಳಿಗಾಗಿ ಪರೀಕà³à²·à²¿à²¸à²¿.';
+$lang['All sub-albums of private albums become private'] = 'ಎಲà³à²²à²¾ ಖಾಸಗಿ ಸಂಪà³à²Ÿà²—ಳ ಉಪ-ಸಂಪà³à²Ÿà²—ಳೠಖಾಸಗಿಯಾಗà³à²¤à³à²¤à²µà³†';
+?> \ No newline at end of file
diff --git a/language/ko_KR/admin.lang.php b/language/ko_KR/admin.lang.php
new file mode 100755
index 000000000..22dad0685
--- /dev/null
+++ b/language/ko_KR/admin.lang.php
@@ -0,0 +1,62 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Add group'] = '그룹 추가';
+$lang['Add tags'] = '태그 추가';
+$lang['Add/delete a permalink'] = 'í¼ë§ˆë§í¬ 추가/ì‚­ì œ';
+$lang['Added by %s'] = '%sì´(ê°€) 추가함';
+$lang['%d guest'] = '%d ì†ë‹˜';
+$lang['%d guests'] = '%d ì†ë‹˜';
+$lang['%d hour'] = '%d 시간';
+$lang['%d hours'] = '%d 시간';
+$lang['%d day'] = '%d ì¼';
+$lang['%d days'] = '%d ì¼';
+$lang['%d group'] = '%d 그룹';
+$lang['%d groups'] = '%d 그룹';
+$lang['added'] = '추가ë¨';
+$lang['administrators'] = '관리ìž';
+$lang['all'] = '모ë‘';
+$lang['confirm'] = '확ì¸';
+$lang['group "%s" added'] = '그룹 "%s" 추가함';
+$lang['group "%s" deleted'] = '그룹 "%s" 삭제함';
+$lang['group "%s" updated'] = '그룹 "%s" 변경함';
+$lang['guest'] = 'ì†ë‹˜';
+$lang['pixels'] = '픽셀';
+$lang['public'] = '공개';
+$lang['registered users'] = '등ë¡ëœ 사용ìž';
+$lang['registration date'] = 'ë“±ë¡ ë‚ ì§œ';
+$lang['remove tags'] = '태그 삭제';
+$lang['remove this filter'] = '필터 삭제';
+$lang['remove title'] = '제목 삭제';
+$lang['selection'] = 'ì„ íƒ';
+$lang['show details'] = 'ìžì„¸ížˆ 보기';
+$lang['user_status_guest'] = 'ì†ë‹˜';
+$lang['Add a user'] = 'ì‚¬ìš©ìž ì¶”ê°€';
+$lang['Activate'] = '활성화';
+$lang['Active Languages'] = '활성 언어';
+$lang['Active Plugins'] = '활성 플러그ì¸';
+$lang['Add'] = '추가';
+$lang['Add New Language'] = '새로운 언어 추가';
+$lang['Add New Theme'] = '새로운 테마 추가';
+$lang['Add a filter'] = '필터 추가';
+$lang['Add a tag'] = '태그 추가';
+?> \ No newline at end of file
diff --git a/language/ko_KR/common.lang.php b/language/ko_KR/common.lang.php
index f81337efb..e62c02503 100644
--- a/language/ko_KR/common.lang.php
+++ b/language/ko_KR/common.lang.php
@@ -1,6 +1,6 @@
<?php
// +-----------------------------------------------------------------------+
-// | Piwigo - a PHP based picture gallery |
+// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
// | Copyright(C) 2008-2010 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: 한국어 [KR]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=509
Author: Piwigo team
Author URI: http://piwigo.org
@@ -36,8 +36,8 @@ $lang_info['zero_plural'] = true;
$lang['%d album updated'] = '%d ê°œì˜ ì•¨ë²”ì´ ì—…ë°ì´íŠ¸ ë˜ì—ˆìŠµë‹ˆë‹¤';
$lang['%d albums updated'] = '%d ê°œì˜ ì•¨ë²”ì´ ì—…ë°ì´íŠ¸ ë˜ì—ˆìŠµë‹ˆë‹¤';
-$lang['%d comment to validate'] = '%d ê°œì˜ ìŠ¹ì¸ ëŒ€ê¸°ì¤‘ì¸ ì½”ë©˜íŠ¸ê°€ 있습니다';
-$lang['%d comments to validate'] = '%d ê°œì˜ ìŠ¹ì¸ ëŒ€ê¸°ì¤‘ì¸ ì½”ë©˜íŠ¸ê°€ 있습니다';
+$lang['%d comment to validate'] = '%d ê°œì˜ ìŠ¹ì¸ ëŒ€ê¸°ì¤‘ì¸ ëŒ“ê¸€ì´ ìžˆìŠµë‹ˆë‹¤';
+$lang['%d comments to validate'] = '%d ê°œì˜ ìŠ¹ì¸ ëŒ€ê¸°ì¤‘ì¸ ëŒ“ê¸€ì´ ìžˆìŠµë‹ˆë‹¤';
$lang['%d new comment'] = '%d ê°œì˜ ìƒˆ ëŒ“ê¸€ì´ ìžˆìŠµë‹ˆë‹¤';
$lang['%d new comments'] = '%d ê°œì˜ ìƒˆ ëŒ“ê¸€ì´ ìžˆìŠµë‹ˆë‹¤';
$lang['%d comment'] = '댓글 %d 개';
@@ -46,20 +46,19 @@ $lang['%d hit'] = '조회수 %d';
$lang['%d hits'] = '조회수 %d';
$lang['%d new photo'] = '%d ê°œì˜ ìƒˆ 사진';
$lang['%d new photos'] = '%d ê°œì˜ ìƒˆ 사진';
-$lang['%d new user'] = '%d ëª…ì˜ ì‹ ê·œ 유저';
-$lang['%d new users'] = '%d ëª…ì˜ ì‹ ê·œ 유저';
+$lang['%d new user'] = '%d ëª…ì˜ ì‹ ê·œ 사용ìž';
+$lang['%d new users'] = '%d ëª…ì˜ ì‹ ê·œ 사용ìž';
$lang['About'] = 'About';
$lang['All tags'] = '모든 태그';
$lang['Any tag'] = '아무 태그';
$lang['At least one listed rule must be satisfied.'] = 'ì ì–´ë„ í•˜ë‚˜ì˜ ê¸°ì¤€ì„ ë§Œì¡±í•´ì•¼ 합니다.';
-$lang['Author'] = 'ì €ìž';
-$lang['Average rate'] = 'í‰ê· ';
+$lang['Author'] = '작성ìž';
$lang['Albums'] = '앨범';
$lang['Album'] = '앨범';
$lang['Close this window'] = '창 닫기';
$lang['Complete RSS feed (photos, comments)'] = 'RSS피드 (사진과 댓글)';
$lang['Confirm Password'] = '비밀번호 확ì¸';
-$lang['Connection settings'] = '연결 설정';
+$lang['Connection settings'] = 'ì ‘ì†ì„¤ì •';
$lang['Login'] = '로그ì¸';
$lang['Contact webmaster'] = '웹마스터ì—게 ì—°ë½í•˜ê¸°';
$lang['Create a new account'] = '새 계정 만들기';
@@ -72,7 +71,7 @@ $lang['Each listed rule must be satisfied.'] = 'ê°ê°ì˜ ê¸°ì¤€ì„ ë§Œì¡±í•´ì•¼
$lang['Email address'] = 'ë©”ì¼ ì£¼ì†Œ';
$lang['Enter your personnal informations'] = 'ê°œì¸ ì •ë³´ë¥¼ 입력해 주세요';
$lang['Error sending email'] = 'ë©”ì¼ì„ 보내는 중 오류가 ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤';
-$lang['File name'] = 'íŒŒì¼ ì´ë¦„';
+$lang['File name'] = '파ì¼ëª…';
$lang['File'] = '파ì¼';
$lang['Filesize'] = 'íŒŒì¼ í¬ê¸°';
$lang['Filter and display'] = '필터 후 표시';
@@ -93,7 +92,6 @@ $lang['Posted on'] = '등ë¡ì¼';
$lang['Profile'] = '프로필';
$lang['Quick connect'] = '빠른 연결';
$lang['RSS feed'] = 'RSS 피드';
-$lang['Rate'] = '등급';
$lang['Register'] = '신규 가입';
$lang['Registration'] = '새 ì‚¬ìš©ìž ë“±ë¡';
$lang['Related tags'] = '관련 태그';
@@ -111,18 +109,17 @@ $lang['Tags'] = '태그';
$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS 피드 ì•Œë¦¼ì€ ì´ ì‚¬ì´íŠ¸ì˜ 새 사진, 댓글, ì—…ë°ì´íŠ¸ëœ ì•¨ë²”ì— ëŒ€í•´ 알려ì¤ë‹ˆë‹¤. RSS 리ë”와 함께 사용하세요.';
$lang['Unknown feed identifier'] = 'ì•Œ 수 없는 피드 ì‹ë³„ìžìž…니다';
$lang['User comments'] = 'ì‚¬ìš©ìž ëŒ“ê¸€';
-$lang['Username'] = 'ì‚¬ìš©ìž ì´ë¦„';
+$lang['Username'] = '사용ìžëª…';
$lang['Visits'] = '방문ìž';
$lang['Webmaster'] = '웹마스터';
$lang['Week %d'] = 'ì´ë²ˆì£¼ %d';
$lang['About Piwigo'] = 'Piwigoì— ëŒ€í•´';
$lang['You are not authorized to access the requested page'] = 'ì´ íŽ˜ì´ì§€ì— 접근할 ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤';
-$lang['Add to caddie'] = 'ìºë””ì— ì¶”ê°€';
$lang['add this photo to your favorites'] = 'ì´ ì‚¬ì§„ì„ ì¦ê²¨ì°¾ê¸°ì— 추가';
$lang['Administration'] = '관리';
$lang['all'] = '모ë‘';
$lang['ascending'] = '오름차순';
-$lang['author(s) : %s'] = 'ìž‘ê°€ : %s';
+$lang['author(s) : %s'] = 'ìž‘ì„±ìž : %s';
$lang['Expand all albums'] = '모든 앨범 열기';
$lang['posted after %s (%s)'] = '%s (%s) ì´í›„ì˜ í¬ìŠ¤íŠ¸';
$lang['posted before %s (%s)'] = '%s (%s) ì´ì „ì˜ í¬ìŠ¤íŠ¸';
@@ -130,8 +127,7 @@ $lang['posted between %s (%s) and %s (%s)'] = '%s (%s) 부터 %s (%s) 까지ì˜
$lang['posted on %s'] = '%s ì˜ í¬ìŠ¤íŠ¸';
$lang['Best rated'] = '최고 등급';
$lang['display best rated photos'] = '최고 ë“±ê¸‰ì˜ ì‚¬ì§„ë“¤ 보기';
-$lang['caddie'] = 'ìºë””';
-$lang['Calendar'] = '캘린ë”';
+$lang['Calendar'] = '달력';
$lang['All'] = '모ë‘';
$lang['display each day with photos, month per month'] = '매ì¼ì„ 사진으로 표시하여 í•œë‹¬ì„ í‘œì‹œí•©ë‹ˆë‹¤';
$lang['View'] = '보기';
@@ -140,22 +136,21 @@ $lang['chronology_monthly_list'] = '월별 리스트';
$lang['chronology_weekly_list'] = '주간 리스트';
$lang['New on %s'] = '새로 등ë¡ë¨(%s)';
$lang['Click here if your browser does not automatically forward you'] = 'ìžë™ìœ¼ë¡œ ì´ë™ë˜ì§€ ì•Šì„ ë• ì´ê³³ì„ í´ë¦­í•˜ì„¸ìš”';
-$lang['comment date'] = 'ì˜ê²¬ 등ë¡ì¼';
-$lang['Comment'] = 'ì˜ê²¬';
+$lang['comment date'] = '댓글 등ë¡ì¼';
+$lang['Comment'] = '댓글';
$lang['Your comment has been registered'] = 'ëŒ“ê¸€ì´ ë“±ë¡ë˜ì—ˆìŠµë‹ˆë‹¤';
-$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'ë„ë°° 방지 시스템: 다른 ì˜ê²¬ì„ 달기 전까지 잠시만 기다려 주세요.';
-$lang['Your comment has NOT been registered because it did not pass the validation rules'] = '유효 ì¡°ê±´ì— ì–´ê¸‹ë‚œ ì˜ê²¬ì´ê¸° ë•Œë¬¸ì— ë“±ë¡ë˜ì§€ 않았습니다';
-$lang['An administrator must authorize your comment before it is visible.'] = '관리ìžì˜ 승ì¸ì´ 있기 전까지 다른 사용ìžë“¤ì´ ì´ ì˜ê²¬ì„ ë³¼ 수 없습니다.';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'ë„ë°° 방지 시스템: 다른 ëŒ“ê¸€ì„ ë‹¬ê¸° 전까지 잠시만 기다려 주세요.';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = '유효 ì¡°ê±´ì— ì–´ê¸‹ë‚œ ì˜ê²¬ì´ê¸° ë•Œë¬¸ì— ëŒ“ê¸€ì´ ë“±ë¡ë˜ì§€ 않았습니다';
+$lang['An administrator must authorize your comment before it is visible.'] = '관리ìžì˜ 승ì¸ì´ 있기 전까지 다른 사용ìžë“¤ì´ ì´ ëŒ“ê¸€ì„ ë³¼ 수 없습니다.';
$lang['This login is already used by another user'] = '다른 사용ìžê°€ ì´ë¯¸ ì´ ê³„ì •ì„ ì‚¬ìš©ì¤‘ìž…ë‹ˆë‹¤';
-$lang['Comments'] = 'ì˜ê²¬';
-$lang['Add a comment'] = 'ì˜ê²¬ 남기기';
+$lang['Comments'] = '댓글';
+$lang['Add a comment'] = '댓글 남기기';
$lang['created after %s (%s)'] = '%s ì´í›„ ìƒì„±ë¨ (%s)';
$lang['created before %s (%s)'] = '%s ì´ì „ ìƒì„±ë¨(%s)';
$lang['created between %s (%s) and %s (%s)'] = '%s (%s) ì—ì„œ %s (%s) 사ì´ì— ìƒì„±ë¨';
$lang['created on %s'] = '%s ì— ìƒì„±ë¨';
$lang['Customize'] = 'ê°œì¸í™”';
$lang['Your Gallery Customization'] = '갤러리 ê°œì¸í™”';
-$lang['day'] = 'ì •ë ¬';
$lang['Default'] = '기본값';
$lang['delete this photo from your favorites'] = 'ì´ ì‚¬ì§„ì„ ì¦ê²¨ì°¾ê¸°ì—ì„œ ì‚­ì œ';
$lang['Delete'] = '삭제';
@@ -175,17 +170,17 @@ $lang['guest'] = 'ì†ë‹˜';
$lang['Hello'] = '안녕하세요!';
$lang['available for administrators only'] = '관리ìžë§Œ 사용 가능합니다';
$lang['display this album'] = 'ì´ ì•¨ë²”ì„ í‘œì‹œ';
-$lang['display last user comments'] = '마지막 ì‚¬ìš©ìž ì˜ê²¬ì„ 표시';
+$lang['display last user comments'] = '마지막 ì‚¬ìš©ìž ëŒ“ê¸€ì„ í‘œì‹œ';
$lang['customize the appareance of the gallery'] = '갤러리 ì™¸í˜•ì„ ê°œì¸í™”합니다';
$lang['search'] = '검색';
$lang['Home'] = '홈';
-$lang['day'][0] = "ì¼ìš”ì¼";
-$lang['day'][1] = "월요ì¼";
-$lang['day'][2] = "화요ì¼";
-$lang['day'][3] = "수요ì¼";
-$lang['day'][4] = "목요ì¼";
-$lang['day'][5] = "금요ì¼";
-$lang['day'][6] = "토요ì¼";
+$lang['day'][0] = 'ì¼ìš”ì¼';
+$lang['day'][1] = '월요ì¼';
+$lang['day'][2] = '화요ì¼';
+$lang['day'][3] = '수요ì¼';
+$lang['day'][4] = '목요ì¼';
+$lang['day'][5] = '금요ì¼';
+$lang['day'][6] = '토요ì¼';
$lang['month'][10] = "10ì›”";
$lang['month'][11] = "11ì›”";
$lang['month'][12] = "12ì›”";
@@ -209,10 +204,6 @@ $lang['last %d days'] = '최근 %d ì¼';
$lang['Last'] = '마지막';
$lang['Logout'] = '로그아웃';
$lang['obligatory'] = '필수';
-$lang['Maximum photo height'] = '최대 높ì´';
-$lang['Maximum height must be a number superior to 50'] = '높ì´ê°€ ì ì–´ë„ 50ì´ìƒì€ ë˜ì–´ì•¼ 합니다';
-$lang['Maximum photo width'] = '최대 ë„“ì´';
-$lang['Maximum width must be a number superior to 50'] = 'ë„“ì´ê°€ ì ì–´ë„ 50ì´ìƒì€ ë˜ì–´ì•¼ 합니다';
$lang['display a calendar by creation date'] = '만들어진 날짜별로 달력 표시';
$lang['display all photos in all sub-albums'] = '하위 ì•¨ë²”ì˜ ëª¨ë“  사진 표시';
$lang['return to normal view mode'] = 'ì¼ë°˜ 모드로 ëŒì•„ê°';
@@ -223,7 +214,7 @@ $lang['Unknown identifier'] = 'ì•Œ 수 없는 ì‹ë³„ìž';
$lang['New password'] = '새 비밀번호';
$lang['Rate this photo'] = 'ì´ ì‚¬ì§„ í‰ê°€';
$lang['Next'] = '다ìŒ';
-$lang['no rate'] = '등급 ì—†ìŒ';
+$lang['no rate'] = 'í‰ì  ì—†ìŒ';
$lang['Photos posted within the last %d day.'] = '%d ì¼ ì´ë‚´ì— 등ë¡ëœ 사진.';
$lang['Photos posted within the last %d days.'] = '%d ì¼ ì´ë‚´ì— 등ë¡ëœ 사진.';
$lang['password updated'] = '비밀번호가 변경ë˜ì—ˆìŠµë‹ˆë‹¤';
@@ -247,11 +238,10 @@ $lang['login mustn\'t end with a space character'] = '공백문ìžë¡œ ë낼 수
$lang['login mustn\'t start with a space character'] = '공백문ìžë¡œ 시작할 수 없습니다';
$lang['this login is already used'] = 'ì´ ì •ë³´ëŠ” ì´ë¯¸ 사용중입니다';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'ë©”ì¼ ì£¼ì†ŒëŠ” xxx@yyy.eee 처럼 ë˜ì•¼ 합니다. (예 : jack@altern.org)';
-$lang['please enter your password again'] = '비밀번호를 다시 입력 해 주세요';
$lang['Auto login'] = 'ìžë™ 로그ì¸';
$lang['remove this tag from the list'] = '목ë¡ì—ì„œ ì´ íƒœê·¸ë¥¼ ì‚­ì œ';
$lang['representative'] = '대표사진';
-$lang['Search for Author'] = '작가로 검색';
+$lang['Search for Author'] = '작성ìžë¡œ 검색';
$lang['Search in albums'] = '앨범ì—ì„œ 검색';
$lang['Search by date'] = '날짜로 검색';
$lang['Date'] = '날짜';
@@ -287,15 +277,15 @@ $lang['Hello %s, your Piwigo photo gallery is empty!'] = '안녕하세요 %s, í˜
$lang['I want to add photos'] = 'ì‚¬ì§„ì„ ë“±ë¡í•˜ê³  싶습니다';
$lang['Manage this user comment: %s'] = 'ì´ ì‚¬ìš©ìž ëŒ“ê¸€ 관리: %s';
$lang['Email address is missing. Please specify an email address.'] = 'ë©”ì¼ ì£¼ì†Œëž€ì´ ë¹„ì—ˆìŠµë‹ˆë‹¤. ë©”ì¼ ì£¼ì†Œë¥¼ í™•ì¸ í•´ 주세요.';
-$lang['This author modified following comment:'] = 'ì´ ìž‘ê°€ê°€ ë‹¤ìŒ ëŒ“ê¸€ì„ ìˆ˜ì •í•˜ì˜€ìŠµë‹ˆë‹¤:';
-$lang['This author removed the comment with id %d'] = 'ì´ ìž‘ê°€ê°€ ë‹¤ìŒ ì‚¬ìš©ìžì˜ ëŒ“ê¸€ì„ ì‚­ì œí•˜ì˜€ìŠµë‹ˆë‹¤: %d';
+$lang['This author modified following comment:'] = 'ì´ ìž‘ì„±ìžê°€ ë‹¤ìŒ ëŒ“ê¸€ì„ ìˆ˜ì •í•˜ì˜€ìŠµë‹ˆë‹¤:';
+$lang['This author removed the comment with id %d'] = 'ì´ ìž‘ì„±ìžê°€ ë‹¤ìŒ ì‚¬ìš©ìžì˜ ëŒ“ê¸€ì„ ì‚­ì œí•˜ì˜€ìŠµë‹ˆë‹¤: %d';
$lang['%d rates'] = '%d ê°œì˜ í‰ê°€';
-$lang['A comment on your site'] = 'ë‹¹ì‹ ì˜ ì›¹ 사ì´íŠ¸ì— 코멘트가 있습니다';
+$lang['A comment on your site'] = 'ë‹¹ì‹ ì˜ ì›¹ 사ì´íŠ¸ì— ëŒ“ê¸€ì´ ìžˆìŠµë‹ˆë‹¤';
$lang['Accelerate diaporama speed'] = '슬ë¼ì´ë“œì‡¼ ì†ë„ ì¦ê°€';
$lang['Admin: %s'] = '관리ìž: %s';
$lang['Album results for'] = '앨범 결과';
$lang['Album: %s'] = '앨범: %s';
-$lang['Author: %s'] = 'ì €ìž: %s';
+$lang['Author: %s'] = '작성ìž: %s';
$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = '"ì†ë‹˜"사용ìžì˜ ìƒíƒœê°€ 나빠 기본 ìƒíƒœë¥¼ 사용합니다. 관리ìžì—게 알려주세요.';
$lang['Browser: %s'] = '브ë¼ìš°ì €: %s';
$lang['Change my password'] = '비밀번호 변경';
@@ -308,18 +298,123 @@ $lang['display only recently posted photos'] = '최근 등ë¡ëœ 사진만 ë³´ê¸
$lang['Edit'] = '편집';
$lang['Email: %s'] = 'ì´ë©”ì¼: %s';
$lang['Empty query. No criteria has been entered.'] = '없는 요청입니다. ì¡°ê±´ì´ ë¹„ì—ˆì„ ìˆ˜ 있습니다.';
-$lang['Enter your new password below.'] = '새 비밀번호를 입력해주세요.';
+$lang['Enter your new password below.'] = '새 암호를 입력해주세요.';
$lang['EXIF Metadata'] = 'EXIF 메타ë°ì´í„°';
$lang['from %s to %s'] = '%së‹˜ì´ %s님ì—게';
$lang['Hello %s,'] = '%s님 안녕하세요,';
$lang['html tags are not allowed in login'] = 'ë¡œê·¸ì¸ í¼ì— html태그는 허용ë˜ì§€ 않습니다';
$lang['If this was a mistake, just ignore this email and nothing will happen.'] = '만약 실수였다면 ì´ ì´ë©”ì¼ì„ ë¬´ì‹œí•˜ì…”ë„ ë©ë‹ˆë‹¤.';
-$lang['Interface theme'] = 'ì¸í„°íŽ˜ì´ìŠ¤ 테마';
$lang['Invalid key'] = 'ìž˜ëª»ëœ í‚¤';
$lang['Invalid username or email'] = 'ìž˜ëª»ëœ ì‚¬ìš©ìž ì´ë¦„ì´ë‚˜ ì´ë©”ì¼';
$lang['IP: %s'] = 'IP: %s';
$lang['IPTC Metadata'] = 'IPTC 메타ë°ì´í„°';
$lang['Menu'] = '메뉴';
-
-
+$lang['Email address is mandatory'] = 'ì´ë©”ì¼ ì£¼ì†ŒëŠ” 필수항목입니다';
+$lang['First Page'] = '첫 페ì´ì§€';
+$lang['Manual sort order'] = 'ì‚¬ìš©ìž ì •ì˜ ìˆœì„œ';
+$lang['N/A'] = 'N/A';
+$lang['Not repeat the slideshow'] = '슬ë¼ì´ë“œì‡¼ 반복하지 않기';
+$lang['Number of photos per page'] = '페ì´ì§€ìƒ 사진 수';
+$lang['Page not found'] = '페ì´ì§€ë¥¼ ì°¾ì„ ìˆ˜ 없습니다';
+$lang['Username: %s'] = '사용ìžëª…: %s';
+$lang['Website'] = '웹사ì´íŠ¸';
+$lang['You will receive a link to create a new password via email.'] = 'ì´ë©”ì¼ë¡œ 새로운 암호 ì„¤ì •ì„ ìœ„í•œ ë§í¬ê°€ 전송ë˜ì—ˆìŠµë‹ˆë‹¤.';
+$lang['Your password has been reset'] = '암호가 초기화 ë˜ì—ˆìŠµë‹ˆë‹¤.';
+$lang['Your website URL is invalid'] = '웹사ì´íŠ¸ URLì´ ì˜¬ë°”ë¥´ì§€ 않습니다';
+$lang['Password Reset'] = '암호 초기화';
+$lang['Return to home page'] = '홈페ì´ì§€ë¡œ ëŒì•„가기';
+$lang['Search results'] = '검색 결과';
+$lang['searched words : %s'] = 'ê²€ìƒ‰ëœ ë‹¨ì–´: %s';
+$lang['set as album representative'] = '앨범 표지로 등ë¡';
+$lang['slideshow'] = '슬ë¼ì´ë“œì‡¼';
+$lang['square'] = '사ê°í˜•';
+$lang['stop the slideshow'] = '슬ë¼ì´ë“œì‡¼ 정지';
+$lang['the beginning'] = '시작';
+$lang['the username must be given'] = '사용ìžëª…ì´ í•„ìš”í•©ë‹ˆë‹¤';
+$lang['this email address is already in use'] = 'ì´ë¯¸ ì‚¬ìš©ì¤‘ì¸ ì´ë©”ì¼ìž…니다';
+$lang['thumb'] = '대표사진';
+$lang['today'] = '오늘';
+$lang['Show latest comments first'] = '최신 ëŒ“ê¸€ì„ ë¨¼ì € 보기';
+$lang['Show number of comments'] = '댓글 개수 보기';
+$lang['Show oldest comments first'] = 'ì˜¤ëž˜ëœ ëŒ“ê¸€ì„ ë¨¼ì € 보기';
+$lang['Someone requested that the password be reset for the following user account:'] = '누군가가 ë‹¤ìŒ ì‚¬ìš©ìžì˜ 암호 초기화를 요청했습니다:';
+$lang['Thank you for registering at %s!'] = '%sì— ë“±ë¡ í•´ 주셔서 ê°ì‚¬í•©ë‹ˆë‹¤!';
+$lang['The passwords do not match'] = '암호가 ì¼ì¹˜í•˜ì§€ 않습니다';
+$lang['Thumbnails'] = 'ì¸ë„¤ì¼';
+$lang['User "%s" has no email address, password reset is not possible'] = 'ì‚¬ìš©ìž "%s"ì˜ ì´ë©”ì¼ ì •ë³´ê°€ 없어, 암호 초기화가 불가능합니다.';
+$lang['User: %s'] = '사용ìž: %s';
+$lang['Username is mandatory'] = '사용ìžëª…ì€ í•„ìˆ˜ 항목입니다.';
+$lang['Username modification'] = '사용ìžëª… 변경';
+$lang['Username or email'] = '사용ìžëª… í˜¹ì€ ì´ë©”ì¼';
+$lang['mandatory'] = '필수';
+$lang['Password: %s'] = '암호: %s';
+$lang['Pause of slideshow'] = '슬ë¼ì´ë“œì‡¼ ì¼ì‹œì •ì§€';
+$lang['Photo sizes'] = '사진 í¬ê¸°';
+$lang['Play of slideshow'] = '슬ë¼ì´ë“œì‡¼ 재ìƒ';
+$lang['Quick search'] = '빠른 검색';
+$lang['Repeat the slideshow'] = '슬ë¼ì´ë“œì‡¼ 반복';
+$lang['Requested album does not exist'] = '요청한 ì•¨ë²”ì´ ì¡´ìž¬í•˜ì§€ 않습니다';
+$lang['Requested tag does not exist'] = '요청한 태그가 존재하지 않습니다';
+$lang['Original'] = 'ì›ë³¸';
+$lang['Mobile'] = '모바ì¼';
+$lang['Bad request'] = 'ìž˜ëª»ëœ ìš”ì²­';
+$lang['Email'] = 'ì´ë©”ì¼';
+$lang['File name, A &rarr; Z'] = '파ì¼ëª…, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = '파ì¼ëª…, Z &rarr; A';
+$lang['Go back to the album'] = '앨범으로 ëŒì•„가기';
+$lang['Last Page'] = '마지막 페ì´ì§€';
+$lang['return to the display of all photos'] = '모든 사진 보기로 ëŒì•„가기';
+$lang['%d Kb'] = '%d KB';
+$lang['%d rate'] = '%dê°œì˜ í‰ì ';
+$lang['2small'] = 'XXS - tiny';
+$lang['xxlarge'] = 'XXL - huge';
+$lang['small'] = 'S - small';
+$lang['xlarge'] = 'XL - extra large';
+$lang['xsmall'] = 'XS - extra small';
+$lang['large'] = 'L - large';
+$lang['medium'] = 'M - medium';
+$lang['To reset your password, visit the following address:'] = '비밀번호 초기화를 위해 ë‹¤ìŒ ì£¼ì†Œë¥¼ 방문하십시오:';
+$lang['Show number of hits'] = 'ë°©ë¬¸ìž ìˆ˜ 보기';
+$lang['Permalink for album not found'] = 'ì•¨ë²”ì˜ Permalink를 ì°¾ì„ ìˆ˜ 없습니다';
+$lang['Piwigo encountered a non recoverable error'] = 'Piwigo가 복구할 수 없는 예외를 만났습니다.';
+$lang['Date created, new &rarr; old'] = 'ìƒì„±ì¼, 최신 &rarr; ì´ì „';
+$lang['Date created, old &rarr; new'] = 'ìƒì„±ì¼, ì´ì „ &rarr; 최신';
+$lang['Date posted, new &rarr; old'] = '작성ì¼, 최신 &rarr; ì´ì „';
+$lang['Date posted, old &rarr; new'] = '작성ì¼, ì´ì „ &rarr; 최신';
+$lang['Visits, high &rarr; low'] = '방문ìžìˆ˜, 내림차순';
+$lang['Visits, low &rarr; high'] = '방문ìžìˆ˜, 오름차순';
+$lang['Update your rating'] = 'í‰ì  변경';
+$lang['Reduce diaporama speed'] = '슬ë¼ì´ë“œì‡¼ ëŠë¦¬ê²Œ';
+$lang['Rating score, low &rarr; high'] = 'í‰ì , 오름차순';
+$lang['Photo title, A &rarr; Z'] = '사진 제목, A->Z';
+$lang['Photo title, Z &rarr; A'] = '사진 제목, Z->A';
+$lang['Rating score, high &rarr; low'] = 'í‰ì , 내림차순';
+$lang['Rating score'] = 'í‰ì ';
+$lang['useful when password forgotten'] = '암호를 ìžŠì€ ê²½ìš°ë¥¼ 대비';
+$lang['Username "%s" on gallery %s'] = '갤러리 %sì— ìžˆëŠ” 사용ìžëª… "%s"';
+$lang['Tag results for'] = '태그 겸색 결과 : ';
+$lang['The number of photos per page must be a not null scalar'] = '페ì´ì§€ë‹¹ 사진 수는 0ì´ ì•„ë‹Œ 정수여야 합니다';
+$lang['Password reset is not allowed for this user'] = '해당 사용ìžëŠ” 암호 초기화를 í•  수 없습니다.';
+$lang['Please enter your username or email address.'] = '사용ìžëª… í˜¹ì€ ì´ë©”ì¼ ì£¼ì†Œë¥¼ 입력하십시오.';
+$lang['Specials'] = '특집';
+$lang['Registration of %s'] = '%s 등ë¡';
+$lang['Search for all terms'] = '모든 단어로 검색';
+$lang['Search for any term'] = '아무 단어나 검색';
+$lang['Search for words'] = '단어로 검색';
+$lang['Your username has been successfully changed to : %s'] = '성공ì ìœ¼ë¡œ 사용ìžëª…ì„ %së¡œ 변경하였습니다.';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'ìˆ«ìž ì‹ë³„ìž, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'ìˆ«ìž ì‹ë³„ìž, 9 &rarr; 1';
+$lang['SQL queries in'] = 'SQL ì¿¼ë¦¬ì— ';
+$lang['Here are your connection settings'] = 'ì ‘ì† ì„¤ì •ì€ ë‹¤ìŒê³¼ 같습니다';
+$lang['Send my connection settings by email'] = 'ì ‘ì† ì„¤ì •ì„ ì´ë©”ì¼ë¡œ 보내기';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = '성공ì ìœ¼ë¡œ 가입ë˜ì—ˆìŠµë‹ˆë‹¤. 곧 ì ‘ì† ì„¤ì •ì´ ìžˆëŠ” ì´ë©”ì¼ì„ 받으실ê²ë‹ˆë‹¤. 환ì˜í•©ë‹ˆë‹¤.';
+$lang['View in'] = '다ìŒì—ì„œ 보기 : ';
+$lang['Search in sub-albums'] = '서브 앨범ì—ì„œ 검색';
+$lang['Desktop'] = '컴퓨터';
+$lang['Forbidden'] = '금지ë¨';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = '만약 오류로 ì´ ë©”ì¼ì„ 수신했다고 ìƒê°í•˜ì‹œë©´, %s ë¡œ ì—°ë½ ë°”ëžë‹ˆë‹¤.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = '암호 확ì¸ì´ ìž…ë ¥ë˜ì§€ 않았습니다. ì„ íƒí•œ 암호를 확ì¸í•˜ì‹­ì‹œì˜¤.';
+$lang['Password is missing. Please enter the password.'] = '암호가 ìž…ë ¥ë˜ì§€ 않았습니다. 암호를 입력하십시오.';
+$lang['%d photos per page'] = '페ì´ì§€ë‹¹ %d ê°œì˜ ì‚¬ì§„';
+$lang['Theme'] = '테마';
?> \ No newline at end of file
diff --git a/language/ko_KR/index.php b/language/ko_KR/index.php
index 17747c927..47198ca08 100644
--- a/language/ko_KR/index.php
+++ b/language/ko_KR/index.php
@@ -1,6 +1,6 @@
<?php
// +-----------------------------------------------------------------------+
-// | Piwigo - a PHP based picture gallery |
+// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
// | Copyright(C) 2008-2010 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
diff --git a/language/ko_KR/install.lang.php b/language/ko_KR/install.lang.php
new file mode 100755
index 000000000..e45fb817a
--- /dev/null
+++ b/language/ko_KR/install.lang.php
@@ -0,0 +1,60 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['also given by your host provider'] = '호스팅 공급ìžê°€ 제공';
+$lang['enter a login for webmaster'] = '웹마스터 사용ìžëª…ì„ ìž…ë ¥í•˜ì‹­ì‹œì˜¤';
+$lang['localhost or other, supplied by your host provider'] = 'localhost í˜¹ì€ í˜¸ìŠ¤íŒ… 공급ìžê°€ 제공한 ê°’';
+$lang['user login given by your host provider'] = '호스팅 공급ìžê°€ 제공한 ì‚¬ìš©ìž ì•„ì´ë””';
+$lang['user password given by your host provider'] = '호스팅 공급ìžê°€ 제공한 ì‚¬ìš©ìž ì•”í˜¸';
+$lang['webmaster login can\'t contain characters \' or "'] = '웹마스터 사용ìžëª…ì€ \' í˜¹ì€ " ì„ í¬í•¨ í•  수 없습니다';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = '설정 파ì¼ì„ 다운로드 하신 후 설치 ë””ë ‰í† ë¦¬ì˜ local/config ì— ë³µì‚¬ í•  ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤.';
+$lang['Admin configuration'] = 'ì„¤ì •ê´€ë¦¬ìž ì„œ';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = '필요하시면 ë§ì„¤ì´ì§€ ë§ê³  í¬ëŸ¼ì— 문ì˜í•˜ì„¸ìš”: %s';
+$lang['Visitors will be able to contact site administrator with this mail'] = '방문ê°ì´ ì´ ì´ë©”ì¼ ì£¼ì†Œë¡œ 사ì´íŠ¸ 관리ìžì—게 ì—°ë½ í•  것입니다.';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'ë°ì´í„°ë² ì´ìŠ¤ í…Œì´ë¸” ì´ë¦„ ì•žì— ì¶”ê°€ë©ë‹ˆë‹¤ (ë°ì´í„°ë² ì´ìŠ¤ í…Œì´ë¸”ì„ ìž˜ 관리할 수 있ë„ë¡ í•´ ì¤ë‹ˆë‹¤)';
+$lang['verification'] = '확ì¸';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'ë„ì›€ì´ í•„ìš”í•˜ì‹ ê°€ìš”? <a href="%s">Piwigo message board</a>ì— ë¬¼ì–´ë³´ì„¸ìš”.';
+$lang['Piwigo was not able to configure PHP 5.'] = 'PHP5 ì„¤ì •ì— ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤';
+$lang['Try to configure PHP 5'] = 'PHP5 설정 ì‹œë„중';
+$lang['Welcome to my photo gallery'] = '사진 ê°¤ëŸ¬ë¦¬ì— ì˜¤ì‹  ê²ƒì„ í™˜ì˜í•©ë‹ˆë‹¤';
+$lang['please enter your password again'] = '암호를 다시 입력하십시오';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'ë˜ë‹¤ë¥¸ 방법으로는 ìœ„ì˜ í…스트 ìƒìžì— 있는 ë¬¸ìž¥ì„ ë³µì‚¬í•˜ì—¬ "local/config/database.inc.php"ì— ë³µì‚¬í•˜ëŠ” 방법입니다.
+(경고: database.inc.php는 줄바꿈ì´ë‚˜ 스페ì´ìŠ¤ ì—†ì´ ìœ„ í…스트 ìƒìžì— 있는 내용만 í¬í•¨í•´ì•¼ 합니다. ';
+$lang['Congratulations, Piwigo installation is completed'] = '축하합니다, Piwigo설치가 ë났습니다';
+$lang['Default gallery language'] = '기본 언어';
+$lang['PHP 5 is required'] = 'PHP5가 필요합니다';
+$lang['Password ']['confirm'] = '암호 [확ì¸]';
+$lang['Sorry!'] = '죄송합니다!';
+$lang['Start Install'] = '설치 시작';
+$lang['User'] = '사용ìž';
+$lang['Basic configuration'] = '기본 설정';
+$lang['Can\'t connect to server'] = 'ì„œë²„ì— ì ‘ì† í•  수 없습니다';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = '축하합니다. Piwigo설치가 ë났습니다.';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'ì„¤ì •íŒŒì¼ local/conf/database.inc.php ì„ ë§Œë“¤ 수 없습니다.';
+$lang['Database configuration'] = '설정ë°ì´í„°ë² ì´ìŠ¤ ì„œ';
+$lang['Database name'] = 'ë°ì´í„°ë² ì´ìŠ¤ëª…';
+$lang['Database table prefix'] = 'ë°ì´í„°ë² ì´ìŠ¤ í…Œì´ë¸” 접미사';
+$lang['Download the config file'] = 'ì„¤ì •íŒŒì¼ ë‹¤ìš´ë¡œë“œ';
+$lang['Host'] = '트명호스트';
+$lang['Installation'] = '설치';
+$lang['It appears your webhost is currently running PHP %s.'] = '웹서버가 PHP %s를 사용중입니다';
+?> \ No newline at end of file
diff --git a/language/ko_KR/upgrade.lang.php b/language/ko_KR/upgrade.lang.php
new file mode 100755
index 000000000..41f34da14
--- /dev/null
+++ b/language/ko_KR/upgrade.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Only administrator can run upgrade: please sign in below.'] = '관리ìžë§Œ 업그레ì´ë“œë¥¼ 수행 í•  수 있습니다: 로그ì¸í•˜ì‹­ì‹œì˜¤.';
+$lang['SQL queries'] = 'SQL 쿼리';
+$lang['Statistics'] = '통계';
+$lang['Upgrade'] = '업그레ì´ë“œ';
+$lang['Upgrade from version %s to %s'] = '버전 %sì—ì„œ %së¡œ 업그레ì´ë“œ';
+$lang['Upgrade informations'] = '업그레ì´ë“œ ì •ë³´';
+$lang['You do not have access rights to run upgrade'] = '업그레ì´ë“œë¥¼ 수행 í•  ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤';
+$lang['total SQL time'] = 'ì´ SQL 수행시간';
+$lang['total upgrade time'] = 'ì´ ì—…ê·¸ë ˆì´ë“œ 수행시간';
+?> \ No newline at end of file
diff --git a/language/kok_IN/common.lang.php b/language/kok_IN/common.lang.php
index 2a2e43166..be5de6f13 100644
--- a/language/kok_IN/common.lang.php
+++ b/language/kok_IN/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/lb_LU/common.lang.php b/language/lb_LU/common.lang.php
new file mode 100644
index 000000000..0a1008f22
--- /dev/null
+++ b/language/lb_LU/common.lang.php
@@ -0,0 +1,269 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Lëtzebuergesch [LU]
+Version: 2.5.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=715
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Lëtzebuergesch ';
+$lang_info['country'] = 'Luxembourg';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'lb';
+$lang_info['zero_plural'] = true;
+
+
+$lang['day'][0] = 'Sonden';
+$lang['day'][1] = 'Méinden';
+$lang['day'][2] = 'Denschten';
+$lang['day'][3] = 'Mettwoch';
+$lang['day'][4] = 'Donneschten';
+$lang['day'][5] = 'Freiden';
+$lang['day'][6] = 'Samschten';
+$lang['%d album updated'] = '%d Album aktualiséiert';
+$lang['%d albums updated'] = '%d D\'Albumen aktualiséiert';
+$lang['%d comment'] = '%d Kommentar';
+$lang['%d comment to validate'] = '%d Kommentar fräigin';
+$lang['%d comments'] = '%d Kommentaren';
+$lang['%d comments to validate'] = '%d Kommentaren fräigin';
+$lang['%d hit'] = '%d Opruff';
+$lang['%d photo'] = 'Foto';
+$lang['%d photos'] = 'Fotoen';
+$lang['%d new user'] = 'neien Benotzer';
+$lang['%d new photos'] = 'nei Fotoen';
+$lang['%d new photo'] = 'nei Foto';
+$lang['%d new comments'] = 'nei Kommentaren';
+$lang['%d new comment'] = 'neien Kommentar';
+$lang['%d hits'] = 'Opriff';
+$lang['%d rates'] = 'Bewäertungen';
+$lang['(!) This comment requires validation'] = 'Dëse Kommentar muss iwwerpréift ginn';
+$lang['2small'] = 'klinzeg';
+$lang['A comment on your site'] = 'Ee Kommentar op hirer Homepage';
+$lang['About'] = 'Iwwert eis';
+$lang['About Piwigo'] = 'Iwert Piwingo';
+$lang['%d new users'] = 'nei Benotzer';
+$lang['%d rate'] = 'Bewäertung';
+$lang['Complete RSS feed (photos, comments)'] = 'RSS-Feed';
+$lang['Comment'] = 'Kommentar';
+$lang['Are you sure?'] = 'Si dir sécher';
+$lang['At least one listed rule must be satisfied.'] = 'Et muss opmanst eng Regel erfellt sin.';
+$lang['Author'] = 'Auteur';
+$lang['Auto login'] = 'Auto-Login';
+$lang['Calendar'] = 'Kalenner';
+$lang['Change my password'] = 'Mäi Passwuert änneren';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Een Administrateur muss äre Beitrag fräischalten éier en sichtbar ass.';
+$lang['Accelerate diaporama speed'] = 'Diashow méi séier';
+$lang['Administration'] = 'Administratioun';
+$lang['Album'] = 'Album';
+$lang['Album results for'] = 'Albumresultater fir';
+$lang['Albums'] = 'Albumen';
+$lang['All'] = 'Alles';
+$lang['All tags'] = 'All d\'Schlagwierder';
+$lang['... or browse your empty gallery'] = 'oder duerchwullt är eidel Gallerie';
+$lang['... or please deactivate this message, I will find my way by myself'] = 'oder iwwergéi dës Meldung. Ech gin eleng eens.';
+$lang['Rate this photo'] = 'Foto bewäerten';
+$lang['Recent albums'] = 'Neisten Albumen';
+$lang['Recent photos'] = 'Neisten Fotoen';
+$lang['Redirection...'] = 'Ëmleedung';
+$lang['Reduce diaporama speed'] = 'Diashow méi lues';
+$lang['Profile'] = 'Profil';
+$lang['RSS feed'] = 'RSS-Feed';
+$lang['Related tags'] = 'Matt de Schlagwierder';
+$lang['Piwigo encountered a non recoverable error'] = 'Piwigo ass op een net novollzéibare Feeler gestouss ';
+$lang['Pause of slideshow'] = 'Diashow unhalen';
+$lang['Photos only RSS feed'] = 'RSS-Feed (nëmmen Fotoen)';
+$lang['Piwigo Help'] = 'Piwigo-Hëllef';
+$lang['Play of slideshow'] = 'Diashow virufueren';
+$lang['Posted on'] = 'Agedroen den';
+$lang['Preferences'] = 'Astellungen';
+$lang['New password'] = 'Neit Passwuert';
+$lang['Next'] = 'Virun';
+$lang['No'] = 'Nee';
+$lang['Not repeat the slideshow'] = 'Diashow net widderhuelen';
+$lang['Notification'] = 'RSS-Feed';
+$lang['Original'] = 'Original';
+$lang['Page not found'] = 'D\'Säit net fond';
+$lang['Password'] = 'Passwuert';
+$lang['Password Reset'] = 'Passwuert zerécksetzen';
+$lang['Password forgotten'] = 'Passwuert vergiess';
+$lang['IPTC Metadata'] = 'IPTC-Metadaten';
+$lang['Keyword'] = 'Schlagwuert';
+$lang['Language'] = 'Sprooch';
+$lang['Links'] = 'Linken';
+$lang['Login'] = 'Umeldung';
+$lang['Logout'] = 'ofmellen';
+$lang['Menu'] = 'Menu';
+$lang['File'] = 'Datei';
+$lang['File name'] = 'Numm vun der Datei';
+$lang['Filter'] = 'Filter';
+$lang['Filter and display'] = 'filteren an uweisen';
+$lang['Forbidden'] = 'Verbueden';
+$lang['Hello'] = 'Moien';
+$lang['Help'] = 'Hëllef';
+$lang['Email'] = 'E-Mail';
+$lang['Email address'] = 'E-Mail-Adress';
+$lang['Email address is mandatory'] = 'E-Mail-Adress ass néideg';
+$lang['Favorites'] = 'Favoriten';
+$lang['Download this file'] = 'Datei eroflueden';
+$lang['Download'] = 'eroflueden';
+$lang['Connection settings'] = 'Umeldung';
+$lang['Contact'] = 'Kontakt';
+$lang['Contact webmaster'] = 'E-mail un de Webmaster';
+$lang['Date'] = 'Datum';
+$lang['Delete'] = 'läschen';
+$lang['Desktop'] = 'Desktop';
+$lang['Comments'] = 'Kommentaren';
+$lang['Username or email'] = 'Benotzernumm oder E-mail-Adress';
+$lang['Username'] = 'Benotzernumm';
+$lang['Sent by'] = 'Gescheckt vun';
+$lang['Show file metadata'] = 'Metadaten weisen';
+$lang['Sort by'] = 'Zortéieren no';
+$lang['Tag'] = 'Schlagwuert';
+$lang['Tags'] = 'Schlagwierder';
+$lang['Repeat the slideshow'] = 'Diashow widderhuelen';
+$lang['Reset'] = 'zerécksetzen';
+$lang['Retrieve password'] = 'Passwuert ofruffen';
+$lang['Search'] = 'sichen';
+$lang['Search by date'] = 'no engem Datum sichen';
+$lang['Search for Author'] = 'Sich nom Auteur';
+$lang['Search for words'] = 'No Wierder sichen';
+$lang['Search in albums'] = 'Sich an den Albumen';
+$lang['xsmall'] = 'zimlech kleng';
+$lang['xxlarge'] = 'ganz grouss';
+$lang['search'] = 'sichen';
+$lang['slideshow'] = 'Diashow';
+$lang['small'] = 'kleng';
+$lang['square'] = 'quadratesch';
+$lang['the beginning'] = 'Ufank';
+$lang['the username must be given'] = 'Benotzernumm feelt';
+$lang['today'] = 'haut';
+$lang['wrong date'] = 'Datum ass falsch';
+$lang['xlarge'] = 'besonnesch grouss';
+$lang['month']['12'] = 'Dezember';
+$lang['month']['1'] = 'Januar';
+$lang['month']['2'] = 'Februar';
+$lang['month']['3'] = 'Mäerz';
+$lang['month']['4'] = 'Abrëll';
+$lang['month']['5'] = 'Mee';
+$lang['month']['6'] = 'Juni';
+$lang['month']['7'] = 'Juli';
+$lang['month']['8'] = 'August';
+$lang['month']['9'] = 'September';
+$lang['no rate'] = 'nach keng Bewäertung';
+$lang['obligatory'] = 'obligatoresch';
+$lang['password updated'] = 'Passwuert aktualiséieren';
+$lang['photo'] = 'Foto';
+$lang['edit'] = 'beaarbechten';
+$lang['excluded'] = 'ausgeschloss';
+$lang['guest'] = 'Gaascht';
+$lang['in this album'] = 'an dësem Album';
+$lang['included'] = 'enthalen';
+$lang['large'] = 'grouss';
+$lang['letters'] = 'Buschtawen';
+$lang['medium'] = 'mëttel';
+$lang['month']['10'] = 'Oktober';
+$lang['month']['11'] = 'November';
+$lang['display most visited photos'] = 'Weis déi ';
+$lang['display this album'] = 'Weis dësen Album';
+$lang['all'] = 'all';
+$lang['cloud'] = 'Wollek';
+$lang['Welcome'] = 'Wëllkomm';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Wëllkomm!';
+$lang['Your favorites'] = 'Meng Favoriten';
+$lang['Your password has been reset'] = 'Äert Passwuert ass zeréckgesat gin';
+$lang['View'] = 'Usiicht';
+$lang['View in'] = 'Uweisen am';
+$lang['Webmaster'] = 'Webmaster';
+$lang['Website'] = 'Homepage';
+$lang['Yes'] = 'Jo';
+$lang['Your website URL is invalid'] = 'Des Homepage URL ass falsch';
+$lang['Confirm Password'] = 'Neit Passwuert bestätegen';
+$lang['Unknown feed identifier'] = 'Feed-ID onbekannt';
+$lang['Register'] = 'Registréieren';
+$lang['Registration'] = 'Registréierung';
+$lang['Search for all terms'] = 'all d\'Wierder';
+$lang['Go through the gallery as a visitor'] = 'Besicht d\'Gallerie als Gaascht';
+$lang['%d Kb'] = '%d kb';
+$lang['%d photos per page'] = '%d Biller pro Säit';
+$lang['return to the display of all photos'] = 'Zeréck bei all d\'Fotoen';
+$lang['mandatory'] = 'néide';
+$lang['descending'] = 'ofsteigend';
+$lang['display all photos in all sub-albums'] = 'Weis all d\'Fotoen aus den Ënneralbumen';
+$lang['chronology_monthly_calendar'] = 'Kalenner vum Mount';
+$lang['comment date'] = 'Datum vum Kommentar';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Äre Kommentar ass refuséiert ginn, well en de Validéierungsregelen net entsprécht';
+$lang['ascending'] = 'opsteigend';
+$lang['chronology_monthly_list'] = 'Lescht vum Mount';
+$lang['chronology_weekly_list'] = 'Lescht vun der Woch';
+$lang['Visits'] = 'Visitten';
+$lang['Visits, high &rarr; low'] = 'Visitten,héich&rarr;niddreg';
+$lang['Visits, low &rarr; high'] = 'Visitten,niddreg&rarr;héich';
+$lang['Theme'] = 'Thema';
+$lang['Unknown identifier'] = 'ID onbekannt';
+$lang['Update your rating'] = 'Aktualiséiert är Bewertung';
+$lang['Username modification'] = 'Benotzernumm änneren';
+$lang['Submit'] = 'bestätegen';
+$lang['Search tags'] = 'Schlagwierder sichen';
+$lang['Since'] = 'Säit';
+$lang['Specials'] = 'erweidert';
+$lang['Requested tag does not exist'] = 'D\'Schlagwuert, dat Dir gewielt hutt, existéiert net';
+$lang['Return to home page'] = 'Zeréck op Staartsäit';
+$lang['Search in sub-albums'] = 'Sich an den Ënneralbumen';
+$lang['Search rules'] = 'Sichkriterien';
+$lang['Previous'] = 'Zeréck';
+$lang['Quick connect'] = 'Schnell Umeldung';
+$lang['Permalink for album not found'] = 'Permalink fir den Album net fond';
+$lang['Photo sizes'] = 'Bildgréisst';
+$lang['Photo title, A &rarr; Z'] = 'Numm vum Bild,A&rarr;Z';
+$lang['Photo title, Z &rarr; A'] = 'Numm vum Bild,Z&rarr;A';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Den numeresche Bezeechner,1&rarr;9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Den numeresche Bezeechner, 9&rarr;1';
+$lang['Kind of date'] = 'Datumstyp';
+$lang['Last'] = 'Lescht Säit';
+$lang['Last Page'] = 'Lescht Säit';
+$lang['First'] = 'Eischt Säit';
+$lang['First Page'] = 'Eischt Säit';
+$lang['Forgot your password?'] = 'Passwuert vergiess';
+$lang['Go back to the album'] = 'Zeréck bei den Album';
+$lang['Home'] = 'Staartsäit';
+$lang['EXIF Metadata'] = 'Exif-Metadaten';
+$lang['Edit'] = 'Beaarbechten';
+$lang['Edit a comment'] = 'beaarbecht ee Kommentar';
+$lang['Enter your new password below.'] = 'Neit Passwuert ënnen agin';
+$lang['Expand all albums'] = 'Den Albumsbam komplett erausklappen';
+$lang['Current password is wrong'] = 'Aktuellt Passwuerd ass falsch';
+$lang['Customize'] = 'Benotzerdaten/Layout';
+$lang['Date created, new &rarr; old'] = 'Datum erstallt,nei&rarr;al';
+$lang['Date created, old &rarr; new'] = 'Datum erstallt,al&rarr;nei';
+$lang['Default'] = 'Standard';
+$lang['Created on'] = 'Erstallt den';
+$lang['Creation date'] = 'Erstellungsdatum';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Anti-Flot Spär: kuerz warden bis dir e neien Kommentar schéckt';
+$lang['Any tag'] = 'x-belibegt Schlagwuert';
+$lang['Bad request'] = 'Falsch Ufro';
+$lang['Close this window'] = 'Dës Fenster zoumaachen';
+$lang['Add a comment'] = 'Kommentar dobäisetzen';
+?> \ No newline at end of file
diff --git a/language/lb_LU/iso.txt b/language/lb_LU/iso.txt
new file mode 100644
index 000000000..da6a9062f
--- /dev/null
+++ b/language/lb_LU/iso.txt
@@ -0,0 +1 @@
+Lëtzebuergesch [LU] \ No newline at end of file
diff --git a/language/lb_LU/lb_LU.jpg b/language/lb_LU/lb_LU.jpg
new file mode 100644
index 000000000..4abad1b20
--- /dev/null
+++ b/language/lb_LU/lb_LU.jpg
Binary files differ
diff --git a/language/lt_LT/about.html b/language/lt_LT/about.html
index e8260c736..96ee6be47 100644
--- a/language/lt_LT/about.html
+++ b/language/lt_LT/about.html
@@ -9,5 +9,6 @@
<ul>
<li><a href="http://piwigo.org/forum/profile.php?id=17714">Giedrelis</a></li>
+ <li><a href="http://piwigo.org/forum/profile.php?id=18781">vilisas</a></li>
</ul>
Labai aÄiÅ« vertÄ—jams!</p>
diff --git a/language/lt_LT/admin.lang.php b/language/lt_LT/admin.lang.php
new file mode 100755
index 000000000..15565af84
--- /dev/null
+++ b/language/lt_LT/admin.lang.php
@@ -0,0 +1,972 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['%d users were not updated.'] = '%d vartotojų neatnaujinta.';
+$lang['%d users were updated.'] = '%d vartotojų atnaujinta.';
+$lang['%d waiting for validation'] = '%d laukia patvirtinimo';
+$lang['%d week'] = '%d savaitÄ™';
+$lang['%d weeks'] = '%d savaitÄ—s';
+$lang['%d year'] = '%d metus';
+$lang['%d years'] = '%d metų';
+$lang['%s ago'] = 'prieš %s';
+$lang['%s has been successfully updated.'] = '%s sÄ—kmingai atnaujinta.';
+$lang['%s in the future'] = '%s ateityje';
+$lang['%d parameters were updated.'] = '%d parametrai pakeisti.';
+$lang['%d photo was deleted'] = '%d nuotrauka ištrinta';
+$lang['%d photos uploaded'] = 'įkelta %d nuotraukų';
+$lang['%d photos were deleted'] = 'ištrinta %d nuotrauka';
+$lang['%d physical'] = ' %d fizinių';
+$lang['%d physicals'] = ' %d fizinių';
+$lang['%d second'] = '%d sekundÄ—';
+$lang['%d seconds'] = '%d sekundžių';
+$lang['%d tag'] = '%d žymė';
+$lang['%d tags'] = '%d žymės';
+$lang['%d user'] = '%d vartotojas';
+$lang['%d user comment rejected'] = '%d vartotojų komentaras atmestas';
+$lang['%d user comment validated'] = '%d vartotojų komentaras patvirtintas';
+$lang['%d user comments rejected'] = '%d vartotojų komentarų atmesta';
+$lang['%d user comments validated'] = '%d vartotojų komentarų patvirtinta';
+$lang['%d user deleted'] = '%d vartotojas pašalintas';
+$lang['%d user was not updated.'] = '%d vartotojų neatnaujinta';
+$lang['%d user was updated.'] = '%d vartotojas atnaujintas';
+$lang['%d users'] = '%d vartotojų';
+$lang['%d users deleted'] = '%d vartotojų pašalinta';
+$lang['%d guest'] = '%d sveÄias';
+$lang['%d guests'] = '%d sveÄiai';
+$lang['%d hour'] = '%d valanda';
+$lang['%d hours'] = '%d valandų';
+$lang['%d line filtered'] = '%d eilutÄ— nufiltruota';
+$lang['%d lines filtered'] = '%d eilutÄ—s nufiltruotos';
+$lang['%d mail was not sent.'] = '%d pranešimas nebuvo išsiųstas.';
+$lang['%d mail was sent.'] = '%d pranešimas išsiųstas.';
+$lang['%d mails were not sent.'] = '%d pranešimai nebuvo išsiųsta.';
+$lang['%d mails were sent.'] = '%d pranešimai išsiųsta.';
+$lang['%d member'] = '%d narys';
+$lang['%d members'] = '%d nariai';
+$lang['%d minute'] = '%d minutÄ—';
+$lang['%d minutes'] = '%d minuÄių';
+$lang['%d month'] = '%d mėnesį';
+$lang['%d months'] = '%d mÄ—nesius';
+$lang['%d of %d photos selected'] = 'pasirinkta %d iš %d nuotraukų';
+$lang['%d parameter was updated.'] = '%d parametras atnaujintas';
+$lang[' and %d virtuals'] = ' ir %d virtualių';
+$lang[' and %d virtual'] = ' ir %d virtualių';
+$lang['%d album including'] = 'įskaitant %d albumą';
+$lang['%d album moved'] = '%d albumas perkeltas';
+$lang['%d albums including'] = 'įskaitant %d albumus';
+$lang['%d albums moved'] = '%d albumų perkelta';
+$lang['%d anomalies have been detected corrected.'] = 'aptikta ir sutvarkyta %d anomalijų(-os).';
+$lang['%d anomalies have been detected.'] = 'aptikta %d anomalijų(-os).';
+$lang['%d anomalies have been ignored.'] = 'ignoruota %d anomalijų(-os).';
+$lang['%d anomalies have not been corrected.'] = '%d anomalijų(-os) nebuvo sutvarkyta.';
+$lang['%d anomaly has been corrected.'] = '%d anomalijų(-os) buvo sutvarkyta.';
+$lang['%d anomaly has been detected.'] = 'aptikta %d anomalija.';
+$lang['%d anomaly has been ignored.'] = 'ignoruota %d anomalija.';
+$lang['%d anomaly has not been corrected.'] = '%d anomalija nebuvo sutvarkyta.';
+$lang['%d association'] = '%d asociacija';
+$lang['%d associations'] = '%d asociacijų';
+$lang['%d day'] = '%d diena';
+$lang['%d days'] = '%d dienos';
+$lang['%d group'] = '%d grupÄ—';
+$lang['%d groups'] = '%d grupÄ—s';
+$lang['Check all'] = 'Patikrinti viskÄ…';
+$lang['Check for updates'] = 'Ieškoti atnaujinimų';
+$lang['Check for upgrade'] = 'Ieškoti patobulinimų';
+$lang['Batch Manager'] = 'Paketinis menedžeris';
+$lang['Bound Theme'] = 'Susieta tema';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = 'Pagal nutylÄ—jima kompozicijos centru laikomas geometrinis fotografijos centras.';
+$lang['Center of interest'] = 'Intereso centras';
+$lang['Available on'] = 'Prieinama';
+$lang['Available only with HTML format'] = 'Prieinama tik HTML formatu';
+$lang['Available versions for'] = 'Prieinamos versijos';
+$lang['Average rate'] = 'Vidutinis įvertinimas';
+$lang['By %s'] = 'Autorius %s';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'Pagal nutylėjimą Piwigo sukurs nauja web dydį iš HD (didelės raiškos) jūsų nuotraukų versijų.';
+$lang['By rank'] = 'Pagal įvertinimą';
+$lang['Caddie'] = 'Krepšelis';
+$lang['Caddie management'] = 'Krepšelio tvarkymas';
+$lang['Can\'t connect to server.'] = 'Neįmanoma prisijungti prie serverio.';
+$lang['Can\'t create temporary file.'] = 'Laikinas failas negali būti sukurtas.';
+$lang['Can\'t download archive.'] = 'Neišeina atsisiųsti archyvo.';
+$lang['Can\'t read or extract archive.'] = 'Neišeina perskaityti ar išskleisti archyvo.';
+$lang['Cancel'] = 'Atšaukti';
+$lang['Cannot delete the old permalink !'] = 'Neįmanoma ištrinti senu fikstuotų nuorodų!';
+$lang['Change Admin Colors'] = 'Keisti administracijos spalvas';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture yra galingas įrankis, leidžiantis tvarkyti masyvias bibliotekas Mac\'u';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture sukurtas profesionaliems fotografams su iPhoto paprastumu.';
+$lang['Apply action'] = 'Taikyti veiksmÄ…';
+$lang['Apply selected corrections'] = 'Vykdyti pasirinktus pakeitimus';
+$lang['Apply to sub-albums'] = 'Taikyti subalbumams';
+$lang['Apply watermark if height is bigger than'] = 'Uždėti vandens ženklą, jei aukštis didesnis nei';
+$lang['Apply watermark if width is bigger than'] = 'Uždėti vandens ženklą, jei plotis didesnis nei';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Apytiksliai maksimali rezoliucija: %dM pikseliu (tai %dx%d pikselių).';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Ar esate tikras, kad norite instaliuoti šį atnaujinimą ? Jūs turite patikrinti, ar ši versija nereikalauja prieš tai išinstaliuoti senosios.';
+$lang['Are you sure you want to delete this plugin?'] = 'Esate tikras, kad norite ištrinti šį priedą ?';
+$lang['Are you sure you want to install this plugin?'] = 'Esate tikras, kad norite instaliuoti šį priedą ?';
+$lang['Associate to album'] = 'Asociuoti su albumu';
+$lang['Associated'] = 'Asociuota';
+$lang['Authorize users to add comments on selected albums'] = 'Leisti vartotojams komentuoti pasiriniktus albumus';
+$lang['Authorized'] = 'Leidžiama';
+$lang['Automatic correction'] = 'AutomatinÄ— korekcija';
+$lang['Automatic sort order'] = 'Automatinė rūšiavimo tvarka';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '%u vartotojai turi automatinius leidimus, kurias suteikia grupÄ—s, kurioms jie priklauso.';
+$lang['Add detailed content'] = 'Pridėti papildomą turinį';
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Photoshop Lightroom yra fotografijos programa. Ji sukurta tvarkyti dideliems kiekiams skaitmeninių nuotraukų ir atlikti post produkcini darbą.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'IÅ¡skleidžiant įvyko klaida. PraÅ¡ome pasitikrinti piwigo instaliacijos failų leidimus.<br><a href="%s">Klaidų logas Äia</a>.';
+$lang['An error has occured during upgrade.'] = 'Instaliuojant atnaujinimus įvyko klaida.';
+$lang['An error occured during extraction (%s).'] = 'Išskleidžiant failus (%s) įvyko klaida.';
+$lang['An information email was sent to group "%s"'] = 'Informacinins pranešimas nusiųstas į "%s" grupę';
+$lang['Anomaly'] = 'Anomalija';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'Tik webmasteriai gali matyti šį tab\'ą, o ne administratoriai.';
+$lang['Applications'] = 'Programos';
+$lang['Allow user customization'] = 'Leisti vartotojams pasikeisti galerijos išvaizdą';
+$lang['All extensions are up to date.'] = 'Visų išplėtimų versijos naujausios.';
+$lang['All languages are up to date.'] = 'Visų kalbų versijos naujausios.';
+$lang['All optimizations have been successfully completed.'] = 'Visos optimizacijos buvo sėkmingai užbaigtos.';
+$lang['All plugins are up to date.'] = 'Visų priedų versijos naujausios.';
+$lang['All themes are up to date.'] = 'Visų temų versijos naujausios.';
+$lang['Allow rating'] = 'Leisti reitingavimÄ…';
+$lang['Allow user registration'] = 'Leisti vartotojų registraciją';
+$lang['Allow users to delete their own comments'] = 'Leisti vartotojams trinti savo komentarus';
+$lang['Allow users to edit their own comments'] = 'Leisti vartotojams redaguoti savo komentarus';
+$lang['Allowed file types: %s.'] = 'Leidžiami failų tipai: %s.';
+$lang['Add to caddie'] = 'Pridėti į krepšelį';
+$lang['Add write access to the "%s" directory'] = 'Pridėti leidimą rašyti į "%s" katalogą';
+$lang['Add/delete a permalink'] = 'Pridėti/pašalinti fiksuotą nuorodą';
+$lang['Added by %s'] = 'Įdėjo ';
+$lang['Administration Home'] = 'Administracijos puslapis';
+$lang['Advanced features'] = 'Papildomos funkcijos';
+$lang['Album "%s" has been added'] = 'Albumas "%s" pridÄ—tas';
+$lang['Album "%s" now contains %d photos'] = 'albumas "%s" dabar turi %d nuotraukas(-ų)';
+$lang['Album list management'] = 'Albumų sąrašo valdymas';
+$lang['Album manual order was saved'] = 'Albumų rankinis išrūšiavimas išsaugotas';
+$lang['Album name'] = 'Albumo pavadinimas';
+$lang['Album photos associated to the following albums: %s'] = 'Albumo nuotraukos asocijuotos su Å¡iais albumais: %s';
+$lang['Album updated successfully'] = 'Albumas sÄ—kmingai atnaujintas';
+$lang['Albums authorized thanks to group associations'] = 'Albumai autorizuoti dėka grupinių asociacijų';
+$lang['Albums automatically sorted'] = 'Albumai išrūšiuoti automatiškai';
+$lang['All %d photos are selected'] = 'Pasirinktos visos %d nuotraukos';
+$lang['+ Add an upload box'] = '+ Pridėti įkrovos lauką';
+$lang['Activate icon "%s"'] = 'Aktyvuoti piktogramÄ… "%s"';
+$lang['Activate icon "new" next to albums and pictures'] = 'Aktyvuoti piktogramą "nauja" šalia albumų ir nuotraukų';
+$lang['Active Languages'] = 'Aktyvuoti kalbas';
+$lang['Active Plugins'] = 'Aktyvūs priedai';
+$lang['Active Themes'] = 'Aktyvuoti temas';
+$lang['Add'] = 'PridÄ—ti';
+$lang['Add New Language'] = 'PridÄ—ti naujÄ… kalbÄ…';
+$lang['Add New Theme'] = 'PridÄ—ti naujÄ… temÄ…';
+$lang['Add Photos'] = 'Pridėti nuotraukų';
+$lang['Add a criteria'] = 'Pridėti kriterijų';
+$lang['Add a filter'] = 'PridÄ—ti filtrÄ…';
+$lang['Add a tag'] = 'Pridėti žymą';
+$lang['Add a user'] = 'PridÄ—ti vartotojÄ…';
+$lang['Add a virtual album'] = 'Pridėti virtualų albumą';
+$lang['Add another set of photos'] = 'Pridėti nuotraukų rinkinį';
+$lang['Add group'] = 'PridÄ—ti grupÄ™';
+$lang['Add tags'] = 'Pridėti žymas';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s turi būti nustatyta į false local/config/config.inc.php faile';
+$lang['%s photos can not be regenerated'] = '%s nuotraukos(-ų) negali būti regeneruotos';
+$lang['%s photos have been regenerated'] = '%s nuotraukos(-ų) regeneruota';
+$lang['%s value is not correct file because exif are not supported'] = '%s reikšmė neteisinga, nes exif nepalaikomas';
+$lang['(this tag will be deleted)'] = '(ši žyma bus ištrinta)';
+$lang[', click on'] = ', paspausk ant';
+$lang['... or '] = '... arba ';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = '<em>Piwigo Android\'ui</em> programėlė suteikia galimybę sujungti jūsų Android telefoną ar planšetę su jūsų Piwigo galerija, kurti kelis albumus ir įkelti kelias nuotraukas iškart.';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = '<em>Piwigo iOS\'ui</em> programėlė suteikia galimybę sujungti jūsų iPhone, iPad ar iPod Touch su jūsų Piwigo galerija, kurti kelis albumus ir įkelti kelias nuotraukas iškart.';
+$lang['A locked gallery is only visible to administrators'] = 'Užrakinta galerija prieinama tik administratoriams';
+$lang['A new version of Piwigo is available.'] = 'Yra nauja Piwigo versija.';
+$lang['ACCESS_2'] = 'Prieinama registruotiems vartotojams';
+$lang['Action'] = 'Veiksmas';
+$lang['Actions'] = 'Veiksmai';
+$lang['Activate'] = 'Aktyvuoti';
+$lang['Activate Navigation Bar'] = 'Aktyvuoti navigacijos juostÄ…';
+$lang['Activate Navigation Thumbnails'] = 'Aktyvuoti navigacijos piktogramas';
+$lang['Activate comments'] = 'Aktyvuoti komentarus';
+$lang['ACCESS_0'] = 'Laisva prieiga';
+$lang['ACCESS_1'] = 'Prieinama visiems';
+$lang['ACCESS_3'] = 'Prieinama administratoriams';
+$lang['ACCESS_4'] = 'Prieinama webmasteriams';
+$lang['ACCESS_5'] = 'Neprieinama';
+$lang['Access type'] = 'Prieigos tipas';
+$lang['Invert'] = 'Invertuoti';
+$lang['Languages'] = 'Kalbos';
+$lang['Languages which need upgrade'] = 'Kalbos, kurioms reikia atnaujinimo';
+$lang['Last hit'] = 'Paskutinis paspaudimas';
+$lang['Grant selected groups'] = 'Leisti prieigÄ… pasirinktoms grupÄ—ms';
+$lang['Grant selected users'] = 'Leisti prieigÄ… pasirinktiems vartotojams';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'Neįmanoma išjungti šios kalbos - jums reikalinga bent viena kalba.';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Neįmanoma išjungti šios temos - jums reikalinga bent viena tema.';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'Ši tema negali būti išjungta, nes ji reikalinga kitoms temoms: %s';
+$lang['Inactive Languages'] = 'Neaktyvios kalbos';
+$lang['Inactive Plugins'] = 'Neaktyvūs priedai';
+$lang['Inactive Themes'] = 'Neaktyvios temos';
+$lang['Informations'] = 'Informacija';
+$lang['Install'] = 'Instaliuoti';
+$lang['Installed Languages'] = 'Instaliuotos kalbos';
+$lang['Installed Themes'] = 'Instaliuotos temos';
+$lang['Instructions to use Piwigo'] = 'Instrukcijos, kaip naudoti Piwigo';
+$lang['High definition enabled'] = 'Didelė raiška įjungta';
+$lang['History'] = 'Istorija';
+$lang['Hit'] = 'Paspaudimai';
+$lang['Hour'] = 'Valanda';
+$lang['Hoverbox display'] = 'Hoverbox rodymas';
+$lang['I decide to update anyway'] = 'Aš nusprendžiau vistiek atnaujinti';
+$lang['IP'] = 'IP';
+$lang['Ignore All'] = 'Ignoruoti viskÄ…';
+$lang['Ignore selected anomalies'] = 'Ignoruoti pasirinktas anomalijas';
+$lang['Ignore this update'] = 'Ignoruoti atnaujinimÄ…';
+$lang['Image Quality'] = 'Paveiksliuko kokybÄ—';
+$lang['Image id'] = 'Paveiksliuko ID';
+$lang['Images manual order was saved'] = 'Paveiksliukų rankinis rūšiavimas išsaugotas';
+$lang['Impossible automatic correction'] = 'Automatiniai pataisymai neįmanomi';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'Ši tema negali būti aktyvuota, nes jai trūksta pagrindinės temos: %s';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'Šios kalbos išjungti neįmanoma, pirmiausia nustatykite kitą kalbą, kaip pagrindinę.';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Suteikite rašymo teises (chmod 777) "%s" katalogui šakniniame jūsų Piwigo instaliacijos kataloge';
+$lang['Go to'] = 'Eiti į';
+$lang['Go to %s or %s for more informations'] = 'Norėdami gauti daugiau informacijos eikite į %s arba %s';
+$lang['Graphics Library'] = 'GrafinÄ— biblioteka';
+$lang['Group'] = 'GrupÄ—';
+$lang['Group management'] = 'GrupÄ—s valdymas';
+$lang['Group name'] = 'GrupÄ—s pavadinimas';
+$lang['Groups'] = 'GrupÄ—s';
+$lang['Groups and users'] = 'GrupÄ—s ir vartotojai';
+$lang['Guest Settings'] = 'SveÄio nustatymai';
+$lang['Guest cannot be deleted'] = 'SveÄias negali bÅ«ti iÅ¡trintas';
+$lang['Guests'] = 'SveÄiai';
+$lang['Height'] = 'Aukštis';
+$lang['Hello'] = 'Labas';
+$lang['Hello,'] = 'Labas,';
+$lang['Help Me'] = 'PadÄ—kite man';
+$lang['Hide'] = 'PaslÄ—pti';
+$lang['High definition'] = 'Didelė raiška';
+$lang['Features include gallery browsing, album creation and photo upload.'] = 'Naujovės leidžia galerijų naršymą, albumų kūrimą ir nuotraukų įkėlimą.';
+$lang['File'] = 'Failas';
+$lang['File upload stopped by extension'] = 'Priedas nutraukÄ— failo atsiuntimÄ…';
+$lang['File/directory read error'] = 'Failo/katalogo skaitymo klaida';
+$lang['Find a new representant by random'] = 'Rasti naujÄ… atsitiktinÄ— albumo piktogramÄ…';
+$lang['Follow Orientation'] = 'Srauto orientacija';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'Toliau išvardinti priedai gali būti nesuderinami su nauja Piwigo versija:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'Toliau išvardintos temos gali būti nesuderinamos su nauja Piwigo versija:';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = 'Piwigo stengsis išsaugot interesų centro vietą nuotraukų dydžiams (pvz. tokiems, kaip "Kvadratas"), kuriems reikalingas apkarpymas.';
+$lang['Forbid this language to users'] = 'Uždrausti vartotojams naudoti šią kalbą.';
+$lang['Forbid this theme to users'] = 'Uždrausti vartotojams naudoti šią temą.';
+$lang['Forbidden'] = 'Draudžiama';
+$lang['Form'] = 'Nuo';
+$lang['GD library is missing'] = 'Trūksta GD bibliotekos';
+$lang['GD version'] = 'GD versija';
+$lang['Gallery title'] = 'Galerijos pavadinimas';
+$lang['Gallery unlocked'] = 'Galerija atrakinta';
+$lang['General statistics'] = 'Galerijos statistika';
+$lang['Generate multiple size images'] = 'Sukurti visų dydžių paveiksliukus';
+$lang['Get Support on Piwigo Forum'] = 'Gaukite pagalbą Piwigo diskusijų forume';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'Vykdymo laikas baigėsi, apdirbimas turi būti tęsiamas [Numatomas laikas: %d sek.].';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'Vykdymo laikas viršytas, apdirbimas turi būti tęsiamas [Numatomas laikas: %d sek.].';
+$lang['Exif extension not available, admin should disable exif use'] = 'Nėra EXIF išplėtimo, administratorius turi išjungti EXIF naudojimą';
+$lang['Extend for templates'] = 'IÅ¡plÄ—sti Å¡ablonus';
+$lang['Extensions Update'] = 'Plėtinių atnaujinimas';
+$lang['FTP + Synchronization'] = 'FTP + Sinchronizacija';
+$lang['Failed to write file to disk'] = 'Nepavyko įrašyti į diską';
+$lang['Everybody'] = 'Visi';
+$lang['Deny selected users'] = 'Drausti pasirinktus vartotojus';
+$lang['Edit album'] = 'Redaguoti albumÄ…';
+$lang['Edit album permissions'] = 'Redaguoti albumo leidimus';
+$lang['Edit photo'] = 'Redaguoti nuotraukÄ…';
+$lang['Edit photo information'] = 'Redaguoti nuotraukos informacijÄ…';
+$lang['Edit ranks'] = 'Redaguoti reitingus';
+$lang['Edit selected tags'] = 'Redaguoti pasirinktas žymas';
+$lang['Edit tags'] = 'Redaguoti žymas';
+$lang['Element'] = 'Elementas';
+$lang['Element type'] = 'Elemento tipas';
+$lang['Email administrators when a comment is deleted'] = 'Siųsti el-laišką administratoriams, kai ištrinamas komentaras';
+$lang['Email administrators when a comment is modified'] = 'Siųsti el-laiÅ¡kÄ… administratoriams, kai pakeiÄiamas komentaras';
+$lang['Email admins when a comment requires validation'] = 'Siųsti el-laišką administratoriams, kai komentaras reikalauja patvirtinimo';
+$lang['Email admins when a new user registers'] = 'Siųsti el-laišką administratoriams, kai užsiregistruoja naujas vartotojas';
+$lang['Email admins when a valid comment is entered'] = 'Siųsti el-laišką administratoriams, kai įrašomas tinkamas komentaras';
+$lang['Environment'] = 'Aplinka';
+$lang['Error list'] = 'Klaidų sąrašas';
+$lang['Error on file "%s" : %s'] = 'Failo "%s" klaidos: %s';
+$lang['Error when sending email to %s [%s].'] = 'Ä®vyko klaida siunÄiant el-laiÅ¡kÄ… adresu %s [%s]';
+$lang['Errors caption'] = 'Klaidų legendos';
+$lang['Discover album:'] = 'Atversti albumÄ…';
+$lang['Dump Database'] = 'Duomenų bazės dump\'as';
+$lang['Directory'] = 'Katalogas';
+$lang['Directory does not exist'] = 'Katalogas neegzistuoja';
+$lang['Display options'] = 'Rodymo parinktys';
+$lang['Dissociate from album'] = 'Atskirti nuo albumo';
+$lang['Dissociated'] = 'Atskirta';
+$lang['Do you want to activate anyway?'] = 'Vistiek aktyvuoti ?';
+$lang['Documentation'] = 'Dokumentacija';
+$lang['Does not represent'] = 'Tai nÄ—ra piktograma skirta';
+$lang['Download,'] = 'Parsisiųsti,';
+$lang['Downloads'] = 'Parsisiuntimai';
+$lang['Drag to re-order'] = 'Norėdami perrūšiuoti - spauskite ir tempkite';
+$lang['Drop into album'] = 'Pasirinkite albumÄ…';
+$lang['Duplicate'] = 'Dubliuoti';
+$lang['Duplicate selected tags'] = 'Dubliuoti pasirinktas žymas';
+$lang['Duplicates'] = 'Dublikatai';
+$lang['ERROR'] = 'KLAIDA';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'KLAIDA: Å IS PRIEDAS NERASTAS, BET YRA INSTALIUOTAS! IÅ INSTALIUOKITE JÄ® DABAR.';
+$lang['Deleted on'] = 'IÅ¡trinta';
+$lang['Deletions'] = 'Trynimai';
+$lang['Deactivate all'] = 'IÅ¡jungti viskÄ…';
+$lang['Default comments order'] = 'Numatyta komentarų tvarka';
+$lang['Default display'] = 'Numatytas vaizdas';
+$lang['Default photos order'] = 'Numatyta nuotraukų tvarka';
+$lang['Default user cannot be deleted'] = 'Numatytasis vartotojas negali būti pašalintas';
+$lang['Default user does not exist'] = 'Numatytasis vartotojas neegzistuoja';
+$lang['Delete Representant'] = 'IÅ¡trinti albumo piktogramÄ…';
+$lang['Delete multiple size images'] = 'Ištrinti kitų dydžių paveiksliukus';
+$lang['Delete orphan tags'] = 'Ištrinti nežinomas žymas';
+$lang['Delete selected photos'] = 'Ištrinti pažymėtas nuotraukas';
+$lang['Delete selected tags'] = 'Ištrinti pažymėtas žymes';
+$lang['Delete selected users'] = 'Ištrinti pažymėtus vartotojus';
+$lang['Delete this language'] = 'IÅ¡trinti Å¡iÄ… kalbÄ…';
+$lang['Delete this theme'] = 'IÅ¡trinti Å¡iÄ… temÄ…';
+$lang['Deny selected groups'] = 'Drausti pažymėtas grupes';
+$lang['Description'] = 'Aprašymas';
+$lang['Detailed informations'] = 'Detali informacija';
+$lang['Database'] = 'Duomenų bazė';
+$lang['Database synchronization with files'] = 'Duomenų bazės sinchronizavimas su failais';
+$lang['Date'] = 'Data';
+$lang['Day'] = 'Diena';
+$lang['Deactivate'] = 'IÅ¡jungti';
+$lang['Check automatic corrections'] = 'Tikrinti automatines korekcijas';
+$lang['Check for upgrade failed for unknown reasons.'] = 'Atnaujinimo patikrinimas nepavyko dÄ—l nežinomų priežasÄių.';
+$lang['Check integrity'] = 'Vientisumo tikrinimas';
+$lang['Choose an action'] = 'Pasirinkite veiksmÄ…';
+$lang['Choose an option'] = 'Pasirinkite variantÄ…';
+$lang['Classic display'] = 'Klasikinis vaizdas';
+$lang['Comments for all'] = 'Komentarai visiems';
+$lang['Complementary mail content'] = 'Pridėti prie pranešimo';
+$lang['Configuration'] = 'Konfigūracija';
+$lang['Confirm merge'] = 'Patvirtini sujungimÄ…';
+$lang['Continue processing treatment'] = 'Tęsti vykdomą apdorojimą';
+$lang['Correction'] = 'Koregavimas';
+$lang['Correction applied with error'] = 'Koregavimas įvykdytas su klaida';
+$lang['Correction applied with success'] = 'Koregavimas sėkmingai įvykdytas';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'Pataisyta anomalija nebebus ignoruojama';
+$lang['Create'] = 'Sukurti';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Sukurkite "%s" katalogÄ… pagrindiniame Piwigo instaliacijos kataloge';
+$lang['Create this site'] = 'Sukurti šį puslapį';
+$lang['Crop'] = 'Apkarpyti';
+$lang['Current name'] = 'Dabartinis pavadinimas';
+$lang['Plugin list'] = 'Priedų sąrašas';
+$lang['Plugins'] = 'Priedai';
+$lang['Plugins which need upgrade'] = 'Priedai, kurie bus atnaujinti';
+$lang['Portrait'] = 'Portretas';
+$lang['Position'] = 'Pozicija';
+$lang['Posted %s on %s'] = 'Paskelbta %s ant %s';
+$lang['Privacy level'] = 'Privatumo lygis';
+$lang['Privacy level set to "%s"'] = 'Privatumo lygis nustatytas į "%s"';
+$lang['Private'] = 'Privatu';
+$lang['Properties'] = 'SavybÄ—s';
+$lang['Public'] = 'Vieša';
+$lang['Public / Private'] = 'Vieša / Privatu';
+$lang['Purge compiled templates'] = 'IÅ¡valyti parengtus Å¡ablonus';
+$lang['Purge history detail'] = 'IÅ¡valyti istorijos detales';
+$lang['Purge history summary'] = 'IÅ¡valyti istorijos suvestinÄ™';
+$lang['Purge search history'] = 'Išvalyti paieškų istorija';
+$lang['Photos'] = 'Nuotraukos';
+$lang['Photos generation in progress...'] = 'Vyksta nuotraukų generavimas';
+$lang['Piwigo Administration'] = 'Piwigo administracija';
+$lang['Piwigo Announcements Newsletter'] = 'Piwigo naujienlaiškis';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Piwigo Publish priedas - skirtas Lightroom';
+$lang['Piwigo Update'] = 'Piwigo atnaujinimas';
+$lang['Piwigo Uploader'] = 'Piwigo Uploader\'is';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo negali atsisiųsti atnaujinimo failo iš serverio';
+$lang['Piwigo configuration'] = 'Piwigo konfigūracija';
+$lang['Piwigo export plugin for Aperture'] = 'Piwigo eksportavimo priedas, skirtas Aperture';
+$lang['Piwigo export plugin for iPhoto'] = 'Piwigo eksportavimo priedas, skirtas iPhoto';
+$lang['Piwigo for Android'] = 'Piwigo Android\'ui';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo iOS\'ui (iPhone, iPad, iPod Touch)';
+$lang['Piwigo publish plugin for Shotwell'] = 'Piwigo skelbimo priedas, skirtas Shotwell';
+$lang['Piwigo publish plugin for digiKam'] = 'Piwigo skelbimo priedas, skirtas digiKam';
+$lang['Piwigo version'] = 'Piwigo versija';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'Prašau patikrinti katalogo "plugins" ir jo subkatalogu leidimus (CHMOD).';
+$lang['Please select at least two groups'] = 'Prašome pasirinkti mažiausiai dvi grupes';
+$lang['Please wait...'] = 'Prašome palaukti...';
+$lang['Plugin has been successfully copied'] = 'Priedas sÄ—kmingai nukopijuotas';
+$lang['Pending Comments'] = 'Nepatvirtinti komentarai';
+$lang['Permalink'] = 'Fikstuota nuoroda';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'FiksuotÄ… nuorodÄ… %s anksÄiau naudojo albumas %s. Pirmiausia iÅ¡trinkite jÄ… iÅ¡ fiksuotu nuorodų istorijos.';
+$lang['Permalink %s is already used by album %s'] = 'FiksuotÄ… nuorodÄ… %s jau naudoja albumas %s';
+$lang['Permalink history'] = 'Fiksuotų nuorodų istorija';
+$lang['Permalinks'] = 'Fiksuotos nuorodos';
+$lang['Permission denied'] = 'Nesuteiktas leidimas';
+$lang['Permission granted'] = 'Leidimas suteiktas';
+$lang['Permission granted for groups'] = 'Leidimas suteiktas grupÄ—ms';
+$lang['Permission granted for users'] = 'Leidimas suteiktas vartotojams';
+$lang['Permission granted thanks to a group'] = 'Leidimas suteiktas dÄ—ka grupÄ—s';
+$lang['Permission management'] = 'Leidimų tvarkymas';
+$lang['Permissions'] = 'Leidimai';
+$lang['Photo %s of %s'] = 'Nuotrauka %s iš %s';
+$lang['Photo Page'] = 'Nuotraukų puslapis';
+$lang['Photo Properties'] = 'Nuotraukų savybės';
+$lang['Photo informations updated'] = 'Nuotraukų informacijos atnaujintos';
+$lang['Photo name'] = 'Nuotraukos pavadinimas';
+$lang['Photo sizes with crop'] = 'Nuotraukų dydžiai su apkarpymu';
+$lang['Photo unreachable or no support'] = 'Nuotraukos nepasiekiamos arba nepalaikomas jų formatas';
+$lang['Optional URL keyword'] = 'Pasirinktinis URL raktažodis';
+$lang['Options'] = 'Parinktys';
+$lang['Order of menubar items has been updated successfully.'] = 'Meniu juostos tvarka sÄ—kmingai atnaujinta.';
+$lang['Original Size'] = 'Originalus dydis';
+$lang['Original file : %s'] = 'Originalus failas: %s';
+$lang['Original templates'] = 'Originalūs šablonai';
+$lang['Orphan tags deleted'] = 'Nesusietos žymos buvo ištrintos';
+$lang['Other plugins'] = 'Yra kitų priedų';
+$lang['Other private albums'] = 'Kiti privatūs albumai';
+$lang['Overall'] = 'Apžvalga';
+$lang['Page banner'] = 'Puslapio banneris';
+$lang['Page end'] = 'Puslapio pabaiga';
+$lang['Pages seen'] = 'Peržiūrėti puslapiai';
+$lang['Panorama'] = 'Panorama';
+$lang['Parameter'] = 'Nustatymai';
+$lang['Parameters'] = 'Parametrai';
+$lang['Parent album'] = 'Pagrindinis albumas';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Nėra slaptažodžio patvirtinimo. Prašome pakartoti slaptažodį';
+$lang['Password is missing. Please enter the password.'] = 'Nėra slaptažodžio. Prašome įvesti slaptažodį';
+$lang['Path'] = 'Kelias';
+$lang['New photos were added'] = 'Naujos nuotrauos buvo įdėtos';
+$lang['No destination tag selected'] = 'Nepasirinkta paskirties žyma';
+$lang['No display'] = 'Nerodyti';
+$lang['No order field selected'] = 'Nepasirinkta laukelių tvarka';
+$lang['Not cropped correctly?'] = 'Blogai apipjaustyta?';
+$lang['Notification'] = 'Pranešimai';
+$lang['Notify administrators when a comment is'] = 'Informuoti adminstratorius, kai komentaras';
+$lang['Number of albums per page'] = 'Albumų skaiÄius puslapyje';
+$lang['Number of comments per page'] = 'Komentarų skaiÄius puslapyje';
+$lang['Number of downloads'] = 'Atsisiuntimų skaiÄius';
+$lang['Number of rates'] = 'Įvertinimų kiekis';
+$lang['Number of thumbnails to create'] = 'Sukurti piktogramų';
+$lang['Numeric identifier : %d'] = 'Skaitinis identifikatorius: %d';
+$lang['Obsolete Plugins'] = 'PasenÄ™ priedai';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = 'Linux\'e paketu menedžerio pagalba tiesiog instaliuokite Shotwell, tuomet aktyvuokite "Piwigo publishing" parinktį.';
+$lang['Only private albums are listed'] = 'Rodomi tik privatūs albumai';
+$lang['Opacity'] = 'Nepermatomumas';
+$lang['Operating system'] = 'OperacinÄ— sistema';
+$lang['Operation in progress'] = 'Vyksta apdorojimas';
+$lang['Optimizations have been completed with some errors.'] = 'Optimizacijos buvo baigtos su keliomis klaidomis';
+$lang['New parent album'] = 'Naujas pagrindinis albumas';
+$lang['New photos added'] = 'Naujos nuotraukos įkeltos';
+$lang['New tag'] = 'Nauja žyma';
+$lang['No file was uploaded'] = 'Nebuvo įkeltas joks failas';
+$lang['No group is permitted to see this private album'] = 'Jokiai grupei neleidžiama žiūrėti šio privataus albumo';
+$lang['No group selected, no action possible.'] = 'Nepasirinkta jokia grupė, todėl jokių veiksmų vykdyti neįmanoma.';
+$lang['No mail to send.'] = 'Nebus siunÄiamas joks laiÅ¡kas';
+$lang['No members to manage'] = 'Nėra jokių narių, kuriuos galima būtų tvarkyti';
+$lang['No photo can be deleted'] = 'Jokios nuotraukos negali būti ištrintos';
+$lang['No photo in the current set.'] = 'Šiuo metu rinkinyje nėra nuotraukų.';
+$lang['No photo in this album'] = 'Šiame albume nėra nuotraukų';
+$lang['No photo selected, %d photos in current set'] = 'Nepasirinkta jokia nuotrauka, šiame rinkinyje nuotraukų: %d';
+$lang['No photo selected, no action possible.'] = 'Nepasirinkta jokia nuotrauka, neįmanomas joks veiksmas.';
+$lang['No results'] = 'Nėra rezultatų';
+$lang['No user to send notifications by mail.'] = 'Nėra vartotojų, kurie galėtų būti informuoti paštu.';
+$lang['None'] = 'NÄ—ra';
+$lang['Merge selected tags'] = 'Sujungti pasirinktas žymas';
+$lang['Merge tags'] = 'Sujungti žymas';
+$lang['Metadata synchronization results'] = 'Metadata sinchronizacijos rezultatai';
+$lang['Metadata synchronized from file'] = 'Metadata sinchronizuota iš failo';
+$lang['Minimum height'] = 'Minimalus aukštis';
+$lang['Minimum privacy level'] = 'Minimalus privatumo lygis';
+$lang['Minimum width'] = 'Minimalus plotis';
+$lang['Miscellaneous'] = 'Ivairūs';
+$lang['Missing Plugins'] = 'Trūkstami priedai';
+$lang['Missing a temporary folder'] = 'Trūksta laikinų failų katalogo';
+$lang['Modify information'] = 'Keisti informacijÄ…';
+$lang['Month'] = 'MÄ—nuo';
+$lang['Move'] = 'Perkelti';
+$lang['Move albums'] = 'Perkelti albumus';
+$lang['Move to album'] = 'Perkelti į albumą';
+$lang['Multiple Size'] = 'Ivairūs dydžiai';
+$lang['Name'] = 'Pavadinimas';
+$lang['Name of the duplicate'] = 'Dublikato vardas';
+$lang['New Version'] = 'Nauja versija';
+$lang['New name'] = 'Naujas vardas';
+$lang['List'] = 'Sąrašas';
+$lang['Make this language available to users'] = 'Padaryti Å¡iÄ… kalbÄ… prieinamÄ… vartotojams';
+$lang['Make this theme available to users'] = 'Padaryti Å¡iÄ… temÄ… prieinamÄ… vartotojams';
+$lang['Manage'] = 'Tvarkyti';
+$lang['Manage Permissions'] = 'Tvarkyti teises';
+$lang['Manage authorizations for selected albums'] = 'Tvarkyti pasirinktų vartotojų leidimus';
+$lang['Manage permissions for group "%s"'] = 'Tvarkyti grupÄ—s "%s" teises';
+$lang['Manage permissions for user "%s"'] = 'Tvarkyti vartotojo "%s" teises';
+$lang['Manage photo ranks'] = 'Nuotraukų rūšiavimo tvarka';
+$lang['Manage photos'] = 'Tvarkyti nuotraukas';
+$lang['Manage tags'] = 'Tvarkyti žymas';
+$lang['Manage the members'] = 'Tvarkyti narius';
+$lang['Manage this set of %d photos'] = 'Tvarkyti ši %d nuotraukų rinkinį';
+$lang['Manual order'] = 'Nustatyta tvarka';
+$lang['Maximum file size: %sB.'] = 'Maksimalus failo dydis: %sB.';
+$lang['Maximum height'] = 'Maksimalus aukštis';
+$lang['Maximum width'] = 'Maksimalus plotis';
+$lang['Members'] = 'Nariai';
+$lang['Menu Management'] = 'Meniu';
+$lang['Merge selected groups'] = 'Sujungti pasirinktas grupes';
+$lang['Last send'] = 'Paskutini siuntimas';
+$lang['Level 0'] = '---';
+$lang['Link all album photos to some existing albums'] = 'Susieti visas albumo nuotraukas su kokiu nors egzistuojanÄiu albumu';
+$lang['Linked albums'] = 'Susieti albumai';
+$lang['Local'] = 'Vietinis';
+$lang['Lock'] = 'Užrakinti';
+$lang['Lock albums'] = 'Užrakinti albumus';
+$lang['Lock gallery'] = 'Užrakinti galerijas';
+$lang['Locked'] = 'Užrakinta';
+$lang['Mail address is obligatory for all users'] = 'Pašto adresas privalomas visiems vartotojams';
+$lang['Mail content'] = 'Pranešimo turinys';
+$lang['Mail sent to %s [%s].'] = 'Pranešimas išsiųstas %s [%s].';
+$lang['Main "guest" user does not exist'] = 'Pagrindinis "guest" vartotojas neegzistuoja';
+$lang['Main "guest" user status is incorrect'] = 'Neteisingas pagrindinio "guest" vartotojo statusas';
+$lang['Main "webmaster" user does not exist'] = 'Pagrindinis "webmaster" vartotojas neegzistuoja';
+$lang['Main "webmaster" user status is incorrect'] = 'Neteisingas pagrindinio "webmaster" vartotojo statusas';
+$lang['Main Page'] = 'Pagrindinis puslapis';
+$lang['Maintenance'] = 'Priežiūra';
+$lang['Last revisions'] = 'Paskutiniai pakeitimai';
+$lang['Last import'] = 'Paskutinė įkrova';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'Jei nėra HD kokybės nuotraukos, bet esamas dydis yra didesnis už kitų dydžių dimensijas, tai Piwigo ją perkels ir traktuos kaip HD kokybės. Taip pat iš jos bus sukurti mažesnio dydžio paveiksliukai.';
+$lang['If you encounter problems or have any question, please send a message to'] = 'jeigu iškilo problemų arba turite kokių nors klausimų - prašome rašykite adresu';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'Jūsų php.ini faile upload_max_filesize (%sB) yra didesnis už post_max_size (%sB), reikėtų pakeisti šią nuostatą.';
+$lang['Include display of recent photos grouped by dates'] = 'Taip pat rodyti nesenas nuotraukas, surūšiuotas pagal datas';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'Taip pat rodyti istorijos duomenis (Įspėjimas, gali būti viršytas serverio atminties limitas)';
+$lang['Information data registered in database'] = 'Informacija registruota duomenų bazėje';
+$lang['Install on your computer,'] = 'Įdiekite į savo kompiuterį,';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'Likite su Piwigo projektu, užsisakykite Piwigo naujienlaiškį. Jums el. paštu bus atsiųstas pranešimas, kai bus išleista nauja versija (kartais su saugumo pataisymais, kuriuos būtina žinoti ir atnaujinti) ir kai projekte ivyksta svarbūs įvykiai. Paprastai - tik keletas laiškų per metus.';
+$lang['Landscape'] = 'Landscape';
+$lang['Language has been successfully installed'] = 'Kalba buvo sÄ—kmingai instaliuota';
+$lang['Learn more'] = 'Sužinoti daugiau';
+$lang['Level 1'] = 'Kontaktai';
+$lang['Level 2'] = 'Draugai';
+$lang['Level 4'] = 'Å eima';
+$lang['Level 8'] = 'Administratoriai';
+$lang['Link all album photos to a new album'] = 'Susieti visas albumo nuotraukas į naują albumą';
+$lang['reduce to single existing albums'] = 'apriboti iki vieno egzistuojanÄio albumo';
+$lang['unit mode'] = 'Individualiai';
+$lang['the forum'] = 'forumas';
+$lang['the wiki'] = 'wiki';
+$lang['top left corner'] = 'viršutinis kairysis kampas';
+$lang['top right corner'] = 'viršutinis dešinysis kampas';
+$lang['total time'] = 'viso laiko';
+$lang['unknown'] = 'nežinomas';
+$lang['unset'] = 'nepažymėtas';
+$lang['update the database from files'] = 'atnaujinti duomenų bazę su failais';
+$lang['user "%s" added'] = 'vartotojas "%s" pridÄ—tas';
+$lang['user_status_admin'] = 'Administratorius';
+$lang['user_status_generic'] = 'Bendro pobūdžio';
+$lang['user_status_guest'] = 'SveÄias';
+$lang['user_status_normal'] = 'Vartotojas';
+$lang['user_status_webmaster'] = 'Webmasteris';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'Vartotojai norėdami matyti šį albumą turi prisijungti ir turėti atitinkamus leidimus';
+$lang['width must be a number superior to'] = 'plotis turi būti didesnis už';
+$lang['wrong filename'] = 'blogas failo vardas';
+$lang['registered users'] = 'registruoti vartotojai';
+$lang['registration date'] = 'registracijos data';
+$lang['remove author'] = 'pašalinti autoriu';
+$lang['remove creation date'] = 'pašalinti sukūrimo datą';
+$lang['remove tags'] = 'pašalinti žymas';
+$lang['remove this filter'] = 'pašalinti šį filtrą';
+$lang['remove title'] = 'pašalinti pavadinimą';
+$lang['selection'] = 'rinkinys';
+$lang['set to'] = 'nustatyti į';
+$lang['show details'] = 'rodyti detales';
+$lang['simple visitors'] = 'paprasti lankytojai';
+$lang['singly represented'] = 'fiksuota albumo piktograma';
+$lang['status'] = 'būsena';
+$lang['sub-albums'] = 'vidiniai albumai';
+$lang['synchronize files metadata with database photos informations'] = 'sinchronizuoti duomenų bazės nuotraukas su failų metaduomenimis';
+$lang['synchronize files structure with database'] = 'sinchronizuoti failų struktūrą su duomenų baze';
+$lang['target'] = 'taikinys';
+$lang['test'] = 'bandyti';
+$lang['test this remote site'] = 'bandyti Å¡iÄ… nutolusiÄ… svetainÄ™';
+$lang['on'] = 'ant';
+$lang['on the %d selected photos'] = 'ant %d pasirinktų nuotraukų';
+$lang['only directories'] = 'tik katalogai';
+$lang['only perform a simulation (no change in database will be made)'] = 'tik simuliuoti (niekas nebus pakeista duomenų bazėje)';
+$lang['other'] = 'kitas';
+$lang['overrides existing values with empty ones'] = 'perraÅ¡yti esamas reikÅ¡mes tuÅ¡Äiomis';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader verÄiamas kaip <em>Piwigo Uploader</em>. pLoader paruoÅ¡ia ir perkelia nuotraukas iÅ¡ JÅ«sų kompiuterio į JÅ«sų Piwigo nuotraukų galerijÄ….';
+$lang['pending validation'] = 'laukia patvirtinimo';
+$lang['photos added in the database'] = 'nuotraukos pridėtos į duomenų bazę';
+$lang['photos candidates for metadata synchronization'] = 'nuotraukų kandidatai metaduomenų sinchronizacijai';
+$lang['photos deleted from the database'] = 'nuotraukos pašalintos iš duomenų bazės';
+$lang['photos informations synchronized with files metadata'] = 'nuotraukų informacija sinchronizuota su failų metaduomenimis';
+$lang['photos per page'] = 'nuotraukos į puslapį';
+$lang['photos updated in the database'] = 'nuotraukos atnaujintos duomenų bazėje';
+$lang['pixels'] = 'pikseliai';
+$lang['private'] = 'privatu';
+$lang['public'] = 'vieša';
+$lang['randomly represented'] = 'atsitiktinÄ— albumo piktograma';
+$lang['ranks'] = 'vertinama';
+$lang['high'] = 'didelis';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto yra numatytoji nuotraukų tvarkymo programa MacOSX aplinkoje. Piwigo eksportavimo priedas leidžia kurti naujus albumus ir eksportuoti nuotraukas tiesiai iš iPhoto į jūsų Piwigo nuotraukų galeriją.';
+$lang['include child albums'] = 'įtraukti vidinius albumus';
+$lang['include photos with lower privacy level'] = 'įtraukti nuotraukas su mažesniu privatumo lygiu';
+$lang['jump to album'] = 'peršokti į albumą';
+$lang['jump to photo'] = 'peršokti į nuotrauką';
+$lang['leave'] = 'palikti';
+$lang['manage album photos'] = 'tvarkyti albumo nuotraukas';
+$lang['manage sub-albums'] = 'tvarkyti subalbumus';
+$lang['manual order'] = 'rankinÄ— tvarka';
+$lang['middle'] = 'vidurys';
+$lang['modified'] = 'modifikuotas';
+$lang['new'] = 'nauja';
+$lang['no write access'] = 'nėra rašymo teisių';
+$lang['none'] = 'nÄ— vienas';
+$lang['nothing'] = 'niekas';
+$lang['number of miniaturized photos'] = 'sukurta piktogramų';
+$lang['display'] = 'rodyti';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'rodyti maksimaliai informacijos (pridėti/pašalinti albumai ir nuotraukos)';
+$lang['dissociate from group'] = 'atskirti nuo grupÄ—s';
+$lang['errors during synchronization'] = 'klaidos sinchronizuojant';
+$lang['even already synchronized photos'] = 'netgi jau sinchronizuotas nuotraukas';
+$lang['existing album'] = 'egzistuojantis albumas';
+$lang['first photo added on %s'] = 'pirmoji nuotrauka pridÄ—ta %s';
+$lang['for the file format'] = 'failo formatui';
+$lang['for this file format'] = 'Å¡iam failo formatui';
+$lang['global mode'] = 'globalus režimas';
+$lang['group "%s" added'] = 'grupÄ— "%s" pridÄ—ta';
+$lang['group "%s" deleted'] = 'grupė "%s" pašalinta';
+$lang['group "%s" updated'] = 'grupÄ— "%s" atnaujinta';
+$lang['guest'] = 'sveÄias';
+$lang['height must be a number superior to'] = 'aukÅ¡tis turi bÅ«ti skaiÄius, didesnis už';
+$lang['hide details'] = 'slÄ—pti detales';
+$lang['bottom left corner'] = 'apatinis kairysis kampas';
+$lang['bottom right corner'] = 'apatinis dešinysis kampas';
+$lang['cancel manual order'] = 'atšaukti rankinį rūšiavimą';
+$lang['clean'] = 'apvalyti';
+$lang['confirm'] = 'patvirtinti';
+$lang['create a new album'] = 'sukurti naujÄ… albumÄ…';
+$lang['create a new site'] = 'sukurti naują puslapį';
+$lang['created'] = 'sukurta';
+$lang['custom'] = 'Specialus';
+$lang['default'] = 'numatytasis';
+$lang['default values'] = 'numatytosios reikšmės';
+$lang['delete'] = 'pašalinti';
+$lang['delete album'] = 'pašalinti albumą';
+$lang['delete photo'] = 'pašalinti nuotrauką';
+$lang['delete this site and all its attached elements'] = 'pašalinti šį puslapį ir visą susijusią informaciją';
+$lang['deleted'] = 'pašalinta';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam yra pažangi ir nemokama nuotraukų tvarkymo programa skirta Linux, Windows ir MacOSX';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam skirta fotografams, kurie nori žiūrėti, tvarkyti, redaguoti, pagerinti, organizuoti ir dalintis nuotraukomis.';
+$lang['directories + files'] = 'katalogai + failai';
+$lang['You are running on development sources, no check possible.'] = 'Veikia iš kūrėjų kodo, patikrinimas neįmanomas.';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'Neįmanoma nustatyti numatytosios nuotraukų rūšiavimo tvarkos, nes tai padaryta jūsų vietinėje konfigūracijoje.';
+$lang['You cannot move an album in its own sub album'] = 'Negalima perkelti albumo į jo paties subalbumą';
+$lang['You have %d orphan tags: %s.'] = 'Jūs turite %d nepririštų žymų: %s.';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'Jūs esate nurodęs <i>$conf[\'order_by\']</i> savo konfigūraciniame faile, šis parametras yra pasenęs, prašome jį pašalinti arba pervardinti į <i>$conf[\'order_by_custom\']</i> !';
+$lang['You have subscribed to receiving notifications by mail.'] = 'Jūs esate užsisakęs pranešimų prenumeratą paštu.';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'Jūs neužsisakęs pranešimų prenumeratos paštu.';
+$lang['You might go to plugin list to install and activate it.'] = 'Eikite į priedų sąrašą, kad jį instaliuoti ir aktyvuoti ';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'Norėdami naudotis visais programos privalumais jūs turėtumėte atnaujinti savo sistemą, kitaip ji gali veikti neteisingai arba neveikti išvis';
+$lang['Your configuration settings are saved'] = 'Jūsų konfigūracijos parametrai išsaugoti';
+$lang['[%s] Visit album %s'] = '[%s] Aplankyti albumÄ… %s';
+$lang['[NBM] Problems or questions'] = '[NBM] Problemos ir klausimai';
+$lang['any visitor can see this album'] = 'visi lankytojai gali matyti šį albumą';
+$lang['apply automatic sort order'] = 'taikyti automatinę rūšiavimo tvarką';
+$lang['associate to group'] = 'priskirti prie grupÄ—s';
+$lang['automatic order'] = 'automatinÄ— tvarka';
+$lang['average time'] = 'vidutinis laikas';
+$lang['between'] = 'tarp';
+$lang['between %.2f and %.2f'] = 'tarp %.2f ir %.2f';
+$lang['between %d and %d pixels'] = 'tarp %d ir %d pikselių';
+$lang['all'] = 'visi';
+$lang['an error happened'] = 'ivyko klaida';
+$lang['and'] = 'ir';
+$lang['You need to confirm deletion'] = 'Å alinimÄ… JÅ«s turite patvirtinti';
+$lang['Zoom'] = 'Priartinti';
+$lang['add a new watermark'] = 'pridėti naują vandens ženklą';
+$lang['add new photos to caddie'] = 'pridėti naujus nuotraukų dydžius į krepšelį';
+$lang['added'] = 'pridÄ—tas';
+$lang['administrators'] = 'administratoriai';
+$lang['albums added in the database'] = 'albumas pridėtas į duomenų bazę';
+$lang['albums deleted in the database'] = 'albumas pašalintas iš duomenų bazės';
+$lang['Week starts on'] = 'Savaitės pradžia yra';
+$lang['Who can see these photos?'] = 'Kas gali matyti Å¡ias nuotraukas?';
+$lang['Who can see this photo?'] = 'Kas gali matyti Å¡iÄ… nuotraukÄ…?';
+$lang['Width'] = 'Plotis';
+$lang['With blank value, gallery title will be used'] = 'Jei tuÅ¡Äia, tai bus panaudotas galerijos pavadinimas';
+$lang['With no album'] = 'Jokiame albume';
+$lang['With no tag'] = 'Be žymos';
+$lang['With no virtual album'] = 'Jokiam virtualiame albume';
+$lang['X Position'] = 'X pozicija';
+$lang['X Repeat'] = 'X kartojimas';
+$lang['Y Position'] = 'Y Pozicija';
+$lang['Year'] = 'Metai';
+$lang['You are running the latest version of Piwigo.'] = 'JÅ«s naudojate naujausiÄ… Piwigo versijÄ….';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Jūs naudojate įkėlima per naršyklę. Pamėginkite <a href="%s">įkėlimą per Flash</a>.';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Jūs naudojatės įkėlimu per Flash. Iškilo bėdų ? Pamėginkite <a href="%s">įkėlima per naršyklę</a>.';
+$lang['You can activate only one mobile theme.'] = 'JÅ«s galite aktyvuoti tik vienÄ… mobiliÄ… temÄ….';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Jūs galite atnaujinti tiesiai į Piwigo %s be atnaujinimo į Piwigo %s (rekomenduojama).';
+$lang['You cannot delete your account'] = 'Jūs negalite ištrinti savo paskyros';
+$lang['View in gallery'] = 'Žiūrėti galerijoje';
+$lang['Virtual Links'] = 'Virtualios nuorodos';
+$lang['Virtual album'] = 'Virtualus albumas';
+$lang['Virtual album added'] = 'Virtualus albumas sukurtas';
+$lang['Virtual album deleted'] = 'Virtualus albumas pašalintas';
+$lang['Virtual album name'] = 'Virtualaus albumo pavadinimas';
+$lang['Virtual albums to move'] = 'Virtualūs albumai, kuriuos reikia perkelti';
+$lang['Visit Gallery'] = 'Aplankyti galerijÄ…';
+$lang['Visit Piwigo project website'] = 'Aplankyti Piwigo projekto svetainÄ™';
+$lang['Visit language site'] = 'Aplankyti kalbų puslapį';
+$lang['Visit plugin site'] = 'Aplankyti priedų puslapį';
+$lang['Visit theme site'] = 'Aplankyti temų puslapį';
+$lang['Visited %d times'] = 'Aplankyta %d kart.';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'DĖMESIO! Nepanašu, kad šis priedas būtų suderinamas su šia Piwigo versija.';
+$lang['Waiting'] = 'Laukiama';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'Dėmesio: prenumerata arba jos nutraukimas išsiųs pašto pranešimus vartotojams';
+$lang['Watermark'] = 'Vandens ženklas';
+$lang['Web Form'] = 'Puslapio forma';
+$lang['Webmaster cannot be deleted'] = 'Webmasteris negali būti ištrintas';
+$lang['Webmaster status is required.'] = 'Reikalingas webmasterio statusas';
+$lang['Updates'] = 'Atnaujinimai';
+$lang['Upload'] = 'Įkėlimas';
+$lang['Upload Photos'] = 'Įkelti nuotraukas';
+$lang['Uploaded Photos'] = 'Įkeltos nuotraukos';
+$lang['Use the default photo sort order (defined in the configuration file)'] = 'Naudoti nuotraukų rūšiavimą pagal nutylėjimą (tokį, koks nustatytas konfigūraciniame faile)';
+$lang['Used metadata'] = 'Naudojami metaduomenys';
+$lang['User'] = 'Vartotojas';
+$lang['User "%s" created with "%s" like password'] = 'Sukurtas vartotojas "%s" su slaptažodžiu "%s"';
+$lang['User %s [%s] added.'] = 'Vartotojas %s [%s] pridÄ—tas.';
+$lang['User %s [%s] was added to the subscription list.'] = 'Vartotojas %s [%s] pridėtas į prenumeratorių sąrašą.';
+$lang['User %s [%s] was not added to the subscription list.'] = 'Vartotojas %s [%s] nebuvo pridėtas į prenumeratorių sąrašą.';
+$lang['User %s [%s] was not removed from the subscription list.'] = 'Vartotojas %s [%s] nepašalintas iš prenumeratorių sąrašo.';
+$lang['User %s [%s] was removed from the subscription list.'] = 'Vartotojas %s [%s] pašalintas iš prenumeratorių sąrašo.';
+$lang['User comments validation'] = 'Vartotojų komentarų patvirtinimas';
+$lang['User list'] = 'Vartotojų sąrašas';
+$lang['User status'] = 'Vartotojo būsena';
+$lang['Users'] = 'Vartotojai';
+$lang['Validate'] = 'Patvirtinti';
+$lang['Validation'] = 'Patvirtinimas';
+$lang['Version'] = 'Versija';
+$lang['Toggle \'default group\' property'] = 'Atstatyti \'grupė pagal nutylėjima\' reikšmę';
+$lang['Type here the name of the new group'] = 'Ä®veskite naujos grupÄ—s pavadinima Äia';
+$lang['Type here the title'] = 'Ä®veskite pavadinima Äia';
+$lang['Type in a search term'] = 'Įveskite paieškos frazę';
+$lang['Unable to check for upgrade.'] = 'Neišeina patikrinti ar yra atnaujinimų.';
+$lang['Unable to dump database.'] = 'Neišeina eksportuoti duomenų bazės.';
+$lang['Uncheck all'] = 'Atžymėti viską';
+$lang['Uninstall'] = 'IÅ¡instaliuoti';
+$lang['Uninstalled Plugins'] = 'IÅ¡instaliuoti priedai';
+$lang['Unknown upload error'] = 'Nežinoma įkėlimo klaida';
+$lang['Unlock gallery'] = 'Atrakinti galerijÄ…';
+$lang['Unlocked'] = 'Atrakinta';
+$lang['Unsubscribe from notification by mail'] = 'Nutraukti pranešimų prenumeratą paštu';
+$lang['Unsubscribed'] = 'Prenumerata nutraukta';
+$lang['Update All'] = 'Atnaujinti viskÄ…';
+$lang['Update Complete'] = 'Atnaujinimas baigtas';
+$lang['Update albums informations'] = 'Atnaujinti albumų informaciją';
+$lang['Update in progress... Please wait.'] = 'Vyksta atnaujinimas... Prašome palaukti.';
+$lang['Update photos information'] = 'Atnaujinti nuotraukų informaciją';
+$lang['Update to Piwigo %s'] = 'Atnaujinti iki Piwigo %s';
+$lang['This group will be set to default'] = 'Å i grupÄ— bus naudojama pagal nutylÄ—jima';
+$lang['This group will be unset to default'] = 'Å i grupÄ— nebebus naudojama pagal nutylÄ—jimÄ…';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'Tai yra didelis atnaujinimas su <a href="%s">naujomis ir idomiomis funkcijomis</a>.';
+$lang['This is a minor update, with only bug corrections.'] = 'Tai yra nedidelis atnaujinimas su klaidų pataisymais.';
+$lang['This name is already used by another group.'] = 'Å is pavadinimas jau naudojamas kitos grupÄ—s.';
+$lang['This site already exists'] = 'Toks puslapis jau yra';
+$lang['This theme was not designed to be directly activated'] = 'Å i tema nebuvo sukurta tiesioginiam aktyvavimui';
+$lang['Thumbnail'] = 'Piktograma';
+$lang['Thumbnails generation in progress...'] = 'Vyksta piktogramų generavimas...';
+$lang['Time'] = 'Laikas';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'Laikas išsiųsti paštą ribotas. Kiti laiškai buvo praleisti.';
+$lang['Title'] = 'Pavadinimas';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = 'Norėdami eksportuoti nuotraukas iš digiKam į Piwigo - tiesiog instaliuokite digiKam ir Kipi priedus.';
+$lang['To send ?'] = 'Siųsti?';
+$lang['To subscribe'] = 'Prenumeruoti';
+$lang['To unsubscribe'] = 'Nutraukti prenumeratÄ…';
+$lang['Tools'] = 'Įrankiai';
+$lang['Two updates are available'] = 'Yra du atnaujinimai';
+$lang['Type here the author name'] = 'Ä®veskite autoriaus varda Äia';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'Įkeltas failas viršija MAX_FILE_SIZE dydį, kuris nurodytas HTML formoje';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'Įkeltas failas viršija upload_max_filesize dydį, nurodytą php.ini: %sB';
+$lang['The uploaded file was only partially uploaded'] = 'Įkelta tik dalis failo';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'Įkelti failai viršija post_max_size dydį, nurodyta php.ini: %sB';
+$lang['The version of %s [%s] installed is not compatible with the version required ']['%s'] = 'Instaliuota %s versija [%s] nesuderinama su reikalinga versija [%s]';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'Webmasteris užprenumeravo jums pranešimus paštu.';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'Webmasteris jums nutraukė pranešimų paštu prenumeratą.';
+$lang['The whole page'] = 'Visas puslapis';
+$lang['The whole set'] = 'Visas rinkinys';
+$lang['Theme has been successfully installed'] = 'Tema sÄ—kmingai instaliuota';
+$lang['Themes'] = 'IÅ¡vaizda';
+$lang['Themes which need upgrade'] = 'Temos, kurias reikėtų atnaujinti';
+$lang['There is no available subscribers to mail.'] = 'Nėra prenumeratorių, kuriuos informuoti paštu.';
+$lang['There is no group in this gallery.'] = 'Šioje galerijoje nėra grupių.';
+$lang['There is no other language available.'] = 'Daugiau kalbų nėra.';
+$lang['There is no other plugin available.'] = 'Daugiau priedų nėra.';
+$lang['There is no other theme available.'] = 'Daugiau galimų temų nėra.';
+$lang['This album contains %d photos, added between %s and %s.'] = 'Šis albumas turi %d nuotr., pridėtų tarp %s ir %s.';
+$lang['This album contains %d photos, added on %s.'] = 'Å is albumas turi %d nuotr., kurios buvo pridÄ—tos %s.';
+$lang['This album contains no photo.'] = 'Šiame albume nėra nuotraukų.';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'Vartotojai rodomi tik tada, jei yra ka naujo jiems pranešti.';
+$lang['The original image quality must be a number between %d and %d'] = 'Originalo kokybÄ— turi bÅ«ti skaiÄius tarp %d ir %d';
+$lang['The original maximum height must be a number between %d and %d'] = 'Originalus maksimalus aukÅ¡tis turi bÅ«ti skaiÄius tarp %d ir %d';
+$lang['The original maximum width must be a number between %d and %d'] = 'Originalus maksimalus plotis turi bÅ«ti skaiÄius tarp %d ir %d';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'Fiksuotos nuorodos pavadinimas turi susidÄ—ti iÅ¡ a-z, A-Z, "-", "_" ar "/". Jis neturi bÅ«ti vien iÅ¡ skaitmenų arba prasidÄ—ti skaiÄiumi su "-"';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'Nuotraukos dydis bus sumažintas iki %dx%d pikselių.';
+$lang['Switch to clear or dark colors for administration'] = 'Administracijai rinktis Å¡viesius arba tamsius tonus';
+$lang['The %d following tags were deleted'] = 'SekanÄios %d žymos buvo iÅ¡trintos';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'Failas arba katalogas nepasiekiamas (jis neegzistuoja arba nepakanka teisių)';
+$lang['The following tag was deleted'] = 'Sekanti žyma buvo ištrinta';
+$lang['The gallery URL is not valid.'] = 'Netinkama galerijos URL';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'GrupÄ—s pavadinimas turi bÅ«ti be kabuÄių " arba \', taip pat negali bÅ«ti tuÅ¡Äias.';
+$lang['The name of an album must not be empty'] = 'Albumo pavadinimas negali bÅ«ti tuÅ¡Äias';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'Katalogų pavadinimai gali bÅ«ti sudaromi tik iÅ¡ raidžių, skaiÄių ir simbolių "-", "_", ar "."';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'Komentarų skaiÄius puslapyje turi bÅ«ti tarp 5 ir 50 imtinai.';
+$lang['Sum of rates'] = 'vertinimų suma';
+$lang['Summary'] = 'Apibendrinimas';
+$lang['Support'] = 'Palaikymas';
+$lang['Synchronize'] = 'Sinchronizuoti';
+$lang['Synchronize metadata'] = 'Sinchronizuoti metaduomenis';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'Å IS PRIEDAS YRA INTEGRUOTAS Ä® PIWIGO! NEDELSIANT JÄ® IÅ INSTALIUOKITE!';
+$lang['Tag "%s" already exists'] = 'Žyma "%s" jau egzistuoja';
+$lang['Tag "%s" is now a duplicate of "%s"'] = 'Žyma "%s" dabar yra "%s" dublikatas';
+$lang['Tag "%s" was added'] = 'Žyma "%s" pridėta';
+$lang['Tag selection'] = 'Pasirinktos žymos';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Žymos <em>%s</em> apjungtos į žyma <em>%s</em>';
+$lang['Templates'] = 'Å ablonai';
+$lang['Templates configuration has been recorded.'] = 'Šablonų konfigūracija irašyta.';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'Piwigo export priedas leidžia jums kurti albumus ir eksportuoti nuotraukas.';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'Piwigo publish priedas leidžia jums eksportuoti ir sinchronizuoti nuotraukas iš Lightroom tiesiai į Jūsų Piwigo nuotraukų galeriją';
+$lang['The anomaly will be ignored until next application version'] = 'Anomalija bus ignoruojama iki sekanÄios programos versijos';
+$lang['The center of interest is the most meaningful zone in the photo.'] = 'Interesų centras yra reikšmingiausia nuotraukos sritis.';
+$lang['Show info'] = 'Rodyti informacijÄ…';
+$lang['Show menubar'] = 'Rodyti meniu juostÄ…';
+$lang['Simulation'] = 'Simuliacija';
+$lang['Site manager'] = 'SvetainÄ—s valdymas';
+$lang['Some themes and plugins may be not available yet.'] = 'Kai kurios temos ir priedai kol kas gali būti neprieinami.';
+$lang['Some upgrades are available for extensions.'] = 'Yra keletas išplėtimų atnaujinimų.';
+$lang['Source tag'] = 'Šaltinio žyma';
+$lang['Start Upload'] = 'Pradėti įkėlimą';
+$lang['Start pLoader and add your photos.'] = 'Paleiskite pLoader ir pradėkite įkelinėti savo nuotraukas.';
+$lang['Statistics'] = 'Statistika';
+$lang['Status'] = 'BÅ«sena';
+$lang['Status of user "%s" updated'] = 'Atnaujintas vartotojo "%s" statusas';
+$lang['Storage album'] = 'Albumas saugojimui';
+$lang['Subscribe'] = 'Prenumeruoti';
+$lang['Subscribe %s'] = 'Prenumeruoti %s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'Užprenumeruoti %s Piwigo anonsų naujienlaiškį';
+$lang['Subscribe to notification by mail'] = 'Prenumeruoti pranešimus paštu';
+$lang['Subscribe/unsubscribe users'] = 'Valdyti vartotojų prenumeratą';
+$lang['Subscribed'] = 'Prenumeruota';
+$lang['Select groups...'] = 'Pasirinkite grupes';
+$lang['Select recipients'] = 'Pasirinkite gavÄ—jus';
+$lang['Select the destination tag'] = 'Pasirinkite kitą žymą';
+$lang['Select users...'] = 'Pasirinkite vartotojus...';
+$lang['Select:'] = 'Pasirinkite:';
+$lang['Selection'] = 'Parinktys';
+$lang['Send'] = 'Siųsti';
+$lang['Send an information email to group members'] = 'Siųsti informacinį pranešimą grupės nariams';
+$lang['Send connection settings by email'] = 'Siųsti prisijungimo nuostatas el-paštu';
+$lang['Send mail as'] = 'Siųsti paštą kaip';
+$lang['Send mail on HTML format'] = 'Siųsti paštą HTML formatu';
+$lang['Send mail to users'] = 'Siųsti paštą vartotojams';
+$lang['Set as default language for unregistered and new users'] = 'Pasirinkite numatytÄ…jÄ… kalbÄ… neregistruotiems ir naujiems vartotojams.';
+$lang['Set as default theme for unregistered and new users'] = 'Pasirinkite numatytÄ…jÄ… temÄ… neregistruotiems ir naujiems vartotojams.';
+$lang['Set author'] = 'Nustatyti autorių';
+$lang['Set creation date'] = 'Nustatyti sukūrimo datą';
+$lang['Set title'] = 'Nustatyti pavadinimÄ…';
+$lang['Settings'] = 'Nustatymai';
+$lang['Sharpen'] = 'Paaštrinti';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell yra atvirojo kodo skaitmeninių nuotraukų apdorojimo programa skirta Linux. Ji yra numatytasis nuotraukų menedžeris Ubuntu ir Fedora distribucijose.';
+$lang['Save Settings'] = 'IÅ¡saugoti pakeitimus';
+$lang['Save Template Directory'] = 'Išsaugoti šablonų katalogą';
+$lang['Save manual order'] = 'Išsaugoti rankinį rikiavimą';
+$lang['Save order'] = 'IÅ¡saugoti rikiavimÄ…';
+$lang['Save to permalink history'] = 'Išsaugoti į fiksuotų nuorodų istoriją';
+$lang['Save visits in history for'] = 'Saugoti apsilankymus';
+$lang['Search for new images in the directories'] = 'Ieškoti naujų paveiksliukų kataloguose';
+$lang['Searching...'] = 'Ieškoma...';
+$lang['Section'] = 'Sekcija';
+$lang['See you soon,'] = 'Iki pasimatymo,';
+$lang['See you soon.'] = 'Iki pasimatymo.';
+$lang['Select a file'] = 'Pasirinkite failÄ…';
+$lang['Select a zone with your mouse to define a new center of interest.'] = 'Pele pažymėkite interesų centro zoną.';
+$lang['Select an album'] = 'Pasirinkite albumÄ…';
+$lang['Select at least one album'] = 'Pasirinkite bent vienÄ… albumÄ…';
+$lang['Select at least one comment'] = 'Pasirinkite bent vienÄ… komentarÄ…';
+$lang['Select at least one photo'] = 'Pasirinkite bent vienÄ… nuotraukÄ…';
+$lang['Select at least one user'] = 'Pasirinkite bent vienÄ… vartotojÄ…';
+$lang['Select at least two tags for merging'] = 'Apjungimui pasirinkite bent dvi žymas';
+$lang['Select files'] = 'Pasirinkite failus';
+$lang['Predefined filter'] = 'IÅ¡ anksto nustatytas filtras';
+$lang['Preferences'] = 'Nustatymai';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'Laikas paruošti vartotojų sąrašą, kuriems bus išsiųstas paštas yra apribotas. Kiti vartotojai nerodomi.';
+$lang['Released on'] = 'IÅ¡leista';
+$lang['Remote'] = 'Nutolęs';
+$lang['Remove all filters'] = 'Pašalinti visus filtrus';
+$lang['Remove from caddie'] = 'Pašalinti iš krepšelio';
+$lang['Rename'] = 'Pervardinti';
+$lang['Repair and optimize database'] = 'Remontuoti ir optimizuoti duomenų bazę';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = 'Originalių šablonų keitimas individualizuotais iš template-extension pakatalogio';
+$lang['Replacers (customized templates)'] = 'Pakaitalai (individualizuoti Å¡ablonai)';
+$lang['Representant'] = 'Albumo piktograma';
+$lang['Representation of albums'] = 'Albumo piktograma';
+$lang['Representative'] = 'Albumo piktograma';
+$lang['Represents'] = 'Yra piktograma skirta';
+$lang['Reset ignored updates'] = 'Perkrauti ignoruotus atnaujinimus';
+$lang['Resize'] = 'Keisti dydį';
+$lang['Resize after upload'] = 'Keisti dydį po įkrovimo';
+$lang['Restore'] = 'Atstatyti';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'Atstatyti į numatytąją konfigūraciją. Įskiepių parametrai bus prarasti!';
+$lang['Purge never used notification feeds'] = 'Išvalyti niekad nenaudotus pranešimų srautus';
+$lang['Purge sessions'] = 'IÅ¡valyti sesijas';
+$lang['Purge user cache'] = 'Įšvalyti vartotojų kešą';
+$lang['Quick Local Synchronization'] = 'Greitoji vietinÄ— sinchronizacija';
+$lang['Random photo'] = 'AtsitiktinÄ— nuotrauka';
+$lang['Rate'] = 'Įvertinimas';
+$lang['Rate date'] = 'Įvertinimo data';
+$lang['Rated %d times, score : %.2f'] = 'Įvertinta %d kart., rezultatas: %.2f';
+$lang['Rating'] = 'Vertinimas';
+$lang['Rating by guests'] = 'Leisti vertinti sveÄiams';
+$lang['Ratio'] = 'Santykis';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (RemoteGallery klientas Android\'ui) yra atvirojo kodo (GPL v3) Piwigo klientas Android platformai.';
+$lang['Read Piwigo Documentation'] = 'Skaitykite Piwigo dokumentacijÄ…';
+$lang['Refresh'] = 'Atnaujinti';
+$lang['Refresh photo set'] = 'Atnaujinti nuotraukų rinkinį';
+$lang['Reinitialize check integrity'] = 'IÅ¡ naujo pradÄ—ti vientisumo patikrinimÄ…';
+$lang['Reject'] = 'Atmesti';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'Dydžio keitimas po įkėlimo išjungtas dėl to, kad naudojate GD kaip grafinę biblioteką';
+$lang['Select at least one tag'] = 'Pasirinkite bent vieną žymą';
+$lang['Basic settings'] = 'Paprasti nustatymai';
+$lang['General'] = 'Bendra';
+$lang['Mail theme'] = 'Pašto tema';
+$lang['Last visit on %s, %s.'] = 'Paskutini karta aplankyta %s, %s.';
+$lang['Registered on %s, %s.'] = 'Registruota %s, %s.';
+$lang['Showing %s to %s of %s users'] = 'Rodoma nuo %s iki %s iš %s narių';
+$lang['Update user'] = 'Atnaujinti narį';
+$lang['on the %d selected users'] = 'iš %d pasirinktų narių';
+$lang['%d of %d users selected'] = 'pasirinkta %d iš %d narių';
+$lang['(filtered from %s total users)'] = '(filtruota iš %s narių)';
+$lang['All %d users are selected'] = 'Pasirinkti visi %d nariai';
+$lang['Change password'] = 'Keisti slaptažodį';
+$lang['Change username'] = 'Keisti username';
+$lang['Loading...'] = 'Kraunasi...';
+$lang['No matching user found'] = 'Narių, atitinkanÄių kriterijus, nerasta';
+$lang['No user selected of %d users'] = 'Nepasirinktas nė vienas iš %d narių';
+$lang['No user selected, no action possible.'] = 'Nepasirinktas narys, negaliu tęsti veiksmų.';
+$lang['Password updated'] = 'Slaptažodis atnaujintas';
+$lang['Show %s users'] = 'Rodyti %s vartotojus';
+$lang['User %s added'] = 'Vartotojas %s pridÄ—tas';
+$lang['User %s updated'] = 'Vartotojo %s informacija atnaujinta';
+$lang['Users modified'] = 'Vartotojo informacija pakeista';
+$lang['Close user details'] = 'Užverti vartotojo detales';
+$lang['Open user details'] = 'Atverti vartotojo detales';
+$lang['close'] = 'uždaryti';
+?> \ No newline at end of file
diff --git a/language/lt_LT/common.lang.php b/language/lt_LT/common.lang.php
index 52c6ba7e1..aa1909258 100644
--- a/language/lt_LT/common.lang.php
+++ b/language/lt_LT/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Lietuviu [LT]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=648
Author: Piwigo team
Author URI: http://piwigo.org
@@ -37,8 +37,8 @@ $lang_info['zero_plural'] = true;
$lang['%d album updated'] = '%d albumas atnaujintas';
$lang['%d albums updated'] = '%d albumai atnaujinti';
-$lang['%d comment to validate'] = '%d patvirtinti komentarà ';
-$lang['%d comment'] = '%d komentuoti';
+$lang['%d comment to validate'] = '%d patvirtinti komentarÄ…';
+$lang['%d comment'] = '%d koment.';
$lang['%d comments to validate'] = '%d patvirtinti komentarus';
$lang['%d comments'] = '%d komentarai(-ų)';
$lang['%d hit'] = '%d paspaudimas';
@@ -55,82 +55,67 @@ $lang['%d photo'] = '%d nuotrauka';
$lang['%d photos are also linked to current tags'] = '%d nuotraukos taip pat siejamos su dabartinėmis žymomis';
$lang['%d photos'] = '%d nuotraukos(-ų)';
$lang['%d rates'] = '%d reitingai';
-$lang['(!) This comment requires validation'] = '(!) Å iam komentarui reikia patvirtinimo';
-$lang['... or browse your empty gallery'] = '... arba ieÅ koti tuÅ Äios galerijos';
-$lang['... or please deactivate this message, I will find my way by myself'] = '... arba prašome išjungti ššį pranešimą, aš rasiu pats';
+$lang['(!) This comment requires validation'] = '(!) Å¡iam komentarui reikia patvirtinimo';
+$lang['... or browse your empty gallery'] = '... arba ieÅ¡koti tuÅ¡Äios galerijos';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... arba prašome išjungti šį pranešimą, aš rasiu pats';
$lang['A comment on your site'] = 'Komenentaras svetainÄ—je';
$lang['About Piwigo'] = 'Apie Piwigo';
$lang['About'] = 'Apie';
$lang['All tags'] = 'Visos žymos';
$lang['Any tag'] = 'Betkokia žyma';
-$lang['At least one listed rule must be satisfied.'] = 'Bent vienas iŠ iŠvardytų kriterijų, turi būti patenkintas.';
-$lang['At least one tag must match'] = "Turi atitikti bent vien&#260; &#382;ym&#281;";
+$lang['At least one listed rule must be satisfied.'] = 'Bent vienas iš išvardytų kriterijų, turi būti patenkintas.';
$lang['Author'] = "Autorius";
-$lang['Average rate'] = "Reiting&#371; vidurkis";
-$lang['Categories'] = "Kategorijos";
-$lang['Category'] = "Kategorija";
-$lang['Close this window'] = 'Uždaryti ŠitĄ langĄ';
-$lang['Complete RSS feed (images, comments)'] = "Baigta RSS feed (nuotraukos, komentarai)";
+$lang['Close this window'] = 'Uždaryti šitą langą';
$lang['Confirm Password'] = 'Pakartokite slaptažodį';
$lang['Connection settings'] = "Prisijungimo nustatymai";
$lang['Login'] = "Prisijungti";
$lang['Contact webmaster'] = "Susisiekti su administratoriumi";
$lang['Create a new account'] = 'Sukurti naujÄ… paskyrÄ…';
$lang['Created on'] = "Sukurta";
-$lang['Creation date'] = "Sukurimo data";
+$lang['Creation date'] = 'Sukūrimo data';
$lang['Current password is wrong'] = 'Blogas slaptažodis';
$lang['Dimensions'] = "Matmenys";
$lang['Display'] = "Parodyti";
-$lang['Each listed rule must be satisfied.'] = "Kiekvienas pateiktas kriterijus turi b&#363;ti patenkintas.";
+$lang['Each listed rule must be satisfied.'] = 'Kiekvienas pateiktas kriterijus turi būti patenkintas.';
$lang['Email address'] = 'Elektroninio pašto adresas';
$lang['Enter your personnal informations'] = 'Įveskite savo asmeninius duomenis';
$lang['Error sending email'] = 'Klaida siunÄiant laiÅ¡kÄ… nurodytu elektroninio paÅ¡to adresu';
$lang['File name'] = "Failo vardas";
$lang['File'] = "Failas";
$lang['Filesize'] = "Failo dydis";
-$lang['Filter and display'] = "Filtras ir ekranas";
+$lang['Filter and display'] = 'Filtruoti ir rodyti';
$lang['Filter'] = "Filtras";
-$lang['Forgot your password?'] = 'Blogas slaptažodis?';
+$lang['Forgot your password?'] = 'Pamiršote slaptažodį ?';
$lang['Go through the gallery as a visitor'] = 'NarÅ¡yti galerijoje kaip sveÄias';
$lang['Help'] = "Pagalba";
$lang['Identification'] = "Identifikacija";
-$lang['Image only RSS feed'] = "Nuotraukos tik RSS feed";
$lang['Keyword'] = 'Raktažodis';
$lang['Links'] = "Nuorodos";
-$lang['Mail address'] = "Elektroninio pa&#352;to adresas";
$lang['N/A'] = "N/A";
$lang['New on %s'] = "Naujas %s";
-$lang['New password confirmation does not correspond'] = "Naujo slapta&#382;od&#382;io patvirtinimas nesutampa";
-$lang['New password sent by email'] = "Naujas spalta&#382;odis i&#353;si&#371;stas &#303; elektronin&#303; pa&#353;t&#261;";
-$lang['No email address'] = "N&#279;ra elektroninio pa&#353;to adreso";
-$lang['No classic user matches this email address'] = "Netinkamas elektroninio pa&#352;to adresas";
$lang['Notification'] = 'Pranešimas';
$lang['Number of items'] = 'Vienetų skaiÄius';
$lang['Original dimensions'] = 'Orginalūs matmenys';
-$lang['Password forgotten'] = 'PamirŠote slaptažodį';
+$lang['Password forgotten'] = 'Pamiršote slaptažodį';
$lang['Password'] = 'Slaptažodis';
$lang['Post date'] = "Publikavimo data";
$lang['Posted on'] = "Paskelbta";
-$lang['Profile'] = "Prifilis";
+$lang['Profile'] = 'Profilis';
$lang['Quick connect'] = "Greitas prisijungimas";
-$lang['RSS feed'] = "RSS feed";
-$lang['Rate'] = "&#303;vertinti";
+$lang['RSS feed'] = 'RSS srautas';
$lang['Register'] = "Registruotis";
$lang['Registration'] = "Registracija";
$lang['Related tags'] = 'Susijusios žymos';
-$lang['Reset'] = "Perkrauti";
+$lang['Reset'] = 'Atstatyti';
$lang['Retrieve password'] = 'Atkurti slaptažodį';
$lang['Search rules'] = 'Ieškoti kriterijų';
$lang['Search tags'] = 'Ieškoti žymų';
$lang['Search'] = 'Ieškoti';
-$lang['See available tags'] = "&#382;i&#363;r&#279;ti naujas &#382;ymas";
-$lang['Send new password'] = "Si&#371;sti nauja slapta&#382;od&#303;";
$lang['Since'] = "Nuo";
$lang['Sort by'] = 'RÅ«Å¡iavimas pagal';
$lang['Sort order'] = 'RÅ«Å¡iavimo tvarka';
$lang['Tag'] = 'Žyma';
$lang['Tags'] = 'Žymos';
-$lang['The RSS notification feed provides notification on news from this website : new pictures, updated categories, new comments. Use a RSS feed reader.'] = "The RSS feed teikia prane&#352;imus apie naujus ivykius i&#352; &#352;ios svetaines: naujas nuotraukos, atnaujintas kategorijas, naujus komentarus. Turi buti naudojami su RSS skaitytuvu.";
$lang['Unknown feed identifier'] = 'Nežinomas identifikatorius';
$lang['User comments'] = "Nario komentarai";
$lang['Username'] = "Prisijungimo vardas";
@@ -138,36 +123,29 @@ $lang['Visits'] = 'Apsilankymų';
$lang['Webmaster'] = "Moderatorius";
$lang['Week %d'] = 'SavaiÄių %d';
$lang['About Piwigo'] = "Apie Piwigo";
-$lang['You are not authorized to access the requested page'] = 'Jūs neturite leidomo pasiekti norimĄ puslapį';
-$lang['add to caddie'] = "D&#279;ti &#303; krep&#352;el&#303;";
-$lang['add this image to your favorites'] = "&#303;traukti &#352;i&#260; nuotrauk&#260; &#303; m&#279;gstamiausias";
+$lang['You are not authorized to access the requested page'] = 'Jūs neturite leidomo pasiekti norimą puslapį';
$lang['Administration'] = "Administracija";
-$lang['Adviser mode enabled'] = "Patar&#279;jo re&#382;imas &#303;jungtas";
$lang['all'] = "visi";
$lang['ascending'] = 'didÄ—jimo tvarka';
$lang['author(s) : %s'] = "autorius : %s";
-$lang['Expand all categories'] = "I&#352;pl&#279;sti visas kategorijas";
$lang['posted after %s (%s)'] = "paskelbta po %s (%s)";
-$lang['posted before %s (%s)'] = 'paskelbta prieÅ  %s (%s)';
+$lang['posted before %s (%s)'] = 'paskelbta prieš %s (%s)';
$lang['posted between %s (%s) and %s (%s)'] = "paskelbta tarp %s (%s) ir %s (%s)";
$lang['posted on %s'] = "paskelbta %s";
-$lang['Best rated'] = 'Geriausia įvertintos';
-$lang['display best rated items'] = "rodyti geriausia &#303;vertintas nuotraukas";
-$lang['caddie'] = "Krep&#352;elis";
+$lang['Best rated'] = 'Geriausiai vertinamos';
$lang['Calendar'] = "Kalendorius";
$lang['All'] = "Visos";
-$lang['display each day with pictures, month per month'] = "rodyti kiekviena diena su nuotraukomis, menesio per menes&#303;";
$lang['View'] = "Rodyti";
$lang['chronology_monthly_calendar'] = "Menesio kalendorius";
-$lang['chronology_monthly_list'] = 'Mėnesio sĄraŠas';
-$lang['chronology_weekly_list'] = 'Savaitės sĄraŠas';
-$lang['Click here if your browser does not automatically forward you'] = 'Spauskite Äia, jei jÅ«sų narÅ yklÄ— neužkrovÄ— automatiÅ kai';
+$lang['chronology_monthly_list'] = 'Mėnesio sąrašas';
+$lang['chronology_weekly_list'] = 'Savaitės sąrašas';
+$lang['Click here if your browser does not automatically forward you'] = 'Spauskite Äia, jei jÅ«sų narÅ¡yklÄ— neužkrovÄ— automatiÅ¡kai';
$lang['comment date'] = "pakomentavo";
$lang['Comment'] = "Komentuoti";
$lang['Your comment has been registered'] = 'Tavo komentaras užregistruotas';
-$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Anti-flood sistema: praŠome šŠiek tiek palaukti prieŠ bandant raŠyti kitĄ komentarĄ';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Anti-flood sistema: prašome šiek tiek palaukti prieš bandant rašyti kitą komentarą';
$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Jūsų komentaras nebuvo užregistruotas, nes neatitiko komentavimo taisyklių';
-$lang['An administrator must authorize your comment before it is visible.'] = 'Administratorius privalo patvirtinti tavo komentarĄ, kol jis tampa matomas.';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Administratorius turi patvirtinti tavo komentarÄ…, kad jis taptu matomau.';
$lang['This login is already used by another user'] = 'Å is prisijungimo vardas jau naudojamas';
$lang['Comments'] = "Komentarai";
$lang['Add a comment'] = 'Rašyti komentarą';
@@ -185,48 +163,32 @@ $lang['day'][4] = "Ketvirtadienis";
$lang['day'][5] = "Penktadienis";
$lang['day'][6] = "&#352;e&#353;tadienis";
$lang['Default'] = "Numatyta";
-$lang['delete this image from your favorites'] = "i&#353;trinti &#353;i&#261; nuotrauk&#261; i&#353; megstamiausi&#371; s&#261;ra&#353;o";
$lang['Delete'] = 'IÅ¡trinti';
$lang['descending'] = 'mažėjanÄia';
-$lang['download'] = "si&#371;stis";
-$lang['download this file'] = "si&#371;sti &#353;&#303; fail&#261;";
$lang['edit'] = "redaguoti";
$lang['wrong date'] = "bloga data";
$lang['excluded'] = "atmesti";
-$lang['My favorites'] = "Mano m&#279;gstamiausi";
-$lang['display my favorites pictures'] = "rodyti mano m&#279;gstamiausias nuotraukas";
$lang['Favorites'] = 'MÄ—gstamiausios';
$lang['First'] = "Pirmas";
-$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Galerija yra uždaryta profilaktikai. PraŠome pabandyti vėliau.';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Galerija yra uždaryta profilaktikai. Prašome pabandyti vėliau.';
$lang['Page generated in'] = "Puslapis atidarytas per";
$lang['guest'] = 'sveÄias';
$lang['Hello'] = "Sveiki";
$lang['available for administrators only'] = "tik administracijai";
-$lang['shows images at the root of this category'] = "Rodyti nuotraukas vir&#352;uje";
-$lang['See last users comments'] = "Rodyti paskutinius komentarus";
-$lang['customize the appareance of the gallery'] = 'redaguoti galerijos iÅ vaizdÄ…';
-$lang['search'] = 'ieÅ koti';
-$lang['Home'] = "Namai";
+$lang['customize the appareance of the gallery'] = 'redaguoti galerijos išvaizdą';
+$lang['search'] = 'ieškoti';
+$lang['Home'] = 'Pradžia';
$lang['Identification'] = "Identifikacija";
-$lang['in this category'] = "&#352;ioje kategorijoje";
-$lang['in %d sub-category'] = "&#352;ioje %d sub-kategorijoje";
-$lang['in %d sub-categories'] = "&#352;iose %d sub-kategorijose";
$lang['included'] = 'įskaitant';
$lang['Invalid password!'] = 'Blogas slaptažodis!';
$lang['Language'] = "Kalba";
$lang['last %d days'] = "paskutines %d dienas";
$lang['Last'] = "Paskutinis";
$lang['Logout'] = "Atsijungti";
-$lang['E-mail address'] = "Elektroninio pa&#352;to adresas";
$lang['obligatory'] = "privalomas";
-$lang['Maximum height of the pictures'] = "Maksimalus nuoraukos auk&#352;tis";
-$lang['Maximum height must be a number superior to 50'] = "Maksimalus auk&#352;tis, skai&#269;ius turi b&#363;ti didesnis nei 50";
-$lang['Maximum width of the pictures'] = "Maksimalus nuoraukos plotis";
-$lang['Maximum width must be a number superior to 50'] = "Maksimalus plotis, skai&#269;ius turi b&#363;ti didesnis nei 50";
-$lang['display a calendar by creation date'] = 'rodyti kalendoriu pagal sukurimo datÄ…';
-$lang['display all elements in all sub-categories'] = "rodyti visas nuotraukas i&#352; vis&#371; kategorij&#371;";
+$lang['display a calendar by creation date'] = 'rodyti kalendorių pagal sukūrimo datą';
$lang['return to normal view mode'] = 'grįžti į normalų peržiūros režimą';
-$lang['display a calendar by posted date'] = 'rodyti kalendorių patalpinimo datą';
+$lang['display a calendar by posted date'] = 'rodyti kalendorių pagal patalpinimo datą';
$lang['month'][10] = "Spalis";
$lang['month'][11] = "Lapkritis";
$lang['month'][12] = "Gruodis";
@@ -239,95 +201,55 @@ $lang['month'][6] = "Bir&#382;elis";
$lang['month'][7] = "Liepa";
$lang['month'][8] = "Rugpj&#363;tis";
$lang['month'][9] = "Rugs&#279;jis";
-$lang['Most visited'] = 'Daugiausia žiūrimos';
-$lang['display most visited pictures'] = "display most visited pictures";
-$lang['The number of images per row must be a not null scalar'] = "Nuotrauk&#371; eilu&#269;i&#371; skai&#269;ius neturiu b&#363;ti nulis";
-$lang['Number of images per row'] = "Nuotrauk&#371; eiliu&#269;i&#371; skai&#269;ius";
-$lang['The number of rows per page must be a not null scalar'] = "Nuotrauk&#371; skai&#269;ius puslapyje neturi b&#363;ti lygus nuliui";
-$lang['Number of rows per page'] = "Eilu&#269;iu skai&#269;ius puslapyje";
+$lang['Most visited'] = 'Žiūrimiausios';
$lang['Unknown identifier'] = 'Nežinomas ifentifikatorius';
$lang['New password'] = 'Naujas slaptažodis';
-$lang['Rate this picture'] = "&#303;vertinti &#352;i&#261; nuotrauk&#261;";
$lang['Next'] = "Kita";
$lang['no rate'] = 'nėra įvertinimų';
-$lang['Elements posted within the last %d day.'] = "Paskelbti per paskutn&#281; %d dien&#261;.";
-$lang['Elements posted within the last %d days.'] = "Paskelbti per paskutnes %d dienas.";
$lang['password updated'] = 'slaptažodis atnaujintas';
$lang['Recent period must be a positive integer value'] = "Naujausias laikotarpis turi buti teigiamas sveikasis skaicius";
-$lang['picture'] = "nuotrauka";
-$lang['Click on the picture to see it in high definition'] = "Spauskite ant nuotraukos, nor&#279;dami j&#261; pamatyti did&#382;iausia rai&#352;ka";
$lang['Show file metadata'] = "Rodyti failo duomenis";
$lang['Powered by'] = "Sukurta";
$lang['Preferences'] = "Nustatymai";
$lang['Previous'] = "Atgal";
-$lang['Random pictures'] = "Atsitiktin&#279;s nuotraukos";
-$lang['display a set of random pictures'] = "Rodyti atsitiktini&#371; nuotrauk&#371; rinkin&#303;";
-$lang['Recent categories'] = "Naujausios kategorijos";
-$lang['display recently updated categories'] = "Rodyti neseniai atnaujintas kategorijas";
$lang['Recent period'] = "Paskutinis laikotarpis";
-$lang['Recent pictures'] = "Naujausios nuotraukos";
-$lang['display most recent pictures'] = "rodyti naujausias nuotraukas";
$lang['Redirection...'] = "Nukreipiama...";
-$lang['Please, enter a login'] = 'įraŠykite prisijungimo vardą';
+$lang['Please, enter a login'] = 'įrašykite prisijungimo vardą';
$lang['login mustn\'t end with a space character'] = "Prisijungimo vardas negali baigtis tarpu";
$lang['login mustn\'t start with a space character'] = "Prisijungimo vardas negali prasideti tarpu";
$lang['this login is already used'] = 'Å is prisijungimo vardas jau naudojamas';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'Elektroninio paŠto adresas turi būti toks: xxx@yyy.eee (pavyzdys : jack@altern.org)';
-$lang['please enter your password again'] = 'Pakartokite savo slaptažodį';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'Elektroninio pašto adresas turi būti toks: xxx@yyy.eee (pavyzdys : jack@altern.org)';
$lang['Auto login'] = "Automatinis prisijungimas";
-$lang['remove this tag from the list'] = 'iŠtrinti Šią žymą iŠ Šio sąraŠo';
+$lang['remove this tag from the list'] = 'ištrinti šią žymą iš šio sąrašo';
$lang['representative'] = "atstovauti";
-$lang['return to homepage'] = "Gri&#382;ti &#303; pradin&#303; puslap&#303;";
-$lang['Search for Author'] = 'IeŠkoti pagal autorių';
-$lang['Search in Categories'] = "Ie&#352;koti kategorijose";
-$lang['Search by Date'] = "Ie&#352;koti pagal data";
+$lang['Search for Author'] = 'Ieškoti pagal autorių';
$lang['Date'] = "Data";
$lang['End-Date'] = "Pabaigos data";
-$lang['Kind of date'] = 'RuÅ ies data';
-$lang['Search for words'] = 'IeŠkoti žodžių';
-$lang['Search for all terms'] = 'IeŠkoti visu žodžių';
-$lang['Search for any terms'] = "Ie&#352;koti betkoki&#371; &#382;od&#382;i&#371;";
+$lang['Kind of date'] = 'Rušies data';
+$lang['Search for words'] = 'Ieškoti žodžių';
+$lang['Search for all terms'] = 'Ieškoti visu žodžių';
$lang['Empty query. No criteria has been entered.'] = 'Tušcia užklausa. Nėra kriterijų';
-$lang['Search Options'] = "Paie&#352;kos nustatymai";
-$lang['Search results'] = 'PaieÅ kos rezultatai';
-$lang['Search in subcategories'] = "Ie&#352;koti sub-ketegorijose";
-$lang['searched words : %s'] = 'ieŠkoti žodžiai : %s';
+$lang['Search results'] = 'Paieškos rezultatai';
+$lang['searched words : %s'] = 'ieškoti žodžiai : %s';
$lang['Contact'] = "Kontaktai";
-$lang['set as category representative'] = "nustatyti kategorij&#261;";
$lang['Show number of comments'] = 'Rodyti kiek yra komentarų';
$lang['Show number of hits'] = "Rodyti paspaudimus";
$lang['slideshow'] = 'skaidrių žiūrėjimas';
-$lang['stop the slideshow'] = "stop the slideshow";
+$lang['stop the slideshow'] = 'stabdyti skaidrių peržiūrą';
$lang['Specials'] = "Specials";
$lang['SQL queries in'] = "SQL queries in";
-$lang['display only recently posted images'] = "rodyti tik neseniai paskelbtas vaizdus";
-$lang['return to the display of all images'] = "gr&#303;&#382;ti prie vis&#371; nuotrauk&#371;";
$lang['the beginning'] = 'pradžia';
-$lang['Interface theme'] = "Dizainas";
-$lang['Thumbnails'] = "Nuotraukytes";
+$lang['Thumbnails'] = 'Piktogramos';
$lang['Menu'] = "Meniu";
$lang['A comment on your site'] = "Komenentaras svetain&#279;je";
$lang['today'] = 'Å iandien';
$lang['Update your rating'] = "Atnaujinti savo ivertinimus";
-$lang['wrong filename'] = "blogas failo vardas";
-$lang['the filesize of the picture must not exceed :'] = "Nuotraokos dydis neturi vir&#352;yti :";
-$lang['the picture must be to the fileformat jpg, gif or png'] = "nuotraukos formatas privalo b&#363;ti: jpg, gif arba png";
-$lang['the height of the picture must not exceed :'] = "nuotraukos auk&#352;tis neturi vir&#352;yti :";
-$lang['Optional, but recommended : choose a thumbnail to associate to'] = "Neprivaloma, bet rekomenduojama pasirinkt&#261; miniatiur&#261; susieti";
-$lang['the width of the picture must not exceed :'] = "nuotraukos plotis neturi vir&#352;yti :";
-$lang['can\'t upload the picture on the server'] = "nuotrauka negali b&#363;ti &#303;kelta";
$lang['the username must be given'] = "reikalingas slapyvardis";
-$lang['A picture\'s name already used'] = "&#352;is nuotraukos pavadinimas jau naudojamas";
-$lang['You must choose a picture fileformat for the image'] = "turite pasirinkti nuotraukos format&#261; i&#352;Å¡paveikslelio";
-$lang['Name of the picture'] = "Nuotraukos pavadinimas";
-$lang['Upload a picture'] = "&#303;kelti nuotrauka";
-$lang['Picture uploaded with success, an administrator will validate it as soon as possible'] = "Nuotrauka &#303;kelta s&#279;kmingai, administratorius kuo greiciau j&#261; patvirtins.";
-$lang['Upload a picture'] = "&#303;kelti nuotrauka";
-$lang['useful when password forgotten'] = 'naudinga tuo atveju, jei slaptažodi pamirŠote';
+$lang['useful when password forgotten'] = 'naudinga tuo atveju, jei slaptažodi pamiršote';
$lang['Quick search'] = "Greita paieska";
$lang['Connected user: %s'] = 'PrisijungÄ™ vartotojai: %s';
$lang['IP: %s'] = "IP: %s";
-$lang['Browser: %s'] = 'NarÅ yklÄ—: %s';
+$lang['Browser: %s'] = 'Naršyklė: %s';
$lang['Author: %s'] = "Autorius: %s";
$lang['Comment: %s'] = "Komentaras: %s";
$lang['Comment by %s'] = "Komentavo %s";
@@ -335,15 +257,7 @@ $lang['User: %s'] = "Slapyvardis: %s";
$lang['Email: %s'] = "Email: %s";
$lang['Admin: %s'] = "Administratorius: %s";
$lang['Registration of %s'] = "Registracija %s";
-$lang['Category: %s'] = "Kategorija: %s";
-$lang['Picture name: %s'] = "Nuotraukos pavadinimas: %s";
-$lang['Creation date: %s'] = "Suk&#363;rimo data: %s";
-$lang['Waiting page: %s'] = "Laukia puslapio: %s";
-$lang['Picture uploaded by %s'] = "Nuotrauk&#261; ik&#279;l&#279; %s";
-$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Blogas vartotojo statusas "guest", numatytoji busena bus naudojama. PraÅ ome praneÅ ti apie tai administratoriui.';
-$lang['Administrator, webmaster and special user cannot use this method'] = "Tik administratorius, moderatorius ir specialus vartotojai gali naudoti &#352;&#303; metod&#261;";
-$lang['a user use already this mail address'] = "Kitas narys jau vartoja &#352;&#303; elektronin&#303; pa&#352;to adres&#261;";
-$lang['Category results for'] = "Kategorij&#371; rezultatai";
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Blogas vartotojo "guest "statusas, bus naudojama numatytoji busena. Prašome apie tai pranešti administratoriui.';
$lang['Tag results for'] = 'žymų rezultatai';
$lang['from %s to %s'] = "nuo %s iki %s";
$lang['Play of slideshow'] = "Rodyti skaidres";
@@ -355,27 +269,16 @@ $lang['Accelerate diaporama speed'] = 'Pagreitinti perjungimÄ…';
$lang['Submit'] = "Patvirtinti";
$lang['Yes'] = "Taip";
$lang['No'] = "Ne";
-$lang['%d image'] = "%d nuotrauka";
-$lang['%d images'] = "%d nuotraukos";
-$lang['%d image is also linked to current tags'] = "%d nuotrauka yra taip pat susijusi su &#352;iomis &#382;ymomis";
-$lang['%d images are also linked to current tags'] = "%d nuotraukos yra taip pat susije su &#352;iomis &#382;ymomis";
-$lang['See images linked to this tag only'] = "&#382;i&#363;reti nuotraukas susijusias su &#352;ia &#382;yma";
-$lang['images posted during the last %d days'] = "nuotraukos &#303;keltos per paskutines %d dienas";
-$lang['Choose an image'] = "Pasirinkti nuotrauk&#261;";
$lang['Piwigo Help'] = "Piwigo pagalba";
$lang['Rank'] = 'įvertinimas';
-$lang['group by letters'] = 'grupuoti pagal abecelÄ™';
+$lang['group by letters'] = 'grupuoti pagal abÄ—cÄ—lÄ™';
$lang['letters'] = 'raidÄ—s';
$lang['show tag cloud'] = 'rodyti žymų debesį';
$lang['cloud'] = "debesis";
$lang['Reset to default values'] = "Nustatyti numatytuosius nustatymus";
-$lang['delete all images from your favorites'] = "i&#352;trinti visas nuotraukas i&#352; m&#279;gstamiausi&#371;";
-$lang['Sent by'] = 'IŠsiūsta';
-$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Slapukai yra blokuojami arba nepalaikomi jūsų narŠyklėje. Jūs turite įgalinti slapukus prisijungdami';
+$lang['Sent by'] = 'Išsiųsta';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Slapukai yra blokuojami arba nepalaikomi jūsų naršyklėje. Jūs turite įgalinti slapukus prisijungdami';
-$lang['Some info about this picture'] = "Informacija apie &#352;i&#261; nuotrauk&#261;";
-$lang['Some more (technical) info about this picture'] = "Daugiau informacijos apie &#352;i&#261; nuotrauk&#261;";
-$lang['edit this comment'] = "Redaguoti &#352;&#303; komentar&#261;";
$lang['Edit a comment'] = 'Redaguoti komentarÄ…';
$lang['Are you sure?'] = "Ar esi tikras?";
$lang['(!) This comment requires validation'] = '(!) &#352;iam komentarui reikia patvirtinimo';
@@ -383,18 +286,150 @@ $lang['Welcome'] = 'Sveiki';
$lang['Welcome to your Piwigo photo gallery!'] = 'Sveiki atvykę į Piwigo nuotraukų galeriją!';
$lang['... or browse your empty gallery'] = '... arba ie&#352;koti tu&#352;&#269;ios galerijos';
$lang['... or please deactivate this message, I will find my way by myself'] = '... arba pra&#353;ome i&#353;jungti Å¡&#353;&#303; prane&#353;im&#261;, a&#353; rasiu pats';
-$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Sveika(-as) %s, Tavo Piwigo galerija yra tuÅ Äia!';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Sveika(-as) %s, Tavo Piwigo galerija yra tuÅ¡Äia!';
$lang['I want to add photos'] = 'Patalpinti nuotraukas';
-$lang['Manage this user comment: %s'] = 'Redaguoti Šio žmogaus komentarą: %s';
-$lang['Email address is missing. Please specify an email address.'] = 'NeįraŠytas elekroninio paŠto adresas. PraŠome jį nurodyti.';
-$lang['This author modified following comment:'] = 'Autorius pakeitė Šį komentarą:';
-$lang['This author removed the comment with id %d'] = 'šis autorius ištrinė komentarą, kurio id yra %d';
-$lang['delete this comment'] = "i&#353;trinti komentar&#261;";
-$lang['validate this comment'] = 'patvirtinti komentar&#261;';
+$lang['Manage this user comment: %s'] = 'Redaguoti šio žmogaus komentarą: %s';
+$lang['Email address is missing. Please specify an email address.'] = 'Neįrašytas elekroninio pašto adresas. Prašome jį nurodyti.';
+$lang['This author modified following comment:'] = 'Autorius pakeitė šį komentarą:';
+$lang['This author removed the comment with id %d'] = 'Šis autorius ištrynė komentarą, kurio id yra %d';
$lang['month']['8'] = 'Rugpjūtis';
$lang['month']['9'] = 'RugsÄ—jis';
$lang['month']['5'] = 'Gegužė';
$lang['month']['6'] = 'Birželis';
$lang['day']['3'] = 'TreÄiadienis';
$lang['day']['6'] = 'Šeštadienis';
+$lang['set as album representative'] = 'nustatyti kaip albumo viršelį';
+$lang['in %d sub-album'] = '%d subalbume';
+$lang['in %d sub-albums'] = '%d subalbumuose';
+$lang['in this album'] = 'Å¡iame albume';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS srautas informuoja apie naujus įvykius šiame puslapyje: naujas nuotraukas, atnaujintus albumus, naujus komentarus. Naudojama su RSS srauto skaitykle.';
+$lang['Photos posted within the last %d day.'] = 'Tik nuotrukos, paskelbtos per paskutinÄ™ %d dienÄ….';
+$lang['Photos posted within the last %d days.'] = 'Tik nuotrukos, paskelbtos per paskutines %d dienas.';
+$lang['Piwigo encountered a non recoverable error'] = 'Piwigo susidūrė su didele klaida.';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Skaitine tvarka, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Skaitine tvarka, 9 &rarr; 1';
+$lang['IPTC Metadata'] = 'IPTC Metaduomenys';
+$lang['Forbidden'] = 'Priėjimas draudžiamas';
+$lang['return to the display of all photos'] = 'grįžti į visų nuotraukų peržiūrą';
+$lang['photos posted during the last %d days'] = 'nuotraukos, paskelbtos per paskutines %d dienas(-ų)';
+$lang['mandatory'] = 'privalomas';
+$lang['display available tags'] = 'rodyti galimas žymas';
+$lang['display best rated photos'] = 'rodyti geriausiai vertinamas nuotraukas';
+$lang['display last user comments'] = 'rodyti paskutinius lankytojų komentarus';
+$lang['display most recent photos'] = 'rodyti naujausias nuotraukas';
+$lang['display most visited photos'] = 'rodyti žiūrimiausias nuotraukas';
+$lang['display only recently posted photos'] = 'rodyti tik nesenai patalpintas nuotraukas';
+$lang['display photos linked to this tag'] = 'rodyti nuotraukas, susijusias su šia žyma';
+$lang['display recently updated albums'] = 'rodyti nesenai atnaujintus albumus';
+$lang['display this album'] = 'rodyti šį albumą';
+$lang['display your favorites photos'] = 'rodyti jūsų mėgstamiausias nuotraukas';
+$lang['html tags are not allowed in login'] = 'prisijungimo varde HTML žymos neleidžiamos';
+$lang['Invalid key'] = 'Neteisingas raktas';
+$lang['Manual sort order'] = 'Rankinė rūšiavimo tvarka';
+$lang['EXIF Metadata'] = 'EXIF Metaduomenys';
+$lang['2small'] = 'XXS - Miniatiūrinė';
+$lang['Here are your connection settings'] = 'Jūsų prisijungimo duomenys';
+$lang['Password Reset'] = 'Slaptažodžio keitimas';
+$lang['Password reset is not allowed for this user'] = 'Šiam vartotojui slaptažodžio keitimas negalimas';
+$lang['Password: %s'] = 'Slaptažodis: %s';
+$lang['Photos only RSS feed'] = 'Tik nuotrakų RSS srautas';
+$lang['Please enter your username or email address.'] = 'Prašome įvesti vartotojo vardą arba el-pašto adresą.';
+$lang['Rating score'] = 'Įvertinimo rezultatas';
+$lang['large'] = 'L - DidelÄ—';
+$lang['medium'] = 'M - VidutinÄ—';
+$lang['photo'] = 'nuotrauka';
+$lang['small'] = 'S - Maža';
+$lang['square'] = 'Kvadratas';
+$lang['this email address is already in use'] = 'šis el-pašto adresas užimtas';
+$lang['thumb'] = 'Piktograma';
+$lang['xlarge'] = 'XL - Labai didelÄ—';
+$lang['xsmall'] = 'XS - Labai maža';
+$lang['xxlarge'] = 'XXL - milžiniška';
+$lang['Search for any term'] = 'Ieškoti betkokio termino';
+$lang['Username "%s" on gallery %s'] = 'Vartotojas "%s" galerijoje %s';
+$lang['Username is mandatory'] = 'Vartotojo vardas privalomas';
+$lang['Username modification'] = 'Vartotojo vardo keitimas';
+$lang['Username or email'] = 'Vartotojo vardas arba el-paštas';
+$lang['Username: %s'] = 'Vartotojo vardas: %s';
+$lang['Visits, high &rarr; low'] = 'Peržiūros, daugiausia &rarr; mažiausia';
+$lang['Visits, low &rarr; high'] = 'Peržiūros, mažiausia &rarr; daugiausia';
+$lang['Website'] = 'Puslapis';
+$lang['You will receive a link to create a new password via email.'] = 'Jūs gausite nuorodą, kurioje galėsite pasikeisti slaptažodį, el-paštu.';
+$lang['Your favorites'] = 'Jūsų mėgstamiausios';
+$lang['Your password has been reset'] = 'Jūsų slaptažodis pakeistas';
+$lang['Your username has been successfully changed to : %s'] = 'Jūsų vartotojo vardas sėkmingai pakeistas į: %s';
+$lang['Your website URL is invalid'] = 'Jūsų web puslapio adresas neteisingas';
+$lang['add this photo to your favorites'] = 'pridėti šią nuotrauką prie jūsų mėgstamiausių';
+$lang['delete all photos from your favorites'] = 'pašalinti visas nuotraukas iš jūsų mėgstamiausių';
+$lang['delete this photo from your favorites'] = 'pašalinti šią nuotrauką iš jūsų mėgstamiausių';
+$lang['display a set of random photos'] = 'rodyti atsitiktinių nuotraukų rinkinį';
+$lang['display all photos in all sub-albums'] = 'rodyti visas nuotraukas iš visų subalbumų';
+$lang['Recent albums'] = 'Naujausi albumai';
+$lang['Recent photos'] = 'Naujausios nuotraukos';
+$lang['Requested album does not exist'] = 'Toks albumas neegzistuoja';
+$lang['Requested tag does not exist'] = 'Tokia žyma neegzistuoja';
+$lang['Search in albums'] = 'Ieškoti albumuose';
+$lang['Search in sub-albums'] = 'Ieškoti subalbumuose';
+$lang['Send my connection settings by email'] = 'Atsiųsti mano prisijungimo duomenis el-paštu';
+$lang['Show latest comments first'] = 'Pirma naujausi komentarai';
+$lang['Show oldest comments first'] = 'Pirma seniausi komentarai';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Kažkas paprašė pakeisti slaptažodį šiam vartotojui:';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Sėkmingai užregistruota. Prisijungimo duomenis jums greitu metu atsiųsime el-paštu.';
+$lang['Thank you for registering at %s!'] = 'AÄiÅ«, kad prisiregistravote %s';
+$lang['The number of photos per page must be a not null scalar'] = 'Nuotraukų skaiÄius puslapiui turi bÅ«ti sveikas teigiamas skaiÄius';
+$lang['The passwords do not match'] = 'Slaptažodžiai nesutampa';
+$lang['To reset your password, visit the following address:'] = 'Norėdami pasikeisti slaptažodi apsilankykite šiuo adresu:';
+$lang['User "%s" has no email address, password reset is not possible'] = 'Vartotojas "%s" neįvedęs elektroninio pašto adreso - neįmanoma pakeisti slaptažodžio';
+$lang['Rating score, low &rarr; high'] = 'Įvertinimas, žemas &rarr; aukštas';
+$lang['Rating score, high &rarr; low'] = 'Įvertinimas, aukštas &rarr; žemas';
+$lang['Photo title, Z &rarr; A'] = 'Nuotraukos pavadinimas, Z &rarr; A';
+$lang['Photo title, A &rarr; Z'] = 'Nuotraukos pavadinimas, A &rarr; Z';
+$lang['Number of photos per page'] = 'Nuotraukų skaiÄius puslapiui';
+$lang['File name, Z &rarr; A'] = 'Failo vardas, Z &rarr; A';
+$lang['File name, A &rarr; Z'] = 'Failo vardas, A &rarr; Z';
+$lang['Date posted, old &rarr; new'] = 'Paskelbimo data, seniausi &rarr; naujausi';
+$lang['Date posted, new &rarr; old'] = 'Paskelbimo data, naujausi &rarr; seniausi';
+$lang['Date created, old &rarr; new'] = 'Sukūrimo data, seniausi &rarr; naujausi';
+$lang['Date created, new &rarr; old'] = 'Sukūrimo data, naujausi &rarr; seniausi';
+$lang['Photo sizes'] = 'Nuotraukų dydžai';
+$lang['Random photos'] = 'AtsitiktinÄ—s nuotraukos';
+$lang['Rate this photo'] = 'Įvertinti šią nuotrauką';
+$lang['Return to home page'] = 'Grįžti į pagrindinį puslapį';
+$lang['Search by date'] = 'Ieškoti pagal datą';
+$lang['Page not found'] = 'Puslapis nerastas';
+$lang['Original'] = 'Originalas';
+$lang['Album: %s'] = 'Albumas: %s';
+$lang['Invalid username or email'] = 'Neteisingas vartotojo vardas arba el-paštas';
+$lang['Mobile'] = 'Mobilus';
+$lang['Desktop'] = 'Darbastalis';
+$lang['Email address is mandatory'] = 'Elektroninio pašto adresas būtinas';
+$lang['Enter your new password below.'] = 'Įveskite savo naują slaptažodį.';
+$lang['Expand all albums'] = 'IÅ¡skleisti visus albumus';
+$lang['Hello %s,'] = 'Sveiki, %s,';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Jei manote, kad gavote šį laišką per klaidą - tiesiog ignoruokite jį';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Jei manote, kad gavote šį laišką per klaida - susisiekite su mumis adresu %s';
+$lang['Album'] = 'Albumas';
+$lang['Album results for'] = 'Paieškos rezultatai';
+$lang['Albums'] = 'Albumai';
+$lang['Bad request'] = 'Bloga užklausa';
+$lang['Change my password'] = 'Keisti mano slaptažodį';
+$lang['Check your email for the confirmation link'] = 'Jums į elektroninį paštą išsiųsta patvirtinimo nuoroda';
+$lang['Click on the photo to see it in high definition'] = 'Paspauskite ant nuotraukos, jei norite pamatyti ją didelės raiškos';
+$lang['Complete RSS feed (photos, comments)'] = 'Pilnas RSS srautas (nuotraukos, komentarai)';
+$lang['Download'] = 'atsisiųsti';
+$lang['Download this file'] = 'Atsisiųsti šį failą';
+$lang['Edit'] = 'Redaguoti';
+$lang['View in'] = 'Žiūrėti kaip';
+$lang['display each day with photos, month per month'] = 'rodyti kalendorių su fotografijomis, diena po dienos, menėsis po mėnesio';
+$lang['Permalink for album not found'] = 'Fiksuota nuoroda į albumą nerasta';
+$lang['%d rate'] = 'Įvertinimas: %d';
+$lang['Email'] = 'Elektroninis paštas';
+$lang['First Page'] = 'Pirmas puslapis';
+$lang['Go back to the album'] = 'Grįžti į albumą';
+$lang['Last Page'] = 'Paskutinis puslapis';
+$lang['Password is missing. Please enter the password.'] = 'Nėra slaptažodžio. Prašome įvesti slaptažodį';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Nėra slaptažodžio patvirtinimo. Prašome pakartoti slaptažodį';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Nav paroles apstiprinÄjuma. LÅ«dzu apstipriniet paroli.';
+$lang['%d photos per page'] = '%d nuotr. puslapyje';
+$lang['Theme'] = 'Tema';
?> \ No newline at end of file
diff --git a/language/lt_LT/help/cat_move.html b/language/lt_LT/help/cat_move.html
new file mode 100755
index 000000000..f2ce5788a
--- /dev/null
+++ b/language/lt_LT/help/cat_move.html
@@ -0,0 +1,14 @@
+<h2>Virtualiųjų albumų perkėlimas</h2>
+
+<p>Tik virtualieji albumai gali turėti naują pagrindinį albumą.</p>
+
+<h3>Kaip perkelti virtualius albumus</h3>
+
+<p>Pasirinkite vienÄ… ar kelis virtualius albumus, kuriuos norite perkelti.
+Jei sÄ…raÅ¡as tuÅ¡Äias, tai reiÅ¡kia, kad jÅ«s dar nesukÅ«rÄ—te nÄ— vieno virtualaus albumo.</p>
+
+<h3>Naujas pagrindinis albumas</h3>
+
+<p>Pasirinkite naują pagrindinį albumą (virtualųjį arba tikrąjį).
+Jei nepasirinksite jokio pagrindo, tuomet pasirinkti virtualieji albumai taps Å¡akniniais.
+Albumas negali būti perkeltas į save ar į viena iš savo šakų.</p>
diff --git a/language/lt_LT/help/cat_options.html b/language/lt_LT/help/cat_options.html
new file mode 100755
index 000000000..e732b2e99
--- /dev/null
+++ b/language/lt_LT/help/cat_options.html
@@ -0,0 +1,22 @@
+<h2>Albumo parinktys</h2>
+
+<p>ParinkÄių tvarkymas keliems albumams iÅ¡kart.</p>
+
+<dl>
+
+<dt>Komentarai</dt>
+<dd>Lankytojai gali komentuoti nuotraukas, jei jos priklauso albumams, kuriems komentarai yra įjungti.</dd>
+
+<dt>Užrakinti</dt>
+<dd>Paprasti lankytojai nemato išjungtų albumų, juos galerijoje gali matyti tik administratoriai. Albumus galima užrakinti, kai reikia ką nors juose patvarkyti.</dd>
+
+<dt>Viešas / privatus</dt>
+<dd>Kai albumas taps privatus, galÄ—site suteikti prieigos teises nariams ir grupÄ—ms.</dd>
+
+<dt>Reprezentacija</dt>
+<dd>Ši parinktis galima, kuomet konfigūracijos parametras
+<code>allow_random_representative</code> (žiūrėti <span
+ class="filename">include/config_defaults.inc.php</span>) nustatytas į
+<em>true</em>. Kiekvieną albumą gali atstovauti atsitiktinė arba pasirinkta nuotrauka iš jo.</dd>
+
+</dl> \ No newline at end of file
diff --git a/language/lt_LT/help/index.php b/language/lt_LT/help/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/language/lt_LT/help/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/language/lt_LT/install.lang.php b/language/lt_LT/install.lang.php
new file mode 100755
index 000000000..f07168123
--- /dev/null
+++ b/language/lt_LT/install.lang.php
@@ -0,0 +1,68 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Jei reikės pagalbos - drąsiai kreipkitės konsultacijų mūsų forumuose: %s';
+$lang['Installation'] = 'Diegimas';
+$lang['Congratulations, Piwigo installation is completed'] = 'Sveikiname, Piwigo diegimas baigtas';
+$lang['enter a login for webmaster'] = 'įveskite webmasterio vartotojo vardą';
+$lang['webmaster login can\'t contain characters \' or "'] = 'webmasterio vartotojo vardas negali turėti simbolių \' ar "';
+$lang['Start Install'] = 'Pradėti įdiegimą';
+$lang['Try to configure PHP 5'] = 'Pabandyti sukonfigūruoti PHP 5';
+$lang['Welcome to your new installation of Piwigo!'] = 'Prašom užeiti į naują Piwigo svetainę!';
+$lang['also given by your host provider'] = 'taip pat teikiamas Jūsų hostingo paslaugų tiekėjo';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Alternatyvus bÅ«das - tai nukopijuoti tekstÄ… iÅ¡ lauko aukÅ¡Äiau ir įraÅ¡yti jį į "local/config/database.inc.php" failÄ…. DÄ—mesio! database.inc.php turi bÅ«ti įraÅ¡yta tik tai, kas yra textarea laukelyje, jokių tuÅ¡Äių eiluÄių ir tarpų.';
+$lang['user login given by your host provider'] = 'login, kurį davė jūsų paslaugų tiekėjas';
+$lang['user password given by your host provider'] = 'slaptažodis, kurį davė jūsų paslaugų tiekėjas';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'Lankytojai šiuo el-pašto adresu galės susisiekti su administratorium';
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'JÅ«s turÄ—tumÄ—te kreiptis pagalbos į savo paslaugų tiekÄ—jÄ…, kaip perjungti į PHP 5 paÄiam.';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'šį prefiksą turės duomenų bazės lentelės (tai padeda geriau valdyti lenteles)';
+$lang['please enter your password again'] = 'dar sykį įveskite savo slaptažodį';
+$lang['verification'] = 'patikrinimas';
+$lang['Hope to see you back soon.'] = 'Iki greito pasimatymo.';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Reikia pagalbos ? Užduokite klausimą <a href="%s">Piwigo pranešimų lentoje</a>.';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Dėmesio, jūs galite pakeisti savo konfigūraciją pats ir tada perkrauti Piwigo.';
+$lang['PHP 5 is required'] = 'reikalingas PHP 5';
+$lang['Password ']['confirm'] = 'Slaptažodis [pakartoti]';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo gali pamėginti perjungti Jūsų konfigūraciją į PHP5 sukuriant, ar modifikuojant, .htaccess failą.';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo negalėjo sukonfigūruoti PHP 5';
+$lang['Sorry!'] = 'Apgailestaujame!';
+$lang['User'] = 'Vartotojas';
+$lang['Welcome to my photo gallery'] = 'Sveiki atvykę į mano foto galeriją';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Jūs galite atsisiųsti konfigūracinį failą ir padėti jį į local/config katalogą, prie Jūsų instaliacijos.';
+$lang['Admin configuration'] = 'Administracijos konfigūracija';
+$lang['Basic configuration'] = 'Pradinė konfigūracija';
+$lang['Can\'t connect to server'] = 'Neišeina prisijungti prie serverio';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Prie serverio prisijungti pavyko, taÄiau prie duomenų bazÄ—s ne.';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'Nepavyko sukurti local/config/database.inc.php konfigūracinio failo.';
+$lang['Database configuration'] = 'Duomenų bazės konfigūracija';
+$lang['Database name'] = 'Duomenų bazės pavadinimas';
+$lang['Database table prefix'] = 'Duomenų bazės lentelių prefiksas';
+$lang['Default gallery language'] = 'Numatytoji galerijos kalba';
+$lang['Download the config file'] = 'Atsisiųsti konfigūracini failą';
+$lang['Host'] = 'Hostas';
+$lang['It appears your webhost is currently running PHP %s.'] = 'Jūsų webhost\'as naudoja PHP %s.';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Tai bus rodoma lankytojams. Tai būtina puslapio administracijai';
+$lang['Just another Piwigo gallery'] = 'Tiesiog dar viena Piwigo galerija';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'Saugokite tai slaptai, nes tai leidžia prisijungti prie administratoriaus valdymo skydo.';
+$lang['localhost or other, supplied by your host provider'] = 'localhost arba kitas, suteiktas jūsų paslaugų tiekėjo';
+?> \ No newline at end of file
diff --git a/language/lt_LT/upgrade.lang.php b/language/lt_LT/upgrade.lang.php
new file mode 100755
index 000000000..409323bf5
--- /dev/null
+++ b/language/lt_LT/upgrade.lang.php
@@ -0,0 +1,40 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'Saugumo sumetimais toliau išvardinti priedai buvo išjungti. Prieš įjungiant priedus vėl, patikrinkite, ar nėra jų atnaujinimų:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Saugumo sumetimais toliau išvardintos temos buvo išjungtos. Prieš įjungiant temas vėl, patikrinkite, ar nėra jų atnaujinimų:';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Šis puslapis siųlo atnaujinti duomenų bazę iš senosios Piwigo versijos į naująją. Atnaujinimo asistentas mano, kad Jūs dabar naudojate <strong>leidimą %s</strong> (arba analogišką).';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Profilaktiškai peržiūrėkite [Administration>Tools>Maintenance], jei atsirado kokių nors netikėtumų.';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Iš buvusios konfigūracijos išsaugoti tik miniatiūrų prefiksai ir webmasterio el-pašto adresas';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'Tik administratorius gali pradėti atnaujinimą - prašome prisijungti žemiau.';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = '<i>%s</i> viduje, prieš <b>?></b>, įterpkite:';
+$lang['All sub-albums of private albums become private'] = 'Visi privaÄių albumų subalbumai tampa privatÅ«s';
+$lang['total upgrade time'] = 'bendras atnaujinimo laikas';
+$lang['total SQL time'] = 'bendras SQL laikas';
+$lang['You do not have access rights to run upgrade'] = 'JÅ«s neturite leidimo pradÄ—ti atnaujinimo';
+$lang['User permissions and group permissions have been erased'] = 'Vartotojų ir grupių leidimai buvo ištrinti';
+$lang['Upgrade informations'] = 'Atnaujinimo informacija';
+$lang['Upgrade from version %s to %s'] = 'Atnaujinti iš %s versijos į %s';
+$lang['Upgrade'] = 'Atnaujinimas';
+$lang['Statistics'] = 'Statistika';
+$lang['SQL queries'] = 'SQL Užklausos';
+?> \ No newline at end of file
diff --git a/language/lv_LV/admin.lang.php b/language/lv_LV/admin.lang.php
index 480a38a15..50ce8b9f7 100644
--- a/language/lv_LV/admin.lang.php
+++ b/language/lv_LV/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -190,7 +190,6 @@ $lang['Access type'] = 'Piekļuves tips';
$lang['Information data registered in database'] = 'DatubÄzÄ“ reÄ£istrÄ“tÄ informÄcija';
$lang['Default display'] = 'Izskats pēc noklusējuma';
$lang['The gallery URL is not valid.'] = 'Nekorekts galerijas URL.';
-$lang['Main'] = 'Galvenais';
$lang['The number of comments a page must be between 5 and 50 included.'] = 'LapÄ var bÅ«t no 5 lÄ«dz 50 komentÄriem.';
$lang['Configuration'] = 'KonfigurÄcija';
$lang['confirm'] = 'apstiprinÄjums';
@@ -225,7 +224,6 @@ $lang['Prepared time for list of users to send mail is limited. Others users are
$lang['Time to send mail is limited. Others mails are skipped.'] = 'E-pasta izsūtīšanas laiks ierobežots. Citas vēstules izlaistas.';
$lang['To send ?'] = 'Nosūtīt?';
$lang['Last send'] = 'Pēdējais nosūtītais';
-$lang['email'] = 'E-pasts';
$lang['User'] = 'LietotÄjs';
$lang['Complementary mail content'] = 'VÄ“stules saturs';
$lang['See you soon,'] = 'Visu labu,';
@@ -927,14 +925,10 @@ $lang['Panorama'] = 'PanorÄma';
$lang['Minimum width'] = 'MinimÄlais platums';
$lang['Minimum height'] = 'MinimÄlais augstums';
$lang['Landscape'] = 'Ainava';
-$lang['Invalid dimension'] = 'Kļūdaina dimensija';
-$lang['Format'] = 'FormÄts';
$lang['Number of albums per page'] = 'Albumu skaits lapÄ';
$lang['View in gallery'] = 'IeskatÄ«ties galarijÄ';
$lang['Manage photos'] = 'PÄrvaldÄ«t fotogrÄfijas';
$lang['Ratio'] = 'Attiecība';
-$lang['Minimum'] = 'Minimums';
-$lang['Maximum'] = 'Maksimums';
$lang['between %d and %d pixels'] = 'starp %d un %d pikseļiem';
$lang['between %.2f and %.2f'] = 'starp %.2f un %.2f';
$lang['Type here the name of the new group'] = 'Rakstiet Å¡eit jaunÄs grupas nosaukumu';
@@ -948,4 +942,32 @@ $lang['Manage the members'] = 'PÄrvaldÄ«t biedrus';
$lang['Merge selected groups'] = 'SapludinÄt atlasÄ«tÄs grupas';
$lang['Duplicate'] = 'DublikÄts';
$lang['Purge user cache'] = 'IztÄ«rÄ«t lietotÄja keÅ¡atmiņu';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'AttÄ“la izmÄ“ri tiks samazinÄti uz %dx%d pikseļiem. ';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'SakarÄ ar GD kÄ grafiskÄs bibliotÄ“kas izmantoÅ¡anu, attÄ“la izmÄ“ra mainÄ«Å¡ana pÄ“c augÅ¡upielÄdes ir atslÄ“gta';
+$lang['Select at least one tag'] = 'Atlasiet vismaz vienu tagu';
+$lang['Basic settings'] = 'Pamata iestījumi';
+$lang['General'] = 'VispÄrÄ«gi';
+$lang['Mail theme'] = 'Pasta tēma';
+$lang['on the %d selected users'] = ' %d atlasÄ«tiem lietotÄjiem';
+$lang['Showing %s to %s of %s users'] = 'ParÄda no %s lÄ«dz %s no %s lietotÄjiem';
+$lang['Registered on %s, %s.'] = 'Reģistrēts %s, %s.';
+$lang['User %s updated'] = '%s lietotÄjs atjauninÄts';
+$lang['Update user'] = 'AtjauninÄt lietotÄju';
+$lang['Show %s users'] = 'ParÄdÄ«t %s lietotÄjus';
+$lang['No user selected, no action possible.'] = 'Neviens lietotÄja nav atlasÄ«ts, darbÄ«ba nav iespÄ“jama.';
+$lang['No user selected of %d users'] = 'Neviens no %d lietotÄjiem nav atlasÄ«ts';
+$lang['No matching user found'] = 'Nav atrasti atbilstoÅ¡i lietotÄji';
+$lang['Users modified'] = 'LietotÄji modoficÄ“ti';
+$lang['User %s added'] = '%s lietotÄjs pievienots';
+$lang['Password updated'] = 'Parole atjauninÄta';
+$lang['%d of %d users selected'] = '%d no %d lietotÄjiem atlasÄ«ti';
+$lang['(filtered from %s total users)'] = '(izfiltrÄ“ti no %s kopÄ“jiem lietotÄjiem)';
+$lang['All %d users are selected'] = 'Visi %d lietotÄji ir atlasÄ«ti';
+$lang['Last visit on %s, %s.'] = 'Pēdējais apmeklējums %s, %s.';
+$lang['Loading...'] = 'IelÄdÄ“jas';
+$lang['Change username'] = 'NomainÄ«t lietotÄjvÄrdu';
+$lang['Change password'] = 'Nomainīt paroli';
+$lang['Open user details'] = 'AtvÄ“rt lietotÄja informÄciju';
+$lang['Close user details'] = 'AizvÄ“rt lietotÄja informÄciju';
+$lang['close'] = 'aizvērt';
?> \ No newline at end of file
diff --git a/language/lv_LV/common.lang.php b/language/lv_LV/common.lang.php
index 363bb6146..4132cbb50 100644
--- a/language/lv_LV/common.lang.php
+++ b/language/lv_LV/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Latviešu [LV]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=427
Author: Piwigo team
Author URI: http://piwigo.org
@@ -243,7 +243,6 @@ $lang['login mustn\'t end with a space character'] = "logins nedrīkst beigties
$lang['login mustn\'t start with a space character'] = "logins nedrÄ«kst sÄkties ar tukÅ¡umu - spacebar";
$lang['this login is already used'] = "Å¡o loginu jau lieto";
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = "e-pasta adresei jÄizskatÄs xxx@yyy.eee (piemÄ“ram : jack@altern.org)";
-$lang['please enter your password again'] = "lūdzu ievadiet savu paroli vēlreiz";
$lang['Auto login'] = "Auto logins";
$lang['remove this tag from the list'] = "izņemt šo tagu no saraksta";
$lang['representative'] = "pÄrstÄvis";
@@ -271,7 +270,6 @@ $lang['SQL queries in'] = "SQL pieprasījums";
$lang['display only recently posted photos'] = 'rÄdÄ«t tikai tagad ievietotos fotoattÄ“lus';
$lang['return to the display of all photos'] = 'atgriezties pie visu foto rÄdÄ«Å¡anas režīma';
$lang['the beginning'] = "sÄkums";
-$lang['Interface theme'] = "Interfeisa tēmas";
$lang['Thumbnails'] = "SÄ«kbildes";
$lang['Menu'] = "Izvēlne";
$lang['A comment on your site'] = "KomentÄrijs no jÅ«su vietnes";
@@ -413,4 +411,12 @@ $lang['Username is mandatory'] = 'LietotÄjvÄrds ir obligÄts';
$lang['Email address is mandatory'] = 'E-pasta adrese ir obligÄta';
$lang['Website'] = 'Interneta vietne';
$lang['Your website URL is invalid'] = 'Jūsu interneta vietnes URL ir kļūdains';
+$lang['Email'] = 'e-pasts';
+$lang['Go back to the album'] = 'Iet atpakaļ uz albūmu';
+$lang['Last Page'] = 'PÄ“dÄ“jÄ lapa';
+$lang['First Page'] = 'PirmÄ lapa';
+$lang['Password is missing. Please enter the password.'] = 'Nepareiza parole. LÅ«dzu atkÄrtojiet mÄ“Ä£inÄjumu.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'TrÅ«kst paroles apstiprinÄjuma. LÅ«dzu apstipriniet izvÄ“lÄ“to paroli.';
+$lang['%d photos per page'] = '%d fotogrÄfiju lapÄ';
+$lang['Theme'] = 'TÄ“ma';
?> \ No newline at end of file
diff --git a/language/lv_LV/index.php b/language/lv_LV/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/lv_LV/index.php
+++ b/language/lv_LV/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/lv_LV/install.lang.php b/language/lv_LV/install.lang.php
index 774364b08..094ce4645 100644
--- a/language/lv_LV/install.lang.php
+++ b/language/lv_LV/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -27,16 +27,12 @@ $lang['Default gallery language'] = "Galerijas valoda pec noklusešanas";
$lang['Database configuration'] = "Datubazes konfiguracija";
$lang['Admin configuration'] = "Administratora konfiguracija";
$lang['Start Install'] = "Sakt instalaciju";
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = "e-pasta adresei jaizskatas xxx@yyy.eee (piemeram : jack@altern.org)";
-$lang['Webmaster login'] = "Webmastera logins";
$lang['It will be shown to the visitors. It is necessary for website administration'] = "Tas tiks radits apmekletajiem. Tas nepieciešams web lapas administrešanai";
$lang['Connection to server succeed, but it was impossible to connect to database'] = "Savienojums ar serveri sekmigs, bet savienojums ar datu bazi nav iespejams";
$lang['Can\'t connect to server'] = "Nevar savienoties ar serveri";
$lang['Host'] = "Hosts";
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = "localhost, sql.multimania.com, toto.freesurf.fr";
$lang['User'] = "Lietotajs";
$lang['user login given by your host provider'] = "lietotaja logins, ko pieškir Jusu hosta pakalpojuma sniedzejs";
-$lang['Password'] = "Parole";
$lang['user password given by your host provider'] = " lietotaja parole, ko pieškir Jusu hosta pakalpojuma sniedzejs";
$lang['Database name'] = "Datu bazes nosaukums";
$lang['also given by your host provider'] = "ari pieškir Jusu hosta pakalpojuma sniedzejs";
@@ -45,12 +41,10 @@ $lang['database tables names will be prefixed with it (enables you to manage bet
$lang['enter a login for webmaster'] = "ievadit webmastera loginu";
$lang['webmaster login can\'t contain characters \' or "'] = "webmastera logins nedrikst saturet ' vai \"";
$lang['please enter your password again'] = "ludzu ievadiet Jusu paroli no jauna";
-$lang['Webmaster password'] = "Webmastera parole";
$lang['Keep it confidential, it enables you to access administration panel'] = "Esiet konfidenciali, tas lauj pieklut administratora panelim";
$lang['Password [confirm]'] = "Parole [apstiprinat]";
$lang['verification'] = "parbaude";
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = "Vajag palidzibu? Uzdodiet savu jautajumu <a href=\"%s\">Piwigo sludinajumos</a>.";
-$lang['Webmaster mail address'] = 'WebmÄstera pasta adrese';
$lang['Visitors will be able to contact site administrator with this mail'] = "Apmekletaji vares izmantot Å¡o e-pastu, lai sazinatos ar lapas administratoru";
$lang['PHP 5 is required'] = "nepieciešams PHP 5 ";
$lang['It appears your webhost is currently running PHP %s.'] = "Jusu webhosts patlaban izmanto PHP %s.";
@@ -70,4 +64,5 @@ $lang['Just another Piwigo gallery'] = 'VÄ“l viena Piwigo galerija';
$lang['Welcome to my photo gallery'] = 'Laipni lÅ«gti manÄ foto galerijÄ';
$lang['Welcome to your new installation of Piwigo!'] = 'Laipni lÅ«gti JÅ«su Piwigo jaunajÄ instalÄcijÄ!';
$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Nevilcinieties izmantot mūsu forumu palīdzību: %s';
+$lang['localhost or other, supplied by your host provider'] = 'vietējais pakalpojuma sniedzējs vai cits, tas ko atbalsta vietējais pakalpojuma sniedzējs';
?> \ No newline at end of file
diff --git a/language/lv_LV/upgrade.lang.php b/language/lv_LV/upgrade.lang.php
index 0d439a813..0bbd2538f 100644
--- a/language/lv_LV/upgrade.lang.php
+++ b/language/lv_LV/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/mk_MK/admin.lang.php b/language/mk_MK/admin.lang.php
index 2499d0bb0..2650bb1a6 100644
--- a/language/mk_MK/admin.lang.php
+++ b/language/mk_MK/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/mk_MK/common.lang.php b/language/mk_MK/common.lang.php
index a2884ebb6..c6503b419 100644
--- a/language/mk_MK/common.lang.php
+++ b/language/mk_MK/common.lang.php
@@ -1,13 +1,10 @@
<?php
// +-----------------------------------------------------------------------+
-// | PhpWebGallery - a PHP based picture gallery |
-// | Copyright (C) 2002-2003 Pierrick LE GALL - pierrick@phpwebgallery.net |
-// | Copyright (C) 2003-2007 PhpWebGallery Team - http://phpwebgallery.net |
+// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | file : $Id$
-// | last update : $Date$
-// | last modifier : $Author$
-// | revision : $Revision$
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
// | 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 |
@@ -25,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: МакедонÑки [MK]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=428
Author: Piwigo team
Author URI: http://piwigo.org
@@ -256,7 +253,6 @@ $lang['login mustn\'t end with a space character'] = 'КориÑничкото Ð
$lang['login mustn\'t start with a space character'] = 'КориÑничкото име не може да започнува Ñо space меÑто';
$lang['this login is already used'] = 'КориÑничкото име веќе поÑтои. Ве молиме одберете друго.';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'e-mail адреÑата мора да изгледа вака xxx@yyy.eee (пример: pero@makedonija.com.mk)';
-$lang['please enter your password again'] = 'Ве молиме повторно внеÑете ја вашата лозинка.';
$lang['Auto login'] = 'Логирај ме автоматÑки на Ñекоја моја поÑета';
$lang['remove this tag from the list'] = 'избриши ја оваа етикета од лиÑтата';
$lang['representative'] = 'главна икона';
@@ -285,7 +281,6 @@ $lang['SQL queries in'] = 'SQL queries in';
$lang['display only recently posted photos'] = 'Прикажи ги Ñамо новите фотографии';
$lang['return to the display of all photos'] = 'Врати Ñе кон прикажување на Ñите фотографии';
$lang['the beginning'] = 'почетокот';
-$lang['Interface theme'] = 'Изглед на галеријата';
$lang['Thumbnails'] = 'Сликички';
$lang['Menu'] = 'СиÑтем';
$lang['A comment on your site'] = 'Коментар на твојата Ñтрана';
diff --git a/language/mk_MK/index.php b/language/mk_MK/index.php
index 61741e9cb..c8de97f60 100644
--- a/language/mk_MK/index.php
+++ b/language/mk_MK/index.php
@@ -1,13 +1,10 @@
<?php
// +-----------------------------------------------------------------------+
-// | PhpWebGallery - a PHP based picture gallery |
-// | Copyright (C) 2002-2003 Pierrick LE GALL - pierrick@phpwebgallery.net |
-// | Copyright (C) 2003-2007 PhpWebGallery Team - http://phpwebgallery.net |
+// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | file : $Id$
-// | last update : $Date$
-// | last modifier : $Author$
-// | revision : $Revision$
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
// | 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 |
diff --git a/language/mk_MK/install.lang.php b/language/mk_MK/install.lang.php
index ec53ce9e9..02b43ab0e 100755
--- a/language/mk_MK/install.lang.php
+++ b/language/mk_MK/install.lang.php
@@ -1,25 +1,26 @@
<?php
-// +-----------------------------------------------------------------------+
-// | Piwigo - a PHP based photo gallery |
-// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
-// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
-// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
-// +-----------------------------------------------------------------------+
-// | 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 |
-// | |
-// | This program is distributed in the hope that it will be useful, but |
-// | WITHOUT ANY WARRANTY; without even the implied warranty of |
-// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
-// | General Public License for more details. |
-// | |
-// | You should have received a copy of the GNU General Public License |
-// | along with this program; if not, write to the Free Software |
-// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
-// | USA. |
// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
$lang['Admin configuration'] = 'ÐдминиÑтраторÑки поднеÑувања';
$lang['Basic configuration'] = 'ОÑновни поднеÑувања';
$lang['Congratulations, Piwigo installation is completed'] = 'Браво, Piwago инÑталацијата е завршена';
@@ -28,7 +29,6 @@ $lang['Database name'] = 'Име на датабазата';
$lang['Default gallery language'] = 'ОÑновен јазик на галеријата';
$lang['Hope to see you back soon.'] = 'Се надеваме дека ќе Ñе видиме наÑкоро.';
$lang['Installation'] = 'ИнÑталација';
-$lang['Password'] = 'Лозинка';
$lang['Sorry!'] = 'Извини !';
$lang['Start Install'] = 'Стартувај ја инÑталацијата';
$lang['Try to configure PHP 5'] = 'Пробај да го Ñетираш PHP 5';
diff --git a/language/mn_MN/about.html b/language/mn_MN/about.html
new file mode 100644
index 000000000..c33698882
--- /dev/null
+++ b/language/mn_MN/about.html
@@ -0,0 +1,16 @@
+<p>ЭнÑÑ…Ò¯Ò¯ гÑÑ€Ñл зургын галерей нь Piwigo дÑÑÑ€ ÑуурилÑан болно.</p>
+
+<p>Piwigo - ÑÐ½Ñ Ð±Ð¾Ð» гÑÑ€Ñл зургын вÑб галерей бүтÑÑÑ…Ñд зориулÑан программ
+бөгөөд идÑвхтÑй Ñ…ÑÑ€ÑглÑгчид болон программ хөгжүүлÑгчдийн хамтын бүтÑÑл юм.
+Төрөл бүрийн нÑмÑлт өргөтгөлүүд нь Piwigo-г илүү уÑн хатан, олон төрлийн өөрчлөлт хийх боломжийг олгодог.
+Piwigo-н хамгийн гол Ò¯Ð½Ñ Ñ†ÑÐ½Ñ Ð½ÑŒ нÑÑлттÑй ÑÑ… кодтой, үнÑгүй программ гÑдÑгтÑÑ Ð±Ð°Ð¹Ð´Ð°Ð³ билÑÑ.</p>
+
+<p id="linkToPiwigo"><a href="http://piwigo.org">Piwigo-н вÑб Ñайт</a></p>
+
+<p> Монгол Ñ…Ñл уруу орчуулж хувь нÑмÑÑ€ÑÑ Ð¾Ñ€ÑƒÑƒÐ»Ñан Ñ…Ò¯Ð¼Ò¯Ò¯Ñ (цагаан толгойн дарааллаар):
+
+ <ul>
+ <li><a href="http://piwigo.org/forum/profile.php?id=18974">Ulzii</a></li>
+
+ </ul>
+ Орчуулга хийж хувь нÑмÑÑ€ÑÑ Ð¾Ñ€ÑƒÑƒÐ»Ñан хүн бүхÑнд талархал илÑрхийлье!</p>
diff --git a/language/mn_MN/admin.lang.php b/language/mn_MN/admin.lang.php
new file mode 100755
index 000000000..bbcd1995d
--- /dev/null
+++ b/language/mn_MN/admin.lang.php
@@ -0,0 +1,703 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Zoom'] = 'Томруулах';
+$lang['add a new watermark'] = 'шинÑÑÑ€ уÑан Ñ…ÑÑ Ð½ÑмÑÑ…';
+$lang['average time'] = 'дундаж хугацаа';
+$lang['bottom left corner'] = 'зүүн доод булан';
+$lang['bottom right corner'] = 'баруун доод булан';
+$lang['clean'] = 'цÑвÑрлÑÑ…';
+$lang['create a new album'] = 'ÑˆÐ¸Ð½Ñ Ñ†Ð¾Ð¼Ð¾Ð³ Ò¯Ò¯ÑгÑÑ…';
+$lang['create a new site'] = 'ÑˆÐ¸Ð½Ñ Ñайт Ò¯Ò¯ÑгÑÑ…';
+$lang['default values'] = 'үндÑÑн утга';
+$lang['delete'] = 'уÑтгах';
+$lang['delete album'] = 'цомгийг уÑтгах';
+$lang['delete photo'] = 'зургийг уÑтгах';
+$lang['deleted'] = 'уÑтгаÑан үед';
+$lang['jump to album'] = 'цомог уруу очих';
+$lang['jump to photo'] = 'зураг уруу очих';
+$lang['guest'] = 'зочин';
+$lang['new'] = 'шинÑ';
+$lang['number of miniaturized photos'] = 'Ò¯Ò¯ÑгÑÑÑн Ð´Ò¯Ñ€Ñ Ð·ÑƒÑ€Ð³Ñ‹Ð½ тоо';
+$lang['other'] = 'буÑад';
+$lang['photos per page'] = '(нÑг хуудÑанд харагдах зураг)';
+$lang['ranks'] = 'түвшин';
+$lang['registered users'] = 'бүртгүүлÑÑн Ñ…ÑÑ€ÑглÑгчид';
+$lang['registration date'] = 'бүртгүүлÑÑн огноо';
+$lang['remove tags'] = 'түлхүүр үгийг хаÑах';
+$lang['remove this filter'] = 'ÑÐ½Ñ Ñонголтыг хаÑах';
+$lang['test'] = 'шалгах';
+$lang['status'] = 'төлөв';
+$lang['sub-albums'] = 'дÑд цомог';
+$lang['top left corner'] = 'зүүн дÑÑд булан';
+$lang['top right corner'] = 'баруун дÑÑд булан';
+$lang['total time'] = 'нийт хугацаа';
+$lang['user_status_admin'] = 'Ðдмин';
+$lang['user_status_guest'] = 'Зочин';
+$lang['user_status_normal'] = 'Ð¥ÑÑ€ÑглÑгч';
+$lang['user_status_webmaster'] = 'Ð’ÑбмаÑтер';
+$lang['wrong filename'] = 'файлын нÑÑ€ буруу байна';
+$lang['User'] = 'Ð¥ÑÑ€ÑглÑгч';
+$lang['Thumbnail'] = 'Ð”Ò¯Ñ€Ñ Ð·ÑƒÑ€Ð°Ð³';
+$lang['Thumbnails generation in progress...'] = 'Ð”Ò¯Ñ€Ñ Ð·ÑƒÑ€Ð³Ð¸Ð¹Ð³ Ò¯Ò¯ÑгÑж байна...';
+$lang['The whole page'] = 'ХуудÑыг бүхÑлд нь';
+$lang['This album contains no photo.'] = 'Ð­Ð½Ñ Ñ†Ð¾Ð¼Ð¾Ð³ хооÑон байна';
+$lang['The name of an album must not be empty'] = 'Цомогын нÑÑ€ хооÑон байх Ñ‘Ñгүй';
+$lang['The gallery URL is not valid.'] = 'Цомогны URL Ñ…Ð¾Ð»Ð±Ð¾Ð¾Ñ Ð±ÑƒÑ€ÑƒÑƒ байна';
+$lang['The following tag was deleted'] = 'Дараахь түлхүүр үг уÑтлаа';
+$lang['Settings'] = 'Тохиргоо';
+$lang['Tag "%s" was added'] = '"%s" гÑÑÑн түлхүүр үгийг амжилттай нÑмлÑÑ';
+$lang['Tag "%s" already exists'] = '"%s" гÑÑÑн түлхүүр үг бүртгÑгдÑÑн байна';
+$lang['Send mail on HTML format'] = 'ÐœÑйлийг HTML Ñ…ÑлбÑÑ€ÑÑÑ€ илгÑÑÑ…';
+$lang['Representant'] = 'Цомогны Ð´Ò¯Ñ€Ñ Ð·ÑƒÑ€Ð°Ð³';
+$lang['Representation of albums'] = 'Цомогны Ð´Ò¯Ñ€Ñ Ð·ÑƒÑ€Ð°Ð³';
+$lang['Representative'] = 'Цомогны Ð´Ò¯Ñ€Ñ Ð·ÑƒÑ€Ð°Ð³';
+$lang['Save Settings'] = 'Хадгалах';
+$lang['Searching...'] = 'Хайж байна...';
+$lang['Select a file'] = 'Файлаа Ñонгох';
+$lang['Select an album'] = 'Цомогоо Ñонгох';
+$lang['Reject'] = 'Цуцлах';
+$lang['Refresh'] = 'СÑргÑÑÑ…';
+$lang['Rating'] = 'ҮнÑлгÑÑ';
+$lang['Photo name'] = 'Зургын нÑÑ€';
+$lang['Path'] = 'Байршил';
+$lang['Photos'] = 'Зураг';
+$lang['No photo in this album'] = 'Ð­Ð½Ñ Ñ†Ð¾Ð¼Ð¾Ð³ хооÑон байна';
+$lang['Number of downloads'] = 'ТатÑан тоо';
+$lang['Operating system'] = 'Үйлдлийн ÑиÑтем';
+$lang['New Version'] = 'Ð¨Ð¸Ð½Ñ Ñ…ÑƒÐ²Ð¸Ð»Ð±Ð°Ñ€';
+$lang['New name'] = 'Ð¨Ð¸Ð½Ñ Ð½ÑÑ€';
+$lang['Members'] = 'Гишүүд';
+$lang['Modify information'] = 'ÐœÑдÑÑллийг заÑах';
+$lang['Month'] = 'Сар';
+$lang['Move'] = 'Зөөх';
+$lang['Move albums'] = 'Цомгийг зөөх';
+$lang['Move to album'] = 'Цомог уруу зөөх';
+$lang['Informations'] = 'ÐœÑдÑÑллийн ÑмхÑтгÑл';
+$lang['Install'] = 'Суулгах';
+$lang['Installed Languages'] = 'ИдÑвхтÑй байгаа Ñ…Ñл';
+$lang['Languages'] = 'Ð¥Ñл';
+$lang['Languages which need upgrade'] = 'ШинÑчлÑÑ… шаардлагатай Ñ…Ñл';
+$lang['Level 2'] = 'Ðайз нөхөд';
+$lang['Level 4'] = 'ГÑÑ€ бүлийн гишүүн';
+$lang['Level 8'] = 'Ðдмин';
+$lang['List'] = 'ЖагÑаалт';
+$lang['Image Quality'] = 'Зургын чанар';
+$lang['Forbidden'] = 'Хориотой';
+$lang['GD version'] = 'GD хувилбар';
+$lang['Group'] = 'БүлÑг';
+$lang['Group name'] = 'Бүлгийн нÑÑ€';
+$lang['Groups'] = 'БүлÑг';
+$lang['Guests'] = 'Зочин';
+$lang['Height'] = 'Өндөр';
+$lang['Hide'] = 'Ðуух';
+$lang['High definition'] = 'Өндөр нарийвчлалтай';
+$lang['Hour'] = 'Цаг';
+$lang['File'] = 'Файл';
+$lang['Edit photo'] = 'Зургыг заÑах';
+$lang['Error list'] = 'Ðлдааны жагÑаалт';
+$lang['Everybody'] = 'Бүх хүн';
+$lang['Edit photo information'] = 'Зурагны мÑдÑÑллийг заÑах';
+$lang['Edit album'] = 'Цомгийг заÑах';
+$lang['ERROR'] = 'ÐЛДÐÐ';
+$lang['Correction'] = 'ЗаÑах арга';
+$lang['Create'] = 'Ò®Ò¯ÑгÑÑ…';
+$lang['Delete this language'] = 'Ð­Ð½Ñ Ñ…Ñлийг уÑтгах';
+$lang['Delete selected photos'] = 'СонгоÑон зургийг уÑтгах';
+$lang['Delete Representant'] = 'Цомогны Ð´Ò¯Ñ€Ñ Ð·ÑƒÑ€Ð³Ð¸Ð¹Ð³ уÑтгах';
+$lang['Day'] = 'Өдөр';
+$lang['Date'] = 'Огноо';
+$lang['Configuration'] = 'Тохиргоо';
+$lang['Check all'] = 'Бүгдийг Ñонгох';
+$lang['Cancel'] = 'Цуцлах';
+$lang['Average rate'] = 'Дундаж үнÑлгÑÑ';
+$lang['Album name'] = 'Цомогын нÑÑ€';
+$lang['Active Plugins'] = 'ИдÑвхтÑй байгаа өргөтгөл';
+$lang['Add'] = 'ÐÑмÑÑ…';
+$lang['Add New Language'] = 'Ð¨Ð¸Ð½Ñ Ñ…Ñл нÑмÑÑ…';
+$lang['Add Photos'] = 'Зураг нÑмÑÑ…';
+$lang['Add a tag'] = 'Түлхүүр үг нÑмÑÑ…';
+$lang['Add a user'] = 'Ð¥ÑÑ€ÑглÑгч нÑмÑÑ…';
+$lang['Add tags'] = 'Түлхүүр Ò¯Ð³Ñ Ð½ÑмÑÑ…';
+$lang['Active Languages'] = 'ИдÑвхтÑй байгаа Ñ…Ñл';
+$lang['%d week'] = '%d долоо хоног';
+$lang['%d weeks'] = '%d долоо хоног';
+$lang['%d year'] = '%d жил';
+$lang['%d years'] = '%d жил';
+$lang['%s ago'] = '%d хоногын өмнө';
+$lang['A new version of Piwigo is available.'] = 'Piwigo-н ÑˆÐ¸Ð½Ñ Ñ…ÑƒÐ²Ð¸Ð»Ð±Ð°Ñ€ гарÑан байна.';
+$lang['%d second'] = '%d Ñекунд';
+$lang['%d seconds'] = '%d Ñекунд';
+$lang['%d day'] = '%d өдөр';
+$lang['%d days'] = '%d хоног';
+$lang['%d hour'] = '%d цаг';
+$lang['%d hours'] = '%d цаг';
+$lang['%d photo was deleted'] = '%d зургийг уÑтгалаа';
+$lang['%d albums moved'] = '%d цомгийг амжилттай зөөлөө';
+$lang['%d album moved'] = '%d цомгийг амжилттай зөөлөө';
+$lang['%d guest'] = '%d зочин';
+$lang['%d guests'] = '%d зочин';
+$lang['%d mail was not sent.'] = '%d мÑйлийг илгÑÑж чадÑангүй.';
+$lang['%d mail was sent.'] = '%d мÑйлийг амжилттай илгÑÑлÑÑ.';
+$lang['%d mails were not sent.'] = '%d мÑйлийг илгÑÑж чадÑангүй.';
+$lang['%d mails were sent.'] = '%d мÑйлийг амжилттай илгÑÑлÑÑ.';
+$lang['%d month'] = '%d Ñар';
+$lang['%d months'] = '%d Ñар';
+$lang['%d minute'] = '%d минут';
+$lang['%d minutes'] = '%d минут';
+$lang['%d member'] = '%d гишүүн';
+$lang['%d members'] = '%d гишүүн';
+$lang['%d anomalies have been detected.'] = '%d алдаа илÑрлÑÑ.';
+$lang['%d anomalies have not been corrected.'] = '%d алдаа заÑагдаагүй байна.';
+$lang['%d anomaly has been corrected.'] = '%d алдааг заÑлаа.';
+$lang['%d anomaly has been detected.'] = '%d алдаа илÑрлÑÑ.';
+$lang['%d anomaly has not been corrected.'] = '%d алдаа заÑагдаагүй байна.';
+$lang['%d anomalies have been detected corrected.'] = '%d алдааг илрүүлж заÑлаа.';
+$lang['Select users...'] = 'Ð¥ÑÑ€ÑглÑгчийг Ñонгох...';
+$lang['User status'] = 'Төлөв';
+$lang['Subscribe/unsubscribe users'] = 'ÐœÑдÑÑний ÑмхÑтгÑлд бүртгÑÑ…/бүртгÑлÑÑÑ Ñ…Ð°Ñах';
+$lang['Select at least one user'] = 'Дор хаÑж нÑг Ñ…ÑÑ€ÑглÑгчийг Ñонгоно уу';
+$lang['Users'] = 'Ð¥ÑÑ€ÑглÑгчид';
+$lang['%d group'] = '%d бүлÑг';
+$lang['Toggle \'default group\' property'] = 'ҮндÑÑн бүлгийн тохиргоог ÑÑргÑÑÑ…';
+$lang['This name is already used by another group.'] = 'Уучлаарай. Ийм нÑртÑй бүлÑг Ò¯Ò¯ÑÑÑн байна.';
+$lang['Please select at least two groups'] = 'Дор хаÑж хоёр бүлÑг Ñонгоно уу';
+$lang['Send an information email to group members'] = 'ÐœÑдÑÑллийг бүлгийн гишүүдÑд имÑйлÑÑÑ€ илгÑÑÑ…';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'Бүлгийн нÑÑ€Ñнд " or \' гÑÑÑн үг ÑÑвÑл нÑÑ€ огт хооÑон байж болохгүй.';
+$lang['Select groups...'] = 'Бүлгийг Ñонгох...';
+$lang['Type here the name of the new group'] = 'Ð¨Ð¸Ð½Ñ Ð±Ò¯Ð»Ð³Ð¸Ð¹Ð½ нÑÑ€ÑÑ Ñнд Ð±Ð¸Ñ‡Ð½Ñ Ò¯Ò¯';
+$lang['dissociate from group'] = 'бүлгÑÑÑ Ñ…Ð°Ñах';
+$lang['group "%s" added'] = '"%s" бүлгийг амжилттай нÑмлÑÑ';
+$lang['group "%s" deleted'] = '"%s" бүлгийг уÑтгалаа';
+$lang['group "%s" updated'] = '"%s" бүлгийн мÑдÑÑллийг амжилттай шинÑчиллÑÑ';
+$lang['associate to group'] = 'бүлÑгт нÑмÑÑ…';
+$lang['%d groups'] = '%d бүлÑг';
+$lang['Merge selected groups'] = 'СонгоÑон бүлгүүдийг нÑгтгÑÑ…';
+$lang['Group management'] = 'Бүлгийн удирдлага';
+$lang['Groups and users'] = 'БүлÑг ба Ñ…ÑÑ€ÑглÑгчид';
+$lang['An information email was sent to group "%s"'] = '"%s" бүлÑг уруу мÑдÑÑллийг имÑйлÑÑÑ€ амжилттай илгÑÑлÑÑ';
+$lang['There is no group in this gallery.'] = 'Ð­Ð½Ñ Ñ†Ð¾Ð¼Ð¾Ð³Ñ‚ Ñмар нÑгÑн бүлÑг хамааралгүй байна.';
+$lang['Add group'] = 'БүлÑг нÑмÑÑ…';
+$lang['Album updated successfully'] = 'Цомгийг амжилттай шинÑчиллÑÑ';
+$lang['Administration Home'] = 'Удирдлага';
+$lang['ACCESS_5'] = 'Эрх байхгүй';
+$lang['%d users deleted'] = '%d Ñ…ÑÑ€ÑглÑгчийг уÑтгалаа';
+$lang['%d users'] = '%d Ñ…ÑÑ€ÑглÑгч';
+$lang['%d user deleted'] = '%d Ñ…ÑÑ€ÑглÑгчийг уÑтгалаа';
+$lang['%d user'] = '%d Ñ…ÑÑ€ÑглÑгч';
+$lang['Drop into album'] = 'Цомогоо Ñонгох';
+$lang['Dump Database'] = 'ÐœÑдÑÑллийг Ñанг уÑтгах';
+$lang['Download,'] = 'Татаж авах,';
+$lang['Delete selected tags'] = 'СонгоÑон үгÑийг уÑтгах';
+$lang['Delete selected users'] = 'СонгоÑон Ñ…ÑÑ€ÑглÑгчийг уÑтгах';
+$lang['Database'] = 'Өгөгдлийн Ñан';
+$lang['Can\'t connect to server.'] = 'СервертÑй холбогдох боломжгүй байна.';
+$lang['By rank'] = 'ҮнÑлгÑÑгÑÑÑ€';
+$lang['Are you sure you want to delete this plugin?'] = 'Ð­Ð½Ñ Ð½ÑмÑлт өргөтгөлийг уÑтгана гÑдÑгтÑÑ Ð¸Ñ‚Ð³ÑлтÑй байна уу?';
+$lang['Are you sure you want to install this plugin?'] = 'Ð­Ð½Ñ Ð½ÑмÑлт өргөтгөлийг Ñуулгана гÑдÑгтÑÑ Ð¸Ñ‚Ð³ÑлтÑй байна уу?';
+$lang['%d of %d photos selected'] = '%d (нийт %d-Ñ) зураг ÑонгоÑон байна';
+$lang['Link all album photos to some existing albums'] = 'Ð­Ð½Ñ Ñ†Ð¾Ð¼Ð¾Ð³Ð½Ñ‹ зургийг Ó©Ó©Ñ€ цомогтой холбох';
+$lang['Link all album photos to a new album'] = 'Ð­Ð½Ñ Ñ†Ð¾Ð¼Ð¾Ð³Ð½Ñ‹ зурагнуудыг ÑˆÐ¸Ð½Ñ Ñ†Ð¾Ð¼Ð¾Ð³Ñ‚Ð¾Ð¹ холбох';
+$lang['New photos were added'] = 'Ð¨Ð¸Ð½Ñ Ð·ÑƒÑ€Ð°Ð³Ð½ÑƒÑƒÐ´ нÑмÑгдлÑÑ';
+$lang['Manage photo ranks'] = 'Зурагны дараалал';
+$lang['New photos added'] = 'Ð¨Ð¸Ð½Ñ Ð·ÑƒÑ€Ð°Ð³Ð½ÑƒÑƒÐ´ нÑмÑгдлÑÑ';
+$lang['%d photos were deleted'] = '%d зургийг уÑтгалаа';
+$lang['(this tag will be deleted)'] = '(ÑÐ½Ñ Ñ‚Ò¯Ð»Ñ…Ò¯Ò¯Ñ€ үг уÑтах болно)';
+$lang['Name'] = 'ÐÑÑ€';
+$lang['Language has been successfully installed'] = 'Ð¥Ñлийг амжилттай нÑмлÑÑ';
+$lang['Hello'] = 'Сайн байна уу';
+$lang['Hello,'] = 'Сайн байна уу, ';
+$lang['History'] = 'Түүх';
+$lang['Edit tags'] = 'Түлхүүр үгÑийг заÑах';
+$lang['Edit selected tags'] = 'СонгоÑон үгÑийг заÑах';
+$lang['Current name'] = 'Одоогын нÑÑ€';
+$lang['Confirm merge'] = 'ÐÑгтгÑÑ…';
+$lang['By %s'] = '%s-Ñ€';
+$lang['Password is missing. Please enter the password.'] = 'Уучлаарай. Ðууц үгÑÑ Ð¾Ñ€ÑƒÑƒÐ»Ð½Ð° уу.';
+$lang['Parent album'] = 'Эх цомог';
+$lang['Parameter'] = 'Тохиргоо';
+$lang['Original file : %s'] = 'Эх хувь: %s';
+$lang['Original Size'] = 'ҮндÑÑн Ñ…ÑмжÑÑ';
+$lang['Tag selection'] = 'Түлхүүр үгÑийг цÑгцлÑÑ…';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = '<em>%s</em> гÑÑÑн түлхүүр үгÑийг нÑгтгÑж <em>%s</em> болголоо';
+$lang['Select at least two tags for merging'] = 'ÐÑгтгÑхийн тулд дор хаÑж хоёр үг Ñонгоно уу';
+$lang['New tag'] = 'Ð¨Ð¸Ð½Ñ Ñ‚Ò¯Ð»Ñ…Ò¯Ò¯Ñ€ үг';
+$lang['Merge tags'] = 'Түлхүүр үгÑийг нÑгтгÑÑ…';
+$lang['Maximum height'] = 'Өндөр';
+$lang['Maximum width'] = 'Өргөн';
+$lang['Rated %d times, score : %.2f'] = '%d-н удаа үнÑлÑÑн, оноо: %.2f';
+$lang['Rate date'] = 'ҮнÑлгÑÑ Ó©Ð³Ñөн огноо';
+$lang['Private'] = 'Хувийн';
+$lang['Please wait...'] = 'Түр хүлÑÑÐ½Ñ Ò¯Ò¯...';
+$lang['Piwigo version'] = 'Piwigo-н хувилбар';
+$lang['No file was uploaded'] = 'Ямар ч файл хуулагдÑангүй';
+$lang['General statistics'] = 'Ерөнхий байдал';
+$lang['Hit'] = 'ҮзÑÑн';
+$lang['Guest Settings'] = 'Зочины тохиргоо';
+$lang['Help Me'] = 'ТуÑламж';
+$lang['IP'] = 'IP хаÑг';
+$lang['Forbid this language to users'] = 'Ð¥ÑÑ€ÑглÑгчид ÑÐ½Ñ Ñ…Ñлийг ашиглахыг хориглох';
+$lang['Edit album permissions'] = 'Цомогын тохиргоог заÑах';
+$lang['Edit ranks'] = 'ҮнÑлгÑÑг заÑах';
+$lang['X Position'] = 'X-н байршил';
+$lang['Y Position'] = 'Y-н байршил';
+$lang['Year'] = 'Он';
+$lang['Width'] = 'Өргөн';
+$lang['Week starts on'] = 'Долоо хоног ÑхлÑÑ… өдөр';
+$lang['Webmaster cannot be deleted'] = 'ВебмаÑтерийн бүртгÑлийг уÑтгах боломжгүй';
+$lang['Webmaster status is required.'] = 'ВебмаÑтерийн Ñрх шаардлагатай';
+$lang['Who can see these photos?'] = 'Зургийг үзÑÑ… ÑрхтÑй бүлÑг?';
+$lang['Who can see this photo?'] = 'Зургийг үзÑÑ… ÑрхтÑй бүлÑг?';
+$lang['Manage tags'] = 'Түлхүүр үгÑийг цÑгцлÑÑ…';
+$lang['%d tags'] = '%d-н түлхүүр үг';
+$lang['The %d following tags were deleted'] = 'Дараахь %d түлхүүр үгÑийг уÑтгалаа';
+$lang['All %d photos are selected'] = 'Ðийт %d зураг ÑонгоÑон байна';
+$lang['Duplicate selected tags'] = 'СонгоÑон үгÑийг хувилах';
+$lang['Merge selected tags'] = 'СонгоÑон үгÑийг нÑгтгÑÑ…';
+$lang['selection'] = 'Ñонголт';
+$lang['Select at least one album'] = 'Дор хаÑж нÑг цомог Ñонгоно уу';
+$lang['Select at least one comment'] = 'Дор хаÑж нÑг ÑÑтгÑгдÑл Ñонгоно уу';
+$lang['Select at least one photo'] = 'Дор хаÑж нÑг зураг Ñонгоно уу';
+$lang['Select:'] = 'Сонгох:';
+$lang['leave'] = 'байгаагаар нь үлдÑÑÑ…';
+$lang['You need to confirm deletion'] = 'УÑтгана гÑдÑгÑÑ Ð±Ð°Ñ‚Ð°Ð»Ð³Ð°Ð°Ð¶ÑƒÑƒÐ»Ð°Ñ… шаардлагатай';
+$lang['confirm'] = 'баталгаажуулах';
+$lang['Deletions'] = 'УÑтгах';
+$lang['set to'] = 'өөрчлөх';
+$lang['You have %d orphan tags: %s.'] = 'Ðийт %d-н ашиглагдаагүй түлхүүр Ò¯Ð³Ñ Ð±Ð°Ð¹Ð½Ð°: %s.';
+$lang['Delete orphan tags'] = 'Ðшиглагдаагүй түлхүүр үгÑийг уÑтгах';
+$lang['Orphan tags deleted'] = 'Ðшиглагдаагүй түлхүүр үгÑийг уÑтгалаа';
+$lang['Inactive Languages'] = 'ИдÑвхжүүлÑÑгүй байгаа Ñ…Ñл';
+$lang['Album "%s" has been added'] = '"%s" цомгийг амжилттай нÑмлÑÑ';
+$lang['Album "%s" now contains %d photos'] = '"%s" цомогт нийт %d зураг байна';
+$lang['Level 1'] = 'Танилууд';
+$lang['Image id'] = 'Зургийн ID';
+$lang['Email administrators when a comment is deleted'] = 'СÑтгÑгдÑлийг уÑтгахад админд мÑйлÑÑÑ€ мÑдÑгдÑÑ…';
+$lang['Email admins when a new user registers'] = 'ШинÑÑÑ€ Ñ…ÑÑ€ÑглÑгч бүртгүүлÑÑ…Ñд зохицуулагчид и-мÑйлÑÑÑ€ мÑдÑгдÑÑ…';
+$lang['Documentation'] = 'Баримт бичиг';
+$lang['Add another set of photos'] = 'Ó¨Ó©Ñ€ зурагнууд нÑмÑÑ…';
+$lang['Uploaded Photos'] = 'ÐÑмÑгдÑÑн зурагнууд';
+$lang['Upload Photos'] = 'Зураг нÑмÑÑ…';
+$lang['%d albums including'] = 'Ðийт %d цомог ';
+$lang['first photo added on %s'] = 'анхны зураг оруулÑан огноо: %s';
+$lang['Version'] = 'Хувилбар';
+$lang['Time'] = 'Хугацаа';
+$lang['Status'] = 'Төлөв';
+$lang['Resize'] = 'Ð¥ÑмжÑÑг өөрчлөх';
+$lang['Rate'] = 'ҮнÑлÑÑ…';
+$lang['Level 0'] = '---';
+$lang['Lock'] = 'ТүгжÑÑ…';
+$lang['Crop'] = 'ТаÑдах';
+$lang['An error has occured during upgrade.'] = 'ШинÑчлÑÑ… Ñвцад алдаа гарлаа.';
+$lang['Add a filter'] = 'Сонгох';
+$lang['Activate'] = 'ИдÑвхжүүлÑÑ…';
+$lang['Watermark'] = 'УÑан Ñ…ÑÑ';
+$lang['Rename'] = 'ÐÑрийг Ñолих';
+$lang['Position'] = 'Байршил';
+$lang['Number of comments per page'] = 'ÐÑг хуудаÑанд харуулах ÑÑтгÑгдÑлийн тоо';
+$lang['Number of albums per page'] = 'ÐÑг хуудаÑанд харуулах цомгийн тоо';
+$lang['Number of rates'] = 'ҮнÑлÑÑн тоо';
+$lang['Main Page'] = 'ҮндÑÑн хуудаÑ';
+$lang['Activate comments'] = 'СÑтгÑгдÑлийг идÑвхжүүлÑÑ…';
+$lang['Description'] = 'Тайлбар';
+$lang['Comments for all'] = 'Бүх ÑÑтгÑгдÑлүүд';
+$lang['Manage permissions for user "%s"'] = '"%s" Ñ…ÑÑ€ÑглÑгчийн Ñрхийг зохицуулах';
+$lang['Manage permissions for group "%s"'] = '"%s" бүлгийн Ñрхийг зохицуулах';
+$lang['Mail content'] = 'ИмÑйлийн агуулга';
+$lang['Mail sent to %s [%s].'] = 'ИмÑйлийг %s [%s] уруу амжилттай илгÑÑлÑÑ.';
+$lang['This album contains %d photos, added between %s and %s.'] = 'Ð­Ð½Ñ Ñ†Ð¾Ð¼Ð¾Ð³Ñ‚ %s-Ñ %s-ний хооронд оруулÑан нийт %d зураг байна.';
+$lang['This album contains %d photos, added on %s.'] = 'Ð­Ð½Ñ Ñ†Ð¾Ð¼Ð¾Ð³Ñ‚ %s-нд оруулÑан нийт %d зураг байна.';
+$lang['Site manager'] = 'Сайтийн зохицуулагч';
+$lang['Set as default language for unregistered and new users'] = 'ШинÑ, бүртгүүлÑÑгүй Ñ…ÑÑ€ÑглÑгчид ашиглах үндÑÑн Ñ…Ñл болгон тохируулах';
+$lang['Send connection settings by email'] = 'Холболтын тохиргоог имÑйлÑÑÑ€ илгÑÑÑ…';
+$lang['Selection'] = 'Сонголт';
+$lang['Save order'] = 'ЭрÑмбийг хадгалах';
+$lang['Restore'] = 'СÑргÑÑÑ…';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'ҮндÑÑн тохиргоог ÑÑргÑÑÑ…. Тохиргоонууд алдагдах болно.';
+$lang['Repair and optimize database'] = 'ÐœÑдÑÑллийн Ñанг заÑаж, цÑгцÑлÑÑ…';
+$lang['Piwigo for Android'] = 'Android-д зориулÑан Piwigo';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'iOS (iPhone, iPad, iPod Touch)-д зориулÑан Piwigo';
+$lang['Permalink'] = 'Ð¥Ð¾Ð»Ð±Ð¾Ð¾Ñ Ñ…Ð°Ñг (permalink)';
+$lang['Permalinks'] = 'Ð¥Ð¾Ð»Ð±Ð¾Ð¾Ñ Ñ…Ð°Ñг (permalink)';
+$lang['Allow users to delete their own comments'] = 'Ð¥ÑÑ€ÑглÑгчид ÑÑтгÑгдÑлÑÑ ÑƒÑтгаж болно';
+$lang['Allow users to edit their own comments'] = 'Ð¥ÑÑ€ÑглÑгчид ÑÑтгÑгдÑлÑÑ Ð·Ð°Ñаж болно';
+$lang['Cannot delete the old permalink !'] = 'Хуучин холбооÑыг уÑтгах боломжгүй байна.';
+$lang['Center of interest'] = 'Сонирхол татах Ñ…ÑÑÑг';
+$lang['Visited %d times'] = 'ҮзÑÑн тоо: %d';
+$lang['Posted %s on %s'] = 'ÐÑмÑÑн огноо: %s (%s)';
+$lang['Added by %s'] = 'Зургыг оруулÑан: %s';
+$lang['Set title'] = 'ÐÑÑ€ өгөх';
+$lang['Title'] = 'ÐÑÑ€';
+$lang['Type here the title'] = 'ÐÑÑ€ÑÑ Ð¾Ñ€ÑƒÑƒÐ»Ð½Ð° уу';
+$lang['remove title'] = 'нÑрийг уÑтгах';
+$lang['Numeric identifier : %d'] = 'Дугаар: %d';
+$lang['%d photos uploaded'] = '%d зураг орууллаа';
+$lang['%d physical'] = ' %d бодит';
+$lang['%d physicals'] = ' %d бодит';
+$lang['Environment'] = 'Серверийн орчин';
+$lang['Theme has been successfully installed'] = 'Загварыг амжилттай Ñуулгалаа';
+$lang['Delete this theme'] = 'Тухайн загварыг уÑтгах';
+$lang['Add New Theme'] = 'Ð¨Ð¸Ð½Ñ Ð·Ð°Ð³Ð²Ð°Ñ€ нÑмÑÑ…';
+$lang['Themes which need upgrade'] = 'ШинÑчлÑÑ… шаардлагатай загварууд';
+$lang['Themes'] = 'Загварууд';
+$lang['Inactive Themes'] = 'ИдÑвхгүй загварууд';
+$lang['Installed Themes'] = 'СууÑан загварууд';
+$lang['Active Themes'] = 'ИдÑвхтÑй загварууд';
+$lang['There is no other language available.'] = 'ШинÑÑÑ€ Ñуулгах Ó©Ó©Ñ€ Ñ…Ñл байхгүй байна';
+$lang['Updates'] = 'ШинÑчлÑлт';
+$lang['All languages are up to date.'] = 'Ð¥Ñлний бүх файл шинÑчлÑгдÑÑн байна';
+$lang['Check for updates'] = 'Ð¨Ð¸Ð½Ñ Ñ…ÑƒÐ²Ð¸Ð»Ð±Ð°Ñ€ шалгах';
+$lang['Default comments order'] = 'СÑтгÑгдÑлийн дараалал';
+$lang['pending validation'] = 'баталгаажуулалт хүлÑÑж буй үед';
+$lang['Notify administrators when a comment is'] = 'Зохицуулагчид мÑдÑгдÑÑ…:';
+$lang['added'] = 'ÑÑтгÑгдÑл оруулÑан үед';
+$lang['User comments validation'] = 'СÑтгÑгдÑлийг баталгаажуулах';
+$lang['Validation'] = 'Баталгаажуулах';
+$lang['Photo Properties'] = 'Зургийн шинж чанарууд';
+$lang['Photo Page'] = 'Зургийн хуудаÑ';
+$lang['Activate icon "new" next to albums and pictures'] = 'Цомог, зурагны хажууд "шинÑ" гÑÑÑн Ñ‚ÑмдÑгийг харуулах';
+$lang['Activate icon "%s"'] = '"%s" Ñонголтыг идÑвхжүүлÑÑ…';
+$lang['X Repeat'] = 'Давтах тоо';
+$lang['middle'] = 'голд';
+$lang['Sharpen'] = 'ДүрÑний тодролт';
+$lang['Delete multiple size images'] = 'Төрөл бүрийн Ñ…ÑмжÑÑÑ‚Ñй зургийг уÑтгах';
+$lang['Generate multiple size images'] = 'Төрөл бүрийн Ñ…ÑмжÑÑÑ‚Ñй зураг Ò¯Ò¯ÑгÑÑ…';
+$lang['Multiple Size'] = 'Төрөл бүрийн Ñ…ÑмжÑÑ';
+$lang['show details'] = 'дÑлгÑÑ€Ñнгүй мÑдÑÑлÑл';
+$lang['Options'] = 'Сонголтууд';
+$lang['Your configuration settings are saved'] = 'Тохиргоог амжилттай хадгаллаа';
+$lang['Resize after upload'] = 'ОруулÑаны дараа Ñ…ÑмжÑÑг шинÑчлÑÑ…';
+$lang['Piwigo configuration'] = 'Тохиргооны талбар';
+$lang['simple visitors'] = 'Ñнгийн зочид';
+$lang['administrators'] = 'зохицуулагчид';
+$lang['Save visits in history for'] = 'Сайтад зочилÑон бичлÑгийг нь хадгалах бүлÑг:';
+$lang['Add a criteria'] = 'Ð¨Ð¸Ð½Ñ Ð½Ó©Ñ…Ñ†Ó©Ð» нÑмÑÑ…';
+$lang['Default photos order'] = 'Зургийн дараалал';
+$lang['Information data registered in database'] = 'Тохиргоог амжилттай шинÑчлÑн хадгаллаа';
+$lang['Mail address is obligatory for all users'] = 'Бүх Ñ…ÑÑ€ÑглÑгчид и-мÑйл хаÑгаа оруулах Ñ‘Ñтой';
+$lang['Allow user customization'] = 'Ð¥ÑÑ€ÑглÑгчид тохиргоогоо заÑаж болно';
+$lang['Allow user registration'] = 'БүртгÑлийг идÑвхжүүлÑÑ…';
+$lang['Rating by guests'] = 'Зочид үнÑлгÑÑ Ó©Ð³Ñ‡ болно';
+$lang['Allow rating'] = 'ҮнÑлгÑÑг идÑвхжүүлÑÑ…';
+$lang['Page banner'] = 'Ðүүр хуудаÑны баннер';
+$lang['Gallery title'] = 'Галларейн нÑÑ€';
+$lang['With blank value, gallery title will be used'] = 'ХооÑон бол галларейн нÑрийг ашиглах болно';
+$lang['Add to caddie'] = 'УÑтгах жагÑаалтанд нÑмÑÑ…';
+$lang['Caddie'] = 'УÑтгах';
+$lang['Remove from caddie'] = 'УÑтгах жагÑÐ°Ð°Ð»Ñ‚Ð°Ð°Ñ Ñ…Ð°Ñах';
+$lang['add new photos to caddie'] = '"уÑтгах жагÑаалт"-д зураг нÑмÑÑ…';
+$lang['Duplicates'] = 'ДавхардÑан';
+$lang['With no album'] = 'Цомогт ороогүй';
+$lang['With no tag'] = 'Түлхүүр үггүй';
+$lang['With no virtual album'] = 'Виртуаль цомогт ороогүй';
+$lang['Last import'] = 'Сүүлд оруулÑан';
+$lang['Predefined filter'] = 'Сонголт';
+$lang['Sum of rates'] = 'ҮнÑлгÑÑний дүн';
+$lang['The whole set'] = 'Бүх цомгийг';
+$lang['include child albums'] = 'дÑд цомгийг хамруулах';
+$lang['Visit Gallery'] = 'Цомгийг харах';
+$lang['Switch to clear or dark colors for administration'] = 'Удирдлагын талбарыг бараан болон цайвар өнгөөр Ñолих';
+$lang['Change Admin Colors'] = 'Өнгийг Ñолих';
+$lang['Piwigo Administration'] = 'Удирдлагын талбар';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'Piwigo-н ÑˆÐ¸Ð½Ñ Ð¼ÑдÑÑний ÑмхÑтгÑлд %s -г бүртгүүлÑÑ…';
+$lang['Show info'] = 'ÐœÑдÑÑллийг харах';
+$lang['Graphics Library'] = 'Зургийн программ';
+$lang['%d associations'] = 'нийт %d холбоотой зураг';
+$lang[' and %d virtual'] = ' ба %d хийÑвÑÑ€';
+$lang[' and %d virtuals'] = ' ба %d хийÑвÑÑ€';
+$lang['%d album including'] = 'Ðийт %d цомог ';
+$lang['Check for upgrade'] = 'Ð¨Ð¸Ð½Ñ Ñ…ÑƒÐ²Ð¸Ð»Ð±Ð°Ñ€ шалгах';
+$lang['Check for upgrade failed for unknown reasons.'] = 'Ð¨Ð¸Ð½Ñ Ñ…ÑƒÐ²Ð¸Ð»Ð±Ð°Ñ€Ñ‹Ð³ шалгах үед үлмÑдÑгдÑÑ… алдаа гарлаа.';
+$lang['Unable to check for upgrade.'] = 'Ð¨Ð¸Ð½Ñ Ñ…ÑƒÐ²Ð¸Ð»Ð±Ð°Ñ€Ñ‹Ð³ шалгах боломжгүй байна.';
+$lang['Applications'] = 'Программууд';
+$lang['+ Add an upload box'] = '+ Зураг оруулах талбар нÑмÑÑ…';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Та Browser uploader-г ашиглан зураг оруулж байна. <a href="%s">Flash uploader</a>-г Ð±Ð°Ñ Ð°ÑˆÐ¸Ð³Ð»Ð°Ð°Ð´ үзÑÑÑ€Ñй.';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Та Flash uploader-г ашиглан зураг оруулж байна. Ð¥ÑрвÑÑ Ð°Ñуудал гараад байвал <a href="%s">Browser uploader</a>-г ашиглаж үзÑÑÑ€Ñй.';
+$lang['Maximum file size: %sB.'] = 'Файлын дÑÑд Ñ…ÑмжÑÑ: %sB.';
+$lang['Start Upload'] = 'Оруулах';
+$lang['Allowed file types: %s.'] = 'Зөвшөөрөгдөх зургийн төрлүүд: %s.';
+$lang['Select files'] = 'Файлаа Ñонгоно уу';
+$lang['... or '] = '...ÑÑвÑл';
+$lang['unit mode'] = 'дÑлгÑÑ€Ñнгүй Ñ…ÑÑÑг';
+$lang['unset'] = 'өөрчлөөгүй';
+$lang['Display options'] = 'Харагдах байдал';
+$lang['display'] = 'Сонгоно уу';
+$lang['global mode'] = 'ерөнхий Ñ…ÑÑÑг';
+$lang['Support'] = 'ТуÑламж дÑмжлÑг';
+$lang['Choose an action'] = 'ҮйлдÑлÑÑ Ñонгоно уу';
+$lang['Action'] = 'ҮйлдÑл';
+$lang['No user selected, no action possible.'] = 'Ð¥ÑÑ€ÑглÑгч Ñонгоогүй байна';
+$lang['No photo selected, no action possible.'] = 'Зураг огт Ñонгоогүй байна';
+$lang['Remove all filters'] = 'Бүх Ñонголтыг цуцлах';
+$lang['Refresh photo set'] = 'СÑргÑÑÑ…';
+$lang['No photo selected, %d photos in current set'] = 'Зураг огт Ñонгоогүй байна, ÑÐ½Ñ Ñ…ÑÑÑгт нийт %d зураг байна.';
+$lang['None'] = 'ÐÑгийг ч биш';
+$lang['Permalink history'] = 'Ð¥Ð¾Ð»Ð±Ð¾Ð¾Ñ Ñ…Ð°Ñгийн түүх';
+$lang['Add/delete a permalink'] = 'Ð¥Ð¾Ð»Ð±Ð¾Ð¾Ñ Ñ…Ð°Ñг нÑмÑÑ…/заÑах';
+$lang['You cannot move an album in its own sub album'] = 'Уучлаарай, цомгийг өөр дотор нь зөөх боломжгүй';
+$lang['New parent album'] = 'Хамруулах ÑˆÐ¸Ð½Ñ Ñ†Ð¾Ð¼Ð¾Ð³';
+$lang['Virtual albums to move'] = 'Зөөх боломжтой цомогууд';
+$lang['Purge history detail'] = 'Түүхийн дÑлгÑÑ€Ñнгүй бичлÑгийг цÑвÑрлÑÑ…';
+$lang['Purge history summary'] = 'Товч түүхийг цÑвÑрлÑÑ…';
+$lang['Purge search history'] = 'Хайлтын түүхийг цÑвÑрлÑÑ…';
+$lang['Purge user cache'] = 'Ð¥ÑÑ€ÑглÑгчийн cache-г цÑвÑрлÑÑ…';
+$lang['Deny selected groups'] = 'СонгоÑон бүлгийг цуцлах';
+$lang['Deny selected users'] = 'СонгоÑон Ñ…ÑÑ€ÑглÑгчийг цуцлах';
+$lang['%d of %d users selected'] = '%d (нийт %d-Ñ) Ñ…ÑÑ€ÑглÑгч ÑонгоÑон байна';
+$lang['on the %d selected users'] = '(ÑонгоÑон %d Ñ…ÑÑ€ÑглÑгчид Ñ…ÑÑ€ÑгжүүлÑÑ…)';
+$lang['on the %d selected photos'] = '(ÑонгоÑон %d зурагт Ñ…ÑÑ€ÑгжүүлÑÑ…)';
+$lang['Apply action'] = 'ГүйцÑтгÑÑ…';
+$lang['Actions'] = 'ҮйлдÑл';
+$lang['An error occured during extraction (%s).'] = 'Файлыг (%s) задлах үед алдаа гарлаа.';
+$lang['No group selected, no action possible.'] = 'ÐÑг ч бүлÑг Ñонгоогүй байна';
+$lang['Pages seen'] = 'ҮзÑÑн хуудаÑ';
+$lang['hide details'] = 'товч мÑдÑÑлÑл';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'Уучлаарай, Тухайн Ñ…Ñлийг идÑвхгүй болгохын тулд Ó©Ó©Ñ€ Ñ…Ñлийг үндÑÑн Ñ…ÑлÑÑÑ€ Ñонгоно уу';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'Уучлаарай, Танд дор хаÑж нÑг Ñ…Ñл Ñ…ÑÑ€ÑгтÑй тул тухайн Ñ…Ñлийг идÑвхгүй болгох боломжгүй ';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Уучлаарай, Танд дор хаÑж нÑг загвар Ñ…ÑÑ€ÑгтÑй тул тухайн загварыг идÑвхгүй болгох боломжгүй ';
+$lang['Deactivate'] = 'ИдÑвхгүй болгох';
+$lang['Deactivate all'] = 'Бүгдийг идÑвхгүй болгох';
+$lang['Missing Plugins'] = 'Дутаж буй өргөтгөлүүд';
+$lang['All plugins are up to date.'] = 'Бүх өргөтгөлүүд шинÑчлÑгдÑÑн байна';
+$lang['Uninstalled Plugins'] = 'Өргөтгөлийг уÑтгах';
+$lang['Other plugins'] = 'Боломжтой буÑад өргөтгөл';
+$lang['Inactive Plugins'] = 'ИдÑвхгүй өргөтгөлүүд';
+$lang['Plugin list'] = 'ÐÑмÑлт өргөтгөл';
+$lang['Plugins'] = 'Өргөтгөл';
+$lang['Plugins which need upgrade'] = 'ШинÑчлÑÑ… шаардлагатай өргөтгөл';
+$lang['Manage'] = 'Зохицуулах';
+$lang['Guest cannot be deleted'] = 'Зочны бүртгÑлийг уÑтгах боломжгүй';
+$lang['Privacy level set to "%s"'] = 'Хандах Ñрхийг "%s" болголоо';
+$lang['Privacy level'] = 'Хандах Ñрх';
+$lang['Maintenance'] = 'ЗаÑвар үйлчилгÑÑ';
+$lang['Pending Comments'] = 'CÑтгÑгдÑлүүд';
+$lang['%s has been successfully updated.'] = '%s амжилттай шинÑчиллÑÑ.';
+$lang['%d user was not updated.'] = '%d Ñ…ÑÑ€ÑглÑгчийн мÑдÑÑллийг шинÑчилж чадÑангүй.';
+$lang['%d user was updated.'] = '%d Ñ…ÑÑ€ÑглÑгчийн мÑдÑÑллийг амжилттай шинÑчиллÑÑ.';
+$lang['%d users were not updated.'] = '%d Ñ…ÑÑ€ÑглÑгчийн мÑдÑÑллийг шинÑчилж чадÑангүй.';
+$lang['%d users were updated.'] = '%d Ñ…ÑÑ€ÑглÑгчийн мÑдÑÑллийг амжилттай шинÑчиллÑÑ.';
+$lang['%d parameter was updated.'] = '%d тохиргоог шинÑчиллÑÑ.';
+$lang['modified'] = 'заÑÑан үед';
+$lang['Subscribe to notification by mail'] = 'БүртгÑлд амжилттай нÑмлÑÑ';
+$lang['Unsubscribe from notification by mail'] = 'БүртгÑлÑÑÑ Ñ…Ð°Ñлаа';
+$lang['You have subscribed to receiving notifications by mail.'] = 'Таны и-мÑйл хаÑгыг ÑˆÐ¸Ð½Ñ Ð¼ÑдÑÑ, мÑдÑÑллийн ÑмхÑтгÑлийн бүртгÑлд амжилттай нÑмлÑÑ.';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'Таны и-мÑйл хаÑгыг ÑˆÐ¸Ð½Ñ Ð¼ÑдÑÑ, мÑдÑÑллийн ÑмхÑтгÑлийн бүртгÑлÑÑÑ Ñ…Ð°Ñлаа.';
+$lang['See you soon,'] = 'Танд амжилт Ñ…Ò¯Ñье,';
+$lang['See you soon.'] = 'Танд амжилт Ñ…Ò¯Ñье.';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'Манай вÑбмаÑтер Таны и-мÑйлийг ÑˆÐ¸Ð½Ñ Ð¼ÑдÑÑ, мÑдÑÑллийн ÑмхÑтгÑлийн Ñанд нÑмж орууллаа.';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'Манай вÑбмаÑтер Таны и-мÑйлийг ÑˆÐ¸Ð½Ñ Ð¼ÑдÑÑ, мÑдÑÑллийн ÑмхÑтгÑлийн ÑÐ°Ð½Ð³Ð°Ð°Ñ Ñ…Ð°Ñлаа.';
+$lang['Subscribe'] = 'БүртгүүлÑÑ…';
+$lang['Subscribed'] = 'БүртгүүлÑÑн';
+$lang['To subscribe'] = 'ÐœÑдÑÑллийн ÑмхÑтгÑлд бүртгүүлÑхийг Ñ…Ò¯ÑвÑл';
+$lang['To unsubscribe'] = 'ÐœÑдÑÑллийн ÑмхÑтгÑлÑÑÑ Ñ…Ð°Ñуулахыг Ñ…Ò¯ÑвÑл';
+$lang[', click on'] = 'дараахь холбооÑыг ашиглана уу';
+$lang['Uncheck all'] = 'Бүх Ñонголтыг цуцлах';
+$lang['If you encounter problems or have any question, please send a message to'] = 'Ð¥ÑÑ€Ñв Танд аÑуух зүйл гарвал дараахь хаÑгаар холбоо барина уу.';
+$lang['Error when sending email to %s [%s].'] = '%s [%s] хаÑг уруу и-мÑйл илгÑÑÑ…Ñд алдаа гарлаа.';
+$lang['To send ?'] = 'И-мÑйл илгÑÑÑ… ÑÑÑÑ…?';
+$lang['Send'] = 'ИлгÑÑÑ…';
+$lang['Go to'] = 'Дараахь холбооÑоор хандана уу...';
+$lang['Password updated'] = 'Ðууц үгийг шинÑчиллÑÑ';
+$lang['Photo informations updated'] = 'Зургийн мÑдÑÑллийг шинÑчиллÑÑ';
+$lang['Status of user "%s" updated'] = 'Ð¥ÑÑ€ÑглÑгч "%s"-н мÑдÑÑллийг амжилттай шинÑчиллÑÑ';
+$lang['User %s [%s] was not removed from the subscription list.'] = 'Ð¥ÑÑ€ÑглÑгч %s [%s]-г ÑˆÐ¸Ð½Ñ Ð¼ÑдÑÑний ÑÐ°Ð½Ð³Ð°Ð°Ñ Ñ…Ð°Ñаж чадÑангүй.';
+$lang['User %s [%s] was removed from the subscription list.'] = 'Ð¥ÑÑ€ÑглÑгч %s [%s]-г ÑˆÐ¸Ð½Ñ Ð¼ÑдÑÑний ÑÐ°Ð½Ð³Ð°Ð°Ñ Ñ…Ð°Ñлаа.';
+$lang['User %s added'] = 'Ð¥ÑÑ€ÑглÑгч %s-г амжилттай нÑмлÑÑ';
+$lang['user "%s" added'] = 'Ð¥ÑÑ€ÑглÑгч "%s"-г амжилттай нÑмлÑÑ';
+$lang['albums added in the database'] = 'цомгийг мÑдÑÑллийн Ñанд амжилттай нÑмлÑÑ';
+$lang['photos added in the database'] = 'зургийг мÑдÑÑллийн Ñанд нÑмлÑÑ';
+$lang['User %s [%s] was not added to the subscription list.'] = 'Ð¥ÑÑ€ÑглÑгч %s [%s]-г ÑˆÐ¸Ð½Ñ Ð¼ÑдÑÑний Ñанд бүртгÑж чадÑангүй.';
+$lang['User %s [%s] added.'] = 'Ð¥ÑÑ€ÑглÑгч %s [%s]-г амжилттай нÑмлÑÑ';
+$lang['User %s [%s] was added to the subscription list.'] = 'Ð¥ÑÑ€ÑглÑгч %s [%s]-г ÑˆÐ¸Ð½Ñ Ð¼ÑдÑÑний Ñанд амжилттай бүртгÑлÑÑ.';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'Ðнхаар: БүртгÑлд(ÑÑÑ) нÑмÑÑ…/хаÑах бүрт Ñ…ÑÑ€ÑглÑгч уруу и-мÑйл илгÑÑÑ… болно. ';
+$lang['Send mail to users'] = 'Ð¥ÑÑ€ÑглÑгчдÑд и-мÑйл илгÑÑÑ…';
+$lang['Complementary mail content'] = 'ÐÑмÑлт мÑдÑÑлÑл';
+$lang['Add detailed content'] = 'ÐÑмÑлт мÑдÑÑлÑл оруулах';
+$lang['Send mail as'] = 'И-мÑйлийн гарчиг';
+$lang['%d parameters were updated.'] = '%d тохиргоог шинÑчиллÑÑ.';
+$lang['Parameters'] = 'Тохиргоо';
+$lang['User list'] = 'Ð¥ÑÑ€ÑглÑгчдийн жагÑаалт';
+$lang['Album list management'] = 'Цомогын дарааллыг зохицуулах';
+$lang['Apply to sub-albums'] = 'дÑд цомгийг хамруулах';
+$lang['manage sub-albums'] = 'дÑд цомгийг цÑгцлÑÑ…';
+$lang['Albums automatically sorted'] = 'Цомогуудыг амжилттай ÑÑ€ÑмбÑллÑÑ';
+$lang['Automatic sort order'] = 'ЭрÑмблÑÑ…';
+$lang['apply automatic sort order'] = 'автоматаар ÑÑ€ÑмблÑÑ…';
+$lang['Order of menubar items has been updated successfully.'] = 'ЦÑÑний дарааллыг амжилттай шинÑчиллÑÑ.';
+$lang['Menu Management'] = 'ЦÑÑ';
+$lang['Show menubar'] = 'ЦÑÑийг харуулах';
+$lang['You are running the latest version of Piwigo.'] = 'Та Piwigo-н хамгийн Ñүүлийн хувилбарыг ашиглаж байна.';
+$lang['Update albums informations'] = 'Цомогний мÑдÑÑллийг шинÑчлÑÑ…';
+$lang['Update Complete'] = 'ШинÑчлÑлт амжилттай хийгдлÑÑ';
+$lang['User %s updated'] = '%s Ñ…ÑÑ€ÑглÑгчийн мÑдÑÑллийг амжилттай шинÑчиллÑÑ';
+$lang['Update user'] = 'Ð¥ÑÑ€ÑглÑгчийн мÑдÑÑллийг шинÑчлÑÑ…';
+$lang['Reset ignored updates'] = 'ЦуцалÑан шинÑчлÑлийг ÑÑргÑÑÑ…';
+$lang['Update All'] = 'Бүгдийг шинÑчлÑÑ…';
+$lang['Update in progress... Please wait.'] = 'ШинÑчлÑлт хийгдÑж байна... Түр хүлÑÑÐ½Ñ Ò¯Ò¯.';
+$lang['Update photos information'] = 'Зурагны мÑдÑÑллийг шинÑчлÑÑ…';
+$lang['Update to Piwigo %s'] = 'Piwigo %s уруу шинÑчлÑÑ…';
+$lang['Caddie management'] = 'УÑтгах жагÑаалтын зохицуулалт';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'дÑлгÑÑ€Ñнгүй мÑдÑÑллийг харуулах (нÑмж, хаÑÑан цомог болон зурагнууд)';
+$lang['directories + files'] = 'Ñ…Ð°Ð²Ñ‚Ð°Ñ + файлуудыг';
+$lang['only directories'] = 'зөвхөн хавтаÑуудыг';
+$lang['synchronize files structure with database'] = 'Файлийн бүтцийг мÑдÑÑллийн Ñантай давхцуулж тулгах';
+$lang['Choose an option'] = 'Сонголтоо Ñ…Ð¸Ð¹Ð½Ñ Ò¯Ò¯';
+$lang['%d user comment rejected'] = '%d Ñ…ÑÑ€ÑглÑгчийн ÑÑтгÑгдÑлийг цуцаллаа';
+$lang['%d user comment validated'] = '%d Ñ…ÑÑ€ÑглÑгчийн ÑÑтгÑгдÑлийг идÑвхжүүллÑÑ';
+$lang['%d user comments rejected'] = '%d Ñ…ÑÑ€ÑглÑгчийн ÑÑтгÑгдÑлийг цуцаллаа';
+$lang['%d user comments validated'] = '%d Ñ…ÑÑ€ÑглÑгчийн ÑÑтгÑгдÑлийг идÑвхжүүллÑÑ';
+$lang['default'] = 'үндÑÑн';
+$lang['Default display'] = 'харуулна';
+$lang['No display'] = 'харуулахгүй';
+$lang['Element'] = 'Зүйл';
+$lang['Element type'] = 'Төрөл';
+$lang['Section'] = 'Ð¥ÑÑÑг';
+$lang['The anomaly will be ignored until next application version'] = 'Дараагын ÑˆÐ¸Ð½Ñ Ñ…ÑƒÐ²Ð¸Ð»Ð±Ð°Ñ€ гартал тухайг алдааг Ñ…ÑÑ€ÑгÑÑхгүй орхино.';
+$lang['%d anomaly has been ignored.'] = '%d алдааг Ñ…ÑÑ€ÑгÑÑхгүй орхив.';
+$lang['Anomaly'] = 'Ðлдаа';
+$lang['photos deleted from the database'] = 'зургуудийг мÑдÑÑллийн ÑÐ°Ð½Ð³Ð°Ð°Ñ ÑƒÑтаглаа';
+$lang['Dissociate from album'] = 'Ð¦Ð¾Ð¼Ð¾Ð³Ð¾Ð¾Ñ Ñ…Ð°Ñах';
+$lang['Set author'] = 'Зураг авагч';
+$lang['Type here the author name'] = 'Зураг авÑан хүний нÑрийг Ñнд оруулна уу';
+$lang['Set as default theme for unregistered and new users'] = 'БүртгүүлÑÑгүй болон ÑˆÐ¸Ð½Ñ Ñ…ÑÑ€ÑглÑгчдÑд харагдах үндÑÑн загвар болгон тохируулах';
+$lang['Set creation date'] = 'ОруулÑан огноог заÑах';
+$lang['No user selected of %d users'] = 'Ð¥ÑÑ€ÑглÑгч Ñонгоогүй байна (нийт %d Ñ…ÑÑ€ÑглÑгч) ';
+$lang['Invert'] = 'ЭÑÑ€ÑгÑÑÑ€ нь';
+$lang['none'] = 'нÑгийг ч биш';
+$lang['No photo in the current set.'] = 'Тухайн Ñ…ÑÑÑгт зураг байхгүй байна.';
+$lang['No matching user found'] = 'Ийм Ñ…ÑÑ€ÑглÑгч олдÑонгүй';
+$lang['Manage photos'] = 'Зургуудийг цÑгцлÑÑ…';
+$lang['Manage this set of %d photos'] = 'Ð­Ð½Ñ %d зургуудийг цÑгцлÑÑ…';
+$lang['Miscellaneous'] = 'Буёад';
+$lang['No mail to send.'] = 'ИлгÑÑÑ… и-мÑйл байхгүй байна.';
+$lang['Loading...'] = 'Ðчаалж байна...';
+$lang['GD library is missing'] = 'GD library байхгүй байна';
+$lang['Failed to write file to disk'] = 'Файлыг бичÑÑ…Ñд алдаа гарлаа';
+$lang['File/directory read error'] = 'Файл/хавтаÑыг уншихад алдаа гарлаа';
+$lang['Error on file "%s" : %s'] = '"%s" файлд алдаа илÑрлÑÑ: %s';
+$lang['Email administrators when a comment is modified'] = 'СÑтгÑгдÑлийг заÑах үед зохицуулагчид и-мÑйлÑÑÑ€ мÑдÑгдÑÑ…';
+$lang['Email admins when a comment requires validation'] = 'СÑтгÑгдÑлийг идÑвхжүүлÑÑ… шаардлагатай үед зохицуулагчид и-мÑйлÑÑÑ€ мÑдÑгдÑÑ…';
+$lang['Email admins when a valid comment is entered'] = 'СÑтгÑгдÑлийг оруулÑан үед зохицуулагчид и-мÑйлÑÑÑ€ мÑдÑгдÑÑ…';
+$lang['Create this site'] = 'Ð­Ð½Ñ Ñайтыг Ò¯Ò¯ÑгÑÑ…';
+$lang['Default user cannot be deleted'] = 'ҮндÑÑн Ñ…ÑÑ€ÑглÑгчийг уÑтгах боломжгүй';
+$lang['Default user does not exist'] = 'ҮндÑÑн Ñ…ÑÑ€ÑглÑгчийг оруулаагүй байна';
+$lang['Deleted on'] = 'УÑтгаÑан огноо';
+$lang['Detailed informations'] = 'ДÑлгÑÑ€Ñнүй мÑдÑÑлÑл';
+$lang['Directory'] = 'ХавтаÑ';
+$lang['Directory does not exist'] = 'Ийм Ñ…Ð°Ð²Ñ‚Ð°Ñ Ð±Ð°Ð¹Ñ…Ð³Ò¯Ð¹ байна';
+$lang['Duplicate'] = 'Давхардал';
+$lang['Correction applied with error'] = 'ЗаÑах үед алдаа гарлаа';
+$lang['Correction applied with success'] = 'Ðмжилттай заÑлаа';
+$lang['Change password'] = 'Ðууц үг Ñолих';
+$lang['Change username'] = 'Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ Ñолих';
+$lang['Available only with HTML format'] = 'Зөвхөн HTML Ñ…ÑлбÑÑ€ÑÑÑ€ боломжтой';
+$lang['Batch Manager'] = 'Бөөнд нь цÑгцлÑÑ…';
+$lang['Basic settings'] = 'ҮндÑÑн тохиргоо';
+$lang['Apply watermark if height is bigger than'] = 'Өндөр нь их үед уÑан Ñ…ÑÑг ашиглах';
+$lang['Apply watermark if width is bigger than'] = 'Өргөн нь их үед уÑан Ñ…ÑÑг ашиглах';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'БуÑад (%s) загварууд тухайн Ð·Ð°Ð³Ð²Ð°Ñ€Ð°Ð°Ñ Ñ…Ð°Ð¼Ð°Ð°Ñ€Ñ‡ байгаа учир уÑтгах боломжгүй байна.';
+$lang['All themes are up to date.'] = 'ШинÑчлÑÑ… шаардлагатай загвар байхгүй байна';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'Дараахь загварууд Piwigo-н ÑˆÐ¸Ð½Ñ Ð³Ð°Ñ€Ñан хувилбартай зохицохгүй байх магадлалтай:';
+$lang['Make this language available to users'] = 'Тухайн Ñ…Ñлийг Ñ…ÑÑ€ÑглÑгчид ашиглах боломжтой болгох';
+$lang['Visit language site'] = 'Тухайн Ñ…Ñлний вÑб хуудÑанд зочилох';
+$lang['Extend for templates'] = 'Темплетийг заÑах';
+$lang['Optional URL keyword'] = 'ÐÑмÑлт URL түлхүүр үг';
+$lang['Original templates'] = 'Эх загвар';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = 'Эх загварыг өргөтгөл хавтаÑан дахь нÑмÑлт Ð·Ð°Ð³Ð²Ð°Ñ€ÑƒÑƒÐ´Ð°Ð°Ñ Ñолих';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'GD-г ашиглаж байгаа учир "ОруулÑаны дараа Ñ…ÑмжÑÑг шинÑчлÑÑ…" функцыг идÑвхгүй болголоо';
+$lang['A locked gallery is only visible to administrators'] = 'ÐууцалÑан цомог зөвхөн Зохицуулагчид харагдана';
+$lang['High definition enabled'] = 'Өндөр нарийвчлал идÑвхтÑй';
+$lang['Ignore this update'] = 'Тухайн шинÑчлÑлийг үл Ñ…ÑÑ€ÑгÑÑÑ…';
+$lang['Ignore All'] = 'Бүгдийг үл Ñ…ÑÑ€ÑгÑÑÑ…';
+$lang['Gallery unlocked'] = 'Цомогны түгжÑÑг гаргалаа';
+$lang['Manage Permissions'] = 'Эрхийг зохицуулах';
+$lang['Unsubscribed'] = 'БүртгүүлÑÑгүй';
+$lang['Other private albums'] = 'БуÑад хувийн цомгууд';
+$lang['%s photos can not be regenerated'] = '%s-н зураг Ò¯Ò¯ÑгÑж чадÑангүй';
+$lang['%s photos have been regenerated'] = '%s-н зураг амжилттай Ò¯Ò¯ÑгÑлÑÑ';
+$lang['All %d users are selected'] = 'Бүх %d Ñ…ÑÑ€ÑглÑгчийг ÑонгоÑон байна';
+$lang['Advanced features'] = 'ÐÑмÑлт боломжууд';
+$lang['Album manual order was saved'] = 'Цомогны дарааллыг хадгаллаа';
+$lang['manage album photos'] = 'цомогийн зургийг цÑгцлÑÑ…';
+$lang['pixels'] = 'пикÑель';
+$lang['cancel manual order'] = 'ÑÑ€Ñмбийг цуцлах';
+$lang['close'] = 'хаах';
+$lang['delete this site and all its attached elements'] = 'ÑÐ½Ñ Ñайт болон холбоотой мÑдÑÑллийг уÑтгах';
+$lang['an error happened'] = 'алдаа гарлаа';
+$lang['automatic order'] = 'автоматаар ÑÑ€ÑмблÑÑ…';
+$lang['between %.2f and %.2f'] = '%.2f-Ñ %.2f-н хооронд';
+$lang['between %d and %d pixels'] = '%d-Ñ %d пикÑелийн хооронд';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'Зургийн Ñ…ÑмжÑÑ %dx%d пикÑель болж багÑана.';
+$lang['Summary'] = 'ДүгнÑлт';
+$lang['Show %s users'] = '%s Ñ…ÑÑ€ÑглÑгчдийг харуулах';
+$lang['Random photo'] = 'Дурын зураг';
+$lang['Name of the duplicate'] = 'ДавхардÑан нÑÑ€';
+$lang['Manage the members'] = 'Гишүүдийг зохицуулах';
+$lang['Locked'] = 'ТүгжÑÑÑ‚Ñй';
+$lang['Images manual order was saved'] = 'Зургийн дарааллыг хадгаллаа';
+$lang['Impossible automatic correction'] = 'Ðвтоматаар заÑах боломжгүй';
+$lang['private'] = 'хувийн';
+$lang['public'] = 'нийтийн';
+$lang['Number of thumbnails to create'] = 'Ò®Ò¯ÑгÑÑ… Ð´Ò¯Ñ€Ñ Ð·ÑƒÑ€Ð³Ð¸Ð¹Ð½ тоо';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Уучлаарай. Ðууц үгÑÑ Ð±Ð°Ñ‚Ð°Ð»Ð³Ð°Ð°Ð¶ÑƒÑƒÐ»Ð¶, давтан оруулна уу.';
+$lang['Operation in progress'] = 'ЗаÑаж байна.';
+$lang['Only private albums are listed'] = 'Зөвхөн хувийн цомгуудийг жагÑаав';
+$lang['existing album'] = 'одоо байгаа цомог';
+$lang['You cannot delete your account'] = 'Та өөрийнхөө бүртгÑлийг уÑтгах боломжгүй';
+$lang['albums deleted in the database'] = 'мÑдÑÑллийн ÑÐ°Ð½Ð³Ð°Ð°Ñ Ñ†Ð¾Ð¼Ð³Ð¸Ð¹Ð³ уÑтаглаа';
+$lang['Waiting'] = 'ХүлÑÑж буй';
+$lang['Validate'] = 'Бататгах';
+$lang['Virtual Links'] = 'ХийÑвÑÑ€ холбооÑ';
+$lang['Virtual album name'] = 'ХийÑвÑÑ€ цомогын нÑÑ€';
+$lang['Visit Piwigo project website'] = 'Piwigo-н вÑбÑайтад зочилох';
+$lang['Virtual album'] = 'ХийÑвÑÑ€ цомог';
+$lang['Virtual album added'] = 'ХийÑвÑÑ€ цомог нÑмлÑÑ';
+$lang['Virtual album deleted'] = 'ХийÑвÑÑ€ цомгийг уÑтаглаа';
+$lang['Tools'] = 'Ð¥ÑÑ€ÑгÑлүүд';
+$lang['View in gallery'] = 'Бодитоор харах';
+$lang['This site already exists'] = 'Ийм нÑртÑй Ñайт Ò¯Ò¯ÑÑÑн байна';
+$lang['Two updates are available'] = 'Хоёр шинÑчлÑлт олдлоо';
+$lang['There is no other plugin available.'] = 'Ó¨Ó©Ñ€ нÑмÑлт өргөтгөл байхгүй байна.';
+$lang['There is no other theme available.'] = 'Ó¨Ó©Ñ€ нÑмÑлт загвар байхгүй байна.';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'ÐÑг хуудÑанд харагдах ÑÑтгÑгдÑлийн тоо 5-Ñ 50-н хооронд байх Ñ‘Ñтой.';
+$lang['The original image quality must be a number between %d and %d'] = 'ҮндÑÑн зургийн чанарын утга %d-Ñ %d-н хооронд байх Ñ‘Ñтой';
+$lang['The original maximum height must be a number between %d and %d'] = 'Өндөрийн хамгийн их утга %d-Ñ %d-н хооронд байх Ñ‘Ñтой';
+$lang['The original maximum width must be a number between %d and %d'] = 'Өргөний хамгийн их утга %d-Ñ %d-н хооронд байх Ñ‘Ñтой';
+$lang['Save manual order'] = 'ЭрÑмбийг хадгалах';
+$lang['Select at least one tag'] = 'Доод тал нь нÑг түлхүүр үг Ñонгоно уу';
+$lang['Ratio'] = 'Харьцаа Ñ…ÑмжÑÑ';
+$lang['Public'] = 'Ðийтийн';
+$lang['Public / Private'] = 'Ðийтийн/Хувийн';
+$lang['Photos generation in progress...'] = 'Зургийг боловÑруулж байна...';
+$lang['Overall'] = 'Ерөнхий байдал';
+$lang['Open user details'] = 'Ð¥ÑÑ€ÑглÑгчийн мÑдÑÑллийг харах';
+$lang['Main "guest" user status is incorrect'] = '"Зочин" гÑÑÑн үндÑÑн Ñ…ÑÑ€ÑглÑгчийн төлөв буруу байна';
+$lang['Main "webmaster" user status is incorrect'] = '"Ð’ÑбмаÑтер" гÑÑÑн үндÑÑн Ñ…ÑÑ€ÑглÑгчийн төлөв буруу байна';
+$lang['Main "webmaster" user does not exist'] = '"Ð’ÑбмаÑтер" гÑÑÑн үндÑÑн Ñ…ÑÑ€ÑглÑгч бүртгÑгдÑÑгүй байна';
+$lang['Main "guest" user does not exist'] = '"Зочин" гÑÑÑн үндÑÑн Ñ…ÑÑ€ÑглÑгч бүртгÑгдÑÑгүй байна';
+$lang['Grant selected groups'] = 'СонгоÑон бүлÑгт зөвшөөрөх';
+$lang['Grant selected users'] = 'СонгоÑон Ñ…ÑÑ€ÑглÑгчдÑд зөвшөөрөх';
+$lang['Errors caption'] = 'Ðлдааны бүртгÑл';
+$lang['Linked albums'] = 'Холбоотой цомог';
+$lang['Last hit'] = 'Сүүлд үзÑÑн';
+$lang['Instructions to use Piwigo'] = 'Piwigo-г ашиглах заавар';
+?> \ No newline at end of file
diff --git a/language/mn_MN/common.lang.php b/language/mn_MN/common.lang.php
new file mode 100644
index 000000000..22d4f9a39
--- /dev/null
+++ b/language/mn_MN/common.lang.php
@@ -0,0 +1,420 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Монгол Ñ…Ñл [MN]
+Version: 2.6.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=696
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+$lang_info['language_name'] = 'Монгол';
+$lang_info['country'] = 'Монгол улÑ';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'mn';
+$lang_info['zero_plural'] = true;
+
+$lang['%d comments'] = '%d ÑÑтгÑгдÑл';
+$lang['%d hit'] = '%d удаа үзÑÑн';
+$lang['%d hits'] = '%d удаа үзÑÑн';
+$lang['%d Kb'] = '%d KB';
+$lang['%d new comment'] = '%d ÑÑтгÑгдÑл';
+$lang['%d new comments'] = '%d ÑÑтгÑгдÑл';
+$lang['%d new photo'] = '%d ÑˆÐ¸Ð½Ñ Ð·ÑƒÑ€Ð°Ð³';
+$lang['%d new photos'] = '%d ÑˆÐ¸Ð½Ñ Ð·ÑƒÑ€Ð°Ð³';
+$lang['%d new user'] = '%d ÑˆÐ¸Ð½Ñ Ñ…ÑÑ€ÑглÑгч';
+$lang['%d new users'] = '%d ÑˆÐ¸Ð½Ñ Ñ…ÑÑ€ÑглÑгч';
+$lang['Date'] = 'Огноо';
+$lang['day'][0] = 'ÐÑм';
+$lang['day'][1] = 'Даваа';
+$lang['day'][2] = 'ÐœÑгмар';
+$lang['day'][3] = 'Лхагва';
+$lang['day'][4] = 'ПүрÑв';
+$lang['day'][5] = 'БааÑан';
+$lang['day'][6] = 'БÑмба';
+$lang['month'][10] = '10-Ñ€ Ñар';
+$lang['month'][11] = '11-Ñ€ Ñар';
+$lang['month'][12] = '12-Ñ€ Ñар';
+$lang['month'][1] = '1-Ñ€ Ñар';
+$lang['month'][2] = '2-Ñ€ Ñар';
+$lang['month'][3] = '3-Ñ€ Ñар';
+$lang['month'][4] = '4-Ñ€ Ñар';
+$lang['month'][5] = '5-Ñ€ Ñар';
+$lang['month'][6] = '6-Ñ€ Ñар';
+$lang['month'][7] = '7-Ñ€ Ñар';
+$lang['month'][8] = '8-Ñ€ Ñар';
+$lang['month'][9] = '9-Ñ€ Ñар';
+$lang['comment date'] = 'бичÑÑн огноогоор';
+$lang['%d albums updated'] = '%d цомог шинÑчлÑгдлÑÑ';
+$lang['Creation date'] = 'ÐвÑан огноо';
+$lang['Post date'] = 'ÐийтÑлÑÑн огноо';
+$lang['Search'] = 'Хайлт';
+$lang['Search for all terms'] = 'Бүгдийг оруулж хайх';
+$lang['Search for any term'] = 'Дурын үгийг хайх';
+$lang['Search for words'] = 'Хайх үг';
+$lang['Search in albums'] = 'Ð¦Ð¾Ð¼Ð¾Ð³Ð½Ð¾Ð¾Ñ Ñ…Ð°Ð¹Ñ…';
+$lang['searched words : %s'] = 'хайÑан үг: %s';
+$lang['Search by date'] = 'Огноогоор хайх';
+$lang['Search in sub-albums'] = 'ДÑд Ñ†Ð¾Ð¼Ð¾Ð³Ð½Ð¾Ð¾Ñ Ñ…Ð°Ð¹Ñ…';
+$lang['Quick search'] = 'хайх үгÑÑ Ð±Ð¸Ñ‡Ð½Ñ Ò¯Ò¯';
+$lang['Reset'] = 'Цуцлах';
+$lang['Original dimensions'] = 'ҮндÑÑн Ñ…ÑмжÑÑ';
+$lang['Kind of date'] = 'Хамаарах огноо';
+$lang['End-Date'] = 'ДууÑах огноо';
+$lang['Date created, old &rarr; new'] = 'ÐвÑан огноогоор, хуучин &rarr; шинÑ';
+$lang['Browser: %s'] = 'Ð’Ñб хөтөч: %s';
+$lang['Albums'] = 'Цомог';
+$lang['2small'] = 'XXS - жоохон';
+$lang['small'] = 'S - жижÑг';
+$lang['stop the slideshow'] = 'зогÑоох';
+$lang['today'] = 'өнөөдөр';
+$lang['useful when password forgotten'] = 'Ðууц үгÑÑ Ð¼Ð°Ñ€Ñ‚Ñан үед Ñ…ÑÑ€Ñг болно';
+$lang['wrong date'] = 'огноо буруу байна';
+$lang['xlarge'] = 'XL - маш том';
+$lang['xsmall'] = 'XS - жижÑгхÑн';
+$lang['xxlarge'] = 'XXL - аÑар том';
+$lang['search'] = 'хайх';
+$lang['medium'] = 'M - дундаж';
+$lang['no rate'] = 'үнÑлгÑÑ Ð±Ð°Ð¹Ñ…Ð³Ò¯Ð¹';
+$lang['password updated'] = 'нууц үг шиÑчлÑгдлÑÑ';
+$lang['large'] = 'L - том';
+$lang['photo'] = 'зураг';
+$lang['edit'] = 'заÑах';
+$lang['guest'] = 'зочин';
+$lang['Username'] = 'Ð¥ÑÑ€ÑглÑгчийн нÑÑ€';
+$lang['Username or email'] = 'Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ буюу имÑйл хаÑг';
+$lang['Username: %s'] = 'Ð¥ÑÑ€ÑглÑгчийн нÑÑ€: %s';
+$lang['Website'] = 'Ð’ÑбÑайт';
+$lang['Welcome'] = 'Тавтай морилно уу';
+$lang['Yes'] = 'Тийм';
+$lang['Sort by'] = 'ЭрÑмблÑÑ…';
+$lang['Submit'] = 'OK';
+$lang['Tag'] = 'Түлхүүр үг';
+$lang['Tags'] = 'Түлхүүр үгÑ';
+$lang['The passwords do not match'] = 'Ðууц үг хоорондоо тохирохгүй байна';
+$lang['Show latest comments first'] = 'ШинÑÑÑ€ оруулÑан ÑÑтгÑгдÑлийг ÑÑ…Ñнд нь харуулах';
+$lang['Show number of comments'] = 'СÑтгÑгдÑлийн тоог харуулах';
+$lang['Search results'] = 'Хайлтын үр дүн';
+$lang['Register'] = 'БүртгүүлÑÑ…';
+$lang['Registration'] = 'БүртгÑл';
+$lang['Random photos'] = 'Дурын зураг';
+$lang['Rating score, low &rarr; high'] = 'ҮнÑлгÑÑгÑÑÑ€, бага &rarr; их';
+$lang['Rank'] = 'ҮнÑлгÑÑ';
+$lang['Rate this photo'] = 'ҮнÑлÑÑ…';
+$lang['Rating score'] = 'ҮнÑлгÑÑ Ð¾Ð½Ð¾Ð¾';
+$lang['Rating score, high &rarr; low'] = 'ҮнÑлгÑÑгÑÑÑ€, их &rarr; бага';
+$lang['Manage this user comment: %s'] = 'Дараахь ÑÑдгÑгдÑлийг заÑварлах: %s';
+$lang['Manual sort order'] = 'Гараараа ÑÑ€ÑмблÑÑ…';
+$lang['Piwigo Help'] = 'Piwigo туÑламж';
+$lang['Password reset is not allowed for this user'] = 'Танд нууц үгÑÑ Ñолих Ñрх байхгүй байна';
+$lang['Password: %s'] = 'Ðууц үг: %s';
+$lang['Pause of slideshow'] = 'ЗогÑоох';
+$lang['Photo title, Z &rarr; A'] = 'Зургын нÑÑ€ÑÑÑ€, Z &rarr; A ';
+$lang['Photo sizes'] = 'Зургын Ñ…ÑмжÑÑ';
+$lang['Photo title, A &rarr; Z'] = 'Зургын нÑÑ€ÑÑÑ€, A &rarr; Z';
+$lang['Invalid password!'] = 'Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ ÑÑвÑл нууц үг буруу байна.';
+$lang['Invalid username or email'] = 'Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ ÑÑвÑл имÑйл хаÑг буруу байна.';
+$lang['Keyword'] = 'Түлхүүр үг';
+$lang['Password'] = 'Ðууц үг';
+$lang['Password Reset'] = 'Ðууц үгÑÑ Ñолих';
+$lang['Password forgotten'] = 'Ðууц үгÑÑ Ð¼Ð°Ñ€Ñ‚Ñан';
+$lang['Most visited'] = 'Их үзÑÑн';
+$lang['Original'] = 'Эх хувь';
+$lang['Page not found'] = 'Ийм Ñ…ÑƒÑƒÐ´Ð°Ñ Ð¾Ð»Ð´Ñонгүй';
+$lang['Language'] = 'Ð¥Ñл';
+$lang['Login'] = 'ÐÑвтрÑÑ…';
+$lang['Logout'] = 'Гарах';
+$lang['Menu'] = 'ЦÑÑ';
+$lang['Mobile'] = 'Гар утаÑ';
+$lang['New password'] = 'Ð¨Ð¸Ð½Ñ Ð½ÑƒÑƒÑ† үг';
+$lang['Next'] = 'Дараахь';
+$lang['No'] = 'Үгүй';
+$lang['Links'] = 'ХолбооÑ';
+$lang['Hello %s,'] = '%s Та Ñайн байна уу?';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Сайн байна уу %s, Таны Piwigo гÑÑ€Ñл зургын галерей хооÑон байна!';
+$lang['IP: %s'] = 'IP: %s';
+$lang['Home'] = 'Ðүүр хуудаÑ';
+$lang['Email: %s'] = 'ИмÑйл: %s';
+$lang['Enter your new password below.'] = 'Ð¨Ð¸Ð½Ñ Ð½ÑƒÑƒÑ† үгÑÑ Ð¾Ñ€ÑƒÑƒÐ»Ð½Ð° уу';
+$lang['File name, A &rarr; Z'] = 'Файлын нÑÑ€ÑÑÑ€ A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'Файлын нÑÑ€ÑÑÑ€ Z &rarr; A';
+$lang['Hello'] = 'Сайн байна уу';
+$lang['Help'] = 'ТуÑламж';
+$lang['Filesize'] = 'Файлын Ñ…ÑмжÑÑ';
+$lang['Filter'] = 'Сонголт';
+$lang['Forbidden'] = 'Хориотой';
+$lang['Forgot your password?'] = 'Ðууц үгÑÑ Ð¼Ð°Ñ€Ñ‚Ñан уу?';
+$lang['Check your email for the confirmation link'] = 'БаталгаажуулÑан захиаг имÑйл хаÑгнааÑаа шалгана уу';
+$lang['Click on the photo to see it in high definition'] = 'Өндөр нарийвчлалтай харахыг Ñ…Ò¯ÑвÑл зураг дÑÑÑ€ дарна уу';
+$lang['Close this window'] = 'Цонхыг хаах';
+$lang['Comment'] = 'СÑтгÑгдÑл';
+$lang['Comment by %s'] = 'СÑтгÑгдÑл бичÑÑн %s';
+$lang['Album'] = 'Цомог';
+$lang['File'] = 'Файл';
+$lang['File name'] = 'Файлын нÑÑ€';
+$lang['Enter your personnal informations'] = 'ÐœÑдÑÑллÑÑ Ð¾Ñ€ÑƒÑƒÐ»Ð½Ð° уу';
+$lang['Error sending email'] = 'И-мÑйлийг илгÑÑÑ…Ñд алдаа гарлаа';
+$lang['Expand all albums'] = 'Бүх цомгийг дÑлгÑÑ…';
+$lang['Display'] = 'Харуулах';
+$lang['Download'] = 'татах';
+$lang['Download this file'] = 'Файлыг татаж авах';
+$lang['EXIF Metadata'] = 'EXIF мÑдÑÑлÑл';
+$lang['Edit'] = 'ЗаÑах';
+$lang['Edit a comment'] = 'СÑтгÑгдÑлийг заÑах';
+$lang['Email address'] = 'И-мÑйл хаÑг';
+$lang['Dimensions'] = 'Зургийн Ñ…ÑмжÑÑ';
+$lang['Comments'] = 'СÑтгÑгдÑл';
+$lang['Connection settings'] = 'Холбогдох тохиргоо';
+$lang['Create a new account'] = 'ШинÑÑÑ€ бүртгүүлÑÑ…';
+$lang['Current password is wrong'] = 'Ðууц үг буруу байна';
+$lang['Customize'] = 'БүртгÑл/Тохиргоо';
+$lang['Delete'] = 'УÑтгах';
+$lang['Contact'] = 'Холбоо барих';
+$lang['Contact webmaster'] = 'ВебмаÑтертай холбогдох';
+$lang['Confirm Password'] = 'Ðууц үгÑÑ Ð´Ð°Ð²Ñ‚Ð°Ñ…';
+$lang['Connected user: %s'] = 'ХолбогдÑон Ñ…ÑÑ€ÑглÑгч: %s';
+$lang['Comment: %s'] = 'СÑтгÑгдÑл: %s';
+$lang['Are you sure?'] = 'Та итгÑлтÑй байна уу?';
+$lang['Auto login'] = 'Санах';
+$lang['Change my password'] = 'Ðууц үгÑÑ ÑˆÐ¸Ð½ÑчлÑе';
+$lang['Calendar'] = 'Огноогоор';
+$lang['%d photos'] = '%d зураг';
+$lang['About Piwigo'] = 'Piwigo-н тухай';
+$lang['Add a comment'] = 'СÑтгÑгдÑл нÑмÑÑ…';
+$lang['%d comment'] = '%d ÑÑтгÑгдÑл';
+$lang['remove this tag from the list'] = 'жагÑÐ°Ð°Ð»Ñ‚Ð°Ð°Ñ ÑÐ½Ñ Ò¯Ð³Ð¸Ð¹Ð³ хаÑах';
+$lang['this email address is already in use'] = 'ÑÐ½Ñ Ð¸Ð¼Ñйл хаÑгаар бүртгүүлÑÑн байна';
+$lang['the beginning'] = 'ÑхнÑÑÑ Ð½ÑŒ';
+$lang['the username must be given'] = 'Ñ…ÑÑ€ÑглÑгчийн нÑÑ€ заавал шаардлагатай';
+$lang['created after %s (%s)'] = '%s (%s)-Ñ Ñ…Ð¾Ð¹Ñˆ авÑан';
+$lang['created before %s (%s)'] = '%s (%s)-Ñ Ó©Ð¼Ð½Ó© авÑан';
+$lang['customize the appareance of the gallery'] = 'галерейн харагдах байдлыг заÑах';
+$lang['created on %s'] = '%s-нд авÑан';
+$lang['created between %s (%s) and %s (%s)'] = '%s (%s)-Ñ %s (%s)-н хооронд авÑан';
+$lang['all'] = 'бүх';
+$lang['Your website URL is invalid'] = 'Ð’Ñб Ñайтын Ñ…Ð¾Ð»Ð±Ð¾Ð¾Ñ Ñ‚Ð°Ð½ÑŒ буруу байна.';
+$lang['Your username has been successfully changed to : %s'] = 'Таны Ñ…ÑÑ€ÑглÑгчийн нÑÑ€ %s болж шинÑчлÑгдлÑÑ';
+$lang['Your password has been reset'] = 'Ðууц үг тань шинÑчлÑгдлÑÑ';
+$lang['Week %d'] = '%d дÑÑ…ÑŒ(дахь) долоо хоног';
+$lang['View'] = 'Харах';
+$lang['User: %s'] = 'Ð¥ÑÑ€ÑглÑгч: %s';
+$lang['User comments'] = 'Ð¥ÑÑ€ÑглÑгчийн ÑÑтгÑгдÑл';
+$lang['Show oldest comments first'] = 'Хуучин ÑÑдгÑгдÑлийг ÑÑ…Ñнд нь харуулах';
+$lang['Sent by'] = 'ИлгÑÑÑÑн';
+$lang['Search tags'] = 'Хайх үг';
+$lang['Search rules'] = 'Хайх утга';
+$lang['Return to home page'] = 'Ðүүр Ñ…ÑƒÑƒÐ´Ð°Ñ ÑƒÑ€ÑƒÑƒ буцах';
+$lang['Desktop'] = 'Ердийн';
+$lang['All'] = 'Бүгдийг';
+$lang['%d rate'] = '%d үнÑлгÑÑ';
+$lang['%d rates'] = '%d үнÑлгÑÑ';
+$lang['display each day with photos, month per month'] = 'зураг авÑан өдрөөр нь ангилж харах';
+$lang['return to the display of all photos'] = 'бүх зургийг харуулах';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Piwigo гÑÑ€Ñл зургын галерейд тавтай морилно уу!';
+$lang['add this photo to your favorites'] = 'ÑÐ½Ñ Ð·ÑƒÑ€Ð³Ð¸Ð¹Ð³ дуртай зургандаа нÑмÑÑ…';
+$lang['delete all photos from your favorites'] = 'дуртай зурагнуудаа бүгдийг нь хаÑах';
+$lang['delete this photo from your favorites'] = 'ÑÐ½Ñ Ð·ÑƒÑ€Ð³Ð¸Ð¹Ð³ дуртай зурагнааÑаа хаÑах';
+$lang['display your favorites photos'] = 'дуртай зурагнуудаа харах';
+$lang['The number of photos per page must be a not null scalar'] = 'ÐÑг хуудÑанд харуулах зургийн тоо 0-Ñ Ð¸Ñ… байх Ñ‘Ñтой';
+$lang['I want to add photos'] = 'Би зураг оруулмаар байна';
+$lang['Number of photos per page'] = 'ÐÑг хуудаÑанд харагдах зургын тоо';
+$lang['%d photo is also linked to current tags'] = '%d зураг ÑÐ½Ñ Ñ‚Ò¯Ð»Ñ…Ò¯Ò¯Ñ€ үгтÑй холбоотой байна';
+$lang['%d photos are also linked to current tags'] = '%d зураг ÑÐ½Ñ Ñ‚Ò¯Ð»Ñ…Ò¯Ò¯Ñ€ үгтÑй холбоотой байна';
+$lang['Update your rating'] = 'ҮнÑлгÑÑгÑÑ ÑˆÐ¸Ð½ÑчлÑÑ…';
+$lang['%d comment to validate'] = 'баталгаажуулалт хүлÑÑж буй ÑÑтгÑгдÑл %d';
+$lang['%d comments to validate'] = 'баталгаажуулалт хүлÑÑж буй ÑÑтгÑгдÑл %d';
+$lang['Visits'] = 'ҮзÑÑн';
+$lang['Visits, high &rarr; low'] = 'ҮзÑÑн тоогоор, их &rarr; бага';
+$lang['Visits, low &rarr; high'] = 'ҮзÑÑн тоогоор, бага &rarr; их';
+$lang['display all photos in all sub-albums'] = 'ДÑд цомогт байгаа бүх зургийг харуулах';
+$lang['in %d sub-album'] = '%d дÑд цомогт байна';
+$lang['in %d sub-albums'] = '%d дÑд цомогт байна';
+$lang['Identification'] = 'БүртгÑл';
+$lang['Send my connection settings by email'] = 'Тохиргоог имÑйл хаÑгаараа хүлÑÑн авъÑ';
+$lang['Quick connect'] = 'ÐÑвтрÑÑ…';
+$lang['Last'] = 'Сүүлийн хуудаÑ';
+$lang['RSS feed'] = 'ШинÑчлÑл тандагч';
+$lang['Complete RSS feed (photos, comments)'] = '-Бүх шинÑчлÑлийг тандах (зураг, бичлÑг, ÑÑтгÑгдÑл)';
+$lang['Photos only RSS feed'] = '-Зөвхөн ÑˆÐ¸Ð½Ñ Ð·ÑƒÑ€Ð³ÑƒÑƒÐ´Ñ‹Ð³ тандах';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS буюу шинÑчлÑл тандагчийг идÑвхжүүлж ÑÐ½Ñ Ð±Ð»Ð¾Ð³/Ñайтийн ÑˆÐ¸Ð½Ñ Ð·ÑƒÑ€Ð°Ð³, бичлÑг, ÑÑтгÑгдÑл, шинÑчлÑлтийн талаарх мÑдÑÑллийг тодорхой давтамжаар тоймлон хүлÑÑж аваарай.';
+$lang['Notification'] = 'ШинÑчлÑл тандагч';
+$lang['display a calendar by posted date'] = 'ÐийтÑлÑÑн огноогоор';
+$lang['display a calendar by creation date'] = 'Зураг авÑан огноогоор';
+$lang['display available tags'] = 'боломжтой түлхүүр үгÑийг харуулах';
+$lang['display a set of random photos'] = 'дурын зургуудыг түүж харуулах';
+$lang['display last user comments'] = 'Ñүүлд бичÑÑн ÑÑтгÑгдÑлийг харуулах';
+$lang['display only recently posted photos'] = 'зөвхөн ÑаÑхан нийтÑлÑÑн зургийг харуулах';
+$lang['display photos linked to this tag'] = 'ÑÐ½Ñ Ñ‚Ò¯Ð»Ñ…Ò¯Ò¯Ñ€ үгтÑй холбоотой зургийг харуулах';
+$lang['display this album'] = 'ÑÐ½Ñ Ñ†Ð¾Ð¼Ð³Ð¸Ð¹Ð³ харуулах';
+$lang['display most visited photos'] = 'хамгийн их үзÑÑн зургийг харуулах';
+$lang['display best rated photos'] = 'өндөр үнÑлгÑÑÑ‚Ñй зургийг харуулах';
+$lang['Recent albums'] = 'ШинÑчилÑÑн цомог';
+$lang['display most recent photos'] = 'ÑаÑхан нийтÑлÑÑн зургийг харуулах';
+$lang['Recent photos'] = 'СаÑхан нийтÑлÑÑн';
+$lang['First'] = 'Эхний хуудаÑ';
+$lang['Email address is missing. Please specify an email address.'] = 'ИмÑйл хаÑгаа заавал оруулна уу';
+$lang['About'] = 'Программийн тухайд';
+$lang['%d album updated'] = '%d цомог шинÑчлÑгдлÑÑ';
+$lang['Photos posted within the last %d day.'] = 'Зөвхөн Ñүүлийн %d хоногт нийтÑлÑÑн зурагнууд.';
+$lang['Photos posted within the last %d days.'] = 'Зөвхөн Ñүүлийн %d хоногт нийтÑлÑÑн зурагнууд.';
+$lang['posted between %s (%s) and %s (%s)'] = '%s (%s)-Ñ %s (%s)-н хооронд нийтÑлÑÑн';
+$lang['posted after %s (%s)'] = '%s (%s)-Ñ Ð´Ð°Ñ€Ð°Ð° нийтÑлÑÑн';
+$lang['posted before %s (%s)'] = '%s (%s)-Ñ Ó©Ð¼Ð½Ó© нийтÑлÑÑн';
+$lang['posted on %s'] = '%s (%s)-д нийтÑлÑÑн';
+$lang['photos posted during the last %d days'] = 'Ñүүлийн %d хоногт нийтÑлÑÑн зурагнууд';
+$lang['Posted on'] = 'ÐийтÑлÑÑн огноо';
+$lang['Date posted, new &rarr; old'] = 'ÐийтÑлÑÑн огноогоор, ÑˆÐ¸Ð½Ñ &rarr; хуучин';
+$lang['Date posted, old &rarr; new'] = 'ÐийтÑлÑÑн огноогоор, хуучин &rarr; шинÑ';
+$lang['display recently updated albums'] = 'Ñүүлд шинÑчилÑÑн цомгыг харуулах';
+$lang['Filter and display'] = 'ШүүгÑÑд харуулах';
+$lang['Number of items'] = 'Харуулах тоо';
+$lang['Sort order'] = 'Дараалал';
+$lang['ascending'] = 'өгÑÓ©Ñ…';
+$lang['descending'] = 'уруудах';
+$lang['Date created, new &rarr; old'] = 'ÐвÑан огноогоор, ÑˆÐ¸Ð½Ñ &rarr; хуучин';
+$lang['Created on'] = 'ÐвÑан огноо';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Таны вÑб хөтөч "cookie" дÑмжихгүй байна. ÐÑвтÑрч орохын тулд вÑб хөтөчийнхөө "cookie"-г идÑÐ²Ñ…Ð¶Ò¯Ò¯Ð»Ð½Ñ Ò¯Ò¯.';
+$lang['Any tag'] = 'Дурын түлхүүр үг';
+$lang['Album: %s'] = 'Цомог';
+$lang['%d photo'] = '%d зураг';
+$lang['Click here if your browser does not automatically forward you'] = 'Ðвтоматаар шилжÑхгүй бол Ñнд дарна уу';
+$lang['Best rated'] = 'Өндөр үнÑлгÑÑÑ‚Ñй';
+$lang['Here are your connection settings'] = 'Таны бүртгÑлийн тохиргоо';
+$lang['(!) This comment requires validation'] = '(!) Тухайн ÑÑтгÑгдÑлийг ';
+$lang['A comment on your site'] = 'Танай Ñайтын талаархи ÑÑтгÑгдÑл';
+$lang['Username is mandatory'] = 'Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ заавал шаардлагатай';
+$lang['Email address is mandatory'] = 'ИмÑйл хаÑг заавал шаардлагатай';
+$lang['Previous'] = 'Өмнөх';
+$lang['Show file metadata'] = 'Зургийн файлын дÑлгÑÑ€Ñнгүй мÑдÑÑллийг харуулах';
+$lang['Specials'] = 'Сонгож харах';
+$lang['this login is already used'] = 'Уучлаарай, ийм нÑÑ€ÑÑÑ€ бүртгүүлÑÑ… боломжгүй.';
+$lang['obligatory'] = 'шаардлагатай';
+$lang['mandatory'] = 'шаардлагатай';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'имÑйл хаÑг xxx@yyy.eee Ñ…ÑлбÑртÑй байх Ñ‘Ñтой (жишÑÑ Ð½ÑŒ: jack@altern.org)';
+$lang['login mustn\'t start with a space character'] = 'Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ Ñул зайгаар ÑхлÑÑ… Ñ‘Ñгүй';
+$lang['last %d days'] = 'Ñүүлийн %d хоног';
+$lang['in this album'] = 'ÑÐ½Ñ Ñ†Ð¾Ð¼Ð¾Ð³Ñ‚';
+$lang['Your comment has been registered'] = 'Таны ÑÑтгÑгдÑлийг бүртгÑж авлаа.';
+$lang['Webmaster'] = 'Ð’ÑбмаÑтер';
+$lang['User "%s" has no email address, password reset is not possible'] = 'Уучлаарай. Ð¥ÑÑ€ÑглÑгч "%s" Та имÑйл хаÑгаа бүртгүүлÑÑгүй учир нууц үгÑÑ ÑÑргÑÑÑ… боломжгүй.';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'БүртгүүлÑÑнд тань баÑрлалаа. Тохиргооны холбоотой мÑдÑÑлÑлийг имÑйл хаÑг уруу тань илгÑÑлÑÑ. ';
+$lang['Thank you for registering at %s!'] = 'Манай %s Ñайтад бүртгүүлÑÑн Танд баÑрлалаа! Сайтын зохицуулагч Таны Ñрхийг идÑвхжүүлж, хариу өгтөл түр хүлÑÑÐ½Ñ Ò¯Ò¯.';
+$lang['Show number of hits'] = 'ҮзÑÑн тоог харуулах';
+$lang['Requested tag does not exist'] = 'Ийм түлхүүр үг байхгүй байна';
+$lang['Requested album does not exist'] = 'Ийм цомог байхгүй байна';
+$lang['Repeat the slideshow'] = 'Давтах';
+$lang['Reduce diaporama speed'] = 'Хурдыг нь багаÑгах';
+$lang['All tags'] = 'Бүх түлхүүр үгÑ';
+$lang['login mustn\'t end with a space character'] = 'Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ Ñул зайгаар төгÑÓ©Ñ… Ñ‘Ñгүй';
+$lang['chronology_monthly_list'] = 'Сараар';
+$lang['chronology_weekly_list'] = 'Долоо хоногоор';
+$lang['Each listed rule must be satisfied.'] = 'Шаардлагатай бүх талбарыг гүйцÑд бөглөнө Ò¯Ò¯';
+$lang['from %s to %s'] = '%s-Ñ %s хүртÑл';
+$lang['You are not authorized to access the requested page'] = 'Уучлаарай. Танд ÑÐ½Ñ Ñ…ÑƒÑƒÐ´Ñыг үзÑÑ… Ñрхгүй байна.';
+$lang['Username modification'] = 'Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ÑÑ Ð·Ð°Ñах';
+$lang['To reset your password, visit the following address:'] = 'Ðууц үгÑÑ ÑÑргÑÑхийн тулд дараахь хаÑгаар хандана уу:';
+$lang['Since'] = 'ЭхлÑÑ…';
+$lang['Reset to default values'] = 'ҮндÑÑн утгыг ÑÑргÑÑÑ…';
+$lang['Please enter your username or email address.'] = 'Ð¥ÑÑ€ÑглÑгчийн нÑÑ€ ÑÑвÑл имÑйл хаÑгаа оруулна уу.';
+$lang['Retrieve password'] = 'Ðууц үгÑÑ ÑÑргÑÑÑ…';
+$lang['Not repeat the slideshow'] = 'Давтахгүй байх';
+$lang['New on %s'] = '%s-д шинÑÑÑ€ нÑмÑгдÑÑн';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Ð¥ÑрвÑÑ Ñ‚Ð°Ð½Ð´ ÑÐ½Ñ Ð¸Ð¼Ñйл ирÑÑ… Ñ‘Ñгүй гÑж үзÑж байгаа бол %s хаÑгаар холбоо барина уу.';
+$lang['Default'] = 'ҮндÑÑн';
+$lang['Admin: %s'] = 'Зохицуулагч: %s';
+$lang['Accelerate diaporama speed'] = 'Хурдыг нь нÑмÑÑ…';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Уучлаарай манай Ñайт заÑвартай байна. Дараа ÑргÑн зочилно уу.';
+$lang['Author'] = 'Зураг авÑан';
+$lang['Author: %s'] = 'Зураг авÑан: %s';
+$lang['Please, enter a login'] = 'Уучлаарай, шаардлагатай талбаруудыг гүйцÑд бөглөнө Ò¯Ò¯.';
+$lang['Page generated in'] = 'ХуудÑыг ачаалÑан хугацаа:';
+$lang['This author removed the comment with id %d'] = '%d ÑÑтгÑгдÑлийг бичÑгч нь уÑтгаÑан байна';
+$lang['Tag results for'] = 'Хайлтын үр дүн:';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Дараахь Ñ…ÑÑ€ÑглÑгчийн нууц үгийг ÑÑргÑÑÑ… Ñ…Ò¯ÑÑлт ирлÑÑ:';
+$lang['Registration of %s'] = '%s-н бүртгÑл';
+$lang['Powered by'] = 'Ð’Ñб хөгжүүлÑгч';
+$lang['... or browse your empty gallery'] = '... ÑÑвÑл хооÑон галерейгаа Ò¯Ð·Ð½Ñ Ò¯Ò¯';
+$lang['set as album representative'] = 'цомогны Ð´Ò¯Ñ€Ñ Ð·ÑƒÑ€Ð°Ð³ болгох';
+$lang['representative'] = 'цомогны Ð´Ò¯Ñ€Ñ Ð·ÑƒÑ€Ð°Ð³';
+$lang['return to normal view mode'] = 'Энгийн горимд шилжÑÑ…';
+$lang['author(s) : %s'] = 'БичÑгч: %s';
+$lang['Related tags'] = 'Холбоотой түлхүүр үгÑ';
+$lang['At least one listed rule must be satisfied.'] = 'Дор хаÑж нÑг утга оруулна уу';
+$lang['Permalink for album not found'] = 'Уучлаарай. Ийм Ñ…Ð¾Ð»Ð±Ð¾Ð¾Ñ Ð±Ò¯Ñ…Ð¸Ð¹ цомог олдÑонгүй';
+$lang['letters'] = 'Ò¯ÑÑг';
+$lang['group by letters'] = 'Ò¯ÑгÑÑÑ€ нь бүлÑглÑÑ…';
+$lang['Invalid key'] = 'Буруу түлхүүр байна';
+$lang['Go through the gallery as a visitor'] = 'Зочин маÑгаар үзÑÑ…';
+$lang['slideshow'] = 'Слайд-шоу';
+$lang['This author modified following comment:'] = 'Дараахь ÑÑтгÑдлийг бичÑÑн хүн нь заÑав:';
+$lang['SQL queries in'] = 'SQL ачаалÑан хугацаа';
+$lang['Play of slideshow'] = 'Слайд-шоу ÑхлүүлÑÑ…';
+$lang['Album results for'] = 'Дараахь хайлтын үр дүн:';
+$lang['Thumbnails'] = 'Ð”Ò¯Ñ€Ñ Ð·ÑƒÑ€Ð°Ð³';
+$lang['thumb'] = 'Ð”Ò¯Ñ€Ñ Ð·ÑƒÑ€Ð°Ð³';
+$lang['This login is already used by another user'] = 'Тухайн ÑрхÑÑÑ€ Ó©Ó©Ñ€ Ñ…ÑÑ€ÑглÑгч нÑвтÑÑ€ÑÑн байна';
+$lang['Recent period'] = '"ШинÑ" хоног хугацаа';
+$lang['Administration'] = 'Удирдлагын Ñ…ÑÑÑг';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Тоон дараалал: 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Тоон дараалал: 9 &rarr; 1';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Таны бичÑÑн ÑÑтгÑгдÑл админ Ñ…Ñнаж, зөвшшөрÑөний дараа нийтлÑгдÑÑ… болно. ';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Уучлаарай. СиÑтемийн ачаалал өндөр байгаа тул ÑÑтгÑгдÑл бичихÑÑ Ñ‚Ò¯Ñ€ хүлÑÑÐ½Ñ Ò¯Ò¯.';
+$lang['Recent period must be a positive integer value'] = 'Сүүлийн үеийн хоногын тоо ÑерÑг утгатай байх Ñ‘Ñтой';
+$lang['Profile'] = 'БүртгÑл';
+$lang['Preferences'] = 'Тохиргоо';
+$lang['excluded'] = 'хаÑагдÑан';
+$lang['available for administrators only'] = 'зөвхөн админууд хандах ÑрхтÑй';
+$lang['Your favorites'] = 'Дуртай зурагнууд';
+$lang['Piwigo encountered a non recoverable error'] = 'СÑргÑÑÑ… боломжгүй ноцтой алдаа гарлаа!!!';
+$lang['You will receive a link to create a new password via email.'] = 'Ð¨Ð¸Ð½Ñ Ð½ÑƒÑƒÑ† үг Ò¯Ò¯ÑгÑÑ… Ñ…Ð¾Ð»Ð±Ð¾Ð¾Ñ Ð¸Ð¼Ñйл хаÑг уруу тань очих болно.';
+$lang['chronology_monthly_calendar'] = 'Сарын хуанли';
+$lang['Favorites'] = 'Дуртай зурагнууд';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... би Ó©Ó©Ñ€Ó©Ó© тохиргоогоо хийх тул ÑÐ½Ñ Ð¼ÑдÑÑллийг дахин битгий харуул.';
+$lang['Empty query. No criteria has been entered.'] = 'Хайлтын утгаа оруулна уу';
+$lang['Redirection...'] = 'ШилжүүлÑÑ…...';
+$lang['Search for Author'] = 'Зохиогчийг хайх';
+$lang['square'] = 'ЖижÑг дөрвөлжин';
+$lang['Bad request'] = 'Ðлдаатай Ñ…Ò¯ÑÑлт байна';
+$lang['IPTC Metadata'] = 'IPTC Metadata';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Ð¥ÑрвÑÑ Ð¸Ð¹Ð¼ мÑйл ирÑÑ… Ñ‘Ñгүй гÑж үзÑж байгаа бол Ñ…ÑÑ€ÑгÑÑхгүй орхино уу.';
+$lang['html tags are not allowed in login'] = 'нÑвтрÑÑ… Ñ…ÑÑÑгт html tag ашиглах боломжгүй';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Уучлаарай Таны бичÑÑн ÑÑтгÑгдÑлийг нийтлÑÑ… боломжгүй байна. ';
+$lang['View in'] = 'Харах хувилбар';
+$lang['Your Gallery Customization'] = 'Цомогны тохиргоо';
+$lang['Unknown feed identifier'] = 'ҮлмÑдÑгдÑÑ… ID дугаар байна';
+$lang['Unknown identifier'] = 'Ийм бүртгÑл байхгүй байна';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = '"guest" Ñ…ÑÑ€ÑглÑгчийн тохиргоо ÑвдÑÑ€ÑÑн түл үндÑÑн тохиргоог ашиглалаа. Ð’ÑбмаÑтерт мÑдÑгдÑÐ½Ñ Ò¯Ò¯.';
+$lang['N/A'] = 'боломжгүй';
+$lang['Username "%s" on gallery %s'] = '%s цомог дахь Ñ…ÑÑ€ÑглÑгч "%s" ';
+$lang['show tag cloud'] = 'түлхүүр үгÑийг харуулах';
+$lang['included'] = 'агуулÑан';
+$lang['cloud'] = 'үүлÑн тооцоолол';
+$lang['Email'] = 'и-мÑйл';
+$lang['First Page'] = 'Ñхний хуудаÑ';
+$lang['Go back to the album'] = 'Цомог уруу буцах';
+$lang['Last Page'] = 'Ñүүлийн хуудаÑ';
+$lang['Password is missing. Please enter the password.'] = 'Уучлаарай. Ðууц үгÑÑ Ð¾Ñ€ÑƒÑƒÐ»Ð½Ð° уу.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Ðууц үгÑÑ Ð±Ð°Ñ‚Ð°Ð»Ð³Ð°Ð°Ð¶ÑƒÑƒÐ»Ð¶ давтан оруулна уу.';
+$lang['%d photos per page'] = 'ÐÑг хуудаÑанд %d зураг';
+$lang['Theme'] = 'Загвар';
+?> \ No newline at end of file
diff --git a/language/mn_MN/install.lang.php b/language/mn_MN/install.lang.php
new file mode 100755
index 000000000..c1d31ecad
--- /dev/null
+++ b/language/mn_MN/install.lang.php
@@ -0,0 +1,61 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+$lang['It appears your webhost is currently running PHP %s.'] = 'Таны вÑбÑервер PHP %s хувилбарыг ашиглаж байна';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo PHP 5-г тохиргоог өөрчилж чадÑангүй';
+$lang['Congratulations, Piwigo installation is completed'] = 'Танд баÑÑ€ хүргÑе, Piwigo амжилттай Ñууж дууÑлаа.';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'СервертÑй амжилттай холбогдÑон боловч мÑдÑÑллийн Ñантай холбогдох үед алдаа гарлаа.';
+$lang['Try to configure PHP 5'] = 'PHP 5 тохиргоогоо өөрчилж Ò¯Ð·Ð½Ñ Ò¯Ò¯';
+$lang['User'] = 'Ð¥ÑÑ€ÑглÑгч';
+$lang['Just another Piwigo gallery'] = 'Piwigo-н галарей нÑгÑÑÑ€ нÑмÑгдлÑÑ';
+$lang['Database configuration'] = 'ÐœÑдÑÑллийн Ñангийн тохиргоо';
+$lang['Welcome to my photo gallery'] = 'Миний зургийн цомогт тавтай морилно уу';
+$lang['please enter your password again'] = 'нууц үгÑÑ Ð´Ð°Ñ…Ð¸Ð½ оруулна уу';
+$lang['Start Install'] = 'Суулгаж ÑхлÑÑ…';
+$lang['Sorry!'] = 'Уучлаарай';
+$lang['Password ']['confirm'] = 'Ðууц үгÑÑ Ð´Ð°Ð²Ñ‚Ð°Ñ…';
+$lang['Can\'t connect to server'] = 'СервертÑй холбогдож чадахгүй байна';
+$lang['Database name'] = 'ÐœÑдÑÑллийн Ñангын нÑÑ€';
+$lang['Default gallery language'] = 'ҮндÑÑн Ñ…Ñл';
+$lang['PHP 5 is required'] = 'PHP 5 шаардлагатай';
+$lang['Download the config file'] = 'Тохиргооны файлыг татах';
+$lang['Admin configuration'] = 'Ðдминий тохиргоо';
+$lang['Basic configuration'] = 'ҮндÑÑн тохиргоо';
+$lang['webmaster login can\'t contain characters \' or "'] = 'Ð’ÑбмаÑтерийн нÑÑ€Ñнд \' or " гÑÑÑн Ñ‚ÑмдÑгт орох Ñ‘Ñгүй.';
+$lang['verification'] = 'баталгаажуулалт';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'Ð¥ÑÑ€ÑглÑгчид ÑÐ½Ñ Ð¸Ð¼Ñйл хаÑгаар админтай холбогдох боломжтой';
+$lang['Hope to see you back soon.'] = 'Тантай удахгүй ÑргÑн уулзана гÑдÑгт найдаж байна.';
+$lang['Welcome to your new installation of Piwigo!'] = 'Piwigo-г шинÑÑÑ€ Ñуулгах Ñ…ÑÑÑгт тавтай морилно уу!';
+$lang['enter a login for webmaster'] = 'Ð’ÑбмаÑтерийн мÑдÑÑллÑÑ Ð¾Ñ€ÑƒÑƒÐ»Ð½Ð° уу';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'ТуÑламж Ñ…ÑÑ€ÑгтÑй бол <a href="%s">Piwigo message board</a> хаÑгаар хандаж аÑуултаа аÑуугаарай.';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'Тохиргооны файл local/config/database.inc.php-г Ò¯Ò¯ÑгÑж чадÑангүй';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'Удирдлагын талбарт хандах Ñрхийг нÑÑÑ… тул ÑÐ½Ñ Ð¼ÑдÑÑллийг нууцлан хадгална уу';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'ÐœÑдÑÑллийн Ñангийн талбаруудад ÑÐ½Ñ ÑƒÑ‚Ð³Ñ‹Ð³ угтвар Ñ…ÑÑÑг болгон ашиглах болно. ИнгÑÑнÑÑÑ€ талбаруудыг удирдаж зохицуулахад илүү Ñ…Ñлбар болдог.';
+$lang['localhost or other, supplied by your host provider'] = 'localhost ÑÑвÑл веб байршуулж буй ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ð°Ñ Ó©Ð³Ñөн нÑÑ€';
+$lang['user login given by your host provider'] = 'веб байршуулж буй ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ð°Ñ Ó©Ð³Ñөн Ñ…ÑÑ€ÑглÑгчийн нÑÑ€';
+$lang['user password given by your host provider'] = 'веб байршуулж буй ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ð°Ñ Ó©Ð³Ñөн нууц үг';
+$lang['Database table prefix'] = 'ÐœÑдÑÑллийн Ñангийн талбарийн угтвар утга';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Тохиргооны файлыг татан авч өөрчлөөд local/config Ñ…Ð°Ð²Ñ‚Ð°Ñ ÑƒÑ€ÑƒÑƒ буцаан хуулаах боломжтой.';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Тохиргоогоо Ó©Ó©Ñ€Ó©Ó© өөрчлөөд Piwigo-г дахин ачаалж болно гÑдгийг Ñанаарай.';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'ТуÑламж Ñ…ÑÑ€ÑгтÑй бол манай онлайн форумд хандаарай: %s';
+?> \ No newline at end of file
diff --git a/language/mn_MN/iso.txt b/language/mn_MN/iso.txt
new file mode 100644
index 000000000..78c96046a
--- /dev/null
+++ b/language/mn_MN/iso.txt
@@ -0,0 +1 @@
+Монгол [MN] \ No newline at end of file
diff --git a/language/mn_MN/mn_MN.jpg b/language/mn_MN/mn_MN.jpg
new file mode 100644
index 000000000..5a9b898b5
--- /dev/null
+++ b/language/mn_MN/mn_MN.jpg
Binary files differ
diff --git a/language/mn_MN/upgrade.lang.php b/language/mn_MN/upgrade.lang.php
new file mode 100755
index 000000000..eb3f3ca8f
--- /dev/null
+++ b/language/mn_MN/upgrade.lang.php
@@ -0,0 +1,40 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['You do not have access rights to run upgrade'] = 'Уучлаарай, Танд программыг шинÑчлÑÑ… Ñрх байхгүй байна.';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'Уучлаарай, зөвхөн админ шинÑчлÑÑ… ÑрхтÑй. Ðдмины ÑрхÑÑÑ€ ÑиÑтемд нÑвтÑÑ€Ð½Ñ Ò¯Ò¯.';
+$lang['total upgrade time'] = 'ЗарцуулÑан хугацаа';
+$lang['Upgrade from version %s to %s'] = '%s-Ñ %s хувилбар уруу шинÑчлÑÑ…';
+$lang['Upgrade'] = 'ШинÑчлÑÑ…';
+$lang['Upgrade informations'] = 'ШинÑчилÑÑн мÑдÑÑлÑл';
+$lang['total SQL time'] = 'SQL ажиллаÑан хугацаа';
+$lang['Statistics'] = 'СтатиÑтик';
+$lang['SQL queries'] = 'SQL комманд';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Ð¥ÑрвÑÑ Ñмар нÑгÑн аÑуудал гарвал [Удирдлага>Tools>ЗаÑвар үйлчилгÑÑ] Ñ…ÑÑÑгÑÑÑ ÑˆÐ°Ð»Ð³Ð°Ð¶ Ò¯Ð·Ð½Ñ Ò¯Ò¯';
+$lang['User permissions and group permissions have been erased'] = 'Ð¥ÑÑ€ÑглÑгч болон бүлгүүдийн Ñрхийг цуцаллаа';
+$lang['All sub-albums of private albums become private'] = 'Хувийн цомогт хамаарагдах дÑд цомогууд мөн "хувийн" байх болно';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'Ðлдаа Ð³Ð°Ñ€Ð°Ñ…Ð°Ð°Ñ ÑÑргийлж дараахь нÑмÑлт өргөтгөлүүдийг идÑвхгүй болголоо. Дахин идÑвхжүүлÑÑ…ÑÑÑÑÑ Ó©Ð¼Ð½Ó© тохирох ÑÑÑхийг нь нÑгталж шалгана уу.';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = '<i>%s</i> дотор, before <b>?></b>-н урд дараахь утгыг оруулах:';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Өмнөх Ñ‚Ð¾Ñ…Ð¸Ñ€Ð³Ð¾Ð¾Ð½Ð¾Ð¾Ñ Ð·Ó©Ð²Ñ…Ó©Ð½ вÑбмаÑтерийн и-мÑйл хаÑгыг л хадгалж үлдÑÑлÑÑ.';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'ЭнÑÑ…Ò¯Ò¯ Ñ…ÑƒÑƒÐ´Ð°Ñ Ð¢Ð°Ð½Ð´ Piwigo-н мÑдÑÑллийн Ñангаа ÑˆÐ¸Ð½Ñ Ñ…ÑƒÐ²Ð¸Ð»Ð±Ð°Ñ€Ð°Ð°Ñ€ Ñайжруулахад тань туÑлах болно. Та одоо <strong>%s</strong> (буюу түүнтÑй адилтгах) хувилбарыг ашиглаж байна.';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Ðлдаа Ð³Ð°Ñ€Ð°Ñ…Ð°Ð°Ñ ÑÑргийлж дараахь загвар (theme)-г идÑвхгүй болголоо. Дахин идÑвхжүүлÑхийн өмнө ÑайжруулÑан хувилбар нь гарÑан ÑÑÑхийг шалгана уу:';
+?> \ No newline at end of file
diff --git a/language/ms_MY/common.lang.php b/language/ms_MY/common.lang.php
index daeb14d6c..ccaaad64b 100644
--- a/language/ms_MY/common.lang.php
+++ b/language/ms_MY/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -62,4 +62,102 @@ $lang['A comment on your site'] = 'Satu komen di laman anda';
$lang['About Piwigo'] = 'Mengenai Piwigo';
$lang['About'] = 'Mengenai';
+$lang['Invalid key'] = 'Kunci tidak cocok';
+$lang['Invalid password!'] = 'kata sandi tidak cocok!';
+$lang['Invalid username or email'] = 'Nama pengguna atau email yang tidak cocok';
+$lang['Keyword'] = 'Kata kunci';
+$lang['Kind of date'] = 'Jenis tanggal';
+$lang['Language'] = 'Bahasa';
+$lang['Last'] = 'Terakhir';
+$lang['Last Page'] = 'Halaman terakhir';
+$lang['Links'] = 'Link';
+$lang['Login'] = 'Masuk';
+$lang['Logout'] = 'Keluar';
+$lang['Manage this user comment: %s'] = 'Atur komentar pengguna ini %s';
+$lang['Manual sort order'] = 'Penyusunan manual';
+$lang['Menu'] = 'Menu';
+$lang['Mobile'] = 'Ponsel';
+$lang['Most visited'] = 'Paling banyak dikunjungi';
+$lang['N/A'] = 'Tidak tersedia';
+$lang['New on %s'] = 'baru di %s';
+$lang['New password'] = 'Kata sandi baru';
+$lang['Filter'] = 'Saring';
+$lang['Filter and display'] = 'Saring dan tampilkan';
+$lang['First'] = 'Pertama';
+$lang['First Page'] = 'Halaman pertama';
+$lang['Forbidden'] = 'Disembunyikan';
+$lang['Forgot your password?'] = 'Lupa password anda?';
+$lang['Go back to the album'] = 'Kembali ke album';
+$lang['Go through the gallery as a visitor'] = 'Navigasi galeri sebagai pengunjung';
+$lang['Hello'] = 'Halo';
+$lang['Hello %s,'] = 'Halo %s';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Halo %, Galeri foto Piwigo anda masih kosong! ';
+$lang['Help'] = 'Bantuan';
+$lang['Here are your connection settings'] = 'Ini adalah pengaturan koneksi anda';
+$lang['Home'] = 'Beranda';
+$lang['I want to add photos'] = 'Saya ingin menambahkan sebuah foto';
+$lang['IP: %s'] = 'IP: %s';
+$lang['IPTC Metadata'] = 'IPTC Metadata';
+$lang['Identification'] = 'Identifikasi';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Jika ini adalah kesalahan, cukup abaikan email ini dan tidak akan terjadi apa-apa.';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Jika anda merasa email ini merupakan kesalahan, harap hubungi kami di %s';
+$lang['EXIF Metadata'] = 'EXIF Metadata';
+$lang['Edit'] = 'Ubah';
+$lang['Edit a comment'] = 'Ubah sebuah komentar';
+$lang['Email'] = 'Email';
+$lang['Email address'] = 'Alamat email';
+$lang['Email address is mandatory'] = 'Alamat email ditahan';
+$lang['Email address is missing. Please specify an email address.'] = 'Alamat email anda tidak aktif, mohon beri alamat yang baru';
+$lang['Email: %s'] = 'Email: %s';
+$lang['Empty query. No criteria has been entered.'] = 'Kolom ini kosong, Belum ada kriteria yang dimasukkan';
+$lang['End-Date'] = 'Tanggal kadaluarsa';
+$lang['Enter your new password below.'] = 'Masukkan kata sandi baru anda di bawah';
+$lang['Enter your personnal informations'] = 'Masukkan data pribadi anda';
+$lang['Error sending email'] = 'Kesalahan ketika mengirimkan email';
+$lang['Expand all albums'] = 'Lebarkan semua album';
+$lang['Favorites'] = 'Favorit';
+$lang['File'] = 'Dokumen';
+$lang['File name'] = 'Nama dokumen';
+$lang['File name, A &rarr; Z'] = 'Nama dokumen, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'Nama dokumen, Z &rarr; A';
+$lang['Filesize'] = 'Ukuran dokumen';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Kukis diblokir atau tidak didukung oleh browser anda. Anda harus mengaktifkan kukis untuk masuk';
+$lang['Create a new account'] = 'Membuat akun baru';
+$lang['Created on'] = 'Dibuat';
+$lang['Creation date'] = 'Tanggal pembuatan';
+$lang['Current password is wrong'] = 'Kata sandi sekarang keliru';
+$lang['Customize'] = 'Kostumisasi';
+$lang['Date'] = 'Tanggal';
+$lang['Date created, new &rarr; old'] = 'Tanggal pembuatan, baru &rarr; lama';
+$lang['Date created, old &rarr; new'] = 'Tanggal pembuatan, lama &rarr; baru';
+$lang['Date posted, new &rarr; old'] = 'Tanggal dipublikasi, baru &rarr; lama';
+$lang['Date posted, old &rarr; new'] = 'Tanggal dipublikasikan, lama &rarr; baru';
+$lang['Default'] = 'Standar';
+$lang['Delete'] = 'Hapus';
+$lang['Desktop'] = 'Deskop';
+$lang['Dimensions'] = 'Dimensi';
+$lang['Display'] = 'Tampilkan';
+$lang['Download'] = 'unggah';
+$lang['Download this file'] = 'unggah dokumen ini';
+$lang['Each listed rule must be satisfied.'] = 'Tiap kriteria harus diselesaikan';
+$lang['Author: %s'] = 'Penulis : %';
+$lang['Auto login'] = 'Masuk otomatis';
+$lang['Author'] = 'Penulis';
+$lang['At least one listed rule must be satisfied.'] = 'Sekurangnya satu kategori harus diselesaikan';
+$lang['Are you sure?'] = 'Apakah anda yakin?';
+$lang['Any tag'] = 'Kata kunci lain';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Sistem penahan : harap tunggu sebentar sebelum memposting komentar yang baru';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Seorang pengelola harus mengautorisasi komentar anda sebelum dilihat khalayak umum';
+$lang['All tags'] = 'Semua kata kunci';
+$lang['All'] = 'Semua';
+$lang['Albums'] = 'Album';
+$lang['Album: %s'] = 'Album: %s';
+$lang['Album results for'] = 'Hasil album untuk';
+$lang['Administration'] = 'Pengelolaan';
+$lang['Album'] = 'Album';
+$lang['Admin: %s'] = 'Pengelola: %s';
+$lang['Add a comment'] = 'Tambahkan sebuah komentar';
+$lang['Accelerate diaporama speed'] = 'Tingkatkan kecepatan gambar geser';
+$lang['2small'] = 'XXS - Kecil';
+$lang['%d rate'] = '%d rating';
?> \ No newline at end of file
diff --git a/language/nb_NO/admin.lang.php b/language/nb_NO/admin.lang.php
index cca43ce3f..4c1d8141c 100644
--- a/language/nb_NO/admin.lang.php
+++ b/language/nb_NO/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -26,7 +26,7 @@ $lang['%d associations'] = '%d assosierer';
$lang['%d album including'] = '%d album inkludert';
$lang['%d albums including'] = '%d album inkludert';
$lang['%d physical'] = ' %d fysisk';
-$lang[' and %d virtual'] = ' og %d virituell';
+$lang[' and %d virtual'] = ' og %d virtuell';
$lang['%d album moved'] = '%d album er flyttet';
$lang['%d albums moved'] = '%d album er flyttet';
$lang['%d group'] = '%d gruppe';
@@ -189,7 +189,6 @@ $lang['Access type'] = 'Tilgangstype type';
$lang['Information data registered in database'] = 'Informasjons data registrert i database';
$lang['Default display'] = 'Standard visning';
$lang['The gallery URL is not valid.'] = 'Galleri URL er ikke gyldig.';
-$lang['Main'] = 'Main';
$lang['The number of comments a page must be between 5 and 50 included.'] = 'Antall kommentarer per side må være mellom 5 og 50.';
$lang['Configuration'] = 'Konfigurasjon';
$lang['confirm'] = 'Godkjenn';
@@ -212,7 +211,7 @@ $lang['This name is already used by another group.'] = 'Dette navnet er allerede
$lang['High definition'] = 'Høy oppløsning';
$lang['jump to album'] = 'hopp til album';
$lang['jump to photo'] = 'hopp til bilde';
-$lang['leave'] = 'gå ut';
+$lang['leave'] = 'behold';
$lang['Lock'] = 'LÃ¥s';
$lang['Locked'] = 'LÃ¥st';
$lang['manage album photos'] = 'behandle album elementer';
@@ -224,7 +223,6 @@ $lang['Prepared time for list of users to send mail is limited. Others users are
$lang['Time to send mail is limited. Others mails are skipped.'] = 'Tiden for å sende mail er begrenset. Andre mail er hoppet over.';
$lang['To send ?'] = 'Ã… sende?';
$lang['Last send'] = 'Sist sendt';
-$lang['email'] = 'Email';
$lang['User'] = 'Bruker';
$lang['Complementary mail content'] = 'Kompletterende mail innhold';
$lang['See you soon,'] = 'PÃ¥ gjensyn,';
@@ -431,7 +429,7 @@ $lang['Correction applied with error'] = 'Rettelse er gjennomført med feil';
$lang['%d anomaly has been detected.'] = '%d en unormalitet har blitt oppdaget.';
$lang['%d anomalies have been detected.'] = '%d unormaliteter har blitt oppdaget.';
$lang['%d anomaly has been corrected.'] = '%d unormalitet har blitt rettet.';
-$lang['%d anomalies have been detected corrected.'] = '%d en unormaliteter har blitt oppdaget og rettet.';
+$lang['%d anomalies have been detected corrected.'] = '%d unormaliteter har blitt oppdaget og rettet.';
$lang['%d anomaly has not been corrected.'] = '%d unormalitet har ikke blitt rettet.';
$lang['%d anomalies have not been corrected.'] = '%d unormaliteter har ikke blitt rettet.';
$lang['Go to %s or %s for more informations'] = 'GÃ¥ til %s eller %s for mer informasjon';
@@ -923,8 +921,6 @@ $lang['Duplicate selected tags'] = 'Flere tagger valgt';
$lang['Name of the duplicate'] = 'Navn på duplikater';
$lang['Source tag'] = 'Kildetagg';
$lang['Tag "%s" is now a duplicate of "%s"'] = 'Tagg "%s" er nå en duplikat av "%s"';
-$lang['Format'] = 'Format';
-$lang['Invalid dimension'] = 'Ikke gyldig dimensjon';
$lang['Landscape'] = 'Liggende';
$lang['Manage photos'] = 'Behandle bilder';
$lang['Minimum height'] = 'Minimum høyde';
@@ -933,8 +929,6 @@ $lang['Number of albums per page'] = 'Antall album pr side';
$lang['Panorama'] = 'Panorama';
$lang['Portrait'] = 'Portrett';
$lang['View in gallery'] = 'Se i galleri';
-$lang['Maximum'] = 'Maksimalt';
-$lang['Minimum'] = 'Minimalt';
$lang['Ratio'] = 'Ratio';
$lang['Duplicate'] = 'Duplikat';
$lang['Manage the members'] = 'Behandle medlemmene';
@@ -948,4 +942,33 @@ $lang['This group will be unset to default'] = 'Denne gruppen mister merket stan
$lang['Type here the name of the new group'] = 'Skriv her navnet på den nye gruppen';
$lang['between %.2f and %.2f'] = 'mellom %.2f og %.2f';
$lang['between %d and %d pixels'] = 'mellom %d og %d piksler';
+$lang['Purge user cache'] = 'Rens bruker cache';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'Endring av bildestørrelse er slått av, siden du bruker GD som grafikkgalleri.';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'Bildets dimensjoner vil bli redusert til %dx%d piksler.';
+$lang['Select at least one tag'] = 'Velg minst en tag';
+$lang['Basic settings'] = 'Generelle innstillinger';
+$lang['General'] = 'Genrelt';
+$lang['Mail theme'] = 'Eposttema';
+$lang['Last visit on %s, %s.'] = 'Forrige besøk den %s, %s';
+$lang['%d of %d users selected'] = '%d av %d brukere valgt';
+$lang['(filtered from %s total users)'] = '(filtrert fra %s brukere totalt)';
+$lang['All %d users are selected'] = 'Alle %d brukere valgt';
+$lang['Change password'] = 'Bytt passord';
+$lang['Change username'] = 'Bytt brukernavn';
+$lang['Loading...'] = 'Laster...';
+$lang['No matching user found'] = 'Ingen treff';
+$lang['No user selected of %d users'] = 'Ingen av %d brukere valgt';
+$lang['No user selected, no action possible.'] = 'Ingen bruker valgt, kan ikke gjøre noe.';
+$lang['Password updated'] = 'Passord oppdatert';
+$lang['Registered on %s, %s.'] = 'Registrert den %s, %s.';
+$lang['Show %s users'] = 'Vis %s brukere';
+$lang['Showing %s to %s of %s users'] = 'Viser %s til %s av %s brukere';
+$lang['Update user'] = 'Oppdater bruker';
+$lang['User %s added'] = 'Lagt til bruker %s';
+$lang['User %s updated'] = 'Bruker %s oppdatert';
+$lang['Users modified'] = 'Brukermodifisert';
+$lang['on the %d selected users'] = 'av de %d valgte brukere';
+$lang['Close user details'] = 'Lukk brukeropplysninger';
+$lang['Open user details'] = 'Ã…pne brukeropplysninger';
+$lang['close'] = 'lukk';
?> \ No newline at end of file
diff --git a/language/nb_NO/common.lang.php b/language/nb_NO/common.lang.php
index 2867f3f1c..b1d1d75d6 100644
--- a/language/nb_NO/common.lang.php
+++ b/language/nb_NO/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Norwegian [NO]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=483
Author: Piwigo team
Author URI: http://piwigo.org
@@ -43,14 +43,14 @@ $lang['Author: %s'] = "Forfatter: %s";
$lang['Comment: %s'] = "Kommentar: %s";
$lang['Comment by %s'] = "Kommentert av %s";
$lang['User: %s'] = "Bruker: %s";
-$lang['Email: %s'] = "Email: %s";
+$lang['Email: %s'] = 'E-post: %s';
$lang['Admin: %s'] = "Admin: %s";
$lang['Registration of %s'] = "Registrering av %s";
$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = "Feil status for bruker \"gjest\", default status vil bli brukt. Vennligst kontakt webmaster.";
-$lang['this email address is already in use'] = "En annen bruker har allerede denne mail addressen";
+$lang['this email address is already in use'] = 'En annen bruker har allerede denne e-postadressem';
$lang['Tag results for'] = "Tag resultat for";
$lang['from %s to %s'] = "fra %s til %s";
-$lang['Play of slideshow'] = 'Avspill slideshow';
+$lang['Play of slideshow'] = 'Start slideshow';
$lang['Pause of slideshow'] = "Pause slideshow";
$lang['Repeat the slideshow'] = "Gjenta slideshow";
$lang['Not repeat the slideshow'] = "Ikke repeter slideshow";
@@ -61,15 +61,15 @@ $lang['Yes'] = "Ja";
$lang['No'] = "Nei";
$lang['%d photo'] = "%d bilde";
$lang['%d photos'] = "%d bilder";
-$lang['%d photo is also linked to current tags'] = "%d bilde er også linket til gjeldende tags";
-$lang['%d photos are also linked to current tags'] = "%d bilder er også linket til gjeldende tags";
-$lang['display photos linked to this tag'] = "Se kun bilder linket til gjeldende tags";
+$lang['%d photo is also linked to current tags'] = '%d bilde er også linket til gjeldende stikkord';
+$lang['%d photos are also linked to current tags'] = '%d bilder er også linket til gjeldende stikkord';
+$lang['display photos linked to this tag'] = 'Se kun bilder linket til gjeldende stikkord';
$lang['photos posted during the last %d days'] = "bilder postet innen de siste %d dager";
$lang['Piwigo Help'] = "Piwigo hjelp";
$lang['Rank'] = "Rangering";
$lang['group by letters'] = "ordne etter bokstav";
$lang['letters'] = "bokstav";
-$lang['show tag cloud'] = "vis tags cloud";
+$lang['show tag cloud'] = 'vis stikkordsky';
$lang['cloud'] = 'sky';
$lang['Reset to default values'] = "Sett tilbake til standard verdier";
$lang['delete all photos from your favorites'] = "slett alle bilder fra dine favoritter";
@@ -102,16 +102,16 @@ $lang['Confirm Password'] = 'Bekreft Passord';
$lang['Connection settings'] = 'Tilkoblings innstillinger';
$lang['Login'] = 'Logg inn';
$lang['Contact webmaster'] = 'Kontakt webmaster';
-$lang['Create a new account'] = 'Oprett ny konto';
+$lang['Create a new account'] = 'Opprett ny konto';
$lang['Created on'] = 'Opprettet den';
$lang['Creation date'] = 'Dato for opprettelse';
$lang['Current password is wrong'] = 'Passordet er feil';
$lang['Dimensions'] = 'Dimensjoner';
$lang['Display'] = 'Vis';
$lang['Each listed rule must be satisfied.'] = 'Alle listede krav må være oppfylt.';
-$lang['Email address'] = 'Email adresse';
+$lang['Email address'] = 'E-postadresse';
$lang['Enter your personnal informations'] = 'Skriv inn dine personlige data';
-$lang['Error sending email'] = 'Feil ved sending av e-mail';
+$lang['Error sending email'] = 'Feil ved sending av e-post';
$lang['File name'] = 'Fil navn';
$lang['File'] = 'Fil';
$lang['Filesize'] = 'Filstørrelse';
@@ -141,34 +141,34 @@ $lang['%d new photos'] = '%d nye bilder';
$lang['%d new user'] = '%d ny bruker';
$lang['%d new users'] = '%d nye brukere';
$lang['About'] = 'Om';
-$lang['All tags'] = 'Alle ord';
-$lang['Any tag'] = 'Valgte ord';
+$lang['All tags'] = 'Alle stikkord';
+$lang['Any tag'] = 'Valgte stikkord';
$lang['At least one listed rule must be satisfied.'] = 'Minst en listet regel må være med.';
$lang['Author'] = 'Forfatter';
$lang['Notification'] = 'Til informasjon';
$lang['Number of items'] = 'Antall poster';
-$lang['Original dimensions'] = 'Orginal dimensjoner';
+$lang['Original dimensions'] = 'Original dimensjoner';
$lang['Password forgotten'] = 'Glemt passord';
$lang['Password'] = 'Passord';
$lang['Post date'] = 'Post dato';
$lang['Posted on'] = 'Postet den';
$lang['Profile'] = 'Profil';
-$lang['Quick connect'] = 'Hurtig tilkobling';
+$lang['Quick connect'] = 'Hurtigtilkobling';
$lang['RSS feed'] = 'RSS mating';
$lang['Register'] = 'Registrere';
$lang['Registration'] = 'Registrering';
-$lang['Related tags'] = 'Relaterte ord';
+$lang['Related tags'] = 'Relaterte stikkord';
$lang['Reset'] = 'Tibakestill';
$lang['Retrieve password'] = 'Motta passord';
$lang['Search rules'] = 'Søke kriterie';
-$lang['Search tags'] = 'Søke ord';
+$lang['Search tags'] = 'Søk i stikkord';
$lang['Search'] = 'Søk';
-$lang['display available tags'] = 'Se tilgjengelige tags';
+$lang['display available tags'] = 'Se tilgjengelige stikkord';
$lang['Since'] = 'Siden';
$lang['Sort by'] = 'Sorter etter';
$lang['Sort order'] = 'Sorter alfabetisk';
-$lang['Tag'] = 'Ord';
-$lang['Tags'] = 'Ord';
+$lang['Tag'] = 'Stikkord';
+$lang['Tags'] = 'Stikkord';
$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS mater gir varsling om nye aktiviteter fra denne web siden: nye bilder, oppdaterte album, nye kommentarer. For å bli brukt i en RSS leser.';
$lang['Unknown feed identifier'] = 'ukjent mater gjenkjenner';
$lang['User comments'] = 'Bruker kommentarer';
@@ -196,7 +196,7 @@ $lang['View'] = 'Vis';
$lang['chronology_monthly_calendar'] = 'MÃ¥nedlig kalender';
$lang['chronology_monthly_list'] = 'MÃ¥nedlig liste';
$lang['chronology_weekly_list'] = 'Ukentlig liste';
-$lang['Click here if your browser does not automatically forward you'] = 'Klikk her pm din nettleser ikke automatisk sender deg viderer.';
+$lang['Click here if your browser does not automatically forward you'] = 'Klikk her om din nettleser ikke automatisk sender deg viderer.';
$lang['comment date'] = 'Kommentert dato';
$lang['Comment'] = 'kommentar';
$lang['Your comment has been registered'] = 'Din kommentar er registrert';
@@ -219,7 +219,7 @@ $lang['descending'] = 'synkende';
$lang['Download'] = 'Last ned';
$lang['Download this file'] = 'last ned denne filen';
$lang['edit'] = 'redigere';
-$lang['wrong date'] = 'gal dato';
+$lang['wrong date'] = 'feil dato';
$lang['excluded'] = 'ekskludert';
$lang['Your favorites'] = 'Mine favoritter';
$lang['display your favorites photos'] = 'vis mine favoritt bilder';
@@ -236,8 +236,8 @@ $lang['customize the appareance of the gallery'] = 'Egendefiner visning av dette
$lang['search'] = 'søk';
$lang['Home'] = 'Hjem';
$lang['in this album'] = 'i dette albumet';
-$lang['in %d sub-album'] = 'i %d grunnn-album';
-$lang['in %d sub-albums'] = 'in %d grunn-albumer';
+$lang['in %d sub-album'] = 'i %d under-album';
+$lang['in %d sub-albums'] = 'i %d under-albumer';
$lang['included'] = 'inkludert';
$lang['Invalid password!'] = 'Ugyldig passord!';
$lang['Language'] = 'Språk';
@@ -281,37 +281,35 @@ $lang['login mustn\'t end with a space character'] = 'login må ikke ende med et
$lang['login mustn\'t start with a space character'] = 'login må ikke starte med et mellomrom';
$lang['this login is already used'] = 'denne innloggingen er allerede i bruk';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'mail addresse må være tilsvarende xxx@yyy.eee (eksempel : jack@altern.org)';
-$lang['please enter your password again'] = 'vennligst skriv ditt passord på ny';
$lang['Auto login'] = 'Auto innlogging';
$lang['%d Kb'] = '%d Kb';
$lang['Week %d'] = 'Uke %d';
-$lang['remove this tag from the list'] = 'fjern tag fra denne listen';
+$lang['remove this tag from the list'] = 'fjern stikkord fra denne listen';
$lang['representative'] = 'representative';
$lang['Search for Author'] = 'Søk etter forfatter';
$lang['Search in albums'] = 'Søk i album';
$lang['Search by date'] = 'Søk etter dato';
$lang['Date'] = 'Dato';
$lang['End-Date'] = 'Ende dato';
-$lang['Kind of date'] = 'Slags dato';
+$lang['Kind of date'] = 'Type dato';
$lang['Search for words'] = 'Søk etter ord';
$lang['Search for all terms'] = 'Søk i alle termer';
$lang['Search for any term'] = 'Søk i hvilken som helst term';
$lang['Empty query. No criteria has been entered.'] = 'Tøm spørring. Ingen kriterier har blitt lagt inn.';
$lang['Search results'] = 'Søke resultat';
-$lang['Search in sub-albums'] = 'Søk i grunn-album';
+$lang['Search in sub-albums'] = 'Søk i under-album';
$lang['searched words : %s'] = 'søkte ord : %';
$lang['Contact'] = 'Kontakt';
-$lang['set as album representative'] = 'set som album representant';
+$lang['set as album representative'] = 'sett som album representant';
$lang['Show number of comments'] = 'Vis antall kommentarer';
-$lang['Show number of hits'] = 'Vis antall hit';
+$lang['Show number of hits'] = 'Vis antall treff';
$lang['slideshow'] = 'slideshow';
-$lang['stop the slideshow'] = 'stop slideshow';
+$lang['stop the slideshow'] = 'stopp slideshow';
$lang['Specials'] = 'Spesial';
$lang['SQL queries in'] = 'SQL spørring' ;
$lang['display only recently posted photos'] = 'Vis kun sisite postede bilder';
$lang['return to the display of all photos'] = 'tilbake til visning av alle bilder';
$lang['the beginning'] = 'begynnelsen';
-$lang['Interface theme'] = 'Brukerfalte tema';
$lang['Thumbnails'] = 'Miniatyrbilder';
$lang['Menu'] = 'Meny';
$lang['A comment on your site'] = 'En kommentar på din side';
@@ -319,18 +317,18 @@ $lang['today'] = 'i dag';
$lang['Update your rating'] = 'Oppdater din rating';
$lang['the username must be given'] = 'brukernavn kreves';
$lang['Album: %s'] = 'Album: %s';
-$lang['Album results for'] = 'Album results for';
+$lang['Album results for'] = 'Album resultat for';
$lang['Edit a comment'] = 'Endre en kommentar';
$lang['Are you sure?'] = 'Er du sikker?';
$lang['(!) This comment requires validation'] = '(!) Denne kommentaren krever godkjenning';
$lang['Welcome'] = 'Velkommen';
$lang['Welcome to your Piwigo photo gallery!'] = 'Velkommen til din Piwigo photo gallery!';
$lang['... or browse your empty gallery'] = '... eller bla i ditt tomme galleri';
-$lang['... or please deactivate this message, I will find my way by myself'] = '... eller vennligstdeaktiver denne beskjeden, jeg vil finne ut av det selv';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... eller vennligst deaktiver denne beskjeden, jeg vil finne ut av det selv';
$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Hallo %, ditt Piwigo photo gallery er tomt!';
$lang['I want to add photos'] = 'Jeg vil legge til foto';
-$lang['Manage this user comment: %s'] = 'Behandle denne brukers kommentar: %er';
-$lang['Email address is missing. Please specify an email address.'] = 'Email addresse mangler. Vennligst skriv en email addresse.';
+$lang['Manage this user comment: %s'] = 'Behandle denne brukers kommentar: %s';
+$lang['Email address is missing. Please specify an email address.'] = 'E-postadresse mangler. Vennligst skriv en e-postadresse.';
$lang['This author modified following comment:'] = 'Denne forfatteren modifiserte følgende kommentar:';
$lang['This author removed the comment with id %d'] = 'Denne forfatteren fjernetkommentaren med id %d';
$lang['Change my password'] = 'Bytt mitt passord';
@@ -350,8 +348,8 @@ $lang['Please enter your username or email address.'] = 'Skriv inn ditt brukerna
$lang['Rating score'] = 'Karakter';
$lang['Return to home page'] = 'Tilbake til hovedsiden';
$lang['Send my connection settings by email'] = 'Send tilkoblingsinnstillinger på epost';
-$lang['Show oldest comments first'] = 'Vis eldst først';
-$lang['Show latest comments first'] = 'Vis senest kommentert først';
+$lang['Show oldest comments first'] = 'Vis eldste kommentarer først';
+$lang['Show latest comments first'] = 'Vis seneste kommentert først';
$lang['square'] = 'Kvadrat';
$lang['thumb'] = 'Miniatyrbilde';
$lang['2small'] = 'XXS - bitte lite';
@@ -359,12 +357,12 @@ $lang['xsmall'] = 'XS - veldig lite';
$lang['small'] = 'S - lite';
$lang['medium'] = 'M - medium';
$lang['large'] = 'L - stor';
-$lang['xlarge'] = 'XL - veldig stor';
-$lang['xxlarge'] = 'XXL - kjempe stor';
+$lang['xlarge'] = 'XL - veldig stort';
+$lang['xxlarge'] = 'XXL - kjempestort';
$lang['Original'] = 'Original';
$lang['Password: %s'] = 'Passord: %s';
$lang['Username: %s'] = 'Brukernavn: %s';
-$lang['Photo sizes'] = 'Bilde størrelser';
+$lang['Photo sizes'] = 'Bildestørrelser';
$lang['View in'] = 'Se bilde på';
$lang['Mobile'] = 'Mobil';
$lang['Desktop'] = 'Skrivebord';
@@ -384,10 +382,10 @@ $lang['Username or email'] = 'Brukernavn eller epost';
$lang['You will receive a link to create a new password via email.'] = 'Du får en link på epost for å lage nytt passord.';
$lang['Your password has been reset'] = 'Ditt passord har blitt endret.';
$lang['Your username has been successfully changed to : %s'] = 'Ditt brukernavn har blitt endret til: %s';
-$lang['Date created, new &rarr; old'] = 'Dato opprettet, nyest &rarr; eldst';
-$lang['Date created, old &rarr; new'] = 'Dato opprettet, eldst &rarr; nyest';
-$lang['Date posted, new &rarr; old'] = 'Dato publisert, nyest &rarr; eldst';
-$lang['Date posted, old &rarr; new'] = 'Dato publisert, eldst &rarr; nyest';
+$lang['Date created, new &rarr; old'] = 'Dato opprettet, nyeste &rarr; eldste';
+$lang['Date created, old &rarr; new'] = 'Dato opprettet, eldste &rarr; nyeste';
+$lang['Date posted, new &rarr; old'] = 'Dato publisert, nyeste &rarr; eldste';
+$lang['Date posted, old &rarr; new'] = 'Dato publisert, eldste &rarr; nyeste';
$lang['File name, A &rarr; Z'] = 'Filnavn, A &rarr; Ã…';
$lang['File name, Z &rarr; A'] = 'Filnavn, Ã… &rarr; A';
$lang['Manual sort order'] = 'Manuell sortering';
@@ -406,10 +404,18 @@ $lang['Page not found'] = 'Siden ikke funnet';
$lang['Permalink for album not found'] = 'Permalink for album ikke funnet';
$lang['Piwigo encountered a non recoverable error'] = 'Piwigo støtte på et problem som ikke kan gjenopprettes';
$lang['Requested album does not exist'] = 'Forespurt album finnes ikke';
-$lang['Requested tag does not exist'] = 'Forespurt tag finnes ikke';
-$lang['Email address is mandatory'] = 'Emailadresse er obligatorisk';
+$lang['Requested tag does not exist'] = 'Forespurt stikkord finnes ikke';
+$lang['Email address is mandatory'] = 'E-postadresse er obligatorisk';
$lang['Username is mandatory'] = 'Brukernavn er obligatorisk';
$lang['mandatory'] = 'obligatorisk';
$lang['Website'] = 'Nettside';
$lang['Your website URL is invalid'] = 'Adressen til nettsiden er feil';
+$lang['Email'] = 'Epost';
+$lang['First Page'] = 'Første side';
+$lang['Go back to the album'] = 'Tilbake til albumet';
+$lang['Last Page'] = 'Siste side';
+$lang['Password is missing. Please enter the password.'] = 'Passord mangler. Vennligst skriv passord.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Passord bekreftelse mangler. Vennligst bekreft det valgte passord.';
+$lang['%d photos per page'] = '%d bilder pr side';
+$lang['Theme'] = 'Tema';
?> \ No newline at end of file
diff --git a/language/nb_NO/index.php b/language/nb_NO/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/nb_NO/index.php
+++ b/language/nb_NO/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/nb_NO/install.lang.php b/language/nb_NO/install.lang.php
index 5883ff33c..57f4c8c63 100644
--- a/language/nb_NO/install.lang.php
+++ b/language/nb_NO/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -27,16 +27,12 @@ $lang['Default gallery language'] = 'Standard galleri språk';
$lang['Database configuration'] = 'Database konfigurasjon';
$lang['Admin configuration'] = 'Admin konfigurasjon';
$lang['Start Install'] = 'Start installasjon';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'mail addresse må være lik xxx@yyy.eee (eksempel : jack@altern.org)';
-$lang['Webmaster login'] = 'Webmaster innlogging';
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Det vil vises for besøkende. Det er nødvendig med side administrasjon';
$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Tilkobling til server er ok, men tilkobling til databasen er ikke mulig';
$lang['Can\'t connect to server'] = 'Kan ikke koble til server';
$lang['Host'] = 'Host';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
$lang['User'] = 'bruker (user)';
$lang['user login given by your host provider'] = 'bruker (user) innlogging gitt av din web tilbyder';
-$lang['Password'] = 'Passord';
$lang['user password given by your host provider'] = 'bruker (user) passord gitt av din web tilbyder';
$lang['Database name'] = 'Database navn';
$lang['also given by your host provider'] = 'også gitt av din web tilbyder';
@@ -45,12 +41,10 @@ $lang['database tables names will be prefixed with it (enables you to manage bet
$lang['enter a login for webmaster'] = 'skriv et brukernavn for webmaster';
$lang['webmaster login can\'t contain characters \' or "'] = 'webmasters brukernavn kan ikke inneholde tegn som \' eller "';
$lang['please enter your password again'] = 'vennligst skriv passord igjen';
-$lang['Webmaster password'] = 'Webmaster passord';
$lang['Keep it confidential, it enables you to access administration panel'] = 'Hold det hemmelig, dette gir deg tilgang til administrasjons panelet';
$lang['Password [confirm]'] = 'Passord [bekreft]';
$lang['verification'] = 'verifisering';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Trenger du hjelp? Still et spørsmål på <a href="%s">Piwigo message board</a>.';
-$lang['Webmaster mail address'] = 'Webmasters mail addresse';
$lang['Visitors will be able to contact site administrator with this mail'] = 'Besøkende vil kunne bruke denne mailen for å kontakte side administrator.';
$lang['PHP 5 is required'] = 'PHP 5 er nødvendig';
$lang['It appears your webhost is currently running PHP %s.'] = 'Det kan se ut som om din leverandør kjører PHP %s.';
@@ -66,9 +60,9 @@ $lang['An alternate solution is to copy the text in the box above and paste it i
$lang['Creation of config file local/config/database.inc.php failed.'] = 'Opprettelse av konfig fil local/config/database.inc.php feilet.';
$lang['Download the config file'] = 'Last ned konfig fil';
$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Du kan laste ned konfig filen og laste den opp til local/config mappen i din installasjon.';
-
$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Ikke nøl med å sjekke vårt forum for hjelp: %s';
$lang['Just another Piwigo gallery'] = 'Enda et Piwigo bildegalleri';
$lang['Welcome to my photo gallery'] = 'Velkommen til mitt bildegalleri';
$lang['Welcome to your new installation of Piwigo!'] = 'Velkommen til din nye installasjon av Piwigo!';
+$lang['localhost or other, supplied by your host provider'] = 'lokal tjener eller annen tjenesteleverandør';
?> \ No newline at end of file
diff --git a/language/nb_NO/iso.txt b/language/nb_NO/iso.txt
index 42ebfd000..7f8e8f58c 100644
--- a/language/nb_NO/iso.txt
+++ b/language/nb_NO/iso.txt
@@ -1 +1 @@
-Norwegian [NB]
+Norsk bokmål [NO] \ No newline at end of file
diff --git a/language/nb_NO/upgrade.lang.php b/language/nb_NO/upgrade.lang.php
index 2abd6debe..7d053af93 100644
--- a/language/nb_NO/upgrade.lang.php
+++ b/language/nb_NO/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/nl_NL/admin.lang.php b/language/nl_NL/admin.lang.php
index 096c698d6..f468297de 100644
--- a/language/nl_NL/admin.lang.php
+++ b/language/nl_NL/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -26,7 +26,7 @@ $lang['%d associations'] = '%d associaties';
$lang['%d album including'] = '%d album waarvan ';
$lang['%d albums including'] = '%d albums waarvan ';
$lang['%d physical'] = '%d fysiek';
-$lang[' and %d virtual'] = ' en %d virtueel';
+$lang[' and %d virtual'] = 'en %d virtueel';
$lang['%d album moved'] = '%d album verplaatst';
$lang['%d albums moved'] = '%d albums verplaatst';
$lang['%d group'] = '%d groep';
@@ -35,10 +35,10 @@ $lang['%d member'] = '%d lid';
$lang['%d members'] = '%d leden';
$lang['%d tag'] = '%d label';
$lang['%d tags'] = '%d labels';
-$lang['%d user comment rejected'] = '%d gebruikers commentaar afgewezen';
-$lang['%d user comments rejected'] = '%d gebruikers commentaren afgewezen';
-$lang['%d user comment validated'] = '%d gebruikers commentaar bevestigd';
-$lang['%d user comments validated'] = '%d gebruikers commentaren bevestigd';
+$lang['%d user comment rejected'] = '%d gebruikerscommentaar afgewezen';
+$lang['%d user comments rejected'] = '%d gebruikerscommentaren afgewezen';
+$lang['%d user comment validated'] = '%d gebruikerscommentaar bevestigd';
+$lang['%d user comments validated'] = '%d gebruikerscommentaren goedgekeurd';
$lang['%d user deleted'] = '%d gebruiker verwijderd';
$lang['%d users deleted'] = '%d gebruikers verwijderd';
$lang['%d user'] = '%d gebruiker';
@@ -58,7 +58,7 @@ $lang['Caddie management'] = 'Beheer verzamelmandje';
$lang['Caddie'] = 'Verzamelmandje';
$lang['Albums authorized thanks to group associations'] = 'Albums geautoriseerd dankzij groepassociaties';
$lang['Album manual order was saved'] = 'De handmatige sorteervolgorde is vastgelegd';
-$lang['Check for upgrade failed for unknown reasons.'] = 'Upgradecontrole is door onbekende reden niet (goed) uitgevoerd.';
+$lang['Check for upgrade failed for unknown reasons.'] = 'Upgradecontrole is om onbekende reden niet (goed) uitgevoerd.';
$lang['Check for upgrade'] = 'Upgradecontrole';
$lang['Comments for all'] = 'Iedereen mag commentaar geven (ook gasten)';
$lang['Current name'] = 'Huidige naam';
@@ -67,9 +67,9 @@ $lang['Deactivate'] = 'Deactiveer';
$lang['Delete Representant'] = 'Verwijder album-klikplaatje';
$lang['Delete selected tags'] = 'Verwijder de geselecteerde labels';
$lang['Delete selected users'] = 'Verwijder geselecteerde gebruikers';
-$lang['Deletions'] = 'Verwijderen';
-$lang['Deny selected groups'] = 'Verbiedt geselecteerde groepen';
-$lang['Deny selected users'] = 'Verbiedt geselecteerde gebruikers';
+$lang['Deletions'] = 'Verwijderingen';
+$lang['Deny selected groups'] = 'Verbied geselecteerde groepen';
+$lang['Deny selected users'] = 'Verbied geselecteerde gebruikers';
$lang['Description'] = 'Omschrijving';
$lang['Display options'] = 'Toon opties';
$lang['Dissociated'] = 'Niet gelinkt';
@@ -78,7 +78,7 @@ $lang['Edit selected tags'] = 'Bewerk de geselecteerde labels';
$lang['Edit tags'] = 'Bewerk labels';
$lang['Email admins when a new user registers'] = 'Stuur email naar administrators wanneer een nieuwe gebruiker zich heeft geregistreerd';
$lang['Email admins when a valid comment is entered'] = 'Stuur email naar administrators wannneer een geldig commentaar is ingevuld';
-$lang['Email admins when a comment requires validation'] = 'Stuur email naar administrators wanneer een commantaar gevavalideerd dient te worden';
+$lang['Email admins when a comment requires validation'] = 'Stuur email naar administrators wanneer een commentaar gevalideerd dient te worden';
$lang['Environment'] = 'Omgeving';
$lang['Form'] = 'Formulier';
$lang['Gallery title'] = 'Galerie-titel';
@@ -100,7 +100,7 @@ $lang['Manage permissions for group "%s"'] = 'Beheer rechten van groep "%s"';
$lang['Manage permissions for user "%s"'] = 'Beheer rechten van gebruiker "%s"';
$lang['Manage tags'] = 'Beheer labels';
$lang['Members'] = 'Leden';
-$lang['Metadata synchronized from file'] = 'Metadata gesynchroniseerd van een bestand';
+$lang['Metadata synchronized from file'] = 'Metadata gesynchroniseerd met bestand';
$lang['Move albums'] = 'Verplaats albums';
$lang['Move'] = 'Verplaatsen';
$lang['Name'] = 'Naam';
@@ -119,7 +119,7 @@ $lang['Parent album'] = 'Hoofd-album';
$lang['Path'] = 'Pad';
$lang['Permalink'] = 'Permalink';
$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'Permalink %s is eerder gebruikt door album %s. Verwijder eerst de permalink geschiedenis';
-$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'De permalinknaam moet bestaan uit a-z, A-Z, 0-9, "-" of "_". Het mag geen getal zijn of starten met een "-"';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'De permalinknaam moet bestaan uit a-z, A-Z, 0-9, "-", "_" of "/". Het mag geen getal zijn of starten met een cijfer met "-"';
$lang['Permalink %s is already used by album %s'] = 'Permalink %s is al in gebruik door album %s';
$lang['Permalink history'] = 'Permalink geschiedenis';
$lang['Permalinks'] = 'Permalinks';
@@ -134,7 +134,7 @@ $lang['Properties'] = 'Eigenschappen';
$lang['Random photo'] = 'Willekeurig plaatje';
$lang['Rate date'] = 'Waarderingsdatum';
$lang['Rating by guests'] = 'Ook gasten kunnen waarderen';
-$lang['Rating'] = 'Waardering';
+$lang['Rating'] = 'Waarderen';
$lang['Reject'] = 'Afwijzen';
$lang['Representant'] = 'Album-klikplaatje';
$lang['Representation of albums'] = 'Album-klikplaatje';
@@ -170,7 +170,7 @@ $lang['You are running on development sources, no check possible.'] = 'U werkt o
$lang['You cannot delete your account'] = "U kunt uw account niet verwijderen";
$lang['You cannot move an album in its own sub album'] = 'U kunt een album niet verplaatsen naar zijn eigen sub-album';
$lang['You need to confirm deletion'] = 'U moet de verwijdering bevestigen';
-$lang['Associate to album'] = 'Link aan album';
+$lang['Associate to album'] = 'Link naar album';
$lang['associate to group'] = 'Link aan groep';
$lang['Authorized'] = 'Toegestaan';
$lang['Add a virtual album'] = 'Voeg een virtueel album toe';
@@ -188,8 +188,7 @@ $lang['Access type'] = 'Toegangstype';
$lang['Information data registered in database'] = 'Informatie opgeslagen in de database';
$lang['Default display'] = 'Standaardweergave';
$lang['The gallery URL is not valid.'] = 'De URL van de galerie is niet correct.';
-$lang['Main'] = 'Index';
-$lang['The number of comments a page must be between 5 and 50 included.'] = 'Het aantal commentaren moet tussen 5 and 50 liggen.';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'Het aantal commentaren per pagina moet tussen 5 and 50 liggen.';
$lang['Configuration'] = 'Configuratie';
$lang['confirm'] = 'Bevestig';
$lang['Date'] = 'Datum';
@@ -206,7 +205,7 @@ $lang['global mode'] = 'Compact overzicht';
$lang['group "%s" added'] = 'groep "%s" toegevoegd';
$lang['group "%s" deleted'] = 'groep "%s" verwijderd';
$lang['group "%s" updated'] = 'groep "%s" bijgewerkt';
-$lang['The name of a group must not contain " or \' or be empty.'] = 'De naam van de groep mag geen spatie bevatten of leeg zijn.';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'De naam van de groep mag geen " of \' bevatten of leeg zijn.';
$lang['This name is already used by another group.'] = 'Deze naam is al in gebruik door een andere groep.';
$lang['High definition'] = 'Hoge kwaliteit (origineel)';
$lang['jump to album'] = 'Ga naar album';
@@ -217,12 +216,11 @@ $lang['Locked'] = 'Afgesloten';
$lang['manage album photos'] = 'Beheer album-foto\'s';
$lang['manage sub-albums'] = 'Beheer sub-albums';
$lang['Manage'] = 'Beheer';
-$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'Executie tijd is om, afhandeling moet verder gaan [Verwachte tijd: %d seconden].';
-$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'Verwachte tijd voor de gebruikerslijst voor een mailing is gelimiteerd. Andere gebruikers staan niet op de lijst.';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'Uitvoerings-tijd is om, de afhandeling moet verder gaan [Geschatte tijd: %d seconden].';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'De tijd om de gebruikerslijst voor een mailing samen te stellen is gelimiteerd. De overige gebruikers staan niet op de lijst.';
$lang['Time to send mail is limited. Others mails are skipped.'] = 'Tijd om email te sturen is gelimiteerd. Andere emailtjes worden overgeslagen.';
$lang['To send ?'] = 'aan sturen ?';
$lang['Last send'] = 'Laatst sturen';
-$lang['email'] = 'email';
$lang['User'] = 'Gebruiker';
$lang['See you soon,'] = 'Tot ziens op onze webpagina,';
$lang['Go to'] = 'Ga naar ';
@@ -250,7 +248,7 @@ $lang['%d mail was not sent.'] = '%d email is niet verstuurd.';
$lang['%d mails were not sent.'] = '%d emails zijn niet verstuurd.';
$lang['No mail to send.'] = 'Geen email om te versturen.';
$lang['There is no available subscribers to mail.'] = 'Geen gebruikers om email te sturen.';
-$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'Een gebruiker is beschikbaar, er zijn nieuwe foto\'s te melden.';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'Gebruikers worden alleen weergegeven indien er nieuwe foto\'s zijn te melden.';
$lang['Anyway only webmasters can see this tab and never administrators.'] = 'Hoe dan ook, alleen webbeheerders kunnen dit tabblad zien, de administrators niet.';
$lang['No user to send notifications by mail.'] = 'Geen gebruikers om meldingen te ontvangen per email.';
$lang['New photos added'] = 'Nieuwe foto\'s toegevoegd';
@@ -281,7 +279,7 @@ $lang['%d users were updated.'] = '%d gebruikers zijn bijgewerkt.';
$lang['User %s [%s] was not removed from the subscription list.'] = 'Gebruiker %s [%s] is niet verwijderd van de inschrijvingslijst.';
$lang['User %s [%s] was not added to the subscription list.'] = 'Gebruiker %s [%s] is niet toegevoegd aan de inschrijvingslijst.';
$lang['User %s [%s] added.'] = 'Gebruiker %s [%s] toegevoegd.';
-$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'Waarschuwing: in/uitschrijven zal een email versturen naar de gebruiker';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'Waarschuwing: in/uitschrijven zal een email versturen naar de gebruikers';
$lang['Send mail on HTML format'] = 'Stuur email in HTML formaat';
$lang['Include display of recent photos grouped by dates'] = 'Inclusief het vertonen van recente foto\'s gegroepeerd op datum';
$lang['Available only with HTML format'] = 'Alleen beschikbaar in HTML formaat';
@@ -294,7 +292,7 @@ $lang['Purge sessions'] = 'Verwijder sessies';
$lang['randomly represented'] = 'willekeurig album-klikplaatje';
$lang['registration date'] = 'Registratiedatum';
$lang['clean'] = 'opschonen';
-$lang['Create this site'] = 'maak deze site';
+$lang['Create this site'] = 'Maak deze site';
$lang['test'] = 'test';
$lang['test this remote site'] = 'test deze remote site';
$lang['remove tags'] = 'Verwijder labels';
@@ -313,16 +311,16 @@ $lang['update the database from files'] = 'werk de database bij vanuit bestanden
$lang['status'] = 'Status';
$lang['Directory'] = 'Map';
$lang['sub-albums'] = 'Sub-album';
-$lang['Synchronize metadata'] = 'synchroniseer metadata';
+$lang['Synchronize metadata'] = 'Synchroniseer metadata';
$lang['target'] = 'Doel';
$lang['Thumbnail'] = 'Klikplaatje';
$lang['Title'] = 'Titel';
-$lang['Album list management'] = 'Albumlijst beheer';
+$lang['Album list management'] = 'Albumlijstbeheer';
$lang['Piwigo configuration'] = 'Piwigo configuratie';
$lang['Edit album'] = 'Bewerk album';
$lang['Group management'] = 'Groepsbeheer';
$lang['User list'] = 'Gebruikerslijst';
-$lang['Edit photo information'] = 'Verander de informatie van een plaatje';
+$lang['Edit photo information'] = 'Verander de informatie van een foto';
$lang['Database synchronization with files'] = 'Database synchronisatie met bestanden';
$lang['all'] = 'Allen';
$lang['height must be a number superior to'] = 'Hoogte moet groter zijn dan';
@@ -341,34 +339,34 @@ $lang['unset'] = 'Niet ingesteld';
$lang['Update albums informations'] = 'Album-informatie bijwerken';
$lang['Update photos information'] = 'Foto-informatie bijwerken';
$lang['Synchronize'] = 'Synchroniseer';
-$lang['reduce to single existing albums'] = 'naar een enkel bestaand album terugbrengen';
+$lang['reduce to single existing albums'] = 'In één enkel album zoeken:';
$lang['Choose an option'] = 'Kies een optie';
$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'toon maximale informatie (toegevoegde albums en foto\'s, verwijderde albums en foto\'s)';
$lang['Error list'] = 'Foutenlijst';
-$lang['Errors caption'] = 'Foutmeldingen afvangen';
+$lang['Errors caption'] = 'Foutmeldingen';
$lang['Detailed informations'] = 'Gedetailleerde informatie';
$lang['File/directory read error'] = 'Bestand/map lees fout';
-$lang['albums deleted in the database'] = 'Uit de database verwijderde albums';
+$lang['albums deleted in the database'] = 'albums uit de database verwijderd';
$lang['photos deleted from the database'] = 'foto\'s verwijderd uit de database';
-$lang['photos candidates for metadata synchronization'] = 'mogelijke foto\'s waarvan de metadata gesynchroniseerd zou kunnen worden';
+$lang['photos candidates for metadata synchronization'] = 'foto\'s waarvan de metadata gesynchroniseerd zou kunnen worden';
$lang['photos informations synchronized with files metadata'] = 'foto-informatie gesynchroniseerd met bestandsmetadata';
-$lang['errors during synchronization'] = 'fouten tijdens synchronisatie';
+$lang['errors during synchronization'] = 'fouten tijdens de synchronisatie';
$lang['albums added in the database'] = 'albums toegevoegd aan de database';
$lang['photos added in the database'] = 'foto\'s toegevoegd aan de database';
$lang['photos updated in the database'] = 'foto\'s bijgewerkt in de database';
$lang['Search for new images in the directories'] = 'Zoek naar nieuwe foto\'s in de mappen';
$lang['added'] = 'wordt toegevoegd';
$lang['deleted'] = 'verwijderd';
-$lang['Metadata synchronization results'] = 'Metadata synchronisatie resultaten';
+$lang['Metadata synchronization results'] = 'Metadata synchronisatie-resultaten';
$lang['only perform a simulation (no change in database will be made)'] = 'alleen een simulatie uitvoeren (er worden geen veranderingen aangebracht in de database)';
$lang['Simulation'] = 'Simulatie';
$lang['directories + files'] = 'mappen + bestanden';
$lang['only directories'] = 'alleen mappen';
-$lang['synchronize files structure with database'] = 'Synchroniseer bestanden met de database';
-$lang['synchronize files metadata with database photos informations'] = 'Synchroniseer bestandsmetadata met de database foto-informatie';
-$lang['even already synchronized photos'] = 'ook reeds synchroniseerde foto\'s';
+$lang['synchronize files structure with database'] = 'Synchroniseer bestandenstructuur met de database';
+$lang['synchronize files metadata with database photos informations'] = 'Synchroniseer de databasefoto\'s met de bestandsmetadata';
+$lang['even already synchronized photos'] = 'ook reeds gesynchroniseerde foto\'s';
$lang['Used metadata'] = 'Gebruikte metadata';
-$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'De naam van de mappen en bestanden moeten bestaan uit letters, "-", "_" of "."';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'De naam van mappen en bestanden moeten bestaan uit letters, cijfers, "-", "_" of "."';
$lang['wrong filename'] = 'verkeerde bestandsnaam';
$lang['Upload'] = 'Upload';
$lang['user "%s" added'] = 'gebruiker "%s" toegevoegd';
@@ -390,9 +388,9 @@ $lang['Day'] = 'Dag';
$lang['Pages seen'] = 'Pagina\'s bekeken';
$lang['Time'] = 'tijd';
$lang['IP'] = 'IP';
-$lang['Element'] = '';
+$lang['Element'] = 'Element';
$lang['Section'] = 'sectie';
-$lang['An information email was sent to group "%s"'] = 'Een informatie email is verstuurd naar de groep "%s"';
+$lang['An information email was sent to group "%s"'] = 'Een informatie-email is verstuurd naar de groep "%s"';
$lang['Send an information email to group members'] = 'Stuur een informatie email naar groepsleden';
$lang['Group'] = 'Groep';
$lang['[%s] Visit album %s'] = '[%s] Bezoek album %s';
@@ -407,7 +405,7 @@ $lang['Element type'] = 'Element-type';
$lang['Image id'] = 'Afbeeldings id';
$lang['Summary'] = 'Overzicht';
$lang['%d line filtered'] = '%d regel gefilterd';
-$lang['%d lines filtered'] = '%d regels filterd';
+$lang['%d lines filtered'] = '%d regels gefilterd';
$lang['%d guest'] = '%d gast';
$lang['%d guests'] = '%d gasten';
$lang['Hour'] = 'Uur';
@@ -421,28 +419,28 @@ $lang['Check integrity'] = 'Controleer integriteit';
$lang['Anomaly'] = 'Onregelmatigheid';
$lang['Correction'] = 'Correctie';
$lang['Automatic correction'] = 'Automatische correctie';
-$lang['Impossible automatic correction'] = 'Onmogelijke automatische correctie';
+$lang['Impossible automatic correction'] = 'Automatische correctie onmogelijk';
$lang['Correction applied with success'] = 'Correctie die met succes is toegepast';
$lang['Correction applied with error'] = 'Correctie die met fout wordt toegepast';
$lang['%d anomaly has been detected.'] = '%d onregelmatigheid ontdekt.';
$lang['%d anomalies have been detected.'] = '%d onregelmatigheden ontdekt.';
-$lang['%d anomaly has been corrected.'] = '%d onregelmatigheid is gecorrigeerd.';
+$lang['%d anomaly has been corrected.'] = '%d onregelmatigheid zijn gecorrigeerd.';
$lang['%d anomalies have been detected corrected.'] = '%d onregelmatigheden die zijn gecorrigeerd.';
-$lang['%d anomaly has not been corrected.'] = '%d onregelmatigheid ontdekt is niet gecorrigeerd.';
+$lang['%d anomaly has not been corrected.'] = '%d onregelmatigheid is niet gecorrigeerd.';
$lang['%d anomalies have not been corrected.'] = '%d onregelmatigheden zijn niet gecorrigeerd.';
$lang['Go to %s or %s for more informations'] = 'Ga naar %s of %s voor meer informatie';
$lang['the forum'] = 'het forum';
$lang['the wiki'] = 'de wiki';
-$lang['%s value is not correct file because exif are not supported'] = '%s waarde is niet een correct bestand omdat exif niet ondersteund wordt';
+$lang['%s value is not correct file because exif are not supported'] = '%s waarde is niet correct omdat exif niet ondersteund wordt';
$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s moet aangepast worden naar false in uw local/config/config.inc.php bestand';
$lang['Main "guest" user does not exist'] = 'Hoofd "gast" gebruiker bestaat niet meer';
$lang['Main "guest" user status is incorrect'] = 'Hoofd "gast" gebruikersstatus is niet correct';
-$lang['Default user does not exist'] = 'Standaard gebruiker bestaat niet meer';
+$lang['Default user does not exist'] = 'Standaard gebruiker bestaat niet';
$lang['Main "webmaster" user does not exist'] = 'De Hoofd "webbeheerder" bestaat niet';
$lang['Main "webmaster" user status is incorrect'] = 'De status van de Hoofd "webbeheerder" is niet correct';
-$lang['User "%s" created with "%s" like password'] = 'Gebruiker "%s" gemaakt met wachtwoord "%s" ';
+$lang['User "%s" created with "%s" like password'] = 'Gebruiker "%s" aangemaakt met wachtwoord "%s" ';
$lang['Status of user "%s" updated'] = 'Status van de gebruiker "%s" is bijgewerkt';
-$lang['add new photos to caddie'] = 'Voeg nieuwe foto\'s toe aan verzamelmandje';
+$lang['add new photos to caddie'] = 'voeg nieuwe foto\'s toe aan verzamelmandje';
$lang['No display'] = 'Geen weergave';
$lang['Classic display'] = 'Klassieke weergave';
$lang['Hoverbox display'] = 'Hoverbox weergave';
@@ -455,37 +453,37 @@ $lang['Level 2'] = 'Vrienden';
$lang['Level 4'] = 'Familie';
$lang['Level 8'] = 'Admins';
$lang['Reinitialize check integrity'] = 'Herinitialiseer de integriteitscontrole';
-$lang['Check all'] = 'Selecteer alles';
+$lang['Check all'] = 'Controleer alles';
$lang['Uncheck all'] = 'Deselecteer alles';
-$lang['Check automatic corrections'] = 'Controleer de aoutomatische correcties';
+$lang['Check automatic corrections'] = 'Controleer de automatische correcties';
$lang['Apply selected corrections'] = 'Pas geselecteerde correcties toe';
$lang['Ignore selected anomalies'] = 'Negeer geselecteerde onregelmatigheden';
$lang['Refresh'] = 'Ververs';
$lang['The anomaly will be ignored until next application version'] = 'De onregelmatigheid wordt genegeerd tot de volgende versie';
$lang['%d anomaly has been ignored.'] = '%d onregelmatigheid wordt genegeerd.';
-$lang['%d anomalies have been ignored.'] = '%d onregelmatigheden worden genegeerd.';
+$lang['%d anomalies have been ignored.'] = '%d onregelmatigheden zijn genegeerd.';
$lang['Plugins which need upgrade'] = 'Plugins welke bijgewerkt moeten worden';
$lang['Plugin list'] = 'Plugin lijst';
$lang['Check for updates'] = 'Controleer op updates';
$lang['Other plugins'] = 'Andere plugins';
$lang['Last revisions'] = 'Lastste revisie';
-$lang['Are you sure you want to delete this plugin?'] = 'Weet U het zeker dat u deze plugin wilt verwijderen?';
-$lang['Are you sure you want to install this plugin?'] = 'Weet U het zeker dat u deze plugin wilt installeren?';
-$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Weet U het zeker dat u deze plugin wilt bijwerken? U moet controleren of deze versie niet gedeinstaleerd moet worden.';
+$lang['Are you sure you want to delete this plugin?'] = 'Weet U zeker dat u deze plugin wilt verwijderen?';
+$lang['Are you sure you want to install this plugin?'] = 'Weet U zeker dat u deze plugin wilt installeren?';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Weet U zeker dat u deze plugin wilt bijwerken? U moet controleren of deze versie niet eerst gedeïnstalleerd moet worden.';
$lang['Plugin has been successfully copied'] = 'Plugin is succesvol gekopieerd';
$lang['You might go to plugin list to install and activate it.'] = 'U zou naar de plugin-lijst kunnen gaan om de plugin te installeren en te activeren.';
$lang['Can\'t create temporary file.'] = 'Kan geen tijdelijk bestand maken.';
$lang['Can\'t download archive.'] = 'Kan geen archief downloaden.';
$lang['Can\'t read or extract archive.'] = 'Kan het archief niet lezen of uitpakken.';
-$lang['An error occured during extraction (%s).'] = 'Een fout is opgetreden tijdens het uitpakken (%s).';
+$lang['An error occured during extraction (%s).'] = 'Een fout is opgetreden tijdens het uitpakken van de bestanden (%s).';
$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'Controleer de "plugins" folder en de sub-folders rechten/attributen (CHMOD).';
$lang['Can\'t connect to server.'] = 'Verbinding met server niet mogelijk.';
$lang['Purge compiled templates'] = 'Verwijder samengestelde sjablonen';
$lang['Support'] = 'Piwigo Forum';
$lang['Documentation'] = 'Documentatie';
$lang['ACCESS_0'] = 'Vrije toegang';
-$lang['ACCESS_1'] = 'Toegang tot alles';
-$lang['ACCESS_2'] = 'Toegang tot geabonneerde';
+$lang['ACCESS_1'] = 'Toegang voor iedereen';
+$lang['ACCESS_2'] = 'Toegang voor geregistreerde gebruikers';
$lang['ACCESS_3'] = 'Toegang voor administrators';
$lang['ACCESS_4'] = 'Toegang voor webbeheerders';
$lang['ACCESS_5'] = 'Geen toegang';
@@ -540,27 +538,27 @@ $lang['Allow users to edit their own comments'] = 'Sta toe dat gebruikers hun ei
$lang['Allow users to delete their own comments'] = 'Sta toe dat gebruikers hun eigen commentaar kunnen verwijderen';
$lang['Email administrators when a comment is modified'] = 'Stuur email naar de administrators wanneer een commentaar is gewijzigd';
$lang['Email administrators when a comment is deleted'] = 'Stuur email naar de administrators wanneer een commentaar is verwijderd';
-$lang['Cannot delete the old permalink !'] = 'De oude permalink kan niet verwijderd worden !';
+$lang['Cannot delete the old permalink !'] = 'De oude permalink kan niet verwijderd worden!';
$lang['Hit'] = 'Hit';
$lang['Tools'] = 'Hulpmiddelen';
$lang['Photos'] = 'Foto\'s';
$lang['Themes'] = 'Thema\'s';
$lang['Instructions to use Piwigo'] = 'Piwigo Gebruiks-instructies';
$lang['Installed Themes'] = 'Geïnstalleerde thema\'s';
-$lang['Add New Theme'] = 'Nog niet geïnstaleerde thema\'s';
+$lang['Add New Theme'] = 'Nog niet geïnstalleerde thema\'s';
$lang['Forbid this theme to users'] = 'Dit thema mag niet door gebruikers gebruikt worden';
-$lang['Set as default theme for unregistered and new users'] = 'Standaard thema voor niet geregisteerde and nieuwe gebruikers';
+$lang['Set as default theme for unregistered and new users'] = 'Standaard thema voor niet geregisteerde en nieuwe gebruikers';
$lang['unknown'] = 'onbekend';
-$lang['Upload Photos'] = 'Upload Foto\'s';
+$lang['Upload Photos'] = 'Upload foto\'s';
$lang['Drop into album'] = 'Selecteer een album';
-$lang['+ Add an upload box'] = 'Voeg een upload-regel toe';
+$lang['+ Add an upload box'] = 'Voeg een lege upload-regel toe';
$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Maak de "%s" directory aan vanuit de root van uw Piwigo-installatie';
$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Geef schrijfrechten (chmod 777) aan de "%s" directory vanuit de root van uw piwigo installatie';
$lang['existing album'] = 'Bestaand album';
$lang['create a new album'] = 'Maak een nieuw album aan';
$lang['Album name'] = 'Albumnaam';
$lang['Album "%s" has been added'] = 'Album "%s" is toegevoegd';
-$lang['Uploaded Photos'] = 'Ge-uploade Foto\'s';
+$lang['Uploaded Photos'] = 'Ge-uploade foto\'s';
$lang['%d photos uploaded'] = '%d foto\'s ge-uploaded';
$lang['Privacy level set to "%s"'] = 'Privacy-niveau staat nu op "%s"';
$lang['Album "%s" now contains %d photos'] = 'Album "%s" bevat nu %d foto\'s';
@@ -577,13 +575,13 @@ $lang['Image Quality'] = 'Afbeeldingskwaliteit';
$lang['Save Settings'] = 'Bewaar instellingen';
$lang['Your configuration settings are saved'] = 'Uw configuratie-instellingen zijn opgeslagen';
$lang['Active Themes'] = 'Actieve Thema\'s';
-$lang['Add write access to the "%s" directory'] = 'Geef de "%s" directorie schrijfbevoegdheden';
+$lang['Add write access to the "%s" directory'] = 'Geef de "%s" directory schrijfbevoegdheden';
$lang['Administration Home'] = 'Administratie Startpagina';
$lang['Change Admin Colors'] = 'Wijzig de Admin-kleuren';
$lang['Delete this theme'] = 'Verwijder dit thema';
-$lang['Directory does not exist'] = 'Directorie bestaat niet';
+$lang['Directory does not exist'] = 'Map bestaat niet';
$lang['Download,'] = 'Download,';
-$lang['FTP + Synchronization'] = 'FTP + Synchronisatie';
+$lang['FTP + Synchronization'] = 'Via FTP + Synchronisatie';
$lang['Get Support on Piwigo Forum'] = 'Zoek/Krijg ondersteuning op het Piwigo gebruikers-forum';
$lang['Help Me'] = 'Help';
$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'Het is niet mogelijk dit thema te activeren, het basis-thema ontbreekt: %s';
@@ -619,7 +617,7 @@ $lang['Invert'] = 'Inverteer';
$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Dit thema kan niet gedeactiveerd worden. Er moet minstens één thema geactiveerd zijn.';
$lang['Webmaster status is required.'] = 'De status van de webbeheerder is noodzakelijk.';
$lang['Bound Theme'] = 'Gebonden Thema';
-$lang['Allow rating'] = 'Waarderings-optie inschakelen';
+$lang['Allow rating'] = 'Waardering toestaan';
$lang['Select at least one comment'] = 'Minstens een commentaar selecteren';
$lang['Active Plugins'] = 'Actieve Plugins';
$lang['Inactive Plugins'] = 'Niet actieve Plugins';
@@ -643,7 +641,7 @@ $lang['There is no other language available.'] = 'Er is geen andere taal beschik
$lang['There is no other plugin available.'] = 'Er is geen andere plugin beschikbaar.';
$lang['There is no other theme available.'] = 'Er is geen andere thema beschikbaar.';
$lang['Add another set of photos'] = 'Een andere set foto\'s toevoegen';
-$lang['By rank'] = 'Op rank';
+$lang['By rank'] = 'Op rang';
$lang['Manual order'] = 'Handmatige volgorde';
$lang['Order of menubar items has been updated successfully.'] = 'De volgorde van menu-items is succesvol aangepast.';
$lang['This theme was not designed to be directly activated'] = 'Dit thema is niet ontworpen om direct geactiveerd te worden';
@@ -698,7 +696,7 @@ $lang['include child albums'] = 'inclusief sub albums';
$lang['Album photos associated to the following albums: %s'] = 'Album-foto\'s verbonden met de volgende albums: %s';
$lang['Delete orphan tags'] = 'Verwijder niet gebruikte labels';
$lang['delete photo'] = 'verwijder foto';
-$lang['Orphan tags deleted'] = 'Verwijderde niet gebruikte labels';
+$lang['Orphan tags deleted'] = 'Niet gebruikte labels verwijderd';
$lang['Remove from caddie'] = 'Verwijder uit verzamelmandje';
$lang['Week starts on'] = 'De week begint op';
$lang['You have %d orphan tags: %s.'] = 'U heeft %d niet gebruikte labels: %s.';
@@ -717,18 +715,18 @@ $lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'DEZE PLUGIN I
$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'FOUT: DEZE PLUGIN MIST MAAR IS GEINSTALEERD! DEINSTALLEER DE PLUGIN NU.';
$lang['Thumbnails generation in progress...'] = 'Bezig met genereren van klikplaatjes...';
$lang['Photos generation in progress...'] = 'Bezig met genereren foto\'s...';
-$lang['%s photos have been regenerated'] = '%s foto\'s zijn hergegenereerd.';
-$lang['%s photos can not be regenerated'] = '%s foto\'s konden niet opnieuw gegenereerd worden.';
+$lang['%s photos have been regenerated'] = '%s foto\'s zijn opnieuw gegenereerd.';
+$lang['%s photos can not be regenerated'] = '%s foto\'s kunnen niet opnieuw gegenereerd worden';
$lang['display'] = 'toon';
$lang['new'] = 'nieuw';
$lang['No results'] = 'Geen resultaten';
$lang['Searching...'] = 'Bezig met zoeken...';
$lang['Type in a search term'] = 'Type een zoekterm in';
-$lang['Activate icon "new" next to albums and pictures'] = 'Activeer "nieuw" pictogram naast albums en afbeeldingen';
+$lang['Activate icon "new" next to albums and pictures'] = 'Activeer "nieuw" icoon naast albums en afbeeldingen';
$lang['Deactivate all'] = 'Deactiveer alles';
$lang['Default photos order'] = 'Standaard foto volgorde';
$lang['Restore'] = 'Herstel';
-$lang['Restore default configuration. You will lose your plugin settings!'] = 'Herstel de standaard instellingen. Je zal alle plugin instellingen kwijtraken!';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'Herstel de standaard instellingen. U zult alle plugin instellingen kwijtraken!';
$lang['Show menubar'] = 'Toon menubalk';
$lang['Updates'] = 'Updates';
$lang['Update in progress... Please wait.'] = 'Bezig met updaten... Even geduld aub';
@@ -767,13 +765,13 @@ $lang['Average rate'] = 'Gemiddelde waardering';
$lang['Rate'] = 'Waardering';
$lang['Learn more'] = 'Leer meer';
$lang['An error has occured during upgrade.'] = 'Er is iets foutgegaan bij het bijwerken van Piwigo naar de nieuwste versie.';
-$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Er is iets foutgegaan bij het uitpakken. Controleer de bestands-rechten/attributen van uw Piwigo installatie.<br><a href="%s">Klik kier om de fout-logging weer te geven</a>.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Er is iets foutgegaan bij het uitpakken. Controleer de bestands-rechten/attributen van uw Piwigo installatie.<br><a href="%s">Klik hier om de fout-logging weer te geven</a>.';
$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo kan het upgrade-bestand niet van de server verkrijgen';
$lang['... or '] = '... of ';
$lang['Create'] = 'Aanmaken';
$lang['Start Upload'] = 'Start Upload';
-$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Je gebruikt de Flash uploader. Problemen? Probeer de <a href="%s">Browser uploader</a> inplaats.';
-$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Je gebruikt de Browser uploader. Problemen? Probeer de <a href="%s">Flash uploader</a> inplaats.';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'U gebruikt de Flash uploader. Problemen? Probeer de <a href="%s">Browser uploader</a> inplaats.';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'U gebruikt de Browser uploader. Problemen? Probeer de <a href="%s">Flash uploader</a> inplaats.';
$lang['Maximum file size: %sB.'] = 'Maximum bestands omvang: %sB.';
$lang['Allowed file types: %s.'] = 'Toegestane bestands typen: %s.';
$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Geschatte maximale resolutie: %dM pixels (dat is %dx%d pixels).';
@@ -790,7 +788,7 @@ $lang['No destination tag selected'] = 'Geen bestemmings-label geselecteerd';
$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Labels <em>%s</em> samengevoegd in label <em>%s</em>';
$lang['Select at least two tags for merging'] = 'Selecteer ten minste twee labels om samen te voegen';
$lang['Select an album'] = 'Kies een album';
-$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'Standaard zal Piwigo een nieuwe web formaat foto aanmaken van de HD (high definition / originele) versie van je foto.';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'Standaard zal Piwigo een nieuwe web formaat foto aanmaken van de HD (high definition / originele) versie van uw foto.';
$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'Als geen HD beschikbaar is en de huidige web formaat foto is groter dan de nieuwe afmetingen, dan zal Piwigo het als HD gebruiken en daar een web formaat foto van maken.';
$lang['Zoom'] = 'Zoom';
$lang['%s has been successfully updated.'] = '%s is geupdated.';
@@ -802,8 +800,8 @@ $lang['With no album'] = 'Zonder album';
$lang['With no tag'] = 'Zonder label';
$lang['With no virtual album'] = 'Zonder virtueel album';
$lang['Photo name'] = 'Foto-naam';
-$lang['Activate comments'] = 'Activeer onderschriften';
-$lang['Default comments order'] = 'Standaard onderschriften volgorde';
+$lang['Activate comments'] = 'Activeer commentaar';
+$lang['Default comments order'] = 'Standaard commentaar volgorde';
$lang['Send connection settings by email'] = 'Verstuur verbindings-instellingen per email';
$lang['The original image quality must be a number between %d and %d'] = 'De originele foto-kwaliteit moet een nummer zijn tussen %d en %d';
$lang['The original maximum height must be a number between %d and %d'] = 'De originele maximum grootte moet een nummer zijn tussen %d en %d';
@@ -822,7 +820,7 @@ $lang['registered users'] = 'geregistreerde gebruikers';
$lang['administrators'] = 'Administrators';
$lang['This album contains %d photos, added on %s.'] = 'Dit album bevat %d foto\'s, toegevoegd op %s.';
$lang['This album contains %d photos, added between %s and %s.'] = 'Dit album bevat %d foto\'s, toegevoegd tussen %s en %s.';
-$lang['This album contains no photo.'] = 'Dit album bevat geen afbeelsingen.';
+$lang['This album contains no photo.'] = 'Dit album bevat geen afbeeldingen.';
$lang['Not cropped correctly?'] = 'Niet goed bijgesneden?';
$lang['Center of interest'] = 'Middelpunt van belangstelling';
$lang['Move to album'] = 'Verplaats naar album';
@@ -830,8 +828,8 @@ $lang['You can activate only one mobile theme.'] = 'U kunt slechts een mobiel th
$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = 'De <em>Piwigo voor Android</em> applicatie stelt u in staat uw Piwigo galerie te openen vanaf uw Android-telefoon of tablet, een aantal albums aan te maken en meerdere foto\'s tegelijk te uploaden.';
$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = '<em>Piwigo voor IOS</em> applicatie stelt u in staat uw Piwigo galerie te openen vanaf uw iPhone, iPad of iPod Touch, een aantal albums aan te maken en meerdere foto\'s tegelijk te uploaden.';
$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Photoshop Lightroom is fotografie-software ontworpen om grote hoeveelheden digitale foto\'s te verwerken en voor het verrichten van post-productie werk.';
-$lang['Applications'] = 'Toepassingen';
-$lang['apply automatic sort order'] = 'automatische sorteervolgorde toepassen';
+$lang['Applications'] = 'Via toepassingen';
+$lang['apply automatic sort order'] = 'Automatische sorteervolgorde toepassen';
$lang['Automatic sort order'] = 'Automatische sorteervolgorde';
$lang['Available on'] = 'Beschikbaar voor';
$lang['Available versions for'] = 'Beschikbare versies voor';
@@ -846,13 +844,13 @@ $lang['Save manual order'] = 'Bewaar handmatige volgorde';
$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell is een open source digitale foto organizer die draait op Linux. Het is de standaard foto-manager in Ubuntu en Fedora.';
$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'Het bestand of de map kan niet worden geopend (of het bestaat niet of de toegang wordt geweigerd)';
$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'Met de Piwigo Publish plugin kunt u foto\'s direct vanuit Lightroom naar uw Piwigo fotogalerie exporteren en synchroniseren.';
-$lang['Web Form'] = 'webformulier';
-$lang['%u users have automatic permission because they belong to a granted group.'] = '%u gebruikers hebben automatisch recht, omdat ze tot een groep behoren die deze rechten is verleend';
-$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture is een krachtig gereedschap om foto\'s te te beheren en verbeteren op een Mac .';
-$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture is gemaakt voor proferssionele fotografen met iPhoto gemak.';
+$lang['Web Form'] = 'Via webformulier';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '%u gebruikers hebben automatisch recht, omdat ze tot een groep behoren die dit recht is verleend';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture is een krachtig gereedschap om grote hoeveelheden foto\'s te beheren en te verbeteren op een Mac .';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture is gemaakt voor professionele fotografen met iPhoto gemak.';
$lang['Apply watermark if height is bigger than'] = 'Breng watermerk aan, als de hoogte groter is dan';
$lang['Apply watermark if width is bigger than'] = 'Breng watermerk aan, als de breedte groter is dan';
-$lang['By default, the center of interest is placed in the middle of the photo.'] = 'Standaard, is het centrum van belangstelling in het midden van de foto geplaatst';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = 'Standaard is het centrum van belangstelling in het midden van de foto geplaatst';
$lang['Delete multiple size images'] = 'Verwijder meerdere formaat plaatjes';
$lang['Features include gallery browsing, album creation and photo upload.'] = 'Kenmerken omvatten galerie browsen, album maken en foto\'s uploaden.';
$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = 'Voor bijgesneden fotoformaten, probeert Piwigo het centrum van belangstelling in te voegen. ';
@@ -886,7 +884,7 @@ $lang['bottom left corner'] = 'hoek links onder';
$lang['bottom right corner'] = 'hoek rechts onder';
$lang['custom'] = 'Aangepast';
$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam is een gratis geavanceerde digitale foto beheersoftware voor Linux, Windows en MacOSX. ';
-$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam is voor fotografen die foto\'s willen bekijken, beheren, bewerken en delen. ';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam is voor fotografen die foto\'s willen bekijken, beheren, bewerken, labelen en delen. ';
$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto is de standaard foto-manager onder MacOSX. De Piwigo export plugin maakt het aanmaken van albums en het exporteren van foto\'s mogelijk, van iPhoto naar de Piwigo galerie';
$lang['include photos with lower privacy level'] = 'Inclusief foto\'s met een lager rechten niveau ';
$lang['middle'] = 'midden';
@@ -920,20 +918,17 @@ $lang[' and %d virtuals'] = 'en %d virtueel';
$lang['%d physicals'] = '%d fysiek';
$lang['%d week'] = '%d week';
$lang['%d weeks'] = '%d weken';
-$lang['Edit photo'] = 'foto aanpassen';
+$lang['Edit photo'] = 'Foto aanpassen';
$lang['create a new site'] = 'Maak een nieuwe site';
$lang['No order field selected'] = 'Geen volgordeveld geselecteerd';
$lang['Duplicate selected tags'] = 'Dupliceer de geselecteerde labels';
$lang['Name of the duplicate'] = 'Naam van het duplicaat';
-$lang['Source tag'] = 'bron-label';
+$lang['Source tag'] = 'Bron-label';
$lang['Tag "%s" is now a duplicate of "%s"'] = 'Label "%s" is nu een duplicaat van "%s"';
$lang['Manage photos'] = 'Foto\'s beheren';
$lang['View in gallery'] = 'Bekijk in galerie';
-$lang['Format'] = 'Formaat';
$lang['Ratio'] = 'Verhouding';
$lang['Landscape'] = 'Landschap';
-$lang['Maximum'] = 'Maximum';
-$lang['Minimum'] = 'Minimum';
$lang['Minimum height'] = 'Minimum hoogte';
$lang['Minimum width'] = 'Minimum breedte';
$lang['Number of albums per page'] = 'Aantal albums per pagina';
@@ -952,4 +947,32 @@ $lang['This group will be set to default'] = 'Deze groep zal standaard worden ge
$lang['This group will be unset to default'] = 'Deze groep zal niet langer als standaard worden gebruikt';
$lang['Type here the name of the new group'] = 'Voer de naam in van de nieuwe groep';
$lang['Purge user cache'] = 'Verwijder gebruikers-cache';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'De afmetingen van de afbeelding zullen worden verlaagd naar %dx%d pixels.';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'Omdat GD als grafische bibliotheek (graphic library) wordt gebruikt, is het formatteren van afbeeldingen na het uploaden geblokkeerd';
+$lang['Basic settings'] = 'Basisinstellingen';
+$lang['General'] = 'Algemeen';
+$lang['Mail theme'] = 'Mail-thema';
+$lang['Select at least one tag'] = 'Op zijn minst één label kiezen';
+$lang['Loading...'] = 'Wordt geladen...';
+$lang['(filtered from %s total users)'] = '(gefilterd van %s totaal aantal gebruikers)';
+$lang['User %s added'] = 'Gebruiker %s toegevoegd';
+$lang['User %s updated'] = 'Gebruiker %s gwijzigd';
+$lang['on the %d selected users'] = 'aan de %d geselecteerde gebruikers';
+$lang['Users modified'] = 'Gebruikers veranderd';
+$lang['Showing %s to %s of %s users'] = 'Geef %s weer aan %s van de %s gebruikers';
+$lang['Update user'] = 'Werk de gebruiker bij';
+$lang['No matching user found'] = 'Geen overeenkomende gebruikers gevonden';
+$lang['No user selected of %d users'] = 'Geen gebruiker geselecteerd van de %d gebruikers';
+$lang['No user selected, no action possible.'] = 'Geen gebruiker geselecteerd, geen actie mogelijk';
+$lang['Registered on %s, %s.'] = 'Geregistreerd op %s, %s.';
+$lang['Show %s users'] = 'Geef %s gebruikers weer';
+$lang['Change username'] = 'Verander gebruikersnaam';
+$lang['Last visit on %s, %s.'] = 'Laatste bezoek op %s, %s.';
+$lang['Password updated'] = 'Wachtwoord aangepast';
+$lang['%d of %d users selected'] = '%d van %d gebruikers geselecteerd';
+$lang['All %d users are selected'] = 'Alle %d gebruikers zijn geselecteerd';
+$lang['Change password'] = 'Verander wachtwoord';
+$lang['Close user details'] = 'Sluit gebruikersdetails';
+$lang['Open user details'] = 'Open gebruikersdetails';
+$lang['close'] = 'Sluit';
?> \ No newline at end of file
diff --git a/language/nl_NL/common.lang.php b/language/nl_NL/common.lang.php
index c305c058c..d055cf5ba 100644
--- a/language/nl_NL/common.lang.php
+++ b/language/nl_NL/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Nederlands [NL]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=429
Author: Piwigo team
Author URI: http://piwigo.org
@@ -51,10 +51,10 @@ $lang['%d new photos'] = '%d nieuwe foto\'s';
$lang['%d new user'] = '%d nieuwe gebruiker';
$lang['%d new users'] = '%d nieuwe gebruikers';
$lang['About'] = 'Over';
-$lang['All tags'] = 'Alle label';
-$lang['Any tag'] = 'Elk label';
+$lang['All tags'] = 'Alle labels';
+$lang['Any tag'] = 'Een van de labels';
$lang['At least one listed rule must be satisfied.'] = 'Op zijn minst moet aan één regel worden voldaan.';
-$lang['Author'] = 'Fotograaf/Maker';
+$lang['Author'] = 'Naam';
$lang['Albums'] = 'Albums';
$lang['Album'] = 'Album';
$lang['Close this window'] = 'Sluit dit venster';
@@ -70,8 +70,8 @@ $lang['Current password is wrong'] = 'Huidig wachtwoord is niet juist';
$lang['Dimensions'] = 'Dimensies';
$lang['Display'] = 'Weergeven';
$lang['Each listed rule must be satisfied.'] = 'Aan elke weergegeven regel moet worden voldaan.';
-$lang['Email address is missing. Please specify an email address.'] = 'Email-adres is niet ingevuld';
-$lang['Email address'] = 'Email-adres';
+$lang['Email address is missing. Please specify an email address.'] = 'Emailadres is niet ingevuld.';
+$lang['Email address'] = 'Emailadres';
$lang['Enter your personnal informations'] = 'Vul uw persoonlijke informatie in';
$lang['Error sending email'] = 'Fout bij het versturen van email';
$lang['File name'] = 'Bestandsnaam';
@@ -80,7 +80,7 @@ $lang['Filesize'] = 'Bestandsgrootte';
$lang['Filter and display'] = 'Filteren en tonen';
$lang['Filter'] = 'Filter';
$lang['Forgot your password?'] = 'Wachtwoord vergeten?';
-$lang['Go through the gallery as a visitor'] = 'Ga naar de galerie als gast';
+$lang['Go through the gallery as a visitor'] = 'Bekijk de galerie als gast';
$lang['Help'] = 'Help';
$lang['Identification'] = 'Identificatie';
$lang['Photos only RSS feed'] = 'Alleen RSS feed mbt foto\'s';
@@ -125,7 +125,7 @@ $lang['add this photo to your favorites'] = 'Voeg deze foto toe aan uw favoriete
$lang['Administration'] = 'Beheer';
$lang['all'] = 'alle';
$lang['ascending'] = 'Oplopend';
-$lang['author(s) : %s'] = 'Fotogra(a)f(en)/Maker(s) : %s';
+$lang['author(s) : %s'] = 'Naam/Namen: %s';
$lang['Expand all albums'] = 'Toon alle albums';
$lang['posted after %s (%s)'] = 'geplaatst na %s (%s)';
$lang['posted before %s (%s)'] = 'geplaatst voor %s (%s)';
@@ -141,7 +141,7 @@ $lang['chronology_monthly_calendar'] = 'Maand-kalender';
$lang['chronology_monthly_list'] = 'Maand-lijst';
$lang['chronology_weekly_list'] = 'Week-lijst';
$lang['Click here if your browser does not automatically forward you'] = 'Klik hier als uw browser u niet doorstuurt';
-$lang['comment date'] = 'Commentaar-datum';
+$lang['comment date'] = 'Commentaardatum';
$lang['Comment'] = 'Commentaar';
$lang['Your comment has been registered'] = 'Uw commentaar is geregistreerd';
$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Anti-flood systeem : u moet even wachten voordat u weer een nieuw commentaar kunt plaatsen';
@@ -155,7 +155,7 @@ $lang['created before %s (%s)'] = 'Gemaakt voor %s (%s)';
$lang['created between %s (%s) and %s (%s)'] = 'Gemaakt tussen %s (%s) en %s (%s)';
$lang['created on %s'] = 'gemaakt op %s';
$lang['Customize'] = 'Profiel aanpassen';
-$lang['Your Gallery Customization'] = 'Uw galerie aanpassen ';
+$lang['Your Gallery Customization'] = 'Uw galerie aanpassingen ';
$lang['day'][0] = 'Zondag';
$lang['day'][1] = 'Maandag';
$lang['day'][2] = 'Dinsdag';
@@ -244,23 +244,22 @@ $lang['Please, enter a login'] = 'Vul uw gebruikersnaam in aub.';
$lang['login mustn\'t end with a space character'] = 'Gebruikersnaam mag niet eindigen met een spatie';
$lang['login mustn\'t start with a space character'] = 'Gebruikersnaam mag niet beginnen met een spatie';
$lang['this login is already used'] = 'Deze gebruikersnaam is al in gebruik';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'email-adres moet zijn xxx@yyy.eee (bijvoorbeeld : jack@altern.org)';
-$lang['please enter your password again'] = 'vul uw wachtwoord nogmaals in';
-$lang['Auto login'] = 'Auto login';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'emailadres moet het formaat xxx@yyy.eee hebben (bijvoorbeeld : jack@altern.org)';
+$lang['Auto login'] = 'Automtisch aanmelden';
$lang['remove this tag from the list'] = 'Verwijder dit label uit de lijst';
-$lang['representative'] = 'album klikplaatje';
-$lang['Search for Author'] = 'Zoek naar fotograaf/maker';
+$lang['representative'] = 'album-klikplaatje';
+$lang['Search for Author'] = 'Zoeken naar auteur';
$lang['Search in albums'] = 'Zoeken in albums';
$lang['Search by date'] = 'Zoeken op datum';
$lang['Date'] = 'Begindatum';
$lang['End-Date'] = 'Einddatum';
$lang['Kind of date'] = 'Welke datum ?';
-$lang['Search for words'] = 'Zoek naar hele woorden';
-$lang['Search for all terms'] = 'Zoeken naar alle woorden';
-$lang['Search for any term'] = 'Zoeken naar een woord';
+$lang['Search for words'] = 'Zoeken naar woorden met';
+$lang['Search for all terms'] = 'Moet al deze woorden bevatten';
+$lang['Search for any term'] = 'Moet één van deze woorden bevatten';
$lang['Empty query. No criteria has been entered.'] = 'Lege zoekopdracht. Er is niets ingevuld.';
$lang['Search results'] = 'Zoekresultaten';
-$lang['Search in sub-albums'] = 'Zoeken in sub-sub-albums';
+$lang['Search in sub-albums'] = 'Ook zoeken in sub-albums';
$lang['searched words : %s'] = 'zoekwoorden : %s';
$lang['Contact'] = 'Contact';
$lang['set as album representative'] = 'Stel in als album-klikplaatje';
@@ -273,7 +272,6 @@ $lang['SQL queries in'] = 'SQL queries in';
$lang['display only recently posted photos'] = 'Toon alleen de recent geplaatste foto\'s';
$lang['return to the display of all photos'] = 'Toon alle foto\'s';
$lang['the beginning'] = 'het begin';
-$lang['Interface theme'] = 'Thema';
$lang['Thumbnails'] = 'Klikplaatjes';
$lang['Menu'] = 'Menu';
$lang['A comment on your site'] = 'Commentaar op uw site';
@@ -285,7 +283,7 @@ $lang['Quick search'] = 'Snel zoeken';
$lang['Connected user: %s'] = 'Aangemeld als gebruiker: %s';
$lang['IP: %s'] = 'IP: %s';
$lang['Browser: %s'] = 'Browser: %s';
-$lang['Author: %s'] = 'Fotograaf/Maker: %s';
+$lang['Author: %s'] = 'Naam: %s';
$lang['Comment: %s'] = 'Commentaar: %s';
$lang['Comment by %s'] = 'Commentaar van %s';
$lang['User: %s'] = 'Gebruiker: %s';
@@ -294,7 +292,7 @@ $lang['Admin: %s'] = 'Beheerder: %s';
$lang['Registration of %s'] = 'Registratie van %s';
$lang['Album: %s'] = 'Album: %s';
$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Foutieve status voor gebruiker "guest", gebruik standaard status. Waarschuw de webbeheerder.';
-$lang['this email address is already in use'] = 'Een andere gebruiker maakt al gebruik van dit email-adres';
+$lang['this email address is already in use'] = 'Een andere gebruiker maakt al gebruik van dit emailadres';
$lang['Album results for'] = 'Album resultaten voor';
$lang['Tag results for'] = 'Label-resultaten voor';
$lang['from %s to %s'] = 'van %s tot %s';
@@ -316,7 +314,7 @@ $lang['photos posted during the last %d days'] = 'Foto\'s de afgelopen %d dagen
$lang['Piwigo Help'] = 'Piwigo Help';
$lang['Are you sure?'] = 'Weet u het zeker?';
$lang['Rank'] = 'Rang';
-$lang['group by letters'] = 'gegroepeerd per letter';
+$lang['group by letters'] = 'Gegroepeerd per letter';
$lang['letters'] = 'letters';
$lang['show tag cloud'] = 'Geef label-wolk weer';
$lang['cloud'] = 'wolk';
@@ -338,24 +336,24 @@ $lang['This author removed the comment with id %d'] = 'Deze bewerker verwijderde
$lang['html tags are not allowed in login'] = 'html tags zijn niet toegestaan in login';
$lang['%d rates'] = '%d stemmen';
$lang['Rating score'] = 'Waarderings score';
-$lang['Invalid username or email'] = 'Gebruikersnaam of e-mailadres is ongeldig';
-$lang['Password reset is not allowed for this user'] = 'Deze gebruiker heeft geen toestemming om het paswoord te vernieuwen';
-$lang['User "%s" has no email address, password reset is not possible'] = 'Gebruiker "%s" heeft geen e-mailadres daarom kan het paswoord niet vernieuwd worden';
-$lang['Someone requested that the password be reset for the following user account:'] = 'Iemand heeft verzocht om het paswoord te vernieuwen voor het volgende account:';
+$lang['Invalid username or email'] = 'Gebruikersnaam of emailadres is ongeldig';
+$lang['Password reset is not allowed for this user'] = 'Deze gebruiker heeft geen toestemming om het wachtwoord te vernieuwen';
+$lang['User "%s" has no email address, password reset is not possible'] = 'Gebruiker "%s" heeft geen emailadres, daarom kan het wachtwoord niet vernieuwd worden';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Iemand heeft verzocht om het wachtwoord te vernieuwen voor het volgende account:';
$lang['Username "%s" on gallery %s'] = 'Gebruikersnaam "%s" voor galerie %s';
-$lang['To reset your password, visit the following address:'] = 'Om je paswoord te vernieuwen kun je het volgende adres bezoeken:';
-$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Als dit een vergissing was kun je deze e-mail negeren, er zal dan niets gewijzigd worden.';
-$lang['Password Reset'] = 'Vernieuw paswoord';
-$lang['Check your email for the confirmation link'] = 'Kijk in je mail box voor de bevestigings link';
+$lang['To reset your password, visit the following address:'] = 'Om uw wachtwoord te vernieuwen kunt u het volgende adres bezoeken:';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Als dit een vergissing was, kunt u deze email negeren. Er zal dan niets gewijzigd worden.';
+$lang['Password Reset'] = 'Vernieuw wachtwoord';
+$lang['Check your email for the confirmation link'] = 'Kijk in uw email box voor de bevestigings-link';
$lang['Invalid key'] = 'Onjuiste sleutel';
-$lang['The passwords do not match'] = 'De paswoorden zijn niet gelijk';
-$lang['Your password has been reset'] = 'Uw paswoord is vernieuwd';
+$lang['The passwords do not match'] = 'De wachtwoorden zijn niet gelijk';
+$lang['Your password has been reset'] = 'Uw wachtwoord is vernieuwd';
$lang['Return to home page'] = 'Keer terug naar de home page';
-$lang['Please enter your username or email address.'] = 'Voer je gebruikersnaam en e-mailadres in.';
-$lang['You will receive a link to create a new password via email.'] = 'Via e-mail krijgt u een link om uw paswoord te vernieuwen.';
-$lang['Username or email'] = 'Gebruikersnaam of e-mail';
-$lang['Change my password'] = 'Vernieuw mijn paswoord';
-$lang['Enter your new password below.'] = 'Voer hieronder je nieuwe paswoord in.';
+$lang['Please enter your username or email address.'] = 'Geef uw gebruikersnaam en emailadres in.';
+$lang['You will receive a link to create a new password via email.'] = 'U ontvangt via email een link om uw wachtwoord te vernieuwen.';
+$lang['Username or email'] = 'Gebruikersnaam of email';
+$lang['Change my password'] = 'Vernieuw mijn wachtwoord';
+$lang['Enter your new password below.'] = 'Geef hieronder uw nieuwe wachtwoord in.';
$lang['EXIF Metadata'] = 'EXIF Metagegevens';
$lang['IPTC Metadata'] = 'IPTC Metagegevens';
$lang['Edit'] = 'Wijzig';
@@ -369,7 +367,7 @@ $lang['xlarge'] = 'extra-groot';
$lang['xxlarge'] = 'extra-extra-groot';
$lang['Hello %s,'] = 'Hallo %s,';
$lang['Here are your connection settings'] = 'Dit zijn uw verbindings-instellingen';
-$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Indien u denkt dat er iets niet klopt nu u deze email ontvangt, vragen wij u contact met ons op te nemen op %s ';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Indien u denkt dat er iets niet klopt nu u deze email ontvangt, vragen wij u contact met ons op te nemen via %s ';
$lang['Password: %s'] = 'Wachtwoord %s';
$lang['Send my connection settings by email'] = 'Verstuur mijn verbindings-instellingen per email';
$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'U bent succesvol geregistreerd. U ontvangt op korte termijn een email met uw verbindings-instellingen. Welkom!';
@@ -379,7 +377,7 @@ $lang['Username: %s'] = 'Gebruikersnaam %s';
$lang['Your username has been successfully changed to : %s'] = 'Uw gebruikersnaam is succesvol gewijzigd in: %s';
$lang['Show oldest comments first'] = 'Toon oudste commentaren eerst';
$lang['Show latest comments first'] = 'Toon nieuwste commentaren eerst';
-$lang['Photo sizes'] = 'Foto-groottes';
+$lang['Photo sizes'] = 'Fotoformaat';
$lang['View in'] = 'Bekijk in';
$lang['Mobile'] = 'Mobiel';
$lang['Desktop'] = 'Bureaublad';
@@ -408,9 +406,24 @@ $lang['Permalink for album not found'] = 'Permalink van dit album niet gevonden'
$lang['Piwigo encountered a non recoverable error'] = 'Piwigo heeft een onherstelbare fout ondervonden';
$lang['Requested album does not exist'] = 'Het opgevraagde album bestaat niet';
$lang['Requested tag does not exist'] = 'Het opgevraagde label bestaat niet';
-$lang['Email address is mandatory'] = 'Email adres is verplicht';
+$lang['Email address is mandatory'] = 'Emailadres is verplicht';
$lang['Username is mandatory'] = 'Gebruikersnaam is verplicht';
$lang['mandatory'] = 'verplicht';
$lang['Website'] = 'Website';
$lang['Your website URL is invalid'] = 'De URL van deze website is ongeldig';
+$lang['day']['0'] = 'zondag';
+$lang['day']['1'] = 'maandag';
+$lang['day']['2'] = 'dinsdag';
+$lang['day']['3'] = 'woensdag';
+$lang['day']['4'] = 'donderdag';
+$lang['day']['5'] = 'vrijdag';
+$lang['day']['6'] = 'zaterdag';
+$lang['Email'] = 'Email';
+$lang['First Page'] = 'Eerste bladzijde';
+$lang['Go back to the album'] = 'Ga terug naar het album';
+$lang['Last Page'] = 'Laatste bladzijde';
+$lang['Password is missing. Please enter the password.'] = 'Wachtwoord ontbreekt. Geef uw wachtwoord aub.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Wachtwoord-bevestiging ontbreekt. Bevestig aub het gekozen wachtwoord.';
+$lang['%d photos per page'] = '%d foto\'s per pagina';
+$lang['Theme'] = 'Thema';
?> \ No newline at end of file
diff --git a/language/nl_NL/help/index.php b/language/nl_NL/help/index.php
index 10b477c03..c8de97f60 100644
--- a/language/nl_NL/help/index.php
+++ b/language/nl_NL/help/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2009 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/nl_NL/index.php b/language/nl_NL/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/nl_NL/index.php
+++ b/language/nl_NL/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/nl_NL/install.lang.php b/language/nl_NL/install.lang.php
index f699f53c9..22a95bc39 100644
--- a/language/nl_NL/install.lang.php
+++ b/language/nl_NL/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -27,16 +27,12 @@ $lang['Default gallery language'] = 'Standaard galerie-taal';
$lang['Database configuration'] = 'Database-configuratie';
$lang['Admin configuration'] = 'Admin configuratie';
$lang['Start Install'] = 'Start Installatie';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'Email-adres moet lijken op xxx@yyy.eee (voorbeeld : jack@altern.org)';
-$lang['Webmaster login'] = 'Login webbeheerder';
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Het wordt getoond aan de bezoekers. Het is ook noodzakelijk voor de administratie van de website';
$lang['Connection to server succeed, but it was impossible to connect to database'] = 'De verbinding met de server is geslaagd, maar het is niet mogelijk om verbinding te krijgen met de database';
$lang['Can\'t connect to server'] = 'Geen verbinding met de server';
$lang['Host'] = 'MySQL host';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
$lang['User'] = 'Gebruiker';
$lang['user login given by your host provider'] = 'De gebruikersnaam welke door uw provider is gegeven';
-$lang['Password'] = 'Wachtwoord';
$lang['user password given by your host provider'] = 'Wachtwoord welke door uw provider is gegeven';
$lang['Database name'] = 'Database-naam';
$lang['also given by your host provider'] = 'Ook deze is door uw provider gegeven';
@@ -45,12 +41,10 @@ $lang['database tables names will be prefixed with it (enables you to manage bet
$lang['enter a login for webmaster'] = 'Geef een gebruikersnaam voor de beheerder';
$lang['webmaster login can\'t contain characters \' or "'] = 'De gebruikersnaam mag geen \' of " bevatten';
$lang['please enter your password again'] = 'Vul a.u.b. nogmaals uw wachtwoord in';
-$lang['Webmaster password'] = 'Wachtwoord webbeheerder';
-$lang['Keep it confidential, it enables you to access administration panel'] = 'Hou dit vertrouwlijk, het geeft toegang tot de beheermodule';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'Hou dit vertrouwelijk, het geeft toegang tot de beheermodule';
$lang['Password [confirm]'] = 'Bevestig wachtwoord';
$lang['verification'] = 'verificatie';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Hulp nodig ? Stel uw vraag op het <a href="%s" target="_blank">Piwigo forum</a>.';
-$lang['Webmaster mail address'] = 'Email-adres van de webbeheerder';
$lang['Visitors will be able to contact site administrator with this mail'] = 'Met dit email-adres kunnen bezoekers contact opnemen met de beheerder';
$lang['PHP 5 is required'] = 'PHP 5 is vereist';
$lang['It appears your webhost is currently running PHP %s.'] = 'Het lijkt er op dat uw webhost momenteel gebruik maakt van PHP %s.';
@@ -62,7 +56,7 @@ $lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo kon PHP 5 niet config
$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Neem contact op met de support van uw hosting provider en probeer met hen te bepalen hoe u kunt omschakelen naar PHP 5.';
$lang['Hope to see you back soon.'] = 'Hoop u snel weer te zien op deze site !.';
$lang['Congratulations, Piwigo installation is completed'] = 'Gefeliciteerd, de Piwigo installatie is afgerond';
-$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Als alternatieve oplossing kunt de tekst in de bovenstaande box kopieren en plakken in bestand "local/config/database.inc.php" (Opgelet : in database.inc.php mag alleen datgene staan dat in het tekstgebied staat, geen return- of spatie-tekens)';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Als alternatieve oplossing kunt u de tekst in de bovenstaande box kopiëren en plakken in bestand "local/config/database.inc.php" (Opgelet : in database.inc.php mag alleen datgene staan dat in het tekstgebied staat, geen return- of spatie-tekens)';
$lang['Creation of config file local/config/database.inc.php failed.'] = 'Het aanmaken van config-bestand local/config/database.inc.php is mislukt.';
$lang['Download the config file'] = 'Download het config-bestand';
$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'U kunt het config-bestand downloaden en het uploaden naar de local/config directory van uw Piwigo-installatie.';
@@ -70,4 +64,5 @@ $lang['Just another Piwigo gallery'] = 'Alweer een Piwigo galerie';
$lang['Welcome to my photo gallery'] = 'Welkom bij mijn foto galerie';
$lang['Welcome to your new installation of Piwigo!'] = 'Welkom bij uw nieuwe installatie van Piwigo!';
$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Aarzel niet om onze forum\'s te raadplegen voor hulp: %s';
+$lang['localhost or other, supplied by your host provider'] = 'localhost of andere, geleverd door uw provider';
?> \ No newline at end of file
diff --git a/language/nl_NL/upgrade.lang.php b/language/nl_NL/upgrade.lang.php
index 0d46eefc6..4bde42f4e 100644
--- a/language/nl_NL/upgrade.lang.php
+++ b/language/nl_NL/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/nn_NO/about.html b/language/nn_NO/about.html
new file mode 100644
index 000000000..ba72a6e1f
--- /dev/null
+++ b/language/nn_NO/about.html
@@ -0,0 +1,12 @@
+<p>Dette fotogalleriet er basera på Piwigo.</p>
+
+<p>Piwigo er eit fotogalleri for bruk på web, uvikla av eit aktivt miljø av brukarar og utviklarar. Tilleggsverktøy gjer at Piwigo lett kan tilpassast til eigne ynskje. Og på toppen av det heile, Piwigo er gratis og har åpen kildekode.</p>
+
+<p id="linkToPiwigo"><a href="http://piwigo.org">Besøk nettsida til Piwigo</a></p>
+
+<p> Omsetjinga til nynorsk blir vedlikehalden av (i alfabetisk rekkefylge):
+ <ul>
+ <li><a href="http://piwigo.org/forum/profile.php?id=18893">kiho</a></li>
+ </ul>
+ .... mange takk!
+</p> \ No newline at end of file
diff --git a/language/nn_NO/admin.lang.php b/language/nn_NO/admin.lang.php
new file mode 100755
index 000000000..e689feeb7
--- /dev/null
+++ b/language/nn_NO/admin.lang.php
@@ -0,0 +1,972 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['... or '] = '... eller';
+$lang['ACCESS_0'] = 'Fri tilgang';
+$lang['ACCESS_5'] = 'Ingen tilgang';
+$lang['%d users were updated.'] = '%d brukarar oppdatera';
+$lang['%d user comments rejected'] = '%d brukarkommentarar avvist';
+$lang['%d user comments validated'] = '%d brukarkommentarar godkjend';
+$lang['%d user deleted'] = '%d brukar sletta';
+$lang['%d user was not updated.'] = '%d brukar er ikkje oppdatera';
+$lang['%d user was updated.'] = '%d brukar oppdatera';
+$lang['%d users'] = '%d brukarar';
+$lang['%d users deleted'] = '%d brukarar sletta';
+$lang['%d users were not updated.'] = '%d brukarar er ikkje oppdatera';
+$lang['%d photos were deleted'] = '%d bilete sletta';
+$lang['%d second'] = '%d sekund';
+$lang['%d seconds'] = '%d sekundar';
+$lang['%d tag'] = '%d stikkord';
+$lang['%d tags'] = '%d stikkord';
+$lang['%d user'] = '%d brukar';
+$lang['%d user comment rejected'] = '%d brukarkommentar avvist';
+$lang['%d user comment validated'] = '%d brukarkommentarar godkjend';
+$lang['%d guest'] = '%d gjest';
+$lang['%d guests'] = '%d gjester';
+$lang['%d hour'] = '%d time';
+$lang['%d hours'] = '%d timar';
+$lang['%d member'] = '%d medlem';
+$lang['%d members'] = '%d medlemer';
+$lang['%d minute'] = '%d minutt';
+$lang['%d minutes'] = '%d minuttar';
+$lang['%d month'] = '%d månad';
+$lang['%d months'] = '%d månader';
+$lang['%d photo was deleted'] = '%d bilete sletta';
+$lang['wrong filename'] = 'feil filnamn';
+$lang['Add detailed content'] = 'Legg til detaljera innhald';
+$lang['Add group'] = 'Legg til gruppe';
+$lang['Add tags'] = 'Legg til stikkord';
+$lang['Add to caddie'] = 'Legg til "caddie"';
+$lang['Add/delete a permalink'] = 'Legg til/fjern ei permalenke';
+$lang['Added by %s'] = 'Lagt til av %s';
+$lang['Administration Home'] = 'Startside for administrasjon';
+$lang['Advanced features'] = 'Avansera funksjonar';
+$lang['Album "%s" has been added'] = 'Albumet %s er oppdatera';
+$lang['Album "%s" now contains %d photos'] = 'Albumet %s inneheld nå %d bilete';
+$lang['Album list management'] = 'Albumliste handtering';
+$lang['Album manual order was saved'] = 'Manuell sortering av albumet er lagra';
+$lang['Album name'] = 'Albumnamn';
+$lang['Activate Navigation Bar'] = 'Legg til navigeringsmeny';
+$lang['Activate Navigation Thumbnails'] = 'Aktiver miniatyrbilete for navigering';
+$lang['Activate comments'] = 'Aktiver kommentarar';
+$lang['Activate icon "%s"'] = 'Aktiver ikon "%s"';
+$lang['Activate icon "new" next to albums and pictures'] = 'Aktiver ikon "ny" ved sida av album og bilete';
+$lang['Active Languages'] = 'Aktive språk';
+$lang['Active Plugins'] = 'Aktive tilleggsprogram';
+$lang['Active Themes'] = 'Aktive tema';
+$lang['Add'] = 'Legg til';
+$lang['Add New Language'] = 'Legg til nytt språk';
+$lang['Add New Theme'] = 'Legg til nytt tema';
+$lang['Add Photos'] = 'Legg til bilete';
+$lang['Add a criteria'] = 'Legg til reglar';
+$lang['Add a filter'] = 'Legg til filter';
+$lang['Add a tag'] = 'Legg til stikkord';
+$lang['Add a user'] = 'Legg til brukar';
+$lang['Add a virtual album'] = 'Legg til eit virtuelt album';
+$lang['Add another set of photos'] = 'Legg til eit anna set med bilete';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s må bli sett til usann (false) i fila local/config/config.inc.php';
+$lang['%s photos can not be regenerated'] = '%d bilete kan ikkje bli bygd opp att';
+$lang['%s photos have been regenerated'] = '%d bilete kan ikkje bli bygd opp att';
+$lang['%s value is not correct file because exif are not supported'] = '%s er feil avdi exif ikkje er støtta';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '%d brukarar har automatisk tilgang avdi dei høyrer til ei gruppe med løyve.';
+$lang['(this tag will be deleted)'] = '(dette stikkordet vil bli sletta)';
+$lang['+ Add an upload box'] = '+ Legg til ein opplastingsboks';
+$lang[', click on'] = ', klikk på';
+$lang['A locked gallery is only visible to administrators'] = 'Eit låst galleri er bare synleg for administratorar';
+$lang['A new version of Piwigo is available.'] = 'Ein ny version av Piwigo er tilgjengeleg';
+$lang['ACCESS_1'] = 'Tilgang til alt';
+$lang['ACCESS_2'] = 'Tilgang til registrera brukarar';
+$lang['ACCESS_3'] = 'Tilgang til administratorar';
+$lang['ACCESS_4'] = 'Tilgang til webmaster';
+$lang['Access type'] = 'Tilgangstype';
+$lang['Action'] = 'Handling';
+$lang['Actions'] = 'Handlingar';
+$lang['Activate'] = 'Aktiver';
+$lang['%d line filtered'] = '%d line filtrera';
+$lang['%d lines filtered'] = '%d liner filtrera';
+$lang['%d mail was not sent.'] = '%d e-post har ikkje blitt sendt.';
+$lang['%d mail was sent.'] = '%d e-post har blitt sendt.';
+$lang['%d mails were not sent.'] = '%d e-postar har ikkje blitt sendt.';
+$lang['%d mails were sent.'] = '%d e-postar har blitt sendt.';
+$lang['%d of %d photos selected'] = '%d av %d bilete er vald';
+$lang['%d parameter was updated.'] = '%d eigenskap er oppdatera.';
+$lang['%d parameters were updated.'] = '%d eigenskapar er oppdatera.';
+$lang['%d photos uploaded'] = '%d bilete er lasta opp';
+$lang['%d physical'] = '%d fysisk';
+$lang['%d physicals'] = '%d fysisk';
+$lang['%d waiting for validation'] = '%d ventar på godkjenning';
+$lang['%d week'] = '%d veke';
+$lang['%d weeks'] = '%d veker';
+$lang['%d year'] = '%d år';
+$lang['%d years'] = '%d år';
+$lang['%s ago'] = '%s sidan';
+$lang['%s has been successfully updated.'] = '%s har blitt vellykka oppdatera.';
+$lang['%s in the future'] = '%s i framtida';
+$lang[' and %d virtual'] = 'og %d virtuell';
+$lang[' and %d virtuals'] = 'og %d virtuelle';
+$lang['%d album including'] = '%d album inkludera ';
+$lang['%d album moved'] = '%d album er flytta';
+$lang['%d albums including'] = '%d album inkludera';
+$lang['%d albums moved'] = '%d album er flytta';
+$lang['%d anomalies have been detected corrected.'] = '%d feil har blitt oppdaga og retta opp.';
+$lang['%d anomalies have been detected.'] = '%d feil har blitt oppdaga.';
+$lang['%d anomalies have been ignored.'] = '%d feil har blitt ignorera.';
+$lang['%d anomalies have not been corrected.'] = '%d feil har ikkje blitt retta opp.';
+$lang['%d anomaly has been corrected.'] = '%d feil har blitt retta opp.';
+$lang['%d anomaly has been detected.'] = '%d feil har blitt oppdaga.';
+$lang['%d anomaly has been ignored.'] = '%d feil har blitt ignorera.';
+$lang['%d anomaly has not been corrected.'] = '%d feil har ikkje blitt retta opp.';
+$lang['%d association'] = '%d tilknytning';
+$lang['%d associations'] = '%d tilknytningar';
+$lang['%d day'] = '%d dag';
+$lang['%d days'] = '%d dagar';
+$lang['%d group'] = '%d gruppe';
+$lang['%d groups'] = '%d grupper';
+$lang['albums deleted in the database'] = 'album fjerna frå databasen';
+$lang['all'] = 'alle ';
+$lang['an error happened'] = 'det oppstod ein feil';
+$lang['and'] = 'og';
+$lang['automatic order'] = 'automatisk sortering';
+$lang['average time'] = 'gjennomsnittleg tid';
+$lang['between'] = 'mellom';
+$lang['between %.2f and %.2f'] = 'mellom %.2f og %.2f';
+$lang['between %d and %d pixels'] = 'mellom %d og %d biletpunkt (pikslar)';
+$lang['bottom left corner'] = 'nedre venstre hjørne';
+$lang['bottom right corner'] = 'nedre høgre hjørne';
+$lang['cancel manual order'] = 'nullstill manuell sortering';
+$lang['clean'] = 'rydd opp';
+$lang['confirm'] = 'stadfest';
+$lang['create a new album'] = 'lag nytt album';
+$lang['create a new site'] = 'lag ny nettside';
+$lang['created'] = 'oppretta';
+$lang['default'] = 'standard';
+$lang['default values'] = 'standardverdiar';
+$lang['delete'] = 'fjern';
+$lang['delete album'] = 'fjern album';
+$lang['delete photo'] = 'fjern bilete';
+$lang['delete this site and all its attached elements'] = 'fjern denne nettsida og all informasjon knytt til denne';
+$lang['deleted'] = 'fjerna';
+$lang['directories + files'] = 'katalogar + filer';
+$lang['display'] = 'vis';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'vis maksimal informasjon (album og bilete lagt til eller sletta';
+$lang['errors during synchronization'] = 'feil under synkronisering';
+$lang['existing album'] = 'eksisterande album';
+$lang['first photo added on %s'] = 'fyrste bilete lagt til %s';
+$lang['group "%s" added'] = 'gruppe "%s" er lagt til';
+$lang['group "%s" deleted'] = 'gruppe "%s" er fjerna';
+$lang['group "%s" updated'] = 'gruppe "%s" er oppdatera';
+$lang['guest'] = 'gjest';
+$lang['height must be a number superior to'] = 'høgde må vera ei tal større enn';
+$lang['hide details'] = 'gøym detaljar';
+$lang['high'] = 'høg';
+$lang['include child albums'] = 'inkluder underalbum';
+$lang['include photos with lower privacy level'] = 'includer bilete med lågare personverninnstillingar';
+$lang['jump to album'] = 'hopp til ablum';
+$lang['jump to photo'] = 'hopp til bilete';
+$lang['manage album photos'] = 'handter albumbilete';
+$lang['manage sub-albums'] = 'handter underalbum';
+$lang['manual order'] = 'manuell stortering';
+$lang['middle'] = 'midten';
+$lang['modified'] = 'endra';
+$lang['new'] = 'ny';
+$lang['no write access'] = 'ikkje rett til å skrive';
+$lang['none'] = 'ingen';
+$lang['nothing'] = 'ingenting';
+$lang['number of miniaturized photos'] = 'antal miniatyrbilete oppretta';
+$lang['on'] = 'på';
+$lang['only directories'] = 'bare katalogar';
+$lang['other'] = 'anna';
+$lang['photos added in the database'] = 'bilete lagt til i databasen';
+$lang['photos deleted from the database'] = 'bilete fjerna frå databasen';
+$lang['photos per page'] = 'bilete pr. side';
+$lang['photos updated in the database'] = 'bilete oppdatera i databasen';
+$lang['pixels'] = 'bildepunkt (piksel)';
+$lang['private'] = 'privat';
+$lang['public'] = 'offentleg';
+$lang['randomly represented'] = 'tilfeldig album-miniatyrbilete';
+$lang['registered users'] = 'registrera brukarar';
+$lang['remove author'] = 'fjern forfattar';
+$lang['remove tags'] = 'fjern stikkord';
+$lang['remove this filter'] = 'fjern dette filteret';
+$lang['remove title'] = 'fjern tittel';
+$lang['selection'] = 'utval';
+$lang['show details'] = 'vis detaljar';
+$lang['status'] = 'status';
+$lang['sub-albums'] = 'underalbum';
+$lang['synchronize files structure with database'] = 'synkroniser filstruktur med databasen';
+$lang['target'] = 'mål';
+$lang['test'] = 'test';
+$lang['the forum'] = 'forumet';
+$lang['the wiki'] = 'wiki';
+$lang['top left corner'] = 'øvre venstre hjørne';
+$lang['top right corner'] = 'øvre høgre hjørne';
+$lang['total time'] = 'total tid';
+$lang['unit mode'] = 'enkel-modus';
+$lang['unknown'] = 'ukjend';
+$lang['user "%s" added'] = 'brukar "%s" er lagt til';
+$lang['user_status_admin'] = 'Administrator';
+$lang['user_status_generic'] = 'Generell';
+$lang['user_status_guest'] = 'Gjest';
+$lang['user_status_normal'] = 'Brukar';
+$lang['user_status_webmaster'] = 'Webmaster';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'dei som vitjar galleriet må logge på og ha naudsynte rettar for å sjå dette albumet';
+$lang['width must be a number superior to'] = 'breidde må vera eit tal større enn';
+$lang['Anomaly'] = 'Feil';
+$lang['Are you sure you want to delete this plugin?'] = 'Er du sikker på at du vil fjerne dette tilleggsprogrammet';
+$lang['Are you sure you want to install this plugin?'] = 'Er du sikker på at du vil installere dette tilleggsprogrammet';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = '<em>Piwigo for Android</em> appen gjer det mogleg å kople ein Android telefon eller nettbrett til ditt Piwigo galleri. Du kan lage album og laste opp fleire bilete på ein gong.';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = '<em>Piwigo for iOS</em> appen gjer det mogleg å kople ein iPhone, iPad eller iPod Touch til ditt Piwigo galleri. Du kan lage album og laste opp fleire bilete på ein gong.';
+$lang['Add write access to the "%s" directory'] = 'Legg til skriverettar til "%s" katalogen';
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Photoshop Lightroom er programvare laga for å handtere store mengder digitale foto og gjera biletbehandling.';
+$lang['Album photos associated to the following albums: %s'] = 'Albumbilete er knytt til fylgjande album: %s';
+$lang['Album updated successfully'] = 'Album er oppdatera';
+$lang['Albums automatically sorted'] = 'Albuma er automatisk sortera';
+$lang['All %d photos are selected'] = 'Alle %d bilete er vald';
+$lang['All extensions are up to date.'] = 'Alle tillegg er siste versjon';
+$lang['All languages are up to date.'] = 'Alle språk er siste versjon';
+$lang['All plugins are up to date.'] = 'Alle tilleggsprogram er siste versjon';
+$lang['All themes are up to date.'] = 'Alle tema er siste versjon';
+$lang['Allow rating'] = 'Tillat rangering';
+$lang['Allow user customization'] = 'Tillat brukartilpasning';
+$lang['Allow user registration'] = 'Tillat brukarregistrering';
+$lang['Allow users to delete their own comments'] = 'Tillat brukarar å slette sine eigne kommentarar';
+$lang['Allow users to edit their own comments'] = 'Tillat brukarar å endre sine eigne kommentarar';
+$lang['Allowed file types: %s.'] = 'Tillatne filtyper: %s';
+$lang['Mail content'] = 'Send innhald på e-post';
+$lang['Mail sent to %s [%s].'] = 'E-post sendt til %s [%s].';
+$lang['Main Page'] = 'Hovudside';
+$lang['Multiple Size'] = 'Fleire størrelsar';
+$lang['Level 2'] = 'Vener';
+$lang['Level 4'] = 'Familie';
+$lang['Level 8'] = 'Administratorar';
+$lang['Link all album photos to a new album'] = 'Kople alle albumbilete til eit nytt album';
+$lang['Link all album photos to some existing albums'] = 'Kople alle albumbilete til eit eksisterande album';
+$lang['Linked albums'] = 'Tilkopla album';
+$lang['List'] = 'Liste';
+$lang['Local'] = 'Lokal';
+$lang['Lock'] = 'LÃ¥s';
+$lang['Lock albums'] = 'LÃ¥s album';
+$lang['Lock gallery'] = 'LÃ¥s galleri';
+$lang['Locked'] = 'LÃ¥st';
+$lang['Inactive Languages'] = 'Inaktive språk';
+$lang['Inactive Plugins'] = 'Inaktive tilleggsprogram';
+$lang['Inactive Themes'] = 'Inaktive tema';
+$lang['Languages'] = 'Språk';
+$lang['Languages which need upgrade'] = 'Språk som treng oppgradering';
+$lang['Last hit'] = 'Siste treff';
+$lang['Last import'] = 'Siste importering';
+$lang['Last revisions'] = 'Siste revisjonar';
+$lang['Last send'] = 'Sist sendt';
+$lang['Learn more'] = 'Lær meir';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = 'Kontaktar';
+$lang['Informations'] = 'informasjon';
+$lang['Install'] = 'Installer';
+$lang['Install on your computer,'] = 'Installer på din datamaskin';
+$lang['Installed Languages'] = 'Installera språk';
+$lang['Installed Themes'] = 'Installera tema';
+$lang['Instructions to use Piwigo'] = 'Instruksjonar for å bruke Piwigo';
+$lang['Invert'] = 'Inverter';
+$lang['Landscape'] = 'Landskap';
+$lang['Language has been successfully installed'] = 'Språk er installera';
+$lang['Apply action'] = 'Utfør handling';
+$lang['Apply selected corrections'] = 'Utfør valde korrigeringar';
+$lang['Associate to album'] = 'Kople til album';
+$lang['Associated'] = 'Kopla til';
+$lang['Authorized'] = 'Autorisera';
+$lang['Automatic correction'] = 'Automatisk korrigering';
+$lang['Automatic sort order'] = 'Automatisk sorteringsrekkefylgje';
+$lang['Available on'] = 'Tilgjengeleg';
+$lang['Available only with HTML format'] = 'Kun tilgjengeleg med HTML-format';
+$lang['Available versions for'] = 'Tilgjengelege versjonar for';
+$lang['associate to group'] = 'kople til gruppe';
+$lang['Update to Piwigo %s'] = 'Oppdatera til Piwigo %s';
+$lang['Updates'] = 'Oppdateringar';
+$lang['Upload'] = 'Last opp';
+$lang['Week starts on'] = 'Veka startar på';
+$lang['Who can see these photos?'] = 'Kven kan sjå desse bileta?';
+$lang['New parent album'] = 'Nytt foreldrealbum';
+$lang['No display'] = 'Ingen vising';
+$lang['No group selected, no action possible.'] = 'Ingen gruppe er vald, ingen handling mogleg.';
+$lang['Not cropped correctly?'] = 'Ikkje kutta rett?';
+$lang['Notification'] = 'Melding';
+$lang['Notify administrators when a comment is'] = 'Send melding til administratorar når ein kommentar er';
+$lang['Opacity'] = 'Grad av gjennomsiktighet';
+$lang['Optional URL keyword'] = 'Valfritt URL-nøkkelord';
+$lang['Order of menubar items has been updated successfully.'] = 'Rekkefylgje på menyelement på menylina er oppdatera';
+$lang['Merge selected tags'] = 'Flett valde stikkord';
+$lang['Merge tags'] = 'Flett stikkord';
+$lang['Metadata synchronization results'] = 'Resultat for synkronisering av metadata';
+$lang['Metadata synchronized from file'] = 'Metadata synkronisera frå fil';
+$lang['Minimum height'] = 'Minste høgde';
+$lang['Minimum privacy level'] = 'Lågaste personvern-nivå';
+$lang['Minimum width'] = 'Minste breidde';
+$lang['Miscellaneous'] = 'Diverse';
+$lang['Missing Plugins'] = 'Manglande tilleggsprogram';
+$lang['Missing a temporary folder'] = 'Kladdemappe manglar';
+$lang['Modify information'] = 'Endre informasjon';
+$lang['Month'] = 'MÃ¥nad';
+$lang['Move'] = 'Flytt';
+$lang['Move albums'] = 'Flytt album';
+$lang['Move to album'] = 'Flytt til album';
+$lang['Name'] = 'Namn';
+$lang['Name of the duplicate'] = 'Namn på duplikat';
+$lang['New Version'] = 'Ny versjon';
+$lang['New name'] = 'Nytt namn';
+$lang['Maintenance'] = 'Vedlikehald';
+$lang['Make this language available to users'] = 'Gjer dette språket tilgjengeleg for brukarar';
+$lang['Make this theme available to users'] = 'Gjer dette temaet tilgjengeleg for brukarar';
+$lang['Manage'] = 'Handter';
+$lang['Manage Permissions'] = 'Handter løyve';
+$lang['Manage authorizations for selected albums'] = 'Handter autorisering for valde album';
+$lang['Manage permissions for group "%s"'] = 'Handter løyve for gruppa "%s"';
+$lang['Manage permissions for user "%s"'] = 'Handter løyve for brukaren "%s"';
+$lang['Manage photo ranks'] = 'Sorteringsrekkefylgje for bilete';
+$lang['Manage photos'] = 'Handter bilete';
+$lang['Manage tags'] = 'Handter stikkord';
+$lang['Manage the members'] = 'Handter medlemer';
+$lang['Manage this set of %d photos'] = 'Handter denne samlinga av %d bilete';
+$lang['Manual order'] = 'Manuell rekkefylgje';
+$lang['Maximum file size: %sB.'] = 'Største filstørrelse: %sB.';
+$lang['Maximum height'] = 'Største høgde';
+$lang['Maximum width'] = 'Største breidde';
+$lang['Members'] = 'Medlemer';
+$lang['Menu Management'] = 'Menyar';
+$lang['Merge selected groups'] = 'Flett valde grupper';
+$lang['Average rate'] = 'Gjennomsittleg vurdering';
+$lang['By %s'] = 'Av %s';
+$lang['Caddie'] = '"Caddie"';
+$lang['Caddie management'] = '"Caddie"-handtering';
+$lang['Can\'t connect to server.'] = 'Tilkopling til tenar er ikkje tilgjengeleg.';
+$lang['Can\'t create temporary file.'] = 'Kan ikkje opprette kladdefil.';
+$lang['Can\'t download archive.'] = 'Kan ikkje laste ned arkiv.';
+$lang['Can\'t read or extract archive.'] = 'Kan ikkje lesa eller pakke ut arkiv.';
+$lang['Cancel'] = 'Avbryt';
+$lang['Cannot delete the old permalink !'] = 'Den gamle permalenka kan ikkje slettast!';
+$lang['Change Admin Colors'] = 'Endre fargar for administrasjon';
+$lang['Check all'] = 'Sjekk alle';
+$lang['Check for updates'] = 'Sjekk for oppdateringar';
+$lang['Check for upgrade'] = 'Sjekk oppdateringar';
+$lang['Check for upgrade failed for unknown reasons.'] = 'Oppgraderingssjekk feila av ukjend årsak.';
+$lang['Check integrity'] = 'Integritetssjekk';
+$lang['Choose an action'] = 'Vel ei handling';
+$lang['Choose an option'] = 'Vel eit alternativ';
+$lang['Classic display'] = 'Klassisk vising';
+$lang['Comments for all'] = 'Kommentarar for alle';
+$lang['Configuration'] = 'Konfigurasjon';
+$lang['Confirm merge'] = 'Stadfest fletting';
+$lang['Correction'] = 'Korreksjon';
+$lang['Correction applied with error'] = 'Korreksjon vart gjort, men med feil';
+$lang['Correction applied with success'] = 'Korreksjon vellukka';
+$lang['Create'] = 'Opprett';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Opprett mappa "%s" i rotmappa for din Piwigo-installasjon';
+$lang['Create this site'] = 'Opprett denne nettsida';
+$lang['Crop'] = 'Kutt';
+$lang['Current name'] = 'Noverande namn';
+$lang['Database'] = 'Dataase';
+$lang['Database synchronization with files'] = 'Synkroniser database med filer';
+$lang['Date'] = 'Dato';
+$lang['Day'] = 'Dag';
+$lang['Deactivate'] = 'Deaktiver';
+$lang['Deactivate all'] = 'Deaktiver alt';
+$lang['Default comments order'] = 'Standard rekkefylgje for kommentarar';
+$lang['Default display'] = 'Standard vising';
+$lang['Default photos order'] = 'Standard bilet-rekkefylgje';
+$lang['Default user cannot be deleted'] = 'Standardbrukar kan ikkje slettast';
+$lang['Default user does not exist'] = 'Standarbrukar finst ikkje';
+$lang['Delete Representant'] = 'Fjern miniatyrbilete for album';
+$lang['Delete orphan tags'] = 'Slett stikkord som ikkje høyrer til noko bilete';
+$lang['Delete selected photos'] = 'Slett valde bilete';
+$lang['Delete selected tags'] = 'Slett valde stikkord';
+$lang['Delete selected users'] = 'Slett valde brukarar';
+$lang['Delete this language'] = 'Slette dett språket';
+$lang['Delete this theme'] = 'Slett dette temaet';
+$lang['Deleted on'] = 'Sletta';
+$lang['Deletions'] = 'Slettingar';
+$lang['Deny selected groups'] = 'Avvis valde grupper';
+$lang['Deny selected users'] = 'Avvis valde brukarar';
+$lang['Description'] = 'Skildring';
+$lang['Detailed informations'] = 'Detaljera informasjon';
+$lang['Directory'] = 'Mappe';
+$lang['Directory does not exist'] = 'Mappe finst ikkje';
+$lang['Discover album:'] = 'Oppdag album:';
+$lang['Display options'] = 'Visingsinnstillingar';
+$lang['Dissociate from album'] = 'Frikople frå album';
+$lang['Dissociated'] = 'Frikobla';
+$lang['Do you want to activate anyway?'] = 'Ynskjer du å aktivere likevel?';
+$lang['Documentation'] = 'Dokumentasjon';
+$lang['Does not represent'] = 'er ikkje miniatyrbilete for';
+$lang['Download,'] = 'Last ned,';
+$lang['Downloads'] = 'Nedlastingar';
+$lang['Drag to re-order'] = 'Klikk-og-dra for å endre rekkefylgje';
+$lang['Drop into album'] = 'Vel eit album';
+$lang['Dump Database'] = 'Dump database';
+$lang['Duplicate'] = 'Dupliser';
+$lang['IP'] = 'IP';
+$lang['Ignore All'] = 'Ignorer alt';
+$lang['Ignore this update'] = 'Ignorer denne oppdateringa';
+$lang['Image Quality'] = 'Biletkvalitet';
+$lang['Image id'] = 'Bilde-ID';
+$lang['Hello'] = 'Hei';
+$lang['Hello,'] = 'Hei,';
+$lang['Help Me'] = 'Hjelp meg';
+$lang['Hide'] = 'Gøym';
+$lang['High definition'] = 'Høg oppløysing';
+$lang['High definition enabled'] = 'Høg oppløysing aktivera';
+$lang['History'] = 'Historie';
+$lang['Hit'] = 'Treff';
+$lang['Hour'] = 'Time';
+$lang['Graphics Library'] = 'Grafikk-bibliotek';
+$lang['Group'] = 'Gruppe';
+$lang['Group management'] = 'Gruppe-handtering';
+$lang['Group name'] = 'Gruppenamn';
+$lang['Groups'] = 'Grupper';
+$lang['Groups and users'] = 'Grupper og brukarar';
+$lang['Guest Settings'] = 'Innstillingar for gjester';
+$lang['Guest cannot be deleted'] = 'Gjest kan ikkje slettast';
+$lang['Guests'] = 'Gjester';
+$lang['Height'] = 'Høgde';
+$lang['Forbid this language to users'] = 'Gjer dette språket utilgjengeleg for brukarar';
+$lang['Forbid this theme to users'] = 'Gjer dette temaet utilgjengeleg for brukarar';
+$lang['Forbidden'] = 'Utilgjengeleg';
+$lang['Form'] = 'Frå';
+$lang['GD library is missing'] = 'GD-bibliotek manglar';
+$lang['GD version'] = 'GD-versjon';
+$lang['Gallery title'] = 'Galleritittel';
+$lang['Gallery unlocked'] = 'Galleriet låst opp';
+$lang['General statistics'] = 'Galleri-statistikk';
+$lang['Get Support on Piwigo Forum'] = 'Få brukarstøtte på Piwigo-forum';
+$lang['Go to'] = 'GÃ¥ til';
+$lang['Go to %s or %s for more informations'] = 'GÃ¥ til %s eller %s for meir informasjon';
+$lang['Error on file "%s" : %s'] = 'Feil i fil "%s": %s';
+$lang['Error when sending email to %s [%s].'] = 'Feil ved sending av e-post til %s [%s].';
+$lang['Errors caption'] = 'Feilforklaring';
+$lang['Everybody'] = 'Alle';
+$lang['Extend for templates'] = 'Utvid malar';
+$lang['Extensions Update'] = 'Oppdatering av tilleggsmodular';
+$lang['FTP + Synchronization'] = 'FTP + synkronisering';
+$lang['Failed to write file to disk'] = 'Feil ved skriving av fil til disk';
+$lang['File'] = 'Fil';
+$lang['File upload stopped by extension'] = 'Opplasting av fil stoppa av utvidelse';
+$lang['File/directory read error'] = 'Lesefeil for fil/mappe';
+$lang['Find a new representant by random'] = 'Finn eit nytt tilfeldig miniatyrbilere for album';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'Fylgjande tilleggsprogram er kanskje ikkje kompatibl med den nye versjonen av Piwigo:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'Fylgjande tema er kanskje ikke kompatible med den nye versjonen av Piwigo:';
+$lang['Duplicate selected tags'] = 'Dupliser valde stikkord';
+$lang['Duplicates'] = 'Duplikat';
+$lang['ERROR'] = 'FEIL';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'FEIL: DETTE TILLEGGSPROGRAMMET MANGLAR, MEN ER INSTALLERA! AVINSTALLER NÃ….';
+$lang['Edit album'] = 'Endre album';
+$lang['Edit album permissions'] = 'Endre ablumtilgang';
+$lang['Edit photo'] = 'Endre bilete';
+$lang['Edit photo information'] = 'Endre biletinformasjon';
+$lang['Edit ranks'] = 'Endre rangering';
+$lang['Edit selected tags'] = 'Endre valde stikkord';
+$lang['Edit tags'] = 'Endre stikkord';
+$lang['Element'] = 'Element';
+$lang['Element type'] = 'Element-type';
+$lang['Email administrators when a comment is deleted'] = 'Send e-post til administratorar når ein kommentar er sletta';
+$lang['Email administrators when a comment is modified'] = 'Send e-post til administratorar når ein kommentar er endra';
+$lang['Email admins when a comment requires validation'] = 'Send e-post til adminstratorar når ein kommentar treng validering';
+$lang['Email admins when a new user registers'] = 'Send e-post til administratorar når ein ny brukar er registrera';
+$lang['Email admins when a valid comment is entered'] = 'Send e-post til administratorar når ein gyldig kommentar er lagt til';
+$lang['Environment'] = 'Miljø';
+$lang['Error list'] = 'Liste med feil';
+$lang['New photos added'] = 'Nye bilete lagt til';
+$lang['New photos were added'] = 'Nye bilete bilete er lagt til';
+$lang['New tag'] = 'Nytt stikkord';
+$lang['No file was uploaded'] = 'Ingen fil vart lasta opp';
+$lang['No group is permitted to see this private album'] = 'Ingen gruppe har løyve til å sjå dette private albumet';
+$lang['No mail to send.'] = 'Ingen e-post å sende';
+$lang['No members to manage'] = 'Ingen medlemer å handtere';
+$lang['No order field selected'] = 'Ikkje noko sorteringsfelt er vald';
+$lang['No photo can be deleted'] = 'Ingen bilete kan slettast';
+$lang['No photo in the current set.'] = 'Ingen bilete i gjeldande samling';
+$lang['No photo in this album'] = 'Ingen bilete i dette albumet';
+$lang['No photo selected, %d photos in current set'] = 'Ingen bilete vald, %d bilete i gjeldande samling';
+$lang['No photo selected, no action possible.'] = 'Ingen bilete vald, ingen handling er mogleg.';
+$lang['No results'] = 'Ingen resultat';
+$lang['No user to send notifications by mail.'] = 'Ingen brukar som kan informerast via e-post.';
+$lang['None'] = 'Ingen';
+$lang['Number of albums per page'] = 'Antal ablum pr. side';
+$lang['Number of comments per page'] = 'Antal kommentarar pr. side';
+$lang['Number of downloads'] = 'Antal nedlastingar';
+$lang['Number of rates'] = 'Antal rangeringar';
+$lang['Number of thumbnails to create'] = 'Antal miniatyrbilete som skal opprettast';
+$lang['Only private albums are listed'] = 'Bare private album er lista opp';
+$lang['Operating system'] = 'Operativsystem';
+$lang['Options'] = 'Innstillingar';
+$lang['Original Size'] = 'Original størrelse';
+$lang['Original file : %s'] = 'Original fil: %s';
+$lang['Original templates'] = 'Originale malar';
+$lang['Orphan tags deleted'] = 'Stikkord som ikkje høyrer til noko bilete er sletta';
+$lang['Other plugins'] = 'Andre tilleggsprogram er tilgjengeleg';
+$lang['Other private albums'] = 'Andre private album';
+$lang['Overall'] = 'Oversikt';
+$lang['Page banner'] = 'Side-banner';
+$lang['Page end'] = 'Sideslutt';
+$lang['Pages seen'] = 'Sider vist';
+$lang['Panorama'] = 'Panorama';
+$lang['Parameter'] = 'Innstillingar';
+$lang['Parameters'] = 'Parametrar';
+$lang['Parent album'] = 'Foreldrealbum';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Stadfesting av passord manglar. Skriv inn stadfesting av passord.';
+$lang['Password is missing. Please enter the password.'] = 'Passord manglar. Skriv inn eit passord.';
+$lang['Path'] = 'Sti';
+$lang['Pending Comments'] = 'Ventande kommentarar';
+$lang['Permalink'] = 'Permalenke';
+$lang['Permalink %s is already used by album %s'] = 'Permalenke %s er allereie i bruk av album %s';
+$lang['Permalink history'] = 'Permalenke-historikk';
+$lang['Piwigo for Android'] = 'Piwigo for Android';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo for iOS (iPhone, iPad, iPod Touch)';
+$lang['Posted %s on %s'] = 'Lagt til %s %s';
+$lang['Permalinks'] = 'Permalenker';
+$lang['Permission denied'] = 'Du har ikkje løyve';
+$lang['Permission granted'] = 'Løyve gjeve';
+$lang['Permission granted for groups'] = 'Løyve gjeve for grupper';
+$lang['Permission granted for users'] = 'Løyve gjeve for brukarar';
+$lang['Permission granted thanks to a group'] = 'Løyve gjeve på grunn av gruppmedlemskap';
+$lang['Permission management'] = 'Handtering av løyve';
+$lang['Permissions'] = 'Løyve';
+$lang['Photo %s of %s'] = 'Bilete %s av %s';
+$lang['Photo informations updated'] = 'Biletinformasjon er oppdatera';
+$lang['Photo Page'] = 'Biletside';
+$lang['Photo Properties'] = 'Eigenskapar for bilete';
+$lang['Photo name'] = 'Namn på bilete';
+$lang['Photos'] = 'Bilete';
+$lang['Piwigo Administration'] = 'Piwigo adminstrasjon';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Piwigo Publish-tilleggsprogram for Lightroom';
+$lang['Piwigo Update'] = 'Oppdatering av Piwido';
+$lang['Piwigo configuration'] = 'Konfigurering av Piwigo';
+$lang['Piwigo version'] = 'Piwigo-versjon';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'Sjekk mappe for tilleggsprogram og undermapper for tilgangsløyve (CHMOD)';
+$lang['Please select at least two groups'] = 'Vel minst to grupper';
+$lang['Please wait...'] = 'Vent...';
+$lang['Plugin has been successfully copied'] = 'Tilleggsprogrammet vart kopiera';
+$lang['Plugin list'] = 'Liste med tilleggsprogram';
+$lang['Plugins'] = 'Tilleggsprogram';
+$lang['Plugins which need upgrade'] = 'Tilleggsprogram som skal oppgraderast';
+$lang['Portrait'] = 'Portrett';
+$lang['Position'] = 'Posisjon';
+$lang['Private'] = 'Privat';
+$lang['Properties'] = 'Eigenskapar';
+$lang['Public'] = 'Offentleg';
+$lang['Public / Private'] = 'Offentleg / Privat';
+$lang['Purge compiled templates'] = 'Fjern kompilera malar';
+$lang['Purge history detail'] = 'Fjern historikk-detaljar';
+$lang['Purge history summary'] = 'Fjern historikk-summering';
+$lang['Purge never used notification feeds'] = 'Fjern informasjons-matingar som ikkje har vore bruka';
+$lang['Purge search history'] = 'Fjern søkehistorikk';
+$lang['Purge sessions'] = 'Fjern sesjonar';
+$lang['Purge user cache'] = 'Fjern mellomlagring for brukar';
+$lang['Quick Local Synchronization'] = 'Rask lokal synkronisering';
+$lang['Random photo'] = 'Tilfeldig bilete';
+$lang['Rate'] = 'Ranger';
+$lang['Rating'] = 'Rangering';
+$lang['Rating by guests'] = 'Rangera av gjester';
+$lang['Read Piwigo Documentation'] = 'Les dokumentasjon for Piwigo';
+$lang['Refresh'] = 'Oppfrisk';
+$lang['Refresh photo set'] = 'Oppfrisk biletsamling';
+$lang['Reject'] = 'Avvis';
+$lang['Remove all filters'] = 'Fjern alle filter';
+$lang['Remove from caddie'] = 'Fjern frå "caddie"';
+$lang['Rename'] = 'Gje nytt namn';
+$lang['Repair and optimize database'] = 'Reparer og optimaliser databasen';
+$lang['Representant'] = 'Miniatyrbilete for album';
+$lang['Representation of albums'] = 'Miniatyrbilete for album';
+$lang['Representative'] = 'Miniatyrbilete for album';
+$lang['Represents'] = 'Er miniatyrbilete for';
+$lang['Reset ignored updates'] = 'Nullstill ignorera oppdateringar';
+$lang['Resize'] = 'Skaler';
+$lang['Resize after upload'] = 'Skaler etter opplasting';
+$lang['Restore'] = 'Set tilbake';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'Set tilbake til standardkonfigurasjon. Du vil miste innstillingar for tilleggsprogram';
+$lang['Save Settings'] = 'Lagre innstillingar';
+$lang['Save Template Directory'] = 'Lagre mal-mappe';
+$lang['Save manual order'] = 'Lagre manuell sortering';
+$lang['Save order'] = 'Lagre sortering';
+$lang['Save to permalink history'] = 'Lagre til historikk for permalenker';
+$lang['Search for new images in the directories'] = 'Søk etter nye bilete i mappene';
+$lang['Searching...'] = 'Søker...';
+$lang['Section'] = 'Seksjon';
+$lang['See you soon,'] = 'Ser deg snart,';
+$lang['See you soon.'] = 'Ser deg snart.';
+$lang['Select a file'] = 'Vel ei fil';
+$lang['Select an album'] = 'Vel eit ablum';
+$lang['Select at least one album'] = 'Vel minst eitt album';
+$lang['Select at least one comment'] = 'Vel minst ein kommentar';
+$lang['Select at least one photo'] = 'Vel minst eitt bilete';
+$lang['Select at least one user'] = 'Vel minst ein brukar';
+$lang['Select at least two tags for merging'] = 'Vel minst to stikkord for fletting';
+$lang['Select files'] = 'Vel filer';
+$lang['Select groups...'] = 'Vel grupper...';
+$lang['Select recipients'] = 'Vel mottakarar';
+$lang['Select the destination tag'] = 'Vel mål-stikkord';
+$lang['Select users...'] = 'vel brukarar...';
+$lang['Select:'] = 'Vel:';
+$lang['Selection'] = 'Utval';
+$lang['Send'] = 'Send';
+$lang['Send an information email to group members'] = 'Send informasjon på e-post til ei gruppe medlemer';
+$lang['Send connection settings by email'] = 'Send innloggings-instillingar på e-post';
+$lang['Send mail as'] = 'Send e-post som';
+$lang['Send mail on HTML format'] = 'Send e-post i HTML-format';
+$lang['Send mail to users'] = 'Send e-post til brukarar';
+$lang['Settings'] = 'Instillingar';
+$lang['Sharpen'] = 'Oppskarping';
+$lang['Show info'] = 'Vis informasjon';
+$lang['Show menubar'] = 'Vis menyline';
+$lang['Simulation'] = 'Simulering';
+$lang['Site manager'] = 'Nettstadsadministrator';
+$lang['Some themes and plugins may be not available yet.'] = 'Nokre tema og tilleggsprogram er kanskje ikkje tilgjengelege nå.';
+$lang['Some upgrades are available for extensions.'] = 'Oppgraderingar er tilgjengelege for tilleggsmodular';
+$lang['Start Upload'] = 'Start opplasting';
+$lang['Start pLoader and add your photos.'] = 'Start pLoader og legg til dine bilete.';
+$lang['Statistics'] = 'Statistikk';
+$lang['Status'] = 'Status';
+$lang['Status of user "%s" updated'] = 'Status for brukar "%s" er oppdatera';
+$lang['Subscribe'] = 'Abonner';
+$lang['Subscribe %s'] = 'Abonner %s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'Abonner %s på Piwigo annonserings-nyheitsbrev';
+$lang['Summary'] = 'Summering';
+$lang['Support'] = 'Støtte';
+$lang['Synchronize'] = 'Synkroniser';
+$lang['Synchronize metadata'] = 'Synkroniser metadata';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'DETTE TILLEGGSPROGRAMMET ER NÃ… EIN DEL AV KJERNA I PIWIGO! AVINNSTALLER DET NÃ…!';
+$lang['Tag "%s" already exists'] = 'Stikkordet "%s" finst allereie';
+$lang['Tag "%s" is now a duplicate of "%s"'] = 'Stikkordet "%s" er nå duplikat av "%s"';
+$lang['Tag "%s" was added'] = 'Stikkordet "%s" er lagt til';
+$lang['Tag selection'] = 'Val av stikkord';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Stikkord <em>%s</em> fletta saman med stikkordet <em>%s</em>';
+$lang['Templates'] = 'Malar';
+$lang['The following tag was deleted'] = 'Desse stikkorda vart sletta';
+$lang['The gallery URL is not valid.'] = 'URL til galleriet er ikkje gyldig';
+$lang['The name of an album must not be empty'] = 'Namnet til eit album kan ikkje vera tomt';
+$lang['Virtual album'] = 'Virtuelt album';
+$lang['Virtual album added'] = 'Virtuelt album er lagt til';
+$lang['Virtual album deleted'] = 'Virtuelt album er sletta';
+$lang['Virtual album name'] = 'Namn på virtuelt ablum';
+$lang['Virtual albums to move'] = 'Virtuelle ablum som skal flyttast';
+$lang['Visit Gallery'] = 'Besøk galleriet';
+$lang['Visit Piwigo project website'] = 'Besøk nettstaden til Piwigo-prosjektet';
+$lang['Visit language site'] = 'Gå til språksida';
+$lang['Visit plugin site'] = 'GÃ¥ til sida for tilleggsprogram';
+$lang['Visit theme site'] = 'GÃ¥ til sida for tema';
+$lang['Visited %d times'] = 'Besøkt %d gonger';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'VARSEL! Dette tilleggsprogrammet ser ikkje ut til å vera kompatibel med denne versjonen av Piwigo.';
+$lang['Waiting'] = 'Ventande';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'Varsel: ';
+$lang['Watermark'] = 'Vassmerke';
+$lang['Web Form'] = 'Web-skjema';
+$lang['Webmaster cannot be deleted'] = 'Webmaster kan ikkje fjernast';
+$lang['Webmaster status is required.'] = 'Webmaster-status er påkrevd';
+$lang['Upload Photos'] = 'Last opp bilete';
+$lang['Uploaded Photos'] = 'Opplasta bilete';
+$lang['User'] = 'Brukar';
+$lang['User "%s" created with "%s" like password'] = 'Brukar "%s" oppretta med "%s" som passord';
+$lang['User %s [%s] added.'] = 'Brukar %s [%s] er lagt til';
+$lang['User %s [%s] was added to the subscription list.'] = 'Brukar %s [%s] lagt til som abonnent.';
+$lang['User %s [%s] was not added to the subscription list.'] = 'Brukar %s [%s] er ikkje lagt til som abonnent.';
+$lang['User %s [%s] was not removed from the subscription list.'] = 'Brukar %s [%s] er ikkje fjerna som abonnent.';
+$lang['User %s [%s] was removed from the subscription list.'] = 'Brukar %s [%s] fjerna som abonnent.';
+$lang['User comments validation'] = 'Validering av kommentar frå brukar';
+$lang['User list'] = 'Brukarliste';
+$lang['User status'] = 'Brukarstatus';
+$lang['Users'] = 'Brukarar';
+$lang['Validate'] = 'Valider';
+$lang['Validation'] = 'Validering';
+$lang['Version'] = 'Versjon';
+$lang['View in gallery'] = 'Vis i galleriet';
+$lang['Virtual Links'] = 'Virutelle lenker';
+$lang['Who can see this photo?'] = 'Kven kan sjå dette biletet?';
+$lang['Width'] = 'Breidde';
+$lang['With blank value, gallery title will be used'] = 'Om tomt, galleriets tittel vil bli bruka';
+$lang['With no album'] = 'Utan ablum';
+$lang['With no tag'] = 'Utan stikkord';
+$lang['With no virtual album'] = 'Utan virutelt album';
+$lang['X Position'] = 'X posisjon';
+$lang['X Repeat'] = 'X repetering';
+$lang['Y Position'] = 'Y posisjon';
+$lang['Year'] = 'Ã…r';
+$lang['You are running the latest version of Piwigo.'] = 'Du køyrer siste versjon av Piwigo.';
+$lang['You cannot delete your account'] = 'Du kan ikkje slette din konto';
+$lang['You cannot move an album in its own sub album'] = 'Du kan ikkje flytte eit album til sitt eige underalbum';
+$lang['You have %d orphan tags: %s.'] = 'Du har %d stikkord som ikkje høyrer til bilete: %s.';
+$lang['Zoom'] = 'Zoom';
+$lang['add a new watermark'] = 'legg til nytt vassmerke';
+$lang['add new photos to caddie'] = 'legg nye bilete til "caddie"';
+$lang['added'] = 'lagt til';
+$lang['administrators'] = 'administratorar';
+$lang['albums added in the database'] = 'album lagt til i databasen';
+$lang['any visitor can see this album'] = 'all gjester kan sjå dette ablumet';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'dikiKam er eit avansera fritt digital bilethandteringsprogram for Linux, Windows og Mac OSX';
+$lang['even already synchronized photos'] = 'og allereie synkronisera bilete';
+$lang['for the file format'] = 'for dette filformatet';
+$lang['for this file format'] = 'for denne filas format';
+$lang['global mode'] = 'globalmodus';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto er standard bilethandsamar på Mac OSX. Piwigo eksport tilleggsprogram let deg oppretta nye album og eksportere dine bilete direkte frå iPhoto til ditt Piwigo biletgalleri';
+$lang['leave'] = 'ingen endring';
+$lang['on the %d selected photos'] = 'på desse %s valde bileta';
+$lang['ranks'] = 'rangering';
+$lang['registration date'] = 'registreringsdato';
+$lang['remove creation date'] = 'fjern opprettingsdato';
+$lang['set to'] = 'sett til';
+$lang['simple visitors'] = 'enkle besøkande';
+$lang['singly represented'] = 'fiksa miniatyrbilete';
+$lang['synchronize files metadata with database photos informations'] = 'syknroniser bileta i databasen med metadata i filene';
+$lang['test this remote site'] = 'test denne nettstaden';
+$lang['unset'] = 'nullstill';
+$lang['update the database from files'] = 'oppdater databasen med filene';
+$lang['An error has occured during upgrade.'] = 'Det oppstod ein feil under oppgraderinga.';
+$lang['An error occured during extraction (%s).'] = 'Det oppstod ein feil under utpakking av filene (%s).';
+$lang['An information email was sent to group "%s"'] = 'E-post med informasjon er sendt til gruppe "%s"';
+$lang['Apply to sub-albums'] = 'Gjer gjeldande for underalbum';
+$lang['Apply watermark if height is bigger than'] = 'Legg til vassmerke om høgda er større enn';
+$lang['Apply watermark if width is bigger than'] = 'Legg til vassmerke om breidda er større enn';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'Fila eller mappa kan ikkje nåast (den finst ikkje eller tilgang er nekta)';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'Talet på kommentarar på ei side må vera mellom 5 og 50.';
+$lang['The original image quality must be a number between %d and %d'] = 'Kvalitet på originalbilete må vera eit tal mellom %d og %d';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo greier ikkje hente oppgraderingsfile frå tenaren';
+$lang['Ratio'] = 'Storleiksforhold';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (RemoteGallery-klient for Android) er eit åpent kjeldekodeprogram (GPL v3) - ein Piwigo-klient for Android-plattforma.';
+$lang['Bound Theme'] = 'Bunden mal';
+$lang['Continue processing treatment'] = 'Fortsett handsaming som er igang';
+$lang['Delete multiple size images'] = 'Slett multistørrelse bilete';
+$lang['Hoverbox display'] = 'Hoverbox-vising';
+$lang['If you encounter problems or have any question, please send a message to'] = 'Dersom du opplever problem eller har spørsmål, kan du sende ei melding til';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'Dette temaet kan ikkje aktiverast avdi foreldretemaet manglar: %s';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'Kan ikkje deaktivere dette språket. Du må seta eit anna språk som standardspråk.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'Kan ikkje deaktivere dette språket. Minst eit språk må vera aktivera.';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Kan ikkje deaktivere dette temaet. Minst eit tema må vera aktivera.';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'Dette temaet kan ikkje slettast avdi andre tema er avhengig av dette: %s';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'I php.ini fila di er upload_max_filesize (%sB) større enn post_max_size (%sB). Du bør endre denne innstillinga.';
+$lang['Include display of recent photos grouped by dates'] = 'Inkluder vising av nye bilete gruppera etter dato';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'Inkluder historikk (Varsel: serverminne-grense kan verta overskriden)';
+$lang['Information data registered in database'] = 'Informasjonsdata lagra i databasen';
+$lang['Obsolete Plugins'] = 'For gamle tilleggsprogram';
+$lang['Operation in progress'] = 'Handsaming er igang.';
+$lang['Preferences'] = 'Innstillingar';
+$lang['Released on'] = 'Utgeven';
+$lang['Remote'] = 'Fjern';
+$lang['You have subscribed to receiving notifications by mail.'] = 'Du har starta abbonnement på varsling via e-post.';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'Du har avlsutta abbonnement på varsling via e-post.';
+$lang['You need to confirm deletion'] = 'Du må stadfeste slettinga';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'Du bør oppgradere systemet ditt for å få full nytte av applikasjonen, elles vil applikasjonen ha feil eller ikkje virke i det heile.';
+$lang['[%s] Visit album %s'] = '[%s] Gjest album %s';
+$lang['custom'] = 'Tilpassa';
+$lang['Replacers (customized templates)'] = 'Erstattar (tilpassa mal)';
+$lang['Select a zone with your mouse to define a new center of interest.'] = 'Vel eit område med musa for å definere interessesenter.';
+$lang['Set as default language for unregistered and new users'] = 'Set som standard språk for uregistrera og nye brukarar';
+$lang['Set as default theme for unregistered and new users'] = 'Set som standard mal for uregistrera og nye brukarar';
+$lang['Set author'] = 'Set fotograf';
+$lang['Set creation date'] = 'Set opprettingsdato';
+$lang['Set title'] = 'Set tittel';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell er eit åpent kjeldekodeprograme for å handtere digitale bilete på Linux. Det er standard bilethandteringsprogram i Ubuntu og Fedora.';
+$lang['Subscribe to notification by mail'] = 'Abonner på varsling via e-post';
+$lang['Subscribe/unsubscribe users'] = 'Start/avslutt abonnement for brukarar';
+$lang['Subscribed'] = 'Abonnement starta';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'Abonnentar kan bli lista (tilgjengeleg) bare om der nye element å varsle om.';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'Piwigo eksport-tilleggsprogrammet gjev deg tilgang til å opprette album og eksportere bilete.';
+$lang['The anomaly will be ignored until next application version'] = 'Feilen vil bli ignorera til neste versjon av applikasjonen';
+$lang['The center of interest is the most meaningful zone in the photo.'] = 'Interessesenter er det viktigaste område på biletet.';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'Namn på permalenke kan innehalde a-z, A-Z, 0-9, "-", "_" eller "/". Den kan ikkje innehalde bare tal eller byrje med tal fylgd av "-"';
+$lang['The version of %s [%s] installed is not compatible with the version required ']['%s'] = 'Versjonen av %s [%s] som er installera er ikkje kompatibel med den versjonen som er påkrevd [%s]';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'Webmaster har starta abonnement for deg på varsling via e-post.';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Du brukar nettlesaropplasting. Prøv <a href="%s">Flash-opplasting</a> istadenfor.';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Du brukar Flash-opplasting. Problem? Prøv <a href="%s">nettlesaropplasting</a> istadenfor.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Du kan laste opp til Piwigo %s direkte utan å oppgradere til Piwigo %s (tilrådd)';
+$lang['photos informations synchronized with files metadata'] = 'biletinformasjon er synkronisera med metadata for fila';
+$lang['The original maximum height must be a number between %d and %d'] = 'Største høgde på original må vera ei tal mellom %d og %d';
+$lang['The original maximum width must be a number between %d and %d'] = 'Største breidde på original må vera ei tal mellom %d og %d';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'Biletstørrelse vil bli redusera til %dx%d bilepunkt.';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'Den opplasta file er større enn innstillinga MAX_FILE_SIZE som er spesifisera i HTML-skjemaet';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'Den opplasta fila er større enn innstillinga upload_max_filesize i php.ini: %sB';
+$lang['The uploaded file was only partially uploaded'] = 'Den opplasta file vart berre delvis opplasta';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'Den opplasta fila er større enn innstillinga post_max_size i php.ini: %sB';
+$lang['[NBM] Problems or questions'] = '[NMB] Problem eller spørsmål';
+$lang['apply automatic sort order'] = 'bruk automatisk sorteringsrekkefylgje';
+$lang['dissociate from group'] = 'koble frå gruppe';
+$lang['only perform a simulation (no change in database will be made)'] = 'gjer bare ein simuletring (ingenting vil bli endra i databasen)';
+$lang['overrides existing values with empty ones'] = 'overstyr gjeldande verdiar med tomme';
+$lang['pending validation'] = 'ventande validering';
+$lang['reduce to single existing albums'] = 'reduser til enkle eksiterande album';
+$lang['Your configuration settings are saved'] = 'Dine konfigurasjonsinnstillingar er lagra';
+$lang['You can activate only one mobile theme.'] = 'Du kan bare aktivere eit mobil-tema.';
+$lang['You might go to plugin list to install and activate it.'] = 'Gå til lista med tilleggsprogram for å installere og aktivere det.';
+$lang['Update Complete'] = 'Oppdatering ferdig';
+$lang['Update albums informations'] = 'Oppdater informasjon om album';
+$lang['Update in progress... Please wait.'] = 'Oppdatering igang... Vent.';
+$lang['Update photos information'] = 'Oppdater informasjon om bilete';
+$lang['Use the default photo sort order (defined in the configuration file)'] = 'Bruk standard sorteringsrekkefylgje for bilete (definera i konfigurasjonefil)';
+$lang['Used metadata'] = 'Metadata i bruk';
+$lang['You are running on development sources, no check possible.'] = 'Du køyrer med utviklingskjeldekode, sjekk er ikkje mogleg.';
+$lang['Unable to dump database.'] = 'Greier ikkje dumpe databasen';
+$lang['Uncheck all'] = 'Velg bort alle';
+$lang['Uninstall'] = 'Avinstaller';
+$lang['Uninstalled Plugins'] = 'Avinstallera tilleggsprogram';
+$lang['Unknown upload error'] = 'Ukjend opplastingsfeil';
+$lang['Unlock gallery'] = 'LÃ¥s opp galleri';
+$lang['Unlocked'] = 'LÃ¥st opp';
+$lang['Unsubscribe from notification by mail'] = 'Avslutt abonnement på varsling via e-post';
+$lang['Unsubscribed'] = 'Abonemment avslutta';
+$lang['Update All'] = 'Oppdater alle';
+$lang['To subscribe'] = 'Start abonnement';
+$lang['To unsubscribe'] = 'Avslutt abonnement';
+$lang['Toggle \'default group\' property'] = 'Inverter \'standargruppe\'-eigenskapen';
+$lang['Tools'] = 'Verktøy';
+$lang['Two updates are available'] = 'To oppdateringar er tilgjengelege';
+$lang['Type here the author name'] = 'Skriv inn forfattarnamn';
+$lang['Type here the name of the new group'] = 'Skriv inn namn på ny gruppe';
+$lang['Type here the title'] = 'Skriv inn tittel';
+$lang['Type in a search term'] = 'Skriv inn søkeord';
+$lang['Unable to check for upgrade.'] = 'Greier ikkje sjekke for oppgraderingar.';
+$lang['This name is already used by another group.'] = 'Dette namnet er allereie i bruk av ei anna gruppe.';
+$lang['This site already exists'] = 'Denne nettsida finst allereie';
+$lang['This theme was not designed to be directly activated'] = 'Dette temaet kan ikkje aktiverast direkte';
+$lang['Thumbnail'] = 'Miniatyrbilete';
+$lang['Thumbnails generation in progress...'] = 'Oppretting av miniatyrebilete er i gang...';
+$lang['Time'] = 'Tid';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'Tida tilgjengeleg for å sende e-post er avgrensa. Andre e-postar er hoppa over.';
+$lang['Title'] = 'Tittel';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = 'For å eksportere bileta dine frå digiKam til Piwigo, installer dikiKam og Kipi-tilleggsprogrammet.';
+$lang['To send ?'] = 'Send?';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'Webmaster har avslutta abonnementet ditt på e-postvarsling.';
+$lang['There is no available subscribers to mail.'] = 'Det er ingen abonnentar å varsle på e-post.';
+$lang['There is no other theme available.'] = 'Ingen andre tema er tilgjengelege.';
+$lang['This album contains %d photos, added between %s and %s.'] = 'Dette albumet inneheld %d bilete lagt til mellom %s og %s.';
+$lang['This album contains %d photos, added on %s.'] = 'Dette albumet inneheld %d bilete lagt til %s.';
+$lang['This album contains no photo.'] = 'Dette albumet inneheld ingen bilete.';
+$lang['This group will be set to default'] = 'Denne gruppa vil bli bruka som standard';
+$lang['This group will be unset to default'] = 'Denne gruppa vil ikkje lenger bli bruka som standard';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'Dette er ei større oppgdatering med <a href="%s">nye spennande mogleghetar</a>.';
+$lang['This is a minor update, with only bug corrections.'] = 'Dette er ei mindre oppdatering med kun opprretting av feil.';
+$lang['The whole page'] = 'Heile sida';
+$lang['The whole set'] = 'Heile samlinga';
+$lang['Theme has been successfully installed'] = 'Tema har vorte installera';
+$lang['Themes'] = 'Tema';
+$lang['Themes which need upgrade'] = 'Tema som treng oppgradering';
+$lang['There is no group in this gallery.'] = 'Det finst ingen grupper i galleriet';
+$lang['There is no other language available.'] = 'Ingen andre språk er tilgjengelege.';
+$lang['There is no other plugin available.'] = 'Ingen andre tillgeggsprogram er tilgjengelege.';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'Gruppenamnet kan ikkje innehalde " eller \' eller vera tomt.';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'Mappenamn og filnamn kan bare innehalde bokstavar, tal, "-", "_" eller "."';
+$lang['Save visits in history for'] = 'Lagre vitjingshistorikk for';
+$lang['Source tag'] = 'Kjeldestikkord';
+$lang['Storage album'] = 'Lagringsalbum';
+$lang['Sum of rates'] = 'Sum av vurderingar';
+$lang['Switch to clear or dark colors for administration'] = 'Byt til ljos eller mørk farge for administrasjon';
+$lang['Templates configuration has been recorded.'] = 'Mal-konfigurasjon har blitt lagra';
+$lang['The %d following tags were deleted'] = 'Fylgjande %d stikkord har vorte sletta';
+$lang['Privacy level'] = 'Personvernnivå';
+$lang['Privacy level set to "%s"'] = 'Personvernnivå sett til "%s"';
+$lang['Rate date'] = 'Vurderingsgsdato';
+$lang['Rated %d times, score : %.2f'] = 'Vurdera %s gonger, skår: %.2f';
+$lang['Photos generation in progress...'] = 'Biletgenerering i gang...';
+$lang['Piwigo Uploader'] = 'Piwigo opplastar';
+$lang['Piwigo export plugin for Aperture'] = 'Piwigo tilleggsprogram for eksport frå Aperture';
+$lang['Piwigo export plugin for iPhoto'] = 'Piwigo tilleggsprogram for eksport frå iPhoto';
+$lang['Piwigo publish plugin for Shotwell'] = 'Piwigo tilleggsprogram for eksport frå Shotwell';
+$lang['Piwigo publish plugin for digiKam'] = 'Piwigo tilleggsprogram for eksport frå digiKam';
+$lang['Predefined filter'] = 'Førehandsdefinera filter';
+$lang['Mail address is obligatory for all users'] = 'E-postadresse er påkrevd for alle brukarar';
+$lang['Main "guest" user does not exist'] = 'Hovudbrukaren "gjest" finst ikkje';
+$lang['Main "guest" user status is incorrect'] = 'Hovudbrukaren "gjest" sin status er feil';
+$lang['Main "webmaster" user does not exist'] = 'Hovudbrukaren "webmaster" finst ikkje';
+$lang['Main "webmaster" user status is incorrect'] = 'Hovudbrukaren "webmaster" sin status er feil';
+$lang['No destination tag selected'] = 'MÃ¥lstikkord er ikkje vald';
+$lang['Optimizations have been completed with some errors.'] = 'Optimalisering er gjennomførd, men med nokre feil.';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'Permalenke %s har tidlegare vore i bruk av album %s. Du må slette den frå permalenke-historikken fyrst.';
+$lang['Photo unreachable or no support'] = 'Får ikkje tak i biletet eller bilet-typa er ikkje støtta';
+$lang['I decide to update anyway'] = 'Eg vil oppdatere likevel';
+$lang['Ignore selected anomalies'] = 'Ignorer valde feil';
+$lang['Images manual order was saved'] = 'Manuell sortering av bilete er lagra';
+$lang['Impossible automatic correction'] = 'Automatisk korrigering er ikkje mogleg';
+$lang['Exif extension not available, admin should disable exif use'] = 'EXIF-utvidelse er ikkje tilgjengeleg, administrator bør deaktivere bruk av EXIF';
+$lang['Features include gallery browsing, album creation and photo upload.'] = 'Mogleghetar inkluderar å bla i galleriet, lage album og laste opp bilete.';
+$lang['Follow Orientation'] = 'Fylg orientering/retning';
+$lang['Generate multiple size images'] = 'Lag fleire størrelsar av bileta';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Gje skriverettar (chmod 777) til "%s" mappa i rotmappa i din Piwigo installasjon';
+$lang['Grant selected groups'] = 'Gje tilgang til valde grupper';
+$lang['Grant selected users'] = 'Gje tilgang til valde brukarar';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture er eit kraftig verktøy for å forbetre bilete og handtere store mengder bilete på ein Mac datamaskin.';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture er laga for profesjonelle fotografar, men liknar iPhoto.';
+$lang['Applications'] = 'Applikasjonar';
+$lang['Authorize users to add comments on selected albums'] = 'Autoriser brukarar til å legge til kommentarar på valde album';
+$lang['Batch Manager'] = 'Jobb handterar';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'Som standard vil Piwigo lage ein ny biletstørrelse ut frå HD-versjonen (high definition) av ditt bildete.';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = 'Som standard vil insteressesenter for biletet bli plassera i midten.';
+$lang['By rank'] = 'Etter rangering';
+$lang['Center of interest'] = 'Interessesenter';
+$lang['Check automatic corrections'] = 'Sjekk automatiske korrigeringar';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'Feilen som er korrigera vil ikkje lenger bli ignorera';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = 'For biletstørrelsar med avskjering, slik som "Firkant", vil Piwigo gjera det som er mogleg for å inkludere interessesenter.';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'Om ingen HD er tilgjengeleg og om gjeldande web-størrelse er større enn skaleringsdimensjonar, vil Piwigo flytte den som HD og lage ein nedskalera bilete i web-størrelse av dette.';
+$lang['Photo sizes with crop'] = 'Biletstørrelse med avskjering';
+$lang['Piwigo Announcements Newsletter'] = 'Piwigo nyheitsbrev';
+$lang['Albums authorized thanks to group associations'] = 'Album er autorisera på grunn av gruppetilknyting';
+$lang['All optimizations have been successfully completed.'] = 'Alle optimaliseringar er gjennomført.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Ein feil oppstod under utpakking. Sjekk tilgangsrettar til filer i din Piwigo-installasjon. <br /><a href="%s">Klikk her for å vise feillogg</a>.';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Er du sikker på at du vil installere denne oppgraderinga? Du må sjekke om denne versjonen ikkje treng å avinstallere tidlegare versjonar.';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'Tida for å tilrettelegge lista med brukara som skal få e-post er avgrensa. Andre brukarar er ikkje med i lista.';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = 'Erstatning av original mal med tilpassa malar frå mappe med mal-utvidingar';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'Piwigo publiserings-tillegg gjev deg mogleghet til å eksportere og synkronisere bilete frå Lightroom direkte til ditt Piwigo biletgalleri.';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'Hald kontakt med Piwigo-prosjektet, abonner på Piwigo nyheitsbrev. Du vil motta e-postar når nye versjonar er tilgjengelege (kan innehalde oppretting av sikkerheitsproblem slik at det er viktig å kjenne til oppgraderinga) og når større hendingar i prosjektet skjer. Det er bare nokre få meldingar i året.';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'Eksekveringstida er overskriden, handsaminga må fortseta [Estimera tid: %d sekundar]';
+$lang['Complementary mail content'] = 'Komplementært meldingsinnhald';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'Eksekveringstida er ute, handsaming må halde fram [Estimera tid: %d sekundar].';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'Bare webmaster kan sjå denne fana, ikkje administratorar.';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Omtrentleg største oppløysing: %dM piksel (det er %dx%d biletpunkt)';
+$lang['Numeric identifier : %d'] = 'Numerisk identifikator: %d';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = 'I Linux-installsjonen din kan du installere Shotwell og aktivere Piwigo publserings-opsjon.';
+$lang['Reinitialize check integrity'] = 'Start integritetssjekk på nytt';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'Du kan ikkje definere standard biletrekkefylgje fordi du har ei tilpassa instilling i din lokal konfigurasjon.';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'Du har spesifisera <i>$conf[\'order_by\']</i> i di lokal konfigurasjonfil, denne parameteren er utdatera. Du må fjerne den eller endre namn til <i>$conf[\'order_by_custom\']</i> !';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam er laga for fotografar som vil sjå, handtere, endre, forbetre, organisere, merke og dele bilete.';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader står for <em>Piwigo Uploader</em>. Frå datamaskina di kan pLoader tilrettelegge bileta dine og overføre dei til ditt Piwigo biletgalleri.';
+$lang['photos candidates for metadata synchronization'] = 'bilete som er kanditatar for synkronisering av metadata';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'Endring av storleik etter opplasting er ikkje tilgjengeleg avdi GD vert bruka som grafikkbibliotek';
+$lang['Select at least one tag'] = 'Vel minst eitt nøkkelord';
+$lang['Basic settings'] = 'Grunnleggjande innstillingar';
+$lang['General'] = 'Generelt';
+$lang['Mail theme'] = 'E-posttema';
+$lang['User %s added'] = 'Brukar %s lagt til';
+$lang['User %s updated'] = 'Brukar %s er oppdatera';
+$lang['Users modified'] = 'Brukarar er endra';
+$lang['%d of %d users selected'] = '%d av %d brukarar er valde';
+$lang['(filtered from %s total users)'] = '(filtrera frå %s brukarar totalt)';
+$lang['All %d users are selected'] = 'Alle %d brukarar er valde';
+$lang['Change password'] = 'Endre passord';
+$lang['Change username'] = 'Endre brukarnamn';
+$lang['Last visit on %s, %s.'] = 'Sist vitja %s, %s.';
+$lang['Loading...'] = 'Lastar...';
+$lang['No matching user found'] = 'Ingen brukarar vart funne';
+$lang['Password updated'] = 'Passordet er endra';
+$lang['Show %s users'] = 'Vis %s brukarar';
+$lang['No user selected of %d users'] = 'Ingen brukarar valde (totalt %d brukarar)';
+$lang['No user selected, no action possible.'] = 'Ingen brukarar valde - ingen aksjon mogleg';
+$lang['Registered on %s, %s.'] = 'Registrera %s, %s.';
+$lang['Showing %s to %s of %s users'] = 'Viser %s til %s av %s brukarar';
+$lang['Update user'] = 'Endre brukar';
+$lang['on the %d selected users'] = 'med dei %d valde brukarane';
+$lang['Close user details'] = 'Lukk brukardetaljar';
+$lang['Open user details'] = 'Opne brukardetaljar';
+$lang['close'] = 'lukk';
+?> \ No newline at end of file
diff --git a/language/nn_NO/common.lang.php b/language/nn_NO/common.lang.php
new file mode 100644
index 000000000..7fc06d075
--- /dev/null
+++ b/language/nn_NO/common.lang.php
@@ -0,0 +1,421 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Norwegian nynorsk [NO]
+Version: 2.6.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=689
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+$lang_info['language_name'] = 'Norwegian nynorsk';
+$lang_info['country'] = 'Norway';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'nn';
+$lang_info['zero_plural'] = true;
+
+$lang['%d comments'] = '%d kommentarar';
+$lang['%d hit'] = '%d treff';
+$lang['%d hits'] = '%d treff';
+$lang['%d Kb'] = '%d Kb';
+$lang['%d new comment'] = '%d ny kommentar';
+$lang['%d new comments'] = '%d nye kommentarar';
+$lang['%d new photo'] = '%d nytt bilete';
+$lang['%d new photos'] = '%d nye bilete';
+$lang['%d new user'] = '%d ny brukar';
+$lang['%d new users'] = '%d nye brukarar';
+$lang['Date'] = 'Dato';
+$lang['day'][0] = 'Sundag';
+$lang['day'][1] = 'MÃ¥ndag';
+$lang['day'][2] = 'Tysdag';
+$lang['day'][3] = 'Onsdag';
+$lang['day'][4] = 'Torsdag';
+$lang['day'][5] = 'Fredag';
+$lang['day'][6] = 'Laurdag';
+$lang['month'][10] = 'Oktober';
+$lang['month'][11] = 'November';
+$lang['month'][12] = 'Desember';
+$lang['month'][1] = 'Januar';
+$lang['month'][2] = 'Februar';
+$lang['month'][3] = 'Mars';
+$lang['month'][4] = 'April';
+$lang['month'][5] = 'Mai';
+$lang['month'][6] = 'June';
+$lang['month'][7] = 'Juli';
+$lang['month'][8] = 'August';
+$lang['month'][9] = 'September';
+$lang['I want to add photos'] = 'Eg ynskjer å legge til bilete';
+$lang['IP: %s'] = 'IP: %s';
+$lang['IPTC Metadata'] = 'IPTC Medadata';
+$lang['Keyword'] = 'Nøkkelord';
+$lang['Customize'] = 'Mine instillingar';
+$lang['Expand all albums'] = 'Utvid album';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Hei %s, ditt Piwigo biletgalleri er tomt!';
+$lang['Connection settings'] = 'Innstillingar for pålogging';
+$lang['Contact'] = 'Kontakt';
+$lang['Contact webmaster'] = 'Kontakt webmaster';
+$lang['Create a new account'] = 'Lag ny brukar';
+$lang['Created on'] = 'Oppretta';
+$lang['Creation date'] = 'Oppretta dato';
+$lang['Current password is wrong'] = 'Passordet er feil';
+$lang['Registration'] = 'Registrering';
+$lang['Registration of %s'] = 'Registrering av %s';
+$lang['Rating score'] = 'Rangering';
+$lang['Rating score, high &rarr; low'] = 'Rangering, høg &rarr; låg';
+$lang['Rating score, low &rarr; high'] = 'Rangering, låg &rarr; høg';
+$lang['Update your rating'] = 'Oppdater din rangering';
+$lang['%d rate'] = '%d rangering';
+$lang['%d rates'] = '%d rangeringar';
+$lang['Best rated'] = 'Best rangering';
+$lang['Page generated in'] = 'Sida bygd på';
+$lang['Rate this photo'] = 'Ranger dette bilete';
+$lang['no rate'] = 'ingen rangering';
+$lang['Sort by'] = 'Sorter etter';
+$lang['Submit'] = 'Send';
+$lang['Sent by'] = 'Sendt av';
+$lang['Show latest comments first'] = 'Vis siste kommentarar fyrst';
+$lang['Show number of comments'] = 'Vis antal kommentarar';
+$lang['Show number of hits'] = 'Vis antal treff';
+$lang['Show oldest comments first'] = 'Vis eldste kommentarar fyrst';
+$lang['Since'] = 'Sidan';
+$lang['Tag'] = 'Stikkord';
+$lang['Tag results for'] = 'Stikkord for';
+$lang['Tags'] = 'Stikkord';
+$lang['Thank you for registering at %s!'] = 'Takk for at du registrera deg på %s!';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Galleriet er stengd for vedlikehald. Prøv litt seinare.';
+$lang['The passwords do not match'] = 'Passorda er ikkje like';
+$lang['Thumbnails'] = 'Miniatyrbilete';
+$lang['User comments'] = 'Brukarkommentarar';
+$lang['User: %s'] = 'Brukar: %s';
+$lang['Username'] = 'Brukarnamn';
+$lang['Username "%s" on gallery %s'] = 'Brukarnamn "%s" i galleri %s';
+$lang['Username is mandatory'] = 'Brukarnamn er påkrevd';
+$lang['Username modification'] = 'Endre brukarnamn';
+$lang['Username or email'] = 'Brukarnamn eller e-post';
+$lang['Username: %s'] = 'Brukarnamn: %s';
+$lang['View'] = 'Vis';
+$lang['View in'] = 'Vis i';
+$lang['Visits'] = 'Visnngar';
+$lang['Visits, high &rarr; low'] = 'Visingar, mange &rarr; få';
+$lang['Visits, low &rarr; high'] = 'Visingar, få &rarr; mange';
+$lang['Webmaster'] = 'Webmaster';
+$lang['Website'] = 'Nettstad';
+$lang['Week %d'] = 'Veke %d';
+$lang['Welcome'] = 'Velkomen';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Velkomen til ditt Piwigo biletgalleri!';
+$lang['Yes'] = 'Ja';
+$lang['You are not authorized to access the requested page'] = 'Du har ikkje tilgang til å sjå denne sida';
+$lang['Your comment has been registered'] = 'Kommentaren din er registrera';
+$lang['Your favorites'] = 'Mine favorittar';
+$lang['Your password has been reset'] = 'Passordet er nullstilt';
+$lang['add this photo to your favorites'] = 'legg dette bilete til favorittliste';
+$lang['customize the appareance of the gallery'] = 'tilpass utsjånad av galleriet';
+$lang['delete all photos from your favorites'] = 'fjern alle bilete frå favorittliste';
+$lang['delete this photo from your favorites'] = 'fjern dette biletet frå favorittliste';
+$lang['all'] = 'alle';
+$lang['ascending'] = 'stigande';
+$lang['author(s) : %s'] = 'fotograf: %s';
+$lang['available for administrators only'] = 'kun tilgjengeleg for administrator';
+$lang['chronology_monthly_calendar'] = 'MÃ¥nadskalender';
+$lang['chronology_monthly_list'] = 'MÃ¥nadsliste';
+$lang['chronology_weekly_list'] = 'Vekeliste';
+$lang['cloud'] = 'sky';
+$lang['comment date'] = 'kommentardato';
+$lang['created after %s (%s)'] = 'oppretta etter %s (%s)';
+$lang['created before %s (%s)'] = 'oppretta før %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'oppretta mellom %s (%s) og %s (%s)';
+$lang['created on %s'] = 'oppretta %s';
+$lang['descending'] = 'synkande';
+$lang['display a set of random photos'] = 'vis tilfeldige bilete';
+$lang['display all photos in all sub-albums'] = 'vis alle bilete i underalbum';
+$lang['display available tags'] = 'vis tilgjengelege stikkord';
+$lang['display best rated photos'] = 'vis best rangera bilete';
+$lang['display last user comments'] = 'vis siste brukarkommentarar';
+$lang['display most recent photos'] = 'vis nye bilete';
+$lang['display most visited photos'] = 'vis mest viste bilete';
+$lang['display only recently posted photos'] = 'vis bare bilete nyleg lagt til';
+$lang['display photos linked to this tag'] = 'vis bilete knytt til dette stikkordet';
+$lang['display recently updated albums'] = 'vis nyleg oppdatera album';
+$lang['display this album'] = 'vis dette albumet';
+$lang['display your favorites photos'] = 'vis dine favorittbilete';
+$lang['edit'] = 'endre';
+$lang['excluded'] = 'ekskludera';
+$lang['from %s to %s'] = 'frå %s til %s';
+$lang['group by letters'] = 'grupper på bokstav';
+$lang['guest'] = 'gjest';
+$lang['html tags are not allowed in login'] = 'html-taggar er ikkje lov i brukarnavn';
+$lang['in %d sub-album'] = 'i %d underalbum';
+$lang['in %d sub-albums'] = 'i %d underalbum';
+$lang['searched words : %s'] = 'søkte ord: %s';
+$lang['this login is already used'] = 'dette brukarnamnet er allereie i bruk';
+$lang['in this album'] = 'i dette albumet';
+$lang['included'] = 'inkludera';
+$lang['large'] = 'L - stort';
+$lang['last %d days'] = 'siste %d dagar';
+$lang['letters'] = 'bokstavar';
+$lang['login mustn\'t end with a space character'] = 'brukarnamn kan ikke avsluttast med mellomrom';
+$lang['login mustn\'t start with a space character'] = 'brukarnamn kan ikkje starte med mellomrom';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'e-postadresse må vera på formen xxx@yyy.eee (døme: user@example.org)';
+$lang['mandatory'] = 'påkrevd';
+$lang['medium'] = 'M - middels stor';
+$lang['obligatory'] = 'påkrevd';
+$lang['password updated'] = 'passordet er oppdatera';
+$lang['photo'] = 'bilete';
+$lang['photos posted during the last %d days'] = 'bilete lagt inn dei siste %d dagane';
+$lang['posted after %s (%s)'] = 'lagt til etter %s (%s)';
+$lang['posted before %s (%s)'] = 'lagt til før %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'lagt til mellom %s (%s) og %s (%s)';
+$lang['posted on %s'] = 'lagt til %s';
+$lang['remove this tag from the list'] = 'slett dette stikkordet frå lista';
+$lang['representative'] = 'miniatyrbilete for album';
+$lang['return to normal view mode'] = 'attende til normalvisning';
+$lang['return to the display of all photos'] = 'attende til å vise alle bilete';
+$lang['set as album representative'] = 'set som miniatyrbilete for album';
+$lang['show tag cloud'] = 'vis stikkordsky';
+$lang['the username must be given'] = 'brukarnamn er påkrevd';
+$lang['this email address is already in use'] = 'denne e-postadressa er allereie i bruk';
+$lang['thumb'] = 'Miniatyrbilete';
+$lang['useful when password forgotten'] = 'nyttig om du gløymer passorder';
+$lang['search'] = 'søk';
+$lang['slideshow'] = 'biletvisning';
+$lang['small'] = 'S - lite';
+$lang['square'] = 'Firkant';
+$lang['stop the slideshow'] = 'stopp biletvisning';
+$lang['the beginning'] = 'starten';
+$lang['today'] = 'idag';
+$lang['wrong date'] = 'feil dato';
+$lang['xlarge'] = 'XL - ekstra stor';
+$lang['xsmall'] = 'XS - ekstra lite';
+$lang['xxlarge'] = 'XXL - kjempestort';
+$lang['Play of slideshow'] = 'Start bildevisning';
+$lang['Please enter your username or email address.'] = 'Skriv inn navnet eller e-postadressa di.';
+$lang['Please, enter a login'] = 'Skriv inn brukarnavn';
+$lang['Photo sizes'] = 'Biletstørrelsar';
+$lang['Photo title, A &rarr; Z'] = 'Bilettittel, A &rarr; Ã…';
+$lang['Photo title, Z &rarr; A'] = 'Bilettittel, Ã… &rarr; A';
+$lang['Piwigo Help'] = 'Hjelp for Piwigo';
+$lang['Number of photos per page'] = 'Antal bilete pr side';
+$lang['Original'] = 'Original';
+$lang['Original dimensions'] = 'Original størrelse';
+$lang['Password'] = 'Passord';
+$lang['Password Reset'] = 'Nullstill passord';
+$lang['Password forgotten'] = 'Gløymt passord';
+$lang['Password reset is not allowed for this user'] = 'Nullstilling av passord er ikkje lov for denne brukaren';
+$lang['Password: %s'] = 'Passord: %s';
+$lang['Language'] = 'Språk';
+$lang['Last'] = 'Siste';
+$lang['Links'] = 'Lenker';
+$lang['Login'] = 'Logg inn';
+$lang['Logout'] = 'Logg ut';
+$lang['Menu'] = 'Meny';
+$lang['Mobile'] = 'Mobil';
+$lang['Most visited'] = 'Mest vist';
+$lang['N/A'] = 'N/A';
+$lang['New password'] = 'Nytt passord';
+$lang['Next'] = 'Neste';
+$lang['No'] = 'Nei';
+$lang['Notification'] = 'RSS-kanalar';
+$lang['Number of items'] = 'Antal';
+$lang['Hello %s,'] = 'Hei %s,';
+$lang['Hello'] = 'Hallo';
+$lang['Forgot your password?'] = 'Gløymt passordet?';
+$lang['Filter and display'] = 'Filtrer og vis';
+$lang['First'] = 'Fyrste';
+$lang['Filter'] = 'Filter';
+$lang['Filesize'] = 'Filstørrelse';
+$lang['File name, A &rarr; Z'] = 'Filnavn, A &rarr; Ã…';
+$lang['File name, Z &rarr; A'] = 'Filnavn, Ã… &rarr; A';
+$lang['File name'] = 'Filnavn';
+$lang['File'] = 'Fil';
+$lang['Favorites'] = 'Favorittar';
+$lang['Desktop'] = 'Skrivebord';
+$lang['Default'] = 'Standard';
+$lang['Delete'] = 'Slett';
+$lang['Dimensions'] = 'Størrelse';
+$lang['Display'] = 'Vis';
+$lang['Download'] = 'last ned';
+$lang['Download this file'] = 'Last ned denne fila';
+$lang['EXIF Metadata'] = 'EXIF Metadata';
+$lang['Edit'] = 'Endre';
+$lang['Edit a comment'] = 'Endre ein kommentar';
+$lang['Email address'] = 'E-postadresse';
+$lang['Email address is mandatory'] = 'E-postadresse er obligatorisk';
+$lang['Email address is missing. Please specify an email address.'] = 'E-postadresse manglar. Skriv inn ei e-postadresse.';
+$lang['Email: %s'] = 'E-post: %s';
+$lang['Empty query. No criteria has been entered.'] = 'Tom spørring. Kriterie er ikkje lagt inn.';
+$lang['End-Date'] = 'Sluttdato';
+$lang['Enter your new password below.'] = 'Skriv inn nytt passord.';
+$lang['Enter your personnal informations'] = 'Legg inn personleg informasjon';
+$lang['Accelerate diaporama speed'] = 'Raskare framvising';
+$lang['Browser: %s'] = 'Nettlesar: %s';
+$lang['Close this window'] = 'Let att dette vindauget';
+$lang['Comment'] = 'Kommentar';
+$lang['Comment by %s'] = 'Kommentera av %s';
+$lang['Comment: %s'] = 'Kommentar: %s';
+$lang['Comments'] = 'Kommentarar';
+$lang['Connected user: %s'] = 'PÃ¥logga brukar: %s';
+$lang['Are you sure?'] = 'Er du sikker?';
+$lang['Author'] = 'Fotograf';
+$lang['Author: %s'] = 'Fotograf: %s';
+$lang['Auto login'] = 'Automatisk innlogging';
+$lang['Calendar'] = 'Kalender';
+$lang['Change my password'] = 'Endre passord';
+$lang['Check your email for the confirmation link'] = 'Ein e-post med lenke for å godkjenne og stadfeste er sendt.';
+$lang['Click here if your browser does not automatically forward you'] = 'Klikk her dersom nettlesaren ikkje automatisk sender deg vidare';
+$lang['Click on the photo to see it in high definition'] = 'Klikk på biletet for å sjå det i høg oppløysing';
+$lang['2small'] = 'XXS - bitte lite';
+$lang['A comment on your site'] = 'Ein kommentar på nettsida';
+$lang['About'] = 'Om';
+$lang['About Piwigo'] = 'Om Piwigo';
+$lang['Add a comment'] = 'Legg til ein kommentar';
+$lang['Admin: %s'] = 'Administrer %s';
+$lang['Administration'] = 'Administrasjon';
+$lang['Album'] = 'Album';
+$lang['Album results for'] = 'Albumresultat for';
+$lang['Album: %s'] = 'Album %s';
+$lang['Albums'] = 'Album';
+$lang['All'] = 'Alle';
+$lang['All tags'] = 'Alle stikkord';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Ein administrator må godkjenne kommentaren din før den blir vist.';
+$lang['... or browse your empty gallery'] = '... eller bla i ditt nye galleri';
+$lang['(!) This comment requires validation'] = '(!) Denne kommentaren krev godkjenning';
+$lang['%d photos are also linked to current tags'] = '%d bilete er og knytt til desse stikkorda';
+$lang['%d photos'] = '%d bilete';
+$lang['%d photo is also linked to current tags'] = '%d bilete er og knytt til desse stikkorda';
+$lang['%d photo'] = '%d bilete';
+$lang['%d comments to validate'] = '%d kommentarar for godkjenning';
+$lang['%d comment to validate'] = '%d kommentar for godkjenning';
+$lang['%d comment'] = '%d kommentar';
+$lang['%d albums updated'] = '%d album er oppdatera';
+$lang['%d album updated'] = '%d album er oppdatera';
+$lang['Search by date'] = 'databasekall på';
+$lang['Search for Author'] = 'Søk';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Søk i stikkord';
+$lang['Search tags'] = 'Søk i stikkord';
+$lang['SQL queries in'] = 'databasekall på';
+$lang['Search'] = 'Søk';
+$lang['Specials'] = 'Biletvisingar';
+$lang['Quick connect'] = 'PÃ¥logging';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS-kanalen gjev informasjon om nye hendingar på nettstaden: nye bilete, oppdatera album og nye kommentarar. Kan visast i ein RSS-lesar.';
+$lang['The number of photos per page must be a not null scalar'] = 'Antal bilete pr side må vera eit tal større enn null';
+$lang['This author modified following comment:'] = 'Forfattaren endra fylgjande kommentar:';
+$lang['This author removed the comment with id %d'] = 'Forfattaren fjerna kommentar med id %d';
+$lang['This login is already used by another user'] = 'Brukarnamnet er allereie i bruk av ein annan brukar';
+$lang['To reset your password, visit the following address:'] = 'For å nullstille passordet ditt, kan du gå til denne adressa:';
+$lang['Unknown feed identifier'] = 'Ukjend RSS-kanal';
+$lang['Here are your connection settings'] = 'Her er innstillingar for pålogging';
+$lang['Send my connection settings by email'] = 'Send informasjon om pålogging på e-post';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Registreringa var vellukka. Du vil straks motta ein e-post med informasjon om pålogging.
+Velkommen! ';
+$lang['Unknown identifier'] = 'Ukjent biletnummer';
+$lang['User "%s" has no email address, password reset is not possible'] = 'Brukaren "%s" har ikkje e-postadresse - nullstilling av passord er ikkje mogleg';
+$lang['You will receive a link to create a new password via email.'] = 'Du vil motta ei lenke der du kan opprette nytt passord på e-post.';
+$lang['Your Gallery Customization'] = 'Tilpass galleriet ditt';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Kommentaren din vart IKKJE registrera fordi den ikkje vart godkjend av godkjenningsreglane';
+$lang['Your username has been successfully changed to : %s'] = 'Brukarnamnet ditt vart endra til: %s';
+$lang['Your website URL is invalid'] = 'URL til nettstaden er feil';
+$lang['display a calendar by creation date'] = 'vis kalender etter dato oppretta';
+$lang['display a calendar by posted date'] = 'vis kalender etter dato lagt inn';
+$lang['display each day with photos, month per month'] = 'vis kvar dag med bilete, månad for månad';
+$lang['Repeat the slideshow'] = 'Vis bilete ommatt';
+$lang['Requested album does not exist'] = 'Albumet du ynskjer å visa finst ikkje';
+$lang['Requested tag does not exist'] = 'Stikkordet finst ikkje';
+$lang['Reset'] = 'Nullstill';
+$lang['Reset to default values'] = 'Set tilbake til standardinnstillingar';
+$lang['Retrieve password'] = 'Hent passord';
+$lang['Return to home page'] = 'Attende til startside';
+$lang['Search for all terms'] = 'Søk etter alle orda';
+$lang['Search for any term'] = 'Søk etter eitt av orda';
+$lang['Search for words'] = 'Søk etter ord';
+$lang['Search in albums'] = 'Søk i album';
+$lang['Search in sub-albums'] = 'Søk i underalbum';
+$lang['Search results'] = 'Søkeresultat';
+$lang['Search rules'] = 'Søkereglar';
+$lang['Show file metadata'] = 'Vis metadata for fila';
+$lang['Sort order'] = 'Sorteringsrekkefylgje';
+$lang['Piwigo encountered a non recoverable error'] = 'Piwigo oppdaga ein feil som ikkje kan rettast opp';
+$lang['Post date'] = 'Dato lagt inn';
+$lang['Posted on'] = 'Lagt inn';
+$lang['Powered by'] = 'Driven av';
+$lang['Preferences'] = 'Føretrekte innstillingar';
+$lang['Previous'] = 'Førre';
+$lang['Profile'] = 'Profil';
+$lang['Quick search'] = 'Søk';
+$lang['RSS feed'] = 'RSS-kanal';
+$lang['Random photos'] = 'Tilfeldige bilete';
+$lang['Rank'] = 'Rangesring';
+$lang['Recent albums'] = 'Nye album';
+$lang['Recent period'] = 'Siste periode';
+$lang['Recent period must be a positive integer value'] = 'Siste periode må vera eit positivt heiltal';
+$lang['Recent photos'] = 'Siste bilete';
+$lang['Redirection...'] = 'Vidaresending...';
+$lang['Reduce diaporama speed'] = 'Reduser hastighet for biletvising';
+$lang['Register'] = 'Registrering';
+$lang['Related tags'] = 'Liknande stikkord';
+$lang['Identification'] = 'Brukarmeny';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Dersom dette var ein feil, kan du ignorere denne e-posten og ingen ting vil skje vidare.';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Dersom du mottok denne e-posten ved ein feil, ta kontakt med oss på %s';
+$lang['Invalid key'] = 'Ugyldig nøkkel';
+$lang['Invalid password!'] = 'Ugyldig passord1';
+$lang['Invalid username or email'] = 'Ugyldig brukarnamn eller e-post';
+$lang['Kind of date'] = 'Datotype';
+$lang['Manage this user comment: %s'] = 'Handter kommentarane til denne brukaren: %s';
+$lang['Manual sort order'] = 'Manuell sortering';
+$lang['New on %s'] = 'Ny %s';
+$lang['Not repeat the slideshow'] = 'Ikkje repeter biletframvisinga';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Biletnummer, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Biletnummer, 9 &rarr; 1';
+$lang['Page not found'] = 'Sida vart ikkje funnen';
+$lang['Pause of slideshow'] = 'Pause biletframvisninga';
+$lang['Permalink for album not found'] = 'Permalenke for dette albument vart ikkje funnen';
+$lang['Photos only RSS feed'] = 'RSS-kanal med bare bilette';
+$lang['Photos posted within the last %d day.'] = 'Bilete lagt inn den siste dagen (%s dag).';
+$lang['Photos posted within the last %d days.'] = 'Bilete lagt inn dei siste %d dagane.';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... eller deaktiver denne meldinga, eg finn ut av dette sjølv';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Overbufringsvern: Vent litt før du prøver å legge inn ein kommentar til';
+$lang['Any tag'] = 'Eit av stikkorda';
+$lang['At least one listed rule must be satisfied.'] = 'Minst ein regel i lista må vera med.';
+$lang['Bad request'] = 'Feil førespurnad';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Feil status for gjestebrukar, standard status vil bli bruka. Meld frå til webmaster.';
+$lang['Complete RSS feed (photos, comments)'] = 'Komplett RSS-kanal (bilete og kommentarar)';
+$lang['Confirm Password'] = 'Stadfest passord';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Cookies er blokkera eller ikkje støtta av nettlesaren din. Du må aktivere cookies for å logge inn.';
+$lang['Date created, new &rarr; old'] = 'Dato oppretta, ny &rarr; gamal';
+$lang['Date created, old &rarr; new'] = 'Dato oppretta, gamal &rarr; ny';
+$lang['Date posted, new &rarr; old'] = 'Dato lagt inn, ny &rarr; gamal';
+$lang['Date posted, old &rarr; new'] = 'Dato lagt inn, gamal &rarr; ny';
+$lang['Each listed rule must be satisfied.'] = 'Alle reglane må vera oppfylt.';
+$lang['Error sending email'] = 'Feil ved utsending av e-post';
+$lang['Forbidden'] = 'Ikkje tillaten';
+$lang['Go through the gallery as a visitor'] = 'Naviger i galleriet som ein gjest';
+$lang['Help'] = 'Hjelp';
+$lang['Home'] = 'Heim';
+$lang['Email'] = 'E-post';
+$lang['First Page'] = 'Fyrste side';
+$lang['Go back to the album'] = 'Attende til album';
+$lang['Last Page'] = 'Siste side';
+$lang['Password is missing. Please enter the password.'] = 'Passord manglar. Skriv inn eit passord.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Stadfesting av passord manglar. Skriv inn stadfesting av passord.';
+$lang['%d photos per page'] = '%d bilete på kvar side';
+$lang['Theme'] = 'Utsjånadsmal';
+?> \ No newline at end of file
diff --git a/language/nn_NO/help/cat_modify.html b/language/nn_NO/help/cat_modify.html
new file mode 100755
index 000000000..1c363036a
--- /dev/null
+++ b/language/nn_NO/help/cat_modify.html
@@ -0,0 +1,118 @@
+<h2>Endre album</h2>
+
+<h3>Informasjon</h3>
+
+<ul>
+
+ <li><strong>namn</strong>: gje nytt namn til album (ein virtuell namneendring om dette er eit fysisk album).</li>
+
+ <li><strong>Skildring</strong>: kort tekst som gjev ein ide om innhaldet,
+ denne teksten vil visast i botnen av sida med miniatyrbileta.</li>
+
+</ul>
+
+<h3>Flytte</h3>
+
+<p>Om albumet er virtuelt, kan du flytte det. Flytting av album tyder å endre mappe/album det høyrer til.</p>
+
+<h3>Alternativ</h3>
+
+<ul>
+
+ <li><strong>Tilgangstype</strong>: Rettighetshantdering. Om du gjer eit album privat, vil all underalbum og verta private.
+ Om du gjer eit album tilgjengelig for alle, vil alle "foreldrealbum" bli tilgjengelig for alle.</li>
+ <li><strong>LÃ¥s</strong>: Albumet og underalbum vil verta midlertidig utilgjengeleg for endringar.</li>
+ <li><strong>Kommentarar</strong>: Autoriser brukarar for å kunne kommentere dette albumet.</li>
+ <li><strong>Autoriser opplastingar</strong>: Autoriser brukerar til å laste opp biletfiler. Dette alternativet er kun tilgjengelig for fysiske (ikke virtuelle) album.</li>
+
+</ul>
+
+<p>Du kan og endre desse alternativa via "eigenskapar" i
+album-menyen (Arkfane <span class="pwgScreen">Last opp</span>, <span
+class="pwgScreen">Kommentarar</span>, <span class="pwgScreen">LÃ¥s</span>,
+<span class="pwgScreen">Offentleg/Privat</span>, <span
+class="pwgScreen">Alternativ</span> tilgjengeleg frå <span
+class="pwgScreen">Administrasjon &raquo; Album &raquo; Eigenskapar</span>).</p>
+
+<h3>Sorteringsrekkefylgje</h3>
+
+<p>Bruk standard bilet-sorteringsrekkefylgje.</p>
+
+<p>Indikerer om denne sorteringsrekkefylgja og vil gjelde underalbum.</p>
+
+<p>Velg spesifisera sorteringsrekkefylgje på desse albuma.</p>
+<ul>
+<li><strong>Opprettingsdato</strong>: Dato for når biletet er teke</li>
+<li><strong>Opplastingsdato</strong>: Synkroniseringsdato</li>
+<li><strong>Gjennomsnittleg rangering (*)</strong>: Gjennomsittleg rangering kan bli endra av rangering besøkande gjev</li>
+<li><strong>Mest besøkte (*)</strong>: Det siste besøket kan endre rekkefylgje på mest besøkte</li>
+<li><strong>Filnamn</strong>: Namn som er sett i informasjonsfeltet</li>
+<li><strong>Id</strong>: Intern Id (siste album har ein høgare id enn den før der.</li>
+
+</ul>
+<p><strong>(*)</strong>Advarsel: Ver nøye med å test desse sorteringsrekkefylgjene sjølv, då dei kan gje uventa resultat.</p>
+
+
+<h3>Representantar</h3>
+
+<p>Albumet sin representat er miniatyrbiletet som visast på hovudsida (<span class="pwgScreen">category.php</span>) for å
+representera albumet når det kun inneheld underalbum og ingen bilete direkte(akkurat som et underalbum).</p>
+Bilete frå eit album :</p>
+
+<ul>
+
+ <li><span class="pwgScreen">Biletside</span>: ein av knappane let deg sette gjeldande bilete som representant for gjeldande
+vist album. Knappen er kun synleg for administratorar.</li>
+ <li><span class="pwgScreen">Endre informasjon om eit bilete</span> i
+ administrasjon. Dette skjermbiletet kan nås frå <span
+ class="pwgScreen">picture.php</span> eller <span class="pwgScreen">Batch
+ behandlar</span> i <em>unit modus</em>. Sjå hjelp for dette skjermbildetet for fleire detaljar.</li>
+ <li><span class="pwgScreen">Administrasjon &raquo; Album &raquo; Eigenskapar,
+ Representantar</span>. Sjå hjelpe for dette skjermbildet for meir detaljer.</li>
+ <li><span class="pwgScreen">Endre album</span> (forrige skjermbilete).</li>
+
+</ul>
+
+<p>Valet for en representant avhenger av <code>allow_random_representative</code> konfigurasjons parametere (se <span
+class="filename">include/config_default.inc.php</span>).</p>
+
+<p>I standardmodus (<code>allow_random_representative</code> satt til usant(false)),
+vil kvart album som inneheld minst eit element bli representert av eit sett
+ellement. Når dette er sett (ved oppretting av album), vil representanten kun endrast når ein administrator ber om det.
+Om det representative bildet ikkje passer,
+kan du få eit nytt bilete i<strong>Finn ein ny tilfeldig representant</strong>.</p>
+
+<p>Om <code>allow_random_representative</code> konfigurasjonsparameter er sett til sant (true), kan eit album som bare inneheld bilete ikkje ha nokon representant. Bare bruk <strong>Slett representant</strong>-knappen.</p>
+
+<p>Om albumet inneheld bare underalbum og ingen bilete, kan det bli representert av kva som helst element takket
+være <span class="pwgScreen">Endre informasjon om biletet</span>-skjermbiletet. Det eineste alterantivet på gjeldande skjermbilete
+er <strong>Slett representant</strong>-knappen.</
+
+
+<h3>Link alle albumbilete til eit nytt album</h3>
+
+<ul>
+
+<li><strong>Virtuelle albumnamn</strong>: Namnet på det nye albumet som blir oppretta,
+alle bilete i dette albumet vil bli linket til det nye.</li>
+
+<li><strong>Foreldrealbum</strong>: Kvar det nye albumet vil vera,
+La dette være tomt for å legge det på øvste nivå.</li>
+
+</ul>
+
+<h3>Link alle albumbilete til eksisterande album</h3>
+
+<ul>
+
+<li><strong>Album</strong>: Velg målalbumet som bileta skal knyttast til.</li>
+
+</ul>
+
+<h3>Send en informasjonsmelding til gruppemedlemmer</h3>
+
+<ul>
+
+<li><strong>Gruppe</strong>: mottakar si gruppe</li>
+
+<li><strong>E-postinnhald</strong>: Tekst som skal sendast.</li> \ No newline at end of file
diff --git a/language/nn_NO/help/cat_move.html b/language/nn_NO/help/cat_move.html
new file mode 100755
index 000000000..49ffaa69a
--- /dev/null
+++ b/language/nn_NO/help/cat_move.html
@@ -0,0 +1,14 @@
+<h2>Flytte virtuelle album</h2>
+
+<p>Bare virtuelle album kan tilordnast nytt foreldrealbum.</p>
+
+<h3>Virtuelle album som skal flyttast</h3>
+
+<p>Velg eit eller fleire virtuelle album du ynskjer å flytte.
+Om lista er tom, tyder det at det ikkje er laga noko virtuelt album enda.</p>
+
+<h3>Nytt foreldrealbum</h3>
+
+<p>Velg eit nytt foreldrealbum (virtuelt eller fysisk).
+Om du ikkje vel eit nytt foreldrealbum, vil dei valgte virtuelle albuma bli flytt til øvste nivå.
+Eit album kan ikkje flyttast til seg sjølv, eller eit underalbum til seg sjølv.</p> \ No newline at end of file
diff --git a/language/nn_NO/help/cat_options.html b/language/nn_NO/help/cat_options.html
new file mode 100755
index 000000000..f1966d391
--- /dev/null
+++ b/language/nn_NO/help/cat_options.html
@@ -0,0 +1,22 @@
+<h2>Eigenskapar til album</h2>
+
+<p>Handtering av eigenskapar for fleire album på ei gong.</p>
+
+<dl>
+
+<dt>Kommentarar</dt>
+<dd>Eit bilete kan få kommentarar frå dei som vitjar galleriet om bilete høyrer til eit album der det er lov å legge inn kommentarar.</dd>
+
+<dt>LÃ¥s</dt>
+<dd>Låste album er stengt for å gjera vedlikehald. Bare administratorar kan sjå desse i galleriet.</dd>
+
+<dt>Offentleg / privat</dt>
+<dd>NÃ¥r eit album vert privat, kan du gje rettar til brukarar og grupper</dd>
+
+<dt>Representant</dt>
+<dd>Denne eigenskapen er tilgjengeleg om du set innstillinga
+<code>allow_random_representative</code> (sjå <span
+ class="filename">include/config_defaults.inc.php</span>) til
+<em>true</em>. Kvart album kan eit tilfeldig representant-bilete eller eit bilete som blir valgt for albumet.</dd>
+
+</dl> \ No newline at end of file
diff --git a/language/nn_NO/help/cat_perm.html b/language/nn_NO/help/cat_perm.html
new file mode 100755
index 000000000..50e65eb12
--- /dev/null
+++ b/language/nn_NO/help/cat_perm.html
@@ -0,0 +1,11 @@
+<h2>Endre rettar til album</h2>
+
+<p>Dette skjermbiletet er bare tilgjengeleg for private album. Her kan du velge brukarar og grupper som har rett til å sjå dette albumet.</p>
+
+<h3>Grupper</h3>
+
+<p>Du kan nekte eller gje tilgang til grupper til å sjå dette albumet. Om du endrar rettane grupper, vil brukarar som høyrer til desse gruppene bli nekta tilgang eller gjeve tilgang til dette albumet.</p>
+
+<h3>Brukarar</h3>
+
+<p>Du kan nekte eller gje tilgang til enkeltbrukarar. Brukarar som har tilgang via gruppa dei høyrer til, kan bli nekta tilgang ved å nekte tilgang til enkeltbrukar.</p> \ No newline at end of file
diff --git a/language/nn_NO/help/help_add_photos.html b/language/nn_NO/help/help_add_photos.html
new file mode 100755
index 000000000..4f5719074
--- /dev/null
+++ b/language/nn_NO/help/help_add_photos.html
@@ -0,0 +1,20 @@
+<p>Ulike måtar å legge til bilete i galleriet:</p>
+
+<ul>
+ <li><strong>Direkte opplasting</strong> i nettlesaren er den enklaste og mest direkte måten. Den er avhengig av moglegheitane i netllesaren og web-tenaren. For større antal bilete eller om du har problem, så finst andre metodar som ventar på deg!</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">GÃ¥ til direkte opplasting </a></p>
+
+<ul>
+ <li><strong>pLoader</strong> er eit program som installerast og køyrer på din datamaskin. Dra &amp; slepp bilete inn i pLoader vindauget, clikk på <em>"Upload to Piwigo"</em> og la pLoader ta jobben. Du kan og finne andre program slik som <string>WinToPiwigo</strong> eller <strong>Digikam</strong> sitt tilleggsprogram for å eksportere til Piwigo.</li>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ploader">GÃ¥ til pLoader</a></p>
+
+<div id="helpSynchro">
+<ul>
+ <li><strong>FTP-overføring</strong> er den tilrådde måten å legge til store samlingar med bilete med eit minimum av klikk. Fylg hjelpinformasjonen for å tilrettelegge bileta. FTP-metoden let deg kontrollere den fysiske organiseringa av bileta på din nett-tenar.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ftp">GÃ¥ til FTP</a></p>
+</div> \ No newline at end of file
diff --git a/language/nn_NO/help/help_groups.html b/language/nn_NO/help/help_groups.html
new file mode 100755
index 000000000..04b4ff22a
--- /dev/null
+++ b/language/nn_NO/help/help_groups.html
@@ -0,0 +1,11 @@
+<p>Grupper er ein enkel måte å gje løyve til ei liste med brukarar.</p>
+
+<p>Opprett grupper i <span class="pwgScreen">Administrasjon &raquo; Brukarar
+&raquo; Grupper</span> og knytt brukarar til desse gruppene i
+<span class="pwgScreen">Administrasjon &raquo; Brukarar &raquo;
+Handter</span>.</p>
+
+<p>Ein brukar kan høyre til fleire grupper. Autorisering (løyve) overstyrer nekta tilgang:
+om bruker "olav" høyrer til gruppa "familie" og "venner", og
+bare gruppa "familie" kan sjå albumet "Jol 2010", då vil
+"olav" kunne sjå albumet "Jol 2010".</p> \ No newline at end of file
diff --git a/language/nn_NO/help/help_misc.html b/language/nn_NO/help/help_misc.html
new file mode 100755
index 000000000..7477277ef
--- /dev/null
+++ b/language/nn_NO/help/help_misc.html
@@ -0,0 +1,9 @@
+<p>Når du har oppretta galleriet ditt, kan du konfigurere det for besøkande
+<ul>
+ <li>Standarvising slik du ynskjer i <span class="pwgScreen">Administrasjon &raquo; Konfigurasjon &raquo; Innstillingar</span> fane <span class="pwgScreen">Innstillingar for gjester</span></li>
+ <li>Standard-tema i <span class="pwgScreen">Administrasjon &raquo; Konfigurasjon &raquo; Tema</span></li>
+ <li>Standard språk i <span class="pwgScreen">Administrasjon &raquo; Konfigurasjon &raquo; Språk</span></li>
+ </ul>
+ Som standard vil nye brukarar "arve" desse eigenskapane når dei vert registrera.
+</p>
+<p>Om du har spørsmål vil Piwigo-felleskapet ynskje deg velkomen på <a href="http://piwigo.org/forum">sitt forum</a>.</p> \ No newline at end of file
diff --git a/language/nn_NO/help/help_virtual_links.html b/language/nn_NO/help/help_virtual_links.html
new file mode 100755
index 000000000..52b51252b
--- /dev/null
+++ b/language/nn_NO/help/help_virtual_links.html
@@ -0,0 +1,12 @@
+<p>Bilete blir vist i albumet som høyrer til katalogen biletfila ligg
+i.</p>
+
+<p>Du kan og vise bilete i fleire album utan å kopiere biletfila på
+nett-tenaren. Du kan knytte biletet til eit eller fleire album frå
+skjermbiletet for endring av bilete (dette skjermbilete kan ein
+administrator få opp frå biletsida på galleriet).</p>
+
+<p>Virtuelle album er basera på dette konseptet: dei har ikkje
+nokon tilhøyrande katalog tilknyt. Lag virtuelle album frå
+ <span class="pwgScreen">Administrasjon &raquo; Album &raquo;
+Handter</span>.</p> \ No newline at end of file
diff --git a/language/nn_NO/help/history.html b/language/nn_NO/help/history.html
new file mode 100755
index 000000000..dfbfbb4ad
--- /dev/null
+++ b/language/nn_NO/help/history.html
@@ -0,0 +1,22 @@
+<h2>Historikk</h2>
+
+<p>På desse skjermbileta kan du overvaka vitjingshistorikk for galleriet i høve til dei innstillingane du har vald i: Administrasjon &raquo; Konfigurasjon &raquo; Innstillingar &raquo; Historikk</p>
+
+<h3>Statistikk</h3>
+<ul>
+ <p>Om du har vald å lagre sidevisingar (<span class="pwgScreen">index.php</span> og <span class="pwgScreen">picture.php</span>), kan du overvake dei frå denne fana.</p>
+ <li><strong>Global statistikk</strong>: visingar pr. år. </li>
+ <li><strong>Årleg statistikk</strong>: visingar pr. month i det valde året.</li>
+ <li><strong>Månadleg statistikk</strong>: visingar pr. dag i den valde månaden.</li>
+ <li><strong>Dagleg statistikk</strong>: visingar pr. time på den valde dagen.</li>
+</ul>
+
+<h3>Søk</h3>
+<ul>
+ <p>Om du har vald å lagre sidevisingar (<span class="pwgScreen">index.php</span> og <span class="pwgScreen">picture.php</span>), kan du bla i detaljar i denne fanna ved hjelp av ulike filter.</p>
+ <li><strong>Filtrer på dato:</strong> vel eit datointervall å søke i ved å seta start og slutt dato.</li>
+ <li><strong>Filtrer på type element:</strong> vel type element for statistikk for den type element.</li>
+ <li><strong>Filtrer på brukar:</strong> vel brukaren for statistikk knytt til den brukaren.</li>
+ <li><strong>Filtrer på bilet-identifikator (ID):</strong> vel ein bilet-identifikator (ID) for statustikk om dette biletet.</li>
+ <li><strong>Filtrer på namn på fila:</strong> vel eit filnamn for statistikk om denne fila.</li>
+</ul> \ No newline at end of file
diff --git a/language/nn_NO/help/notification_by_mail.html b/language/nn_NO/help/notification_by_mail.html
new file mode 100755
index 000000000..566ffd087
--- /dev/null
+++ b/language/nn_NO/help/notification_by_mail.html
@@ -0,0 +1,14 @@
+<h2>Varsling på e-post (Notification By Mail - NBM)</h2>
+
+<p>Konfigurering og handtering av e-postvarsling til brukarane for å varsle dei om endringar på galleriet.</p>
+
+<p>Dette skjermbiletet har tre arkfaner:</p>
+
+<h3>Innstillingar</h3>
+<p>Tilgjengeleg bare for webmaster. Denne set opp eigenskapar for e-postvarsling.</p>
+
+<h3>Abonner</h3>
+<p>Tilgjengeleg bare for webmaster. Denne arkfana handterar abonnering på e-postvarsling. Legg brukarar til lista over abonenntar for at dei skal få varsling på e-post.</p>
+
+<h3>Send</h3>
+<p>Tilgjengeleg bare for webmaster og administratorar. Denne arkfana gjev administratorar tilgang til å sende e-postvarsel til brukarar som har abonnera.</p> \ No newline at end of file
diff --git a/language/nn_NO/help/permalinks.html b/language/nn_NO/help/permalinks.html
new file mode 100755
index 000000000..d5164fe09
--- /dev/null
+++ b/language/nn_NO/help/permalinks.html
@@ -0,0 +1,7 @@
+<h2>Permalenker</h2>
+
+<p>Permalenker blir bruka til å lage URL til ablumet enklare å hugse. Når eit album har ei definera permalenke, trengst ikkje ID til ablument i URL lenger.</p>
+
+<p>Når ei permalenke blir sletta, kan du lagre den i permalenke-historikken, slik at eksterne lenker til sider i Piwigo galleriet framleis vil verke. I tabellen for permalenke-historikken kan du sjå datoen då permalenka vart sletta, sist den var i bruk og antal gonger permalenka har vorte bruka.</p>
+
+<p>Merk at permalenker må vera unike for kvart album. Permalenker i historikken kan heller ikkje vera definera meir enn ei gong.</p> \ No newline at end of file
diff --git a/language/nn_NO/help/photos_add_ftp.html b/language/nn_NO/help/photos_add_ftp.html
new file mode 100755
index 000000000..f44c646af
--- /dev/null
+++ b/language/nn_NO/help/photos_add_ftp.html
@@ -0,0 +1,66 @@
+<fieldset>
+ <legend>Kvikkstart</legend>
+
+<ol>
+ <li>Lag ei mappe på din datamaskin.</li>
+
+ <li>Kopier nokre bilete til denne mappa, skaler dei for vising på web. <em>Varsel</em>: namn på mapper og filer kan bare innehalde bokstavar (a - z, A - Z), tal, "-", "_" or ".". Ikkje bruk mellomrom eller spesielle tegn.</li>
+
+ <li>Med ein FTP-klient, kopier mappa til "galleries" mappa i din Piwigo installasjon.</li>
+
+ <li>Logg inn på ditt galleri og gå til <span class="pwgScreen">Administrasjon</span> og klikk på den store Synkronisering-knappen.</li>
+</ol>
+
+<p>Gratulere! Du har nå laga ditt fyrste album i biletgalleriet.</p>
+</fieldset>
+
+<fieldset>
+ <legend>Organisering av mapper og filer</legend>
+
+<ul>
+
+ <li>
+
+ <p>Albummapper er i Piwigo-mappa
+ "galleries". Her er mappestrukturen for eit lite galleri (men med bruk av mange funksjonar):</p>
+
+ <pre>
+galleries
+|-- bryllaup
+| |-- vielse
+| | |-- mottaking
+| | | |-- olav-aleine.jpg
+| | | +-- kari-aleie.jpg
+| | +-- avreise
+| | +-- olav-og-kari.jpg
+| +-- fest
+| |-- dansarar001.jpg
+| |-- dansarar002.jpg
+| +-- dansarar003.jpg
++-- bryllaupsreise
+ |-- hotell.png
+ |-- video-fraa-fly.avi
+ +-- pwg_representative
+ +-- video-fraa-fly.jpg
+</pre>
+
+ </li>
+
+ <li>Bortsett frå "pwg_representative" (sjå forklaring under), vil kvar mappe under "galleries" lage eit album. Det er ingen avgrensing på djubde.</li>
+
+ <li>Som utgangspunkt er eit element representera av ei file. Ei fil kan vera eit
+ Piwigo element om filtypa er blant <code>file_ext</code>
+ konfigurasjons-eigenskapan (sjå <span
+ class="filename">include/config_default.inc.php</span> file). Ei fil kan vera eit bilete om filtypa
+ er blant <code>picture_ext</code>
+ konfigurasjons-eigenskapan.</li>
+
+ <li>Ingen bilet-element (video, lyd, tekstfiler, eller kva som helst...) er som standard vist med eit ikon som samsvarar med filtypa. Valfritt, kan du knytte til ei miniatyrbilete og ein representatnt--fil til ei fil (sjå video.avi i dømet over).</li>
+
+ <li><em>Varsel</em>: namn på mapper og filer kan bare innehalde bokstavar (a - z, A - Z), tal, "-", "_" or ".". Ikkje bruk mellomrom eller spesielle tegn.</li>
+
+ <li>Når bilete er plassera korrekt i mapper, gå til: <span class="pwgScreen">Administrasjon &raquo; Verktøy &raquo;
+ Synkroniser</span></li>
+
+</ul>
+</fieldset> \ No newline at end of file
diff --git a/language/nn_NO/help/search.html b/language/nn_NO/help/search.html
new file mode 100755
index 000000000..a859ee643
--- /dev/null
+++ b/language/nn_NO/help/search.html
@@ -0,0 +1,23 @@
+<h2>Søk</h2>
+
+<p>Denne sida let deg søke etter bilete frå heile galleriet.</p>
+
+<dl>
+
+ <dt>Søk etter ord</dt>
+ <dd>Søk etter eit eller fleire ord i attributtane til bilete i galleriet.
+ Bruk * som tegn for oppgje bare delar av ordet.</dd>
+
+ <dt>Søk etter fotograf</dt>
+ <dd>Bruk * som tegn for oppgje bare delar av namnet.</dd>
+
+ <dt>Datosøk</dt>
+ <dd>Velg ein dato eller ein sluttdato for eit søk. Lat datofelted vera tomt
+ dersom du vil lage "før dato" spørring. Året i siste felted må skrivast inn
+ på fylgjande format: ÅÅÅÅ (døme: 2004)</dd>
+
+ <dt>Søk etter album</dt>
+ <dd>Velg album (eit eller fleire) du vil søke etter. Alla
+ underalbum kan bli søkt i dersom du i foreldrealbumet aktiverar søk i underalbum.</dd>
+
+</dl> \ No newline at end of file
diff --git a/language/nn_NO/help/synchronize.html b/language/nn_NO/help/synchronize.html
new file mode 100755
index 000000000..56295610e
--- /dev/null
+++ b/language/nn_NO/help/synchronize.html
@@ -0,0 +1,14 @@
+<h2>Synkronisering</h2>
+
+<p>Det er to typar synkronisering:</p>
+<ul>
+ <li>katalogar/filer</li>
+ <li>metadata for filer (bilete)</li>
+</ul>
+
+<p>Synkronisering av katalogar og filer handlar om å oppdatere katalogstrukturen med albumstrukturen i databasen.
+Synkronisering av metadata for filer (bilete) handlar om å oppdatere informasjon om bilete slik som filstørrelse, dimensjonar (i bildepunkt), EXIF eller IPTC informasjon med informasjon i databasen.</p>
+
+<p>Når synkronisering av opplasta bilete skal gjerast i galleriet, må du fyrst synkronisere katalogar og filer.</p>
+
+<p>Synkroniseringsprosessen kan ta lang tid (kjem an på kor mykje serveren er lasta og antal element som skal handterast), det er difor mogleg å gjera det for eit og eit album.</p> \ No newline at end of file
diff --git a/language/nn_NO/help/user_list.html b/language/nn_NO/help/user_list.html
new file mode 100755
index 000000000..187c2f8c2
--- /dev/null
+++ b/language/nn_NO/help/user_list.html
@@ -0,0 +1,23 @@
+<h2>Brukarliste</h2>
+
+<p>Her håndterar du brukarane i ditt Piwigo-galleri.</p>
+
+<h3>Legg til brukar</h3>
+
+<p>Ein administrator kan manuelt legge til brukarar. For kvar brukar må det leggast inn brukarnamn, passord og ei gyldig e-postadresse.</p>
+
+<h3>Brukarliste</h3>
+
+<p>Lista over eksisterande brukarar kan filtrerast på brukarnamn (bruk * som jokertegn), gruppe eller status. Lista kan sorterast på oppretta dato eller brukarnamn i stigande eller fallande retning.</p>
+
+<p>Dette skjermbilete gjev tilgang til å endre fleire brukarar om gongen. Fylgjande endringar kan gjerast:</p>
+
+<ul>
+ <li>slett brukar (treng stadfesting)</li>
+ <li>endre status på brukar</li>
+ <li>legge til eller ta bort frå grupper</li>
+ <li>endre visingseigenskapar</li>
+ <li>endre andre innstillingar</li>
+</ul>
+
+<p>Endringane vil bli gjort på vald brukar (som standard) eller alle brukaran vist i den filtrera lista.</p> \ No newline at end of file
diff --git a/language/nn_NO/install.lang.php b/language/nn_NO/install.lang.php
new file mode 100755
index 000000000..ee6a8f2df
--- /dev/null
+++ b/language/nn_NO/install.lang.php
@@ -0,0 +1,68 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+$lang['Database name'] = 'Databasenamn';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Du kan endre konfigurasjonen sjølv og ta omstart på Piwigo etterpå.';
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Du bør sjekke med dei som leverar nett-tenaren om korleis du kan byte til PHP5.';
+$lang['also given by your host provider'] = 'er og levera av den som leverar nett-tenaren';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'namna på databasetabellane vil verta prefiksa med dette (gjev deg mogleghet til å handtere databasetabellane betre)';
+$lang['enter a login for webmaster'] = 'skriv inn brukarnamn for webmaster';
+$lang['please enter your password again'] = 'skriv inn passord ei gong til';
+$lang['user login given by your host provider'] = 'brukarnamn du har fått av den som har nett-tenaren';
+$lang['user password given by your host provider'] = 'passord du har fått av den som har nett-tenaren';
+$lang['verification'] = 'sjekk';
+$lang['webmaster login can\'t contain characters \' or "'] = 'brukarnamn for webmaster kan ikkje innehalde tegna \' eller "';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Ikkje vent med å sjå på foruma våre for hjelp: %s';
+$lang['PHP 5 is required'] = 'PHP5 er påkrevd';
+$lang['Password ']['confirm'] = 'Passord [stadfest]';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo kan prøve å byte din konfigurasjon til PHP5 ved å lage eller endre fila .htaccess.';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo greidde ikkje å konfigurere PHP5.';
+$lang['Sorry!'] = 'Orsak!';
+$lang['Start Install'] = 'Start installasjon';
+$lang['Try to configure PHP 5'] = 'Prøv å konfigurere PHP5';
+$lang['User'] = 'Brukar';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'Dei som vitjar nettsida kan bruke denne e-postadressa for å kontakte administrator for nettsida';
+$lang['Welcome to my photo gallery'] = 'Velkomen til mitt biletgalleri';
+$lang['Welcome to your new installation of Piwigo!'] = 'Velkomen til din nye installasjon av Piwigo!';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Du kan laste ned konfigurasjonsfila og laste den opp til "local/config" katalogen i din installasjon.';
+$lang['Admin configuration'] = 'Administratorkonfigurasjone';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Ein alternativ løysing er å kopiere teksten i boksen over og lime den inn i fila "local/config/database.inc.php" (Åtvaring: "database.inc.php" kan bare innehalde det som er i tekstfeltet, ikkje lineskift eller mellomrom)';
+$lang['Basic configuration'] = 'Grunnleggande konfigurasjon';
+$lang['Can\'t connect to server'] = 'Kan ikkje kople til tenar';
+$lang['Congratulations, Piwigo installation is completed'] = 'Gratulere, installasjon av Piwigo er ferdig';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Kopling til tenar er vellukka, men tilkopling til databasen var ikkje mogleg.';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'Oppretting av konfigurasjonsfila "local/config/database.inc.php" feila.';
+$lang['Database configuration'] = 'Databasekonfigurasjon';
+$lang['Database table prefix'] = 'Prefiks for databasetabellar';
+$lang['Default gallery language'] = 'Standard språk for galleriet';
+$lang['Download the config file'] = 'Last ned konfigurasjonsfil';
+$lang['Hope to see you back soon.'] = 'Håpar å sjå deg att snart.';
+$lang['Host'] = 'Tenar';
+$lang['Installation'] = 'Installasjon';
+$lang['It appears your webhost is currently running PHP %s.'] = 'Det verkar som nettenaren køyrer PHP %s.';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Den vil bli vist til dei som vitjar galleriet. Den er naudsynt for administrasjon av nettsida';
+$lang['Just another Piwigo gallery'] = 'Enda eit Piwigo galleri';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'Hald dette hemmeleg, det gjev deg tilgang til administrasjonspanelet';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Treng du hjelp? Still spørsmålet ditt på <a href="%s"> Piwigo sitt forum</a>.';
+$lang['localhost or other, supplied by your host provider'] = 'localhost eller servernamn gjeve av administrator for server';
+?> \ No newline at end of file
diff --git a/language/nn_NO/iso.txt b/language/nn_NO/iso.txt
new file mode 100644
index 000000000..bf7b0f6fa
--- /dev/null
+++ b/language/nn_NO/iso.txt
@@ -0,0 +1 @@
+Nynorsk [NO] \ No newline at end of file
diff --git a/language/nn_NO/nn_NO.jpg b/language/nn_NO/nn_NO.jpg
new file mode 100644
index 000000000..68a8c096e
--- /dev/null
+++ b/language/nn_NO/nn_NO.jpg
Binary files differ
diff --git a/language/nn_NO/upgrade.lang.php b/language/nn_NO/upgrade.lang.php
new file mode 100755
index 000000000..830b779b2
--- /dev/null
+++ b/language/nn_NO/upgrade.lang.php
@@ -0,0 +1,40 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['All sub-albums of private albums become private'] = 'Alle underalbum av private album blir private';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'For å vera sikker så er fylgjande tilleggsmodular deaktivera. Du må sjekke for oppgraderingar for tilleggsmodular før du kan aktivere dei att.';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'For å vera sikker så er fylgjande tema deaktivera. Du må sjekke for oppgraderingar for tema før du kan aktivere dei att.';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'I <i>%s</i>, før <b>?></b>, sett inn:';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'Bare administrator kan utføre ei oppgradering: logg inn under.';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Bare miniatyrbilete-prefix og webmaster e-postadresse har blitt teke vare på frå den tidlegare versjonen';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Utfør ein vedlikehaldssjekk i [Administrasjon>Verktøy>Vedlikehald] om du oppdagar eit problem.';
+$lang['SQL queries'] = 'SQL-spørjingar';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Denne sida føreslår å oppgradere databasen frå din gamle Piwigo-versjon til den nye versjonen. Oppgraderingsassistenten meiner du kjøyrer <strong>versjon %s</strong> (eller ein samsvarande versjon)';
+$lang['User permissions and group permissions have been erased'] = 'Rettar til brukarar og grupper har blitt sletta';
+$lang['You do not have access rights to run upgrade'] = 'Du har ikkje løyve til å starte oppgradering';
+$lang['total SQL time'] = 'total SQL-tid';
+$lang['total upgrade time'] = 'total tid for oppgradering';
+$lang['Statistics'] = 'Statistikk';
+$lang['Upgrade'] = 'Oppgradering';
+$lang['Upgrade from version %s to %s'] = 'Oppgrader frå vesjon %s til %s';
+$lang['Upgrade informations'] = 'Oppgraderingsinformasjon';
+?> \ No newline at end of file
diff --git a/language/pl_PL/admin.lang.php b/language/pl_PL/admin.lang.php
index 6d2aca743..a83153b54 100644
--- a/language/pl_PL/admin.lang.php
+++ b/language/pl_PL/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -187,7 +187,6 @@ $lang['Access type'] = 'Typ dostępu';
$lang['Information data registered in database'] = 'Dane zapisane w bazie danych';
$lang['Default display'] = 'Wyświetlanie domyślne';
$lang['The gallery URL is not valid.'] = 'Adres URL galerii jest niepoprawny.';
-$lang['Main'] = 'Główne';
$lang['The number of comments a page must be between 5 and 50 included.'] = 'Liczba komentarzy na stronę musi być pomiędzy 5 a 50.';
$lang['Configuration'] = 'Konfiguracja';
$lang['confirm'] = 'potwierdź';
@@ -222,7 +221,6 @@ $lang['Prepared time for list of users to send mail is limited. Others users are
$lang['Time to send mail is limited. Others mails are skipped.'] = 'Czas wysłania wiadomości jest ograniczony. Pozostałe wiadomości zostaną pominięte.';
$lang['To send ?'] = 'Do wysłania ?';
$lang['Last send'] = 'Ostatnio wysłane';
-$lang['email'] = 'email';
$lang['User'] = 'Użytkownik';
$lang['See you soon,'] = 'Do zobaczenia wkrótce,';
$lang['Go to'] = 'Przejdź do ';
@@ -925,8 +923,6 @@ $lang['Duplicate selected tags'] = 'Zduplikuj wybrane tagi';
$lang['Name of the duplicate'] = 'Nazwa duplikatu';
$lang['Source tag'] = 'Tag źródłowy';
$lang['Tag "%s" is now a duplicate of "%s"'] = 'Tag "%s" jest teraz duplikatem "%s"';
-$lang['Format'] = 'Formatuj';
-$lang['Invalid dimension'] = 'Nieprawidłowy wymiar';
$lang['Landscape'] = 'Krajobraz';
$lang['Minimum height'] = 'Minimalna wysokość';
$lang['Minimum width'] = 'Minimalna szerokość';
@@ -935,8 +931,6 @@ $lang['Portrait'] = 'Portret';
$lang['Manage photos'] = 'Zarządzaj zdjęciami';
$lang['Number of albums per page'] = 'Liczba albumów na stronę';
$lang['View in gallery'] = 'Obejrzyj w galerii';
-$lang['Maximum'] = 'Maksimum';
-$lang['Minimum'] = 'Minimum';
$lang['Ratio'] = 'Proporcje';
$lang['between %d and %d pixels'] = 'pomiędzy %d i %d pikseli';
$lang['between %.2f and %.2f'] = 'pomiędzy %.2f i %.2f';
@@ -951,4 +945,32 @@ $lang['This group will be set to default'] = 'Ta grupa zostanie zaznaczona jako
$lang['This group will be unset to default'] = 'Ta grupa zostanie odznaczona jako domyślna';
$lang['Type here the name of the new group'] = 'Wpisz nazwÄ™ nowej grupy';
$lang['Purge user cache'] = 'Wyczyść pamięć podręczną użytkowników';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'Wymiary zdjęcia zostaną zmniejszone do %dx%d pikseli.';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'Z powodu używania GD jako biblioteki graficznej nie będzie możliwa zmiana rozmiaru po wgraniu zdjęcia na serwer.';
+$lang['Select at least one tag'] = 'Wybierz co najmniej jeden tag';
+$lang['Basic settings'] = 'Podstawowe ustawienia';
+$lang['General'] = 'Ogólne';
+$lang['Mail theme'] = 'Motyw maila';
+$lang['Showing %s to %s of %s users'] = 'Wyświetlam %s do %s z %s użytkowników';
+$lang['(filtered from %s total users)'] = '(wyfiltrowany z %s wszystkich użytkowników)';
+$lang['Users modified'] = 'Użytkownicy zmodyfikowani';
+$lang['on the %d selected users'] = 'na %d wybranych użytkownikach';
+$lang['%d of %d users selected'] = 'wybrano %d z %d użytkowników';
+$lang['All %d users are selected'] = 'Każdy z %d użytkowników został wybrany';
+$lang['No matching user found'] = 'Nie odnaleziono pasującego użytkownika';
+$lang['No user selected of %d users'] = 'Nie wybrano żadnego z %d użytkowników';
+$lang['No user selected, no action possible.'] = 'Nie wybrano żadnego użytkownika, żadna akcja nie jest możliwa.';
+$lang['Update user'] = 'Zaktualizuj użytkownika';
+$lang['User %s added'] = 'Dodano użytkownika %s';
+$lang['User %s updated'] = 'Użytkownik %s został zaktualizowany';
+$lang['Change password'] = 'Zmień hasło';
+$lang['Change username'] = 'Zmień nazwę użytkownika';
+$lang['Last visit on %s, %s.'] = 'Ostatnia wizyta %s, %s.';
+$lang['Loading...'] = 'Wczytywanie...';
+$lang['Password updated'] = 'Hasło zostało zaktualizowane';
+$lang['Registered on %s, %s.'] = 'Zarejestrowany %s, %s.';
+$lang['Show %s users'] = 'Pokaż %s użytkowników';
+$lang['Close user details'] = 'Zamknij szczegóły użytkownika';
+$lang['Open user details'] = 'Otwórz szczegóły użytkownika';
+$lang['close'] = 'zamknij';
?> \ No newline at end of file
diff --git a/language/pl_PL/common.lang.php b/language/pl_PL/common.lang.php
index a137fe46f..4c5bd519b 100644
--- a/language/pl_PL/common.lang.php
+++ b/language/pl_PL/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Polski [PL]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=430
Author: Piwigo team
Author URI: http://piwigo.org
@@ -246,7 +246,6 @@ $lang['login mustn\'t end with a space character'] = 'Login nie może posiadać
$lang['login mustn\'t start with a space character'] = 'Login nie może zaczynać się od znaku specjalnego';
$lang['this login is already used'] = 'ten login już istnieje';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'mail musi być w postaci xxx@yyy.eee (przykład : jack@altern.org)';
-$lang['please enter your password again'] = 'wprowadź hasło jeszcze raz';
$lang['Auto login'] = 'Pamiętaj mnie';
$lang['remove this tag from the list'] = 'usuń ten tag z listy';
$lang['representative'] = 'reprezentant';
@@ -274,7 +273,6 @@ $lang['SQL queries in'] = 'Zapytania SQL w';
$lang['display only recently posted photos'] = 'wyświetla tylko ostatnio umieszczone';
$lang['return to the display of all photos'] = 'powrót do wyświetlania wszystkich elementów';
$lang['the beginning'] = 'poczÄ…tek';
-$lang['Interface theme'] = 'Styl interfejsu';
$lang['Thumbnails'] = 'Miniatury';
$lang['Menu'] = 'Menu';
$lang['A comment on your site'] = 'Komentarz do Twojej strony';
@@ -416,4 +414,12 @@ $lang['Username is mandatory'] = 'Nazwa użytkownika jest obowiązkowa';
$lang['mandatory'] = 'obowiÄ…zkowo';
$lang['Website'] = 'Strona internetowa';
$lang['Your website URL is invalid'] = 'Adres Twojej strony internetowej jest niepoprawny';
+$lang['Email'] = 'E-mail';
+$lang['First Page'] = 'Pierwsza strona';
+$lang['Go back to the album'] = 'Wróć do albumu';
+$lang['Last Page'] = 'Ostatnia strona';
+$lang['Password is missing. Please enter the password.'] = 'Brak hasła. Proszę wprowadzić hasło.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Brak potwierdzenia hasła. Proszę potwierdzić wybrane hasło.';
+$lang['%d photos per page'] = '%d zdjęc na każdej stronie';
+$lang['Theme'] = 'Motyw';
?> \ No newline at end of file
diff --git a/language/pl_PL/index.php b/language/pl_PL/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/pl_PL/index.php
+++ b/language/pl_PL/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/pl_PL/install.lang.php b/language/pl_PL/install.lang.php
index f1aedf7b8..815deba70 100644
--- a/language/pl_PL/install.lang.php
+++ b/language/pl_PL/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -27,16 +27,12 @@ $lang['Default gallery language'] = 'Domyślny język galerii';
$lang['Database configuration'] = 'Konfiguracja bazy danych';
$lang['Admin configuration'] = 'Konfiguracja administratora';
$lang['Start Install'] = 'Rozpoczęcie instalacji';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'adres email musi być w postaci xxx@yyy.eee (np : jack@altern.org)';
-$lang['Webmaster login'] = 'Logowanie Webmastera';
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'To będzie wyświetlone dla odwiedzających i jest konieczne do celów administracyjnych ';
$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Połączenie do serwera powiodło się, ale nie było możliwe połączenie do bazy danych';
$lang['Can\'t connect to server'] = 'Nie można połączyć się do serwera';
$lang['Host'] = 'MySQL host';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
$lang['User'] = 'Użytkownik';
$lang['user login given by your host provider'] = 'login użytkownika otrzymany od dostawy';
-$lang['Password'] = 'Hasło';
$lang['user password given by your host provider'] = 'hasło użytkownika otrzymane od dostawcy';
$lang['Database name'] = 'Nazwa bazy danych';
$lang['also given by your host provider'] = 'także otrzymana od dostawcy';
@@ -45,12 +41,10 @@ $lang['database tables names will be prefixed with it (enables you to manage bet
$lang['enter a login for webmaster'] = 'wprowadź nazwę użytkownika posiadającego uprawnienia Webmaster';
$lang['webmaster login can\'t contain characters \' or "'] = 'login nie może zawierać następujących znaków \' lub "';
$lang['please enter your password again'] = 'wprowadź hasło jeszcze raz';
-$lang['Webmaster password'] = 'Hasło użytkownika Webmaster';
$lang['Keep it confidential, it enables you to access administration panel'] = 'Zachowaj hasło, umożliwia ono dostęp do panelu administracyjnego';
$lang['Password [confirm]'] = 'Hasło [potwierdź]';
$lang['verification'] = 'weryfikacja';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Potrzebujesz pomocy ? Zadaj pytanie na <a href="%s">Forum Piwigo</a>.';
-$lang['Webmaster mail address'] = 'Adres email Webmaster\'a';
$lang['Visitors will be able to contact site administrator with this mail'] = 'Z jego pomocą odwiedzający będą mogli się skontaktować z administratorem strony';
$lang['PHP 5 is required'] = 'PHP 5 jest wymagane';
$lang['It appears your webhost is currently running PHP %s.'] = 'Twój serwer aktualnie używa PHP w wersji %s.';
@@ -70,5 +64,5 @@ $lang['Just another Piwigo gallery'] = 'Kolejna galeria Piwigo';
$lang['Welcome to my photo gallery'] = 'Witaj w mojej galerii zdjęć';
$lang['Welcome to your new installation of Piwigo!'] = 'Witamy w Towjej nowej instalacji Piwigo!';
$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Nie obawiaj siÄ™ kontaktu na forum w celu skorzystania z pomocy: %s';
-
+$lang['localhost or other, supplied by your host provider'] = 'localhost lub iny, dostarczone przez Twojego dostawcÄ™';
?> \ No newline at end of file
diff --git a/language/pl_PL/upgrade.lang.php b/language/pl_PL/upgrade.lang.php
index 2114e430c..68266111e 100644
--- a/language/pl_PL/upgrade.lang.php
+++ b/language/pl_PL/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/pt_BR/about.html b/language/pt_BR/about.html
index 231726a65..b0bf3c6a8 100644
--- a/language/pt_BR/about.html
+++ b/language/pt_BR/about.html
@@ -3,7 +3,7 @@
<li>Piwigo é desenvolevido em PHP com uma base de dados MySQL.</li>
<li>Se houver sugestões ou comentários, visite o <a
- href="http://piwigo.org">sitio oficial</a> e <a href="http://piwigo.org/forum">seu forum</a>.</li>
+ href="http://piwigo.org">sitio oficial</a> e <a href="http://br.piwigo.org/forum">seu forum</a>.</li>
<p>A tradução Brasil é mantida por (em ordem alfabética):
diff --git a/language/pt_BR/admin.lang.php b/language/pt_BR/admin.lang.php
index 7c096a47b..eb30d7a4e 100644
--- a/language/pt_BR/admin.lang.php
+++ b/language/pt_BR/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -23,12 +23,12 @@
$lang['%d association'] = '%d associação';
$lang['%d associations'] = '%d associações';
-$lang['%d album including'] = '%d categoria incluída ';
-$lang['%d albums including'] = '%d categorias incluídas ';
+$lang['%d album including'] = '%d álbum incluído';
+$lang['%d albums including'] = '%d álbuns incluídos ';
$lang['%d physical'] = '%d físico';
$lang[' and %d virtual'] = ' e %d virtual';
-$lang['%d album moved'] = '%d categoria movida';
-$lang['%d albums moved'] = '%d categorias movidas';
+$lang['%d album moved'] = '%d álbum movido';
+$lang['%d albums moved'] = '%d álbuns movidos';
$lang['%d group'] = '%d grupo';
$lang['%d groups'] = '%d grupos';
$lang['%d member'] = '%d membro';
@@ -52,12 +52,12 @@ $lang['Add a user'] = 'Adicionar um usuário';
$lang['Add group'] = 'Adicionar um grupo';
$lang['Add'] = 'Adicionar';
$lang['Allow user registration'] = 'Permitir o registro de usuário';
-$lang['Apply to sub-albums'] = 'Aplicar às subcategorias';
+$lang['Apply to sub-albums'] = 'Aplicar aos sub-álbuns';
$lang['Associated'] = 'Associados(as)';
$lang['Caddie management'] = 'Gerenciamento da cesta';
$lang['Caddie'] = 'Cesta';
-$lang['Albums authorized thanks to group associations'] = 'Categorias autorizadas graças a associações de grupo';
-$lang['Album manual order was saved'] = 'A ordem manual das categorias foi salva';
+$lang['Albums authorized thanks to group associations'] = 'Ãlbuns autorizados graças às associações de grupo';
+$lang['Album manual order was saved'] = 'A ordem manual dos álbuns foi salva';
$lang['Check for upgrade failed for unknown reasons.'] = 'A checagem por atualização falhou por razões desconhecidas.';
$lang['Check for upgrade'] = 'Checar por atualização';
$lang['Comments for all'] = 'Comentários para todos';
@@ -65,7 +65,7 @@ $lang['Current name'] = 'Nome atual';
$lang['Database'] = 'Base de dados';
$lang['Deactivate'] = 'Desativar';
$lang['Delete Representant'] = 'Apagar representante';
-$lang['Delete selected tags'] = 'Apagar tags selecionadas';
+$lang['Delete selected tags'] = 'Excluir tags selecionadas';
$lang['Delete selected users'] = 'Apagar usuários selecionados';
$lang['Deletions'] = 'Itens apagados';
$lang['Deny selected groups'] = 'Negar os grupos selecionados';
@@ -79,9 +79,9 @@ $lang['Edit tags'] = 'Editar tags';
$lang['Email admins when a new user registers'] = 'Notificar os administradores quando um novo usuário se registrar';
$lang['Email admins when a valid comment is entered'] = 'Notificar os administradores quando um comentário aprovado for incluído';
$lang['Email admins when a comment requires validation'] = 'Notificar os administradores quando um comentário necessitar de aprovação';
-$lang['Environment'] = 'Arredores';
+$lang['Environment'] = 'Ambiente';
$lang['Form'] = 'Formulário';
-$lang['Gallery title'] = 'título da galeria';
+$lang['Gallery title'] = 'Título da galeria';
$lang['Grant selected groups'] = 'Permitir os grupos selecionados';
$lang['Grant selected users'] = 'Permitir os usuários selecionados';
$lang['Group name'] = 'Nome do grupo';
@@ -90,38 +90,38 @@ $lang['Guests'] = 'Visitantes';
$lang['History'] = 'Histórico';
$lang['Informations'] = 'Informações';
$lang['Install'] = 'Instalar';
-$lang['Link all album photos to a new album'] = 'Vincular (lincar) todos os itens da categoria a uma nova categoria';
-$lang['Link all album photos to some existing albums'] = 'Vincular (lincar) todos os itens da categoria a alguma(s) categoria existente';
-$lang['Linked albums'] = 'Categorias vinculadas (Linked)';
+$lang['Link all album photos to a new album'] = 'Vincular (lincar) todos os itens do álbum em um novo álbum';
+$lang['Link all album photos to some existing albums'] = 'Vincular (lincar) todos os itens do álbum a algum(s) álbum existente';
+$lang['Linked albums'] = 'Ãlbuns vinculados (Linked)';
$lang['Lock gallery'] = 'Trancar a galeria';
$lang['Maintenance'] = 'Manutenção';
-$lang['Edit album permissions'] = 'Gerenciar permissões da categoria';
+$lang['Edit album permissions'] = 'Gerenciar permissões do álbum';
$lang['Manage permissions for group "%s"'] = 'Gerenciar permissões do grupo "%s"';
$lang['Manage permissions for user "%s"'] = 'Gerenciar permissões do usuário "%s"';
$lang['Manage tags'] = 'Gerenciar tags';
$lang['Members'] = 'Membros';
$lang['Metadata synchronized from file'] = 'Metadados sincronizados do arquivo';
-$lang['Move albums'] = 'Mover categorias';
+$lang['Move albums'] = 'Mover álbuns';
$lang['Move'] = 'Mover';
$lang['Name'] = 'Nome';
$lang['New name'] = 'Nome novo';
-$lang['New parent album'] = 'Nova categoria pai (parent category)';
+$lang['New parent album'] = 'Novo álbum pai (parent album)';
$lang['New tag'] = 'Tag nova';
$lang['Number of comments per page'] = 'Número de comentários por página';
$lang['Number of rates'] = 'Número de votos';
$lang['Number of thumbnails to create'] = 'Número de miniaturas (thumbnails) a ser criado';
-$lang['Only private albums are listed'] = 'Apenas as categorias privadas estão listadas';
+$lang['Only private albums are listed'] = 'Apenas os álbuns privados estão listados';
$lang['Operating system'] = 'Sistema operacional';
$lang['Options'] = 'Opções';
-$lang['Other private albums'] = 'Outras categorias privadas';
+$lang['Other private albums'] = 'Outros álbuns privados';
$lang['Page banner'] = 'Banner da página (imagem que fica no cabeçalho)';
-$lang['Parent album'] = 'Categoria pai';
+$lang['Parent album'] = 'Ãlbum pai';
$lang['Path'] = 'Caminho (path)';
$lang['Permalink'] = 'Permalink (endereço permanente)';
-$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'Permalink %s já está sendo usado pela categoria %s. Apague do histórico do permalink primeiro';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'Permalink %s já está sendo usado pelo álbum %s. Apague do histórico do permalink primeiro';
$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'O permalink deve ser composto de a-z, A-Z, 0-9, "-", "_" ou "/". Não deve ser numérico ou começar com número seguido de "-"';
-$lang['Permalink %s is already used by album %s'] = 'Permalink %s já está sendo usado pela categoria %s';
-$lang['Permalink history'] = 'Histórico permalink';
+$lang['Permalink %s is already used by album %s'] = 'Permalink %s já está sendo usado pelo álbum %s';
+$lang['Permalink history'] = 'Histórico de permalinks';
$lang['Permalinks'] = 'Permalinks';
$lang['Permission denied'] = 'Permissão negada';
$lang['Permission granted thanks to a group'] = 'Permissão garantida graças ao grupo';
@@ -137,22 +137,22 @@ $lang['Rating by guests'] = 'Votado(a) pelos visitantes';
$lang['Rating'] = 'Avaliação';
$lang['Reject'] = 'Rejeitar';
$lang['Representant'] = 'Representante';
-$lang['Representation of albums'] = 'Representante das categorias';
+$lang['Representation of albums'] = 'Representante dos álbuns';
$lang['Representative'] = 'Representativo';
$lang['Represents'] = 'Representa';
$lang['Save order'] = 'Salvar ordem';
-$lang['Save to permalink history'] = 'Salvar no histórico permalink';
-$lang['Select at least one album'] = 'Selecionar ao menos uma categoria';
-$lang['Select at least one photo'] = 'Selecionar ao menos uma imagem';
+$lang['Save to permalink history'] = 'Salvar no histórico de permalinks';
+$lang['Select at least one album'] = 'Selecione ao menos um álbum';
+$lang['Select at least one photo'] = 'Selecionar ao menos uma foto';
$lang['Select at least one user'] = 'Selecionar ao menos um usuário';
$lang['Show info'] = 'Mostrar info';
$lang['Site manager'] = 'Gerenciador do site';
$lang['Status'] = 'Status';
-$lang['Statistics'] = 'Statísticas';
-$lang['Storage album'] = 'categoria da armazenagem';
+$lang['Statistics'] = 'Estatísticas';
+$lang['Storage album'] = 'Ãlbum de armazenagem';
$lang['Sum of rates'] = 'Soma dos valores';
$lang['Tag "%s" already exists'] = 'A tag "%s" já existe';
-$lang['Tag "%s" was added'] = 'A tage "%s" foi adicionada';
+$lang['Tag "%s" was added'] = 'A tag "%s" foi adicionada';
$lang['Tag selection'] = 'Seleção de tag';
$lang['The %d following tags were deleted'] = 'As %d tags seguintes foram apagadas';
$lang['Unable to check for upgrade.'] = 'Não foi possível checar as atualizações.';
@@ -163,42 +163,41 @@ $lang['Users'] = 'Usuários';
$lang['Validate'] = 'Aprovar';
$lang['Validation'] = 'Aprovação';
$lang['Version'] = 'Versão';
-$lang['Virtual albums to move'] = 'Categorias virtuais a serem movidas';
-$lang['Virtual album name'] = 'Nome da categoria virtual';
+$lang['Virtual albums to move'] = 'Ãlbuns virtuais a serem movidos';
+$lang['Virtual album name'] = 'Nome do álbum virtual';
$lang['Webmaster cannot be deleted'] = 'Webmaster não pode ser apagado';
$lang['You are running on development sources, no check possible.'] = 'Você está navegando em fontes de desenvolvimento, nenhuma checagem é possível.';
$lang['You cannot delete your account'] = "Você não pode apagar sua conta";
-$lang['You cannot move an album in its own sub album'] = 'Você não pode mover uma categoria em sua própria sub categoria.';
+$lang['You cannot move an album in its own sub album'] = 'Você não pode mover um álbum em seu próprio sub-álbum.';
$lang['You need to confirm deletion'] = 'Você precisa confirmar a remoção';
-$lang['Associate to album'] = 'associar à categoria';
+$lang['Associate to album'] = 'Associar ao álbum';
$lang['associate to group'] = 'associar ao grupo';
$lang['Authorized'] = 'Autorizado';
-$lang['Add a virtual album'] = 'Adicionar uma categoria virtual';
-$lang['Authorize users to add comments on selected albums'] = 'Autorizar os usuários a adicionar comentários nas categorias selecionadas';
-$lang['The name of an album must not be empty'] = 'O nome de uma categoria não deveria ser vazio';
-$lang['Lock albums'] = 'Trancar categorias';
-$lang['Private'] = 'Categorias privadas';
-$lang['Public'] = 'Categorias públicas';
-$lang['Find a new representant by random'] = 'Encontrar um novo representante aleatoriamente';
+$lang['Add a virtual album'] = 'Adicionar um álbum virtual';
+$lang['Authorize users to add comments on selected albums'] = 'Autorizar os usuários a adicionar comentários nos álbuns selecionados';
+$lang['The name of an album must not be empty'] = 'O nome de um álbum não pode ser vazio';
+$lang['Lock albums'] = 'Trancar álbuns';
+$lang['Private'] = 'Ãlbuns privados';
+$lang['Public'] = 'Ãlbuns públicos';
+$lang['Find a new representant by random'] = 'Escolha aleatoriamente um novo representante para este álbum';
$lang['Public / Private'] = 'Público / Privado';
-$lang['Manage authorizations for selected albums'] = 'Gerenciar as autorizações para categorias selecionadas';
-$lang['Virtual album added'] = 'Categoria virtual adicionada';
-$lang['Virtual album deleted'] = 'Categoria virtual apagada';
+$lang['Manage authorizations for selected albums'] = 'Gerenciar as autorizações para álbuns selecionados';
+$lang['Virtual album added'] = 'Ãlbum virtual adicionado';
+$lang['Virtual album deleted'] = 'Ãlbum virtual apagado';
$lang['Access type'] = 'Tipo de acesso';
$lang['Information data registered in database'] = 'Dado de informação registrado na base de dados';
$lang['Default display'] = 'Exibição padrão (Default display)';
$lang['The gallery URL is not valid.'] = 'O URL (endereço) da galeria não é valido.';
-$lang['Main'] = 'Principal';
$lang['The number of comments a page must be between 5 and 50 included.'] = 'O número de comentários por página deve ser entre 5 e 50 .';
$lang['Configuration'] = 'Configuração';
$lang['confirm'] = 'confirmar';
$lang['Date'] = 'Data';
-$lang['delete album'] = 'apagar categoria';
-$lang['Dissociate from album'] = 'desassociar da categoria';
+$lang['delete album'] = 'apagar o álbum';
+$lang['Dissociate from album'] = 'Desassociar do álbum';
$lang['dissociate from group'] = 'desassociar do grupo';
-$lang['Album updated successfully'] = 'As informações da categoria foram atualizadas com sucesso.';
+$lang['Album updated successfully'] = 'As informações do álbum foram atualizadas com sucesso';
$lang['photos per page'] = 'itens por página';
-$lang['High definition enabled'] = 'Auta definição ativada';
+$lang['High definition enabled'] = 'Alta definição ativada';
$lang['File'] = 'Arquivo';
$lang['first photo added on %s'] = 'primeiro item adicionado em %s';
$lang['Forbidden'] = 'Proibido';
@@ -209,13 +208,13 @@ $lang['group "%s" updated'] = 'grupo "%s" atualizado';
$lang['The name of a group must not contain " or \' or be empty.'] = 'O nome de um grupo não deve conter " ou \' ou ser vazio.';
$lang['This name is already used by another group.'] = 'Este nome já está sendo usado por outro grupo.';
$lang['High definition'] = 'Alta definição';
-$lang['jump to album'] = 'pular para categoria';
-$lang['jump to photo'] = 'pular para imagem';
+$lang['jump to album'] = 'ir para o álbum';
+$lang['jump to photo'] = 'ir para imagem';
$lang['leave'] = 'deixar (leave)';
$lang['Lock'] = 'Trancar (Lock)';
$lang['Locked'] = 'Trancado(a) (Locked)';
-$lang['manage album photos'] = 'gerenciar os itens da categoria';
-$lang['manage sub-albums'] = 'gerenciar subcategorias';
+$lang['manage album photos'] = 'gerenciar as fotos do álbum';
+$lang['manage sub-albums'] = 'gerenciar sub-álbuns';
$lang['Manage'] = 'Gerenciar';
$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'O tempo de execução acabou, tratamento deve ser contínuo [Tempo estimado: %d segundo].';
$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'O tempo de execução acabou, tratamento deve ser contínuo [Tempo estimado: %d segundos].';
@@ -223,7 +222,6 @@ $lang['Prepared time for list of users to send mail is limited. Others users are
$lang['Time to send mail is limited. Others mails are skipped.'] = 'O tempo para enviar email é limitado. Outros emails estão desconsiderados.';
$lang['To send ?'] = 'Enviar ?';
$lang['Last send'] = 'Enviado pela última vez';
-$lang['email'] = 'email';
$lang['User'] = 'Usuário';
$lang['See you soon,'] = 'Até breve,';
$lang['Go to'] = 'Ir à(ao) ';
@@ -232,15 +230,15 @@ $lang['New photos were added'] = 'Novos itens foram adicionados ';
$lang['on'] = ' em ';
$lang['between'] = 'entre ';
$lang['and'] = ' e ';
-$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'O webmaster lhe incluiu na assinatura que lhe pemitirá receber notificações por email.';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'O webmaster inscreveu você para receber notificações por email.';
$lang['You have subscribed to receiving notifications by mail.'] = 'Você está na assinatura para receber notificações por email.';
-$lang['To subscribe'] = 'Assinar';
-$lang['If you encounter problems or have any question, please send a message to'] = 'Se você encontrar problemas ou tiver qualquer pergunta, por favor envie uma mensagem para ';
+$lang['To subscribe'] = 'Para assinar';
+$lang['If you encounter problems or have any question, please send a message to'] = 'Se encontrar problemas ou tiver qualquer pergunta, por favor envie uma mensagem para ';
$lang['[NBM] Problems or questions'] = '[Notificação] Problemas ou perguntas';
-$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'O webmaster lhe retirou da assinatura para receber notificações por email.';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'O webmaster cancelou sua inscrição para você não receber notificações por email.';
$lang['You have unsubscribed from receiving notifications by mail.'] = 'Você saiu da assinatura para receber notificações por email.';
$lang[', click on'] = ', clique em ';
-$lang['To unsubscribe'] = 'Cancelar assinatura';
+$lang['To unsubscribe'] = 'Para cancelar a assinatura';
$lang['With blank value, gallery title will be used'] = 'Com valor em branco, o título da galeria será usado';
$lang['Notification'] = 'Notificação';
$lang['Error when sending email to %s [%s].'] = 'Erro ao enviar email para %s [%s].';
@@ -298,7 +296,7 @@ $lang['clean'] = 'limpar';
$lang['Create this site'] = 'Criar este site';
$lang['test'] = 'testar';
$lang['test this remote site'] = 'testar ste site remoto';
-$lang['remove tags'] = 'remover tags';
+$lang['remove tags'] = 'Remover tags';
$lang['Repair and optimize database'] = 'Reparar e otimizar base de dados';
$lang['selection'] = 'seleção';
$lang['set to'] = 'iniciar';
@@ -313,16 +311,16 @@ $lang['Remote'] = 'Remoto';
$lang['update the database from files'] = 'usar os arquivos para atualizar a base de dados';
$lang['status'] = 'status';
$lang['Directory'] = 'Diretório';
-$lang['sub-albums'] = 'subcategorias';
-$lang['Synchronize metadata'] = 'sincronizar metadado';
-$lang['target'] = 'meta';
+$lang['sub-albums'] = 'sub-álbuns';
+$lang['Synchronize metadata'] = 'Sincronizar metadado';
+$lang['target'] = 'alvo';
$lang['Thumbnail'] = 'Miniatura';
-$lang['Title'] = 'título';
-$lang['Album list management'] = 'Gerenciamento de categorias';
+$lang['Title'] = 'Título';
+$lang['Album list management'] = 'Gerenciamento de álbuns';
$lang['Piwigo configuration'] = 'Configuração Piwigo';
-$lang['Edit album'] = 'Editar uma categoria';
+$lang['Edit album'] = 'Editar álbum';
$lang['Group management'] = 'Gerenciamento de grupo';
-$lang['User list'] = 'Lista de usuário';
+$lang['User list'] = 'Lista de usuários';
$lang['Edit photo information'] = 'Modificar informações sobre uma imagem';
$lang['Database synchronization with files'] = 'Sincronização da base de dados com os arquivos';
$lang['all'] = 'tudo';
@@ -339,25 +337,25 @@ $lang['for this file format'] = 'para este formato de arquivo';
$lang['unit mode'] = 'modo unitário';
$lang['Unlocked'] = 'Destrancado (Unlocked)';
$lang['unset'] = 'sem valor (não ajustado)';
-$lang['Update albums informations'] = 'Atualizar as informações das categorias';
-$lang['Update photos information'] = 'Atualizar as informações das imagens';
+$lang['Update albums informations'] = 'Atualizar as informações dos álbuns';
+$lang['Update photos information'] = 'Atualizar as informações das fotos';
$lang['Synchronize'] = 'Sincronizar';
-$lang['reduce to single existing albums'] = 'reduzir as categorias existentes em apenas uma';
+$lang['reduce to single existing albums'] = 'reduzir os álbuns existentes em apenas um';
$lang['Choose an option'] = 'Escolher uma opção';
-$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'exibir o máximo de informações (categorias e itens adicionados, categorias e itens apagados)';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'exibir o máximo de informações (álbuns e fotos adicionados, álbuns e fotos apagados)';
$lang['Error list'] = 'Lista de erros';
$lang['Errors caption'] = 'Captura de erros';
$lang['Detailed informations'] = 'Informações detalhadas';
$lang['File/directory read error'] = 'Erro de leitura em arquivo/diretório';
$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'O arquivo ou diretório não pode ser acessado (ou ele não existe ou o acesso está negado)';
-$lang['albums deleted in the database'] = 'categorias apagadas da base de dados';
+$lang['albums deleted in the database'] = 'álbuns apagados da base de dados';
$lang['photos deleted from the database'] = 'itens apagados da base de dados';
$lang['photos candidates for metadata synchronization'] = 'imagens candidatas para a sincronização com o metadado';
$lang['photos informations synchronized with files metadata'] = 'as informações dos itens foram sincronizados com o metadado dos arquivos';
$lang['errors during synchronization'] = 'erros durante a sincronização';
-$lang['albums added in the database'] = 'categorias adicionadas à base de dados';
+$lang['albums added in the database'] = 'álbuns adicionados à base de dados';
$lang['photos added in the database'] = 'itens adicionados à base de dados';
-$lang['photos updated in the database'] = 'itens atualizados à base de dados';
+$lang['photos updated in the database'] = 'itens atualizados na base de dados';
$lang['Search for new images in the directories'] = 'Pesquisar novas imagens nos diretórios';
$lang['added'] = 'adicionado(a)';
$lang['deleted'] = 'apagado(a)';
@@ -370,7 +368,7 @@ $lang['synchronize files structure with database'] = 'sincronizar a estrutura do
$lang['synchronize files metadata with database photos informations'] = 'sincronizar o metadado dos arquivos com as informações dos itens da base de dados';
$lang['even already synchronized photos'] = 'itens já sincronizados';
$lang['Used metadata'] = 'Metadados usados';
-$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'O nome dos diretórios e dos arquivos devem ser compostos de letras, números, "-", "_" ou "."';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'O nome dos diretórios e dos arquivos devem conter somente letras, números, "-", "_" ou "."';
$lang['wrong filename'] = 'nome de arquivo errado';
$lang['Upload'] = 'Enviar (Upload)';
$lang['user "%s" added'] = 'adicionado usuário "%s" ';
@@ -380,7 +378,7 @@ $lang['user_status_generic'] = 'Genérico';
$lang['user_status_guest'] = 'Visitante';
$lang['user_status_normal'] = 'Usuário';
$lang['user_status_webmaster'] = 'Webmaster';
-$lang['Virtual album'] = 'Categoria virtual';
+$lang['Virtual album'] = 'Ãlbum virtual';
$lang['Waiting'] = 'Aguardando';
$lang['default'] = 'padrão';
$lang['Toggle \'default group\' property'] = 'Ligar/Desligar \'gruppo padrão\' propriedade';
@@ -397,10 +395,10 @@ $lang['Section'] = 'Seção';
$lang['An information email was sent to group "%s"'] = 'Um email informativo foi foi enviado para o grupo "%s';
$lang['Send an information email to group members'] = 'Enviar um email informativo aos membros do grupo';
$lang['Group'] = 'Grupo';
-$lang['[%s] Visit album %s'] = '[%s] Venha visitar a categoria %s';
+$lang['[%s] Visit album %s'] = '[%s] Venha visitar o álbum %s';
$lang['Hello,'] = 'Olá,';
$lang['See you soon.'] = 'Até breve.';
-$lang['Discover album:'] = 'Venha descobrir a categoria:';
+$lang['Discover album:'] = 'Venha descobrir o álbum:';
$lang['Mail content'] = 'conteúdo da correspondência';
$lang['none'] = 'nenhum';
$lang['high'] = 'alto';
@@ -463,7 +461,7 @@ $lang['Uncheck all'] = 'desmarcar tudo';
$lang['Check automatic corrections'] = 'Checar correções automáticas';
$lang['Apply selected corrections'] = 'Aplicar as correções selecionadas';
$lang['Ignore selected anomalies'] = 'Ignorar as anomalias selecionadas';
-$lang['Refresh'] = 'Refresh (Carregar novamente)';
+$lang['Refresh'] = 'Substituir';
$lang['The anomaly will be ignored until next application version'] = 'A anomalia será ignorada até a próxima versão da aplicação';
$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'A correção da anomalia irá cancelar o fato de que está ignorada';
$lang['%d anomaly has been ignored.'] = '%d anomalia foi ignorada.';
@@ -498,7 +496,7 @@ $lang['Piwigo Administration'] = 'Administração Piwigo';
$lang['Piwigo version'] = 'Versão Piwigo';
$lang['You are running the latest version of Piwigo.'] = 'Você está usando a última versão de Piwigo.';
$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'A versão instalada de %s [%s] não é compatível com a versão requerida [%s]';
-$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'Você precisa atualizar seu sistema para aproveitar ao máximo a aplicação, do contrário, a aplicação não funcionará completa ou corretamente.';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'Você precisa atualizar seu sistema para aproveitar ao máximo esta aplicação, caso contrário, a aplicação pode não funcionar completa ou corretamente.';
$lang['Deleted on'] = 'Apagada em';
$lang['Last hit'] = 'Último acesso (Last hit)';
$lang['GD library is missing'] = 'está faltanto a GD library';
@@ -515,9 +513,9 @@ $lang['Optimizations have been completed with some errors.'] = 'As otimizações
$lang['Modify information'] = 'Modificar informação';
$lang['nothing'] = 'nada';
$lang['overrides existing values with empty ones'] = 'sobrepor os valores existentes com valores vazios';
-$lang['Manage photo ranks'] = 'Gerenciar posições (image ranks)';
+$lang['Manage photo ranks'] = 'Ordenação das fotos';
$lang['Edit ranks'] = 'Editar posições (ranks)';
-$lang['No photo in this album'] = 'Nenhum item nesta categoria';
+$lang['No photo in this album'] = 'Nenhum item nesse álbum';
$lang['Images manual order was saved'] = 'A ordem manual das imagens foi salva';
$lang['ranks'] = 'posições (ranks)';
$lang['Drag to re-order'] = 'Arraste para reordenar';
@@ -546,9 +544,9 @@ $lang['%d photos uploaded'] = '%d fotos enviadas';
$lang['%s has been successfully updated.'] = '%s foi atualizado com sucesso.';
$lang['%s photos can not be regenerated'] = '%s fotos não puderam ser recriadas';
$lang['%s photos have been regenerated'] = '%s fotos foram ser recriadas';
-$lang['(this tag will be deleted)'] = '(esta etiqueta será excluida)';
+$lang['(this tag will be deleted)'] = '(esta tag será excluída)';
$lang['+ Add an upload box'] = '+ Inserir uma caixa de envio';
-$lang['... or '] = '... ou';
+$lang['... or '] = '... ou ';
$lang['Action'] = 'Ação';
$lang['Activate icon "%s"'] = 'Ativar ícone "%s"';
$lang['Activate icon "new" next to albums and pictures'] = 'Ativar ícone "novo" próximo a àlbuns e imagens';
@@ -564,12 +562,12 @@ $lang['Add another set of photos'] = 'Inserir outro conjunto de fotos';
$lang['Add New Language'] = 'Inserir novo idioma';
$lang['Add New Theme'] = 'Inserir um novo tema';
$lang['Add Photos'] = 'Inserir fotos';
-$lang['Add tags'] = 'Inserir etiquetas';
+$lang['Add tags'] = 'Inserir tags';
$lang['Add write access to the "%s" directory'] = 'Adicionar acesso de gravação ao diretório "%s"';
$lang['Administration Home'] = 'Administração';
$lang['Album "%s" has been added'] = 'Ãlbum "%s" foi inserido';
$lang['Album "%s" now contains %d photos'] = 'Ãlbum "%s" contém agora %d fotos';
-$lang['Album name'] = 'Nome do Ãlbum';
+$lang['Album name'] = 'Nome do álbum';
$lang['Album photos associated to the following albums: %s'] = 'Ãlbum associado aos seguintes álbuns: %s';
$lang['Albums automatically sorted'] = 'Albuns classificados automaticamente';
$lang['All %d photos are selected'] = 'Todas as %d fotos foram selecionadas';
@@ -590,13 +588,13 @@ $lang['automatic order'] = 'Ordem automática';
$lang['Batch Manager'] = 'Gerenciador de lotes';
$lang['Bound Theme'] = 'Tema vinculado';
$lang['By %s'] = 'Por %s';
-$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'Por padrão, Piwigo irá criar um novo tamhanho web a partir da versão HD (alta definição) da sua foto.';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'Por padrão, Piwigo criará um novo tamanho web a partir da versão HD (alta definição) da sua foto.';
$lang['By rank'] = 'Por classificação';
$lang['Cannot delete the old permalink !'] = 'O antigo link permanente não pode ser deletado!';
$lang['Change Admin Colors'] = 'Trocar cores da administração';
-$lang['Choose an action'] = 'Escolher uma ação';
+$lang['Choose an action'] = 'Escolha uma ação';
$lang['Confirm merge'] = 'Confirme a fusão';
-$lang['create a new album'] = 'criar uma nova categoria';
+$lang['create a new album'] = 'criar um novo álbum';
$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Criar o diretório "%s" no diretório raiz de instalação do seu Piwigo';
$lang['Create'] = 'Criar';
$lang['Crop'] = 'Cortar';
@@ -609,7 +607,7 @@ $lang['Delete this theme'] = 'Excluir esse tema.';
$lang['Directory does not exist'] = 'Essa pasta não existe.';
$lang['Do you want to activate anyway?'] = 'Você deseja mesmo ativar?';
$lang['Download,'] = 'Baixar,';
-$lang['Drop into album'] = 'Selecione uma categoria';
+$lang['Drop into album'] = 'Selecione um álbum';
$lang['Dump Database'] = 'Limpar Banco de Dados';
$lang['Duplicates'] = 'Duplicados';
$lang['ERROR'] = 'ERRO';
@@ -649,7 +647,7 @@ $lang['Languages'] = 'Idiomas';
$lang['Last import'] = 'Última importação';
$lang['Learn more'] = 'Saiba mais';
$lang['Main Page'] = 'Página Principal';
-$lang['delete photo'] = 'Excluir foto.';
+$lang['delete photo'] = 'Excluir foto';
$lang['delete'] = 'Excluir.';
$lang['display'] = 'Exibir';
$lang['existing album'] = 'Cagtegoria já existe';
@@ -688,17 +686,17 @@ $lang['Available versions for'] = 'Versões disponíveis para';
$lang['By default, the center of interest is placed in the middle of the photo.'] = 'Por padrão, o centro de interesse é colocado no meio da foto.';
$lang['Cancel'] = 'Cancelar';
$lang['Center of interest'] = 'Centro de interesse';
-$lang['Delete multiple size images'] = 'Apaga múltiplos tamanhos de imagens';
-$lang['Duplicate selected tags'] = 'Duplica os marcadores selecionados';
+$lang['Delete multiple size images'] = 'Apagar múltiplos tamanhos de imagens';
+$lang['Duplicate selected tags'] = 'Duplicar as tags selecionadas';
$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'ERRO: ESTE PLUGIN ESTÃ FALTANDO, MAS O MESMO ESTÃ INSTALADO! DESINSTALE O MESMO AGORA.';
$lang['Edit photo'] = 'Editar Foto';
-$lang['Email administrators when a comment is deleted'] = 'Envia um e-mail aos administradores quando um comentário é deletado';
-$lang['Email administrators when a comment is modified'] = 'Envia um e-mail aos administradores quando um comentário é modificado';
+$lang['Email administrators when a comment is deleted'] = 'Envia um email aos administradores quando um comentário é deletado';
+$lang['Email administrators when a comment is modified'] = 'Envia um email aos administradores quando um comentário é modificado';
$lang['File upload stopped by extension'] = 'A transferência de arquivos foi interrompida por uma extensão';
$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'Os seguintes plugins podem não ser compatíveis com a nova versão do Piwigo:';
$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'Os seguintes temas podem não ser compatíveis com a nova versão do Piwigo:';
$lang['Gallery unlocked'] = 'Galeria destravada';
-$lang['Generate multiple size images'] = 'Gera múltiplos tamanhos de imagem';
+$lang['Generate multiple size images'] = 'Gerar múltiplos tamanhos de imagem';
$lang['Graphics Library'] = 'Biblioteca gráfica';
$lang['Groups and users'] = 'Grupos e usuários';
$lang['List'] = 'Lista';
@@ -719,17 +717,17 @@ $lang['Manual order'] = 'Ordem Manual';
$lang['Maximum height'] = 'Comprimento Máximo';
$lang['Maximum width'] = 'Largura Máxima';
$lang['Maximum file size: %sB.'] = 'Tamanho máximo do arquivo %sB.';
-$lang['Merge selected tags'] = 'Junte as etiquetas selecionadas';
-$lang['Merge tags'] = 'Junte etiquetas';
+$lang['Merge selected tags'] = 'Juntar as tags selecionadas';
+$lang['Merge tags'] = 'Juntar tags';
$lang['Missing Plugins'] = 'Plugins perdidos';
$lang['Missing a temporary folder'] = 'Pasta temporária perdida';
-$lang['Move to album'] = 'Mova para Ãlbum';
+$lang['Move to album'] = 'Mover para o álbum';
$lang['Multiple Size'] = 'Múltiplos tamanhos';
-$lang['Name of the duplicate'] = 'Nome do Duplicado';
+$lang['Name of the duplicate'] = 'Nome do duplicado';
$lang['New Version'] = 'Nova Versão';
-$lang['No destination tag selected'] = 'Nenhuma etiqueta selecionada';
+$lang['No destination tag selected'] = 'Nenhuma tag de destino selecionada';
$lang['No file was uploaded'] = 'Nenhum arquivo foi enviado';
-$lang['No group is permitted to see this private album'] = 'Nenhum grupo tem permissão para ver essa categoria';
+$lang['No group is permitted to see this private album'] = 'Nenhum grupo tem permissão para ver esse álbum';
$lang['No order field selected'] = 'Nenhum campo de ordenação selecionado';
$lang['No photo in the current set.'] = 'Nenhuma foto no set atual';
$lang['No photo selected, %d photos in current set'] = 'Nenhuma foto selecionada, %d fotos no set atual';
@@ -746,7 +744,7 @@ $lang['Operation in progress'] = 'Tratamento em progresso';
$lang['Order of menubar items has been updated successfully.'] = 'Ordenamento do menu foi atualizado com sucesso.';
$lang['Original Size'] = 'Tamanho Original';
$lang['Original file : %s'] = 'Arquivo original: %s';
-$lang['Orphan tags deleted'] = 'Etiquetas órfãs apagadas';
+$lang['Orphan tags deleted'] = 'Tags órfãs excluídas';
$lang['Page end'] = 'Página final';
$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Confirmação de senhas perdida. Por favor confirme a senha escolhida.';
$lang['Password is missing. Please enter the password.'] = 'Senha perdida. Por favor entre com a senha.';
@@ -778,9 +776,9 @@ $lang['Privacy level set to "%s"'] = 'Nível de privacidade definido para "%s"';
$lang['Rated %d times, score : %.2f'] = 'Avaliado %d vezes, Nota: %2f';
$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (Galeria Remota cliente para Android) é um cliente Piwigo de código aberto (GPL v3) para a plataforma Android.';
$lang['Read Piwigo Documentation'] = 'Leia da Documentação do Piwigo';
-$lang['Refresh photo set'] = 'Recarregue as Fotos';
-$lang['Remove all filters'] = 'Remoca todos os filtros';
-$lang['Remove from caddie'] = 'Remova do cofre';
+$lang['Refresh photo set'] = 'Recarregue as fotos';
+$lang['Remove all filters'] = 'Remova todos os filtros';
+$lang['Remove from caddie'] = 'Remova da cesta';
$lang['Reset ignored updates'] = 'Reset atualizações ignoradas';
$lang['Resize after upload'] = 'Redimensione depois de enviar';
$lang['Resize'] = 'Redimensione';
@@ -793,38 +791,38 @@ $lang['Save visits in history for'] = 'Salve o histórico de visitantes';
$lang['Searching...'] = 'Pesquisando...';
$lang['Select a file'] = 'Selecione um arquivo';
$lang['Select a zone with your mouse to define a new center of interest.'] = 'Selecione uma região com o mouse para definir um novo centro de interesse.';
-$lang['Select an album'] = 'Selecione uma categoria';
+$lang['Select an album'] = 'Selecione um álbum';
$lang['Select at least one comment'] = 'Selecione ao menos um comentário';
-$lang['Select at least two tags for merging'] = 'Selecione ao menos duas etiquetas para juntar';
+$lang['Select at least two tags for merging'] = 'Selecione ao menos duas tags para juntar';
$lang['Select files'] = 'Selecione arquivos';
$lang['Select groups...'] = 'Selecione grupos...';
-$lang['Select the destination tag'] = 'Selecione a etiqueta destino';
+$lang['Select the destination tag'] = 'Selecione a tag de destino';
$lang['Select users...'] = 'Selecione usuários...';
$lang['Select:'] = 'Selecione:';
$lang['Selection'] = 'Seleção';
-$lang['Send connection settings by email'] = 'Envie configuração de conexão por e-mail';
+$lang['Send connection settings by email'] = 'Envie configuração de conexão por email';
$lang['Set as default language for unregistered and new users'] = 'Escolha o idioma padrão para os novos usuários e usuários não registrados.';
$lang['Set as default theme for unregistered and new users'] = 'Escolha o tema padrão para os novos usuários e usuários não registrados.';
-$lang['Set author'] = 'Escolha o Autor';
-$lang['Set creation date'] = 'Escolha data de criação';
-$lang['Set title'] = 'Escolha título';
+$lang['Set author'] = 'Escolha o autor';
+$lang['Set creation date'] = 'Escolha a data de criação';
+$lang['Set title'] = 'Escolha o título';
$lang['Settings'] = 'Configurações';
$lang['Sharpen'] = 'Destacar';
$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell é um organizador de fotos de código aberto que roda em Linux e é o gerenciador padrão de fotos no Ubuntu e Fedora.';
$lang['Show menubar'] = 'Mostre menu';
$lang['Some themes and plugins may be not available yet.'] = 'Ãlguns temas e plugins podem não estar disponíveis ainda.';
$lang['Some upgrades are available for extensions.'] = 'Algumas atualizações estão disponíveis para as extensões.';
-$lang['Source tag'] = 'Etiqueta fonte';
+$lang['Source tag'] = 'Tag fonte';
$lang['Start Upload'] = 'Inicia o envio';
-$lang['Start pLoader and add your photos.'] = 'Inicia pLoadee e adicione suas fotos';
+$lang['Start pLoader and add your photos.'] = 'Inicie o pLoader e adicione suas fotos.';
$lang['Switch to clear or dark colors for administration'] = 'Troque para cores claras ou escuras na Adminstração.';
$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'ESSE PLUGIN AGORA FAZ PARTE DO NÙCLEO DO PIWIGO! DESINSTALE-O AGORA!';
-$lang['Tag "%s" is now a duplicate of "%s"'] = 'A etiqueta "%s" agora está duplicada de "%s"';
-$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Etiqueta <em>%s</em> misturada dentro da etiqueta <em>%s</em>';
-$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'O plugin de exportação Piwigo permite que você crie álbuns e exporte fotos.';
+$lang['Tag "%s" is now a duplicate of "%s"'] = 'A tag "%s" agora está duplicada de "%s"';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Tag <em>%s</em> juntada na tag<em>%s</em>';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'O plugin de exportação do Piwigo permite que você crie álbuns e exporte fotos.';
$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'O plugin de publicação Piwigo permite que você exporte e sincronize fotos diretamente do Lightroom para sua galeria Piwigo.';
$lang['The center of interest is the most meaningful zone in the photo.'] = 'O centro de interesse é a área mais significativa da foto.';
-$lang['The following tag was deleted'] = 'A seguinte etiqueta foi apagada';
+$lang['The following tag was deleted'] = 'A tag seguinte foi apagada';
$lang['The original image quality must be a number between %d and %d'] = 'A qualidade de imagem original deve ser um número entre %d e %d';
$lang['The original maximum height must be a number between %d and %d'] = 'A altura máxima original deve ser um número entre %d e %d';
$lang['The original maximum width must be a number between %d and %d'] = 'A largura máxima original deve ser um número entre %d e %d';
@@ -841,9 +839,9 @@ $lang['There is no group in this gallery.'] = 'Não existe nenhum grupo nessa ga
$lang['There is no other language available.'] = 'Nâo existe nenhum outro idioma disponível.';
$lang['There is no other plugin available.'] = 'Não existe nenhum outro plugin disponível.';
$lang['There is no other theme available.'] = 'Não existe nenhum outro tema disponível.';
-$lang['This album contains %d photos, added between %s and %s.'] = 'Essa categoria contém %d fotos, adicionadas entre %s e %s.';
-$lang['This album contains %d photos, added on %s.'] = 'Essa categoria contém %d fotos, adicionadas em %s';
-$lang['This album contains no photo.'] = 'Essa categoria não contém foto.';
+$lang['This album contains %d photos, added between %s and %s.'] = 'Esse álbum contém %d fotos, adicionadas entre %s e %s.';
+$lang['This album contains %d photos, added on %s.'] = 'Esse álbum contém %d fotos, adicionadas em %s';
+$lang['This album contains no photo.'] = 'Esse álbum não contém foto.';
$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'Essa é uma grande atualização, com <a href="%s">novas características excitantes</a>.';
$lang['This is a minor update, with only bug corrections.'] = 'Essa é uma pequena atualização, somente com correção de bugs.';
$lang['This theme was not designed to be directly activated'] = 'Esse tema não foi desenvolvido para ser ativado diretamente.';
@@ -851,7 +849,7 @@ $lang['Thumbnails generation in progress...'] = 'Geração de Thumbnails em prog
$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = 'Para exportar suas fotos do digiKam para Piwigo, simplesmente instale os plugins digiKam e Kipi.';
$lang['Tools'] = 'Ferramentas';
$lang['Two updates are available'] = 'Duas atualizações estão disponíveis';
-$lang['Type here the author name'] = 'Digite aqui o nome do Autor';
+$lang['Type here the author name'] = 'Digite aqui o nome do autor';
$lang['Type here the title'] = 'Digite aqui o título';
$lang['Type in a search term'] = 'Digite um termo para pesquisar';
$lang['Unable to dump database.'] = 'Não foi possível esvaziar o banco de dados';
@@ -863,7 +861,7 @@ $lang['Update Complete'] = 'Atualização Completa';
$lang['Update in progress... Please wait.'] = 'Atualização em progresso... por favor espere.';
$lang['Update to Piwigo %s'] = 'Atualize para Piwigo %s';
$lang['Updates'] = 'Atualizações';
-$lang['Upload Photos'] = 'Envio de Fotos';
+$lang['Upload Photos'] = 'Envio de fotos';
$lang['Uploaded Photos'] = 'Fotos Enviadas';
$lang['Visit Gallery'] = 'Visite a Galeria';
$lang['Visit Piwigo project website'] = 'Visite o site do Projeto Piwigo';
@@ -879,9 +877,9 @@ $lang['Week starts on'] = 'Semana inicia em';
$lang['Who can see these photos?'] = 'Quem pode ver essas fotos?';
$lang['Who can see this photo?'] = 'Quem pode ver essa foto?';
$lang['Width'] = 'Largura';
-$lang['With no album'] = 'Com nenhuma categoria';
-$lang['With no tag'] = 'com nenhuma etiqueta';
-$lang['With no virtual album'] = 'Com nenhuma categoria virtual';
+$lang['With no album'] = 'Com nenhum álbum';
+$lang['With no tag'] = 'Com nenhuma tag';
+$lang['With no virtual album'] = 'Com nenhum álbum virtual';
$lang['X Position'] = 'Posição X';
$lang['X Repeat'] = 'Repita X';
$lang['Y Position'] = 'Posição Y';
@@ -890,13 +888,13 @@ $lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser
$lang['You can activate only one mobile theme.'] = 'Você pode ativar somente um tema móbile.';
$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Você pode atualizar para o Piwigo %s diretamente, sem atualizar para o Piwigo %s (recomendado).';
$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'Você não pode definir uma ordenação padrão das fotos porque você tem uma configuração personalizada na sua configuração local.';
-$lang['You have %d orphan tags: %s.'] = 'Você tem %d etiquetas órfãs:%s.';
+$lang['You have %d orphan tags: %s.'] = 'Você tem %d tags órfãs: %s.';
$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'Você especificou <i>$conf[\'order_by\']</i> no seu arquivo de configuração local, esse parâmetro está em desuso, por favor remova-o ou renomei-o dentro <i>$conf[\'order_by_custom\']</i>!';
$lang['Your configuration settings are saved'] = 'Sua configuração foi salva';
$lang['Zoom'] = 'Zoom';
$lang['add a new watermark'] = 'adicione uma nova marca dágua';
$lang['administrators'] = 'administradores';
-$lang['any visitor can see this album'] = 'qualquer visitante pode ver essa categoria';
+$lang['any visitor can see this album'] = 'qualquer visitante pode ver esse álbum';
$lang['apply automatic sort order'] = 'aplique ordenamento automático';
$lang['bottom left corner'] = 'botão canto esquerdo';
$lang['bottom right corner'] = 'botão canto direito';
@@ -904,7 +902,7 @@ $lang['cancel manual order'] = 'Cancela ordenamento manual';
$lang['create a new site'] = 'Cria novo site';
$lang['custom'] = 'Personalize';
$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam é um software livre gerenciador avançado de fotos digitais para Linux, Windows e MacOSX.';
-$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam é desenvolvido para fotógrafos que querem ver, gerenciar, editar, realçar, organizar, etiquetar e compartilhar fotografias.';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam é desenvolvido para fotógrafos que querem ver, gerenciar, editar, melhorar, organizar, colocar tags e compartilhar fotografias.';
$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto é o gerenciador padrão no MacOSX. O Plugin de exportação do Piwigo deixa você criar novos álbuns e exportar fotos diretamente do iPhoto para sua galeria de fotos Piwigo.';
$lang['include photos with lower privacy level'] = 'inclua fotos com menor nível de privacidade';
$lang['manual order'] = 'Ordem Manual';
@@ -925,14 +923,12 @@ $lang['simple visitors'] = 'visitante simples';
$lang['top left corner'] = 'canto superior esquerdo';
$lang['top right corner'] = 'Canto superior direito';
$lang['unknown'] = 'desconhecido';
-$lang['visitors need to login and have the appropriate permissions to see this album'] = 'Os visitantes precisam autenticar e ter as permissões apropriadas para ver essa categoria';
-$lang['Format'] = 'Formata';
-$lang['Invalid dimension'] = 'Tamanho inválido';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'os visitantes precisam autenticar e ter as permissões apropriadas para ver esse álbum';
$lang['Landscape'] = 'Landscape';
$lang['Manage photos'] = 'Gerencie Fotos';
$lang['Minimum height'] = 'Altura Mínima';
$lang['Minimum width'] = 'Largura Mínima';
-$lang['Number of albums per page'] = 'Número de categorias por página';
+$lang['Number of albums per page'] = 'Número de álbuns por página';
$lang['Panorama'] = 'Paisagem';
$lang['Portrait'] = 'Retrato';
$lang['View in gallery'] = 'Ver na Galeria';
@@ -948,6 +944,34 @@ $lang['Please select at least two groups'] = 'Por favor, selecione ao menos dois
$lang['Rename'] = 'Renomear';
$lang['This group will be set to default'] = 'Esse grupo será usado por padrão';
$lang['This group will be unset to default'] = 'Esse grupo nao será mais usado por padrao';
-$lang['Type here the name of the new group'] = 'Digite aqui o nome do novo grupo.';
+$lang['Type here the name of the new group'] = 'Digite aqui o nome do novo grupo';
$lang['Purge user cache'] = 'limpa o cache do usuário';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'As dimensões da imagem serão reduzida para %dx%d pixels.';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'Redimensionamento após envio foi desativado devido ao uso de GD como biblioteca gráfica';
+$lang['Select at least one tag'] = 'Selecione pelo menos uma tag';
+$lang['Basic settings'] = 'Configurações básicas';
+$lang['General'] = 'Geral';
+$lang['Mail theme'] = 'Tema correio';
+$lang['(filtered from %s total users)'] = '(filtrado do total de %s usuários)';
+$lang['All %d users are selected'] = 'Todos os %d usuários estão selecionados';
+$lang['Change password'] = 'Alterar senha';
+$lang['Change username'] = 'Muda o nome de usuário';
+$lang['Last visit on %s, %s.'] = 'Última visita em %s, %s.';
+$lang['Loading...'] = 'Carregando...';
+$lang['No matching user found'] = 'Nenhum usuário encontrado';
+$lang['No user selected of %d users'] = 'Nenhum usuário selecionado do total de %d usuários';
+$lang['No user selected, no action possible.'] = 'Nenhum usuário selecionado, nenhuma ação possível.';
+$lang['Password updated'] = 'Senha atualizada';
+$lang['Registered on %s, %s.'] = 'Registrado em %s, %s.';
+$lang['Show %s users'] = 'Mostra %s usuários';
+$lang['Showing %s to %s of %s users'] = 'Exibindo de %s a %s do total de %s usuários';
+$lang['Update user'] = 'Atualiza usuário';
+$lang['User %s added'] = 'Usuário %s adicionado';
+$lang['User %s updated'] = 'Usuário %s atualizado';
+$lang['Users modified'] = 'Usuários modificados';
+$lang['on the %d selected users'] = 'em %d usuários selecionados';
+$lang['%d of %d users selected'] = '%d de %d usuários selecionados';
+$lang['Close user details'] = 'Fechar detalhes de usuário';
+$lang['Open user details'] = 'Abrir detalhes de usuário';
+$lang['close'] = 'fechar';
?> \ No newline at end of file
diff --git a/language/pt_BR/common.lang.php b/language/pt_BR/common.lang.php
index 0fc85c8ff..f6a08eeae 100644
--- a/language/pt_BR/common.lang.php
+++ b/language/pt_BR/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Brasil [BR]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=431
Author: Piwigo team
Author URI: http://piwigo.org
@@ -36,8 +36,8 @@ $lang_info['code'] = 'pt';
$lang_info['zero_plural'] = false;
$lang['%d Kb'] = '%d Kb';
-$lang['%d album updated'] = '%d categoria atualizada';
-$lang['%d albums updated'] = '%d categorias atualizadas';
+$lang['%d album updated'] = '%d álbum atualizado';
+$lang['%d albums updated'] = '%d álbuns atualizados';
$lang['%d comment to validate'] = '%d comentário para aprovar';
$lang['%d comments to validate'] = '%d comentários para serem aprovados';
$lang['%d new comment'] = '%d novo comentário';
@@ -52,11 +52,11 @@ $lang['%d new user'] = '%d usuário novo';
$lang['%d new users'] = '%d usuários novos';
$lang['About'] = 'Sobre';
$lang['All tags'] = 'Todas as tags';
-$lang['Any tag'] = 'qualquer tag';
-$lang['At least one listed rule must be satisfied.'] = 'Ao menos um dos critérios deve ser satisfeito.';
+$lang['Any tag'] = 'Qualquer tag';
+$lang['At least one listed rule must be satisfied.'] = 'Ao menos um dos critérios deve ser obedecido.';
$lang['Author'] = 'Autor';
-$lang['Albums'] = 'Categorias';
-$lang['Album'] = 'Categoria';
+$lang['Albums'] = 'Ãlbuns';
+$lang['Album'] = 'Ãlbum';
$lang['Close this window'] = 'Fechar esta janela';
$lang['Complete RSS feed (photos, comments)'] = 'RSS completo';
$lang['Confirm Password'] = 'Confirmar senha';
@@ -100,19 +100,19 @@ $lang['Quick connect'] = 'Conexão rápida';
$lang['RSS feed'] = 'fluxo RSS';
$lang['Register'] = 'Registrar-se';
$lang['Registration'] = 'Registro';
-$lang['Related tags'] = 'Tags relacionados';
+$lang['Related tags'] = 'Tags relacionadas';
$lang['Reset'] = 'Cancelar';
$lang['Retrieve password'] = 'Recuperar a senha';
$lang['Search rules'] = 'Critérios de busca';
$lang['Search tags'] = 'Pesquisar as tags';
$lang['Search'] = 'Pesquisa';
-$lang['display available tags'] = 'Ver as tags disponíveis';
+$lang['display available tags'] = 'ver as tags disponíveis';
$lang['Since'] = 'Desde ';
$lang['Sort by'] = 'Listado por';
$lang['Sort order'] = 'Ordem de exibição';
$lang['Tag'] = 'Tag';
$lang['Tags'] = 'Tags';
-$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'O RSS notifica dos eventos da galeria : novas imagens, categorias actualizadas, Novos comentários usuários. Use um leitor de fluxos RSS.';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'O RSS notifica sobre os eventos da galeria: novas imagens, álbuns atualizados, novos comentários de usuários. Use um leitor de fluxos RSS.';
$lang['Unknown feed identifier'] = 'identificador de fluxo RSS desconhecido';
$lang['User comments'] = 'Comentários de usuário';
$lang['Username'] = 'Nome de usuário';
@@ -126,7 +126,7 @@ $lang['Administration'] = 'Administração';
$lang['all'] = 'tudo';
$lang['ascending'] = 'crescente';
$lang['author(s) : %s'] = 'autor(es) : %s';
-$lang['Expand all albums'] = 'Expandir todas as categorias';
+$lang['Expand all albums'] = 'Expandir todos os álbuns';
$lang['posted after %s (%s)'] = 'disponível depois de %s (%s)';
$lang['posted before %s (%s)'] = 'disponível antes de %s (%s)';
$lang['posted between %s (%s) and %s (%s)'] = 'disponível entre o %s (%s) e o %s (%s)';
@@ -134,7 +134,7 @@ $lang['posted on %s'] = 'disponível em %s';
$lang['Best rated'] = 'Com a melhor pontuação';
$lang['display best rated photos'] = 'Mostrar as imagens com as notas mais altas';
$lang['Calendar'] = 'Calendário';
-$lang['All'] = 'Todo';
+$lang['All'] = 'Todos';
$lang['display each day with photos, month per month'] = 'Mostrar ano por ano, mês por mês, dia por dia';
$lang['View'] = 'Vista';
$lang['chronology_monthly_calendar'] = 'Calendário mensal';
@@ -144,7 +144,7 @@ $lang['Click here if your browser does not automatically forward you'] = 'Clique
$lang['comment date'] = 'data do comentário';
$lang['Comment'] = 'comentário';
$lang['Your comment has been registered'] = 'O seu comentário foi registrado.';
-$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Sistema conta abuso : Por favor, espere um momento antes de tentar escrever um novo comentario';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Sistema contra abuso : Por favor, espere um momento antes de tentar escrever um novo comentario';
$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'O seu comentário não pôde ser registado porque não passou pelas regras de validação';
$lang['An administrator must authorize your comment before it is visible.'] = 'Um administrador deve autorizar o seu comentário para que ele seja visível por todos.';
$lang['This login is already used by another user'] = 'Este login já está sendo usado por outro usuário.';
@@ -181,14 +181,14 @@ $lang['Page generated in'] = 'Página gerada em';
$lang['guest'] = 'visitante';
$lang['Hello'] = 'Olá';
$lang['available for administrators only'] = 'disponível apenas para os administradores';
-$lang['display this album'] = 'mostra as imagens do diretório raíz desta categoria';
+$lang['display this album'] = 'mostra as imagens da pasta raíz deste álbum';
$lang['display last user comments'] = 'Ver os últimos comentários de usuários';
$lang['customize the appareance of the gallery'] = 'personalisar a aparência da galeria';
$lang['search'] = 'Pesquisar';
$lang['Home'] = 'Início';
-$lang['in this album'] = 'nesta categoria';
-$lang['in %d sub-album'] = 'em %d subcategoria';
-$lang['in %d sub-albums'] = 'em %d subcategorias';
+$lang['in this album'] = 'neste álbum';
+$lang['in %d sub-album'] = 'em %d sub-álbuns';
+$lang['in %d sub-albums'] = 'em %d sub-álbuns';
$lang['included'] = 'incluídos';
$lang['Invalid password!'] = 'Senha inválida!';
$lang['Language'] = 'Idioma';
@@ -197,7 +197,7 @@ $lang['Last'] = 'Última página';
$lang['Logout'] = 'Desconectar (logout)';
$lang['obligatory'] = 'obrigatório';
$lang['display a calendar by creation date'] = 'Mostra um calendário ordenado pela data de criação';
-$lang['display all photos in all sub-albums'] = 'Mostra todos os elementos em todas as subcategorias';
+$lang['display all photos in all sub-albums'] = 'Mostra todos os elementos em todos os sub-álbuns';
$lang['return to normal view mode'] = 'voltar à exibição normal';
$lang['display a calendar by posted date'] = 'Mostrar um calendário por data de envio das imagens';
$lang['month'][10] = 'outubro';
@@ -233,8 +233,8 @@ $lang['Preferences'] = 'Preferências';
$lang['Previous'] = 'Página anterior';
$lang['Random photos'] = 'Imagens aleatórias';
$lang['display a set of random photos'] = 'exibir um grupo aleatório de imagens';
-$lang['Recent albums'] = 'Categorias recentes';
-$lang['display recently updated albums'] = 'Exibir categorias atualizadas recentemente.';
+$lang['Recent albums'] = 'Ãlbuns recentes';
+$lang['display recently updated albums'] = 'exibir álbuns atualizados recentemente';
$lang['Recent period'] = 'Período recente';
$lang['Recent photos'] = 'Imagens recentes';
$lang['display most recent photos'] = 'Mostrar as imagens mais recentes';
@@ -244,12 +244,11 @@ $lang['login mustn\'t end with a space character'] = 'O nome de usuário não de
$lang['login mustn\'t start with a space character'] = 'O nome de usuário não deve começar com um espaço';
$lang['this login is already used'] = 'Este nome de usuário já existe';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'O formato do email deve ser do tipo: xxx@yyy.eee (exemplo : jack@altern.org)';
-$lang['please enter your password again'] = 'Por favor, digite sua senha novamente';
$lang['Auto login'] = 'Auto login (autenticação automática)';
$lang['remove this tag from the list'] = 'remover esta tag da lista';
$lang['representative'] = 'representante';
$lang['Search for Author'] = 'Pesquisar por autor';
-$lang['Search in albums'] = 'Pesquisar nas categorias';
+$lang['Search in albums'] = 'Pesquisar nos álbuns';
$lang['Search by date'] = 'Pesquisar por data';
$lang['Date'] = 'Data';
$lang['End-Date'] = 'Data final';
@@ -259,12 +258,12 @@ $lang['Search for all terms'] = 'Pesquisar todos os termos';
$lang['Search for any term'] = 'Pesquisar qualquer um dos termos';
$lang['Empty query. No criteria has been entered.'] = 'Pesquisa vazia. Nenhum critério fornecido.';
$lang['Search results'] = 'Resultados da pesquisa';
-$lang['Search in sub-albums'] = 'Pesquisar nas subcategorias';
+$lang['Search in sub-albums'] = 'Pesquisar nos sub-álbuns';
$lang['searched words : %s'] = 'Palavras pesquisadas : %s';
-$lang['Contact'] = 'Contactar';
-$lang['set as album representative'] = 'Eleger para representar esta categoria';
+$lang['Contact'] = 'Contatar';
+$lang['set as album representative'] = 'eleger para representar este álbum';
$lang['Show number of comments'] = 'Exibir o número de comentários';
-$lang['Show number of hits'] = 'Exibir o número de vizualisações';
+$lang['Show number of hits'] = 'Exibir o número de visualizações';
$lang['slideshow'] = 'Slideshow';
$lang['stop the slideshow'] = 'interromper o Slideshow';
$lang['Specials'] = 'Ferramentas';
@@ -272,7 +271,6 @@ $lang['SQL queries in'] = 'Pesquisa SQL em';
$lang['display only recently posted photos'] = 'exibir apenas as imagens enviadas recentemente';
$lang['return to the display of all photos'] = 'voltar a exibir todas as imagens';
$lang['the beginning'] = 'o início';
-$lang['Interface theme'] = 'Tema';
$lang['Thumbnails'] = 'Miniaturas';
$lang['Menu'] = 'Menu';
$lang['A comment on your site'] = 'Um comentário no seu site';
@@ -291,10 +289,10 @@ $lang['User: %s'] = 'Usuário: %s';
$lang['Email: %s'] = 'Email: %s';
$lang['Admin: %s'] = 'Administração: %s';
$lang['Registration of %s'] = 'Registro de %s';
-$lang['Album: %s'] = 'Categoria: %s';
-$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Status ruim para o usuário "guest", será usado status padrão. Por favor, avise o administrador do site.';
+$lang['Album: %s'] = 'Ãlbum: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Status ruim para o usuário "convidado", será usado status padrão. Por favor, avise o administrador do site.';
$lang['this email address is already in use'] = 'um outro usuário já utiliza este email';
-$lang['Album results for'] = 'Resultados da categoria para';
+$lang['Album results for'] = 'Resultados do álbum para';
$lang['Tag results for'] = 'Resultados da tag para';
$lang['from %s to %s'] = 'de %s ao %s';
$lang['Play of slideshow'] = 'Iniciar o Slideshow';
@@ -310,7 +308,7 @@ $lang['%d photo']='%d imagem';
$lang['%d photos']='%d imagens';
$lang['%d photo is also linked to current tags'] = '%d imagem está também ligada às tags correntes';
$lang['%d photos are also linked to current tags'] = '%d imagens estão também ligadas às tags correntes';
-$lang['display photos linked to this tag'] = 'Ver as imagens ligadas apenas a esta tag';
+$lang['display photos linked to this tag'] = 'ver as imagens ligadas apenas a esta tag';
$lang['photos posted during the last %d days'] = 'imagens enviadas durante os últimos %d dias';
$lang['Piwigo Help'] = 'Piwigo Help';
$lang['Rank'] = 'Fila (Rank)';
@@ -320,7 +318,7 @@ $lang['show tag cloud'] = 'mostar a nuvem de tags';
$lang['cloud'] = 'nuvem';
$lang['Are you sure?'] = 'Você tem certeza?';
$lang['%d rates'] = '%d taxas';
-$lang['(!) This comment requires validation'] = '(!) Este comentário necessita validação';
+$lang['(!) This comment requires validation'] = '(!) Este comentário necessita aprovação';
$lang['... or browse your empty gallery'] = '... ou procure sua galeria vazia';
$lang['... or please deactivate this message, I will find my way by myself'] = '... ou, por favor, desative esta mensagem, encontrarei minha maneira por mim mesmo';
$lang['Change my password'] = 'Alterar minha senha';
@@ -333,7 +331,7 @@ $lang['Enter your new password below.'] = 'Insira sua nova senha abaixo.';
$lang['EXIF Metadata'] = 'Metadados EXIF';
$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Olá %s, sua galeria de fotos Piwigo está vazia!';
$lang['Hello %s,'] = 'Olá %s,';
-$lang['html tags are not allowed in login'] = 'etiquetas html não são permitidas na autenticação';
+$lang['html tags are not allowed in login'] = 'marcadores html não são permitidas na autenticação';
$lang['I want to add photos'] = 'Eu quero inserir fotos';
$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Se isto foi um engano, apenas ignore esta mensagem e nada acontecerá.';
$lang['Invalid key'] = 'Chave inválida';
@@ -412,4 +410,13 @@ $lang['Username is mandatory'] = 'nome de usuário obrigatório';
$lang['mandatory'] = 'obrigatório';
$lang['Website'] = 'Website';
$lang['Your website URL is invalid'] = 'Seu endereço de site é inválido';
+$lang['Email'] = 'Email';
+$lang['First Page'] = 'Primeira Página';
+$lang['Go back to the album'] = 'Retornar para o album';
+$lang['Last Page'] = 'Última página';
+$lang['day']['4'] = 'Quinta-feira';
+$lang['Password is missing. Please enter the password.'] = 'Senha perdida. Por favor entre com a senha.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Confirmação de senhas perdida. Por favor confirme a senha escolhida.';
+$lang['%d photos per page'] = '%d fotos por página';
+$lang['Theme'] = 'Tema';
?> \ No newline at end of file
diff --git a/language/pt_BR/help/cat_modify.html b/language/pt_BR/help/cat_modify.html
index 032555823..913ad7c28 100755
--- a/language/pt_BR/help/cat_modify.html
+++ b/language/pt_BR/help/cat_modify.html
@@ -19,50 +19,49 @@
<ul>
- <li><strong>Tipos de acessos</strong>: Gerenciamento de permissoes. Se você fizer um álbum privado, todos os seus álbun filhos tornam-se privados. Se você faz um álbum público, todos os seus álbuns pais tornam-se públicos.
+ <li><strong>Tipos de acessos</strong>: Gerenciamento de permissões. Se você fizer um álbum privado, todos os seus álbuns filhos tornam-se privados. Se você faz um álbum público, todos os seus álbuns pais tornam-se públicos.
- <li><strong>Trancar</strong>: Os álbuns e seus sub-álbuns ficarao temporariamente desabilitados para manutençao.</li>
+ <li><strong>Trancar</strong>: Os álbuns e seus sub-álbuns ficarão temporariamente desabilitados para manutenção.</li>
<li><strong>Comentários</strong>: Autoriza usuários a comentar fotos desse álbum.</li>
</ul>
-<p>Você também pode gerenciar essas opções nas "Propriedades"
-tela de gerenciamento (screens <span
+<p>Você também pode gerenciar essas opções na tela de gerenciamento de "Propriedades"(screens <span
class="pwgScreen">Comentários</span>, <span class="pwgScreen">Trancar</span>,
<span class="pwgScreen">Público/Privado</span>, <span
class="pwgScreen">Representante</span> disponível a partir de <span
-class="pwgScreen">Administração &raquo; Albums &raquo; Propriedades</span>).</p>
+class="pwgScreen">Administração &raquo; Ãlbums &raquo; Propriedades</span>).</p>
<h3>Ordem de Classificação</h3>
<p>Use o padrão ordem de classificação de imagens.</p>
-<p>Indique se esta ordem de classificação será aplicada também a subalbums.</p>
+<p>Indique se esta ordem de classificação será aplicada também a sub-álbuns.</p>
<p>Selecione critérios específicos de classificação para serem usados com este álbum.</p>
<ul>
-<li><strong>Data de criação</strong>: Data de filmagem, foto</li>
+<li><strong>Data de criação</strong>: Data em que a foto foi tirada</li>
<li><strong>Data da publicação</strong>: Data da sincronização</li>
<li><strong>Taxa média (*)</strong>: Taxa média poderá ser alterada pela avaliação do visitante</li>
<li><strong>Mais visitadas (*)</strong>: A visita atual pode alterar a ordem do mais visitado</li>
<li><strong>Nome do arquivo</strong>: Nome dado no campo de informações</li>
-<li><strong>Id</strong>: ID interna (categorias recentes têm uma maior identificação do que as anteriores.</li>
+<li><strong>Id</strong>: Identificação interna (categorias recentes têm identificação interna maior.</li>
</ul>
-<p><strong>(*)</strong>Aviso: Certifique-se de testar essas ordens de classificação por si mesmo porque elas podem dar resultados inesperados.</p>
+<p><strong>(*)</strong>Aviso: Certifique-se de testar essas ordens de classificação pois elas podem provocar resultados inesperados.</p>
<h3>Representante</h3>
<p>A representação do álbum é a miniatura exibida na página principal (<span class="pwgScreen">category.php</span>) para representar
o álbum quando
-ele contém apenas sub-álbuns e não fotografias direta (assim como o álbum raiz).</p>
+ele contém apenas sub-álbuns e não fotografias (assim como o álbum raiz).</p>
foto de um álbum :</p>
<ul>
- <li><span class="pwgScreen">Página da foto</span>: um dos botões de ação permitem definir a foto atual como representante para o
+ <li><span class="pwgScreen">Página da foto</span>: um dos botões de ação que permite definir a foto atual como representante do
álbum exibido. Este botão está disponível apenas para administradores.</li>
<li><span class="pwgScreen">Modificar informações sobre uma foto</span> em
@@ -70,10 +69,10 @@ administração. Esta tela pode ser alcançada a partir <span
class="pwgScreen">picture.php</span> ou <span class="pwgScreen">Gerenciamento</span> em <em>modo de unidade</em>. Consulte a ajuda da tela para
   detalhes.</li>
- <li><span class="pwgScreen">Administration &raquo; Albums &raquo; Properties,
- Representative</span>. See the help of this screen for details.</li>
+ <li><span class="pwgScreen">Administração &raquo; Ãlbuns &raquo; Propriedades,
+ Representação</span>. Veja a ajuda dessa tela para maiores informações.</li>
- <li><span class="pwgScreen">Editar álbum</span> (a presente tela).</li>
+ <li><span class="pwgScreen">Editar álbum</span> (a tela atual).</li>
</ul>
@@ -81,18 +80,17 @@ administração. Esta tela pode ser alcançada a partir <span
<code>permitir_representante_aleatório</code> parâmetro de configuração (ver <span
class="filename">include/config_default.inc.php</span>).</p>
-<p>No modo padrão (<code>permitir_representante_aleatório</code> definido como falso),
-cada álbum que contém pelo menos um elemento é representado por um elemento  fixo
-. Uma vez definida (a criação do álbum), o representante muda apenas
-quando um administrador perguntar para ele. Se o representante não é adequado,
+<p>No modo padrão (<code>allow_random_representative</code> definido como falso),
+cada álbum que contém pelo menos um elemento é representado por um elemento fixo.
+Uma vez definida (a criação do álbum), o representante muda apenas
+quando um administrador solicitar. Se o representante não é adequado,
você pode pedir para <strong>Encontre um representante novo aleatoriamente</strong>.</p>
-<p>Se <code>permitir_representante_aleatório</code> parâmetro de configuração é
+<p>Se o parâmetro de configuração <code>allow_random_representative</code> é
definido como verdadeiro, uma categoria contendo fotos pode não ter representante fixo. Apenas use o botão <strong>Eliminar representante</strong>.</p>
-<p>Se o álbum contém apenas sub-álbuns e nenhuma foto, pode no entanto ser representado por qualquer elemento graças ao <span class="pwgScreen">modificar
-informações sobre uma foto</span>. A única opção na tela atual
-é o botão <strong>Eliminar representamte</strong>.</p>
+<p>Se o álbum contém apenas sub-álbuns e nenhuma foto, ele pode no entanto ser representado por qualquer elemento graças ao <span class="pwgScreen">modificar informações sobre uma foto</span>. A única opção na tela atual
+é o botão <strong>Eliminar representante</strong>.</p>
<h3>Vincular todas as fotos do álbum para um novo álbum</h3>
@@ -101,7 +99,7 @@ informações sobre uma foto</span>. A única opção na tela atual
<li><strong>Nome do álbum virtual</strong>: Nome do novo álbum a ser criado,
todas as fotos da categoria corrente serão ligadas ao novo álbum.</li>
-<li><strong>Album pai</strong>: Onde o novo álbum vai ser,
+<li><strong>Ãlbum pai</strong>: Onde o novo álbum vai ser criado,
deixe em branco para criá-lo na raiz.</li>
</ul>
@@ -110,7 +108,7 @@ deixe em branco para criá-lo na raiz.</li>
<ul>
-<li><strong>Albuns</strong>: Escolha o álbum de destino.</li>
+<li><strong>Ãlbuns</strong>: Escolha o álbum de destino.</li>
</ul>
diff --git a/language/pt_BR/help/cat_options.html b/language/pt_BR/help/cat_options.html
index 0001a257d..777363612 100755
--- a/language/pt_BR/help/cat_options.html
+++ b/language/pt_BR/help/cat_options.html
@@ -1,24 +1,22 @@
+<h2>Opções de álbum</h2>
-<h2>Opções do álbum</h2>
-
-<p>Opções de gestão para vários álbuns de uma vez.</p>
+<p>Opções de configuração para vários álbuns de uma vez.</p>
<dl>
<dt>Comentários</dt>
-<dd>ma foto pode receber comentários de seus visitantes se ele pertence a um álbum com comentários ativados.</dd>
+<dd>Uma foto pode receber comentários de seus visitantes se ele pertence a um álbum com comentários ativados.</dd>
-<dt>Trancar</dt>
+<dt>Trancar (Lock)</dt>
<dd>Ãlbuns trancados estão desativados para manutenção. Somente os administradores podem vê-los na galeria.</dd>
<dt>Público / privado</dt>
-<dd>Uma vez que um álbum tornou privado, dê direitos de acesso aos usuários e grupos</dd>
+<dd>Uma vez que um álbum é privado, dê direitos de acesso aos usuários e grupos.</dd>
<dt>Representante</dt>
-<dd>This option is available when you set the configuration setting
-<code>allow_random_representative</code> (see <span
- class="filename">include/config_defaults.inc.php</span>) para
-<em>verdade</em>. Cada disco pode ser representado por uma foto aleatória ou através de uma foto escolhida como representante único.
+<dd>Esta opção está disponível quando a entrada no arquivo de configuração <code>allow_random_representative</code>
+(veja <span class="filename">include/config_defaults.inc.php</span>) está com o valor
+<em>true</em>. Cada álbum pode ser representado por uma foto aleatória ou por meio de uma foto escolhida como representante único.
</dd>
</dl>
diff --git a/language/pt_BR/help/help_add_photos.html b/language/pt_BR/help/help_add_photos.html
index 1a0ebd3b4..e6744f476 100755
--- a/language/pt_BR/help/help_add_photos.html
+++ b/language/pt_BR/help/help_add_photos.html
@@ -10,7 +10,7 @@ os outros métodos estão apenas esperando por você!</li>
<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">Ir para o Envio Direto </a></p>
<ul>
- <li><strong>pLoader</strong>é uma aplicação desktop, a ser instalada no seu computador. Arrastar e soltar as fotos na janela pLoader, clique em <em>"Enviar para do Piwigo"</em> e deixe o pLoader fazer o trabalho. Você pode encontrar outras aplicações desktop como <strong>WinToPiwigo</strong> ou o <strong>Digikam</strong> Plugin de exportação para do Piwigo.</li>
+ <li><strong>pLoader</strong>é uma aplicação desktop, que deve ser instalada no seu computador. Arraste e solte as fotos na janela do pLoader, clique em <em>"Enviar para o Piwigo"</em> e deixe o pLoader fazer o trabalho. Você pode encontrar outras aplicações desktop como <strong>WinToPiwigo</strong> ou o <strong>Digikam</strong> Plugin de exportação para o Piwigo.</li>
</ul>
@@ -18,8 +18,8 @@ os outros métodos estão apenas esperando por você!</li>
<div id="helpSynchro">
<ul>
- <li><strong>FTP transferência</strong> é a forma mais recomendada para adicionar um
-   coleção muito grande de fotos com um número mínimo de cliques. seguir
+ <li><strong>Transferência FTP</strong> é a forma mais recomendada para adicionar uma
+   coleção muito grande de fotos com o mínimo de cliques. Siga
   o guia para preparar suas fotos. O método de FTP permitem controlar com precisão
   a organização física de suas fotos em seu servidor.</li>
</ul>
diff --git a/language/pt_BR/help/help_misc.html b/language/pt_BR/help/help_misc.html
index 7248d4319..013e08b49 100644
--- a/language/pt_BR/help/help_misc.html
+++ b/language/pt_BR/help/help_misc.html
@@ -1,4 +1,4 @@
<p>Assim que você tiver criado sua galeria, modifique as propriedades padrão em <span class="pwgScreen">Administração &raquo; Configuração &raquo; Opções &raquo; Guest Settings</span>. Todo usuário novo registrado usará estas opções de configuração padrão.</p>
-<p>Se você tiver qualquer pergunta, a comunidade Piwigo lhe receberá de braços abertos em <a href="http://piwigo.org/forum">seu forum</a>.</p>
+<p>Se você tiver qualquer pergunta, a comunidade Piwigo lhe receberá de braços abertos em <a href="http://br.piwigo.org/forum">seu forum</a>.</p>
diff --git a/language/pt_BR/help/maintenance.html b/language/pt_BR/help/maintenance.html
index d743586d7..f0aa4d04c 100755
--- a/language/pt_BR/help/maintenance.html
+++ b/language/pt_BR/help/maintenance.html
@@ -1,23 +1,23 @@
<h2>Manutenção</h2>
-<p>Para otimizar o tempo de geração da página o Piwigo usa informações armazenadas em cache. Por exemplo, em vez de contar o número de imagens contidas em cada álbum, em cada página recarregada esta informação está armazenada na base de dados. Em teoria, esta informação deve ser sempre correta mas, por vezes, pode ocorrer um erro e as informações  em cache se tornam desatualizadas.</p>
+<p>Para otimizar o tempo de geração da página o Piwigo usa informações armazenadas em cache. Por exemplo, em vez de contar o número de imagens contidas em cada álbum, em cada página recarregada esta informação está armazenada na base de dados. Em teoria, esta informação deve ser sempre correta mas, às vezes, pode ocorrer um erro e as informações em cache se tornam desatualizadas.</p>
-<p>Algumas informações se tornam menos útil quando o tempo passa. Excluindo esta informação inútil do banco de dados vai lhe poupar algum espaço em disco.</p>
+<p>Algumas informações se tornam menos útil quando o tempo passa. Excluindo essa informação inútil do banco de dados vai lhe poupar algum espaço em disco.</p>
<ul>
<li><strong>Excluir tags órfãs</strong></li>
</ul>
<ul>
- <li><strong>Atualizar informações de álbuns:</strong> Para cada álbum, a seguinte informação é verificada e atualizada, se necessário: lista de álbuns dos pais, número de fotos, data da última foto, a posição entre os álbuns irmãos, posição entre todos os álbuns. Esta ação também verifica a consistência de fotos representante.</li>
- <li><strong>Atualização de informações de fotos:</strong> Para cada foto, informações atualizadas são: caminho completo para o arquivo, a taxa média. <em>Aviso</em>, não confundir-se: informações de metadados devem ser sincronizados a partir de <span class="pwgScreen">Administração &raquo; Ferramentas &raquo; sincronização</span>, ou na tela de modificação de uma foto simples (através de <span class="pwgScreen">Foto</span> por exemplo).</li>
+ <li><strong>Atualizar informações de álbuns:</strong> Para cada álbum, a seguinte informação é verificada e atualizada, se necessário: lista de álbuns dos pais, número de fotos, data da última foto, a posição entre os álbuns irmãos, posição entre todos os álbuns. Esta ação também verifica a consistência de fotos representantes.</li>
+ <li><strong>Atualização de informações de fotos:</strong> Para cada foto, as informações atualizadas são: caminho completo para o arquivo, a taxa média. <em>Aviso</em>, não se confunda: informações de metadados devem ser sincronizados a partir de <span class="pwgScreen">Administração &raquo; Ferramentas &raquo; sincronização</span>, ou na tela de modificação de uma foto simples (através de <span class="pwgScreen">Foto</span> por exemplo).</li>
</ul>
<ul>
- <li><strong>Reparar e otimizar o banco de dados:</strong>Realizar operações de reordenamento, reparação e otimizar em cada tabela do banco de dados</li>
+ <li><strong>Reparar e otimizar o banco de dados:</strong>Realiza operações de reordenamento, reparação e otimização em cada tabela do banco de dados</li>
<li><strong>Reinicializar verificação de integridade</strong></li>
</ul>
<ul>
- <li><strong>Purgar detalhes de história:</strong> Eliminar todas as linhas da tabela história. Tela <span class="pwgScreen">Administração &raquo; Ferramentas &raquo; Histórico</span> não vai mais mostrar informações para a história do passado. <em>Aviso:</em> todos os dados serão perdidos, sem qualquer forma de recupera-los de volta.</li>
+ <li><strong>Purgar detalhes de história:</strong> Eliminar todas as linhas da tabela história. Tela <span class="pwgScreen">Administração &raquo; Ferramentas &raquo; Histórico</span> não vai mais mostrar informações para a história do passado. <em>Aviso:</em> todos os dados serão perdidos, sem qualquer forma de recuperá-los.</li>
<li><strong>Purgar resumo histórico:</strong> Eliminar todas as informações de resumo sobre visitas. Este resumo é calculado a partir dos detalhes da história.</li>
<li><strong>Purgar seções:</strong> Excluir sessões de usuários expirados.</li>
<li><strong>Purgar notificações feeds nunca usadas</strong></li>
diff --git a/language/pt_BR/help/search.html b/language/pt_BR/help/search.html
index 0ccc9dce3..977725c61 100755
--- a/language/pt_BR/help/search.html
+++ b/language/pt_BR/help/search.html
@@ -1,6 +1,6 @@
<h2>Pesquiasar</h2>
-<p>Esta página permite que você faça pesquisa de fotos entre a galeria inteira.</p>
+<p>Esta página permite que você faça pesquisa de fotos em toda a galeria.</p>
<dl>
@@ -18,7 +18,7 @@ campo deve ser digitado no seguinte formato: AAAA (ou seja, 2004)</dd>
<dt>Pesquisa em álbuns</dt>
<dd>Selecione álbum ou álbuns que deseja pesquisar. Todos os
-   sub-álbuns podem ser pesquisados ​​por selecionar o álbum pai e definir permitir
+   sub-álbuns podem ser pesquisados ​​selecionando-se o álbum pai e definindo-se permitir
   pesquisa sub-álbuns abaixo.</dd>
</dl> \ No newline at end of file
diff --git a/language/pt_BR/help/user_list.html b/language/pt_BR/help/user_list.html
index c63d74e1e..f32eaf39c 100755
--- a/language/pt_BR/help/user_list.html
+++ b/language/pt_BR/help/user_list.html
@@ -6,18 +6,18 @@
<p>Um administrador pode adicionar usuários manualmente. Para cada usuário crie um nome de usuário, uma senha e submeta um e-mail válido.</p>
-<h3>Lista usuários</h3>
+<h3>Lista de usuários</h3>
-<p>A lista de usuários existentes pode ser filtrada por nome de usuário (use * com coringa), grupo ou status. Ela pode ser ordenada por data de registro, ou nome de usuário, em ordem ascendente ou descendente.</p>
+<p>A lista de usuários existentes pode ser filtrada por nome de usuário (use * com coringa), grupo ou status. Ela pode ser ordenada por data de registro ou nome de usuário, em ordem crescente ou decrescente.</p>
-<p>Essa tela permite gerenciar vários usuários de uma única vez usando diferentes açoes:</p>
+<p>Essa tela permite gerenciar vários usuários de uma única vez usando diferentes ações:</p>
<ul>
<li>Apagar usuários (requer confirmação)</li>
<li>Mudar o status do usuário</li>
- <li>associá-lo ou dessociá-lo de grupos</li>
- <li>modificar propriedades de exibiçao</li>
- <li>modificar preferências adicionais</li>
+ <li>Associá-lo ou dessociá-lo de grupos</li>
+ <li>Modificar propriedades de exibiçao</li>
+ <li>Modificar preferências adicionais</li>
</ul>
-<p>O alvo é o usuário selecionado (por padrão) ou todos os usuários mostrados na lista filtrada.</p> \ No newline at end of file
+<p>O alvo padrão é a seleção (somente os usuários selecionados) ou todos os usuários mostrados na lista filtrada.</p> \ No newline at end of file
diff --git a/language/pt_BR/index.php b/language/pt_BR/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/pt_BR/index.php
+++ b/language/pt_BR/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/pt_BR/install.lang.php b/language/pt_BR/install.lang.php
index f93024970..093434480 100644
--- a/language/pt_BR/install.lang.php
+++ b/language/pt_BR/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -27,19 +27,12 @@ $lang['Default gallery language'] = 'Idioma padrão da galeria';
$lang['Database configuration'] = 'Configuração da base de dados';
$lang['Admin configuration'] = 'Configuração da administração';
$lang['Start Install'] = 'Iniciar a instalação';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'o endereço de email deve ser do tipo xxx@yyy.eee (exemplo : jack@altern.org)';
-
-$lang['Webmaster login'] = 'Login do Webmaster';
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Será mostrado aos visitantes. É necessário para a administração do website';
-
$lang['Connection to server succeed, but it was impossible to connect to database'] = 'A conexão com o servidor foi bem sucedida, porém não foi possível se conectar à base de dados';
$lang['Can\'t connect to server'] = 'Não foi possível se conectar ao servidor';
-
$lang['Host'] = 'MySQL host';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
$lang['User'] = 'Usuário';
$lang['user login given by your host provider'] = 'login de usuário fornecido pelo seu provedor de hospedagem';
-$lang['Password'] = 'Senha';
$lang['user password given by your host provider'] = 'senha de usuário fornecida pelo seu provedor de hospedagem';
$lang['Database name'] = 'Nome da base de dados';
$lang['also given by your host provider'] = 'também forncido pelo seu provedor de hospedagem';
@@ -48,14 +41,11 @@ $lang['database tables names will be prefixed with it (enables you to manage bet
$lang['enter a login for webmaster'] = 'entre um login para o webmaster';
$lang['webmaster login can\'t contain characters \' or "'] = 'o login do webmaster não pode conter os caracteres \' ou "';
$lang['please enter your password again'] = 'por favor, entre com a sua senha novamente';
-$lang['Webmaster password'] = 'senha do Webmaster';
$lang['Keep it confidential, it enables you to access administration panel'] = 'mantenha-a bem guardada, é ela que lhe permite acessar o painel da administração';
$lang['Password [confirm]'] = 'Senha [confirmar]';
$lang['verification'] = 'verificação';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Precisa de ajuda ? Faça a sua pergunta no <a href="%s">Piwigo message board</a>.';
-$lang['Webmaster mail address'] = 'endereço de email do Webmaster';
$lang['Visitors will be able to contact site administrator with this mail'] = 'Os visitantes poderão entrar em contato com o administrador do site através desse email';
-
$lang['PHP 5 is required'] = 'É necessário PHP 5';
$lang['It appears your webhost is currently running PHP %s.'] = 'Parece que a sua hospedagem está atualmente usando PHP %s.';
$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo pode tentar mudar sua configuração para PHP 5 através da criação ou modificação de um arquivo .htaccess.';
@@ -74,4 +64,5 @@ $lang['Just another Piwigo gallery'] = 'Apenas outra galeria Piwigo.';
$lang['Welcome to my photo gallery'] = 'Bem-Vindo a minha galeria de fotos.';
$lang['Welcome to your new installation of Piwigo!'] = 'Bem-Vindo a sua nova instalação do Piwigo.';
$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Você pode baixar o arquivo de configuração e colocá-lo na pasta local/config de sua instalação.';
+$lang['localhost or other, supplied by your host provider'] = 'localhost ou outro, fornecido pelo seu provedor de hospedagem';
?> \ No newline at end of file
diff --git a/language/pt_BR/upgrade.lang.php b/language/pt_BR/upgrade.lang.php
index a95eb8667..26e9fe8b7 100644
--- a/language/pt_BR/upgrade.lang.php
+++ b/language/pt_BR/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -30,15 +30,15 @@ $lang['total upgrade time'] = 'tempo total do upgrade';
$lang['total SQL time'] = 'tempo total do SQL';
$lang['SQL queries'] = 'Consultas SQL';
$lang['Upgrade informations'] = 'Informações do upgrade';
-$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Executa uma avaliação de rotina em [Administração>Tools>Manutenção] se você encontrar algum problema.';
-$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'Por precaução, os seguintes plugins foram desativados. Você deve checar por atualizações dos plugins antes de reativá-los:';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Execute uma avaliação de rotina em [Administração>Tools>Manutenção] se você encontrar algum problema.';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'Por precaução, os plugins abaixo foram desativados. Você deve checar por atualizações dos plugins antes de reativá-los:';
$lang['Only administrator can run upgrade: please sign in below.'] = 'Apenas administrador pode realizar o upgrade: por favor, faça o login logo abaixo.';
$lang['You do not have access rights to run upgrade'] = 'Você não tem permissões de acesso para realizar o upgrade';
$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'Em <i>%s</i>, antes de <b>?></b>, insira:';
-$lang['All sub-albums of private albums become private'] = 'Todas os sub-albuns de álbuns privados tornam-se privados';
-$lang['User permissions and group permissions have been erased'] = 'Permissões de usuário e de grupo foram apagadas.';
+$lang['All sub-albums of private albums become private'] = 'Todas os sub-álbuns de álbuns privados tornam-se privados';
+$lang['User permissions and group permissions have been erased'] = 'Permissões de usuário e de grupo foram apagadas';
$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Apenas o prefixo das miniaturas (thumbnails) e o endereço de email do webmaster foram salvos da configuração anterior.';
$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Esta página se propõe a atualizar o banco de dados do seu Piwigo de uma versão antiga para uma nova versão. O assistente de atualização detectou que você está rodando uma <strong>distribuição %s</strong> (ou equivalente).';
-$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Como precaução, os seguintes temas foram desativados. Você deve verificar por atualizações dos temas antes de reativa-los:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Por precaução, os temas abaixo foram desativados. Você deve verificar por atualizações dos temas antes de reativá-los:';
?> \ No newline at end of file
diff --git a/language/pt_PT/admin.lang.php b/language/pt_PT/admin.lang.php
index f5a605fe1..bdbc1e121 100644
--- a/language/pt_PT/admin.lang.php
+++ b/language/pt_PT/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -39,8 +39,8 @@ $lang['%d tag'] = '%d etiqueta';
$lang['%d tags'] = '%d etiquetas';
$lang['%d user comment rejected'] = '%d comentário de utilizador rejeitado';
$lang['%d user comments rejected'] = '%d comentários de utilizador rejeitados';
-$lang['%d user comment validated'] = '%d comentário de utilizador validado';
-$lang['%d user comments validated'] = '%d comentários de utilizador validados';
+$lang['%d user comment validated'] = '%d comentário de utilizador aprovado';
+$lang['%d user comments validated'] = '%d comentários de utilizador aprovados';
$lang['%d user deleted'] = '%d utilizador apagado';
$lang['%d users deleted'] = '%d utilizadores apagados';
$lang['%d user'] = '%d utilizador';
@@ -58,10 +58,10 @@ $lang['Apply to sub-albums'] = 'Aplicar aos sub-albums';
$lang['Associated'] = 'Associados(as)';
$lang['Caddie management'] = 'Gestão do carrinho';
$lang['Caddie'] = 'Carrinho';
-$lang['Albums authorized thanks to group associations'] = 'Albums autorizados graças a associações de grupo';
-$lang['Album manual order was saved'] = 'A ordem manual das albums foi salva';
+$lang['Albums authorized thanks to group associations'] = 'Albuns autorizados graças a associações de grupo';
+$lang['Album manual order was saved'] = 'A ordem manual dos albuns foi salva';
$lang['Check for upgrade failed for unknown reasons.'] = 'A actualização falhou por razões desconhecidas.';
-$lang['Check for upgrade'] = 'Procurar por atualização';
+$lang['Check for upgrade'] = 'Procurar por atualizações';
$lang['Comments for all'] = 'Comentários para todos';
$lang['Current name'] = 'Nome actual';
$lang['Database'] = 'Base de dados';
@@ -90,11 +90,11 @@ $lang['Group name'] = 'Nome do grupo';
$lang['Groups'] = 'Grupos';
$lang['Guests'] = 'Visitantes';
$lang['History'] = 'Histórico';
-$lang['Informations'] = 'Informação';
+$lang['Informations'] = 'Informações';
$lang['Install'] = 'Instalar';
$lang['Link all album photos to a new album'] = 'Vincular todos os items do album a um novo album';
$lang['Link all album photos to some existing albums'] = 'Vincular todos os items do album a um album já existente';
-$lang['Linked albums'] = 'Albums vinculados';
+$lang['Linked albums'] = 'Albuns vinculados';
$lang['Lock gallery'] = 'Trancar a galeria';
$lang['Maintenance'] = 'Manutenção';
$lang['Edit album permissions'] = 'Editar as permissões do album';
@@ -103,21 +103,21 @@ $lang['Manage permissions for user "%s"'] = 'Gerir permissões do utilizador "%s
$lang['Manage tags'] = 'Gerir etiquetas';
$lang['Members'] = 'Membros';
$lang['Metadata synchronized from file'] = 'Metadados do ficheiro sincronizados';
-$lang['Move albums'] = 'Mover albums';
+$lang['Move albums'] = 'Mover albuns';
$lang['Move'] = 'Mover';
$lang['Name'] = 'Nome';
$lang['New name'] = 'Novo nome';
-$lang['New parent album'] = 'Novo álbum pai';
+$lang['New parent album'] = 'Novo albun pai';
$lang['New tag'] = 'Etiqueta nova';
$lang['Number of comments per page'] = 'Número de comentários por página';
$lang['Number of rates'] = 'Número de votos';
$lang['Number of thumbnails to create'] = 'Número de miniaturas a serem criadas';
-$lang['Only private albums are listed'] = 'Apenas os álbums privados estão listados';
+$lang['Only private albums are listed'] = 'Apenas os albuns privados estão listados';
$lang['Operating system'] = 'Sistema operativo';
$lang['Options'] = 'Opções';
$lang['Other private albums'] = 'Outros albums privados';
$lang['Page banner'] = 'Banner da página';
-$lang['Parent album'] = 'Ãlbum pai';
+$lang['Parent album'] = 'Album pai';
$lang['Path'] = 'Caminho';
$lang['Permalink'] = 'Ligação Permanente';
$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'A Ligação Permanente %s já está a ser usada pelo álbum %s. Apague-o do histórico de ligações permanentes primeiro';
@@ -138,10 +138,10 @@ $lang['Rate date'] = 'Data da classificação';
$lang['Rating by guests'] = 'Classificado(a) pelos visitantes';
$lang['Rating'] = 'Classificação';
$lang['Reject'] = 'Rejeitar';
-$lang['Representant'] = 'Miniatura do album';
-$lang['Representation of albums'] = 'Miniaturas dos albuns';
-$lang['Representative'] = 'Miniatura do album';
-$lang['Represents'] = 'É miniatura para';
+$lang['Representant'] = 'Miniatura de capa do do album';
+$lang['Representation of albums'] = 'Miniaturas das capas dos albuns';
+$lang['Representative'] = 'Miniatura capa do album';
+$lang['Represents'] = 'É miniatura para capa';
$lang['Save order'] = 'Salvar ordem';
$lang['Save to permalink history'] = 'Salvar no histórico de ligações permanentes';
$lang['Select at least one album'] = 'Selecionar pelo menos um album';
@@ -160,43 +160,42 @@ $lang['The %d following tags were deleted'] = 'As seguintes etiquetas %d foram
$lang['Unable to check for upgrade.'] = 'Não foi possível procurar actualizações.';
$lang['Uninstall'] = 'Desinstalar';
$lang['Use the default photo sort order (defined in the configuration file)']='Usar a ordem de exibição padrão (definida no ficheiro de configuração)';
-$lang['User comments validation'] = 'Validação de comentários do utilizador';
+$lang['User comments validation'] = 'Aprovação dos comentários de utilizador';
$lang['Users'] = 'Utilizadores';
$lang['Validate'] = 'Validar';
-$lang['Validation'] = 'Validação';
+$lang['Validation'] = 'Aprovação';
$lang['Version'] = 'Versão';
$lang['Virtual albums to move'] = 'Albums virtuais a mover';
$lang['Virtual album name'] = 'Nome do album virtual';
$lang['Webmaster cannot be deleted'] = 'O Webmaster não pode ser apagado';
$lang['You are running on development sources, no check possible.'] = 'Você está a usar o código fonte de desenvolvimento, não é possível qualquer verificação.';
$lang['You cannot delete your account'] = "Não pode apagar a sua conta";
-$lang['You cannot move an album in its own sub album'] = 'Não pode mover um album para um dos seus sub-albums.';
-$lang['You need to confirm deletion'] = 'Deve confirmar a remoção';
+$lang['You cannot move an album in its own sub album'] = 'Não pode mover um album para um dos seus sub-albuns.';
+$lang['You need to confirm deletion'] = 'Precisa confirmar a remoção';
$lang['Associate to album'] = 'Associar ao album';
$lang['associate to group'] = 'Associar ao grupo';
$lang['Authorized'] = 'Autorizado';
-$lang['Add a virtual album'] = 'Adicionar um álbum virtual';
+$lang['Add a virtual album'] = 'Adicionar um album virtual';
$lang['Authorize users to add comments on selected albums'] = 'Autorizar os utilizadores a adicionar comentários nos álbums seleccionados';
-$lang['The name of an album must not be empty'] = 'O nome de um álbum não deverá ficar vazio';
-$lang['Lock albums'] = 'Trancar albums';
+$lang['The name of an album must not be empty'] = 'O nome de um album não deverá ficar vazio';
+$lang['Lock albums'] = 'Trancar albuns';
$lang['Private'] = 'Privado';
$lang['Public'] = 'Público';
-$lang['Find a new representant by random'] = 'Procurar alietoriamente nova miniatura para o album';
+$lang['Find a new representant by random'] = 'Procurar alietoriamente nova miniatura para capa do album';
$lang['Public / Private'] = 'Público / Privado';
$lang['Manage authorizations for selected albums'] = 'Gerir as autorizações para os albuns seleccionados';
$lang['Virtual album added'] = 'Album virtual adicionado';
$lang['Virtual album deleted'] = 'Album virtual apagado';
$lang['Access type'] = 'Tipo de Acesso';
$lang['Information data registered in database'] = 'Informação dos dados registados na base de dados';
-$lang['Default display'] = 'Exibição por defeito';
+$lang['Default display'] = 'Exibição padrão';
$lang['The gallery URL is not valid.'] = 'O URL (endereço) da galeria não é valido.';
-$lang['Main'] = 'Principal';
$lang['The number of comments a page must be between 5 and 50 included.'] = 'O número de comentários por página deve ser entre 5 e 50 .';
$lang['Configuration'] = 'Configuração';
$lang['confirm'] = 'Confirmar';
$lang['Date'] = 'Data';
$lang['delete album'] = 'Apagar album';
-$lang['Dissociate from album'] = 'Desassociar do álbum';
+$lang['Dissociate from album'] = 'Desassociar do album';
$lang['dissociate from group'] = 'Desassociar do grupo';
$lang['Album updated successfully'] = 'As informações do album foram actualizadas com sucesso.';
$lang['photos per page'] = 'Fotos por página';
@@ -217,7 +216,7 @@ $lang['leave'] = 'Manter';
$lang['Lock'] = 'Trancar';
$lang['Locked'] = 'Trancado';
$lang['manage album photos'] = 'Gerir as fotos do album';
-$lang['manage sub-albums'] = 'Gerir sub-álbums';
+$lang['manage sub-albums'] = 'Gerir sub-albuns';
$lang['Manage'] = 'Gerir';
$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'O tempo de execução acabou, tratamento deve ser contínuo [Tempo estimado: %d segundo].';
$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'O tempo de execução acabou, tratamento deve ser contínuo [Tempo estimado: %d segundos].';
@@ -225,7 +224,6 @@ $lang['Prepared time for list of users to send mail is limited. Others users are
$lang['Time to send mail is limited. Others mails are skipped.'] = 'O tempo para enviar mail é limitado. Outros mails serão omitidos.';
$lang['To send ?'] = 'Enviar?';
$lang['Last send'] = 'Enviado pela última vez';
-$lang['email'] = 'Email';
$lang['User'] = 'Utilizador';
$lang['See you soon,'] = 'Até breve,';
$lang['Go to'] = 'Ir para';
@@ -243,7 +241,7 @@ $lang['The webmaster has unsubscribed you from receiving notifications by mail.'
$lang['You have unsubscribed from receiving notifications by mail.'] = 'Você anulou a subscrição para receber notificações por email.';
$lang[', click on'] = ', clique em ';
$lang['To unsubscribe'] = 'Cancelar subscrição';
-$lang['With blank value, gallery title will be used'] = 'Se em branco, será usadovo título da galeria ';
+$lang['With blank value, gallery title will be used'] = 'Se em branco, será usado o título da galeria';
$lang['Notification'] = 'Notificação';
$lang['Error when sending email to %s [%s].'] = 'Erro ao enviar email para %s [%s].';
$lang['Mail sent to %s [%s].'] = 'Email enviado para %s [%s].';
@@ -259,8 +257,8 @@ $lang['No user to send notifications by mail.'] = 'Nenhum utilizador a quem envi
$lang['New photos added'] = 'Novas fotos adicionados';
$lang['Subscribe to notification by mail'] = 'Subscrever as notificações por email';
$lang['Unsubscribe from notification by mail'] = 'Cancelar a subscrição das notificações por email';
-$lang['Parameter'] = 'Definições';
-$lang['Continue processing treatment'] = 'Continuar o tratamento em execução';
+$lang['Parameter'] = 'Parâmetro';
+$lang['Continue processing treatment'] = 'Continuar a processar tratamento';
$lang['Complementary mail content'] = 'Conteúdo complementar do mail.';
$lang['Add detailed content'] = 'Adicionar conteúdo detalhado';
$lang['Send mail as'] = 'Enviar email como';
@@ -274,7 +272,7 @@ $lang['Select recipients'] = 'Selecionar os destinatários';
$lang['Subscribe/unsubscribe users'] = 'Subscrever/Cancelar Subscrição dos utilizadores';
$lang['Unsubscribed'] = 'Subscrição Cancelada';
$lang['%d parameter was updated.'] = '%d parâmetro foi actualizado.';
-$lang['%d parameters were updated.'] = '%d parâmetros actualizados.';
+$lang['%d parameters were updated.'] = '%d parâmetros foram actualizados.';
$lang['%d user was not updated.'] = '%d utilizador não foi actualizado.';
$lang['%d users were not updated.'] = '%d utilizadores não foram actualizados.';
$lang['User %s [%s] was removed from the subscription list.'] = 'Utilizador %s [%s] foi removido da lista de subscritores.';
@@ -294,7 +292,7 @@ $lang['private'] = 'Privado';
$lang['public'] = 'Público';
$lang['Purge never used notification feeds'] = 'Purgar as notificações que nunca foram enviadas';
$lang['Purge sessions'] = 'Purgar as sessões';
-$lang['randomly represented'] = 'Miniatura do album aliatória';
+$lang['randomly represented'] = 'Miniatura aliatória para a capa do album';
$lang['registration date'] = 'Data de registo';
$lang['clean'] = 'limpar';
$lang['Create this site'] = 'Criar este sitio';
@@ -316,12 +314,12 @@ $lang['Remote'] = 'Remoto';
$lang['update the database from files'] = 'Atualizar a base de dados com arquivos';
$lang['status'] = 'Estado';
$lang['Directory'] = 'Diretório';
-$lang['sub-albums'] = 'sub-albuns';
+$lang['sub-albums'] = 'Sub-albuns';
$lang['Synchronize metadata'] = 'sincronizar metadados';
$lang['target'] = 'Objetivo';
$lang['Thumbnail'] = 'Miniatura';
$lang['Title'] = 'Título';
-$lang['Album list management'] = 'Gerir lista albums';
+$lang['Album list management'] = 'Gerir lista albuns';
$lang['Piwigo configuration'] = 'Configuração Piwigo';
$lang['Edit album'] = 'Editar album';
$lang['Group management'] = 'Gestão de grupos';
@@ -367,13 +365,13 @@ $lang['deleted'] = 'apagado(a)';
$lang['Metadata synchronization results'] = 'Resultados da sincronização de metadados';
$lang['only perform a simulation (no change in database will be made)'] = 'apenas executa uma simulação (não será feita alteração alguma na base de dados)';
$lang['directories + files'] = 'Diretórios + Arquivos';
-$lang['only directories'] = 'Apenas pastas';
+$lang['only directories'] = 'Apenas diretórios';
$lang['synchronize files structure with database'] = 'sincronizar a estrutura dos ficheiros com a base de dados';
$lang['synchronize files metadata with database photos informations'] = 'sincronizar os meta-dados dos ficheiros com as informações das fotos na base de dados';
-$lang['even already synchronized photos'] = 'também fotos já sincronizadas';
+$lang['even already synchronized photos'] = 'Também fotos já sincronizadas';
$lang['Used metadata'] = 'Metadados usados';
$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'O nome dos diretórios e dos arquivos deve ser composto de letras, números, "-", "_" ou "."';
-$lang['wrong filename'] = 'Nome de ficheiro errado';
+$lang['wrong filename'] = 'Nome de arquivo errado';
$lang['Upload'] = 'Carregar';
$lang['user "%s" added'] = 'utilizador "%s" adicionado';
$lang['User status'] = 'Status do utilizador';
@@ -399,10 +397,10 @@ $lang['Section'] = 'Secção';
$lang['An information email was sent to group "%s"'] = 'Um email informativo foi enviado para o grupo "%s';
$lang['Send an information email to group members'] = 'Enviar um email informativo aos membros do grupo';
$lang['Group'] = 'Grupo';
-$lang['[%s] Visit album %s'] = '[%s] Visite o álbum %s';
+$lang['[%s] Visit album %s'] = '[%s] Visite o album %s';
$lang['Hello,'] = 'Olá,';
$lang['See you soon.'] = 'Até breve.';
-$lang['Discover album:'] = 'Descobrir o álbum:';
+$lang['Discover album:'] = 'Descobrir o album:';
$lang['Mail content'] = 'Conteúdo do email';
$lang['none'] = 'Nenhum';
$lang['high'] = 'Maior';
@@ -537,7 +535,7 @@ $lang['Purge search history'] = 'Purgar o histórico da pesquisa';
$lang['Hide'] = 'Esconder';
$lang['Miscellaneous'] = 'Outras informações';
$lang['Virtual Links'] = 'Links virtuais';
-$lang['Menu Management'] = 'Menús';
+$lang['Menu Management'] = 'Menus';
$lang['%d of %d photos selected'] = '%d de %d fotos seleccionadas';
$lang['%d photos uploaded'] = '%d fotos enviadas';
$lang['+ Add an upload box'] = '+ Adicionar uma caixa de envio';
@@ -556,7 +554,7 @@ $lang['Add Photos'] = 'Adicionar Fotos';
$lang['Add write access to the "%s" directory'] = 'Definir permissões de escrita ao diretório "%s"';
$lang['Administration Home'] = 'Painel Administrativo';
$lang['Album "%s" has been added'] = 'O album "%s" foi adicionado';
-$lang['Album "%s" now contains %d photos'] = 'Ãlbum "%s" agora contém %d fotos';
+$lang['Album "%s" now contains %d photos'] = 'Album "%s" agora contém %d fotos';
$lang['Album photos associated to the following albums: %s'] = 'Fotos do album associadas aos seguintes albums: %s';
$lang['Album name'] = 'Nome do album';
$lang['Albums automatically sorted'] = 'Albums sortidos automaticamente';
@@ -635,7 +633,7 @@ $lang['No photo selected, no action possible.'] = 'Nenhuma foto seleccionada, Im
$lang['None'] = 'Nenhuma';
$lang['on the %d selected photos'] = 'Nas %d fotos seleccionadas';
$lang['Operation in progress'] = 'Operação em progresso.';
-$lang['Order of menubar items has been updated successfully.'] = 'A ordem dos items do menú foi actualizada com sucesso.';
+$lang['Order of menubar items has been updated successfully.'] = 'A ordem dos items do menu foi actualizada com sucesso.';
$lang['Orphan tags deleted'] = 'Etiquetas orfãs removidas';
$lang['Page end'] = 'Fim de Página';
$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Confirmação da Senha em falta. Por favor confirme a Palavra Passe escolhida.';
@@ -669,7 +667,7 @@ $lang['Set title'] = 'Definir título';
$lang['Settings'] = 'Definições';
$lang['Start pLoader and add your photos.'] = 'Iniciar pLoader e adicionar as suas fotos.';
$lang['Switch to clear or dark colors for administration'] = 'Mudar para claro ou escuro as cores na administração';
-$lang['The following tag was deleted'] = 'Foi removida a seguinte Etiqueta ';
+$lang['The following tag was deleted'] = 'A Etiqueta seguinte foi removida';
$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'O arquivo enviado excede a directiva MAX_FILE_SIZE especificada no formulário HTML';
$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'O arquivo enviado excede a directiva upload_max_filesize definida no ficheiro php.ini: %sB';
$lang['The uploaded file was only partially uploaded'] = 'O arquivo apenas foi enviado parcialmente';
@@ -680,7 +678,7 @@ $lang['Theme has been successfully installed'] = 'O Tema foi instalado com suces
$lang['Themes'] = 'Temas';
$lang['There is no other language available.'] = 'Não existe outro idioma disponível.';
$lang['There is no other plugin available.'] = 'Não existem mais extensões disponíveis.';
-$lang['There is no other theme available.'] = 'Não existem outro tema disponível.';
+$lang['There is no other theme available.'] = 'Não existem mais temas disponíveis.';
$lang['This theme was not designed to be directly activated'] = 'Este tema não foi desenhado para ser activado directamente';
$lang['Tools'] = 'Ferramentas';
$lang['Type here the author name'] = 'Escreva aqui o nome do autor';
@@ -721,13 +719,13 @@ $lang['Type in a search term'] = 'Escreva um termo de busca';
$lang['Learn more'] = 'Saber mais';
$lang['Rate'] = 'Classificar';
$lang['Average rate'] = 'Avaliação média';
-$lang['Activate icon "new" next to albums and pictures'] = 'Mostrar o icon "novo(a)" ao lado dos Ãlbums e das fotos';
+$lang['Activate icon "new" next to albums and pictures'] = 'Mostrar o icon "novo(a)" ao lado dos albums e das fotos';
$lang['Add a criteria'] = 'Adicionar um critério';
$lang['Deactivate all'] = 'Desactivar tudo';
$lang['Default photos order'] = 'Ordem padrão das fotos.';
$lang['Restore'] = 'Restaurar';
$lang['Restore default configuration. You will lose your plugin settings!'] = 'Restaurar a configuração padrão? Perderá as configurações pesoiais !';
-$lang['Show menubar'] = 'Mostrar o menú';
+$lang['Show menubar'] = 'Mostrar o menu';
$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'Não pode definir uma ordem padrão para as fotos porque tem uma definição personalizada na sua configuração local.';
$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'Especificou <i>$conf[\'order_by\']</i> no seu arquivo de configuração local, este parâmetro esta obsoleto, apague ou renomeie para <i>$conf[\'order_by_custom\']</i> !';
$lang['display'] = 'Mostrar';
@@ -766,7 +764,7 @@ $lang['Confirm merge'] = 'Confirmar fusão';
$lang['Create'] = 'Criar';
$lang['Crop'] = 'Cortar';
$lang['Follow Orientation'] = 'Siga a orientação';
-$lang['Graphics Library'] = 'Livraria de Gráficos';
+$lang['Graphics Library'] = 'Biblioteca Gráfica';
$lang['Height'] = 'Altura';
$lang['hide details'] = 'Ocultar detalhes';
$lang['I decide to update anyway'] = 'Eu quero atualizar mesmo assim';
@@ -788,10 +786,10 @@ $lang['Select an album'] = 'Selecionar um album';
$lang['Select at least two tags for merging'] = 'Selecione pelo menos duas etiquetas para misturar';
$lang['Select the destination tag'] = 'Selecione a etiqueta de destino';
$lang['show details'] = 'Mostrar detalhes';
-$lang['Some upgrades are available for extensions.'] = 'Algumas atualizações estão disponÃíveis para extenções.';
+$lang['Some upgrades are available for extensions.'] = 'Algumas atualizações estão disponíveis para extenções.';
$lang['Start Upload'] = 'Iniciar carga';
$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Etiquetas <em>%s</em> misturadas ncom a etiqueta<em>%s</em>';
-$lang['Thumbnails generation in progress...'] = 'Gerar miniaturas em progresso...';
+$lang['Thumbnails generation in progress...'] = 'Geração de miniaturas em progresso...';
$lang['Update All'] = 'Atualizar tudo';
$lang['Updates'] = 'Atualizações';
$lang['Width'] = 'Largura';
@@ -802,9 +800,9 @@ $lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</
$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Está a usar a via Flash para carga. Tem problemas? Em vez disso tente enviar via <a href="%s"> Navegador</a>.';
$lang['Zoom'] = 'Zoom';
$lang['Activate comments'] = 'Ativar comentários';
-$lang['Default comments order'] = 'Ordem dos comentários por defeito';
+$lang['Default comments order'] = 'Ordem padrão dos comentários';
$lang['Photo Page'] = 'Página da foto';
-$lang['Send connection settings by email'] = 'Enviar configurações de conexão por e-mail';
+$lang['Send connection settings by email'] = 'Enviar configurações de ligação por e-mail';
$lang['The original image quality must be a number between %d and %d'] = 'A qualidade da imagem original deve ser um número entre %d e %d';
$lang['The original maximum height must be a number between %d and %d'] = 'A altura original máxima deve ser um número entre %d e %d';
$lang['The original maximum width must be a number between %d and %d'] = 'A largura original máxima deve ser um número entre %d e %d';
@@ -814,7 +812,7 @@ $lang['A locked gallery is only visible to administrators'] = 'Uma galeria bloqu
$lang['Unlock gallery'] = 'Desbloquear galeria';
$lang['Gallery unlocked'] = 'Galeria desbloqueada';
$lang['Notify administrators when a comment is'] = 'Notificar os administradores quando um comentário é';
-$lang['modified'] = 'mMdificado';
+$lang['modified'] = 'Modificado';
$lang['pending validation'] = 'Validação pendente';
$lang['Save visits in history for'] = 'Gravar visitas no histórico de';
$lang['simple visitors'] = 'Visitantes comuns';
@@ -911,7 +909,7 @@ $lang['Added by %s'] = 'Adicionado por %s';
$lang['Numeric identifier : %d'] = 'Identificador numérico: %d';
$lang['Original file : %s'] = 'Arquivo original: %s';
$lang['Posted %s on %s'] = 'Colocada(s) %s em %s';
-$lang['Rated %d times, score : %.2f'] = 'Avakiada %d vezes, classificação: %.2f';
+$lang['Rated %d times, score : %.2f'] = 'Avaliada %d vezes, classificação: %.2f';
$lang['Sharpen'] = 'Refinar';
$lang['Visited %d times'] = 'Visitada %d vezes';
$lang['Watermark'] = 'Marca de água';
@@ -924,8 +922,6 @@ $lang['Duplicate selected tags'] = 'Duplicar as etiquetas selecionadas';
$lang['Name of the duplicate'] = 'Nome do duplicado';
$lang['Source tag'] = 'Origem da etiqueta';
$lang['Tag "%s" is now a duplicate of "%s"'] = 'Etiqueta "%s" é agora um duplicado de "%s"';
-$lang['Format'] = 'Formato';
-$lang['Invalid dimension'] = 'Dimensão inválida';
$lang['Landscape'] = 'Paisagem';
$lang['Manage photos'] = 'Organizar fotos';
$lang['Minimum height'] = 'Altura mínima';
@@ -948,4 +944,32 @@ $lang['This group will be set to default'] = 'Este grupo será usado como padrã
$lang['This group will be unset to default'] = 'Este grupo não será mais usado como padrão';
$lang['Type here the name of the new group'] = 'Escreva aqui o nome do novo grupo';
$lang['Purge user cache'] = 'Purgar cache de utilizador';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'As dimensões desta foto serão reduzidas para %dx%d pixels';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'Redimencionar depois de carregar, devido ao uso de GD como livraria gráfica,está desativado. ';
+$lang['Select at least one tag'] = 'Selecionar no mínimo uma etiqueta';
+$lang['Basic settings'] = 'definições básicas';
+$lang['General'] = 'Geral';
+$lang['Mail theme'] = 'Tema do mail';
+$lang['(filtered from %s total users)'] = '(filtrado de %s utilizadores totais)';
+$lang['Show %s users'] = 'Mostrar %s utilizadores';
+$lang['%d of %d users selected'] = '%d de %d utilizadores selecionados';
+$lang['All %d users are selected'] = 'Todos os %d utilizadores estão selecionados';
+$lang['Change password'] = 'Alterar a senha';
+$lang['Change username'] = 'Alterar o nome de utilizador';
+$lang['Last visit on %s, %s.'] = 'Última visita em %s, %s.';
+$lang['Loading...'] = 'Carregando';
+$lang['No matching user found'] = 'Não foram encontrados utilizadores que correspondam';
+$lang['No user selected of %d users'] = 'Em %d utilizadores não foi nenhum selecionado';
+$lang['No user selected, no action possible.'] = 'Sem utilizador selecionado não é possivel qualquer ação';
+$lang['Password updated'] = 'Senha atualizada';
+$lang['Registered on %s, %s.'] = 'Registado em %s, %s.';
+$lang['Showing %s to %s of %s users'] = 'Mostrando %s para %s de %s utilizadores';
+$lang['Update user'] = 'Atualizar o utilizador';
+$lang['User %s added'] = 'Utilizador %s adicionado';
+$lang['User %s updated'] = 'Utilizador %s atualizado';
+$lang['Users modified'] = 'Utilizadores modificados';
+$lang['on the %d selected users'] = 'Em %d utilizadores selecionados';
+$lang['Close user details'] = 'Fechar detalhes do utilizador';
+$lang['Open user details'] = 'Abrir detalhes do utilizador';
+$lang['close'] = 'Fechar';
?> \ No newline at end of file
diff --git a/language/pt_PT/common.lang.php b/language/pt_PT/common.lang.php
index 4f923bc66..2753d9154 100644
--- a/language/pt_PT/common.lang.php
+++ b/language/pt_PT/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Português [PT]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=432
Author: Piwigo team
Author URI: http://piwigo.org
@@ -53,24 +53,24 @@ $lang['%d new users'] = '%d novos utilizadores ';
$lang['About'] = 'Sobre';
$lang['All tags'] = 'Todas as etiquetas';
$lang['Any tag'] = 'Qualquer etiqueta';
-$lang['At least one listed rule must be satisfied.'] = 'No mínimo, um dos critérios deverá ser satisfeito.';
+$lang['At least one listed rule must be satisfied.'] = 'No mínimo, um dos critérios deverá ser satisfeito.';
$lang['Author'] = 'Autor';
$lang['Albums'] = 'Albuns';
$lang['Album'] = 'Album';
$lang['Close this window'] = 'Fechar a janela';
-$lang['Complete RSS feed (photos, comments)'] = 'RSS completo (fotos e comentários)';
+$lang['Complete RSS feed (photos, comments)'] = 'RSS completo (fotos e comentários)';
$lang['Confirm Password'] = 'Confirmar a senha';
-$lang['Connection settings'] = 'Definições de ligação';
+$lang['Connection settings'] = 'Definições de ligação';
$lang['Login'] = 'Entrar';
$lang['Contact webmaster'] = 'Contactar o webmaster';
$lang['Create a new account'] = 'Abrir uma conta nova';
$lang['Created on'] = 'Aberta em';
$lang['Creation date'] = 'Data de abertura';
-$lang['Current password is wrong'] = 'A Senha actual está errada';
-$lang['Dimensions'] = 'Dimensões';
+$lang['Current password is wrong'] = 'A Senha actual está errada';
+$lang['Dimensions'] = 'Dimensões';
$lang['Display'] = 'Mostrar';
-$lang['Each listed rule must be satisfied.'] = 'Todos os critérios listados devem ser satisfeitos';
-$lang['Email address is missing. Please specify an email address.'] = 'Esqueceu o endereço de email. Por favor indique um email.';
+$lang['Each listed rule must be satisfied.'] = 'Todos os critérios listados devem ser satisfeitos';
+$lang['Email address is missing. Please specify an email address.'] = 'Esqueceu o endereço de email. Por favor indique um email.';
$lang['Email address'] = 'Endereço de email';
$lang['Enter your personnal informations'] = 'Introduza os seus dados pessoais';
$lang['Error sending email'] = 'Erro durante o envio do email';
@@ -105,7 +105,7 @@ $lang['Reset'] = 'Recomeçar';
$lang['Retrieve password'] = 'Recuperar a Senha';
$lang['Search rules'] = 'Critérios de pesquisa';
$lang['Search tags'] = 'Pesquisar as estiquetas';
-$lang['Search'] = 'pesquisar';
+$lang['Search'] = 'Pesquisar';
$lang['display available tags'] = 'Mostrar etiquetas disponíveis';
$lang['Since'] = 'Desde ';
$lang['Sort by'] = 'Ordenar por';
@@ -150,10 +150,10 @@ $lang['An administrator must authorize your comment before it is visible.'] = 'U
$lang['This login is already used by another user'] = 'Esta entrada já é usada por outro utilizador.';
$lang['Comments'] = 'Comentários';
$lang['Add a comment'] = 'Adicionar um comentário';
-$lang['created after %s (%s)'] = 'Feito depois de %s (%s)';
-$lang['created before %s (%s)'] = 'Feito antes de %s (%s)';
-$lang['created between %s (%s) and %s (%s)'] = 'Feito entre %s (%s) e %s (%s)';
-$lang['created on %s'] = 'Feito em %s';
+$lang['created after %s (%s)'] = 'Criado depois de %s (%s)';
+$lang['created before %s (%s)'] = 'Criado antes de %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'Criado entre %s (%s) e %s (%s)';
+$lang['created on %s'] = 'Criado em %s';
$lang['Customize'] = 'Personalizar';
$lang['Your Gallery Customization'] = 'Personalização da sua galeria';
$lang['day'][0] = 'Domingo';
@@ -196,6 +196,10 @@ $lang['last %d days'] = '%d últimos dias';
$lang['Last'] = 'Última página';
$lang['Logout'] = 'Sair';
$lang['obligatory'] = 'mandatário';
+
+
+
+
$lang['display a calendar by creation date'] = 'Mostra um calendário ordenado pela data de criação';
$lang['display all photos in all sub-albums'] = 'Mostra todas as fotos em todos os sub-albuns';
$lang['return to normal view mode'] = 'Voltar ao modo normal de visionamento';
@@ -231,7 +235,7 @@ $lang['Show file metadata'] = 'Mostrar os metadados do arquivo.';
$lang['Powered by'] = 'Powered by';
$lang['Preferences'] = 'Preferências';
$lang['Previous'] = 'Prévia';
-$lang['Random photos'] = 'Fotos aliatórias';
+$lang['Random photos'] = 'Fotos aleatórias';
$lang['display a set of random photos'] = 'Exibir um conjunto aleatório de fotos';
$lang['Recent albums'] = 'Albuns recentes';
$lang['display recently updated albums'] = 'Exibir albums actualizados recentemente.';
@@ -244,7 +248,6 @@ $lang['login mustn\'t end with a space character'] = 'O nome de utilizador não
$lang['login mustn\'t start with a space character'] = 'O nome de utilizador não deve começar com um espaço';
$lang['this login is already used'] = 'Este nome de utilizador já existe';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'O formato do email deve ser do tipo: xxx@yyy.eee (exemplo : jack@altern.org)';
-$lang['please enter your password again'] = 'Por favor, escreva a sua senha novamente';
$lang['Auto login'] = 'Iníciar sessão automáticamente';
$lang['remove this tag from the list'] = 'Remover esta etiqueta da lista';
$lang['representative'] = 'Foto de Capa';
@@ -272,9 +275,8 @@ $lang['SQL queries in'] = 'Pesquisas SQL em';
$lang['display only recently posted photos'] = 'Mostrar apenas as fotos publicadas recentemente';
$lang['return to the display of all photos'] = 'Voltar a visionar todas as fotos';
$lang['the beginning'] = 'O começo';
-$lang['Interface theme'] = 'Tema';
$lang['Thumbnails'] = 'Miniaturas';
-$lang['Menu'] = 'Menú';
+$lang['Menu'] = 'Menu';
$lang['A comment on your site'] = 'Um comentário no seu sitio';
$lang['today'] = 'hoje';
$lang['Update your rating'] = 'Actualizar a sua classificação';
@@ -413,4 +415,12 @@ $lang['Username is mandatory'] = 'O nome de Utilizador é obrigatório';
$lang['mandatory'] = 'obrigatório';
$lang['Website'] = 'Sitio na net';
$lang['Your website URL is invalid'] = 'A URL do sitio é inválida';
+$lang['Email'] = 'Email';
+$lang['First Page'] = 'Primeira página';
+$lang['Go back to the album'] = 'Voltar ao album';
+$lang['Last Page'] = 'Última página';
+$lang['Password is missing. Please enter the password.'] = 'Senha em falta. Por favor escreva a Senha.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Confirmação da Senha em falta. Por favor confirme a Palavra Passe escolhida.';
+$lang['%d photos per page'] = '%d Fotos por página';
+$lang['Theme'] = 'Tema';
?> \ No newline at end of file
diff --git a/language/pt_PT/index.php b/language/pt_PT/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/pt_PT/index.php
+++ b/language/pt_PT/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/pt_PT/install.lang.php b/language/pt_PT/install.lang.php
index 32a7fe8fa..62ae5b20a 100644
--- a/language/pt_PT/install.lang.php
+++ b/language/pt_PT/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -27,16 +27,12 @@ $lang['Default gallery language'] = 'Idioma padrão da galeria';
$lang['Database configuration'] = 'Configuração da base de dados';
$lang['Admin configuration'] = 'Configuração da administração';
$lang['Start Install'] = 'Iniciar a instalação';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'o endereço de email deve ser do tipo xxx@yyy.eee (exemplo : jack@altern.org)';
-$lang['Webmaster login'] = 'Entrada do Webmaster';
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Será mostrado aos visitantes. É necessário para a administração do sitio';
$lang['Connection to server succeed, but it was impossible to connect to database'] = 'A ligação ao servidor foi bem sucedida, mas foi impossível ligar à base de dados';
$lang['Can\'t connect to server'] = 'Não foi possível ligar ao servidor';
$lang['Host'] = 'Servidor MySQL';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
$lang['User'] = 'Utilizador';
$lang['user login given by your host provider'] = 'Login de utilizador fornecido pelo seu fornecedor de alojamento';
-$lang['Password'] = 'Senha';
$lang['user password given by your host provider'] = 'Palavra-passe fornecida pelo seu fornecedor de alojamento';
$lang['Database name'] = 'Nome da base de dados';
$lang['also given by your host provider'] = 'Também fornecido pelo seu fornecedor de alojamento';
@@ -45,12 +41,10 @@ $lang['database tables names will be prefixed with it (enables you to manage bet
$lang['enter a login for webmaster'] = 'Introduza um nome para o webmaster';
$lang['webmaster login can\'t contain characters \' or "'] = 'O nome do webmaster não pode conter os caracteres \' ou "';
$lang['please enter your password again'] = 'Por favor, escreva a sua senha novamente';
-$lang['Webmaster password'] = 'Palavra-passe do Webmaster';
$lang['Keep it confidential, it enables you to access administration panel'] = 'Mantenha-a bem guardada, é ela que lhe permite aceder ao painel administrativo';
$lang['Password [confirm]'] = 'Palavra-passe [confirmação]';
$lang['verification'] = 'Verificar Senha inserida';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Precisa de ajuda? Faça a sua pergunta no <a href="%s">Fórum Piwigo</a>.';
-$lang['Webmaster mail address'] = 'Endereço de email do Webmaster';
$lang['Visitors will be able to contact site administrator with this mail'] = 'Os visitantes poderão entrar em contacto com o administrador da galeria através deste email';
$lang['PHP 5 is required'] = 'PHP 5 é necessário';
$lang['It appears your webhost is currently running PHP %s.'] = 'Parece que o seu provedor de hospedagem usa actualmente PHP %s.';
@@ -70,7 +64,7 @@ $lang['Just another Piwigo gallery'] = 'Apenas mais uma galeria Piwigo';
$lang['Welcome to my photo gallery'] = 'Bem-vindo à minha galeria de fotos';
$lang['Welcome to your new installation of Piwigo!'] = 'Bem-vindo à sua nova instalação do Piwigo!';
$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Não hesite em visitar nossos foruns para qualquer ajuda: %s';
-
$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Você deve entrar em contacto com o suporte do seu fornecedor de alojamento e saber como pode mudar para PHP 5.';
$lang['Password ']['confirm'] = 'Senha [confirme]';
+$lang['localhost or other, supplied by your host provider'] = 'hospedeiro local ou outro, fornecido pelo seu alojador';
?> \ No newline at end of file
diff --git a/language/pt_PT/upgrade.lang.php b/language/pt_PT/upgrade.lang.php
index 2f7da826f..b37028d33 100644
--- a/language/pt_PT/upgrade.lang.php
+++ b/language/pt_PT/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/ro_RO/admin.lang.php b/language/ro_RO/admin.lang.php
index ee53b44c9..7a6fbba20 100644
--- a/language/ro_RO/admin.lang.php
+++ b/language/ro_RO/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -382,7 +382,6 @@ $lang['deleted'] = 'șters';
$lang['delete'] = 'șterge';
$lang['directories + files'] = 'diurectoare + fișiere';
$lang['display'] = 'vizualizează';
-$lang['email'] = 'Email';
$lang['errors during synchronization'] = 'erori în timpul sincronizării';
$lang['even already synchronized photos'] = 'chiar și imaginile deja sincronizate';
$lang['existing album'] = 'album existent';
@@ -573,7 +572,6 @@ $lang['user_status_webmaster'] = 'Webmaster';
$lang['width must be a number superior to'] = 'lățimea trebuie să fie mai mare de';
$lang['wrong filename'] = 'nume de fișier greșit';
$lang['Mail sent to %s [%s].'] = 'Mail trimis la %s [%s].';
-$lang['Main'] = 'Principal';
$lang['%s in the future'] = '%s în viitor';
$lang['Manage the members'] = 'Gestionați membrii';
$lang['photos informations synchronized with files metadata'] = 'Informațiile fotografiilor sincronizate cu metadatele fișierelor';
@@ -813,7 +811,7 @@ $lang['Unsubscribe from notification by mail'] = 'Dezabonați-vă de la notifica
$lang['Uninstalled Plugins'] = 'Pluginuri dezinstalate';
$lang['Unlock gallery'] = 'Deblocați galeria foto';
$lang['Two updates are available'] = 'Două actualizări sunt disponibile';
-$lang['You might go to plugin list to install and activate it.'] = 'Merge-ți la lista de plugin-uri pentru a le instala și activa.';
+$lang['You might go to plugin list to install and activate it.'] = 'Mergeți la lista de plugin-uri pentru a le instala și activa.';
$lang['You have unsubscribed from receiving notifications by mail.'] = 'V-ați dezabonat de la primirea notificărilor prin e-mail.';
$lang['You have subscribed to receiving notifications by mail.'] = 'V-ați abonat pentru a primi notificări prin e-mail.';
$lang['Y Position'] = 'Y Poziție';
@@ -832,4 +830,152 @@ $lang['high'] = 'înalt';
$lang['custom'] = 'Pe măsură';
$lang['[%s] Visit album %s'] = '[%s] Vizitează albumul %s';
$lang['Your configuration settings are saved'] = 'Setările d-voastră de configurare sunt salvate';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'Ai specificat <i>$conf[\'order_by\']</i> în fișierul tău local de configurație, acest parametru este perimat, șterge-l sau renumește-l în <i>$conf[\'order_by_custom\']</i> !';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam este un administrator avansat sursă libera de fotografii digitale pentru Linux, Windows și MacOSX.';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam este proiectat pentru fotografi care vor să vizualizeze, administreze, editeze, îmbunătățească, organizeze, eticheteze și partajeze fotografii.';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto este administratorul implicit de fotografii digitale din MacOSX. Plugin-ul Piwigo de export iți permite să creezi albume noi și să exporți fotografiile tale din iPhoto direct în galeria ta Piwigo.';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader înseamnă <em>Piwigo Uploader</em>. Din calculatorul tău, pLoader îți pregătește fotografiile și le transferă în galeria ta Piwigo.';
+$lang['User %s [%s] was added to the subscription list.'] = 'Utilizatorul %s [%s] a fost adăugat la lista de abonați.';
+$lang['User %s [%s] was not added to the subscription list.'] = 'Utilizatorul %s [%s] nu a fost adăugat la lista de abonați.';
+$lang['User %s [%s] was not removed from the subscription list.'] = 'Utilizatorul %s [%s] nu a fost șters din lista de abonați.';
+$lang['User %s [%s] was removed from the subscription list.'] = 'Utilizatorul %s [%s] a fost șters din lista de abonați.';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'ATENȚIE! Aces plugin nu pare să fie compatibil cu această versiune de Piwigo.';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'Atenție: abonarea sau dezabonarea vor trimite mesaje la utilizatori';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = 'Pentru a exporta fotografiile tale din digiKam în Piwigo, instalează digiKam si plugin-urile Kipi.';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell este un organizator sursă liberă de fotografii digitale care ruleaza pe Linux. Este organizatorul de fotografii implicit în Ubuntu și Fedora.';
+$lang['Some themes and plugins may be not available yet.'] = 'Unele teme și plugin-uri s-ar putea să nu fie încă disponibile.';
+$lang['Start pLoader and add your photos.'] = 'Pornește pLoader și adaugă fotografiile tale.';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'Verifică permisiunile dosarului "plugins" și ale sub-dosarelor (CHMOD).';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'În fișierul tău php.ini, upload_max_filesize (%sB) este mai mare decât post_max_size (%sB), ar trebui să modifici această setare';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'Include datele istorice (Atenție: memoria server-ului poate fi depășită)';
+$lang['Manage photo ranks'] = 'Ordine de sortare pentru fotografii';
+$lang['Not cropped correctly?'] = 'Nu a fost decupat corect?';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = 'Pe Linux-ul tău, instalează Shotwell cu ajutorul administratorului de pachete și activează opțiunea Piwigo de publicare.';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (RemoteGallery client for Android) este un client Piwigo sursă deschisă (GPL v3) pentru platforma Android.';
+$lang['Replacers (customized templates)'] = 'Substitute (șabloane personalizate)';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'Restaurează configurația implicită. Îți vei pierde setările plugin-urilor!';
+$lang['Save Template Directory'] = 'Salvează dosarul de șabloane';
+$lang['Other plugins'] = 'Alte plugin-uri disponibile';
+$lang['Missing Plugins'] = 'Plugin-uri lipsă';
+$lang['No destination tag selected'] = 'Nicio etichetă destinație aleasă';
+$lang['Notify administrators when a comment is'] = 'Informează administratorii când un comentariu este';
+$lang['Number of albums per page'] = 'Numărul de albume pe pagină';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'ACEST PLUGIN ESTE ACUM PARTE DIN NUCLEUL PIWIGO! DEZINSTEALEAZÄ‚-L ACUM!';
+$lang['Templates configuration has been recorded.'] = 'Configurația șabloanelor a fost înregistrată.';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'Plugin-ul Piwigo de export îți permite să creezi albume și să exporți fotografii.';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'Plugin-ul Piwigo de publicare îți permite să exporți și să sincronizezi fotografii din Lightroom direct în galeria ta Piwigo.';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'Dimensiunile fotografiei vor fi reduse la %dx%d pixeli.';
+$lang['Pending Comments'] = 'Comentarii în așteptare';
+$lang['Permission granted for groups'] = 'Permisiune acordată pentru grupuri';
+$lang['Photo Properties'] = 'Proprietățile fotografiei';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Plugin Piwigo pentru publicare pentru Ligtroom';
+$lang['Piwigo export plugin for Aperture'] = 'Plugin Piwigo pentru export pentru Aperture';
+$lang['Piwigo export plugin for iPhoto'] = 'Plugin Piwigo pentru export pentru iPhoto';
+$lang['Piwigo publish plugin for Shotwell'] = 'Plugin Piwigo pentru publicare pentru Shotwell';
+$lang['Piwigo publish plugin for digiKam'] = 'Plugin Piwigo pentru publicare pentru digiKam';
+$lang['Plugin list'] = 'Lista de plugin-uri';
+$lang['Original templates'] = 'Șabloane originale';
+$lang['Photo unreachable or no support'] = 'Fotografie nedisponibilă sau în format nesuportat';
+$lang['Support'] = 'Suport';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'Dacă HD nu este disponibil și dacă dimensiunea curentă pentru web este mai mare decât dimensiunile noi, Piwigo o va muta ca HD și va crea din ea o fotografie cu dimensiuni mai mici pentru web.';
+$lang['None'] = 'Nimic';
+$lang['Posted %s on %s'] = 'A publicat %s pe %s';
+$lang['Photo Page'] = 'Pagina fotografii';
+$lang['Purge never used notification feeds'] = 'Curăță feed-urile de înștiințări neutilizate';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'Fii în contact cu proiectul Piwigo, abonează-te la Scrisoarea de știri Piwigo. Vei primi e-mail-uri când vor fi disponibile noi versiuni (câteodată incluzând reparări de bug-uri de securirate, este important să știi și să actualizezi) și când se vor întâmpla evenimente majore cu proiectul. Numai cateva e-mail-uri pe an.';
+$lang['Piwigo Announcements Newsletter'] = 'Scrisoarea de știri Piwigo';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'Abonează %s la Scrisoarea de știri Piwigo';
+$lang['Sharpen'] = 'Ascute';
+$lang['Remote'] = 'Distant';
+$lang['reduce to single existing albums'] = 'redu la albume unice existente';
+$lang['Remove from caddie'] = 'Șterge din coș';
+$lang['There is no available subscribers to mail.'] = 'Nu există niciun abonat pentru a fi înștiințat prin e-mail.';
+$lang['Unable to dump database.'] = 'Imposibil de descărcat baza de date.';
+$lang['Unknown upload error'] = 'Eroare necuonscută de încărcare';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = 'Pentru dimensiunile de fotografii cu decupare, cum ar fi "Pătrat", Piwigo va încerca să includa centrul de interes.';
+$lang['Notification'] = 'Înștiințare';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'Aceasta este o actualizare majoră, cu <a href="%s">îmbunătățiri interesante</a>.';
+$lang['This is a minor update, with only bug corrections.'] = 'Aceasta este o actualizare minoră, numai cu corecții de bug-uri.';
+$lang['To send ?'] = 'Se trimite?';
+$lang['To subscribe'] = 'Pentru a abona';
+$lang['To unsubscribe'] = 'pentru a dezabona';
+$lang['Photo sizes with crop'] = 'Dimensiunile fotografiei cu decupare';
+$lang['Photos generation in progress...'] = 'Generarea fotografiilor în curs...';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'Timpul de pregătire a liste utilizatorilor la care va fi trimis e-mail este limitat. Alți utilizatori nu vor fi afișați.';
+$lang['Searching...'] = 'Căutare...';
+$lang['Settings'] = 'Setări';
+$lang['Status of user "%s" updated'] = 'Utilizatorul "%s" statut actualizat';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'Abonații pot fi listați (disponibili) numai dacă există elemente noi pentru înștiințări.';
+$lang['Send connection settings by email'] = 'Trimite setările de conexiune prin e-mail';
+$lang['Some upgrades are available for extensions.'] = 'Sunt disponibile unele actualizări pentru extensii.';
+$lang['Start Upload'] = 'Începe încărcarea';
+$lang['Reset ignored updates'] = 'Resetează actualizările ignorate';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'Redimensionarea după încărcare a fost dezactivată datorită folosirii GD ca librărie grafică';
+$lang['Set creation date'] = 'Alege data creării';
+$lang['Piwigo Update'] = 'Actualizare Piwigo';
+$lang['Piwigo Uploader'] = 'Utilitar de încărcare Piwigo';
+$lang['Plugins which need upgrade'] = 'Plugin-uri de actualizat';
+$lang['Purge compiled templates'] = 'Curăță șabloanele compilate';
+$lang['Purge user cache'] = 'Curăță cache-ul utilizatorului';
+$lang['Released on'] = 'Lansat pe';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Foloesești utilitarul de încărcare prin navigator. Încearcă <a href="%s">utilitarul de încărcare prin Flash</a> în locul lui.';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Folosești utilitarul de încărcare prin Flash. Ai probleme? Încearcă <a href="%s">utilitarul de încărcare prin navigator</a> în locul lui.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Poți actualiza direct la Piwigo %s, fără a actualiza la Piwigo %s (recomandat).';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'Ar trebui să-ți actualizezi sistemul pentru a beneficia de toate avantajele aplicației, altfel aplicația ar putea funcționa necorespunzător sau deloc';
+$lang['Update photos information'] = 'Actualizează informațiile fotografiiloe';
+$lang['Update to Piwigo %s'] = 'Actualizează la Piwigo $s';
+$lang['Upload'] = 'Încarcă';
+$lang['Upload Photos'] = 'Încarcă fotografii';
+$lang['Uploaded Photos'] = 'Fotografii încărcate';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = 'Înlocuirea șabloanelor originale cu șabloane personalizate din sub-dosarul șabloane-extensii';
+$lang['Select recipients'] = 'Alege destinatari';
+$lang['Set as default language for unregistered and new users'] = 'Alege ca limbă implicită pentru utilizatorii noi si neînregistrați';
+$lang['Set as default theme for unregistered and new users'] = 'Alege ca temă implicită pentru utilizatorii noi si neînregistrați';
+$lang['Set author'] = 'Alege autor';
+$lang['Set title'] = 'Alege titlu';
+$lang['Subscribe'] = 'Abonează';
+$lang['Subscribe %s'] = 'Abonează %s';
+$lang['Subscribe to notification by mail'] = 'Abonează-te la înștiințări prin e-mail';
+$lang['Subscribed'] = 'Abonat';
+$lang['Switch to clear or dark colors for administration'] = 'Schimbă la clar sau la culori întunecate pentru administrare.';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'Timpul pentru a trimite e-mail-uril este limitat. Alte e-mail-luri au fost sărite.';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'Nu poți defini o ordine implicită a fotografiilor, pentru că ai deja o setare personalizată în configurația locală.';
+$lang['Hoverbox display'] = 'Afișaj în fereastră flotantă';
+$lang['No display'] = 'Niciu';
+$lang['No order field selected'] = 'Nicio ordine a cămpurilor aleasă';
+$lang['No photo selected, %d photos in current set'] = 'Nicio fotografie aleasă, %d fotografii în setul curent';
+$lang['No photo selected, no action possible.'] = 'Nicio fotografie aleasă, nicio acțiune posibilă.';
+$lang['No user to send notifications by mail.'] = 'Niciun utilizator petnru a fi înștiințat prin e-mail.';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Pwigo nu poate aduce fotografiile de pe server';
+$lang['Webmaster status is required.'] = 'Este necesar statutul de webmaster.';
+$lang['Subscribe/unsubscribe users'] = 'Abonează/dezabonează utilizatori';
+$lang['The center of interest is the most meaningful zone in the photo.'] = 'Centrul de interes este partea cu cel mai mult înțeles dintr-o fotografie.';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'Webmaster-ul te-a abonat pentru a fi înștiințat prin e-mail.';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'Webmaster-ul te-a dezabonat de la înștiințările prin e-mail.';
+$lang['Basic settings'] = 'Setări de bază';
+$lang['No matching user found'] = 'Niciun utilizator nu corespunde';
+$lang['No user selected of %d users'] = 'Niciun utilizator selectat din %d utilizatori';
+$lang['No user selected, no action possible.'] = 'Niciun utilizator selectat, nicio acțiune posibilă';
+$lang['Password updated'] = 'Parolă adusă la zi';
+$lang['Showing %s to %s of %s users'] = 'Arăt de la %s la %s din %s utilizatori';
+$lang['Update user'] = 'Adu la zi utilizator';
+$lang['User %s updated'] = 'Utilizatorul %s adus la zi';
+$lang['Users modified'] = 'Utilizatori modificați';
+$lang['on the %d selected users'] = 'pe cei %d utilizatori selectați';
+$lang['%d of %d users selected'] = '%d din %d utilizatori selectați';
+$lang['(filtered from %s total users)'] = '(filtrat din %s utilizatori în total)';
+$lang['All %d users are selected'] = 'Toți %d utilizatorii sunt selectați';
+$lang['Change password'] = 'Schimbă parola';
+$lang['Change username'] = 'Schimbă numele de utilizator';
+$lang['General'] = 'General';
+$lang['Last visit on %s, %s.'] = 'Ultima vizită pe %s, %s';
+$lang['Loading...'] = 'Se încarcă';
+$lang['Mail theme'] = 'Temă e-mail';
+$lang['Registered on %s, %s.'] = 'ÃŽnregistrat pe %s, %s';
+$lang['Select at least one tag'] = 'Alege cel puțin o etichetă';
+$lang['Show %s users'] = 'Arată %s utilizatori';
+$lang['User %s added'] = 'Utilizatorul %s adăugat';
+$lang['Close user details'] = 'ÃŽnchide detalii utilizator';
+$lang['Open user details'] = 'Deschide detalii utilizator';
+$lang['close'] = 'închide';
?> \ No newline at end of file
diff --git a/language/ro_RO/common.lang.php b/language/ro_RO/common.lang.php
index 3d7fd7aa4..1e714766f 100644
--- a/language/ro_RO/common.lang.php
+++ b/language/ro_RO/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Română [RO]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=433
Author: Piwigo team
Author URI: http://piwigo.org
@@ -231,7 +231,6 @@ $lang['login mustn\'t end with a space character'] = 'numele de utilizator nu tr
$lang['login mustn\'t start with a space character'] = 'numele de utilizator nu trebuie sa înceapă cu un spaţiu';
$lang['this login is already used'] = 'acest nume este deja folosit';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'adresa de e-mail trebuie să fie de genul xxx@yyy.eee (de exemplu: jack@altern.org)';
-$lang['please enter your password again'] = 'vă rugăm să introduceţi parola din nou';
$lang['Auto login'] = 'Conectare automatică';
$lang['remove this tag from the list'] = 'eliminaţi această etichetă de pe lista';
$lang['representative'] = 'reprezentant';
@@ -260,7 +259,6 @@ $lang['SQL queries in'] = 'interogări SQL în';
$lang['display only recently posted photos'] = 'Arată numai elementele publicate recent';
$lang['return to the display of all photos'] = 'reveniţi la afişarea tuturor imaginilor';
$lang['the beginning'] = 'începutul';
-$lang['Interface theme'] = 'Tema Interfeţei';
$lang['Thumbnails'] = 'Miniaturi';
$lang['Menu'] = 'Meniu';
$lang['A comment on your site'] = 'Un comentariu pe site-ul dvs.';
@@ -414,4 +412,12 @@ $lang['Username is mandatory'] = 'Numele de utilizator este obligatoriu';
$lang['mandatory'] = 'obligatoriu';
$lang['Website'] = 'Site';
$lang['Your website URL is invalid'] = 'URL-ul sitului tău este invalid';
+$lang['Email'] = 'Email';
+$lang['First Page'] = 'Prima pagină';
+$lang['Go back to the album'] = 'ÃŽnapoi la album';
+$lang['Last Page'] = 'Ultima pagină';
+$lang['Password is missing. Please enter the password.'] = 'Parola lipseÅŸte. Te rog sa introduci parola-';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Lipseşte confirmarea parolei. Te rog să confirmi parola aleasă.';
+$lang['%d photos per page'] = '%d fotografii per pagină';
+$lang['Theme'] = 'Temă';
?> \ No newline at end of file
diff --git a/language/ro_RO/index.php b/language/ro_RO/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/ro_RO/index.php
+++ b/language/ro_RO/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/ro_RO/install.lang.php b/language/ro_RO/install.lang.php
index 85eaa3ad9..9fe9571d8 100755
--- a/language/ro_RO/install.lang.php
+++ b/language/ro_RO/install.lang.php
@@ -1,29 +1,29 @@
<?php
-// +-----------------------------------------------------------------------+
-// | Piwigo - a PHP based photo gallery |
-// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
-// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
-// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
-// +-----------------------------------------------------------------------+
-// | 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 |
-// | |
-// | This program is distributed in the hope that it will be useful, but |
-// | WITHOUT ANY WARRANTY; without even the implied warranty of |
-// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
-// | General Public License for more details. |
-// | |
-// | You should have received a copy of the GNU General Public License |
-// | along with this program; if not, write to the Free Software |
-// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
-// | USA. |
// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
$lang['Admin configuration'] = 'Configurarea Adminului';
$lang['also given by your host provider'] = 'De asemenea oferita de host';
-$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'O solutie alternativa ar fi sa copiezi textul din casuta de deasupra si sa il scrii in fila "local/config/database.inc.php"
-(Atentie database.inc.php trebuie sa contina doar caracterele din text, fara linie sau space)';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'O solutie alternativa ar fi sa copiezi textul din casuta de deasupra si sa il scrii in fila "local/config/database.inc.php" (Atentie database.inc.php trebuie sa contina doar caracterele din text, fara linie sau space)';
$lang['Basic configuration'] = 'Configurarea de baza';
$lang['Can\'t connect to server'] = 'Nu se poate conecta la server';
$lang['Congratulations, Piwigo installation is completed'] = 'Felicitari, Piwigo s-a instalat cu succes.';
@@ -44,12 +44,9 @@ $lang['It appears your webhost is currently running PHP %s.'] = 'Se pare ca webh
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Va fi afisata vizitatorilor. Este necesara pentru administrarea site-ului.';
$lang['Just another Piwigo gallery'] = 'Doar o alta galerie Piwigo';
$lang['Keep it confidential, it enables you to access administration panel'] = 'Tine-o secreta, iti permite accesul la panoul de administrare';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'Adresa de mail trebuie sa fie de forma xxx@yyy.eee (example : jack@altern.org)';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Ai nevoie de ajutor? Intreaba pe <a href="%s">Forumul Piwigo</a>.';
$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Poti sa schimbi configuratia manual si sa restartezi Piwigo dupa aceea.';
$lang['Password [confirm]'] = 'Parola [confirma]';
-$lang['Password'] = 'Parola';
$lang['PHP 5 is required'] = 'PHP5 este necesar';
$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo va incerca sa treaca configuratia ta la PHP5 folosind o fila .htaccess';
$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo nu a putut sa configureze PHP5';
@@ -63,11 +60,9 @@ $lang['User'] = 'User';
$lang['verification'] = 'verificarea';
$lang['Visitors will be able to contact site administrator with this mail'] = 'Vizitatorii vor folosii aceasta adresa pentru a contacta administratorul';
$lang['webmaster login can\'t contain characters \' or "'] = 'Userul nu poate sa contina caracterele \' sau "';
-$lang['Webmaster login'] = 'Webmaster login';
-$lang['Webmaster mail address'] = 'Adresa de e-mail a webmasterului';
-$lang['Webmaster password'] = 'Parola';
$lang['Welcome to my photo gallery'] = 'Bine ati venit la galeria mea foto';
$lang['Welcome to your new installation of Piwigo!'] = 'Bine ai venit la noua instalare Piwigo!';
$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Poti sa descarci fila de configurare si sa o uploadezi in folderul local/config al instalarii.';
$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Ar trebui sa te adresezi hostului si sa intrebi cum poti sa treci la PHP5';
+$lang['localhost or other, supplied by your host provider'] = 'localhost sau alta, furnizat de furnizorul de găzduire';
?> \ No newline at end of file
diff --git a/language/ro_RO/upgrade.lang.php b/language/ro_RO/upgrade.lang.php
index 80ba89708..de0c4a75b 100755
--- a/language/ro_RO/upgrade.lang.php
+++ b/language/ro_RO/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/ru_RU/about.html b/language/ru_RU/about.html
index 336f3b73f..a1b7c5776 100644
--- a/language/ru_RU/about.html
+++ b/language/ru_RU/about.html
@@ -9,6 +9,7 @@
<ul>
<li><a href="http://ru.piwigo.org/forum/profile.php?id=6705">ie</a></li>
<li><a href="http://ru.piwigo.org/forum/profile.php?id=4895">kiddy-admin</a></li>
+ <li><a href="http://ru.piwigo.org/forum/profile.php?id=17102">Konve</a></li>
<li><a href="http://ru.piwigo.org/forum/profile.php?id=16485">marchelly</a></li>
<li><a href="http://ru.piwigo.org/forum/profile.php?id=3180">nadusha</a></li>
<li><a href="http://ru.piwigo.org/forum/profile.php?id=16998">rocket</a></li>
diff --git a/language/ru_RU/admin.lang.php b/language/ru_RU/admin.lang.php
index 7964fbaf0..01fb0111e 100644
--- a/language/ru_RU/admin.lang.php
+++ b/language/ru_RU/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -29,20 +29,20 @@ $lang['%d physical'] = 'реальных: %d';
$lang[' and %d virtual'] = ' и виртуальных: %d';
$lang['%d album moved'] = 'перемещено альбомов: %d';
$lang['%d albums moved'] = 'перемещено альбомов: %d';
-$lang['%d group'] = 'групп: %d';
-$lang['%d groups'] = 'групп: %d';
+$lang['%d group'] = 'Групп: %d';
+$lang['%d groups'] = 'Групп: %d';
$lang['%d member'] = 'учаÑтников: %d';
$lang['%d members'] = 'учаÑтников: %d';
-$lang['%d tag'] = 'тегов: %d';
-$lang['%d tags'] = 'тегов: %d';
+$lang['%d tag'] = 'Тегов: %d';
+$lang['%d tags'] = 'Тегов: %d';
$lang['%d user comment rejected'] = 'отклонено комментариев поÑетителей: %d';
$lang['%d user comments rejected'] = 'отклонено комментариев поÑетителей: %d';
$lang['%d user comment validated'] = 'принÑто комментариев поÑетителей: %d';
$lang['%d user comments validated'] = 'принÑто комментариев поÑетителей: %d';
$lang['%d user deleted'] = 'пользователей удалено: %d';
$lang['%d users deleted'] = 'пользователей удалено: %d';
-$lang['%d user'] = 'пользователей: %d';
-$lang['%d users'] = 'пользователей: %d';
+$lang['%d user'] = 'Пользователей: %d';
+$lang['%d users'] = 'Пользователей: %d';
$lang['%d waiting for validation'] = 'ожидает проверки: %d';
$lang['Actions'] = 'ДейÑтвиÑ';
$lang['Activate'] = 'Ðктивировать';
@@ -128,7 +128,7 @@ $lang['Permission granted thanks to a group'] = 'ДоÑтуп Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ
$lang['Permission granted'] = 'ДоÑтуп разрешен';
$lang['Photo informations updated'] = 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ фотографии обновлена';
$lang['Plugins'] = 'Плагины';
-$lang['Position'] = 'Ðомер';
+$lang['Position'] = 'РаÑположение';
$lang['Preferences'] = 'ÐаÑтройки';
$lang['Properties'] = 'СвойÑтва';
$lang['Random photo'] = 'Ð¡Ð»ÑƒÑ‡Ð°Ð¹Ð½Ð°Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ';
@@ -174,32 +174,31 @@ $lang['Authorized'] = 'Разрешено';
$lang['Add a virtual album'] = 'Добавить виртуальный альбом';
$lang['Authorize users to add comments on selected albums'] = 'Ðвторизованные пользователи могут добавлÑÑ‚ÑŒ комментарии к выбранным альбомам';
$lang['The name of an album must not be empty'] = 'Ðазвание альбома не может быть пуÑтым';
-$lang['Lock albums'] = 'Заблокированные альбомы';
+$lang['Lock albums'] = 'Управление блокировкой альбомов';
$lang['Private'] = 'Приватные альбомы';
$lang['Public'] = 'ОбщедоÑтупные альбомы';
$lang['Find a new representant by random'] = 'Ðайти нового предÑÑ‚Ð°Ð²Ð¸Ñ‚ÐµÐ»Ñ Ñлучайным образом';
$lang['Public / Private'] = 'ОбщедоÑтупные / Приватные';
-$lang['Manage authorizations for selected albums'] = 'Управление авторизацией Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ñ… альбомов';
+$lang['Manage authorizations for selected albums'] = 'Управление доÑтупом Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ñ… альбомов';
$lang['Virtual album added'] = 'Виртуальный альбом добавлен';
$lang['Virtual album deleted'] = 'Виртуальный альбом удален';
$lang['Access type'] = 'Тип доÑтупа';
$lang['Information data registered in database'] = 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð°Ñ€ÐµÐ³Ð¸Ñтрирована в базе данных';
$lang['Default display'] = 'Вид по умолчанию';
$lang['The gallery URL is not valid.'] = 'Ðекорректный URL галереи';
-$lang['Main'] = 'ГлавнаÑ';
$lang['The number of comments a page must be between 5 and 50 included.'] = 'Ðа Ñтранице может быть от 5 до 50 комментариев.';
$lang['Configuration'] = 'ÐаÑтройки';
$lang['confirm'] = 'подтверждение';
$lang['delete album'] = 'удалить альбом';
-$lang['Dissociate from album'] = 'отделить альбом';
+$lang['Dissociate from album'] = 'Отделить из альбома';
$lang['dissociate from group'] = 'отвÑзать от группы';
$lang['Album updated successfully'] = 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± альбоме уÑпешно добавлена.';
-$lang['photos per page'] = 'фотографий на Ñтранице';
+$lang['photos per page'] = 'Изображений на Ñтранице';
$lang['High definition enabled'] = 'ДоÑтупно выÑокое разрешение';
$lang['File'] = 'файл';
-$lang['first photo added on %s'] = 'Ð¿ÐµÑ€Ð²Ð°Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð° %s';
+$lang['first photo added on %s'] = 'первое изображение добавлено %s';
$lang['Forbidden'] = 'Запрещено';
-$lang['global mode'] = 'групповой режим';
+$lang['global mode'] = 'Групповой режим';
$lang['group "%s" added'] = 'группа "%s" добавлена';
$lang['group "%s" deleted'] = 'группа "%s" удалена';
$lang['group "%s" updated'] = 'группа "%s" обновлена';
@@ -210,7 +209,7 @@ $lang['jump to album'] = 'перейти в альбом';
$lang['jump to photo'] = 'перейти к фотографии';
$lang['leave'] = 'оÑтавить';
$lang['Lock'] = 'Блокировка';
-$lang['Locked'] = 'Заблокировано';
+$lang['Locked'] = 'Заблокированные';
$lang['manage album photos'] = 'управлÑÑ‚ÑŒ Ñлементами альбома';
$lang['manage sub-albums'] = 'Управление вложенными альбомами';
$lang['Manage'] = 'Управление';
@@ -220,11 +219,10 @@ $lang['Prepared time for list of users to send mail is limited. Others users are
$lang['Time to send mail is limited. Others mails are skipped.'] = 'Ð’Ñ€ÐµÐ¼Ñ Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ почты ограничено. Другие пиÑьма пропущены.';
$lang['To send ?'] = 'Отправить?';
$lang['Last send'] = 'ПоÑледнее отправленное';
-$lang['email'] = 'email';
$lang['User'] = 'Пользователь';
$lang['See you soon,'] = 'Пока,';
$lang['Go to'] = 'Перейти к ';
-$lang['Hello'] = 'Привет ';
+$lang['Hello'] = 'Привет,';
$lang['New photos were added'] = 'Были добавлены новые фотографии';
$lang['on'] = ' в ';
$lang['between'] = 'между ';
@@ -259,7 +257,7 @@ $lang['Continue processing treatment'] = 'Продолжить обработкÑ
$lang['Complementary mail content'] = 'Дополнительное Ñодержание пиÑьма';
$lang['Add detailed content'] = 'Добавить дополнительное Ñодержание';
$lang['Send mail as'] = 'Отправить пиÑьмо от';
-$lang['Send mail to users'] = 'Отправить пиÑьмо пользователю';
+$lang['Send mail to users'] = 'Отправить пиÑьмо пользователÑм';
$lang['Send'] = 'Отправка';
$lang['Options'] = 'Параметры';
$lang['Subscribed'] = 'Ð’ ÑпиÑке раÑÑылки';
@@ -295,7 +293,7 @@ $lang['clean'] = 'очиÑтить';
$lang['Create this site'] = 'Создать Ñтот Ñайт';
$lang['test'] = 'теÑÑ‚';
$lang['test this remote site'] = 'теÑтировать Ñтот удаленный Ñайт';
-$lang['remove tags'] = 'удалить метки';
+$lang['remove tags'] = 'Удалить Ñ‚Ñги';
$lang['Repair and optimize database'] = 'иÑправить и оптимизировать базу данных';
$lang['selection'] = 'отмеченные';
$lang['set to'] = 'изменить на';
@@ -312,7 +310,7 @@ $lang['update the database from files'] = 'обновить базу данныÑ
$lang['status'] = 'ÑтатуÑ';
$lang['Directory'] = 'Папка';
$lang['sub-albums'] = 'вложенные альбомы';
-$lang['Synchronize metadata'] = 'Ñинхронизировать метаданные';
+$lang['Synchronize metadata'] = 'Синхронизировать метаданные';
$lang['target'] = 'изменить';
$lang['Thumbnail'] = 'миниатюра';
$lang['Title'] = 'Ðазвание';
@@ -324,21 +322,21 @@ $lang['User list'] = 'СпиÑок пользователей';
$lang['Edit photo information'] = 'Редактировать вÑÑŽ информацию о фотографии';
$lang['Database synchronization with files'] = 'Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных Ñ Ñ„Ð°Ð¹Ð»Ð°Ð¼Ð¸';
$lang['all'] = 'вÑе';
-$lang['height must be a number superior to'] = 'выÑота должна быть чиÑлом больше';
-$lang['width must be a number superior to'] = 'ширина должна быть чиÑлом больше';
-$lang['for the file format'] = 'Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° формата';
+$lang['height must be a number superior to'] = 'выÑота должна быть чиÑлом больше, чем';
+$lang['width must be a number superior to'] = 'ширина должна быть чиÑлом больше, чем';
+$lang['for the file format'] = 'Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð° файла';
$lang['Photo unreachable or no support'] = 'Ð¤Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ Ð½ÐµÐ´Ð¾Ñтупна или поддержка не возможна';
$lang['GD version'] = 'верÑÐ¸Ñ GD';
$lang['General statistics'] = 'ÐžÐ±Ñ‰Ð°Ñ ÑтатиÑтика';
$lang['average time'] = 'Ñреднее времÑ';
$lang['number of miniaturized photos'] = 'чиÑло фотографий Ñ Ð¼Ð¸Ð½Ð¸Ð°Ñ‚ÑŽÑ€Ð°Ð¼Ð¸';
$lang['total time'] = 'общее времÑ';
-$lang['for this file format'] = 'Ð´Ð»Ñ Ñтого формата файла';
-$lang['unit mode'] = 'одиночный режим';
-$lang['Unlocked'] = 'Разблокировать';
+$lang['for this file format'] = 'Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð° Ñтого файла';
+$lang['unit mode'] = 'Одиночный режим';
+$lang['Unlocked'] = 'ДоÑтупные';
$lang['unset'] = 'очиÑтить';
-$lang['Update albums informations'] = 'Обновить информацию об альбоме';
-$lang['Update photos information'] = 'Обновить информацию о фотографии';
+$lang['Update albums informations'] = 'Обновить информацию об альбомах';
+$lang['Update photos information'] = 'Обновить информацию об изображениÑÑ…';
$lang['Synchronize'] = 'СинхронизациÑ';
$lang['reduce to single existing albums'] = 'помеÑтить в один из ÑущеÑтвующих альбомов';
$lang['Choose an option'] = 'Выберите параметры';
@@ -371,7 +369,7 @@ $lang['Used metadata'] = 'ИÑпользуемые метаданные';
$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'Ðазвание папки и файла должно ÑоÑтоÑÑ‚ÑŒ из букв, цифр, "-", "_" и "."';
$lang['wrong filename'] = 'неверное Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°';
$lang['Upload'] = 'Загрузка';
-$lang['user "%s" added'] = 'пользователь "%s" added';
+$lang['user "%s" added'] = 'пользователь "%s" добавлен';
$lang['User status'] = 'Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ';
$lang['user_status_admin'] = 'ÐдминиÑтратор';
$lang['user_status_generic'] = 'Общий';
@@ -491,7 +489,7 @@ $lang['ACCESS_5'] = 'ÐедоÑтупно';
$lang['Support'] = 'Поддержка';
$lang['Documentation'] = 'ДокументациÑ';
$lang['A new version of Piwigo is available.'] = 'ДоÑтупна Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Piwigo.';
-$lang['Piwigo Administration'] = 'ÐдминиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Piwigo';
+$lang['Piwigo Administration'] = 'ÐдминиÑтрирование Piwigo';
$lang['Piwigo version'] = 'ВерÑÐ¸Ñ Piwigo';
$lang['You are running the latest version of Piwigo.'] = 'Запущена поÑледнÑÑ Ð²ÐµÑ€ÑÐ¸Ñ Piwigo.';
$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'УÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ %s [%s] не ÑовмеÑтима Ñ Ð²ÐµÑ€Ñией [%s]';
@@ -508,7 +506,7 @@ $lang['Optional URL keyword'] = 'Опциональное ключевое ÑлÐ
$lang['Templates configuration has been recorded.'] = 'Templates configuration has been recorded.';
$lang['All optimizations have been successfully completed.'] = 'Ð’Ñе оптимизации уÑпешно завершены.';
$lang['Optimizations have been completed with some errors.'] = 'Оптимизации завершены Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°Ð¼Ð¸.';
-$lang['Modify information'] = 'Modify information';
+$lang['Modify information'] = 'ВнеÑти Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² информацию';
$lang['nothing'] = 'ничего';
$lang['overrides existing values with empty ones'] = 'замена ÑущеÑтвующих значений пуÑтыми';
$lang['Manage photo ranks'] = 'Редактировать оценку фотографии';
@@ -532,7 +530,7 @@ $lang['Number of downloads'] = 'ЧиÑло Ñкачиваний';
$lang['Piwigo Announcements Newsletter'] = 'Piwigo Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ Ñ€Ð°ÑÑылка';
$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'ОÑтавайтеÑÑŒ на ÑвÑзи Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ð¾Ð¼ Piwigo, подпишитеÑÑŒ на информационную раÑÑылку Piwigo. Ð’Ñ‹ получите пиÑьмо, как только будет доÑтупен новый релиз (иногда пиÑьма будут Ñодержать корректировку ошибок безопаÑноÑти, о которых Ð’Ñ‹ должны знать и иÑправить), или когда произойдет какое-то важное Ñобытие Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ð¾Ð¼. Это вÑего неÑколько Ñлектронных пиÑем в год.';
$lang['Subscribe %s'] = 'ПодпиÑка %s';
-$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'ПодпиÑать %s на Piwigo информационную раÑÑылку';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'ПодпиÑать %s на информационную раÑÑылку от Piwigo';
$lang['Purge search history'] = 'ОчиÑтить иÑторию поиÑка';
$lang['Hide'] = 'СпрÑтать';
$lang['Password is missing. Please enter the password.'] = 'Пароль не верен. ПожалуйÑта, повторите попытку.';
@@ -568,7 +566,7 @@ $lang['Album "%s" now contains %d photos'] = 'Ðльбом "%s" Ñодержит
$lang['Manage this set of %d photos'] = 'Редактировать Ñтот набор из %d фотографий';
$lang['Select files'] = 'Выбрать файлы';
$lang['Everybody'] = 'Ð’Ñе';
-$lang['Who can see these photos?'] = 'Кто может Ñмотреть Ñти фотографии?';
+$lang['Who can see these photos?'] = 'Кто может Ñмотреть Ñти изображениÑ?';
$lang['Settings'] = 'УÑтановки';
$lang['Resize'] = 'Изменить размеры';
$lang['Maximum width'] = 'МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð°';
@@ -580,7 +578,7 @@ $lang['Your configuration settings are saved'] = 'Ваши наÑтройки к
$lang['Active Themes'] = 'Ðктивные темы';
$lang['Add write access to the "%s" directory'] = 'Добавьте права запиÑи Ð´Ð»Ñ Ð¿Ð°Ð¿ÐºÐ¸ "%s"';
$lang['Administration Home'] = 'Панель админиÑтрированиÑ';
-$lang['Change Admin Colors'] = 'Изменить цвет админиÑтративной панели';
+$lang['Change Admin Colors'] = 'Изменить цвет панели админиÑтратора';
$lang['Delete this theme'] = 'Удалить Ñту тему';
$lang['Directory does not exist'] = 'Папка не ÑущеÑтвует';
$lang['Download,'] = 'Загрузить,';
@@ -610,11 +608,11 @@ $lang['Activate icon "%s"'] = 'Ðктивизировать иконку "%s"';
$lang['Photo Properties'] = 'СвойÑтва фотографии';
$lang['Allow user customization'] = 'Разрешить пользователÑм изменÑÑ‚ÑŒ внешний вид галереи';
$lang['Languages'] = 'Языки';
-$lang['Installed Languages'] = 'предуÑтановленные Ñзыки';
+$lang['Installed Languages'] = 'УÑтановленные Ñзыки';
$lang['Add New Language'] = 'Добавить новый Ñзык';
$lang['Language has been successfully installed'] = 'Язык был уÑпешно уÑтановлен';
-$lang['Select:'] = 'выбрать:';
-$lang['None'] = 'ни один';
+$lang['Select:'] = 'Вы можете выбрать:';
+$lang['None'] = 'Ðичего';
$lang['Invert'] = 'Обратить';
$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Ðевозможный деактивировать Ñту тему, у Ð’Ð°Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° оÑтаватьÑÑ Ð¿Ð¾ крайней мере одна тема.';
$lang['Webmaster status is required.'] = 'ТребуетÑÑ ÑÑ‚Ð°Ñ‚ÑƒÑ Ð²ÐµÐ± маÑтера.';
@@ -627,12 +625,12 @@ $lang['Missing Plugins'] = 'ПотерÑнные плагины';
$lang['Uninstalled Plugins'] = 'Удаленные плагины';
$lang['By %s'] = ' %s';
$lang['Visit plugin site'] = 'Страница плагина';
-$lang['Active Languages'] = 'Ðктивировать Ñзыки';
+$lang['Active Languages'] = 'Ðктивные Ñзыки';
$lang['Delete this language'] = 'Удалить Ñтот Ñзык';
$lang['Forbid this language to users'] = 'Сделать недоÑтупным Ñтот Ñзык Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹';
$lang['Impossible to deactivate this language, first set another language as default.'] = 'Ðевозможный деактивировать Ñтот Ñзык, Ñначала уÑтановите другой Ñзык как значение по умолчанию.';
$lang['Impossible to deactivate this language, you need at least one language.'] = 'Ðевозможный деактивировать Ñтот Ñзык, у Ð’Ð°Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ быть по крайней мере один Ñзык.';
-$lang['Inactive Languages'] = 'Деактивировать Ñзык';
+$lang['Inactive Languages'] = 'Ðеактивные Ñзыки';
$lang['Make this language available to users'] = 'Сделать Ñтот Ñзык доÑтупным Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹';
$lang['Set as default language for unregistered and new users'] = 'УÑтановить Ñзык по умолчанию Ð´Ð»Ñ Ð½ÐµÐ·Ð°Ñ€ÐµÐ³Ð¸Ñтрированных и новых пользователей';
$lang['Add Photos'] = 'Добавить фотографии';
@@ -649,7 +647,7 @@ $lang['Manual order'] = 'Сортировать вручную';
$lang['Add another set of photos'] = 'Добавить фотографии';
$lang['Order of menubar items has been updated successfully.'] = 'ПорÑдок раÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñлементов меню изменен уÑпешно.';
$lang['This theme was not designed to be directly activated'] = 'Ð’ Ñтой теме не предуÑмотрена Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ Ð½Ð°Ð¿Ñ€Ñмую';
-$lang['Who can see this photo?'] = 'Кто может Ñмотреть Ñту фотографию?';
+$lang['Who can see this photo?'] = 'Кто может Ñмотреть Ñто изображение?';
$lang['Pending Comments'] = 'Проверка комментариев';
$lang['Menu Management'] = 'Меню';
$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'Ð’ вашем файле php.ini, upload_max_filesize (%sB) больше, чем post_max_size (%sB), вы должны изменить Ñто значение';
@@ -677,17 +675,17 @@ $lang['Set creation date'] = 'УÑтановить дату ÑозданиÑ';
$lang['Apply action'] = 'Добавить дейÑтвие';
$lang['on the %d selected photos'] = 'на %d выбранных фотографиÑÑ…';
$lang['%d of %d photos selected'] = '%d из %d фотографий выбрано';
-$lang['No photo selected, %d photos in current set'] = 'Ðиодна Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ Ð½Ðµ выбрана, в текущем наборе %d фото';
+$lang['No photo selected, %d photos in current set'] = 'Ðичего не выбрано, а вÑего в текущем наборе - %d изображений';
$lang['All %d photos are selected'] = 'Ð’Ñе %d фотографии были выбраны';
$lang['remove this filter'] = 'удалить Ñтот фильтр';
$lang['Duplicates'] = 'дубликаты';
$lang['Add a filter'] = 'Добавить фильтр';
$lang['Remove all filters'] = 'Удалить вÑе фильтры';
-$lang['Refresh photo set'] = 'Обновить набор фотографий';
+$lang['Refresh photo set'] = 'Обновить набор изображений';
$lang['The whole page'] = 'Ð’Ñе на Ñтранице';
$lang['The whole set'] = 'Ð’Ñе в наборе';
$lang['No photo in the current set.'] = 'Ðет фотографий в текущем наборе.';
-$lang['No photo selected, no action possible.'] = 'Фото не выбрано, дейÑтвие не возможно.';
+$lang['No photo selected, no action possible.'] = 'Ðичего не выбрано, дейÑтвие невозможно.';
$lang['Choose an action'] = 'Выберите дейÑтвие';
$lang['remove author'] = 'удалить автора';
$lang['Type here the author name'] = 'напечатайте Ð¸Ð¼Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð° здеÑÑŒ';
@@ -695,7 +693,7 @@ $lang['remove title'] = 'удалить название';
$lang['Type here the title'] = 'напечатайте название здеÑÑŒ';
$lang['remove creation date'] = 'удалить дату ÑозданиÑ';
$lang['Album photos associated to the following albums: %s'] = 'Фотографии Ñтого альбома ÑвÑзаны Ñо Ñледущими альбомами: %s';
-$lang['Delete orphan tags'] = 'Удалить неривÑзанные метки';
+$lang['Delete orphan tags'] = 'Удалить Ñ‚Ñги, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ не ÑвÑзано ни одно изображение';
$lang['delete photo'] = 'удалить фотографию';
$lang['Orphan tags deleted'] = 'ÐепривÑзанные метки удалены';
$lang['Week starts on'] = 'ÐÐµÐ´ÐµÐ»Ñ Ð½Ð°Ñ‡Ð¸Ð½Ð°ÐµÑ‚ÑÑ Ñ';
@@ -737,7 +735,7 @@ $lang['Update All'] = 'Обновить вÑе';
$lang['ERROR'] = 'ОШИБКÐ';
$lang['Update Complete'] = 'Обновление завершено';
$lang['Piwigo Update'] = 'Обновление Piwigo';
-$lang['Extensions Update'] = 'обновление плагинов';
+$lang['Extensions Update'] = 'Обновление плагинов';
$lang['All extensions are up to date.'] = 'Ð’Ñе плагины обновлены.';
$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'Следующие плагины, возможно, не ÑвлÑÑŽÑ‚ÑÑ ÑовмеÑтимыми Ñ Ð½Ð¾Ð²Ð¾Ð¹ верÑией Piwigo:';
$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'Следующие темы, возможно, не ÑвлÑÑŽÑ‚ÑÑ ÑовмеÑтимыми Ñ Ð½Ð¾Ð²Ð¾Ð¹ верÑией Piwigo:';
@@ -752,7 +750,7 @@ $lang['Save Template Directory'] = 'Сохранить папку шаблоно
$lang['Dump Database'] = 'Дамп базы данных';
$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'Включить данные иÑтории (Предупреждение: памÑÑ‚ÑŒ Ñервера может быть превышена)';
$lang['Unable to dump database.'] = 'Ðевозможно Ñделать дамп базы данных.';
-$lang['Some upgrades are available for extensions.'] = 'Ð”Ð»Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð² доÑтупны некоторые обновлениÑ.';
+$lang['Some upgrades are available for extensions.'] = 'Ð”Ð»Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… плагинов доÑтупны обновлениÑ.';
$lang['Ignore All'] = 'ПропуÑтить вÑе';
$lang['Crop'] = 'Обрезать';
$lang['Width'] = 'Ширина';
@@ -791,13 +789,13 @@ $lang['An error has occured during upgrade.'] = 'Во Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ
$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Во Ð²Ñ€ÐµÐ¼Ñ Ñ€Ð°Ñпаковки произошла ошибка. ПожалуйÑта, проверьте права доÑтупа к папке уÑтановки piwigo.<br><a href="%s">Ðажмите, чтобы поÑмотреть лог ошибки</a>.';
$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo не может получить файлы Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñ Ñервера';
$lang['Zoom'] = 'увеличение';
-$lang['Add to caddie'] = 'добавить в корзину';
+$lang['Add to caddie'] = 'Добавить в корзину';
$lang['%s has been successfully updated.'] = '%s уÑпешно обновлено.';
$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = 'Приложение <em>Piwigo Ð´Ð»Ñ iOS</em> позволÑет Вам ÑоединÑÑ‚ÑŒÑÑ Ñ Ð’Ð°ÑˆÐµÐ¹ галереей Piwigo Ñ Ð’Ð°ÑˆÐµÐ³Ð¾ iPhone, iPad или iPod touch, Ñоздавать альбомы и загружать неÑколько фотографий Ñразу.';
$lang['A locked gallery is only visible to administrators'] = 'Ð—Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð³Ð°Ð»ÐµÑ€ÐµÑ Ð²Ð¸Ð´Ð½Ð° только админиÑтраторам';
$lang['Activate comments'] = 'Ðктивировать комментарии';
-$lang['Add tags'] = 'Добавить метки';
+$lang['Add tags'] = 'Добавить Ñ‚Ñги';
$lang['Applications'] = 'ПриложениÑ';
$lang['Available versions for'] = 'ДоÑтупные верÑии длÑ';
$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'По умолчанию Piwigo Ñоздает новые Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð° web из HD (выÑокого разрешениÑ) верÑий фотографий.';
@@ -828,13 +826,13 @@ $lang['any visitor can see this album'] = 'вÑе поÑетители видÑÑ
$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture - мощный инÑтрумент Ð´Ð»Ñ ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹ и ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð¼Ð¸ библиотеками изображений Ð´Ð»Ñ Mac.';
$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture Ñоздан Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ„ÐµÑÑиональных фотографов Ñ Ð¿Ñ€Ð¾Ñтотой iPhoto.';
$lang['apply automatic sort order'] = 'применить автоматичеÑкую Ñортировку';
-$lang['Apply watermark if height is bigger than'] = 'ПрименÑÑ‚ÑŒ водÑной знак еÑли выÑота больше';
-$lang['Apply watermark if width is bigger than'] = 'ПрименÑÑ‚ÑŒ водÑной знак еÑли ширина больше';
+$lang['Apply watermark if height is bigger than'] = 'ПрименÑÑ‚ÑŒ водÑной знак, еÑли выÑота больше';
+$lang['Apply watermark if width is bigger than'] = 'ПрименÑÑ‚ÑŒ водÑной знак, еÑли ширина больше';
$lang['Automatic sort order'] = 'ÐвтоматичеÑÐºÐ°Ñ Ñортировка';
$lang['Available on'] = 'ДоÑтупно';
$lang['bottom left corner'] = 'левый нижний угол';
$lang['bottom right corner'] = 'правый нижний угол';
-$lang['By default, the center of interest is placed in the middle of the photo.'] = 'По умолчанию, центром композиции ÑчитаетÑÑ Ð³ÐµÐ¾Ð¼ÐµÑ‚Ñ€Ð¸Ñ‡ÐµÑий центр изображениÑ.';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = 'По умолчанию, центром композиции ÑчитаетÑÑ Ð³ÐµÐ¾Ð¼ÐµÑ‚Ñ€Ð¸Ñ‡ÐµÑкий центр изображениÑ.';
$lang['cancel manual order'] = 'отменить ручную Ñортировку';
$lang['Cancel'] = 'Отмена';
$lang['Center of interest'] = 'Центр интереÑа';
@@ -843,7 +841,7 @@ $lang['Delete multiple size images'] = 'Удалить Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ€
$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam - продвинутый и беÑплатный менеджер фотографий Ð´Ð»Ñ Linux, Windows и MacOSX.';
$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam Ñоздан Ð´Ð»Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¾Ð² которым нужно проÑматривать, управлÑÑ‚ÑŒ, редактировать, каталогизировать, проÑтавлÑÑ‚ÑŒ метки и публиковать фотографии.';
$lang['Features include gallery browsing, album creation and photo upload.'] = 'Среди его возможноÑтей проÑмотр галереи, Ñоздание альбома и загрузка фотографий.';
-$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = 'Ð”Ð»Ñ ÐºÐ²Ð°Ð´Ñ€Ð°Ñ‚Ð½Ð¾Ð³Ð¾ кропа, Piwigo ÑтараетÑÑ Ð¼Ð°ÐºÑимально отобразить центр композиции.';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = 'При обрезке изображениÑ, например ÐºÐ²Ð°Ñ€Ð´Ñ€Ð°Ñ‚Ð½Ð°Ñ Ð¼Ð¸Ð½Ð¸Ð°Ñ‚ÑŽÑ€Ð°, Piwigo ÑтараетÑÑ Ð¼Ð°ÐºÑимально отобразить центр композиции.';
$lang['Gallery unlocked'] = 'Ð“Ð°Ð»ÐµÑ€ÐµÑ Ñ€Ð°Ð·Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð°';
$lang['Generate multiple size images'] = 'Сгенерировать Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð½Ñ‹Ñ… размеров';
$lang['Groups and users'] = 'Пользователи и группы';
@@ -873,7 +871,7 @@ $lang['registered users'] = 'зарегиÑтрированных пользов
$lang['Save manual order'] = 'Сохранить ручную Ñортировку';
$lang['Save visits in history for'] = 'СохранÑÑ‚ÑŒ поÑÐµÑ‰ÐµÐ½Ð¸Ñ Ð² иÑтории длÑ';
$lang['Select a file'] = 'Выберите файл';
-$lang['Select a zone with your mouse to define a new center of interest.'] = 'Выделите зону мышкой чтобы указать центр композиции.';
+$lang['Select a zone with your mouse to define a new center of interest.'] = 'Выделите необходимую зону мышкой, и она Ñтанет новым отображаемым центром композиции.';
$lang['Select groups...'] = 'Выбрать группы...';
$lang['Select users...'] = 'Выбрать пользователей...';
$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell - приложение Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ñ‹Ð¼ кодом Ð´Ð»Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¸Ð·Ð°Ñ†Ð¸Ð¸ фотографий под Linux. ЯвлÑетÑÑ Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑ€Ð¾Ð¼ фото по умолчанию Ð´Ð»Ñ Ubuntu и Fedora.';
@@ -927,18 +925,14 @@ $lang['Duplicate selected tags'] = 'Дублировать выделенные
$lang['Name of the duplicate'] = 'Ðазвание дублÑ';
$lang['Source tag'] = 'Тег-иÑточник';
$lang['Tag "%s" is now a duplicate of "%s"'] = 'Тег "%s" теперь дубликат "%s"';
-$lang['Invalid dimension'] = 'Ðеправильное разрешение';
$lang['Landscape'] = 'Ландшафт';
$lang['Minimum height'] = 'ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ñ‹Ñота';
$lang['Minimum width'] = 'ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð°';
$lang['Panorama'] = 'Панорама';
$lang['Portrait'] = 'Портрет';
-$lang['Format'] = 'Формат';
$lang['Manage photos'] = 'Управление фотографиÑми';
$lang['Number of albums per page'] = 'КоличеÑтво альбомов на Ñтранице';
$lang['View in gallery'] = 'Смотреть в галерее';
-$lang['Maximum'] = 'макÑимально';
-$lang['Minimum'] = 'минимально';
$lang['Ratio'] = 'ÑпоÑоб';
$lang['between %.2f and %.2f'] = 'между %.2f и %.2f';
$lang['between %d and %d pixels'] = 'между %d и %d пикÑелÑми';
@@ -953,4 +947,32 @@ $lang['This group will be set to default'] = 'Эта группа будет иÑ
$lang['This group will be unset to default'] = 'Эта группа не будет теперь иÑпользоватьÑÑ Ð¿Ð¾ умолчанию';
$lang['Type here the name of the new group'] = 'Введите Ð¸Ð¼Ñ Ð½Ð¾Ð²Ð¾Ð¹ группы';
$lang['Purge user cache'] = 'ОчиÑтить кÑш пользователÑ';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'Размер Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ уменьшен до %dx%d пикÑелей.';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'Изменение размеров изображений отключено из-за иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ GD в качеÑтве графичеÑкой библиотеки';
+$lang['Select at least one tag'] = 'Выберите Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один Ñ‚Ñг';
+$lang['Basic settings'] = 'ОÑновные уÑтановки';
+$lang['General'] = 'Общее';
+$lang['Mail theme'] = 'Тема почты';
+$lang['%d of %d users selected'] = '%d пользователей выбрано из %d';
+$lang['(filtered from %s total users)'] = '(отобрано из %s - общее чиÑло пользователей)';
+$lang['All %d users are selected'] = '%d - вÑе пользователи выбраны';
+$lang['No matching user found'] = 'СоответÑтвующих пользователей не найдено';
+$lang['No user selected of %d users'] = 'Ðе выбраны из %d пользователей';
+$lang['No user selected, no action possible.'] = 'Пользователи не выбраны; дейÑтвие невозможно.';
+$lang['Registered on %s, %s.'] = 'ЗарегиÑтрировано %s, %s.';
+$lang['Show %s users'] = '%s пользователей паказано';
+$lang['Showing %s to %s of %s users'] = 'Показ %s от %s до %s пользователей';
+$lang['User %s added'] = 'Добавлен пользователь %s ';
+$lang['User %s updated'] = 'Обновлен пользователь %s';
+$lang['Users modified'] = 'Пользователи изменены';
+$lang['on the %d selected users'] = 'на %d выбранных пользователей';
+$lang['Change password'] = 'Сменить пароль';
+$lang['Change username'] = 'Сменить Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ';
+$lang['Last visit on %s, %s.'] = 'ПоÑледний визит был %s, %s.';
+$lang['Loading...'] = 'Загрузка...';
+$lang['Password updated'] = 'Пароль обновлен';
+$lang['Update user'] = 'Пользователь обновлен';
+$lang['Close user details'] = 'Закрыть детали пользователÑ';
+$lang['Open user details'] = 'Открыть детали пользователÑ';
+$lang['close'] = 'закрыть';
?> \ No newline at end of file
diff --git a/language/ru_RU/common.lang.php b/language/ru_RU/common.lang.php
index c4757ea07..2be4778e7 100644
--- a/language/ru_RU/common.lang.php
+++ b/language/ru_RU/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: РуÑÑкий [RU]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=434
Author: Piwigo team
Author URI: http://piwigo.org
@@ -58,7 +58,7 @@ $lang['Author'] = 'Ðвтор';
$lang['Albums'] = 'Ðльбомы';
$lang['Album'] = 'Ðльбом';
$lang['Close this window'] = 'Закрыть Ñто окно';
-$lang['Complete RSS feed (photos, comments)'] = 'ÐŸÐ¾Ð»Ð½Ð°Ñ RSS лента (фотографии, комментарии)';
+$lang['Complete RSS feed (photos, comments)'] = 'ÐŸÐ¾Ð»Ð½Ð°Ñ RSS лента (изображениÑ, комментарии)';
$lang['Confirm Password'] = 'Повторите пароль';
$lang['Connection settings'] = 'ÐаÑтройки ÑоединениÑ';
$lang['Login'] = 'ÐвторизациÑ';
@@ -83,12 +83,12 @@ $lang['Forgot your password?'] = 'Забыли пароль?';
$lang['Go through the gallery as a visitor'] = 'Войти в галерею как поÑетитель';
$lang['Help'] = 'Помощь';
$lang['Identification'] = 'ИдентификациÑ';
-$lang['Photos only RSS feed'] = 'RSS лента. Только фотографии.';
+$lang['Photos only RSS feed'] = 'RSS лента. Только изображениÑ.';
$lang['Keyword'] = 'Ключевые Ñлова';
$lang['Links'] = 'СÑылки';
$lang['N/A'] = 'не определен';
$lang['New on %s'] = 'Ðовое в %s';
-$lang['Notification'] = 'RSS-уведомлениÑ';
+$lang['Notification'] = 'RSS-ленты';
$lang['Number of items'] = 'Кол-во на Ñтранице';
$lang['Original dimensions'] = 'ИÑходный размер';
$lang['Password forgotten'] = 'Пароль утерÑн';
@@ -112,7 +112,7 @@ $lang['Sort by'] = 'Сортировать по';
$lang['Sort order'] = 'ПорÑдок Ñортировки';
$lang['Tag'] = 'ТÑг';
$lang['Tags'] = 'ТÑги';
-$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS лента позволÑет Вам быть в курÑе новоÑтей Ñтого веб-Ñайта: новые фотографии, обновленные альбомы, новые комментарии. ИÑпользуйте RSS читатель.';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS лента позволÑет Вам быть в курÑе новоÑтей Ñтого веб-Ñайта: новые изображениÑ, обновленные альбомы, новые комментарии. ИÑпользуйте любой удобный Ð´Ð»Ñ Ð’Ð°Ñ RSS-ридер.';
$lang['Unknown feed identifier'] = 'ÐеизвеÑтный идентификатор ленты';
$lang['User comments'] = 'Комментарии поÑетителей';
$lang['Username'] = 'Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ';
@@ -146,7 +146,7 @@ $lang['Comment'] = 'Комментарий';
$lang['Your comment has been registered'] = 'Ваш комментарий отправлен';
$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Ðнтифлуд: пожалуйÑта, подождите немного, прежде чем отправить Ñледующий комментарий';
$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Ваш комментарий ÐЕ отправлен, так как не ÑоответÑтвует правилам';
-$lang['An administrator must authorize your comment before it is visible.'] = 'ÐдимнмÑтратор должен проверить ваш комментарий, прежде чем он будет показан.';
+$lang['An administrator must authorize your comment before it is visible.'] = 'ÐдминиÑтратор должен проверить ваш комментарий, прежде чем он будет показан.';
$lang['This login is already used by another user'] = 'Этот логин уже иÑпользуетÑÑ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ поÑетителем';
$lang['Comments'] = 'Комментарии';
$lang['Add a comment'] = 'Добавить комментарий';
@@ -193,7 +193,7 @@ $lang['in %d sub-albums'] = 'в %d вложенных альбомах';
$lang['included'] = 'включено';
$lang['Invalid password!'] = 'Ðеверный пароль!';
$lang['Language']='Язык';
-$lang['last %d days'] = 'поÑлеедние %d дней';
+$lang['last %d days'] = 'поÑледние %d дней';
$lang['Last'] = 'ПоÑледнÑÑ';
$lang['Logout'] = 'Выход';
$lang['obligatory'] = 'обÑзательный';
@@ -219,7 +219,7 @@ $lang['Unknown identifier'] = 'ÐеизвеÑтный идентификатор
$lang['New password'] = 'Ðовый пароль';
$lang['Rate this photo'] = 'Оценить Ñту фотографию';
$lang['Next'] = 'СледующаÑ';
-$lang['no rate'] = 'не оценено';
+$lang['no rate'] = 'оценок изображений нет';
$lang['Photos posted within the last %d day.'] = 'Фотографии, загруженные в течении поÑледнего %d днÑ.';
$lang['Photos posted within the last %d days.'] = 'Фотографии, загруженные в течении поÑледних %d дней.';
$lang['password updated'] = 'пароль изменен';
@@ -239,11 +239,10 @@ $lang['Recent photos'] = 'Ðедавние фотографии';
$lang['display most recent photos'] = 'показать больше Ñвежих фотографий';
$lang['Redirection...'] = 'ПеренаправлÑем...';
$lang['Please, enter a login'] = 'ПожалуйÑта, введите логин';
-$lang['login mustn\'t end with a space character'] = 'логин не должен оканчиватьÑÑ Ð½Ð° пробел';
+$lang['login mustn\'t end with a space character'] = 'логин не должен оканчиватьÑÑ Ð¿Ñ€Ð¾Ð±ÐµÐ»Ð¾Ð¼';
$lang['login mustn\'t start with a space character'] = 'логин не должен начинатьÑÑ Ñ Ð¿Ñ€Ð¾Ð±ÐµÐ»Ð°';
$lang['this login is already used'] = 'такой логин уже еÑÑ‚ÑŒ';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'Ð°Ð´Ñ€ÐµÑ Ñлектронной почты должен выглÑдеть как-то типа xxx@yyy.eee (например: jack@altern.org)';
-$lang['please enter your password again'] = 'введите пароль еще раз';
$lang['Auto login'] = 'Запомнить менÑ';
$lang['remove this tag from the list'] = 'удалить Ñтот Ñ‚Ñг из ÑпиÑка';
$lang['representative'] = 'миниатюра альбома';
@@ -269,9 +268,8 @@ $lang['stop the slideshow'] = 'оÑтановить Ñлайдшоу';
$lang['Specials'] = 'Избранное';
$lang['SQL queries in'] = 'SQL-Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²';
$lang['display only recently posted photos'] = 'показать только недавно загруженные фотографии';
-$lang['return to the display of all photos'] = 'вернутьÑÑ Ðº полному ÑпиÑку фотографии';
+$lang['return to the display of all photos'] = 'вернутьÑÑ Ðº полному ÑпиÑку фотографий';
$lang['the beginning'] = 'Ñ Ð½Ð°Ñ‡Ð°Ð»Ð°';
-$lang['Interface theme'] = 'Оформление';
$lang['Thumbnails'] = 'Миниатюры';
$lang['Menu'] = 'Меню';
$lang['A comment on your site'] = 'Комментарий Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñайта';
@@ -287,11 +285,11 @@ $lang['Author: %s'] = 'Ðвтор: %s';
$lang['Comment: %s'] = 'Комментарий: %s';
$lang['Comment by %s'] = 'Комментарий от %s';
$lang['User: %s'] = 'ПоÑетитель: %s';
-$lang['Email: %s'] = 'адреÑ: %s';
+$lang['Email: %s'] = 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð°: %s';
$lang['Admin: %s'] = 'ÐдминиÑтратор: %s';
$lang['Registration of %s'] = 'РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ %s';
$lang['Album: %s'] = 'Ðльбом: %s';
-$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Ðеверный ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ "гоÑÑ‚ÑŒ", иÑпользуйте ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¿Ð¾ умолчанию. ПожалуйÑта Ñообщите вебмаÑтеру.';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Ðеверный ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ "гоÑÑ‚ÑŒ", иÑпользуйте ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¿Ð¾ умолчанию. ПожалуйÑта, Ñообщите вебмаÑтеру.';
$lang['this email address is already in use'] = 'пользователь Ñ Ñ‚Ð°ÐºÐ¸Ð¼ адреÑом уже еÑÑ‚ÑŒ';
$lang['Album results for'] = 'Ðльбом определен длÑ';
$lang['Tag results for'] = 'ТÑги-результаты длÑ';
@@ -308,9 +306,9 @@ $lang['No'] = 'Ðет';
$lang['%d photo'] = '%d фотографиÑ';
$lang['%d photos'] = '%d фотографии';
$lang['%d photo is also linked to current tags'] = '%d Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ Ñ‚Ð°ÐºÐ¶Ðµ ÑвÑзана Ñ Ñтими метками';
-$lang['%d photos are also linked to current tags'] = '%d фотографий также ÑвÑзаны Ñ Ñтими метками';
+$lang['%d photos are also linked to current tags'] = 'еще %d фотографий, ÑвÑзаных Ñ Ñтими метками';
$lang['display photos linked to this tag'] = 'показать фотографии, ÑвÑзанные Ñ Ñтой меткой';
-$lang['photos posted during the last %d days'] = 'фотографии, опубликованный поÑледние %d дней';
+$lang['photos posted during the last %d days'] = 'фотографии, опубликованные за поÑледние %d дней';
$lang['Piwigo Help'] = 'Помощь';
$lang['Rank'] = 'РÑд';
$lang['group by letters'] = 'Ñгруппировать по буквам';
@@ -343,11 +341,11 @@ $lang['%d rates'] = 'Оценок: %d';
$lang['Rating score'] = 'Средний балл';
$lang['Invalid username or email'] = 'Ðеверное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ Ð°Ð´Ñ€ÐµÑ Ñлектронной почты';
$lang['Password reset is not allowed for this user'] = 'Ð”Ð»Ñ Ñтого Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÑÐ±Ñ€Ð¾Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶ÐµÐ½';
-$lang['User "%s" has no email address, password reset is not possible'] = 'У Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ "%s" нет адреÑа Ñлектронной почты, ÑÐ±Ñ€Ð¾Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð½ÐµÐ²Ð¾Ð¼Ð¾Ð¶ÐµÐ½';
+$lang['User "%s" has no email address, password reset is not possible'] = 'У Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ "%s" нет адреÑа Ñлектронной почты, ÑÐ±Ñ€Ð¾Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶ÐµÐ½';
$lang['Someone requested that the password be reset for the following user account:'] = 'ПоÑтупил Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° изменение Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð´Ð»Ñ Ñледуюшей учетной запиÑи:';
$lang['Username "%s" on gallery %s'] = 'Пользователь "%s" в галерее %s';
$lang['To reset your password, visit the following address:'] = 'Чтобы ÑброÑить пароль пройдите по ÑÑылке:';
-$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'ЕÑли Ð’Ñ‹ получили Ñто Ñообщение по ошибке, проÑто не предпринимайте никаких дейÑтвий и ничего не произойдет.';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'ЕÑли Ð’Ñ‹ получили Ñто Ñообщение по ошибке, проÑто не предпринимайте никаких дейÑтвий, и ничего не произойдет.';
$lang['Password Reset'] = 'Ð¡Ð±Ñ€Ð¾Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ';
$lang['Check your email for the confirmation link'] = 'Проверьте Ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты, на который выÑлано Ñообщение Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´Ð°ÑŽÑ‰ÐµÐ¹ ÑÑылкой';
$lang['Invalid key'] = 'Ðеверный ключ';
@@ -369,7 +367,7 @@ $lang['Show latest comments first'] = 'Показывать комментари
$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¾ÑˆÐ»Ð° уÑпешно. Скоро вы получите пиÑьмо Ñ Ð½Ð°Ñтройками Вашего ÑоединениÑ. Добро пожаловать!';
$lang['Username modification'] = 'Изменить Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ';
$lang['Your username has been successfully changed to : %s'] = 'Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±Ñ‹Ð»Ð¾ уÑпешно изменено на %s';
-$lang['square'] = 'Квардат';
+$lang['square'] = 'Квадрат';
$lang['thumb'] = 'Миниатюра';
$lang['2small'] = 'XXS - крошечный';
$lang['xsmall'] = 'XS - очень мелкий';
@@ -416,4 +414,12 @@ $lang['Username is mandatory'] = 'Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÑвлÑетÑ
$lang['mandatory'] = 'обÑзательно';
$lang['Website'] = 'Ð’Ñб-Ñайт';
$lang['Your website URL is invalid'] = 'URL-Ð°Ð´Ñ€ÐµÑ Ð’Ð°ÑˆÐµÐ³Ð¾ Ñайта неверен';
+$lang['Email'] = 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð°';
+$lang['First Page'] = 'ÐŸÐµÑ€Ð²Ð°Ñ Ñтраница';
+$lang['Go back to the album'] = 'ВернутьÑÑ Ð² альбом';
+$lang['Last Page'] = 'ПоÑледнÑÑ Ñтраница';
+$lang['Password is missing. Please enter the password.'] = 'Пароль не верен. ПожалуйÑта, повторите попытку.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Подтверждение Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¾Ñ‚ÑутÑтвует. ПожалуйÑта, подтвердите выбранный пароль.';
+$lang['%d photos per page'] = '%d изображений на Ñтранице';
+$lang['Theme'] = 'Тема';
?> \ No newline at end of file
diff --git a/language/ru_RU/index.php b/language/ru_RU/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/ru_RU/index.php
+++ b/language/ru_RU/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/ru_RU/install.lang.php b/language/ru_RU/install.lang.php
index 2c5b16f33..e4908c763 100644
--- a/language/ru_RU/install.lang.php
+++ b/language/ru_RU/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -27,16 +27,12 @@ $lang['Default gallery language'] = 'Язык по умолчанию';
$lang['Database configuration'] = 'ÐаÑтройка базы данных';
$lang['Admin configuration'] = 'ÐаÑтройка админиÑтрированиÑ';
$lang['Start Install'] = 'Ðачать уÑтановку';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'Ð°Ð´Ñ€ÐµÑ Ñлектронной почты должен быть похож на xxx@yyy.eee (например: jack@altern.org)';
-$lang['Webmaster login'] = 'Логин вебмаÑтера';
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Он будет показан поÑетителÑм. Ðеобходим Ð´Ð»Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸ÑÑ‚Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñайта';
$lang['Connection to server succeed, but it was impossible to connect to database'] = 'УÑпешно ÑоединилиÑÑŒ Ñ Ñервером, но невозможно подключитьÑÑ Ðº базе данных';
$lang['Can\'t connect to server'] = 'Ðевозможно ÑоединитьÑÑ Ñ Ñервером';
$lang['Host'] = 'ХоÑÑ‚ MySQL';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
$lang['User'] = 'Пользователь';
$lang['user login given by your host provider'] = 'логин, который выдал провайдер';
-$lang['Password'] = 'Пароль';
$lang['user password given by your host provider'] = 'пароль, который выдал провайдер';
$lang['Database name'] = 'Ð˜Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных';
$lang['also given by your host provider'] = 'также выдаетÑÑ Ð¿Ñ€Ð¾Ð²Ð°Ð¹Ð´ÐµÑ€Ð¾Ð¼. ЧаÑто Ñовпадает Ñ Ð»Ð¾Ð³Ð¸Ð½Ð¾Ð¼';
@@ -45,12 +41,10 @@ $lang['database tables names will be prefixed with it (enables you to manage bet
$lang['enter a login for webmaster'] = 'нужно ввеÑти логин Ð´Ð»Ñ Ð²ÐµÐ±Ð¼Ð°Ñтера';
$lang['webmaster login can\'t contain characters \' or "'] = 'логин вебмаÑтера не должен Ñодержать Ñимволы \' или "';
$lang['please enter your password again'] = 'еще раз пароль';
-$lang['Webmaster password'] = 'Пароль вебмаÑтера';
$lang['Keep it confidential, it enables you to access administration panel'] = 'Ðе Ñообщайте его никому, он необходим Ð´Ð»Ñ Ð´Ð¾Ñтупа к панели админиÑтрированиÑ';
$lang['Password [confirm]'] = 'Повторите пароль';
$lang['verification'] = 'еще раз Ð´Ð»Ñ Ð¸ÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑ‡Ð°Ñ‚ÐºÐ¸';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Ðужна помощь? Задайте Ñвои вопроÑÑ‹ на <a href="%s">Форуме Piwigo</a>.';
-$lang['Webmaster mail address'] = 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð° вебмаÑтера';
$lang['Visitors will be able to contact site administrator with this mail'] = 'Будет иÑпользоватьÑÑ Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð° поÑетителей Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтратором';
$lang['PHP 5 is required'] = 'ТребуетÑÑ PHP 5';
$lang['It appears your webhost is currently running PHP %s.'] = 'КажетÑÑ, что Ваш хоÑтинг в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð´ управлением PHP %s.';
@@ -59,15 +53,16 @@ $lang['Note you can change your configuration by yourself and restart Piwigo aft
$lang['Try to configure PHP 5'] = 'ПопытатьÑÑ Ð¿ÐµÑ€ÐµÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ PHP 5';
$lang['Sorry!'] = 'Извините!';
$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo не в ÑоÑтоÑнии переконфигурировать PHP 5.';
-$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Ð’Ñ‹ должны обратитьÑÑ Ðº Ñвоему провайдеру за поддержой и разъÑÑнениÑми как Ð’Ñ‹ можете переключитьÑÑ Ð½Ð° PHP 5.';
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Ð’Ñ‹ должны обратитьÑÑ Ðº Ñвоему провайдеру за поддержой и разъÑÑнениÑми, как переключитьÑÑ Ð½Ð° PHP 5.';
$lang['Hope to see you back soon.'] = 'ÐадеемÑÑ Ñкоро увидеть Ð’Ð°Ñ Ð²Ð½Ð¾Ð²ÑŒ.';
$lang['Congratulations, Piwigo installation is completed'] = 'ПоздравлÑем, уÑтановка Piwigo полноÑтью завершена';
-$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Ðльтернативное решение ÑоÑтоит в том, чтобы Ñкопировать текÑÑ‚ в блоке выше и вÑтавить Ñто в файл "local/config/database.inc.php" (Предупреждение: database.inc.php должен только Ñодержать то, что находитÑÑ Ð² textarea, без линий возврата Ñтроки или пробелов)';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Ðльтернативное решение ÑоÑтоит в том, чтобы Ñкопировать текÑÑ‚ в блоке выше и вÑтавить Ñто в файл "local/config/database.inc.php" (Предупреждение: database.inc.php должен только Ñодержать то, что находитÑÑ Ð² текÑтовом поле, без Ñимволов возврата Ñтроки или пробелов)';
$lang['Creation of config file local/config/database.inc.php failed.'] = 'Создать файл конфигурации local/config/database.inc.php не удалоÑÑŒ.';
$lang['Download the config file'] = 'Загрузить файл конфигурации';
$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Вы можете загрузить файл конфигурации и передать его в local/config directory.';
$lang['Just another Piwigo gallery'] = 'Еще одна Ð³Ð°Ð»ÐµÑ€ÐµÑ Piwigo';
$lang['Welcome to my photo gallery'] = 'Добро пожаловать в мою фотогалерею';
-$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'ПожалуйÑта конÑультируйтеÑÑŒ на нашем форуме Ð´Ð»Ñ Ð»ÑŽÐ±Ð¾Ð¹ помощи:';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Ðе ÑтеÑнÑйтеÑÑŒ конÑультироватьÑÑ Ð½Ð° наших форумах Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð»ÑŽÐ±Ð¾Ð¹ помощи, %s';
$lang['Welcome to your new installation of Piwigo!'] = 'Добро пожаловать в новую уÑтановку Piwigo!';
+$lang['localhost or other, supplied by your host provider'] = 'localhost или другой, который указан провайдером';
?> \ No newline at end of file
diff --git a/language/ru_RU/upgrade.lang.php b/language/ru_RU/upgrade.lang.php
index 0b5e1d259..2f8eeff9e 100644
--- a/language/ru_RU/upgrade.lang.php
+++ b/language/ru_RU/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -28,10 +28,10 @@ $lang['total upgrade time'] = 'общее Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ';
$lang['total SQL time'] = 'общее Ð²Ñ€ÐµÐ¼Ñ SQL';
$lang['SQL queries'] = 'SQL запроÑÑ‹';
$lang['Upgrade informations'] = 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± обновлениÑÑ…';
-$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Выполните обÑлуживание [ÐдминиÑтирирование> ИнÑтрументы > ОбÑлуживание] еÑли вы ÑтолкнулиÑÑŒ Ñ ÐºÐ°ÐºÐ¸Ð¼Ð¸-либо проблемами.';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Выполните обÑлуживание [ÐдминиÑтрирование> ИнÑтрументы > ОбÑлуживание], еÑли Ð’Ñ‹ ÑтолкнулиÑÑŒ Ñ ÐºÐ°ÐºÐ¸Ð¼Ð¸-либо проблемами.';
$lang['Only administrator can run upgrade: please sign in below.'] = 'Только админиÑтратор может запуÑтить обновление: проверьте ниже.';
$lang['You do not have access rights to run upgrade'] = 'У Ð²Ð°Ñ Ð½ÐµÑ‚ прав на запуÑк обновлений';
-$lang['All sub-albums of private albums become private'] = 'Ð’Ñе вложенные альбомы Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð²Ð°Ñ‚Ð½Ð¾Ð³Ð¾ альбома тоже ÑтановÑÑ‚ÑÑ Ð¿Ñ€Ð¸Ð²Ð°Ñ‚Ð½Ñ‹Ð¼Ð¸';
+$lang['All sub-albums of private albums become private'] = 'Ð’Ñе альбомы, вложенные в приватный альбом, тоже ÑтановÑÑ‚ÑÑ Ð¿Ñ€Ð¸Ð²Ð°Ñ‚Ð½Ñ‹Ð¼Ð¸';
$lang['User permissions and group permissions have been erased'] = 'Ð Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ и групп были Ñтерты';
$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Только Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ ÑÑкизов и Ð°Ð´Ñ€ÐµÑ Ð¿Ð¾Ñ‡Ñ‚Ñ‹ вебмаÑтера были Ñохранены от предыдущей конфигурации';
$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Эта Ñтраница предлагает модернизировать базу данных от Вашей Ñтарой верÑии Piwigo до новой верÑии. Помощник Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð´ÑƒÐ¼Ð°ÐµÑ‚, что Ð’Ñ‹ иÑпользуете в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ <b> выпуÑк %s </b> (или Ñквивалентный).';
diff --git a/language/sh_RS/admin.lang.php b/language/sh_RS/admin.lang.php
index 6234ab5fd..b7005708a 100644
--- a/language/sh_RS/admin.lang.php
+++ b/language/sh_RS/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -221,7 +221,7 @@ $lang['Prepared time for list of users to send mail is limited. Others users are
$lang['Time to send mail is limited. Others mails are skipped.'] = 'Vreme za slanje poruke je ograniÄeno. Ostale poruke su preskoÄene.';
$lang['To send ?'] = 'Poslati ?';
$lang['Last send'] = 'Zadnje poslato';
-$lang['email'] = 'e-mail';
+$lang['Email'] = 'e-mail';
$lang['User'] = 'Korisnik';
$lang['See you soon,'] = 'Vidimo se uskoro,';
$lang['Go to'] = 'Idi na ';
diff --git a/language/sh_RS/common.lang.php b/language/sh_RS/common.lang.php
index f76b74fc4..caed590b6 100644
--- a/language/sh_RS/common.lang.php
+++ b/language/sh_RS/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Srpski [SR]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=435
Author: Piwigo team
Author URI: http://piwigo.org
@@ -248,7 +248,6 @@ $lang['login mustn\'t end with a space character'] = 'prijava ne sme završavati
$lang['login mustn\'t start with a space character'] = 'prijava ne sme poÄinjati razmakom';
$lang['this login is already used'] = 'ovo korisniÄko ime se već koristi';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'e-mail adresa mora biti oblika xxx@yyy.eee (npr : korisnik@stranica.org)';
-$lang['please enter your password again'] = 'molimo unesite lozinku ponovo';
$lang['Auto login'] = 'Upamti me';
$lang['remove this tag from the list'] = 'ukloni ovaj tag iz popisa';
$lang['representative'] = 'predstavnik';
@@ -276,7 +275,6 @@ $lang['SQL queries in'] = 'SQL upit u ';
$lang['display only recently posted photos'] = 'prikaz samo nedavno objavljenih slika';
$lang['return to the display of all photos'] = 'povratak u prikaz svih slika';
$lang['the beginning'] = 'poÄetak';
-$lang['Interface theme'] = 'tema';
$lang['Thumbnails'] = 'SliÄice';
$lang['Menu'] = 'Izbornik';
$lang['A comment on your site'] = 'Komentar na Vašem sajtu';
@@ -404,4 +402,6 @@ $lang['Rating score, low &rarr; high'] = 'Ocena, niska &rarr; visoka';
$lang['Visits, high &rarr; low'] = 'Posete, više &rarr; manje';
$lang['Visits, low &rarr; high'] = 'Posete, manje &rarr; više';
$lang['%d rate'] = '%d ocena';
+$lang['Password is missing. Please enter the password.'] = 'Lozinka nedostaje. Molim unesite lozinku.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Potvrda lozinke nedostaje. Molim potvrdite izabranu lozinku.';
?> \ No newline at end of file
diff --git a/language/sh_RS/help/index.php b/language/sh_RS/help/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/sh_RS/help/index.php
+++ b/language/sh_RS/help/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/sh_RS/index.php b/language/sh_RS/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/sh_RS/index.php
+++ b/language/sh_RS/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/sh_RS/install.lang.php b/language/sh_RS/install.lang.php
index 5c8d68919..c605da7db 100644
--- a/language/sh_RS/install.lang.php
+++ b/language/sh_RS/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,23 +21,18 @@
// | USA. |
// +-----------------------------------------------------------------------+
-
$lang['Installation'] = 'Instalacija';
$lang['Basic configuration'] = 'Osnovna podešenja';
$lang['Default gallery language'] = 'Podrazumevani jezik galerije';
$lang['Database configuration'] = 'Podešavanje baze';
$lang['Admin configuration'] = 'Administratorska podešenja';
$lang['Start Install'] = 'Pokreni instalaciju';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'mail adresa mora biti u formatu xxx@yyy.eee (primer : milos@firma.org)';
-$lang['Webmaster login'] = 'Webmaster pristup';
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Bice prikazano posetiocima. Neophodno je za administraciju stranice';
$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Konekcija na server uspešna, ali konecija na bazu je nemoguca';
$lang['Can\'t connect to server'] = 'Nemoguce povezivanje na server';
$lang['Host'] = 'Host';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
$lang['User'] = 'Korisnik';
$lang['user login given by your host provider'] = 'korisnicko ime dat od strane Vašeg host distributera';
-$lang['Password'] = 'Lozinka';
$lang['user password given by your host provider'] = 'korisnicka lozinka data od strane Vašeg host distributera ';
$lang['Database name'] = 'Ime baze';
$lang['also given by your host provider'] = 'takode dato od Vašeg Host distributera';
@@ -46,12 +41,10 @@ $lang['database tables names will be prefixed with it (enables you to manage bet
$lang['enter a login for webmaster'] = 'Unesi pristupne podatke za webmaster';
$lang['webmaster login can\'t contain characters \' or "'] = 'pristupni podaci za webmastera ne mogu sadržati znake \' ili "';
$lang['please enter your password again'] = 'molim unesite Vašu lozinku ponovo';
-$lang['Webmaster password'] = 'Webmaster lozinka';
$lang['Keep it confidential, it enables you to access administration panel'] = 'Sacuvajte u tajnosti, omogucava pristup administratorskom delu';
$lang['Password [confirm]'] = 'Lozinka[potvrdi]';
$lang['verification'] = 'Provera';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Potrebna Vam je pomoc? Pitajte na <a href="%s">Piwigo tabli za poruke</a>.';
-$lang['Webmaster mail address'] = 'E-mail adresa Webmaster-a';
$lang['Visitors will be able to contact site administrator with this mail'] = 'Posetioci ce biti u mogucnosti da koriste ovaj mail da kontaktiraju administratora stranice';
$lang['PHP 5 is required'] = 'PHP 5 je neophodan';
$lang['It appears your webhost is currently running PHP %s.'] = 'Izgleda da Vaš webhost trenutno koristi PHP %s.';
@@ -67,7 +60,6 @@ $lang['An alternate solution is to copy the text in the box above and paste it i
$lang['Creation of config file local/config/database.inc.php failed.'] = 'Kreiranje konfiguracione datoteke local/config/database.inc.php neuspešno.';
$lang['Download the config file'] = 'Snimi na racunar konfiguracionu datoteku';
$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Možete snimiti na racunar konfiguracionu datoteku i poslati je na local/config direktorijum Vaše instalacije.';
-
$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Ne oklevajte da zatražite pomoć na naÅ¡em forumu oko bilo Äega: %s';
$lang['Just another Piwigo gallery'] = 'Još jedna Piwigo galerija';
$lang['Welcome to my photo gallery'] = 'Dobrodošli u moju foto galeriju';
diff --git a/language/sh_RS/upgrade.lang.php b/language/sh_RS/upgrade.lang.php
index e463fdba5..4719b8036 100644
--- a/language/sh_RS/upgrade.lang.php
+++ b/language/sh_RS/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/sk_SK/admin.lang.php b/language/sk_SK/admin.lang.php
index fe0938708..147cc291f 100644
--- a/language/sk_SK/admin.lang.php
+++ b/language/sk_SK/admin.lang.php
@@ -5,7 +5,7 @@
// +-----------------------------------------------------------------------+
// | Copyright(C) 2009 Pavel Budka & Petr Jirsa http://pbudka.co.cc |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -191,7 +191,6 @@ $lang['Access type'] = 'Druh prístupu';
$lang['Information data registered in database'] = 'Data boli uložené do databázy';
$lang['Default display'] = 'Východzie zobrazenie';
$lang['The gallery URL is not valid.'] = 'URL galérie nie je platné';
-$lang['Main'] = 'Hlavné';
$lang['The number of comments a page must be between 5 and 50 included.'] = 'PoÄet komentárov na stránku musí byÅ¥ Äíslo medzi 5 a 50 vrátane';
$lang['Configuration'] = 'Konfigurácia';
$lang['confirm'] = 'potvrdiť';
@@ -226,7 +225,6 @@ $lang['Prepared time for list of users to send mail is limited. Others users are
$lang['Time to send mail is limited. Others mails are skipped.'] = 'Nastavený Äas pre odoslanie správy bol prekroÄený. ÄŽalÅ¡ie správy nebudú odoslané.';
$lang['To send ?'] = 'Odoslať?';
$lang['Last send'] = 'Naposledy odoslané';
-$lang['email'] = 'E-mail';
$lang['User'] = 'Používateľ';
$lang['See you soon,'] = 'Dovidenia';
$lang['Go to'] = 'Prejsť na';
@@ -933,14 +931,10 @@ $lang['Panorama'] = 'Panoráma';
$lang['Minimum width'] = 'Minimálna šírka';
$lang['Minimum height'] = 'Minimálna výška';
$lang['Landscape'] = 'Na šírku';
-$lang['Invalid dimension'] = 'Neplatné rozmery';
-$lang['Format'] = 'Formát';
$lang['Manage photos'] = 'Spravovať fotky';
$lang['View in gallery'] = 'Zobraziť v galérii';
$lang['Number of albums per page'] = 'PoÄet albumov na stránku';
$lang['Ratio'] = 'Hodnotenie';
-$lang['Minimum'] = 'Minimum';
-$lang['Maximum'] = 'Maximum';
$lang['between %.2f and %.2f'] = 'medzi %.2f and %.2f';
$lang['between %d and %d pixels'] = 'medzi %d and %d pixelmi';
$lang['Type here the name of the new group'] = 'Sem napíšte názov novej skupiny';
@@ -954,4 +948,32 @@ $lang['Manage the members'] = 'Spravovať používateľov';
$lang['Merge selected groups'] = 'PridaÅ¥ oznaÄené skupiny';
$lang['Duplicate'] = 'Duplikovať';
$lang['Purge user cache'] = 'VyÄistiÅ¥ cache používateľa';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'Fotka bola zmenšená na %dx%d pixelov.';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'Zmena veľkosti po odoslaní zakázaná kvôli použitiu GD ako grafickej knižnice';
+$lang['Select at least one tag'] = 'Vyberte aspoň jedno kľúÄové slovo';
+$lang['Mail theme'] = 'Témy mailu';
+$lang['General'] = 'Hlavné';
+$lang['Basic settings'] = 'Základné nastavenie';
+$lang['on the %d selected users'] = 'na %d oznaÄených používateľov';
+$lang['Users modified'] = 'Používatelia zmenení';
+$lang['User %s updated'] = 'Používateľ %s aktualizovaný';
+$lang['User %s added'] = 'Používateľ %s pridaný';
+$lang['Update user'] = 'Používateľ aktualizovaný';
+$lang['Showing %s to %s of %s users'] = 'Zobrazených %s až %s z %s používateľov';
+$lang['Show %s users'] = 'Zobrazených %s používateľov';
+$lang['Registered on %s, %s.'] = 'Registrované na %s, %s.';
+$lang['Password updated'] = 'Heslo aktualizované';
+$lang['No user selected, no action possible.'] = 'Žiaden používateľ oznaÄený, žiadna akcia možná.';
+$lang['No user selected of %d users'] = 'Žiaden používateľ z %d používateľov oznaÄený';
+$lang['No matching user found'] = 'Nenájdený požívateľ';
+$lang['Loading...'] = 'Nahrávam...';
+$lang['Last visit on %s, %s.'] = 'Naposledy videný %s, %s.';
+$lang['Change username'] = 'Zmeniť používateľské meno';
+$lang['Change password'] = 'Zmeniť heslo';
+$lang['All %d users are selected'] = 'VÅ¡etkých %d používateľov je oznaÄených';
+$lang['(filtered from %s total users)'] = '(odfotrovaných %s z celkového poÄtu používateľov)';
+$lang['%d of %d users selected'] = '%d z %d používateľov oznaÄených';
+$lang['Close user details'] = 'Uzavrieť detaily používateľa';
+$lang['Open user details'] = 'Otvoriť detaily používateľa';
+$lang['close'] = 'zavrieť';
?> \ No newline at end of file
diff --git a/language/sk_SK/common.lang.php b/language/sk_SK/common.lang.php
index b2d756a4a..a77c93286 100644
--- a/language/sk_SK/common.lang.php
+++ b/language/sk_SK/common.lang.php
@@ -5,7 +5,7 @@
// +-----------------------------------------------------------------------+
// | Copyright(C) 2009 Pavel Budka & Petr Jirsa http://pbudka.co.cc |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -25,7 +25,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Slovensky [SK]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=452
Author: Piwigo team
Author URI: http://piwigo.org
@@ -249,7 +249,6 @@ $lang['login mustn\'t end with a space character'] = 'používateľské meno nes
$lang['login mustn\'t start with a space character'] = 'používateľské meno nesmie zaÄínaÅ¥ medzerou';
$lang['this login is already used'] = 'tieto prihlasovacie údaje už sú používané';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'E-mail musí byť vo formáte xxx@yyy.eee (napríklad: kovac@zoznam.sk)';
-$lang['please enter your password again'] = 'prosím zadajte znovu heslo';
$lang['Auto login'] = 'Automatické prihlásenie';
$lang['remove this tag from the list'] = 'odstrániÅ¥ toto kľúÄové slovo zo zoznamu';
$lang['representative'] = 'vzorový';
@@ -277,7 +276,6 @@ $lang['SQL queries in'] = 'SQL dotazov behom';
$lang['display only recently posted photos'] = 'zobrazí len novo vložené fotografie';
$lang['return to the display of all photos'] = 'návrat k zobrazeniu všetkých fotografií';
$lang['the beginning'] = 'zaÄiatok';
-$lang['Interface theme'] = 'Šablona vzhľadu';
$lang['Thumbnails'] = 'Náhľady';
$lang['Menu'] = 'Ďalšie funkcie';
$lang['A comment on your site'] = 'Komentár v Vašim stránkam';
@@ -422,4 +420,12 @@ $lang['Username is mandatory'] = 'Meno používateľa je povinné';
$lang['mandatory'] = 'povinné';
$lang['Your website URL is invalid'] = 'URL Vašej web stránky je neplatné';
$lang['Website'] = 'Web stránka';
+$lang['Email'] = 'Email';
+$lang['Go back to the album'] = 'Späť do albumu';
+$lang['Last Page'] = 'Posledná strana';
+$lang['First Page'] = 'Prvá strana';
+$lang['Password is missing. Please enter the password.'] = 'Chýba heslo. Prosím napíšte heslo.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Chýba potvrdenie hesla. Prosím potvrÄte vybrané heslo.';
+$lang['%d photos per page'] = '%d fotiek na stránku';
+$lang['Theme'] = 'Téma';
?> \ No newline at end of file
diff --git a/language/sk_SK/help/cat_modify.html b/language/sk_SK/help/cat_modify.html
new file mode 100755
index 000000000..bae573ce7
--- /dev/null
+++ b/language/sk_SK/help/cat_modify.html
@@ -0,0 +1,117 @@
+<h2>Editovanie albumov</h2>
+
+<h3>Informácie</h3>
+
+<ul>
+
+ <li><strong>názov</strong>: premenujte album (virtuálne premenovanie v prípade fyzických albumov).</li>
+
+ <li><strong>popis</strong>: krátky text vÅ¡eobecne popisujúci obsah, tento text sa zobrazí v spodnej Äasti pod stránkou s náhľadmi.</li>
+
+</ul>
+
+<h3>Presun</h3>
+
+<p>Ak je album virtuálny, môžete ho presunúť. Presun albumu znamená zmenu jeho rodiÄovského (nadradeného) albumu.</p>
+
+<h3>Možnosti</h3>
+
+<ul>
+
+ <li><strong>Typ prístupu</strong>: Správa oprávnení. KeÄ album nastavíte ako súkromný, vÅ¡etci jeho potomkovia (podalbumy) sa stanú súkromnými. KeÄ nastavíte album ako verejný, stanú sa verejnými aj jeho nadradené albumy.</li>
+
+ <li><strong>Zámok</strong>: Album a jeho podalbumy sa doÄasne kvôli údržbe zneprístupnia.</li>
+
+ <li><strong>Komentáre</strong>: Oprávení užívatelia, ktorí môžu komentovať obrázky tohto albumu.</li>
+
+</ul>
+
+<p>Tieto možnosti môžete tiež spravovať v správe "Vlastnosti" (záložky <span
+class="pwgScreen">Komentáre</span>, <span class="pwgScreen">Zámok</span>,
+<span class="pwgScreen">Verejný/Súkromný</span>, <span
+class="pwgScreen">Reprezentatívny</span> dostupné v<span
+class="pwgScreen">Administrácia &raquo; Albumov &raquo; Vlastnosti</span>).</p>
+
+<h3>Poradie</h3>
+
+<p>Použiť východzie poradie obrázkov.</p>
+
+<p>UrÄuje, Äi toto radenie použiÅ¥ tiež na podalbumy.</p>
+
+<p>Vyberte špecifické radenie, ktoré sa použije na tento album.</p>
+<ul>
+<li><strong>Dátum vytvorenia</strong>: Dátum vytvorenia obrázku</li>
+<li><strong>Dátum zverejnenia</strong>: Dátum synchronizácie</li>
+<li><strong>Priemerné hodnotenie (*)</strong>: Priemer sa mení podľa hodnotenia návštevníkov</li>
+<li><strong>NajÄastejÅ¡ie navÅ¡tevované (*)</strong>: Poradie je ovlyvnené aktuálnou návÅ¡tevnosÅ¥ou</li>
+<li><strong>Názov súboru</strong>: Názov urÄený v informaÄnom poli</li>
+<li><strong>ID</strong>: Interné ID (novšie albumy majú vyššie ID než predchádzajúce).</li>
+
+</ul>
+<p><strong>(*)</strong>Varovanie: Vlastné radenie vždy otestujte, obÄas vie daÅ¥ neoÄakávané výsledky.</p>
+
+
+<h3>Reprezentant</h3>
+
+<p>Reprezentant albumu je náhľad, ktorý sa zobrazí na hlavnej stránke (<span class="pwgScreen">category.php</span>) v prípade, keÄ obsahuje len podalbumy a nie priamo obrázky (rovnako ako koreňový album).</p>
+
+<ul>
+
+ <li><span class="pwgScreen">Stránka s obrázkami</span>: Jedným z tlaÄidiel nastavíte aktuálny obrázok ako reprezentatívny. Toto tlaÄidlo je prístupné len administrátorom.</li>
+
+ <li><span class="pwgScreen">Úprava informácii o obrázku</span> v administrácii. Dostupné z <span
+ class="pwgScreen">picture.php</span>alebo <span class="pwgScreen">v Správe dávky</span> pri <em>móde jednotlivo</em>. Viac v zodpovedajúcom pomocníkovi.</li>
+
+ <li><span class="pwgScreen">Administrácia &raquo; Albumy &raquo; Vlastnosti,
+ Reprezentatívny</span>. Viac v zodpovedajúcom pomocníkovi.</li>
+
+ <li><span class="pwgScreen">Editácia albumu</span> (súÄasná obrazovka).</li>
+
+</ul>
+
+<p>Voľba reprezentanta záleží na
+<code>allow_random_representative</code> konfiguraÄnom parametre (v súbore <span
+class="filename">include/config_default.inc.php</span>).</p>
+
+<p>Vo defaultnom móde (<code>allow_random_representative</code> nastavená na false),
+každý album, ktorý obsahuje aspoň jeden prvok, je reprezentovaný fixným prvkom.
+KeÄ sa reprezentant nastaví (pri tvorbe albumu), môže ho zmeniÅ¥ len administrátor. Pokiaľ reprezentant nevyhovuje,
+môžete použiť <strong>Nájsť reprezentanta pomocou náhodného výberu</strong>.</p>
+
+<p>Ak je konfiguraÄný parameter <code>allow_random_representative</code> nastavený na true, album obsahujúci obrázky nemusí maÅ¥ fixného reprezentanta.
+Len použite tlaÄidlo <strong>VymazaÅ¥ reprezentanta</strong> .</p>
+
+<p>Ak album obstahuje len podalbumy a žiadne obrázky, aj tak môže byÅ¥ reprezentovaný ľubovoľným prvkom vÄaka oknu <span class="pwgScreen">Zmena informácii o obrázku</span>. Jediná možnosÅ¥ v aktuálnom okne
+je tlaÄidlo <strong>VymazaÅ¥ reprezentanta</strong>.</p>
+
+<h3>Napojiť všetky obrázky albumu na nový album</h3>
+
+<ul>
+
+<li><strong>Názov virtuálneho albumu</strong>: Názov novo vytvoreného albumu,
+všetky obrázky z aktuálneho albumu sa napoja na tento album.</li>
+
+<li><strong>Nadradený album</strong>: Kde sa bude nachádzať nový album,
+Nechajte prázdne, ak má byť v koreňovom adresári.</li>
+
+</ul>
+
+<h3>Napojiť všetky obrázky na existujúci album</h3>
+
+<ul>
+
+<li><strong>Albums</strong>: Vyberte cieľový album.</li>
+
+</ul>
+
+<h3>PoslaÅ¥ informaÄný email Älenom skupiny</h3>
+
+<ul>
+
+<ul>
+
+<li><strong>Skupina</strong>: skupina adresátov</li>
+
+<li><strong>Obsah emailu</strong>: ľubovoľný text emailu, ktorý sa odošle.</li>
+
+</ul> \ No newline at end of file
diff --git a/language/sk_SK/help/cat_move.html b/language/sk_SK/help/cat_move.html
new file mode 100755
index 000000000..c7f6a664c
--- /dev/null
+++ b/language/sk_SK/help/cat_move.html
@@ -0,0 +1,14 @@
+<h2>Premiestnenie virtuálneho albumu</h2>
+
+<p>Len virtuálne albumy môžu maÅ¥ nový rodiÄovský album.</p>
+
+<h3>Virtuálne albumy na premiestnenie</h3>
+
+<p>OznaÄte jeden alebo viac virtuálnych albumov, ktoré chcete premiestniÅ¥.
+Ak je zoznam prázdny, to zanmená, že nemáte vytvorený žiaden.</p>
+
+<h3>Nový rodiÄovský album</h3>
+
+<p>Vyberte nový rodiÄovský album (virtuálny alebo fyzický).
+Ak nevyberiete žiaden rodiÄovský budú virtuálne vybrané albumy presunuté do rootu.
+Album nemôže byť presunutý do seba alebo do jedného z jeho podriadených.</p> \ No newline at end of file
diff --git a/language/sk_SK/help/cat_options.html b/language/sk_SK/help/cat_options.html
new file mode 100755
index 000000000..cd762f169
--- /dev/null
+++ b/language/sk_SK/help/cat_options.html
@@ -0,0 +1,22 @@
+<h2>Vlastnosti albumu</h2>
+
+<p>Správa vlastností pre viac albumov naraz</p>
+
+<dl>
+
+<dt>Komentáre</dt>
+<dd>Komentár k obrázkom je možné pridať, ak sú zaradené do albumu, ktorý má aktivované komentáre.</dd>
+
+<dt>Zamknúť</dt>
+<dd>Zamknuté albumy sú kvôli údržbe neprístupné. V galérii ich vidia len administrátori.</dd>
+
+<dt>Verejný / súkromný</dt>
+<dd>KeÄ nastavíte album ako súkromný, udeľte prístupové práva užívateľom a skupinám</dd>
+
+<dt>Reprezentatívny</dt>
+<dd>Táto voľba je prístupná, keÄ je v konfigurácii nastavené
+<code>allow_random_representative</code> (viÄ <span
+ class="filename">include/config_defaults.inc.php</span>) na
+<em>true</em>. Každý album môže byÅ¥ reprezentovaný náhodným obrázkom alebo obrázkom vami urÄeným.</dd>
+
+</dl> \ No newline at end of file
diff --git a/language/sk_SK/help/cat_perm.html b/language/sk_SK/help/cat_perm.html
new file mode 100755
index 000000000..a9535bae1
--- /dev/null
+++ b/language/sk_SK/help/cat_perm.html
@@ -0,0 +1,11 @@
+<h2>Nastavenie oprávnení pre albumy</h2>
+
+<p>Toto nastavenie je prístupné len pre súkromné albumy (galérie). Tu si môžete zvoliť užívateľov a skupiny, pre ktoré je album prístupný.</p>
+
+<h3>Skupiny</h3>
+
+<p>Pre aktuálny album môžete odobrať alebo umožniť prístup skupine. Tým, že zmeníte oprávnenia skupín, užívateľom patriacim do týchto skupín sa odoprie alebo umožní prístu do albumu.</p>
+
+<h3>Užívatelia</h3>
+
+<p>Tiež môžete odobrať alebo udeliť prístup jednotlivým užívateľom. Užívateľom, ktorí majú prístup cez skupinu, sa môže odoprieť prístup cez výnimky.</p> \ No newline at end of file
diff --git a/language/sk_SK/help/configuration.html b/language/sk_SK/help/configuration.html
new file mode 100755
index 000000000..819f6c381
--- /dev/null
+++ b/language/sk_SK/help/configuration.html
@@ -0,0 +1,100 @@
+<h2>Konfigurácia</h2>
+
+<p>Na tejto stránke je možné vykonávaÅ¥ základné nastavenie. Okno zobrazuje jednoduché konfiguraÄné parametre, ktoré by mali staÄiÅ¥ väÄÅ¡ine administrátorov. ÄŽalÅ¡ie nastavenia nájdete v súbore<span
+class="filename">include/config_default.inc.php</span>.</p>
+
+<p>Stránka je rozdelená do niekoľkých záložiek, ktoré zoskupujú konfiguraÄné nastavenia podľa ich typu.</p>
+
+<h3>Hlavné</h3>
+
+<ul>
+<li><strong>Názov galérie</strong>: používa sa v RSS vláknach a emailových upozorneniach.</li>
+
+<li><strong>Banner stránky</strong>: zobrazuje sa v hornej Äasti každej verejnej stránky.</li>
+
+<li><strong>URL galérie</strong>: používa sa RSS vláknach.</li>
+
+<li><strong>Zamknúť galériu</strong>: Uzavrie galériu, aby sa mohla vykonať údržba. Ku galérii budú mať prístup len užívatelia s oprávnením administrátor.</li>
+
+<li><strong>Povoliť hodnotenia</strong>: Hodnotenie obrázkov je povolené.</li>
+
+<li><strong>Hodnotenie hosťami</strong>: Hodnotiť obrázky môže aj neregistrovaný užívateľ.</li>
+
+<li><strong>Povoliť registráciu užívateľov</strong>: Ktokoľvek sa môže registrovať ako užívateľ.</li>
+
+<li><strong>E-mailová adresa je povinná pre všetkých užívateľov</strong>: pri registrácii alebo aktualizácii profilu sa skontroluje e-mailová adresa, s výnimkou situácii, kedy akciu vykonal administrátor.</li>
+
+<li><strong>Poslať e-mail administrátorovi pri registrácii nového užívateľa</strong>: na každú novú registráciu užívateľa budú upozornení administrátori.</li>
+
+<li><strong>Východzie poradie fotografií</strong>: výberom z drop-menu môžete urÄiÅ¥ prispôsobené poradie.</li>
+</ul>
+
+<h3>História</h3>
+
+<p>Návšteva stránok <span class="pwgScreen">category.php</span> a <span class="pwgScreen">picture.php</span> bude uložená v tabuľke <code>história</code>.</p>
+
+<p>Návštevy se zobrazujú v menu:<span
+ class="pwgScreen">Administrácia, Nástroje, História</span>.</p>
+
+<ul>
+<li><strong>Ukladať stránky navštívené hosťami</strong>: uložia se návštevy hosťov.</li>
+
+<li><strong>Ukladať stránky navštívené užívateľmi</strong>: uložia se návštevy registrovaných užívateľov.</li>
+
+<li><strong>Ukládať stránky navštívené administrátormi</strong>: uložia se stránky navštívené administrátormi.</li>
+
+</ul>
+
+<h3>Komentáre</h3>
+
+<ul>
+
+<li><strong>Komentáre pre všetkých</strong>: Aj neregistrovaný užívateľ môže zanechať komentár.</li>
+
+<li><strong>PoÄet komentárov na stránke</strong>.</li>
+
+<li><strong>Schválenie</strong>: Pred zobrazením na stránke musí byť každý komentár schválený administrátorom. Schvaľovanie komentárov sa vykonáva v menu<span class="pwgScreen">Administrácia, Nástroje, Komentáre na schválenie</span>.</li>
+
+<li><strong>Poslať e-mail administrátorovi pri vložení nového komentára</strong>:
+Pokiaľ je zadaný komentár, ktorý nevyžaduje schválenie, pošle se administrátorovi email.</li>
+
+<li><strong>Poslať e-mail administrátorovi pri vložení nového komentáře vyžadujúceho schválenie.</strong>:
+Pokiaľ je odoslaný komentár, ktorý vyžaduje schválenie, pošle se administrátorovi email.
+Schvaľování komentárov možno vykonať v menu: <span class="pwgScreen">Administrácia, Nástroje, Komentáre na schválenie</span>.</li>
+
+</ul>
+
+<h3>Východzie nastavenie</h3>
+
+<p>Tu sa nastavuje východzie nastavenie pre hosťov a neprihlásených užívateľov. Po prihlásení sa prestavia podľa vlastných nastavení užívateľa
+(nastaviteľné v <span class="pwgScreen">profil</span>).</p>
+
+<p>Je možné zmeniť nastavenie zobrazenie pre všetkých existujúcich užívateľov v <span class="pwgScreen">Administrácia,
+Užívatelia, Správa</span>: kde je možné vybrať zoznam užívateľov.</p>
+
+<ul>
+
+
+<li><strong>Jazyk</strong>: týka sa iba Piwigo popisiek. Názvy kategórii, názvy obrázkov a všetky popisy nie sú lokalizované.</li>
+
+<li><strong>PoÄet fotografií v riadku</strong></li>
+
+<li><strong>PoÄet riadkov na stránke</strong></li>
+
+<li><strong>Vzhľad užívatelského rozhrania</strong></li>
+
+<li><strong>ÄŒas, poÄas ktorého sú fotografie zobrazené ako novo pridané</strong>: V dňoch. Musí byÅ¥ väÄší než jeden deň.</li>
+
+<li><strong>RozbaliÅ¥ vÅ¡etky albumy</strong>: Rozbalí vÅ¡etky albumy. <em>UPOZORNENIE</em>: táto voľba je nároÄná na systémové zdroje a pokiaľ strom albumov obsahuje veľké množstvo položiek, môže vygenerovaÅ¥ rozsiahle menu.</li>
+
+<li><strong>ZobraziÅ¥ poÄet komentárov</strong>: Na stránke s náhľadmi zobrazí poÄet komentárov u každého obrázku. Spomaľuje systém.</li>
+
+<li><strong>UkázaÅ¥ poÄet zobrazení</strong>: zobrazí poÄet návÅ¡tÄ›v priamo pod náhľaom obrázku. Voľba je funkÄná iba ak je nastavený rozšířený konfiguraÄný parametr: <br>
+ $conf['show_nb_hits'] = true; <br>
+ poznámka: východzia hodnota je false.</li>
+
+<li><strong>Maximálna šířka fotografií</strong>: maximálna zobrazená šírka. Obrázky, ktoré sú väÄÅ¡ie, sa zmenÅ¡ia. Je lepÅ¡ie rovno obrázky pred nahratím zmenÅ¡iÅ¥, než používaÅ¥ túto voľbu.</li>
+
+<li><strong>Maximálna výška fotografií</strong>: maximálna zobrazená výška. To isté platí aj pre výšku.</li>
+
+</ul> \ No newline at end of file
diff --git a/language/sk_SK/help/extend_for_templates.html b/language/sk_SK/help/extend_for_templates.html
new file mode 100755
index 000000000..2661c4447
--- /dev/null
+++ b/language/sk_SK/help/extend_for_templates.html
@@ -0,0 +1,55 @@
+<h2>Konfigurácia rozšírenia šablóny</h2>
+
+<h3>O Äom je</h3>
+<p>VaÅ¡a Piwigo galéria sa dá prispôsobiÅ¥ tým, že nahradíte existujúce súbory Å¡ablóny upravenými verziami. Napr. defaultná Å¡ablóna hlaviÄky (header.tpl) sa dá nahradiÅ¥ upravenou Å¡ablónou hlaviÄky (my-header.tpl).
+Po odoslaní zmien do databázy sa galéria zobrazí s upravenou hlaviÄkou namiesto originálnej hlaviÄky.<br>
+Rozšírenia Å¡ablóny sú mocným nástrojom ako vytvoriÅ¥ upravené témy aj pre nových aj pre pokroÄilých užívateľov. Pri použití spolu s LocalFiles Editor dokážete vytvoriÅ¥ svoje vlastné child témy.</p>
+
+<h3>Originálna šablóna</h3>
+<p>Téma obsahuje množstvo súborov šablóny, ktoré vytvárajú stránky galérie. To sú originálne (pôvodné) šablóny.</p>
+
+<h3>Voliteľné kľúÄové URL slovo</h3>
+<p>Toto sú slová, ktorá sa nachádzajú v URL galérie po názve modulu. Tiež to môžu byť aktívne trvalé odkazy (Pre viac informácii pozrite dokumentáciu k trvalým odkazom). <a href="#warnings">VAROVANIE:</a>
+Ak je na viac než na jednej upravenej Å¡ablóne použitá tá istá originálna Å¡ablóna a to isté URL kľúÄové slovo, je aktívne len to posledné.</p>
+
+<h3>Zviazaná téma</h3>
+<p>Zviazaná (prepojená) téma je téma, z ktorej sú nahradzované súbory šablóny.</p>
+
+<h3>Kde sa nachádzajú originálne šablóny?</h3>
+<p>Originálne šablóny sú súbory šablony, ktoré sú dodávané s každou témou. Sú uložené v <em>/themes/default/template</em>
+(or <em>themes/<theme name>/template</em>). Tieto súbory by sa nemali editovaÅ¥, aby ste nepriÅ¡li o zmeny pri ÄalÅ¡ej aktualizácii.<br>
+Podporované originálne šablóny zahŕňajú:</p>
+<ul>
+ <li><span class="filename">index.tpl</span></li>
+ <li><span class="filename">mainpage_categories.tpl</span> and/or <span class="filename">thumbnails.tpl</span></li>
+ <li><span class="filename">menubar.tpl</span></li>
+ <li><span class="filename">header.tpl</span> and/or <span class="filename">footer.tpl</span></li>
+ <li><span class="filename">picture_content.tpl</span> and/or <span class="filename">picture.tpl</span></li>
+ <!-- <li><span class="filename">slideshow.tpl</span></li> -->
+ <li><span class="filename">profile.tpl</span> and/or <span class="filename">profile_content.tpl</span></li>
+ <li><span class="filename">tags.tpl</span></li>
+ <li><span class="filename">upload.tpl</span></li>
+ <li><span class="filename">about.tpl</span></li>
+ <li><span class="filename">popuphelp.tpl</span></li>
+ <li><span class="filename">search.tpl</span> and/or <span class="filename">search_rules.tpl</span></li>
+ <li><span class="filename">nbm.tpl</span> and/or <span class="filename">notification.tpl</span></li>
+ <li><span class="filename">identification.tpl</span> and/or <span class="filename">register.tpl</span></li>
+ <li><span class="filename">redirect.tpl</span></li>
+</ul>
+<h3>Uloženie upravených šablón</h3>
+<p>Upravené šablóny by mali byť uložené v sdresári template-extension alebo podadresároch. Napríklad, <em>/template-extension/my-default/header.tpl</em> (alebo <em>/template-extension/<my-theme-name>/header.tpl</em>)
+Súbory šablónu môžu mať akýkoľvek názov s koncovkou .tpl. Súbory šablóny v podadresároch sa zobrazia v okne Konfigurácia šablóny ako dostupné custom šablóny.</p>
+<h3>Aktivácia upravených šablón</h3>
+<p>Zvoľte originálnu Å¡ablónu, ktorú chcete nahradiÅ¥. Voliteľne zvoľne kľúÄové URL slovo, aby ste sa uistili, že sa upravená Å¡ablóna zobrazí len na stránkach s týmto slovom. Zvoľte spojenú tému a zmeny budú úÄinné v tejto téme.OdoÅ¡lite zmeny do databázy.</p>
+<h3>Deaktivácia upravených šablón</h3>
+<p>Zrušte výber pôvodnej šablóny a odošli zmeny do databázy.<br>
+Vymažte upravené šablóny z adresára template-extension.</p>
+
+<a name="warnings"></a>
+<h3>Varovania</h3>
+<ul>
+ <li><strong>Originálna Å¡ablóna</strong> musí byÅ¥ originálna Å¡ablóna, inak môžete dosiahnuÅ¥ neoÄakávané výsledky.</li>
+ <li>Ak je na viac než na jednej upravenej Å¡ablóne použitá tá istá originálna Å¡ablóna a to isté URL kľúÄové slovo, je aktívne len to posledné.</li>
+ <li>Distribuované príklady súborov Å¡ablón sú len na testovacie úÄely. Nemeňte ich. Vytvorte si svoje vlastné alebo skopírujte existujúce súbory z témy do <em>/template-extension/<my-theme>/</em></li>
+ <li>KeÄ sa vymaže upravená Å¡ablóna, okamžite sa znova aktivuje originálny súbor Å¡ablóny.</li>
+</ul> \ No newline at end of file
diff --git a/language/sk_SK/help/group_list.html b/language/sk_SK/help/group_list.html
new file mode 100755
index 000000000..f61094697
--- /dev/null
+++ b/language/sk_SK/help/group_list.html
@@ -0,0 +1,21 @@
+<h2>Skupiny</h2>
+
+<p>Na tomto mieste sa spravujú skupiny užívateľov.</p>
+
+<h3>Pridať skupinu</h3>
+
+<p>Skupinu môžu pridať administrátori.</p>
+
+<h3>Zoznam skupín</h3>
+
+<p>Pre každú skupinu je možné vykonať nasledovné akcie:</p>
+
+<ul>
+<li>prejsť na zoznam užívateľov</li>
+<li>prejsť na administráciu užívateľských oprávnení</li>
+<li>vymazať skupinu (vyžaduje potvrdenie)</li>
+<li>nastaviť ako východziu (vyžaduje potvrdenie)</li>
+</ul>
+
+<h3>Východzie skupiny</h3>
+<p>Východzia skupina je automaticky priradená k novému užívateľovi po jeho registrácii alebo po pridaní administrátorom.</p> \ No newline at end of file
diff --git a/language/sk_SK/help/help_add_photos.html b/language/sk_SK/help/help_add_photos.html
index 4de7ef2c4..5c1297836 100644
--- a/language/sk_SK/help/help_add_photos.html
+++ b/language/sk_SK/help/help_add_photos.html
@@ -1,21 +1,21 @@
-<p>Existuje niekoľko možností, ako pridať fotografie do Vašej Piwigo galérie:</p>
+<p>Existuje niekoľko možností ako pridať fotografie do Vašej Piwigo galérie:</p>
<ul>
- <li><strong>priame nahranie</strong> vo VaÅ¡om web prehliadaÄi je najjednoduchÅ¡ia a najpriamejÅ¡ia cesta. Záleží na možnostiach VaÅ¡eho prehliadaÄa a VaÅ¡eho web servra.
+ <li><strong>priame nahranie</strong> vo VaÅ¡om web prehliadaÄi je najjednoduchÅ¡ia a najpriamejÅ¡ia cesta. Záleží na možnostiach VaÅ¡eho prehliadaÄa a VaÅ¡eho web servera.
Pre nahranie veľkého množstva fotografií, alebo v prípade, že tento spôsob sklame, sú tu ÄalÅ¡ie možnosti.</li>
</ul>
<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">Prejdite na priame nahrávanie</a></p>
<ul>
- <li><strong>pLoader</strong> je aplikácia, ktorú musíte nainÅ¡talovaÅ¥ na Váš poÄítaÄ. Pretiahnite fotografie do okna pLoader, kliknite na <em>"Upload to Piwigo"</em> a nechajte pLoader nahraÅ¥t fotografie na server. Existujú taktiež ÄalÅ¡ie aplikácie ako <strong>WinToPiwigo</strong>, alebo <strong>Digikam</strong>, doplnok pre nahrávanie fotografií do Piwigo.</li>
+ <li><strong>pLoader</strong> je aplikácia, ktorú musíte nainÅ¡talovaÅ¥ na Váš poÄítaÄ. Pretiahnite fotografie do okna pLoader, kliknite na <em>"Upload to Piwigo"</em> a nechajte pLoader nahraÅ¥ fotografie na server. Existujú taktiež ÄalÅ¡ie aplikácie ako <strong>WinToPiwigo</strong>, alebo <strong>Digikam</strong>, doplnok pre nahrávanie fotografií do Piwigo.</li>
</ul>
<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ploader">Prejdite na pLoader</a></p>
<div id="helpSynchro">
<ul>
- <li><strong>FTP prenos</strong> je najviac odporúÄaná cesta, ako nahraÅ¥ veľké množstvo fotografií s minimálnym úsilím. Nasledujte návod, ako pripraviÅ¥ VaÅ¡e fotografie. Táto metóda Vám dáva možnosÅ¥ presne riadiÅ¥ usporiadanie VaÅ¡ich fotografií na VaÅ¡om servri.</li>
+ <li><strong>FTP prenos</strong> je najviac odporúÄaná cesta, ako nahraÅ¥ veľké množstvo fotografií s minimálnym úsilím. Nasledujte návod, ako pripraviÅ¥ VaÅ¡e fotografie. Táto metóda Vám dáva možnosÅ¥ presne riadiÅ¥ usporiadanie VaÅ¡ich fotografií na VaÅ¡om serveri.</li>
</ul>
<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ftp">Prejdite na FTP prenos</a></p>
diff --git a/language/sk_SK/help/help_groups.html b/language/sk_SK/help/help_groups.html
index 021b8f535..8f360acf2 100644
--- a/language/sk_SK/help/help_groups.html
+++ b/language/sk_SK/help/help_groups.html
@@ -1,8 +1,8 @@
-<p>Skupiny predstavujú spôsob, ako nastaviť rovnaké oprávnenia pre viacero používateľov.</p>
+<p>Skupiny predstavujú spôsob ako nastaviť rovnaké oprávnenia pre viacero používateľov.</p>
<p>Vytvorte skupinu pomocou <span class="pwgScreen">Administrácia &raquo; Používatelia &raquo; Skupiny</span> a priraÄte používateľov do tejto skupiny pomocou
<span class="pwgScreen">Administrácie &raquo; Používatelia &raquo;
Správa</span>.</p>
-<p>Používateľ môže patriÅ¥ do viacerých skupín. Používateľ potom získava práva súÄtom práv vÅ¡etkých týchto skupín: pokiaľ používateľ "janko" patrí do skupín "rodina" aj "priatelia" a len "rodina" má oprávnenie na kategóriu "Vianoce" tak
+<p>Používateľ môže patriÅ¥ do viacerých skupín. Používateľ potom získava práva súÄtom práv vÅ¡etkých týchto skupín: pokiaľ používateľ "janko" patrí do skupín "rodina" aj "priatelia" a len "rodina" má oprávnenie na kategóriu "Vianoce", tak
"janko" kategóriu "Vianoce" uvidí.</p>
diff --git a/language/sk_SK/help/history.html b/language/sk_SK/help/history.html
new file mode 100755
index 000000000..cc5ecd528
--- /dev/null
+++ b/language/sk_SK/help/history.html
@@ -0,0 +1,31 @@
+<h2>História</h2>
+
+<p>V týchto oknách môžete sledovať históriu návštev vašej galérie v závislosti na zvolených možnostiach v: Administrácii, Konfigurácii, Možnosti, História</p>
+<h3>Å tatistiky</h3>
+<ul>
+<p>Ak ste nastavili zaznamenávanie navštívených stránok (<span class="pwgScreen">index.php</span> a <span class="pwgScreen">picture.php</span>), môžete ich sledovať na tomto tabu.</p>
+
+<li><strong>Celkové štatistky</strong>: návštevy za rok. </li>
+
+<li><strong>RoÄné Å¡tatistiky</strong>: návÅ¡tevnosÅ¥ po mesiacoch vo zvolenom roku.</li>
+
+<li><strong>MesaÄné Å¡tatistiky</strong>: denná návÅ¡tevnosÅ¥ v jednotlivých dňoch zvoleného mesiaca.</li>
+
+<li><strong>Denné Å¡tatistiky</strong>: návÅ¡tevnosÅ¥ po hodinách poÄas zvoleného dňa.</li>
+
+</ul>
+
+<h3>Vyhľadávanie</h3>
+<ul>
+<p>Ak ste nastavili zaznamenávanie navštívených stránok(<span class="pwgScreen">index.php</span> a <span class="pwgScreen">picture.php</span>), môžete prechádzať detaily z tohto tabu pomocou rôznych filtrov.</p>
+
+<li><strong>Filter podľa dátumu</strong>: vyberte Äasové rozpätie, v ktorom chcete sledovaÅ¥ aktivitu na stránkách.</li>
+
+<li><strong>Filter podľa typu položky</strong>: vyberte typ položky, u kterej chcete sledovať dianie na stránke.</li>
+
+<li><strong>Filter podľa užívateľa</strong>: vyberte užívateľa,u ktorého vás zaujímajú jeho navštívené stránky.</li>
+
+<li><strong>Filter podľa názvu súboru</strong>: zvoľte méno súboru, ktorého návštevnosť vás zaujíma.</li>
+
+<li><strong>Filter podľa ID fotografie</strong>: zadajte ID fotografie, ktorú chcete sledova5.</li>
+</ul> \ No newline at end of file
diff --git a/language/sk_SK/help/index.php b/language/sk_SK/help/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/sk_SK/help/index.php
+++ b/language/sk_SK/help/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/sk_SK/help/maintenance.html b/language/sk_SK/help/maintenance.html
new file mode 100755
index 000000000..9b3c9964c
--- /dev/null
+++ b/language/sk_SK/help/maintenance.html
@@ -0,0 +1,32 @@
+<h2>Údržba</h2>
+
+<p>Pre optimalizáciu Äasu generovania stránok využívá Piwigo informácie uložené v medzipamÄ›ti. Napríklad, miesto zisÅ¥ovania poÄtu fotografií, ktoré albumy obsahujú, pri každom nahratí stránky, je táto informácia uložena v databáze.
+Teoreticky by táto informácia mala býť vždy správna, avÅ¡ak obÄas môže dojsÅ¥ k chybe a informácia uložená v databáze je zastaralá.</p>
+
+<p>Niektoré informácie sa po Äase stanú nepotrebnými. Vymazanie týchto zbytoÄných informácii z databázy uvoľní miesto na disku.</p>
+
+<ul>
+ <li><strong>Vymazať opustené (nepriradené) tagy</strong></li>
+</ul>
+<ul>
+ <li><strong>Aktualizovať informácie albumov:</strong>
+ Pre každý album sa kontrolujú nasledovné informácie a aktualizujú sa, ak je to potrebné: zoznam rodiÄovských albumov, poÄet fotiek, posledný dátum fotografie,
+ pozícia medzi sesterskými albumami, pozícia medzi všetkými albumami. Táto akcia taktiež kontroluje konzistenciu reprezentatívnych fotografii.</li>
+ <li><strong>Aktualizovať informácie fotiek:</strong> Pre každú fotografiu sa aktualizujú informácie: plná cesta k súboru, priemerné hodnotenie. <em>
+ Varovanie</em>, nezameňte si to: Informácie metadát musia byť synchronizované z <span class="pwgScreen">Administrácia, Nástroje, Synchronizácia</span>,
+ alebo na stránke úprav jednotlivých fotografií (cez <span class="pwgScreen">Photo</span> napríklad).</li>
+</ul>
+<ul>
+ <li><strong>Opraviť a optimalizovať databázu:</strong>Vykoná operácie: Opätovné zoradenie, oprava a optimalizácie na každej tabuľke v databáze.</li>
+ <li><strong>Znovu spustiť kontrolu integrity</strong></li>
+</ul>
+
+<ul>
+ <li><strong>Vykonať údržbu detailov histórie:</strong> Vymaže všetky riadky z tabuľky histórie. Okno <span class="pwgScreen">Administrácia &raquo; Nástroje
+ &raquo; História</span> potom nezobrazí žiadne informácie ohľadne histórie. <em>Varovanie:</em> vÅ¡etky dáta(história a Å¡tatistiky) budú NENÃVRATNE zmazané!</li>
+ <li><strong>VykonaÅ¥ údržbu celej histórie:</strong> Vymaže vÅ¡etky sumárne informácie o histórii návÅ¡tev. Tento sumár je poÄítaný z detailov histórie.</li>
+ <li><strong>Vykonať údržbu relácii:</strong>Vymaže expirované užívateľské sessions.</li>
+ <li><strong>Vykonať údržbu nepoužitých RSS vlákien</strong></li>
+ <li><strong>Vykonať údržbu histórie hľadaní</strong></li>
+ <li><strong>Vykonať údržbu kompilovaných šablón</strong></li>
+</ul> \ No newline at end of file
diff --git a/language/sk_SK/help/notification_by_mail.html b/language/sk_SK/help/notification_by_mail.html
new file mode 100755
index 000000000..72a8f16df
--- /dev/null
+++ b/language/sk_SK/help/notification_by_mail.html
@@ -0,0 +1,14 @@
+<h2>Emailové upozornenia</h2>
+
+<p>Konfigurácia a správa notifikácii emailom, ktoré upozorňujú užívateľov na zmeny na vašej stránke.</p>
+
+<p>K dipozícii sú tieto tri záložky:</p>
+
+<h3>Parametre</h3>
+<p>Dostupné len pre webmasterov. Slúži k nastaveniu parametrov upozorňovacích mailov</p>
+
+<h3>Prihlasenie k odberu</h3>
+<p>Dostupné len pre webmasterov. Umožní pridať alebo odobrať užívateľ zo zoznamu príjemncov emailu.</p>
+
+<h3>Odoslanie</h3>
+<p>Dostupné pro webmasterov a administrátorov. Slúži k odosielaniu upozorňovacích mailov.</p> \ No newline at end of file
diff --git a/language/sk_SK/help/permalinks.html b/language/sk_SK/help/permalinks.html
new file mode 100755
index 000000000..93de1a3a3
--- /dev/null
+++ b/language/sk_SK/help/permalinks.html
@@ -0,0 +1,8 @@
+<h2>Trvalé odkazy</h2>
+
+<p>Trvalé odkazy slúžia na to, aby URL jednotlivých albumov vyzerali lepšie . Po definovaní trvalých odkazov už nie je nutné mať ID kategórie v URL.</p>
+
+<p>KeÄ sa trvalý odkaz vymaže, môžete ho uložiÅ¥ do histórie trvalých odkazov, takže externé linky k stránkam Piwigo budú stále fungovaÅ¥.
+V tabuľke histórie trvalých odkazov je zobrazené dátum vymazania linku, Äas posledného použitia a poÄet použití.</p>
+
+<p>Všimnite si, že každý album musí mať unikátny názov trvalého odkazu. Rovnako nie je možné uložiť do histórie rovnaký link viac než raz.</p> \ No newline at end of file
diff --git a/language/sk_SK/help/search.html b/language/sk_SK/help/search.html
new file mode 100755
index 000000000..e04bf05b1
--- /dev/null
+++ b/language/sk_SK/help/search.html
@@ -0,0 +1,19 @@
+<h2>Vyhľadávanie</h2>
+
+<p>Táto stránka umožňuje vyhľadávať obrázky z celej galérie.</p>
+
+<dl>
+
+ <dt>Vyhľadávanie podľa zadaných slov</dt>
+ <dd>Vyhľadávanie jedného alebo viac slov podľa atribútu priradeného k obrázku v galérii. Pre vyhľadávanie slov s ÄiastoÄnou zhodou je možné použiÅ¥ * ako zástupný znak.</dd>
+
+ <dt>Vyhľadávanie podľa autora</dt>
+ <dd>Pre ÄiastoÄnú zhodu použite * ako zástupný znak.</dd>
+
+ <dt>Vyhľadávanie podľa dátumu</dt>
+ <dd>Vyberte poÄiatoÄný a/alebo koncový dátum. Pole ponechajte prázdne, ak chcete vyhľadávaÅ¥ "doteraz". Rok v poslednom poli musí by v nasledujúcom tvare : RRRR (napr. 2004)</dd>
+
+ <dt>Vyhľadávanie v albumoch</dt>
+ <dd>Vyberte jeden Äi viac albumov, v ktorých chcete vyhľadávaÅ¥. Vo vÅ¡etkých podalbumoch sa dá vyhľadávaÅ¥ výberom rodiÄovského albumu a nastavením voľby "prehľadávaÅ¥ aj podalbumy".</dd>
+
+</dl> \ No newline at end of file
diff --git a/language/sk_SK/help/synchronize.html b/language/sk_SK/help/synchronize.html
new file mode 100755
index 000000000..4df820fcb
--- /dev/null
+++ b/language/sk_SK/help/synchronize.html
@@ -0,0 +1,14 @@
+<h2>Synchronizácia</h2>
+
+<p>Existujú dve rôzne typy synchronizácie:</p>
+<ul>
+ <li>adresáre/soubory</li>
+ <li>metadáta súboru</li>
+</ul>
+
+<p>Synchronizácia adresárov a súborov slúži k aktualizácii vášho stromu adresárov so stromom albumov v databáze.
+Synchronizácia súborových metadát slúži k aktualizácii informácii o fotografii, napr. veľkosÅ¥ súboru, rozmery v pixeloch, EXIF Äi IPTC informácii v databáze.</p>
+
+<p>KeÄ synchronizujete svoje nahrávky s vaÅ¡ou galériou, najprv musíte synchronizovaÅ¥ adresáre a súbory.</p>
+
+<p>Synchronizácia môže trvaÅ¥ nejaký Äas (závisí od zaÅ¥aženia a rýchlosti servera a poÄtu položiek, ktoré treba zvládnuÅ¥, takže je možné robiÅ¥ ju album po albume).</p>
diff --git a/language/sk_SK/help/user_list.html b/language/sk_SK/help/user_list.html
new file mode 100755
index 000000000..e549b0699
--- /dev/null
+++ b/language/sk_SK/help/user_list.html
@@ -0,0 +1,26 @@
+<h2>Zoznam užívateľov</h2>
+
+<p>Na tomto mieste môžete spravovať užívateľov vašej Piwigo galérie.</p>
+
+<h3>Pridať užívateľa</h3>
+
+<p>Administrátor môže pridaÅ¥ užívateľa ruÄne. Pre každého užívateľa vytvorte užívateľské meno, heslo a odoÅ¡lite platnú emailovú adresu</p>
+
+<h3>Zoznam užívateľov</h3>
+
+<p>Zoznam užívateľov je možné filtrovaÅ¥ podľa užívateľského mena (použite * pre ÄiastoÄnú zhodu), skupiny alebo stavu.
+Výpis môžete nechať zoradiť podľa dátumu registrácie, vo vzostupnom alebo zostupnom poradí.</p>
+
+<p>Tu je možné editovať niekoľko užívateľov naraz. Môžete použiť tieto akcie:</p>
+
+<ul>
+
+<li>zmazanie užívateľov (vyžaduje potvrdenie)</li>
+<li>zmena stavu užívateľa</li>
+<li>zaradenie alebo vyradenie zo skupiny</li>
+<li>úprava vlastností zobrazenia</li>
+<li>úprava dodatoÄných vlastností</li>
+
+</ul>
+
+<p>Cieľom je vybraný užívateľ (východzie nastavenie) alebo všetci užívatelia zobrazení po použití filtra.</p> \ No newline at end of file
diff --git a/language/sk_SK/index.php b/language/sk_SK/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/sk_SK/index.php
+++ b/language/sk_SK/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/sk_SK/install.lang.php b/language/sk_SK/install.lang.php
index 4ac15f380..fc898ee33 100644
--- a/language/sk_SK/install.lang.php
+++ b/language/sk_SK/install.lang.php
@@ -5,7 +5,7 @@
// +-----------------------------------------------------------------------+
// | Copyright(C) 2009 Pavel Budka & Petr Jirsa http://pbudka.co.cc |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -30,8 +30,6 @@ $lang['Default gallery language'] = 'Základný jazyk galérie';
$lang['Database configuration'] = 'Databázová konfigurácia';
$lang['Admin configuration'] = 'Administrátorská konfigurácia';
$lang['Start Install'] = 'Spustiť inštaláciu';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'e-mailová adresa musí mať formát xxx@yyy.eee (napríklad : kovac@zoznam.sk)';
-$lang['Webmaster login'] = 'Používateľské meno správcu';
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Bude zobrazený návštevníkom. Je nutný pre administráciu aplikácie.';
$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Spojenie na server sa podarilo, ale nebolo možné pripojiť databázu';
$lang['Can\'t connect to server'] = 'Nebolo možné sa pripojiť k serveru';
@@ -39,7 +37,6 @@ $lang['Host'] = 'MySQL server';
$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.sk';
$lang['User'] = 'Používateľ';
$lang['user login given by your host provider'] = 'používateľské meno, ktoré Vám pridelil prevádzkovateľ serveru';
-$lang['Password'] = 'Heslo';
$lang['user password given by your host provider'] = 'heslo na tomto serveri';
$lang['Database name'] = 'Názov databázy';
$lang['also given by your host provider'] = 'ktorý na tomto servri';
@@ -48,12 +45,10 @@ $lang['database tables names will be prefixed with it (enables you to manage bet
$lang['enter a login for webmaster'] = 'zadať používateľské meno webmastra';
$lang['webmaster login can\'t contain characters \' or "'] = 'používateľské meno správcu nemôže obsahovať znak \' alebo "';
$lang['please enter your password again'] = 'prosím zadať znovu heslo';
-$lang['Webmaster password'] = 'Heslo webmastra';
$lang['Keep it confidential, it enables you to access administration panel'] = 'Heslo majte utajené, umožní Vám prístup do administrácie aplikácie';
$lang['Password [confirm]'] = 'Heslo [potvrdenie]';
$lang['verification'] = 'kontrola';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Potrebujete pomoc? Opýtajte sa na <a href="%s">Piwigo fóre</a>.';
-$lang['Webmaster mail address'] = 'E-mail webmastra';
$lang['Visitors will be able to contact site administrator with this mail'] = 'Návštevníci môžu pomocou tohto e-mailu kontaktovať správcu';
$lang['PHP 5 is required'] = 'Je nutné PHP 5';
$lang['It appears your webhost is currently running PHP %s.'] = 'Na Vašom webhostingu je PHP %s.';
@@ -73,4 +68,5 @@ $lang['Just another Piwigo gallery'] = 'Len iná Piwigo galéria';
$lang['Welcome to my photo gallery'] = 'Vitajte v mojej foto galérii';
$lang['Welcome to your new installation of Piwigo!'] = 'Vitajte vo Vašej novej inštalácii Piwigo!';
$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Neváhajte konzultovať na našom fóre každú pomoc: %s';
+$lang['localhost or other, supplied by your host provider'] = 'localhost alebo iné, obdržíte od poskytovateľa hostu';
?> \ No newline at end of file
diff --git a/language/sk_SK/upgrade.lang.php b/language/sk_SK/upgrade.lang.php
index ec817bbfc..21f2122ff 100644
--- a/language/sk_SK/upgrade.lang.php
+++ b/language/sk_SK/upgrade.lang.php
@@ -5,7 +5,7 @@
// +-----------------------------------------------------------------------+
// | Copyright(C) 2009 Pavel Budka & Petr Jirsa http://pbudka.co.cc |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -39,7 +39,8 @@ $lang['User permissions and group permissions have been erased'] = 'PoužívateÄ
$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Z predchádzajúcej konfigurárie boli zachované len predpony náhľadov a mailová adresa webmastra.';
$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Navrhujeme aktualizovať databázu Vašej galérie Piwigo zo staršej na novú verziu.
Asistent aktualizácie sa domnieva, že aktuálne používate <strong>verziu %s</strong> (alebo obdobnú).';
-$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'Ako predbežné opatrenie boli deaktivované nasledujúce doplnky. Prosím skontrolujte aktualizácie týchto doplnkov predtým než ich znovu aktivujete:';$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'V <i>%s</i>, pred <b>?></b>, vložením:';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'V <i>%s</i>, pred <b>?></b>, vložte:';
$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Z opatrnosti boli nasledovné témy deaktivované. Musíte skontrolovať aktualizácie tém pred ich reaktiváciou:';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'Ako predbežné opatrenie boli deaktivované nasledujúce doplnky. Prosím skontrolujte aktualizácie týchto doplnkov predtým, než ich znovu aktivujete:';
?> \ No newline at end of file
diff --git a/language/sl_SI/about.html b/language/sl_SI/about.html
index 7f3f18692..dab4fe2e0 100644
--- a/language/sl_SI/about.html
+++ b/language/sl_SI/about.html
@@ -1,15 +1,18 @@
-<p>Piwigo foto galerija</p>
+<p>Piwigo foto galerija</p>
-<p>Piwigo je foto galerija za splet, zgrajena s pomoÄjo aktivne skupnosti uporabnikov in razvijalcev.
- Preko razÅ¡iritev je možno piwigo na enostaven naÄin prilagoditi svojim zahtevam.
- Piwigo je odprto kodni projekt in je zastonj.</p>
+<p>Piwigo je spletna foto galerija, zgrajena s pomoÄjo aktivne skupnosti uporabnikov in razvijalcev.
+ Piwigo je možno preko razÅ¡iritev na hiter in enostaven naÄin prilagoditi vaÅ¡im zahtevam.
+ Piwigo je odprto kodni projekt in je brezplaÄen.</p>
<p id="linkToPiwigo"><a href="http://piwigo.org">ObiÅ¡Äite Piwigo spletno stran</a></p>
<p>Slovenski prevod vzdržujejo (v abecednem vrstnem redu ):
-<ul>
-<li><a href="http://piwigo.org/forum/profile.php?id=">Klemen</a></li>
-</ul>
+ <ul>
+ <li><a href="http://piwigo.org/forum/profile.php?id=18864">MarkoAm</a></li>
+ <li><a href="http://piwigo.org/forum/profile.php?id=18786">obucek</a></li>
+ <li><a href="http://piwigo.org/forum/profile.php?id=18932">simon.krajnc</a></li>
+ <li><a href="http://piwigo.org/forum/profile.php?id=15806">svartur81</a></li>
+ </ul>
.... zahvala vsem</p>
diff --git a/language/sl_SI/admin.lang.php b/language/sl_SI/admin.lang.php
index a2bdf418a..8eb01d2ae 100644
--- a/language/sl_SI/admin.lang.php
+++ b/language/sl_SI/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -43,87 +43,86 @@ $lang['%d guests'] = '%d gostov';
$lang['%d line filtered'] = '%d vrstica filtrirana';
$lang['%d lines filtered'] = '%d vrstic filtriranih';
$lang['ACCESS_0'] = 'Prosti dostop';
-$lang['ACCESS_1'] = 'Dsotop do vsega';
+$lang['ACCESS_1'] = 'Polni dostop';
$lang['ACCESS_2'] = 'Dostop za registrirane uporabnike';
$lang['ACCESS_3'] = 'Dostop za administratorje';
$lang['ACCESS_4'] = 'Dostop za spletne skrbnike';
$lang['ACCESS_5'] = 'Brez dostopa';
-$lang['Action'] = 'Akcija';
-$lang['Actions'] = 'Akcije';
-$lang['Activate icon "%s"'] = 'Aktiviraj ikono "%s"';
-$lang['Activate Navigation Bar'] = 'Aktiviraj navigacijsko vrstico';
-$lang['Activate Navigation Thumbnails'] = 'Aktiviraj navigacijo za predoglede';
-$lang['Activate'] = 'Aktiviraj';
-$lang['Activate icon "new" next to albums and pictures'] = 'Aktiviraj ikono "novo" poleg albumov in slik';
-$lang['Active Languages'] = 'Aktiviraj jezike';
-$lang['Active Plugins'] = 'Aktiviraj ';
-$lang['Active Themes'] = 'Aktiviraj teme';
+$lang['Action'] = 'Dejanje';
+$lang['Actions'] = 'Dejanja';
+$lang['Activate icon "%s"'] = 'OmogoÄi ikono "%s"';
+$lang['Activate Navigation Bar'] = 'OmogoÄi navigacijsko vrstico';
+$lang['Activate Navigation Thumbnails'] = 'OmogoÄi navigacijo za predoglede';
+$lang['Activate'] = 'OmogoÄi';
+$lang['Activate icon "new" next to albums and pictures'] = 'OmogoÄi ikono "novo" poleg albumov in slik';
+$lang['Active Languages'] = 'OmogoÄeni jeziki';
+$lang['Active Plugins'] = 'OmogoÄeni vtiÄniki';
+$lang['Active Themes'] = 'OmogoÄene teme';
$lang['Add a criteria'] = 'Dodaj kriterij';
$lang['Add a filter'] = 'Dodaj filter';
$lang['Add a tag'] = 'Dodaj znacko';
-$lang['clean'] = 'pobriši';
+$lang['clean'] = 'pobriši';
$lang['Comments for all'] = 'Komentarji za vse';
-$lang['Complementary mail content'] = 'Komplementarna vsebina pošte';
+$lang['Complementary mail content'] = 'Komplementarna vsebina pošte';
$lang['Configuration'] = 'Konfiguracija';
$lang['confirm'] = 'potrdi';
$lang['Continue processing treatment'] = 'Nadaljuj z obdelavo';
-$lang['Correction applied with error'] = 'Popravek namešcen z napako';
-$lang['Correction applied with success'] = 'Popravek uspešno namešcen';
-$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'Odpravljene anomalije ne bodo vec ignorirane.';
+$lang['Correction applied with error'] = 'Popravek namešcen z napako';
+$lang['Correction applied with success'] = 'Popravek uspešno namešcen';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'Odpravljene anomalije ne bodo veÄ ignorirane.';
$lang['Correction'] = 'Popravek';
$lang['create a new album'] = 'ustvari nov album';
-$lang['Create a new site : (give its URL to create_listing_file.php)'] = 'Ustvari novo stran : (URL naj kaže na create_listing_file.php)';
-$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Ustvari imenik "%s" v korenu Piwigo inštalacije.';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Ustvari imenik "%s" v korenu Piwigo namestitve.';
$lang['Create this site'] = 'Ustvari stran';
$lang['delete album'] = 'odstrani album';
-$lang['Delete orphan tags'] = 'Odstrani neuporabljene znacke';
+$lang['Delete orphan tags'] = 'Odstrani neuporabljene oznake';
$lang['delete photo'] = 'odstrani sliko';
-$lang['Delete Representant'] = 'Odstrani Representant';
+$lang['Delete Representant'] = 'Odstrani Predstavnika';
$lang['Delete selected photos'] = 'Odstrani izbrane slike';
-$lang['Delete selected tags'] = 'Odstrani izbrane znacke';
+$lang['Delete selected tags'] = 'Odstrani izbrane oznake';
$lang['Delete selected users'] = 'Odstrani izbrane uporabnike';
$lang['Delete this language'] = 'Odstrani jezik';
-$lang['delete this site and all its attached elements'] = 'odstrani stran in pripadajoce podatke';
+$lang['delete this site and all its attached elements'] = 'odstrani stran in pripadajoÄe podatke';
$lang['Delete this theme'] = 'Odstrani temo';
$lang['delete'] = 'odstrani';
$lang['Deleted on'] = 'Odstranjeno';
$lang['deleted'] = 'odstranjeno';
$lang['Deletions'] = 'Odstrani';
-$lang['Deny selected groups'] = 'Prepreci dostop izbranim skupinam';
-$lang['Deny selected users'] = 'Prepreci dostop izbranim uporabnikom';
+$lang['Deny selected groups'] = 'PrepreÄi dostop izbranim skupinam';
+$lang['Deny selected users'] = 'PrepreÄi dostop izbranim uporabnikom';
$lang['Description'] = 'Opis';
-$lang['Average rate'] = 'Povprecje';
+$lang['Average rate'] = 'PovpreÄje';
$lang['Rate'] = 'Glasuj';
$lang['Album "%s" has been added'] = 'Album "%s" je bil dodan';
$lang['Album "%s" now contains %d photos'] = 'Album "%s" vsebuje %d slik';
$lang['Album photos associated to the following albums: %s'] = 'Slike albuma pripadajo naslednjim albumom: %s';
$lang['Album list management'] = 'Upravljanje seznama albuma';
-$lang['Album manual order was saved'] = 'Rocna nastavitev sortiranja albuma, uspešno shranjena';
+$lang['Album manual order was saved'] = 'RoÄna nastavitev razvrÅ¡Äanja albuma je bila uspeÅ¡no shranjena';
$lang['Album name'] = 'Ime albuma';
-$lang['Album updated successfully'] = 'Album uspešno popravljen';
+$lang['Album updated successfully'] = 'Album uspešno popravljen';
$lang['albums added in the database'] = 'albumi dodani v bazo';
-$lang['Albums automatically sorted'] = 'Albumi so bili avtomaticno sortirani';
+$lang['Albums automatically sorted'] = 'Albumi so bili samodejno razvrÅ¡Äeni';
$lang['albums deleted in the database'] = 'albumi odstranjeni iz baze';
-$lang['Access type'] = 'Tip dostopa';
+$lang['Access type'] = 'Vrsta dostopa';
$lang['Add a user'] = 'Dodaj uporabnika';
-$lang['Add a virtual album'] = 'Dodaj virtualni album';
+$lang['Add a virtual album'] = 'Dodaj navidezni (virtualni) album';
$lang['Add another set of photos'] = 'Dodaj nov nabor slik';
$lang['Add detailed content'] = 'Dodaj vsebino';
$lang['Add group'] = 'Dodaj skupino';
$lang['Add New Language'] = 'Dodaj nov jezik';
-$lang['add new photos to caddie'] = 'dodaj nove slike v caddie';
+$lang['add new photos to caddie'] = 'dodaj nove slike v košarico';
$lang['Add New Theme'] = 'Dodaj novo temo';
$lang['Add Photos'] = 'Dodaj slike';
$lang['Add write access to the "%s" directory'] = 'Dodaj pravico pisanja "%s" imeniku';
$lang['Add'] = 'Dodaj';
-$lang['Add/delete a permalink'] = 'Dodaj/odstrani povezavo';
+$lang['Add/delete a permalink'] = 'Dodaj/odstrani stalno povezavo';
$lang['added'] = 'dodano';
-$lang['%d tag'] = '%d znacka';
-$lang['%d tags'] = '%d znacke';
+$lang['%d tag'] = '%d oznaka';
+$lang['%d tags'] = '%d oznake';
$lang['%d user comment rejected'] = '%d komentar zavrnjen';
-$lang['%d user comment validated'] = '%d komentar validiran';
+$lang['%d user comment validated'] = '%d komentar preverjen';
$lang['%d user comments rejected'] = '%d komentarjev zavrnjenih';
-$lang['%d user comments validated'] = '%d komentarjev validiranih';
+$lang['%d user comments validated'] = '%d komentarjev preverjenih';
$lang['%d user deleted'] = '%d uporabnik odstranjen';
$lang['%d user was not updated.'] = '%d uporabnik ni bil posodobljen.';
$lang['%d user was updated.'] = '%d uporabnik posodobljen.';
@@ -132,46 +131,46 @@ $lang['%d users deleted'] = '%d uporabnikov odstranjenih';
$lang['%d users were not updated.'] = '%d uporabnikov ni bilo posodobljenih.';
$lang['%d users were updated.'] = '%d uporabnikov posodobljenih.';
$lang['%d users'] = '%d uporabnikov';
-$lang['%d waiting for validation'] = '%d cakam na validacijo';
-$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s mora biti nastavljeno na false v datoteki local/config/config.inc.php';
+$lang['%d waiting for validation'] = '%d Äaka preverjanje';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s mora biti nastavljeno na false v datoteki: local/config/config.inc.php';
$lang['%s value is not correct file because exif are not supported'] = '%s vrednost je neveljavna, exif ni podprt';
-$lang['+ Add an upload box'] = '+ Dodaj upload';
+$lang['+ Add an upload box'] = '+ Dodaj polje nalaganja';
$lang[', click on'] = ', klikni na';
$lang[' and %d virtual'] = ' in %d navidezen';
-$lang['%d mail was not sent.'] = '%d mail ni bil poslan.';
-$lang['%d mail was sent.'] = '%d mail poslan.';
-$lang['%d mails were not sent.'] = '%d mailov ni bilo poslanih.';
-$lang['%d mails were sent.'] = '%d mailov poslanih.';
-$lang['%d member'] = '%d clan';
-$lang['%d members'] = '%d clanov';
+$lang['%d mail was not sent.'] = '%d e-mail ni bil poslan.';
+$lang['%d mail was sent.'] = '%d e-mail uspešno poslan.';
+$lang['%d mails were not sent.'] = '%d e-mailov ni bilo poslanih.';
+$lang['%d mails were sent.'] = '%d e-mailov poslanih.';
+$lang['%d member'] = '%d Älan';
+$lang['%d members'] = '%d Älanov';
$lang['%d of %d photos selected'] = '%d od %d slik izbranih';
$lang['%d parameter was updated.'] = '%d parameter popravljen.';
$lang['%d parameters were updated.'] = '%d parametrov popravljenih.';
$lang['%d photo was deleted'] = '%d slika odstranjena';
-$lang['%d photos uploaded'] = '%d slik naloženih';
+$lang['%d photos uploaded'] = '%d slik naloženih';
$lang['%d photos were deleted'] = '%d slik odstranjenih';
-$lang['%d physical'] = ' %d fizicen';
-$lang['A new version of Piwigo is available.'] = 'Dostopna je nova verzija Piwigo.';
+$lang['%d physical'] = ' %d fiziÄen';
+$lang['A new version of Piwigo is available.'] = 'Na voljo je nova razliÄica Piwigo.';
$lang['Administration Home'] = 'Administracija';
-$lang['Advanced features'] = 'Napredne možnosti';
-$lang['Albums authorized thanks to group associations'] = 'Albums authorized thanks to group associations';
+$lang['Advanced features'] = 'Napredne možnosti';
+$lang['Albums authorized thanks to group associations'] = 'Albumi omogoÄeni zahvaljujoÄ skupini ki ji pripadajo';
$lang['All %d photos are selected'] = 'Vseh %d slik je izbranih';
-$lang['All optimizations have been successfully completed.'] = 'Vsi optimizacijski postopki uspešno zakljuceni.';
+$lang['All optimizations have been successfully completed.'] = 'Vsi optimizacijski postopki uspeÅ¡no zakljuÄeni.';
$lang['all'] = 'vsi';
$lang['Allow rating'] = 'Dovoli glasovanje';
-$lang['Allow user customization'] = 'Dovoli uporabniku prilagoditev';
+$lang['Allow user customization'] = 'Dovoli uporabniku spreminjanje prilagoditev';
$lang['Allow user registration'] = 'Dovoli registracijo uporabnika';
-$lang['Allow users to delete their own comments'] = 'Dovoli uporabniku brisanje lastnih komentarjev';
+$lang['Allow users to delete their own comments'] = 'Dovoli uporabnikom brisanje lastnih komentarjev';
$lang['Allow users to edit their own comments'] = 'Dovoli uporabnikom popravljanje lastnih komentarjev';
-$lang['an error happened'] = 'prišlo je do napake';
-$lang['An error occured during extraction (%s).'] = 'Prišlo je do napake med ekstrahiranjem (%s).';
-$lang['An information email was sent to group "%s"'] = 'Informativni mail je bil poslan skupini "%s"';
+$lang['an error happened'] = 'prišlo je do napake';
+$lang['An error occured during extraction (%s).'] = 'Med razširjanjem datotek (%s) je prišlo do napake.';
+$lang['An information email was sent to group "%s"'] = 'Informativni e-mail je bil poslan skupini "%s"';
$lang['and'] = 'in';
$lang['Anomaly'] = 'Nepravilnost';
-$lang['General statistics'] = 'Splošna statistika';
-$lang['Get Support on Piwigo Forum'] = 'Za vec pomoci pojdi na Piwigo forum';
-$lang['global mode'] = 'globalni nacin';
-$lang['Go to %s or %s for more informations'] = 'Pojdi na %s ali %s za vec informacij';
+$lang['General statistics'] = 'Splošna statistika';
+$lang['Get Support on Piwigo Forum'] = 'Za veÄ pomoÄi obiÅ¡Äi Piwigo forum';
+$lang['global mode'] = 'globalni naÄin';
+$lang['Go to %s or %s for more informations'] = 'Pojdi na %s ali %s za veÄ informacij';
$lang['Go to'] = 'Pojdi na';
$lang['Grant selected groups'] = 'Odobri izbrane skupine';
$lang['Grant selected users'] = 'Odobri izbrane uporabnike';
@@ -186,54 +185,52 @@ $lang['Guest cannot be deleted'] = 'Gost ne more biti odstranjen';
$lang['Guest Settings'] = 'Nastavitve gosta';
$lang['guest'] = 'gost';
$lang['Guests'] = 'Gosti';
-$lang['height must be a number superior to'] = 'višina mora biti številka, vecja od ';
+$lang['height must be a number superior to'] = 'viÅ¡ina mora biti Å¡tevilka, veÄja od ';
$lang['Hello'] = 'Pozdravljen';
$lang['Hello,'] = 'Pozdravljen,';
$lang['Help Me'] = 'Pomagaj mi';
$lang['Hide'] = 'Skrij';
-$lang['Anyway only webmasters can see this tab and never administrators.'] = 'Samo skrbnik lahko vidi ta jezicek.';
-$lang['Apply action'] = 'Potrdi akcijo';
-$lang['Apply selected corrections'] = 'Potrdi izbrane popravke';
-$lang['Apply to sub-albums'] = 'Potrdi na vsemi pod-albumi';
-$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Ali res želite namestiti posodobitev ? Potrebno je preveriti, ce nova verzija ne zahteva odstranitev trenutno namešcene.';
-$lang['Are you sure you want to delete this plugin?'] = 'Ali res želite odstraniti vticnik?';
-$lang['Are you sure you want to install this plugin?'] = 'Ali res želite namestiti vticnik?';
-$lang['Associate to album'] = 'Associate to album';
-$lang['associate to group'] = 'associate to group';
-$lang['Associated'] = 'Associated';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'Kakorkoli, ta zavihek je viden le skrbnikom, administratorjem pa ne.';
+$lang['Apply action'] = 'Uporabi dejanje';
+$lang['Apply selected corrections'] = 'Uporabi izbrane popravke';
+$lang['Apply to sub-albums'] = 'Uporabi na vseh pod-albumih';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Ali res želite namestiti posodobitev ? Potrebno je preveriti, Äe nova razliÄica ne zahteva odstranitev trenutno nameÅ¡cene.';
+$lang['Are you sure you want to delete this plugin?'] = 'Ali res želite odstraniti ta vtiÄnik?';
+$lang['Are you sure you want to install this plugin?'] = 'Ali res želite namestiti ta vtiÄnik?';
+$lang['Associate to album'] = 'Poveži z albumom';
+$lang['associate to group'] = 'poveži s skupino';
+$lang['Associated'] = 'Povezano';
$lang['Authorize users to add comments on selected albums'] = 'Avtoriziraj uporabnike za dodajanje komentarjev na izbranih albumih';
$lang['Authorized'] = 'Avtoriziran';
$lang['Automatic correction'] = 'Avtomatski popravki';
-$lang['automatic order'] = 'avtomatsko sortiranje';
+$lang['automatic order'] = 'avtomatsko razvrÅ¡Äanje';
$lang['Available only with HTML format'] = 'Na voljo le v HTML obliki';
-$lang['average time'] = 'povprecen cas';
-$lang['Batch Manager'] = 'Paketni upravljalec';
+$lang['average time'] = 'povpreÄen Äas';
+$lang['Batch Manager'] = 'Paketni upravljalnik';
$lang['between'] = 'med';
$lang['Bound Theme'] = 'Povezana tema';
$lang['By %s'] = 'Po %s';
$lang['By rank'] = 'Po oceni';
-$lang['%s has been successfully updated.'] = '%s je bil uspešno posodobljen.';
+$lang['%s has been successfully updated.'] = '%s je bil uspešno posodobljen.';
$lang['%s photos can not be regenerated'] = '%s slik se ne da regenerirat';
$lang['%s photos have been regenerated'] = '%s slike so bile regenerirane';
-$lang['(this tag will be deleted)'] = '(ta znacka bo odstranjena)';
+$lang['(this tag will be deleted)'] = '(ta oznaka bo odstranjena)';
$lang['... or '] = '... ali ';
-$lang['Add tags'] = 'Dodaj znacke';
-$lang['Add to caddie'] = 'Add to caddie';
-$lang['All extensions are up to date.'] = 'Vse razširitve so posodobljene.';
+$lang['Add tags'] = 'Dodaj oznake';
+$lang['Add to caddie'] = 'Dodaj v košarico';
+$lang['All extensions are up to date.'] = 'Vse razširitve so posodobljene.';
$lang['All languages are up to date.'] = 'Vsi jeziki so posodobljeni.';
-$lang['All plugins are up to date.'] = 'Vsi vticniki so posodobljeni.';
+$lang['All plugins are up to date.'] = 'Vsi vtiÄniki so posodobljeni.';
$lang['All themes are up to date.'] = 'Vse teme so posodobljene.';
-$lang['Allowed file types: %s.'] = 'Dovoljeni tipi datotek so: %s.';
-$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Prišlo je do napake med ekstrahiranjem. Prosim preverite pravice datotek, vaše piwigo inštalacije.<br><a href="%s">Za prikaz loga, kliknite tukaj.</a>.';
-$lang['An error has occured during upgrade.'] = 'Prišlo je do napake med nadgrajevanjem.';
-$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Približna maksimalna resolucija: %dM pik (to je %dx%d pik).';
-$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = ' Privzeto bo Piwigo ustvaril nove web slike iz HD locljivosti vaših slik.';
-
-
+$lang['Allowed file types: %s.'] = 'Dovoljene vrste datotek so: %s.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Med razširjanjem je prišlo do napake. Prosimo preverite pravice datotek vaše piwigo namestitve.<br>Prikaži <a href="%s"> dnevnik napak</a>.';
+$lang['An error has occured during upgrade.'] = 'Med nadgradnjo je prišlo do napake .';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Približna maksimalna resolucija: %dM pik (to je %dx%d pik).';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = ' Privzeto bo Piwigo ustvaril nove spletne slike iz vaÅ¡ih slik visoke loÄljivosti.';
$lang['Can\'t connect to server.'] = 'Ne morem vzpostaviti povezave s strežnikom.';
$lang['Can\'t create temporary file.'] = 'Ne morem ustvariti zaÄasne datoteke.';
$lang['Check all'] = 'Preveri vse';
-$lang['Choose an action'] = 'Izberi akcijo';
+$lang['Choose an action'] = 'Izberi dejanje';
$lang['Create'] = 'Ustvari';
$lang['created'] = 'ustvarjeno';
$lang['%d days'] = '%d dnevi';
@@ -258,4 +255,720 @@ $lang['default values'] = 'privzete vrednosti';
$lang['default'] = 'privzeto';
$lang['directories + files'] = 'imeniki + datoteke';
$lang['display'] = 'prikaz';
+$lang['Added by %s'] = 'Dodal';
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Photoshop Lightroom je program, ki je namenjen upravljanju velikega števila digitalnih fotografij ter za kasnejše urejanje.';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture je zmogljivo orodje za izboljšavo fotografij in za upravljanje velikih knjižnic na Mac sistemih';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture je namenjen profesionalnim fotografom hkrati pa vsebuje iPhoto preprostost';
+$lang['Applications'] = 'Aplikacije';
+$lang['Activate comments'] = 'OmogoÄi komentarje';
+$lang['%d week'] = '%d teden';
+$lang['%d weeks'] = '%d tednov';
+$lang['%d year'] = '%d leto';
+$lang['%d years'] = '%d let';
+$lang['%s ago'] = '%d nazaj';
+$lang['%s in the future'] = '%s naprej';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '%u uporabniki imajo samodejno dovoljenje ker pripadajo odobreni skupini';
+$lang['A locked gallery is only visible to administrators'] = 'Zaklenjeno galerijo lahko vidijo le Administratorji';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = '<em>Piwigo za iOS</em> je aplikacija, ki vam omogoÄi povezavo z vaÅ¡o Piwigo galerijo preko iOS naprave (iPhone, iPad ali iPod Touch) . Ustvarite nove albume in naložite veÄ fotografij hkrati.';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = '<em>Piwigo za Android</em> je aplikacija, ki vam omogoÄi povezavo z vaÅ¡o Piwigo galerijo preko Andriod naprave. Ustvarite nove albume in naložite veÄ fotografij hkrati.';
+$lang['%d physicals'] = ' %d fiziÄen';
+$lang['%d month'] = '%d mesec';
+$lang['%d months'] = '%d mesecev';
+$lang['%d day'] = '%d dni';
+$lang[' and %d virtuals'] = ' in %d navidezen';
+$lang['ERROR'] = 'NAPAKA';
+$lang['Discover album:'] = 'RaziÅ¡Äi album:';
+$lang['Drag to re-order'] = 'Klikni in spusti za spreminjanje vrstnega reda';
+$lang['Downloads'] = 'Prenosi';
+$lang['Download,'] = 'Prenesi';
+$lang['Crop'] = 'Izreži';
+$lang['Current name'] = 'Trenutno ime';
+$lang['Database synchronization with files'] = 'Sinhroniziranje podatkovne baze z datotekami';
+$lang['Confirm merge'] = 'Potrdi spajanje';
+$lang['Classic display'] = 'KlasiÄen prikaz';
+$lang['Apply watermark if height is bigger than'] = 'Vstavi vodni žig, Äe je viÅ¡ina veÄja kot';
+$lang['Apply watermark if width is bigger than'] = 'Vstavi vodni žig, Äe je Å¡irina veÄja kot';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = 'Privzeto je srediÅ¡Äe pozornosti umeÅ¡Äena na sredino fotografije.';
+$lang['Choose an option'] = 'Izberi možnost.';
+$lang['Check integrity'] = 'Preverjanje integritete.';
+$lang['Check for upgrade failed for unknown reasons.'] = 'Preverjanje nadgradnje neuspešno zaradi neznanega razloga.';
+$lang['Check for upgrade'] = 'Preveri za nadgradnjo';
+$lang['Check for updates'] = 'Preveri za posodobitve';
+$lang['Check automatic corrections'] = 'Preveri avtomatske popravke';
+$lang['Change Admin Colors'] = 'Spremeni administratorsko barvno paleto';
+$lang['Center of interest'] = 'SrediÅ¡Äe pozornosti';
+$lang['Cannot delete the old permalink !'] = 'Stari permalink ni mogoÄe izbrisati.';
+$lang['Cancel'] = 'Razveljavi';
+$lang['Can\'t read or extract archive.'] = 'Arhiva ni bilo mogoÄe prebrati ali razÅ¡iriti.';
+$lang['Can\'t download archive.'] = 'Arhiva ni bilo mogoÄe naložiti.';
+$lang['Caddie management'] = 'Upravljanje košarice';
+$lang['Caddie'] = 'Košarica';
+$lang['Available versions for'] = 'Na voljo razliÄice za';
+$lang['Available on'] = 'Na voljo na';
+$lang['Automatic sort order'] = 'Avtomatsko razvrÅ¡Äanje';
+$lang['Languages which need upgrade'] = 'Jeziki, ki potrebujejo posodobitev';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'Teme ni mogoÄe izbrisati ker se navezuje na drugo temo.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'Ni mogoÄe deaktivirati jezika, potrebujeÅ¡ vsaj en jezik.';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'Ni mogoÄe deaktivirati jezika, oznaÄiti moraÅ¡ nadomestni jezik';
+$lang['Invert'] = 'Obrni';
+$lang['Last import'] = 'Zadnji uvoz';
+$lang['Last revisions'] = 'Zadnja revizija';
+$lang['Level 1'] = 'Kontakti';
+$lang['Level 0'] = '---';
+$lang['Learn more'] = 'VeÄ o tem...';
+$lang['Last send'] = 'Nazadnje poslano';
+$lang['Last hit'] = 'Zadnji zadetek';
+$lang['Languages'] = 'Jeziki';
+$lang['Language has been successfully installed'] = 'Jezik je bil uspešno posodobljen';
+$lang['Landscape'] = 'Pokrajina';
+$lang['Instructions to use Piwigo'] = 'Navodila za uporabo Piwigo';
+$lang['Installed Themes'] = 'NameÅ¡Äene teme';
+$lang['Inactive Languages'] = 'Neaktivni jeziki.';
+$lang['Inactive Plugins'] = 'Neaktivni vtiÄniki.';
+$lang['Inactive Themes'] = 'Neaktivne teme';
+$lang['Install on your computer,'] = 'Namesti na svoj raÄunalnik';
+$lang['Installed Languages'] = 'NameÅ¡Äeni jeziki';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Ni mogoÄe deaktivirati teme, potrebna je vsaj Å¡e ena tema.';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'VkljuÄi podatke o zgodovini (Opozorilo: presežena je lahko strežniÅ¡ka pomnilniÅ¡ka omejitev)';
+$lang['Information data registered in database'] = 'Podatki Informacij zabeleženi v podatkovni bazi';
+$lang['Informations'] = 'Informacije';
+$lang['Install'] = 'Namesti';
+$lang['Image Quality'] = 'kakovost slike';
+$lang['Impossible automatic correction'] = 'Avtomatski popravek ni mogoÄ';
+$lang['Images manual order was saved'] = 'RoÄni vrstni red slik shranjen';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'Teme ni mogoÄe aktivirati, manjka nadrejena tema';
+$lang['Image id'] = 'id slike';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'ÄŒe HD ni na voljo in je trenutna spletna velikost veÄja kot pomanjÅ¡ana dimenzija bo Piwigo umaknil sliko kot HD in kreiral pomanjÅ¡ano spletno sliko iz nje.';
+$lang['Height'] = 'Višina';
+$lang['Features include gallery browsing, album creation and photo upload.'] = 'Dodatki vsebujejo možnosti za brskanje po galeriji, kreiranje albumov in nalaganje fotografij.';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = 'Za velikosti slik z izrezom, kot npr. "Kvadrat", bo Piwigo poskuÅ¡al kar najbolje vkljuÄiti srediÅ¡Äe pozornosti';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'ÄŒas izvajanja je prekoraÄen, postopek se mora nadaljevati (Preostali Äas: %sekund)';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'ÄŒas izvajanja je potekel, postopek se mora nadaljevati (Preostali Äas: %sekund)';
+$lang['Graphics Library'] = 'GrafiÄna knjižnica';
+$lang['Groups and users'] = 'Skupine in uporabniki';
+$lang['High definition'] = 'Visoka loÄljivost (HD)';
+$lang['High definition enabled'] = 'Visoka loÄljivost omogoÄena';
+$lang['History'] = 'Zgodovina';
+$lang['Hit'] = 'Zadetek';
+$lang['Hour'] = 'Ura';
+$lang['Hoverbox display'] = 'Hoverbox prikaz';
+$lang['I decide to update anyway'] = 'Vseeno nadaljuj s posodobitvijo';
+$lang['IP'] = 'IP';
+$lang['If you encounter problems or have any question, please send a message to'] = 'ÄŒe naletiÅ¡ na težavo ali imaÅ¡ kakrÅ¡nokoli vpraÅ¡anje, prosim poÅ¡lji sporoÄilo na';
+$lang['Ignore All'] = 'Prezri vse';
+$lang['Ignore selected anomalies'] = 'Prezri oznaÄene nepravilnosti';
+$lang['Ignore this update'] = 'Prezri to posodobitev';
+$lang['File upload stopped by extension'] = 'Nalaganje datoteke ustavljeno zaradi konÄnice';
+$lang['File/directory read error'] = 'Napaka pri branju Datoteke/Mape';
+$lang['Find a new representant by random'] = 'PoiÅ¡Äi nakljuÄno sliÄico za album';
+$lang['Follow Orientation'] = 'Sledi orientaciji';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'SledeÄi vtiÄniki morda niso združljivi z novo verzijo Piwigo:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'SledeÄe preobleke morda niso združljive z novo verzijo Piwigo:';
+$lang['Forbid this language to users'] = 'Uporabnikom prepreÄi uporabo tega jezika';
+$lang['Forbid this theme to users'] = 'Uporabnikom prepreÄi uporabo te preobleke';
+$lang['Forbidden'] = 'Prepovedano';
+$lang['Form'] = 'Obrazec';
+$lang['GD library is missing'] = 'GD knjižnica ni nameÅ¡Äena';
+$lang['GD version'] = 'GD razliÄica';
+$lang['Gallery title'] = 'Naslov galerije';
+$lang['Gallery unlocked'] = 'Galerija je odklenjena';
+$lang['Generate multiple size images'] = 'Ustvari slike razliÄnih velikosti';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'OmogoÄi dovoljenje za pisanje (chmod 777) na "%s" mapi v korenu vaÅ¡e Piwigo namestitve';
+$lang['File'] = 'Datoteka';
+$lang['Extensions Update'] = 'Posodobitev razširitev';
+$lang['FTP + Synchronization'] = 'FTP + Sinhronizacija';
+$lang['Failed to write file to disk'] = 'Napaka pri zapisu datoteke na disk';
+$lang['Edit ranks'] = 'Urejanje uvrstitvenih nivojev';
+$lang['Edit selected tags'] = 'Uredi izbrane oznake';
+$lang['Edit tags'] = 'Uredi oznake';
+$lang['Element'] = 'Predmet';
+$lang['Element type'] = 'Tip predmeta';
+$lang['Email administrators when a comment is deleted'] = 'E-mail skrbnikom, ko je komentar izbrisan';
+$lang['Email administrators when a comment is modified'] = 'E-mail skrbnikom, ko je komentar spremenjen';
+$lang['Email admins when a comment requires validation'] = 'E-mail skrbnikom, ko komentar potrebuje potrditev';
+$lang['Email admins when a new user registers'] = 'E-mail skrbnikom, ob registraciji novega uporabnika';
+$lang['Email admins when a valid comment is entered'] = 'E-mail skrbnikom, ko je objavljen veljaven komentar';
+$lang['Environment'] = 'Okolje';
+$lang['Error list'] = 'Seznam napak';
+$lang['Error on file "%s" : %s'] = 'Napaka v datoteki "%s" : %s ';
+$lang['Error when sending email to %s [%s].'] = 'Napaka pri pošiljanju e-pošte za: %s [%s].';
+$lang['Errors caption'] = 'Legende napak';
+$lang['Everybody'] = 'Vsi';
+$lang['Exif extension not available, admin should disable exif use'] = 'Exif dodatek ni na voljo, skrbnik naj ga onemogoÄi';
+$lang['Extend for templates'] = 'Razširi predloge';
+$lang['Delete multiple size images'] = 'IzbriÅ¡i slike veÄih velikosti';
+$lang['Display options'] = 'Možnosti prikaza';
+$lang['Dissociate from album'] = 'LoÄi od albuma';
+$lang['Dissociated'] = 'LoÄi';
+$lang['Do you want to activate anyway?'] = 'ĹËelite vseeno aktivirati?';
+$lang['Does not represent'] = 'Ni sliÄica za';
+$lang['Dump Database'] = 'Odloži podatkovno bazo';
+$lang['Duplicate'] = 'Podvoji';
+$lang['Duplicate selected tags'] = 'Podvoji izbrane oznake';
+$lang['Duplicates'] = 'Podvojeni';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'NAPAKA: TA VTIČNIK MANJKA VENDAR JE NAMEĹ ČEN! ODSTRANITE GA ZDAJ.';
+$lang['Edit album permissions'] = 'Uredi dovoljenja albuma';
+$lang['Edit photo'] = 'Uredi sliko';
+$lang['Edit photo information'] = 'Uredi informacije o sliki';
+$lang['Default comments order'] = 'Privzeti vrstni red komentarjev';
+$lang['Default display'] = 'Privzeti prikaz';
+$lang['Default photos order'] = 'Privzeti vrstni red slik';
+$lang['Default user cannot be deleted'] = 'Privzetega uporabnika se ne da izbrisati';
+$lang['Default user does not exist'] = 'Privzeti uporabnik ne obstaja';
+$lang['No photo selected, %d photos in current set'] = 'OznaÄene ni nobene fotografije, %d fotografije v trenutnem nizu';
+$lang['No photo can be deleted'] = 'Ni fotografij, ki bi jih bilo mogoÄe izbrisati';
+$lang['No photo in the current set.'] = 'V tem nizu ni fotografij';
+$lang['No mail to send.'] = 'Ni maila, ki bi ga lahko poslali';
+$lang['No group selected, no action possible.'] = 'OznaÄena ni nobena skupina, izvesti ni mogoÄe nobenega ukaza';
+$lang['No group is permitted to see this private album'] = 'Nobena skupina nima dovoljenja za ogled tega privatnega albuma';
+$lang['No members to manage'] = 'Ni Älanov za upravljanje';
+$lang['No order field selected'] = 'Ni oznaÄenega vrstnega reda polj';
+$lang['No photo in this album'] = 'V tem albumu ni fotografij';
+$lang['New tag'] = 'Nova oznaka';
+$lang['No destination tag selected'] = 'OznaÄena ni bila ustrezna oznaka';
+$lang['No file was uploaded'] = 'Nobena datoteka ni bila naložena';
+$lang['No display'] = 'Ni prikaza';
+$lang['New photos were added'] = 'Nove fotografije bodo dodane';
+$lang['New parent album'] = 'Nov starševski album';
+$lang['New photos added'] = 'Dodane so bile nove fotografije';
+$lang['New Version'] = 'Nova verzija';
+$lang['New name'] = 'Novo ime';
+$lang['Name of the duplicate'] = 'Ime duplikata';
+$lang['Name'] = 'Ime';
+$lang['Miscellaneous'] = 'RazliÄno';
+$lang['Missing Plugins'] = 'Manjka vtiÄnik';
+$lang['Modify information'] = 'Spremeni informacije';
+$lang['Missing a temporary folder'] = 'Manjka zaÄasna mapa';
+$lang['Month'] = 'Mesec';
+$lang['Move'] = 'Premakni';
+$lang['Move albums'] = 'Premakni albume';
+$lang['Move to album'] = 'Premakni v album';
+$lang['Multiple Size'] = 'VeÄ strani';
+$lang['Minimum privacy level'] = 'Minimalni nivo zasebnosti';
+$lang['Minimum width'] = 'Minimalna Å¡irina';
+$lang['Minimum height'] = 'Minimalna višina';
+$lang['Metadata synchronized from file'] = 'Metapodatki so bili sinhronizirani z datoteko';
+$lang['Merge tags'] = 'Združi oznake';
+$lang['Metadata synchronization results'] = 'Rezultati sinhronizacije metapodatkov';
+$lang['Merge selected tags'] = 'Združi oznaÄene oznake';
+$lang['Merge selected groups'] = 'Združi oznaÄene skupine';
+$lang['Menu Management'] = 'Meni';
+$lang['Members'] = 'ÄŒlani';
+$lang['Maximum width'] = 'Maksimalna Å¡irina';
+$lang['Main "guest" user status is incorrect'] = 'Status osnovnega uporabnika "Gost" je napaÄen';
+$lang['Main "webmaster" user does not exist'] = 'Osnoven "webmaster" uporabnik ne obstaja';
+$lang['Main "webmaster" user status is incorrect'] = 'Osnoven "webmaster" uporabniÅ¡ki status je napaÄen';
+$lang['Make this theme available to users'] = 'Potrdi dostopnost te teme uporabnikom';
+$lang['Make this language available to users'] = 'Potrdi dostopnost tega jezika vsem uporabnikom';
+$lang['Maintenance'] = 'Vzdrževanje';
+$lang['Main Page'] = 'Glavna stran';
+$lang['Manage'] = 'Upravljaj';
+$lang['Manage authorizations for selected albums'] = 'Upravljaj avtorizacije za izbrane albume';
+$lang['Manage Permissions'] = 'Upravljaj dovoljenja';
+$lang['Manage permissions for user "%s"'] = 'Upravljaj dovoljenja za uporabnika "%s"';
+$lang['Manage permissions for group "%s"'] = 'Upravljaj dovoljenja za skupino "%s"';
+$lang['Manage photo ranks'] = 'Upravljanje uvrstitve fotografij';
+$lang['Manage photos'] = 'Upravljaj fotografije';
+$lang['Manage tags'] = 'Urejanje oznak';
+$lang['Manage the members'] = 'Urejanje Älanov';
+$lang['Manage this set of %d photos'] = 'Upravljal ta sklop %d fotografij.';
+$lang['Maximum height'] = 'Maksimalna višina';
+$lang['Manual order'] = 'RoÄni vrstni red';
+$lang['Maximum file size: %sB.'] = 'Maksimalna velikost datoteke: %sB.';
+$lang['Mail sent to %s [%s].'] = 'e-mail poslan za %s [%s].';
+$lang['Link all album photos to some existing albums'] = 'Poveži vse fotografije albuma v nek že obstojeÄi album';
+$lang['Link all album photos to a new album'] = 'Poveži vse fotografije tega albuma v nov album';
+$lang['Level 8'] = 'Administratorji';
+$lang['Level 2'] = 'Prijatelji';
+$lang['Level 4'] = 'Družina';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'V vaÅ¡i php.ini datoteki, je dodeljen upload_max_filsezie (%B) veÄji kot post_max_size(%B), spremeniti morate nastavitve!';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'Ostanite v stiku s projektom Piwigo, naroÄite se na obvestila o spremembah in novostih. Poslali vam bomo obvestilo z informacijami o novih verzijah programa Piwigo, ki lahko vkljuÄujejo tudi pomembne varnostne popravke in ostale pomembnejÅ¡e posodobitve. Obvestila poÅ¡iljamo samo takrat, ko je to nujno potrebno.';
+$lang['Include display of recent photos grouped by dates'] = 'VkljuÄi pogled novejÅ¡ih fotografij združenih po datumu';
+$lang['Linked albums'] = 'Povezani albumi';
+$lang['Main "guest" user does not exist'] = 'Osnoven uporabnik "gost" ne obstaja';
+$lang['Mail content'] = 'Vsebina e-pošte';
+$lang['Mail address is obligatory for all users'] = 'E-mail naslov je obvezen za vse uporabnike';
+$lang['Locked'] = 'Zaklenjeno';
+$lang['Lock gallery'] = 'Zakleni galerijo';
+$lang['Lock albums'] = 'Zakleni albume';
+$lang['Lock'] = 'Zakleni';
+$lang['Local'] = 'Lokalno';
+$lang['List'] = 'Seznam';
+$lang['test'] = 'test';
+$lang['test this remote site'] = 'preveri to oddaljeno stran';
+$lang['the forum'] = 'forum';
+$lang['the wiki'] = 'wiki';
+$lang['top left corner'] = 'zgornji levi kot';
+$lang['top right corner'] = 'zgornji desni kot';
+$lang['total time'] = 'skupen Äas';
+$lang['unit mode'] = 'enojen naÄin';
+$lang['unknown'] = 'nepoznan';
+$lang['unset'] = 'razveljavi nastavitev';
+$lang['update the database from files'] = 'posodobi podatkovno datoteko z datotekami';
+$lang['user "%s" added'] = 'uporabnikr "%s" dodan';
+$lang['user_status_admin'] = 'Administrator';
+$lang['user_status_generic'] = 'Splošen';
+$lang['user_status_guest'] = 'Gost';
+$lang['user_status_normal'] = 'Uporabnik';
+$lang['user_status_webmaster'] = 'Skrbnik';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'obiskovalci se morajo vpisati in imeti ustrezna dovoljenja za ogled tega albuma';
+$lang['width must be a number superior to'] = 'Å¡irina mora biti Å¡tevilo veÄje od';
+$lang['wrong filename'] = 'napaÄno ime datoteke';
+$lang['randomly represented'] = 'nakljuÄna sliÄica albuma';
+$lang['ranks'] = 'uvrstitve';
+$lang['reduce to single existing albums'] = 'zmanjÅ¡aj na en sam obstojeÄ album';
+$lang['registered users'] = 'registrirani uporabniki';
+$lang['registration date'] = 'datum registracije';
+$lang['remove author'] = 'odstrani avtorja';
+$lang['remove creation date'] = 'odstrani datum nastanka';
+$lang['remove tags'] = 'odstrani oznake';
+$lang['remove this filter'] = 'odstrani ta filter';
+$lang['remove title'] = 'odstrani ime';
+$lang['selection'] = 'izbor';
+$lang['set to'] = 'nastavi na';
+$lang['show details'] = 'prikaži podrobnosti';
+$lang['simple visitors'] = 'preprosti obiskovalci';
+$lang['singly represented'] = 'stalna sliÄica albuma';
+$lang['status'] = 'stanje';
+$lang['sub-albums'] = 'pod-albumi';
+$lang['synchronize files metadata with database photos informations'] = 'sinhroniziraj podatkovno bazo slik z metapodatki datotek';
+$lang['synchronize files structure with database'] = 'sinhroniziraj strukturo datotek s podatkovno bazo';
+$lang['target'] = 'cilj';
+$lang['none'] = 'noben';
+$lang['nothing'] = 'niÄ';
+$lang['number of miniaturized photos'] = 'Å¡tevilo ustvarjenih sliÄic';
+$lang['on'] = 'na';
+$lang['on the %d selected photos'] = 'na %d izbranih slikah';
+$lang['only directories'] = 'samo direktoriji';
+$lang['only perform a simulation (no change in database will be made)'] = 'izvedi le simulacijo (v podatkovni bazi ne bo prišlo do sprememb)';
+$lang['other'] = 'ostalo';
+$lang['overrides existing values with empty ones'] = 'prepiÅ¡e obstojeÄe vrednosti s praznimi';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader je ime za <em>Piwigo prenaÅ¡alnik</em>. Na vaÅ¡em raÄunalniku pLoader pripravi vaÅ¡e slike in jih prenese v vaÅ¡o Piwigo foto galerijo.';
+$lang['pending validation'] = 'na Äakanju odobritve';
+$lang['photos added in the database'] = 'slike dodate v podatkovno bazo';
+$lang['photos candidates for metadata synchronization'] = 'možne slike za sinhronizacijo metapodatkov';
+$lang['photos deleted from the database'] = 'slike izbrisane iz podatkovne baze';
+$lang['photos informations synchronized with files metadata'] = 'informacije slik sinhronizirane z metapodatki datotek';
+$lang['photos per page'] = 'slik na stran';
+$lang['photos updated in the database'] = 'slike posodobljene v podatkovni bazi';
+$lang['pixels'] = 'piksli';
+$lang['private'] = 'zasebno';
+$lang['public'] = 'javno';
+$lang['even already synchronized photos'] = 'tudi že sinhronizirane slike';
+$lang['existing album'] = 'obstojeÄ album';
+$lang['first photo added on %s'] = 'prva slika dodana: %s';
+$lang['for the file format'] = 'za obliko datoteke';
+$lang['for this file format'] = 'za to obliko datoteke';
+$lang['hide details'] = 'skrij podrobnosti';
+$lang['high'] = 'visoko';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto je privzet upravljalec slik na MacOSX. Piwigo izvozni vtiÄnik vam omogoÄa da ustvarite nove albume in jih izvozite neposredno iz iPhoto v vaÅ¡o Piwigo foto galerijo.';
+$lang['include child albums'] = 'vkljuÄi podrejene albume';
+$lang['include photos with lower privacy level'] = 'vkljuÄi slike z nižjim nivojem zasebnosti';
+$lang['jump to album'] = 'pojdi v album';
+$lang['jump to photo'] = 'pojdi na sliko';
+$lang['leave'] = 'pusti';
+$lang['manage album photos'] = 'upravljaj slike albuma';
+$lang['manage sub-albums'] = 'upravljaj pod-albume';
+$lang['manual order'] = 'raoÄno razvrstitev';
+$lang['middle'] = 'sredina';
+$lang['modified'] = 'spremenjeno';
+$lang['new'] = 'novo';
+$lang['no write access'] = 'ni dostopa za pisanje';
+$lang['Your configuration settings are saved'] = 'Vaše nastavitve so shranjene';
+$lang['Zoom'] = 'PoveÄava';
+$lang['[%s] Visit album %s'] = '[%s] ObiÅ¡Äi album %s';
+$lang['[NBM] Problems or questions'] = '[NBM] Težave ali vprašanja';
+$lang['add a new watermark'] = 'dodaj nov vodni žig';
+$lang['administrators'] = 'skrbniki';
+$lang['any visitor can see this album'] = 'vsak obiskovalec lahko vidi ta album';
+$lang['apply automatic sort order'] = 'uveljavi samodejno razvrÅ¡Äanje';
+$lang['between %.2f and %.2f'] = 'med %.2f in %.2f';
+$lang['between %d and %d pixels'] = 'med %d in %d pikslov';
+$lang['bottom left corner'] = 'spodnji levi kot';
+$lang['bottom right corner'] = 'spodnji desni kot';
+$lang['cancel manual order'] = 'prekliÄi roÄno razvrÅ¡Äanje';
+$lang['create a new site'] = 'Ustvari novo stran';
+$lang['custom'] = 'Po meri';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam je napreden, brezplaÄen program za delo z digitalnimi fotografijami na sistemih Linux, Windows in MacOSX.';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam je namenjen fotografom, ki želijo pregledovati, upravljati, urejati, izboljÅ¡ati, organizirati, oznaÄevati in dati svoje fotografije v skupno rabo.';
+$lang['dissociate from group'] = 'loÄi od skupine';
+$lang['errors during synchronization'] = 'napake med sinhronizacijo';
+$lang['With no virtual album'] = 'Brez navideznega albuma';
+$lang['X Position'] = 'X Pozicija';
+$lang['X Repeat'] = 'X ponavljanje';
+$lang['Y Position'] = 'Y pozicija';
+$lang['Year'] = 'Leto';
+$lang['You are running on development sources, no check possible.'] = 'Uporabljate razvojno kodo, preverjanje ni na voljo.';
+$lang['You are running the latest version of Piwigo.'] = 'Uporabljate zadnjo razliÄico Piwigo';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Uporabljate prenaÅ¡alnik brskalnika. Preizkusite <a href="%s">Flash prenaÅ¡alnik</a> Äe želite.';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Uporabljate Flash prenašalnik. Če imate težave poizkusite z <a href="%s">Brskalnikovim prenašalnikom</a>. ';
+$lang['You can activate only one mobile theme.'] = 'Aktivirate lahko le eno mobilno temo.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Posodobitev na Piwigo %s je možna brez nadgradnje na Piwigo %s (priporoÄeno).';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'Ne morete doloÄiti privzetega razvrÅ¡Äanja slik ker imate v vaÅ¡i lokalni nastavitveni datoteki nastavljeno razvrÅ¡Äanje po vaÅ¡i meri.';
+$lang['You cannot delete your account'] = 'VaÅ¡ega raÄuna ne morete izbrisati.';
+$lang['You cannot move an album in its own sub album'] = 'Albuma ne morete premakniti v njegov pod-album';
+$lang['You have %d orphan tags: %s.'] = 'Imate %d osirotelih oznak: %s.';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'DoloÄili ste <i>$conf[\'order_by\']</i> v vaÅ¡i lokalni nastavitveni datoteki. Ta parameter je opuÅ¡Äen zato ga prosimo odstranite ali spremenite v: <i>$conf[\'order_by_custom\']</i> !';
+$lang['You have subscribed to receiving notifications by mail.'] = 'NaroÄili ste se na prejemanje novic na e-poÅ¡to.';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'Odjavili ste obveÅ¡Äanje po e-poÅ¡ti.';
+$lang['You need to confirm deletion'] = 'Izbris morate potrditi';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'Razmislite o nadgradnji vašega sistema! Le tako boste lahko uporabljali vse možnosti aplikacije. V nasprotnem primeru aplikacija morda ne bo delovala ali ne bo delovala pravilno.';
+$lang['Visit Gallery'] = 'ObiÅ¡Äi galerijo';
+$lang['Visit Piwigo project website'] = 'ObiÅ¡Äite spletno stan projekta Piwigo';
+$lang['Visit language site'] = 'ObiÅ¡Äite stran z jeziki';
+$lang['Visit plugin site'] = 'ObiÅ¡Äite stran z vtiÄniki';
+$lang['Visit theme site'] = 'ObiÅ¡Äite stran z temami';
+$lang['Visited %d times'] = 'Obiskano %d ';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'OPOZORILO! Kot kaže, ta vtiÄnik ni v skladu z vaÅ¡o verzijo Piwigo.';
+$lang['Waiting'] = 'ÄŒakanje';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'Opozorilo: naroÄanje ali odjavljanje bo poslalo obvestilo na e-poÅ¡to uporabnikov';
+$lang['Watermark'] = 'Vodni žig';
+$lang['Web Form'] = 'Spletni obrazec';
+$lang['Webmaster cannot be deleted'] = 'Skrbnika ne morete izbrisati';
+$lang['Webmaster status is required.'] = 'Status skrbnika je obvezen.';
+$lang['Week starts on'] = 'Teden se zaÄne z';
+$lang['Who can see these photos?'] = 'Kdo lahko vidi te slike?';
+$lang['Who can see this photo?'] = 'Kdo lahko vidi to sliko?';
+$lang['Width'] = 'Å irina';
+$lang['With blank value, gallery title will be used'] = 'ÄŒe je prazno bo uporabljen naslov galerije';
+$lang['With no album'] = 'Brez albuma';
+$lang['With no tag'] = 'Brez oznake';
+$lang['User "%s" created with "%s" like password'] = 'Uporabnik "%s" ustvarjen z geslom "%s"';
+$lang['User %s [%s] added.'] = 'Uporabnik %s [%s] dodan.';
+$lang['User %s [%s] was added to the subscription list.'] = 'Uporabnik %s [%s] dodan na seznam naroÄnikov.';
+$lang['User %s [%s] was not added to the subscription list.'] = 'Uporabnik %s [%s] ni dodan na seznam naroÄnikov.';
+$lang['User %s [%s] was not removed from the subscription list.'] = 'Uporabnik %s [%s] ni bil odstranjen s seznama naroÄnikov.';
+$lang['User %s [%s] was removed from the subscription list.'] = 'Uporabnik %s [%s] je bil odstranjen s seznama naroÄnikov.';
+$lang['User comments validation'] = 'Potrditev komentarjev uporabnikov';
+$lang['User list'] = 'Seznam uporabnikov';
+$lang['User status'] = 'Stanje uporabnika';
+$lang['Users'] = 'Uporabniki';
+$lang['Validate'] = 'Potrdi';
+$lang['Validation'] = 'Potrditev';
+$lang['Version'] = 'RazliÄica';
+$lang['View in gallery'] = 'Poglej v galeriji';
+$lang['Virtual Links'] = 'Navidezne povezave';
+$lang['Virtual album'] = 'Navidezni album';
+$lang['Virtual album added'] = 'Navidezni album dodan';
+$lang['Virtual album deleted'] = 'Navidezni album izbrisan';
+$lang['Virtual album name'] = 'Ime navideznega albuma';
+$lang['Virtual albums to move'] = 'Navidezni album za premikanje';
+$lang['Unable to dump database.'] = 'Ne morem zavreÄi podatkovne baze';
+$lang['Uncheck all'] = 'OdznaÄi vse';
+$lang['Unknown upload error'] = 'Nepoznana napaka pri nalaganju';
+$lang['Unlock gallery'] = 'Odkleni galerijo';
+$lang['Unlocked'] = 'Odklenjeno';
+$lang['Unsubscribe from notification by mail'] = 'Odjavi obvestila na e-pošto';
+$lang['Unsubscribed'] = 'Odjavljen';
+$lang['Update All'] = 'Posodobi vse';
+$lang['Update Complete'] = 'Posodobitev konÄana';
+$lang['Update albums informations'] = 'Posodobi informacije albumov';
+$lang['Update in progress... Please wait.'] = 'Posodabljanje je v teku... Prosimo poÄakajte.';
+$lang['Update photos information'] = 'Posodobi informacije slik';
+$lang['Update to Piwigo %s'] = 'Posodobi na Piwigo %s';
+$lang['Updates'] = 'Posodobitve';
+$lang['Upload'] = 'Naloži';
+$lang['Upload Photos'] = 'Naloži slike';
+$lang['Uploaded Photos'] = 'Naložene slike';
+$lang['Use the default photo sort order (defined in the configuration file)'] = 'Uporabi privzeto razvrÅ¡Äanje slik (doloÄeno v konfiguracijski datoteki)';
+$lang['Used metadata'] = 'Metadata uporabljen';
+$lang['User'] = 'Uporabnik';
+$lang['This site already exists'] = 'Ta stran že obstaja';
+$lang['This theme was not designed to be directly activated'] = 'Ta tema ni bila narejena tako da bi jo neposredno aktivirali.';
+$lang['Thumbnail'] = 'SliÄica';
+$lang['Thumbnails generation in progress...'] = 'Ustvarjanje sliÄic je v teku.....';
+$lang['Time'] = 'ÄŒas';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'Čas za pošiljanje pošte je omejen. Ostala pošta je bila prezrta.';
+$lang['Title'] = 'Naslov';
+$lang['To send ?'] = 'Poslati?';
+$lang['To subscribe'] = 'NaroÄiti se';
+$lang['To unsubscribe'] = 'Odjaviti se';
+$lang['Toggle \'default group\' property'] = 'Preobrni lstnosti "privzete skupine"';
+$lang['Tools'] = 'Orodja';
+$lang['Two updates are available'] = 'Na voljo stad ve posodobitvi';
+$lang['Type here the author name'] = 'Tu vpišite ime avtorja';
+$lang['Type here the name of the new group'] = 'Tu vpišite ime nove skupine';
+$lang['Type here the title'] = 'Tu vpišite naslov';
+$lang['Type in a search term'] = 'Vpišite iskalni niz';
+$lang['Unable to check for upgrade.'] = 'Ne morem preveriti za nadgradnjo';
+$lang['This name is already used by another group.'] = 'To ime že uporablja druga skupina';
+$lang['This is a minor update, with only bug corrections.'] = 'To je le manjÅ¡a posodobitev s popravki hroÅ¡Äev';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'Naložena datoteka presega upload_max_filesize direktivo v php.ini , ki je: %sB';
+$lang['The uploaded file was only partially uploaded'] = 'Naložena datoteka je bila prenešena le delno';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'Naložena datoteka presega post_max_size direktivo v php.ini , ki je: %sB';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'Skrbnik vas je dodal med naroÄnike prejemnikov obvestil na e-poÅ¡to';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'Skrbnik vas je odjavil s seznama prejemnikov obvestil na e-pošto';
+$lang['The whole page'] = 'Cela stran';
+$lang['The whole set'] = 'Cel nabor';
+$lang['Themes'] = 'Teme';
+$lang['Themes which need upgrade'] = 'Teme ki potrebujejo nadgradnjo';
+$lang['There is no available subscribers to mail.'] = 'Ni naroÄnikov ki bi jih obveÅ¡Äali na e-mail.';
+$lang['There is no group in this gallery.'] = 'V tej galeriji ni skupine';
+$lang['There is no other language available.'] = 'Na voljo ni drugega jezika.';
+$lang['There is no other plugin available.'] = 'Na voljo ni drugih vtiÄnikov.';
+$lang['There is no other theme available.'] = 'Na voljo ni drugih tem.';
+$lang['This album contains %d photos, added between %s and %s.'] = 'Ta album vsebuje %d slik, dodanih med %s in %s.';
+$lang['This album contains %d photos, added on %s.'] = 'Ta album vsebuje %d slik, dodanih na dan %s.';
+$lang['This album contains no photo.'] = 'Ta album ne vsebuje slik.';
+$lang['This group will be set to default'] = 'Ta skupina bo uporabljena kot privzeta.';
+$lang['This group will be unset to default'] = 'Ta skupina ne bo veÄ uporabljena kot privzeta.';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'To je pomembna posodobitev z <a href="%s">novimi, zanimivimi funkcijami</a>.';
+$lang['Storage album'] = 'Album za shranjevanje';
+$lang['Templates configuration has been recorded.'] = 'Nastavitev predloge je bila zabeležena';
+$lang['The %d following tags were deleted'] = 'SledeÄe %d oznake so bile izbrisane';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'Piwigo vtiÄnik za izvoz vam omogoÄa da ustvarite albume in izvozite slike.';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'Piwigo Objavni vtiÄnik vam omogoÄa da izvozite in sinhronizirate slike iz programa Lightroom neposredno v Piwigo foto galerijo.';
+$lang['The anomaly will be ignored until next application version'] = 'Nepravilnost bo spregledana do naslednje razliÄice programa.';
+$lang['The center of interest is the most meaningful zone in the photo.'] = 'SrediÅ¡Äe pozornosti je najbolj pomembno obmoÄje na fotografiji';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'Ne morem dostopati do datoteke ali direktorija (ali ne obstaja ali pa ni pravic za dostop)';
+$lang['The following tag was deleted'] = 'SledeÄa oznaka je bila izbrisana';
+$lang['The gallery URL is not valid.'] = 'URL galerije ni pravilen';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'Ime skupine ne sme vsebovati "or" in ne sme biti prazno.';
+$lang['The name of an album must not be empty'] = 'Ime albuma ne sme biti prazno';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'Imena direktorijev in datotek morajo vsebovati le Ärke, Å¡tevilke, "-", "_" ali "."';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'Å tevilo komentarjev na stran mora biti med 5 in 50.';
+$lang['The original image quality must be a number between %d and %d'] = 'Izvirna kakovost slike mora biti Å¡tevilo med %d in %d';
+$lang['The original maximum height must be a number between %d and %d'] = 'Izvirna maksimalna višina mora biti število med %d in %d';
+$lang['The original maximum width must be a number between %d and %d'] = 'Izvirna maksimalna Å¡irina mora biti Å¡tevilo med %d in %d';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'Ime stalne povezave (permalink) mora biti sestavljeno iz: a-z, A-Z, 0-9, "-", "_" ali "/". Ne sme biti numeriÄna in ne sme se zaÄeti s Å¡tevilko ki ji sledi "-"';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'Dimenzija slike bo pomanjšana na %dx%d pikslov';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'Naložena datoteka presega direktivo MAX_FILE_SIZE , ki je bila doloÄena v HTML obrazcu';
+$lang['Subscribe'] = 'NaroÄi se';
+$lang['Subscribe %s'] = 'NaroÄi %s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'NaroÄi %s se na Piwigo Obvestilne novice';
+$lang['Subscribe to notification by mail'] = 'NaroÄi se na obvestila na e-poÅ¡to';
+$lang['Subscribe/unsubscribe users'] = 'NaroÄi/odjavi uporabnike';
+$lang['Subscribed'] = 'NaroÄen';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'Prikaz seznama naroÄnikov je možen le Äe obstajajo nove vsebine za obvestila.';
+$lang['Sum of rates'] = 'Vsota ocen';
+$lang['Summary'] = 'Povzetek';
+$lang['Support'] = 'Podpora';
+$lang['Switch to clear or dark colors for administration'] = 'S klikom preklopi med Äisto ali temnejÅ¡o preobleko za admin panel';
+$lang['Synchronize'] = 'Sinhroniziraj';
+$lang['Synchronize metadata'] = 'Sinhroniziraj metadata';
+$lang['Tag "%s" already exists'] = 'Oznaka "%s" že obstaja';
+$lang['Tag "%s" is now a duplicate of "%s"'] = 'Oznaka "%s" je sedaj dvojnik od "%s"';
+$lang['Tag "%s" was added'] = 'Oznaka "%s" je bila dodana';
+$lang['Tag selection'] = 'Izbira oznak';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Oznake <em>%s</em> združene v oznako <em>%s</em>';
+$lang['Templates'] = 'Predloge';
+$lang['Send connection settings by email'] = 'Pošlji mi prijavne informacije na e-pošto';
+$lang['Remove from caddie'] = 'Odstrani iz košarice';
+$lang['Status of user "%s" updated'] = 'Status uporabnika "%s" posodobljen';
+$lang['Send mail to users'] = 'Pošlji pošto uporabnikom';
+$lang['Set as default language for unregistered and new users'] = 'Nastavi za privzet jezik za neregistrirane in nove uporabnike';
+$lang['Set as default theme for unregistered and new users'] = 'Nastavi kot privzeto temo za neregistrirane in nove uporabnike';
+$lang['Set author'] = 'Nastavi avtorja';
+$lang['Set creation date'] = 'Nastavi datum nastanka';
+$lang['Set title'] = 'Nastavi ime';
+$lang['Settings'] = 'Nastavitve';
+$lang['Sharpen'] = 'OStrenje';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell je odprtokodni program za delo z digitalnimi fotografijami in je privzeti program za organiziranje fotografij v Linux distribuciji Ubuntu in Fedora.';
+$lang['Show info'] = 'Prikaži info';
+$lang['Show menubar'] = 'Prikaži menijsko vrstico';
+$lang['Simulation'] = 'Simulacija';
+$lang['Site manager'] = 'Upravljalec strani';
+$lang['Some themes and plugins may be not available yet.'] = 'Nekatere teme in vtiÄniki morda Å¡e niso na voljo.';
+$lang['Some upgrades are available for extensions.'] = 'Na voljo je nekaj posodobitev za razširitve.';
+$lang['Source tag'] = 'Izvorna oznaka';
+$lang['Start Upload'] = 'ZaÄni prenos';
+$lang['Start pLoader and add your photos.'] = 'Zaženi pLoader in dodaj svoje fotografije.';
+$lang['Statistics'] = 'Statistika';
+$lang['Status'] = 'Stanje';
+$lang['Select a file'] = 'Izberi datoteko';
+$lang['Select a zone with your mouse to define a new center of interest.'] = 'Z miÅ¡ko izberite podroÄje, da doloÄite novo polje zanimivosti slike';
+$lang['Select an album'] = 'Izberite album';
+$lang['Select at least one album'] = 'Izberite vsaj en album';
+$lang['Select at least one comment'] = 'Izberite vsaj en komentar';
+$lang['Select at least one photo'] = 'Izberite vsaj eno sliko';
+$lang['Select at least one user'] = 'Izberite vsaj enega uporabnika';
+$lang['Select at least two tags for merging'] = 'Izberite vsaj dve oznaki za združitev';
+$lang['Select files'] = 'Izberite datoteke';
+$lang['Select groups...'] = 'Izberite skupine';
+$lang['Select recipients'] = 'Izberite prejemnike';
+$lang['Select the destination tag'] = 'Izberite ciljno oznako';
+$lang['Select users...'] = 'Izberite uporabnike';
+$lang['Select:'] = 'Izberite:';
+$lang['Selection'] = 'Izbor';
+$lang['Send'] = 'Pošlji';
+$lang['Send an information email to group members'] = 'PoÅ¡lji obvestilni email Älanom skupine';
+$lang['Send mail as'] = 'Pošlji pošto kot';
+$lang['Send mail on HTML format'] = 'Pošlji pošto v HTML obliki';
+$lang['Theme has been successfully installed'] = 'Predloga je bila uspeÅ¡no nameÅ¡Äena.';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'RazliÄica %s [%s] ki je nameÅ¡Äena ni v skladu z zahtevano razliÄico [%s]';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'TA VTIČNIK JE SEDAJ ŽE DEL PIVIGO PROGRAMA. ODSTRANITE VTIČNIK!';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = 'Da bi vaÅ¡e slike prenesli iz digiKam v Piwigo preprosto namestite digiKam in Kipi-vtiÄnike.';
+$lang['Uninstall'] = 'Odstrani';
+$lang['Uninstalled Plugins'] = 'NenameÅ¡Äeni vtiÄniki';
+$lang['You might go to plugin list to install and activate it.'] = 'Za namestitev in aktiviranje pojdi na seznam vtiÄnikov';
+$lang['Representant'] = 'SliÄica albuma';
+$lang['Representation of albums'] = 'SliÄica albuma';
+$lang['Representative'] = 'SliÄica albuma';
+$lang['Represents'] = 'je sliÄica za';
+$lang['Reset ignored updates'] = 'Ponastaviti prezrte posodobitve';
+$lang['Resize'] = 'Spremeni velikost';
+$lang['Resize after upload'] = 'Spremeni velikost po nalaganju';
+$lang['Restore'] = 'Obnovi';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'Obnovi privzete nastavitve. Nastavitve vtiÄnikov bodo izgubljene.';
+$lang['Save Settings'] = 'Shrani nastavitve';
+$lang['Save Template Directory'] = 'Shrani imenik predlog';
+$lang['Save manual order'] = 'Shrani roÄno razvrstitev';
+$lang['Save order'] = 'Shrani razvrstitev';
+$lang['Save to permalink history'] = 'Shrani v zgodovino stalnih povezav (permalinks-ov)';
+$lang['Save visits in history for'] = 'Shrani obiske v zgodovino za';
+$lang['Search for new images in the directories'] = 'IÅ¡Äi nove slike v direktorijih';
+$lang['Searching...'] = 'Iskanje poteka...';
+$lang['Section'] = 'Razdelek';
+$lang['See you soon,'] = 'Se vidimo kmalu,';
+$lang['See you soon.'] = 'Se vidimo kmalu.';
+$lang['Random photo'] = 'NakljuÄna slika';
+$lang['Rate date'] = 'Datum ocene';
+$lang['Rated %d times, score : %.2f'] = 'Å tevilo ocen: %d , skupna ocena : %.2f';
+$lang['Rating'] = 'Ocena';
+$lang['Rating by guests'] = 'Ocene gostov';
+$lang['Ratio'] = 'Razmerje';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (RemoteGallery client for Android) je odprtokodni (GPL v3) Piwigo odjemalec za Android platformo';
+$lang['Read Piwigo Documentation'] = 'Preberi Piwigo dokumentacijo';
+$lang['Refresh'] = 'Osveži';
+$lang['Refresh photo set'] = 'Osveži komplet slik';
+$lang['Reinitialize check integrity'] = 'Ponovi preverjanje celovitosti';
+$lang['Reject'] = 'Zavrni';
+$lang['Released on'] = 'Datum izdaje';
+$lang['Remote'] = 'Oddaljeno';
+$lang['Remove all filters'] = 'Odstrani vse filtre';
+$lang['Rename'] = 'Preimenuj';
+$lang['Repair and optimize database'] = 'Popravi in optimiziraj podatkovno bazo';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = 'Zamenjava izvirne predloge s prirejeno predlogo iz direktorija template-extension';
+$lang['Replacers (customized templates)'] = 'Nadomestki (prirejene predloge)';
+$lang['Portrait'] = 'PokonÄno';
+$lang['Position'] = 'Položaj';
+$lang['Posted %s on %s'] = 'Objavljeno %s na %s';
+$lang['Predefined filter'] = 'Prednastavljeni filter';
+$lang['Preferences'] = 'Izbire';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'ÄŒas za pripravo seznama uporabnikov katerim bo poslan e-mail je omejen. OStalih uporabnikov ni na seznamu.';
+$lang['Privacy level'] = 'Nivo zasebnosti';
+$lang['Privacy level set to "%s"'] = 'Nivo zasebnosti nastavljen na "%s"';
+$lang['Private'] = 'Zasebno';
+$lang['Properties'] = 'Lastnosti';
+$lang['Public'] = 'Javno';
+$lang['Public / Private'] = 'Javno / Zasebno';
+$lang['Purge compiled templates'] = 'Izbriši sestavljene predloge';
+$lang['Purge history detail'] = 'Izbriši podrobnosti zgodovine';
+$lang['Purge history summary'] = 'Izbriši povzetek zgodovine';
+$lang['Purge never used notification feeds'] = 'Izbriši nikoli uporabljene vire obvestil';
+$lang['Purge search history'] = 'Izbriši zgodovino iskanja';
+$lang['Purge sessions'] = 'Izbriši seje';
+$lang['Purge user cache'] = 'Izbriši predpomnilnik (cache) uporabnika';
+$lang['Quick Local Synchronization'] = 'Hitra lokalna sinhronizacija';
+$lang['Piwigo Announcements Newsletter'] = 'Piwigo obvestila';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Piwigo Objavni vtiÄnik za Lightroom';
+$lang['Piwigo Update'] = 'Piwigo posodobitev';
+$lang['Piwigo Uploader'] = 'Piwigo prenašalnik';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo ne more prenesti nadgradnje s strežnika';
+$lang['Piwigo configuration'] = 'Piwigo nastavitve';
+$lang['Piwigo export plugin for Aperture'] = 'Piwigo izvoz vtiÄnika za Aperture';
+$lang['Piwigo export plugin for iPhoto'] = 'Piwigo izvoz vtiÄnika za iPhoto';
+$lang['Piwigo for Android'] = 'Piwigo za Android';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Pivigo za iOS (iPhone, iPad, iPod Touch)';
+$lang['Piwigo publish plugin for Shotwell'] = 'Piwigo objavni vtiÄnik za Shotwell';
+$lang['Piwigo publish plugin for digiKam'] = 'Piwigo objavni vtiÄnik za digiKam';
+$lang['Piwigo version'] = 'Piwigo razliÄica';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'Prosimo preverite doveljenja za "plugins" direktorij in poddirektorije (chmod)';
+$lang['Please select at least two groups'] = 'Prosimo iberite vsaj dve skupini';
+$lang['Please wait...'] = 'Prosimo poÄakajte...';
+$lang['Plugin has been successfully copied'] = 'Ta vtiÄnik je bil uspeÅ¡no kopiran.';
+$lang['Plugin list'] = 'Seznam VtiÄnikov';
+$lang['Plugins'] = 'VtiÄniki';
+$lang['Plugins which need upgrade'] = 'VtiÄniki, ki jih je potrebno nadgraditi';
+$lang['Permalink %s is already used by album %s'] = 'Permalink %s je že uporabljen za album %s.';
+$lang['Permalink history'] = 'Zgodovina stalnih povezav (Permalinks-ov)';
+$lang['Permalinks'] = 'Stalne povezave';
+$lang['Permission denied'] = 'Dostop zavrnjen';
+$lang['Permission granted'] = 'Dostop omogoÄen';
+$lang['Permission granted for groups'] = 'Dostop omogoÄen za skupino';
+$lang['Permission granted for users'] = 'Dostop omogoÄen za uporabnike';
+$lang['Permission granted thanks to a group'] = 'Dostop omogoÄen na raÄun (zaradi) skupine';
+$lang['Permission management'] = 'Upravljanje dovoljenj';
+$lang['Permissions'] = 'Dovoljenja';
+$lang['Photo %s of %s'] = 'Slika %s od %s';
+$lang['Photo Page'] = 'Stran slik';
+$lang['Photo Properties'] = 'Lastnosti slike';
+$lang['Photo informations updated'] = 'Informacije o sliki posodobljene';
+$lang['Photo name'] = 'Ime slike';
+$lang['Photo sizes with crop'] = 'Velikosti slik z obrezovanjem';
+$lang['Photo unreachable or no support'] = 'Slika ni dosegljiva ali pa je v nepodprti obliki';
+$lang['Photos'] = 'Slike';
+$lang['Photos generation in progress...'] = 'Izdelava slik v teku...';
+$lang['Piwigo Administration'] = 'Piwigo Administracija';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'prikaži najveÄ informacij (dodani albumi in slike, izbrisani albumi in slike)';
+$lang['Original Size'] = 'Originalna velikost';
+$lang['Original file : %s'] = 'Izvirna datoteka : %s';
+$lang['Original templates'] = 'Izvirna preobleka';
+$lang['Orphan tags deleted'] = 'OSirotele oznake izbrisane';
+$lang['Other plugins'] = 'Na voljo so drugi vtiÄniki';
+$lang['Other private albums'] = 'Drugi zasebni albumi';
+$lang['Overall'] = 'Pregled';
+$lang['Page banner'] = 'Naslovni napis strani';
+$lang['Page end'] = 'Konec strani';
+$lang['Pages seen'] = 'Ogledanih strani';
+$lang['Panorama'] = 'Panorama';
+$lang['Parameter'] = 'Nastavitve';
+$lang['Parameters'] = 'Parametri';
+$lang['Parent album'] = 'Nadrejeni album';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Manjka potrditev gesla. Prosimo potrdite izbrano geslo.';
+$lang['Password is missing. Please enter the password.'] = 'Manjka geslo. Prosimo vpišite geslo.';
+$lang['Path'] = 'Pot';
+$lang['Pending Comments'] = 'Komentarji na Äakanju';
+$lang['Permalink'] = 'Permalink (stalna povezava)';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'Permalink %s je bil prej uporabljen za album %s. Najprej ga izbrišite iz zgodovine stalnih povezav ';
+$lang['None'] = 'Noben';
+$lang['Not cropped correctly?'] = 'Ni pravilno obrezano?';
+$lang['Notification'] = 'Obvestilo';
+$lang['Notify administrators when a comment is'] = 'Obvestilo administratorju ko je komentar';
+$lang['Number of albums per page'] = 'Å tevilo albumov na stran';
+$lang['Number of comments per page'] = 'Å tevilo komentarjev na stran';
+$lang['Number of downloads'] = 'Å tevilo prenosov';
+$lang['Number of rates'] = 'Å tevilo ocen';
+$lang['Number of thumbnails to create'] = 'Å tevilo sliÄic za kreiranje';
+$lang['Numeric identifier : %d'] = 'Å tevilÄna oznaka: %d';
+$lang['Obsolete Plugins'] = 'Zastareli vtiÄniki';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = 'V Linuxu namestite Shotwell in nato aktivirajte možnost Piwigo objavljanje.';
+$lang['Only private albums are listed'] = 'Navedeni so le zasebni albumi';
+$lang['Opacity'] = 'Prosojnost';
+$lang['Operating system'] = 'Operacijski sistem';
+$lang['Operation in progress'] = 'Obdelava v teku';
+$lang['Optimizations have been completed with some errors.'] = 'Optimizacija se je zakljuÄila z nekaj napakami';
+$lang['Optional URL keyword'] = 'Opcijska URL kljuÄna beseda';
+$lang['Options'] = 'Možnosti';
+$lang['Order of menubar items has been updated successfully.'] = 'Razvrstitev elementov menijske vrstice je bila uspešno posodobljena';
+$lang['No photo selected, no action possible.'] = 'Ker ni izbrana nobena slika, ni možno nobeno dejanje.';
+$lang['No results'] = 'Ni rezultatov';
+$lang['No user to send notifications by mail.'] = 'Noben uporabnik ne bo obveÅ¡Äen preko e-poÅ¡te.';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'Stiskanje fotografij pred nalaganjem je onemogoÄeno zaradi uporabe GD grafiÄne knjižnice.';
+$lang['Select at least one tag'] = 'Izberite vsaj eno oznako';
+$lang['Basic settings'] = 'Osnovne nastavitve';
+$lang['General'] = 'Splošno';
+$lang['Mail theme'] = 'Videz e-pošte';
+$lang['%d of %d users selected'] = 'Izbranih %d od %d uporabnikov';
+$lang['(filtered from %s total users)'] = '(filtrirano od %s vseh uporabnikov)';
+$lang['All %d users are selected'] = 'Izbranih vseh %d uporabnikov';
+$lang['Change password'] = 'Spremeni geslo';
+$lang['Change username'] = 'Spremeni uporabniško ime';
+$lang['Last visit on %s, %s.'] = 'Zadnji obisk %s, %s.';
+$lang['Loading...'] = 'Nalaganje...';
+$lang['No matching user found'] = 'Ne najdem ustreznih uporabnikov';
+$lang['No user selected of %d users'] = 'Izbran ni noben uporabnik od %d uporabnikov';
+$lang['No user selected, no action possible.'] = 'Izbran ni noben uporabnik, nobeno dejanje ni mogoÄe';
+$lang['Password updated'] = 'Geslo posodobljeno';
+$lang['Registered on %s, %s.'] = 'Registrirani %s, %s.';
+$lang['Show %s users'] = 'Prikaži %s uporabnikov';
+$lang['Showing %s to %s of %s users'] = 'Prikazanih %s do %s od %s uporabnikov';
+$lang['Update user'] = 'Posodobi uporabnika';
+$lang['User %s added'] = 'Uporabnik %s dodan';
+$lang['User %s updated'] = 'Uporabnik %s posodobljen';
+$lang['Users modified'] = 'Uporabnik spremenjen';
+$lang['on the %d selected users'] = ' na %d izbranih uporabnikih';
+$lang['Close user details'] = 'Zapri uporabniške podate';
+$lang['Open user details'] = 'Odpri uporabniška navodila';
+$lang['close'] = 'zapri';
?> \ No newline at end of file
diff --git a/language/sl_SI/common.lang.php b/language/sl_SI/common.lang.php
index 27dfcb024..0d5488991 100644
--- a/language/sl_SI/common.lang.php
+++ b/language/sl_SI/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Slovenšcina [SI]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=453
Author: Piwigo team
Author URI: http://piwigo.org
@@ -35,59 +35,59 @@ $lang_info['code'] = 'sl';
$lang_info['zero_plural'] = true;
$lang['%d Kb'] = '%d Kb';
-$lang['%d album updated'] = '%d kategorija popravljena';
-$lang['%d albums updated'] = '%d kategorij popravljenih';
+$lang['%d album updated'] = '%d album popravljena';
+$lang['%d albums updated'] = '%d albumov popravljenih';
$lang['%d comment to validate'] = '%d komentar za preveriti';
$lang['%d comments to validate'] = '%d komentarjev za preveriti';
-$lang['%d new comment'] = '%d novi komentar';
+$lang['%d new comment'] = '%d nov komentar';
$lang['%d new comments'] = '%d novih komentarjev';
$lang['%d comment'] = '%d komentar';
$lang['%d comments'] = '%d komentarjev';
$lang['%d hit'] = '%d zadetek';
$lang['%d hits'] = '%d zadetkov';
-$lang['%d new user'] = '%d novi uporabnik';
+$lang['%d new user'] = '%d nov uporabnik';
$lang['%d new users'] = '%d novih uporabnikov';
$lang['About'] = 'Vizitka';
-$lang['All tags'] = 'Vse oznaÄbe';
-$lang['Any tag'] = 'Katerakoli oznaÄba';
+$lang['All tags'] = 'Vse oznake';
+$lang['Any tag'] = 'Katerakoli oznaka';
$lang['At least one listed rule must be satisfied.'] = 'Vsaj eno pravilo mora biti izpolnjeno.';
$lang['Author'] = 'Avtor';
-$lang['Albums'] = 'Kategorije';
-$lang['Album'] = 'Kategorija';
+$lang['Albums'] = 'Albumi';
+$lang['Album'] = 'Album';
$lang['Close this window'] = 'Zapri okno';
$lang['Confirm Password'] = 'Potrdi geslo';
-$lang['Connection settings'] = 'Nastavitve povezave';
+$lang['Connection settings'] = 'Prijavni podatki';
$lang['Contact webmaster'] = 'Kontaktiraj skrbnika';
$lang['Create a new account'] = 'Ustvari nov raÄun';
$lang['Created on'] = 'Ustvarjeno';
$lang['Creation date'] = 'Ustvarjeno';
$lang['Current password is wrong'] = 'NapaÄno geslo';
$lang['Dimensions'] = 'Dimenzije';
-$lang['Display'] = 'Zaslon';
+$lang['Display'] = 'Prikaz';
$lang['%d new photo'] = '%d nova slika';
$lang['%d new photos'] = '%d novih slik';
-$lang['Complete RSS feed (photos, comments)'] = 'RSS vir (slike, komentarji)';
+$lang['Complete RSS feed (photos, comments)'] = 'Poln RSS vir (slike, komentarji)';
$lang['Login'] = 'Prijava';
$lang['Each listed rule must be satisfied.'] = 'Vsa pravila morajo biti izpolnjena.';
$lang['Email address'] = 'E-pošta';
$lang['Enter your personnal informations'] = 'Vnesite svoje osebne podatke';
-$lang['Error sending email'] = 'Napaka pri pošiljanju pošte';
+$lang['Error sending email'] = 'Napaka pri pošiljanju e-pošte';
$lang['File name'] = 'Ime datoteke';
$lang['File'] = 'Datoteka';
$lang['Filesize'] = 'Velikost datoteke';
$lang['Filter and display'] = 'Filter in prikaz';
$lang['Filter'] = 'Filter';
-$lang['Forgot your password?'] = 'Si pozabil geslo?';
-$lang['Go through the gallery as a visitor'] = 'Obiskaj galerijo kot obiskovalec';
+$lang['Forgot your password?'] = 'Ste pozabili vaše geslo?';
+$lang['Go through the gallery as a visitor'] = 'Ogled galerije kot obiskovalec';
$lang['Help'] = 'PomoÄ';
$lang['Identification'] = 'Identifikacija';
-$lang['Photos only RSS feed'] = 'RSS vir (samo slike)';
+$lang['Photos only RSS feed'] = 'Slikovni RSS vir (samo slike)';
$lang['Keyword'] = 'KljuÄna beseda';
$lang['Links'] = 'Povezave';
-$lang['N/A'] = 'N/A';
+$lang['N/A'] = 'Ni na voljo';
$lang['New on %s'] = 'Nov na %s';
$lang['Notification'] = 'Obvestilo';
-$lang['Number of items'] = 'Å tevilo ';
+$lang['Number of items'] = 'Å tevilo predmetov ';
$lang['Original dimensions'] = 'Originalna velikost';
$lang['Password forgotten'] = 'Pozabljeno geslo';
$lang['Password'] = 'Geslo';
@@ -96,20 +96,20 @@ $lang['Posted on'] = 'Objavljeno';
$lang['Profile'] = 'Profil';
$lang['Quick connect'] = 'Hitra povezava';
$lang['RSS feed'] = 'RSS vir';
-$lang['Register'] = 'Registracija';
+$lang['Register'] = 'Registriraj se';
$lang['Registration'] = 'Registracija';
$lang['Unknown feed identifier'] = 'Neznan identifikator vira';
$lang['User comments'] = 'Komentarji uporabnika';
$lang['Username'] = 'Uporabniško ime';
-$lang['Visits'] = 'Obiski';
+$lang['Visits'] = 'Ogledov';
$lang['Webmaster'] = 'Skrbnik';
$lang['Week %d'] = 'Teden %d';
$lang['About Piwigo'] = 'O Piwigo';
-$lang['You are not authorized to access the requested page'] = 'Niste avtorizirani za dostop do zahtevane strani';
+$lang['You are not authorized to access the requested page'] = 'Za dostop do zahtevane strani nimate pooblastil';
$lang['add this photo to your favorites'] = 'dodaj sliko med svoje priljubljene';
$lang['Administration'] = 'Administracija';
$lang['all'] = 'vse';
-$lang['ascending'] = 'naraÅ¡Äujoce';
+$lang['ascending'] = 'naraÅ¡ÄajoÄe';
$lang['author(s) : %s'] = 'avtor(ji) : %s';
$lang['Expand all albums'] = 'Razširi vse kategorije';
$lang['posted after %s (%s)'] = 'naloženo po %s (%s)';
@@ -128,11 +128,11 @@ $lang['chronology_weekly_list'] = 'Tedenski seznam';
$lang['Click here if your browser does not automatically forward you'] = 'ÄŒe vas brskalnik ni preusmeril, kliknite tukaj.';
$lang['comment date'] = 'komentarji po datumih';
$lang['Comment'] = 'Komentar';
-$lang['Your comment has been registered'] = 'Vaš komentar je bil zabeležen';
+$lang['Your comment has been registered'] = 'Vaš komentar je bil vpisan';
$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Anti-flood sistem : prosim poÄakajte trenutek, preden oddate nov komentar';
-$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Vaš komentar ni bil zabeležen, saj ne ustreza validacijskim pravilom';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Vaš komentar NI bil vpisan, saj ne ustreza pravilom preverjanja';
$lang['An administrator must authorize your comment before it is visible.'] = 'Administrator mora pregledati vaš komentar, preden le-ta postane viden.';
-$lang['This login is already used by another user'] = 'Ta prijava je že uporabljena s strani drugega uporabnika';
+$lang['This login is already used by another user'] = 'Te prijavne podatke že uporablja drug uporabnik';
$lang['Comments'] = 'Komentarji';
$lang['Add a comment'] = 'Dodaj komentar';
$lang['created after %s (%s)'] = 'kreirano po %s (%s)';
@@ -141,25 +141,25 @@ $lang['created between %s (%s) and %s (%s)'] = 'kreirano med %s (%s) in %s (%s)'
$lang['created on %s'] = 'kreirano na %s';
$lang['Customize'] = 'Prilagodi';
$lang['Your Gallery Customization'] = 'Prilagodi svojo galerijo';
-$lang['Related tags'] = 'Sorodne oznaÄbe';
+$lang['Related tags'] = 'Sorodne oznake';
$lang['Reset'] = 'Ponastavi';
$lang['Retrieve password'] = 'Pridobi geslo';
$lang['Search rules'] = 'Iskalni kriteriji';
-$lang['Search tags'] = 'Iskalne oznaÄbe';
-$lang['Search'] = 'IÅ¡ci';
-$lang['display available tags'] = 'Prikaži možne oznaÄbe';
-$lang['Since'] = 'Odkar';
+$lang['Search tags'] = 'Iskalne oznake';
+$lang['Search'] = 'IÅ¡Äi';
+$lang['display available tags'] = 'Prikaži možne oznake';
+$lang['Since'] = 'Od';
$lang['Sort by'] = 'Uredi po';
$lang['Sort order'] = 'Urejeno po';
-$lang['Tag'] = 'OznaÄba';
-$lang['Tags'] = 'OznaÄbe';
-$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS viri omogoÄajo prijavo na dogodke te spletne strani, kot so: nove slike, nove kategorije, novi komentarji. Za uporabo je potreben RSS odjemalec.';
+$lang['Tag'] = 'Oznaka';
+$lang['Tags'] = 'Oznake';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS viri omogoÄajo prijavo na novosti te spletne strani, kot so: nove slike, novi albumi, novi komentarji. Za uporabo je potreben RSS odjemalec.';
$lang['Default'] = 'Privzeto';
$lang['delete this photo from your favorites'] = 'odstrani to sliko iz svojih priljubljenih';
-$lang['Delete'] = 'Odstrani';
+$lang['Delete'] = 'Izbriši';
$lang['descending'] = 'padajoÄe';
-$lang['Download'] = 'snami';
-$lang['Download this file'] = 'snami to datoteko';
+$lang['Download'] = 'prenesi';
+$lang['Download this file'] = 'prenesi to datoteko';
$lang['edit'] = 'uredi';
$lang['wrong date'] = 'napaÄen datum';
$lang['excluded'] = 'izkljuÄen';
@@ -167,7 +167,7 @@ $lang['Your favorites'] = 'Moje priljubljene';
$lang['display your favorites photos'] = 'prikaži moje priljubljene slike';
$lang['Favorites'] = 'Priljubljene';
$lang['First'] = 'Prva';
-$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Stran je v vzdrževanju. Prosim, oglasite se kasneje.';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Stran je v vzdrževanju. Prosim, poskusite kasneje.';
$lang['Page generated in'] = 'Stran naložena v';
$lang['guest'] = 'gost';
$lang['Hello'] = 'Pozdravljen';
@@ -177,9 +177,9 @@ $lang['display last user comments'] = 'Prikaži zadnje komentarje uporabnika';
$lang['customize the appareance of the gallery'] = 'prilagodi izgled galerije';
$lang['search'] = 'iÅ¡Äi';
$lang['Home'] = 'Domov';
-$lang['in this album'] = 'v tej kategoriji';
-$lang['in %d sub-album'] = 'v %d pod-kategoriji';
-$lang['in %d sub-albums'] = 'v %d pod-kategorijah';
+$lang['in this album'] = 'v tem albumu';
+$lang['in %d sub-album'] = 'v %d pod-albumu';
+$lang['in %d sub-albums'] = 'v %d pod-albumih';
$lang['included'] = 'vsebuje';
$lang['Invalid password!'] = 'NapaÄno geslo!';
$lang['Language'] = 'Jezik';
@@ -187,81 +187,75 @@ $lang['last %d days'] = 'zadnjih %d dnevih';
$lang['Last'] = 'Zadnji';
$lang['Logout'] = 'Odjava';
$lang['obligatory'] = 'obvezno';
-$lang['Maximum photo height'] = 'Maksimalna velikost slik';
-$lang['Maximum height must be a number superior to 50'] = 'Maksimalna velikost mora biti vecja od 50';
-$lang['Maximum photo width'] = 'Maksimalna dolžina slik';
-$lang['Most visited'] = 'Najbolj obiskana';
-$lang['display most visited photos'] = 'prikaži najbolj obiskane slike';
-$lang['The number of photos per page must be a not null scalar'] = 'Å tevilo slik na stran, mora biti ne prazno celo Å¡tevilo.';
+$lang['Most visited'] = 'NajveÄ ogledov';
+$lang['display most visited photos'] = 'prikaži najveÄkrat ogledane slike';
+$lang['The number of photos per page must be a not null scalar'] = 'Å tevilo slik na stran, mora biti celo Å¡tevilo, veÄje od niÄ.';
$lang['Number of photos per page'] = 'Å tevilo slik na stran';
$lang['Unknown identifier'] = 'Neznan';
$lang['New password'] = 'Novo geslo';
-$lang['Rate this photo'] = 'Glasuj';
+$lang['Rate this photo'] = 'Oceni to sliko';
$lang['Next'] = 'Naprej';
-$lang['no rate'] = 'brez glasa';
+$lang['no rate'] = 'brez ocene';
$lang['Photos posted within the last %d day.'] = 'Elementi naloženi znotraj zadnjega %d dneva.';
$lang['Photos posted within the last %d days.'] = 'Elementi naloženi znotraj zadnjih %d dni.';
$lang['password updated'] = 'geslo spremenjeno';
-$lang['Recent period must be a positive integer value'] = 'Novo obdobje more biti pozitivno celo Å¡tevilo';
+$lang['Recent period must be a positive integer value'] = 'Novo obdobje mora biti pozitivno celo Å¡tevilo';
$lang['photo'] = 'slika';
$lang['Click on the photo to see it in high definition'] = 'Za ogled v originalni velikosti, kliknite na sliko';
-$lang['Show file metadata'] = 'Prikaži mete podatke datoteke';
-$lang['Powered by'] = 'Narejeno z';
+$lang['Show file metadata'] = 'Prikaži meta podatke datoteke';
+$lang['Powered by'] = 'Narejeno s';
$lang['Preferences'] = 'Nastavitve';
$lang['Previous'] = 'Nazaj';
$lang['Random photos'] = 'NakljuÄne slike';
-$lang['display a set of random photos'] = 'prikaži množico nakljucno izbranih slik';
-$lang['Recent albums'] = 'Nove kategorije';
-$lang['display recently updated albums'] = 'prikaži na novo posodobljene kategorije';
-$lang['Recent period'] = 'Novo obdobje';
-$lang['Recent photos'] = 'Nove slike';
-$lang['display most recent photos'] = 'prikaži najbolj nove slike';
+$lang['display a set of random photos'] = 'prikaži množico nakljuÄno izbranih slik';
+$lang['Recent albums'] = 'Novi albumi';
+$lang['display recently updated albums'] = 'prikaži nedavno posodobljene albume';
+$lang['Recent period'] = 'Nedavno';
+$lang['Recent photos'] = 'Novejše slike';
+$lang['display most recent photos'] = 'prikaži najnovejše slike';
$lang['Redirection...'] = 'Preusmeritev...';
-$lang['Please, enter a login'] = 'Prosim, prijavite se';
+$lang['Please, enter a login'] = 'Prosimo, prijavite se';
$lang['login mustn\'t end with a space character'] = 'prijava se ne sme konÄati s presledkom';
$lang['login mustn\'t start with a space character'] = 'prijava se ne sme zaÄeti s presledkom';
$lang['this login is already used'] = 'ta uporabnik je že prijavljen';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'e-mail mora biti oblike xxx@yyy.eee (primer : jack@altern.org)';
-$lang['please enter your password again'] = 'prosim vnesite svoje geslo Å¡e enkrat';
-$lang['Auto login'] = 'Avtomatska prijava';
-$lang['remove this tag from the list'] = 'odstrani znaÄko iz seznama';
-$lang['representative'] = 'reprezentativen';
-$lang['Search for Author'] = 'Iskanje po avtorju';
-$lang['Search in albums'] = 'Iskanje po kategorijah';
-$lang['Search by date'] = 'Iskanje po datumo';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'e-mail mora biti oblike xxx@yyy.eee (primer : nekdo@domena.org)';
+$lang['Auto login'] = 'Samodejna prijava';
+$lang['remove this tag from the list'] = 'odstrani oznako s seznama';
+$lang['representative'] = 'sliÄica albuma';
+$lang['Search for Author'] = 'Iskanje avtorja';
+$lang['Search in albums'] = 'Iskanje v albumih';
+$lang['Search by date'] = 'Iskanje po datumu';
$lang['Date'] = 'Datum';
$lang['End-Date'] = 'KonÄni datum';
$lang['Kind of date'] = 'Oblika datuma';
$lang['Search for words'] = 'Iskanje po besedah';
$lang['Search for all terms'] = 'Iskanje po vseh izrazih';
$lang['Search for any term'] = 'Iskanje po kateremkoli izrazu';
-$lang['Empty query. No criteria has been entered.'] = 'Prazen niz. Vnesen ni bil niti eden kriterij.';
+$lang['Empty query. No criteria has been entered.'] = 'Prazen niz. Vnesen ni bil niti en kriterij.';
$lang['Search results'] = 'Rezultat iskanja';
-$lang['Search in sub-albums'] = 'Iskanje po podkategorijah';
-$lang['searched words : %s'] = 'iskalne besede : %s';
+$lang['Search in sub-albums'] = 'Iskanje po pod-albumih';
+$lang['searched words : %s'] = 'iskane besede : %s';
$lang['Contact'] = 'Kontakt';
-$lang['set as album representative'] = 'set as category representative';
-$lang['Maximum width must be a number superior to 50'] = 'Maksimalna dolžina mora biti veÄje od 50';
-$lang['display a calendar by creation date'] = 'prikaži kolendar po datumo nastanka';
-$lang['display all photos in all sub-albums'] = 'prikaži vse elemente v kategorijah in pod-kategorijah';
+$lang['set as album representative'] = 'nastavi kot sliÄico albuma';
+$lang['display a calendar by creation date'] = 'prikaži koledar po datumu nastanka';
+$lang['display all photos in all sub-albums'] = 'prikaži vse slike v vseh pod-albumih';
$lang['return to normal view mode'] = 'vrni se v normalni naÄin';
-$lang['display a calendar by posted date'] = 'prikaži kolendar po datumo odpošiljanja';
+$lang['display a calendar by posted date'] = 'prikaži kolendar po datumu objave';
$lang['Show number of comments'] = 'Prikaži število komentarjev';
$lang['Show number of hits'] = 'Prikaži število zadetkov';
$lang['slideshow'] = 'diaprojekcija';
$lang['stop the slideshow'] = 'ustavi diaprojekcijo';
$lang['Specials'] = 'Posebno';
$lang['SQL queries in'] = 'SQL povpraševanje v';
-$lang['display only recently posted photos'] = 'prikaži samo zadnje odposlane slike';
+$lang['display only recently posted photos'] = 'prikaži samo nedavno objavljene slike';
$lang['return to the display of all photos'] = 'vrni se v prikaz vseh slik';
$lang['the beginning'] = 'zaÄetek';
-$lang['Interface theme'] = 'Tema';
-$lang['Thumbnails'] = 'Predogled';
+$lang['Thumbnails'] = 'SliÄice';
$lang['Menu'] = 'Meni';
$lang['A comment on your site'] = 'Komentar na vaši strani';
$lang['today'] = 'danes';
$lang['Update your rating'] = 'Popravi svojo oceno';
-$lang['the username must be given'] = 'potrebno je uporabniško ime';
+$lang['the username must be given'] = 'zahtevano je uporabniško ime';
$lang['useful when password forgotten'] = 'uporabno, v primeru izgubljenega gesla';
$lang['Quick search'] = 'Hitro iskanje';
$lang['Connected user: %s'] = 'Prijavljeni uporabniki: %s';
@@ -269,16 +263,16 @@ $lang['IP: %s'] = 'IP: %s';
$lang['Browser: %s'] = 'Brskalnik: %s';
$lang['Author: %s'] = 'Avtor: %s';
$lang['Comment: %s'] = 'Komentar: %s';
-$lang['Comment by %s'] = 'Komentar za %s';
+$lang['Comment by %s'] = 'Komentiral %s';
$lang['User: %s'] = 'Uporabnik: %s';
$lang['Email: %s'] = 'E-pošta: %s';
$lang['Admin: %s'] = 'Administrator: %s';
$lang['Registration of %s'] = 'Prijavljenih %s';
-$lang['Album: %s'] = 'Kategorija: %s';
+$lang['Album: %s'] = 'Album: %s';
$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Nepravilen status uporabnika "guest", uporabljen bo privzeti status. Prosim obvestite skrbnika.';
-$lang['this email address is already in use'] = 'email uporablja že drug uporabnik';
-$lang['Album results for'] = 'Category results for';
-$lang['Tag results for'] = 'Rezultat za znaÄke';
+$lang['this email address is already in use'] = 'ta e-poštni naslov že uporablja drug uporabnik';
+$lang['Album results for'] = 'Rezultat albumov za';
+$lang['Tag results for'] = 'Rezultat oznak za';
$lang['from %s to %s'] = 'od %s do %s';
$lang['Play of slideshow'] = 'ZaÄni diaprojekcijo';
$lang['Pause of slideshow'] = 'Premor diaprojekcije';
@@ -302,7 +296,7 @@ $lang['month'][6] = "junij";
$lang['month'][7] = "julij";
$lang['month'][8] = "avgust";
$lang['month'][9] = "september";
-$lang['Not repeat the slideshow'] = 'Ne ponovi prezentacije';
+$lang['Not repeat the slideshow'] = 'Ne ponavljaj diaprojekcije';
$lang['Reduce diaporama speed'] = 'Zmanjšaj hitrost predvajanja';
$lang['Accelerate diaporama speed'] = 'PoveÄaj hitrost predvajanja';
$lang['Submit'] = 'Pošlji';
@@ -310,51 +304,51 @@ $lang['Yes'] = 'Da';
$lang['No'] = 'Ne';
$lang['%d photo'] = '%d slika';
$lang['%d photos'] = '%d slik';
-$lang['%d photo is also linked to current tags'] = '%d slika je pravtako povezana s trenutno znaÄko';
-$lang['%d photos are also linked to current tags'] = '%d slike so pravtako povezane s trenutnimi znaÄkami';
-$lang['display photos linked to this tag'] = 'Pokaži slike vezane na samo to oznaÄbo ';
-$lang['photos posted during the last %d days'] = 'slike naložene zadnjih %d dni';
+$lang['%d photo is also linked to current tags'] = '%d slika je prav tako povezana s trenutno oznako';
+$lang['%d photos are also linked to current tags'] = '%d slike so prav tako povezane s trenutnimi oznakami';
+$lang['display photos linked to this tag'] = 'Pokaži slike povezane s to oznako';
+$lang['photos posted during the last %d days'] = 'slike objavljene zadnjih %d dni';
$lang['Piwigo Help'] = 'Piwigo pomoÄ';
-$lang['Rank'] = 'Rang';
-$lang['group by letters'] = 'grupiraj po Ärkah';
+$lang['Rank'] = 'Zaporedje';
+$lang['group by letters'] = 'razvrsti po abecedi';
$lang['letters'] = 'Ärke';
-$lang['show tag cloud'] = 'show tags cloud';
-$lang['cloud'] = 'cloud';
-$lang['Reset to default values'] = 'Resetiraj na privzete vrednosti';
+$lang['show tag cloud'] = 'prikaži oznake v oblaku';
+$lang['cloud'] = 'oblak';
+$lang['Reset to default values'] = 'Ponastavi na privzete vrednosti';
$lang['delete all photos from your favorites'] = 'odstrani vse slike iz svojih priljubljenih';
$lang['Sent by'] = 'Poslano od';
-$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'PiÅ¡kotki so blokirani ali niso podprti s strani vaÅ¡ega brskalnika. Za prijavo je potrebno omogoÄiti piÅ¡kotke.';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'PiÅ¡kotki so blokirani ali pa jih vaÅ¡ brskalnik ne podpira. Za prijavo je potrebno omogoÄiti piÅ¡kotke.';
$lang['Edit a comment'] = 'Uredi komentar';
$lang['Are you sure?'] = 'Ali ste prepriÄani?';
-$lang['(!) This comment requires validation'] = '(!) Komentar potrebuje validacijo';
+$lang['(!) This comment requires validation'] = '(!) Komentar potrebuje potrditev';
$lang['Welcome'] = 'Dobrodošli';
-$lang['Welcome to your Piwigo photo gallery!'] = 'Dobrodošli v svoji Piwigo galeriji!';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Dobrodošli v vaši novi Piwigo galeriji!';
$lang['... or browse your empty gallery'] = '... ali prebrskaj svojo prazno galerijo';
-$lang['... or please deactivate this message, I will find my way by myself'] = '... ali prosim deaktivirajte to sporoÄilo , I will find my way by myself';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... ali prosim deaktivirajte to sporoÄilo , znaÅ¡el se bom sam';
$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Zdravo %s, tvoja Piwigo galerija je prazna!';
$lang['I want to add photos'] = 'Želim dodati slike';
$lang['Manage this user comment: %s'] = 'Uredi komentar uporabnika: %s';
-$lang['Email address is missing. Please specify an email address.'] = 'Manjka e-pošta. Prosim navedite svojo e-pošto.';
+$lang['Email address is missing. Please specify an email address.'] = 'ManjkajoÄi e-poÅ¡tni naslov. Prosim navedite svojo e-poÅ¡tni naslov.';
$lang['This author modified following comment:'] = 'Ta uporabnik je uredil naslednji komentar:';
$lang['This author removed the comment with id %d'] = 'Ta uporabnik je odstranil komentar z id-jem %d';
-$lang['html tags are not allowed in login'] = 'pri prijavi niso dovoljene html znaÄke';
+$lang['html tags are not allowed in login'] = 'pri prijavi niso dovoljene html oznake';
$lang['%d rates'] = '%d toÄk';
$lang['Rating score'] = 'Ocena';
$lang['Invalid username or email'] = 'Nepravilno uporabniško ime ali e-pošta';
-$lang['Password reset is not allowed for this user'] = 'Poenostavite gesla ni možna za tega uporabnika';
-$lang['User "%s" has no email address, password reset is not possible'] = 'Uporabnik "%s" nima e-pošte, zato poenostavitev gesla ni možna';
-$lang['Someone requested that the password be reset for the following user account:'] = 'Nekdo je zahteval poenostavite gesla za uporabniÅ¡ki raÄun:';
-$lang['Username "%s" on gallery %s'] = 'Uporabnik "%s" za album %s';
-$lang['To reset your password, visit the following address:'] = 'Za poenostavitev gesla, obiÅ¡Äite naslednji spletni naslov:';
+$lang['Password reset is not allowed for this user'] = 'Ponastavitev gesla za tega uporabnika ni možna ';
+$lang['User "%s" has no email address, password reset is not possible'] = 'Uporabnik "%s" nima e-pošte, zato ponastavitev gesla ni možna';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Nekdo je zahteval ponastavite gesla za uporabniÅ¡ki raÄun:';
+$lang['Username "%s" on gallery %s'] = 'Uporabnik "%s" galerije %s';
+$lang['To reset your password, visit the following address:'] = 'Za ponastavitev gesla, obiÅ¡Äite naslednji spletni naslov:';
$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'ÄŒe je bila to napaka, preprosto prezrite to sporoÄilo in niÄ se ne bo zgodilo.';
-$lang['Password Reset'] = 'Poenostavitev gesla';
+$lang['Password Reset'] = 'Ponastavitev gesla';
$lang['Check your email for the confirmation link'] = 'Preverite e-pošto za potrditev';
$lang['Invalid key'] = 'Nepravilen kljuÄ';
$lang['The passwords do not match'] = 'Gesli se ne ujemata';
-$lang['Your password has been reset'] = 'Vaše geslo je bilo poenostavljeno';
+$lang['Your password has been reset'] = 'Vaše geslo je bilo ponastavljeno';
$lang['Return to home page'] = 'Vrnite se na domaÄo stran';
-$lang['Please enter your username or email address.'] = 'Prosim vnesite svoje uporabniško ime ali e-pošto.';
-$lang['You will receive a link to create a new password via email.'] = 'Po e-pošti boste prejeli povezavo za kreiranje novega gesla.';
+$lang['Please enter your username or email address.'] = 'Prosim vnesite svoje uporabniško ime ali e-poštni naslov.';
+$lang['You will receive a link to create a new password via email.'] = 'Na vaš e-pošti naslov boste prejeli povezavo za kreiranje novega gesla.';
$lang['Username or email'] = 'Uporabniško ime ali e-pošta';
$lang['Change my password'] = 'Spremeni geslo';
$lang['Enter your new password below.'] = 'Vnesite novo geslo.';
@@ -364,55 +358,63 @@ $lang['Edit'] = 'Uredi';
$lang['Hello %s,'] = 'Pozdravljen %s,';
$lang['Password: %s'] = 'Geslo: %s';
$lang['Username: %s'] = 'Uporabnik: %s';
-$lang['Here are your connection settings'] = 'Tukaj so vaše nastavitve povezave';
-$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Če mislite, da ste prejeli to e-pošto po pomoti, se obrnite na nas na %s';
-$lang['large'] = 'large';
-$lang['medium'] = 'medium';
-$lang['Original'] = 'Original';
-$lang['Send my connection settings by email'] = 'Pošlji nastavitve povezave po e-pošti';
-$lang['small'] = 'small';
-$lang['square'] = 'square';
-$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Uspešna registracija. Po e-pošti boste kmalu prejeli nastavitve povezave. Dobrodošli !';
+$lang['Here are your connection settings'] = 'To so vaši prijavni podatki';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Če mislite, da ste prejeli to e-pošto po pomoti, se lahko obrnete na nas na: %s';
+$lang['large'] = 'velika';
+$lang['medium'] = 'srednja';
+$lang['Original'] = 'Izvirna';
+$lang['Send my connection settings by email'] = 'Pošlji mi prijavne podatke na moj e-poštni naslov';
+$lang['small'] = 'majhna';
+$lang['square'] = 'kvadratno';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Uspešno ste se registrirali. Na vaš e-mail naslov boste prejeli vaše prijavne podatke. Dobrodošli v naši fotogaleriji!!';
$lang['Thank you for registering at %s!'] = 'Hvala za registracijo na %s!';
-$lang['thumb'] = 'thumb';
+$lang['thumb'] = 'sliÄica';
$lang['Username modification'] = 'Sprememba uporabniškega imena';
-$lang['xlarge'] = 'xlarge';
-$lang['xxlarge'] = 'xxlarge';
+$lang['xlarge'] = 'veÄja';
+$lang['xxlarge'] = 'XXL - zelo velika';
$lang['Your username has been successfully changed to : %s'] = 'Vaše uporabniško ime je bilo uspešno sprememenjeno na: %s';
-$lang['%d rate'] = '%d stopnja';
-$lang['2small'] = 'XXS-zelo malo';
-$lang['Date created, new &rarr; old'] = 'Datum kreiranja,nove &rarr; stare';
-$lang['Date created, old &rarr; new'] = 'Datum kreiranja,stare &rarr; nove';
-$lang['Date posted, new &rarr; old'] = 'Datum objave,nove &rarr; stare';
-$lang['Date posted, old &rarr; new'] = 'Datum objave,stare &rarr; nove';
+$lang['%d rate'] = '%d ocena';
+$lang['2small'] = 'XXS - zelo mala';
+$lang['Date created, new &rarr; old'] = 'Datum kreiranja, nove &rarr; stare';
+$lang['Date created, old &rarr; new'] = 'Datum kreiranja, stare &rarr; nove';
+$lang['Date posted, new &rarr; old'] = 'Datum objave, nove &rarr; stare';
+$lang['Date posted, old &rarr; new'] = 'Datum objave, stare &rarr; nove';
$lang['Desktop'] = 'Namizje';
-$lang['File name, A &rarr; Z'] = 'Ime datoteke,A &rarr; Z';
-$lang['File name, Z &rarr; A'] = 'Ime datoteke,Z &rarr; A';
-$lang['Manual sort order'] = 'RoÄni naÄin sortiranja';
+$lang['File name, A &rarr; Z'] = 'Ime datoteke, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'Ime datoteke, Z &rarr; A';
+$lang['Manual sort order'] = 'RoÄni naÄin razvrÅ¡Äanja';
$lang['Mobile'] = 'Mobilen';
-$lang['Numeric identifier, 1 &rarr; 9'] = 'NumeriÄni identifikator, 1 &rarr; 9';
-$lang['Numeric identifier, 9 &rarr; 1'] = 'NumeriÄni identifikator, 9 &rarr; 1';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Å tevilÄna oznaka, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Å tevilÄna oznaka, 9 &rarr; 1';
$lang['Photo sizes'] = 'Velikosti slike';
-$lang['Photo title, A &rarr; Z'] = 'Naslov slike,A &rarr; Z';
-$lang['Photo title, Z &rarr; A'] = 'Naslov slike,Z &rarr; A';
+$lang['Photo title, A &rarr; Z'] = 'Ime slike, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = 'Ime slike, Z &rarr; A';
$lang['Rating score, high &rarr; low'] = 'Ocene, visoke &rarr; nizke';
$lang['Rating score, low &rarr; high'] = 'Ocene, nizke &rarr; visoke';
-$lang['Show latest comments first'] = 'Najnovejši komentarje najprej';
-$lang['Show oldest comments first'] = 'Najstarejše komentarje najprej';
-$lang['View in'] = 'Pogled v';
-$lang['Visits, high &rarr; low'] = 'Obiski, veliko &rarr; malo';
-$lang['Visits, low &rarr; high'] = 'Obiski, malo &rarr; veliko';
-$lang['xsmall'] = 'XS-malo';
+$lang['Show latest comments first'] = 'Najnovejši komentarji najprej';
+$lang['Show oldest comments first'] = 'Najstarejši komentarji najprej';
+$lang['View in'] = 'Poglej v';
+$lang['Visits, high &rarr; low'] = 'Ogledi, veliko &rarr; malo';
+$lang['Visits, low &rarr; high'] = 'Ogledi, malo &rarr; veliko';
+$lang['xsmall'] = 'XS - manjša';
$lang['Forbidden'] = 'Prepovedan dostop';
$lang['Page not found'] = 'Stran ne obstaja';
$lang['Requested album does not exist'] = 'Zahtevan album ne obstaja';
-$lang['Requested tag does not exist'] = 'Zahtevan tag ne obstaja';
+$lang['Requested tag does not exist'] = 'Zahtevana oznaka ne obstaja';
$lang['Bad request'] = 'Nepravilna zahteva';
-$lang['Permalink for album not found'] = 'Stalne povezave za album ni bilo mogoÄe najti';
+$lang['Permalink for album not found'] = 'Stalne povezave (permalink) za album ni bilo mogoÄe najti';
$lang['Piwigo encountered a non recoverable error'] = 'Prišlo je do napake v Piwigo';
-$lang['Email address is mandatory'] = 'E-pošta je obvezna';
+$lang['Email address is mandatory'] = 'E-poštni naslov je obvezn';
$lang['Username is mandatory'] = 'Uporabniško ime je obvezno';
$lang['mandatory'] = 'obvezno';
$lang['Website'] = 'Spletna stran';
$lang['Your website URL is invalid'] = 'Naslov spletne strani je nepravilen';
+$lang['Email'] = 'E-pošta';
+$lang['First Page'] = 'Prva stran';
+$lang['Go back to the album'] = 'Nazaj na album';
+$lang['Last Page'] = 'Zadnja stran';
+$lang['Password is missing. Please enter the password.'] = 'Manjka geslo. Prosimo vpišite geslo.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Manjka potrditev gesla. Prosimo potrdite izbrano geslo.';
+$lang['%d photos per page'] = '%d slik na stran';
+$lang['Theme'] = 'Preobleka';
?> \ No newline at end of file
diff --git a/language/sl_SI/help/cat_move.html b/language/sl_SI/help/cat_move.html
new file mode 100755
index 000000000..002d622f4
--- /dev/null
+++ b/language/sl_SI/help/cat_move.html
@@ -0,0 +1,14 @@
+<h2>Premakni virtualne Albume</h2>
+
+<p>Samo virtualni albumi lahko imajo nove starševske albume.</p>
+
+<h3>Virtualni albumi za premik</h3>
+
+<p>OznaÄi virtualne albume, ki jih želiÅ¡ premakniti.
+ÄŒe je seznam prazen, to pomeni da Å¡e ni kreiran.</p>
+
+<h3>Nov starševski album</h3>
+
+<p>OznaÄi nov starÅ¡evski album (virtualnega ali fiziÄnega).
+If you do not select any parent, the virtual selected albums will be moved to the root.
+Album ni mogoÄe premakniti v samega sebe ali v nižji (child) nivo.</p> \ No newline at end of file
diff --git a/language/sl_SI/help/search.html b/language/sl_SI/help/search.html
new file mode 100755
index 000000000..65108e70f
--- /dev/null
+++ b/language/sl_SI/help/search.html
@@ -0,0 +1,24 @@
+<h2>Iskanje</h2>
+
+<p>Ta stran vam omogoÄa iskanje fotografij po celi galeriji.</p>
+
+<dl>
+
+ <dt>IÅ¡Äi besede</dt>
+ <dd>Iskanje besede ali veÄ besed med lastnostimi povezanimi s fotografijami
+ galerije. Uporabite * kot wildcard za delne zadetke.</dd>
+
+ <dt>Iskanje po avtorju</dt>
+ <dd>Uporabite * kot wildcard za delne zadetke.</dd>
+
+ <dt>Iskanje po datumu</dt>
+ <dd>Izberite datum in/ali konÄni datum za poizvedbo. Polje datum pustite prazno
+ Äe želite izvesti poizvedbo "pred". Letnica v zadnjem polju
+ mora biti v formatu : AAAA (npr. 2004)</dd>
+
+ <dt>Iskanje v albumih</dt>
+ <dd>Izberite album ali albume v katerih želite iskati. V iskanje so lahko
+ vkljuÄeni vsi podalbumi, Äe izberete nadrejeni album in spodaj izberete možnost
+ iskanja v podalbumih.</dd>
+
+</dl> \ No newline at end of file
diff --git a/language/sl_SI/help/synchronize.html b/language/sl_SI/help/synchronize.html
new file mode 100755
index 000000000..0bc0b3054
--- /dev/null
+++ b/language/sl_SI/help/synchronize.html
@@ -0,0 +1,14 @@
+<h2>Usklajevanje (sinhronizacija)</h2>
+
+<p>Obstajata dva tipa usklajevanja:</p>
+<ul>
+ <li>imeniki/datoteke</li>
+ <li>metapodatki datoteke</li>
+</ul>
+
+<p>Usklajevanje imenikov(direktorijev) in datotek se nanaša na uskladitev drevesa imenikov in datotek z drevesom albumov v podatkovni bazi.
+Usklajevanje metapodatkov datotek se nanaša na uskladitev informacij o slikah kot so velikost, dimenzije, pixli, EXIF ali IPTC informacij s podatkovno bazo.</p>
+
+<p>Kadar usklajujete vaše dodane slike z galerijo, morate najprej uskladiti imenike in datoteke.</p>
+
+<p>Proces usklajevanja lahko traja dolgo (odvisno od obremenitve strežnika in števila elementov za obdelavo) zato lahko usklajevanje izvajate tudi po posameznih albumih.</p> \ No newline at end of file
diff --git a/language/sl_SI/help/user_list.html b/language/sl_SI/help/user_list.html
new file mode 100755
index 000000000..9f173ac96
--- /dev/null
+++ b/language/sl_SI/help/user_list.html
@@ -0,0 +1,23 @@
+<h2>Seznam uporabnikov</h2>
+
+<p>Tu lahko urejate uporabnike vaše Piwigo galerije.</p>
+
+<h3>Dodaj uporabnika</h3>
+
+<p>Administrator lahko roÄno doda uporabnika. Za vsakega uporabnika ustvarite uporabniÅ¡ko ime in geslo, in vpiÅ¡ite veljaven elektronski naslov.</p>
+
+<h3>Seznam uporabnikov</h3>
+
+<p>Seznam obstojeÄih uporabnikov je možno filtrirati po uporabniÅ¡kem imenu (uporabi * kot wildcard), ali po skupini ter statusu. Razvrstitev je možna po datumu registracije ali po uporabniÅ¡kem imenu, in sicer v naraÅ¡ÄajoÄem ali padajoÄem vrstnem redu.</p>
+
+<p>Ta stran omogoÄa upravljanje veÄ uporabnikov hkrati. Možna so razliÄna dejanja:</p>
+
+<ul>
+ <li>izbris uporabnikov (zahtevana potrditev)</li>
+ <li>spremeba statusa uporabnikov</li>
+ <li>povezava ali razveza s skupinami</li>
+ <li>spreminjanje lastnosti prikaza</li>
+ <li>spreminjanje dodatnih nastavitev</li>
+</ul>
+
+<p>Izvedba dejanj velja za izbranega uporabnika (privzeto) ali za vse uporabnike prikazane na filtriranem seznamu.</p> \ No newline at end of file
diff --git a/language/sl_SI/install.lang.php b/language/sl_SI/install.lang.php
new file mode 100755
index 000000000..1b6619217
--- /dev/null
+++ b/language/sl_SI/install.lang.php
@@ -0,0 +1,68 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+$lang['PHP 5 is required'] = 'Zahtevan je PHP 5';
+$lang['Password [confirm]'] = 'Geslo [potrdi]';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo bo poskušal preklopiti vaše nastavitve na PHP 5 z ustvarjanjem ali urejanjem .htacceess datoteke';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo ni mogel nastaviti PHP 5.';
+$lang['Sorry!'] = 'Oprostite!';
+$lang['Start Install'] = 'ZaÄni namestitev';
+$lang['Try to configure PHP 5'] = 'Poskušam nastaviti PHP 5';
+$lang['User'] = 'Uporabnik';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'Obiskovalci bodo lahko ta elektronski naslov uporabljali za kontakt s skrbnikom spletne strani ';
+$lang['Welcome to my photo gallery'] = 'Dobrodošli v moji foto galeriji';
+$lang['Welcome to your new installation of Piwigo!'] = 'Dobrodošli v vaši novi namestitvi Piwigo!';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Lahko prenesete namestitveno datoteko ter jo naložite v local/config imenik vaše namestitve.';
+$lang['Admin configuration'] = 'Admin nastavitve';
+$lang['Basic configuration'] = 'Osnovne nastavitve';
+$lang['Can\'t connect to server'] = 'Ne morem se povezati s strežnikom';
+$lang['Congratulations, Piwigo installation is completed'] = 'ÄŒestitamo! Namestitev Piwigo aplikacije je uspeÅ¡no dokonÄana!';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Uspešno ste se povezali na strežnik vendar je povezava s podatkovno bazo spodletela.';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'Ustvarjanje nastavitvene datoteke local/config/database.inc.php je spodletelo.';
+$lang['Database configuration'] = 'Nastavitve podatkovne baze';
+$lang['Database name'] = 'Ime podatkovne baze';
+$lang['Database table prefix'] = 'Predpona podatkovnih tabel';
+$lang['Default gallery language'] = 'Privzeti jezik galerije';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Ne oklevajte in povpraÅ¡ajte za pomoÄ na naÅ¡em forumu: %s';
+$lang['Download the config file'] = 'Prenesite config datoteko';
+$lang['Hope to see you back soon.'] = 'Upam, da se kmalu ponovno vidimo.';
+$lang['Host'] = 'Gostitelj';
+$lang['Installation'] = 'Namestitev';
+$lang['It appears your webhost is currently running PHP %s.'] = 'Zdi se, da je na spletnem strežniku trenutno nameÅ¡Äen PHP %s';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Vidno bo obiskovalcem. To je potrebno za upravljanje spletne strani';
+$lang['Just another Piwigo gallery'] = 'To je zgolj Å¡e ena Piwigo galerija';
+$lang['enter a login for webmaster'] = 'vnesite prijavno ime skrbnika';
+$lang['please enter your password again'] = 'prosimo ponovno vnesite vaše geslo';
+$lang['user login given by your host provider'] = 'prijavno ime uporabnika pridobljeno od vašega ponudnika gostovanja';
+$lang['user password given by your host provider'] = 'geslo uporabnika pridobljeno od vašega ponudnika gostovanja';
+$lang['verification'] = 'preverjanje';
+$lang['webmaster login can\'t contain characters \' or "'] = 'prijavno ime skrbnika ne sme vsebovati znakov \' ali "';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'imena tabel v podatkovni bazi bodo imela predpono. (omogoÄa lažje upravljanje tabel)';
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Posvetujte se z vaÅ¡im ponudnikom gostovanja kako bi lahko sami preÅ¡li na zahtevano PHP 5 razliÄico.';
+$lang['also given by your host provider'] = 'tudi pridobljeno od vašega ponudnika gostovanja';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Potrebujete dodatno pomoÄ? Zastavite vpraÅ¡anje na <a href="%s">Piwigo oglasni deski</a>.';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Upoštevajte da lahko sami spremenite nastavitve in nato ponovno zaženete Piwigo.';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Druga rešitev je, da kopirate besedilo v polje zgoraj in ga prilepite v datoteko "local/config/database.inc.php" (Opozorilo: database.inc.php mora vsebovati le to kar je v besedilnem polju, brez znakov prehoda v novo vrstico(line return)ali znakov za presledke)';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'Varno shranite, omogoÄa vam dostop do administratorske nadzorne ploÅ¡Äe!';
+$lang['localhost or other, supplied by your host provider'] = 'localhost ali drug naslov ki ga imate pri svojem ponudniku gostovanja';
+?> \ No newline at end of file
diff --git a/language/sl_SI/upgrade.lang.php b/language/sl_SI/upgrade.lang.php
new file mode 100755
index 000000000..ec5ababd8
--- /dev/null
+++ b/language/sl_SI/upgrade.lang.php
@@ -0,0 +1,40 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'Kot previdnostni ukrep so sledeÄi vtiÄniki onemogoÄeni. Preveriti morate posodobitve za te vtiÄnike in jih nato ponovno omogoÄiti:';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Od predhodnje nastavitve so shranjene le predpone sliÄic in e-poÅ¡tni naslov skrbnika spletne strani';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'V primeru težav naredite vzdrževalno preverjanje preko [Administracija>Orodja>Vzdrževanje]';
+$lang['SQL queries'] = 'SQL poizvedbe';
+$lang['Statistics'] = 'Statistika';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Ta stran predlaga, da nadgradite podatkovno bazo vaÅ¡e Piwigo razliÄice na novejÅ¡o razliÄico. ÄŒarovnik nadgradnje je zaznal, da trenutno uporabljate <strong>razliÄico %s</strong> (ali enakovredno).';
+$lang['Upgrade'] = 'Nadgradi';
+$lang['Upgrade from version %s to %s'] = 'Nadgradi iz razliÄice %s na razliÄico %s';
+$lang['Upgrade informations'] = 'Informacije nadgradnje';
+$lang['User permissions and group permissions have been erased'] = 'Dovoljenja uporabnikov in skupin so bila izbrisana';
+$lang['You do not have access rights to run upgrade'] = 'Nimate dovoljenja za izvedbo nadgradnje';
+$lang['total SQL time'] = 'skupen SQL Äas';
+$lang['total upgrade time'] = 'skupen Äas nadgradnje';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'V <i>%s</i>, pred <b>?></b>, vstavi:';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'Nadgradnjo lahko opravi le Administrator. Prosimo prijavite se spodaj:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Kot previdnostni ukrep so sledeÄe preobleke onemogoÄene. Preveriti morate posodobitve za te preobleke in jih nato ponovno omogoÄiti:';
+$lang['All sub-albums of private albums become private'] = 'Vsi pod-albumi zasebnega albuma postanejo zasebni';
+?> \ No newline at end of file
diff --git a/language/sr_RS/admin.lang.php b/language/sr_RS/admin.lang.php
index 0fb490a33..4018885d3 100644
--- a/language/sr_RS/admin.lang.php
+++ b/language/sr_RS/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -190,7 +190,6 @@ $lang['Access type'] = 'Ð’Ñ€Ñта приÑтупа';
$lang['Information data registered in database'] = 'Подаци упиÑани у базу података';
$lang['Default display'] = 'Подразумевани приказ';
$lang['The gallery URL is not valid.'] = 'URL галерије није одговарајући.';
-$lang['Main'] = 'Главно';
$lang['The number of comments a page must be between 5 and 50 included.'] = 'Број коментара по Ñтраници мора бити између 5 и 50.';
$lang['Configuration'] = 'Подешавање';
$lang['confirm'] = 'потврди';
@@ -225,7 +224,6 @@ $lang['Prepared time for list of users to send mail is limited. Others users are
$lang['Time to send mail is limited. Others mails are skipped.'] = 'Време за Ñлање поруке је ограничено. ОÑтале поруке Ñу преÑкочене.';
$lang['To send ?'] = 'ПоÑлати ?';
$lang['Last send'] = 'Задње поÑлато';
-$lang['email'] = 'електронÑка адреÑа';
$lang['User'] = 'КориÑник';
$lang['See you soon,'] = 'Видимо Ñе уÑкоро,';
$lang['Go to'] = 'Иди на ';
@@ -814,8 +812,6 @@ $lang['%d days'] = 'број дана: %d';
$lang['registered users'] = 'региÑтровани кориÑник';
$lang['simple visitors'] = 'обичан поÑетилац';
$lang['modified'] = 'промењено';
-$lang['Format'] = 'Формат';
-$lang['Invalid dimension'] = 'Ðеправилна димензија';
$lang['Move to album'] = 'Пребаци у албум';
$lang['Minimum width'] = 'Минимална ширина';
$lang['Minimum height'] = 'Минимална виÑина';
@@ -852,4 +848,41 @@ $lang['Gallery unlocked'] = 'Галерија откључана';
$lang['Duplicate'] = 'Дупликат';
$lang['Delete multiple size images'] = 'Избришите вишеÑтруке величине Ñлика';
$lang['Zoom'] = 'Увећање';
+$lang['Watermark'] = 'Водени жиг';
+$lang['With no album'] = 'Без албума';
+$lang['any visitor can see this album'] = 'било који поÑетилац може видети овај албум';
+$lang['add a new watermark'] = 'додајте нови водени жиг';
+$lang['custom'] = 'По избору';
+$lang['With no tag'] = 'Без ознаке';
+$lang['Resize after upload'] = 'Промени величину поÑле Ñлања';
+$lang['Select at least two tags for merging'] = 'Одаберите најмање две ознаке за Ñпајање';
+$lang['Select the destination tag'] = 'Одаберите одредишну ознаку';
+$lang['The original maximum height must be a number between %d and %d'] = 'ВиÑина оригиналне Ñлике мора бити број између %d и %d';
+$lang['The original image quality must be a number between %d and %d'] = 'Квалитет оригиналне Ñлике мора бити број између %d и %d';
+$lang['Send connection settings by email'] = 'Пошаљи подешавања везе електронÑком поштом';
+$lang['Save visits in history for'] = 'Сачувај поÑете у иÑторији за ';
+$lang['Not cropped correctly?'] = 'Погрешно иÑечено?';
+$lang['Opacity'] = 'ÐепровидноÑÑ‚';
+$lang['Permission granted for users'] = 'Дозвола дата кориÑницима';
+$lang['Generate multiple size images'] = 'Ðаправи вишеÑтруке величине Ñлика ';
+$lang['No destination tag selected'] = 'Ðије одабрана одредишна ознака';
+$lang['No group is permitted to see this private album'] = 'Ðи једној групи није дозвољено да види овај приватни албум';
+$lang['Apply watermark if height is bigger than'] = 'Примени водени жиг ако је виÑина већа од';
+$lang['Apply watermark if width is bigger than'] = 'Примени водени жиг ако је ширина већа од ';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '%u кориÑници имају дозволе јер припадају групи којој је дата дозвола.';
+$lang['%s in the future'] = '%s у будућноÑти';
+$lang['Available versions for'] = 'ДоÑтупна верзија за';
+$lang['Available on'] = 'ДоÑтупно на';
+$lang['Automatic sort order'] = 'ÐутоматÑки редоÑлед';
+$lang['Users modified'] = 'КориÑник промењен';
+$lang['Number of albums per page'] = 'Број албума по Ñтраници';
+$lang['Permission management'] = 'Управљање дозволама';
+$lang['Password updated'] = 'Лозинка је промењена';
+$lang['Loading...'] = 'Учитавање...';
+$lang['General'] = 'Опште';
+$lang['create a new site'] = 'направи ново меÑто (енгл. site)';
+$lang['Duplicate selected tags'] = 'Одабрана ознака је дупликат';
+$lang['Basic settings'] = 'ОÑновна подешавања';
+$lang['Change password'] = 'Промени лозинку';
+$lang['Change username'] = 'Промени кориÑничко име';
?> \ No newline at end of file
diff --git a/language/sr_RS/common.lang.php b/language/sr_RS/common.lang.php
index 18916f58c..4ed3ec8f9 100644
--- a/language/sr_RS/common.lang.php
+++ b/language/sr_RS/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: СрпÑки [SR]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=458
Author: Piwigo team
Author URI: http://piwigo.org
@@ -242,7 +242,6 @@ $lang['login mustn\'t end with a space character'] = 'пријава не Ñме
$lang['login mustn\'t start with a space character'] = 'пријава не Ñме почињати размаком';
$lang['this login is already used'] = 'ово кориÑничко име Ñе већ кориÑти';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'адреÑа електронÑке поште мора бити облика xxx@yyy.eee (нпр. : korisnik@stranica.org)';
-$lang['please enter your password again'] = 'молимо унеÑите лозинку поново';
$lang['Auto login'] = 'Упамти ме';
$lang['remove this tag from the list'] = 'уклони ову ознаку из попиÑа';
$lang['representative'] = 'предÑтавник';
@@ -270,7 +269,6 @@ $lang['SQL queries in'] = 'SQL упит у ';
$lang['display only recently posted photos'] = 'приказ Ñамо недавно објављених Ñлика';
$lang['return to the display of all photos'] = 'повратак у приказ Ñвих Ñлика';
$lang['the beginning'] = 'почетак';
-$lang['Interface theme'] = 'тема';
$lang['Thumbnails'] = 'Сличице';
$lang['Menu'] = 'Избор';
$lang['A comment on your site'] = 'Коментар на Вашој интернет Ñтраници';
@@ -413,4 +411,12 @@ $lang['Username is mandatory'] = 'КориÑничко име је обавезÐ
$lang['mandatory'] = 'обавезан';
$lang['Website'] = 'Међумрежно меÑто';
$lang['Your website URL is invalid'] = 'Ваша адреÑа на глобалној мрежи (URL) је неиÑправна';
+$lang['Password is missing. Please enter the password.'] = 'Лозинка недоÑтаје. Молим унеÑите лозинку.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Потврда лозинке недоÑтаје. Молим потврдите изабрану лозинку.';
+$lang['%d photos per page'] = '%d Ñлика по Ñтраници';
+$lang['Email'] = 'ЕлектронÑка адреÑа';
+$lang['First Page'] = 'Прва Ñтрана';
+$lang['Go back to the album'] = 'Повратак на албум';
+$lang['Last Page'] = 'ПоÑледња Ñтрана';
+$lang['Theme'] = 'Тема';
?> \ No newline at end of file
diff --git a/language/sr_RS/index.php b/language/sr_RS/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/sr_RS/index.php
+++ b/language/sr_RS/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/sr_RS/install.lang.php b/language/sr_RS/install.lang.php
index 632bef9c9..c07436a36 100644
--- a/language/sr_RS/install.lang.php
+++ b/language/sr_RS/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,23 +21,18 @@
// | USA. |
// +-----------------------------------------------------------------------+
-
$lang['Installation'] = 'ИнÑталација';
$lang['Basic configuration'] = 'ОÑновна подешења';
$lang['Default gallery language'] = 'Подразумевани језик галерије';
$lang['Database configuration'] = 'Подешавање базе';
$lang['Admin configuration'] = 'ÐдминиÑтраторÑка подешења';
$lang['Start Install'] = 'Покрени инÑталацију';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'ÐдреÑа електронÑке поште мора бити у облику xxx@yyy.eee (пример : milos@firma.org)';
-$lang['Webmaster login'] = 'ПриÑтуп уредника интернет Ñтраница';
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Биће приказано поÑетиоцима. Ðеопходно је за админиÑтрацију интернет Ñтраница';
$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Повезивање на Ñервер уÑпешно, али повезивање на базу је немогућа';
$lang['Can\'t connect to server'] = 'Ðемогуће повезивање на Ñервер';
$lang['Host'] = 'ХоÑÑ‚';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
$lang['User'] = 'КориÑник';
$lang['user login given by your host provider'] = 'кориÑничко име дато од Ñтране Вашег давалаца интернет уÑлуга';
-$lang['Password'] = 'Лозинка';
$lang['user password given by your host provider'] = 'кориÑничка лозинка дата од Ñтране Вашег давалаца интернет уÑлуга';
$lang['Database name'] = 'Име базе';
$lang['also given by your host provider'] = 'такоде дато од Вашег диÑтрибутера интернет уÑлуга';
@@ -46,12 +41,10 @@ $lang['database tables names will be prefixed with it (enables you to manage bet
$lang['enter a login for webmaster'] = 'УнеÑи приÑтупне податке за уредника интернет Ñтраница';
$lang['webmaster login can\'t contain characters \' or "'] = 'приÑтупни подаци за уредника интернет Ñтраница не могу Ñадржати знаке \' или "';
$lang['please enter your password again'] = 'молим унеÑите Вашу лозинку поново';
-$lang['Webmaster password'] = 'Лозинка уредника интернет Ñтраница';
$lang['Keep it confidential, it enables you to access administration panel'] = 'Сачувајте у тајноÑти, омогућава приÑтуп админиÑтраторÑком делу';
$lang['Password [confirm]'] = 'Лозинка[потврди]';
$lang['verification'] = 'Провера';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Потребна Вам је помоц? Питајте на <a href="%s">Piwigo табли за поруке</a>.';
-$lang['Webmaster mail address'] = 'ÐдреÑа електронÑке поште уредника интернет Ñтраница';
$lang['Visitors will be able to contact site administrator with this mail'] = 'ПоÑетиоци ће бити у могућноÑти да Ñа ове електронÑке адреÑе контактирају админиÑтратора Ñтранице';
$lang['PHP 5 is required'] = 'PHP 5 је неопходан';
$lang['It appears your webhost is currently running PHP %s.'] = 'Изгледа да Ваш Ñервер тренутно кориÑти PHP %s.';
diff --git a/language/sr_RS/upgrade.lang.php b/language/sr_RS/upgrade.lang.php
index 7a0e7d65e..b3336cd9b 100644
--- a/language/sr_RS/upgrade.lang.php
+++ b/language/sr_RS/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/sv_SE/admin.lang.php b/language/sv_SE/admin.lang.php
index 9868f8c0a..5f03ca7de 100644
--- a/language/sv_SE/admin.lang.php
+++ b/language/sv_SE/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -190,7 +190,6 @@ $lang['Access type'] = 'Typ av tillgång';
$lang['Information data registered in database'] = 'Informations data registrerad i databas';
$lang['Default display'] = 'Standardvy';
$lang['The gallery URL is not valid.'] = 'Adressen till galleriet är ogiltig.';
-$lang['Main'] = 'Allmänt';
$lang['The number of comments a page must be between 5 and 50 included.'] = 'Antalet kommentarer per sida måste vara mellan 5 och 50.';
$lang['Configuration'] = 'Inställningar';
$lang['confirm'] = 'godkänn';
@@ -225,7 +224,6 @@ $lang['Prepared time for list of users to send mail is limited. Others users are
$lang['Time to send mail is limited. Others mails are skipped.'] = 'Tiden att skicka e-mail är begränsad. Andras e-mail hoppas över.';
$lang['To send ?'] = 'Att skicka?';
$lang['Last send'] = 'Senast skickat';
-$lang['email'] = 'E-mail';
$lang['User'] = 'Användare';
$lang['Complementary mail content'] = 'Kompletterande mail innehåll';
$lang['See you soon,'] = 'Vi ses,';
@@ -948,4 +946,32 @@ $lang['Minimum width'] = 'Minsta bredd';
$lang['Minimum height'] = 'Minsta höjd';
$lang['Merge selected groups'] = 'Sammanfoga markerade grupper';
$lang['Purge user cache'] = 'Rensa användarecache';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'Skalning efter uppladdning är inaktiverat eftersom GD används som grafikbibliotek.';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'Bildens dimension kommer att reduceras till %dx%d pixlar.';
+$lang['Select at least one tag'] = 'Välj minst en etikett';
+$lang['(filtered from %s total users)'] = '(filtrerat från totalt %s användare)';
+$lang['No user selected, no action possible.'] = 'Ingen användare vald, ingen åtgärd möjlig.';
+$lang['No matching user found'] = 'Ingen matchande användare funnen';
+$lang['Registered on %s, %s.'] = 'Registrerad %s, %s.';
+$lang['Users modified'] = 'Användare modifierade';
+$lang['on the %d selected users'] = 'på de %d valda användarna';
+$lang['%d of %d users selected'] = '%d av %d användare valda';
+$lang['All %d users are selected'] = 'Alla %d användare är valda';
+$lang['Basic settings'] = 'Grundläggande inställningar';
+$lang['Change password'] = 'Ändra lösenord';
+$lang['Change username'] = 'Ändra användarnamn';
+$lang['General'] = 'Generellt';
+$lang['Last visit on %s, %s.'] = 'Senast besökt %s, %s.';
+$lang['Loading...'] = 'Laddar...';
+$lang['Mail theme'] = 'Mailtema';
+$lang['No user selected of %d users'] = 'Inga användare valda av %d användare';
+$lang['Password updated'] = 'Lösenord uppdaterat';
+$lang['Show %s users'] = 'Visa %s användare';
+$lang['Showing %s to %s of %s users'] = 'Visar %s till %s av %s användare';
+$lang['Update user'] = 'Uppdatera användare';
+$lang['User %s added'] = 'Användare %s tillagd';
+$lang['User %s updated'] = 'Användare %s uppdaterad';
+$lang['close'] = 'stäng';
+$lang['Close user details'] = 'Stäng användar detaljer';
+$lang['Open user details'] = 'Öppna användar detaljer';
?> \ No newline at end of file
diff --git a/language/sv_SE/common.lang.php b/language/sv_SE/common.lang.php
index b48ac68cd..4285083d5 100644
--- a/language/sv_SE/common.lang.php
+++ b/language/sv_SE/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2009 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Svenska [SE]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=451
Author: Piwigo team
Author URI: http://piwigo.org
@@ -243,10 +243,6 @@ $lang['last %d days'] = 'sista %d dagarna';
$lang['Last'] = 'Sista';
$lang['Logout'] = 'Logga ut';
$lang['obligatory'] = 'obligatorisk';
-$lang['Maximum photo height'] = 'Maximal höjd på bilderna';
-$lang['Maximum height must be a number superior to 50'] = 'Maximal höjd måste vara större än 50';
-$lang['Maximum photo width'] = 'Maximal bredd på bilderna';
-$lang['Maximum width must be a number superior to 50'] = 'Maximal bredd måste vara större än 50';
$lang['display a calendar by creation date'] = 'visa en kalender sorterad efter datum för skapande';
$lang['display all photos in all sub-albums'] = 'visa alla bilder i alla underliggande album';
$lang['return to normal view mode'] = 'återgå till normalt visningsläge';
@@ -281,7 +277,6 @@ $lang['login mustn\'t end with a space character'] = 'användarnamn får inte sl
$lang['login mustn\'t start with a space character'] = 'användarnamn får inte börja med ett mellanslag';
$lang['this login is already used'] = 'Detta användarnamn används redan';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'e-postadress mÃ¥ste vara av formen â€arne@anka.org';
-$lang['please enter your password again'] = 'vänligen ange ditt lösenord igen';
$lang['Auto login'] = 'Automatisk inloggning';
$lang['remove this tag from the list'] = 'ta bort taggen från listan';
$lang['representative'] = 'representant';
@@ -316,7 +311,6 @@ $lang['SQL queries in'] = 'SQL-frågor i';
$lang['display only recently posted photos'] = 'visa endast nyligen publicerade bilder';
$lang['return to the display of all photos'] = 'återgå till visning av alla bilder';
$lang['the beginning'] = 'början';
-$lang['Interface theme'] = 'Gränssnittstema';
$lang['Thumbnails'] = 'Miniatyrer';
$lang['Menu'] = 'Meny';
$lang['A comment on your site'] = 'En kommentar på din sida';
@@ -417,4 +411,12 @@ $lang['Username is mandatory'] = 'Användarnamn är obligatorisk';
$lang['Website'] = 'Hemsida';
$lang['Your website URL is invalid'] = 'URL för hemsida är ogiltig';
$lang['mandatory'] = 'obligatorisk';
+$lang['Email'] = 'Email';
+$lang['First Page'] = 'Första sidan';
+$lang['Go back to the album'] = 'GÃ¥ tillbaka till album';
+$lang['Last Page'] = 'Sista sidan';
+$lang['Password is missing. Please enter the password.'] = 'Lösenord saknas. Ange lösenord.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Bekräftelse av lösenord saknas. Vänligen bekräfta ditt valda lösenord.';
+$lang['%d photos per page'] = '%d fotografier per sida';
+$lang['Theme'] = 'Tema';
?> \ No newline at end of file
diff --git a/language/sv_SE/help/cat_modify.html b/language/sv_SE/help/cat_modify.html
index 939f48c73..9919a759c 100644
--- a/language/sv_SE/help/cat_modify.html
+++ b/language/sv_SE/help/cat_modify.html
@@ -23,7 +23,7 @@ att ändra den överordnade kategorin.</p>
<li><strong>Åtkomsttyp</strong>: Behörigheter hantering. Om du gör en
kategori privat, så blir alla dess underordnade kategorier blir privata. Om du gör en
- kategori allmän, blir alla dess överordnade kategorier allmäna.</li>
+ kategori allmän, blir alla dess överordnade kategorier allmänna.</li>
<li><strong> LÃ¥st</strong>: Den kategori och dess underkategorier kommer att
vara tillfällig inaktiverad för underhåll.</li>
diff --git a/language/sv_SE/help/index.php b/language/sv_SE/help/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/sv_SE/help/index.php
+++ b/language/sv_SE/help/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/sv_SE/help/photos_add_ftp.html b/language/sv_SE/help/photos_add_ftp.html
new file mode 100755
index 000000000..028058f21
--- /dev/null
+++ b/language/sv_SE/help/photos_add_ftp.html
@@ -0,0 +1,71 @@
+<fieldset>
+ <legend>Snabb Start</legend>
+
+<ol>
+ <li>Skapa en katalog på din dator.</li>
+
+ <li>Kopiera några bilder till den nya katalogen, anpassa storleken för att visas på webben. <em>Varning</em>: Katalog och filnamnen får bara innehålla bokstäver, tecknen "-", "_" och ".". Inga mellanslag eller accentuerade bokstäver.</li>
+
+ <li>Med en FTP klient, kopiera din katalog till "galleries" katalogen i din piwigo installation.</li>
+
+ <li>Logga in i ditt galleri och gå till <span class="pwgScreen">Administration</span> och klicka på den stora knappen benämnd "snabb lokal synkronisering".</li>
+</ol>
+
+<p>Gratulerar! Du har nu lyckats skapa ditt första album i ditt galleri.</p>
+</fieldset>
+
+<fieldset>
+ <legend>Katalog och filstruktur</legend>
+
+<ul>
+
+ <li>
+
+ <p>Album ska läggas i "galleries" katalogen under Piwigo installationskatalogen.
+ Här följer ett exempel på katalogstrukturen på ett väldigt litet galleri (men
+ som använder många funktioner):</p>
+
+ <pre>
+galleries
+|-- wedding
+| |-- celebration
+| | |-- arrival
+| | | |-- paul-alone.jpg
+| | | +-- sarah-alone.jpg
+| | +-- departure
+| | +-- paul-and-sarah.jpg
+| +-- party
+| |-- dancers001.jpg
+| |-- dancers002.jpg
+| +-- dancers003.jpg
++-- honeymoon
+ |-- hotel.png
+ |-- video-from-plane.avi
+ +-- pwg_representative
+ +-- video-from-plane.jpg
+</pre>
+
+ </li>
+
+ <li>Förutom "pwg_representative" (se förklaring nedan) så skapar varje katalog i "galleries" ett eget album. Det finns ingen begränsning på hur många under album som går att skapa.</li>
+
+ <li>>I grunden representeras varje objekt av en fil. En fil kan vara ett
+ Piwigo objekt om filändelsen är med i <code>file_ext</code>
+ konfigurations parametern (se filen <span
+ class="filename">include/config_default.inc.php</span>). En fil kan
+ vara en bild om fileändelsen är med i <code>picture_ext</code>
+ konfigurations parametern.</li>
+
+ <li>Icke foto objekt (video, ljud, texter, vad som helst..) representeras som standard av en ikon som matchar filändelsen.
+ Du kan om du vill associera en "thumbnail" fil som visar istället för ikonen.
+ (se video.avi i exemplet ovan).</li>
+
+ <li><em>Varning</em>: Katalog och filnamn får bara bestå av bokstäver och dessa tecken "-", "_" or ".". Inga mellanslag eller accentuerade
+ bokstäver.</li>
+
+ <li>Nät bilderna är placerade i katalogen, gå till,
+ gå till: <span class="pwgScreen">Administration &raquo; Verktyg &raquo;
+ Synkronisera</span></li>
+
+</ul>
+</fieldset> \ No newline at end of file
diff --git a/language/sv_SE/help/synchronize.html b/language/sv_SE/help/synchronize.html
new file mode 100755
index 000000000..2f3654508
--- /dev/null
+++ b/language/sv_SE/help/synchronize.html
@@ -0,0 +1,14 @@
+<h2>Synkronisering</h2>
+
+<p>Det finns två olika typer av synkronisering:</p>
+<ul>
+ <li>kataloger/filer</li>
+ <li>fil metadata</li>
+</ul>
+
+<p>Katalog och fil synkronisering innebär att du uppdaterar album databasen utifrån "galleries" katalog strukturen.
+Fil metadata synkronisering uppdaterar foto information så som filstorlek, bildens dimensions i pixlar, EXIT eller IPTC information till databasen.</p>
+
+<p>När du synkroniserar dina uppladdningar med ditt galleri måste du först synkronisera kataloger och filer.</p>
+
+<p>Synkroniseringen kan ta lång tid (beroende på din hårdvaruprestanda/belastning och hur många element som ska hanteras), därför kan man synkronisera album för album.</p> \ No newline at end of file
diff --git a/language/sv_SE/install.lang.php b/language/sv_SE/install.lang.php
index c3713e27a..10f5eccd5 100644
--- a/language/sv_SE/install.lang.php
+++ b/language/sv_SE/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,24 +21,18 @@
// | USA. |
// +-----------------------------------------------------------------------+
-
-
$lang['Installation'] = 'Installation';
$lang['Basic configuration'] = 'Grund Inställningar';
$lang['Default gallery language'] = 'Standard språk för galleriet';
$lang['Database configuration'] = 'Databas konfiguration';
$lang['Admin configuration'] = 'Admin konfiguration';
$lang['Start Install'] = 'Påbörja installation';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'E-mail adressen måste se ut som följande: xxx@yyy.eee (exempel : jack@altern.org)';
-$lang['Webmaster login'] = 'Webbansvarig login';
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Det kommer att visas för besökare. Det är nödvändigt för administrering av hemsidan.';
$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Ansluten till server, men kunde inte ansluta till databasen.';
$lang['Can\'t connect to server'] = 'Kan inte ansluta till servern';
$lang['Host'] = 'Värd';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
$lang['User'] = 'Användare';
$lang['user login given by your host provider'] = 'användares inloggning given av ditt webbhotell';
-$lang['Password'] = 'Lösenord';
$lang['user password given by your host provider'] = 'användares lösenord given av ditt webbhotell';
$lang['Database name'] = 'Databas namn';
$lang['also given by your host provider'] = 'också tilldelad av din webbhotell';
@@ -47,12 +41,10 @@ $lang['database tables names will be prefixed with it (enables you to manage bet
$lang['enter a login for webmaster'] = 'ange inloggning för webmaster';
$lang['webmaster login can\'t contain characters \' or "'] = 'login för webmaster får inte innehålla symbolerna \' eller "';
$lang['please enter your password again'] = 'ange ditt lösenord igen';
-$lang['Webmaster password'] = 'Webmaster lösenord';
$lang['Keep it confidential, it enables you to access administration panel'] = 'Håll det hemligt, lösenordet ger dig tillgång till administrationspanelen';
$lang['Password [confirm]'] = 'Lösenord [bekräfta]';
$lang['verification'] = 'verifiering';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Behöver du hjälp? Ställ din fråga på <a href="%s">Piwigo message board</a>.';
-$lang['Webmaster mail address'] = 'Webmaster e-mail adress';
$lang['Visitors will be able to contact site administrator with this mail'] = 'Besökare kommer att kunna kontakta sidans administratör med denna e-mail adress';
$lang['PHP 5 is required'] = 'PHP 5 krävs';
$lang['It appears your webhost is currently running PHP %s.'] = 'Ditt webbhotell använder just nu PHP %s.';
@@ -72,6 +64,5 @@ $lang['Just another Piwigo gallery'] = 'Ännu ett Piwigo galleri';
$lang['Welcome to my photo gallery'] = 'Välkommen till mitt fotogalleri';
$lang['Welcome to your new installation of Piwigo!'] = 'Välkomment till din nya installation av Piwigo!';
$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Tveka inte att kontakta våra forum för hjälp: %s';
-
-
+$lang['localhost or other, supplied by your host provider'] = 'localhost eller det värdnams som du valt eller tilldelats av din webhotells leverantör/server';
?> \ No newline at end of file
diff --git a/language/sv_SE/upgrade.lang.php b/language/sv_SE/upgrade.lang.php
index d42fe8398..0d698dd30 100644
--- a/language/sv_SE/upgrade.lang.php
+++ b/language/sv_SE/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/ta_IN/admin.lang.php b/language/ta_IN/admin.lang.php
new file mode 100755
index 000000000..40546dd2c
--- /dev/null
+++ b/language/ta_IN/admin.lang.php
@@ -0,0 +1,199 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['%d associations'] = '
+';
+$lang['%d guests'] = '% d விரà¯à®¨à¯à®¤à®¿à®©à®°à¯';
+$lang['%d hour'] = '% d மணிநேரமà¯';
+$lang['%d hours'] = '% d மணிநேரமà¯';
+$lang['%d guest'] = '% d விரà¯à®¨à¯à®¤à®¿à®©à®°à¯';
+$lang['%d groups'] = '%d கà¯à®´à¯à®•à¯à®•à®³à¯';
+$lang['%d group'] = '%d கà¯à®´à¯';
+$lang['%d days'] = '%d நாடà¯à®•à®³à¯';
+$lang['%d day'] = '% d நாளà¯';
+$lang['%d anomalies have been detected.'] = '% d à®®à¯à®°à®£à¯à®ªà®¾à®Ÿà¯à®•à®³à¯ கணà¯à®Ÿà®±à®¿à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯';
+$lang['%d anomalies have been detected corrected.'] = '% d à®®à¯à®°à®£à¯à®ªà®¾à®Ÿà¯à®•à®³à¯ கணà¯à®Ÿà®±à®¿à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà¯ மேலà¯à®®à¯ சரிசெயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯';
+$lang['%d albums moved'] = '%d ஆலà¯à®ªà®™à¯à®•à®³à¯ நகரà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯';
+$lang['%d albums including'] = 'இதிலà¯% d ஆலà¯à®ªà®™à¯à®•à®³à¯';
+$lang['%d album moved'] = '% D ஆலà¯à®ªà®®à¯ நகரà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯';
+$lang['%d album including'] = '% d ஆலà¯à®ªà®®à¯ அடஙà¯à®•à¯à®®à¯';
+$lang[' and %d virtual'] = 'மறà¯à®±à¯à®®à¯ %d நிஜமான';
+$lang[' and %d virtuals'] = 'மறà¯à®±à¯à®®à¯ %d நிஜமான';
+$lang['%d anomaly has been corrected.'] = '% d à®’à®´à¯à®™à¯à®•à®¿à®©à¯à®®à¯ˆ சரி செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.';
+$lang['%d anomalies have not been corrected.'] = '% d à®®à¯à®°à®£à¯à®ªà®¾à®Ÿà¯à®•à®³à¯ சரி, இலà¯à®²';
+$lang['%d anomalies have been ignored.'] = '%d நேரினà¯à®®à¯ˆà®•à®³à¯à®Ÿà®©à¯ பà¯à®±à®•à¯à®•à®£à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.';
+$lang['%d association'] = '%d தொடரà¯à®ªà¯';
+$lang['%d mails were sent.'] = '%d அஞà¯à®šà®²à¯à®•à®³à¯ அனà¯à®ªà¯à®ªà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®©.';
+$lang['%d members'] = '%d உறà¯à®ªà¯à®ªà®¿à®©à®°à¯à®•à®³à¯';
+$lang['%d minute'] = '%d நிமிடமà¯';
+$lang['%d minutes'] = '%d நிமிடஙà¯à®•à®³à¯';
+$lang['%d month'] = '%d மாதமà¯';
+$lang['%d months'] = '%d மாதஙà¯à®•à®³à¯';
+$lang['%d of %d photos selected'] = '%d இன௠% d பà¯à®•à¯ˆà®ªà¯à®ªà®Ÿà®™à¯à®•à®³à¯ தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯';
+$lang['%d parameter was updated.'] = '%d அளவà¯à®°à¯ மேமà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.';
+$lang['%d photos uploaded'] = '%d பà¯à®•à¯ˆà®ªà¯à®ªà®Ÿà®™à¯à®•à®³à¯ பதிவேறà¯à®±à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯';
+$lang['%d photos were deleted'] = '%d படஙà¯à®•à®³à¯ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®©';
+$lang['%d member'] = '%d உறà¯à®ªà¯à®ªà®¿à®©à®°à¯';
+$lang['%d mails were not sent.'] = '% d அஞà¯à®šà®²à¯ அனà¯à®ªà¯à®ªà®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ.';
+$lang['%d lines filtered'] = '% d வரிசைகள௠வடிகடà¯à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯';
+$lang['%d mail was sent.'] = '%d மினà¯à®©à®žà¯à®šà®²à¯ அனà¯à®ªà¯à®ªà®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯';
+$lang['%d mail was not sent.'] = '%d மினà¯à®©à®žà¯à®šà®²à¯ அனà¯à®ªà¯à®ªà®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ';
+$lang['%d line filtered'] = '% d கோட௠வடிகடà¯à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯';
+$lang['%d parameters were updated.'] = '% d அளவà¯à®°à¯à®•à¯à®•à®³à¯ மேமà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.';
+$lang['%d photo was deleted'] = '% d படம௠நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯';
+$lang['%d tag'] = '% d கà¯à®±à®¿à®šà¯à®šà¯†à®¾à®²à¯';
+$lang['%d tags'] = '% d கà¯à®±à®¿à®šà¯à®šà¯†à®¾à®±à¯à®•à®³à¯';
+$lang['%d user'] = '% d பயனரà¯';
+$lang['%d user comment rejected'] = '% d பயனர௠கரà¯à®¤à¯à®¤à¯à®°à¯ˆ நிராகரிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯';
+$lang['%d user comment validated'] = '% d பயனர௠கரà¯à®¤à¯à®¤à¯à®°à¯ˆ சரிபாரà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯';
+$lang['%d user comments rejected'] = '% d பயனர௠கரà¯à®¤à¯à®¤à¯à®°à¯ˆà®•à®³à¯ நிராகரிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯';
+$lang['%d user comments validated'] = '% d பயனர௠கரà¯à®¤à¯à®¤à¯à®°à¯ˆà®•à®³à¯ சரிபாரà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯';
+$lang['%d user deleted'] = '% d பயனாளர௠அழிகà¯à®•à®ªà¯à®ªà®Ÿ';
+$lang['%d user was not updated.'] = '% d பயனாளர௠மேமà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà¯ இலà¯à®²à¯ˆ
+';
+$lang['%d user was updated.'] = '% d பயனாளர௠மேமà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà¯.';
+$lang['%d users'] = '% d பயனரà¯à®•à®³à¯à®•à¯à®•à¯';
+$lang['%d users deleted'] = '% d பயனரà¯à®•à®³à¯ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®©';
+$lang['%d users were not updated.'] = '% d பயனரà¯à®•à®³à¯ மேமà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà¯ இலà¯à®²à¯ˆ.';
+$lang['%d seconds'] = '% d விநாடிகளிலà¯';
+$lang['%d second'] = '% d விநாடி';
+$lang['%d physicals'] = '% d பரà¯à®¨à®¿à®²à¯ˆ';
+$lang['%d physical'] = '% d பரà¯à®¨à®¿à®²à¯ˆ';
+$lang['%d anomaly has not been corrected.'] = '% d à®’à®´à¯à®™à¯à®•à®¿à®©à¯à®®à¯ˆ சரி செயà¯à®¯à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ.';
+$lang['%d anomaly has been ignored.'] = '% d à®’à®´à¯à®™à¯à®•à®¿à®©à¯à®®à¯ˆ பà¯à®±à®•à¯à®•à®£à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯';
+$lang['%d anomaly has been detected.'] = '% d à®’à®´à¯à®™à¯à®•à®¿à®©à¯à®®à¯ˆ கணà¯à®Ÿà®±à®¿à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.';
+$lang['%d users were updated.'] = '% d பயனரà¯à®•à®³à¯ மேமà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.';
+$lang['%d waiting for validation'] = '% d காதà¯à®¤à®¿à®°à¯à®•à¯à®•à®¿à®±à®¤à¯ சரிபாரà¯à®¤à¯à®¤à®²à¯';
+$lang['%d week'] = '% d வாரமà¯';
+$lang['%d weeks'] = '% d வாரஙà¯à®•à®³à¯';
+$lang['%d year'] = '% d வரà¯à®Ÿà®®à¯';
+$lang['%d years'] = '% d வரà¯à®Ÿà®™à¯à®•à®³à¯';
+$lang['%s ago'] = '% கள௠மà¯à®©à¯à®ªà¯ ';
+$lang['%s has been successfully updated.'] = '% கள௠வெறà¯à®±à®¿à®•à®°à®®à®¾à®• மேமà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.';
+$lang['%s in the future'] = '%கள௠எதிரà¯à®•à®¾à®²à®¤à¯à®¤à®¿à®²à¯';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '% கள௠உஙà¯à®•à®³à¯ local/config/config.inc.php கோபà¯à®ªà®¿à®²à¯ தவறான எனà¯à®±à¯ அமைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¿à®°à¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯';
+$lang['%s photos can not be regenerated'] = '% கள௠பà¯à®•à¯ˆà®ªà¯à®ªà®Ÿà®™à¯à®•à®³à¯ மற௠உரà¯à®µà®¾à®•à¯à®•à®®à¯ செயà¯à®¯ à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯';
+$lang['%s photos have been regenerated'] = '% கள௠பà¯à®•à¯ˆà®ªà¯à®ªà®Ÿà®™à¯à®•à®³à¯ மீணà¯à®Ÿà¯à®®à¯ உரà¯à®µà®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®•à®¿à®±à®¤à¯';
+$lang['%s value is not correct file because exif are not supported'] = '% s மதிபà¯à®ªà¯ தவறானத௠à®à®©à¯†à®©à®¿à®²à¯ எகà¯à®¸à®¿à®ªà¯ ஆதரிகà¯à®•à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '% u பயனரà¯à®•à®³à¯à®•à¯à®•à¯ தானியஙà¯à®•à¯ அனà¯à®®à®¤à®¿
+அவரà¯à®•à®³à¯ ஒர௠வழஙà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ கà¯à®´à¯à®µà¯ˆ சேரà¯à®¨à¯à®¤à®µà¯ˆ எனà¯à®ªà®¤à®¾à®²à¯.';
+$lang['(this tag will be deleted)'] = '(இநà¯à®¤ கà¯à®±à®¿ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®®à¯)';
+$lang['+ Add an upload box'] = '+ ஒர௠பதிவேறà¯à®± பெடà¯à®Ÿà®¿à®¯à¯ˆ சேரà¯à®•à¯à®•à®µà¯à®®à¯';
+$lang[', click on'] = 'சொடà¯à®•à¯à®•à®µà¯à®®à¯ மீதà¯';
+$lang['... or '] = '... அலà¯à®²à®¤à¯';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = '<em> Android கà¯à®•à®¾à®© Piwigo </ em> பயனà¯à®ªà®¾à®Ÿà¯à®Ÿà¯ உஙà¯à®•à®³à¯ Piwigo கேலரியில௠உஙà¯à®•à®³à¯ Android தொலைபேசி அலà¯à®²à®¤à¯ வரைபடà¯à®Ÿà®¿à®•à¯ˆ இணைகà¯à®• அனà¯à®®à®¤à®¿à®•à¯à®•à¯à®®à¯, சில ஆலà¯à®ªà®™à¯à®•à®³à¯ˆ உரà¯à®µà®¾à®•à¯à®• மறà¯à®±à¯à®®à¯ ஒரே நேரதà¯à®¤à®¿à®²à¯ பல பà¯à®•à¯ˆà®ªà¯à®ªà®Ÿà®™à¯à®•à®³à¯ˆ பதிவேறà¯à®±à®²à®¾à®®à¯.';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = '<em> Piwigo iOS கà¯à®•à¯ </ em> பயனà¯à®ªà®¾à®Ÿà¯à®Ÿà¯ சில ஆலà¯à®ªà®™à¯à®•à®³à¯ˆ உரà¯à®µà®¾à®•à¯à®•à®¿ ஒரே நேரதà¯à®¤à®¿à®²à¯ பல பà¯à®•à¯ˆà®ªà¯à®ªà®Ÿà®™à¯à®•à®³à¯ˆ பதிவேறà¯à®±, உஙà¯à®•à®³à¯ à®à®ªà¯‡à®¾à®©à¯, à®à®ªà®¾à®Ÿà¯ அலà¯à®²à®¤à¯ à®à®ªà®¾à®Ÿà¯ டச௠உஙà¯à®•à®³à¯ Piwigo கேலரி இணைகà¯à®• நீஙà¯à®•à®³à¯ அதிகாரமளிகà¯à®•à®¿à®•à®¿à®±à®¤à¯.';
+$lang['ACCESS_3'] = 'நிரà¯à®µà®¾à®•à®¿à®•à®³à¯ அணà¯à®•à®²à¯';
+$lang['ACCESS_4'] = 'வலை மேலாளரà¯à®•à®³à¯ அணà¯à®•à®²à¯';
+$lang['ACCESS_5'] = 'அணà¯à®•à¯à®µà®¤à®±à¯à®•à¯ இலà¯à®²à¯ˆ
+';
+$lang['Access type'] = 'அணà¯à®•à®²à¯ வகையான';
+$lang['Action'] = 'செயலà¯';
+$lang['Actions'] = 'செயலà¯à®•à®³à¯';
+$lang['Activate'] = 'செயலாகà¯à®•';
+$lang['ACCESS_2'] = 'பதிவ௠செயà¯à®¤ பயனர௠அணà¯à®•à®²à¯';
+$lang['ACCESS_1'] = 'அனைதà¯à®¤à¯ அணà¯à®•à®²à¯
+';
+$lang['ACCESS_0'] = 'இலவச அணà¯à®•à®²à¯';
+$lang['A new version of Piwigo is available.'] = 'ஒர௠பà¯à®¤à®¿à®¯ Piwigo பதிபà¯à®ªà¯ உளà¯à®³à®¤à¯.';
+$lang['A locked gallery is only visible to administrators'] = 'ஒர௠பூடà¯à®Ÿà®¿à®¯ கேலரி நிரà¯à®µà®¾à®•à®¿à®•à®³à®¾à®²à¯ மடà¯à®Ÿà¯à®®à¯‡ காண à®®à¯à®Ÿà®¿à®¯à¯à®®à¯';
+$lang['Activate Navigation Bar'] = 'செயலà¯à®ªà®Ÿà¯à®¤à¯à®¤à®µà¯à®®à¯ திசை படà¯à®Ÿà¯ˆà®¯à®¿à®²à¯';
+$lang['Activate Navigation Thumbnails'] = 'திசையமைபà¯à®ªà¯ சிறà¯à®ªà®Ÿà®µà¯à®°à¯à®•à¯à®•à®³à¯ˆà®¯à¯à®®à¯ செயலà¯à®ªà®Ÿà¯à®¤à¯à®¤à®µà¯à®®à¯';
+$lang['Add'] = 'சேரà¯à®•à¯à®•';
+$lang['Add New Language'] = 'பà¯à®¤à®¿à®¯ மொழியை சேரà¯à®•à¯à®•';
+$lang['Add New Theme'] = 'ஒர௠பà¯à®¤à®¿à®¯ கரà¯à®ªà¯à®ªà¯†à®¾à®°à¯à®³à¯ˆ சேரà¯à®•à¯à®•';
+$lang['Add Photos'] = 'ஒர௠பà¯à®•à¯ˆà®ªà¯à®ªà®Ÿà®¤à¯à®¤à¯ˆ சேரà¯à®•à¯à®•';
+$lang['Add a criteria'] = 'ஒர௠நிரà¯à®£à®¯ அளவை சேரà¯à®•à¯à®•';
+$lang['Add a filter'] = 'ஒர௠வடிபà¯à®ªà®¾à®©à¯ சேரà¯à®•à¯à®•';
+$lang['Add a tag'] = 'ஒர௠கà¯à®±à®¿à®¯à¯ˆ சேரà¯à®•à¯à®•';
+$lang['Add a user'] = 'ஒர௠பயனர௠சேரà¯à®•à¯à®•';
+$lang['Add a virtual album'] = 'ஒர௠மெயà¯à®¨à®¿à®•à®°à¯ ஆலà¯à®ªà®®à¯ சேரà¯à®•à¯à®•';
+$lang['Add another set of photos'] = 'மறà¯à®±à¯†à®¾à®°à¯ பà¯à®•à¯ˆà®ªà¯à®ªà®Ÿà®™à¯à®•à®³à¯ தொகà¯à®ªà¯à®ªà¯ˆà®…மைகà¯à®•';
+$lang['Add detailed content'] = 'சில விவரமான உளà¯à®³à®Ÿà®•à¯à®•à®¤à¯à®¤à¯ˆ சேரà¯à®•à¯à®•';
+$lang['Add group'] = 'கà¯à®´à¯à®µà®¾à®• சேரà¯à®•à¯à®•';
+$lang['Activate comments'] = 'கரà¯à®¤à¯à®¤à¯à®°à¯ˆà®•à®³à¯ˆ செயலà¯à®ªà®Ÿà¯à®¤à¯à®¤';
+$lang['Activate icon "%s"'] = 'படவà¯à®°à¯à®µà¯ˆ செயலà¯à®ªà®Ÿà¯à®¤à¯à®¤ "% s"';
+$lang['Activate icon "new" next to albums and pictures'] = 'படவà¯à®°à¯à®µà¯ˆ செயலà¯à®ªà®Ÿà¯à®¤à¯à®¤ "பà¯à®¤à®¿à®¯" அடà¯à®¤à¯à®¤à®¤à®¾à®• ஆலà¯à®ªà®™à¯à®•à®³à¯ மறà¯à®±à¯à®®à¯ படஙà¯à®•à®³à®¿à®©à¯';
+$lang['Active Languages'] = 'செயலà¯à®®à®¿à®•à¯ மொழிகளà¯';
+$lang['Active Plugins'] = 'செயலà¯à®®à®¿à®•à¯ செரà¯à®•à¯à®¨à®¿à®°à®²à¯à®•à®³à¯';
+$lang['Active Themes'] = 'செயலà¯à®®à®¿à®•à¯ கரà¯à®ªà¯à®ªà¯†à®¾à®°à¯à®³à¯à®•à®³à¯';
+$lang['Add tags'] = 'கà¯à®±à®¿à®šà¯à®šà¯†à®¾à®±à¯à®•à®³à¯ˆ சேரà¯à®•à¯à®•';
+$lang['Add to caddie'] = 'Caddies சேரà¯à®•à¯à®•à®µà¯à®®à¯';
+$lang['Add write access to the "%s" directory'] = 'சேரà¯à®•à¯à®• எழà¯à®¤à¯à®µà®¤à®±à¯à®•à¯ அணà¯à®•à®²à¯ "%s" அடைவிலà¯';
+$lang['Add/delete a permalink'] = 'ஒர௠பெரà¯à®®à®¾à®²à®¿à®©à¯à®•à¯ சேரà¯à®•à¯à®• / நீகà¯à®•';
+$lang['Added by %s'] = 'சேரà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯ மூலமாக % s';
+$lang['Administration Home'] = 'நிரà¯à®µà®¾à®•à®¤à¯à®¤à®¿à®©à¯ à®®à¯à®•à®ªà¯à®ªà¯';
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'அடோப௠ஃபோடà¯à®Ÿà¯‹à®·à®¾ Lightroom வடிவமைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ பà¯à®•à¯ˆà®ªà¯à®ªà®Ÿà®•à¯à®•à®²à¯ˆ மெனà¯à®ªà¯Šà®°à¯à®³à¯ டிஜிடà¯à®Ÿà®²à¯ படஙà¯à®•à®³à¯ அதிக அளவில௠நிரà¯à®µà®•à®¿à®ªà¯à®ªà®¤à®±à¯à®•à®¾à®© மறà¯à®±à¯à®®à¯ பிநà¯à®¤à¯ˆà®¯ தயாரிபà¯à®ªà¯ பணி செயà¯à®µà®¤à®±à¯à®•à¯.';
+$lang['Advanced features'] = 'à®®à¯à®©à¯à®©à¯‡à®±à®¿à®¯ à®…à®®à¯à®šà®™à¯à®•à®³à¯';
+$lang['Album "%s" has been added'] = 'ஆலà¯à®ªà®®à¯ "%களà¯" சேரà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯';
+$lang['Album "%s" now contains %d photos'] = 'ஆலà¯à®ªà®®à¯ "% களà¯" இபà¯à®ªà¯Šà®´à¯à®¤à¯% d பà¯à®•à¯ˆà®ªà¯à®ªà®Ÿà®™à¯à®•à®³à¯ˆ கொணà¯à®Ÿà®¿à®°à¯à®•à¯à®•à®¿à®±à®¤à¯';
+$lang['Album list management'] = 'ஆலà¯à®ªà®®à¯ படà¯à®Ÿà®¿à®¯à®²à¯ மேலாணà¯à®®à¯ˆ';
+$lang['Album manual order was saved'] = 'ஆலà¯à®ªà®®à¯ கைமà¯à®±à¯ˆà®¯à®¾à®• வரிசையில௠சேமிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®®à¯';
+$lang['Album name'] = 'ஆலà¯à®ªà®®à¯ பெயரà¯';
+$lang['Album photos associated to the following albums: %s'] = 'ஆலà¯à®ªà®®à¯ பà¯à®•à¯ˆà®ªà¯à®ªà®Ÿà®™à¯à®•à®³à¯ தொடரà¯à®ªà¯à®Ÿà¯ˆà®¯à®¤à®¾à®• பினà¯à®µà®°à¯à®®à¯ ஆலà¯à®ªà®™à¯à®•à®³à¯:% களà¯';
+$lang['Album updated successfully'] = 'ஆலà¯à®ªà®®à¯ வெறà¯à®±à®¿à®•à®°à®®à®¾à®• பà¯à®¤à¯à®ªà¯à®ªà®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®©';
+$lang['Albums authorized thanks to group associations'] = 'ஆலà¯à®ªà®™à¯à®•à®³à¯ à®…à®™à¯à®•à¯€à®•à®°à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ நனà¯à®±à®¿ கà¯à®´à¯ சஙà¯à®•à®¤à¯à®¤à¯ˆ';
+$lang['Albums automatically sorted'] = 'தனà¯à®©à®¿à®šà¯à®šà¯ˆà®¯à®¾à®• வரிசைபà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿ ஆலà¯à®ªà®™à¯à®•à®³à¯';
+$lang['All %d photos are selected'] = 'அனைதà¯à®¤à¯% d பà¯à®•à¯ˆà®ªà¯à®ªà®Ÿà®™à¯à®•à®³à¯ தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®©';
+$lang['All extensions are up to date.'] = 'அனைதà¯à®¤à¯ நீடà¯à®šà®¿à®•à®³à¯ இரà¯à®•à¯à®•à®¿à®©à¯à®±à®© இனà¯à®±à¯à®µà®°à¯ˆ.';
+$lang['All languages are up to date.'] = 'அனைதà¯à®¤à¯ மொழிகளà¯à®®à¯ இரà¯à®•à¯à®•à®¿à®©à¯à®±à®© இனà¯à®±à¯à®µà®°à¯ˆ.';
+$lang['All plugins are up to date.'] = 'அனைதà¯à®¤à¯ செரà¯à®•à¯à®¨à®¿à®°à®²à¯à®•à®³à¯ இனà¯à®±à¯à®µà®°à¯ˆ பà¯à®¤à¯à®ªà¯à®ªà®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ நிலையில௠உளà¯à®³à®©';
+$lang['All themes are up to date.'] = 'அனைதà¯à®¤à¯ கரà¯à®ªà¯à®ªà¯†à®¾à®°à¯à®³à¯à®•à®³à¯ இனà¯à®±à¯à®µà®°à¯ˆ பà¯à®¤à¯à®ªà¯à®ªà®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ நிலையில௠உளà¯à®³à®©';
+$lang['Allow rating'] = 'அனà¯à®®à®¤à®¿à®•à¯à®• மதிபà¯à®ªà¯€à®Ÿà¯';
+$lang['Allow user customization'] = 'பயனர௠தனிபயனாகà¯à®•à®¤à¯à®¤à®¿à®±à¯à®•à¯ அனà¯à®®à®¤à®¿à®•à¯à®•à®¿à®±à®¤à¯';
+$lang['Allow user registration'] = 'பயனர௠பதிவà¯à®šà¯†à®¯à¯à®¤à®²à¯ அனà¯à®®à®¤à®¿à®•à¯à®•à®¿à®±à®¤à¯';
+$lang['Allow users to delete their own comments'] = 'பயனரà¯à®•à®³à¯ தஙà¯à®•à®³à¯ சொநà¯à®¤ கரà¯à®¤à¯à®¤à¯à®•à¯à®•à®³à¯ˆà®¯à¯à®®à¯ நீகà¯à®• அனà¯à®®à®¤à®¿à®•à¯à®•à®¿à®±à®¤à¯';
+$lang['All optimizations have been successfully completed.'] = 'அனைதà¯à®¤à¯ உகநà¯à®¤à®¤à®¾à®•à¯à®•à®²à¯à®•à®³à¯ˆ வெறà¯à®±à®¿à®•à®°à®®à®¾à®• à®®à¯à®Ÿà®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.';
+$lang['Allow users to edit their own comments'] = 'பயனரà¯à®•à®³à¯ தஙà¯à®•à®³à¯ சொநà¯à®¤ கரà¯à®¤à¯à®¤à¯à®°à¯ˆà®•à®³à¯ˆ திரà¯à®¤à¯à®¤ அனà¯à®®à®¤à®¿à®•à¯à®•à®¿à®©à¯à®±à®©';
+$lang['Allowed file types: %s.'] = 'அனà¯à®®à®¤à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ கோபà¯à®ªà¯ வகைகளà¯:% களà¯.';
+$lang['An information email was sent to group "%s"'] = 'தகவல௠மினà¯à®©à®žà¯à®šà®²à¯ அனà¯à®ªà¯à®ªà®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯ கà¯à®´à¯à®•à¯à®•à®³à¯à®•à¯à®•à¯ "% s"';
+$lang['Anomaly'] = 'நெறி பிறழà¯à®µà¯';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'வலைதà¯à®¤à®²à¯ˆà®®à¯ˆà®•à®³à¯ மடà¯à®Ÿà¯à®®à¯ இநà¯à®¤ தாவலை பாரà¯à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à¯à®®à¯,
+ நிரà¯à®µà®¾à®•à®¿à®•à®³à¯ இலà¯à®²à¯ˆ.';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'தà¯à®µà®¾à®°à®®à¯ ஒர௠சகà¯à®¤à®¿à®µà®¾à®¯à¯à®¨à¯à®¤ கரà¯à®µà®¿à®¯à®¾à®• உளà¯à®³à®¤à¯ படஙà¯à®•à®³à¯ˆ தà¯à®²à¯à®²à®¿à®¯à®®à®¾à®•à¯à®• மறà¯à®±à¯à®®à¯ மேக௠மீத௠பாரிய நூலகஙà¯à®•à®³à¯ நிரà¯à®µà®•à®¿à®•à¯à®•.';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'இடைவெளியில௠தனிதà¯à®¤à¯†à®Ÿà¯à®¤à¯à®¤ நிறம௠நிபà¯à®£à®¤à¯à®¤à¯à®µ பà¯à®•à¯ˆà®ªà¯à®ªà®Ÿà®•à¯à®•à®¾à®°à®°à¯à®•à®³à¯ வடிவமைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯
+iPhoto எளிமையாக.';
+$lang['Applications'] = 'பயனà¯à®ªà®¾à®Ÿà¯à®•à®³à¯';
+$lang['Apply action'] = 'செயலை பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯';
+$lang['Apply selected corrections'] = 'தெரிவà¯à®šà¯†à®¯à¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿ திரà¯à®¤à¯à®¤à®™à¯à®•à®³à¯ˆ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯';
+$lang['Apply to sub-albums'] = 'தà¯à®£à¯ˆ ஆலà¯à®ªà®™à¯à®•à®³à¯ˆ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯';
+$lang['An error has occured during upgrade.'] = 'ஒர௠பிழை à®à®±à¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯ மேமà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®®à¯ போத௠.';
+$lang['An error occured during extraction (%s).'] = 'ஒர௠பிழை நிகழà¯à®¨à¯à®¤à®¤à¯ கோபà¯à®ªà¯à®•à®³à¯ (% கள௠) பிரிதà¯à®¤à¯†à®Ÿà¯à®•à¯à®•à¯à®®à¯
+பொழà¯à®¤à¯.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'பிரிதà¯à®¤à¯†à®Ÿà¯à®•à¯à®•à¯à®®à¯ பொழà¯à®¤à¯ ஒர௠பிழை à®à®±à¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.உஙà¯à®•à®³à¯ piwigo நிறà¯à®µà®²à¯ கோபà¯à®ªà¯ அனà¯à®®à®¤à®¿à®•à®³à¯ˆ சரிபாரà¯à®•à¯à®•à®µà¯à®®à¯.<br>
+ <a href="%s">பதிகை காடà¯à®Ÿ இஙà¯à®•à¯‡ கிளிக௠செயà¯à®¯à®µà¯à®®à¯</a>.';
+$lang['Average rate'] = 'சராசரி விகிதமà¯';
+$lang['Basic settings'] = 'அடிபà¯à®ªà®Ÿà¯ˆ அமைபà¯à®ªà¯à®•à®³à¯';
+$lang['Batch Manager'] = 'தொகà¯à®¤à®¿ மேலாளரà¯';
+$lang['Bound Theme'] = 'பிணைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ
+கரà¯à®ªà¯à®ªà¯†à®¾à®°à¯à®³à¯à®•à®³à¯';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'நீஙà¯à®•à®³à¯ இநà¯à®¤ மேமà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à¯ˆ நிறà¯à®µ வேணà¯à®Ÿà¯à®®à®¾? நீஙà¯à®•à®³à¯, சரிபாரà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯
+இநà¯à®¤ பதிபà¯à®ªà¯ à®®à¯à®©à¯à®©à®¤à®¾à®• நிறà¯à®µà®²à¯ நீகà¯à®•à®®à¯ வேணà¯à®Ÿà¯à®®à¯ எனிலà¯.';
+$lang['Are you sure you want to delete this plugin?'] = 'நீஙà¯à®•à®³à¯ இநà¯à®¤ செரà¯à®•à¯à®¨à®¿à®°à®²à¯ˆ நீகà¯à®• வேணà¯à®Ÿà¯à®®à®¾?';
+$lang['Are you sure you want to install this plugin?'] = 'நீஙà¯à®•à®³à¯ இநà¯à®¤ செரà¯à®•à¯à®¨à®¿à®°à®²à¯ˆ நிறà¯à®µ வேணà¯à®Ÿà¯à®®à®¾?';
+$lang['Associate to album'] = 'ஆலà¯à®ªà®¤à¯à®¤à®¿à®±à¯à®•à¯ இணைகà¯à®•à®µà¯à®®à¯';
+$lang['Associated'] = '
+தொடரà¯à®ªà¯à®Ÿà¯ˆà®¯à®¤à®¾à®•';
+$lang['Authorized'] = 'à®…à®™à¯à®•à¯€à®•à®°à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ';
+$lang['Automatic correction'] = 'தானியகà¯à®• திரà¯à®¤à¯à®¤à®®à¯';
+$lang['Automatic sort order'] = 'தானியகà¯à®• வரிசை à®’à®´à¯à®™à¯à®•à¯ˆ';
+?> \ No newline at end of file
diff --git a/language/ta_IN/common.lang.php b/language/ta_IN/common.lang.php
index 0e201c0a5..f21ff3072 100644
--- a/language/ta_IN/common.lang.php
+++ b/language/ta_IN/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: தமிழ௠[IN]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=638
Author: Piwigo team
Author URI: http://piwigo.org
@@ -35,12 +35,12 @@ $lang_info['code'] = 'ta';
$lang_info['zero_plural'] = true;
-$lang['%d album updated'] = '%d ஆலà¯à®ªà®®à¯ மேமà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯';
+$lang['%d album updated'] = '%d ஆலà¯à®ªà®®à¯ பà¯à®¤à¯à®ªà¯à®ªà®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯';
$lang['%d albums updated'] = '%d ஆலà¯à®ªà®™à¯à®•à®³à¯ மேமà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯';
$lang['%d comment to validate'] = '%d கரà¯à®¤à¯à®¤à¯ பரிசீலிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®•à®¿à®±à®¤à¯';
$lang['%d comment'] = '%d கரà¯à®¤à¯à®¤à¯';
$lang['%d comments to validate'] = '%d கரà¯à®¤à¯à®¤à¯ பரிசீலிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®•à®¿à®±à®¤à¯';
-$lang['%d comments'] = '%d கரà¯à®¤à¯à®¤à¯';
+$lang['%d comments'] = '%d கரà¯à®¤à¯à®¤à¯à®°à¯ˆà®•à®³à¯';
$lang['%d hit'] = '%d ஹிடà¯';
$lang['%d hits'] = '%d ஹிடà¯à®¸à¯';
$lang['%d Kb'] = '%d கேபி';
@@ -179,7 +179,6 @@ $lang['IPTC Metadata'] = 'IPTC மேலà¯à®¨à®¿à®²à¯ˆ தரவà¯';
$lang['Identification'] = 'அடையாளமà¯';
$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'இத௠தவற௠எனà¯à®±à®¾à®²à¯, இநà¯à®¤ மினà¯à®©à®žà¯à®šà®²à¯ பà¯à®±à®•à¯à®•à®£à®¿à®•à¯à®•à®µà¯à®®à¯, எதà¯à®µà¯à®®à¯ நடகà¯à®•à®¾à®¤à¯.';
$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'நீஙà¯à®•à®³à¯ தவறà¯à®¤à®²à®¾à®• இநà¯à®¤ மினà¯à®©à®žà¯à®šà®²à¯ வநà¯à®¤à¯à®³à¯à®³à®¤à¯ நினைதà¯à®¤à®¾à®²à¯, எஙà¯à®•à®³à¯ˆà®¤à¯ தொடரà¯à®ªà¯ கொளà¯à®• %s';
-$lang['Interface theme'] = 'à®®à¯à®•à®ªà¯à®ªà¯ வாரà¯à®ªà¯à®ªà¯à®°à¯';
$lang['Invalid key'] = 'செலà¯à®²à®¾à®¤ விசை';
$lang['Invalid password!'] = 'கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ தவறானதà¯!';
$lang['Invalid username or email'] = 'தவறான பயனரà¯à®ªà¯†à®¯à®°à¯ அலà¯à®²à®¤à¯ மினà¯à®©à®žà¯à®šà®²à¯';
@@ -294,7 +293,6 @@ $lang['xlarge'] = 'XL - மிகப௠பெரியதà¯';
$lang['xsmall'] = 'XS - மிகப௠சிறியதà¯';
$lang['xxlarge'] = 'XXL - பிரமà¯à®®à®¾à®£à¯à®Ÿà®®à®¾à®©';
$lang['photos posted during the last %d days'] = 'கடநà¯à®¤ %d நாடà¯à®•à®³à®¿à®²à¯ இடபà¯à®ªà®Ÿà¯à®Ÿ பà¯à®•à¯ˆà®ªà¯à®ªà®Ÿà®™à¯à®•à®³à¯';
-$lang['please enter your password again'] = 'மீணà¯à®Ÿà¯à®®à¯ உஙà¯à®•à®³à¯ கடவà¯à®šà¯à®šà¯†à®¾à®²à¯à®²à¯ˆ உளà¯à®³à®¿à®Ÿà®µà¯à®®à¯';
$lang['posted after %s (%s)'] = 'பிறக௠பதிவிடபà¯à®ªà®Ÿà¯à®Ÿà®¤à¯ %s (%s)';
$lang['posted before %s (%s)'] = 'à®®à¯à®©à¯à®©à®°à¯ பதிவிடபà¯à®ªà®Ÿà¯à®Ÿà®¤à¯ %s (%s)';
$lang['posted between %s (%s) and %s (%s)'] = 'இடையே பதிவிடபà¯à®ªà®Ÿà¯à®Ÿà®¤à¯ %s (%s) மறà¯à®®à¯ %s (%s)';
@@ -413,4 +411,13 @@ $lang['Welcome to your Piwigo photo gallery!'] = 'உஙà¯à®•à®³à¯ˆ Piwigo பà
$lang['Yes'] = 'ஆமà¯';
$lang['You are not authorized to access the requested page'] = 'நீஙà¯à®•à®³à¯ கோரிய பகà¯à®•à®¤à¯à®¤à¯ˆ அணà¯à®• உஙà¯à®•à®³à¯à®•à¯à®•à¯ அதிகாரம௠இலà¯à®²à¯ˆ';
$lang['You will receive a link to create a new password via email.'] = 'மினà¯à®©à®žà¯à®šà®²à¯ வழியாக ஒர௠பà¯à®¤à®¿à®¯ கடவà¯à®šà¯à®šà¯†à®¾à®²à¯à®²à¯ˆ உரà¯à®µà®¾à®•à¯à®• ஒர௠இணைபà¯à®ªà¯ˆ பெறà¯à®µà¯€à®°à¯à®•à®³à¯.';
+$lang['Email'] = 'மினà¯à®©à®žà¯à®šà®²à¯';
+$lang['Go back to the album'] = 'மீணà¯à®Ÿà¯à®®à¯,ஆலà¯à®ªà®®à¯ செலà¯à®²';
+$lang['Last Page'] = 'கடைசி பகà¯à®•à®®à¯';
+$lang['Website'] = 'இணையதளமà¯';
+$lang['Your website URL is invalid'] = 'உஙà¯à®•à®³à¯ வலைதà¯à®¤à®³à®¤à¯à®¤à®¿à®©à¯ URL தவறானதà¯';
+$lang['First Page'] = 'à®®à¯à®¤à®²à¯ பகà¯à®•à®®à¯';
+$lang['Password is missing. Please enter the password.'] = 'கடவà¯à®šà¯à®šà¯†à®¾à®²à¯ விடà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯. தயவ௠செயà¯à®¤à¯
+கடவà¯à®šà¯à®šà¯†à®¾à®²à¯à®²à¯ˆ உளà¯à®³à®¿à®Ÿà®µà¯à®®à¯';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'கடவà¯à®šà¯à®šà¯†à®¾à®²à¯à®²à¯ˆ உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à¯ விடà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯. தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯à®¤à¯à®¤ கடவà¯à®šà¯à®šà¯†à®¾à®²à¯à®²à¯ˆ உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®µà¯à®®à¯';
?> \ No newline at end of file
diff --git a/language/ta_IN/install.lang.php b/language/ta_IN/install.lang.php
new file mode 100755
index 000000000..6b24e74d2
--- /dev/null
+++ b/language/ta_IN/install.lang.php
@@ -0,0 +1,72 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'ஒர௠மாறà¯à®±à¯ தீரà¯à®µà¯ மேலே பெடà¯à®Ÿà®¿à®¯à®¿à®²à¯ உரை நகலெடà¯à®¤à¯à®¤à¯ கோபà¯à®ªà¯à®•à®³à¯ˆ ஒடà¯à®Ÿà®µà¯à®®à¯ உளà¯à®³à®¤à¯."local/config/database.inc.php"(எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ: database.inc.php மடà¯à®Ÿà¯à®®à¯, textarea எனà¯à®© எநà¯à®¤ வரியை திரà¯à®®à¯à®ª அலà¯à®²à®¤à¯ இடைவெளி எழà¯à®¤à¯à®¤à¯ கொணà¯à®Ÿà®¿à®°à¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'கடà¯à®Ÿà®®à¯ˆà®ªà¯à®ªà¯ கோபà¯à®ªà¯ உரà¯à®µà®¾à®•à¯à®•à®®à¯ local/config/database.inc.php தோலà¯à®µà®¿à®¯à®Ÿà¯ˆà®¨à¯à®¤à®¤à¯.';
+$lang['Default gallery language'] = 'இயலà¯à®ªà¯à®¨à®¿à®²à¯ˆ கேலரி மொழி';
+$lang['Download the config file'] = 'Config கோபà¯à®ªà¯ˆ பதிவிறகà¯à®•';
+$lang['Hope to see you back soon.'] = 'நீஙà¯à®•à®³à¯ விரைவில௠திரà¯à®®à¯à®ªà®¿ பாரà¯à®•à¯à®• நமà¯à®ªà¯à®•à®¿à®±à¯‡à®©à¯';
+$lang['Host'] = 'host';
+$lang['Installation'] = 'நிறà¯à®µà®²à¯';
+$lang['It appears your webhost is currently running PHP %s.'] = 'இத௠உஙà¯à®•à®³à®¤à¯ webhost தறà¯à®ªà¯‹à®¤à¯ PHP% கள௠இயகà¯à®•à®¤à¯à®¤à®¿à®²à¯ தோனà¯à®±à¯à®•à®¿à®©à¯à®±à®¤à¯.';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'இத௠பாரà¯à®µà¯ˆà®¯à®¾à®³à®°à¯à®•à®³à¯à®•à¯à®•à¯ காணà¯à®ªà®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®®à¯. இத௠இணைய நிரà¯à®µà®¾à®•à®¤à¯à®¤à®¿à®²à¯ அவசியமà¯';
+$lang['Just another Piwigo gallery'] = 'மறà¯à®±à¯Šà®°à¯ Piwigo கேலரி';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'இதை ரகசியமாக வைதà¯à®¤à¯, இதை நீஙà¯à®•à®³à¯ நிரà¯à®µà®¾à®•à®¤à¯à®¤à®¿à®²à¯ பலகதà¯à®¤à¯ˆ அணà¯à®•à¯à®µà®¤à®±à¯à®•à¯ உதவà¯à®•à®¿à®±à®¤à¯';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'உதவி வேணà¯à®Ÿà¯à®®à®¾? <a உஙà¯à®•à®³à¯ கேளà¯à®µà®¿ கேடà¯à®• href="%s"> Piwigo செயà¯à®¤à®¿ பலகை </ a>';
+$lang['Database configuration'] = 'தரவà¯à®¤à¯à®¤à®³ உளà¯à®³à®®à¯ˆà®µà¯ˆ';
+$lang['Database name'] = 'தரவà¯à®¤à¯à®¤à®³à®¤à¯à®¤à®¿à®©à¯ பெயரà¯';
+$lang['Database table prefix'] = 'தரவà¯à®¤à¯à®¤à®³ அடà¯à®Ÿà®µà®£à¯ˆà®•à®³à¯ à®®à¯à®©à¯à®©à®¿à®£à¯ˆà®ªà¯à®ªà¯';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'சரà¯à®µà®°à¯ இணைபà¯à®ªà¯ வெறà¯à®±à®¿, ஆனால௠தரவà¯à®¤à¯à®¤à®³à®¤à¯à®¤à®¿à®©à¯ இணைபà¯à®ªà¯ சாதà¯à®¤à®¿à®¯à®®à¯ இலà¯à®²à¯ˆ.';
+$lang['Congratulations, Piwigo installation is completed'] = 'வாழà¯à®¤à¯à®¤à¯à®•à¯à®•à®³à¯, Piwigo நிறà¯à®µà®²à¯, à®®à¯à®Ÿà®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯';
+$lang['Can\'t connect to server'] = 'சரà¯à®µà®°à¯à®Ÿà®©à¯ இணைகà¯à®• à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ';
+$lang['Basic configuration'] = 'அடிபà¯à®ªà®Ÿà¯ˆ கடà¯à®Ÿà®®à¯ˆà®ªà¯à®ªà¯';
+$lang['Admin configuration'] = 'நிரà¯à®µà®¾à®•à®®à¯ கடà¯à®Ÿà®®à¯ˆà®ªà¯à®ªà¯';
+$lang['webmaster login can\'t contain characters \' or "'] = 'வலை மேலாளரின௠உளà¯à®¨à¯à®´à¯ˆà®µà¯ எழà¯à®¤à¯à®¤à¯à®•à¯à®•à®³à¯ \' or " இலà¯à®²à®¾à®®à®²à¯ இரà¯à®•à¯à®•à®²à®¾à®®à¯';
+$lang['verification'] = 'சரிபாரà¯à®¤à¯à®¤à®²à¯';
+$lang['user password given by your host provider'] = 'பயனர௠கடவà¯à®šà¯à®šà¯†à®¾à®²à¯ உஙà¯à®•à®³à¯à®Ÿà¯ˆà®¯ host வழஙà¯à®•à¯à®¨à®°à¯ வழஙà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯';
+$lang['user login given by your host provider'] = 'உஙà¯à®•à®³à¯à®Ÿà¯ˆà®¯ host வழஙà¯à®•à¯à®¨à®°à¯ வழஙà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ பயனர௠உளà¯à®¨à¯à®´à¯ˆà®µà¯';
+$lang['localhost or other, supplied by your host provider'] = 'localhost அலà¯à®²à®¤à¯ வேற௠வழஙà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ உஙà¯à®•à®³à¯à®Ÿà¯ˆà®¯ host வழஙà¯à®•à¯à®¨à®°à¯ˆ';
+$lang['please enter your password again'] = 'தயவà¯à®šà¯†à®¯à¯à®¤à¯ மறà¯à®ªà®Ÿà®¿à®¯à¯à®®à¯ உஙà¯à®•à®³à¯à®Ÿà¯ˆà®¯ கடவà¯à®šà¯à®šà¯†à®¾à®²à¯à®²à¯ˆ உளà¯à®³à®¿à®Ÿà®µà¯à®®à¯';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'ஆலோசனை தயஙà¯à®• வேணà¯à®Ÿà®¾à®®à¯ நமà¯à®®à¯à®Ÿà¯ˆà®¯ கரà¯à®¤à¯à®¤à¯à®•à¯à®•à®³à®®à¯
+எநà¯à®¤à®µà¯†à®¾à®°à¯ உதவிகà¯à®•à¯.:% s';
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'நீஙà¯à®•à®³à¯ பà¯à®°à®µà®©à¯ வழஙà¯à®•à¯à®¨à®°à®¿à®Ÿà®®à¯ ஆதரவ௠பாரà¯à®•à¯à®•à®µà¯à®®à¯ மறà¯à®±à¯à®®à¯ பாரà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯ எபà¯à®ªà®Ÿà®¿ நீஙà¯à®•à®³à¯ PHP 5 மூலம௠மாறà¯à®±à®²à®¾à®®à¯.';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'நீஙà¯à®•à®³à¯ கடà¯à®Ÿà®®à¯ˆà®ªà¯à®ªà¯ கோபà¯à®ªà®¿à®©à¯ˆ பதிவிறகà¯à®•à®®à¯ செயà¯à®¯à®²à®¾à®®à¯
+மறà¯à®±à¯à®®à¯ பதிவேறà¯à®±à®²à®¾à®®à¯ அத௠உஙà¯à®•à®³à¯à®Ÿà¯ˆà®¯ local/config நிறà¯à®µà®²à®¿à®©à¯ கோபà¯à®ªà®•à®¤à¯à®¤à®¿à®²à¯';
+$lang['also given by your host provider'] = 'மேலà¯à®®à¯ வழஙà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®‰à®™à¯à®•à®³à¯à®Ÿà¯ˆà®¯ பà¯à®°à®µà®©à¯ வழஙà¯à®•à¯à®¨à®°à®¿à®Ÿà®®à¯';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'தரவà¯à®¤à¯à®¤à®³ அடà¯à®Ÿà®µà®£à¯ˆà®¯à®¿à®²à¯ பெயரை à®®à¯à®©à¯à®©à¯†à®¾à®Ÿà¯à®Ÿà®¾à®• (உஙà¯à®•à®³à¯à®Ÿà¯ˆà®¯ அடà¯à®Ÿà®µà®£à¯ˆà®•à®³à¯ˆ சிறபà¯à®ªà®¾à®• நிரà¯à®µà®•à®¿à®•à¯à®• உதவà¯à®®à¯)';
+$lang['enter a login for webmaster'] = 'தயவà¯à®šà¯†à®¯à¯à®¤à¯ உளà¯à®³à®¿à®Ÿà®µà¯à®®à¯ வலைமேலாளரின௠பயனரà¯à®ªà¯†à®¯à®°à¯';
+$lang['Welcome to your new installation of Piwigo!'] = 'வரவேறà¯à®•à®¿à®±à¯‡à®¾à®®à¯
+உஙà¯à®•à®³à¯à®Ÿà¯ˆà®¯ பà¯à®¤à®¿à®¯ Piwigo நிறà¯à®µà®²à¯! செயà¯à®¯';
+$lang['Welcome to my photo gallery'] = 'வரவேறà¯à®•à®¿à®±à¯‡à®©à¯
+எனà¯à®©à¯à®Ÿà¯ˆà®¯ பà¯à®•à¯ˆà®ªà¯à®ªà®Ÿà®®à¯ கேலரிகà¯à®•à¯';
+$lang['Try to configure PHP 5'] = 'PHP 5 கடà¯à®Ÿà®®à¯ˆà®•à¯à®• à®®à¯à®¯à®±à¯à®šà®¿à®•à¯à®•à®µà¯à®®à¯';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'பாரà¯à®µà¯ˆà®¯à®¾à®³à®°à¯à®•à®³à¯ இநà¯à®¤ மினà¯à®©à®žà¯à®šà®²à¯ˆ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿ தளதà¯à®¤à®¿à®©à¯ நிரà¯à®µà®¾à®•à®¿à®¯à¯ˆ தொடரà¯à®ªà¯à®•à¯†à®¾à®³à¯à®³à®µà¯à®®à¯';
+$lang['User'] = 'பயனரà¯';
+$lang['Sorry!'] = 'வரà¯à®¨à¯à®¤à¯à®•à®¿à®±à¯‡à®©à¯!';
+$lang['Start Install'] = 'நிறà¯à®µà®²à¯ˆ தொடஙà¯à®•à¯';
+$lang['Password ']['confirm'] = 'கடவà¯à®šà¯à®šà¯†à®¾à®²à¯à®²à¯ˆ [உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®µà¯à®®à¯].';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo PHP 5 கடà¯à®Ÿà®®à¯ˆà®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo à®®à¯à®¯à®±à¯à®šà®¿ செயà¯à®¯à®²à®¾à®®à¯
+à®’à®°à¯. htaccess கோபà¯à®ªà¯ உரà¯à®µà®¾à®•à¯à®•à¯à®µà®¤à®¿à®²à¯ அலà¯à®²à®¤à¯ மாறà¯à®±à®¿à®¯à®®à¯ˆà®ªà¯à®ªà®¤à®©à¯ மூலம௠PHP 5 உஙà¯à®•à®³à¯ கடà¯à®Ÿà®®à¯ˆà®ªà¯à®ªà¯ மாற';
+$lang['PHP 5 is required'] = 'PHP 5 தேவைபà¯à®ªà®Ÿà¯à®•à®¿à®±à®¤à¯';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'கà¯à®±à®¿à®ªà¯à®ªà¯ நீஙà¯à®•à®³à¯‡ உஙà¯à®•à®³à¯ கடà¯à®Ÿà®®à¯ˆà®ªà¯à®ªà¯ˆ மாறà¯à®± செயà¯à®¯à®²à®¾à®®à¯, மேலà¯à®®à¯ Piwigo மீணà¯à®Ÿà¯à®®à¯ தà¯à®µà®•à¯à®•à®µà¯à®®à¯';
+?> \ No newline at end of file
diff --git a/language/ta_IN/upgrade.lang.php b/language/ta_IN/upgrade.lang.php
new file mode 100755
index 000000000..3b3f84402
--- /dev/null
+++ b/language/ta_IN/upgrade.lang.php
@@ -0,0 +1,43 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Only administrator can run upgrade: please sign in below.'] = 'ஒர௠நிரà¯à®µà®¾à®•à®¿ மடà¯à®Ÿà¯à®®à¯ தான௠ஒர௠மேமà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à¯ˆ இயகà¯à®• à®®à¯à®Ÿà®¿à®¯à¯à®®à¯: கீழே நà¯à®´à¯ˆà®¯à¯à®™à¯à®•à®³à¯.';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'ஒரே சிறà¯à®ªà®Ÿà®™à¯à®•à®³à¯ˆ à®®à¯à®©à¯à®©à¯†à®¾à®Ÿà¯à®Ÿà¯ மறà¯à®±à¯à®®à¯ வலை மேலாளரின௠மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿ à®®à¯à®¨à¯à®¤à¯ˆà®¯ கடà¯à®Ÿà®®à¯ˆà®ªà¯à®ªà¯ இரà¯à®¨à¯à®¤à¯ சேமிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'ஒர௠பராமரிபà¯à®ªà¯ சரிபாரà¯à®ªà¯à®ªà¯ செயà¯à®¯à®µà¯à®®à¯ [நிரà¯à®µà®¾à®•> கரà¯à®µà®¿à®•à®³à¯> பராமரிபà¯à®ªà¯] இல௠உஙà¯à®•à®³à¯à®•à¯à®•à¯ எநà¯à®¤ சிகà¯à®•à®²à¯à®•à®³à¯ˆ தீரà¯à®•à¯à®•';
+$lang['SQL queries'] = 'SQL வினவலà¯à®•à®³à¯';
+$lang['Statistics'] = 'பà¯à®³à¯à®³à®¿ விவரமà¯';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'இநà¯à®¤ பகà¯à®•à®®à¯ உஙà¯à®•à®³à¯ பழைய Piwigo பதிபà¯à®ªà¯ பà¯à®¤à®¿à®¯ பதிபà¯à®ªà¯ தகவல௠மேமà¯à®ªà®Ÿà¯à®¤à¯à®¤ à®®à¯à®©à¯à®®à¯†à®¾à®´à®¿à®•à®¿à®±à®¤à¯.மேமà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à¯ உதவி நினைகà¯à®•à®¿à®±à®¤à¯
+உஙà¯à®•à®³à¯à®•à¯à®•à¯ தறà¯à®ªà¯‡à®¾à®¤à¯ <strong> வெளியீட௠%s </strong> (அலà¯à®²à®¤à¯ அதறà¯à®•à¯ சமமான) இயஙà¯à®•à¯à®•à®¿à®±à®¤à¯.';
+$lang['Upgrade informations'] = 'தகவலை மேமà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à¯';
+$lang['Upgrade from version %s to %s'] = 'பதிபà¯à®ªà¯% s இலிரà¯à®¨à¯à®¤à¯% s மேமà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à¯';
+$lang['Upgrade'] = 'மேமà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à¯';
+$lang['User permissions and group permissions have been erased'] = 'பயனரà¯à®•à®³à¯ மறà¯à®±à¯à®®à¯ கà¯à®´à¯à®•à¯à®•à®³à®¿à®©à¯ அனà¯à®®à®¤à®¿à®•à®³à¯ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®©';
+$lang['You do not have access rights to run upgrade'] = 'நீஙà¯à®•à®³à¯ மேமà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à¯ˆ இயகà¯à®• சரியான அணà¯à®•à®²à¯ இலà¯à®²à¯ˆ';
+$lang['total SQL time'] = 'மொதà¯à®¤ SQL நேரமà¯';
+$lang['total upgrade time'] = 'மொதà¯à®¤ மேமà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à¯ நேரமà¯';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'இல௠<i>%s</i>, à®®à¯à®©à¯à®ªà®¾à®• <b>?></b>, à®®à¯à®©à¯à®ªà®¾à®•:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'ஒர௠மà¯à®©à¯à®©à¯†à®šà¯à®šà®°à®¿à®•à¯à®•à¯ˆà®¯à®¾à®•, பினà¯à®µà®°à¯à®®à¯ கரà¯à®ªà¯à®ªà¯†à®¾à®°à¯à®³à¯à®•à®³à¯ à®®à¯à®Ÿà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¿à®°à¯à®•à¯à®•à®¿à®±à®¤à¯. நீஙà¯à®•à®³à¯ கணà¯à®Ÿà®¿à®ªà¯à®ªà®¾à®• மேமà¯à®ªà®Ÿà¯à®¤à¯à®¤ கரà¯à®ªà¯à®ªà¯†à®¾à®°à¯à®³à¯à®•à®³à¯ˆ சரிபாரà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯ à®®à¯à®©à¯à®ªà®¾à®• மற௠செயலாகà¯à®•';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'ஒர௠மà¯à®©à¯à®©à¯†à®šà¯à®šà®°à®¿à®•à¯à®•à¯ˆà®¯à®¾à®•, பினà¯à®µà®°à¯à®®à¯ செரà¯à®•à¯à®¨à®¿à®°à®²à¯à®•à®³à¯ à®®à¯à®Ÿà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¿à®°à¯à®•à¯à®•à®¿à®±à®¤à¯.நீஙà¯à®•à®³à¯ அவறà¯à®±à¯ˆ மேமà¯à®ªà®Ÿà¯à®¤à¯à®¤ செயலாகà¯à®• மீணà¯à®Ÿà¯à®®à¯ செரà¯à®•à¯à®¨à®¿à®°à®²à¯à®•à®³à¯ˆ செயலாகà¯à®• வேணà¯à®Ÿà¯à®®à¯
+';
+$lang['All sub-albums of private albums become private'] = 'அனைதà¯à®¤à¯ தà¯à®£à¯ˆ ஆலà¯à®ªà®™à¯à®•à®³à®¿à®©à¯
+தனியார௠ஆலà¯à®ªà®™à¯à®•à®³à¯ தனியார௠ஆக இரà¯à®¨à¯à®¤à¯';
+?> \ No newline at end of file
diff --git a/language/th_TH/admin.lang.php b/language/th_TH/admin.lang.php
index adc62aa5b..573e49d6b 100644
--- a/language/th_TH/admin.lang.php
+++ b/language/th_TH/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -253,7 +253,6 @@ $lang['Email administrators when a comment is modified'] = "รายงานà¸
$lang['Email admins when a comment requires validation'] = "รายงานผู้ดูà¹à¸¥à¸£à¸°à¸šà¸šà¸—างอีเมลเมื่อความคิดเห็น ที่จำเป็นต้องมีà¸à¸²à¸£à¸•à¸£à¸§à¸ˆà¸ªà¸­à¸šà¸à¹ˆà¸­à¸™";
$lang['Email admins when a new user registers'] = "รายงานผู้ดูระบบทางอีเมล เมื่อมีผู้ใช้ใหม่ที่ลงทะเบียน";
$lang['Email admins when a valid comment is entered'] = "รายงานผู้ดูà¹à¸¥à¸£à¸°à¸šà¸šà¸—างอีเมล เมื่อมีความคิดเห็นà¹à¸ªà¸”งเข้ามา";
-$lang['email'] = "อีเมล";
$lang['Environment'] = "ข้อมูลระบบ";
$lang['Error list'] = "รายà¸à¸²à¸£à¸‚้อผิดพลาด";
$lang['Error on file "%s" : %s'] = 'เà¸à¸´à¸”ความผิดพลาดที่ไฟล์ "%s" : %s';
@@ -370,7 +369,6 @@ $lang['Main "guest" user status is incorrect'] = "หลัภ\"ผู้เย
$lang['Main "webmaster" user does not exist'] = "หลัภ\"เว็บมาสเตอร์\" ผู้ใช้งานไม่มีอยู่";
$lang['Main "webmaster" user status is incorrect'] = "หลัภ\"เว็บมาสเตอร์\" ผู้ใช้งานสถานะไม่ถูà¸à¸•à¹‰à¸­à¸‡";
$lang['Main Page'] = 'หน้าหลัà¸';
-$lang['Main'] = "หลัà¸";
$lang['Maintenance'] = "à¸à¸²à¸£à¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡";
$lang['Make this language available to users'] = 'à¸à¸³à¸«à¸™à¸”ภาษานี้สำหรับผู้ใช้งาน';
$lang['Make this theme available to users'] = 'à¸à¸³à¸«à¸™à¸”ธีมนี้สำหรับผู้ใช้งาน';
@@ -928,8 +926,6 @@ $lang['Minimum width'] = 'ความà¸à¸§à¹‰à¸²à¸‡à¸•à¹ˆà¸³à¸ªà¸¸à¸”';
$lang['Portrait'] = 'à¹à¸™à¸§à¸•à¸±à¹‰à¸‡';
$lang['Landscape'] = 'à¹à¸™à¸§à¸™à¸­à¸™';
$lang['Manage photos'] = 'จัดà¸à¸²à¸£à¸£à¸¹à¸›à¸ à¸²à¸ž';
-$lang['Format'] = 'รูปà¹à¸šà¸š';
-$lang['Invalid dimension'] = 'ขนาดไม่ถูà¸à¸•à¹‰à¸­à¸‡';
$lang['View in gallery'] = 'ดูในà¹à¸à¸¥à¸­à¸£à¸µà¹ˆ';
$lang['Number of albums per page'] = 'จำนวนอัลบั้มที่à¹à¸ªà¸”งในà¹à¸•à¹ˆà¸¥à¸°à¸«à¸™à¹‰à¸²';
$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto คือซอฟต์à¹à¸§à¸£à¹Œà¸ˆà¸±à¸”à¸à¸²à¸£à¸£à¸¹à¸›à¸ à¸²à¸žà¸šà¸™à¸£à¸°à¸šà¸šà¸›à¸à¸´à¸šà¸±à¸•à¸´à¸à¸²à¸£à¹à¸¡à¸„โอเอสเอ็à¸à¸‹à¹Œ, โดยปลั๊à¸à¸­à¸´à¸™ Piwigo export จะช่วยให้คุณสร้างอัลบั้ม à¹à¸¥à¸°à¸ªà¹ˆà¸‡à¸­à¸­à¸à¸£à¸¹à¸›à¸ à¸²à¸žà¸‚องคุณจาภiPhoto ไปยังà¹à¸à¸¥à¸¥à¸­à¸£à¸µà¹ˆ Piwigo ของคุณ';
@@ -954,4 +950,14 @@ $lang['This group will be set to default'] = 'à¸à¸¥à¸¸à¹ˆà¸¡à¸™à¸µà¹‰à¸–ูà¸à
$lang['This group will be unset to default'] = 'à¸à¸¥à¸¸à¹ˆà¸¡à¸™à¸µà¹‰à¹„ม่ได้ถูà¸à¸à¸³à¸«à¸™à¸”ให้เป็นà¸à¸¥à¸¸à¹ˆà¸¡à¸›à¸à¸•à¸´';
$lang['Type here the name of the new group'] = 'พิมพ์ชื่อของà¸à¸¥à¸¸à¹ˆà¸¡à¹ƒà¸«à¸¡à¹ˆ';
$lang['Purge user cache'] = 'ล้างà¹à¸„ชผู้ใช้งาน';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'ขนาดของภาพจะลดลงถึง %dx%d พิเซลส์.';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'à¸à¸²à¸£à¸›à¸£à¸±à¸šà¸‚นาดหลังจาà¸à¸à¸²à¸£à¸­à¸±à¸žà¹‚หลด อาจถูà¸à¸›à¸´à¸”โดย GD graphic library';
+$lang['close'] = 'ปิด';
+$lang['Basic settings'] = 'ตั้งค่าพื้นà¸à¸²à¸™';
+$lang['Change password'] = 'เปลี่ยนรหัสผ่าน';
+$lang['Change username'] = 'เปลี่ยนชื่อผู้ใช้งาน';
+$lang['Close user details'] = 'ปิดรายละเอียดผู้ใช้งาน';
+$lang['General'] = 'ทั่วไป';
+$lang['Loading...'] = 'à¸à¸³à¸¥à¸±à¸‡à¹‚หลด';
+$lang['Open user details'] = 'เปิดรายละเอียดผู้ใช้งาน';
?> \ No newline at end of file
diff --git a/language/th_TH/common.lang.php b/language/th_TH/common.lang.php
index 7b6c54273..5deaf20a9 100644
--- a/language/th_TH/common.lang.php
+++ b/language/th_TH/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,8 +22,8 @@
// +-----------------------------------------------------------------------+
/*
Language Name: ภาษาไทย [TH]
-Version: 2.5.0
-Language URI: http://piwigo.org/ext/extension_view.php?eid=
+Version: 2.6.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=519
Author: Piwigo team
Author URI: http://piwigo.org
*/
@@ -243,7 +243,6 @@ $lang['login mustn\'t end with a space character'] = "ชื่อเข้าà¸
$lang['login mustn\'t start with a space character'] = "ชื่อเข้าสู่ระบบไม่ต้องเริ่มต้นด้วยอัà¸à¸‚ระช่องว่าง";
$lang['this login is already used'] = "ชื่อเข้าสู่ระบบนี้ถูà¸à¹ƒà¸Šà¹‰à¹„ปà¹à¸¥à¹‰à¸§";
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = "ที่อยู่อีเมลจะต้องมีลัà¸à¸©à¸“ะ xxx@yyy.eee (ตัวอย่าง : jack@altern.org)";
-$lang['please enter your password again'] = "à¸à¸£à¸¸à¸“าà¸à¸£à¸­à¸à¸£à¸«à¸±à¸ªà¸œà¹ˆà¸²à¸™à¸‚องคุณอีà¸à¸„รั้ง";
$lang['Auto login'] = "เข้าสู่ระบบอัตโนมัติ";
$lang['remove this tag from the list'] = "ลบà¹à¸—็à¸à¸™à¸µà¹‰à¸ˆà¸²à¸à¸£à¸²à¸¢à¸à¸²à¸£";
$lang['representative'] = 'รูปภาพขนาดย่อประจำอัลบั้ม';
@@ -269,7 +268,6 @@ $lang['SQL queries in'] = "SQL queries ใน";
$lang['display only recently posted photos'] = "à¹à¸ªà¸”งเฉพาะรูปภาพที่เพิ่งถูà¸à¹‚พสเมื่อเร็วๆ นี้";
$lang['return to the display of all photos'] = "à¸à¸¥à¸±à¸šà¹„ปà¹à¸ªà¸”งรูปภาพทั้งหมด";
$lang['the beginning'] = "à¸à¸²à¸£à¹€à¸£à¸´à¹ˆà¸¡à¸•à¹‰à¸™";
-$lang['Interface theme'] = "ธีม";
$lang['Thumbnails'] = "รูปภาพขนาดย่อ";
$lang['Menu'] = "เมนู";
$lang['A comment on your site'] = "à¹à¸ªà¸”งความคิดเห็นถึงคุณ";
@@ -413,4 +411,12 @@ $lang['Username is mandatory'] = 'จำเป็นต้องมีชื่à
$lang['mandatory'] = 'จำเป็น';
$lang['Website'] = 'เว็บไซต์';
$lang['Your website URL is invalid'] = 'ที่อยู่เว็บไซต์ของคุณไม่ถูà¸à¸•à¹‰à¸­à¸‡';
+$lang['Email'] = 'อีเมล';
+$lang['First Page'] = 'หน้าà¹à¸£à¸';
+$lang['Go back to the album'] = 'à¸à¸¥à¸±à¸šà¹„ปยังอัลบั้ม';
+$lang['Last Page'] = 'หน้าสุดท้าย';
+$lang['Password is missing. Please enter the password.'] = "คุณยังไม่ได้à¸à¸³à¸«à¸™à¸”รหัสผ่าน. à¸à¸£à¸¸à¸“าà¸à¸£à¸­à¸£à¸«à¸±à¸ªà¸œà¹ˆà¸²à¸™.";
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = "คุณยังไม่ได้ยืนยันรหัสผ่าน. à¸à¸£à¸¸à¸“ายืนยันรหัสผ่านเดิมอีà¸à¸„รั้ง.";
+$lang['%d photos per page'] = 'จำนวน %d รูปภาพต่อหน้า';
+$lang['Theme'] = 'ธีม';
?> \ No newline at end of file
diff --git a/language/th_TH/install.lang.php b/language/th_TH/install.lang.php
index 15918cf81..2f3d47746 100644
--- a/language/th_TH/install.lang.php
+++ b/language/th_TH/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,24 +21,18 @@
// | USA. |
// +-----------------------------------------------------------------------+
-
-
$lang['Installation'] = "à¸à¸²à¸£à¸•à¸´à¸”ตั้ง";
$lang['Basic configuration'] = "à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าพื้นà¸à¸²à¸™";
$lang['Default gallery language'] = "à¸à¸³à¸«à¸™à¸”ภาษาพื้นà¸à¸²à¸™à¸ªà¸³à¸«à¸£à¸±à¸šà¹à¸à¸¥à¸¥à¸­à¸£à¸µà¹ˆ";
$lang['Database configuration'] = "à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าà¸à¸²à¸™à¸‚้อมูล";
$lang['Admin configuration'] = "à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าผู้ดูà¹à¸¥à¸£à¸°à¸šà¸š";
$lang['Start Install'] = "เริ่มà¸à¸²à¸£à¸•à¸´à¸”ตั้ง";
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = "ที่อยู่อีเมลจะต้องมีลัà¸à¸©à¸“ะ xxx@yyy.eee (ตัวอย่าง : jack@altern.org)";
-$lang['Webmaster login'] = "ชื่อเข้าสู่ระบบ";
$lang['It will be shown to the visitors. It is necessary for website administration'] = "มันจะà¹à¸ªà¸”งส่วนนี้ไปยังผู้เยี่ยมชม. ซึ่งมันจำเป็นสำหรับผู้ดูà¹à¸¥à¸£à¸°à¸šà¸šà¸‚องเว็บไซต์";
$lang['Connection to server succeed, but it was impossible to connect to database'] = "เชื่อมต่อเซิร์ฟเวอร์เรียบร้อยà¹à¸¥à¹‰à¸§, à¹à¸•à¹ˆà¹„ม่สามารถเชื่อมต่อà¸à¸²à¸™à¸‚้อมูลได้";
$lang['Can\'t connect to server'] = "ไม่สามารถเชื่อมต่อà¸à¸±à¸šà¹€à¸‹à¸´à¸£à¹Œà¸Ÿà¹€à¸§à¸­à¸£à¹Œà¹„ด้";
$lang['Host'] = "เซิร์ฟเวอร์";
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = "ตัวอย่าง localhost, sql.multimania.com, toto.freesurf.fr";
$lang['User'] = "ชื่อผู้ใช้งาน";
$lang['user login given by your host provider'] = "ชื่อผู้ใช้งานจะได้รับจาà¸à¸œà¸¹à¹‰à¹ƒà¸«à¹‰à¸šà¸£à¸´à¸à¸²à¸£à¹€à¸‹à¸´à¸£à¹Œà¸Ÿà¹€à¸§à¸­à¸£à¹Œ";
-$lang['Password'] = "รหัสผ่าน";
$lang['user password given by your host provider'] = "รหัสผ่านของผู้ใช้งานจะได้รับจาà¸à¸œà¸¹à¹‰à¹ƒà¸«à¹‰à¸šà¸£à¸´à¸à¸²à¸£à¹€à¸‹à¸´à¸£à¹Œà¸Ÿà¹€à¸§à¸­à¸£à¹Œ";
$lang['Database name'] = "ชื่อà¸à¸²à¸™à¸‚้อมูล";
$lang['also given by your host provider'] = "ซึ่งจะได้รับจาà¸à¸œà¸¹à¹‰à¹ƒà¸«à¹‰à¸šà¸£à¸´à¸à¸²à¸£à¹€à¸‹à¸´à¸£à¹Œà¸Ÿà¹€à¸§à¸­à¸£à¹Œà¸‚องคุณ";
@@ -47,12 +41,10 @@ $lang['database tables names will be prefixed with it (enables you to manage bet
$lang['enter a login for webmaster'] = "à¸à¸³à¸«à¸™à¸”ชื่อในà¸à¸²à¸£à¹€à¸‚้าสู่ระบบสำหรับเว็บมาสเตอร์";
$lang['webmaster login can\'t contain characters \' or "'] = "ชื่อเข้าสู่ระบบจะต้องไม่ประà¸à¸­à¸šà¸”้วยเครื่องหมาย ' หรือ \"";
$lang['please enter your password again'] = "à¸à¸£à¸¸à¸“าà¸à¸£à¸­à¸à¸£à¸«à¸±à¸ªà¸œà¹ˆà¸²à¸™à¸­à¸µà¸à¸„รั้ง";
-$lang['Webmaster password'] = "รหัสผ่าน";
$lang['Keep it confidential, it enables you to access administration panel'] = "โปรดเà¸à¹‡à¸šà¹„ว้เป็นความลับ, เพราะมันสามารถใช้เพื่อเข้าถึงหน้าà¸à¸²à¸£à¸ˆà¸±à¸”à¸à¸²à¸£à¸£à¸°à¸šà¸š Piwigo à¹à¸à¸¥à¸¥à¸­à¸£à¸µà¹ˆ ของคุณได้";
$lang['Password [confirm]'] = "รหัสผ่าน [ยืนยัน]";
$lang['verification'] = "à¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™";
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = "ต้องà¸à¸²à¸£à¸„วามช่วยเหลือ? โปรดถามคำถามไว้ได้ที่ <a href=\"%s\">บอร์ดข้อความของ Piwigo</a>.";
-$lang['Webmaster mail address'] = "ที่อยู่อีเมล";
$lang['Visitors will be able to contact site administrator with this mail'] = "ผู้เยี่ยมชมจะสามารถที่จะใช้อีเมลนี้ เพื่อติดต่อà¸à¸±à¸šà¸œà¸¹à¹‰à¸”ูà¹à¸¥à¸£à¸°à¸šà¸šà¹„ด้";
$lang['PHP 5 is required'] = "PHP 5 จำเป็นต้องมี";
$lang['It appears your webhost is currently running PHP %s.'] = "มันจะà¹à¸ªà¸”งบนเวิร์ฟเวอร์ที่คุณใช้งานอยู่ ซึ่งคุณใช้งานอยู่บน PHP %s.";
@@ -72,4 +64,5 @@ $lang['Just another Piwigo gallery'] = 'เพียงà¹à¸„่ Piwigo à¹à¸à¸
$lang['Welcome to my photo gallery'] = 'ยินดีต้อนรับสู่à¹à¸à¸¥à¸¥à¸­à¸£à¸µà¹ˆà¸£à¸¹à¸›à¸ à¸²à¸žà¸‚องฉัน';
$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'อย่าลังเลที่จะปรึà¸à¸©à¸²à¸«à¸£à¸·à¸­à¹‚พสคำถามในฟอรั่มของเรา เพื่อขอความช่วยเหลือใดๆ :%s';
$lang['Welcome to your new installation of Piwigo!'] = 'ยินดีต้อนรับสู่à¸à¸²à¸£à¸•à¸´à¸”ตั้งใหม่ของ Piwigo!';
-?>
+$lang['localhost or other, supplied by your host provider'] = 'localhost หรืออื่น ๆ ที่จัดทำโดยผู้ให้บริà¸à¸²à¸£à¹‚ฮสต์ของคุณ';
+?> \ No newline at end of file
diff --git a/language/th_TH/upgrade.lang.php b/language/th_TH/upgrade.lang.php
index 6688fffb0..d7c538d65 100644
--- a/language/th_TH/upgrade.lang.php
+++ b/language/th_TH/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2011 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/tr_TR/admin.lang.php b/language/tr_TR/admin.lang.php
index 999b1ab10..67081e78c 100644
--- a/language/tr_TR/admin.lang.php
+++ b/language/tr_TR/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -131,7 +131,7 @@ $lang['Albums authorized thanks to group associations'] = 'Albümler grup ilişk
$lang['Albums automatically sorted'] = 'Albümler otomatik olarak sıralandı';
$lang['albums deleted in the database'] = 'veri tabanından silinen albümler';
$lang['All %d photos are selected'] = 'Bütün %d fotoğraf seçildi';
-$lang['All extensions are up to date.'] = 'Tüm uzantılar güncel.';
+$lang['All extensions are up to date.'] = 'Tüm eklentiler güncel.';
$lang['All languages are up to date.'] = 'Bütün diller güncel.';
$lang['All optimizations have been successfully completed.'] = 'Tüm iyileştirmeler başarıyla tamamlandı.';
$lang['All plugins are up to date.'] = 'Bütün eklentiler güncel.';
@@ -271,7 +271,6 @@ $lang['Email administrators when a comment is modified'] = 'Yorum deÄŸiÅŸtirildi
$lang['Email admins when a comment requires validation'] = 'Yorum onayı gerektiğinde yöneticilere e-posta gönder';
$lang['Email admins when a new user registers'] = 'Yeni kullanıcı kayıt olduğunda yöneticilere e-posta gönder';
$lang['Email admins when a valid comment is entered'] = 'Geçerli bir yorum girildiğinde yöneticilere e-posta gönder';
-$lang['email'] = 'E-Posta';
$lang['Environment'] = 'Sistem BileÅŸenleri';
$lang['Error list'] = 'Hata listesi';
$lang['Error on file "%s" : %s'] = 'Hata dosyada "%s" : %s';
@@ -405,7 +404,6 @@ $lang['Main "guest" user status is incorrect'] = 'Ana "Misafir" kullanıcısı d
$lang['Main "webmaster" user does not exist'] = 'Ana "Site Yöneticisi" kullanıcısı yok';
$lang['Main "webmaster" user status is incorrect'] = 'Ana "Site Yöneticisi" kullanıcısı durumu yanlış';
$lang['Main Page'] = 'Ana Sayfa';
-$lang['Main'] = 'Ana';
$lang['Maintenance'] = 'Bakım';
$lang['Make this language available to users'] = 'Bu dili kullanıcılara aç';
$lang['Make this theme available to users'] = 'Bu temayı kullanıcılara aç';
@@ -782,7 +780,7 @@ $lang['With no virtual album'] = 'sıfır sanal albüm ile';
$lang['wrong filename'] = 'yanlış dosya ismi';
$lang['Year'] = 'Yıl';
$lang['You are running on development sources, no check possible.'] = 'Gelistirme kaynaklarini kullaniyorsunuz incelemek mümkün degil';
-$lang['You are running the latest version of Piwigo.'] = 'Piwigo son sürümünü çalıştırıyorsunuz.';
+$lang['You are running the latest version of Piwigo.'] = 'Piwigo\'nun son sürümü çalıştırılmaktadır.';
$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Tarayıcı yükleyiciyi kullanıyorsunuz. <a href="%s">Flash Yükleyiciyi</a> deneyiniz.';
$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Flash Yükleyiciyi kullanıyorsunuz. Sorun mu var? <a href="%s">Tarayıcı Yükleyiciyi</a> deneyiniz.';
$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Piwigoyu direkt olarak %s\'e güncelleyebilirsiniz, Piwigo %s\'e güncellemeden (önerilir).';
@@ -915,15 +913,13 @@ $lang['Sharpen'] = 'KeskinleÅŸtirmek';
$lang['Visited %d times'] = '%d kez görüntülendi';
$lang['Watermark'] = 'watermark';
$lang['%s in the future'] = '%s gelecekte';
-$lang['Posted %s on %s'] = '%s tarafından %d tarihinde %s gönderildi';
+$lang['Posted %s on %s'] = '%s gönderildi %s tarihinde';
$lang['create a new site'] = 'yeni bir site oluÅŸtur';
$lang['No order field selected'] = 'Sıralandırma alanı seçilmedi';
$lang['Duplicate selected tags'] = 'Seçili etiketleri kopyala';
$lang['Name of the duplicate'] = 'Kopya ismi';
$lang['Source tag'] = 'Kaynak etiket';
$lang['Tag "%s" is now a duplicate of "%s"'] = '"%s" etiketi şimdi "%s" \'nin kopyasıdır';
-$lang['Format'] = 'Biçim';
-$lang['Invalid dimension'] = 'Geçersiz boyut';
$lang['Landscape'] = 'Manzara';
$lang['Minimum height'] = 'Asgari yükseklik';
$lang['Minimum width'] = 'Asgari geniÅŸlik';
@@ -932,8 +928,6 @@ $lang['Portrait'] = 'Portre';
$lang['Manage photos'] = 'Fotoğrafları yönet';
$lang['Number of albums per page'] = 'Her sayfadaki albüm sayısı';
$lang['View in gallery'] = 'Galeride göster';
-$lang['Maximum'] = 'En çok';
-$lang['Minimum'] = 'En az';
$lang['Ratio'] = 'Oran';
$lang['between %.2f and %.2f'] = '%.2f ve %.2f arasında';
$lang['between %d and %d pixels'] = '%d ve %d piksel arasında';
@@ -949,4 +943,32 @@ $lang['Please select at least two groups'] = 'En azından iki grup seçin';
$lang['Rename'] = 'Yeniden adlandır';
$lang['Purge user cache'] = 'Kullaıcı önbelleğini temizle';
$lang['The version of %s [%s] installed is not compatible with the version required ']['%s'] = 'Yüklenen %s [%s] sürümü, gereken sürüm [%s] ile uyumlu değildir.';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'Resim boyutları %dx%d piksele düşürülecektir.';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'GD \'nin grafik kütüphanesi olarak kullanımından dolayı yükleme sonrası yeniden boyutlandırma devredışı';
+$lang['Select at least one tag'] = 'En azından bir etiket seçin';
+$lang['Mail theme'] = 'Posta Teması';
+$lang['General'] = 'Genel';
+$lang['Basic settings'] = 'Temel ayarlar';
+$lang['Registered on %s, %s.'] = '%s \'ye kayıt yapıldı, %s.';
+$lang['Showing %s to %s of %s users'] = '%s \'den %s\'ye olan kullanıcılar görüntüleniyor (toplam %s)';
+$lang['No user selected of %d users'] = '%d kullanıcıdan hiçbiri seçilmedi';
+$lang['User %s added'] = 'Kullanıcı %s eklendi';
+$lang['Update user'] = 'Kullanıcıyı güncelle';
+$lang['Show %s users'] = '%s kullanıcıyı göster';
+$lang['No user selected, no action possible.'] = 'Hiç bir kullanıcı seçilmedi, eylem imkansız.';
+$lang['Last visit on %s, %s.'] = '%s \'ye son ziyaretiniz, %s.';
+$lang['on the %d selected users'] = 'seçilen %d kullanıcıda';
+$lang['Users modified'] = 'Kullanıcılarda değişiklik yapıldı';
+$lang['User %s updated'] = '%s kullanıcı güncellendi';
+$lang['Password updated'] = 'Şifre güncellendi';
+$lang['No matching user found'] = 'Uyan hiç bir kullanıcı bulunamadı';
+$lang['Loading...'] = 'Yükleniyor...';
+$lang['Change password'] = 'Åžifre deÄŸiÅŸtir';
+$lang['Change username'] = 'Kullanıcı adı değiştir';
+$lang['All %d users are selected'] = 'Tüm %d kullanıcı seçildi';
+$lang['(filtered from %s total users)'] = '(toplam %s kullanıcıdan filtrelendi)';
+$lang['%d of %d users selected'] = '%d/%d kullanıcı seçildi';
+$lang['Close user details'] = 'Kullanıcı detaylarını kapat';
+$lang['Open user details'] = 'Kullanıcı detaylarını aç';
+$lang['close'] = 'kapat';
?> \ No newline at end of file
diff --git a/language/tr_TR/common.lang.php b/language/tr_TR/common.lang.php
index 71473a21f..e04a8c3df 100644
--- a/language/tr_TR/common.lang.php
+++ b/language/tr_TR/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2009 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Türkçe [TR]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=436
Author: Piwigo team
Author URI: http://piwigo.org
@@ -189,7 +189,6 @@ $lang['in %d sub-album'] = '%d alt albümde';
$lang['in %d sub-albums'] = '%d alt albümde';
$lang['in this album'] = 'bu albümde';
$lang['included'] = 'dahil edildi';
-$lang['Interface theme'] = 'Arayüz Temaları';
$lang['Invalid key'] = 'Hatalı anahtar';
$lang['Invalid password!'] = 'Yanlış şifre!';
$lang['Invalid username or email'] = 'Hatalı kullanıcı adı veya e-Posta';
@@ -251,7 +250,6 @@ $lang['Photos posted within the last %d day.'] = 'Sadece son %d gün içinde yü
$lang['Photos posted within the last %d days.'] = 'Sadece son %d gün içinde yüklenen fotoğraflar.';
$lang['Piwigo Help'] = 'Piwigo yardım';
$lang['Play of slideshow'] = 'Slayt gösterisini yürüt';
-$lang['please enter your password again'] = 'lütfen şifrenizi tekrar giriniz';
$lang['Please enter your username or email address.'] = 'Lütfen kullanıcı adınızı veya e-posta adresinizi giriniz.';
$lang['Please, enter a login'] = 'Lütfen kullanıcı adınızı giriniz';
$lang['Post date'] = 'Gönderim tarihi';
@@ -412,4 +410,12 @@ $lang['Username is mandatory'] = 'Kullanıcı adı mecburidir';
$lang['mandatory'] = 'zorunlu';
$lang['Website'] = 'Web sitesi';
$lang['Your website URL is invalid'] = 'Web sitenizin URL adresi geçersiz';
+$lang['Email'] = 'E-posta';
+$lang['First Page'] = 'Ä°lk sayfa';
+$lang['Go back to the album'] = 'Albüme geri dön';
+$lang['Last Page'] = 'Son sayfa';
+$lang['Password is missing. Please enter the password.'] = 'Şifre eksik. Lütfen şifrenizi girin.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Şifre doğrulama eksik. Lütfen seçtiğiniz şifreyi doğrulayın.';
+$lang['%d photos per page'] = 'sayfa başına %d fotoğraf';
+$lang['Theme'] = 'Tema';
?> \ No newline at end of file
diff --git a/language/tr_TR/help/cat_modify.html b/language/tr_TR/help/cat_modify.html
new file mode 100755
index 000000000..2fada14b3
--- /dev/null
+++ b/language/tr_TR/help/cat_modify.html
@@ -0,0 +1,126 @@
+<h2>Albüm Editleme</h2>
+
+<h3>Bilgiler</h3>
+
+<ul>
+
+ <li><strong>isim</strong>: albüm ismini ayarlar (fiziksel albüm şeklinde sanal isimlendirme).</li>
+
+ <li><strong>açıklama</strong>: içerik hakkında genel fikir veren kısa metin,
+ bu metin sayfanın alt kısmında gözükür.</li>
+
+</ul>
+
+<h3>Taşıma</h3>
+
+<p>Albüm sanal albümse taşıyabilirsiniz. Albümü taşımak üst albümün değiştirilmesi anlamına gelir.</p>
+
+<h3>Seçenekler</h3>
+
+<ul>
+
+ <li><strong>Erişim Türü</strong>: Yetki Yönetimi. Bir Albümü özel yaparsanız tüm alt albümleri özel olur. Bir albümü herkese açık yaparsanız tüm üst albümleri aynı yetkiyi alır..</li>
+
+ <li><strong>Kilit</strong>: Albüm ve alt albümler bakım için kilitli olacak.</li>
+
+ <li><strong>Yorumlar</strong>: Kullanıcıları bu albümdeki fotoğrafları yorumlamak için yetkilendirme</li>
+
+</ul>
+
+<p>Ayrıca "Özellikler" yönetim ekranından (screens <span
+class="pwgScreen">Yorumlar</span>, <span class="pwgScreen">Kilit</span>,
+<span class="pwgScreen">Genel/Özel</span>, <span
+class="pwgScreen">Temsilci</span> available from <span
+class="pwgScreen">Administration &raquo; Albums &raquo; Properties</span>). bu özellikleri yönetebilirsiniz.</p>
+
+<h3>Sıralama</h3>
+
+<p>Varsayılan görüntüleri sıralama düzenini kullanın.</p>
+
+<p>Bu sıralama düzeninin alt albümler için geçerli olup olmadığını belirtiniz.</p>
+
+<p>Bu albüm ile kullanılmak üzere özel sıralama kriterleri seçiniz.</p>
+<ul>
+<li><strong>Oluşturulma tarihi</strong>: Fotoğrafın çekildiği tarih</li>
+<li><strong>Yüklenme tarihi</strong>: Senkronizasyon tarihi</li>
+<li><strong>Ortalama oran (*)</strong>: Ziyaretçi reytingine göre değişir</li>
+<li><strong>En çok ziyaret edilen (*)</strong>: En çok ziaret edilenlere göre sıralama yapar</li>
+<li><strong>Dosya Adı</strong>: Dosya adına göre sıralama</li>
+<li><strong>Id</strong>: İç Id (Son kategoriler öncekilerden daha yüksek önceliğe sahiptir.</li>
+
+</ul>
+<p><strong>(*)</strong>Uyarı: Sıralama düzenini test edip beklenmeyen sonuçlar içermediğinden emin olun</p>
+
+
+<h3>Representant</h3>
+
+<p>The album representative is the thumbnail displayed on the main page (<span class="pwgScreen">category.php</span>) to represent
+the album when
+it contains only sub-albums and no direct photo (just as the root album).</p>
+photo of a album :</p>
+
+<ul>
+
+ <li><span class="pwgScreen">Photo page</span>: one of the action buttons let you set the current photo as the representative for the
+ displayed album. This button is available only for administrators.</li>
+
+ <li><span class="pwgScreen">Modify informations about a photo</span> in
+ administration. This screen can be reached from <span
+ class="pwgScreen">picture.php</span> or <span class="pwgScreen">Batch
+ management</span> in <em>unit mode</em>. See the help of this screen for
+ details.</li>
+
+ <li><span class="pwgScreen">Administration &raquo; Albums &raquo; Properties,
+ Representative</span>. See the help of this screen for details.</li>
+
+ <li><span class="pwgScreen">Albüm Editleme</span> (Editleme Ekranı).</li>
+
+</ul>
+
+<p>The choice of a representative depends on the
+<code>allow_random_representative</code> configuration parameter (see <span
+class="filename">include/config_default.inc.php</span>).</p>
+
+<p>In default mode (<code>allow_random_representative</code> set to false),
+each album containing at least one element is represented by a fixed
+element. Once set (at album creation), the representative changes only
+when an administrator ask for it. If the representative is not appropriate,
+you can ask to <strong>Find a new representant by random</strong>.</p>
+
+<p>If the <code>allow_random_representative</code> configuration parameter is
+set to true, a category containing photos may have no fixed
+representant. Just use <strong>Delete representant</strong> button.</p>
+
+<p>If the album contains only sub-albums and no photo, it can nonetheless be represented by any element thanks to <span class="pwgScreen">Modify
+informations about a photo</span> screen. The only option on the current screen
+is the <strong>Delete representant</strong> button.</p>
+
+<h3>Yeni albüm için tüm fotoğrafları bağlama</h3>
+
+<ul>
+
+<li><strong>Sanal albüm adı</strong>: Yeni albüm adı oluştutulacak,
+mevcut kategorideki tüm fotoğraflar yeni birime bağlı olacak.</li>
+
+<li><strong>Ana Albüm</strong>: Yeni albüm oluturulacak durumlarda,
+root dizininde kkök albüm oluşturun.</li>
+
+</ul>
+
+<h3>Albüm fotoğraflarını mevcut albümlere bağlayın</h3>
+
+<ul>
+
+<li><strong>Albümler</strong>: hedef albüm seçin.</li>
+
+</ul>
+
+<h3>Grup üyelerine bilgilendirici e-posta gönderimi</h3>
+
+<ul>
+
+<li><strong>Gtup</strong>: alıcı grubu</li>
+
+<li><strong>Mail içeriği</strong>: Kullanıcılara göndermek için metin alanı.</li>
+
+</ul> \ No newline at end of file
diff --git a/language/tr_TR/help/extend_for_templates.html b/language/tr_TR/help/extend_for_templates.html
new file mode 100755
index 000000000..fee3a56b5
--- /dev/null
+++ b/language/tr_TR/help/extend_for_templates.html
@@ -0,0 +1,55 @@
+<h2>Şablon Uzantı Yapılandırması</h2>
+
+<h3>Hakkında</h3>
+<p>Piwigo galeriniz var olan şablon dosyalarının kişisel uyarlamalarla değiştirilmesi ile özelleştirilebilir. Örneğin, varsayılan başlık şablonu (header.tpl) özelleştirilmiş bir başlık şablonu (my-header.tpl) ile değiştirilebilir. Değişiklik veri tabanına gönderildiğinde galeriniz varsayılan yerine yenilediğiniz şablonu görüntüleyecektir.<br>
+Şablon uzantıları yeni veya uzman her iki kullanıcı grubu için de tema oluşturmak için güçlü bir yol sağlar. LocalFiles düzenleyicisi ile çalışarak kendinize ait alt temalar yaratabilirsiniz.</p>
+
+<h3>Esas (Orjinal) Åžablon</h3>
+<p>Bir tema, galeri sayfalarınızı oluşturan bir kaç adet şablon dosyasından oluşur. Bunlar esas (orjinal) şablonlardır.</p>
+
+<h3>İsteğe bağlı URL anahtar kelimeleri</h3>
+<p>Bunlar modül adından sonra gelen galeri URL'sinde bulunan kelimelerdir. Bunlar aynı zamanda kalıcı bağlantı olabilirler (Detaylı bilgi için kalıcı bağlantı dokümanını inceleyebilirsiniz). <a href="#warnings">UYARI:</a> Eğer aynı esas şablon ve aynı anahtar kelime bir veya bir kaç kişisel şablonda kullanılırsa, sadece en sonuncusu etkinleştirilir.</p>
+
+<h3>Bağlı Tema</h3>
+<p>Şablon dosyalarının yenileriyle değiştirileceği temaya Bağlı Tema denir.</p>
+
+<h3>Esas (Orjinal) ÅŸablonlar nerdedir?</h3>
+<p>Orijinal şablonlar, her tema ile birlikte gelen şablon dosyalarıdır. Bunlar <em>/themes/default/template</em> (yada <em>themes/<theme name>/template</em>) alanında bulunurlar. Bu şablon dosyaları yerinde düzenleme yapılmamalıdır, tema güncellemesi sırasında değişiklikler kaybedilir.<br>
+Desteklenen esas (orjinal) şablonlar arasında bunlar vardır:</p>
+<ul>
+ <li><span class="filename">index.tpl</span></li>
+ <li><span class="filename">mainpage_categories.tpl</span> and/or <span class="filename">thumbnails.tpl</span></li>
+ <li><span class="filename">menubar.tpl</span></li>
+ <li><span class="filename">header.tpl</span> and/or <span class="filename">footer.tpl</span></li>
+ <li><span class="filename">picture_content.tpl</span> and/or <span class="filename">picture.tpl</span></li>
+ <!-- <li><span class="filename">slideshow.tpl</span></li> -->
+ <li><span class="filename">profile.tpl</span> and/or <span class="filename">profile_content.tpl</span></li>
+ <li><span class="filename">tags.tpl</span></li>
+ <li><span class="filename">upload.tpl</span></li>
+ <li><span class="filename">about.tpl</span></li>
+ <li><span class="filename">popuphelp.tpl</span></li>
+ <li><span class="filename">search.tpl</span> and/or <span class="filename">search_rules.tpl</span></li>
+ <li><span class="filename">nbm.tpl</span> and/or <span class="filename">notification.tpl</span></li>
+ <li><span class="filename">identification.tpl</span> and/or <span class="filename">register.tpl</span></li>
+ <li><span class="filename">redirect.tpl</span></li>
+</ul>
+
+<h3>Özelleştirilmiş şablonların kaydedilmesi</h3>
+<p>Özelleştirilmiş şablonlar template-extension dizini veya alt dizinlerine kaydedilmelidir. Örneğin, <em>/template-extension/my-default/header.tpl</em> (yada <em>/template-extension/<my-theme-name>/header.tpl</em>). Şablon dosyaları uzantısı .tpl olacak şekilde her adı alabilirler. Alt dizinlerdeki şablon dosyaları Şablon yapılandırma ekranında kullanılabilir özelleştirilmiş şablonlar olarak gözükürler.</p>
+
+<h3>Özelleştirilmiş şablonların etkinleştirilmesi</h3>
+<p>Değiştirmek için esas (orjinal) şablonu seçin. İsteğe bağlı olarak özelleştirilmiş şablonun sadece o anahtar kelime ile sayfalarda gösterildiğinden emin olmak için bir URL anahtar kelimesi seçin. Bağlantılı temayı seçin ve değişiklikler o temada etkinleşecektir.
+Değişiklikleri veri tabanına gönderin..</p>
+
+<h3>Özelleştirilmiş şablonları devredışı bırakmak</h3>
+<p>Esas (orjinal) şablondaki seçimi kaldırın ve değişikliği veritabanına gönderin.<br>
+template-extension dizinindeki özelleştirilmiş şablon dosyalarını silin.</p>
+
+<a name="warnings"></a>
+<h3>Uyarılar</h3>
+<ul>
+ <li><strong>Esas (orjinal) şablon</strong> mutlaka esas şablon olmalıdır aksi durumda öngörülemez sonuçlar alınabilir.</li>
+ <li>Eğer aynı esas şablon ve aynı URL anahtar kelimesi birden fazla özelleştirilmiş şablonda kullanılıyorsa sadece en sonuncu etkinleşir.</li>
+ <li>Dağıtımı yapılan örnek şablon dosyaları sadece test amaçlıdır. Bunları düzenlemeyin. Kendiniz bir tane yaratın veya <em>/template-extension/<my-theme>/</em> dizininde yer alan şablon dosyalarını kopyalayın.</li>
+ <li>Özelleştirilmiş şablon silindiğinde esas (orjinal) şablon derhal etkinleşir.</li>
+</ul> \ No newline at end of file
diff --git a/language/tr_TR/help/help_virtual_links.html b/language/tr_TR/help/help_virtual_links.html
new file mode 100755
index 000000000..18ff2bde0
--- /dev/null
+++ b/language/tr_TR/help/help_virtual_links.html
@@ -0,0 +1,9 @@
+<p>Resimler kendi dosyasına karşılık gelen albümde görüntülenir.</p>
+
+<p>Web sunucusu üzerinde resimleri bir kaç albümde birden göstertebilir, bunun
+için resimleri ikinci kez yüklemenize gerek kalmaz. herhangi bir albümle ilişkilendirilen fotoğrafa
+Fotoğraf Editleme Ekranından ulaşabilirsiniz. (Yöneticiler fotoğraf görüntüleme sayfasından fotoğraf editleme sayfasına ulaşabilir).</p>
+
+<p>Sanal albümler bu kavram üzerine kuruludur buna karşılık gelen bir dosya yoktur. Sanal albüm oluşturmak için
+ <span class="pwgScreen">Administration &raquo; Albums &raquo;
+Manage</span>.</p> \ No newline at end of file
diff --git a/language/tr_TR/help/maintenance.html b/language/tr_TR/help/maintenance.html
new file mode 100755
index 000000000..5b9675a1f
--- /dev/null
+++ b/language/tr_TR/help/maintenance.html
@@ -0,0 +1,25 @@
+<h2>Bakım</h2>
+
+<p>Sayfa oluşturma hızını optimize etmek için Piwigo önbellekte sakladığı bilgileri kullanır. Mesela, her albümdeki fotoğrafları her sayfa yüklenişinde saymak yerine bu bilgi veri tabanında saklanır. Teoride bu bilgi her zaman doğru olmaktadır ancak bazen bir hata oluşarak bilginin geçersiz olmasına yol açabilir.</p>
+
+<p>Bazı bilgiler gün geçtikçe kullanışsız/gereksiz hale gelebilir. Bu verilerin veri tabanından silinmesi size disk alanı kazandıracaktır.</p>
+
+<ul>
+ <li><strong>Sahipsiz etiketlerin silinmesi</strong></li>
+</ul>
+<ul>
+ <li><strong>Albüm bilgilerini güncelleme:</strong> Her albüm için takip eden bilgiler kontrol edilir ve gerekirse güncellenir: ana albüm listesi, fotoğraf sayısı, son fotoğraf tarihi, kardeş albümler arasındaki konumu, tüm albümler arasındaki konumu. Bu eylem aynı zamanda temsil fotoğraflarının tutarlılığını da kontrol eder.</li>
+ <li><strong>Fotoğraf bilgilerinin güncellenmesi:</strong> Her fotoğraf için takip eden bilgiler güncellenir: tam dosya konumu, ortalama derecelendirmes. <em>Uyarı</em>, karıştırmayın: metadata bilgisi mutlaka <span class="pwgScreen">Yönetimsel &raquo; Araçlar &raquo; Eşleştirme</span> 'dan yada tek bir fotoğrafın değişiklik sayfasından eşleştirilmelidir (örneğin buradan <span class="pwgScreen">Fotoğraf</span> </li>
+</ul>
+<ul>
+ <li><strong>Veri tabanının onarımı ve optimizasyonu:</strong>Veri tabanındaki her tablo için yeniden sıralandırma, onarım ve optimizasyon operasyonlarını yapın.</li>
+ <li><strong>Bütünlük kontrolünü yeniden başlatın</strong></li>
+</ul>
+<ul>
+ <li><strong>Geçmiş detayların silinmesi:</strong> Geçmiş tablosundaki tüm satırları silin. <span class="pwgScreen">Yönetimsel &raquo; Araçlar &raquo; Geçmiş</span> ekranı artık geçmişi görüntülemeyecektir. <em>Uyarı:</em> Geri almanın bir yolu olmadan tüm veriler kaybedilecektir.</li>
+ <li><strong>Geçmiş özetinin silinmesi:</strong> Ziyaret geçmişine ait tüm özeti silin. Bu özet geçmiş detayından alınmaktadır.</li>
+ <li><strong>Oturumların silinmesi:</strong> Zamanı geçen oturum bilgilerini silin.</li>
+ <li><strong>Hiç kullanılmayan bilgilendirme beslemelerini silin.</strong></li>
+ <li><strong>Aramalar geçmişini silin.</strong></li>
+ <li><strong>Derlenen şablonları silin.</strong></li>
+</ul>
diff --git a/language/tr_TR/help/permalinks.html b/language/tr_TR/help/permalinks.html
new file mode 100755
index 000000000..3aa8932e0
--- /dev/null
+++ b/language/tr_TR/help/permalinks.html
@@ -0,0 +1,7 @@
+<h2>Kalıcı Bağlantılar</h2>
+
+<p>Kalıcı bağlantılar, albüm URL adreslerini daha güzel hale getirmek için kullanılırlar. Bir albüm kalıcı bağlantı tanımına sahipse, URL adresinde albüm kimliğinin kullanımına gerek yoktur.</p>
+
+<p>Kalıcı bağlantı silindiğinde, kalıcı bağlantıyı geçmiş kayıtlarına (history) kaydedebilirsiniz, böylece Piwigo galerisine ait dış bağlantılar çalışmaya devam edecektir. Kalıcı bağlantı geçmişi tablosunda kalıcı bağlantıların ne zaman silindiğini, en son ne zaman kullanıldığını ve kaç defa kullanıldığını görebilirsiniz.</p>
+
+<p>Kalıcı bağlantıların her albüme özgü olması gerektiğini unutmayın. Aynı şekilde geçmiş kayıtlarında da aynı bağlantının birden fazlasını da bulunduramazsınız.</p> \ No newline at end of file
diff --git a/language/tr_TR/install.lang.php b/language/tr_TR/install.lang.php
index 93727b3ad..8589d91e0 100644
--- a/language/tr_TR/install.lang.php
+++ b/language/tr_TR/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,24 +21,18 @@
// | USA. |
// +-----------------------------------------------------------------------+
-
-
$lang['Installation'] = 'Yükleme';
$lang['Basic configuration'] = 'Temel yapılandırma';
$lang['Default gallery language'] = 'Varsayılan galeri dili';
$lang['Database configuration'] = 'Veritabanı yapılandırması';
$lang['Admin configuration'] = 'Yönetici yapılandırması';
$lang['Start Install'] = 'Yüklemeyi başlat';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'e-Posta adresiniz xxx@yyy.eee (örnek : erkan@test.org) şeklinde olmalıdır.';
-$lang['Webmaster login'] = 'Site yöneticisi girişi';
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Bu ziyaretçilere gösterilecek. Bu web sitesi yönetimi için gereklidir';
$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Sunucuya bağlantı başarılı ancak veritabanı bağlantısı kurulamadı.';
$lang['Can\'t connect to server'] = 'Sunucuya bağlanamadı';
$lang['Host'] = 'Sunucu';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
$lang['User'] = 'Kullanıcı';
$lang['user login given by your host provider'] = 'barındırma sağlağıcı tarafından size verilen kullanıcı adı';
-$lang['Password'] = 'Åžifre';
$lang['user password given by your host provider'] = 'barındırma sağlağıcı tarafından size verilen şifre';
$lang['Database name'] = 'Veritabanı adı';
$lang['also given by your host provider'] = 'ayrıca barındırma sağlayıcınız tarafından verilen';
@@ -47,12 +41,10 @@ $lang['database tables names will be prefixed with it (enables you to manage bet
$lang['enter a login for webmaster'] = 'Site yöneticisi için bir kullanıcı adı girin';
$lang['webmaster login can\'t contain characters \' or "'] = 'Site yöneticisi adı \' veya " karakterlerini içeremez';
$lang['please enter your password again'] = 'lütfen şifrenizi tekrar giriniz';
-$lang['Webmaster password'] = 'Site yöneticisi şifresi';
$lang['Keep it confidential, it enables you to access administration panel'] = 'Gizli tutun, yönetim paneline ulaşmanızı sağlar';
$lang['Password [confirm]'] = 'Åžifre [kabul]';
$lang['verification'] = 'doÄŸrulama';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Yardım ihtiyacınız var? Sorularınızı <a href="%s">Piwigo forumda sorabilirsiniz</a>.';
-$lang['Webmaster mail address'] = 'Site yöneticisi e-posta adresi';
$lang['Visitors will be able to contact site administrator with this mail'] = 'Ziyaretçilerin site yöneticisi ile bağlantıya geçmesi için bu e-posta adresini kullanabileceklerdir.';
$lang['PHP 5 is required'] = 'PHP 5 gereklidir';
$lang['It appears your webhost is currently running PHP %s.'] = 'Web sunucunuz şu anda PHP %s çalıştırıyor görünüyor.';
@@ -73,4 +65,5 @@ $lang['Welcome to my photo gallery'] = 'FotoÄŸraf galerime hoÅŸ geldiniz';
$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Herhangi bir sebeple yardım gerektiğinde, forumlarımıza danışmakta tereddüt etmeyin: %s';
$lang['Welcome to your new installation of Piwigo!'] = 'Piwigo\'nunuzun yeni kurulumuna hoÅŸgeldiniz!';
$lang['Password ']['confirm'] = 'Åžifre [doÄŸrula]';
+$lang['localhost or other, supplied by your host provider'] = 'localhost veya diğer, bulundurma hizmeti sağlayıcınız tarafından verilen';
?> \ No newline at end of file
diff --git a/language/tr_TR/upgrade.lang.php b/language/tr_TR/upgrade.lang.php
index e36f2031f..d570610f1 100644
--- a/language/tr_TR/upgrade.lang.php
+++ b/language/tr_TR/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/uk_UA/admin.lang.php b/language/uk_UA/admin.lang.php
index 432590387..1b797ade1 100644
--- a/language/uk_UA/admin.lang.php
+++ b/language/uk_UA/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -245,7 +245,6 @@ $lang['Email administrators when a comment is modified'] = 'ÐадіÑлати Ð
$lang['Email admins when a comment requires validation'] = 'ÐадіÑлати лиÑÑ‚ адмініÑтраторам, коли коментар вимагає валідації';
$lang['Email admins when a new user registers'] = 'ÐадіÑлати лиÑÑ‚ адмініÑтраторам, коли реєÑтруєтьÑÑ Ð½Ð¾Ð²Ð¸Ð¹ кориÑтувач';
$lang['Email admins when a valid comment is entered'] = 'ÐадіÑлати лиÑÑ‚ адмініÑтраторам, коли коментар введений валідний коментар';
-$lang['email'] = 'Електронна пошта';
$lang['Environment'] = 'Середовище';
$lang['Error list'] = 'СпиÑок помилок';
$lang['Error on file "%s" : %s'] = 'Помилка файлу "%s" : %s';
@@ -654,7 +653,6 @@ $lang['Main "guest" user status is incorrect'] = 'ОÑновний "гіÑÑ‚ÑŒ"
$lang['Main "webmaster" user does not exist'] = 'ОÑновний "веб-майÑтер" кориÑтувача не Ñ–Ñнує';
$lang['Main "webmaster" user status is incorrect'] = 'ОÑновний "веб-майÑтер" ÑÑ‚Ð°Ñ‚ÑƒÑ ÐºÐ¾Ñ€Ð¸Ñтувача невірно';
$lang['Main Page'] = 'Головна Ñторінка';
-$lang['Main'] = 'Головна';
$lang['Maintenance'] = 'ОбÑлуговуваннÑ';
$lang['Manage Permissions'] = 'Ð£Ð¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð´Ð¾Ð·Ð²Ð¾Ð»Ð°Ð¼Ð¸';
$lang['Maximum file size: %sB.'] = 'МакÑимальний розмір файлу: %sB.';
@@ -923,8 +921,6 @@ $lang['Duplicate selected tags'] = 'Дублювати виділені теґи
$lang['Name of the duplicate'] = 'Ðазва дубліката';
$lang['Source tag'] = 'Джерело теґа';
$lang['Tag "%s" is now a duplicate of "%s"'] = 'Теґ "%s" зараз є дублікатом "%s"';
-$lang['Format'] = 'Формат';
-$lang['Invalid dimension'] = 'Ðеправильний вимір';
$lang['Landscape'] = 'Ландшафт';
$lang['Minimum height'] = 'Мінімальна виÑота';
$lang['Minimum width'] = 'Мінімальна ширина';
@@ -933,8 +929,6 @@ $lang['Portrait'] = 'Портрет';
$lang['Manage photos'] = 'Ð£Ð¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñми';
$lang['View in gallery'] = 'ПереглÑнути у галереї';
$lang['Number of albums per page'] = 'КількіÑÑ‚ÑŒ альбомів на Ñторінці';
-$lang['Maximum'] = 'МакÑимальний';
-$lang['Minimum'] = 'Мінімальний';
$lang['Ratio'] = 'СпіввідношеннÑ';
$lang['between %.2f and %.2f'] = 'між %.2f і %.2f';
$lang['between %d and %d pixels'] = 'між %d Ñ– %d пікÑелÑми';
@@ -949,4 +943,32 @@ $lang['This group will be set to default'] = 'Ð¦Ñ Ð³Ñ€ÑƒÐ¿Ð° буде вÑтаÐ
$lang['This group will be unset to default'] = 'Ð¦Ñ Ð³Ñ€ÑƒÐ¿Ð° буде знÑта з замовчуваннÑ';
$lang['Type here the name of the new group'] = 'Введіть назву нової групи';
$lang['Purge user cache'] = 'ОчиÑтити кеш кориÑтувача';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'Розміри Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð±ÑƒÐ´Ñ” зменьшено до %dx%d пікÑелів';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'Зміну розміру піÑÐ»Ñ Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð¾ через викориÑÑ‚Ð°Ð½Ð½Ñ Ð±Ñ–Ð±Ð»Ñ–Ð¾Ñ‚ÐµÐºÐ¸ GD';
+$lang['Select at least one tag'] = 'Виберіть принаймні один теґ';
+$lang['Basic settings'] = 'ОÑновні параметри';
+$lang['General'] = 'Загальні';
+$lang['Mail theme'] = 'Поштова тема';
+$lang['Showing %s to %s of %s users'] = 'Показано %s від %s до %s кориÑтувачів';
+$lang['%d of %d users selected'] = '%d з %d кориÑтувачів вибрані';
+$lang['(filtered from %s total users)'] = '(фільтруютьÑÑ Ð²Ñ–Ð´ загального чиÑла кориÑтувачів %s)';
+$lang['All %d users are selected'] = 'УÑÑ– %d кориÑтувачі вибрані';
+$lang['Change password'] = 'Змінити пароль';
+$lang['Change username'] = 'Змінити Ñ–Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸Ñтувача';
+$lang['Last visit on %s, %s.'] = 'Був на Ñайті %s, %s.';
+$lang['Loading...'] = 'ЗавантаженнÑ...';
+$lang['No matching user found'] = 'Відповідних кориÑтувачі не знайдено';
+$lang['No user selected of %d users'] = 'Ðе вибраний жоден з %d кориÑтувачів ';
+$lang['No user selected, no action possible.'] = 'Жоден кориÑтувач не обраний, ніÑкі дії можливі.';
+$lang['Password updated'] = 'Пароль оновлений';
+$lang['Registered on %s, %s.'] = 'ЗареєÑтрований %s, %s.';
+$lang['Show %s users'] = 'Відображати %s кориÑтувачів';
+$lang['Update user'] = 'ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача';
+$lang['User %s added'] = 'КориÑтувач %s доданий';
+$lang['User %s updated'] = 'КориÑтувач %s оновленний';
+$lang['Users modified'] = 'Змінений кориÑтувач';
+$lang['on the %d selected users'] = 'на %d вибраних кориÑтувачів';
+$lang['close'] = 'Закрити';
+$lang['Close user details'] = 'Закрити деталі кориÑтувача';
+$lang['Open user details'] = 'Відкрити деталі кориÑтувача';
?> \ No newline at end of file
diff --git a/language/uk_UA/common.lang.php b/language/uk_UA/common.lang.php
index cd136eb6b..c713b3f7d 100644
--- a/language/uk_UA/common.lang.php
+++ b/language/uk_UA/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2009 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: УкраїнÑька [UA]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=523
Author: Piwigo team
Author URI: http://piwigo.org
@@ -272,7 +272,6 @@ $lang['login mustn\'t end with a space character'] = 'лоґін не повин
$lang['login mustn\'t start with a space character'] = 'лоґін не повинен починатиÑÑ Ð· пробілу';
$lang['this login is already used'] = 'цей лоґін вже викориÑтовуєтьÑÑ';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'адреÑа електронної пошти повинна бути у виглÑді xxx@yyy.eee (наприклад : jack@altern.org)';
-$lang['please enter your password again'] = 'будь лаÑка, введіть Ñвій пароль ще раз';
$lang['Auto login'] = 'Ðвтолоґін';
$lang['remove this tag from the list'] = 'видалити цей теґ зі ÑпиÑку';
$lang['representative'] = 'зразок';
@@ -301,7 +300,6 @@ $lang['SQL queries in'] = 'SQL запитів за';
$lang['display only recently posted photos'] = 'показувати тільки нещодавно завантажені фотографії';
$lang['return to the display of all photos'] = 'повернутиÑÑ Ð´Ð¾ вÑÑ–Ñ… зображень';
$lang['the beginning'] = 'початок';
-$lang['Interface theme'] = 'Тема інтерфейÑу';
$lang['Thumbnails'] = 'ЕÑкізи';
$lang['Menu'] = 'Меню';
$lang['A comment on your site'] = 'Коментар на вашому Ñайті';
@@ -377,8 +375,8 @@ $lang['Password: %s'] = 'Пароль: %s';
$lang['Username: %s'] = 'Ім\'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача: %s';
$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Якщо Ви думаєте, що Ви отримали цей лиÑÑ‚ помилково, будь лаÑка, зв\'ÑжітьÑÑ Ð· нами за адреÑою %s';
$lang['Photo sizes'] = 'Розміри зображеннÑ';
-$lang['Desktop'] = 'Робочий Ñтіл';
-$lang['Mobile'] = 'Мобільний';
+$lang['Desktop'] = 'Комп’ютер';
+$lang['Mobile'] = 'Мобільний приÑтрій';
$lang['View in'] = 'ПодивитиÑÑ Ð²';
$lang['Show latest comments first'] = 'Покажіть найновіші коментарі Ñпочатку';
$lang['Show oldest comments first'] = 'Покажіть найÑтаріші коментарі Ñпочатку';
@@ -409,7 +407,15 @@ $lang['Requested tag does not exist'] = 'Запитуваний теґ не Ñ–Ñ
$lang['Piwigo encountered a non recoverable error'] = 'Piwigo зіткнувÑÑ Ð· невиправною помилкою';
$lang['Email address is mandatory'] = 'ÐдреÑа електронної пошти обов\'Ñзкова';
$lang['Username is mandatory'] = 'Ім\'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ñ” обов\'Ñзковим';
-$lang['mandatory'] = 'обов\'Ñзковий';
+$lang['mandatory'] = 'обов’Ñзковий';
$lang['Website'] = 'Веб-Ñайт';
$lang['Your website URL is invalid'] = 'ÐÐ´Ñ€ÐµÑ Ð²Ð°ÑˆÐ¾Ð³Ð¾ Ñайту Ñ” недійÑним';
+$lang['Email'] = 'Електронна пошта';
+$lang['First Page'] = 'Перша Ñторінка';
+$lang['Go back to the album'] = 'ПовернутиÑÑ Ð´Ð¾ альбому';
+$lang['Last Page'] = 'ОÑÑ‚Ð°Ð½Ð½Ñ Ñторінка';
+$lang['Password is missing. Please enter the password.'] = 'Пароль відÑутній. Будь лаÑка введіть пароль.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'ВідÑутнє Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ. Будь лаÑка, підтвердіть вибраний пароль.';
+$lang['%d photos per page'] = '%d зображень на Ñторінці';
+$lang['Theme'] = 'Тема';
?> \ No newline at end of file
diff --git a/language/uk_UA/install.lang.php b/language/uk_UA/install.lang.php
index 7a0651181..b88a39af0 100644
--- a/language/uk_UA/install.lang.php
+++ b/language/uk_UA/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -20,6 +20,7 @@
// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
// | USA. |
// +-----------------------------------------------------------------------+
+
$lang['Admin configuration'] = 'ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтратора';
$lang['also given by your host provider'] = 'також дізнайтеÑÑŒ у Вашого хоÑтинг-провайдера';
$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Ðльтернативним рішеннÑм Ñ” ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ñ‚ÐµÐºÑту в поле вище Ñ– вÑтавте його в файл "local/config/database.inc.php" (ПопередженнÑ: database.inc.php повинен міÑтити тільки те, що в текÑтовому полі, без зворотної лінії або пропуÑків)';
@@ -43,11 +44,8 @@ $lang['It appears your webhost is currently running PHP %s.'] = 'Схоже, вÐ
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Він буде показаний відвідувачам. Це необхідно Ð´Ð»Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтрації Ñайту';
$lang['Just another Piwigo gallery'] = 'Ще одна Ð³Ð°Ð»ÐµÑ€ÐµÑ Piwigo';
$lang['Keep it confidential, it enables you to access administration panel'] = 'Тримайте його конфіденційніÑÑ‚ÑŒ, він дозволÑÑ” отримати доÑтуп до адмініÑтративної панелі';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.hosting.com.ua, toto.1gb.ua';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'пошта повинна бути xxx@yyy.eee (наприклад: animan@pixobox.org)';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Потрібна допомога? Задайте Ð¿Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð½Ð° <a href="%s">форумі Piwigo</a>.';
$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Зверніть увагу, ви можете змінити Ñвою конфігурацію Ñ– перезавантажити Ñобі Piwigo піÑÐ»Ñ Ñ†ÑŒÐ¾Ð³Ð¾.';
-$lang['Password'] = 'Пароль';
$lang['Password [confirm]'] = 'Пароль [підтвердженнÑ]';
$lang['PHP 5 is required'] = 'Потрібен PHP 5';
$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo можуть Ñпробувати перемкнути конфігурацію PHP 5 шлÑхом ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ зміни .htaccess файлу.';
@@ -60,13 +58,11 @@ $lang['user login given by your host provider'] = 'лоґін кориÑтува
$lang['user password given by your host provider'] = 'лоґін кориÑтувача дізнайтеÑÑŒ у Вашого хоÑтинг-провайдера';
$lang['verification'] = 'перевірка';
$lang['Visitors will be able to contact site administrator with this mail'] = 'Відвідувачі зможуть викориÑтовувати цю пошту, щоб зв\'ÑзатиÑÑ Ð· адмініÑтратором Ñайту';
-$lang['Webmaster login'] = 'Лоґін веб-майÑтра';
$lang['webmaster login can\'t contain characters \' or "'] = 'лоґін веб-майÑтера не може міÑтити Ñимволів \' або "';
-$lang['Webmaster mail address'] = 'ÐдреÑа електронної пошти веб-майÑтра';
-$lang['Webmaster password'] = 'Пароль веб-майÑтра';
$lang['Welcome to my photo gallery'] = 'ЛаÑкаво проÑимо в фотогалерею';
$lang['Welcome to your new installation of Piwigo!'] = 'ЛаÑкаво проÑимо у ваш новий вÑтановлений Piwigo!';
$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Ви можете завантажити конфігураційний файл Ñ– завантажити його до local/config каталогу вÑтановленнÑ.';
$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Ви повинні звернутиÑÑ Ð² Ñлужбу підтримки вашого хоÑтинг-провайдера Ñ– подивитиÑÑ, Ñк ви можете переключитиÑÑ Ð½Ð° PHP 5 ÑамоÑтійно.';
$lang['User'] = 'КориÑтувач';
+$lang['localhost or other, supplied by your host provider'] = 'локальний хоÑÑ‚ або будь-Ñкий інший, наданий вашим провайдером';
?> \ No newline at end of file
diff --git a/language/uk_UA/upgrade.lang.php b/language/uk_UA/upgrade.lang.php
index 3059db82c..e9583601a 100644
--- a/language/uk_UA/upgrade.lang.php
+++ b/language/uk_UA/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/vi_VN/admin.lang.php b/language/vi_VN/admin.lang.php
index 1a05f4bf8..f4247e034 100644
--- a/language/vi_VN/admin.lang.php
+++ b/language/vi_VN/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -188,7 +188,6 @@ $lang['Access type'] = 'Kiểu truy cập';
$lang['Information data registered in database'] = 'Dữ liệu thông tin đã thêm vào cơ sở dữ liệu';
$lang['Default display'] = 'Hiển thị theo mặc định';
$lang['The gallery URL is not valid.'] = 'Äịa chỉ của gallery không tồn tại.';
-$lang['Main'] = 'Mục chính';
$lang['The number of comments a page must be between 5 and 50 included.'] = 'Số lá»i bình trên má»™t trang phải từ 5 đến 50.';
$lang['Configuration'] = 'Cấu hình';
$lang['confirm'] = 'xác nhận';
@@ -223,7 +222,6 @@ $lang['Prepared time for list of users to send mail is limited. Others users are
$lang['Time to send mail is limited. Others mails are skipped.'] = 'Thá»i gian gởi mail là có giá»›i hạn. Các email khác đã được bá» qua.';
$lang['To send ?'] = 'Äể gởi ?';
$lang['Last send'] = 'Gởi lần cuối';
-$lang['email'] = 'địa chỉ email';
$lang['User'] = 'NgÆ°á»i dùng';
$lang['See you soon,'] = 'Hẹn gặp lại bạn,';
$lang['Go to'] = 'Äi đến ';
@@ -874,5 +872,105 @@ $lang['bottom right corner'] = 'góc phải phía dưới';
$lang['By default, the center of interest is placed in the middle of the photo.'] = 'Theo mặc định, trung tâm của sự chú ý được đặt vào giữa bức ảnh.';
$lang['create a new site'] = 'tạo ra một site mới';
$lang['custom'] = 'Tùy chỉnh';
+$lang['Delete multiple size images'] = 'Xóa những hình đa kích cỡ';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam là má»™t phần má»m quản lý ảnh kỹ thuật số miá»…n phí và tiên tiến cho các hệ Ä‘iá»u hành Linux, Windows và MacOSX.';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam được thiết kế cho các nhiếp ảnh gia trong việc duyệt ảnh, quản lý ảnh, biên tập, cải tiến chất lượng ảnh, tổ chức và chia sẻ ảnh.';
+$lang['Duplicate selected tags'] = 'Nhân đôi thẻ đã chá»n';
+$lang['Duplicate'] = 'Nhân đôii';
+$lang['Edit photo'] = 'Chỉnh sửa ảnh';
+$lang['Features include gallery browsing, album creation and photo upload.'] = 'Những tính năng gồm có duyệt thư viện ảnh, tạo album ảnh và tải ảnh.';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = 'Äối vá»›i ảnh Ä‘iá»u chỉnh kích thÆ°á»›c bằng cách xén ảnh, nhÆ° "Hình vuông", Piwigo sẽ cố tập trung phần nổi bật nhất vào ngay trong ảnh.';
+$lang['Generate multiple size images'] = 'Tạo ra những ảnh đa kích cỡ';
+$lang['Groups and users'] = 'Nhóm ngÆ°á»i dùng và ngÆ°á»i dùng';
+$lang['include photos with lower privacy level'] = 'bao gồm những ảnh với múc độ riêng tư thấp';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto là chương trình quản lý ảnh mặc định trong MacOSX. Plugin xuất ảnh của Piwwigo cho phép bạn tạo ra album mới và xuất ảnh trực tiếp từ iPhoto đến thư viện ảnh Piwigocủa bạn.';
+$lang['Landscape'] = 'Phong cảnh';
+$lang['Manage photos'] = 'Quản lý ảnh';
+$lang['Manage the members'] = 'Quản lý thành viên';
+$lang['Merge selected groups'] = 'Trá»™n chung các nhóm được chá»n';
+$lang['middle'] = 'giữa';
+$lang['Minimum width'] = 'BỠrộng tối thiểu';
+$lang['Minimum height'] = 'Chiá»u cao tối thiểu';
+$lang['Multiple Size'] = 'Äa kích thÆ°á»›c';
+$lang['Name of the duplicate'] = 'Tên của phần trùng lặp';
+$lang['No group is permitted to see this private album'] = 'Không nhóm nào được phép xem album loại riêng tư';
+$lang['No group selected, no action possible.'] = 'Không nhóm nào được chá»n, không thể thá»±c thi được tác vụ nào.';
+$lang['No members to manage'] = 'Không có thành viên nào để quản lý';
+$lang['No order field selected'] = 'Không có tham số vị trí nào được chá»n';
+$lang['Number of albums per page'] = 'Số album ảnh trên một trang';
+$lang['Numeric identifier : %d'] = 'Ký hiệu nhận dạng số : %d';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = 'Trong Linux, Ä‘Æ¡n giản chỉ cài đặt Shotwell bằng ứng dụng quản lý gói cài đặt và kích hoạt tùy chá»n xuất bản ảnh Piwigo.';
+$lang['Opacity'] = 'Làm má»';
+$lang['Original file : %s'] = 'Tệp tin gốc : %s';
+$lang['Panorama'] = 'Toàn cảnh';
+$lang['Permission granted for groups'] = 'Quyá»n hạn được cấp cho nhóm';
+$lang['Permission granted for users'] = 'Quyá»n hạn được cấp cho ngÆ°á»i dùng';
+$lang['Permission management'] = 'Quản lý quyá»n hạn';
+$lang['Photo sizes with crop'] = 'Ảnh được Ä‘iá»u chỉnh kích cỡ bằng cách xén ảnh';
+$lang['Piwigo export plugin for Aperture'] = 'Plugin xuất ảnh của Piwigo cho Aperture';
+$lang['Piwigo export plugin for iPhoto'] = 'Plugin xuất ảnh của Piwigo cho iPhoto';
+$lang['Piwigo publish plugin for digiKam'] = 'Plugin xuất ảnh của Piwigo cho digiKam';
+$lang['Piwigo publish plugin for Shotwell'] = 'Plugin xuất ảnh của Piwigo cho Shotwell';
+$lang['Please select at least two groups'] = 'Hãy chá»n ít nhất 2 nhóm';
+$lang['Portrait'] = 'Chân dung';
+$lang['Ratio'] = 'Tỉ lệ';
+$lang['Rename'] = 'Äổi tên';
+$lang['Select a file'] = 'Chá»n má»™t tệp tin';
+$lang['Select a zone with your mouse to define a new center of interest.'] = 'Chá»n má»™t vùng bằng chuá»™t để vạch ra tâm Ä‘iểm của sá»± chú ý.';
+$lang['Select groups...'] = 'Chá»n nhóm...';
+$lang['Select users...'] = 'Chá»n ngÆ°á»i dùng...';
+$lang['Sharpen'] = 'Äá»™ nét';
+$lang['Source tag'] = 'Thẻ gốc';
+$lang['Tag "%s" is now a duplicate of "%s"'] = 'Thẻ "%s" giỠlà bản sao của thẻ "%s"';
+$lang['The center of interest is the most meaningful zone in the photo.'] = 'Tâm điểm của sự chú ý là phần có ý nghĩa nhất của bức ảnh.';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = 'Kích thước ảnh sẽ bị giảm xuống %dx%d pixels.';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'Plugin xuất ảnh của Piwigo cho phép bạn tạo ra albums ảnh và xuất hình.';
+$lang['There is no group in this gallery.'] = 'Không có nhóm nào trong thư viện ảnh này.';
+$lang['This group will be set to default'] = 'Nhóm này sẽ được dùng mặc định';
+$lang['This group will be unset to default'] = 'Nhóm này sẽ không còn được dùng mặc định nữa';
+$lang['top left corner'] = 'góc trái trên cùng';
+$lang['top right corner'] = 'góc phải trên cùng';
+$lang['Type here the name of the new group'] = 'Nhập tên của nhóm mới ở đây';
+$lang['View in gallery'] = 'Xem trong thư viện ảnh';
+$lang['Visited %d times'] = 'Äã được xem %d lần';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'khách thăm quan cần phải đăng nhập và được phân quyá»n phù hợp để xem album ảnh này';
+$lang['Watermark'] = 'Ảnh má»';
+$lang['X Position'] = 'Vị trí X';
+$lang['X Repeat'] = 'Lặp lại X';
+$lang['Y Position'] = 'Vị trí Y';
+$lang['Purge user cache'] = 'Lá»c bá»™ nhá»› đệm của ngÆ°á»i dùng';
+$lang['Posted %s on %s'] = 'Gửi %s vào %s';
+$lang['Rated %d times, score : %.2f'] = 'Äã được đánh giá %d lần, Ä‘iểm số : %.2f';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (RemoteGallery client cho Android) là má»™t phần má»m máy khách Piwigo mã mở (GPL v3)cho ná»n tảng Android.';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = 'Äổi kích thÆ°á»›c sau khi tải lên bị vô hiệu vì sá»­ dụng thÆ° viện đồ há»a GD';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell là một trình quản lý ảnh số mã mở và là trình quản lý ảnh mặc định trong Ubuntu và Fedora.';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'Piwigo phát hành các plug-in cho phép đồng bộ hóa và xuất trực tiếp các ảnh từ Lightroom vào trong thư viện ảnh Piwigo.';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = 'Äể xuất các ảnh từ digiKam vào Piwigo, Ä‘Æ¡n giản hãy cài đặt digiKam và Kipi-plugins.';
+$lang['Select at least one tag'] = 'Hãy chá»n ít nhất má»™t tag';
+$lang['Basic settings'] = 'Thiết lập cơ bản';
+$lang['General'] = 'Tổng quát';
+$lang['Mail theme'] = 'Chủ đỠmail';
+$lang['%d of %d users selected'] = '%d trong số %d ngÆ°á»i dùng được chá»n';
+$lang['(filtered from %s total users)'] = '(lá»c từ %s tổng số ngÆ°á»i dùng)';
+$lang['All %d users are selected'] = 'Tất cả %d ngÆ°á»i dùng được chá»n';
+$lang['Change password'] = 'Äổi mật khẩu';
+$lang['Change username'] = 'Äổi tên ngÆ°á»i dùng';
+$lang['Last visit on %s, %s.'] = 'Xem lần cuối vào lúc %s, %s.';
+$lang['Loading...'] = 'Äang tải...';
+$lang['No matching user found'] = 'Không tìm thấy ngÆ°á»i dùng nào phù hợp';
+$lang['No user selected of %d users'] = 'Không có ngÆ°á»i dùng nào được chá»n trong số %d ngÆ°á»i dùng';
+$lang['No user selected, no action possible.'] = 'Không có ngÆ°á»i dùng nào được chá»n nên không thể làm tiếp';
+$lang['Password updated'] = 'Mật khẩu đã được cập nhật';
+$lang['Registered on %s, %s.'] = 'Äã đăng ký vào lúc %s, %s.';
+$lang['Show %s users'] = 'Hiển thị %s ngÆ°á»i dùng';
+$lang['Showing %s to %s of %s users'] = 'Hiển thị %s đến %s trong %s ngÆ°á»i dùng';
+$lang['Update user'] = 'Cập nhật ngÆ°á»i dùng';
+$lang['User %s added'] = 'NgÆ°á»i dùng %s đã được thêm';
+$lang['User %s updated'] = 'NgÆ°á»i dùng %s đã được cập nhật';
+$lang['Users modified'] = 'NgÆ°á»i dùng đã được chỉnh sá»­a';
+$lang['on the %d selected users'] = 'trên %d ngÆ°á»i dùng được chá»n';
+$lang['Close user details'] = 'Äóng chi tiết ngÆ°á»i dùng';
+$lang['Open user details'] = 'Mở chi tiết ngÆ°á»i dùng';
+$lang['close'] = 'đóng';
?> \ No newline at end of file
diff --git a/language/vi_VN/common.lang.php b/language/vi_VN/common.lang.php
index c9e6d8f36..8c41a3c80 100644
--- a/language/vi_VN/common.lang.php
+++ b/language/vi_VN/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: Tiếng Việt [VN]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=437
Author: Piwigo team
Author URI: http://piwigo.org
@@ -241,7 +241,6 @@ $lang['login mustn\'t end with a space character'] = 'tên tài khoản không Ä
$lang['login mustn\'t start with a space character'] = 'tên tài khoản không được có ký tự trắng đầu tiên';
$lang['this login is already used'] = 'tài khoản này đã được đăng ký trước đó';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'địa chỉ email phải có dạng xxx@yyy.eee (ví dụ : jack@altern.org)';
-$lang['please enter your password again'] = 'vui lòng nhập lại mật khẩu';
$lang['Auto login'] = 'Tự động đăng nhập';
$lang['remove this tag from the list'] = 'bá» tag này khá»i danh sách';
$lang['representative'] = 'đại diện';
@@ -269,7 +268,6 @@ $lang['SQL queries in'] = 'Truy vấn SQL trong';
$lang['display only recently posted photos'] = 'chỉ hiển thị những hình vừa được gởi';
$lang['return to the display of all photos'] = 'trở lại hiển thị tất cả các hình';
$lang['the beginning'] = 'bắt đầu';
-$lang['Interface theme'] = 'Giao diện';
$lang['Thumbnails'] = 'Hình nhá»';
$lang['Menu'] = 'Trình đơn';
$lang['A comment on your site'] = 'Má»™t lá»i bình trên trang của bạn';
@@ -413,4 +411,12 @@ $lang['Username is mandatory'] = 'Phải có tên ngÆ°á»i dùng';
$lang['Website'] = 'Trang web';
$lang['Your website URL is invalid'] = 'Äịa chỉ trang web không bình thÆ°á»ng';
$lang['mandatory'] = 'bắt buộc';
+$lang['Email'] = 'Email';
+$lang['First Page'] = 'Trang đầu';
+$lang['Go back to the album'] = 'Quay trở lại album';
+$lang['Last Page'] = 'Trang cuối';
+$lang['Password is missing. Please enter the password.'] = 'Thiếu mật khẩu. Vui lòng nhập mật khẩu.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Xác nhận mật khẩu bị thiếu. Vui lòng xác nhận lại mật khẩu đã chá»n.';
+$lang['%d photos per page'] = '%d ảnh mỗi trang';
+$lang['Theme'] = 'Chủ Ä‘á»';
?> \ No newline at end of file
diff --git a/language/vi_VN/help/index.php b/language/vi_VN/help/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/vi_VN/help/index.php
+++ b/language/vi_VN/help/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/vi_VN/install.lang.php b/language/vi_VN/install.lang.php
index 10f51c666..cc457fc05 100644
--- a/language/vi_VN/install.lang.php
+++ b/language/vi_VN/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -27,17 +27,12 @@ $lang['Default gallery language'] = 'Ngôn ngữ hiển thị gallery mặc Ä‘á»
$lang['Database configuration'] = 'Cấu hình cơ sở dữ liệu';
$lang['Admin configuration'] = 'Cấu hình Quản trị';
$lang['Start Install'] = 'Bắt đầu Cài đặt';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'địa chỉ thư điện tử phải có dạng xxx@yyy.eee (ví dụ : jack@altern.org)';
-$lang['Webmaster login'] = 'Äăng nhập của Webmaster';
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Khách thăm quan gallery sẽ thấy được thông tin của Webmaster. Äiá»u này cần thiết cho Quản trị Webmaster';
$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Kết nối thành công vào máy chủ, nhưng không thể kết nối vào cơ sở dữ liệu.';
$lang['Can\'t connect to server'] = 'Không thể kết nối vào máy chủ';
-
$lang['Host'] = 'Máy chủ MySQL';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
$lang['User'] = 'NgÆ°á»i dùng';
$lang['user login given by your host provider'] = 'thông tin đăng nhập của ngÆ°á»i dùng do nhà cung cấp máy chủ của của bạn Ä‘Æ°a ra.';
-$lang['Password'] = 'Mật khẩu';
$lang['user password given by your host provider'] = 'mật khẩu ngÆ°á»i dùng do nhà cung cấp máy chủ của bạn Ä‘Æ°a ra';
$lang['Database name'] = 'Tên cơ sở dữ liệu';
$lang['also given by your host provider'] = 'cũng được cấp bởi nhà cung cấp máy chủ';
@@ -46,12 +41,10 @@ $lang['database tables names will be prefixed with it (enables you to manage bet
$lang['enter a login for webmaster'] = 'nhập tên đăng nhập của Webmaster';
$lang['webmaster login can\'t contain characters \' or "'] = 'đăng nhập của Webmaster không thể chứa các ký tự hoặc';
$lang['please enter your password again'] = 'vui lòng nhập lại mật khẩu của bạn';
-$lang['Webmaster password'] = 'Mật khẩu của Webmaster';
$lang['Keep it confidential, it enables you to access administration panel'] = 'Bảo quản kỹ thông tin này, nó cho phép bạn truy cập vào Bảng Ä‘iá»u khiển của Quản trị.';
$lang['Password [confirm]'] = 'Mật khẩu [xác nhận]';
$lang['verification'] = 'xác nhận';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Cần trợ giúp ? Hãy gởi thắc mắc của bạn tại <a href="%s">diễn đàn của Piwigo</a>.';
-$lang['Webmaster mail address'] = 'Äịa chỉ thÆ° Ä‘iện tá»­ của Webmaster';
$lang['Visitors will be able to contact site administrator with this mail'] = 'Khách tham quan có thể liên lạc với Quản trị thông qua địa chỉ thư điện tử này.';
$lang['PHP 5 is required'] = 'Phải có PHP 5 ';
$lang['It appears your webhost is currently running PHP %s.'] = 'Do máy chủ web của bạn đang chạy phiên bản PHP %s.';
@@ -71,4 +64,5 @@ $lang['Just another Piwigo gallery'] = 'Lại thêm má»™t thÆ° viện Piwigo ná»
$lang['Welcome to my photo gallery'] = 'Chào mừng bạn đến với thư viện hình của tôi';
$lang['Welcome to your new installation of Piwigo!'] = 'Chào mừng bạn đến với bản cài đặt mới của Piwigo!';
$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Äừng do dá»± thảo luận tại diá»…n đàn của chúng tôi để được trợ giúp: %s';
+$lang['localhost or other, supplied by your host provider'] = 'localhost hoặc tên máy chủ cấp bởi nhà cung cấp host';
?> \ No newline at end of file
diff --git a/language/vi_VN/upgrade.lang.php b/language/vi_VN/upgrade.lang.php
index 4ca9df819..7cc0fcae2 100644
--- a/language/vi_VN/upgrade.lang.php
+++ b/language/vi_VN/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/zh_CN/admin.lang.php b/language/zh_CN/admin.lang.php
index 6a6a27517..86938ba81 100644
--- a/language/zh_CN/admin.lang.php
+++ b/language/zh_CN/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -162,7 +162,7 @@ $lang['Uninstall'] = 'å¸è½½';
$lang['Use the default photo sort order (defined in the configuration file)'] = '使用默认的图片排åºï¼ˆåœ¨é…置文件中定义)';
$lang['User comments validation'] = '用户评论审核';
$lang['Users'] = '用户';
-$lang['Validate'] = '审核';
+$lang['Validate'] = '批准';
$lang['Validation'] = 'å¯ç”¨è¯„论审核';
$lang['Version'] = '版本';
$lang['Virtual albums to move'] = '待移动的虚拟相册';
@@ -190,7 +190,6 @@ $lang['Access type'] = 'æƒé™ç±»åž‹';
$lang['Information data registered in database'] = 'ä¿¡æ¯æ•°æ®å·²å½•å…¥æ•°æ®åº“';
$lang['Default display'] = '默认显示';
$lang['The gallery URL is not valid.'] = '图库地å€æ— æ•ˆã€‚';
-$lang['Main'] = 'Main';
$lang['The number of comments a page must be between 5 and 50 included.'] = 'æ¯é¡µç”¨æˆ·è¯„论数必须在5å’Œ50之间。';
$lang['Configuration'] = '设置';
$lang['confirm'] = '确认';
@@ -225,7 +224,6 @@ $lang['Prepared time for list of users to send mail is limited. Others users are
$lang['Time to send mail is limited. Others mails are skipped.'] = 'å‘é€é‚®ä»¶æ—¶é—´æœ‰é™ï¼Œå…¶ä½™é‚®ä»¶å·²è¢«è·³è¿‡ã€‚';
$lang['To send ?'] = 'å‘é€ï¼Ÿ';
$lang['Last send'] = '上一次å‘é€';
-$lang['email'] = 'Email';
$lang['User'] = '用户';
$lang['See you soon,'] = '回è§ï¼Œ';
$lang['Go to'] = '转至 ';
@@ -931,8 +929,6 @@ $lang['Duplicate selected tags'] = 'å¤åˆ¶é€‰ä¸­çš„标签';
$lang['Name of the duplicate'] = '副本的å称';
$lang['Source tag'] = 'æºæ ‡ç­¾';
$lang['Tag "%s" is now a duplicate of "%s"'] = '标签 "%s" 已是标签 "%s" 的一个副本';
-$lang['Format'] = 'æ ¼å¼';
-$lang['Invalid dimension'] = '无效的尺寸';
$lang['Landscape'] = '风景(宽>高)';
$lang['Manage photos'] = '管ç†å›¾ç‰‡';
$lang['Minimum height'] = '最å°é«˜åº¦';
@@ -956,4 +952,32 @@ $lang['Manage the members'] = '管ç†ç”¨æˆ·';
$lang['Merge selected groups'] = 'åˆå¹¶æ‰€é€‰ç»„';
$lang['No group selected, no action possible.'] = '没有组被选中,ä¸èƒ½æ‰§è¡Œä»»ä½•æ“作。';
$lang['Purge user cache'] = '清除用户缓存';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = '相片的分辨率将会被å‡å°‘到 %dx%d 象素.';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = '由于使用 GD 图形库,因此ç¦ç”¨ä¸Šä¼ åŽè°ƒæ•´å¤§å°';
+$lang['Select at least one tag'] = '至少选择一个标签';
+$lang['Basic settings'] = '基本设置';
+$lang['General'] = '能用';
+$lang['Mail theme'] = '邮件主题';
+$lang['No user selected of %d users'] = '%d 个用户中无用户被选中';
+$lang['No user selected, no action possible.'] = '无用户被选中,无法执行。';
+$lang['Password updated'] = '密ç å·²æ›´æ–°';
+$lang['Registered on %s, %s.'] = '注册于 %s, %s。';
+$lang['Show %s users'] = '显示 %s 个用户';
+$lang['Showing %s to %s of %s users'] = '显示第 %s 至 %s 个用户,共 %s 个用户';
+$lang['Update user'] = '更新用户';
+$lang['User %s added'] = '用户 %s 已添加';
+$lang['User %s updated'] = '用户 %s 已更新';
+$lang['Users modified'] = '用户已修改';
+$lang['on the %d selected users'] = '于 %d 个已选中的用户';
+$lang['All %d users are selected'] = '已选中全部 %d 个用户';
+$lang['Change password'] = '更改密ç ';
+$lang['Change username'] = '更改用户å';
+$lang['Last visit on %s, %s.'] = '于 %s, %s 的最åŽè®¿é—®ã€‚';
+$lang['Loading...'] = '加载中…';
+$lang['No matching user found'] = '未å‘现匹é…的用户';
+$lang['%d of %d users selected'] = '已选中用户数/总数:%d / %d';
+$lang['(filtered from %s total users)'] = '(已从 %s 个总用户中过滤)';
+$lang['Close user details'] = '关闭用户明细';
+$lang['Open user details'] = '打开用户明细';
+$lang['close'] = '关闭';
?> \ No newline at end of file
diff --git a/language/zh_CN/common.lang.php b/language/zh_CN/common.lang.php
index b444b5c8e..fd0f3d09f 100644
--- a/language/zh_CN/common.lang.php
+++ b/language/zh_CN/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: 简体中文 [CN]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=438
Author: Piwigo team
Author URI: http://piwigo.org
@@ -242,7 +242,6 @@ $lang['login mustn\'t end with a space character'] = '用户åä¸èƒ½ä»¥ç©ºæ ¼ç»
$lang['login mustn\'t start with a space character'] = '用户åä¸èƒ½ä»¥ç©ºæ ¼å¼€å¤´';
$lang['this login is already used'] = '此用户å已存在';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = '邮箱地å€æ ¼å¼å¿…须符åˆæ ‡å‡†çš„ xxx@yyy.eee (例如: jack@altern.org)';
-$lang['please enter your password again'] = '请å†æ¬¡è¾“入密ç ';
$lang['Auto login'] = '自动登录';
$lang['remove this tag from the list'] = '从列表中删除此标签';
$lang['representative'] = '相册缩略图';
@@ -270,7 +269,6 @@ $lang['SQL queries in'] = 'SQLæœç´¢è¯­å¥';
$lang['display only recently posted photos'] = 'åªæ˜¾ç¤ºæœ€æ–°å›¾ç‰‡';
$lang['return to the display of all photos'] = '返回到显示所有图片';
$lang['the beginning'] = '起始';
-$lang['Interface theme'] = 'ç•Œé¢ä¸»é¢˜';
$lang['Thumbnails'] = '缩略图';
$lang['Menu'] = 'èœå•';
$lang['A comment on your site'] = '一个网站评论';
@@ -415,4 +413,12 @@ $lang['Username is mandatory'] = '必须输入用户å';
$lang['mandatory'] = 'å¿…å¡«';
$lang['Website'] = '网站';
$lang['Your website URL is invalid'] = '你的网站地å€æ— æ•ˆ';
+$lang['Email'] = '电å­é‚®ä»¶';
+$lang['First Page'] = '第一页';
+$lang['Go back to the album'] = '返回相册';
+$lang['Last Page'] = '最åŽä¸€é¡µ';
+$lang['Password is missing. Please enter the password.'] = '密ç æœªè¾“入,请输入密ç ã€‚';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = '密ç ç¡®è®¤æœªå®Œæˆï¼Œè¯·ç¡®è®¤æ‰€é€‰å®šçš„密ç ã€‚';
+$lang['%d photos per page'] = 'æ¯é¡µ %d 张相片 ';
+$lang['Theme'] = '主题';
?> \ No newline at end of file
diff --git a/language/zh_CN/install.lang.php b/language/zh_CN/install.lang.php
index ed6878942..b99158956 100644
--- a/language/zh_CN/install.lang.php
+++ b/language/zh_CN/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -27,16 +27,12 @@ $lang['Default gallery language'] = '图库默认语言';
$lang['Database configuration'] = 'æ•°æ®åº“设置';
$lang['Admin configuration'] = '管ç†å‘˜å¸æˆ·è®¾ç½®';
$lang['Start Install'] = '开始安装';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = '邮箱地å€æ ¼å¼é¡»ä¸º xxx@yyy.eee (例 : jack@altern.org)';
-$lang['Webmaster login'] = '站长';
$lang['It will be shown to the visitors. It is necessary for website administration'] = 'æ­¤å¸æˆ·ç”¨äºŽç®¡ç†ç½‘站,所有访问者都能看到此å¸æˆ·ã€‚';
$lang['Connection to server succeed, but it was impossible to connect to database'] = 'æœåŠ¡å™¨è¿žæŽ¥æˆåŠŸï¼Œä½†æ˜¯æ— æ³•è¿žæŽ¥åˆ°æ•°æ®åº“。';
$lang['Can\'t connect to server'] = '无法连接到æœåŠ¡å™¨';
$lang['Host'] = 'MySQL主机地å€';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
$lang['User'] = '用户';
$lang['user login given by your host provider'] = '主机用户å';
-$lang['Password'] = '密ç ';
$lang['user password given by your host provider'] = '主机用户密ç ';
$lang['Database name'] = 'æ•°æ®åº“å称';
$lang['also given by your host provider'] = '也由您的主机供应商æä¾›';
@@ -45,12 +41,10 @@ $lang['database tables names will be prefixed with it (enables you to manage bet
$lang['enter a login for webmaster'] = '添加站长id';
$lang['webmaster login can\'t contain characters \' or "'] = '站长idä¸èƒ½åŒ…å«å­—符 " 或 \'';
$lang['please enter your password again'] = '请å†æ¬¡è¾“入密ç ';
-$lang['Webmaster password'] = '站长密ç ';
$lang['Keep it confidential, it enables you to access administration panel'] = '请å°å¿ƒä¿ç®¡å¥½æ­¤å¯†ç ï¼Œå®ƒæ˜¯æ‚¨è¿›å…¥ç®¡ç†é¢æ¿çš„ä¿éšœã€‚';
$lang['Password [confirm]'] = 'å¯†ç  [ 确认 ]';
$lang['verification'] = '验è¯';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = '需è¦å¸®åŠ©å—?请到<a href="%s">Piwigo论å›</a>æ出您的问题。';
-$lang['Webmaster mail address'] = '站长email地å€';
$lang['Visitors will be able to contact site administrator with this mail'] = '访问者将å¯é€šè¿‡æ­¤email跟站长å–å¾—è”ç³»';
$lang['PHP 5 is required'] = '必须PHP 5版本';
$lang['It appears your webhost is currently running PHP %s.'] = '你主机PHP版本好åƒæ˜¯PHP %s.';
@@ -71,4 +65,5 @@ $lang['Just another Piwigo gallery'] = 'å¦ä¸€ä¸ªå´­æ–°çš„Piwigo图库';
$lang['Don\'t hesitate to consult our forums for any help : %s'] = '欢迎æ¥æˆ‘们的论å›å’¨è¯¢ä»»ä½•Piwigo相关问题:%s';
$lang['Welcome to your new installation of Piwigo!'] = '欢迎安装Piwigoï¼';
$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = '您需è¦è”系您的主机供应商的技术支æŒï¼Œå‘其咨询如何自行转æ¢ä¸ºPHP 5。';
+$lang['localhost or other, supplied by your host provider'] = '由你的æœåŠ¡å™¨æ供商æ供本地æœåŠ¡å™¨æˆ–者其他的';
?> \ No newline at end of file
diff --git a/language/zh_CN/upgrade.lang.php b/language/zh_CN/upgrade.lang.php
index b0c9c9d46..05f08826d 100644
--- a/language/zh_CN/upgrade.lang.php
+++ b/language/zh_CN/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/zh_HK/about.html b/language/zh_HK/about.html
index 5e1ada85f..d2a6b4efe 100644
--- a/language/zh_HK/about.html
+++ b/language/zh_HK/about.html
@@ -7,6 +7,7 @@
<p> 中文 (香港) 由以下人士維護 (å字按字æ¯é †åº):
<ul>
-<li><a href="http://piwigo.org/forum/profile.php?id=16380";> fatman</a></li>
+<li><a href="http://piwigo.org/forum/profile.php?id=16380";>fatman</a></li>
+<li><a href="http://piwigo.org/forum/profile.php?id=19146";>hkdigit</a></li>
</ul>
è¬è¬ç¿»è­¯äººå“¡! </P> \ No newline at end of file
diff --git a/language/zh_HK/admin.lang.php b/language/zh_HK/admin.lang.php
new file mode 100755
index 000000000..36dc5b74f
--- /dev/null
+++ b/language/zh_HK/admin.lang.php
@@ -0,0 +1,972 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['%d photos uploaded'] = '%d 相片已被上傳';
+$lang['%d photos were deleted'] = '%d 相片已被上傳';
+$lang['%d physical'] = '%d 實體';
+$lang['%d physicals'] = '%d 實體';
+$lang['%d second'] = '%d 秒';
+$lang['%d seconds'] = '%d 秒';
+$lang['%d tag'] = '%d 標籤';
+$lang['%d tags'] = '%d 標籤';
+$lang['%d user'] = '%d 用戶';
+$lang['%d user comment rejected'] = '%d 用戶æ„見已被拒絕';
+$lang['%d user comment validated'] = '%d 用戶æ„見已被接ç´';
+$lang['%d user comments rejected'] = '%d 用戶æ„見已被拒絕';
+$lang['%d user comments validated'] = '%d 用戶æ„見已被接ç´';
+$lang['%d user deleted'] = '%d 用戶已被刪除';
+$lang['%d user was not updated.'] = '%d 用戶沒有更新';
+$lang['%d user was updated.'] = '%d 用戶已被更新';
+$lang['%d users'] = '%d 用戶';
+$lang['%d users deleted'] = '%d 用戶已被刪除';
+$lang['%d users were not updated.'] = '%d 用戶沒有更新';
+$lang['%d users were updated.'] = '%d 用戶已被更新';
+$lang['%d mail was not sent.'] = '%s 郵件未被發é€';
+$lang['%d mail was sent.'] = '%s 郵件已被發é€';
+$lang['%d mails were not sent.'] = '%s 郵件未被發é€';
+$lang['%d mails were sent.'] = '%s 郵件已被發é€';
+$lang['%d of %d photos selected'] = '%d / %d 相片被é¸å–';
+$lang['%d parameter was updated.'] = '%d åƒæ•¸å·²æ›´æ–°';
+$lang['%d parameters were updated.'] = '%d åƒæ•¸å·²æ›´æ–°';
+$lang['%d photo was deleted'] = '%d 圖片已被刪除';
+$lang['%d guest'] = '%d 訪客';
+$lang['%d guests'] = '%d 訪客';
+$lang['%d hour'] = '%d å°æ™‚';
+$lang['%d hours'] = '%d å°æ™‚';
+$lang['%d line filtered'] = '%d 行被éŽæ¿¾';
+$lang['%d lines filtered'] = '%d 行被éŽæ¿¾';
+$lang['%d member'] = '%d 會員';
+$lang['%d members'] = '%d 會員';
+$lang['%d minute'] = '%d 分é˜';
+$lang['%d minutes'] = '%d 分é˜';
+$lang['%d month'] = '%d 月';
+$lang['%d months'] = '%d 月';
+$lang[' and %d virtual'] = '和 %d 虛擬';
+$lang[' and %d virtuals'] = '和 %d 虛擬';
+$lang['%d album including'] = 'åŒ…å« %d 相簿';
+$lang['%d album moved'] = '%d 相簿已移走';
+$lang['%d albums including'] = 'åŒ…å« %d 相簿';
+$lang['%d albums moved'] = '%d 相簿已移走';
+$lang['%d anomalies have been detected corrected.'] = 'æ察åŠä¿®æ­£äº† %d 個異常';
+$lang['%d anomalies have been detected.'] = 'æ察到 %d 個異常';
+$lang['%d anomalies have been ignored.'] = '%d 異常被忽略';
+$lang['%d anomalies have not been corrected.'] = 'ä¸èƒ½ä¿®æ­£ %d 個異常';
+$lang['%d anomaly has been corrected.'] = '修正了 %d 異常';
+$lang['%d anomaly has been detected.'] = 'æ察到 %d 異常';
+$lang['%d anomaly has not been corrected.'] = 'ä¸èƒ½ä¿®æ­£ %d 異常';
+$lang['%d association'] = '%d è¯ç¹«';
+$lang['%d associations'] = '%d è¯ç¹«';
+$lang['%d anomaly has been ignored.'] = '%d 異常被忽略';
+$lang['%d day'] = '%d 天';
+$lang['%d days'] = '%d 天';
+$lang['%d group'] = '%d 群組';
+$lang['%d groups'] = '%d 群組';
+$lang['ranks'] = '等級';
+$lang['registered users'] = '已註冊用戶';
+$lang['registration date'] = '註冊日期';
+$lang['selection'] = 'é¸æ“‡';
+$lang['simple visitors'] = '簡單訪客';
+$lang['private'] = 'ç§äºº';
+$lang['public'] = '公開';
+$lang['randomly represented'] = '隨機相簿縮圖';
+$lang['sub-albums'] = '相簿å­ã€€';
+$lang['synchronize files structure with database'] = '檔案çµæ§‹è·Ÿæ•¸æ“šåº«åŒæ­¥';
+$lang['target'] = '目標';
+$lang['test'] = '測試';
+$lang['test this remote site'] = '測試這個é ç¨‹åœ°å€';
+$lang['the forum'] = '討論å€';
+$lang['the wiki'] = '維基百科';
+$lang['top left corner'] = '左上角';
+$lang['top right corner'] = 'å³ä¸Šè§’  ';
+$lang['total time'] = '總算時間';
+$lang['unit mode'] = '個人模å¼ã€€';
+$lang['unknown'] = 'ä¸çŸ¥å的 ';
+$lang['unset'] = '去設定除 ';
+$lang['update the database from files'] = '以檔案來更新數據庫';
+$lang['user "%s" added'] = '用戶"%s"已增加';
+$lang['user_status_admin'] = '管ç†å“¡';
+$lang['user_status_generic'] = '基本';
+$lang['user_status_guest'] = '嘉賓';
+$lang['user_status_normal'] = '用戶';
+$lang['user_status_webmaster'] = '網主';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = '訪客需è¦ç™»å…¥åŠæŒ‡å®šæ¬Šé™æ‰çœ‹åˆ°ç›¸ç°¿';
+$lang['width must be a number superior to'] = '闊度一定è¦å¤§éŽ';
+$lang['wrong filename'] = '錯誤檔案å稱';
+$lang['A new version of Piwigo is available.'] = '新版本的Piwigo已經å¯ç”¨';
+$lang['Add'] = '新增';
+$lang['Active Languages'] = 'ç¾è¡Œçš„æ’件';
+$lang['Active Plugins'] = 'ç¾è¡Œçš„æ’件';
+$lang['%d waiting for validation'] = '%d 等候審批';
+$lang['%d week'] = '%d 星期';
+$lang['%d weeks'] = '%d 星期';
+$lang['%d year'] = '%d å¹´';
+$lang['%d years'] = '%d å¹´';
+$lang['%s ago'] = '%s 之å‰';
+$lang['%s has been successfully updated.'] = '%s å·²æˆåŠŸæ›´æ–°';
+$lang['%s in the future'] = '%s 在將來';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s 在local/config/config.inc.php檔案內必需設定為錯誤.';
+$lang['%s photos can not be regenerated'] = '%s 相片ä¸èƒ½é‡æ–°è£½ä½œ';
+$lang['%s photos have been regenerated'] = '%s 相片已æˆåŠŸè£½ä½œ';
+$lang['%s value is not correct file because exif are not supported'] = '%s 數目錯誤因為ä¸æ”¯æ´exif';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '%u 用戶已經自動å–得許å¯, 因為他們屬於一個已審批的組群.';
+$lang['(this tag will be deleted)'] = '(這個標籤將會被刪除)';
+$lang['+ Add an upload box'] = '+加一個上傳框架';
+$lang[', click on'] = ', 按在';
+$lang['... or '] = '...或';
+$lang['A locked gallery is only visible to administrators'] = 'å·²å°éŽ–的相簿祗會被管ç†å“¡çœ‹åˆ°';
+$lang['albums added in the database'] = '相簿已在數é‡åº«å¢žåŠ ';
+$lang['albums deleted in the database'] = '相簿已在數é‡åº«åˆªé™¤';
+$lang['all'] = '全部';
+$lang['an error happened'] = '一個錯誤出ç¾';
+$lang['and'] = 'åŠ';
+$lang['any visitor can see this album'] = '所有訪客都å¯çœ‹åˆ°é€™å€‹ç›¸ç°¿';
+$lang['apply automatic sort order'] = '行使自動ä¾æ¬¡åºæŽ’åº';
+$lang['automatic order'] = '自動排åº';
+$lang['average time'] = 'å¹³å‡æ™‚é–“';
+$lang['between'] = '之間';
+$lang['between %.2f and %.2f'] = '%.2f åŠ %.2f 之間';
+$lang['between %d and %d pixels'] = '%d åŠ %d åƒé»žä¹‹é–“';
+$lang['bottom left corner'] = '左下角';
+$lang['bottom right corner'] = 'å³ä¸‹è§’ ';
+$lang['cancel manual order'] = 'å–消手動排åº';
+$lang['clean'] = '清空';
+$lang['confirm'] = '確定';
+$lang['Anomaly'] = '異常';
+$lang['Album name'] = '相簿å稱';
+$lang['Album updated successfully'] = '相簿更新æˆåŠŸ';
+$lang['Albums automatically sorted'] = '相簿自動排列';
+$lang['All %d photos are selected'] = '所有%d相片已é¸';
+$lang['All languages are up to date.'] = '所有語言已是最新版本';
+$lang['All optimizations have been successfully completed.'] = '所有優化已已經完æˆ';
+$lang['All plugins are up to date.'] = '所有æ’件已是最新版本';
+$lang['All themes are up to date.'] = '所有主題佈置已是最新版本';
+$lang['An error has occured during upgrade.'] = 'å‡ç´šæ™‚發生錯誤';
+$lang['An error occured during extraction (%s).'] = '檔案(%s)解壓時發生錯誤';
+$lang['Allow rating'] = 'å…許評分';
+$lang['Allow user customization'] = 'å…許用戶更改設定';
+$lang['Allow user registration'] = 'å…許用戶登記';
+$lang['Allow users to delete their own comments'] = 'å…許用戶刪除自己的評語';
+$lang['Allow users to edit their own comments'] = 'å…許用戶修改自己的評語';
+$lang['Allowed file types: %s.'] = 'å…許檔案種類: %s.';
+$lang['Add Photos'] = '新增相片';
+$lang['Add a user'] = '新增用戶';
+$lang['Add group'] = '新增用戶群';
+$lang['Add New Language'] = '新增新語言';
+$lang['Add New Theme'] = '新增新主題佈置';
+$lang['ACCESS_0'] = '隨æ„使用';
+$lang['ACCESS_1'] = '使用所有';
+$lang['ACCESS_2'] = '進入註冊用戶';
+$lang['ACCESS_3'] = '進入管ç†å“¡';
+$lang['ACCESS_4'] = '進入網é ç®¡ç†å“¡';
+$lang['ACCESS_5'] = '沒有使用權';
+$lang['Access type'] = '使用權種類';
+$lang['Action'] = '行動';
+$lang['Actions'] = '行動';
+$lang['Activate'] = '啟動  ';
+$lang['Activate Navigation Bar'] = '啟動導航橫槓';
+$lang['Activate Navigation Thumbnails'] = '啟動導航縮圖';
+$lang['Activate comments'] = 'å•Ÿå‹•æ„見';
+$lang['Activate icon "%s"'] = '啟動圖標"%s"';
+$lang['Activate icon "new" next to albums and pictures'] = '啟動圖標"new"在相簿åŠç›¸ç‰‡æ—';
+$lang['Active Themes'] = '啟動主題佈置';
+$lang['Hello'] = '你好 ';
+$lang['Hello,'] = '你好,';
+$lang['Help Me'] = '幫助我';
+$lang['Hide'] = 'éš±è—';
+$lang['High definition'] = '高畫質';
+$lang['High definition enabled'] = '高畫質已啟用';
+$lang['History'] = 'æ­·å²';
+$lang['Hit'] = '點擊';
+$lang['Hour'] = 'å°æ™‚';
+$lang['Hoverbox display'] = '懸åœæ¡†é¡¯ç¤º';
+$lang['I decide to update anyway'] = '我決定è¦æ›´æ–°';
+$lang['IP'] = 'IP';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'å‡å¦‚圖片éžé«˜ç•«è³ªï¼Œä½†åœ¨ç¶²é ä¸Šåœ–片尺寸大於調整後尺寸,Piwigoä»æœƒå°‡åœ–片標為高畫質,並å¦å­˜ä¸€å¼µç¸®åœ–';
+$lang['If you encounter problems or have any question, please send a message to'] = '如有é‡åˆ°æ•…障或å•é¡Œ,請發郵件至 ';
+$lang['Ignore All'] = '忽略全部';
+$lang['Ignore selected anomalies'] = '忽視é¸æ“‡ç•°å¸¸';
+$lang['Ignore this update'] = '忽略此更新';
+$lang['Image Quality'] = '圖片質é‡';
+$lang['Image id'] = '圖片ID';
+$lang['Images manual order was saved'] = '圖片手動排åºå·²ä¿å­˜';
+$lang['Gallery unlocked'] = '畫廊已解鎖';
+$lang['General'] = '普通';
+$lang['General statistics'] = '普通統計';
+$lang['Generate multiple size images'] = '產生多種大å°çš„圖åƒ';
+$lang['Get Support on Piwigo Forum'] = '在 Piwigo 論壇上ç²å–幫助';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = '給予根目錄下的 "%s" ç›®éŒ„å¯«æ¬Šé™ (chmod 777) ä»¥å®Œæˆ Piwigo 的安è£';
+$lang['Go to'] = '轉至 ';
+$lang['Go to %s or %s for more informations'] = 'ç²å–更多信æ¯ï¼Œè«‹åˆ° %s 或者 %s ';
+$lang['Grant selected groups'] = 'å°æ‰€é¸ç¾¤çµ„授權';
+$lang['Grant selected users'] = 'å°æ‰€é¸ç”¨æˆ¶æŽˆæ¬Š';
+$lang['Graphics Library'] = '圖庫';
+$lang['Group'] = '群組';
+$lang['Group management'] = '群組管ç†';
+$lang['Group name'] = '群組å稱';
+$lang['Groups'] = '群組';
+$lang['Groups and users'] = '群組別和用戶';
+$lang['Guest Settings'] = '訪客設定';
+$lang['Guest cannot be deleted'] = 'ä¸èƒ½åˆªé™¤è¨ªå®¢';
+$lang['Guests'] = '訪客';
+$lang['Height'] = '高度';
+$lang['Extend for templates'] = '擴充模æ¿';
+$lang['Extensions Update'] = 'æ“´å……æ›´æ–°';
+$lang['FTP + Synchronization'] = 'FTP + åŒæ­¥';
+$lang['Failed to write file to disk'] = '檔案寫入失敗';
+$lang['Features include gallery browsing, album creation and photo upload.'] = '功能包括:畫廊ç€è¦½ã€å»ºç«‹ç›¸å†Šå’Œç…§ç‰‡ä¸Šå‚³';
+$lang['File'] = '檔案';
+$lang['File upload stopped by extension'] = '擴展使文件上傳åœæ­¢';
+$lang['File/directory read error'] = '檔案/目錄的讀å–錯誤';
+$lang['Find a new representant by random'] = 'æœå°‹ä¸€å€‹æ–°çš„隨機相冊縮略圖';
+$lang['Follow Orientation'] = '定ä½';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = '以下æ’件å¯èƒ½ç„¡æ³•å…¼å®¹æ–°Piwigo的版本:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = '以下主題å¯èƒ½ç„¡æ³•å…¼å®¹æ–°ç‰ˆæœ¬Piwigo:';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = '如é¸æ“‡ç›¸ç‰‡å‰ªè£ï¼ˆå¦‚「正方形ã€ï¼‰ï¼ŒPiwigo會盡å¯èƒ½ä¿ç•™ç›¸ç‰‡çš„焦點';
+$lang['Forbid this language to users'] = 'ç¦æ­¢ç”¨æˆ¶ä½¿ç”¨æ­¤èªžè¨€';
+$lang['Forbid this theme to users'] = 'ç¦ç”¨æ­¤ä¸»é¡Œ';
+$lang['Forbidden'] = 'ç¦æ­¢';
+$lang['Form'] = '表格';
+$lang['GD library is missing'] = '缺少GD庫';
+$lang['GD version'] = 'GD版本';
+$lang['Gallery title'] = '圖庫標題';
+$lang['Edit photo information'] = '編輯圖片信æ¯';
+$lang['Edit ranks'] = '編輯排å';
+$lang['Edit selected tags'] = '編輯所é¸æ¨™ç±¤';
+$lang['Edit tags'] = '編輯標籤';
+$lang['Element'] = '單元';
+$lang['Element type'] = '單元類型';
+$lang['Email administrators when a comment is deleted'] = '當評論被刪除後,發郵件通知管ç†å“¡';
+$lang['Email administrators when a comment is modified'] = '當評論被修改後,發郵件通知管ç†å“¡';
+$lang['Email admins when a comment requires validation'] = '當用戶è¦æ±‚確èªä»–的評論時通知管ç†å“¡';
+$lang['Email admins when a new user registers'] = '當有新的使用者註冊就通知管ç†å“¡';
+$lang['Email admins when a valid comment is entered'] = '當用戶發表評論時就通知管ç†å“¡';
+$lang['Environment'] = '環境';
+$lang['Error list'] = '錯誤清單';
+$lang['Error on file "%s" : %s'] = '文件上的錯誤 "%s" : %s';
+$lang['Error when sending email to %s [%s].'] = '發é€éƒµä»¶ 給 %s [%s]發生了錯誤.';
+$lang['Errors caption'] = '錯誤說明';
+$lang['Everybody'] = '所有人';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = '已超éŽåŸ·è¡Œæ™‚é–“, 處ç†é‚„需時間[估計時間: %d 秒].';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = '已超éŽåŸ·è¡Œæ™‚é–“, 處ç†é‚„需時間[估計時間: %d 秒].';
+$lang['Exif extension not available, admin should disable exif use'] = 'Exif 擴展ä¸èƒ½ä½¿ç”¨ï¼Œç®¡ç†å“¡æ‡‰è©²ç¦ç”¨ exif 功能。';
+$lang['Discover album:'] = '探索相冊:';
+$lang['Display options'] = '顯示é¸é …';
+$lang['Dissociate from album'] = '從相冊裡分離';
+$lang['Dissociated'] = 'å–消è¯ç¹«';
+$lang['Do you want to activate anyway?'] = '無論如何都è¦å•Ÿå‹•å—Ž?';
+$lang['Documentation'] = '檔案';
+$lang['Does not represent'] = 'ä¸æ˜¯ç¸®ç•¥åœ–';
+$lang['Download,'] = '下載,';
+$lang['Downloads'] = '下載';
+$lang['Drag to re-order'] = '點擊並拖動以é‡æ–°æŽ’åº';
+$lang['Drop into album'] = 'é¸æ“‡ç›¸å†Š';
+$lang['Dump Database'] = '轉儲資料庫';
+$lang['Duplicate'] = 'é‡è¤‡';
+$lang['Duplicate selected tags'] = 'é‡è¤‡é¸å–標籤';
+$lang['Duplicates'] = 'é‡è¤‡';
+$lang['ERROR'] = '錯誤';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = '錯誤:這個æ’件雖已安è£ä½†ä¸¦ä¸å­˜åœ¨! è«‹ç«‹å³ç§»é™¤å®ƒ!';
+$lang['Edit album'] = '修改相冊';
+$lang['Edit album permissions'] = '管ç†ç›¸å†Šæ¬Šé™';
+$lang['Edit photo'] = '編輯相片';
+$lang['Default display'] = 'é è¨­é¡¯ç¤ºè³‡è¨Š';
+$lang['Default photos order'] = 'é è¨­çš„相片順åº';
+$lang['Default user cannot be deleted'] = 'ä¸èƒ½åˆªé™¤é è¨­ç”¨æˆ¶';
+$lang['Default user does not exist'] = 'é è¨­ç”¨æˆ¶ä¸å­˜åœ¨';
+$lang['Delete Representant'] = '刪除相冊縮略圖';
+$lang['Delete multiple size images'] = '刪除多種大å°çš„圖åƒ';
+$lang['Delete orphan tags'] = '刪除沒被關è¯çš„標籤';
+$lang['Delete selected photos'] = '刪除圖片';
+$lang['Delete selected tags'] = '刪除所é¸æ¨™ç±¤';
+$lang['Delete selected users'] = '刪除所é¸ç”¨æˆ¶';
+$lang['Delete this language'] = '刪除此語言';
+$lang['Delete this theme'] = '刪除此主題';
+$lang['Deleted on'] = '刪除於';
+$lang['Deletions'] = '刪除';
+$lang['Deny selected groups'] = '拒絕所é¸ç¾¤çµ„';
+$lang['Deny selected users'] = '拒絕所é¸çš„用戶';
+$lang['Description'] = 'æè¿°';
+$lang['Detailed informations'] = '詳細信æ¯';
+$lang['Directory'] = '目錄';
+$lang['Directory does not exist'] = '目錄ä¸å­˜åœ¨';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = '建立"%s"在安è£Piwigo的根目錄下';
+$lang['Complementary mail content'] = '郵件附加內容';
+$lang['Configuration'] = '設定';
+$lang['Confirm merge'] = '確èªåˆä½µ';
+$lang['Continue processing treatment'] = '正在繼續處ç†ä¸­...';
+$lang['Correction'] = '修正';
+$lang['Correction applied with error'] = '修正é©ç”¨çš„錯誤';
+$lang['Correction applied with success'] = 'æˆåŠŸä¿®æ­£';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'çš„ä¸å†è¢«å¿½è¦–異的修正';
+$lang['Create'] = '建立';
+$lang['Create this site'] = '建立網站';
+$lang['Crop'] = '剪è£';
+$lang['Current name'] = 'ç¾ç”¨å';
+$lang['Database'] = 'ç¾ç”¨å';
+$lang['Database synchronization with files'] = '根據文件來åŒæ­¥è³‡æ–™åº«';
+$lang['Date'] = '日期';
+$lang['Day'] = 'æ—¥';
+$lang['Deactivate'] = 'åœç”¨';
+$lang['Deactivate all'] = 'åœç”¨æ‰€æœ‰';
+$lang['Default comments order'] = 'é è¨­è©•è«–é †åº';
+$lang['Can\'t connect to server.'] = '無法連接到æœå‹™å™¨ã€‚';
+$lang['Can\'t create temporary file.'] = '無法建立臨時文件。';
+$lang['Can\'t download archive.'] = '無法下載歸檔文件。';
+$lang['Can\'t read or extract archive.'] = '無法讀å–或解壓歸檔文件.';
+$lang['Cancel'] = 'å–消';
+$lang['Cannot delete the old permalink !'] = '舊的固定連çµä¸èƒ½è¢«åˆªé™¤!';
+$lang['Center of interest'] = '中心愛好';
+$lang['Change Admin Colors'] = '更改管ç†å“¡å¾Œå°é¡è‰²';
+$lang['Change password'] = '更改密碼';
+$lang['Change username'] = '更改用戶å';
+$lang['Check all'] = '檢查全部';
+$lang['Check automatic corrections'] = '檢查自動修正';
+$lang['Check for updates'] = '檢查是å¦æœ‰æ›´æ–°';
+$lang['Check for upgrade'] = '檢查是å¦æœ‰å‡ç´š';
+$lang['Check for upgrade failed for unknown reasons.'] = '檢查是å¦æœ‰å‡ç´šå¤±æ•—由於未知原因。';
+$lang['Check integrity'] = '完整性檢查';
+$lang['Choose an action'] = 'é¸æ“‡ä¸€å€‹å‹•ä½œ';
+$lang['Choose an option'] = 'é¸æ“‡ä¸€å€‹é¸é …';
+$lang['Classic display'] = '經典顯示';
+$lang['Comments for all'] = '評論所有的';
+$lang['Are you sure you want to install this plugin?'] = '確定安è£æ­¤æ’件嗎?';
+$lang['Associate to album'] = 'é—œè¯åˆ°ç›¸å†Š';
+$lang['Associated'] = '已關è¯';
+$lang['Authorize users to add comments on selected albums'] = '讓用戶å¯åœ¨æ‰€é¸ç›¸å†Šè£¡ç™¼è¡¨è©•è«–';
+$lang['Authorized'] = '已授權';
+$lang['Automatic correction'] = '自動修改';
+$lang['Automatic sort order'] = '自動排åº';
+$lang['Available on'] = 'å¯ç”¨çš„';
+$lang['Available only with HTML format'] = '僅é©ç”¨æ–¼HTMLæ ¼å¼';
+$lang['Available versions for'] = 'å¯ç”¨çš„版本是';
+$lang['Average rate'] = 'å¹³å‡åˆ†';
+$lang['Basic settings'] = '基本設置';
+$lang['Batch Manager'] = '批é‡ç®¡ç†';
+$lang['Bound Theme'] = 'ç¶å®šä¸»é¡Œ';
+$lang['By %s'] = '按 %s';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = '在é è¨­ç‹€æ³ä¸‹ï¼ŒPiwigo 將從原照片的高清晰度版本,建立å¦ä¸€å€‹é©ç”¨æ–¼ç¶²é çš„尺寸版本。';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = '在é è¨­æƒ…æ³ä¸‹ï¼Œç„¦é»žæ˜¯æ“ºåœ¨ç›¸ç‰‡çš„中間';
+$lang['By rank'] = '按等級';
+$lang['Caddie'] = '購物籃';
+$lang['Caddie management'] = '購物籃管ç†';
+$lang['Album list management'] = '相冊清單管ç†';
+$lang['Album manual order was saved'] = '相冊手動排åºå·²ä¿å­˜';
+$lang['Album photos associated to the following albums: %s'] = '相片已關è¯åˆ°ç›¸å†Š:%s';
+$lang['Albums authorized thanks to group associations'] = '相冊群組織授權感è¬å”會';
+$lang['All %d users are selected'] = '所有%d的用戶都被é¸ä¸­';
+$lang['All extensions are up to date.'] = '所有的擴展已是最新的';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = '在æå–éŽç¨‹ä¸­ç™¼ç”ŸéŒ¯èª¤ã€‚請檢查您piwigo安è£æ™‚的檔案權é™.<br><a href="%s">點擊這裡顯示日誌中的錯誤</a>.';
+$lang['An information email was sent to group "%s"'] = 'å·²å‘群組"%s"的所有æˆå“¡ç™¼é€äº†ä¿¡æ¯éƒµä»¶';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = '任何人都ä¸èƒ½ä½¿ç”¨æ­¤æ¨™ç±¤(網管除外).';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture是Mac的一項強大工具,å¯å¾®èª¿è®“圖åƒæ›´ç²¾ç·»ï¼Œä¸¦ç®¡ç†è¶…大照片庫.';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture是為專業æ”影師設計的軟體,但使用起來åˆèˆ‡iPhoto一樣簡單.';
+$lang['Applications'] = '申請';
+$lang['Apply action'] = '套用';
+$lang['Apply selected corrections'] = '套用所é¸çš„修正';
+$lang['Apply to sub-albums'] = '套用到å­ç›¸å†Š';
+$lang['Apply watermark if height is bigger than'] = '使用浮水å°ç•¶é«˜åº¦å¤§æ–¼';
+$lang['Apply watermark if width is bigger than'] = '使用浮水å°ç•¶å¯¬åº¦å¤§æ–¼';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = '大約最高解åƒåº¦: %dMåƒç´  (å³ %dx%dåƒç´ ).';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = '確定安è£æ­¤æ›´æ–°å—Ž? 你必須核實無需å¸è¼‰æ“作å†é€²è¡Œå®‰è£æ­¤æ›´æ–°.';
+$lang['Are you sure you want to delete this plugin?'] = '確定è¦åˆªé™¤æ­¤æ’件嗎?';
+$lang['%d of %d users selected'] = '%d到%dä½ç”¨æˆ¶é¸æ“‡';
+$lang['(filtered from %s total users)'] = '(å…±%s用戶被éŽæ¿¾ï¼‰';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = '<em>Android 版的Piwigo</em>å…許從 Android 手機或平版連接到您的Piwigo畫廊,建立多個相冊並一次上傳多張相片。';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = '<em>iOS 版的Piwigo</em>å…許您從iPhone, iPad 或 iPod Touch 連接到您的Piwigo畫廊,建立多個相冊並一次上傳多張相片。';
+$lang['Add a criteria'] = '增加准則';
+$lang['Add a filter'] = '增加篩é¸';
+$lang['Add a tag'] = '增加標籤';
+$lang['Add a virtual album'] = '增加虛擬相冊';
+$lang['Add another set of photos'] = '增加å¦ä¸€çµ„相片';
+$lang['Add detailed content'] = '增加內容細節';
+$lang['Add tags'] = '增加標籤';
+$lang['Add to caddie'] = '放入購物籃';
+$lang['Add write access to the "%s" directory'] = '為"%s"目錄增加寫入權é™';
+$lang['Add/delete a permalink'] = '增加/刪除一個固定連çµ';
+$lang['Added by %s'] = '由 %s 加入';
+$lang['Administration Home'] = '管ç†å“¡é¦–é ';
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Photoshop Lightroom 是一套æ”影軟件,å¯ç®¡ç†å¤§é‡æ•¸ä½å½±åƒå’Œé€²è¡Œå¾Œè£½å·¥ä½œã€‚';
+$lang['Advanced features'] = '進階功能';
+$lang['Album "%s" has been added'] = '已增加相冊 "%s" ';
+$lang['Album "%s" now contains %d photos'] = '相冊"%s"ç¾å·²åŒ…å«äº†%d張相片';
+$lang['pending validation'] = '待審定';
+$lang['photos added in the database'] = '增加圖片到資料庫';
+$lang['photos candidates for metadata synchronization'] = 'å°æ‡‰åŒæ­¥å…ƒæ•¸æ“šçš„候é¸åœ–片';
+$lang['photos deleted from the database'] = '圖片已從資料庫中刪除';
+$lang['photos informations synchronized with files metadata'] = '相片信æ¯å·²å’Œæª”案metadataåŒæ­¥';
+$lang['photos per page'] = 'æ¯é åœ–片';
+$lang['photos updated in the database'] = '更新資料庫中的圖片';
+$lang['pixels'] = 'åƒç´ ';
+$lang['reduce to single existing albums'] = '減少ç¾æœ‰çš„å–®ç¨ç›¸å†Š';
+$lang['remove author'] = '刪除作者';
+$lang['remove creation date'] = '刪除建立日期';
+$lang['remove tags'] = '刪除所有標籤';
+$lang['remove this filter'] = '刪除此篩é¸';
+$lang['remove title'] = '刪除標題';
+$lang['set to'] = '設定為';
+$lang['show details'] = '顯示細節';
+$lang['singly represented'] = '固定相冊縮略圖';
+$lang['status'] = '狀態';
+$lang['synchronize files metadata with database photos informations'] = '根據文件metadataåŒæ­¥è³‡æ–™åº«ä¸­çš„相片信æ¯';
+$lang['jump to photo'] = '跳到圖';
+$lang['leave'] = '離開';
+$lang['manage album photos'] = '管ç†ç›¸å†Šè£¡çš„相片';
+$lang['manage sub-albums'] = '管ç†å­ç›¸å†Š';
+$lang['manual order'] = '手工排åº';
+$lang['middle'] = '中間';
+$lang['modified'] = '已修改';
+$lang['new'] = '新增';
+$lang['no write access'] = '沒有寫入權é™';
+$lang['none'] = '沒有寫入權é™';
+$lang['nothing'] = '沒有寫入權é™';
+$lang['number of miniaturized photos'] = '數é‡çš„縮略圖建立';
+$lang['on'] = '在';
+$lang['on the %d selected photos'] = '在%d張已é¸ç›¸ç‰‡ä¸Š';
+$lang['on the %d selected users'] = '%dçš„é¸å®šç”¨æˆ¶';
+$lang['only directories'] = '僅目錄';
+$lang['only perform a simulation (no change in database will be made)'] = 'åªé€²è¡Œæ¨¡æ“¬æ“作(ä¸æœƒæ”¹è®Šè³‡æ–™åº«ä¸­çš„任何內容)';
+$lang['other'] = 'å¦å¤–';
+$lang['overrides existing values with empty ones'] = '用空數據來刪除已存在的數據';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader 是 <em>Piwigo 上傳者</em> 的官方標準軟件。pLoader å¯å°‡æ‚¨é›»è…¦è£¡çš„相片傳é€åˆ° Piwigo 的相片畫廊裡。';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = '顯示最大é‡çš„ä¿¡æ¯(增加相冊和相片,刪除的相冊和照片)';
+$lang['dissociate from group'] = 'å–消群組關è¯';
+$lang['errors during synchronization'] = 'åŒæ­¥æœŸé–“發生錯誤';
+$lang['even already synchronized photos'] = '包括已經åŒæ­¥çš„圖片';
+$lang['existing album'] = 'ç¾æœ‰çš„相冊';
+$lang['first photo added on %s'] = '於%s上傳了第一幅圖';
+$lang['for the file format'] = 'å°æ–¼æª”案格å¼';
+$lang['for this file format'] = 'å°æ–¼æ­¤æª”案格å¼';
+$lang['global mode'] = '全局模å¼';
+$lang['group "%s" added'] = '增加 "%s" 群組';
+$lang['group "%s" deleted'] = '刪除 "%s" 群組';
+$lang['group "%s" updated'] = '更新 "%s" 群組';
+$lang['guest'] = '訪客';
+$lang['height must be a number superior to'] = '圖片高度必須超éŽ(整數)';
+$lang['hide details'] = 'éš±è—細節';
+$lang['high'] = '高';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto是MacOSXé è¨­çš„相片管ç†è»Ÿé«”。此Piwigo匯出æ’件,å¯è®“你直接從iPhoto匯出相片至Piwigo圖庫,並建立新相冊';
+$lang['include child albums'] = '包å«å­ç›¸å†Š';
+$lang['include photos with lower privacy level'] = '包å«éš±ç§ç´šåˆ¥è¼ƒä½Žçš„相片';
+$lang['jump to album'] = '跳到相冊';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = '您å¯ç›´æŽ¥å‡ç´šåˆ°Piwigoçš„%s,而ä¸éœ€å‡ç´šåˆ°Piwigoçš„%s(建議版本)';
+$lang['add new photos to caddie'] = '把所有新圖片放到購物籃';
+$lang['added'] = '已加入';
+$lang['administrators'] = '管ç†å“¡';
+$lang['associate to group'] = 'é—œè¯åˆ°ç¾¤çµ„';
+$lang['create a new album'] = '建立一個新相冊';
+$lang['create a new site'] = '建立新的網站';
+$lang['created'] = '已建立';
+$lang['custom'] = '自定義';
+$lang['default'] = 'é è¨­';
+$lang['default values'] = 'é è¨­å€¼';
+$lang['delete'] = '刪除';
+$lang['delete album'] = '刪除相冊';
+$lang['delete photo'] = '刪除相冊';
+$lang['delete this site and all its attached elements'] = '刪除此站點和與其相關è¯çš„所有信æ¯';
+$lang['deleted'] = '已刪除';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam是一套先進的數ä½ç›¸ç‰‡ç®¡ç†è»Ÿé«”,它是自由軟體,é©ç”¨æ–¼LINUX,WINDOWSå’ŒMacOSX。';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam是專為æ”影師ç€è¦½ã€ç®¡ç†ã€ç·¨è¼¯ã€åŠ å·¥ã€æ•´ç†ã€æ¨™è¨˜åŠåˆ†äº«ç…§ç‰‡ç­‰ç”¨é€”而設計。';
+$lang['directories + files'] = '目錄+文件';
+$lang['display'] = '顯示';
+$lang['You are running the latest version of Piwigo.'] = '你正在執行的是Piwigo最新版。';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = '您正在使用ç€è¦½å™¨ä¸Šå‚³ï¼Œæ‚¨ä¹Ÿå¯æ”¹ç”¨<a href="%s">Flash上傳器上傳。';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = '您正在使用Flash上傳器上傳;若有å•é¡Œï¼Œæ‚¨ä¹Ÿå¯æ”¹ç”¨<a href="%s">ç€è¦½å™¨ä¸Šå‚³ã€‚';
+$lang['You can activate only one mobile theme.'] = '您最多åªèƒ½å•Ÿç”¨ä¸€å€‹æ‰‹æ©Ÿä¸»é¡Œã€‚';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = '無法使用é è¨­ç›¸ç‰‡é †åºï¼Œå› ä½ åœ¨æœ¬æ©Ÿé…ç½®å¦æœ‰è‡ªè¨‚設定。';
+$lang['You cannot delete your account'] = 'ä½ ä¸èƒ½åˆªé™¤è‡ªå·±æœ¬èº«å¸³è™Ÿ';
+$lang['You cannot move an album in its own sub album'] = '您ä¸èƒ½å°‡ä¸€å€‹ç›¸å†Šç§»å‹•åˆ°å…¶å­ç›¸å†Šè£¡';
+$lang['You have %d orphan tags: %s.'] = '您已 %d ç„¡é—œè¯æ¨™ç±¤: %s。';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = '你已在本地設定檔é¸ç”¨ <i>$conf[\'order_by\']</i>,造æˆåƒæ•¸çŸ›ç›¾ï¼Œè«‹å°‡å®ƒç§»é™¤æˆ–é‡æ–°å‘½å為 <i>$conf[\'order_by_custom\']</i>ï¼';
+$lang['You have subscribed to receiving notifications by mail.'] = '你開通了郵件通知功能。';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'ä½ å–消了你的郵件通知功能。';
+$lang['You might go to plugin list to install and activate it.'] = '在æ’件列表中安è£å’Œå•Ÿå‹•æ’件。';
+$lang['You need to confirm deletion'] = '您必須確èªåˆªé™¤ã€‚';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = '你應該å‡ç´šä½ çš„系統,以充分利用該應用程åºï¼Œå¦å‰‡æ‡‰ç”¨ç¨‹åºå¯èƒ½ç„¡æ³•æ­£å¸¸å·¥ä½œï¼Œæˆ–者ä¸æ˜¯ã€‚';
+$lang['Your configuration settings are saved'] = '你的設定已儲存';
+$lang['Zoom'] = '放大';
+$lang['[%s] Visit album %s'] = '[%s] åƒè§€ç›¸å†Š %s';
+$lang['[NBM] Problems or questions'] = '[NBM] 故障或者疑å•';
+$lang['add a new watermark'] = '增加新浮水å°';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = '警告! 這個æ’件與此Piwigo版本ä¸ç›¸å®¹!';
+$lang['Waiting'] = '等待';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = '注æ„, 訂閱或退訂都會給相關用戶發é€éƒµä»¶';
+$lang['Watermark'] = '浮水å°';
+$lang['Web Form'] = '網é è¡¨æ ¼';
+$lang['Webmaster cannot be deleted'] = 'ä¸èƒ½åˆªé™¤ç¶²ç®¡å¸³æˆ¶';
+$lang['Webmaster status is required.'] = '必須設置網站管ç†å“¡ã€‚';
+$lang['Week starts on'] = '星期起始於';
+$lang['Who can see these photos?'] = '哪些人å¯ä»¥çœ‹åˆ°é€™äº›ç›¸ç‰‡?';
+$lang['Who can see this photo?'] = '有哪些人能看這些相片?';
+$lang['Width'] = '寬度';
+$lang['With blank value, gallery title will be used'] = '圖庫標題å…許為空';
+$lang['With no album'] = '沒有相冊';
+$lang['With no tag'] = '沒有標籤';
+$lang['With no virtual album'] = '沒有虛擬相冊';
+$lang['X Position'] = 'X ä½ç½®';
+$lang['X Repeat'] = 'X é‡è¤‡';
+$lang['Y Position'] = 'Y é‡è¤‡';
+$lang['Year'] = 'å¹´';
+$lang['You are running on development sources, no check possible.'] = 'ä½ é‹è¡Œçš„是æºç¢¼é–‹ç™¼ç‰ˆæœ¬, ä¸èƒ½æª¢æ¸¬æœ€æ–°ç‰ˆã€‚';
+$lang['User list'] = '用戶åå–®';
+$lang['User status'] = '用戶狀態';
+$lang['Users'] = '用戶';
+$lang['Users modified'] = '用戶修改';
+$lang['Validate'] = '確èª';
+$lang['Validation'] = '確èª';
+$lang['Version'] = '版本';
+$lang['View in gallery'] = '以畫廊模å¼ç€è¦½';
+$lang['Virtual Links'] = '虛擬連çµ';
+$lang['Virtual album'] = '虛擬相冊';
+$lang['Virtual album added'] = '虛擬相冊已添加';
+$lang['Virtual album deleted'] = '虛擬相冊已刪除';
+$lang['Virtual album name'] = '虛擬相冊å稱';
+$lang['Virtual albums to move'] = '移動虛擬相冊';
+$lang['Visit Gallery'] = 'ç€è¦½ç•«å»Š';
+$lang['Visit Piwigo project website'] = 'ç€è¦½ Piwigo 項目網站';
+$lang['Visit language site'] = 'ç€è¦½èªžè¨€é é¢';
+$lang['Visit plugin site'] = 'ç€è¦½æ’件網站';
+$lang['Visit theme site'] = 'ç€è¦½ä¸»é¡Œé é¢';
+$lang['Visited %d times'] = '訪å•äº† %d 次';
+$lang['Update in progress... Please wait.'] = '更新進行中,請ç¨å€™ã€‚';
+$lang['Update photos information'] = '更新相片信æ¯';
+$lang['Update to Piwigo %s'] = '更新到Piwigo %s';
+$lang['Update user'] = '更新用戶';
+$lang['Updates'] = 'æ›´æ–°';
+$lang['Upload'] = '上傳';
+$lang['Upload Photos'] = '上傳相片';
+$lang['Uploaded Photos'] = '相片已上傳';
+$lang['Use the default photo sort order (defined in the configuration file)'] = '使用é è¨­çš„的照片排åºé †åº(在設定檔中定義)';
+$lang['Used metadata'] = 'metadata已使用';
+$lang['User'] = '用戶';
+$lang['User "%s" created with "%s" like password'] = '用戶 "%s" 已建立,密碼是"%s"';
+$lang['User %s [%s] added.'] = '用戶 %s [%s] 已加入。';
+$lang['User %s [%s] was added to the subscription list.'] = '用戶 %s [%s] 加入到註冊å單中。';
+$lang['User %s [%s] was not added to the subscription list.'] = '用戶 %s [%s] 沒有加到註冊å當中。';
+$lang['User %s [%s] was not removed from the subscription list.'] = '用戶 %s [%s] 沒有從註冊å單中刪除。';
+$lang['User %s [%s] was removed from the subscription list.'] = '用戶 %s [%s] 從註冊å單中刪除。';
+$lang['User %s added'] = '用戶 %s 已添加';
+$lang['User %s updated'] = '用戶 %s 已更新';
+$lang['User comments validation'] = '確èªç”¨æˆ¶è©•è«–';
+$lang['Toggle \'default group\' property'] = '賦予\'é è¨­çš„群組\'屬性';
+$lang['Tools'] = '工具';
+$lang['Two updates are available'] = '兩個更新å¯ä½¿ç”¨';
+$lang['Type here the author name'] = '在此輸入作者å稱';
+$lang['Type here the name of the new group'] = '在這輸入新的群組別å稱';
+$lang['Type here the title'] = '在此輸入標題';
+$lang['Type in a search term'] = '輸入一個æœç´¢è©ž';
+$lang['Unable to check for upgrade.'] = '無法檢查是å¦æœ‰å‡ç´šã€‚';
+$lang['Unable to dump database.'] = '無法轉儲資料庫。';
+$lang['Uncheck all'] = 'å–消全é¸';
+$lang['Uninstall'] = '解除安è£';
+$lang['Uninstalled Plugins'] = '未安è£çš„æ’件';
+$lang['Unknown upload error'] = '未知上傳錯誤';
+$lang['Unlock gallery'] = '將畫廊解鎖';
+$lang['Unlocked'] = '解除鎖定';
+$lang['Unsubscribe from notification by mail'] = 'å–消訂閱郵件通知功能';
+$lang['Unsubscribed'] = 'å·²å–消訂閱';
+$lang['Update All'] = 'å·²å–消訂閱';
+$lang['Update Complete'] = '已完æˆæ›´æ–°';
+$lang['Update albums informations'] = '上傳相冊信æ¯';
+$lang['There is no other theme available.'] = '沒有其他å¯ç”¨çš„主題。';
+$lang['This album contains %d photos, added between %s and %s.'] = 'é€™æœ¬ç›¸å†ŠåŒ…å« %d 張照片,在 %s å’Œ %s 之間增加。';
+$lang['This album contains %d photos, added on %s.'] = 'é€™æœ¬ç›¸å†ŠåŒ…å« %d 張照片,在 %s 上增加。';
+$lang['This album contains no photo.'] = '這本相冊沒有照片';
+$lang['This group will be set to default'] = '這本相冊沒有照片';
+$lang['This group will be unset to default'] = '該群組別ä¸å†è¢«ä½¿ç”¨ç‚ºé è¨­';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = '這是一個é‡å¤§æ›´æ–°ï¼ŒåŒ…括<a href="%s">這個令人興奮的新功能</a>。';
+$lang['This is a minor update, with only bug corrections.'] = '這是一個次è¦æ›´æ–°ï¼Œåªæœ‰bug修正';
+$lang['This name is already used by another group.'] = '群組å已存在。';
+$lang['This site already exists'] = '此站點已存在';
+$lang['This theme was not designed to be directly activated'] = '此主題並未設計為直接啟動';
+$lang['Thumbnail'] = '縮略圖';
+$lang['Thumbnails generation in progress...'] = '縮略圖製作中...';
+$lang['Time'] = '時間';
+$lang['Time to send mail is limited. Others mails are skipped.'] = '發é€éƒµä»¶æ™‚間有é™,其餘郵件被忽略。';
+$lang['Title'] = '標題';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = '從digiKamè¦åŒ¯å‡ºç›¸ç‰‡åˆ°Piwigo,åªéœ€å®‰è£digiKamå’ŒKipi-pluginsæ’件。';
+$lang['To send ?'] = '發�';
+$lang['To subscribe'] = '如è¦è¨‚é–±';
+$lang['To unsubscribe'] = 'è¦å–消訂閱';
+$lang['The original maximum height must be a number between %d and %d'] = '原始高度上é™å¿…須在 %d å’Œ %d 之間';
+$lang['The original maximum width must be a number between %d and %d'] = '原始寬度上é™å¿…須在 %d å’Œ %d 之間 ';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = '固定連çµä¸­åŒ…å«äº†éžæ³•å­—符("a-zA-Z0-9", "-", "_" ou "/"). ç¦æ­¢ä½¿ç”¨æ•¸å­—和以"-"開頭後é¢ç·Šè·Ÿæ•¸å­—';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = '圖片的尺寸將減少到 %dx%d åƒç´ ã€‚';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = '上傳文件超éŽäº†åœ¨ HTML 表單指定的 MAX_FILE_SIZE çš„é™åˆ¶';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = '上傳文件超éŽäº†åœ¨ php.ini 文件裡的 upload_max_filesize é™åˆ¶: %sB';
+$lang['The uploaded file was only partially uploaded'] = '上傳文件åªä¸Šå‚³äº†ä¸€éƒ¨åˆ†';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = '上傳文件超éŽäº†åœ¨ php.ini 文件裡的 post_max_size é™åˆ¶: %sB';
+$lang['The version of %s [%s] installed is not compatible with the version required ']['%s'] = '%s [%s]安è£ç‰ˆæœ¬è·Ÿ[%s]版本ä¸å…¼å®¹';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = '網管開通了你的郵件通知功能。';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = '網管å–消了你的郵件通知功能。';
+$lang['The whole page'] = '整張相片';
+$lang['The whole set'] = '整個集åˆ';
+$lang['Theme has been successfully installed'] = '主題已æˆåŠŸå®‰è£';
+$lang['Themes'] = '主題';
+$lang['Themes which need upgrade'] = '需更新的主題';
+$lang['There is no available subscribers to mail.'] = '沒有用戶需è¦éƒµä»¶é€šçŸ¥ã€‚';
+$lang['There is no group in this gallery.'] = '此畫廊內沒有群組。';
+$lang['There is no other language available.'] = '沒有其他å¯ç”¨çš„語言。';
+$lang['There is no other plugin available.'] = '沒有其他å¯ç”¨çš„æ’件。';
+$lang['Tag "%s" already exists'] = '標籤 "%s" 已存在';
+$lang['Tag "%s" is now a duplicate of "%s"'] = '"%s" 標籤與 "%s" 標籤é‡è¤‡';
+$lang['Tag "%s" was added'] = '標籤 "%s" 已加入';
+$lang['Tag selection'] = '標籤é¸æ“‡';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = '標籤 <em>%s</em> å·²åˆä½µæˆæ¨™ç±¤ <em>%s</em>';
+$lang['Templates'] = '模æ¿';
+$lang['Templates configuration has been recorded.'] = '模æ¿è¨­å®šå·²ç¶“被記錄。';
+$lang['The %d following tags were deleted'] = '下é¢æ¨™ç±¤ %d 已刪除';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'Piwigo的匯出æ’件,å…許你建立相冊和匯出照片';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'Piwigo的發布æ’件å…許你 從Lightroom匯出照片,使你的Lightroom照片與您的Piwigo相冊åŒæ­¥ã€‚';
+$lang['The anomaly will be ignored until next application version'] = '此異常將被忽略,待下次版本中解決';
+$lang['The center of interest is the most meaningful zone in the photo.'] = '焦點是相片中最有æ„æ€çš„部份';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = '檔案或目錄無法訪å•(無論是它ä¸å­˜åœ¨æˆ–訪å•è¢«æ‹’絕)';
+$lang['The following tag was deleted'] = '以下標籤已刪除';
+$lang['The gallery URL is not valid.'] = '以下標籤已刪除';
+$lang['The name of a group must not contain " or \' or be empty.'] = '以下標籤已刪除';
+$lang['The name of an album must not be empty'] = '相冊å稱ä¸èƒ½ç‚ºç©ºç™½';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = '目錄和檔案的å稱必須包括字æ¯ï¼Œæ•¸å­—,"-", "_" 或 "."';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'æ¯é ç”¨æˆ¶è©•è«–數必須在5å’Œ50之間。';
+$lang['The original image quality must be a number between %d and %d'] = '原始圖å“質必須在 %d å’Œ %d 之間';
+$lang['Start Upload'] = '開始上傳';
+$lang['Start pLoader and add your photos.'] = '開始使用pLoader的並新增你的照片。';
+$lang['Statistics'] = '統計';
+$lang['Status'] = '狀態';
+$lang['Status of user "%s" updated'] = '用戶 "%s" 狀態已更新';
+$lang['Storage album'] = '存儲相冊';
+$lang['Subscribe'] = '訂閱';
+$lang['Subscribe %s'] = '訂閱 %s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = '訂閱 %s Piwigo中國最新消æ¯å…¬å‘Š';
+$lang['Subscribe to notification by mail'] = '訂閱郵件通知功能';
+$lang['Subscribe/unsubscribe users'] = '訂閱/å–消訂閱用戶';
+$lang['Subscribed'] = '已訂閱';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = '當有新圖片時,æ‰èƒ½ä½¿ç”¨ç”¨æˆ¶éƒµä»¶é€šçŸ¥åŠŸèƒ½.';
+$lang['Sum of rates'] = '總投票分';
+$lang['Summary'] = '概述';
+$lang['Support'] = '支æŒ';
+$lang['Switch to clear or dark colors for administration'] = '切æ›ç®¡ç†å“¡å¾Œå°ç‚ºæ¸…晰或黑暗的é¡è‰²';
+$lang['Synchronize'] = 'åŒæ­¥';
+$lang['Synchronize metadata'] = 'metadata åŒæ­¥';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = '這個æ’件已是Piwigo核心一部份! è«‹ç«‹å³ç§»é™¤å®ƒ!';
+$lang['Send mail as'] = '發é€éƒµä»¶ç‚º';
+$lang['Send mail on HTML format'] = '以HTMLæ ¼å¼ç™¼é€éƒµä»¶';
+$lang['Send mail to users'] = '給用戶發é€éƒµä»¶';
+$lang['Set as default language for unregistered and new users'] = '未註冊和新用戶的語言設定為é è¨­çš„語言';
+$lang['Set as default theme for unregistered and new users'] = '未註冊者和新用戶的主題設定為é è¨­çš„主題';
+$lang['Set author'] = '設定作者';
+$lang['Set creation date'] = '設定建立日期';
+$lang['Set title'] = '設定標題';
+$lang['Settings'] = '設定';
+$lang['Sharpen'] = '銳化';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell是一套Linux作業系統下的數ä½ç›¸ç‰‡ç®¡ç†å·¥å…·ï¼Œå®ƒæ˜¯è‡ªç”±è»Ÿé«”,也是 Ubuntu å’Œ Fedora 中 é è¨­çš„相片管ç†è»Ÿé«”。';
+$lang['Show %s users'] = '顯示%s用戶';
+$lang['Show info'] = '顯示所有信æ¯';
+$lang['Show menubar'] = '顯示é¸å–®åˆ—';
+$lang['Showing %s to %s of %s users'] = '顯示%s的用戶從%s到%s';
+$lang['Simulation'] = '模擬';
+$lang['Site manager'] = '網管';
+$lang['Some themes and plugins may be not available yet.'] = '一些主題和æ’件å¯èƒ½å°šç„¡æ³•ä½¿ç”¨';
+$lang['Some upgrades are available for extensions.'] = '一些å¯å‡ç´šç”¨æ–¼æ“´å±•ã€‚';
+$lang['Source tag'] = '來æºæ¨™ç±¤';
+$lang['See you soon.'] = '很快å†è¦‹ã€‚';
+$lang['Select a file'] = 'é¸æ“‡æª”案';
+$lang['Select a zone with your mouse to define a new center of interest.'] = '用鼠標é¸æ“‡æ–°çš„焦點';
+$lang['Select an album'] = 'é¸æ“‡ä¸€å€‹ç›¸å†Š';
+$lang['Select at least one album'] = 'é¸æ“‡æœ€å¾Œä¸€å€‹ç›¸å†Š';
+$lang['Select at least one comment'] = '至少é¸æ“‡ä¸€å€‹è©•è«–';
+$lang['Select at least one photo'] = '至少é¸ä¸­ä¸€å¼µåœ–片';
+$lang['Select at least one tag'] = 'é¸æ“‡è‡³å°‘一個標籤';
+$lang['Select at least one user'] = '至少é¸ä¸­ä¸€å€‹ç”¨æˆ¶';
+$lang['Select at least two tags for merging'] = '至少é¸æ“‡å…©å€‹éœ€åˆä½µçš„標籤';
+$lang['Select files'] = 'é¸æ“‡æª”案';
+$lang['Select groups...'] = 'é¸æ“‡ç¾¤çµ„別...';
+$lang['Select recipients'] = 'é¸æ“‡æŽ¥å—郵件用戶';
+$lang['Select the destination tag'] = 'é¸æ“‡ç›®çš„標籤';
+$lang['Select users...'] = 'é¸æ“‡ç”¨æˆ¶...';
+$lang['Select:'] = 'é¸æ“‡:';
+$lang['Selection'] = 'é¸æ“‡:';
+$lang['Send'] = '發é€';
+$lang['Send an information email to group members'] = '發é€ä¸€ä»½ä¿¡æ¯éƒµä»¶çµ¦ç¾¤çµ„æˆå“¡';
+$lang['Send connection settings by email'] = '通éŽé›»å­éƒµä»¶ç™¼é€é€£æŽ¥çš„設定';
+$lang['Representant'] = '相冊縮略圖';
+$lang['Representation of albums'] = '相冊縮略圖';
+$lang['Representative'] = '相冊縮略圖';
+$lang['Represents'] = '縮略圖是給';
+$lang['Reset ignored updates'] = 'é‡è¨­å¿½ç•¥æ›´æ–°';
+$lang['Resize'] = '調整大å°';
+$lang['Resize after upload'] = '上傳後調整大å°';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = '由於使用了GD圖形程å¼ï¼Œä¸Šå‚³å¾Œèª¿æ•´å°ºå¯¸çš„功能已關閉。';
+$lang['Restore'] = '還原';
+$lang['Restore default configuration. You will lose your plugin settings!'] = '還原至é è¨­è¨­å®šã€‚你會失去你的æ’件的設定ï¼';
+$lang['Save Settings'] = '儲存設定';
+$lang['Save Template Directory'] = '儲存模æ¿ç›®éŒ„';
+$lang['Save manual order'] = '儲存手動排åº';
+$lang['Save order'] = '儲存排åº';
+$lang['Save to permalink history'] = '儲存到固定連çµçš„æ­·å²è¨˜éŒ„中';
+$lang['Save visits in history for'] = 'ä¿å­˜è¨ªå•çš„æ­·å²';
+$lang['Search for new images in the directories'] = '在目錄中æœå°‹æ–°åœ–片';
+$lang['Searching...'] = 'æœå°‹ä¸­...';
+$lang['Section'] = 'å€åŸŸ';
+$lang['See you soon,'] = '很快å†è¦‹ï¼Œ';
+$lang['Rate date'] = '投票日期';
+$lang['Rated %d times, score : %.2f'] = '被評價 %d 次,分數為 %.2f';
+$lang['Rating'] = '投票';
+$lang['Rating by guests'] = '訪客投票數';
+$lang['Ratio'] = '比例';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid(Android行動相冊)是一個開放原始碼軟體(GPL V3),是Androidå¹³å°ä¸Šçš„Piwigo';
+$lang['Read Piwigo Documentation'] = '閱讀 Piwigo 檔案';
+$lang['Refresh'] = '刷新';
+$lang['Refresh photo set'] = '刷新相片集';
+$lang['Registered on %s, %s.'] = '註冊在%s, %s。';
+$lang['Reinitialize check integrity'] = 'é‡æ–°å®Œæ•´æ€§æª¢æ¸¬';
+$lang['Reject'] = '拒絕';
+$lang['Released on'] = '發佈於';
+$lang['Remote'] = 'é ç«¯';
+$lang['Remove all filters'] = '刪除所有篩é¸';
+$lang['Remove from caddie'] = '從購物è—裡移除';
+$lang['Rename'] = 'é‡æ–°å‘½å';
+$lang['Repair and optimize database'] = '修復和優化資料庫';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = '用ä½æ–¼template-extension文件夾下的用戶自定義模æ¿æ›´æ›åŽŸæ¨¡æ¿';
+$lang['Replacers (customized templates)'] = '替代(自訂的模æ¿)';
+$lang['Posted %s on %s'] = '在 %s 貼上 %s';
+$lang['Predefined filter'] = 'é å…ˆå®šç¾©çš„篩é¸';
+$lang['Preferences'] = 'å好設定';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = '由於發é€ç”¨æˆ¶åˆ—表的準備時間å—é™åˆ¶,其餘用戶將ä¸è¢«åˆ—出.';
+$lang['Privacy level'] = 'éš±ç§ç­‰ç´š';
+$lang['Privacy level set to "%s"'] = 'ç§æœ‰ç´šåˆ¥è¨­å®šç‚º "%s"';
+$lang['Private'] = 'ç§äºº';
+$lang['Properties'] = '屬性';
+$lang['Public'] = '公開';
+$lang['Public / Private'] = 'ç§äºº/公開';
+$lang['Purge compiled templates'] = '清除編譯模æ¿';
+$lang['Purge history detail'] = '清除歷å²è¨˜éŒ„';
+$lang['Purge history summary'] = '清除歷å²æ‘˜è¦';
+$lang['Purge never used notification feeds'] = '清除從沒使用éŽçš„通知回饋';
+$lang['Purge search history'] = '清除查尋歷å²è¨˜éŒ„';
+$lang['Purge sessions'] = '清除Sessions';
+$lang['Purge user cache'] = '清除用戶快å–';
+$lang['Quick Local Synchronization'] = '快速åŒæ­¥';
+$lang['Random photo'] = '隨機相片';
+$lang['Rate'] = '評分';
+$lang['Piwigo Update'] = 'Piwigo æ›´æ–°';
+$lang['Piwigo Uploader'] = 'Piwigo 上傳者';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo 無法從伺æœå™¨ä¸­å–å¾—å‡ç´šæª” ';
+$lang['Piwigo configuration'] = 'Piwigo的設定';
+$lang['Piwigo export plugin for Aperture'] = 'Apertureçš„Piwigo匯出æ’件';
+$lang['Piwigo export plugin for iPhoto'] = 'iPhotoçš„Piwigo匯出æ’件';
+$lang['Piwigo for Android'] = 'Android 版的Piwigo';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'iOS (iPhone, iPad, iPod Touch) 版的 Piwigo ';
+$lang['Piwigo publish plugin for Shotwell'] = 'Piwigo çš„ Shotwell 照片發布æ’件 ';
+$lang['Piwigo publish plugin for digiKam'] = 'Piwigo çš„ ddgiKam 照片發布æ’件';
+$lang['Piwigo version'] = 'Piwigo版本';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = '請核實"plugins"文件夾åŠå…¶å­æ–‡ä»¶å¤¾çš„權é™(CHMOD).';
+$lang['Please select at least two groups'] = '請最少é¸æ“‡äºŒå€‹ç¾¤çµ„別';
+$lang['Please wait...'] = 'è«‹ç¨å¾Œ...';
+$lang['Plugin has been successfully copied'] = 'æ’件複製æˆåŠŸ.';
+$lang['Plugin list'] = 'æ’件列表';
+$lang['Plugins'] = 'æ’件';
+$lang['Plugins which need upgrade'] = 'æ’件待å‡ç´š';
+$lang['Portrait'] = '人åƒ';
+$lang['Position'] = 'ä½ç½®';
+$lang['Permalinks'] = '固定連çµ';
+$lang['Permission denied'] = 'ç¦æ­¢è¨ªå•';
+$lang['Permission granted'] = 'å…許訪å•';
+$lang['Permission granted for groups'] = '群組別æ“有的權é™';
+$lang['Permission granted for users'] = '用戶æ“有的權é™';
+$lang['Permission granted thanks to a group'] = 'åŒç¾¤çµ„æˆå“¡å¯ä»¥è¨ªå•æŽˆæ¬Šé¡ž';
+$lang['Permission management'] = '權é™ç®¡ç†';
+$lang['Permissions'] = '權é™';
+$lang['Photo %s of %s'] = '圖片 %s 中的圖片 %s';
+$lang['Photo Page'] = '相片é ';
+$lang['Photo Properties'] = '相片屬性';
+$lang['Photo informations updated'] = '相片更新信æ¯';
+$lang['Photo name'] = '相片å稱';
+$lang['Photo sizes with crop'] = '相片剪è£';
+$lang['Photo unreachable or no support'] = 'ä¸æ”¯æŒåœ–片格å¼æˆ–無法顯示';
+$lang['Photos'] = '相片';
+$lang['Photos generation in progress...'] = '相片製作中...';
+$lang['Piwigo Administration'] = 'Piwigo管ç†';
+$lang['Piwigo Announcements Newsletter'] = 'Piwigo最新消æ¯å…¬å‘Š';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Piwigo çš„ Lightroom 照片發布æ’件';
+$lang['Orphan tags deleted'] = 'ç„¡é—œè¯æ¨™ç±¤å·²è¢«åˆªé™¤';
+$lang['Other plugins'] = '其他å¯ç”¨çš„æ’件';
+$lang['Other private albums'] = '其他ç§äººç›¸å†Š';
+$lang['Overall'] = '概覽';
+$lang['Page banner'] = '網é æ¨™èªž';
+$lang['Page end'] = 'é å°¾';
+$lang['Pages seen'] = '已訪å•éŽçš„é é¢';
+$lang['Panorama'] = '全景';
+$lang['Parameter'] = '設定';
+$lang['Parameters'] = 'åƒæ•¸';
+$lang['Parent album'] = '主相冊';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = '密碼確èªæœªå®Œæˆï¼Œè«‹ç¢ºèªæ‰€é¸å®šçš„密碼。';
+$lang['Password is missing. Please enter the password.'] = '密碼沒有輸入,請輸入密碼。';
+$lang['Password updated'] = '密碼已更新';
+$lang['Path'] = '路徑';
+$lang['Pending Comments'] = '待批的評論';
+$lang['Permalink'] = '固定連çµ';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'å›ºå®šé€£çµ %s 已被 %s 相冊使用了。請先從固定éˆæŽ¥æ­·å²è¨˜éŒ„刪除。';
+$lang['Permalink %s is already used by album %s'] = 'å›ºå®šé€£çµ %s 已被 %s 相冊使用了';
+$lang['Permalink history'] = '固定連çµæ­·å²è¨˜éŒ„';
+$lang['Notify administrators when a comment is'] = '通知管ç†å“¡ç•¶è©•è«–是';
+$lang['Number of albums per page'] = 'æ¯é ç›¸æœ¬æ•¸é‡';
+$lang['Number of comments per page'] = 'æ¯é è©•è«–數é‡';
+$lang['Number of downloads'] = '下載次數';
+$lang['Number of rates'] = '投票數';
+$lang['Number of thumbnails to create'] = '縮略圖數';
+$lang['Numeric identifier : %d'] = '數字識別碼: %d';
+$lang['Obsolete Plugins'] = '廢棄的æ’件';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = '在Linux下,åªéœ€å®‰è£Shotwell套件和啟用 Piwigo發佈é¸é …。';
+$lang['Only private albums are listed'] = 'åªåˆ—出ç§äººç›¸å†Š';
+$lang['Opacity'] = 'ä¸é€æ˜Žåº¦';
+$lang['Operating system'] = 'æ“作系統';
+$lang['Operation in progress'] = '正在處ç†ä¸­ã€‚';
+$lang['Optimizations have been completed with some errors.'] = '優化已完æˆ,但出ç¾ä¸€äº›éŒ¯èª¤ã€‚';
+$lang['Optional URL keyword'] = 'å¯é¸URLé—œéµå­—';
+$lang['Options'] = 'é¸é …';
+$lang['Order of menubar items has been updated successfully.'] = 'å·²æˆåŠŸæ›´æ–°çš„é¸å–®æ¬„項目的順åºã€‚';
+$lang['Original Size'] = '原始大å°';
+$lang['Original file : %s'] = '原始檔案 : %s';
+$lang['Original templates'] = '原模æ¿';
+$lang['No display'] = 'ä¸é¡¯ç¤º';
+$lang['No file was uploaded'] = '沒有文件被上傳';
+$lang['No group is permitted to see this private album'] = '沒有群組別有權é™è§€çœ‹æ­¤ç§äººç›¸å†Š';
+$lang['No group selected, no action possible.'] = '尚未é¸å–群組別,無法動作';
+$lang['No mail to send.'] = '沒有郵件è¦ç™¼é€.';
+$lang['No matching user found'] = '沒有發ç¾åŒ¹é…的用戶';
+$lang['No members to manage'] = '沒有會員å¯ä»¥ç®¡ç†';
+$lang['No order field selected'] = '未é¸å–排åºæ¬„ä½';
+$lang['No photo can be deleted'] = '沒有圖片å¯ä»¥åˆªé™¤';
+$lang['No photo in the current set.'] = '當å‰é›†åˆæ²’有相片.';
+$lang['No photo in this album'] = '沒有相片在此相冊裡';
+$lang['No photo selected, %d photos in current set'] = '沒有é¸æ“‡ç›¸ç‰‡, 當å‰é›†åˆæœ‰%d張相片';
+$lang['No photo selected, no action possible.'] = '沒有é¸æ“‡ç›¸ç‰‡ï¼Œä¸æœƒæœ‰å‹•ä½œåŸ·è¡Œ';
+$lang['No results'] = '沒有çµæžœ';
+$lang['No user selected of %d users'] = '%d個用戶沒有用戶é¸æ“‡';
+$lang['No user selected, no action possible.'] = '沒有用戶é¸æ“‡ï¼Œæ²’有行動的å¯èƒ½ã€‚';
+$lang['No user to send notifications by mail.'] = '沒有郵件通知用戶.';
+$lang['None'] = '沒有';
+$lang['Not cropped correctly?'] = 'ä¸æ­£ç¢ºçš„è£å‰ª?';
+$lang['Notification'] = '通知';
+$lang['Minimum privacy level'] = '最å°éš±ç§ç­‰ç´š';
+$lang['Minimum width'] = '最å°å¯¬åº¦';
+$lang['Miscellaneous'] = '雜項';
+$lang['Missing Plugins'] = '丟失的æ’件';
+$lang['Missing a temporary folder'] = '缺少臨時文件目錄';
+$lang['Modify information'] = '修改信æ¯';
+$lang['Month'] = '月';
+$lang['Move'] = '移動';
+$lang['Move albums'] = '移動相冊';
+$lang['Move to album'] = '移動到相冊';
+$lang['Multiple Size'] = '多種大å°';
+$lang['Name'] = 'åå­—';
+$lang['Name of the duplicate'] = 'å稱é‡è¤‡';
+$lang['New Version'] = '新版本';
+$lang['New name'] = 'æ–°å';
+$lang['New parent album'] = '新的父相冊';
+$lang['New photos added'] = '已加入新相片';
+$lang['New photos were added'] = '已加入新相片';
+$lang['New tag'] = '新標籤';
+$lang['No destination tag selected'] = '未é¸æ“‡ç›®æ¨™æ¨™ç±¤';
+$lang['Manage authorizations for selected albums'] = '管ç†æ‰€é¸ç›¸å†Šçš„授權';
+$lang['Manage permissions for group "%s"'] = 'å°ç¾¤çµ„ "%s" 進行權é™ç®¡ç†';
+$lang['Manage permissions for user "%s"'] = 'å°ç”¨æˆ¶ "%s" 進行權é™ç®¡ç†';
+$lang['Manage photo ranks'] = '管ç†åœ–片排åº';
+$lang['Manage photos'] = '管ç†ç…§ç‰‡';
+$lang['Manage tags'] = '管ç†æ¨™ç±¤';
+$lang['Manage the members'] = '管ç†æœƒå“¡';
+$lang['Manage this set of %d photos'] = '管ç†æ­¤è¨­ç½®çš„%d張照片 ';
+$lang['Manual order'] = '手工排åº';
+$lang['Maximum file size: %sB.'] = '最大尺寸: %sB';
+$lang['Maximum height'] = '最大高度';
+$lang['Maximum width'] = '最大寬度';
+$lang['Members'] = '會員';
+$lang['Menu Management'] = '功能表';
+$lang['Merge selected groups'] = 'åˆä½µé¸æ“‡ç¾¤çµ„';
+$lang['Merge selected tags'] = 'åˆä½µé¸å®šçš„標籤';
+$lang['Merge tags'] = 'åˆä½µæ¨™ç±¤';
+$lang['Metadata synchronization results'] = 'Metadataæ›´æ–°çµæžœ';
+$lang['Metadata synchronized from file'] = 'å°æ–‡ä»¶é€²è¡ŒMetadataåŒæ­¥';
+$lang['Minimum height'] = '最å°é«˜åº¦';
+$lang['Loading...'] = '加載中...';
+$lang['Local'] = '本地';
+$lang['Lock'] = '上鎖';
+$lang['Lock albums'] = '鎖定相冊';
+$lang['Lock gallery'] = '鎖定圖庫';
+$lang['Locked'] = '鎖定';
+$lang['Mail address is obligatory for all users'] = 'æ¯å€‹ç”¨æˆ¶å¿…é ˆæ供郵箱地å€';
+$lang['Mail content'] = '郵件內容';
+$lang['Mail sent to %s [%s].'] = '已發é€è‡³ %s [%s].';
+$lang['Mail theme'] = '郵件主題';
+$lang['Main "guest" user does not exist'] = '主"訪客"用戶ä¸å­˜åœ¨';
+$lang['Main "guest" user status is incorrect'] = '主"訪客"用戶狀態異常';
+$lang['Main "webmaster" user does not exist'] = '主網管帳戶ä¸å†å­˜åœ¨';
+$lang['Main "webmaster" user status is incorrect'] = '主網管用戶狀態異常';
+$lang['Main Page'] = '主é ';
+$lang['Maintenance'] = '維護';
+$lang['Make this language available to users'] = '讓用戶å¯ä½¿ç”¨æ­¤èªžè¨€';
+$lang['Make this theme available to users'] = '讓用戶å¯ä½¿ç”¨æ­¤ä¸»é¡Œ';
+$lang['Manage'] = '管ç†';
+$lang['Manage Permissions'] = '管ç†æ¬Šé™';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = '訂閱 Piwigo 最新消æ¯ï¼Œèˆ‡ Piwigo é …ç›®ä¿æŒè¯ç¹«ã€‚當有新版本發佈時,您將會收到郵件通知(有時也包括安全æ¼æ´žçš„修復,這å°æ–¼å‡ç´šæ˜¯å¾ˆé‡è¦çš„)和項目裡一些é‡è¦äº‹æƒ…的發生。一年裡也åªæœ‰å¹¾å°éƒµä»¶ã€‚';
+$lang['Landscape'] = 'æ©«å‘';
+$lang['Language has been successfully installed'] = '語言已æˆåŠŸå®‰è£';
+$lang['Languages'] = '語言';
+$lang['Languages which need upgrade'] = '需更新的語言';
+$lang['Last hit'] = '最後一次查看';
+$lang['Last import'] = '最後匯入';
+$lang['Last revisions'] = '最新修訂版';
+$lang['Last send'] = '最後一次發é€';
+$lang['Last visit on %s, %s.'] = '最後的訪å•åœ¨%s, %s。';
+$lang['Learn more'] = '瞭解更多';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = 'è¯ç¹«';
+$lang['Level 2'] = '朋å‹';
+$lang['Level 4'] = '家庭';
+$lang['Level 8'] = '管ç†è€…';
+$lang['Link all album photos to a new album'] = 'éˆæŽ¥æ‰€æœ‰ç›¸å†Šçš„相片到新的相冊';
+$lang['Link all album photos to some existing albums'] = '連çµæ‰€æœ‰ç›¸å†Šçš„相片到ç¾æœ‰çš„相冊';
+$lang['Linked albums'] = 'å·²éˆæŽ¥ç›¸å†Š';
+$lang['List'] = '清單';
+$lang['Impossible automatic correction'] = '無法自動修復';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = '這個主題ä¸èƒ½å•Ÿå‹•ï¼Œå› ç‚ºç¼ºå°‘主é ä¸»é¡Œï¼š%s';
+$lang['Impossible to deactivate this language, first set another language as default.'] = '無法åœç”¨é€™å€‹èªžè¨€ï¼Œé¦–先設定å¦ä¸€ç¨®èªžè¨€ç‚ºé è¨­å€¼ã€‚';
+$lang['Impossible to deactivate this language, you need at least one language.'] = '無法åœç”¨é€™å€‹èªžè¨€ï¼Œä½ éœ€è¦è‡³å°‘一種語言。';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = '無法åœç”¨é€™å€‹èªžè¨€ï¼Œä½ éœ€è¦è‡³å°‘一種語言。';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = '此主題ä¸èƒ½åˆªé™¤ï¼Œå› ç‚ºå…¶ä»–主題還有ä¾è³´èˆ‡å®ƒ: %s';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = '在你的 php.ini 文件, 如果 upload_max_filesize (%sB) 大於 post_max_size (%sB), 那麼你需è¦ä¿®æ”¹æ­¤è¨­å®š';
+$lang['Inactive Languages'] = 'åœç”¨èªžè¨€';
+$lang['Inactive Plugins'] = 'åœç”¨èªžè¨€';
+$lang['Inactive Themes'] = 'åœç”¨ä¸»é¡Œ';
+$lang['Include display of recent photos grouped by dates'] = '包括顯示最近按日期分群組的圖片';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = '包å«æ­·å²æ•¸æ“šï¼ˆè­¦å‘Šï¼šå¯èƒ½æœƒè¶…éŽä¼ºæœå™¨å„²å­˜é™åˆ¶)';
+$lang['Information data registered in database'] = 'ä¿¡æ¯å·²ä¿å­˜åˆ°è³‡æ–™åº«ä¸­';
+$lang['Informations'] = 'ä¿¡æ¯';
+$lang['Install'] = '安è£';
+$lang['Install on your computer,'] = '安è£åˆ°æ‚¨çš„電腦,';
+$lang['Installed Languages'] = '安è£èªžè¨€';
+$lang['Installed Themes'] = '安è£ä¸»é¡Œ';
+$lang['Instructions to use Piwigo'] = 'Piwigo 使用指å—';
+$lang['Invert'] = 'å轉';
+$lang['Close user details'] = '關閉用戶詳細信æ¯';
+$lang['Open user details'] = '打開用戶詳細信æ¯';
+$lang['close'] = '關閉';
+?> \ No newline at end of file
diff --git a/language/zh_HK/common.lang.php b/language/zh_HK/common.lang.php
index f51de062e..86ff5d81d 100644
--- a/language/zh_HK/common.lang.php
+++ b/language/zh_HK/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: 中文 (香港) [HK]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=614
Author: Piwigo team
Author URI: http://piwigo.org
@@ -156,7 +156,6 @@ $lang['IPTC Metadata'] = 'IPTC 資料';
$lang['Identification'] = '身份';
$lang['If this was a mistake, just ignore this email and nothing will happen.'] = '如果這是一個錯誤, ä¸ç†æœƒé€™é›»éƒµå°±ä¸æœƒç™¼ç”Ÿä»»åˆäº‹.';
$lang['If you think you\'ve received this email in error, please contact us at %s'] = '如果你èªä½ ä¸æ‡‰è©²æ•¸åˆ°é€™é›»éƒµ, 請到 %s è¯çµ¡æˆ‘們';
-$lang['Interface theme'] = '介é¢ä¸»é¡Œ';
$lang['Invalid key'] = '無效鑰匙';
$lang['Invalid password!'] = '無效密碼!';
$lang['Invalid username or email'] = '無效用戶å稱或電郵';
@@ -169,10 +168,6 @@ $lang['Login'] = '登入';
$lang['Logout'] = '登出';
$lang['Manage this user comment: %s'] = '管ç†é€™å€‹ç”¨æˆ¶ç•™è¨€: %s';
$lang['Manual sort order'] = '手動排åº';
-$lang['Maximum height must be a number superior to 50'] = '最大高度必須大於50';
-$lang['Maximum photo height'] = '相片最大高度';
-$lang['Maximum photo width'] = '相片最大寬度';
-$lang['Maximum width must be a number superior to 50'] = '最大寬度必須大於50';
$lang['Menu'] = 'é¸å–®';
$lang['Mobile'] = '移動è£ç½®';
$lang['Most visited'] = '最多點閱';
@@ -295,7 +290,6 @@ $lang['in %d sub-albums'] = '在å­ç›¸ç°¿ %d 中';
$lang['in %d sub-album'] = '在å­ç›¸ç°¿ %d 中';
$lang['in this album'] = '在這相簿中';
$lang['password updated'] = '密碼已更新';
-$lang['please enter your password again'] = 'è«‹å†è¼¸å…¥å¯†ç¢¼';
$lang['remove this tag from the list'] = '在列表中刪除此標籤';
$lang['representative'] = '相簿縮圖';
$lang['searched words : %s'] = 'æœå°‹è©žèªž: %s';
@@ -412,4 +406,17 @@ $lang['wrong date'] = '日期錯誤';
$lang['xlarge'] = 'XL - 特大';
$lang['xsmall'] = 'XL - 特å°';
$lang['xxlarge'] = 'XLL - 極大';
+$lang['Email address is mandatory'] = '必須填寫電郵地å€';
+$lang['Username is mandatory'] = '必須填寫使用者å稱';
+$lang['Website'] = '網站';
+$lang['Your website URL is invalid'] = '你的網å€ç„¡æ•ˆ';
+$lang['mandatory'] = 'å¿…å¡«';
+$lang['Email'] = '電郵';
+$lang['First Page'] = '第一é ';
+$lang['Go back to the album'] = '回到相冊';
+$lang['Last Page'] = '最後一é ';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = '確èªå¯†ç¢¼æœªå®Œæˆï¼Œè«‹ç¢ºèªæ‰€é¸å®šçš„密碼。';
+$lang['Password is missing. Please enter the password.'] = '缺少了密碼。請輸入密碼。';
+$lang['%d photos per page'] = 'æ¯é %d張相片';
+$lang['Theme'] = '主題';
?> \ No newline at end of file
diff --git a/language/zh_HK/help/cat_move.html b/language/zh_HK/help/cat_move.html
new file mode 100755
index 000000000..bd894c1a3
--- /dev/null
+++ b/language/zh_HK/help/cat_move.html
@@ -0,0 +1,14 @@
+<H2>移動虛擬相冊</ H2>
+
+<P>åªæœ‰è™›æ“¬çš„專輯能有一個新的父專輯。</ P>
+
+<H3>移動虛擬相冊</ H3>
+
+<p>é¸æ“‡è¦ç§»å‹•ä¸€å€‹æˆ–多個虛擬相簿。
+如果列表是空的,這æ„味著你還沒有創建了一個呢。</ P>
+
+<H3>新的父專輯</ H3>
+
+<p>é¸æ“‡æ–°çš„父專輯(虛擬或實體)。
+如果您ä¸é¸æ“‡ä»»ä½•çˆ¶ï¼Œè™›æ“¬é¸å–的相簿將被移動到根。
+一個相冊ä¸èƒ½ç§»å‹•åˆ°è‡ªèº«æˆ–å…¶å­å¥³ä¹‹ä¸€ã€‚</ P> \ No newline at end of file
diff --git a/language/zh_HK/help/cat_options.html b/language/zh_HK/help/cat_options.html
new file mode 100755
index 000000000..204fc541e
--- /dev/null
+++ b/language/zh_HK/help/cat_options.html
@@ -0,0 +1,20 @@
+<h2>相冊é¸é …</h2>
+
+<P>é¸é …一次管ç†å¹¾å€‹ç›¸å†Šã€‚</P>
+
+<dl>
+
+<dt>è©•è«–</dt>
+<dd>照片å¯ä»¥çµ¦è¨ªå®¢ç•™è¨€ï¼Œå¦‚果它屬於æŸå€‹ç›¸å†ŠåŠå•Ÿå‹•äº†ç•™è¨€åŠŸèƒ½ã€‚</dd>
+
+<dt>鎖</dt>
+<dd>鎖定專輯ç¦æ­¢é€²è¡Œç¶­è­·ã€‚åªæœ‰ç®¡ç†å“¡å¯ä»¥åœ¨ç•«å»Šè£¡çœ‹åˆ°å®ƒå€‘。</dd>
+
+<dt>公共/ç§æœ‰</dt>
+<dd>一旦專輯æˆç‚ºç§äººçš„,å°ç”¨æˆ¶å’Œçµ„給訪å•æ¬Šé™</dd>
+
+<dt>代表</dt>
+<dd>當您設定組態設定此é¸é …å¯ç”¨çš„<code> allow_random_representative/code>(åƒè¦‹(see <span
+ class="filename">include/config_defaults.inc.php</span>),以<em>true</em>。æ¯å¼µå°ˆè¼¯å¯ä»¥é€šéŽéš¨æ©Ÿçš„照片或者é¸æ“‡ä½œç‚ºä¸€å€‹ç¨ç‰¹çš„代表照片來表示。</dd>
+
+</dl> \ No newline at end of file
diff --git a/language/zh_HK/help/cat_perm.html b/language/zh_HK/help/cat_perm.html
new file mode 100755
index 000000000..035ba822d
--- /dev/null
+++ b/language/zh_HK/help/cat_perm.html
@@ -0,0 +1,11 @@
+<h2>編輯相簿權é™</h2>
+
+<p>此畫é¢åƒ…é™æ–¼ç§äººç›¸ç°¿ã€‚在這裡,您å¯ä»¥é¸æ“‡ç”¨æˆ¶å’Œç¾¤çµ„進行相簿授權。</p>
+
+<h3>群組</h3>
+
+<p>您å¯ä»¥æ‹’絕或授予群組訪å•ç•¶å‰ç›¸ç°¿ã€‚通éŽä¿®æ”¹ç¾¤çµ„授權,屬於這些群組的用戶將被拒絕或å…許訪å•ç›¸ç°¿ã€‚</p>
+
+<h3>用戶</h3>
+
+<p>您å¯ä»¥æ‹’絕或授予個別用戶訪å•ç›¸ç°¿ã€‚用戶é€éŽç¾¤çµ„授權訪å•å¯ä»¥æ‹’絕。</p> \ No newline at end of file
diff --git a/language/zh_HK/help/index.php b/language/zh_HK/help/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/language/zh_HK/help/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/language/zh_HK/index.php b/language/zh_HK/index.php
index 41732f2fd..c8de97f60 100644
--- a/language/zh_HK/index.php
+++ b/language/zh_HK/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/language/zh_HK/install.lang.php b/language/zh_HK/install.lang.php
new file mode 100755
index 000000000..4a451e07c
--- /dev/null
+++ b/language/zh_HK/install.lang.php
@@ -0,0 +1,68 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = '數據庫表將使用å‰ç¶´è©ž(它å¦æ‚¨æ›´å¥½ç®¡ç†)';
+$lang['enter a login for webmaster'] = '輸入網站管ç†å“¡ç™»éŒ„å稱';
+$lang['please enter your password again'] = '請您å†æ¬¡è¼¸å…¥å¯†ç¢¼';
+$lang['user login given by your host provider'] = '供應商姶你的登錄用戶å稱';
+$lang['user password given by your host provider'] = '供應商姶你的登錄用戶密碼';
+$lang['verification'] = 'é©—è­‰';
+$lang['webmaster login can\'t contain characters \' or "'] = '網站管ç†å“¡ç™»éŒ„å稱ä¸èƒ½åŒ…å«å­—符\'或"';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = '需è¦å¹«åŠ©å—Žï¼Ÿä½ å¯ä»¥åœ¨<a href="%s">Piwigo 留言æ¿</a>æ出å•é¡Œã€‚';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = '注æ„:你å¯ä»¥æ›´æ”¹è¨­å®šï¼Œç„¶å¾Œé‡æ–°å•Ÿå‹•Piwigo。';
+$lang['PHP 5 is required'] = '需è¦PHP5';
+$lang['Password ']['confirm'] = '密碼[確èª]';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo嘗試建立或修改您的.htaccess檔案, 來設定系統使用PHP5。';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo的無法設定使用PHP5。';
+$lang['Sorry!'] = 'å°ä¸èµ·ï¼';
+$lang['Start Install'] = '開始安è£';
+$lang['Try to configure PHP 5'] = '嘗試設定PHP5';
+$lang['User'] = '用戶';
+$lang['Visitors will be able to contact site administrator with this mail'] = '訪客å¯ä»¥ä½¿ç”¨é€™å€‹é›»å­éƒµä»¶èˆ‡ç¶²ç«™ç®¡ç†å“¡è¯ç¹«';
+$lang['Welcome to my photo gallery'] = '歡迎來到我的相簿';
+$lang['Welcome to your new installation of Piwigo!'] = '歡迎來到你新安è£çš„Piwigoï¼';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = '您å¯ä»¥ä¸‹è¼‰è¨­å®šæª”案,並è£å®ƒä¸Šå‚³åˆ°local/config目錄中安è£ã€‚';
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'è«‹è¯ç¹«ä½ çš„網站託管æœå‹™æ供商,看看你怎麼å¯ä»¥è‡ªå·±åˆ‡æ›åˆ°PHP 5。';
+$lang['also given by your host provider'] = '也å¯ç”±ç¶²ç«™è¨—管æœå‹™æ供商幫助設定';
+$lang['Admin configuration'] = '管ç†å“¡è¨­å®š';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'å¦ä¸€ç¨®è§£æ±ºæ–¹æ¡ˆæ˜¯å°‡ä¸Šé¢æ¡†ä¸­çš„文字複製,並貼到檔案 "local/config/database.inc.php"上 (警告:database.inc.phpåªå¯ä»¥åŒ…括文字框內容,ä¸å¯ä»¥æœ‰ï¼Œæˆ–空格字符)';
+$lang['Basic configuration'] = '基本設定';
+$lang['Can\'t connect to server'] = '無法連接到伺æœå™¨';
+$lang['Congratulations, Piwigo installation is completed'] = 'æ­å–œä½ ï¼ŒPiwigo已安è£å®Œæˆ';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'æˆåŠŸé€£æŽ¥åˆ°ä¼ºæœå™¨, 但ä¸èƒ½é€£æŽ¥åˆ°æ•¸æ“šåº«ã€‚';
+$lang['Creation of config file local/config/database.inc.php failed.'] = '無法創建設定檔案 local/config/database.inc.php。';
+$lang['Database configuration'] = '數據庫設定';
+$lang['Database name'] = '數據庫å稱';
+$lang['Database table prefix'] = '數據庫表格å‰ç½®è©ž';
+$lang['Default gallery language'] = 'é è¨­ç›¸ç°¿èªžè¨€';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = '如需è¦ä»»ä½•å¹«åŠ©,è«‹ä¸è¦çŒ¶è±«åˆ°æˆ‘們的論壇諮詢:%s';
+$lang['Download the config file'] = '下載設定檔案。';
+$lang['Hope to see you back soon.'] = '希望盡快看到你回來。';
+$lang['Host'] = '主機';
+$lang['Installation'] = '安è£';
+$lang['It appears your webhost is currently running PHP %s.'] = 'ç›®å‰æ‚¨çš„網é å¯„存伺æœå™¨é‹è¡ŒPHP %s。';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = '這是必è¦çš„網站管ç†,因它會顯示給所有訪客。';
+$lang['Just another Piwigo gallery'] = 'åªæ˜¯å¦ä¸€å€‹Piwigo相簿';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'è«‹ä¿å¯†ï¼Œå®ƒä½¿æ‚¨èƒ½å¤ è¨ªå•ç®¡ç†é¢æ¿';
+$lang['localhost or other, supplied by your host provider'] = '本地主機或其它,由你的主機æ供商æä¾›';
+?> \ No newline at end of file
diff --git a/language/zh_HK/upgrade.lang.php b/language/zh_HK/upgrade.lang.php
new file mode 100755
index 000000000..3306f6635
--- /dev/null
+++ b/language/zh_HK/upgrade.lang.php
@@ -0,0 +1,40 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['All sub-albums of private albums become private'] = '所有ç§æœ‰å­ç›¸ç°¿,設定為åªå…許ç§æœ‰è§€çœ‹';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = '作為é é˜²æŽªæ–½ï¼Œä»¥ä¸‹æ’件已被åœç”¨ã€‚請檢查有沒有æ’件更新版本,然後å†å•Ÿç”¨å®ƒï¼š';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = '作為é é˜²æŽªæ–½ï¼Œä»¥ä¸‹ä¸»é¡Œå·²è¢«åœç”¨ã€‚請檢查有沒有主題更新版本,然後å†å•Ÿç”¨å®ƒï¼š';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = '在<i>%s</i>之å‰<b>?></b>,æ’入:';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'åªæœ‰ç®¡ç†å“¡æ‰èƒ½åŸ·è¡Œå‡ç´šï¼šè«‹åœ¨ä¸‹é¢ç™»éŒ„。';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'åªæœ‰ç¸®åœ–çš„å‰ç¶´å’Œç¶²ç«™ç®¡ç†å“¡çš„郵件地å€å¯ä»¥å¾žèˆŠç‰ˆè¨­å®šä¸­ä¿å­˜';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = '如果您é‡åˆ°ä»»ä½•å•é¡Œ, 請執行維護檢查[管ç†>工具>維護]。';
+$lang['SQL queries'] = 'SQL查詢';
+$lang['Statistics'] = '統計';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = '本é å»ºè­°æ•¸æ“šåº«å¾žèˆŠçš„Piwigo版本å‡ç´šåˆ°æ–°ç‰ˆæœ¬ã€‚å‡ç´šåŠ©æ‰‹èªç‚ºä½ æ­£åœ¨é‹è¡Œçš„<strong>版本%s</strong>(或åŒç­‰ç‰ˆæœ¬ï¼‰ã€‚';
+$lang['Upgrade'] = 'å‡ç´š';
+$lang['Upgrade from version %s to %s'] = '從版本%så‡ç´šåˆ°%s';
+$lang['Upgrade informations'] = 'å‡ç´šä¿¡æ¯';
+$lang['User permissions and group permissions have been erased'] = '使用者和群組的權é™å·²è¢«åˆªé™¤';
+$lang['You do not have access rights to run upgrade'] = '您沒有權é™åŸ·è¡Œå‡ç´š';
+$lang['total SQL time'] = '總SQL執行時間';
+$lang['total upgrade time'] = '總å‡ç´šæ™‚é–“';
+?> \ No newline at end of file
diff --git a/language/zh_TW/admin.lang.php b/language/zh_TW/admin.lang.php
index 131139099..827072923 100644
--- a/language/zh_TW/admin.lang.php
+++ b/language/zh_TW/admin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -31,10 +31,10 @@ $lang[' and %d virtual'] = ' 和 虛擬 %d ';
$lang[' and %d virtuals'] = ' 和 虛擬 %d ';
$lang['%d album moved'] = '%d 相冊已移動';
$lang['%d albums moved'] = '%d 相冊已移動';
-$lang['%d group'] = '%d 組';
-$lang['%d groups'] = '%d 組';
-$lang['%d member'] = '%d æˆå“¡';
-$lang['%d members'] = '%d æˆå“¡';
+$lang['%d group'] = '%d 群組';
+$lang['%d groups'] = '%d 群組';
+$lang['%d member'] = '%d 會員';
+$lang['%d members'] = '%d 會員';
$lang['%d tag'] = '%d 標籤';
$lang['%d tags'] = '%d 標籤';
$lang['%d user comment rejected'] = '%d 用戶評論被刪除';
@@ -45,63 +45,63 @@ $lang['%d user deleted'] = '%d 用戶已刪除';
$lang['%d users deleted'] = '%d 用戶已刪除';
$lang['%d user'] = '%d 用戶';
$lang['%d users'] = '%d 用戶';
-$lang['%d waiting for validation'] = '%d 等待確èªæœ‰æ•ˆ';
+$lang['%d waiting for validation'] = '%d 等待驗證確èª';
$lang['Actions'] = '實施';
-$lang['Activate'] = '激活';
-$lang['Add/delete a permalink'] = '增加/刪除一個固定éˆæŽ¥';
+$lang['Activate'] = 'å•Ÿå‹•';
+$lang['Add/delete a permalink'] = '增加/刪除一個固定連çµ';
$lang['Add a tag'] = '增加標籤';
$lang['Add a user'] = '增加用戶';
-$lang['Add group'] = '增加組';
+$lang['Add group'] = '增加群組';
$lang['Add'] = '增加';
$lang['Allow user registration'] = 'å…許用戶註冊';
$lang['Apply to sub-albums'] = '應用到å­ç›¸å†Š';
$lang['Associated'] = 'é—œè¯æ–¼';
$lang['Caddie management'] = '購物籃管ç†';
$lang['Caddie'] = '購物籃';
-$lang['Albums authorized thanks to group associations'] = '相冊組織授權感è¬å”會';
+$lang['Albums authorized thanks to group associations'] = '相冊群組織授權感è¬å”會';
$lang['Album manual order was saved'] = '相冊手工排åºå·²ä¿å­˜';
-$lang['Check for upgrade failed for unknown reasons.'] = '因未知原因導致更新檢測失敗.';
-$lang['Check for upgrade'] = '檢測更新';
-$lang['Comments for all'] = 'å°æ‰€æœ‰æˆå“¡é€²è¡Œè©•è«–';
+$lang['Check for upgrade failed for unknown reasons.'] = '檢查是å¦æœ‰å‡ç´šå¤±æ•—由於未知原因。';
+$lang['Check for upgrade'] = '檢查是å¦æœ‰å‡ç´š';
+$lang['Comments for all'] = '評論所有的';
$lang['Current name'] = 'ç¾ç”¨å';
-$lang['Database'] = '數據庫';
-$lang['Deactivate'] = '註銷';
-$lang['Delete Representant'] = '刪除代ç†äºº';
+$lang['Database'] = '資料庫';
+$lang['Deactivate'] = 'åœç”¨';
+$lang['Delete Representant'] = '刪除相冊縮略圖';
$lang['Delete selected tags'] = '刪除所é¸æ¨™ç±¤';
$lang['Delete selected users'] = '刪除所é¸ç”¨æˆ¶';
$lang['Deletions'] = '刪除';
-$lang['Deny selected groups'] = '所é¸çµ„ç¦æ­¢è¨ªå•';
-$lang['Deny selected users'] = '所é¸ç”¨æˆ¶ç¦æ­¢è¨ªå•';
+$lang['Deny selected groups'] = '拒絕所é¸ç¾¤çµ„';
+$lang['Deny selected users'] = '拒絕所é¸çš„用戶';
$lang['Description'] = 'æè¿°';
$lang['Display options'] = '顯示é¸é …';
$lang['Dissociated'] = 'å–消è¯ç¹«';
$lang['Does not represent'] = 'ä¸éœ€æ繪';
$lang['Edit selected tags'] = '編輯所é¸æ¨™ç±¤';
$lang['Edit tags'] = '編輯標籤';
-$lang['Email admins when a new user registers'] = '一旦用戶註冊就通知管ç†å“¡';
+$lang['Email admins when a new user registers'] = '當有新的使用者註冊就通知管ç†å“¡';
$lang['Email admins when a valid comment is entered'] = '當用戶發表評論時就通知管ç†å“¡';
$lang['Email admins when a comment requires validation'] = '當用戶è¦æ±‚確èªä»–的評論時通知管ç†å“¡';
$lang['Environment'] = '環境';
$lang['Form'] = '表單';
$lang['Gallery title'] = '圖庫標題';
-$lang['Grant selected groups'] = 'å°æ‰€é¸çµ„授權';
+$lang['Grant selected groups'] = 'å°æ‰€é¸ç¾¤çµ„授權';
$lang['Grant selected users'] = 'å°æ‰€é¸ç”¨æˆ¶æŽˆæ¬Š';
-$lang['Group name'] = '組å';
-$lang['Groups'] = '組';
-$lang['Guests'] = 'éŠå®¢';
+$lang['Group name'] = '群組å';
+$lang['Groups'] = '群組';
+$lang['Guests'] = '訪客';
$lang['History'] = 'æ­·å²';
$lang['Informations'] = 'ä¿¡æ¯';
$lang['Install'] = '安è£';
$lang['Link all album photos to a new album'] = 'éˆæŽ¥æ‰€æœ‰ç›¸å†Šçš„相片到新的相冊';
-$lang['Link all album photos to some existing albums'] = 'éˆæŽ¥æ‰€æœ‰ç›¸å†Šçš„相片到ç¾æœ‰çš„相冊';
+$lang['Link all album photos to some existing albums'] = '連çµæ‰€æœ‰ç›¸å†Šçš„相片到ç¾æœ‰çš„相冊';
$lang['Linked albums'] = 'å·²éˆæŽ¥ç›¸å†Š';
$lang['Lock gallery'] = 'å‡çµåœ–庫';
$lang['Maintenance'] = '維護';
$lang['Edit album permissions'] = '管ç†ç›¸å†Šçš„權é™';
-$lang['Manage permissions for group "%s"'] = 'å°çµ„ "%s" 進行權é™ç®¡ç†';
+$lang['Manage permissions for group "%s"'] = 'å°ç¾¤çµ„ "%s" 進行權é™ç®¡ç†';
$lang['Manage permissions for user "%s"'] = 'å°ç”¨æˆ¶ "%s" 進行權é™ç®¡ç†';
$lang['Manage tags'] = '標籤管ç†';
-$lang['Members'] = 'æˆå“¡';
+$lang['Members'] = '會員';
$lang['Metadata synchronized from file'] = 'å°æ–‡ä»¶é€²è¡Œå…ƒæ•¸æ“šåŒæ­¥';
$lang['Move albums'] = '移動相冊';
$lang['Move'] = '移動';
@@ -116,34 +116,34 @@ $lang['Only private albums are listed'] = 'åªåˆ—出ç§æœ‰ç›¸å†Š';
$lang['Operating system'] = 'æ“作系統';
$lang['Options'] = 'é¸é …';
$lang['Other private albums'] = '其他ç§æœ‰ç›¸å†Š';
-$lang['Page banner'] = 'é æ¨™èªž';
-$lang['Parent album'] = '父相冊';
+$lang['Page banner'] = '網é æ¨™èªž';
+$lang['Parent album'] = '主相冊';
$lang['Path'] = '路徑';
-$lang['Permalink'] = '固定éˆæŽ¥';
-$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = '固定éˆæŽ¥ %s 已被 %s 相冊使用了。請先從固定éˆæŽ¥æ­·å²è¨˜éŒ„刪除。';
-$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = '固定éˆæŽ¥ä¸­åŒ…å«äº†éžæ³•å­—符("a-zA-Z0-9", "-", "_" ou "/"). ç¦æ­¢ä½¿ç”¨æ•¸å­—和以"-"開頭後é¢ç·Šè·Ÿæ•¸å­—';
-$lang['Permalink %s is already used by album %s'] = '固定éˆæŽ¥ %s 已被 %s 相冊使用了';
-$lang['Permalink history'] = '固定éˆæŽ¥æ­·å²è¨˜éŒ„';
-$lang['Permalinks'] = '固定éˆæŽ¥';
+$lang['Permalink'] = '固定連çµ';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'å›ºå®šé€£çµ %s 已被 %s 相冊使用了。請先從固定éˆæŽ¥æ­·å²è¨˜éŒ„刪除。';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = '固定連çµä¸­åŒ…å«äº†éžæ³•å­—符("a-zA-Z0-9", "-", "_" ou "/"). ç¦æ­¢ä½¿ç”¨æ•¸å­—和以"-"開頭後é¢ç·Šè·Ÿæ•¸å­—';
+$lang['Permalink %s is already used by album %s'] = 'å›ºå®šé€£çµ %s 已被 %s 相冊使用了';
+$lang['Permalink history'] = '固定連çµæ­·å²è¨˜éŒ„';
+$lang['Permalinks'] = '固定連çµ';
$lang['Permission denied'] = 'ç¦æ­¢è¨ªå•';
-$lang['Permission granted thanks to a group'] = 'åŒçµ„æˆå“¡å¯ä»¥è¨ªå•æŽˆæ¬Šé¡ž';
+$lang['Permission granted thanks to a group'] = 'åŒç¾¤çµ„æˆå“¡å¯ä»¥è¨ªå•æŽˆæ¬Šé¡ž';
$lang['Permission granted'] = 'å…許訪å•';
$lang['Photo informations updated'] = '圖片更新信æ¯';
$lang['Plugins'] = 'æ’件';
$lang['Position'] = 'ä½ç½®';
-$lang['Preferences'] = '個人å好';
+$lang['Preferences'] = 'å好設定';
$lang['Properties'] = '屬性';
$lang['Random photo'] = '隨機';
$lang['Rate date'] = '投票日期';
-$lang['Rating by guests'] = 'éŠå®¢æŠ•ç¥¨æ•¸';
+$lang['Rating by guests'] = '訪客投票數';
$lang['Rating'] = '投票';
-$lang['Reject'] = 'å–消';
-$lang['Representant'] = '代ç†äºº';
-$lang['Representation of albums'] = '相冊代表';
-$lang['Representative'] = '代ç†äºº';
-$lang['Represents'] = '代ç†';
-$lang['Save order'] = 'ä¿å­˜æŽ’åº';
-$lang['Save to permalink history'] = 'ä¿å­˜åˆ°å›ºå®šéˆæŽ¥çš„æ­·å²è¨˜éŒ„中';
+$lang['Reject'] = '拒絕';
+$lang['Representant'] = '相冊縮略圖';
+$lang['Representation of albums'] = '相冊縮略圖';
+$lang['Representative'] = '相冊縮略圖';
+$lang['Represents'] = '縮略圖是給';
+$lang['Save order'] = '儲存排åº';
+$lang['Save to permalink history'] = '儲存到固定連çµçš„æ­·å²è¨˜éŒ„中';
$lang['Select at least one album'] = 'é¸æ“‡æœ€å¾Œä¸€å€‹ç›¸å†Š';
$lang['Select at least one photo'] = '至少é¸ä¸­ä¸€å¼µåœ–片';
$lang['Select at least one user'] = '至少é¸ä¸­ä¸€å€‹ç”¨æˆ¶';
@@ -157,9 +157,9 @@ $lang['Tag "%s" already exists'] = '標籤 "%s" 已存在';
$lang['Tag "%s" was added'] = '標籤 "%s" 已加入';
$lang['Tag selection'] = '標籤é¸æ“‡';
$lang['The %d following tags were deleted'] = '下é¢æ¨™ç±¤ %d 已刪除';
-$lang['Unable to check for upgrade.'] = 'ä¸èƒ½æª¢æ¸¬æ›´æ–°.';
-$lang['Uninstall'] = 'å¸è¼‰';
-$lang['Use the default photo sort order (defined in the configuration file)']='使用默èªåœ–片排åº(在é…置文件中定義)';
+$lang['Unable to check for upgrade.'] = '無法檢查是å¦æœ‰å‡ç´šã€‚';
+$lang['Uninstall'] = '解除安è£';
+$lang['Use the default photo sort order (defined in the configuration file)'] = '使用é è¨­çš„的照片排åºé †åº(在設定檔中定義)';
$lang['User comments validation'] = '確èªç”¨æˆ¶è©•è«–';
$lang['Users'] = '用戶';
$lang['Validate'] = '確èª';
@@ -168,52 +168,51 @@ $lang['Version'] = '版本';
$lang['Virtual albums to move'] = '移動虛擬相冊';
$lang['Virtual album name'] = '虛擬相冊å稱';
$lang['Webmaster cannot be deleted'] = 'ä¸èƒ½åˆªé™¤ç¶²ç®¡å¸³æˆ¶';
-$lang['You are running on development sources, no check possible.'] = 'ä½ é‹è¡Œçš„是æºç¢¼é–‹ç™¼ç‰ˆæœ¬, ä¸èƒ½æª¢æ¸¬æœ€æ–°ç‰ˆ.';
+$lang['You are running on development sources, no check possible.'] = 'ä½ é‹è¡Œçš„是æºç¢¼é–‹ç™¼ç‰ˆæœ¬, ä¸èƒ½æª¢æ¸¬æœ€æ–°ç‰ˆã€‚';
$lang['You cannot delete your account'] = "ä½ ä¸èƒ½åˆªé™¤è‡ªå·±æœ¬èº«å¸³è™Ÿ";
$lang['You cannot move an album in its own sub album'] = '您ä¸èƒ½å°‡ä¸€å€‹ç›¸å†Šç§»å‹•åˆ°å…¶å­ç›¸å†Šè£¡';
-$lang['You need to confirm deletion'] = '你必須確èªåˆªé™¤æ“作';
-$lang['Associate to album'] = 'è¯åˆåˆ°ç›¸å†Š';
-$lang['associate to group'] = 'é—œè¯åˆ°çµ„';
+$lang['You need to confirm deletion'] = '您必須確èªåˆªé™¤ã€‚';
+$lang['Associate to album'] = 'é—œè¯åˆ°ç›¸å†Š';
+$lang['associate to group'] = 'é—œè¯åˆ°ç¾¤çµ„';
$lang['Authorized'] = '授權';
-$lang['Add a virtual album'] = '添加一個虛擬相冊';
+$lang['Add a virtual album'] = '增加一個虛擬相冊';
$lang['Authorize users to add comments on selected albums'] = '讓用戶å¯åœ¨æ‰€é¸ç›¸å†Šè£¡ç™¼è¡¨è©•è«–';
-$lang['The name of an album must not be empty'] = '相冊å稱ä¸èƒ½ç‚ºç©º';
+$lang['The name of an album must not be empty'] = '相冊å稱ä¸èƒ½ç‚ºç©ºç™½';
$lang['Lock albums'] = '鎖定相冊';
$lang['Private'] = 'ç§æœ‰ç›¸å†Š';
$lang['Public'] = '公共相冊';
-$lang['Find a new representant by random'] = '隨機尋找代ç†äºº';
+$lang['Find a new representant by random'] = 'æœå°‹ä¸€å€‹æ–°çš„隨機相冊縮略圖';
$lang['Public / Private'] = '公有 / ç§æœ‰';
$lang['Manage authorizations for selected albums'] = '管ç†æ‰€é¸ç›¸å†Šçš„授權';
$lang['Virtual album added'] = '虛擬相冊已添加';
$lang['Virtual album deleted'] = '虛擬相冊已刪除';
$lang['Access type'] = '權é™é¡žåž‹';
-$lang['Information data registered in database'] = 'ä¿¡æ¯å·²ä¿å­˜åˆ°æ•¸æ“šåº«ä¸­';
-$lang['Default display'] = '默èªé¡¯ç¤º';
-$lang['The gallery URL is not valid.'] = '圖庫地å€ä¸åˆæ³•.';
-$lang['Main'] = '主é ';
-$lang['The number of comments a page must be between 5 and 50 included.'] = 'æ¯é ç”¨æˆ¶è©•è«–數必須在5å’Œ50之間.';
-$lang['Configuration'] = '設置';
-$lang['confirm'] = '設置';
+$lang['Information data registered in database'] = 'ä¿¡æ¯å·²ä¿å­˜åˆ°è³‡æ–™åº«ä¸­';
+$lang['Default display'] = 'é è¨­é¡¯ç¤ºè³‡è¨Š';
+$lang['The gallery URL is not valid.'] = '圖片庫 URL 是無效的。';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'æ¯é ç”¨æˆ¶è©•è«–數必須在5å’Œ50之間。';
+$lang['Configuration'] = '設定';
+$lang['confirm'] = '確定';
$lang['Date'] = '日期';
$lang['delete album'] = '刪除相冊';
$lang['Dissociate from album'] = '從相冊裡分離';
-$lang['dissociate from group'] = 'å–消組關è¯';
+$lang['dissociate from group'] = 'å–消群組關è¯';
$lang['Album updated successfully'] = '相冊信æ¯å·²ä¸Šå‚³æˆåŠŸ.';
$lang['photos per page'] = 'æ¯é åœ–片';
-$lang['High definition enabled'] = '激活高清功能';
-$lang['File'] = '文件';
+$lang['High definition enabled'] = '高畫質已啟用';
+$lang['File'] = '檔案';
$lang['first photo added on %s'] = '於 %s 上傳了第一幅圖';
$lang['Forbidden'] = 'ç¦æ­¢';
$lang['global mode'] = '全局模å¼';
-$lang['group "%s" added'] = '增加 "%s" 組';
-$lang['group "%s" deleted'] = '刪除 "%s" 組';
-$lang['group "%s" updated'] = '更新 "%s" 組';
-$lang['The name of a group must not contain " or \' or be empty.'] = '組åä¸èƒ½åŒ…å« " 或 \' 並ä¸èƒ½ç‚ºç©º.';
-$lang['This name is already used by another group.'] = '組å已存在.';
-$lang['High definition'] = '高清';
+$lang['group "%s" added'] = '增加 "%s" 群組';
+$lang['group "%s" deleted'] = '刪除 "%s" 群組';
+$lang['group "%s" updated'] = '更新 "%s" 群組';
+$lang['The name of a group must not contain " or \' or be empty.'] = '群組åä¸èƒ½åŒ…å« " 或 \' 並ä¸èƒ½ç‚ºç©ºç™½ã€‚';
+$lang['This name is already used by another group.'] = '群組å已存在。';
+$lang['High definition'] = '高畫質';
$lang['jump to album'] = '跳到相冊';
$lang['jump to photo'] = '跳轉到圖';
-$lang['leave'] = '開鎖';
+$lang['leave'] = '離開';
$lang['Lock'] = '上鎖';
$lang['Locked'] = '鎖定';
$lang['manage album photos'] = '管ç†ç›¸å†Šè£¡çš„相片';
@@ -222,27 +221,26 @@ $lang['Manage'] = '管ç†';
$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = '已超éŽåŸ·è¡Œæ™‚é–“, 處ç†é‚„需時間[估計時間: %d 秒].';
$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = '已超éŽåŸ·è¡Œæ™‚é–“, 處ç†é‚„需時間[估計時間: %d 秒].';
$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = '由於發é€ç”¨æˆ¶åˆ—表的準備時間å—é™åˆ¶,其餘用戶將ä¸è¢«åˆ—出.';
-$lang['Time to send mail is limited. Others mails are skipped.'] = '發é€éƒµä»¶æ™‚間有é™,其餘郵件被忽略.';
+$lang['Time to send mail is limited. Others mails are skipped.'] = '發é€éƒµä»¶æ™‚間有é™,其餘郵件被忽略。';
$lang['To send ?'] = '發�';
$lang['Last send'] = '最後一次發é€';
-$lang['email'] = '郵件';
$lang['User'] = '用戶';
-$lang['See you soon,'] = 'å†è¦‹,';
+$lang['See you soon,'] = '很快å†è¦‹ï¼Œ';
$lang['Go to'] = '轉至 ';
$lang['Hello'] = '你好 ';
$lang['New photos were added'] = '加入一些新圖片';
$lang['on'] = '時間: ';
-$lang['between'] = '時間: ';
-$lang['and'] = ' 至 ';
-$lang['The webmaster has subscribed you to receiving notifications by mail.'] = '網管開通了你的郵件通知功能.';
-$lang['You have subscribed to receiving notifications by mail.'] = '你開通了郵件通知功能.';
-$lang['To subscribe'] = '註冊新用戶';
+$lang['between'] = '之間';
+$lang['and'] = '至 ';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = '網管開通了你的郵件通知功能。';
+$lang['You have subscribed to receiving notifications by mail.'] = '你開通了郵件通知功能。';
+$lang['To subscribe'] = '如è¦è¨‚é–±';
$lang['If you encounter problems or have any question, please send a message to'] = '如有é‡åˆ°æ•…障或å•é¡Œ,請發郵件至 ';
-$lang['[NBM] Problems or questions'] = '[NBM] 故障或å•é¡Œ';
-$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = '網管å–消了你的郵件通知功能.';
-$lang['You have unsubscribed from receiving notifications by mail.'] = 'ä½ å–消了你的郵件通知功能.';
+$lang['[NBM] Problems or questions'] = '[NBM] 故障或者疑å•';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = '網管å–消了你的郵件通知功能。';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'ä½ å–消了你的郵件通知功能。';
$lang[', click on'] = ', 請點擊 ';
-$lang['To unsubscribe'] = '註銷';
+$lang['To unsubscribe'] = 'è¦å–消訂閱';
$lang['With blank value, gallery title will be used'] = '圖庫標題å…許為空';
$lang['Notification'] = '通知';
$lang['Error when sending email to %s [%s].'] = '發é€éƒµä»¶ 給 %s [%s] 是發生了錯誤.';
@@ -252,182 +250,182 @@ $lang['%d mails were sent.'] = '%s 郵件已發é€.';
$lang['%d mail was not sent.'] = '%s 郵件未被發é€.';
$lang['%d mails were not sent.'] = '%s 郵件未被發é€.';
$lang['No mail to send.'] = '沒有郵件è¦ç™¼é€.';
-$lang['There is no available subscribers to mail.'] = '沒有用戶需è¦éƒµä»¶é€šçŸ¥.';
-$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'åªæœ‰ç•¶æœ‰æ–°åœ–片時,æ‰èƒ½ä½¿ç”¨ç”¨æˆ¶éƒµä»¶é€šçŸ¥åŠŸèƒ½.';
+$lang['There is no available subscribers to mail.'] = '沒有用戶需è¦éƒµä»¶é€šçŸ¥ã€‚';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = '當有新圖片時,æ‰èƒ½ä½¿ç”¨ç”¨æˆ¶éƒµä»¶é€šçŸ¥åŠŸèƒ½.';
$lang['Anyway only webmasters can see this tab and never administrators.'] = '任何人都ä¸èƒ½ä½¿ç”¨æ­¤æ¨™ç±¤(網管除外).';
$lang['No user to send notifications by mail.'] = '沒有郵件通知用戶.';
$lang['New photos added'] = '新圖片已加入';
-$lang['Subscribe to notification by mail'] = '註冊郵件通知功能';
-$lang['Unsubscribe from notification by mail'] = '註銷郵件通知功能';
-$lang['Parameter'] = '設置';
+$lang['Subscribe to notification by mail'] = '訂閱郵件通知功能';
+$lang['Unsubscribe from notification by mail'] = 'å–消訂閱郵件通知功能';
+$lang['Parameter'] = '設定';
$lang['Continue processing treatment'] = '正在繼續處ç†ä¸­...';
$lang['Complementary mail content'] = '郵件附加內容';
$lang['Add detailed content'] = '增加細節內容';
-$lang['Send mail as'] = '發é€éƒµä»¶ä½œç‚º';
+$lang['Send mail as'] = '發é€éƒµä»¶ç‚º';
$lang['Send mail to users'] = '給用戶發é€éƒµä»¶';
$lang['Send'] = '發é€';
$lang['Options'] = 'é¸é …';
-$lang['Subscribed'] = '已註冊';
-$lang['Subscribe'] = '註冊';
-$lang['Parameters'] = '設置åƒæ•¸';
+$lang['Subscribed'] = '已訂閱';
+$lang['Subscribe'] = '訂閱';
+$lang['Parameters'] = 'åƒæ•¸';
$lang['Select recipients'] = 'é¸æ“‡æŽ¥å—郵件用戶';
-$lang['Subscribe/unsubscribe users'] = '註冊/註銷用戶';
-$lang['Unsubscribed'] = '已註銷';
+$lang['Subscribe/unsubscribe users'] = '訂閱/å–消訂閱用戶';
+$lang['Unsubscribed'] = 'å·²å–消訂閱';
$lang['%d parameter was updated.'] = '%d åƒæ•¸å·²æ›´æ–°.';
$lang['%d parameters were updated.'] = '%d ç­‰åƒæ•¸å·²æ›´æ–°.';
$lang['%d user was not updated.'] = '%d 用戶沒有被更新.';
$lang['%d users were not updated.'] = '%d 等用戶沒有被更新.';
-$lang['User %s [%s] was removed from the subscription list.'] = '用戶 %s [%s] 從註冊å單中刪除.';
-$lang['User %s [%s] was added to the subscription list.'] = '用戶 %s [%s] 加入到註冊å單中.';
+$lang['User %s [%s] was removed from the subscription list.'] = '用戶 %s [%s] 從註冊å單中刪除。';
+$lang['User %s [%s] was added to the subscription list.'] = '用戶 %s [%s] 加入到註冊å單中。';
$lang['%d user was updated.'] = '%d 用戶已更新.';
$lang['%d users were updated.'] = '%d 等用戶已更新.';
-$lang['User %s [%s] was not removed from the subscription list.'] = '用戶 %s [%s] 沒有從註冊å單中刪除.';
-$lang['User %s [%s] was not added to the subscription list.'] = '用戶 %s [%s] 沒有加到註冊å當中.';
-$lang['User %s [%s] added.'] = '用戶 %s [%s] 已加入.';
-$lang['Warning: subscribing or unsubscribing will send mails to users'] = '注æ„, 註冊或註銷都會給相關用戶發é€éƒµä»¶';
+$lang['User %s [%s] was not removed from the subscription list.'] = '用戶 %s [%s] 沒有從註冊å單中刪除。';
+$lang['User %s [%s] was not added to the subscription list.'] = '用戶 %s [%s] 沒有加到註冊å當中。';
+$lang['User %s [%s] added.'] = '用戶 %s [%s] 已加入。';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = '注æ„, 訂閱或退訂都會給相關用戶發é€éƒµä»¶';
$lang['Send mail on HTML format'] = '以HTMLæ ¼å¼ç™¼é€éƒµä»¶';
-$lang['Include display of recent photos grouped by dates'] = '包括顯示最近按日期分組的圖片';
-$lang['Available only with HTML format'] = 'åªèƒ½ä»¥HTMLæ ¼å¼';
-$lang['no write access'] = 'ä¸èƒ½å¯«å…¥';
+$lang['Include display of recent photos grouped by dates'] = '包括顯示最近按日期分群組的圖片';
+$lang['Available only with HTML format'] = '僅é©ç”¨æ–¼HTMLæ ¼å¼';
+$lang['no write access'] = '沒有寫入權é™';
$lang['Permissions'] = '權é™';
$lang['private'] = 'ç§æœ‰';
$lang['public'] = '公有';
$lang['Purge never used notification feeds'] = '清除從沒使用éŽçš„通知回饋';
-$lang['Purge sessions'] = '清除會話';
-$lang['randomly represented'] = '隨機顯示';
-$lang['registration date'] = 'ä¿å­˜æ—¥æœŸ';
+$lang['Purge sessions'] = '清除工作階段';
+$lang['randomly represented'] = '隨機顯示相冊縮略圖';
+$lang['registration date'] = '註冊日期';
$lang['clean'] = '清除';
-$lang['Create this site'] = '創建網站';
+$lang['Create this site'] = '建立網站';
$lang['test'] = '測試';
$lang['test this remote site'] = '測試é ç«¯ç«™é»ž';
$lang['remove tags'] = '刪除所有標籤';
-$lang['Repair and optimize database'] = '修復和優化數據庫';
+$lang['Repair and optimize database'] = '修復和優化資料庫';
$lang['selection'] = 'é¸æ“‡';
-$lang['set to'] = '設置為';
+$lang['set to'] = '設定為';
$lang['singly represented'] = '固定顯示';
$lang['This site already exists'] = '此站點已存在';
-$lang['created'] = '已創建';
+$lang['created'] = '已建立';
$lang['delete'] = '刪除';
$lang['delete this site and all its attached elements'] = '刪除此站點和與其相關è¯çš„所有信æ¯';
$lang['an error happened'] = '發生錯誤';
$lang['Local'] = '本地';
$lang['Remote'] = 'é ç«¯';
-$lang['update the database from files'] = '根據文件å°æ•¸æ“šåº«é€²è¡Œæ›´æ–°';
+$lang['update the database from files'] = '根據檔案å°è³‡æ–™åº«é€²è¡Œæ›´æ–°';
$lang['status'] = '狀態';
-$lang['Directory'] = '文件夾';
+$lang['Directory'] = '目錄夾';
$lang['sub-albums'] = 'å­ç›¸å†Š';
$lang['Synchronize metadata'] = 'åŒæ­¥å…ƒæ•¸æ“š';
$lang['target'] = '目標';
$lang['Thumbnail'] = '縮略圖';
$lang['Title'] = '標題';
-$lang['Album list management'] = '相冊管ç†';
-$lang['Piwigo configuration'] = 'é…ç½®Piwigo';
+$lang['Album list management'] = '相冊清單管ç†';
+$lang['Piwigo configuration'] = 'Piwigo的設定';
$lang['Edit album'] = '修改一個相冊';
-$lang['Group management'] = '組管ç†';
+$lang['Group management'] = '群組管ç†';
$lang['User list'] = '用戶åå–®';
$lang['Edit photo information'] = '修改圖片信æ¯';
-$lang['Database synchronization with files'] = '根據文件來åŒæ­¥æ•¸æ“šåº«';
+$lang['Database synchronization with files'] = '根據文件來åŒæ­¥è³‡æ–™åº«';
$lang['all'] = '所有';
$lang['height must be a number superior to'] = '圖片高度必須超éŽ(整數)';
$lang['width must be a number superior to'] = '圖片長度必須超éŽ(整數)';
-$lang['for the file format'] = 'å°æ–¼æ–‡ä»¶æ ¼å¼';
+$lang['for the file format'] = 'å°æ–¼æª”案格å¼';
$lang['Photo unreachable or no support'] = 'ä¸æ”¯æŒåœ–片格å¼æˆ–無法顯示';
$lang['GD version'] = 'GD版';
$lang['General statistics'] = '普通統計';
$lang['average time'] = 'å¹³å‡æ™‚é–“';
-$lang['number of miniaturized photos'] = '創建的縮略圖數';
+$lang['number of miniaturized photos'] = '數é‡çš„縮略圖建立';
$lang['total time'] = '總共時間';
-$lang['for this file format'] = 'å°æ–¼æ­¤æ–‡ä»¶æ ¼å¼';
+$lang['for this file format'] = 'å°æ–¼æ­¤æª”案格å¼';
$lang['unit mode'] = '單一模å¼';
-$lang['Unlocked'] = '解鎖';
-$lang['unset'] = '清空';
+$lang['Unlocked'] = '解除鎖定';
+$lang['unset'] = '未設定';
$lang['Update albums informations'] = '上傳相冊信æ¯';
$lang['Update photos information'] = '更新圖信æ¯';
$lang['Synchronize'] = 'åŒæ­¥';
$lang['reduce to single existing albums'] = '減少ç¾æœ‰çš„å–®ç¨ç›¸å†Š';
$lang['Choose an option'] = 'é¸æ“‡ä¸€å€‹é¸é …';
-$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'é¡¯ç¤ºæœ€å…¨çš„ä¿¡æ¯ (添加相冊和相片,刪除相冊和相片)';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = '顯示最大é‡çš„ä¿¡æ¯(增加相冊和相片,刪除的相冊和照片)';
$lang['Error list'] = '錯誤清單';
$lang['Errors caption'] = '錯誤說明';
$lang['Detailed informations'] = '詳細信æ¯';
-$lang['File/directory read error'] = '文件/文件夾打開錯誤';
-$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = '無法打開文件或文件夾(è¦éº¼æ ¹æœ¬ä¸å­˜åœ¨,è¦éº¼æ‹’絕訪å•)';
-$lang['albums deleted in the database'] = '相冊已從數據庫刪除';
-$lang['photos deleted from the database'] = '圖片已從數據庫中刪除';
+$lang['File/directory read error'] = '檔案/目錄的讀å–錯誤';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = '檔案或目錄無法訪å•(無論是它ä¸å­˜åœ¨æˆ–訪å•è¢«æ‹’絕)';
+$lang['albums deleted in the database'] = '相冊已從資料庫刪除';
+$lang['photos deleted from the database'] = '圖片已從資料庫中刪除';
$lang['photos candidates for metadata synchronization'] = 'å°æ‡‰åŒæ­¥å…ƒæ•¸æ“šçš„候é¸åœ–片';
$lang['photos informations synchronized with files metadata'] = '附有元數據的åŒæ­¥åœ–片信æ¯informations des images synchronisees avec les meta-donnees';
$lang['errors during synchronization'] = 'åŒæ­¥æœŸé–“發生錯誤';
-$lang['albums added in the database'] = '相冊已添加到數據庫';
-$lang['photos added in the database'] = '增加圖片到數據庫';
-$lang['photos updated in the database'] = '更新數據庫中的圖片';
-$lang['Search for new images in the directories'] = '查詢文件中的新圖片';
+$lang['albums added in the database'] = '相冊已增加到資料庫';
+$lang['photos added in the database'] = '增加圖片到資料庫';
+$lang['photos updated in the database'] = '更新資料庫中的圖片';
+$lang['Search for new images in the directories'] = '在目錄中æœå°‹æ–°åœ–片';
$lang['added'] = '已加入';
$lang['deleted'] = '已刪除';
$lang['Metadata synchronization results'] = '元數據更新çµæžœ';
-$lang['only perform a simulation (no change in database will be made)'] = 'åªé€²è¡Œæ¨¡æ“¬æ“作(ä¸æœƒæ”¹è®Šæ•¸æ“šåº«ä¸­çš„任何內容)';
+$lang['only perform a simulation (no change in database will be made)'] = 'åªé€²è¡Œæ¨¡æ“¬æ“作(ä¸æœƒæ”¹è®Šè³‡æ–™åº«ä¸­çš„任何內容)';
$lang['Simulation'] = '模擬';
-$lang['directories + files'] = '文件夾 + 文件';
-$lang['only directories'] = 'åªå°æ–‡ä»¶å¤¾';
-$lang['synchronize files structure with database'] = 'åŒæ­¥æ–‡ä»¶çµæ§‹å’Œæ•¸æ“šåº«';
-$lang['synchronize files metadata with database photos informations'] = '根據文件元數據åŒæ­¥æ•¸æ“šåº«ä¸­çš„圖片信æ¯';
+$lang['directories + files'] = '目錄+文件';
+$lang['only directories'] = '僅目錄';
+$lang['synchronize files structure with database'] = 'åŒæ­¥æ–‡ä»¶çµæ§‹å’Œè³‡æ–™åº«';
+$lang['synchronize files metadata with database photos informations'] = '根據文件元資料åŒæ­¥è³‡æ–™åº«ä¸­çš„圖片信æ¯';
$lang['even already synchronized photos'] = '包括已經åŒæ­¥çš„圖片';
$lang['Used metadata'] = '已使用éŽçš„元數據';
-$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = '文件夾和文件å稱åªèƒ½åŒ…å«å­—æ¯, 數字, "-", "_" å’Œ "."';
-$lang['wrong filename'] = '文件å出錯';
-$lang['Upload'] = '增加';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = '目錄和檔案的å稱必須包括字æ¯ï¼Œæ•¸å­—,"-", "_" 或 "."';
+$lang['wrong filename'] = '檔案å稱錯誤';
+$lang['Upload'] = '上傳';
$lang['user "%s" added'] = '用戶 "%s" 已加入';
$lang['User status'] = '用戶狀態';
$lang['user_status_admin'] = '管ç†å“¡';
$lang['user_status_generic'] = '一般用戶';
-$lang['user_status_guest'] = '來賓';
-$lang['user_status_normal'] = 'éŠå®¢';
+$lang['user_status_guest'] = '訪客';
+$lang['user_status_normal'] = '使用者';
$lang['user_status_webmaster'] = '網管';
$lang['Virtual album'] = '虛擬相冊';
$lang['Waiting'] = '等待';
-$lang['default'] = '默èª';
-$lang['Toggle \'default group\' property'] = '賦予\'groupe par defaut\'默èªçµ„屬性';
-$lang['Advanced features'] = '高級功能';
-$lang['Overall'] = '全局視圖';
+$lang['default'] = 'é è¨­';
+$lang['Toggle \'default group\' property'] = '賦予\'é è¨­çš„群組\'屬性';
+$lang['Advanced features'] = '進級功能';
+$lang['Overall'] = '概覽';
$lang['Year'] = 'å¹´';
$lang['Month'] = '月';
$lang['Day'] = 'æ—¥';
$lang['Pages seen'] = '已訪å•éŽçš„é é¢';
$lang['Time'] = '時間';
$lang['IP'] = 'IP';
-$lang['Element'] = '圖片';
+$lang['Element'] = '單元';
$lang['Section'] = 'å€åŸŸ';
-$lang['An information email was sent to group "%s"'] = 'å·²å‘組 "%s" 的所有æˆå“¡ç™¼é€äº†ä¿¡æ¯éƒµä»¶';
-$lang['Send an information email to group members'] = 'å‘組æˆå“¡ç™¼é€ä¸€ä»½ä¿¡æ¯éƒµä»¶';
-$lang['Group'] = '組';
+$lang['An information email was sent to group "%s"'] = 'å·²å‘群組 "%s" 的所有æˆå“¡ç™¼é€äº†ä¿¡æ¯éƒµä»¶';
+$lang['Send an information email to group members'] = '發é€ä¸€ä»½ä¿¡æ¯éƒµä»¶çµ¦ç¾¤çµ„æˆå“¡';
+$lang['Group'] = '群組';
$lang['[%s] Visit album %s'] = '[%s] åƒè§€ç›¸å†Š %s';
$lang['Hello,'] = '你好,';
-$lang['See you soon.'] = 'å†è¦‹.';
+$lang['See you soon.'] = '很快å†è¦‹ã€‚';
$lang['Discover album:'] = '探索相冊:';
$lang['Mail content'] = '郵件內容';
$lang['none'] = '沒有任何人';
$lang['high'] = '高';
$lang['other'] = 'å¦å¤–';
-$lang['Element type'] = "內容類型";
-$lang['Image id'] = '圖片標識符';
+$lang['Element type'] = '單元類型';
+$lang['Image id'] = '圖片ID';
$lang['Summary'] = '概述';
$lang['%d line filtered'] = '%d 行被éŽæ¿¾';
$lang['%d lines filtered'] = '%d 行被éŽæ¿¾';
-$lang['%d guest'] = '%d 來賓';
-$lang['%d guests'] = '%d 來賓';
+$lang['%d guest'] = '%d 訪客';
+$lang['%d guests'] = '%d 訪客';
$lang['Hour'] = 'å°æ™‚';
-$lang['guest'] = '來賓';
-$lang['default values'] = '默èªå€¼';
-$lang['Guest cannot be deleted'] = 'ä¸èƒ½åˆªé™¤ä¾†è³“';
-$lang['Default user cannot be deleted'] = 'ä¸èƒ½åˆªé™¤é»˜èªç”¨æˆ¶';
+$lang['guest'] = '訪客';
+$lang['default values'] = 'é è¨­å€¼';
+$lang['Guest cannot be deleted'] = 'ä¸èƒ½åˆªé™¤è¨ªå®¢';
+$lang['Default user cannot be deleted'] = 'ä¸èƒ½åˆªé™¤é è¨­ç”¨æˆ¶';
$lang['Purge history detail'] = '清除歷å²è¨˜éŒ„';
-$lang['Purge history summary'] = '清除歷å²ç›®éŒ„';
-$lang['Check integrity'] = '檢測完整性';
+$lang['Purge history summary'] = '清除歷å²æ‘˜è¦';
+$lang['Check integrity'] = '完整性檢查';
$lang['Anomaly'] = '異常';
-$lang['Correction'] = '修復';
+$lang['Correction'] = '修正';
$lang['Automatic correction'] = '自動修復';
$lang['Impossible automatic correction'] = '無法自動修復';
-$lang['Correction applied with success'] = '修復æˆåŠŸ';
-$lang['Correction applied with error'] = '修復出錯';
+$lang['Correction applied with success'] = '修正æˆåŠŸæ‡‰ç”¨';
+$lang['Correction applied with error'] = '修正é©ç”¨çš„錯誤';
$lang['%d anomaly has been detected.'] = '發ç¾äº† %d 異常.';
$lang['%d anomalies have been detected.'] = '發ç¾äº† %d 個異常.';
$lang['%d anomaly has been corrected.'] = '修正了 %d 異常.';
@@ -437,18 +435,18 @@ $lang['%d anomalies have not been corrected.'] = 'ä¸èƒ½ä¿®æ­£ %d 個異常.';
$lang['Go to %s or %s for more informations'] = 'ç²å–更多信æ¯ï¼Œè«‹åˆ° %s 或者 %s ';
$lang['the forum'] = '論壇';
$lang['the wiki'] = 'wiki';
-$lang['%s value is not correct file because exif are not supported'] = ' %s 值ä¸æ˜¯ä¸€å€‹æ­£ç¢ºæ–‡ä»¶ï¼Œå› ç‚ºæˆ‘們ä¸æ”¯æŒexifæ ¼å¼';
-$lang['%s must be to set to false in your local/config/config.inc.php file'] = '在é…置文件config_local.inc.php中 %s 應該設置為"false"';
-$lang['Main "guest" user does not exist'] = '主è¦"guest"用戶ä¸å­˜åœ¨';
-$lang['Main "guest" user status is incorrect'] = '主è¦"guest"用戶狀態異常';
-$lang['Default user does not exist'] = '默èªå¸³æˆ¶ä¸å†å­˜åœ¨';
+$lang['%s value is not correct file because exif are not supported'] = '%s 值ä¸æ˜¯ä¸€å€‹æ­£ç¢ºæª”案,因為我們ä¸æ”¯æŒexifæ ¼å¼';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '在您的 local/config/config.inc.php 檔案, %s 必須設定為"false"';
+$lang['Main "guest" user does not exist'] = '主è¦"訪客"用戶ä¸å­˜åœ¨';
+$lang['Main "guest" user status is incorrect'] = '主è¦"訪客"用戶狀態異常';
+$lang['Default user does not exist'] = 'é è¨­å¸³æˆ¶ä¸å†å­˜åœ¨';
$lang['Main "webmaster" user does not exist'] = '主è¦ç¶²ç®¡å¸³æˆ¶ä¸å†å­˜åœ¨';
$lang['Main "webmaster" user status is incorrect'] = '主è¦ç¶²ç®¡ç”¨æˆ¶ç‹€æ…‹ç•°å¸¸';
-$lang['User "%s" created with "%s" like password'] = '用戶 "%s" 已創建,密碼是"%s"';
+$lang['User "%s" created with "%s" like password'] = '用戶 "%s" 已建立,密碼是"%s"';
$lang['Status of user "%s" updated'] = '用戶 "%s" 狀態已更新';
$lang['add new photos to caddie'] = '把所有新圖片放到購物籃';
$lang['No display'] = 'ä¸é¡¯ç¤ºç¸®ç•¥åœ–';
-$lang['Classic display'] = '正常顯示';
+$lang['Classic display'] = '經典顯示';
$lang['Hoverbox display'] = '俯瞰顯示';
$lang['Mail address is obligatory for all users'] = 'æ¯å€‹ç”¨æˆ¶å¿…é ˆæ供郵箱地å€';
$lang['Minimum privacy level'] = '最å°éš±ç§ç­‰ç´š';
@@ -459,59 +457,59 @@ $lang['Level 2'] = '朋å‹';
$lang['Level 4'] = '家庭';
$lang['Level 8'] = '管ç†è€…';
$lang['Reinitialize check integrity'] = 'é‡æ–°å®Œæ•´æ€§æª¢æ¸¬';
-$lang['Check all'] = 'å…¨é¸';
+$lang['Check all'] = '檢查全部';
$lang['Uncheck all'] = 'å–消全é¸';
-$lang['Check automatic corrections'] = '自動é¸æ“‡';
+$lang['Check automatic corrections'] = '檢查自動修正';
$lang['Apply selected corrections'] = '應用自動é¸æ“‡';
$lang['Ignore selected anomalies'] = '忽視é¸æ“‡ç•°å¸¸';
$lang['Refresh'] = '刷新';
$lang['The anomaly will be ignored until next application version'] = '此異常將被忽略,待下次版本中解決';
-$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = '異常更正將å–消忽略事件';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = '修正的異常將ä¸å†è¢«å¿½è¦–';
$lang['%d anomaly has been ignored.'] = '%d 異常被忽略.';
$lang['%d anomalies have been ignored.'] = '%d 異常被忽略.';
-$lang['Plugins which need upgrade'] = '必須更新æ’件';
+$lang['Plugins which need upgrade'] = 'æ’件待å‡ç´š';
$lang['Plugin list'] = 'æ’件列表';
-$lang['Check for updates'] = '檢查更新';
-$lang['Other plugins'] = '其他æ’件';
+$lang['Check for updates'] = '檢查是å¦æœ‰æ›´æ–°';
+$lang['Other plugins'] = '其他å¯ç”¨çš„æ’件';
$lang['Last revisions'] = '最新修訂版';
$lang['Are you sure you want to install this plugin?'] = '確定安è£æ­¤æ’件嗎?';
$lang['Are you sure you want to delete this plugin?'] = '確定è¦åˆªé™¤æ­¤æ’件嗎?';
$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = '確定安è£æ­¤æ›´æ–°å—Ž? 你必須核實無需å¸è¼‰æ“作å†é€²è¡Œå®‰è£æ­¤æ›´æ–°.';
$lang['Plugin has been successfully copied'] = 'æ’件複製æˆåŠŸ.';
-$lang['You might go to plugin list to install and activate it.'] = '在æ’件列表中安è£å’Œå•Ÿå‹•æ’件.';
-$lang['Can\'t create temporary file.'] = '無法創建臨時文件.';
-$lang['Can\'t download archive.'] = '無法下載歸檔文件.';
+$lang['You might go to plugin list to install and activate it.'] = '在æ’件列表中安è£å’Œå•Ÿå‹•æ’件。';
+$lang['Can\'t create temporary file.'] = '無法建立臨時文件。';
+$lang['Can\'t download archive.'] = '無法下載歸檔文件。';
$lang['Can\'t read or extract archive.'] = '無法讀å–或解壓歸檔文件.';
$lang['An error occured during extraction (%s).'] = '在解壓文件(%s) 發生錯誤.';
$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = '請核實"plugins"文件夾åŠå…¶å­æ–‡ä»¶å¤¾çš„權é™(CHMOD).';
-$lang['Can\'t connect to server.'] = '無法連接到æœå‹™å™¨.';
+$lang['Can\'t connect to server.'] = '無法連接到æœå‹™å™¨ã€‚';
$lang['Purge compiled templates'] = '清除編譯模æ¿';
$lang['Support'] = '支æŒ';
-$lang['Documentation'] = '文檔';
+$lang['Documentation'] = '檔案';
$lang['ACCESS_0'] = '自由存å–';
$lang['ACCESS_1'] = 'å°æ‰€æœ‰äººé–‹æ”¾';
$lang['ACCESS_2'] = 'åªå°è¨»å†Šç”¨æˆ¶é–‹æ”¾';
$lang['ACCESS_3'] = 'åªå°ç®¡ç†å“¡é–‹æ”¾';
$lang['ACCESS_4'] = 'åªå°ç¶²ç®¡é–‹æ”¾';
$lang['ACCESS_5'] = 'å°ä»»ä½•äººéƒ½ä¸é–‹æ”¾';
-$lang['A new version of Piwigo is available.'] = 'Piwigo新版發佈.';
+$lang['A new version of Piwigo is available.'] = '有新的 Piwigo 版本發佈';
$lang['Piwigo Administration'] = 'Piwigo管ç†';
$lang['Piwigo version'] = 'Piwigo版本';
-$lang['You are running the latest version of Piwigo.'] = 'ä½ é‹è¡Œçš„是Piwigo最新版.';
+$lang['You are running the latest version of Piwigo.'] = '你正在執行的是Piwigo最新版。';
$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = '%s [%s]安è£ç‰ˆæœ¬è·Ÿ[%s]版本ä¸å…¼å®¹';
-$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = '為了ç²å¾—全部功能,你應該更新系統,å¦å‰‡ç¨‹åºé‹è¡Œä¸æ­£å¸¸ã€‚';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = '你應該å‡ç´šä½ çš„系統,以充分利用該應用程åºï¼Œå¦å‰‡æ‡‰ç”¨ç¨‹åºå¯èƒ½ç„¡æ³•æ­£å¸¸å·¥ä½œï¼Œæˆ–者ä¸æ˜¯ã€‚';
$lang['Deleted on'] = '刪除於';
$lang['Last hit'] = '最後一次查看';
$lang['GD library is missing'] = '缺少GD庫';
$lang['Templates'] = '模æ¿';
-$lang['Extend for templates'] = '擴展模æ¿';
+$lang['Extend for templates'] = '擴充模æ¿';
$lang['Replacement of original templates by customized templates from template-extension subfolder'] = '用ä½æ–¼template-extension文件夾下的用戶自定義模æ¿æ›´æ›åŽŸæ¨¡æ¿';
-$lang['Replacers (customized templates)'] = '自定義模æ¿';
+$lang['Replacers (customized templates)'] = '替代(自訂的模æ¿)';
$lang['Original templates'] = '原模æ¿';
$lang['Optional URL keyword'] = 'å¯é¸URLé—œéµå­—';
-$lang['Templates configuration has been recorded.'] = '模æ¿è¨­ç½®å·²ä¿å­˜.';
+$lang['Templates configuration has been recorded.'] = '模æ¿è¨­å®šå·²ç¶“被記錄。';
$lang['All optimizations have been successfully completed.'] = '優化æˆåŠŸ.';
-$lang['Optimizations have been completed with some errors.'] = '有些優化發生錯誤.';
+$lang['Optimizations have been completed with some errors.'] = '優化已完æˆçš„一些錯誤。';
$lang['Modify information'] = '修改信æ¯';
$lang['nothing'] = '沒有內容';
$lang['overrides existing values with empty ones'] = '用空數據來刪除已存在的數據';
@@ -520,7 +518,7 @@ $lang['Edit ranks'] = '修改排åºæ–¹å¼';
$lang['No photo in this album'] = '沒有相片在此相冊裡';
$lang['Images manual order was saved'] = '圖片手動排åºå·²ä¿å­˜';
$lang['ranks'] = 'é †åº';
-$lang['Drag to re-order'] = '拖放進行排åº';
+$lang['Drag to re-order'] = '點擊並拖動以é‡æ–°æŽ’åº';
$lang['Quick Local Synchronization'] = '快速åŒæ­¥';
$lang['No photo can be deleted'] = '沒有圖片å¯ä»¥åˆªé™¤';
$lang['Delete selected photos'] = '刪除圖片';
@@ -529,7 +527,7 @@ $lang['%d photos were deleted'] = '%d 圖片被刪除';
$lang['Downloads'] = '下載';
$lang['Released on'] = '發佈於';
$lang['Number of downloads'] = '下載次數';
-$lang['Operation in progress'] = '正在處ç†.';
+$lang['Operation in progress'] = '處ç†æ­£åœ¨é€²è¡Œä¸­ã€‚';
$lang['Please wait...'] = 'è«‹ç¨å¾Œ...';
$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = '訂閱 Piwigo 最新消æ¯ï¼Œèˆ‡ Piwigo é …ç›®ä¿æŒè¯ç¹«ã€‚當有新版本發佈時,您將會收到郵件通知(有時也包括安全æ¼æ´žçš„修復,這å°æ–¼å‡ç´šæ˜¯å¾ˆé‡è¦çš„)和項目裡一些é‡è¦äº‹æƒ…的發生。一年裡也åªæœ‰å¹¾å°éƒµä»¶ã€‚';
$lang['Password is missing. Please enter the password.'] = '密碼沒有輸入,請輸入密碼。';
@@ -538,44 +536,44 @@ $lang['Allow users to edit their own comments'] = 'å…許用戶修改自己的è©
$lang['Allow users to delete their own comments'] = 'å…許用戶刪除自己的評論';
$lang['Email administrators when a comment is modified'] = '當評論被修改後,發郵件通知管ç†å“¡';
$lang['Email administrators when a comment is deleted'] = '當評論被刪除後,發郵件通知管ç†å“¡';
-$lang['Cannot delete the old permalink !'] = '舊的固定éˆæŽ¥ä¸èƒ½è¢«åˆªé™¤!';
+$lang['Cannot delete the old permalink !'] = '舊的固定連çµä¸èƒ½è¢«åˆªé™¤!';
$lang['Hit'] = '點擊';
$lang['Tools'] = '工具';
$lang['Photos'] = '相片';
$lang['Themes'] = '主題';
$lang['Instructions to use Piwigo'] = 'Piwigo 使用指å—';
$lang['Installed Themes'] = '安è£ä¸»é¡Œ';
-$lang['Add New Theme'] = '添加一個新主題';
+$lang['Add New Theme'] = '增加一個新的主題';
$lang['Forbid this theme to users'] = 'ç¦ç”¨æ­¤ä¸»é¡Œ';
-$lang['Set as default theme for unregistered and new users'] = '設置為未註冊者和新用戶的默èªä¸»é¡Œ';
+$lang['Set as default theme for unregistered and new users'] = '未註冊者和新用戶的主題設定為é è¨­çš„主題';
$lang['unknown'] = '未知';
$lang['Upload Photos'] = '上傳相片';
-$lang['Drop into album'] = '拖進相冊';
+$lang['Drop into album'] = 'é¸æ“‡ä¸€å€‹ç›¸å†Š';
$lang['+ Add an upload box'] = '+ 添加一個上傳框';
-$lang['Create the "%s" directory at the root of your Piwigo installation'] = '在您的根目錄下創建 "%s" ç›®éŒ„ä»¥å®Œæˆ Piwigo 的安è£';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = '建立 "%" 在安è£Piwigo的根目錄下';
$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = '給予根目錄下的 "%s" ç›®éŒ„å¯«æ¬Šé™ (chmod 777) ä»¥å®Œæˆ Piwigo 的安è£';
$lang['existing album'] = 'ç¾æœ‰çš„相冊';
-$lang['create a new album'] = '創建一個新相冊';
+$lang['create a new album'] = '建立一個新相冊';
$lang['Album name'] = '相冊å稱';
-$lang['Album "%s" has been added'] = '類別 "%s" 已添加';
+$lang['Album "%s" has been added'] = '類別 "%s" 已增加';
$lang['Uploaded Photos'] = '相片已上傳';
$lang['%d photos uploaded'] = '%d 相片已上傳';
-$lang['Privacy level set to "%s"'] = 'ç§æœ‰ç´šåˆ¥è¨­ç½®ç‚º "%s"';
+$lang['Privacy level set to "%s"'] = 'ç§æœ‰ç´šåˆ¥è¨­å®šç‚º "%s"';
$lang['Album "%s" now contains %d photos'] = '類別 "%s" ç¾å·²åŒ…å«äº† %d 相片';
$lang['Manage this set of %d photos'] = '管ç†æ­¤è¨­ç½®çš„ %d 張照片 ';
-$lang['Select files'] = 'é¸æ“‡æ–‡ä»¶';
-$lang['Everybody'] = 'æ¯å€‹äºº';
+$lang['Select files'] = 'é¸æ“‡æª”案';
+$lang['Everybody'] = '所有人';
$lang['Who can see these photos?'] = '哪些人å¯ä»¥çœ‹åˆ°é€™äº›ç›¸ç‰‡?';
-$lang['Settings'] = '設置';
-$lang['Resize'] = 'é‡ç½®å¤§å°';
+$lang['Settings'] = '設定';
+$lang['Resize'] = '調整大å°';
$lang['Maximum width'] = '最大寬度';
$lang['pixels'] = 'åƒç´ ';
$lang['Maximum height'] = '最大高度';
$lang['Image Quality'] = '圖片質é‡';
-$lang['Save Settings'] = 'ä¿å­˜è¨­ç½®';
-$lang['Your configuration settings are saved'] = '你的設置已ä¿å­˜';
-$lang['Active Themes'] = '已激活的主題';
-$lang['Add write access to the "%s" directory'] = '為 "%s" 目錄添加寫權é™';
+$lang['Save Settings'] = '儲存設定';
+$lang['Your configuration settings are saved'] = '你的設定已儲存';
+$lang['Active Themes'] = '已啟動的主題';
+$lang['Add write access to the "%s" directory'] = '為 "%s" 目錄增加寫入權é™';
$lang['Administration Home'] = '管ç†å“¡é¦–é ';
$lang['Change Admin Colors'] = '更改管ç†å“¡å¾Œå°é¡è‰²';
$lang['Delete this theme'] = '刪除此主題';
@@ -584,74 +582,74 @@ $lang['Download,'] = '下載,';
$lang['FTP + Synchronization'] = 'FTP + åŒæ­¥';
$lang['Get Support on Piwigo Forum'] = '在 Piwigo 論壇上ç²å–幫助';
$lang['Help Me'] = '幫助我';
-$lang['Impossible to activate this theme, the parent theme is missing: %s'] = '父主題 %s 丟失,此主題ä¸èƒ½è¢«æ¿€ã€‚';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = '這個主題ä¸èƒ½å•Ÿå‹•ï¼Œå› ç‚ºç¼ºå°‘主é ä¸»é¡Œï¼šï¼…S';
$lang['Impossible to delete this theme. Other themes depends on it: %s'] = '此主題ä¸èƒ½åˆªé™¤ï¼Œå› ç‚ºå…¶ä»–主題還有ä¾è³´èˆ‡å®ƒ: %s';
$lang['Inactive Themes'] = 'åœç”¨ä¸»é¡Œ';
$lang['Install on your computer,'] = '安è£åˆ°æ‚¨çš„電腦,';
$lang['Make this theme available to users'] = '讓用戶å¯ä½¿ç”¨æ­¤ä¸»é¡Œ';
$lang['Page end'] = 'é å°¾';
$lang['Piwigo Uploader'] = 'Piwigo 上傳者';
-$lang['Read Piwigo Documentation'] = '閱讀 Piwigo 文檔';
-$lang['Start pLoader and add your photos.'] = '開始使用 pLoader 並添加您的相片.';
-$lang['Switch to clear or dark colors for administration'] = '更改管ç†å“¡å¾Œå°ç‚ºæ¸…爽或者黑暗的é¡è‰²';
+$lang['Read Piwigo Documentation'] = '閱讀 Piwigo 檔案';
+$lang['Start pLoader and add your photos.'] = '開始使用pLoader的並新增你的照片。';
+$lang['Switch to clear or dark colors for administration'] = '切æ›ç®¡ç†å“¡å¾Œå°ç‚ºæ¸…晰或黑暗的é¡è‰²';
$lang['Theme has been successfully installed'] = '主題已æˆåŠŸå®‰è£';
$lang['Visit Gallery'] = 'ç€è¦½ç•«å»Š';
$lang['Visit Piwigo project website'] = 'ç€è¦½ Piwigo 項目網站';
$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader 是 <em>Piwigo 上傳者</em> 的官方標準軟件。pLoader å¯å°‡æ‚¨é›»è…¦è£¡çš„相片傳é€åˆ° Piwigo 的相片畫廊裡。';
-$lang['Guest Settings'] = 'éŠå®¢è¨­ç½®';
+$lang['Guest Settings'] = '訪客設定';
$lang['Main Page'] = '主é ';
$lang['Photo Page'] = '相片é ';
-$lang['Activate Navigation Bar'] = '激活導航æ¢';
-$lang['Activate Navigation Thumbnails'] = '激活縮略圖導航';
-$lang['Activate icon "%s"'] = '激活圖標 "%s"';
+$lang['Activate Navigation Bar'] = '啟動導航欄';
+$lang['Activate Navigation Thumbnails'] = '啟動縮略圖導航';
+$lang['Activate icon "%s"'] = '啟動圖標 "%s"';
$lang['Photo Properties'] = '相片屬性';
-$lang['Allow user customization'] = 'å…許用戶自定義';
+$lang['Allow user customization'] = 'å…許使用者客制化';
$lang['Languages'] = '語言';
$lang['Installed Languages'] = '安è£èªžè¨€';
-$lang['Add New Language'] = '添加新語言';
+$lang['Add New Language'] = '增加新的語言';
$lang['Language has been successfully installed'] = '語言已æˆåŠŸå®‰è£';
$lang['Select:'] = 'é¸æ“‡:';
$lang['None'] = '沒有';
$lang['Invert'] = 'å轉';
-$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'ä¸èƒ½åœç”¨æ­¤ä¸»é¡Œï¼Œæ‚¨è‡³å°‘需è¦ä½¿ç”¨ä¸€å€‹ä¸»é¡Œ.';
-$lang['Webmaster status is required.'] = '必須設置網站管ç†å“¡.';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = '無法åœç”¨é€™å€‹ä¸»é¡Œï¼Œä½ è‡³å°‘需è¦ä¸€å€‹ä¸»é¡Œã€‚';
+$lang['Webmaster status is required.'] = '必須設置網站管ç†å“¡ã€‚';
$lang['Bound Theme'] = 'ç¶å®šä¸»é¡Œ';
$lang['Allow rating'] = 'å…許投票';
-$lang['Select at least one comment'] = 'é¸æ“‡æœ€æ–°ä¸€å€‹è©•è«–';
-$lang['Active Plugins'] = '激活æ’件';
+$lang['Select at least one comment'] = '至少é¸æ“‡ä¸€å€‹è©•è«–';
+$lang['Active Plugins'] = 'å•Ÿå‹•æ’件';
$lang['Inactive Plugins'] = 'åœç”¨æ’件';
$lang['Missing Plugins'] = '丟失的æ’件';
$lang['Uninstalled Plugins'] = '未安è£çš„æ’件';
$lang['By %s'] = '按 %s';
$lang['Visit plugin site'] = 'ç€è¦½æ’件網站';
-$lang['Active Languages'] = '激活語言';
+$lang['Active Languages'] = '啟動語言';
$lang['Delete this language'] = '刪除此語言';
$lang['Forbid this language to users'] = 'ç¦æ­¢ç”¨æˆ¶ä½¿ç”¨æ­¤èªžè¨€';
-$lang['Impossible to deactivate this language, first set another language as default.'] = 'ä¸èƒ½åœç”¨æ­¤èªžè¨€ï¼Œè«‹å…ˆè¨­ç½®ä¸€å€‹é»˜èªèªžè¨€.';
-$lang['Impossible to deactivate this language, you need at least one language.'] = 'ä¸èƒ½åœç”¨æ­¤èªžè¨€ï¼Œæ‚¨å¿…須至少使用一個語言.';
+$lang['Impossible to deactivate this language, first set another language as default.'] = '無法åœç”¨é€™å€‹èªžè¨€ï¼Œé¦–先設定å¦ä¸€ç¨®èªžè¨€ç‚ºé è¨­å€¼ã€‚';
+$lang['Impossible to deactivate this language, you need at least one language.'] = '無法åœç”¨é€™å€‹èªžè¨€ï¼Œä½ éœ€è¦è‡³å°‘一種語言。';
$lang['Inactive Languages'] = 'åœç”¨èªžè¨€';
$lang['Make this language available to users'] = '讓用戶å¯ä½¿ç”¨æ­¤èªžè¨€';
-$lang['Set as default language for unregistered and new users'] = '設置為éŠå®¢å’Œæ–°ç”¨æˆ¶çš„默èªèªžè¨€';
-$lang['Add Photos'] = '添加相片';
+$lang['Set as default language for unregistered and new users'] = '未註冊和新用戶的語言設定為é è¨­çš„語言';
+$lang['Add Photos'] = '上傳照片';
$lang['The following tag was deleted'] = '以下標籤已刪除';
$lang['Miscellaneous'] = '雜項';
-$lang['Virtual Links'] = '虛擬éˆæŽ¥';
-$lang['There is no other language available.'] = '沒有其他å¯ç”¨çš„語言.';
-$lang['There is no other plugin available.'] = '沒有其他å¯ç”¨çš„æ’件.';
-$lang['There is no other theme available.'] = '沒有其他å¯ç”¨çš„主題.';
-$lang['Add another set of photos'] = '添加å¦ä¸€çµ„相片';
+$lang['Virtual Links'] = '虛擬連çµ';
+$lang['There is no other language available.'] = '沒有其他å¯ç”¨çš„語言。';
+$lang['There is no other plugin available.'] = '沒有其他å¯ç”¨çš„æ’件。';
+$lang['There is no other theme available.'] = '沒有其他å¯ç”¨çš„主題。';
+$lang['Add another set of photos'] = '增加å¦ä¸€çµ„相片';
$lang['By rank'] = '按等級';
$lang['Manual order'] = '手工排åº';
$lang['Piwigo Announcements Newsletter'] = 'Piwigo最新消æ¯å…¬å‘Š';
-$lang['Subscribe %s'] = '訂閱%s';
-$lang['Subscribe %s to Piwigo Announcements Newsletter'] = '訂閱%s Piwigo中國最新消æ¯å…¬å‘Š';
+$lang['Subscribe %s'] = '訂閱 %s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = '訂閱 %s Piwigo中國最新消æ¯å…¬å‘Š';
$lang['Purge search history'] = '清除查尋歷å²è¨˜éŒ„';
$lang['Hide'] = 'éš±è—';
-$lang['Order of menubar items has been updated successfully.'] = '所有項目已被更新.';
-$lang['This theme was not designed to be directly activated'] = '此主題並未設計為直接激活';
+$lang['Order of menubar items has been updated successfully.'] = 'å·²æˆåŠŸæ›´æ–°çš„é¸å–®æ¬„項目的順åºã€‚';
+$lang['This theme was not designed to be directly activated'] = '此主題並未設計為直接啟動';
$lang['Who can see this photo?'] = '有哪些人能看這些相片?';
$lang['Pending Comments'] = '待批的評論';
-$lang['Menu Management'] = 'èœå–®';
+$lang['Menu Management'] = 'é¸å–®';
$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = '在你的 php.ini 文件, 如果 upload_max_filesize (%sB) 大於 post_max_size (%sB), 那麼你需è¦ä¿®æ”¹æ­¤é …';
$lang['Exif extension not available, admin should disable exif use'] = 'Exif 擴展ä¸èƒ½ä½¿ç”¨ï¼Œç®¡ç†å“¡æ‡‰è©²ç¦ç”¨ exif 功能。';
$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = '上傳文件超éŽäº†åœ¨ php.ini 文件裡的 upload_max_filesize é™åˆ¶: %sB';
@@ -660,13 +658,13 @@ $lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified
$lang['The uploaded file was only partially uploaded'] = '上傳文件åªä¸Šå‚³äº†ä¸€éƒ¨åˆ†';
$lang['No file was uploaded'] = '沒有文件被上傳';
$lang['Missing a temporary folder'] = '缺少臨時文件目錄';
-$lang['Failed to write file to disk'] = '文件寫入失敗';
+$lang['Failed to write file to disk'] = '寫入失敗的檔案';
$lang['File upload stopped by extension'] = '擴展使文件上傳åœæ­¢';
$lang['Unknown upload error'] = '未知上傳錯誤';
$lang['Error on file "%s" : %s'] = '文件上的錯誤 "%s" : %s';
-$lang['%d of %d photos selected'] = '%d å¼µ/總 %d 相片被é¸ä¸­';
+$lang['%d of %d photos selected'] = '%d å¼µ/總 %d 相片被é¸å–';
$lang['Action'] = '動作';
-$lang['Add a filter'] = '添加一個éŽæ¿¾å™¨';
+$lang['Add a filter'] = '增加一個éŽæ¿¾å™¨';
$lang['Album photos associated to the following albums: %s'] = '相片已關è¯åˆ°ä»¥ä¸‹ç›¸å†Š: %s';
$lang['Albums automatically sorted'] = '相冊已自動排åº';
$lang['All %d photos are selected'] = '全部 %d 張相片已é¸ä¸­';
@@ -687,19 +685,19 @@ $lang['Orphan tags deleted'] = 'ç„¡é—œè¯æ¨™ç±¤å·²è¢«åˆªé™¤';
$lang['Refresh photo set'] = '刷新相片集';
$lang['Remove all filters'] = '刪除所有éŽæ¿¾å™¨';
$lang['remove author'] = '刪除作者';
-$lang['remove creation date'] = '刪除創建日期';
+$lang['remove creation date'] = '刪除建立日期';
$lang['remove this filter'] = '刪除此éŽæ¿¾å™¨';
$lang['remove title'] = '刪除標題';
$lang['Selection'] = 'é¸æ“‡';
-$lang['Set author'] = '設置作者';
-$lang['Set creation date'] = '設置創建日期';
-$lang['Set title'] = '設置標題';
+$lang['Set author'] = '設定作者';
+$lang['Set creation date'] = '設定建立日期';
+$lang['Set title'] = '設定標題';
$lang['The whole page'] = '整張相片';
$lang['The whole set'] = '整個集åˆ';
$lang['Type here the author name'] = '在此輸入作者å稱';
$lang['Type here the title'] = '在此輸入標題';
$lang['Week starts on'] = '星期起始於';
-$lang['You have %d orphan tags: %s.'] = '您已 %d ç„¡é—œè¯æ¨™ç±¤: %s.';
+$lang['You have %d orphan tags: %s.'] = '您已 %d ç„¡é—œè¯æ¨™ç±¤: %s。';
$lang['Remove from caddie'] = '從購物è—裡移除';
$lang['Themes which need upgrade'] = '需更新的主題';
$lang['Languages which need upgrade'] = '需更新的語言';
@@ -712,7 +710,7 @@ $lang['New Version'] = '新版本';
$lang['new'] = '新增';
$lang['No results'] = '沒有çµæžœ';
$lang['Searching...'] = 'æœå°‹ä¸­...';
-$lang['Type in a search term'] = '輸入æœç´¢å­—è©ž';
+$lang['Type in a search term'] = '輸入一個æœç´¢è©ž';
$lang['Obsolete Plugins'] = 'éŽæ™‚(廢棄)çš„æ’件';
$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = '警告! 這個æ’件與此Piwigo版本ä¸ç›¸å®¹!';
$lang['Do you want to activate anyway?'] = '你無論如何都è¦å•Ÿå‹•å—Ž?';
@@ -724,22 +722,22 @@ $lang['Rate'] = '評分';
$lang['Average rate'] = '評分';
$lang['Activate icon "new" next to albums and pictures'] = '在相簿åŠç›¸ç‰‡æ—邊加上"æ–°"的圖示';
$lang['Add a criteria'] = '新增標準';
-$lang['Deactivate all'] = 'å–消全部';
+$lang['Deactivate all'] = 'åœç”¨æ‰€æœ‰';
$lang['Default photos order'] = 'é è¨­çš„相片順åº';
-$lang['Restore'] = '復原';
-$lang['Restore default configuration. You will lose your plugin settings!'] = '復原至é è¨­è¨­å®šã€‚你將失去你在套件上的設定ï¼';
+$lang['Restore'] = '還原';
+$lang['Restore default configuration. You will lose your plugin settings!'] = '還原至é è¨­è¨­å®šã€‚你會失去你的æ’件的設定ï¼';
$lang['Show menubar'] = '顯示é¸å–®åˆ—';
-$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = '無法使用é è¨­ç›¸ç‰‡é †åºï¼Œå› ä½ åœ¨æœ¬åœ°ç«¯å·²å¦æœ‰è¨­å®šã€‚';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = '無法使用é è¨­ç›¸ç‰‡é †åºï¼Œå› ä½ åœ¨æœ¬æ©Ÿé…ç½®å¦æœ‰è‡ªè¨‚設定。';
$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = '你已在本地設定檔é¸ç”¨ <i>$conf[\'order_by\']</i>,造æˆåƒæ•¸çŸ›ç›¾ï¼Œè«‹å°‡å®ƒç§»é™¤æˆ–é‡æ–°å‘½å為 <i>$conf[\'order_by_custom\']</i>ï¼';
$lang['Thumbnails generation in progress...'] = 'å°åœ–製作中...';
$lang['Photos generation in progress...'] = '圖片製作中...';
-$lang['%s photos have been regenerated'] = '%s圖片製作完æˆ';
-$lang['%s photos can not be regenerated'] = '無法製作%s圖片';
+$lang['%s photos have been regenerated'] = '%s 圖片製作完æˆ';
+$lang['%s photos can not be regenerated'] = '無法製作 %s 圖片';
$lang['Add to caddie'] = '放入購物籃';
$lang['%s has been successfully updated.'] = '%s 已更新æˆåŠŸ';
$lang['(this tag will be deleted)'] = '(此標籤將被刪除)';
$lang['... or '] = '... 或 ';
-$lang['Activate comments'] = '啟用評論';
+$lang['Activate comments'] = 'å•Ÿå‹•è©•è«–';
$lang['Add tags'] = '新增標籤';
$lang['All extensions are up to date.'] = '所有的擴展是最新的';
$lang['Allowed file types: %s.'] = 'å…許的文件類型: %s.';
@@ -748,12 +746,12 @@ $lang['An error has occured during upgrade.'] = 'å‡ç´šéŽç¨‹ä¸­ç™¼ç”ŸéŒ¯èª¤.';
$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = '大約最高解釋度: %dM åƒç´  (å³ %dx%dåƒç´ ).';
$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'é è¨­ç‹€æ³ä¸‹ï¼ŒPiwigo 將從原照片的高清晰度版本,建立å¦ä¸€å€‹é©ç”¨æ–¼ç¶²é çš„尺寸版本。';
$lang['Confirm merge'] = '確èªåˆä½µ';
-$lang['Create'] = '創建';
+$lang['Create'] = '建立';
$lang['Crop'] = '剪è£';
$lang['Default comments order'] = 'é è¨­è©•è«–é †åº';
-$lang['Dump Database'] = '轉儲數據庫';
+$lang['Dump Database'] = '轉儲資料庫';
$lang['ERROR'] = '錯誤';
-$lang['Extensions Update'] = '擴展更新';
+$lang['Extensions Update'] = 'æ“´å……æ›´æ–°';
$lang['Follow Orientation'] = '定ä½';
$lang['Following plugins may not be compatible with the new version of Piwigo:'] = '以下æ’件å¯èƒ½ç„¡æ³•å…¼å®¹æ–°Piwigo的版本:';
$lang['Following themes may not be compatible with the new version of Piwigo:'] = '以下主題å¯èƒ½ç„¡æ³•å…¼å®¹æ–°ç‰ˆæœ¬Piwigo:';
@@ -776,27 +774,27 @@ $lang['Photo name'] = '圖片å稱';
$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo 無法從伺æœå™¨ä¸­å–å¾—å‡ç´šæª” ';
$lang['Piwigo Update'] = 'Piwigo æ›´æ–°';
$lang['Predefined filter'] = 'é å…ˆå®šç¾©çš„éŽæ¿¾å™¨';
-$lang['Reset ignored updates'] = 'é‡ç½®ï¼Œå¿½ç•¥æ›´æ–°';
-$lang['Save Template Directory'] = 'ä¿å­˜æ¨£æœ¬ç›®éŒ„';
+$lang['Reset ignored updates'] = 'é‡è¨­å¿½ç•¥æ›´æ–°';
+$lang['Save Template Directory'] = '儲存模æ¿ç›®éŒ„';
$lang['Select an album'] = 'é¸æ“‡ä¸€å€‹ç›¸å†Š';
$lang['Select at least two tags for merging'] = '至少é¸æ“‡å…©å€‹éœ€åˆä½µçš„標籤';
$lang['Select the destination tag'] = 'é¸æ“‡ç›®çš„標籤';
-$lang['Send connection settings by email'] = 'é€éŽemail發é€é€£çµè¨­ç½®';
+$lang['Send connection settings by email'] = '通éŽé›»å­éƒµä»¶ç™¼é€é€£æŽ¥çš„設定';
$lang['show details'] = '顯示細節';
$lang['Some themes and plugins may be not available yet.'] = '一些主題和æ’件å¯èƒ½å°šç„¡æ³•ä½¿ç”¨';
-$lang['Some upgrades are available for extensions.'] = '有延伸版本å¯ä»¥å‡ç´š';
+$lang['Some upgrades are available for extensions.'] = '一些å¯å‡ç´šç”¨æ–¼æ“´å±•ã€‚';
$lang['Start Upload'] = '開始上傳';
$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = '標籤 <em>%s</em> å·²åˆä½µæˆæ¨™ç±¤ <em>%s</em>';
-$lang['The original image quality must be a number between %d and %d'] = '原始圖å“質必須在%d和%d之間';
-$lang['The original maximum height must be a number between %d and %d'] = '原始高度上é™å¿…須在%d和%d之間';
-$lang['The original maximum width must be a number between %d and %d'] = '原始寬度上é™å¿…須在%d和%d之間 ';
-$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = '這是一個é‡å¤§æ›´æ–°ï¼ŒåŒ…括<a href="%s">這個令人興奮的新功能';
+$lang['The original image quality must be a number between %d and %d'] = '原始圖å“質必須在 %d å’Œ %d 之間';
+$lang['The original maximum height must be a number between %d and %d'] = '原始高度上é™å¿…須在 %d å’Œ %d 之間';
+$lang['The original maximum width must be a number between %d and %d'] = '原始寬度上é™å¿…須在 %d å’Œ %d 之間 ';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = '這是一個é‡å¤§æ›´æ–°ï¼ŒåŒ…括<a href="%s">這個令人興奮的新功能</a>。';
$lang['This is a minor update, with only bug corrections.'] = '這是一個次è¦æ›´æ–°ï¼Œåªæœ‰bug修正';
$lang['Two updates are available'] = '兩個更新å¯ä½¿ç”¨';
-$lang['Unable to dump database.'] = '無法轉儲數據庫';
+$lang['Unable to dump database.'] = '無法轉儲資料庫。';
$lang['Update All'] = '全部更新';
$lang['Update Complete'] = '更新完æˆ';
-$lang['Update in progress... Please wait.'] = '更新正在進行,請ç¨å€™';
+$lang['Update in progress... Please wait.'] = '更新正在進行,請ç¨å€™ã€‚';
$lang['Update to Piwigo %s'] = '更新到Piwigo %s';
$lang['Updates'] = 'æ›´æ–°';
$lang['Width'] = '寬度';
@@ -812,29 +810,29 @@ $lang['Original Size'] = '原始大å°';
$lang['A locked gallery is only visible to administrators'] = '鎖定的畫廊,åªæœ‰ç®¡ç†å“¡å¯ä»¥çœ‹è¦‹';
$lang['Unlock gallery'] = '將畫廊解鎖';
$lang['Gallery unlocked'] = '畫廊已解鎖';
-$lang['Notify administrators when a comment is'] = '當有評論時通知管ç†å“¡';
+$lang['Notify administrators when a comment is'] = '通知管ç†å“¡ç•¶è©•è«–是';
$lang['modified'] = '已修改';
-$lang['pending validation'] = '等候驗證';
+$lang['pending validation'] = '待審定';
$lang['Save visits in history for'] = 'ä¿å­˜è¨ªå•çš„æ­·å²';
$lang['simple visitors'] = '普通訪客';
$lang['registered users'] = '註冊用戶';
$lang['administrators'] = '管ç†å“¡';
-$lang['This album contains %d photos, added on %s.'] = '這本相冊包å«ï¼…d張照片,在%s上添加';
-$lang['This album contains %d photos, added between %s and %s.'] = '這本相冊包å«ï¼…d張照片,在%s和%s之間添加。';
+$lang['This album contains %d photos, added on %s.'] = 'é€™æœ¬ç›¸å†ŠåŒ…å« %d 張照片,在 %s 上增加。';
+$lang['This album contains %d photos, added between %s and %s.'] = 'é€™æœ¬ç›¸å†ŠåŒ…å« %d 張照片,在 %s å’Œ %s 之間增加。';
$lang['This album contains no photo.'] = '這本相冊沒有照片';
$lang['Not cropped correctly?'] = 'ä¸æ­£ç¢ºçš„è£å‰ª?';
$lang['Center of interest'] = '我的收è—';
$lang['Move to album'] = '移動到相冊';
-$lang['You can activate only one mobile theme.'] = '您最多åªèƒ½å•Ÿç”¨ä¸€å€‹ç§»å‹•çš„主題。';
+$lang['You can activate only one mobile theme.'] = '您最多åªèƒ½å•Ÿç”¨ä¸€å€‹æ‰‹æ©Ÿä¸»é¡Œã€‚';
$lang['Automatic sort order'] = '自動排åº';
$lang['apply automatic sort order'] = '使用自動排åº';
-$lang['Save manual order'] = 'ä¿å­˜æ‰‹å‹•æŽ’åº';
+$lang['Save manual order'] = '儲存手動排åº';
$lang['cancel manual order'] = 'å–消手動排åº';
$lang['Cancel'] = 'å–消';
$lang['List'] = '清單';
$lang['Web Form'] = '網é è¡¨æ ¼';
$lang['Applications'] = '申請';
-$lang['Available versions for'] = 'å¯ç”¨çš„版本';
+$lang['Available versions for'] = 'å¯ç”¨çš„版本是';
$lang['Available on'] = 'å¯ç”¨çš„';
$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'iOS (iPhone, iPad, iPod Touch) 版的 Piwigo ';
$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = '<em>iOS 版的Piwigo</em>å…許您從iPhone, iPad 或 iPod Touch 連接到您的Piwigo畫廊,建立多個相冊並一次上傳多張相片。';
@@ -849,7 +847,7 @@ $lang['On your Linux, simply install Shotwell with your package manager and the
$lang['Piwigo publish plugin for digiKam'] = 'Piwigo çš„ ddgiKam 照片發布æ’件';
$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam是一套先進的數ä½ç›¸ç‰‡ç®¡ç†è»Ÿé«”,它是自由軟體,é©ç”¨æ–¼LINUX,WINDOWSå’ŒMacOSX。';
$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam是專為æ”影師ç€è¦½ã€ç®¡ç†ã€ç·¨è¼¯ã€åŠ å·¥ã€æ•´ç†ã€æ¨™è¨˜åŠåˆ†äº«ç…§ç‰‡ç­‰ç”¨é€”而設計。';
-$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = '從digiKamè¦åŒ¯å‡ºç›¸ç‰‡åˆ°Piwigo,åªéœ€å®‰è£digiKamå’ŒKipi-pluginsæ’件.';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = '從digiKamè¦åŒ¯å‡ºç›¸ç‰‡åˆ°Piwigo,åªéœ€å®‰è£digiKamå’ŒKipi-pluginsæ’件。';
$lang['Piwigo export plugin for iPhoto'] = 'iPhotoçš„Piwigo匯出æ’件';
$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto是MacOSXé è¨­çš„相片管ç†è»Ÿé«”。此Piwigo匯出æ’件,å¯è®“你直接從iPhoto匯出相片至Piwigo圖庫,並建立新相冊';
$lang['Piwigo export plugin for Aperture'] = 'Apertureçš„Piwigo匯出æ’件';
@@ -862,16 +860,16 @@ $lang['Generate multiple size images'] = '產生多種大å°çš„圖åƒ';
$lang['Delete multiple size images'] = '刪除多種大å°çš„圖åƒ';
$lang['any visitor can see this album'] = '任何訪客都å¯ä»¥çœ‹åˆ°é€™æœ¬ç›¸å†Š';
$lang['visitors need to login and have the appropriate permissions to see this album'] = '訪客必須登錄並æ“有權é™æ‰èƒ½è§€çœ‹é€™æœ¬ç›¸å†Š';
-$lang['Groups and users'] = '組別和用戶';
-$lang['Permission granted for groups'] = '組別æ“有的權é™';
-$lang['Select groups...'] = 'é¸æ“‡çµ„別...';
-$lang['There is no group in this gallery.'] = '此畫廊內沒有組別';
+$lang['Groups and users'] = '群組別和用戶';
+$lang['Permission granted for groups'] = '群組別æ“有的權é™';
+$lang['Select groups...'] = 'é¸æ“‡ç¾¤çµ„別...';
+$lang['There is no group in this gallery.'] = '此畫廊內沒有群組。';
$lang['Permission granted for users'] = '用戶æ“有的權é™';
$lang['Select users...'] = 'é¸æ“‡ç”¨æˆ¶...';
-$lang['%u users have automatic permission because they belong to a granted group.'] = '%u 用戶因屬自動許å¯æŽˆæ¬Šçµ„別,所以自動æ“有權é™.';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '%u 用戶因屬自動許å¯æŽˆæ¬Šç¾¤çµ„別,所以自動æ“有權é™.';
$lang['include photos with lower privacy level'] = '包å«éš±ç§ç´šåˆ¥è¼ƒä½Žçš„相片';
$lang['custom'] = '自定義';
-$lang['No group is permitted to see this private album'] = '沒有組別有權é™è§€çœ‹æ­¤ç§äººç›¸å†Š';
+$lang['No group is permitted to see this private album'] = '沒有群組別有權é™è§€çœ‹æ­¤ç§äººç›¸å†Š';
$lang['Permission management'] = '權é™ç®¡ç†';
$lang['Photo sizes with crop'] = '相片剪è£';
$lang['The center of interest is the most meaningful zone in the photo.'] = '焦點是相片中最有æ„æ€çš„部份';
@@ -888,7 +886,7 @@ $lang['middle'] = '中間';
$lang['bottom left corner'] = '左下角';
$lang['bottom right corner'] = 'å³ä¸‹è§’';
$lang['Select a file'] = 'é¸æ“‡æª”案';
-$lang['add a new watermark'] = '添加一個新的浮水å°';
+$lang['add a new watermark'] = '增加一個新的浮水å°';
$lang['Apply watermark if width is bigger than'] = '使用浮水å°ï¼Œå‡å¦‚浮水å°å¯¬åº¦å¤§æ–¼';
$lang['Apply watermark if height is bigger than'] = '使用浮水å°ï¼Œå‡å¦‚浮水å°é«˜åº¦é«˜æ–¼';
$lang['Multiple Size'] = '多種大å°';
@@ -923,8 +921,8 @@ $lang['Name of the duplicate'] = 'å稱é‡è¤‡';
$lang['No order field selected'] = '未é¸å–排åºæ¬„ä½';
$lang['Source tag'] = '來æºæ¨™ç±¤';
$lang['Tag "%s" is now a duplicate of "%s"'] = '"%s" 標籤與 "%s" 標籤é‡è¤‡';
-$lang['between %d and %d pixels'] = '在%d和%dåƒç´ ä¹‹é–“';
-$lang['between %.2f and %.2f'] = '在%.2 f和%.2 f之間';
+$lang['between %d and %d pixels'] = '在 %d å’Œ %d åƒç´ ä¹‹é–“';
+$lang['between %.2f and %.2f'] = '在 %.2f 和 %.2f 之間';
$lang['Duplicate'] = 'é‡è¤‡';
$lang['Landscape'] = 'æ©«å‘';
$lang['Manage photos'] = '管ç†ç…§ç‰‡';
@@ -932,17 +930,45 @@ $lang['Manage the members'] = '會員管ç†';
$lang['Merge selected groups'] = 'åˆä½µé¸æ“‡ç¾¤çµ„';
$lang['Minimum width'] = '最å°å¯¬åº¦';
$lang['Minimum height'] = '最å°é«˜åº¦';
-$lang['No group selected, no action possible.'] = '尚未é¸å–組別,無法動作';
+$lang['No group selected, no action possible.'] = '尚未é¸å–群組別,無法動作';
$lang['No members to manage'] = '沒有會員å¯ä»¥ç®¡ç†';
$lang['Number of albums per page'] = 'æ¯é ç›¸æœ¬æ•¸é‡';
$lang['Panorama'] = '全景';
-$lang['Please select at least two groups'] = '請最少é¸æ“‡äºŒå€‹çµ„別';
+$lang['Please select at least two groups'] = '請最少é¸æ“‡äºŒå€‹ç¾¤çµ„別';
$lang['Portrait'] = '人åƒ';
$lang['Ratio'] = '比例';
$lang['Rename'] = 'é‡æ–°å‘½å';
-$lang['This group will be set to default'] = '該組別將被設置為é è¨­';
-$lang['This group will be unset to default'] = '該組別將被復原至é è¨­å€¼è©²';
-$lang['Type here the name of the new group'] = '在這輸入新的組別å稱';
+$lang['This group will be set to default'] = '該群組別將被設定為é è¨­';
+$lang['This group will be unset to default'] = '該群組別ä¸å†è¢«ä½¿ç”¨ç‚ºé è¨­';
+$lang['Type here the name of the new group'] = '在這輸入新的群組別å稱';
$lang['View in gallery'] = '以畫廊模å¼ç€è¦½';
$lang['Purge user cache'] = '清除用戶快å–';
+$lang['The picture dimensions will be reduced to %dx%d pixels.'] = '圖片的尺寸將減少到 %dx%d åƒç´ ã€‚';
+$lang['Resize after upload disabled due to the use of GD as graphic library'] = '由於使用了GD圖形程å¼ï¼Œä¸Šå‚³å¾Œèª¿æ•´å°ºå¯¸çš„功能已關閉。';
+$lang['Select at least one tag'] = 'é¸æ“‡è‡³å°‘一個標籤';
+$lang['Basic settings'] = '基本設置';
+$lang['General'] = '能用';
+$lang['Mail theme'] = '郵件主題';
+$lang['%d of %d users selected'] = '%d 到 %d ä½ç”¨æˆ¶é¸æ“‡';
+$lang['(filtered from %s total users)'] = '(總共%s 用戶被éŽæ¿¾ï¼‰';
+$lang['All %d users are selected'] = '所有%d的用戶都被é¸ä¸­';
+$lang['Change password'] = '更改密碼';
+$lang['Change username'] = '更改用戶å';
+$lang['Last visit on %s, %s.'] = '最後的訪å•åœ¨%s, %s。';
+$lang['Loading...'] = '加載中...';
+$lang['No matching user found'] = '沒有發ç¾åŒ¹é…的用戶';
+$lang['No user selected of %d users'] = '%d個用戶沒有用戶é¸æ“‡';
+$lang['No user selected, no action possible.'] = '沒有用戶é¸æ“‡ï¼Œæ²’有行動的å¯èƒ½ã€‚';
+$lang['Password updated'] = '更新密碼';
+$lang['Registered on %s, %s.'] = '註冊在%s, %s。';
+$lang['Show %s users'] = '顯示%s用戶';
+$lang['Showing %s to %s of %s users'] = '顯示%s的用戶從%s到%s';
+$lang['Update user'] = '更新用戶';
+$lang['User %s added'] = '用戶 %s添加';
+$lang['User %s updated'] = '用戶 %s更新';
+$lang['Users modified'] = '用戶修改';
+$lang['on the %d selected users'] = '%dçš„é¸å®šç”¨æˆ¶';
+$lang['Close user details'] = '關閉用戶詳細信æ¯';
+$lang['Open user details'] = '打開用戶詳細信æ¯';
+$lang['close'] = '關閉';
?> \ No newline at end of file
diff --git a/language/zh_TW/common.lang.php b/language/zh_TW/common.lang.php
index 2ac5d98ff..07d904ca0 100644
--- a/language/zh_TW/common.lang.php
+++ b/language/zh_TW/common.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,7 +22,7 @@
// +-----------------------------------------------------------------------+
/*
Language Name: 中文 (ç¹é«”) [TW]
-Version: 2.5.0
+Version: 2.6.0
Language URI: http://piwigo.org/ext/extension_view.php?eid=524
Author: Piwigo team
Author URI: http://piwigo.org
@@ -38,8 +38,8 @@ $lang_info['zero_plural'] = false;
$lang['%d Kb'] = '%d KB';
$lang['%d album updated'] = '%d 相冊已更新';
$lang['%d albums updated'] = '%d 相冊已更新';
-$lang['%d comment to validate'] = '%d æ¢ç”¨æˆ¶è©•è«–被確èª';
-$lang['%d comments to validate'] = '%d æ¢ç”¨æˆ¶è©•è«–被確èª';
+$lang['%d comment to validate'] = '%d 評論等待驗證';
+$lang['%d comments to validate'] = '%d 評論等待驗證';
$lang['%d new comment'] = '%d æ–°è©•è«–';
$lang['%d new comments'] = '%d æ–°è©•è«–';
$lang['%d comment'] = '%d è©•è«–';
@@ -55,17 +55,17 @@ $lang['All tags'] = '所有標籤';
$lang['Any tag'] = '任何標籤';
$lang['At least one listed rule must be satisfied.'] = '至少符åˆä¸€é …標準.';
$lang['Author'] = 'æ“有者';
-$lang['Albums'] = '類別';
+$lang['Albums'] = '相冊';
$lang['Album'] = '相冊';
$lang['Close this window'] = '關閉窗å£';
$lang['Complete RSS feed (photos, comments)'] = '完整RSS回饋(圖片, 評論等)';
$lang['Confirm Password'] = 'é‡è¤‡è¼¸å…¥å¯†ç¢¼';
-$lang['Connection settings'] = '連接設置';
-$lang['Login'] = '連接';
+$lang['Connection settings'] = '連線設定';
+$lang['Login'] = '登入';
$lang['Contact webmaster'] = 'è¯ç¹«ç¶²ç®¡';
-$lang['Create a new account'] = '新建帳號';
-$lang['Created on'] = '創建於';
-$lang['Creation date'] = '創建日期';
+$lang['Create a new account'] = '建立新的帳號';
+$lang['Created on'] = '建立於';
+$lang['Creation date'] = '建立日期';
$lang['Current password is wrong'] = '密碼錯誤';
$lang['Dimensions'] = '尺寸';
$lang['Display'] = '顯示';
@@ -74,46 +74,46 @@ $lang['Email address is missing. Please specify an email address.'] = '缺少郵
$lang['Email address'] = '郵箱地å€';
$lang['Enter your personnal informations'] = '輸入您的個人信æ¯';
$lang['Error sending email'] = '發é€éƒµä»¶å‡ºéŒ¯';
-$lang['File name'] = '文件å';
-$lang['File'] = '文件';
-$lang['Filesize'] = '文件大å°';
+$lang['File name'] = '檔案å稱';
+$lang['File'] = '檔案';
+$lang['Filesize'] = '檔案大å°';
$lang['Filter and display'] = 'éŽæ¿¾ä¸¦é¡¯ç¤º';
$lang['Filter'] = 'éŽæ¿¾';
$lang['Forgot your password?'] = '忘記密碼?';
-$lang['Go through the gallery as a visitor'] = '以éŠå®¢èº«ä»½ç€è¦½åœ–庫';
+$lang['Go through the gallery as a visitor'] = '以訪客身份ç€è¦½åœ–庫';
$lang['Help'] = '幫助';
-$lang['Identification'] = '身份鑒別';
-$lang['Photos only RSS feed'] = '圖片RSS';
+$lang['Identification'] = '登入資料';
+$lang['Photos only RSS feed'] = '圖片RSS訂閱';
$lang['Keyword'] = 'é—œéµå­—';
$lang['Links'] = 'éˆæŽ¥';
$lang['N/A'] = 'ä¸å­˜åœ¨';
-$lang['New on %s'] = '新創於 %s';
+$lang['New on %s'] = '新建立於 %s';
$lang['Notification'] = '通知';
$lang['Number of items'] = '總數';
-$lang['Original dimensions'] = '原始大å°';
+$lang['Original dimensions'] = '原始的尺寸';
$lang['Password forgotten'] = '忘記密碼';
$lang['Password'] = '密碼';
$lang['Post date'] = '上傳日期';
$lang['Posted on'] = '上傳於';
-$lang['Profile'] = '用戶信æ¯';
+$lang['Profile'] = '個人資料';
$lang['Quick connect'] = '快速連接';
-$lang['RSS feed'] = 'RSSæµ';
+$lang['RSS feed'] = 'RSS訂閱';
$lang['Register'] = '註冊';
$lang['Registration'] = '註冊';
$lang['Related tags'] = 'é—œè¯æ¨™ç±¤';
-$lang['Reset'] = 'é‡æ–°è¨­ç½®';
+$lang['Reset'] = 'é‡è¨­';
$lang['Retrieve password'] = 'é‡æ–°å–得密碼';
-$lang['Search rules'] = 'æœç´¢è¦å‰‡';
-$lang['Search tags'] = 'æœç´¢æ¨™ç±¤';
-$lang['Search'] = 'æœç´¢';
+$lang['Search rules'] = 'æœå°‹æ¢ä»¶';
+$lang['Search tags'] = 'æœå°‹ç†±é–€æ¨™ç±¤';
+$lang['Search'] = 'æœå°‹';
$lang['display available tags'] = '查看ç¾æœ‰æ¨™ç±¤';
$lang['Since'] = '自從';
$lang['Sort by'] = '排åº';
$lang['Sort order'] = '排åºè¦å‰‡';
$lang['Tag'] = '標籤';
-$lang['Tags'] = '標籤簇';
-$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSSæè¦ï¼Œå¾žé€™å€‹ç¶²ç«™ä¸Šæ供新事件的通知:新相片,更新相冊,新評論。è¦ä½¿ç”¨ RSS 閱讀器查看new photos, updated albums, new comments. To be used with a RSS feed reader.';
-$lang['Unknown feed identifier'] = '未知æµæ¨™è­˜';
+$lang['Tags'] = '標籤';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS feedæä¾›å°æœ¬ç¶²ç«™çš„新事件:新的照片,更新的相冊,新的æ„見的通知。請使用RSS閱讀器。';
+$lang['Unknown feed identifier'] = '未知的訂閱識別碼';
$lang['User comments'] = '用戶評論';
$lang['Username'] = '用戶å';
$lang['Visits'] = '訪å•';
@@ -135,27 +135,27 @@ $lang['Best rated'] = '得票最高';
$lang['display best rated photos'] = '顯示得票最高的圖片';
$lang['Calendar'] = '日曆';
$lang['All'] = '所有';
-$lang['display each day with photos, month per month'] = '按時間順åºä¾†é¡¯ç¤º';
-$lang['View'] = '視圖';
+$lang['display each day with photos, month per month'] = '顯示æ¯ä¸€å¤©çš„照片,æ¯æœˆçš„月份';
+$lang['View'] = '檢視';
$lang['chronology_monthly_calendar'] = '月曆';
-$lang['chronology_monthly_list'] = '月清單';
-$lang['chronology_weekly_list'] = '周清單';
+$lang['chronology_monthly_list'] = 'æ¯æœˆæ¸…å–®';
+$lang['chronology_weekly_list'] = 'æ¯å‘¨æ¸…å–®';
$lang['Click here if your browser does not automatically forward you'] = '如果你的ç€è¦½å™¨ä¸æ”¯æŒè‡ªå‹•è½‰é ï¼Œè«‹æŒ‰é€™è£¡ã€‚';
$lang['comment date'] = '評論日期';
$lang['Comment'] = 'è©•è«–';
-$lang['Your comment has been registered'] = 'è©•è«–å·²ä¿å­˜';
+$lang['Your comment has been registered'] = '評論發表æˆåŠŸ';
$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'åçŒæ°´ç³»çµ± : è«‹ç¨å€™å†åŠ è©•è«–';
$lang['Your comment has NOT been registered because it did not pass the validation rules'] = '由於ä¸ç¬¦åˆæ ¼å¼è¦å®šï¼Œä½ çš„è©•è«–ä¸èƒ½è¢«ä¿å­˜';
$lang['An administrator must authorize your comment before it is visible.'] = '評論需經管ç†å“¡ç¢ºèªæ‰èƒ½é¡¯ç¤ºåœ¨é é¢è£¡ã€‚';
-$lang['This login is already used by another user'] = '用戶å已存在';
+$lang['This login is already used by another user'] = '此登入資訊已被å¦ä¸€å€‹ç”¨æˆ¶ä½¿ç”¨';
$lang['Comments'] = 'è©•è«–';
-$lang['Add a comment'] = '加評論';
-$lang['created after %s (%s)'] = '創建於 %s (%s) 之後';
-$lang['created before %s (%s)'] = '創建於 %s (%s) 之å‰';
-$lang['created between %s (%s) and %s (%s)'] = '創建於 %s (%s) 和 le %s (%s) 之間';
-$lang['created on %s'] = '創建於 %s';
-$lang['Customize'] = '自定義';
-$lang['Your Gallery Customization'] = '自定義é æ¨™é¡Œ';
+$lang['Add a comment'] = '新增評論';
+$lang['created after %s (%s)'] = '建立於 %s (%s) 之後';
+$lang['created before %s (%s)'] = '建立於 %s (%s) 之å‰';
+$lang['created between %s (%s) and %s (%s)'] = '建立於 %s (%s) 和 %s (%s) 之間';
+$lang['created on %s'] = '建立於 %s';
+$lang['Customize'] = 'å好設定';
+$lang['Your Gallery Customization'] = 'å好設定你的Gallery';
$lang['day'][0] = '星期日';
$lang['day'][1] = '星期一';
$lang['day'][2] = '星期二';
@@ -163,7 +163,7 @@ $lang['day'][3] = '星期三';
$lang['day'][4] = '星期四';
$lang['day'][5] = '星期五';
$lang['day'][6] = '星期六';
-$lang['Default'] = '默èª';
+$lang['Default'] = 'é è¨­';
$lang['delete this photo from your favorites'] = '從收è—夾中刪除此圖片';
$lang['Delete'] = '刪除';
$lang['descending'] = 'é™åº';
@@ -177,29 +177,29 @@ $lang['display your favorites photos'] = '顯示收è—圖片';
$lang['Favorites'] = '收è—';
$lang['First'] = '首é ';
$lang['The gallery is locked for maintenance. Please, come back later.'] = '系統維護,請ç¨å€™å†è©¦ã€‚';
-$lang['Page generated in'] = 'é é¢å‰µå»ºæ™‚é–“';
-$lang['guest'] = 'éŠå®¢';
-$lang['Hello'] = '你好';
+$lang['Page generated in'] = 'é é¢å»ºç«‹æ™‚é–“';
+$lang['guest'] = '訪客';
+$lang['Hello'] = '您好';
$lang['available for administrators only'] = 'åªé™æ–¼ç®¡ç†è€…';
-$lang['display this album'] = '顯示此相冊根目錄下的相片';
+$lang['display this album'] = '顯示此相冊';
$lang['display last user comments'] = '查看最新用戶評論';
-$lang['customize the appareance of the gallery'] = '個性化設置';
-$lang['search'] = 'æœç´¢';
+$lang['customize the appareance of the gallery'] = '個性化設定 Gallery';
+$lang['search'] = 'æœå°‹';
$lang['Home'] = '主é ';
$lang['in this album'] = '在此相冊裡';
$lang['in %d sub-album'] = '在 %d å­ç›¸å†Šè£¡';
-$lang['in %d sub-albums'] = '在n %d å­ç›¸å†Šè£¡';
+$lang['in %d sub-albums'] = '在 %d å­ç›¸å†Šè£¡';
$lang['included'] = '包括';
$lang['Invalid password!'] = '密碼ä¸æ­£ç¢º!';
$lang['Language'] = '語言';
$lang['last %d days'] = '最近%d天';
$lang['Last'] = '最後';
-$lang['Logout'] = '註銷';
+$lang['Logout'] = '登出';
$lang['obligatory'] = '必需';
-$lang['display a calendar by creation date'] = '通éŽå‰µå»ºæ™‚間顯示日曆';
+$lang['display a calendar by creation date'] = '通éŽå»ºç«‹æ™‚間顯示日曆';
$lang['display all photos in all sub-albums'] = '顯示所有相冊和å­ç›¸å†Šçš„相片';
$lang['return to normal view mode'] = '返回到普通模å¼é¡¯ç¤º';
-$lang['display a calendar by posted date'] = '通éŽç™¼é€æ™‚間來顯示日曆';
+$lang['display a calendar by posted date'] = '顯示日曆所發布日期';
$lang['month'][10] = 'å月';
$lang['month'][11] = 'å一月';
$lang['month'][12] = 'å二月';
@@ -214,8 +214,8 @@ $lang['month'][8] = '八月';
$lang['month'][9] = 'ä¹æœˆ';
$lang['Most visited'] = '最å—喜歡';
$lang['display most visited photos'] = '顯示查看次數最多的圖片';
-$lang['Unknown identifier'] = '帳戶ä¸å­˜åœ¨';
-$lang['New password'] = '新密碼';
+$lang['Unknown identifier'] = '未知的識別碼';
+$lang['New password'] = '新的密碼';
$lang['Rate this photo'] = 'å°åœ–片投票';
$lang['Next'] = '下一é ';
$lang['no rate'] = '沒有被投票';
@@ -225,9 +225,9 @@ $lang['password updated'] = '密碼已更新';
$lang['Recent period must be a positive integer value'] = 'å†æ¬¡ç™¼è¡¨é–“隔時間必須是正整數';
$lang['photo'] = '圖片';
$lang['Click on the photo to see it in high definition'] = '點擊查看大圖片';
-$lang['Show file metadata'] = '顯示文件的元數據';
-$lang['Powered by'] = '基於';
-$lang['Preferences'] = '使用å好';
+$lang['Show file metadata'] = '顯示檔案的元數據';
+$lang['Powered by'] = '本站由';
+$lang['Preferences'] = 'å好設定';
$lang['Previous'] = 'å‰é ';
$lang['Random photos'] = '隨機圖片';
$lang['display a set of random photos'] = '隨機顯示圖片';
@@ -242,72 +242,70 @@ $lang['login mustn\'t end with a space character'] = '用戶åä¸èƒ½ä»¥ç©ºæ ¼çµ
$lang['login mustn\'t start with a space character'] = '用戶åä¸èƒ½ä»¥ç©ºæ ¼é–‹é ­';
$lang['this login is already used'] = '用戶å已存在';
$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = '郵件地å€æ ¼å¼å¿…須符åˆæ¨™æº–郵件地å€æ ¼å¼ xxx@yyy.eee (例如 : jack@altern.org)';
-$lang['please enter your password again'] = '請輸入新密碼';
-$lang['Auto login'] = '自動連接';
+$lang['Auto login'] = '自動登入';
$lang['remove this tag from the list'] = '刪除此標籤';
-$lang['representative'] = '代ç†äºº';
-$lang['Search for Author'] = 'æœç´¢ä¸Šå‚³è€…';
-$lang['Search in albums'] = '在相冊裡æœç´¢';
-$lang['Search by date'] = '通éŽæ—¥æœŸæŸ¥è©¢';
+$lang['representative'] = '相冊縮略圖';
+$lang['Search for Author'] = '作者æœå°‹';
+$lang['Search in albums'] = '在相冊裡æœå°‹';
+$lang['Search by date'] = '按日期æœå°‹';
$lang['Date'] = '開始日期';
$lang['End-Date'] = '最終日期';
$lang['Kind of date'] = '日期類型';
$lang['Search for words'] = 'é—œéµå­—';
-$lang['Search for all terms'] = '以與模å¼æŸ¥è©¢';
-$lang['Search for any term'] = '以或模å¼æŸ¥è©¢';
-$lang['Empty query. No criteria has been entered.'] = '查詢語å¥ä¸èƒ½ç‚ºç©º';
-$lang['Search results'] = 'æœç´¢çµæžœ';
-$lang['Search in sub-albums'] = '在å­ç›¸å†Šè£¡æœç´¢';
-$lang['searched words : %s'] = 'æœç´¢è©ž : %s';
+$lang['Search for all terms'] = 'æœå°‹æ‰€æœ‰æ¢æ¬¾';
+$lang['Search for any term'] = 'æœå°‹ä»»ä½•æ¢æ¬¾';
+$lang['Empty query. No criteria has been entered.'] = '查詢語å¥ä¸èƒ½ç‚ºç©ºã€‚';
+$lang['Search results'] = 'æœå°‹çµæžœ';
+$lang['Search in sub-albums'] = '在å­ç›¸å†Šè£¡æœå°‹';
+$lang['searched words : %s'] = 'æœå°‹è©ž : %s';
$lang['Contact'] = 'è¯ç¹«';
-$lang['set as album representative'] = '設置一個相冊代表';
+$lang['set as album representative'] = '設定為相冊縮略圖';
$lang['Show number of comments'] = '顯示評論總數';
-$lang['Show number of hits'] = '顯示查看次數';
+$lang['Show number of hits'] = '顯示點擊次數';
$lang['slideshow'] = '幻燈片放映';
$lang['stop the slideshow'] = 'åœæ­¢å¹»ç‡ˆç‰‡æ”¾æ˜ ';
-$lang['Specials'] = '特別類';
-$lang['SQL queries in'] = 'sql查詢語å¥';
+$lang['Specials'] = '相簿特別é¸å–®';
+$lang['SQL queries in'] = 'sql 查詢語å¥';
$lang['display only recently posted photos'] = 'åªé¡¯ç¤ºæœ€è¿‘內容';
$lang['return to the display of all photos'] = '返回到所有圖片é é¢';
$lang['the beginning'] = '開始';
-$lang['Interface theme'] = '主題';
$lang['Thumbnails'] = '縮略圖';
-$lang['Menu'] = 'èœå–®';
-$lang['A comment on your site'] = '網站評論';
+$lang['Menu'] = 'é¸å–®';
+$lang['A comment on your site'] = '在您的網站上的評論';
$lang['today'] = '今天';
$lang['Update your rating'] = '更改投票';
$lang['the username must be given'] = '缺少用戶å';
-$lang['useful when password forgotten'] = '忘記密碼';
-$lang['Quick search'] = '快速æœç´¢';
+$lang['useful when password forgotten'] = '在情æ³ä¸‹ï¼Œå¿˜è¨˜äº†å¯†ç¢¼æœ‰ç”¨çš„';
+$lang['Quick search'] = '快速æœå°‹';
$lang['Connected user: %s'] = '在線用戶: %s';
$lang['IP: %s'] = 'IP地å€: %s';
$lang['Browser: %s'] = 'ç€è¦½å™¨: %s';
$lang['Author: %s'] = '上傳者: %s';
$lang['Comment: %s'] = 'è©•è«–: %s';
-$lang['Comment by %s'] = '評論人 %s';
+$lang['Comment by %s'] = '評論者 %s';
$lang['User: %s'] = '用戶: %s';
$lang['Email: %s'] = 'é›»å­éƒµä»¶: %s';
$lang['Admin: %s'] = '管ç†å“¡: %s';
$lang['Registration of %s'] = '註冊 %s';
$lang['Album: %s'] = '相冊: %s';
-$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = '如果éŠå®¢å常æ“有普通用戶æ‰æ“有狀態,請å‘網絡管ç†å“¡å ±å‘Šã€‚';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = '如果"éŠå®¢"å常æ“有普通用戶æ‰æ“有狀態,é è¨­ç‹€æ…‹å°‡è¢«ä½¿ç”¨ã€‚請通知管ç†å“¡ã€‚';
$lang['this email address is already in use'] = '郵箱地å€å·²å­˜åœ¨';
$lang['Album results for'] = '相冊的çµæžœ';
$lang['Tag results for'] = '符åˆæŸ¥è©¢æ¨™ç±¤çµæžœ';
$lang['from %s to %s'] = '從 %s 到 %s';
-$lang['Play of slideshow'] = '播放';
-$lang['Pause of slideshow'] = 'æš«åœ';
+$lang['Play of slideshow'] = '播放幻燈片';
+$lang['Pause of slideshow'] = 'æš«åœå¹»ç‡ˆç‰‡';
$lang['Repeat the slideshow'] = 'é‡è¤‡æ’­æ”¾';
$lang['Not repeat the slideshow'] = 'åœæ­¢é‡è¤‡æ’­æ”¾';
$lang['Reduce diaporama speed'] = '減慢播放速度';
$lang['Accelerate diaporama speed'] = '加快播放速度';
-$lang['Submit'] = '確èª';
+$lang['Submit'] = 'æ交';
$lang['Yes'] = '是';
$lang['No'] = 'å¦';
$lang['%d photo']='%d 圖片';
$lang['%d photos']='%d 圖片';
-$lang['%d photo is also linked to current tags'] = '%d 圖片åŒæ™‚與當å‰æ¨™ç±¤ç›¸é—œ';
-$lang['%d photos are also linked to current tags'] = '%d 圖片åŒæ™‚與當å‰æ¨™ç±¤ç›¸é—œ';
+$lang['%d photo is also linked to current tags'] = '%d 圖片åŒæ™‚與目å‰æ¨™ç±¤ç›¸é—œ';
+$lang['%d photos are also linked to current tags'] = '%d 圖片åŒæ™‚與目å‰æ¨™ç±¤ç›¸é—œ';
$lang['display photos linked to this tag'] = 'åªæŸ¥çœ‹å’Œé€™æ¨™ç±¤ç›¸é—œçš„圖片';
$lang['photos posted during the last %d days'] = '圖片在最近%d天裡更新';
$lang['Piwigo Help'] = 'Piwigo幫助';
@@ -317,9 +315,9 @@ $lang['letters'] = 'å­—æ¯';
$lang['show tag cloud'] = '顯示標籤雲';
$lang['cloud'] = '雲';
$lang['Are you sure?'] = '確定?';
-$lang['Reset to default values'] = 'é‡ç½®ç‚ºé»˜èªå€¼';
+$lang['Reset to default values'] = 'é‡è¨­ç‚ºé è¨­å€¼';
$lang['delete all photos from your favorites'] = '刪除您的收è—裡所有相片';
-$lang['Sent by'] = 'Sent by';
+$lang['Sent by'] = '發é€è€…';
$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = '您的ç€è¦½å™¨å·²é—œé–‰æˆ–者ä¸æ”¯æŒCookies. 您必須開啟 cookies æ‰èƒ½ç™»éŒ„.';
$lang['Edit a comment'] = '修改一個評論';
$lang['(!) This comment requires validation'] = '(!) 此評論需è¦å¯©æ ¸';
@@ -328,23 +326,23 @@ $lang['Welcome to your Piwigo photo gallery!'] = '歡迎來到您的 Piwigo ç•«å
$lang['... or browse your empty gallery'] = '... 或者ç€è¦½æ‚¨çš„空畫廊';
$lang['... or please deactivate this message, I will find my way by myself'] = '... 或者å–消此信æ¯ï¼Œæˆ‘會自己找到我的方法';
$lang['Hello %s, your Piwigo photo gallery is empty!'] = '您好 %s, 您的 Piwigo 畫廊是空的!';
-$lang['I want to add photos'] = '我想添加相片';
+$lang['I want to add photos'] = '我想增加相片';
$lang['Manage this user comment: %s'] = '管ç†æ­¤ç”¨æˆ¶çš„è©•è«–: %s';
$lang['This author modified following comment:'] = '此作者修改了以下的評論:';
$lang['This author removed the comment with id %d'] = '此作者刪除了 id 為 %d 的評論';
$lang['Sent by'] = '發é€äºº';
-$lang['html tags are not allowed in login'] = 'loginå…§ä¸å…許有html標籤';
+$lang['html tags are not allowed in login'] = 'html標籤中ä¸å…許登入';
$lang['%d rates'] = '%d 評價';
$lang['Rating score'] = '評價得分';
$lang['The number of photos per page must be a not null scalar'] = 'æ¯é çš„照片的數é‡ä¸èƒ½ç‚ºé›¶';
$lang['Number of photos per page'] = 'æ¯é çš„照片數é‡';
$lang['Invalid username or email'] = '無效的用戶å稱或電å­éƒµä»¶';
-$lang['Password reset is not allowed for this user'] = 'ä¸å…許此用戶密碼é‡ç½®';
-$lang['User "%s" has no email address, password reset is not possible']= '查無用戶“%â€ä¹‹é›»å­éƒµä»¶åœ°å€ï¼Œç„¡æ³•é‡ç½®å¯†ç¢¼';
+$lang['Password reset is not allowed for this user'] = 'ä¸å…許此用戶é‡è¨­å¯†ç¢¼';
+$lang['User "%s" has no email address, password reset is not possible'] = '查無用戶 "ï¼…" 之電å­éƒµä»¶åœ°å€ï¼Œç„¡æ³•é‡è¨­å¯†ç¢¼';
$lang['Someone requested that the password be reset for the following user account:'] = '有人è¦æ±‚é‡ç½®ä»¥ä¸‹ç”¨æˆ¶çš„密碼:';
$lang['Username "%s" on gallery %s'] = 'ï¼…s 畫廊中的“%Sâ€ç”¨æˆ¶ ';
$lang['To reset your password, visit the following address:'] = 'è¦é‡ç½®å¯†ç¢¼ï¼Œè«‹è‡³ä»¥ä¸‹ç¶²å€:';
-$lang['If this was a mistake, just ignore this email and nothing will happen.'] = '如果這是個錯誤或您並未è¦æ±‚é‡ç½®å¯†ç¢¼ï¼Œè«‹å¿½ç•¥æ­¤é›»å­éƒµä»¶ï¼Œæ‚¨çš„帳戶將ä¸æœƒä½œä»»ä½•æ›´æ”¹';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = '如果這是個錯誤或您並未è¦æ±‚é‡ç½®å¯†ç¢¼ï¼Œè«‹å¿½ç•¥æ­¤é›»å­éƒµä»¶ï¼Œæ‚¨çš„帳戶將ä¸æœƒä½œä»»ä½•æ›´æ”¹ã€‚';
$lang['Password Reset'] = 'é‡è¨­å¯†ç¢¼';
$lang['Check your email for the confirmation link'] = '檢查您的電å­éƒµä»¶ä¸¦å‰å¾€ç¢ºèªé€£çµ ';
$lang['Invalid key'] = 'éµå…¥å­—元無效';
@@ -365,26 +363,26 @@ $lang['Successfully registered, you will soon receive an email with your connect
$lang['Username modification'] = '用戶å稱修改';
$lang['Your username has been successfully changed to : %s'] = '您的用戶å稱已æˆåŠŸä¿®æ”¹ç‚º : %s';
$lang['square'] = '正方形';
-$lang['thumb'] = 'å°åœ–';
-$lang['small'] = 'å°';
-$lang['medium'] = '中';
-$lang['large'] = '大';
-$lang['xlarge'] = 'XL';
-$lang['xxlarge'] = 'XXL';
-$lang['Original'] = '原始大å°';
-$lang['Thank you for registering at %s!'] = 'æ„Ÿè¬æ‚¨åœ¨%s!註冊';
+$lang['thumb'] = '縮略圖';
+$lang['small'] = 'S - å°';
+$lang['medium'] = 'M - 中';
+$lang['large'] = 'L - 大';
+$lang['xlarge'] = 'XL - 特大號';
+$lang['xxlarge'] = 'XXL - 巨大號';
+$lang['Original'] = '原始';
+$lang['Thank you for registering at %s!'] = 'æ„Ÿè¬æ‚¨åœ¨ %s! 註冊';
$lang['Here are your connection settings'] = '以下是您的連çµè¨­å®š';
$lang['Password: %s'] = '密碼: %s';
$lang['Username: %s'] = '用戶å稱: %s';
-$lang['If you think you\'ve received this email in error, please contact us at %s'] = ' 如您èªç‚ºæ­¤é›»å­éƒµä»¶ä¹‹ç™¼é€ç‚ºéŒ¯èª¤ï¼Œè«‹è¯ç¹«æˆ‘們:%s';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = ' 如您èªç‚ºæ­¤é›»å­éƒµä»¶ä¹‹ç™¼é€ç‚ºéŒ¯èª¤ï¼Œè«‹è¯ç¹«æˆ‘們: %s';
$lang['Show oldest comments first'] = '顯示最舊的評論在最å‰é¢';
$lang['Show latest comments first'] = '顯示最新的評論在最å‰é¢';
$lang['Photo sizes'] = '圖片大å°';
-$lang['View in'] = '檢視';
+$lang['View in'] = '檢視中';
$lang['Mobile'] = '移動';
$lang['Desktop'] = 'æ¡Œé¢';
-$lang['2small'] = '極å°';
-$lang['xsmall'] = '特å°';
+$lang['2small'] = 'XXS - 極å°';
+$lang['xsmall'] = 'XS - 超å°è™Ÿ';
$lang['File name, A &rarr; Z'] = '檔案å稱, A &rarr; Z';
$lang['File name, Z &rarr; A'] = '檔案å稱, Z &rarr; A';
$lang['Photo title, A &rarr; Z'] = '相片標題, A &rarr; Z';
@@ -413,4 +411,12 @@ $lang['Username is mandatory'] = '用戶å為必填';
$lang['Website'] = '網é ';
$lang['Your website URL is invalid'] = '你的網å€ç„¡æ•ˆ';
$lang['mandatory'] = 'å¿…å¡«';
+$lang['Email'] = 'é›»å­éƒµä»¶';
+$lang['First Page'] = '第一é ';
+$lang['Go back to the album'] = '返回相冊';
+$lang['Last Page'] = '最後一é ';
+$lang['Password is missing. Please enter the password.'] = '密碼沒有輸入,請輸入密碼。';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = '密碼確èªæœªå®Œæˆï¼Œè«‹ç¢ºèªæ‰€é¸å®šçš„密碼。';
+$lang['%d photos per page'] = 'æ¯é  %d 相片';
+$lang['Theme'] = '主題';
?> \ No newline at end of file
diff --git a/language/zh_TW/help/cat_modify.html b/language/zh_TW/help/cat_modify.html
new file mode 100755
index 000000000..a8e021d52
--- /dev/null
+++ b/language/zh_TW/help/cat_modify.html
@@ -0,0 +1,127 @@
+<h2>編輯相本</h2>
+
+<h3>相關資訊</h3>
+
+<ul>
+
+ <li><strong>å稱</strong>: 為相本é‡æ–°å‘½å (實際相本的附加虛擬代稱).</li>
+
+ <li><strong>簡介</strong>: 以簡短的文字為該相本內容åšç°¡çŸ­æ述,
+ 這些文字將顯示於縮圖é é¢çš„下方。</li>
+
+</ul>
+
+<h3>移動</h3>
+
+<p>若該相本為虛擬的,您將å¯ä»¥ç§»å‹•å®ƒã€‚移動該相本å³ç‚ºæ”¹è®Šå®ƒçš„上層相本</p>
+
+<h3>é¸é …</h3>
+
+<ul>
+
+ <li><strong>訪å•é¡žåž‹</strong>: 權é™ç®¡ç†ã€‚若您設定了一本ç§äººç›¸æœ¬ï¼Œæ‰€æœ‰é™„屬於它的å­ç›¸æœ¬ä¹Ÿå°‡è½‰ç‚ºç§äººæ€§è³ªã€‚若您將一本相簿設定為公開性質,則它的上層相本也將轉為公開性質。</li>
+
+ <li><strong>鎖定</strong>: 該相本與其內的å­ç›¸æœ¬éƒ½å°‡æš«æ™‚被關閉以進行維護。</li>
+
+ <li><strong>回應</strong>: 讓使用者能夠é‡å°è©²ç›¸æœ¬åšå‡ºå›žæ‡‰ã€‚</li>
+
+</ul>
+
+<p>You can also manage these options on the "Properties"
+management screen (screens <span
+class="pwgScreen">Comments</span>, <span class="pwgScreen">Lock</span>,
+<span class="pwgScreen">Public/Private</span>, <span
+class="pwgScreen">Representative</span> available from <span
+class="pwgScreen">Administration &raquo; Albums &raquo; Properties</span>).</p>
+
+<h3>Sort order</h3>
+
+<p>Use the default images sort order.</p>
+
+<p>Indicate whether this sort order will apply to subalbums also.</p>
+
+<p>Select specific sorting criteria to be used with this album.</p>
+<ul>
+<li><strong>Creation date</strong>: Photo shooting date</li>
+<li><strong>Post date</strong>: Synchronization date</li>
+<li><strong>Average rate (*)</strong>: Average rate could be changed by the visitor rating</li>
+<li><strong>Most visited (*)</strong>: The current visit might change the most visited order</li>
+<li><strong>File name</strong>: Name given in information field</li>
+<li><strong>Id</strong>: Internal Id (recent categories have an higher id than previous ones.</li>
+
+</ul>
+<p><strong>(*)</strong>Warning: Be sure to test these sort orders by yourself as they can give unexpected results.</p>
+
+
+<h3>Representant</h3>
+
+<p>The album representative is the thumbnail displayed on the main page (<span class="pwgScreen">category.php</span>) to represent
+the album when
+it contains only sub-albums and no direct photo (just as the root album).</p>
+photo of a album :</p>
+
+<ul>
+
+ <li><span class="pwgScreen">Photo page</span>: one of the action buttons let you set the current photo as the representative for the
+ displayed album. This button is available only for administrators.</li>
+
+ <li><span class="pwgScreen">Modify informations about a photo</span> in
+ administration. This screen can be reached from <span
+ class="pwgScreen">picture.php</span> or <span class="pwgScreen">Batch
+ management</span> in <em>unit mode</em>. See the help of this screen for
+ details.</li>
+
+ <li><span class="pwgScreen">Administration &raquo; Albums &raquo; Properties,
+ Representative</span>. See the help of this screen for details.</li>
+
+ <li><span class="pwgScreen">Edit album</span> (the present screen).</li>
+
+</ul>
+
+<p>The choice of a representative depends on the
+<code>allow_random_representative</code> configuration parameter (see <span
+class="filename">include/config_default.inc.php</span>).</p>
+
+<p>In default mode (<code>allow_random_representative</code> set to false),
+each album containing at least one element is represented by a fixed
+element. Once set (at album creation), the representative changes only
+when an administrator ask for it. If the representative is not appropriate,
+you can ask to <strong>Find a new representant by random</strong>.</p>
+
+<p>If the <code>allow_random_representative</code> configuration parameter is
+set to true, a category containing photos may have no fixed
+representant. Just use <strong>Delete representant</strong> button.</p>
+
+<p>If the album contains only sub-albums and no photo, it can nonetheless be represented by any element thanks to <span class="pwgScreen">Modify
+informations about a photo</span> screen. The only option on the current screen
+is the <strong>Delete representant</strong> button.</p>
+
+<h3>Link all album photos to a new album</h3>
+
+<ul>
+
+<li><strong>Virtual album name</strong>: Name of the new album to be created,
+all photos of the current category will be linked to the new one.</li>
+
+<li><strong>Parent album</strong>: Where the new album will be,
+leave empty to create it at root.</li>
+
+</ul>
+
+<h3>Link all album photos to existing albums</h3>
+
+<ul>
+
+<li><strong>Albums</strong>: Choose the destination album.</li>
+
+</ul>
+
+<h3>Send an information email to group members</h3>
+
+<ul>
+
+<li><strong>Group</strong>: recipients group</li>
+
+<li><strong>Mail content</strong>: Free text to send to them.</li>
+
+</ul> \ No newline at end of file
diff --git a/language/zh_TW/help/cat_move.html b/language/zh_TW/help/cat_move.html
new file mode 100755
index 000000000..2c6b11163
--- /dev/null
+++ b/language/zh_TW/help/cat_move.html
@@ -0,0 +1,14 @@
+<h2>移動虛擬相冊</h2>
+
+<p>åªæœ‰è™›æ“¬ç›¸å†Šå¯ä»¥æœ‰ä¸€å€‹æ–°çš„父相冊</p>
+
+<h3>虛擬相冊移動</h​​3>
+
+<p>é¸æ“‡æ‚¨è¦ç§»å‹•çš„一個或多個虛擬相冊。
+如果列表是空的,這æ„味著你還沒有創建一個</p>
+
+<h3>新的父相冊</h3>
+
+<p>é¸æ“‡æ–°çš„父相冊(虛擬或物ç†ï¼‰ã€‚
+如果你ä¸é¸æ“‡ä»»ä½•çˆ¶ç›¸å†Šï¼Œé¸æ“‡çš„虛擬相冊將被移動到根目錄。
+一個相冊ä¸èƒ½æ¬é€²è‡ªå·±æœ¬èº«ï¼Œæˆ–它的一個å­ç›¸å†Š</p> \ No newline at end of file
diff --git a/language/zh_TW/help/cat_options.html b/language/zh_TW/help/cat_options.html
new file mode 100755
index 000000000..f88e35e30
--- /dev/null
+++ b/language/zh_TW/help/cat_options.html
@@ -0,0 +1,22 @@
+<h2>相冊é¸é …</h2>
+
+<p>一次管ç†æ•¸å€‹ç›¸å†Šçš„é¸é …。</p>
+
+<dl>
+
+<dt>è©•è«–</dt>
+<dd>如果它所屬相冊的留言被啟用,照片å¯ä»¥æ”¶åˆ°æ‚¨çš„訪å•è€…æ„見</dd>
+
+<dt>鎖</dt>
+<dd>鎖定相冊來åœç”¨ç¶­ä¿®ã€‚åªæœ‰ç®¡â€‹â€‹ç†å“¡å¯ä»¥åœ¨ç›¸å†Šä¸­æŸ¥çœ‹ä»–們</dd>
+
+<dt>公共 / ç§äºº</dt>
+<dd>一旦相冊æˆç‚ºç§äººçš„,將訪å•æ¬Šé™çµ¦æŸäº›ç”¨æˆ¶å’Œçµ„</dd>
+
+<dt>代表</dt>
+<dd>當你設置的é…置被設定,此é¸é …是啟動的
+<code>å…許隨機代表</code> (看 <span
+ class="filename">include/config_defaults.inc.php</span>) 為
+<em>真</em>. æ¯å€‹ç›¸å†Šå¯ä»¥è¡¨ç¤ºç”±éš¨æ©Ÿç…§ç‰‡æˆ–由所é¸æ“‡çš„照片作為一個ç¨ç‰¹çš„代表。</dd>
+
+</dl> \ No newline at end of file
diff --git a/language/zh_TW/help/cat_perm.html b/language/zh_TW/help/cat_perm.html
new file mode 100755
index 000000000..f465ad38a
--- /dev/null
+++ b/language/zh_TW/help/cat_perm.html
@@ -0,0 +1,14 @@
+<h2>編輯相冊權é™</h2>
+
+<p>這個å±å¹•åƒ…å¯ç”¨æ–¼ç§äººç›¸å†Šã€‚在這裡,你å¯ä»¥é¸æ“‡
+用戶和用戶組授權一個相冊。</p>
+
+<h3>組</h3>
+
+<p>
+您å¯ä»¥æ‹’絕或授予組訪å•ç•¶å‰ç›¸å†Šã€‚通éŽä¿®æ”¹
+組授權,屬於這些組的用戶將被拒絕或授予訪å•è©²ç›¸å†Šã€‚</p>
+
+<h3>用戶</h3>
+
+<p>您å¯ä»¥æ‹’絕或å…許單個用戶的訪å•ã€‚å³å±¬æ–¼æŸç”¨æˆ¶çš„組,å¯ä»¥ç”¨ç•°å¸¸ä¾†æ‹’絕訪å•ã€‚</p> \ No newline at end of file
diff --git a/language/zh_TW/help/configuration.html b/language/zh_TW/help/configuration.html
new file mode 100755
index 000000000..96bbe7d74
--- /dev/null
+++ b/language/zh_TW/help/configuration.html
@@ -0,0 +1,107 @@
+<h2>é…ç½®</h2>
+
+<p>這個畫é¢è®“管ç†å“¡åšåŸºæœ¬ç•«å»Šé…置。事實上,這個畫é¢åªé¡¯ç¤ºç°¡å–®çš„é…ç½®åƒæ•¸ï¼Œå°æ–¼çµ•å¤§å¤šæ•¸çš„管ç†å“¡ï¼Œæ‡‰è©²æ˜¯è¶³å¤ çš„。如果你想看到其他眾多(高級)é…ç½®åƒæ•¸ï¼Œè®€å–默èªçš„é…置文件
+<span class="filename">include/config_default.inc.php</span>.</p>
+
+<p>ç•«é¢åˆ†æˆä¸åŒçš„部分,按主題分組來é…ç½®åƒæ•¸ã€‚</p>
+
+
+<h3>主è¦</h3>
+<ul>
+ <li><strong>圖庫標題</strong>: 通éŽé›»å­éƒµä»¶ï¼Œä½¿ç”¨RSS訂閱和通知。</li>
+
+ <li><strong>網é æ©«å¹…</strong>: 顯示æ¯å€‹å…¬å…±é é¢é ‚部。</li>
+
+ <li><strong>圖庫網å€</strong>: 用於RSSæè¦ã€‚</li>
+
+ <li><strong>鎖定圖庫</strong>: 鎖定整個圖庫來維護。åªæœ‰ç®¡â€‹â€‹ç†å“¡çµ„的用戶將能夠到é”圖庫。</li>
+
+ <li><strong>評分</strong>: 照片評分功能被啟用。</li>
+
+ <li><strong>客人也å¯è©•åˆ†</strong>: å³ä½¿æ˜¯æœªè¨»å†Šçš„用戶,也能評分圖片。</li>
+
+ <li><strong>å…許用戶註冊</strong>: 任何人都å¯ä»¥è¨»å†Šã€‚</li>
+
+ <li><strong>強制所有用戶留下郵件地å€</strong>: 除了管ç†å“¡ä»¥å¤–,所有用戶登記或更新資料時,將檢查郵件地å€ã€‚</li>
+
+ <li><strong>當一個新用戶註冊用電å­éƒµä»¶é€šçŸ¥ç®¡ç†å“¡</strong>: æ¯å€‹è¨»å†Šéƒ½å°‡ç”¨éƒµä»¶é€šçŸ¥ç®¡ç†å“¡ã€‚</li>
+
+ <li><strong>默èªç…§ç‰‡é †åº</strong>: ä½ å¯ä»¥å°‡ä¸‹æ‹‰èœå–®å®šç¾©å€‹äººåŒ–çš„é †åº</li>
+
+</ul>
+
+<h3>æ­·å²</h3>
+
+ <p>é é¢çš„訪客 <span
+ class="pwgScreen">category.php</span> 和 <span
+ class="pwgScreen">picture.php</span> 將被ä¿å­˜åœ¨åœ¨ <code>history</code> 表。</p>
+
+ <p>訪客將顯示在 <span class="pwgScreen">ç®¡ç† &raquo; 工具 &raquo; æ­·å²</span>.</p>
+
+<ul>
+ <li><strong>ä¿å­˜è¨ªå®¢çš„訪å•é é¢ </strong>: 訪客的訪å•é é¢å°‡æœƒè¢«è¨˜éŒ„</li>
+
+ <li><strong>ä¿å­˜ç”¨æˆ¶çš„訪å•é é¢ </strong>: 用戶的訪å•é é¢å°‡æœƒè¢«è¨˜éŒ„</li>
+
+ <li><strong>ä¿å­˜ç®¡ç†å“¡çš„訪å•é é¢ </strong>: 管ç†å“¡çš„訪å•é é¢å°‡æœƒè¢«è¨˜éŒ„</li>
+
+</ul>
+
+<h3>è©•è«–</h3>
+<ul>
+
+ <li><strong>所有人都å¯è©•è«–</strong>: å³ä½¿æ˜¯æœªç™»è¨˜çš„訪客也å¯ä»¥ç™¼è¡¨è©•è«–</li>
+
+ <li><strong>æ¯é çš„æ„見數</strong>.</li>
+
+ <li><strong>é©—è­‰</strong>: 管ç†å“¡å¿…須驗證用戶的評論,æ‰èƒ½åœ¨ç¶²ç«™ä¸Šçœ‹åˆ°ã€‚用戶評論驗證發生在畫é¢
+<span class="pwgScreen">ç®¡ç† &raquo; 工具 &raquo; 掛起的評論</span>.</li>
+
+ <li><strong>當輸入一個有效的評論,用電å­éƒµä»¶é€šçŸ¥ç®¡ç†å“¡</strong>: 當用戶輸入一個有效的評論,發é€é›»å­éƒµä»¶çµ¦ç®¡ç†å“¡ã€‚</li>
+
+ <li><strong>當評論需è¦å¯©æ ¸ï¼Œç”¨é›»å­éƒµä»¶é€šçŸ¥ç®¡ç†å“¡</strong>:
+發é€é›»å­éƒµä»¶çµ¦ç®¡ç†å“¡ï¼Œç•¶ç”¨æˆ¶è¼¸å…¥çš„評論需è¦ç”±ç®¡ç†å“¡é©—證。用戶評論驗證發生在畫é¢
+<span class="pwgScreen">ç®¡ç† &raquo; 工具 &raquo; 掛起的評論</span>.</li>
+
+</ul>
+
+<h3>默èªé¡¯ç¤º</h3>
+
+<p>
+在這裡,你å¯ä»¥æ”¹è®Šè¨ªå®¢ä½¿ç”¨çš„顯示é¸é …,默èªç”¨æˆ¶æ˜¯æ²’有連接的。
+一旦連接æˆåŠŸï¼Œé€™äº›é¸é …是由用戶自己é¸æ“‡è¦†è“‹ã€‚
+(修改中的 <span class="pwgScreen">é…ç½®</span>).</p>
+
+<p>
+這å¯èƒ½æ”¹è®Šæ‰€æœ‰ç¾æœ‰ç”¨æˆ¶çš„顯示é¸é …,在<span class="pwgScreen">ç®¡ç† &raquo; 用戶 &raquo; 管ç†</span>
+ ç•«é¢ï¼Œåœ¨é‚£è£¡ä½ å¯ä»¥é¸æ“‡ä¸€å€‹ç”¨æˆ¶åˆ—表。</p>
+
+<ul>
+
+ <li><strong>語言</strong>: åªæ‡‰ç”¨åœ¨Piwigo的標籤ã€ç›¸å†Šå稱ã€ç›¸ç‰‡å稱,和所有沒有本地化的æ述欄ä½</li>
+
+ <li><strong>æ¯è¡Œçš„照片數</strong></li>
+
+ <li><strong>æ¯é çš„行數</strong></li>
+
+ <li><strong>ç•Œé¢ä¸»é¡Œ</strong></li>
+
+ <li><strong>最近一段時期</strong>: 按天數。顯示此期間的新照片。必須大於1天。</li>
+
+ <li><strong>展開所有的相冊</strong>: 默èªæƒ…æ³ä¸‹ï¼Œåœ¨èœå–®ä¸­å±•é–‹æ‰€æœ‰çš„相冊
+ <em>警告</em>: ​​此é¸é …在資æºå¯†é›†æ™‚,比如你的相冊集中包å«å¤šæœ¬ç›¸å†Šæ™‚,å¯èƒ½æœƒç”¢ç”Ÿå·¨å¤§çš„èœå–®ã€‚</li>
+
+ <li><strong>顯示評論數</strong>: æ¯å¼µç…§ç‰‡ç¸®ç•¥åœ–é é¢ä¸Šï¼Œé¡¯ç¤ºè©•è«–的數é‡ã€‚資æºå¯†é›†åž‹çš„。</li>
+
+ <li><strong>顯示點擊數</strong>:
+ 在縮略圖é é¢ä¸Šçš„縮略圖照片中,顯示點擊數。
+ åªæœ‰ç•¶é€²éšŽçš„é…ç½®åƒæ•¸æ˜¯: <br>
+ $conf['show_nb_hits'] = true; <br>
+ 注æ„:默èªç‚ºä¸é¡¯ç¤º</li>
+
+ <li><strong>照片的最大寬度</strong>: 最大顯示寬度。 照片大於這個設置,顯示時將被調整。
+ 如果ä¸é¸æ“‡æ­¤é …,ä½ å¯èƒ½æœƒè€ƒæ…®ä¿®æ”¹ç…§ç‰‡çš„寬度,這將是一個更好的åšæ³•ã€‚</li>
+
+ <li><strong>照片的最大高度</strong>: 設置為與最大寬度相åŒã€‚</li>
+
+</ul> \ No newline at end of file
diff --git a/language/zh_TW/help/extend_for_templates.html b/language/zh_TW/help/extend_for_templates.html
new file mode 100755
index 000000000..e241e9b50
--- /dev/null
+++ b/language/zh_TW/help/extend_for_templates.html
@@ -0,0 +1,71 @@
+<h2>模æ¿æ“´å±•é…ç½®</h2>
+
+<h3>關於</h3>
+<p>
+å¯ä»¥è‡ªå®šç¾©ä½ çš„Piwigo畫​​廊,用定制的版本å–代ç¾æœ‰çš„模æ¿æ–‡ä»¶ã€‚
+例如,默èªçš„的標頭模æ¿ï¼ˆheader.tpl)å¯ä»¥ç”¨å®šåˆ¶æ¨™é ­æ¨¡æ¿ï¼ˆmy-header.tpl)å–代。æ交更改到數據庫後,畫廊將展示定制的標頭 - 而ä¸æ˜¯åŽŸä¾†çš„標頭。<br>
+模æ¿æ“´å±•æ˜¯ä¸€ç¨®å¼·å¤§çš„æ–¹å¼ï¼Œä¾†å‰µå»ºæ–°åŠå…ˆé€²çš„用戶自定義主題。與LocalFiles編輯器一起使用,你å¯ä»¥å‰µå»ºè‡ªå·±çš„å­ä¸»é¡Œã€‚</p>
+
+<h3>原始模æ¿</h3>
+<p>主題包å«äº†ä¸€äº›æ¨¡æ¿æ–‡ä»¶ï¼Œä¾†å¢žå¼·ç•«å»Šé ã€‚這些是原始模æ¿ã€‚</p>
+
+<h3>é¸æ“‡æ€§çš„URLé—œéµå­—</h3>
+<p>在畫廊網å€çš„模塊å稱後,發ç¾é—œéµå­—的話。它們也å¯ä»¥æ˜¯æ´»èºçš„永久éˆæŽ¥ï¼ˆåƒè€ƒæ°¸ä¹…éˆæŽ¥çš„文檔,了解更多信æ¯ï¼‰ã€‚
+<a href="#warnings">警告:</a>
+如果​​相åŒçš„原始模æ¿ï¼Œä¸¦ä½¿ç”¨ç›¸åŒçš„é—œéµå­—在一個以上的自定義模æ¿ï¼Œåªæœ‰æœ€å¾Œä¸€å€‹æ˜¯æ´»èºçš„。</p>
+
+<h3>ç¶å®šä¸»é¡Œ</h3>
+<p>ç¶å®šä¸»é¡Œæ˜¯ä¸»é¡Œçš„模æ¿æ–‡ä»¶è¢«æ›¿æ›ã€‚</p>
+
+<h3>原始模æ¿åœ¨å“ªè£¡ï¼Ÿ</h3>
+<p>原始模æ¿éš¨æ¯å€‹ä¸»é¡Œçš„模æ¿æ–‡ä»¶ã€‚
+這些被ä¿å­˜åœ¨<em>/themes/default/template</em> (或 <em>themes/<theme name>/template</em>)。
+這些模æ¿æ–‡ä»¶ä¸æ‡‰è©²è¢«ç·¨è¼¯ï¼Œæ›´æ”¹å°‡æœƒå¤±åŽ»ä¸»é¡Œçš„å‡ç´šã€‚<br>
+支æŒçš„原始模æ¿åŒ…括:</p>
+
+<ul>
+ <li><span class="filename">index.tpl</span></li>
+ <li><span class="filename">mainpage_categories.tpl</span> 和/或 <span class="filename">thumbnails.tpl</span></li>
+ <li><span class="filename">menubar.tpl</span></li>
+ <li><span class="filename">header.tpl</span> 和/或 <span class="filename">footer.tpl</span></li>
+ <li><span class="filename">picture_content.tpl</span> 和/或 <span class="filename">picture.tpl</span></li>
+ <!-- <li><span class="filename">slideshow.tpl</span></li> -->
+ <li><span class="filename">profile.tpl</span> 和/或 <span class="filename">profile_content.tpl</span></li>
+ <li><span class="filename">tags.tpl</span></li>
+ <li><span class="filename">upload.tpl</span></li>
+ <li><span class="filename">about.tpl</span></li>
+ <li><span class="filename">popuphelp.tpl</span></li>
+ <li><span class="filename">search.tpl</span> 和/或 <span class="filename">search_rules.tpl</span></li>
+ <li><span class="filename">nbm.tpl</span> 和/或 <span class="filename">notification.tpl</span></li>
+ <li><span class="filename">identification.tpl</span> 和/或 <span class="filename">register.tpl</span></li>
+ <li><span class="filename">redirect.tpl</span></li>
+</ul>
+
+<h3>ä¿å­˜è‡ªå®šç¾©æ¨¡æ¿</h3>
+<p>
+定制模æ¿æ‡‰ä¿å­˜åœ¨æ¨¡æ¿çš„擴展文件夾或å­æ–‡ä»¶å¤¾ã€‚
+例如,<em>/template-extension/my-default/header.tpl</em> (或 <em>/template-extension/<my-theme-name>/header.tpl</em>)
+模æ¿æ–‡ä»¶å¯ä»¥ä½¿ç”¨ä»»ä½•å稱,與.tpl的副檔å。
+å­æ–‡ä»¶å¤¾ä¸­çš„模æ¿æ–‡ä»¶ï¼Œæœƒé¡¯ç¤ºåœ¨æ¨¡æ¿é…ç½®å±å¹•ä¸­ï¼Œå¯ç”¨çš„自定義模æ¿ã€‚</p>
+
+<h3>激活定制模æ¿</h3>
+<p>
+é¸æ“‡è¦å–代的原來模æ¿ã€‚
+é¸æ“‡ä¸€å€‹URLé—œéµå­—,以確ä¿å®šåˆ¶çš„模æ¿ï¼Œåªé¡¯ç¤ºåœ¨è©²é—œéµå­—çš„é é¢ä¸Šã€‚
+é¸æ“‡ç¶å®šçš„主題,該主題的變化將是有效的。
+æ交更改到數據庫中。</p>
+
+<h3>åœç”¨å®šåˆ¶æ¨¡æ¿</h3>
+<p>å–消é¸æ“‡åŽŸå§‹æ¨¡æ¿ï¼Œä¸¦æ交改變到數據庫。<br>
+在模æ¿çš„擴展文件夾中,刪除自定義模æ¿æ–‡ä»¶ã€‚</p>
+
+<a name="warnings"></a>
+<h3>警告</h3>
+<ul>
+ <li><strong>原始模æ¿</strong> >必須是原始模æ¿ï¼Œå¦å‰‡ä½ å¯èƒ½æœƒç”¢ç”Ÿä¸å¯é çŸ¥çš„çµæžœã€‚</li>
+ <li>如果ä¸æ­¢ä¸€å€‹å®šåˆ¶æ¨¡æ¿ï¼Œä½¿ç”¨ç›¸åŒçš„原始模æ¿ï¼Œå’Œç›¸åŒçš„URLé—œéµå­—,åªæœ‰æœ€å¾Œä¸€å€‹æ˜¯æ´»èºçš„。</li>
+ <li>分佈å¼æ¨£æœ¬æ¨¡æ¿æ–‡ä»¶ï¼Œåƒ…用於測試目的。ä¸èƒ½ç·¨è¼¯å®ƒå€‘。創建你自己的或複製ç¾æœ‰çš„主題模æ¿æ–‡ä»¶ <em>/template-extension/<my-theme>/</em></li>
+ <li>當定制模æ¿è¢«åˆªé™¤ï¼ŒåŽŸä¾†çš„模æ¿æ–‡ä»¶å°‡ç«‹å³æ¿€æ´»ã€‚</li>
+</ul>
+
+ \ No newline at end of file
diff --git a/language/zh_TW/help/group_list.html b/language/zh_TW/help/group_list.html
new file mode 100755
index 000000000..c3afc93d2
--- /dev/null
+++ b/language/zh_TW/help/group_list.html
@@ -0,0 +1,21 @@
+<h2>組åå–®</h2>
+
+<p>這是管ç†çµ„的地方</p>
+
+<h3>添加一個組</h3>
+
+<p>管ç†å“¡å¯ä»¥æ·»åŠ çµ„</p>
+
+<h3>組åå–®</h3>
+
+<p>å°æ–¼æ¯å€‹çµ„,å¯æ‡‰ç”¨ä»¥ä¸‹æ“作:</p>
+
+<ul>
+ <li>ç§»åˆ°ç”¨æˆ¶ç®¡ç† (幫助 &raquo; 用戶 &raquo; 管ç†)</li>
+ <li>移到權é™ç®¡ç†ç•«é¢ï¼ŒæŽˆäºˆæˆ–拒絕訪å•ç§äººç›¸å†Šã€‚</li>
+ <li>刪除組(需è¦ç¢ºèªï¼‰</li>
+ <li>切æ›ç‹€æ…‹ “默èªâ€ï¼ˆéœ€è¦ç¢ºèªï¼‰</li>
+</ul>
+
+<h3>默èªçµ„</h3>
+<p>默èªçµ„是自動關è¯ï¼Œå°æ¯å€‹æ–°ç”¨æˆ¶è¨»å†Šæˆ–創建一個管ç†å“¡ã€‚</p> \ No newline at end of file
diff --git a/language/zh_TW/help/help_add_photos.html b/language/zh_TW/help/help_add_photos.html
new file mode 100755
index 000000000..57a7381b5
--- /dev/null
+++ b/language/zh_TW/help/help_add_photos.html
@@ -0,0 +1,25 @@
+<p>幾種方法,將照片添加到您的畫廊:</p>
+
+<ul>
+ <li><strong>直接上傳</strong> 從您的網é ç€è¦½å™¨å…§ï¼Œæ˜¯æœ€ç°¡å–®ï¼Œæœ€ç›´æŽ¥çš„æ–¹å¼ã€‚它å–決於你的ç€è¦½å™¨åŠŸèƒ½å’ŒWebæœå‹™å™¨ã€‚
+ å°æ–¼æ•¸é‡é¾å¤§çš„照片或情æ³ä¸‹ï¼Œä½ æœƒé‡åˆ°ä¸€äº›å•é¡Œï¼Œä½†å…¶ä»–方法都åªæ˜¯ç­‰è‘—ä½ ï¼</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">轉到直接上傳 </a></p>
+
+<ul>
+ <li><strong>pLoader</strong> 是一個桌é¢æ‡‰ç”¨ç¨‹åºï¼Œè¦å®‰è£åœ¨ä½ çš„計算機上。
+æ‹– &amp; 放照片到pLoader窗å£, 點擊 <em>"上傳到Piwigo"</em> 讓pLoader工作。
+ä½ å¯ä»¥æ‰¾åˆ°å…¶ä»–æ¡Œé¢æ‡‰ç”¨ç¨‹åºï¼Œå¦‚<strong>WinToPiwigo</strong>,或<strong>Digikam</strong>匯出æ’件到Piwigo。</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ploader">移到pLoader</a></p>
+
+<div id="helpSynchro">
+<ul>
+ <li><strong>FTP傳輸</strong>是最值得推薦的方å¼ï¼Œç”¨æœ€å°‘的點擊次數,來增加éžå¸¸å¤§çš„照片集。
+ éµå¾ªæŒ‡å—來準備你的照片。FTP方法讓你精確控制,您照片的物ç†çµ„織到您的æœå‹™å™¨ä¸Šã€‚</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ftp">轉到FTP</a></p>
+</div> \ No newline at end of file
diff --git a/language/zh_TW/help/help_groups.html b/language/zh_TW/help/help_groups.html
new file mode 100755
index 000000000..d9ca11812
--- /dev/null
+++ b/language/zh_TW/help/help_groups.html
@@ -0,0 +1,12 @@
+
+<p>組是一種便æ·çš„æ–¹å¼ï¼Œç‚ºå…¶è¨­ç½®åˆ—表用戶的權é™ã€‚</p>
+
+<p>創建組 <span class="pwgScreen">ç®¡ç† &raquo; 用戶
+&raquo; 組</span> å’Œè¯ç¹«ç”¨æˆ¶åˆ°è©²çµ„
+在 <span class="pwgScreen">ç®¡ç† &raquo; 用戶 &raquo;
+管ç†</span>.</p>
+
+<p>一個用戶å¯ä»¥å±¬æ–¼å¤šå€‹çµ„。 授權的優先級高於
+阻截 : 如果用戶“傑克â€å±¬æ–¼çµ„“家庭â€å’Œâ€œæœ‹å‹â€ï¼Œä¸¦
+且åªæœ‰çµ„“家庭â€å¯ä»¥çœ‹åˆ°â€œ2010å¹´è–誕節â€å°ˆè¼¯ï¼Œé‚£éº¼
+“傑克â€å°‡èƒ½çœ‹åˆ°â€œ2010å¹´è–誕節â€ã€‚</p> \ No newline at end of file
diff --git a/language/zh_TW/help/help_misc.html b/language/zh_TW/help/help_misc.html
new file mode 100755
index 000000000..ebb068a90
--- /dev/null
+++ b/language/zh_TW/help/help_misc.html
@@ -0,0 +1,9 @@
+<p>一旦你創建你的畫廊,你å¯ä»¥ç‚ºä½ çš„訪å•è€…é…置它
+<ul>
+ <li>默èªé¡¯ç¤ºä½ å–œæ­¡çš„ <span class="pwgScreen">ç®¡ç† &raquo; é…ç½® &raquo; é¸é …</span> å¡ <span class="pwgScreen">客戶設置</span></li>
+ <li>默èªä¸»é¡Œ <span class="pwgScreen">ç®¡ç† &raquo; é…ç½® &raquo; 主題</span></li>
+ <li>默èªèªžè¨€ <span class="pwgScreen">ç®¡ç† &raquo; é…ç½® &raquo; 語言</span></li>
+ </ul>
+ 默èªæƒ…æ³ä¸‹ï¼Œæ¯å€‹æ–°ç”¨æˆ¶ç™»è¨˜å¾Œï¼Œå°‡ç¹¼æ‰¿é€™äº›å±¬æ€§ã€‚
+</p>
+<p>如果您有任何å•é¡Œï¼ŒPiwigo的社å€æ­¡è¿Žæ‚¨åœ¨ <a href="http://piwigo.org/forum">這個論壇</a>。</p> \ No newline at end of file
diff --git a/language/zh_TW/help/help_permissions.html b/language/zh_TW/help/help_permissions.html
new file mode 100755
index 000000000..507a22121
--- /dev/null
+++ b/language/zh_TW/help/help_permissions.html
@@ -0,0 +1,56 @@
+<fieldset>
+<legend>照片權é™</legend>
+
+<p>æ¯å€‹ç…§ç‰‡æœ‰<strong>éš±ç§ç´šåˆ¥</strong>(鎖)。æ¯å€‹ç”¨æˆ¶ä¹Ÿæœ‰è‡ªå·±çš„éš±ç§ç´šåˆ¥ï¼ˆéµï¼‰ã€‚éš±ç§ç´šåˆ¥æœ‰5個:</p>
+<ol>
+ <li>ç„¡</li>
+ <li><em>接觸</em></li>
+ <li><em>朋å‹ï¼ˆé€™æ˜¯é«˜æ–¼æŽ¥è§¸ï¼‰</em></li>
+ <li><em>家庭(這是高於朋å‹ï¼‰</em></li>
+ <li><em>管ç†å“¡ï¼ˆé€™æ˜¯æ¯”其他任何級別高)</em></li>
+</ol>
+
+<p>高級別比低級別有權é™çš„多。å°æ–¼ä¸€å€‹çµ¦å®šçš„用戶,隱ç§ç´šåˆ¥è¶Šé«˜ï¼Œä»–å¯ä»¥çœ‹åˆ°çš„照片越多。</p>
+
+<p>例如,如果照片“peter_wedding-0024.jpgâ€æœ‰<em>“家庭â€</em>çš„éš±ç§ç´šåˆ¥ï¼Œé‚£éº¼ï¼š</p>
+<ul>
+ <li>彼得(是<em>“管ç†å“¡â€</em>)會看到照片,因為<em>"管ç†å“¡"</em>å¯ä»¥çœ‹åˆ°æ‰€æœ‰çš„照片</li>
+ <li>è²çµ²ï¼ˆæ˜¯<em>“家庭â€</em>)也將看到照片</li>
+ <li>瑪麗(是<em>“朋å‹â€</em>)將ä¸æœƒçœ‹åˆ°ç…§ç‰‡</li>
+</ul>
+
+<p>用戶沒有看到內容的權é™ï¼Œå°±ä¸æœƒçœ‹åˆ°è©²ç›¸å†Šï¼Œç”šè‡³å®ƒçš„標題。åŒæ¨£çš„原則也é©ç”¨æ–¼ä¸€å€‹æ¨™ç±¤ã€‚</p>
+
+<p>您å¯ä»¥è¨­ç½®ç”¨æˆ¶çš„éš±ç§ç´šåˆ¥ï¼Œåœ¨<span class="pwgScreen">ç®¡ç† &raquo; 用戶 &raquo; ç®¡ç† </span> ç•«é¢ã€‚</p>
+
+</fieldset>
+
+<fieldset>
+<legend>相冊權é™</legend>
+
+<p>如果隱ç§ç´šåˆ¥ä¸é©åˆæ‚¨çš„需求,您也å¯ä»¥ç®¡ç†ç›¸å†Šçš„權é™å°ç”¨æˆ¶æˆ–組。你å¯ä»¥åœ¨åŒä¸€æ™‚間管ç†ç…§ç‰‡å’Œç›¸å†Šçš„權é™ï¼Œè€Œä¸æœƒç™¼ç”Ÿè¡çªã€‚</p>
+
+<p>您å¯ä»¥ç¦æ­¢è¨ªå•ç›¸å†Šã€‚如果你想管ç†æ¬Šé™ï¼Œåˆ‡æ›ç›¸å†Šçš„訪å•é¡žåž‹ç‚ºâ€œç§äººâ€ã€‚</p>
+
+<p>您å¯ä»¥ç”±ç·¨è¼¯ä¸­çš„單一相冊,設置一個ç§äººç›¸å†Š
+(<span class="pwgScreen">ç®¡ç† &raquo; 相冊 &raquo; 管ç†
+ &raquo; 編輯</span>)或通éŽè¨­ç½®é¸é …所有的相冊樹
+(<span class="pwgScreen">ç®¡ç† &raquo; 相冊 &raquo;
+屬性 &raquo; 公共/ç§äººï¼‰</span>)。</p>
+
+<p>一旦相冊是ç§äººçš„,你å¯ä»¥ç®¡ç†æ¬Šé™çµ„å’Œ
+用戶從3個å±å¹•ï¼š</p>
+
+<ul>
+
+ <li><span class="pwgScreen">ç®¡ç† &raquo; 用戶 &raquo; ç®¡ç† &raquo;
+ 權é™è¡Œç‚º</span>(æ¯ç”¨æˆ¶ä¸€å€‹éˆæŽ¥ï¼‰</li>
+
+ <li><span class="pwgScreen">ç®¡ç† &raquo; 用戶 &raquo; 組 &raquo;
+ 權é™è¡Œç‚º</span>(æ¯çµ„一個éˆæŽ¥ï¼‰</li>
+
+ <li><span class="pwgScreen">ç®¡ç† &raquo; 相冊 &raquo; ç®¡ç† &raquo; 編輯
+ 相冊權é™è¡Œç‚º</span>(æ¯å€‹ç›¸å†Šä¸€å€‹éˆæŽ¥ï¼‰</li>
+
+</ul>
+</fieldset>
diff --git a/language/zh_TW/help/help_virtual_links.html b/language/zh_TW/help/help_virtual_links.html
new file mode 100755
index 000000000..b72b67823
--- /dev/null
+++ b/language/zh_TW/help/help_virtual_links.html
@@ -0,0 +1,7 @@
+<p>照片顯示他們相冊的å°æ‡‰æ–‡ä»¶ç›®éŒ„中。</p>
+
+<p>你也å¯ä»¥é¡¯ç¤ºå¹¾å€‹ç›¸å†Šä¸­çš„照片,而無需在Webæœå‹™å™¨ä¸Šè¤‡è£½æ–‡ä»¶ã€‚
+在照片編輯å±å¹•ï¼Œå¾žä»»ä½•ç›¸å†Šä¾†é—œè¯ç…§ç‰‡ï¼ˆä»»ä½•ç®¡ç†å“¡éƒ½å¯ä»¥é”到,從照片é ç•«å»Šå´ï¼‰ã€‚</p>
+
+<p>虛擬相冊基於這樣的ç†å¿µï¼šä»–們有沒有相應的目錄。
+創建虛擬相冊從 <span class="pwgScreen">ç®¡ç† &raquo; 相冊 &raquo; 管ç†</span>。</p> \ No newline at end of file
diff --git a/language/zh_TW/help/history.html b/language/zh_TW/help/history.html
new file mode 100755
index 000000000..f5236e88d
--- /dev/null
+++ b/language/zh_TW/help/history.html
@@ -0,0 +1,23 @@
+<h2>æ­·å²</h2>
+
+<p>在這些å±å¹•ä¸Šï¼Œæ‚¨å¯ä»¥ç€è¦½æ‚¨ç›¸å†Šçš„訪å•æ­·å²ï¼Œæ ¹æ“šæ‚¨é¸æ“‡çš„é¸é …ï¼šç®¡ç† &raquo; é…ç½® &raquo; é¸é … &raquo; æ­·å²</p>
+
+<h3>統計</h3>
+<ul>
+ <p>如果您é¸æ“‡è¨˜éŒ„é é¢è¨ªå• (<span class="pwgScreen">index.php</span> å’Œ <span class="pwgScreen">picture.php</span>), 您å¯ä»¥å¾žé€™å€‹æ¨™ç±¤ç€è¦½ä»–們。</p>
+ <li><strong>全局統計信æ¯</strong>: æ¯å¹´çš„訪å•ã€‚ </li>
+ <li><strong>æ¯å¹´çµ±è¨ˆ</strong>: 在é¸å®šå¹´çš„æ¯æœˆè¨ªå•</li>
+ <li><strong>æ¯æœˆçµ±è¨ˆ</strong>: 在é¸å®šæœˆçš„æ¯æ—¥è¨ªå•</li>
+ <li><strong>æ¯æ—¥çµ±è¨ˆ</strong>: 在é¸å®šæ—¥çš„æ¯å°æ™‚訪å•</li>
+</ul>
+
+<h3>æœç´¢</h3>
+<ul>
+ <p>如果您é¸æ“‡è¨˜éŒ„é é¢è¨ªå• (<span class="pwgScreen">index.php</span> å’Œ <span class="pwgScreen">picture.php</span>)
+,你å¯ä»¥ç€è¦½åœ¨æ­¤é¸é …å¡ä¸­çš„細節,ä¸åŒçš„éŽæ¿¾å™¨å¯ä»¥å¹«åŠ©ä½ ã€‚</p>
+ <li><strong>éŽæ¿¾æ—¥æœŸï¼š</strong>é¸æ“‡æ—¥æœŸç¯„åœæœç´¢ï¼Œé€šéŽè¨­ç½®é–‹å§‹å’ŒçµæŸæ—¥æœŸã€‚</li>
+ <li><strong>éŽæ¿¾å…ƒç´ çš„類型:</strong> é¸æ“‡è©²å…ƒç´ çš„類型進行統計。</li>
+ <li><strong>éŽæ¿¾ç”¨æˆ¶ï¼š</strong> é¸æ“‡ç”¨æˆ¶åœ¨è©²ç”¨æˆ¶çš„統計。</li>
+ <li><strong>éŽæ¿¾åœ–片標識:</strong> é¸æ“‡åœ–片標籤在該標籤的統計。</li>
+ <li><strong>éŽæ¿¾æ–‡ä»¶å:</strong> é¸æ“‡è©²æ–‡ä»¶çš„文件å統計..</li>
+</ul> \ No newline at end of file
diff --git a/language/zh_TW/help/maintenance.html b/language/zh_TW/help/maintenance.html
new file mode 100755
index 000000000..a2b671839
--- /dev/null
+++ b/language/zh_TW/help/maintenance.html
@@ -0,0 +1,32 @@
+<h2>維護</h2>
+
+<p>為了優化é é¢ç”Ÿæˆæ™‚間,Piwigo使用緩存信æ¯ã€‚
+例如,é‡æ–°åŠ è¼‰ç•¶å‰çš„ä¿¡æ¯æ™‚,計數æ¯é ç›¸å†Šä¸­åŒ…å«çš„照片數é‡ï¼Œæ˜¯å„²å­˜åœ¨æ•¸æ“šåº«ä¸­ã€‚
+在ç†è«–上,這信æ¯æ‡‰è©²æ°¸é æ˜¯æ­£ç¢ºçš„,但有時å¯èƒ½æœƒç™¼ç”ŸéŒ¯èª¤ç·©å­˜ï¼Œä½¿ä¿¡æ¯è®Šå¾—éŽæ™‚了。</p>
+
+<p>隨著時間的推移,一些信æ¯è®Šå¾—ä¸é‚£éº¼æœ‰ç”¨ã€‚從數據庫中刪除這個無用的信æ¯ï¼Œæœƒç‚ºä½ ç¯€çœä¸€äº›ç£ç›¤ç©ºé–“。</p>
+
+<ul>
+ <li><strong>刪除孤兒標籤</strong></li>
+</ul>
+<ul>
+ <li><strong>更新相冊信æ¯ï¼š</strong> å°æ¯å€‹ç›¸å†Šï¼Œæª¢æŸ¥ä»¥ä¸‹çš„ä¿¡æ¯ï¼Œä¸¦åœ¨å¿…è¦æ™‚更新:父相冊,照片數,最後一張照片的日期,兄相冊之間的ä½ç½®ï¼Œæ‰€æœ‰ç›¸å†Šä¸­çš„ä½ç½®ã€‚這個動作也檢查照片的一致性。</li>
+
+ <li><strong>更新照片信æ¯ï¼š</strong> å°æ–¼æ¯å¼µç…§ç‰‡ï¼Œæ›´æ–°çš„ä¿¡æ¯æ˜¯ï¼šæ–‡ä»¶çš„完整路徑,平å‡é€ŸçŽ‡ã€‚<em>警告</em>,åƒè¬ä¸èƒ½æ··ç”¨ï¼šå…ƒæ•¸æ“šä¿¡æ¯å¿…é ˆåŒæ­¥ï¼Œå¾ž <span class="pwgScreen">ç®¡ç† &raquo; 工具 &raquo; åŒæ­¥åŒ–</span>,或在修改å±å¹•ä¸Šçš„一張照片 (ä¾‹å¦‚é€šéŽ <span class="pwgScreen">照片</span>)。</li>
+</ul>
+
+<ul>
+ <li><strong>ä¿®ç†å’Œå„ªåŒ–數據庫:</strong>執行é‡æ–°æŽ’åºï¼Œä¿®å¾©å’Œå„ªåŒ–æ“作å°æ•¸æ“šåº«ä¸­çš„æ¯å€‹è¡¨ã€‚</li>
+ <li><strong>åˆå§‹åŒ–完整性檢查</strong></li>
+</ul>
+
+ <LI> <STRONG>é‡æ–°åˆå§‹åŒ–完整性檢查</ STRONG> </ LI>
+
+<ul>
+ <li><strong>清除歷å²ç´°ç¯€ï¼š</strong> 刪除歷å²è¨˜éŒ„表的所有行。å±å¹• <span class="pwgScreen">ç®¡ç† &raquo; 工具 &raquo; æ­·å²</span> å°‡ä¸å†é¡¯ç¤ºéŽåŽ»çš„æ­·å²ä¿¡æ¯ã€‚ <em>警告:</em> 所有數據將會丟失,沒有任何辦法讓他們回來。</li>
+ <li><strong>清除歷å²æ‘˜è¦ï¼š</strong> 刪除所有訪å•æ­·å²è¨˜éŒ„的摘è¦ä¿¡æ¯ã€‚此摘è¦å¾žæ­·å²è¨˜éŒ„的細節計算。</li>
+ <li><strong>清除會話:</strong> 刪除éŽæœŸçš„用戶會話。</li>
+ <li><strong>清除從未使用的通知供稿</strong></li>
+ <li><strong>清除æœç´¢æ­·å²</strong></li>
+ <li><strong>清除編譯模æ¿</strong></li>
+</ul> \ No newline at end of file
diff --git a/language/zh_TW/help/notification_by_mail.html b/language/zh_TW/help/notification_by_mail.html
new file mode 100755
index 000000000..59fde0743
--- /dev/null
+++ b/language/zh_TW/help/notification_by_mail.html
@@ -0,0 +1,14 @@
+<h2>通知郵件 (NBM)</h2>
+
+<p>é…置和管ç†é›»å­éƒµä»¶é€šçŸ¥ç”¨æˆ¶ï¼Œé€šçŸ¥ä»–們,您網站的變化。</p>
+
+<p>這個å±å¹•åŒ…å«ä¸‰å€‹é¸é …å¡ï¼š</p>
+
+<h3>設置</h3>
+<p>æ­¤é¸é …å¡åªç‚ºç«™é•·ï¼Œè¨­ç½®é€šéŽéƒµä»¶é€šçŸ¥çš„åƒæ•¸</p>
+
+<h3>訂閱</h3>
+<p>æ­¤é¸é …å¡åªç‚ºç«™é•·ï¼Œç®¡ç†è¨‚閱用戶的電å­éƒµä»¶é€šçŸ¥ã€‚將用戶添加到訂閱框中,他們就會收到通知郵件。</p>
+
+<h3>發é€</h3>
+<p>僅å¯ç”¨æ–¼ç«™é•·å’Œç®¡ç†å“¡ï¼Œæ­¤é¸é …å¡å…許管ç†å“¡ç™¼é€é€šçŸ¥éƒµä»¶çµ¦è¨‚閱用戶。</p> \ No newline at end of file
diff --git a/language/zh_TW/help/permalinks.html b/language/zh_TW/help/permalinks.html
new file mode 100755
index 000000000..c992768d7
--- /dev/null
+++ b/language/zh_TW/help/permalinks.html
@@ -0,0 +1,7 @@
+<h2>永久éˆæŽ¥</h2>
+
+<p>永久éˆæŽ¥è¢«ç”¨ä¾†è£½ä½œæ›´å¥½çš„相冊網å€ã€‚當相冊有定義一個永久連çµï¼Œç›¸å†Šçš„idä¸å†æ˜¯éœ€è¦çš„網å€ã€‚</p>
+
+<p>當一個永久éˆæŽ¥è¢«åˆªé™¤æ™‚,你å¯ä»¥å°‡å®ƒä¿å­˜åœ¨æ°¸ä¹…éˆæŽ¥çš„æ­·å²ï¼Œæ‰€ä»¥ï¼Œå¤–連到Piwigoé é¢çš„éˆæŽ¥ä»ç„¶æœ‰æ•ˆã€‚在永久歷å²è¡¨ä¸­ï¼Œä½ å¯ä»¥çœ‹åˆ°å°‡å›ºå®šéˆæŽ¥å·²è¢«åˆªé™¤çš„日期,這是最後一次使用,和已被使用的次數。</p>
+
+<p>注æ„:æ¯å€‹ç›¸å†Šçš„永久éˆæŽ¥å¿…須是唯一的。此外,在永久éˆæŽ¥çš„æ­·å²ä¸­ï¼Œä½ ä¸èƒ½æœ‰ç›¸åŒçš„永久éˆæŽ¥ã€‚</p> \ No newline at end of file
diff --git a/language/zh_TW/help/photos_add_ftp.html b/language/zh_TW/help/photos_add_ftp.html
new file mode 100755
index 000000000..883527605
--- /dev/null
+++ b/language/zh_TW/help/photos_add_ftp.html
@@ -0,0 +1,85 @@
+<fieldset>
+ <legend>快速入門</legend>
+
+<ol>
+ <li>在您的電腦上創建一個目錄。</li>
+
+ <li>複製這個目錄裡é¢çš„一些照片,並在網é é¡¯ç¤ºä¸­èª¿æ•´ä»–們。<em>警告</em>:​​目錄和文件的å稱必須åªåŒ…å«å­—æ¯ï¼Œæ•¸å­—,“ - â€ï¼Œâ€œ_†或“.â€ã€‚ä¸èƒ½ç©ºç™½ï¼ŒåŠç‰¹æ®Šå­—符。</li>
+
+ <li>一個FTP客戶端,複製目錄到Piwigo安è£çš„“照片庫â€ç›®éŒ„。</li>
+
+ <li>登錄您的畫廊,去到 <span class="pwgScreen">管ç†</span> ,然後按一下大型的åŒæ­¥æŒ‰éˆ•ã€‚</li>
+</ol>
+
+<p>æ­å–œæ‚¨ï¼æ‚¨å·²æˆåŠŸå‰µå»ºæ‚¨çš„照片庫的第一本相冊</p>
+</fieldset>
+
+<fieldset>
+ <legend>組織目錄和文件</legend>
+
+<ul>
+
+ <li>
+
+ <p>Piwigo目錄中的相冊目錄
+ "照片庫"。下é¢çš„目錄樹中一個éžå¸¸å°çš„畫廊(但
+ 使用許多功能):</p>
+
+ <pre>
+照片庫
+|-- 婚禮
+| |-- æ…¶ç¥
+| | |-- 到é”
+| | | |-- paul-alone.jpg
+| | | +-- sarah-alone.jpg
+| | +-- 出發
+| | +-- paul-and-sarah.jpg
+| +-- èšæœƒ
+| |-- dancers001.jpg
+| |-- dancers002.jpg
+| +-- dancers003.jpg
++-- 蜜月
+ |-- hotel.png
+ |-- video-from-plane.avi
+ +-- pwg_representative
+ +-- video-from-plane.jpg
+</pre>
+
+ </li>
+
+ <li>Except for "pwg_representative" (see explanations below), each directory under "galleries" produces a album. There is no limit on deepness.</li>
+
+ <li>Basically, an element is represented by a file. A file can be a
+ Piwigo element if its extension is among <code>file_ext</code>
+ configuration parameter possibilities (see <span
+ class="filename">include/config_default.inc.php</span> file). A file can
+ be a picture if its extension is among <code>picture_ext</code>
+ configuration parameter possibilities.</li>
+
+ <li>No photo elements (video, sounds, file texts, whatever you want...) are represented by default by an icon corresponding to the filename
+ extension. Optionally, you can associate a thumbnail and a representative
+ file (see video.avi in the example above).</li>
+
+ <li><em>警告</em>: ​​目錄和文件的å稱必須包å«å­—æ¯ï¼Œæ•¸å­—,“ - â€ï¼Œâ€œ_â€æˆ–“.â€ã€‚ä¸èƒ½ç©ºç™½ï¼ŒåŠç‰¹æ®Šå­—符。</li>
+
+ <li>一旦照片被放置在正確的
+ 目錄, 去到: <span class="pwgScreen">ç®¡ç† &raquo; 工具 &raquo;
+ åŒæ­¥</span></li>
+
+</ul>
+</fieldset>
+
+
+
+ æ¯å€‹ç›®éŒ„下的“畫廊â€é™¤ç‚ºâ€œpwg_representativeâ€ï¼ˆè¦‹ä¸‹é¢çš„說明),<LI>產生一個專輯。有沒有深度的é™åˆ¶ã€‚</ LI>
+
+ <LI>基本上,一個元素表示的一個文件。一個文件就å¯ä»¥äº†
+ Piwigo的元素,如果其擴展å之間的<code> file_ext </代碼>
+ é…ç½®åƒæ•¸çš„å¯èƒ½æ€§ï¼ˆè«‹åƒé–±<跨度
+ é¡ž=“文件åâ€> / config_default.inc.php </ SPAN>文件)。一個文件å¯ä»¥
+ 是一個圖片,如果其擴展å之間的<code> picture_ext </代碼>
+ é…ç½®åƒæ•¸çš„å¯èƒ½æ€§ã€‚</ LI>
+
+ <LI>沒有照片元素(視頻,è²éŸ³ï¼Œæ–‡ä»¶æ–‡æœ¬ï¼Œç„¡è«–你想...)默èªæƒ…æ³ä¸‹ï¼Œæ–‡ä»¶åå°æ‡‰ä¸€å€‹åœ–標代表
+ 擴展å。或者,您å¯ä»¥å°‡ä¸€å€‹ç¸®ç•¥åœ–,並代表
+ 文件(見video.avi在上é¢çš„例å­ï¼‰ã€‚</ LI>
diff --git a/language/zh_TW/help/search.html b/language/zh_TW/help/search.html
new file mode 100755
index 000000000..594e3dffe
--- /dev/null
+++ b/language/zh_TW/help/search.html
@@ -0,0 +1,21 @@
+<h2>æœç´¢</h2>
+
+<p>這é è®“您æœç´¢æ‰€æœ‰ç›¸å†Šä¹‹é–“的照片。</p>
+
+<dl>
+
+ <dt>æœç´¢è©ž</dt>
+ <dd>æœç´¢ä¸€å€‹æˆ–多個關éµå­—之間的屬性從相關的相冊照片。使用*作為一個部分匹é…çš„è¬ç”¨å­—元。</dd>
+
+ <dt>按作者æœå°‹</dt>
+ <dd>使用*作為一個部分匹é…çš„è¬ç”¨å­—元。</dd>
+
+ <dt>按日期æœç´¢</dt>
+ <dd>您å¯é¸æ“‡æ—¥æœŸå’Œ(或)çµæŸæ—¥æœŸç‚ºæŸ¥è©¢ã€‚如果你想è¦åšä¸€å€‹â€œå‰â€æŸ¥è©¢ï¼Œå°‡ç™¼è¡¨æ—¥æœŸå­—段設為空。
+ 在çµæŸå¹´çš„字段必須輸入的格å¼å¦‚下:AAAA(例如2004年)</dd>
+
+ <dt>按相冊æœç´¢</dt>
+ <ddé¸æ“‡ä½ æƒ³æœç´¢çš„單一相冊或多個相冊。所有
+ å­ç›¸å†Šéƒ½å¯ä»¥é€šéŽé¸æ“‡çˆ¶ç›¸å†Šä¾†æœç´¢ï¼Œä¸¦è¨­å®šå•Ÿç”¨æœå°‹å­ç›¸å†Š</dd>
+
+</dl>
diff --git a/language/zh_TW/help/synchronize.html b/language/zh_TW/help/synchronize.html
new file mode 100755
index 000000000..52f387372
--- /dev/null
+++ b/language/zh_TW/help/synchronize.html
@@ -0,0 +1,14 @@
+<h2>åŒæ­¥</h2>
+
+<p>有兩種ä¸åŒé¡žåž‹çš„åŒæ­¥ï¼š</p>
+<ul>
+ <li>目錄/文件</li>
+ <li>文件元數據</li>
+</ul>
+
+<p>åŒæ­¥çš„目錄和文件,是根據你的目錄樹,到數據庫中的相冊樹。
+åŒæ­¥æ–‡ä»¶çš„元數據是關於更新的照片信æ¯ï¼Œå¦‚文件大å°ï¼Œåƒç´ å°ºå¯¸ï¼ŒEXIF或IPTCä¿¡æ¯ï¼Œåœ¨æ•¸æ“šåº«ä¸­ã€‚</p>
+
+<p>當您åŒæ­¥ä¸Šå‚³æ‚¨çš„相冊,您必須首先åŒæ­¥ç›®éŒ„和文件</p>
+
+<p>在åŒæ­¥éŽç¨‹å¯èƒ½éœ€è¦å¾ˆé•·ä¸€æ®µæ™‚間(å–決於æœå‹™å™¨è² è¼‰ä»¥åŠç®¡ç†çš„元素數é‡ï¼‰ï¼Œæ‰€ä»¥å®ƒæ˜¯å¯ä»¥åšåˆ°ç›¸å†Šå°ç›¸å†Šçš„</p> \ No newline at end of file
diff --git a/language/zh_TW/help/user_list.html b/language/zh_TW/help/user_list.html
new file mode 100755
index 000000000..0567b416c
--- /dev/null
+++ b/language/zh_TW/help/user_list.html
@@ -0,0 +1,23 @@
+<h2>用戶列表</h2>
+
+<p>這ç†æ˜¯ä½ ç®¡ç†Piwigo相冊用戶的地方。</p>
+
+<h3>添加用戶</h3>
+
+<p>管ç†å“¡å¯ä»¥æ‰‹å‹•æ·»åŠ ç”¨æˆ¶ã€‚å°æ–¼æ¯å€‹ç”¨æˆ¶å‰µå»ºä¸€å€‹ç”¨æˆ¶å,一個密碼,並æ交有效的電å­éƒµä»¶åœ°å€ã€‚</p>
+
+<h3>用戶列表</h3>
+
+<p>在ç¾æœ‰ç”¨æˆ¶åˆ—表,å¯ä»¥éŽæ¿¾ç”¨æˆ¶å(使用 * 通é…符),群組或狀態。å¯ä»¥ä¾æ“šç™»è¨˜æ—¥æœŸæˆ–用戶å,å‡åºæˆ–é™åºæŽ’列。</p>
+
+<p>這個畫é¢å…許一次管ç†å¤šå€‹ç”¨æˆ¶ï¼Œä½¿ç”¨ä¸åŒçš„æ“作:</p>
+
+<ul>
+ <li>刪除用戶(需確èªï¼‰</li>
+ <li>改變用戶的狀態</li>
+ <li>é—œè¯æˆ–脫離於群體</li>
+ <li>修改顯示屬性</li>
+ <li>修改附加的å好</li>
+</ul>
+
+<p>目標是é¸å®šçš„用戶(默èªï¼‰ï¼Œæˆ–在éŽæ¿¾åˆ—表中所顯示的所有用戶。</p> \ No newline at end of file
diff --git a/language/zh_TW/install.lang.php b/language/zh_TW/install.lang.php
index 3f10b6a8d..cdc0ce45a 100644
--- a/language/zh_TW/install.lang.php
+++ b/language/zh_TW/install.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -25,18 +25,14 @@ $lang['Installation'] = '安è£';
$lang['Basic configuration'] = '基本設置';
$lang['Default gallery language'] = '圖庫默èªèªžè¨€';
$lang['Database configuration'] = '數據庫設置';
-$lang['Admin configuration'] = '管ç†å“¡å¸³æˆ¶è¨­ç½®';
+$lang['Admin configuration'] = '管ç†å“¡å¸³æˆ¶è¨­å®š';
$lang['Start Install'] = '開始安è£';
-$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = '郵箱地å€æ ¼å¼ xxx@yyy.eee (例 : jack@altern.org)';
-$lang['Webmaster login'] = '管ç†å“¡';
$lang['It will be shown to the visitors. It is necessary for website administration'] = '所有用戶都能看到此帳戶。必須æ供此帳戶來管ç†ç¶²ç«™';
$lang['Connection to server succeed, but it was impossible to connect to database'] = 'æœå‹™å™¨é€£æŽ¥æ­£å¸¸ï¼Œä½†æ˜¯ç„¡æ³•é€£æŽ¥åˆ°æ•¸æ“šåº«';
$lang['Can\'t connect to server'] = '無法連接到æœå‹™å™¨';
$lang['Host'] = 'MySQL主機地å€';
-$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
$lang['User'] = '用戶';
$lang['user login given by your host provider'] = '主機用戶å';
-$lang['Password'] = '密碼';
$lang['user password given by your host provider'] = '主機用戶密碼';
$lang['Database name'] = '數據庫å稱';
$lang['also given by your host provider'] = '在主機設定的數據庫å稱';
@@ -45,12 +41,10 @@ $lang['database tables names will be prefixed with it (enables you to manage bet
$lang['enter a login for webmaster'] = '請輸入網管å';
$lang['webmaster login can\'t contain characters \' or "'] = '網管åä¸æ‡‰åŒ…å«å­—符 " å’Œ \'';
$lang['please enter your password again'] = 'è«‹å†æ¬¡è¼¸å…¥å¯†ç¢¼';
-$lang['Webmaster password'] = '密碼';
$lang['Keep it confidential, it enables you to access administration panel'] = 'è«‹å°å¿ƒä¿ç®¡å¥½æ­¤å¯†ç¢¼ï¼Œå®ƒå…許你æ“作管ç†æ¿å¡Šã€‚';
$lang['Password [confirm]'] = '密碼 [ ç¢ºèª ]';
$lang['verification'] = '核實';
$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = '需è¦å¹«åŠ©ï¼Ÿ 請到<a href="%s">Piwigo論壇</a>æ出你的å•é¡Œ.';
-$lang['Webmaster mail address'] = '管ç†å“¡Email地å€';
$lang['Visitors will be able to contact site administrator with this mail'] = 'éŠå®¢é€šéŽæ­¤Emailè·Ÿä½ è¯ç¹«';
$lang['PHP 5 is required'] = '必須PHP 5版本';
$lang['It appears your webhost is currently running PHP %s.'] = '你主機PHP版本好åƒæ˜¯PHP %s.';
@@ -70,4 +64,5 @@ $lang['Just another Piwigo gallery'] = 'å¦ä¸€æœ¬Piwigo相片集';
$lang['Welcome to my photo gallery'] = '歡迎進入我的相片集';
$lang['Welcome to your new installation of Piwigo!'] = '歡迎安è£Piwigo!';
$lang['Don\'t hesitate to consult our forums for any help : %s'] = '如有任何å•é¡Œï¼Œè«‹è‡³æˆ‘們的論壇æ出:%s ';
+$lang['localhost or other, supplied by your host provider'] = '本地主機或其它,由你的主機æ供商æä¾›';
?> \ No newline at end of file
diff --git a/language/zh_TW/upgrade.lang.php b/language/zh_TW/upgrade.lang.php
index 56bca7c9c..883b7f62c 100644
--- a/language/zh_TW/upgrade.lang.php
+++ b/language/zh_TW/upgrade.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/local/config/index.php b/local/config/index.php
index 41732f2fd..c8de97f60 100644
--- a/local/config/index.php
+++ b/local/config/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/local/css/index.php b/local/css/index.php
index 41732f2fd..c8de97f60 100644
--- a/local/css/index.php
+++ b/local/css/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/local/index.php b/local/index.php
index 41732f2fd..c8de97f60 100644
--- a/local/index.php
+++ b/local/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/local/language/index.php b/local/language/index.php
index 41732f2fd..c8de97f60 100644
--- a/local/language/index.php
+++ b/local/language/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/nbm.php b/nbm.php
index a15da2dc3..3e89df03f 100644
--- a/nbm.php
+++ b/nbm.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -45,15 +45,14 @@ if (isset($_GET['subscribe'])
{
subscribe_notification_by_mail(false, array($_GET['subscribe']));
}
-else
-if (isset($_GET['unsubscribe'])
+else if (isset($_GET['unsubscribe'])
and preg_match('/^[A-Za-z0-9]{16}$/', $_GET['unsubscribe']))
{
unsubscribe_notification_by_mail(false, array($_GET['unsubscribe']));
}
else
{
- array_push($page['errors'], l10n('Unknown identifier'));
+ $page['errors'][] = l10n('Unknown identifier');
}
// +-----------------------------------------------------------------------+
diff --git a/notification.php b/notification.php
index 830bf9875..e0205e4e3 100644
--- a/notification.php
+++ b/notification.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/password.php b/password.php
index f242d48b5..abcd502bf 100644
--- a/password.php
+++ b/password.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -53,7 +53,7 @@ function process_password_request()
if (empty($_POST['username_or_email']))
{
- array_push($page['errors'], l10n('Invalid username or email'));
+ $page['errors'][] = l10n('Invalid username or email');
return false;
}
@@ -66,7 +66,7 @@ function process_password_request()
if (!is_numeric($user_id))
{
- array_push($page['errors'], l10n('Invalid username or email'));
+ $page['errors'][] = l10n('Invalid username or email');
return false;
}
@@ -76,18 +76,15 @@ function process_password_request()
$status = $userdata['status'];
if (is_a_guest($status) or is_generic($status))
{
- array_push($page['errors'], l10n('Password reset is not allowed for this user'));
+ $page['errors'][] = l10n('Password reset is not allowed for this user');
return false;
}
if (empty($userdata['email']))
{
- array_push(
- $page['errors'],
- sprintf(
- l10n('User "%s" has no email address, password reset is not possible'),
- $userdata['username']
- )
+ $page['errors'][] = l10n(
+ 'User "%s" has no email address, password reset is not possible',
+ $userdata['username']
);
return false;
}
@@ -108,8 +105,8 @@ function process_password_request()
set_make_full_url();
$message = l10n('Someone requested that the password be reset for the following user account:') . "\r\n\r\n";
- $message.= sprintf(
- l10n('Username "%s" on gallery %s'),
+ $message.= l10n(
+ 'Username "%s" on gallery %s',
$userdata['username'],
get_gallery_home_url()
);
@@ -130,12 +127,12 @@ function process_password_request()
if (pwg_mail($userdata['email'], $email_params))
{
- array_push($page['infos'], l10n('Check your email for the confirmation link'));
+ $page['infos'][] = l10n('Check your email for the confirmation link');
return true;
}
else
{
- array_push($page['errors'], l10n('Error sending email'));
+ $page['errors'][] = l10n('Error sending email');
return false;
}
}
@@ -152,7 +149,7 @@ function check_password_reset_key($key)
if (!preg_match('/^[a-z0-9]{20}$/i', $key))
{
- array_push($page['errors'], l10n('Invalid key'));
+ $page['errors'][] = l10n('Invalid key');
return false;
}
@@ -167,7 +164,7 @@ SELECT
if (pwg_db_num_rows($result) == 0)
{
- array_push($page['errors'], l10n('Invalid key'));
+ $page['errors'][] = l10n('Invalid key');
return false;
}
@@ -175,7 +172,7 @@ SELECT
if (is_a_guest($userdata['status']) or is_generic($userdata['status']))
{
- array_push($page['errors'], l10n('Password reset is not allowed for this user'));
+ $page['errors'][] = l10n('Password reset is not allowed for this user');
return false;
}
@@ -194,7 +191,7 @@ function reset_password()
if ($_POST['use_new_pwd'] != $_POST['passwordConf'])
{
- array_push($page['errors'], l10n('The passwords do not match'));
+ $page['errors'][] = l10n('The passwords do not match');
return false;
}
@@ -203,7 +200,7 @@ function reset_password()
$user_id = check_password_reset_key($_GET['key']);
if (!is_numeric($user_id))
{
- array_push($page['errors'], l10n('Invalid key'));
+ $page['errors'][] = l10n('Invalid key');
return false;
}
}
@@ -212,7 +209,7 @@ function reset_password()
// we check the currently logged in user
if (is_a_guest() or is_generic())
{
- array_push($page['errors'], l10n('Password reset is not allowed for this user'));
+ $page['errors'][] = l10n('Password reset is not allowed for this user');
return false;
}
@@ -225,15 +222,15 @@ function reset_password()
array($conf['user_fields']['id'] => $user_id)
);
- array_push($page['infos'], l10n('Your password has been reset'));
+ $page['infos'][] = l10n('Your password has been reset');
if (isset($_GET['key']))
{
- array_push($page['infos'], '<a href="'.get_root_url().'identification.php">'.l10n('Login').'</a>');
+ $page['infos'][] = '<a href="'.get_root_url().'identification.php">'.l10n('Login').'</a>';
}
else
{
- array_push($page['infos'], '<a href="'.get_gallery_home_url().'">'.l10n('Return to home page').'</a>');
+ $page['infos'][] = '<a href="'.get_gallery_home_url().'">'.l10n('Return to home page').'</a>';
}
return true;
diff --git a/picture.php b/picture.php
index 092b2aed2..98c9593fe 100644
--- a/picture.php
+++ b/picture.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -102,8 +102,8 @@ SELECT id
{
if ('best_rated'==$page['section'])
{
- $page['rank_of'][$page['image_id']] = count($page['items']);
- array_push($page['items'], $page['image_id'] );
+ $page['rank_of'][ $page['image_id'] ] = count($page['items']);
+ $page['items'][] = $page['image_id'];
}
else
{
@@ -150,7 +150,7 @@ trigger_action('loc_begin_picture');
function default_picture_content($content, $element_info)
{
global $conf;
-
+
if ( !empty($content) )
{// someone hooked us - so we skip;
return $content;
@@ -309,13 +309,8 @@ UPDATE '.CATEGORIES_TABLE.'
;';
pwg_query($query);
- $query = '
-UPDATE '.USER_CACHE_CATEGORIES_TABLE.'
- SET user_representative_picture_id = NULL
- WHERE user_id = '.$user['id'].'
- AND cat_id = '.$page['category']['id'].'
-;';
- pwg_query($query);
+ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+ invalidate_user_cache();
}
redirect($url_self);
@@ -377,7 +372,7 @@ UPDATE '.USER_CACHE_CATEGORIES_TABLE.'
}
unset($_POST['content']);
}
-
+
$edit_comment = $_GET['comment_to_edit'];
}
break;
@@ -473,13 +468,13 @@ $picture = array();
$ids = array($page['image_id']);
if (isset($page['previous_item']))
{
- array_push($ids, $page['previous_item']);
- array_push($ids, $page['first_item']);
+ $ids[] = $page['previous_item'];
+ $ids[] = $page['first_item'];
}
if (isset($page['next_item']))
{
- array_push($ids, $page['next_item']);
- array_push($ids, $page['last_item']);
+ $ids[] = $page['next_item'];
+ $ids[] = $page['last_item'];
}
$query = '
@@ -546,6 +541,7 @@ while ($row = pwg_db_fetch_assoc($result))
$picture[$i] = $row;
$picture[$i]['TITLE'] = render_element_name($row);
+ $picture[$i]['TITLE_ESC'] = str_replace('"', '&quot;', $picture[$i]['TITLE']);
if ('previous'==$i and $page['previous_item']==$page['first_item'])
{
@@ -773,7 +769,6 @@ if (is_admin())
array('action'=>'add_to_caddie')
),
'U_PHOTO_ADMIN' => $url_admin,
- 'U_ADMIN' => $url_admin, // TEMP 2.5 for backward compatibility
)
);
@@ -813,7 +808,9 @@ if (isset($picture['current']['comment'])
$template->assign(
'COMMENT_IMG',
trigger_event('render_element_description',
- $picture['current']['comment'])
+ $picture['current']['comment'],
+ 'picture_page_element_description'
+ )
);
}
@@ -864,8 +861,7 @@ if ($picture['current']['src_image']->is_original() and isset($picture['current'
// filesize
if (!empty($picture['current']['filesize']))
{
- $infos['INFO_FILESIZE'] =
- sprintf(l10n('%d Kb'), $picture['current']['filesize']);
+ $infos['INFO_FILESIZE'] = l10n('%d Kb', $picture['current']['filesize']);
}
// number of visits
@@ -949,6 +945,7 @@ $template->assign( 'ELEMENT_CONTENT', $element_content );
if (isset($picture['next'])
and $picture['next']['src_image']->is_original()
+ and $template->get_template_vars('U_PREFETCH') == null
and strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome/') === false)
{
$template->assign(
@@ -986,7 +983,6 @@ if ($conf['picture_menu'] AND (!isset($themeconf['hide_menu_on']) OR !in_array('
{
if (!isset($page['start'])) $page['start'] = 0;
include( PHPWG_ROOT_PATH.'include/menubar.inc.php');
- if (is_admin()) $template->assign('U_ADMIN', $url_admin); // overwrited by the menu TEMP 2.5 for backward compatibility
}
include(PHPWG_ROOT_PATH.'include/page_header.php');
diff --git a/plugins/LocalFilesEditor/admin.php b/plugins/LocalFilesEditor/admin.php
index 35b9a72a4..f9f297bd5 100644
--- a/plugins/LocalFilesEditor/admin.php
+++ b/plugins/LocalFilesEditor/admin.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -56,9 +56,8 @@ include_once(LOCALEDIT_PATH.'include/'.$page['tab'].'.inc.php');
if (isset($_POST['restore']))
{
$content_file = file_get_contents(get_bak_file($edited_file));
- array_push($page['infos'],
- l10n('locfiledit_bak_loaded1'),
- l10n('locfiledit_bak_loaded2'));
+ $page['infos'][] = l10n('locfiledit_bak_loaded1');
+ $page['infos'][] = l10n('locfiledit_bak_loaded2');
}
// +-----------------------------------------------------------------------+
@@ -70,7 +69,7 @@ if (isset($_POST['submit']))
if (!is_webmaster())
{
- array_push($page['errors'], l10n('locfiledit_webmaster_only'));
+ $page['errors'][] = l10n('locfiledit_webmaster_only');
}
else
{
@@ -81,7 +80,7 @@ if (isset($_POST['submit']))
}
if ($content_file === false)
{
- array_push($page['errors'], l10n('locfiledit_syntax_error'));
+ $page['errors'][] = l10n('locfiledit_syntax_error');
}
else
{
@@ -92,7 +91,7 @@ if (isset($_POST['submit']))
if (file_exists($edited_file))
{
@copy($edited_file, get_bak_file($edited_file));
- array_push($page['infos'], sprintf(l10n('locfiledit_saved_bak'), substr(get_bak_file($edited_file), 2)));
+ $page['infos'][] = l10n('locfiledit_saved_bak', substr(get_bak_file($edited_file), 2));
}
if ($file = @fopen($edited_file , "w"))
@@ -104,7 +103,7 @@ if (isset($_POST['submit']))
}
else
{
- array_push($page['errors'], l10n('locfiledit_cant_save'));
+ $page['errors'][] = l10n('locfiledit_cant_save');
}
}
}
@@ -149,4 +148,4 @@ $template->assign(array(
$template->assign_var_from_handle('ADMIN_CONTENT', 'plugin_admin_content');
-?> \ No newline at end of file
+?>
diff --git a/plugins/LocalFilesEditor/include/css.inc.php b/plugins/LocalFilesEditor/include/css.inc.php
index e1d70995a..17ea92766 100644
--- a/plugins/LocalFilesEditor/include/css.inc.php
+++ b/plugins/LocalFilesEditor/include/css.inc.php
@@ -64,7 +64,7 @@ $db_themes = $themes->get_db_themes();
$db_theme_ids = array();
foreach ($db_themes as $db_theme)
{
- array_push($db_theme_ids, $db_theme['id']);
+ $db_theme_ids[] = $db_theme['id'];
}
$active_themes = array();
@@ -85,12 +85,12 @@ foreach ($themes->fs_themes as $theme_id => $fs_theme)
}
else
{
- array_push($active_themes, $fs_theme);
+ $active_themes[] = $fs_theme;
}
}
else
{
- array_push($inactive_themes, $fs_theme);
+ $inactive_themes[] = $fs_theme;
}
}
diff --git a/plugins/LocalFilesEditor/include/functions.inc.php b/plugins/LocalFilesEditor/include/functions.inc.php
index 3411b4c08..46906225d 100644
--- a/plugins/LocalFilesEditor/include/functions.inc.php
+++ b/plugins/LocalFilesEditor/include/functions.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/include/tpl.inc.php b/plugins/LocalFilesEditor/include/tpl.inc.php
index 4e985ac92..c1079a8e7 100644
--- a/plugins/LocalFilesEditor/include/tpl.inc.php
+++ b/plugins/LocalFilesEditor/include/tpl.inc.php
@@ -39,7 +39,7 @@ if (isset($_POST['create_tpl']))
$filename = $_POST['tpl_name'];
if (empty($filename))
{
- array_push($page['errors'], l10n('locfiledit_empty_filename'));
+ $page['errors'][] = l10n('locfiledit_empty_filename');
}
if (get_extension($filename) != 'tpl')
{
@@ -47,15 +47,15 @@ if (isset($_POST['create_tpl']))
}
if (!preg_match('/^[a-zA-Z0-9-_.]+$/', $filename))
{
- array_push($page['errors'], l10n('locfiledit_filename_error'));
+ $page['errors'][] = l10n('locfiledit_filename_error');
}
if (is_numeric($_POST['tpl_model']) and $_POST['tpl_model'] != '0')
{
- array_push($page['errors'], l10n('locfiledit_model_error'));
+ $page['errors'][] = l10n('locfiledit_model_error');
}
if (file_exists($_POST['tpl_parent'] . '/' . $filename))
{
- array_push($page['errors'], l10n('locfiledit_file_already_exists'));
+ $page['errors'][] = l10n('locfiledit_file_already_exists');
}
if (!empty($page['errors']))
{
diff --git a/plugins/LocalFilesEditor/index.php b/plugins/LocalFilesEditor/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/LocalFilesEditor/index.php
+++ b/plugins/LocalFilesEditor/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/af_ZA/plugin.lang.php b/plugins/LocalFilesEditor/language/af_ZA/plugin.lang.php
index 00dc2088a..d423b0fb7 100755
--- a/plugins/LocalFilesEditor/language/af_ZA/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/af_ZA/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/ar_SA/index.php b/plugins/LocalFilesEditor/language/ar_SA/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/LocalFilesEditor/language/ar_SA/index.php
+++ b/plugins/LocalFilesEditor/language/ar_SA/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/ar_SA/plugin.lang.php b/plugins/LocalFilesEditor/language/ar_SA/plugin.lang.php
index f7a830ff1..39228585c 100644
--- a/plugins/LocalFilesEditor/language/ar_SA/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/ar_SA/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/bg_BG/plugin.lang.php b/plugins/LocalFilesEditor/language/bg_BG/plugin.lang.php
index 43dcdae91..a284e0ae1 100755
--- a/plugins/LocalFilesEditor/language/bg_BG/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/bg_BG/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/br_FR/description.txt b/plugins/LocalFilesEditor/language/br_FR/description.txt
new file mode 100755
index 000000000..69462e8f1
--- /dev/null
+++ b/plugins/LocalFilesEditor/language/br_FR/description.txt
@@ -0,0 +1 @@
+Evit aozañ restroù lec'hel eus skramm ar mererezh. \ No newline at end of file
diff --git a/plugins/LocalFilesEditor/language/br_FR/index.php b/plugins/LocalFilesEditor/language/br_FR/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/plugins/LocalFilesEditor/language/br_FR/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/plugins/LocalFilesEditor/language/br_FR/plugin.lang.php b/plugins/LocalFilesEditor/language/br_FR/plugin.lang.php
new file mode 100755
index 000000000..6aaece24c
--- /dev/null
+++ b/plugins/LocalFilesEditor/language/br_FR/plugin.lang.php
@@ -0,0 +1,53 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['locfiledit_newfile'] = 'Ne vo ket a restr betek ma vo lakaet titouroù dindan. Pa vo lakaet titouroù ha saveteet, krouet e vo ar restr.';
+$lang['locfiledit_model'] = 'Patrom';
+$lang['locfiledit_model_error'] = 'Ret eo deoc\'h dibab ur patrom.';
+$lang['locfiledit_new_filename'] = 'Anv ar restr';
+$lang['locfiledit_new_tpl'] = 'Krouiñ ur restr nevez';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_lang'] = 'Yezhoù';
+$lang['locfiledit_onglet_localconf'] = 'Kefluniadur lec\'hel';
+$lang['locfiledit_onglet_plug'] = 'Lugant personel';
+$lang['locfiledit_onglet_tpl'] = 'Patromoù';
+$lang['locfiledit_parent_directory'] = 'Kavlec\'h tad';
+$lang['locfiledit_restore'] = 'Adsevel ar restr saveteiñ';
+$lang['locfiledit_restore_confirm'] = 'Kadarnaat ?
+Ne vo ket adsavet betek ar saveteiñ gentañ.';
+$lang['locfiledit_save_bak'] = 'An eilad a vo krouet gant ar saveteerezh.';
+$lang['locfiledit_save_config'] = 'Skrivet mat ar restr';
+$lang['locfiledit_save_file'] = 'Saveteiñ ar restr';
+$lang['locfiledit_saved_bak'] = 'Restr saveteiñ krouet (%s)';
+$lang['locfiledit_show_default'] = 'Diskouez ar restr dave:';
+$lang['locfiledit_syntax_error'] = 'Fazi ereadurezh! Ne c\'hell ket ar restr bezañ saveteet.';
+$lang['locfiledit_webmaster_only'] = 'Ar mistri-gwiad hepken a c\'hell krouiñ pe cheñch restroù lec\'hel.';
+$lang['locfiledit_bak_loaded1'] = 'Restr saveteiñ karget.';
+$lang['locfiledit_bak_loaded2'] = 'Ret eo deoc\'h saveteiñ ar restr a-raok adsevel anezhi.';
+$lang['locfiledit_cant_save'] = 'N\'eo ket posubl skrivañ e restr red. Sellit m\'eo posubl skrivañ e kavlec\'h "local/" (chmod).';
+$lang['locfiledit_choose_file'] = 'Dibabit ar restr da aozañ';
+$lang['locfiledit_edit'] = 'Aozañ';
+$lang['locfiledit_empty_filename'] = 'Ret eo deoc\'h lakaat anv ar restr.';
+$lang['locfiledit_empty_page'] = 'Pajennad goullo';
+$lang['locfiledit_file_already_exists'] = 'Bez zo ar restr-mañ dija.';
+$lang['locfiledit_filename_error'] = 'Arouezennoù berzet a zo e anv ar restr.';
+?> \ No newline at end of file
diff --git a/plugins/LocalFilesEditor/language/ca_ES/plugin.lang.php b/plugins/LocalFilesEditor/language/ca_ES/plugin.lang.php
index 58c954d50..59009ecb8 100755
--- a/plugins/LocalFilesEditor/language/ca_ES/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/ca_ES/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/cs_CZ/index.php b/plugins/LocalFilesEditor/language/cs_CZ/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/LocalFilesEditor/language/cs_CZ/index.php
+++ b/plugins/LocalFilesEditor/language/cs_CZ/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/cs_CZ/plugin.lang.php b/plugins/LocalFilesEditor/language/cs_CZ/plugin.lang.php
index a3af05a0b..9ca473f05 100644
--- a/plugins/LocalFilesEditor/language/cs_CZ/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/cs_CZ/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// | plugin LocalFilesEditor ,czech lang by webprostor.eu |
diff --git a/plugins/LocalFilesEditor/language/da_DK/plugin.lang.php b/plugins/LocalFilesEditor/language/da_DK/plugin.lang.php
index fa7bfd56f..198fd1ce5 100755
--- a/plugins/LocalFilesEditor/language/da_DK/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/da_DK/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/de_DE/index.php b/plugins/LocalFilesEditor/language/de_DE/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/LocalFilesEditor/language/de_DE/index.php
+++ b/plugins/LocalFilesEditor/language/de_DE/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/de_DE/plugin.lang.php b/plugins/LocalFilesEditor/language/de_DE/plugin.lang.php
index 80edb3b2e..97f938368 100644
--- a/plugins/LocalFilesEditor/language/de_DE/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/de_DE/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/el_GR/plugin.lang.php b/plugins/LocalFilesEditor/language/el_GR/plugin.lang.php
index f0e052c32..82b73aa68 100755
--- a/plugins/LocalFilesEditor/language/el_GR/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/el_GR/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/en_UK/index.php b/plugins/LocalFilesEditor/language/en_UK/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/LocalFilesEditor/language/en_UK/index.php
+++ b/plugins/LocalFilesEditor/language/en_UK/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/en_UK/plugin.lang.php b/plugins/LocalFilesEditor/language/en_UK/plugin.lang.php
index 6b23de318..165b22b6d 100644
--- a/plugins/LocalFilesEditor/language/en_UK/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/en_UK/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/eo_EO/description.txt b/plugins/LocalFilesEditor/language/eo_EO/description.txt
new file mode 100755
index 000000000..dbc9ff915
--- /dev/null
+++ b/plugins/LocalFilesEditor/language/eo_EO/description.txt
@@ -0,0 +1 @@
+Redaktu lokajn dosierojn el la administra panelo. \ No newline at end of file
diff --git a/plugins/LocalFilesEditor/language/eo_EO/plugin.lang.php b/plugins/LocalFilesEditor/language/eo_EO/plugin.lang.php
new file mode 100755
index 000000000..02741686d
--- /dev/null
+++ b/plugins/LocalFilesEditor/language/eo_EO/plugin.lang.php
@@ -0,0 +1,53 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['locfiledit_restore'] = 'RestaÅ­ri la savdosieron';
+$lang['locfiledit_restore_confirm'] = 'Bonvolu konfirmi.
+RestaÅ­rado efektiviÄos post musklako ĉe Konservi.';
+$lang['locfiledit_save_bak'] = 'Savkopio kreiÄos dum konserviÄo.';
+$lang['locfiledit_save_config'] = 'La dosiero sukcese skribiÄis.';
+$lang['locfiledit_save_file'] = 'Konservi dosieron';
+$lang['locfiledit_saved_bak'] = 'Savdosiero kreiÄis (%s)';
+$lang['locfiledit_show_default'] = 'Vidigu referencan dosieron:';
+$lang['locfiledit_syntax_error'] = 'Sintakseraro! Ne eblas konservi la dosieron.';
+$lang['locfiledit_webmaster_only'] = 'Nur retestroj povas krei aÅ­ modifi lokajn dosierojn.';
+$lang['locfiledit_bak_loaded1'] = 'Savdosiero Åargita.';
+$lang['locfiledit_bak_loaded2'] = 'Vi devas konservi la dosieron por restaÅ­ri Äin.';
+$lang['locfiledit_cant_save'] = 'La kuranta dosiero ne skribeblas. Kontrolu ĉu la permesilo de la dosierujo "local/" taŭgas (chmod).';
+$lang['locfiledit_choose_file'] = 'Elektu la dosiero redaktota.';
+$lang['locfiledit_edit'] = 'Redakti';
+$lang['locfiledit_empty_filename'] = 'Vi devas tajpi la dosieran nomon.';
+$lang['locfiledit_empty_page'] = 'Malplena paÄo';
+$lang['locfiledit_file_already_exists'] = 'La dosiero jam ekzistas.';
+$lang['locfiledit_filename_error'] = 'Malpermesitaj signoj en la dosiera nomo.';
+$lang['locfiledit_model'] = 'Modelo';
+$lang['locfiledit_model_error'] = 'Elektu modelon.';
+$lang['locfiledit_new_filename'] = 'Dosiera nomo.';
+$lang['locfiledit_new_tpl'] = 'Krei novan dosieron';
+$lang['locfiledit_newfile'] = 'La dosiero ne ekzistas Äis informoj tajpiÄas ĉisube. Äœi kreiÄos ekde informoj entajpiÄas kaj registriÄas.';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_lang'] = 'Lingvoj';
+$lang['locfiledit_onglet_localconf'] = 'Loka agordo';
+$lang['locfiledit_onglet_plug'] = 'Persona kromaĵo';
+$lang['locfiledit_onglet_tpl'] = 'Åœablonoj';
+$lang['locfiledit_parent_directory'] = 'Parenca dosierujo';
+?> \ No newline at end of file
diff --git a/plugins/LocalFilesEditor/language/es_ES/index.php b/plugins/LocalFilesEditor/language/es_ES/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/LocalFilesEditor/language/es_ES/index.php
+++ b/plugins/LocalFilesEditor/language/es_ES/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/es_ES/plugin.lang.php b/plugins/LocalFilesEditor/language/es_ES/plugin.lang.php
index f5cba18fc..356e0f3a4 100644
--- a/plugins/LocalFilesEditor/language/es_ES/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/es_ES/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/et_EE/plugin.lang.php b/plugins/LocalFilesEditor/language/et_EE/plugin.lang.php
index 52153566b..edfd7a8e1 100755
--- a/plugins/LocalFilesEditor/language/et_EE/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/et_EE/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/fa_IR/plugin.lang.php b/plugins/LocalFilesEditor/language/fa_IR/plugin.lang.php
index d55a95130..e1618d771 100755
--- a/plugins/LocalFilesEditor/language/fa_IR/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/fa_IR/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/fi_FI/plugin.lang.php b/plugins/LocalFilesEditor/language/fi_FI/plugin.lang.php
index 93dff909b..3aa3a28f7 100755
--- a/plugins/LocalFilesEditor/language/fi_FI/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/fi_FI/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/fr_CA/index.php b/plugins/LocalFilesEditor/language/fr_CA/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/LocalFilesEditor/language/fr_CA/index.php
+++ b/plugins/LocalFilesEditor/language/fr_CA/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/fr_CA/plugin.lang.php b/plugins/LocalFilesEditor/language/fr_CA/plugin.lang.php
index 1c429ea78..8caf06c16 100644
--- a/plugins/LocalFilesEditor/language/fr_CA/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/fr_CA/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/fr_FR/index.php b/plugins/LocalFilesEditor/language/fr_FR/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/LocalFilesEditor/language/fr_FR/index.php
+++ b/plugins/LocalFilesEditor/language/fr_FR/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/fr_FR/plugin.lang.php b/plugins/LocalFilesEditor/language/fr_FR/plugin.lang.php
index df7127c85..1c5931cef 100644
--- a/plugins/LocalFilesEditor/language/fr_FR/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/fr_FR/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/gl_ES/plugin.lang.php b/plugins/LocalFilesEditor/language/gl_ES/plugin.lang.php
index 250731e2f..0653ff5ea 100755
--- a/plugins/LocalFilesEditor/language/gl_ES/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/gl_ES/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/he_IL/index.php b/plugins/LocalFilesEditor/language/he_IL/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/LocalFilesEditor/language/he_IL/index.php
+++ b/plugins/LocalFilesEditor/language/he_IL/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/he_IL/plugin.lang.php b/plugins/LocalFilesEditor/language/he_IL/plugin.lang.php
index 811f4b879..6ef6b5743 100644
--- a/plugins/LocalFilesEditor/language/he_IL/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/he_IL/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/hr_HR/index.php b/plugins/LocalFilesEditor/language/hr_HR/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/LocalFilesEditor/language/hr_HR/index.php
+++ b/plugins/LocalFilesEditor/language/hr_HR/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/hr_HR/plugin.lang.php b/plugins/LocalFilesEditor/language/hr_HR/plugin.lang.php
index 6cb4af01a..d66562afc 100644
--- a/plugins/LocalFilesEditor/language/hr_HR/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/hr_HR/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/hu_HU/index.php b/plugins/LocalFilesEditor/language/hu_HU/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/LocalFilesEditor/language/hu_HU/index.php
+++ b/plugins/LocalFilesEditor/language/hu_HU/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/hu_HU/plugin.lang.php b/plugins/LocalFilesEditor/language/hu_HU/plugin.lang.php
index 2f22fa70e..e41269fb8 100644
--- a/plugins/LocalFilesEditor/language/hu_HU/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/hu_HU/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/index.php b/plugins/LocalFilesEditor/language/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/LocalFilesEditor/language/index.php
+++ b/plugins/LocalFilesEditor/language/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/it_IT/index.php b/plugins/LocalFilesEditor/language/it_IT/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/LocalFilesEditor/language/it_IT/index.php
+++ b/plugins/LocalFilesEditor/language/it_IT/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/it_IT/plugin.lang.php b/plugins/LocalFilesEditor/language/it_IT/plugin.lang.php
index d7b504be7..e3da0f8f8 100644
--- a/plugins/LocalFilesEditor/language/it_IT/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/it_IT/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -26,19 +26,19 @@ $lang['locfiledit_onglet_css'] = 'CSS';
$lang['locfiledit_onglet_tpl'] = 'Templates';
$lang['locfiledit_onglet_lang'] = 'Lingue';
$lang['locfiledit_onglet_plug'] = 'Plugin Personale';
-$lang['locfiledit_cant_save'] = 'Non è stato possibile scrivere il file. Verificare i permessi di scrittura (chmod) della directory "local/".';
+$lang['locfiledit_cant_save'] = 'Il file corrente non è scrivibile. Verificare i permessi di scrittura (chmod) della directory "local/".';
$lang['locfiledit_newfile'] = 'Il file non esiste fino a quando qualche informazione verrà inserita di seguito. Una volta che le informazioni sono inserite e salvate, il file verrà creato.';
-$lang['locfiledit_save_config'] = 'Il file è stato salvato.';
-$lang['locfiledit_show_default'] = 'Visualizzare il file ';
+$lang['locfiledit_save_config'] = 'File salvato con successo';
+$lang['locfiledit_show_default'] = 'Visualizzare file di riferimento:';
$lang['locfiledit_save_bak'] = 'Una copia di backup del file sarà creata durante la fase di salvataggio.';
$lang['locfiledit_saved_bak'] = 'Una copia di backup è stata creata (%s)';
$lang['locfiledit_save_file'] = 'Salvare il file';
-$lang['locfiledit_choose_file'] = 'Scegliere un file da editare';
-$lang['locfiledit_edit'] = 'Editare';
+$lang['locfiledit_choose_file'] = 'Scegliere un file da modificare';
+$lang['locfiledit_edit'] = 'Modificare';
$lang['locfiledit_restore'] = 'Caricare il file di backup';
$lang['locfiledit_restore_confirm'] = 'Si prega di confermare?
Il ripristino non sarà effettivo fino al successivo salvataggio.';
-$lang['locfiledit_bak_loaded1'] = 'Copia di backup caricata';
+$lang['locfiledit_bak_loaded1'] = 'Copia di backup caricata.';
$lang['locfiledit_bak_loaded2'] = 'E\' necessario salvare il file per ripristinarlo.';
$lang['locfiledit_syntax_error'] = 'Errore di sintassi! Impossible salvare il file.';
$lang['locfiledit_new_tpl'] = 'Creare un nuovo file';
@@ -48,7 +48,7 @@ $lang['locfiledit_empty_page'] = 'Pagina vuota';
$lang['locfiledit_parent_directory'] = 'Directory parente';
$lang['locfiledit_filename_error'] = 'Caratteri vietati nel nome del file.';
$lang['locfiledit_file_already_exists'] = 'Il file esiste già.';
-$lang['locfiledit_model_error'] = 'Selezionare un modello.';
-$lang['locfiledit_empty_filename'] = 'Indicate un nome di file.';
+$lang['locfiledit_model_error'] = 'E\' necessario scegliere un modello.';
+$lang['locfiledit_empty_filename'] = 'E\' necessario inserire il nome del file.';
$lang['locfiledit_webmaster_only'] = 'Solo i webmasters sono autorizzati a creare o modificare i file locali.';
?> \ No newline at end of file
diff --git a/plugins/LocalFilesEditor/language/ja_JP/index.php b/plugins/LocalFilesEditor/language/ja_JP/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/LocalFilesEditor/language/ja_JP/index.php
+++ b/plugins/LocalFilesEditor/language/ja_JP/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/ja_JP/plugin.lang.php b/plugins/LocalFilesEditor/language/ja_JP/plugin.lang.php
index 4c3a4cce2..a1608776d 100644
--- a/plugins/LocalFilesEditor/language/ja_JP/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/ja_JP/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/ka_GE/index.php b/plugins/LocalFilesEditor/language/ka_GE/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/LocalFilesEditor/language/ka_GE/index.php
+++ b/plugins/LocalFilesEditor/language/ka_GE/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/ka_GE/plugin.lang.php b/plugins/LocalFilesEditor/language/ka_GE/plugin.lang.php
index 9d10cd6dc..8de794beb 100644
--- a/plugins/LocalFilesEditor/language/ka_GE/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/ka_GE/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/kn_IN/description.txt b/plugins/LocalFilesEditor/language/kn_IN/description.txt
new file mode 100755
index 000000000..3d9917657
--- /dev/null
+++ b/plugins/LocalFilesEditor/language/kn_IN/description.txt
@@ -0,0 +1 @@
+ಸà³à²¥à²³à³€à²¯ ಕಡತಗಳನà³à²¨à³ ನಿರà³à²µà²¹à²£à²¾ ಪà³à²¯à²¾à²¨à³†à²²à³ ನಿಂದ ಸಂಪಾದಿಸಿ. \ No newline at end of file
diff --git a/plugins/LocalFilesEditor/language/kn_IN/plugin.lang.php b/plugins/LocalFilesEditor/language/kn_IN/plugin.lang.php
new file mode 100755
index 000000000..1c26ccbee
--- /dev/null
+++ b/plugins/LocalFilesEditor/language/kn_IN/plugin.lang.php
@@ -0,0 +1,52 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['locfiledit_restore'] = 'ಕಡತವನà³à²¨à³ ಮರà³à²¬à²³à²¸à²¿';
+$lang['locfiledit_restore_confirm'] = 'ದಯವಿಟà³à²Ÿà³ ಖಾತà³à²°à²¿à²ªà²¡à²¿à²¸à²¿? ಮà³à²‚ದಿನ ಉಳಿಕೆಯವರೆಗೂ ಮರà³à²¬à²³à²•à³† ಪರಿಣಮಕಾರಿಯಾಗಿರà³à²µà³à²¦à²¿à²²à³à²².';
+$lang['locfiledit_save_bak'] = 'ಬà³à²¯à²¾à²•à³ ಅಪೠಪà³à²°à²¤à²¿ ಉಳಿಸಿದ ನಂತರ ರಚನೆಯಾಗà³à²¤à³à²¤à²¦à³†.';
+$lang['locfiledit_save_config'] = 'ಕಡತವನà³à²¨à³ ಯಶಸà³à²µà²¿à²¯à²¾à²—ಿ ಬರೆಯಲಾಗಿದೆ.';
+$lang['locfiledit_save_file'] = 'ಕಡತವನà³à²¨à³ ಉಳಿಸಿ';
+$lang['locfiledit_saved_bak'] = 'ಬà³à²¯à²¾à²•à³ ಅಪೠಪà³à²°à²¤à²¿ ರಚನೆಯಾಗಿದೆ(%s)';
+$lang['locfiledit_show_default'] = 'ಉಲà³à²²à³‡à²– ಕಡತವನà³à²¨à³ ಪà³à²°à²¦à²°à³à²¶à²¿à²¸à²¿.';
+$lang['locfiledit_syntax_error'] = 'ಪದ-ವಿನà³à²¯à²¾à²¸ ದೋಷ! ಕಡತವನà³à²¨à³ ಉಳಿಸಲಾಗಲಿಲà³à²².';
+$lang['locfiledit_webmaster_only'] = 'ಕೇವಲ ವೆಬೠಮಾಸà³à²Ÿà²°à³ ಗಳೠಮಾತà³à²° ಸà³à²¥à²³à³€à²¯ ಕಡತಗಳನà³à²¨à³ ರಚಿಸಬಲà³à²²à²°à³ ಅಥವಾ ಬದಲಾಯಿಸಬಲà³à²²à²°à³.';
+$lang['locfiledit_bak_loaded1'] = 'ಬà³à²¯à²¾à²•à³ ಅಪೠಕಡತವನà³à²¨à³ ತà³à²‚ಬಲಾಗಿದೆ.';
+$lang['locfiledit_bak_loaded2'] = 'ನೀವೠಮರà³à²¬à²³à²¸à²²à³ ಕಡತವನà³à²¨à³ ಉಳಿಸಲೇಬೇಕà³.';
+$lang['locfiledit_cant_save'] = 'ಪà³à²°à²¸à³à²¤à³à²¤ ಕಡತ ಬರೆಯಬಲà³à²²à³à²¦à²¾à²—ಿಲà³à²². "local/" ಡೈರೆಕà³à²Ÿà²°à²¿ ಬರೆಯಬಲà³à²²à³à²¦à³‡ ಎಂಬà³à²¦à²¨à³à²¨à³ ಪರೀಕà³à²·à²¿à²¸à²¿ (chmod).';
+$lang['locfiledit_choose_file'] = 'ಸಂಪಾದನೆಗಾಗಿ ಕಡತವನà³à²¨à³ ಆರಿಸಿರಿ.';
+$lang['locfiledit_edit'] = 'ಸಂಪಾದನೆ';
+$lang['locfiledit_empty_filename'] = 'ನೀವೠಕಡತದ ಹೆಸರನà³à²¨à³ ನಮೂದಿಸಲೇಬೇಕà³.';
+$lang['locfiledit_empty_page'] = 'ಖಾಲಿ ಪà³à²Ÿ';
+$lang['locfiledit_file_already_exists'] = 'ಕಡತ ಈಗಾಗಲೇ ಅಸà³à²¤à²¿à²¤à³à²µà²¦à²²à³à²²à²¿à²¦à³†.';
+$lang['locfiledit_filename_error'] = 'ನಿಷೇಧಿತ ಅಕà³à²·à²°à²—ಳೠಕಡತದ ಹೆಸರಿನಲà³à²²à²¿ ಇವೆ.';
+$lang['locfiledit_model'] = 'ನಮೂನೆ';
+$lang['locfiledit_model_error'] = 'ನೀವೠನಮೂನೆಯನà³à²¨à³ ಆರಿಸಲೇಬೇಕà³.';
+$lang['locfiledit_new_filename'] = 'ಕಡತದ ಹೆಸರà³';
+$lang['locfiledit_new_tpl'] = 'ಹೊಸ ಕಡತವನà³à²¨à³ ರಚಿಸಿ.';
+$lang['locfiledit_newfile'] = 'ಈ ಕೆಳಗೆ ಕೆಲವೠಮಾಹಿತಿಗಳನà³à²¨à³ ನಮೂದಿಸದ ಹೊರತೠಕಡತ ಅಸà³à²¤à²¿à²¤à³à²µà²¦à²²à³à²²à²¿à²°à³à²µà³à²¦à²¿à²²à³à²². ಒಮà³à²®à³† ಮಾಹಿತಿ ನಮೂದಾಗಿ ಉಳಿಸಿದ ನಂತರ ಕಡತ ರಚನೆಯಾಗà³à²¤à³à²¤à²¦à³†.';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_lang'] = 'ಭಾಷೆಗಳà³';
+$lang['locfiledit_onglet_localconf'] = 'ಲೋಕಲೠಕಾನà³à²«à²¿à²—à³';
+$lang['locfiledit_onglet_plug'] = 'ವೈಯಕà³à²¤à²¿à²• ಪà³à²²à²—ೠಇನೠ';
+$lang['locfiledit_onglet_tpl'] = 'ನಮೂನೆಗಳà³';
+$lang['locfiledit_parent_directory'] = 'ಪೇರೆಂಟೠಡೈರೆಕà³à²Ÿà²°à²¿';
+?> \ No newline at end of file
diff --git a/plugins/LocalFilesEditor/language/lt_LT/description.txt b/plugins/LocalFilesEditor/language/lt_LT/description.txt
new file mode 100755
index 000000000..f6e626ff0
--- /dev/null
+++ b/plugins/LocalFilesEditor/language/lt_LT/description.txt
@@ -0,0 +1 @@
+Redaguoti vietinius failus iš administracijos puslapio. \ No newline at end of file
diff --git a/plugins/LocalFilesEditor/language/lt_LT/plugin.lang.php b/plugins/LocalFilesEditor/language/lt_LT/plugin.lang.php
new file mode 100755
index 000000000..9a8402595
--- /dev/null
+++ b/plugins/LocalFilesEditor/language/lt_LT/plugin.lang.php
@@ -0,0 +1,53 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['locfiledit_restore_confirm'] = 'Prašome patvirtinimo.
+Failo atstatymas nebus efektyvus kol nebus išsaugotas.';
+$lang['locfiledit_save_file'] = 'IÅ¡saugoti failÄ…';
+$lang['locfiledit_parent_directory'] = 'Pirminis katalogas';
+$lang['locfiledit_choose_file'] = 'Pasirinkite failą, kurį norite redaguoti';
+$lang['locfiledit_show_default'] = 'Parodyti pradinį failą: ';
+$lang['locfiledit_restore'] = 'Įkrauti atsarginę kopiją';
+$lang['locfiledit_save_bak'] = 'Atsarginė kopija bus sukurta tik išsaugant.';
+$lang['locfiledit_save_config'] = 'Failas sėkmingai įrašytas.';
+$lang['locfiledit_saved_bak'] = 'AtsarginÄ— kopija sukurta (%s)';
+$lang['locfiledit_syntax_error'] = 'Sintaksės klaida! Neįmanoma įrašyti failo.';
+$lang['locfiledit_webmaster_only'] = 'Tik webmasteriai gali kurti ar modifikuoti vietinius failus.';
+$lang['locfiledit_bak_loaded1'] = 'Atsarginė kopija įkrauta.';
+$lang['locfiledit_bak_loaded2'] = 'Jūs turite išsaugoti failą, kad galėtumėte jį atstatyti.';
+$lang['locfiledit_cant_save'] = 'Šio failo neišeis išsaugoti. Pasitikrinkite ar į kataloga "local/" leidžiama rašyti (chmod).';
+$lang['locfiledit_edit'] = 'Redaguoti';
+$lang['locfiledit_empty_filename'] = 'Turite įvesti failo pavadinimą.';
+$lang['locfiledit_empty_page'] = 'TuÅ¡Äias puslapis';
+$lang['locfiledit_file_already_exists'] = 'Toks failas jau egzistuoja.';
+$lang['locfiledit_filename_error'] = 'Draudžiami simboliai failo pavadinime.';
+$lang['locfiledit_model'] = 'Modelis';
+$lang['locfiledit_model_error'] = 'Turite pasirinkti modelį';
+$lang['locfiledit_new_filename'] = 'Failo pavadinimas';
+$lang['locfiledit_new_tpl'] = 'Sukurti naujÄ… failÄ…';
+$lang['locfiledit_newfile'] = 'Failas neegzistuoja, kol neįvesta informacija žemiau. Kai tik ką nors įvesite ir išsaugosite, tuomet failas ir bus sukurtas.';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_lang'] = 'Kalbos';
+$lang['locfiledit_onglet_localconf'] = 'Vietinė konfigūracija';
+$lang['locfiledit_onglet_plug'] = 'Asmeninis priedas';
+$lang['locfiledit_onglet_tpl'] = 'Å ablonai';
+?> \ No newline at end of file
diff --git a/plugins/LocalFilesEditor/language/lv_LV/index.php b/plugins/LocalFilesEditor/language/lv_LV/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/LocalFilesEditor/language/lv_LV/index.php
+++ b/plugins/LocalFilesEditor/language/lv_LV/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/lv_LV/plugin.lang.php b/plugins/LocalFilesEditor/language/lv_LV/plugin.lang.php
index 91abb54f8..56f9affe4 100644
--- a/plugins/LocalFilesEditor/language/lv_LV/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/lv_LV/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/mn_MN/description.txt b/plugins/LocalFilesEditor/language/mn_MN/description.txt
new file mode 100755
index 000000000..3e38763fa
--- /dev/null
+++ b/plugins/LocalFilesEditor/language/mn_MN/description.txt
@@ -0,0 +1 @@
+Удирдлагын Ñ‚Ð°Ð»Ð±Ð°Ñ€Ð°Ð°Ñ Ñ‚Ð¾Ñ…Ð¸Ñ€Ð³Ð¾Ð¾Ð½Ñ‹ файлуудыг заÑах. \ No newline at end of file
diff --git a/plugins/LocalFilesEditor/language/mn_MN/index.php b/plugins/LocalFilesEditor/language/mn_MN/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/plugins/LocalFilesEditor/language/mn_MN/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/plugins/LocalFilesEditor/language/mn_MN/plugin.lang.php b/plugins/LocalFilesEditor/language/mn_MN/plugin.lang.php
new file mode 100755
index 000000000..493e84b85
--- /dev/null
+++ b/plugins/LocalFilesEditor/language/mn_MN/plugin.lang.php
@@ -0,0 +1,52 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['locfiledit_cant_save'] = 'Тухайн файлд бичлÑг хийх боломжгүй байна. "local/" Ñ…Ð°Ð²Ñ‚Ð°Ñ Ó©Ó©Ñ€Ñ‡Ð»Ó©Ð»Ñ‚ хийх боломтой ÑÑÑхийг шалгана уу (chmod).';
+$lang['locfiledit_empty_page'] = 'ХуудÑыг цÑвÑрлÑÑ…';
+$lang['locfiledit_show_default'] = 'Тайлбар файлыг харуулах:';
+$lang['locfiledit_onglet_plug'] = 'ÐÑмÑлт өргөтгөл';
+$lang['locfiledit_save_bak'] = 'Хадгалах үед нөөц файл Ò¯Ò¯ÑÑÑ… болно.';
+$lang['locfiledit_parent_directory'] = 'ҮндÑÑн хавтаÑ';
+$lang['locfiledit_onglet_tpl'] = 'Эх загвар';
+$lang['locfiledit_onglet_localconf'] = 'Тохиргооны файл';
+$lang['locfiledit_filename_error'] = 'Файлын нÑÑ€Ñнд зөвшөөрөгдөөгүй Ñ‚ÑмдÑгт орÑон байна.';
+$lang['locfiledit_webmaster_only'] = 'Файлыг зөвхөн вÑбмаÑтер Ò¯Ò¯ÑгÑж, заÑах боломжтой.';
+$lang['locfiledit_restore'] = 'Ðөөц Ñ„Ð°Ð¹Ð»Ð°Ð°Ñ ÑÑргÑÑÑ…';
+$lang['locfiledit_saved_bak'] = 'Ðөөц файлыг амжилттай Ò¯Ò¯ÑгÑлÑÑ (%s)';
+$lang['locfiledit_syntax_error'] = 'БичлÑгийн алдаа! Файлыг хадгалах боломжгүй.';
+$lang['locfiledit_file_already_exists'] = 'Ийм нÑртÑй файл байна.';
+$lang['locfiledit_save_config'] = 'Файлыг амжилттай хадгаллаа';
+$lang['locfiledit_save_file'] = 'Хадгалах';
+$lang['locfiledit_choose_file'] = 'ЗаÑах файлаа Ñонгоно уу';
+$lang['locfiledit_edit'] = 'ЗаÑах';
+$lang['locfiledit_empty_filename'] = 'Файлын нÑÑ€ÑÑ Ð¾Ñ€ÑƒÑƒÐ»Ð½Ð° уу.';
+$lang['locfiledit_model'] = 'Загвар';
+$lang['locfiledit_model_error'] = 'Загвараа Ñонгоно уу';
+$lang['locfiledit_new_filename'] = 'Файлын нÑÑ€';
+$lang['locfiledit_new_tpl'] = 'Ð¨Ð¸Ð½Ñ Ñ„Ð°Ð¹Ð» Ò¯Ò¯ÑгÑÑ…';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_lang'] = 'Ð¥Ñл';
+$lang['locfiledit_newfile'] = 'Доорхи талбарт мÑдÑÑлÑл Ð¾Ñ€ÑƒÑƒÐ»Ð°Ñ…Ð°Ð°Ñ Ð½Ð°Ð°Ñˆ файл шинÑÑÑ€ Ò¯Ò¯ÑÑхгүй. ÐœÑдÑÑлÑл оруулж хадгалÑаны дараа файл шинÑÑÑ€ Ò¯Ò¯ÑÑÑ… болно.';
+$lang['locfiledit_bak_loaded1'] = 'Ðөөцийн файлыг ÑÑргÑÑлÑÑ.';
+$lang['locfiledit_bak_loaded2'] = 'ÐÓ©Ó©Ñ†Ó©Ó©Ñ ÑÑргÑÑхийн тулд хадгалах Ñ…ÑÑ€ÑгтÑй.';
+$lang['locfiledit_restore_confirm'] = 'Та итгÑлтÑй байна уу? Хадгалах хүртÑл ÑÑргÑÑлт идÑвхжихгүй гÑдгийг анхаарна уу.';
+?> \ No newline at end of file
diff --git a/plugins/LocalFilesEditor/language/nb_NO/index.php b/plugins/LocalFilesEditor/language/nb_NO/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/LocalFilesEditor/language/nb_NO/index.php
+++ b/plugins/LocalFilesEditor/language/nb_NO/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/nb_NO/plugin.lang.php b/plugins/LocalFilesEditor/language/nb_NO/plugin.lang.php
index 4b8de1cda..1d34947af 100644
--- a/plugins/LocalFilesEditor/language/nb_NO/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/nb_NO/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/nl_NL/index.php b/plugins/LocalFilesEditor/language/nl_NL/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/LocalFilesEditor/language/nl_NL/index.php
+++ b/plugins/LocalFilesEditor/language/nl_NL/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/nl_NL/plugin.lang.php b/plugins/LocalFilesEditor/language/nl_NL/plugin.lang.php
index 3eee6bba7..be25fedad 100644
--- a/plugins/LocalFilesEditor/language/nl_NL/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/nl_NL/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -26,13 +26,13 @@ $lang['locfiledit_onglet_css'] = 'CSS';
$lang['locfiledit_onglet_tpl'] = 'Templates';
$lang['locfiledit_onglet_lang'] = 'Talen';
$lang['locfiledit_onglet_plug'] = 'Persoonlijke Plugin';
-$lang['locfiledit_cant_save'] = 'Er kan niet naar het gebruikte bestand geschreven worden. Controleer of een directorie "local/" beschrijfbaar is (chmod).';
-$lang['locfiledit_newfile'] = 'Bestand bestaat niet en zal worden aangemaakt door de LocalFiles Editor';
+$lang['locfiledit_cant_save'] = 'Er kan niet naar het gebruikte bestand geschreven worden. Controleer of directory "local/" beschrijfbaar is (chmod).';
+$lang['locfiledit_newfile'] = 'Het bestand bestaat niet totdat er hieronder informatie wordt ingevoerd. Zodra informatie wordt ingevoerd en opgeslagen, wordt het bestand aangemaakt.';
$lang['locfiledit_save_config'] = 'Bestand succesvol beschreven.';
$lang['locfiledit_show_default'] = 'Geef het referentie-bestand weer: ';
$lang['locfiledit_save_bak'] = 'Bij het opslaan wordt een backup-bestand aangemaakt.';
$lang['locfiledit_saved_bak'] = 'Backup-bestand aangemaakt (%s)';
-$lang['locfiledit_save_file'] = 'opslaan bestand';
+$lang['locfiledit_save_file'] = 'Opslaan bestand';
$lang['locfiledit_choose_file'] = 'Kies het te wijzigen bestand';
$lang['locfiledit_edit'] = 'Wijzig';
$lang['locfiledit_restore'] = 'Restore het backup-bestand';
@@ -45,8 +45,8 @@ $lang['locfiledit_new_tpl'] = 'Maak nieuw bestand aan';
$lang['locfiledit_new_filename'] = 'Bestandsnaam';
$lang['locfiledit_model'] = 'Model';
$lang['locfiledit_empty_page'] = 'Lege pagina';
-$lang['locfiledit_parent_directory'] = 'Bovenliggende directorie';
-$lang['locfiledit_filename_error'] = 'Niet toegestane teken(s) in bestandsnaam.';
+$lang['locfiledit_parent_directory'] = 'Bovenliggende directory';
+$lang['locfiledit_filename_error'] = 'Niet toegestane tekens in bestandsnaam.';
$lang['locfiledit_file_already_exists'] = 'Bestand bestaat reeds.';
$lang['locfiledit_model_error'] = 'U moet een model kiezen.';
$lang['locfiledit_empty_filename'] = 'U moet een bestandsnaam opgeven.';
diff --git a/plugins/LocalFilesEditor/language/nn_NO/description.txt b/plugins/LocalFilesEditor/language/nn_NO/description.txt
new file mode 100755
index 000000000..f09a8d791
--- /dev/null
+++ b/plugins/LocalFilesEditor/language/nn_NO/description.txt
@@ -0,0 +1 @@
+Endre lokale filer frå administrasjonspanelet. \ No newline at end of file
diff --git a/plugins/LocalFilesEditor/language/nn_NO/plugin.lang.php b/plugins/LocalFilesEditor/language/nn_NO/plugin.lang.php
new file mode 100755
index 000000000..7f0cb5cb0
--- /dev/null
+++ b/plugins/LocalFilesEditor/language/nn_NO/plugin.lang.php
@@ -0,0 +1,53 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['locfiledit_restore'] = 'Gjenopprett frå sikringskopi';
+$lang['locfiledit_restore_confirm'] = 'Bekreft?
+Gjennoppretting vil ikkje trå i kraft før neste lagring.';
+$lang['locfiledit_save_bak'] = 'Sikringskopi vil bli oppretta ved lagring.';
+$lang['locfiledit_save_config'] = 'Fila vart lagra.';
+$lang['locfiledit_save_file'] = 'Lagre fil';
+$lang['locfiledit_saved_bak'] = 'Sikringskopi oppretta (%s)';
+$lang['locfiledit_show_default'] = 'Vis referansefil';
+$lang['locfiledit_syntax_error'] = 'Syntaksfeil! Fila kan ikkje lagrast.';
+$lang['locfiledit_webmaster_only'] = 'Bare webmaster kan opprette eller lagre lokale filer.';
+$lang['locfiledit_bak_loaded1'] = 'Reservekopifil er lasta opp';
+$lang['locfiledit_bak_loaded2'] = 'Du må fyrst lagre fila før du kan gjenopprette den.';
+$lang['locfiledit_cant_save'] = 'Gjeldande fil er ikkje skrivbar. Sjekk at katalogen "local/" er skrivbar (chmod)';
+$lang['locfiledit_choose_file'] = 'Velg fil som skal endrast';
+$lang['locfiledit_edit'] = 'Endre';
+$lang['locfiledit_empty_filename'] = 'Du må skrive inn filnamnet';
+$lang['locfiledit_empty_page'] = 'Tom side';
+$lang['locfiledit_file_already_exists'] = 'Fila finst allerie.';
+$lang['locfiledit_filename_error'] = 'Forbode tegn i filnamn.';
+$lang['locfiledit_model'] = 'Modell/mal';
+$lang['locfiledit_model_error'] = 'Du må velge ein model/mal';
+$lang['locfiledit_new_filename'] = 'Filnamn';
+$lang['locfiledit_new_tpl'] = 'Lag ny fil';
+$lang['locfiledit_newfile'] = 'Fila eksisterer ikkje før det er skrive inn noko innhald under. Straks informasjon er skrive inn og lagra, vil fila bli oppretta.';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_lang'] = 'Språk';
+$lang['locfiledit_onglet_localconf'] = 'Lokal konfigurasjon';
+$lang['locfiledit_onglet_plug'] = 'Personleg tilleggsprogram';
+$lang['locfiledit_onglet_tpl'] = 'Malar';
+$lang['locfiledit_parent_directory'] = 'Foreldrekatalog';
+?> \ No newline at end of file
diff --git a/plugins/LocalFilesEditor/language/pl_PL/index.php b/plugins/LocalFilesEditor/language/pl_PL/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/LocalFilesEditor/language/pl_PL/index.php
+++ b/plugins/LocalFilesEditor/language/pl_PL/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/pl_PL/plugin.lang.php b/plugins/LocalFilesEditor/language/pl_PL/plugin.lang.php
index ba52f113a..52afb425c 100644
--- a/plugins/LocalFilesEditor/language/pl_PL/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/pl_PL/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/pt_BR/plugin.lang.php b/plugins/LocalFilesEditor/language/pt_BR/plugin.lang.php
index 0ad6457c0..3e782713f 100755
--- a/plugins/LocalFilesEditor/language/pt_BR/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/pt_BR/plugin.lang.php
@@ -1,49 +1,49 @@
<?php
-// +-----------------------------------------------------------------------+
-// | Piwigo - a PHP based photo gallery |
-// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
-// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
-// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
-// +-----------------------------------------------------------------------+
-// | 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 |
-// | |
-// | This program is distributed in the hope that it will be useful, but |
-// | WITHOUT ANY WARRANTY; without even the implied warranty of |
-// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
-// | General Public License for more details. |
-// | |
-// | You should have received a copy of the GNU General Public License |
-// | along with this program; if not, write to the Free Software |
-// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
-// | USA. |
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
// +-----------------------------------------------------------------------+
$lang['locfiledit_bak_loaded1'] = 'Faça cópia do arquivo baixado.';
-$lang['locfiledit_bak_loaded2'] = 'Você deve salvar o arquivo para reustaurá-lo';
+$lang['locfiledit_bak_loaded2'] = 'Você deve salvar o arquivo para restaurá-lo.';
$lang['locfiledit_cant_save'] = 'O arquivo atual não tem permissão de escrita. Verifique se o diretório "local/" tem permissão de escrita (chmod).';
-$lang['locfiledit_choose_file'] = 'Escolha o arquivo a ser editado.';
+$lang['locfiledit_choose_file'] = 'Escolha o arquivo a ser editado';
$lang['locfiledit_edit'] = 'Edite';
$lang['locfiledit_empty_filename'] = 'Você deve entrar com o nome do arquivo.';
$lang['locfiledit_empty_page'] = 'Página vazia';
-$lang['locfiledit_file_already_exists'] = 'O arquivo já existe';
+$lang['locfiledit_file_already_exists'] = 'O arquivo já existe.';
$lang['locfiledit_filename_error'] = 'Caracteres não permitidos no nome do arquivo.';
$lang['locfiledit_model_error'] = 'Você deve escolher um modelo.';
$lang['locfiledit_model'] = 'Modelo';
$lang['locfiledit_new_filename'] = 'Nome do arquivo';
$lang['locfiledit_new_tpl'] = 'Cria novo arquivo';
-$lang['locfiledit_newfile'] = 'O arquivo não existe e será criado pelo Editor Local de Arquivos';
+$lang['locfiledit_newfile'] = 'O arquivo não existe e será criado pelo Editor Local de Arquivos.';
$lang['locfiledit_onglet_css'] = 'CSS';
$lang['locfiledit_onglet_lang'] = 'Idiomas';
$lang['locfiledit_onglet_localconf'] = 'Configuração local';
$lang['locfiledit_onglet_plug'] = 'Plugin Pessoal';
$lang['locfiledit_onglet_tpl'] = 'Templates';
-$lang['locfiledit_parent_directory'] = 'Diretório Pai';
-$lang['locfiledit_restore_confirm'] = 'Confirma por favor? A restauração não será efetiva até o próximo salvar.';
+$lang['locfiledit_parent_directory'] = 'Pasta pai';
+$lang['locfiledit_restore_confirm'] = 'Confirme por favor? A restauração não será efetiva até o próximo salvar.';
$lang['locfiledit_restore'] = 'Restaura a cópia de segurança';
$lang['locfiledit_save_bak'] = 'Cópia de segurança será criada ao salvar.';
-$lang['locfiledit_save_config'] = 'Arquivo escrito com sucesso.';
+$lang['locfiledit_save_config'] = 'Arquivo gravado com sucesso.';
$lang['locfiledit_save_file'] = 'Salvar arquivo';
$lang['locfiledit_saved_bak'] = 'Cópia de segurança criada (%s)';
$lang['locfiledit_show_default'] = 'Mostre o arquivo de referência:';
diff --git a/plugins/LocalFilesEditor/language/pt_PT/index.php b/plugins/LocalFilesEditor/language/pt_PT/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/LocalFilesEditor/language/pt_PT/index.php
+++ b/plugins/LocalFilesEditor/language/pt_PT/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/pt_PT/plugin.lang.php b/plugins/LocalFilesEditor/language/pt_PT/plugin.lang.php
index fc12231f1..4de22760f 100644
--- a/plugins/LocalFilesEditor/language/pt_PT/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/pt_PT/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/ro_RO/description.txt b/plugins/LocalFilesEditor/language/ro_RO/description.txt
new file mode 100755
index 000000000..a35a896d4
--- /dev/null
+++ b/plugins/LocalFilesEditor/language/ro_RO/description.txt
@@ -0,0 +1 @@
+Modifică fișierele locale din panoul de administrare. \ No newline at end of file
diff --git a/plugins/LocalFilesEditor/language/ro_RO/plugin.lang.php b/plugins/LocalFilesEditor/language/ro_RO/plugin.lang.php
new file mode 100755
index 000000000..e9fb6ad13
--- /dev/null
+++ b/plugins/LocalFilesEditor/language/ro_RO/plugin.lang.php
@@ -0,0 +1,53 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['locfiledit_cant_save'] = 'Fișerul curent nu poate fi scris. Cerifică dacă dosarul "local/" poate fi scris (chmod).';
+$lang['locfiledit_parent_directory'] = 'Dosarul părinte';
+$lang['locfiledit_restore_confirm'] = 'Confirmă.
+Restaurarea nu va intra în efect până la urmatoarea salvare.';
+$lang['locfiledit_bak_loaded1'] = 'Copia de siguranță a fost încărcată.';
+$lang['locfiledit_restore'] = 'Restaurează copia de siguranță';
+$lang['locfiledit_save_bak'] = 'Copia de siguranță va fi creată odată cu salvarea.';
+$lang['locfiledit_saved_bak'] = 'Copia de siguranță a fost creată (%s)';
+$lang['locfiledit_webmaster_only'] = 'Numai webmasterii pot crea sau modifica fișiere locale.';
+$lang['locfiledit_new_tpl'] = 'Crează un fișier nou';
+$lang['locfiledit_bak_loaded2'] = 'Trebuie să salvezi un fișier pentru a-l restaura.';
+$lang['locfiledit_newfile'] = 'Acest fișier nu va exista pănâ cand nu vei introduce informațiile de mai jos. Odată ce informația va fi introdusă și salvată, fișierul va fi creat.';
+$lang['locfiledit_onglet_plug'] = 'Plugin personal';
+$lang['locfiledit_choose_file'] = 'Alege fișierul de modificat';
+$lang['locfiledit_edit'] = 'Modifică';
+$lang['locfiledit_empty_filename'] = 'Trebuie să introduci numele fișierului.';
+$lang['locfiledit_empty_page'] = 'Pagină goală';
+$lang['locfiledit_file_already_exists'] = 'Fișierul există deja';
+$lang['locfiledit_filename_error'] = 'Caractere interzise în numele fișierului.';
+$lang['locfiledit_model'] = 'Model';
+$lang['locfiledit_model_error'] = 'Trebuie să alegi un model';
+$lang['locfiledit_new_filename'] = 'Numele fișierului';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_lang'] = 'Limbi';
+$lang['locfiledit_onglet_localconf'] = 'Configurație locală';
+$lang['locfiledit_onglet_tpl'] = 'Șabloane';
+$lang['locfiledit_save_config'] = 'Fișierul a fost scris cu succes.';
+$lang['locfiledit_save_file'] = 'Salvează fișier';
+$lang['locfiledit_show_default'] = 'Arată fișierul de referințăȘ';
+$lang['locfiledit_syntax_error'] = 'Eroare de sintaxă! Fișierul nu poate fi salvat.';
+?> \ No newline at end of file
diff --git a/plugins/LocalFilesEditor/language/ru_RU/index.php b/plugins/LocalFilesEditor/language/ru_RU/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/LocalFilesEditor/language/ru_RU/index.php
+++ b/plugins/LocalFilesEditor/language/ru_RU/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/ru_RU/plugin.lang.php b/plugins/LocalFilesEditor/language/ru_RU/plugin.lang.php
index 526ac38d7..942bd6b68 100644
--- a/plugins/LocalFilesEditor/language/ru_RU/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/ru_RU/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -26,7 +26,7 @@ $lang['locfiledit_onglet_css'] = 'CSS';
$lang['locfiledit_onglet_tpl'] = 'Шаблоны';
$lang['locfiledit_onglet_lang'] = 'Языки';
$lang['locfiledit_onglet_plug'] = 'Личный плагин';
-$lang['locfiledit_cant_save'] = 'Текущий файл не может быть запиÑан. Проверьте, имеютÑÑ Ð»Ð¸ права завиÑи в директории "local/" (chmod).';
+$lang['locfiledit_cant_save'] = 'Текущий файл не может быть запиÑан. Проверьте, имеютÑÑ Ð»Ð¸ права запиÑи в директории "local/" (chmod).';
$lang['locfiledit_newfile'] = 'Файл не ÑущеÑтвует и будет Ñоздан LocalFilesEditor';
$lang['locfiledit_save_config'] = 'Файл запиÑан уÑпешно';
$lang['locfiledit_show_default'] = 'Показать иÑходный файл: ';
diff --git a/plugins/LocalFilesEditor/language/sh_RS/plugin.lang.php b/plugins/LocalFilesEditor/language/sh_RS/plugin.lang.php
index 8398604bb..23925ffeb 100755
--- a/plugins/LocalFilesEditor/language/sh_RS/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/sh_RS/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/sk_SK/index.php b/plugins/LocalFilesEditor/language/sk_SK/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/LocalFilesEditor/language/sk_SK/index.php
+++ b/plugins/LocalFilesEditor/language/sk_SK/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/sk_SK/plugin.lang.php b/plugins/LocalFilesEditor/language/sk_SK/plugin.lang.php
index e89f566cd..9b9852ca8 100644
--- a/plugins/LocalFilesEditor/language/sk_SK/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/sk_SK/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/sl_SI/description.txt b/plugins/LocalFilesEditor/language/sl_SI/description.txt
new file mode 100755
index 000000000..5202d65e1
--- /dev/null
+++ b/plugins/LocalFilesEditor/language/sl_SI/description.txt
@@ -0,0 +1 @@
+Urejanje lokalnih datotek iz administratorske ploÅ¡Äe \ No newline at end of file
diff --git a/plugins/LocalFilesEditor/language/sl_SI/plugin.lang.php b/plugins/LocalFilesEditor/language/sl_SI/plugin.lang.php
new file mode 100755
index 000000000..e3ce11457
--- /dev/null
+++ b/plugins/LocalFilesEditor/language/sl_SI/plugin.lang.php
@@ -0,0 +1,53 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['locfiledit_restore'] = 'Obnovi varnostno datoteko';
+$lang['locfiledit_restore_confirm'] = 'Prosimo potrdite?
+Obnovitev ne bo v veljavi do naslednje shranitve.';
+$lang['locfiledit_save_bak'] = 'Varnostna kopija bo ustvarjena ob shranitvi.';
+$lang['locfiledit_save_config'] = 'Datoteka je bila uspešno zapisana.';
+$lang['locfiledit_save_file'] = 'Shrani datoteko';
+$lang['locfiledit_saved_bak'] = 'Varnostna kopija ustvarjena (%s)';
+$lang['locfiledit_show_default'] = 'Prikaži referenÄno datoteko:';
+$lang['locfiledit_syntax_error'] = 'Napaka v sintaksi. Datoteke se ne da shraniti.';
+$lang['locfiledit_webmaster_only'] = 'Lokalne datoteke lahko ustvari ali spreminja le skrbnik.';
+$lang['locfiledit_bak_loaded1'] = 'Varnostna datoteka naložena';
+$lang['locfiledit_bak_loaded2'] = 'Datoteko morate shraniti pred obnovitvijo';
+$lang['locfiledit_cant_save'] = 'Trenutna datoteka ni zapisljiva. Preverite, Äe je direktorij "local/" zapisljiv (chmod)';
+$lang['locfiledit_choose_file'] = 'Izberite datoteko za urejanje';
+$lang['locfiledit_edit'] = 'Uredi';
+$lang['locfiledit_empty_filename'] = 'Vpisati morate ime datoteke';
+$lang['locfiledit_empty_page'] = 'Prazna stran';
+$lang['locfiledit_file_already_exists'] = 'Datoteka že obstaja';
+$lang['locfiledit_filename_error'] = 'Prepovedani znaki v imenu datoteke';
+$lang['locfiledit_model'] = 'Model';
+$lang['locfiledit_model_error'] = 'Izbrati morate model';
+$lang['locfiledit_new_filename'] = 'Ime datoteke';
+$lang['locfiledit_new_tpl'] = 'Ustvari novo datoteko';
+$lang['locfiledit_newfile'] = 'Datoteka ne obstaja dokler spodaj ne vnesete nekaj informacij. Ko so informacije vnesene in shranjene bo datoteka kreirana.';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_lang'] = 'Jeziki';
+$lang['locfiledit_onglet_localconf'] = 'Local config';
+$lang['locfiledit_onglet_plug'] = 'Osebni vtiÄnik';
+$lang['locfiledit_onglet_tpl'] = 'Predloge';
+$lang['locfiledit_parent_directory'] = 'Nadrejeni direktorij';
+?> \ No newline at end of file
diff --git a/plugins/LocalFilesEditor/language/sr_RS/index.php b/plugins/LocalFilesEditor/language/sr_RS/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/LocalFilesEditor/language/sr_RS/index.php
+++ b/plugins/LocalFilesEditor/language/sr_RS/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/sr_RS/plugin.lang.php b/plugins/LocalFilesEditor/language/sr_RS/plugin.lang.php
index 87b5424c0..858166d88 100644
--- a/plugins/LocalFilesEditor/language/sr_RS/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/sr_RS/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/sv_SE/index.php b/plugins/LocalFilesEditor/language/sv_SE/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/LocalFilesEditor/language/sv_SE/index.php
+++ b/plugins/LocalFilesEditor/language/sv_SE/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/sv_SE/plugin.lang.php b/plugins/LocalFilesEditor/language/sv_SE/plugin.lang.php
index 874e3c809..695c1e3f5 100644
--- a/plugins/LocalFilesEditor/language/sv_SE/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/sv_SE/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/ta_IN/description.txt b/plugins/LocalFilesEditor/language/ta_IN/description.txt
new file mode 100755
index 000000000..33bb8761d
--- /dev/null
+++ b/plugins/LocalFilesEditor/language/ta_IN/description.txt
@@ -0,0 +1,2 @@
+உளà¯à®³à®®à¯ˆ கோபà¯à®ªà¯à®•à®³à¯ˆ திரà¯à®¤à¯à®¤
+நிரà¯à®µà®¾à®•à®¤à¯à®¤à®¿à®©à¯ பலகதà¯à®¤à®¿à®²à¯. \ No newline at end of file
diff --git a/plugins/LocalFilesEditor/language/ta_IN/plugin.lang.php b/plugins/LocalFilesEditor/language/ta_IN/plugin.lang.php
new file mode 100755
index 000000000..aa49e766e
--- /dev/null
+++ b/plugins/LocalFilesEditor/language/ta_IN/plugin.lang.php
@@ -0,0 +1,41 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['locfiledit_file_already_exists'] = 'கோபà¯à®ªà¯ à®à®±à¯à®•à®©à®µà¯‡ உளà¯à®³à®¤à¯.';
+$lang['locfiledit_edit'] = 'திரà¯à®¤à¯à®¤à¯à®•';
+$lang['locfiledit_empty_filename'] = 'நீஙà¯à®•à®³à¯ கோபà¯à®ªà®¿à®©à¯ பெயரை உளà¯à®³à®¿à®Ÿ வேணà¯à®Ÿà¯à®®à¯.';
+$lang['locfiledit_empty_page'] = 'வெறà¯à®±à¯ பகà¯à®•à®®à¯';
+$lang['locfiledit_choose_file'] = 'திரà¯à®¤à¯à®¤ வேணà¯à®Ÿà¯à®®à¯ எனà¯à®± கோபà¯à®ªà®¿à®©à¯ˆ தேரà¯à®µà¯à®šà¯†à®¯à¯à®•
+';
+$lang['locfiledit_bak_loaded1'] = 'மறà¯à®ªà®¿à®°à®¤à®¿ கோபà¯à®ªà¯ à®à®±à¯à®±à®ªà¯à®ªà®Ÿà¯à®®à¯.';
+$lang['locfiledit_bak_loaded2'] = 'அதை மீடà¯à®• கோபà¯à®ªà¯ சேமிகà¯à®• வேணà¯à®Ÿà¯à®®à¯.';
+$lang['locfiledit_cant_save'] = 'தறà¯à®ªà¯‡à®¾à®¤à¯ˆà®¯ கோபà¯à®ªà¯ எழà¯à®¤à®•à¯à®•à¯‚டிய அலà¯à®². கோபà¯à®ªà®•à®®à¯ "local/" எழà¯à®¤à®•à¯à®•à¯‚டிய (chmod) எனà¯à®±à¯ சரிபாரà¯à®•à¯à®•à®µà¯à®®à¯.';
+$lang['locfiledit_onglet_lang'] = 'மொழிகளà¯';
+$lang['locfiledit_onglet_localconf'] = 'உள௠கடà¯à®Ÿà®®à¯ˆà®ªà¯à®ªà¯';
+$lang['locfiledit_onglet_plug'] = 'தனிபà¯à®ªà®Ÿà¯à®Ÿ செரà¯à®•à¯à®¨à®¿à®°à®²à¯';
+$lang['locfiledit_onglet_tpl'] = 'வாரà¯à®ªà¯à®ªà¯à®°à¯à®•à¯à®•à®³à¯';
+$lang['locfiledit_filename_error'] = 'கோபà¯à®ªà¯ பெயர௠எழà¯à®¤à¯à®¤à¯à®•à¯à®•à®³à¯ தடை.';
+$lang['locfiledit_model'] = 'மாதிரி';
+$lang['locfiledit_model_error'] = 'நீஙà¯à®•à®³à¯ ஒர௠மாதிரி தேரà¯à®µà¯ செயà¯à®¯ வேணà¯à®Ÿà¯à®®à¯.';
+$lang['locfiledit_new_filename'] = 'கோபà¯à®ªà¯ பெயரà¯';
+$lang['locfiledit_new_tpl'] = 'பà¯à®¤à®¿à®¯ கோபà¯à®ªà¯ உரà¯à®µà®¾à®•à¯à®•';
+?> \ No newline at end of file
diff --git a/plugins/LocalFilesEditor/language/th_TH/index.php b/plugins/LocalFilesEditor/language/th_TH/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/LocalFilesEditor/language/th_TH/index.php
+++ b/plugins/LocalFilesEditor/language/th_TH/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/th_TH/plugin.lang.php b/plugins/LocalFilesEditor/language/th_TH/plugin.lang.php
index 83ca59b90..6659f1fee 100644
--- a/plugins/LocalFilesEditor/language/th_TH/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/th_TH/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/tr_TR/index.php b/plugins/LocalFilesEditor/language/tr_TR/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/LocalFilesEditor/language/tr_TR/index.php
+++ b/plugins/LocalFilesEditor/language/tr_TR/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/tr_TR/plugin.lang.php b/plugins/LocalFilesEditor/language/tr_TR/plugin.lang.php
index 7d61e5386..af35b6211 100644
--- a/plugins/LocalFilesEditor/language/tr_TR/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/tr_TR/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -21,7 +21,7 @@
// | USA. |
// +-----------------------------------------------------------------------+
-$lang['locfiledit_onglet_localconf'] = 'Yerel ayarlar';
+$lang['locfiledit_onglet_localconf'] = 'Yerel yapılandırma';
$lang['locfiledit_onglet_css'] = 'CSS';
$lang['locfiledit_onglet_tpl'] = 'Åžablonlar';
$lang['locfiledit_onglet_lang'] = 'Diller';
@@ -49,7 +49,7 @@ $lang['locfiledit_empty_page'] = 'BoÅŸ sayfa';
$lang['locfiledit_parent_directory'] = 'Ãœst dizin';
$lang['locfiledit_filename_error'] = 'Dosya adında yasaklanmış karakterler var.';
$lang['locfiledit_file_already_exists'] = 'Bu dosya zaten var.';
-$lang['locfiledit_model_error'] = 'Bir model seçmek zorundasınız.';
+$lang['locfiledit_model_error'] = 'Bir model seçmelisiniz.';
$lang['locfiledit_empty_filename'] = 'Dosya ismini girmelisiniz.';
-$lang['locfiledit_webmaster_only'] = 'Sadece yöneticiler dosyaları yaratabilir veya değiştirebilir.';
+$lang['locfiledit_webmaster_only'] = 'Sadece yöneticiler yerel dosyaları yaratabilir veya değiştirebilir.';
?> \ No newline at end of file
diff --git a/plugins/LocalFilesEditor/language/uk_UA/plugin.lang.php b/plugins/LocalFilesEditor/language/uk_UA/plugin.lang.php
index 24511aefd..10a585992 100644
--- a/plugins/LocalFilesEditor/language/uk_UA/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/uk_UA/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/vi_VN/index.php b/plugins/LocalFilesEditor/language/vi_VN/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/LocalFilesEditor/language/vi_VN/index.php
+++ b/plugins/LocalFilesEditor/language/vi_VN/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/vi_VN/plugin.lang.php b/plugins/LocalFilesEditor/language/vi_VN/plugin.lang.php
index 3beafadde..514c9ae06 100644
--- a/plugins/LocalFilesEditor/language/vi_VN/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/vi_VN/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/zh_CN/index.php b/plugins/LocalFilesEditor/language/zh_CN/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/LocalFilesEditor/language/zh_CN/index.php
+++ b/plugins/LocalFilesEditor/language/zh_CN/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/zh_CN/plugin.lang.php b/plugins/LocalFilesEditor/language/zh_CN/plugin.lang.php
index 3387ba26d..ae3b4568e 100644
--- a/plugins/LocalFilesEditor/language/zh_CN/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/zh_CN/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/zh_HK/description.txt b/plugins/LocalFilesEditor/language/zh_HK/description.txt
new file mode 100755
index 000000000..513365a9f
--- /dev/null
+++ b/plugins/LocalFilesEditor/language/zh_HK/description.txt
@@ -0,0 +1 @@
+在管ç†é¢æ¿ç·¨è¼¯æœ¬åœ°æª”案。 \ No newline at end of file
diff --git a/plugins/LocalFilesEditor/language/zh_HK/plugin.lang.php b/plugins/LocalFilesEditor/language/zh_HK/plugin.lang.php
new file mode 100755
index 000000000..c60a8b493
--- /dev/null
+++ b/plugins/LocalFilesEditor/language/zh_HK/plugin.lang.php
@@ -0,0 +1,53 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['locfiledit_restore'] = '將備份檔案還原';
+$lang['locfiledit_restore_confirm'] = '請確定?
+還原將ä¸æœƒæœ‰æ•ˆï¼Œç›´åˆ°æœ‰ä¸‹ä¸€å€‹å„²å­˜ã€‚';
+$lang['locfiledit_save_bak'] = '儲存時會建立備份副本。';
+$lang['locfiledit_save_config'] = '檔案æˆåŠŸåœ°å¯«å…¥ã€‚';
+$lang['locfiledit_save_file'] = '儲存檔案';
+$lang['locfiledit_saved_bak'] = '建立的備份檔案(%s)';
+$lang['locfiledit_show_default'] = '顯示åƒç…§æª”案:';
+$lang['locfiledit_syntax_error'] = '語法錯誤ï¼ç„¡æ³•å„²å­˜æª”案。';
+$lang['locfiledit_webmaster_only'] = 'åªæœ‰ç¶²ç«™ç®¡ç†å“¡å¯ä»¥å»ºç«‹æˆ–修改本地檔案。';
+$lang['locfiledit_bak_loaded1'] = '載入備份文件。';
+$lang['locfiledit_bak_loaded2'] = '您必須儲存檔案來還原它。';
+$lang['locfiledit_cant_save'] = '檔案是無法寫入。檢查目錄"local/"有寫入權é™(chmod)。';
+$lang['locfiledit_choose_file'] = 'é¸æ“‡è¦ç·¨è¼¯çš„檔案';
+$lang['locfiledit_edit'] = '編輯';
+$lang['locfiledit_empty_filename'] = '您必須輸入檔案å稱。';
+$lang['locfiledit_empty_page'] = '空é ';
+$lang['locfiledit_file_already_exists'] = '檔案已存在。';
+$lang['locfiledit_filename_error'] = '檔案å有ç¦æ­¢çš„字符。';
+$lang['locfiledit_model'] = '模å¼';
+$lang['locfiledit_model_error'] = 'ä½ å¿…é ˆé¸æ“‡ä¸€ç¨®æ¨¡å¼ã€‚';
+$lang['locfiledit_new_filename'] = '檔案å稱';
+$lang['locfiledit_new_tpl'] = '建立新的檔案';
+$lang['locfiledit_newfile'] = '該檔案ä¸å­˜åœ¨ï¼Œç›´åˆ°è¼¸å…¥ä¸€äº›ä¿¡æ¯ã€‚ä¿¡æ¯ä¸€æ—¦è¼¸å…¥ä¸¦ä¿å­˜ï¼Œè©²æ–‡ä»¶å°‡è¢«å‰µå»ºã€‚';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_lang'] = '語言';
+$lang['locfiledit_onglet_localconf'] = '本地設定';
+$lang['locfiledit_onglet_plug'] = '個人æ’件';
+$lang['locfiledit_onglet_tpl'] = '範本';
+$lang['locfiledit_parent_directory'] = '父目錄';
+?> \ No newline at end of file
diff --git a/plugins/LocalFilesEditor/language/zh_TW/index.php b/plugins/LocalFilesEditor/language/zh_TW/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/LocalFilesEditor/language/zh_TW/index.php
+++ b/plugins/LocalFilesEditor/language/zh_TW/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/language/zh_TW/plugin.lang.php b/plugins/LocalFilesEditor/language/zh_TW/plugin.lang.php
index fb110f516..fa5fd70a8 100644
--- a/plugins/LocalFilesEditor/language/zh_TW/plugin.lang.php
+++ b/plugins/LocalFilesEditor/language/zh_TW/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/main.inc.php b/plugins/LocalFilesEditor/main.inc.php
index 5fe5de586..22731cc64 100644
--- a/plugins/LocalFilesEditor/main.inc.php
+++ b/plugins/LocalFilesEditor/main.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -23,7 +23,7 @@
/*
Plugin Name: LocalFiles Editor
-Version: 2.5.0
+Version: 2.6.0
Description: Edit local files from administration panel
Plugin URI: http://piwigo.org/ext/extension_view.php?eid=144
Author: Piwigo team
@@ -35,12 +35,9 @@ define('LOCALEDIT_PATH' , PHPWG_PLUGINS_PATH . basename(dirname(__FILE__)) . '/'
function localfiles_admin_menu($menu)
{
- array_push(
- $menu,
- array(
- 'NAME' => 'LocalFiles Editor',
- 'URL' => get_root_url().'admin.php?page=plugin-'.basename(dirname(__FILE__))
- )
+ $menu[] = array(
+ 'NAME' => 'LocalFiles Editor',
+ 'URL' => get_root_url().'admin.php?page=plugin-'.basename(dirname(__FILE__))
);
return $menu;
diff --git a/plugins/LocalFilesEditor/maintain.inc.php b/plugins/LocalFilesEditor/maintain.inc.php
index 7a36ab7c2..d3c628932 100644
--- a/plugins/LocalFilesEditor/maintain.inc.php
+++ b/plugins/LocalFilesEditor/maintain.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/LocalFilesEditor/show_default.php b/plugins/LocalFilesEditor/show_default.php
index 1caad19ec..d688ddb76 100644
--- a/plugins/LocalFilesEditor/show_default.php
+++ b/plugins/LocalFilesEditor/show_default.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/admin_multi_view/index.php b/plugins/admin_multi_view/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/admin_multi_view/index.php
+++ b/plugins/admin_multi_view/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/admin_multi_view/language/ar_SA/index.php b/plugins/admin_multi_view/language/ar_SA/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/admin_multi_view/language/ar_SA/index.php
+++ b/plugins/admin_multi_view/language/ar_SA/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/admin_multi_view/language/br_FR/description.txt b/plugins/admin_multi_view/language/br_FR/description.txt
new file mode 100755
index 000000000..38a475be0
--- /dev/null
+++ b/plugins/admin_multi_view/language/br_FR/description.txt
@@ -0,0 +1 @@
+Ar merourien a c'hello gwellet ar palier evel an implijerien, ha cheñch yezh ha tem diwar nij. Talvoudus eo evit dizreinañ cheñchamantoù. \ No newline at end of file
diff --git a/plugins/admin_multi_view/language/br_FR/index.php b/plugins/admin_multi_view/language/br_FR/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/plugins/admin_multi_view/language/br_FR/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/plugins/admin_multi_view/language/cs_CZ/index.php b/plugins/admin_multi_view/language/cs_CZ/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/admin_multi_view/language/cs_CZ/index.php
+++ b/plugins/admin_multi_view/language/cs_CZ/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/admin_multi_view/language/de_DE/index.php b/plugins/admin_multi_view/language/de_DE/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/admin_multi_view/language/de_DE/index.php
+++ b/plugins/admin_multi_view/language/de_DE/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/admin_multi_view/language/en_UK/index.php b/plugins/admin_multi_view/language/en_UK/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/admin_multi_view/language/en_UK/index.php
+++ b/plugins/admin_multi_view/language/en_UK/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/admin_multi_view/language/eo_EO/description.txt b/plugins/admin_multi_view/language/eo_EO/description.txt
new file mode 100755
index 000000000..08eada2d3
--- /dev/null
+++ b/plugins/admin_multi_view/language/eo_EO/description.txt
@@ -0,0 +1 @@
+Permesas al la administrantoj vidi galerion kiel vizitantoj kaj/aÅ­ ÅanÄi la lingvon kaj/aÅ­ la temon dinamike. Utila por sencimigi ÅanÄojn... \ No newline at end of file
diff --git a/plugins/admin_multi_view/language/es_ES/description.txt b/plugins/admin_multi_view/language/es_ES/description.txt
index f81dab284..b13fe8d04 100644
--- a/plugins/admin_multi_view/language/es_ES/description.txt
+++ b/plugins/admin_multi_view/language/es_ES/description.txt
@@ -1 +1 @@
-Permite a los administradores para ver la galería como un invitado y / o cambiar el idioma y / o cambiar el tema sobre la marcha. Útiles para la depuración ... \ No newline at end of file
+Permite a los administradores ver la galería como un invitado y/o cambiar tanto el idioma como el tema sobre la marcha. Útiles para acciones de depuración... \ No newline at end of file
diff --git a/plugins/admin_multi_view/language/es_ES/index.php b/plugins/admin_multi_view/language/es_ES/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/admin_multi_view/language/es_ES/index.php
+++ b/plugins/admin_multi_view/language/es_ES/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/admin_multi_view/language/fr_CA/index.php b/plugins/admin_multi_view/language/fr_CA/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/admin_multi_view/language/fr_CA/index.php
+++ b/plugins/admin_multi_view/language/fr_CA/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/admin_multi_view/language/fr_FR/index.php b/plugins/admin_multi_view/language/fr_FR/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/admin_multi_view/language/fr_FR/index.php
+++ b/plugins/admin_multi_view/language/fr_FR/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/admin_multi_view/language/he_IL/index.php b/plugins/admin_multi_view/language/he_IL/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/admin_multi_view/language/he_IL/index.php
+++ b/plugins/admin_multi_view/language/he_IL/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/admin_multi_view/language/hr_HR/index.php b/plugins/admin_multi_view/language/hr_HR/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/admin_multi_view/language/hr_HR/index.php
+++ b/plugins/admin_multi_view/language/hr_HR/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/admin_multi_view/language/hu_HU/index.php b/plugins/admin_multi_view/language/hu_HU/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/admin_multi_view/language/hu_HU/index.php
+++ b/plugins/admin_multi_view/language/hu_HU/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/admin_multi_view/language/index.php b/plugins/admin_multi_view/language/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/admin_multi_view/language/index.php
+++ b/plugins/admin_multi_view/language/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/admin_multi_view/language/it_IT/index.php b/plugins/admin_multi_view/language/it_IT/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/admin_multi_view/language/it_IT/index.php
+++ b/plugins/admin_multi_view/language/it_IT/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/admin_multi_view/language/ja_JP/index.php b/plugins/admin_multi_view/language/ja_JP/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/admin_multi_view/language/ja_JP/index.php
+++ b/plugins/admin_multi_view/language/ja_JP/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/admin_multi_view/language/ka_GE/index.php b/plugins/admin_multi_view/language/ka_GE/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/admin_multi_view/language/ka_GE/index.php
+++ b/plugins/admin_multi_view/language/ka_GE/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/admin_multi_view/language/kn_IN/description.txt b/plugins/admin_multi_view/language/kn_IN/description.txt
new file mode 100755
index 000000000..9d2fba009
--- /dev/null
+++ b/plugins/admin_multi_view/language/kn_IN/description.txt
@@ -0,0 +1 @@
+ನಿರà³à²µà²¹à²£à³†à²—ಾರರಿಗೆ ಚಿತà³à²°à²¾à²‚ಗಣ (ಗà³à²¯à²¾à²²à²°à²¿) ವನà³à²¨à³ ಅತಿಥಿ (guest) ಗಳಂತೆ ವೀಕà³à²·à²¿à²¸à²²à³ ಮತà³à²¤à³/ಅಥವಾ ಭಾಷೆ, ಹೊರನೋಟ (ಥೀಮà³) ಅನà³à²¨à³ ಮಾರà³à²ªà²¾à²¡à²¿à²¸à²²à³ ಸà³à²²à²­ ಸಾಧà³à²¯à²µà²¾à²—ಿಸà³à²¤à³à²¤à²¦à³†. ಬದಲಾವಣೆಗಳ ದೋಷ ಪರಿಹಾರಕà³à²•à³† ಇದೠತà³à²‚ಬಾ ಉಪಯà³à²•à³à²¤. \ No newline at end of file
diff --git a/plugins/admin_multi_view/language/lt_LT/description.txt b/plugins/admin_multi_view/language/lt_LT/description.txt
new file mode 100755
index 000000000..9311e4e72
--- /dev/null
+++ b/plugins/admin_multi_view/language/lt_LT/description.txt
@@ -0,0 +1 @@
+Leidžia administratoriams peržiÅ«rÄ—ti galerijÄ… sveÄio teisÄ—mis, greitai keisti kalbas, iÅ¡vaizdÄ…. Naudinga debuginant pasikeitimus.
diff --git a/plugins/admin_multi_view/language/lv_LV/index.php b/plugins/admin_multi_view/language/lv_LV/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/admin_multi_view/language/lv_LV/index.php
+++ b/plugins/admin_multi_view/language/lv_LV/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/admin_multi_view/language/mn_MN/description.txt b/plugins/admin_multi_view/language/mn_MN/description.txt
new file mode 100755
index 000000000..e0303279b
--- /dev/null
+++ b/plugins/admin_multi_view/language/mn_MN/description.txt
@@ -0,0 +1 @@
+Зохицуулагчид зочны горимоор галларейг харах, Ñ…Ñлийг Ñольж харах, загварыг Ñольж харах зÑÑ€Ñг боломжийг олгоно. Өөрчлөлтийг шалгах үед Ñ…ÑÑ€ÑгтÑй... \ No newline at end of file
diff --git a/plugins/admin_multi_view/language/mn_MN/index.php b/plugins/admin_multi_view/language/mn_MN/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/plugins/admin_multi_view/language/mn_MN/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/plugins/admin_multi_view/language/nb_NO/index.php b/plugins/admin_multi_view/language/nb_NO/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/admin_multi_view/language/nb_NO/index.php
+++ b/plugins/admin_multi_view/language/nb_NO/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/admin_multi_view/language/nl_NL/index.php b/plugins/admin_multi_view/language/nl_NL/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/admin_multi_view/language/nl_NL/index.php
+++ b/plugins/admin_multi_view/language/nl_NL/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/admin_multi_view/language/nn_NO/description.txt b/plugins/admin_multi_view/language/nn_NO/description.txt
new file mode 100755
index 000000000..1b637b18d
--- /dev/null
+++ b/plugins/admin_multi_view/language/nn_NO/description.txt
@@ -0,0 +1 @@
+Tillet administratorar å sjå galleriet som ein gjest og/eller endre språket og/eller temaet "on the fly". Nyttig for å feilsøke når du gjer endringar... \ No newline at end of file
diff --git a/plugins/admin_multi_view/language/pl_PL/index.php b/plugins/admin_multi_view/language/pl_PL/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/admin_multi_view/language/pl_PL/index.php
+++ b/plugins/admin_multi_view/language/pl_PL/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/admin_multi_view/language/pt_BR/description.txt b/plugins/admin_multi_view/language/pt_BR/description.txt
index 360a7b299..2546a7e1c 100755
--- a/plugins/admin_multi_view/language/pt_BR/description.txt
+++ b/plugins/admin_multi_view/language/pt_BR/description.txt
@@ -1 +1 @@
-Permite que os administradores vejam a galeria como convidado e/ou mude o idioma e/ou tema em tempo real. Prático para debugar as alterações... \ No newline at end of file
+Permite que os administradores vejam a galeria como convidado e/ou mude o idioma e/ou tema em tempo real. Prático para debugar as alterações ... \ No newline at end of file
diff --git a/plugins/admin_multi_view/language/pt_PT/index.php b/plugins/admin_multi_view/language/pt_PT/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/admin_multi_view/language/pt_PT/index.php
+++ b/plugins/admin_multi_view/language/pt_PT/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/admin_multi_view/language/ru_RU/description.txt b/plugins/admin_multi_view/language/ru_RU/description.txt
index 1c4d168e0..548ebb379 100644
--- a/plugins/admin_multi_view/language/ru_RU/description.txt
+++ b/plugins/admin_multi_view/language/ru_RU/description.txt
@@ -1,3 +1,3 @@
ПозволÑет админиÑтраторам проÑматривать галерею в качеÑтве гоÑтей и / или
-изменить Ñзык и / или тему на "лету". Практично длÑ
+изменить Ñзык и / или тему "на лету". Удобно длÑ
отладки Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ... \ No newline at end of file
diff --git a/plugins/admin_multi_view/language/ru_RU/index.php b/plugins/admin_multi_view/language/ru_RU/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/admin_multi_view/language/ru_RU/index.php
+++ b/plugins/admin_multi_view/language/ru_RU/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/admin_multi_view/language/sk_SK/index.php b/plugins/admin_multi_view/language/sk_SK/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/admin_multi_view/language/sk_SK/index.php
+++ b/plugins/admin_multi_view/language/sk_SK/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/admin_multi_view/language/sl_SI/description.txt b/plugins/admin_multi_view/language/sl_SI/description.txt
new file mode 100755
index 000000000..3f6ff1a78
--- /dev/null
+++ b/plugins/admin_multi_view/language/sl_SI/description.txt
@@ -0,0 +1 @@
+OmogoÄi skrbnikom ogled galerije kot gost in/ali spremembo jezika in/ali preobleke v trenutku. Uporabno za odpravljanje napak pri spremembah... \ No newline at end of file
diff --git a/plugins/admin_multi_view/language/sr_RS/index.php b/plugins/admin_multi_view/language/sr_RS/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/admin_multi_view/language/sr_RS/index.php
+++ b/plugins/admin_multi_view/language/sr_RS/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/admin_multi_view/language/sv_SE/index.php b/plugins/admin_multi_view/language/sv_SE/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/admin_multi_view/language/sv_SE/index.php
+++ b/plugins/admin_multi_view/language/sv_SE/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/admin_multi_view/language/ta_IN/description.txt b/plugins/admin_multi_view/language/ta_IN/description.txt
new file mode 100755
index 000000000..6b3871960
--- /dev/null
+++ b/plugins/admin_multi_view/language/ta_IN/description.txt
@@ -0,0 +1 @@
+நிரà¯à®µà®¾à®•à®¿à®•à®³à¯ விரà¯à®¨à¯à®¤à®¾à®³à®¿à®•à®³à®¾à®• தான௠கேலரியில௠பாரà¯à®•à¯à®• அனà¯à®®à®¤à®¿à®•à¯à®•à®¿à®±à®¤à¯.மறà¯à®±à¯à®®à¯/அலà¯à®²à®¤à¯ பறகà¯à®•à¯à®®à¯ மீதான மொழி மறà¯à®±à¯à®®à¯/அலà¯à®²à®¤à¯ கரà¯à®ªà¯à®ªà¯†à®¾à®°à¯à®³à¯ˆ மாறà¯à®±à¯à®µà®¤à®±à¯à®•à¯. பயனà¯à®³à¯à®³ பிழை நீகà¯à®• மாறà¯à®±à®™à¯à®•à®³à¯ ... \ No newline at end of file
diff --git a/plugins/admin_multi_view/language/tr_TR/index.php b/plugins/admin_multi_view/language/tr_TR/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/admin_multi_view/language/tr_TR/index.php
+++ b/plugins/admin_multi_view/language/tr_TR/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/admin_multi_view/language/vi_VN/index.php b/plugins/admin_multi_view/language/vi_VN/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/admin_multi_view/language/vi_VN/index.php
+++ b/plugins/admin_multi_view/language/vi_VN/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/admin_multi_view/language/zh_CN/index.php b/plugins/admin_multi_view/language/zh_CN/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/admin_multi_view/language/zh_CN/index.php
+++ b/plugins/admin_multi_view/language/zh_CN/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/admin_multi_view/language/zh_HK/description.txt b/plugins/admin_multi_view/language/zh_HK/description.txt
new file mode 100755
index 000000000..619671774
--- /dev/null
+++ b/plugins/admin_multi_view/language/zh_HK/description.txt
@@ -0,0 +1 @@
+å…許管ç†å“¡ä»¥å˜‰è³“身份查看相簿和/或更改語言和/或主題。å°èª¿è©¦å¾ˆæœ‰ç”¨... \ No newline at end of file
diff --git a/plugins/admin_multi_view/language/zh_HK/index.php b/plugins/admin_multi_view/language/zh_HK/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/plugins/admin_multi_view/language/zh_HK/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/plugins/admin_multi_view/language/zh_TW/index.php b/plugins/admin_multi_view/language/zh_TW/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/admin_multi_view/language/zh_TW/index.php
+++ b/plugins/admin_multi_view/language/zh_TW/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/admin_multi_view/main.inc.php b/plugins/admin_multi_view/main.inc.php
index d93971857..0708b07e9 100644
--- a/plugins/admin_multi_view/main.inc.php
+++ b/plugins/admin_multi_view/main.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 Piwigo team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -23,7 +23,7 @@
/*
Plugin Name: Multi view
-Version: 2.5.0
+Version: 2.6.0
Description: Allows administrators to view gallery as guests and/or change the language and/or theme on the fly. Practical to debug changes...
Plugin URI: http://piwigo.org/ext/extension_view.php?eid=286
Author: Piwigo team
diff --git a/plugins/c13y_upgrade/index.php b/plugins/c13y_upgrade/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/c13y_upgrade/index.php
+++ b/plugins/c13y_upgrade/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/initialize.inc.php b/plugins/c13y_upgrade/initialize.inc.php
index ef22d884b..8f4d679db 100644
--- a/plugins/c13y_upgrade/initialize.inc.php
+++ b/plugins/c13y_upgrade/initialize.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/ar_SA/index.php b/plugins/c13y_upgrade/language/ar_SA/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/c13y_upgrade/language/ar_SA/index.php
+++ b/plugins/c13y_upgrade/language/ar_SA/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/ar_SA/plugin.lang.php b/plugins/c13y_upgrade/language/ar_SA/plugin.lang.php
index 4a4d64887..70fc82c5d 100644
--- a/plugins/c13y_upgrade/language/ar_SA/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/ar_SA/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/bg_BG/plugin.lang.php b/plugins/c13y_upgrade/language/bg_BG/plugin.lang.php
index a4a66be18..4809d0f46 100755
--- a/plugins/c13y_upgrade/language/bg_BG/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/bg_BG/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/br_FR/description.txt b/plugins/c13y_upgrade/language/br_FR/description.txt
new file mode 100755
index 000000000..aa96dc5fc
--- /dev/null
+++ b/plugins/c13y_upgrade/language/br_FR/description.txt
@@ -0,0 +1 @@
+Gwiriañ anterinded an hizivadennoù. \ No newline at end of file
diff --git a/plugins/c13y_upgrade/language/br_FR/index.php b/plugins/c13y_upgrade/language/br_FR/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/plugins/c13y_upgrade/language/br_FR/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/plugins/c13y_upgrade/language/br_FR/plugin.lang.php b/plugins/c13y_upgrade/language/br_FR/plugin.lang.php
new file mode 100755
index 000000000..b595cdd61
--- /dev/null
+++ b/plugins/c13y_upgrade/language/br_FR/plugin.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['c13y_correction_dbl_email_user'] = 'Dilemel an implijerien doublenn';
+$lang['c13y_correction_obsolete_plugin'] = 'Lugant "%s" a zo bet lakaet e stumm-mañ an arload, ha ret eo deoc\'h distaliañ anezhañ.';
+$lang['c13y_dbl_email_user'] = 'Implijerien gant ar memes postel';
+$lang['c13y_obsolete_plugin'] = 'Lugant diamzeret';
+$lang['c13y_upgrade_no_anomaly'] = 'Fazi ebet a oa dinoet goude hizivadenn an arload, al lugant "Check upgrades" a zo bet diweredekaet.';
+?> \ No newline at end of file
diff --git a/plugins/c13y_upgrade/language/ca_ES/plugin.lang.php b/plugins/c13y_upgrade/language/ca_ES/plugin.lang.php
index ed9edf238..38d059bb4 100755
--- a/plugins/c13y_upgrade/language/ca_ES/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/ca_ES/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/cs_CZ/index.php b/plugins/c13y_upgrade/language/cs_CZ/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/c13y_upgrade/language/cs_CZ/index.php
+++ b/plugins/c13y_upgrade/language/cs_CZ/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/cs_CZ/plugin.lang.php b/plugins/c13y_upgrade/language/cs_CZ/plugin.lang.php
index 00a0c6a19..6428c90a3 100644
--- a/plugins/c13y_upgrade/language/cs_CZ/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/cs_CZ/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/da_DK/plugin.lang.php b/plugins/c13y_upgrade/language/da_DK/plugin.lang.php
index 6b60252e6..ba786902e 100755
--- a/plugins/c13y_upgrade/language/da_DK/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/da_DK/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/de_DE/index.php b/plugins/c13y_upgrade/language/de_DE/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/c13y_upgrade/language/de_DE/index.php
+++ b/plugins/c13y_upgrade/language/de_DE/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/de_DE/plugin.lang.php b/plugins/c13y_upgrade/language/de_DE/plugin.lang.php
index 5c6f7c392..6415d5c97 100644
--- a/plugins/c13y_upgrade/language/de_DE/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/de_DE/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/el_GR/plugin.lang.php b/plugins/c13y_upgrade/language/el_GR/plugin.lang.php
index ad1bd1f69..affdf2e4d 100755
--- a/plugins/c13y_upgrade/language/el_GR/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/el_GR/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/en_UK/index.php b/plugins/c13y_upgrade/language/en_UK/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/c13y_upgrade/language/en_UK/index.php
+++ b/plugins/c13y_upgrade/language/en_UK/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/en_UK/plugin.lang.php b/plugins/c13y_upgrade/language/en_UK/plugin.lang.php
index 83d19940b..0733ee5bc 100644
--- a/plugins/c13y_upgrade/language/en_UK/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/en_UK/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/eo_EO/description.txt b/plugins/c13y_upgrade/language/eo_EO/description.txt
new file mode 100755
index 000000000..a28c90239
--- /dev/null
+++ b/plugins/c13y_upgrade/language/eo_EO/description.txt
@@ -0,0 +1 @@
+Kontrolas la kromaĵointegrecon. \ No newline at end of file
diff --git a/plugins/c13y_upgrade/language/eo_EO/plugin.lang.php b/plugins/c13y_upgrade/language/eo_EO/plugin.lang.php
new file mode 100755
index 000000000..52e1b2a54
--- /dev/null
+++ b/plugins/c13y_upgrade/language/eo_EO/plugin.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['c13y_correction_dbl_email_user'] = 'Forigi la duoblon de uzanto';
+$lang['c13y_correction_obsolete_plugin'] = 'La kromaĵo "%s" inkluziviÄas en tiu versio de la aplikaĵo kaj vi devas malinstali Äin.';
+$lang['c13y_dbl_email_user'] = 'Uzantoj kun la sama retadreso';
+$lang['c13y_obsolete_plugin'] = 'Malaktuala kromaĵo';
+$lang['c13y_upgrade_no_anomaly'] = 'Neniu anomalio detektiÄis post la aplikaĵa Äisdatigado, la aplikaĵo "Check upgrades" malÅaltiÄis.';
+?> \ No newline at end of file
diff --git a/plugins/c13y_upgrade/language/es_ES/index.php b/plugins/c13y_upgrade/language/es_ES/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/c13y_upgrade/language/es_ES/index.php
+++ b/plugins/c13y_upgrade/language/es_ES/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/es_ES/plugin.lang.php b/plugins/c13y_upgrade/language/es_ES/plugin.lang.php
index 0c09a4d1d..8372a08c8 100644
--- a/plugins/c13y_upgrade/language/es_ES/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/es_ES/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/et_EE/description.txt b/plugins/c13y_upgrade/language/et_EE/description.txt
new file mode 100755
index 000000000..c92d0e34d
--- /dev/null
+++ b/plugins/c13y_upgrade/language/et_EE/description.txt
@@ -0,0 +1 @@
+Kontrolli uuenduste korrasolekut. \ No newline at end of file
diff --git a/plugins/c13y_upgrade/language/et_EE/plugin.lang.php b/plugins/c13y_upgrade/language/et_EE/plugin.lang.php
new file mode 100755
index 000000000..0af3a2904
--- /dev/null
+++ b/plugins/c13y_upgrade/language/et_EE/plugin.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['c13y_correction_dbl_email_user'] = 'Kustuta topelt kasutajad';
+$lang['c13y_correction_obsolete_plugin'] = '"%s" pluginat sisaldab antud programmi versioon, see tuleb eemaldada.';
+$lang['c13y_dbl_email_user'] = 'Kasutajad sama email-i aadressiga';
+$lang['c13y_obsolete_plugin'] = 'Vana plugin';
+$lang['c13y_upgrade_no_anomaly'] = 'Anomaaliaid ei leitud pärast uuendust, "Kontrolli uundusi" plugin deaktiveeriti';
+?> \ No newline at end of file
diff --git a/plugins/c13y_upgrade/language/fa_IR/plugin.lang.php b/plugins/c13y_upgrade/language/fa_IR/plugin.lang.php
index 52f49684f..37a88b022 100755
--- a/plugins/c13y_upgrade/language/fa_IR/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/fa_IR/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/fi_FI/plugin.lang.php b/plugins/c13y_upgrade/language/fi_FI/plugin.lang.php
index 1b358c0b5..1d2e7f149 100755
--- a/plugins/c13y_upgrade/language/fi_FI/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/fi_FI/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/fr_CA/index.php b/plugins/c13y_upgrade/language/fr_CA/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/c13y_upgrade/language/fr_CA/index.php
+++ b/plugins/c13y_upgrade/language/fr_CA/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/fr_CA/plugin.lang.php b/plugins/c13y_upgrade/language/fr_CA/plugin.lang.php
index b5faf5f5d..6edf649d5 100644
--- a/plugins/c13y_upgrade/language/fr_CA/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/fr_CA/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/fr_FR/index.php b/plugins/c13y_upgrade/language/fr_FR/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/c13y_upgrade/language/fr_FR/index.php
+++ b/plugins/c13y_upgrade/language/fr_FR/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/fr_FR/plugin.lang.php b/plugins/c13y_upgrade/language/fr_FR/plugin.lang.php
index 0404e4ae3..890e93ea8 100644
--- a/plugins/c13y_upgrade/language/fr_FR/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/fr_FR/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/gl_ES/plugin.lang.php b/plugins/c13y_upgrade/language/gl_ES/plugin.lang.php
index a423d8bd9..278754cdf 100755
--- a/plugins/c13y_upgrade/language/gl_ES/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/gl_ES/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/he_IL/index.php b/plugins/c13y_upgrade/language/he_IL/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/c13y_upgrade/language/he_IL/index.php
+++ b/plugins/c13y_upgrade/language/he_IL/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/he_IL/plugin.lang.php b/plugins/c13y_upgrade/language/he_IL/plugin.lang.php
index 6f1ba5007..f5e470a96 100644
--- a/plugins/c13y_upgrade/language/he_IL/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/he_IL/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/hr_HR/index.php b/plugins/c13y_upgrade/language/hr_HR/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/c13y_upgrade/language/hr_HR/index.php
+++ b/plugins/c13y_upgrade/language/hr_HR/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/hr_HR/plugin.lang.php b/plugins/c13y_upgrade/language/hr_HR/plugin.lang.php
index 6766ba4c5..d9003a0fc 100644
--- a/plugins/c13y_upgrade/language/hr_HR/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/hr_HR/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/hu_HU/index.php b/plugins/c13y_upgrade/language/hu_HU/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/c13y_upgrade/language/hu_HU/index.php
+++ b/plugins/c13y_upgrade/language/hu_HU/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/hu_HU/plugin.lang.php b/plugins/c13y_upgrade/language/hu_HU/plugin.lang.php
index 069e95d63..6a3886c1d 100644
--- a/plugins/c13y_upgrade/language/hu_HU/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/hu_HU/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/index.php b/plugins/c13y_upgrade/language/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/c13y_upgrade/language/index.php
+++ b/plugins/c13y_upgrade/language/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/it_IT/index.php b/plugins/c13y_upgrade/language/it_IT/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/c13y_upgrade/language/it_IT/index.php
+++ b/plugins/c13y_upgrade/language/it_IT/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/it_IT/plugin.lang.php b/plugins/c13y_upgrade/language/it_IT/plugin.lang.php
index 51c1dec99..66cac936c 100644
--- a/plugins/c13y_upgrade/language/it_IT/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/it_IT/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,9 +22,9 @@
// +-----------------------------------------------------------------------+
// --------- Starting below: New or revised $lang ---- from Butterfly (1.8)
-$lang['c13y_upgrade_no_anomaly'] = 'Nessun anomalia individuata dopo l\'aggiornamento dell\'applicazione. Il plugin "Check upgrades" è stato disattivato.';
+$lang['c13y_upgrade_no_anomaly'] = 'Nessun anomalia individuata dopo l\'aggiornamento dell\'applicazione, il plugin "Check upgrades" è stato disattivato.';
$lang['c13y_dbl_email_user'] = 'Utenti con lo stesso indirizzo email';
-$lang['c13y_correction_dbl_email_user'] = 'Cancellare i doppioni';
+$lang['c13y_correction_dbl_email_user'] = 'Eliminare utenti duplicati';
$lang['c13y_obsolete_plugin'] = 'Plugin obsoleto';
$lang['c13y_correction_obsolete_plugin'] = 'Il plugin "%s" è stato incluso in questa versione dell\'applicazione e dovete disinstallarlo.';
diff --git a/plugins/c13y_upgrade/language/ja_JP/index.php b/plugins/c13y_upgrade/language/ja_JP/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/c13y_upgrade/language/ja_JP/index.php
+++ b/plugins/c13y_upgrade/language/ja_JP/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/ja_JP/plugin.lang.php b/plugins/c13y_upgrade/language/ja_JP/plugin.lang.php
index c0aaf3b12..0c7de87b6 100644
--- a/plugins/c13y_upgrade/language/ja_JP/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/ja_JP/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/ka_GE/index.php b/plugins/c13y_upgrade/language/ka_GE/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/c13y_upgrade/language/ka_GE/index.php
+++ b/plugins/c13y_upgrade/language/ka_GE/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/ka_GE/plugin.lang.php b/plugins/c13y_upgrade/language/ka_GE/plugin.lang.php
index 88ffc53da..417bca593 100644
--- a/plugins/c13y_upgrade/language/ka_GE/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/ka_GE/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/kn_IN/description.txt b/plugins/c13y_upgrade/language/kn_IN/description.txt
new file mode 100755
index 000000000..2f4997fcd
--- /dev/null
+++ b/plugins/c13y_upgrade/language/kn_IN/description.txt
@@ -0,0 +1 @@
+ನವೀಕರಣಗಳ ಸಮಗà³à²°à²¤à³† ಯನà³à²¨à³ ಪರೀಕà³à²·à²¿à²¸à²¿. \ No newline at end of file
diff --git a/plugins/c13y_upgrade/language/kn_IN/plugin.lang.php b/plugins/c13y_upgrade/language/kn_IN/plugin.lang.php
new file mode 100755
index 000000000..e1960ee1a
--- /dev/null
+++ b/plugins/c13y_upgrade/language/kn_IN/plugin.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['c13y_correction_dbl_email_user'] = 'ನಕಲಿ ಬಳಕೆದಾರರನà³à²¨à³ ಅಳಿಸಿ';
+$lang['c13y_correction_obsolete_plugin'] = 'ಈ ಆವೃತà³à²¤à²¿à²¯à²²à³à²²à²¿ "%s" ಪà³à²²à²—ೠಇನೠಒಳಗೊಂಡಿದೆ ಮತà³à²¤à³ ನೀವೠಅದನà³à²¨à³ ಅನà³à²¸à³à² à²¾à²ªà²¿à²¸à²²à³‡ ಬೇಕà³';
+$lang['c13y_dbl_email_user'] = 'à²à²•à²°à³‚ಪದ ಮಿಂಚೆ ವಿಳಾಸವಿರà³à²µ ಬಳಕೆದಾರರà³';
+$lang['c13y_obsolete_plugin'] = 'ಹಳತಾಗಿರà³à²µ ಪà³à²²à²—ೠಇನೠ';
+$lang['c13y_upgrade_no_anomaly'] = 'ಅಪà³à²²à²¿à²•à³‡à²¶à²¨à³ ನವೀಕರಣದ ನಂತರ ಯಾವà³à²¦à³‡ ಅಸಮಂಜಸತೆ ಕಂಡà³à²¬à²‚ದಿಲà³à²², "ನವೀಕರಣಗಳನà³à²¨à³ ಪರೀಕà³à²·à²¿à²¸à²¿" ಪà³à²²à²—ೠಇನೠಅನà³à²¨à³ ನಿಷà³à²•à³à²°à²¿à²¯à²—ೊಳಿಸಲಾಗಿದೆ.';
+?> \ No newline at end of file
diff --git a/plugins/c13y_upgrade/language/ko_KR/plugin.lang.php b/plugins/c13y_upgrade/language/ko_KR/plugin.lang.php
new file mode 100755
index 000000000..fb0c93809
--- /dev/null
+++ b/plugins/c13y_upgrade/language/ko_KR/plugin.lang.php
@@ -0,0 +1,26 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['c13y_correction_dbl_email_user'] = '중복 ì‚¬ìš©ìž ì‚­ì œ';
+$lang['c13y_dbl_email_user'] = 'ì´ë©”ì¼ ì£¼ì†Œê°€ 중복ë˜ëŠ” 사용ìž';
+$lang['c13y_obsolete_plugin'] = '쓸모없는 플러그ì¸';
+?> \ No newline at end of file
diff --git a/plugins/c13y_upgrade/language/lt_LT/description.txt b/plugins/c13y_upgrade/language/lt_LT/description.txt
new file mode 100755
index 000000000..773c5cbc6
--- /dev/null
+++ b/plugins/c13y_upgrade/language/lt_LT/description.txt
@@ -0,0 +1 @@
+Tikrinti atnaujinimų vientisumą \ No newline at end of file
diff --git a/plugins/c13y_upgrade/language/lt_LT/plugin.lang.php b/plugins/c13y_upgrade/language/lt_LT/plugin.lang.php
new file mode 100755
index 000000000..6f79fa6a5
--- /dev/null
+++ b/plugins/c13y_upgrade/language/lt_LT/plugin.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['c13y_dbl_email_user'] = 'Vartotojai su vienodais el-pašto adresais';
+$lang['c13y_obsolete_plugin'] = 'Pasenęs priedas';
+$lang['c13y_correction_dbl_email_user'] = 'Å alinti besikartojanÄius vartotojus';
+$lang['c13y_correction_obsolete_plugin'] = '"%s" priedas yra integruotas į šią programos versiją, išinstaliuokite jį.';
+$lang['c13y_upgrade_no_anomaly'] = 'Po programos atnaujinimo neaptikta jokių anomalijų. "Check upgrades" priedas išjungtas.';
+?> \ No newline at end of file
diff --git a/plugins/c13y_upgrade/language/lv_LV/index.php b/plugins/c13y_upgrade/language/lv_LV/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/c13y_upgrade/language/lv_LV/index.php
+++ b/plugins/c13y_upgrade/language/lv_LV/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/lv_LV/plugin.lang.php b/plugins/c13y_upgrade/language/lv_LV/plugin.lang.php
index f29203e18..d81edd645 100644
--- a/plugins/c13y_upgrade/language/lv_LV/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/lv_LV/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/nb_NO/index.php b/plugins/c13y_upgrade/language/nb_NO/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/c13y_upgrade/language/nb_NO/index.php
+++ b/plugins/c13y_upgrade/language/nb_NO/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/nb_NO/plugin.lang.php b/plugins/c13y_upgrade/language/nb_NO/plugin.lang.php
index 6e662d55b..4961ea888 100644
--- a/plugins/c13y_upgrade/language/nb_NO/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/nb_NO/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/nl_NL/index.php b/plugins/c13y_upgrade/language/nl_NL/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/c13y_upgrade/language/nl_NL/index.php
+++ b/plugins/c13y_upgrade/language/nl_NL/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/nl_NL/plugin.lang.php b/plugins/c13y_upgrade/language/nl_NL/plugin.lang.php
index f8616d2a2..652a1f445 100644
--- a/plugins/c13y_upgrade/language/nl_NL/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/nl_NL/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/nn_NO/description.txt b/plugins/c13y_upgrade/language/nn_NO/description.txt
new file mode 100755
index 000000000..e45ba0c95
--- /dev/null
+++ b/plugins/c13y_upgrade/language/nn_NO/description.txt
@@ -0,0 +1 @@
+Sjekk integriteten av ein oppgradering. \ No newline at end of file
diff --git a/plugins/c13y_upgrade/language/nn_NO/plugin.lang.php b/plugins/c13y_upgrade/language/nn_NO/plugin.lang.php
new file mode 100755
index 000000000..217e19995
--- /dev/null
+++ b/plugins/c13y_upgrade/language/nn_NO/plugin.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['c13y_correction_dbl_email_user'] = 'Slett duplikat-brukarar';
+$lang['c13y_correction_obsolete_plugin'] = '"%s" tilleggsprogrammet er ikkje støtta i denne versjonen og du må avinnstallere det.';
+$lang['c13y_dbl_email_user'] = 'Brukarar med same e-postadresse';
+$lang['c13y_obsolete_plugin'] = 'Utgjenge tilleggsprogram';
+$lang['c13y_upgrade_no_anomaly'] = 'Ingen feil oppdaga etter oppgradering. Tilleggsprogrammet "Check upgrades" vart deaktivert.';
+?> \ No newline at end of file
diff --git a/plugins/c13y_upgrade/language/pl_PL/index.php b/plugins/c13y_upgrade/language/pl_PL/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/c13y_upgrade/language/pl_PL/index.php
+++ b/plugins/c13y_upgrade/language/pl_PL/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/pl_PL/plugin.lang.php b/plugins/c13y_upgrade/language/pl_PL/plugin.lang.php
index 33a15bf40..5834f4da8 100644
--- a/plugins/c13y_upgrade/language/pl_PL/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/pl_PL/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/pt_BR/plugin.lang.php b/plugins/c13y_upgrade/language/pt_BR/plugin.lang.php
index 1527dd507..c7a8df8f0 100755
--- a/plugins/c13y_upgrade/language/pt_BR/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/pt_BR/plugin.lang.php
@@ -1,28 +1,28 @@
<?php
-// +-----------------------------------------------------------------------+
-// | Piwigo - a PHP based photo gallery |
-// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
-// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
-// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
-// +-----------------------------------------------------------------------+
-// | 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 |
-// | |
-// | This program is distributed in the hope that it will be useful, but |
-// | WITHOUT ANY WARRANTY; without even the implied warranty of |
-// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
-// | General Public License for more details. |
-// | |
-// | You should have received a copy of the GNU General Public License |
-// | along with this program; if not, write to the Free Software |
-// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
-// | USA. |
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
// +-----------------------------------------------------------------------+
$lang['c13y_correction_dbl_email_user'] = 'Eliminar usuários duplicados';
$lang['c13y_correction_obsolete_plugin'] = 'plugin "%s" foi incluído nesta versão do aplicativo e você deve desinstalá-lo.';
$lang['c13y_dbl_email_user'] = 'Usuários com o mesmo endereço de email';
$lang['c13y_obsolete_plugin'] = 'Plugin obsoleto';
-$lang['c13y_upgrade_no_anomaly'] = 'Nenhuma anomalia detectada após a atualização do aplicativo, "Verificar atualizações" plugin foi desativado.';
+$lang['c13y_upgrade_no_anomaly'] = 'Nenhuma anomalia foi detectada após a atualização do aplicativo, o plugin "Verificar atualizações" foi desativado.';
?> \ No newline at end of file
diff --git a/plugins/c13y_upgrade/language/pt_PT/index.php b/plugins/c13y_upgrade/language/pt_PT/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/c13y_upgrade/language/pt_PT/index.php
+++ b/plugins/c13y_upgrade/language/pt_PT/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/pt_PT/plugin.lang.php b/plugins/c13y_upgrade/language/pt_PT/plugin.lang.php
index 787cf5960..c9d50bfea 100644
--- a/plugins/c13y_upgrade/language/pt_PT/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/pt_PT/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/ro_RO/description.txt b/plugins/c13y_upgrade/language/ro_RO/description.txt
new file mode 100755
index 000000000..c6685a271
--- /dev/null
+++ b/plugins/c13y_upgrade/language/ro_RO/description.txt
@@ -0,0 +1 @@
+Verifică integritatea actualizărilor. \ No newline at end of file
diff --git a/plugins/c13y_upgrade/language/ro_RO/plugin.lang.php b/plugins/c13y_upgrade/language/ro_RO/plugin.lang.php
new file mode 100755
index 000000000..fd1d22a15
--- /dev/null
+++ b/plugins/c13y_upgrade/language/ro_RO/plugin.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['c13y_correction_dbl_email_user'] = 'Șterge utilizatorii duplicat';
+$lang['c13y_correction_obsolete_plugin'] = 'plugin-ul "%s" a fost inclus în această versiune a aplicației și trebuie să-l dezinstalezi.';
+$lang['c13y_dbl_email_user'] = 'Utilizatorii cu aceeași adresă de e-mail';
+$lang['c13y_obsolete_plugin'] = 'Plugin-uri ieșite din uz';
+$lang['c13y_upgrade_no_anomaly'] = 'Nu s-a detectat nicio anomalie după actualizarea aplicației, plugin-ul "Verificare actualizări" a fost dezactivat.';
+?> \ No newline at end of file
diff --git a/plugins/c13y_upgrade/language/ru_RU/description.txt b/plugins/c13y_upgrade/language/ru_RU/description.txt
index bddfbdd61..4fb2f859b 100644
--- a/plugins/c13y_upgrade/language/ru_RU/description.txt
+++ b/plugins/c13y_upgrade/language/ru_RU/description.txt
@@ -1 +1 @@
-Проверьте целоÑтноÑÑ‚ÑŒ обновлениÑ. \ No newline at end of file
+Проверка целоÑтноÑти обновлений. \ No newline at end of file
diff --git a/plugins/c13y_upgrade/language/ru_RU/index.php b/plugins/c13y_upgrade/language/ru_RU/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/c13y_upgrade/language/ru_RU/index.php
+++ b/plugins/c13y_upgrade/language/ru_RU/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/ru_RU/plugin.lang.php b/plugins/c13y_upgrade/language/ru_RU/plugin.lang.php
index 15f9aa373..5caf3c35e 100644
--- a/plugins/c13y_upgrade/language/ru_RU/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/ru_RU/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -22,10 +22,10 @@
// +-----------------------------------------------------------------------+
// --------- Starting below: New or revised $lang ---- from Butterfly (1.8)
-$lang['c13y_upgrade_no_anomaly'] = 'Ðномалии не обнаружены поÑле Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ. плагин "Проверить обновлениÑ" был отключен.';
+$lang['c13y_upgrade_no_anomaly'] = 'Ðномалии не обнаружены поÑле Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ. Плагин "Проверить обновлениÑ" был отключен.';
$lang['c13y_dbl_email_user'] = 'Пользователи Ñ Ñ‚ÐµÐ¼ же адреÑом Ñлектронной почты';
$lang['c13y_correction_dbl_email_user'] = 'Удаление дубликатов пользователей';
$lang['c13y_obsolete_plugin'] = 'УÑтаревший плагин';
-$lang['c13y_correction_obsolete_plugin'] = 'Модуль "%s" отключена, потому что она не ÑовмеÑтима Ñ Ñтой верÑией Piwigo . ПожалуйÑта, удалите его.';
+$lang['c13y_correction_obsolete_plugin'] = 'Плагин "%s" отключен, потому что он не ÑовмеÑтима Ñ Ñтой верÑией Piwigo. ПожалуйÑта, удалите Ñтот плагин.';
?> \ No newline at end of file
diff --git a/plugins/c13y_upgrade/language/sk_SK/index.php b/plugins/c13y_upgrade/language/sk_SK/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/c13y_upgrade/language/sk_SK/index.php
+++ b/plugins/c13y_upgrade/language/sk_SK/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/sk_SK/plugin.lang.php b/plugins/c13y_upgrade/language/sk_SK/plugin.lang.php
index 860afbc8c..753a4dd35 100644
--- a/plugins/c13y_upgrade/language/sk_SK/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/sk_SK/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/sl_SI/description.txt b/plugins/c13y_upgrade/language/sl_SI/description.txt
new file mode 100755
index 000000000..ca74cafe3
--- /dev/null
+++ b/plugins/c13y_upgrade/language/sl_SI/description.txt
@@ -0,0 +1 @@
+Preveri celovitost nadgradnje \ No newline at end of file
diff --git a/plugins/c13y_upgrade/language/sl_SI/plugin.lang.php b/plugins/c13y_upgrade/language/sl_SI/plugin.lang.php
new file mode 100755
index 000000000..6034ac00a
--- /dev/null
+++ b/plugins/c13y_upgrade/language/sl_SI/plugin.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['c13y_correction_dbl_email_user'] = 'Izbriši podvojene uporabnike';
+$lang['c13y_correction_obsolete_plugin'] = '"%s" je vkljuÄen v tej verziji aplikacije in ga morate odstraniti';
+$lang['c13y_dbl_email_user'] = 'Uporabniki z enakim e-mail naslovom';
+$lang['c13y_obsolete_plugin'] = 'Zastarel vtiÄnik';
+$lang['c13y_upgrade_no_anomaly'] = 'Po posodobitvi aplikacije ni bilo zaznati nepravilnosti. VtiÄnik "Preveri za nadgradnje" je bil deaktiviran';
+?> \ No newline at end of file
diff --git a/plugins/c13y_upgrade/language/sr_RS/index.php b/plugins/c13y_upgrade/language/sr_RS/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/c13y_upgrade/language/sr_RS/index.php
+++ b/plugins/c13y_upgrade/language/sr_RS/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/sr_RS/plugin.lang.php b/plugins/c13y_upgrade/language/sr_RS/plugin.lang.php
index 5c7249d76..1056e5120 100644
--- a/plugins/c13y_upgrade/language/sr_RS/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/sr_RS/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/sv_SE/index.php b/plugins/c13y_upgrade/language/sv_SE/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/c13y_upgrade/language/sv_SE/index.php
+++ b/plugins/c13y_upgrade/language/sv_SE/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/sv_SE/plugin.lang.php b/plugins/c13y_upgrade/language/sv_SE/plugin.lang.php
index 65d3780a8..b7fddaf64 100644
--- a/plugins/c13y_upgrade/language/sv_SE/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/sv_SE/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/ta_IN/description.txt b/plugins/c13y_upgrade/language/ta_IN/description.txt
new file mode 100755
index 000000000..0694a0cad
--- /dev/null
+++ b/plugins/c13y_upgrade/language/ta_IN/description.txt
@@ -0,0 +1 @@
+மேமà¯à®ªà®Ÿà¯à®¤à¯à®¤ à®®à¯à®´à¯à®®à¯ˆà®¯à¯ˆ சரிபாரà¯à®•à¯à®•à®µà¯à®®à¯. \ No newline at end of file
diff --git a/plugins/c13y_upgrade/language/ta_IN/plugin.lang.php b/plugins/c13y_upgrade/language/ta_IN/plugin.lang.php
new file mode 100755
index 000000000..802defed8
--- /dev/null
+++ b/plugins/c13y_upgrade/language/ta_IN/plugin.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['c13y_dbl_email_user'] = 'அதே மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿à®¯à¯ˆ கொணà¯à®Ÿ பயனரà¯';
+$lang['c13y_obsolete_plugin'] = 'பயன௠வழகà¯à®•à®´à®¿à®¨à¯à®¤ செரà¯à®•à¯à®¨à®¿à®°à®²à¯';
+$lang['c13y_upgrade_no_anomaly'] = 'விணà¯à®£à®ªà¯à®ª மேமà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿ பின௠கணà¯à®Ÿà¯à®ªà®¿à®Ÿà®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ இலà¯à®²à¯ˆ à®’à®´à¯à®™à¯à®•à®¿à®©à¯à®®à¯ˆ, "பாரà¯à®™à¯à®•à®³à¯ மேமà¯à®ªà®Ÿà¯à®¤à¯à®¤" செரà¯à®•à¯à®¨à®¿à®°à®²à¯ à®®à¯à®Ÿà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¿à®°à¯à®•à¯à®•à®¿à®±à®¤à¯';
+$lang['c13y_correction_dbl_email_user'] = 'போலி பயனர௠நீகà¯à®•à¯';
+$lang['c13y_correction_obsolete_plugin'] = '"%s" சொரà¯à®•à®¿ இநà¯à®¤ பயனà¯à®ªà®¾à®Ÿà¯à®Ÿà¯ˆ பதிபà¯à®ªà¯ சேரà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯ நீஙà¯à®•à®³à¯ அதை நீகà¯à®• வேணà¯à®Ÿà¯à®®à¯.';
+?> \ No newline at end of file
diff --git a/plugins/c13y_upgrade/language/th_TH/description.txt b/plugins/c13y_upgrade/language/th_TH/description.txt
new file mode 100755
index 000000000..e4bc37af3
--- /dev/null
+++ b/plugins/c13y_upgrade/language/th_TH/description.txt
@@ -0,0 +1 @@
+ตรวจสอบความสมบูรณ์ของà¸à¸²à¸£à¸­à¸±à¸žà¹€à¸à¸£à¸” \ No newline at end of file
diff --git a/plugins/c13y_upgrade/language/th_TH/plugin.lang.php b/plugins/c13y_upgrade/language/th_TH/plugin.lang.php
new file mode 100755
index 000000000..f601be5cb
--- /dev/null
+++ b/plugins/c13y_upgrade/language/th_TH/plugin.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['c13y_dbl_email_user'] = 'ผู้ใช้งานที่มีที่อยู่อีเมลเดียวà¸à¸±à¸™';
+$lang['c13y_obsolete_plugin'] = 'ปลั๊à¸à¸—ี่อินล้าสมัย';
+$lang['c13y_upgrade_no_anomaly'] = 'ไม่มีความผิดปà¸à¸•à¸´à¹ƒà¸” ที่ตรวจพบหลังจาà¸à¸à¸²à¸£à¸›à¸£à¸±à¸šà¸£à¸¸à¹ˆà¸™à¹‚ปรà¹à¸à¸£à¸¡ "ตรวจสอบà¸à¸²à¸£à¸­à¸±à¸žà¹€à¸à¸£à¸”" ปลั๊à¸à¸­à¸´à¸™à¹€à¸«à¸¥à¹ˆà¸²à¸™à¸±à¹‰à¸™à¸ˆà¸°à¸•à¹‰à¸­à¸‡à¸–ูà¸à¸›à¸´à¸”à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸à¹ˆà¸­à¸™';
+$lang['c13y_correction_dbl_email_user'] = 'ลบผู้ใช้ที่ชื่อซ้ำà¸à¸±à¸™';
+$lang['c13y_correction_obsolete_plugin'] = 'ปลั๊à¸à¸­à¸´à¸™à¸™à¸µà¹‰à¹„ด้ถูà¸à¸£à¸§à¸¡à¸­à¸¢à¸¹à¹ˆà¹ƒà¸™à¹à¸­à¸žà¸žà¸¥à¸´à¹€à¸„ชั่นที่คุณà¸à¸³à¸¥à¸±à¸‡à¸ˆà¸°à¸—ำà¸à¸²à¸£à¸–อนà¸à¸²à¸£à¸•à¸´à¸”ตั้ง';
+?> \ No newline at end of file
diff --git a/plugins/c13y_upgrade/language/tr_TR/index.php b/plugins/c13y_upgrade/language/tr_TR/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/c13y_upgrade/language/tr_TR/index.php
+++ b/plugins/c13y_upgrade/language/tr_TR/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/tr_TR/plugin.lang.php b/plugins/c13y_upgrade/language/tr_TR/plugin.lang.php
index b18d7b195..64bc8e1a4 100644
--- a/plugins/c13y_upgrade/language/tr_TR/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/tr_TR/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/uk_UA/plugin.lang.php b/plugins/c13y_upgrade/language/uk_UA/plugin.lang.php
index fbf6d849f..4bef99f05 100755
--- a/plugins/c13y_upgrade/language/uk_UA/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/uk_UA/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/vi_VN/index.php b/plugins/c13y_upgrade/language/vi_VN/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/c13y_upgrade/language/vi_VN/index.php
+++ b/plugins/c13y_upgrade/language/vi_VN/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/vi_VN/plugin.lang.php b/plugins/c13y_upgrade/language/vi_VN/plugin.lang.php
index b9d1410b4..9b34ee5c7 100644
--- a/plugins/c13y_upgrade/language/vi_VN/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/vi_VN/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/zh_CN/index.php b/plugins/c13y_upgrade/language/zh_CN/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/c13y_upgrade/language/zh_CN/index.php
+++ b/plugins/c13y_upgrade/language/zh_CN/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/zh_CN/plugin.lang.php b/plugins/c13y_upgrade/language/zh_CN/plugin.lang.php
index da8e1a394..24986c8c5 100644
--- a/plugins/c13y_upgrade/language/zh_CN/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/zh_CN/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/zh_HK/description.txt b/plugins/c13y_upgrade/language/zh_HK/description.txt
new file mode 100755
index 000000000..0e7a078bb
--- /dev/null
+++ b/plugins/c13y_upgrade/language/zh_HK/description.txt
@@ -0,0 +1 @@
+檢查å‡ç´šå®Œæ•´æ€§ã€‚ \ No newline at end of file
diff --git a/plugins/c13y_upgrade/language/zh_HK/plugin.lang.php b/plugins/c13y_upgrade/language/zh_HK/plugin.lang.php
new file mode 100755
index 000000000..6225cd9fb
--- /dev/null
+++ b/plugins/c13y_upgrade/language/zh_HK/plugin.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['c13y_correction_dbl_email_user'] = '刪除é‡è¤‡çš„用戶';
+$lang['c13y_correction_obsolete_plugin'] = '"%s"æ’件已包å«åœ¨é€™å€‹ç‰ˆæœ¬ä¸Šï¼Œä½ å¿…須先å¸è¼‰å®ƒã€‚';
+$lang['c13y_dbl_email_user'] = '已有用戶用了相åŒçš„電郵地å€';
+$lang['c13y_obsolete_plugin'] = 'å·²éŽæ™‚çš„æ’件';
+$lang['c13y_upgrade_no_anomaly'] = 'å‡ç´šå¾Œæ²’有檢測到異常,"檢查å‡ç´š"æ’件已被åœç”¨ã€‚';
+?> \ No newline at end of file
diff --git a/plugins/c13y_upgrade/language/zh_TW/index.php b/plugins/c13y_upgrade/language/zh_TW/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/c13y_upgrade/language/zh_TW/index.php
+++ b/plugins/c13y_upgrade/language/zh_TW/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/language/zh_TW/plugin.lang.php b/plugins/c13y_upgrade/language/zh_TW/plugin.lang.php
index c24930373..5ab1cbc88 100644
--- a/plugins/c13y_upgrade/language/zh_TW/plugin.lang.php
+++ b/plugins/c13y_upgrade/language/zh_TW/plugin.lang.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/c13y_upgrade/main.inc.php b/plugins/c13y_upgrade/main.inc.php
index 3ee70812f..52ff72773 100644
--- a/plugins/c13y_upgrade/main.inc.php
+++ b/plugins/c13y_upgrade/main.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 Piwigo team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -23,7 +23,7 @@
/*
Plugin Name: Check upgrades
-Version: 2.5.0
+Version: 2.6.0
Description: Check integrity of upgrades.
Plugin URI: http://piwigo.org/ext/extension_view.php?eid=287
Author: Piwigo team
diff --git a/plugins/index.php b/plugins/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/index.php
+++ b/plugins/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/default.css b/plugins/language_switch/default.css
deleted file mode 100644
index a73c67366..000000000
--- a/plugins/language_switch/default.css
+++ /dev/null
@@ -1,14 +0,0 @@
-#languageSwitchBox {
- padding: 0.5em 5px;
- border-radius: 4px;
- z-index: 100;
- text-align:left;
- display: none;
- position: absolute;
- left: 0; top: 0; /*left, right set through js*/
-}
-
-#languageSwitchBox .switchBoxTitle {
- padding-bottom:5px;
- margin-bottom:5px;
-} \ No newline at end of file
diff --git a/plugins/language_switch/flag_sprite.jpg b/plugins/language_switch/flag_sprite.jpg
index 4ea7d960a..24fd805d5 100644
--- a/plugins/language_switch/flag_sprite.jpg
+++ b/plugins/language_switch/flag_sprite.jpg
Binary files differ
diff --git a/plugins/language_switch/flag_sprite_original.png b/plugins/language_switch/flag_sprite_original.png
index ee49130f7..87de813aa 100644
--- a/plugins/language_switch/flag_sprite_original.png
+++ b/plugins/language_switch/flag_sprite_original.png
Binary files differ
diff --git a/plugins/language_switch/flags.tpl b/plugins/language_switch/flags.tpl
index 54063fd03..089e39604 100644
--- a/plugins/language_switch/flags.tpl
+++ b/plugins/language_switch/flags.tpl
@@ -1,11 +1,11 @@
<li id="languageSwitch">{strip}<a id="languageSwitchLink" title="{'Language'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
- <span class="pwg-icon flags langflag-{$lang_switch.Active.code}" >&nbsp;</span><span class="pwg-button-text">{'Language'|@translate}</span>
+ <span class="pwg-icon langflag-{$lang_switch.Active.code}">&nbsp;</span><span class="pwg-button-text">{'Language'|@translate}</span>
</a>
<div id="languageSwitchBox" class="switchBox">
<div class="switchBoxTitle">{'Language'|@translate}</div>
{foreach from=$lang_switch.flags item=flag name=f}
<a rel="nofollow" href="{$flag.url}">
- {if $lang_info.direction=="ltr"}<span class="pwg-icon flags langflag-{$flag.code}">{$flag.alt}</span>{$flag.title}{else}{$flag.title}<span class="pwg-icon flags langflag-{$flag.code}">{$flag.alt}</span>{/if}
+ {if $lang_info.direction=="ltr"}<span class="pwg-icon langflag-{$flag.code}">{$flag.alt}</span>{$flag.title}{else}{$flag.title}<span class="pwg-icon langflag-{$flag.code}">{$flag.alt}</span>{/if}
</a>
{if ($smarty.foreach.f.index+1)%3 == 0}<br>{/if}
{/foreach}
@@ -24,13 +24,8 @@ jQuery("#languageSwitchBox").on("mouseleave", function() {
});
{/literal}{/footer_script}
-{* <!-- switchBox structure for theme which don't include default style --> *}
-{if $themeconf.parent != 'default' or (isset($themeconf.load_parent_local_head) and $themeconf.load_parent_local_head == false) }
-{combine_css path=$LANGUAGE_SWITCH_PATH|@cat:"default.css"}
-{/if}
-
-{* <!-- stylish for non core themes (should be removed when all themes are updated) --> *}
-{if $themeconf.name != 'clear' and $themeconf.name != 'dark' and $themeconf.name != 'elegant' and $themeconf.name != 'Sylvia'}
+{* <!-- stylish for themes missing .switchBox styles --> *}
+{if $LANGUAGE_SWITCH_LOAD_STYLE}
{combine_css path=$LANGUAGE_SWITCH_PATH|@cat:"style.css"}
{/if}
diff --git a/plugins/language_switch/index.php b/plugins/language_switch/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/language_switch/index.php
+++ b/plugins/language_switch/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/language/ar_SA/index.php b/plugins/language_switch/language/ar_SA/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/language_switch/language/ar_SA/index.php
+++ b/plugins/language_switch/language/ar_SA/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/language/br_FR/description.txt b/plugins/language_switch/language/br_FR/description.txt
new file mode 100755
index 000000000..d823adac6
--- /dev/null
+++ b/plugins/language_switch/language/br_FR/description.txt
@@ -0,0 +1 @@
+Cheñchit yezh gant bannieloù war ho pajenn-degemer. \ No newline at end of file
diff --git a/plugins/language_switch/language/cs_CZ/index.php b/plugins/language_switch/language/cs_CZ/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/language_switch/language/cs_CZ/index.php
+++ b/plugins/language_switch/language/cs_CZ/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/language/de_DE/index.php b/plugins/language_switch/language/de_DE/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/language_switch/language/de_DE/index.php
+++ b/plugins/language_switch/language/de_DE/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/language/en_UK/index.php b/plugins/language_switch/language/en_UK/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/language_switch/language/en_UK/index.php
+++ b/plugins/language_switch/language/en_UK/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/language/eo_EO/description.txt b/plugins/language_switch/language/eo_EO/description.txt
new file mode 100755
index 000000000..e25c9e7bc
--- /dev/null
+++ b/plugins/language_switch/language/eo_EO/description.txt
@@ -0,0 +1 @@
+Åœaltu al alia lingvo pere de la flagoj ĉe la hejmpaÄo de via galerio. \ No newline at end of file
diff --git a/plugins/language_switch/language/es_ES/index.php b/plugins/language_switch/language/es_ES/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/language_switch/language/es_ES/index.php
+++ b/plugins/language_switch/language/es_ES/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/language/fr_CA/index.php b/plugins/language_switch/language/fr_CA/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/language_switch/language/fr_CA/index.php
+++ b/plugins/language_switch/language/fr_CA/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/language/fr_FR/index.php b/plugins/language_switch/language/fr_FR/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/language_switch/language/fr_FR/index.php
+++ b/plugins/language_switch/language/fr_FR/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/language/gl_ES/description.txt b/plugins/language_switch/language/gl_ES/description.txt
new file mode 100755
index 000000000..38a63f14b
--- /dev/null
+++ b/plugins/language_switch/language/gl_ES/description.txt
@@ -0,0 +1 @@
+Muda a outro idioma empregando as bandeiras na páxina de inicio da túa galería. \ No newline at end of file
diff --git a/plugins/language_switch/language/he_IL/index.php b/plugins/language_switch/language/he_IL/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/language_switch/language/he_IL/index.php
+++ b/plugins/language_switch/language/he_IL/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/language/hr_HR/index.php b/plugins/language_switch/language/hr_HR/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/language_switch/language/hr_HR/index.php
+++ b/plugins/language_switch/language/hr_HR/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/language/hu_HU/index.php b/plugins/language_switch/language/hu_HU/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/language_switch/language/hu_HU/index.php
+++ b/plugins/language_switch/language/hu_HU/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/language/index.php b/plugins/language_switch/language/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/language_switch/language/index.php
+++ b/plugins/language_switch/language/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/language/it_IT/index.php b/plugins/language_switch/language/it_IT/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/language_switch/language/it_IT/index.php
+++ b/plugins/language_switch/language/it_IT/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/language/ja_JP/index.php b/plugins/language_switch/language/ja_JP/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/language_switch/language/ja_JP/index.php
+++ b/plugins/language_switch/language/ja_JP/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/language/ka_GE/index.php b/plugins/language_switch/language/ka_GE/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/language_switch/language/ka_GE/index.php
+++ b/plugins/language_switch/language/ka_GE/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/language/kn_IN/description.txt b/plugins/language_switch/language/kn_IN/description.txt
new file mode 100755
index 000000000..5f2373b76
--- /dev/null
+++ b/plugins/language_switch/language/kn_IN/description.txt
@@ -0,0 +1 @@
+ನಿಮà³à²® ಚಿತà³à²°à²¾à²‚ಗಣದ (ಗà³à²¯à²¾à²²à²°à²¿à²¯) ಮà³à²–ಪà³à²Ÿà²¦à²²à³à²²à²¿à²°à³à²µ ಬಾವà³à²Ÿà²—ಳ ಸಂಕೇತವನà³à²¨à³ ಬಳಸಿ ಬೇರೊಂದೠಭಾಷೆಗೆ ಬದಲಿಸಿ. \ No newline at end of file
diff --git a/plugins/language_switch/language/lt_LT/description.txt b/plugins/language_switch/language/lt_LT/description.txt
new file mode 100755
index 000000000..a90140a44
--- /dev/null
+++ b/plugins/language_switch/language/lt_LT/description.txt
@@ -0,0 +1 @@
+Savo galerijos pradiniame puslapyje galite perjungti kalbÄ… naudodamiesi vÄ—levÄ—lÄ—mis. \ No newline at end of file
diff --git a/plugins/language_switch/language/lv_LV/index.php b/plugins/language_switch/language/lv_LV/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/language_switch/language/lv_LV/index.php
+++ b/plugins/language_switch/language/lv_LV/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/language/mn_MN/description.txt b/plugins/language_switch/language/mn_MN/description.txt
new file mode 100755
index 000000000..730252509
--- /dev/null
+++ b/plugins/language_switch/language/mn_MN/description.txt
@@ -0,0 +1 @@
+Ð¥ÑлÑÑ Ñолихыг Ñ…Ò¯ÑвÑл нүүр хуудаÑан дахь далбааны Ð·ÑƒÑ€Ð°Ð³Ð½Ð°Ð°Ñ Ñонгоно уу. \ No newline at end of file
diff --git a/plugins/language_switch/language/mn_MN/index.php b/plugins/language_switch/language/mn_MN/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/plugins/language_switch/language/mn_MN/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/plugins/language_switch/language/nb_NO/index.php b/plugins/language_switch/language/nb_NO/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/language_switch/language/nb_NO/index.php
+++ b/plugins/language_switch/language/nb_NO/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/language/nl_NL/index.php b/plugins/language_switch/language/nl_NL/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/language_switch/language/nl_NL/index.php
+++ b/plugins/language_switch/language/nl_NL/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/language/nn_NO/description.txt b/plugins/language_switch/language/nn_NO/description.txt
new file mode 100755
index 000000000..b7f698c72
--- /dev/null
+++ b/plugins/language_switch/language/nn_NO/description.txt
@@ -0,0 +1 @@
+Bytt til eit anna språk ved å bruke flaggsymbol på startsida på galleriet. \ No newline at end of file
diff --git a/plugins/language_switch/language/pl_PL/index.php b/plugins/language_switch/language/pl_PL/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/language_switch/language/pl_PL/index.php
+++ b/plugins/language_switch/language/pl_PL/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/language/pt_BR/description.txt b/plugins/language_switch/language/pt_BR/description.txt
index 353c1dcd9..8d6d70854 100755
--- a/plugins/language_switch/language/pt_BR/description.txt
+++ b/plugins/language_switch/language/pt_BR/description.txt
@@ -1 +1 @@
-Troque para outro idioma usando as bandeiras na página da sua galeria
+Troque para outro idioma usando as bandeiras na página da sua galeria.
diff --git a/plugins/language_switch/language/pt_PT/index.php b/plugins/language_switch/language/pt_PT/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/language_switch/language/pt_PT/index.php
+++ b/plugins/language_switch/language/pt_PT/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/language/ru_RU/description.txt b/plugins/language_switch/language/ru_RU/description.txt
index 279b9c041..487dbe6e7 100644
--- a/plugins/language_switch/language/ru_RU/description.txt
+++ b/plugins/language_switch/language/ru_RU/description.txt
@@ -1 +1 @@
-Изменить на другой Ñзык Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ флажков на главной Ñтранице вашей галереи. \ No newline at end of file
+ПозволÑет переключать Ñзыки, Ð½Ð°Ð¶Ð¸Ð¼Ð°Ñ Ð½Ð° картинки флажков на главной Ñтранице Вашей галереи. \ No newline at end of file
diff --git a/plugins/language_switch/language/ru_RU/index.php b/plugins/language_switch/language/ru_RU/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/language_switch/language/ru_RU/index.php
+++ b/plugins/language_switch/language/ru_RU/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/language/sk_SK/index.php b/plugins/language_switch/language/sk_SK/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/language_switch/language/sk_SK/index.php
+++ b/plugins/language_switch/language/sk_SK/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/language/sl_SI/description.txt b/plugins/language_switch/language/sl_SI/description.txt
new file mode 100755
index 000000000..eed62d857
--- /dev/null
+++ b/plugins/language_switch/language/sl_SI/description.txt
@@ -0,0 +1 @@
+Za spremembo jezika kliknite zastavico na domaÄi strani galerije.
diff --git a/plugins/language_switch/language/sr_RS/index.php b/plugins/language_switch/language/sr_RS/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/language_switch/language/sr_RS/index.php
+++ b/plugins/language_switch/language/sr_RS/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/language/sv_SE/index.php b/plugins/language_switch/language/sv_SE/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/language_switch/language/sv_SE/index.php
+++ b/plugins/language_switch/language/sv_SE/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/language/ta_IN/description.txt b/plugins/language_switch/language/ta_IN/description.txt
new file mode 100755
index 000000000..cf89b8502
--- /dev/null
+++ b/plugins/language_switch/language/ta_IN/description.txt
@@ -0,0 +1 @@
+உஙà¯à®•à®³à¯ கேலரி இலà¯à®²à®ªà¯à®ªà®•à¯à®•à®¤à¯à®¤à®¿à®²à¯ கொடிகளை பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿ வேற௠ஒர௠மொழியை மாறà¯à®±à®µà¯à®®à¯. \ No newline at end of file
diff --git a/plugins/language_switch/language/th_TH/index.php b/plugins/language_switch/language/th_TH/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/language_switch/language/th_TH/index.php
+++ b/plugins/language_switch/language/th_TH/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/language/tr_TR/index.php b/plugins/language_switch/language/tr_TR/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/language_switch/language/tr_TR/index.php
+++ b/plugins/language_switch/language/tr_TR/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/language/vi_VN/index.php b/plugins/language_switch/language/vi_VN/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/language_switch/language/vi_VN/index.php
+++ b/plugins/language_switch/language/vi_VN/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/language/zh_CN/index.php b/plugins/language_switch/language/zh_CN/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/language_switch/language/zh_CN/index.php
+++ b/plugins/language_switch/language/zh_CN/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/language/zh_HK/description.txt b/plugins/language_switch/language/zh_HK/description.txt
new file mode 100755
index 000000000..ced411ff9
--- /dev/null
+++ b/plugins/language_switch/language/zh_HK/description.txt
@@ -0,0 +1 @@
+使用照片庫主é çš„旗幟圖標切æ›èªžè¨€ \ No newline at end of file
diff --git a/plugins/language_switch/language/zh_TW/description.txt b/plugins/language_switch/language/zh_TW/description.txt
index e47cab67c..e913d670e 100644
--- a/plugins/language_switch/language/zh_TW/description.txt
+++ b/plugins/language_switch/language/zh_TW/description.txt
@@ -1 +1 @@
-從你的畫廊主é ï¼Œç›´æŽ¥æŒ‰åœ‹æ——來切æ›èªžè¨€ã€‚ \ No newline at end of file
+從你的相簿主é ï¼Œç›´æŽ¥é»žé¸åœ‹æ——以切æ›ä½¿ç”¨èªžè¨€ã€‚ \ No newline at end of file
diff --git a/plugins/language_switch/language/zh_TW/index.php b/plugins/language_switch/language/zh_TW/index.php
index 41732f2fd..c8de97f60 100644
--- a/plugins/language_switch/language/zh_TW/index.php
+++ b/plugins/language_switch/language/zh_TW/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/plugins/language_switch/language_switch.css b/plugins/language_switch/language_switch.css
index 06c867d09..9ea5c4d66 100644
--- a/plugins/language_switch/language_switch.css
+++ b/plugins/language_switch/language_switch.css
@@ -4,255 +4,267 @@
text-decoration:none;
border:none;
text-transform:none;
- margin-bottom: 3px;
+ margin-bottom:3px;
+ text-overflow:ellipsis;
+ white-space:nowrap;
+ overflow:hidden;
+ line-height:1.2em;
}
#languageSwitchLink span {
- margin-bottom: 5px;
- margin-top: 5px;
+ margin-bottom:5px;
+ margin-top:5px;
}
-#languageSwitch .flags {
- background: url('flag_sprite.jpg') no-repeat 24px 16px;
- margin-right: 3px;
- width: 24px;
- height: 16px;
- direction: ltr;
+[class*="langflag-"] {
+ background-image:url('flag_sprite.jpg') !important;
+ background-repeat:no-repeat;
+ background-position:24px 16px;
+ margin-right:3px;
+ width:24px;
+ height:16px;
+ direction:ltr;
}
/** Change the langflag-XX label to match a new language. All flags are represented there**/
-#languageSwitch .langflag-ad { background-position:0px 0px; }
-#languageSwitch .langflag-ae { background-position:-24px 0px; }
-#languageSwitch .langflag-af { background-position:-48px 0px; }
-#languageSwitch .langflag-ag { background-position:-72px 0px; }
-#languageSwitch .langflag-al { background-position:-96px 0px; }
-#languageSwitch .langflag-am { background-position:-120px 0px; }
-#languageSwitch .langflag-an { background-position:-144px 0px; }
-#languageSwitch .langflag-ao { background-position:-168px 0px; }
-#languageSwitch .langflag-es_AR { background-position:-192px 0px; }
-#languageSwitch .langflag-as { background-position:-216px 0px; }
-#languageSwitch .langflag-at { background-position:-240px 0px; }
-#languageSwitch .langflag-aw { background-position:-264px 0px; }
-#languageSwitch .langflag-ax { background-position:-288px 0px; }
-#languageSwitch .langflag-az_AZ { background-position:-312px 0px; }
-#languageSwitch .langflag-ba { background-position:-336px 0px; }
-#languageSwitch .langflag-bb { background-position:0px -16px; }
-#languageSwitch .langflag-bd { background-position:-24px -16px; }
-#languageSwitch .langflag-be { background-position:-48px -16px; }
-#languageSwitch .langflag-bf { background-position:-72px -16px; }
-#languageSwitch .langflag-bg_BG { background-position:-96px -16px; }
-#languageSwitch .langflag-bh { background-position:-120px -16px; }
-#languageSwitch .langflag-bi { background-position:-144px -16px; }
-#languageSwitch .langflag-bj { background-position:-168px -16px; }
-#languageSwitch .langflag-bl { background-position:-192px -16px; }
-#languageSwitch .langflag-bm { background-position:-216px -16px; }
-#languageSwitch .langflag-bn{ background-position:-240px -16px; }
-#languageSwitch .langflag-bo { background-position:-264px -16px; }
-#languageSwitch .langflag-bonaire { background-position:-288px -16px; }
-#languageSwitch .langflag-pt_BR { background-position:-312px -16px; }
-#languageSwitch .langflag-bs { background-position:-336px -16px; }
-#languageSwitch .langflag-bt { background-position:0px -32px; }
-#languageSwitch .langflag-bv { background-position:-24px -32px; }
-#languageSwitch .langflag-bw { background-position:-48px -32px; }
-#languageSwitch .langflag-by { background-position:-72px -32px; }
-#languageSwitch .langflag-bz { background-position:-96px -32px; }
-#languageSwitch .langflag-ca { background-position:-120px -32px; }
-#languageSwitch .langflag-ca_ES { background-position:-144px -32px; }
-#languageSwitch .langflag-cc { background-position:-168px -32px; }
-#languageSwitch .langflag-cd { background-position:-192px -32px; }
-#languageSwitch .langflag-cf { background-position:-216px -32px; }
-#languageSwitch .langflag-cg { background-position:-240px -32px; }
-#languageSwitch .langflag-ch { background-position:-264px -32px; }
-#languageSwitch .langflag-ci { background-position:-288px -32px; }
-#languageSwitch .langflag-cl { background-position:-312px -32px; }
-#languageSwitch .langflag-cm { background-position:-336px -32px; }
-#languageSwitch .langflag-zh_CN { background-position:0px -48px; }
-#languageSwitch .langflag-co { background-position:-24px -48px; }
-#languageSwitch .langflag-cr { background-position:-48px -48px; }
-#languageSwitch .langflag-cs_CZ { background-position:-72px -48px; }
-#languageSwitch .langflag-cu { background-position:-96px -48px; }
-#languageSwitch .langflag-cv { background-position:-120px -48px; }
-#languageSwitch .langflag-cx { background-position:-144px -48px; }
-#languageSwitch .langflag-cy { background-position:-168px -48px; }
-#languageSwitch .langflag-cz { background-position:-192px -48px; }
-#languageSwitch .langflag-de_DE { background-position:-216px -48px; }
-#languageSwitch .langflag-dj { background-position:-240px -48px; }
-#languageSwitch .langflag-da_DK { background-position:-264px -48px; }
-#languageSwitch .langflag-dm { background-position:-288px -48px; }
-#languageSwitch .langflag-do { background-position:-312px -48px; }
-#languageSwitch .langflag-dz { background-position:-336px -48px; }
-#languageSwitch .langflag-ec { background-position:0px -64px; }
-#languageSwitch .langflag-et_EE { background-position:-24px -64px; }
-#languageSwitch .langflag-eg { background-position:-48px -64px; }
-#languageSwitch .langflag-eh { background-position:-72px -64px; }
-#languageSwitch .langflag-en_UK { background-position:-96px -64px; }
-#languageSwitch .langflag-eo_EO { background-position:-120px -64px; }
-#languageSwitch .langflag-er { background-position:-144px -64px; }
-#languageSwitch .langflag-es_ES { background-position:-168px -64px; }
-#languageSwitch .langflag-et { background-position:-192px -64px; }
-#languageSwitch .langflag-fi_FI { background-position:-216px -64px; }
-#languageSwitch .langflag-fm { background-position:-240px -64px; }
-#languageSwitch .langflag-fo { background-position:-264px -64px; }
-#languageSwitch .langflag-fr_FR { background-position:-288px -64px; }
-#languageSwitch .langflag-ga { background-position:-312px -64px; }
-#languageSwitch .langflag-gb { background-position:-336px -64px; }
-#languageSwitch .langflag-gd { background-position:0px -80px; }
-#languageSwitch .langflag-ka_GE { background-position:-24px -80px; }
-#languageSwitch .langflag-gg { background-position:-48px -80px; }
-#languageSwitch .langflag-gh { background-position:-72px -80px; }
-#languageSwitch .langflag-gi { background-position:-96px -80px; }
-#languageSwitch .langflag-gl { background-position:-120px -80px; }
-#languageSwitch .langflag-gm { background-position:-144px -80px; }
-#languageSwitch .langflag-gn { background-position:-168px -80px; }
-#languageSwitch .langflag-gq { background-position:-192px -80px; }
-#languageSwitch .langflag-el_GR { background-position:-216px -80px; }
-#languageSwitch .langflag-gt { background-position:-240px -80px; }
-#languageSwitch .langflag-gu { background-position:-264px -80px; }
-#languageSwitch .langflag-gw { background-position:-288px -80px; }
-#languageSwitch .langflag-gy { background-position:-312px -80px; }
-#languageSwitch .langflag-zh_HK { background-position:-336px -80px; }
-#languageSwitch .langflag-hn { background-position:0px -96px; }
-#languageSwitch .langflag-hr_HR { background-position:-24px -96px; }
-#languageSwitch .langflag-ht { background-position:-48px -96px; }
-#languageSwitch .langflag-hu_HU { background-position:-72px -96px; }
-#languageSwitch .langflag-id { background-position:-96px -96px; }
-#languageSwitch .langflag-ie { background-position:-120px -96px; }
-#languageSwitch .langflag-he_IL { background-position:-144px -96px; }
-#languageSwitch .langflag-im { background-position:-168px -96px; }
-#languageSwitch .langflag-kok_IN { background-position:-192px -96px; }
-#languageSwitch .langflag-ta_IN { background-position:-192px -96px; }
-#languageSwitch .langflag-bn_IN { background-position:-192px -96px; }
-#languageSwitch .langflag-iq { background-position:-216px -96px; }
-#languageSwitch .langflag-fa_IR { background-position:-240px -96px; }
-#languageSwitch .langflag-is_IS { background-position:-264px -96px; }
-#languageSwitch .langflag-it_IT { background-position:-288px -96px; }
-#languageSwitch .langflag-je { background-position:-312px -96px; }
-#languageSwitch .langflag-jm { background-position:-336px -96px; }
-#languageSwitch .langflag-jo { background-position:0px -112px; }
-#languageSwitch .langflag-ja_JP { background-position:-24px -112px; }
-#languageSwitch .langflag-ke { background-position:-48px -112px; }
-#languageSwitch .langflag-kg { background-position:-72px -112px; }
-#languageSwitch .langflag-km_KH { background-position:-96px -112px; }
-#languageSwitch .langflag-ki { background-position:-120px -112px; }
-#languageSwitch .langflag-km { background-position:-144px -112px; }
-#languageSwitch .langflag-kn { background-position:-168px -112px; }
-#languageSwitch .langflag-kosovo { background-position:-192px -112px; }
-#languageSwitch .langflag-kp { background-position:-216px -112px; }
-#languageSwitch .langflag-ko_KR { background-position:-240px -112px; }
-#languageSwitch .langflag-kw { background-position:-264px -112px; }
-#languageSwitch .langflag-kz { background-position:-288px -112px; }
-#languageSwitch .langflag-la { background-position:-312px -112px; }
-#languageSwitch .langflag-lb { background-position:-336px -112px; }
-#languageSwitch .langflag-lc { background-position:0px -128px; }
-#languageSwitch .langflag-li { background-position:-24px -128px; }
-#languageSwitch .langflag-lk { background-position:-48px -128px; }
-#languageSwitch .langflag-lr { background-position:-72px -128px; }
-#languageSwitch .langflag-ls { background-position:-96px -128px; }
-#languageSwitch .langflag-lt_LT { background-position:-120px -128px; }
-#languageSwitch .langflag-lu { background-position:-144px -128px; }
-#languageSwitch .langflag-lv_LV { background-position:-168px -128px; }
-#languageSwitch .langflag-ly { background-position:-192px -128px; }
-#languageSwitch .langflag-ma { background-position:-216px -128px; }
-#languageSwitch .langflag-mc { background-position:-240px -128px; }
-#languageSwitch .langflag-md { background-position:-264px -128px; }
-#languageSwitch .langflag-me { background-position:-288px -128px; }
-#languageSwitch .langflag-mg { background-position:-312px -128px; }
-#languageSwitch .langflag-mh { background-position:-336px -128px; }
-#languageSwitch .langflag-mk_MK { background-position:0px -144px; }
-#languageSwitch .langflag-ml { background-position:-24px -144px; }
-#languageSwitch .langflag-mm { background-position:-48px -144px; }
-#languageSwitch .langflag-mn { background-position:-72px -144px; }
-#languageSwitch .langflag-mo { background-position:-96px -144px; }
-#languageSwitch .langflag-mp { background-position:-120px -144px; }
-#languageSwitch .langflag-mq { background-position:-144px -144px; }
-#languageSwitch .langflag-mr { background-position:-168px -144px; }
-#languageSwitch .langflag-mt { background-position:-192px -144px; }
-#languageSwitch .langflag-mu { background-position:-216px -144px; }
-#languageSwitch .langflag-dv_MV { background-position:-240px -144px; }
-#languageSwitch .langflag-mw { background-position:-264px -144px; }
-#languageSwitch .langflag-mx { background-position:-288px -144px; }
-#languageSwitch .langflag-ms_MY { background-position:-312px -144px; }
-#languageSwitch .langflag-mz { background-position:-336px -144px; }
-#languageSwitch .langflag-na { background-position:0px -160px; }
-#languageSwitch .langflag-ne { background-position:-24px -160px; }
-#languageSwitch .langflag-nf { background-position:-48px -160px; }
-#languageSwitch .langflag-ng { background-position:-72px -160px; }
-#languageSwitch .langflag-ni { background-position:-96px -160px; }
-#languageSwitch .langflag-nl_NL { background-position:-120px -160px; }
-#languageSwitch .langflag-nb_NO { background-position:-144px -160px; }
-#languageSwitch .langflag-np { background-position:-168px -160px; }
-#languageSwitch .langflag-nr { background-position:-192px -160px; }
-#languageSwitch .langflag-nu { background-position:-216px -160px; }
-#languageSwitch .langflag-om { background-position:-240px -160px; }
-#languageSwitch .langflag-pa { background-position:-264px -160px; }
-#languageSwitch .langflag-pe { background-position:-288px -160px; }
-#languageSwitch .langflag-pf { background-position:-312px -160px; }
-#languageSwitch .langflag-pg { background-position:-336px -160px; }
-#languageSwitch .langflag-ph { background-position:0px -176px; }
-#languageSwitch .langflag-pk { background-position:-24px -176px; }
-#languageSwitch .langflag-pl_PL { background-position:-48px -176px; }
-#languageSwitch .langflag-pm { background-position:-72px -176px; }
-#languageSwitch .langflag-pr { background-position:-96px -176px; }
-#languageSwitch .langflag-ps { background-position:-120px -176px; }
-#languageSwitch .langflag-pt_PT { background-position:-144px -176px; }
-#languageSwitch .langflag-pw { background-position:-168px -176px; }
-#languageSwitch .langflag-py { background-position:-192px -176px; }
-#languageSwitch .langflag-qa { background-position:-216px -176px; }
-#languageSwitch .langflag-fr_CA { background-position:-240px -176px; }
-#languageSwitch .langflag-ro_RO { background-position:-264px -176px; }
-#languageSwitch .langflag-sh_RS { background-position:-288px -176px; }
-#languageSwitch .langflag-sr_RS { background-position:-288px -176px; }
-#languageSwitch .langflag-ru_RU { background-position:-312px -176px; }
-#languageSwitch .langflag-rw { background-position:-336px -176px; }
-#languageSwitch .langflag-ar_SA { background-position:0px -192px; }
-#languageSwitch .langflag-saba { background-position:-24px -192px; }
-#languageSwitch .langflag-sark { background-position:-48px -192px; }
-#languageSwitch .langflag-sb { background-position:-72px -192px; }
-#languageSwitch .langflag-sc { background-position:-96px -192px; }
-#languageSwitch .langflag-scotland { background-position:-120px -192px; }
-#languageSwitch .langflag-sd { background-position:-144px -192px; }
-#languageSwitch .langflag-sv_SE { background-position:-168px -192px; }
-#languageSwitch .langflag-sg { background-position:-192px -192px; }
-#languageSwitch .langflag-si { background-position:-216px -192px; }
-#languageSwitch .langflag-sj { background-position:-240px -192px; }
-#languageSwitch .langflag-sk_SK { background-position:-264px -192px; }
-#languageSwitch .langflag-sl_SI { background-position:-288px -192px; }
-#languageSwitch .langflag-sm { background-position:-312px -192px; }
-#languageSwitch .langflag-sn { background-position:-336px -192px; }
-#languageSwitch .langflag-so { background-position:0px -208px; }
-#languageSwitch .langflag-sr { background-position:-24px -208px; }
-#languageSwitch .langflag-st { background-position:-48px -208px; }
-#languageSwitch .langflag-sv { background-position:-72px -208px; }
-#languageSwitch .langflag-sy { background-position:-96px -208px; }
-#languageSwitch .langflag-sz { background-position:-120px -208px; }
-#languageSwitch .langflag-td { background-position:-144px -208px; }
-#languageSwitch .langflag-tg { background-position:-168px -208px; }
-#languageSwitch .langflag-th_TH { background-position:-192px -208px; }
-#languageSwitch .langflag-tj { background-position:-216px -208px; }
-#languageSwitch .langflag-tk { background-position:-240px -208px; }
-#languageSwitch .langflag-tl { background-position:-264px -208px; }
-#languageSwitch .langflag-tm { background-position:-288px -208px; }
-#languageSwitch .langflag-tn { background-position:-312px -208px; }
-#languageSwitch .langflag-to { background-position:-336px -208px; }
-#languageSwitch .langflag-tr_TR { background-position:0px -224px; }
-#languageSwitch .langflag-tt { background-position:-24px -224px; }
-#languageSwitch .langflag-zh_TW{ background-position:-48px -224px; }
-#languageSwitch .langflag-tz { background-position:-72px -224px; }
-#languageSwitch .langflag-uk_UA { background-position:-96px -224px; }
-#languageSwitch .langflag-ug { background-position:-120px -224px; }
-#languageSwitch .langflag-us { background-position:-144px -224px; }
-#languageSwitch .langflag-uy { background-position:-168px -224px; }
-#languageSwitch .langflag-uz { background-position:-192px -224px; }
-#languageSwitch .langflag-va { background-position:-216px -224px; }
-#languageSwitch .langflag-vc { background-position:-240px -224px; }
-#languageSwitch .langflag-ve { background-position:-264px -224px; }
-#languageSwitch .langflag-vi { background-position:-288px -224px; }
-#languageSwitch .langflag-vi_VN { background-position:-312px -224px; }
-#languageSwitch .langflag-vu { background-position:-336px -224px; }
-#languageSwitch .langflag-wales { background-position:0px -240px; }
-#languageSwitch .langflag-wf { background-position:-24px -240px; }
-#languageSwitch .langflag-ws { background-position:-48px -240px; }
-#languageSwitch .langflag-ye { background-position:-72px -240px; }
-#languageSwitch .langflag-yt { background-position:-96px -240px; }
-#languageSwitch .langflag-af_ZA { background-position:-120px -240px; }
-#languageSwitch .langflag-zm { background-position:-144px -240px; }
-#languageSwitch .langflag-zw { background-position:-168px -240px; }
-#languageSwitch .langflag-gl_ES { background-position:-192px -240px; } \ No newline at end of file
+.langflag-ad { background-position:0px 0px; }
+.langflag-ae { background-position:-24px 0px; }
+.langflag-af { background-position:-48px 0px; }
+.langflag-ag { background-position:-72px 0px; }
+.langflag-al { background-position:-96px 0px; }
+.langflag-am { background-position:-120px 0px; }
+.langflag-an { background-position:-144px 0px; }
+.langflag-ao { background-position:-168px 0px; }
+.langflag-es_AR { background-position:-192px 0px; }
+.langflag-as { background-position:-216px 0px; }
+.langflag-at { background-position:-240px 0px; }
+.langflag-aw { background-position:-264px 0px; }
+.langflag-ax { background-position:-288px 0px; }
+.langflag-az_AZ { background-position:-312px 0px; }
+.langflag-ba { background-position:-336px 0px; }
+.langflag-bb { background-position:0px -16px; }
+.langflag-bd { background-position:-24px -16px; }
+.langflag-be { background-position:-48px -16px; }
+.langflag-bf { background-position:-72px -16px; }
+.langflag-bg_BG { background-position:-96px -16px; }
+.langflag-bh { background-position:-120px -16px; }
+.langflag-bi { background-position:-144px -16px; }
+.langflag-bj { background-position:-168px -16px; }
+.langflag-bl { background-position:-192px -16px; }
+.langflag-bm { background-position:-216px -16px; }
+.langflag-bn{ background-position:-240px -16px; }
+.langflag-bo { background-position:-264px -16px; }
+.langflag-bonaire { background-position:-288px -16px; }
+.langflag-pt_BR { background-position:-312px -16px; }
+.langflag-bs { background-position:-336px -16px; }
+.langflag-bt { background-position:0px -32px; }
+.langflag-bv { background-position:-24px -32px; }
+.langflag-bw { background-position:-48px -32px; }
+.langflag-by { background-position:-72px -32px; }
+.langflag-bz { background-position:-96px -32px; }
+.langflag-ca { background-position:-120px -32px; }
+.langflag-ca_ES { background-position:-144px -32px; }
+.langflag-cc { background-position:-168px -32px; }
+.langflag-cd { background-position:-192px -32px; }
+.langflag-cf { background-position:-216px -32px; }
+.langflag-cg { background-position:-240px -32px; }
+.langflag-ch { background-position:-264px -32px; }
+.langflag-ci { background-position:-288px -32px; }
+.langflag-cl { background-position:-312px -32px; }
+.langflag-cm { background-position:-336px -32px; }
+.langflag-zh_CN { background-position:0px -48px; }
+.langflag-co { background-position:-24px -48px; }
+.langflag-cr { background-position:-48px -48px; }
+.langflag-cs_CZ { background-position:-72px -48px; }
+.langflag-cu { background-position:-96px -48px; }
+.langflag-cv { background-position:-120px -48px; }
+.langflag-cx { background-position:-144px -48px; }
+.langflag-cy { background-position:-168px -48px; }
+.langflag-cz { background-position:-192px -48px; }
+.langflag-de_DE { background-position:-216px -48px; }
+.langflag-dj { background-position:-240px -48px; }
+.langflag-da_DK { background-position:-264px -48px; }
+.langflag-dm { background-position:-288px -48px; }
+.langflag-do { background-position:-312px -48px; }
+.langflag-dz { background-position:-336px -48px; }
+.langflag-ec { background-position:0px -64px; }
+.langflag-et_EE { background-position:-24px -64px; }
+.langflag-eg { background-position:-48px -64px; }
+.langflag-eh { background-position:-72px -64px; }
+.langflag-en_UK { background-position:-96px -64px; }
+.langflag-eo_EO { background-position:-120px -64px; }
+.langflag-er { background-position:-144px -64px; }
+.langflag-es_ES { background-position:-168px -64px; }
+.langflag-et { background-position:-192px -64px; }
+.langflag-fi_FI { background-position:-216px -64px; }
+.langflag-fm { background-position:-240px -64px; }
+.langflag-fo { background-position:-264px -64px; }
+.langflag-fr_FR { background-position:-288px -64px; }
+.langflag-ga { background-position:-312px -64px; }
+.langflag-gb { background-position:-336px -64px; }
+.langflag-en_GB { background-position:-336px -64px; }
+.langflag-gd { background-position:0px -80px; }
+.langflag-ka_GE { background-position:-24px -80px; }
+.langflag-gg { background-position:-48px -80px; }
+.langflag-gh { background-position:-72px -80px; }
+.langflag-gi { background-position:-96px -80px; }
+.langflag-gl { background-position:-120px -80px; }
+.langflag-gm { background-position:-144px -80px; }
+.langflag-gn { background-position:-168px -80px; }
+.langflag-gq { background-position:-192px -80px; }
+.langflag-el_GR { background-position:-216px -80px; }
+.langflag-gt { background-position:-240px -80px; }
+.langflag-gu { background-position:-264px -80px; }
+.langflag-gw { background-position:-288px -80px; }
+.langflag-gy { background-position:-312px -80px; }
+.langflag-zh_HK { background-position:-336px -80px; }
+.langflag-hn { background-position:0px -96px; }
+.langflag-hr_HR { background-position:-24px -96px; }
+.langflag-ht { background-position:-48px -96px; }
+.langflag-hu_HU { background-position:-72px -96px; }
+.langflag-id_ID { background-position:-96px -96px; }
+.langflag-ie { background-position:-120px -96px; }
+.langflag-ga_IE { background-position:-120px -96px; }
+.langflag-he_IL { background-position:-144px -96px; }
+.langflag-im { background-position:-168px -96px; }
+.langflag-kok_IN { background-position:-192px -96px; }
+.langflag-ta_IN { background-position:-192px -96px; }
+.langflag-bn_IN { background-position:-192px -96px; }
+.langflag-kn_IN { background-position:-192px -96px; }
+.langflag-iq { background-position:-216px -96px; }
+.langflag-fa_IR { background-position:-240px -96px; }
+.langflag-is_IS { background-position:-264px -96px; }
+.langflag-it_IT { background-position:-288px -96px; }
+.langflag-je { background-position:-312px -96px; }
+.langflag-jm { background-position:-336px -96px; }
+.langflag-jo { background-position:0px -112px; }
+.langflag-ja_JP { background-position:-24px -112px; }
+.langflag-ke { background-position:-48px -112px; }
+.langflag-kg { background-position:-72px -112px; }
+.langflag-km_KH { background-position:-96px -112px; }
+.langflag-ki { background-position:-120px -112px; }
+.langflag-km { background-position:-144px -112px; }
+.langflag-kn { background-position:-168px -112px; }
+.langflag-kosovo { background-position:-192px -112px; }
+.langflag-kp { background-position:-216px -112px; }
+.langflag-ko_KR { background-position:-240px -112px; }
+.langflag-kw { background-position:-264px -112px; }
+.langflag-kz { background-position:-288px -112px; }
+.langflag-la { background-position:-312px -112px; }
+.langflag-lb { background-position:-336px -112px; }
+.langflag-lc { background-position:0px -128px; }
+.langflag-li { background-position:-24px -128px; }
+.langflag-lk { background-position:-48px -128px; }
+.langflag-lr { background-position:-72px -128px; }
+.langflag-ls { background-position:-96px -128px; }
+.langflag-lt_LT { background-position:-120px -128px; }
+.langflag-lu { background-position:-144px -128px; }
+.langflag-lb_LU { background-position:-144px -128px; }
+.langflag-lv_LV { background-position:-168px -128px; }
+.langflag-ly { background-position:-192px -128px; }
+.langflag-ar_MA { background-position:-216px -128px; }
+.langflag-mc { background-position:-240px -128px; }
+.langflag-md { background-position:-264px -128px; }
+.langflag-me { background-position:-288px -128px; }
+.langflag-mg { background-position:-312px -128px; }
+.langflag-mh { background-position:-336px -128px; }
+.langflag-mk_MK { background-position:0px -144px; }
+.langflag-ml { background-position:-24px -144px; }
+.langflag-mm { background-position:-48px -144px; }
+.langflag-mn_MN { background-position:-72px -144px; }
+.langflag-mo { background-position:-96px -144px; }
+.langflag-mp { background-position:-120px -144px; }
+.langflag-mq { background-position:-144px -144px; }
+.langflag-mr { background-position:-168px -144px; }
+.langflag-mt { background-position:-192px -144px; }
+.langflag-mu { background-position:-216px -144px; }
+.langflag-dv_MV { background-position:-240px -144px; }
+.langflag-mw { background-position:-264px -144px; }
+.langflag-mx { background-position:-288px -144px; }
+.langflag-ms_MY { background-position:-312px -144px; }
+.langflag-mz { background-position:-336px -144px; }
+.langflag-na { background-position:0px -160px; }
+.langflag-ne { background-position:-24px -160px; }
+.langflag-nf { background-position:-48px -160px; }
+.langflag-ng { background-position:-72px -160px; }
+.langflag-ni { background-position:-96px -160px; }
+.langflag-nl_NL { background-position:-120px -160px; }
+.langflag-nb_NO { background-position:-144px -160px; }
+.langflag-nn_NO { background-position:-144px -160px; }
+.langflag-np { background-position:-168px -160px; }
+.langflag-nr { background-position:-192px -160px; }
+.langflag-nu { background-position:-216px -160px; }
+.langflag-om { background-position:-240px -160px; }
+.langflag-pa { background-position:-264px -160px; }
+.langflag-pe { background-position:-288px -160px; }
+.langflag-pf { background-position:-312px -160px; }
+.langflag-pg { background-position:-336px -160px; }
+.langflag-ph { background-position:0px -176px; }
+.langflag-pk { background-position:-24px -176px; }
+.langflag-pl_PL { background-position:-48px -176px; }
+.langflag-pm { background-position:-72px -176px; }
+.langflag-pr { background-position:-96px -176px; }
+.langflag-ps { background-position:-120px -176px; }
+.langflag-pt_PT { background-position:-144px -176px; }
+.langflag-pw { background-position:-168px -176px; }
+.langflag-py { background-position:-192px -176px; }
+.langflag-qa { background-position:-216px -176px; }
+.langflag-fr_CA { background-position:-240px -176px; }
+.langflag-ro_RO { background-position:-264px -176px; }
+.langflag-sh_RS { background-position:-288px -176px; }
+.langflag-sr_RS { background-position:-288px -176px; }
+.langflag-ru_RU { background-position:-312px -176px; }
+.langflag-rw { background-position:-336px -176px; }
+.langflag-ar_SA { background-position:0px -192px; }
+.langflag-saba { background-position:-24px -192px; }
+.langflag-sark { background-position:-48px -192px; }
+.langflag-sb { background-position:-72px -192px; }
+.langflag-sc { background-position:-96px -192px; }
+.langflag-scotland { background-position:-120px -192px; }
+.langflag-sd { background-position:-144px -192px; }
+.langflag-sv_SE { background-position:-168px -192px; }
+.langflag-sg { background-position:-192px -192px; }
+.langflag-sl_SI { background-position:-216px -192px; }
+.langflag-sj { background-position:-240px -192px; }
+.langflag-sk_SK { background-position:-264px -192px; }
+.langflag-sl { background-position:-288px -192px; }
+.langflag-sm { background-position:-312px -192px; }
+.langflag-sn { background-position:-336px -192px; }
+.langflag-so { background-position:0px -208px; }
+.langflag-sr { background-position:-24px -208px; }
+.langflag-st { background-position:-48px -208px; }
+.langflag-sv { background-position:-72px -208px; }
+.langflag-sy { background-position:-96px -208px; }
+.langflag-sz { background-position:-120px -208px; }
+.langflag-td { background-position:-144px -208px; }
+.langflag-tg { background-position:-168px -208px; }
+.langflag-th_TH { background-position:-192px -208px; }
+.langflag-tj { background-position:-216px -208px; }
+.langflag-tk { background-position:-240px -208px; }
+.langflag-tl { background-position:-264px -208px; }
+.langflag-tm { background-position:-288px -208px; }
+.langflag-tn { background-position:-312px -208px; }
+.langflag-to { background-position:-336px -208px; }
+.langflag-tr_TR { background-position:0px -224px; }
+.langflag-tt { background-position:-24px -224px; }
+.langflag-zh_TW{ background-position:-48px -224px; }
+.langflag-tz { background-position:-72px -224px; }
+.langflag-uk_UA { background-position:-96px -224px; }
+.langflag-ug { background-position:-120px -224px; }
+.langflag-en_US { background-position:-144px -224px; }
+.langflag-uy { background-position:-168px -224px; }
+.langflag-uz { background-position:-192px -224px; }
+.langflag-va { background-position:-216px -224px; }
+.langflag-vc { background-position:-240px -224px; }
+.langflag-ve { background-position:-264px -224px; }
+.langflag-vi { background-position:-288px -224px; }
+.langflag-vi_VN { background-position:-312px -224px; }
+.langflag-vu { background-position:-336px -224px; }
+.langflag-wales { background-position:0px -240px; }
+.langflag-wf { background-position:-24px -240px; }
+.langflag-ws { background-position:-48px -240px; }
+.langflag-ye { background-position:-72px -240px; }
+.langflag-yt { background-position:-96px -240px; }
+.langflag-af_ZA { background-position:-120px -240px; }
+.langflag-zm { background-position:-144px -240px; }
+.langflag-zw { background-position:-168px -240px; }
+.langflag-gl_ES { background-position:-192px -240px; }
+.langflag-br_FR { background-position:-216px -240px; } \ No newline at end of file
diff --git a/plugins/language_switch/language_switch.inc.php b/plugins/language_switch/language_switch.inc.php
index 63a3cca7e..8a7e62817 100644
--- a/plugins/language_switch/language_switch.inc.php
+++ b/plugins/language_switch/language_switch.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -124,15 +124,15 @@ function language_controler_flags()
}
}
- $template->set_filename('language_flags', dirname(__FILE__) . '/flags.tpl');
+ $safe_themes = array('clear','dark','elegant','Sylvia','simple-grey','simple-black','simple-white','kardon','luciano','montblancxl'); // stripped (2.6)
- $template->assign(
- array(
+ $template->assign(array(
'lang_switch'=> $lsw,
'LANGUAGE_SWITCH_PATH' => LANGUAGE_SWITCH_PATH,
- )
- );
+ 'LANGUAGE_SWITCH_LOAD_STYLE' => !in_array($user['theme'], $safe_themes),
+ ));
+ $template->set_filename('language_flags', dirname(__FILE__) . '/flags.tpl');
$template->concat('PLUGIN_INDEX_ACTIONS', $template->parse('language_flags', true) );
$template->clear_assign('lang_switch');
}
diff --git a/plugins/language_switch/main.inc.php b/plugins/language_switch/main.inc.php
index 552ab8fe4..edb8556f1 100644
--- a/plugins/language_switch/main.inc.php
+++ b/plugins/language_switch/main.inc.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -23,7 +23,7 @@
/*
Plugin Name: Language Switch
-Version: 2.5.0
+Version: 2.6.0
Description: Switch to another language from flags on your gallery home page.
Plugin URI: http://piwigo.org/ext/extension_view.php?eid=123
Author: Piwigo team
diff --git a/plugins/language_switch/style.css b/plugins/language_switch/style.css
index 8b330272c..55992d349 100644
--- a/plugins/language_switch/style.css
+++ b/plugins/language_switch/style.css
@@ -1,9 +1,18 @@
#languageSwitchBox {
+ padding: 0.5em 5px;
+ border-radius: 4px;
+ z-index: 100;
+ text-align:left;
+ display: none;
+ position: absolute;
+ left: 0; top: 0; /*left, right set through js*/
background-color: #555;
border: 1px solid #000;
}
#languageSwitchBox .switchBoxTitle {
+ padding-bottom:5px;
+ margin-bottom:5px;
border-bottom: 1px solid #444;
}
#languageSwitchBox a {
diff --git a/popuphelp.php b/popuphelp.php
index 603ef1eac..713879ca9 100644
--- a/popuphelp.php
+++ b/popuphelp.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/profile.php b/profile.php
index 741fcc40e..301fba825 100644
--- a/profile.php
+++ b/profile.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -133,7 +133,7 @@ function save_profile_from_post($userdata, &$errors)
// periods must be integer values, they represents number of days
if (!preg_match($int_pattern, $_POST['recent_period'])
- or $_POST['recent_period'] <= 0)
+ or $_POST['recent_period'] < 0)
{
$errors[] = l10n('Recent period must be a positive integer value') ;
}
@@ -201,7 +201,7 @@ function save_profile_from_post($userdata, &$errors)
// password is updated only if filled
if (!empty($_POST['use_new_pwd']))
{
- array_push($fields, $conf['user_fields']['password']);
+ $fields[] = $conf['user_fields']['password'];
// password is hashed with function $conf['password_hash']
$data{$conf['user_fields']['password']} = $conf['password_hash']($_POST['use_new_pwd']);
}
@@ -211,12 +211,12 @@ function save_profile_from_post($userdata, &$errors)
{
if ($_POST['username'] != $userdata['username'] and get_userid($_POST['username']))
{
- array_push($page['errors'], l10n('this login is already used'));
+ $page['errors'][] = l10n('this login is already used');
unset($_POST['redirect']);
}
else
{
- array_push($fields, $conf['user_fields']['username']);
+ $fields[] = $conf['user_fields']['username'];
$data{$conf['user_fields']['username']} = $_POST['username'];
// send email to the user
@@ -262,7 +262,7 @@ function save_profile_from_post($userdata, &$errors)
if ($conf['activate_comments'])
{
- array_push($fields, 'show_nb_comments');
+ $fields[] = 'show_nb_comments';
}
$data = array();
@@ -304,7 +304,7 @@ function load_profile_in_template($url_action, $url_redirect, $userdata)
$template->assign(
array(
'USERNAME'=>stripslashes($userdata['username']),
- 'EMAIL'=>get_email_address_as_display_text(@$userdata['email']),
+ 'EMAIL'=>@$userdata['email'],
'ALLOW_USER_CUSTOMIZATION'=>$conf['allow_user_customization'],
'ACTIVATE_COMMENTS'=>$conf['activate_comments'],
'NB_IMAGE_PAGE'=>$userdata['nb_image_page'],
diff --git a/qsearch.php b/qsearch.php
index e22b002f9..a19efa525 100644
--- a/qsearch.php
+++ b/qsearch.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/random.php b/random.php
index 5ca68671d..74cad9406 100644
--- a/random.php
+++ b/random.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/register.php b/register.php
index dfc5ac487..993fe169d 100644
--- a/register.php
+++ b/register.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -44,49 +44,36 @@ if (isset($_POST['submit']))
if (!verify_ephemeral_key(@$_POST['key']))
{
set_status_header(403);
- array_push($page['errors'], 'Invalid/expired form key');
+ $page['errors'][] = l10n('Invalid/expired form key');
}
- if ($_POST['password'] != $_POST['password_conf'])
+ if(empty($_POST['password']))
{
- array_push($page['errors'], l10n('please enter your password again'));
+ $page['errors'][] = l10n('Password is missing. Please enter the password.');
+ }
+ else if(empty($_POST['password_conf']))
+ {
+ $page['errors'][] = l10n('Password confirmation is missing. Please confirm the chosen password.');
+ }
+ else if ($_POST['password'] != $_POST['password_conf'])
+ {
+ $page['errors'][] = l10n('The passwords do not match');
}
- $page['errors'] =
- register_user($_POST['login'],
- $_POST['password'],
- $_POST['mail_address'],
- true,
- $page['errors']);
+ register_user(
+ $_POST['login'],
+ $_POST['password'],
+ $_POST['mail_address'],
+ true,
+ $page['errors'],
+ isset($_POST['send_password_by_mail'])
+ );
if (count($page['errors']) == 0)
{
// email notification
- if (isset($_POST['send_password_by_mail']) and isset($_POST['mail_address']))
+ if (isset($_POST['send_password_by_mail']) and email_check_format($_POST['mail_address']))
{
- include_once(PHPWG_ROOT_PATH.'include/functions_mail.inc.php');
-
- $keyargs_content = array(
- get_l10n_args('Hello %s,', $_POST['login']),
- get_l10n_args('Thank you for registering at %s!', $conf['gallery_title']),
- get_l10n_args('', ''),
- get_l10n_args('Here are your connection settings', ''),
- get_l10n_args('Username: %s', $_POST['login']),
- get_l10n_args('Password: %s', $_POST['password']),
- get_l10n_args('Email: %s', $_POST['mail_address']),
- get_l10n_args('', ''),
- get_l10n_args('If you think you\'ve received this email in error, please contact us at %s', get_webmaster_mail_address()),
- );
-
- pwg_mail(
- $_POST['mail_address'],
- array(
- 'subject' => '['.$conf['gallery_title'].'] '.l10n('Registration'),
- 'content' => l10n_args($keyargs_content),
- 'content_format' => 'text/plain',
- )
- );
-
$_SESSION['page_infos'][] = l10n('Successfully registered, you will soon receive an email with your connection settings. Welcome!');
}
diff --git a/search.php b/search.php
index 3e4c0ab3a..6feee2780 100644
--- a/search.php
+++ b/search.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -47,6 +47,8 @@ if (isset($_POST['submit']))
if (isset($_POST['search_allwords'])
and !preg_match('/^\s*$/', $_POST['search_allwords']))
{
+ check_input_parameter('mode', $_POST, false, '/^(OR|AND)$/');
+
$drop_char_match = array(
'-','^','$',';','#','&','(',')','<','>','`','\'','"','|',',','@','_',
'?','%','~','.','[',']','{','}',':','\\','/','=','\'','!','*');
@@ -73,6 +75,7 @@ if (isset($_POST['submit']))
if (isset($_POST['tags']))
{
check_input_parameter('tags', $_POST, true, PATTERN_ID);
+ check_input_parameter('tag_mode', $_POST, false, '/^(OR|AND)$/');
$search['fields']['tags'] = array(
'words' => $_POST['tags'],
@@ -85,7 +88,7 @@ if (isset($_POST['submit']))
$search['fields']['author'] = array(
'words' => preg_split(
'/\s+/',
- $_POST['search_author']
+ strip_tags($_POST['search_author'])
),
'mode' => 'OR',
);
@@ -108,10 +111,10 @@ if (isset($_POST['submit']))
{
$search['fields'][$type_date.'-after'] = array(
'date' => sprintf(
- '%d-%02d-%02d',
- $_POST['start_year'],
- $_POST['start_month'] != 0 ? $_POST['start_month'] : '01',
- $_POST['start_day'] != 0 ? $_POST['start_day'] : '01'
+ '%d-%02d-%02d',
+ $_POST['start_year'],
+ $_POST['start_month'] != 0 ? $_POST['start_month'] : '01',
+ $_POST['start_day'] != 0 ? $_POST['start_day'] : '01'
),
'inc' => true,
);
@@ -121,10 +124,10 @@ if (isset($_POST['submit']))
{
$search['fields'][$type_date.'-before'] = array(
'date' => sprintf(
- '%d-%02d-%02d',
- $_POST['end_year'],
- $_POST['end_month'] != 0 ? $_POST['end_month'] : '12',
- $_POST['end_day'] != 0 ? $_POST['end_day'] : '31'
+ '%d-%02d-%02d',
+ $_POST['end_year'],
+ $_POST['end_month'] != 0 ? $_POST['end_month'] : '12',
+ $_POST['end_day'] != 0 ? $_POST['end_day'] : '31'
),
'inc' => true,
);
@@ -149,7 +152,7 @@ INSERT INTO '.SEARCH_TABLE.'
}
else
{
- array_push($page['errors'], l10n('Empty query. No criteria has been entered.'));
+ $page['errors'][] = l10n('Empty query. No criteria has been entered.');
}
}
//----------------------------------------------------------------- redirection
diff --git a/search_rules.php b/search_rules.php
index 1fe8a628d..34854d2e0 100644
--- a/search_rules.php
+++ b/search_rules.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -77,9 +77,10 @@ else
if (isset($search['fields']['allwords']))
{
- $template->append( 'search_words',
- sprintf(
- l10n('searched words : %s'),
+ $template->append(
+ 'search_words',
+ l10n(
+ 'searched words : %s',
join(', ', $search['fields']['allwords']['words'])
)
);
@@ -103,10 +104,10 @@ SELECT name
if (isset($search['fields']['author']))
{
$template->append(
- 'search_words',
- sprintf(
- l10n('author(s) : %s'),
- join(', ', $search['fields']['author']['words'])
+ 'search_words',
+ l10n(
+ 'author(s) : %s',
+ join(', ', array_map('strip_tags', $search['fields']['author']['words']))
)
);
}
@@ -137,7 +138,7 @@ SELECT id, uppercats, global_rank
{
while ($row = pwg_db_fetch_assoc($result))
{
- array_push($categories, $row);
+ $categories[] = $row;
}
}
usort($categories, 'global_rank_compare');
@@ -148,8 +149,7 @@ SELECT id, uppercats, global_rank
'search_categories',
get_cat_display_name_cache(
$category['uppercats'],
- null, // no url on category names
- false // no blank replacement
+ null // no url on category names
)
);
}
diff --git a/tags.php b/tags.php
index 2a7a0d83b..dea490056 100644
--- a/tags.php
+++ b/tags.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -131,17 +131,10 @@ if ($page['display_mode'] == 'letters') {
);
}
- array_push(
- $letter['tags'],
- array_merge(
- $tag,
- array(
- 'URL' => make_index_url(
- array(
- 'tags' => array($tag),
- )
- ),
- )
+ $letter['tags'][] = array_merge(
+ $tag,
+ array(
+ 'URL' => make_index_url(array('tags' => array($tag))),
)
);
diff --git a/template-extension/index.php b/template-extension/index.php
index 41732f2fd..c8de97f60 100644
--- a/template-extension/index.php
+++ b/template-extension/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/template-extension/yoga/index.php b/template-extension/yoga/index.php
index 41732f2fd..c8de97f60 100644
--- a/template-extension/yoga/index.php
+++ b/template-extension/yoga/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/template-extension/yoga/local/index.php b/template-extension/yoga/local/index.php
index 41732f2fd..c8de97f60 100644
--- a/template-extension/yoga/local/index.php
+++ b/template-extension/yoga/local/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/themes/Sylvia/icon/index.php b/themes/Sylvia/icon/index.php
index 41732f2fd..c8de97f60 100644
--- a/themes/Sylvia/icon/index.php
+++ b/themes/Sylvia/icon/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/themes/Sylvia/icon/mimetypes/index.php b/themes/Sylvia/icon/mimetypes/index.php
index 41732f2fd..c8de97f60 100644
--- a/themes/Sylvia/icon/mimetypes/index.php
+++ b/themes/Sylvia/icon/mimetypes/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/themes/Sylvia/index.php b/themes/Sylvia/index.php
index 41732f2fd..c8de97f60 100644
--- a/themes/Sylvia/index.php
+++ b/themes/Sylvia/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/themes/Sylvia/mail-css.tpl b/themes/Sylvia/mail-css.tpl
deleted file mode 100644
index a579f7a0b..000000000
--- a/themes/Sylvia/mail-css.tpl
+++ /dev/null
@@ -1,13 +0,0 @@
-/* Theme Sylvia mail css */
-
-body {ldelim} background-color:#111; color:#666;}
-#copyright {ldelim} background: transparent url({$ROOT_URL}themes/Sylvia/images/bottom-left-bg.jpg) no-repeat scroll left bottom;
-min-height: 220px; height: 220px; width: 100%; min-width: 100%; padding: 10px 100px 30px 100px; }
-h2 {ldelim} color:#f70;background: transparent url({$ROOT_URL}themes/Sylvia/images/fillet.gif) repeat-x scroll left bottom; padding-bottom: 5px;}
-img {ldelim} margin: 16px; border: 16px solid #444; -moz-border-radius: 4px; border-radius: 4px 4px; }
-img:hover {ldelim} padding: 15px; border: 0; background-color:#222;-moz-border-radius: 4px; border-radius: 4px 4px; }
-a {ldelim} color: #f70; background-color: transparent; border:0; text-decoration: none;}
-a:hover {ldelim} color: #F33; border-bottom: 1px solid #FF3363;}
-a.thumblnk:hover {ldelim} border:0;}
-a.Piwigo {ldelim} font-family: verdana, arial, helvetica, sans-serif; color : #F33; text-decoration: none; border: 0; }
-a.Piwigo:hover {ldelim} border-bottom: 1px solid #FF3363; } \ No newline at end of file
diff --git a/themes/Sylvia/theme.css b/themes/Sylvia/theme.css
index b2a7dd485..7abbebe71 100644
--- a/themes/Sylvia/theme.css
+++ b/themes/Sylvia/theme.css
@@ -318,7 +318,7 @@
margin:0 5px;
padding:2px 5px 0 8px;
}
-.calItemEmpty, td.calDayCellEmpty, td.calDayCellFull {
+SPAN.calItem, td.calDayCellEmpty, td.calDayCellFull {
border:1px solid #666;
}
diff --git a/themes/Sylvia/themeconf.inc.php b/themes/Sylvia/themeconf.inc.php
index edabbfeb1..1022115cf 100644
--- a/themes/Sylvia/themeconf.inc.php
+++ b/themes/Sylvia/themeconf.inc.php
@@ -1,7 +1,7 @@
<?php
/*
Theme Name: Sylvia
-Version: 2.5.0
+Version: 2.6.0
Description: Dark background, flora and pink decorations.
Theme URI: http://piwigo.org/ext/extension_view.php?eid=368
Author: Piwigo team
diff --git a/themes/clear/index.php b/themes/clear/index.php
index 41732f2fd..c8de97f60 100644
--- a/themes/clear/index.php
+++ b/themes/clear/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/themes/clear/mail-css.tpl b/themes/clear/mail-css.tpl
deleted file mode 100644
index c61e369ef..000000000
--- a/themes/clear/mail-css.tpl
+++ /dev/null
@@ -1,9 +0,0 @@
-/* Theme clear mail css */
-
-body {ldelim} background-color:#fff; color:#696969;}
-#copyright {ldelim} background: transparent; color: #333;}
-h2 {ldelim} background-color: #ddd;}
-img {ldelim} margin: 16px; border: 16px solid #aaa; -moz-border-radius: 4px; border-radius: 4px 4px; }
-img:hover {ldelim} padding: 15px; border: 1px solid yellow;background-color:#faebd7; -moz-border-radius: 4px; border-radius: 4px 4px; }
-a {ldelim} color: #369; background: transparent; }
-a:hover {ldelim} color: #ddd; }
diff --git a/themes/clear/theme.css b/themes/clear/theme.css
index f6d8ca258..a7c64fa51 100644
--- a/themes/clear/theme.css
+++ b/themes/clear/theme.css
@@ -72,7 +72,7 @@ A.navThumb, A.navThumb:hover {
}
/*calendar elements*/
-.calItem, .calItemEmpty
+.calItem
{
border: 1px solid silver;
}
diff --git a/themes/clear/themeconf.inc.php b/themes/clear/themeconf.inc.php
index 0478b7289..f7387c2f7 100644
--- a/themes/clear/themeconf.inc.php
+++ b/themes/clear/themeconf.inc.php
@@ -1,7 +1,7 @@
<?php
/*
Theme Name: clear
-Version: 2.5.0
+Version: 2.6.0
Description: White background, soft gray.
Theme URI: http://piwigo.org/ext/extension_view.php?eid=9
Author: Piwigo team
diff --git a/themes/dark/images/index.php b/themes/dark/images/index.php
index 41732f2fd..c8de97f60 100644
--- a/themes/dark/images/index.php
+++ b/themes/dark/images/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/themes/dark/index.php b/themes/dark/index.php
index 41732f2fd..c8de97f60 100644
--- a/themes/dark/index.php
+++ b/themes/dark/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/themes/dark/mail-css.tpl b/themes/dark/mail-css.tpl
deleted file mode 100644
index 6399c9efd..000000000
--- a/themes/dark/mail-css.tpl
+++ /dev/null
@@ -1,9 +0,0 @@
-/* Theme dark mail css */
-
-body {ldelim} background-color:#444; color:#fff;}
-#copyright {ldelim} color: #69c;}
-h2 {ldelim} background-color: #333; color:#fff48e;}
-img {ldelim} margin: 16px; border: 16px solid #111; -moz-border-radius: 4px; border-radius: 4px 4px; }
-img:hover {ldelim} padding: 15px; border: 1px solid yellow;background-color:#444;-moz-border-radius: 4px; border-radius: 4px 4px; }
-a {ldelim} color: #fff48e; background: transparent;border-bottom:1px dotted #005e89; }
-a:hover {ldelim} color: #fff48e;}
diff --git a/themes/dark/themeconf.inc.php b/themes/dark/themeconf.inc.php
index 4161a854c..832954edd 100644
--- a/themes/dark/themeconf.inc.php
+++ b/themes/dark/themeconf.inc.php
@@ -1,7 +1,7 @@
<?php
/*
Theme Name: dark
-Version: 2.5.0
+Version: 2.6.0
Description: Dark background, grayscale.
Theme URI: http://piwigo.org/ext/extension_view.php?eid=369
Author: Piwigo team
diff --git a/themes/default/fix-ie5-ie6.css b/themes/default/fix-ie5-ie6.css
index 7d5442095..4c2f7e96e 100644
--- a/themes/default/fix-ie5-ie6.css
+++ b/themes/default/fix-ie5-ie6.css
@@ -69,5 +69,4 @@ H1, #theHeader {
.imageInfo {display:block; line-height:16px;}
.imageInfo dt {display:block; text-align:left; font-weight:bold; padding-right:0.5em;}
.imageInfo dd {display:block; text-align:left; font-weight:normal;}
-.relSwitchBox {position:static;}
#imageInfos dd { margin: 0 0 5px 20px;} \ No newline at end of file
diff --git a/themes/default/fix-ie7.css b/themes/default/fix-ie7.css
index 479f39f7a..fb77bfcc2 100644
--- a/themes/default/fix-ie7.css
+++ b/themes/default/fix-ie7.css
@@ -26,5 +26,4 @@
.imageInfo {display:block; line-height:16px;}
.imageInfo dt {display:block; text-align:left; font-weight:bold; padding-right:0.5em;}
.imageInfo dd {display:block; text-align:left; font-weight:normal;}
-.relSwitchBox {position:static;}
#imageInfos dd { margin: 0 0 5px 20px;} \ No newline at end of file
diff --git a/themes/default/icon/index.php b/themes/default/icon/index.php
index 41732f2fd..c8de97f60 100644
--- a/themes/default/icon/index.php
+++ b/themes/default/icon/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/themes/default/icon/mimetypes/index.php b/themes/default/icon/mimetypes/index.php
index 41732f2fd..c8de97f60 100644
--- a/themes/default/icon/mimetypes/index.php
+++ b/themes/default/icon/mimetypes/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/themes/default/iconset.css b/themes/default/iconset.css
index 8c6d29039..6c8e7a1b6 100644
--- a/themes/default/iconset.css
+++ b/themes/default/iconset.css
@@ -39,6 +39,7 @@
.pwg-icon-category-edit {background-position: -26px -52px}
.pwg-icon-sort {background-position: -52px -52px}
.pwg-icon-sizes {background-position: -78px -52px}
+.pwg-icon-menu {background-position: -130px -52px}
.pwg-icon-category-view-normal {background-position: -156px -52px}
.pwg-icon-category-view-flat {background-position: -182px -52px}
diff --git a/themes/default/images/index.php b/themes/default/images/index.php
index 41732f2fd..c8de97f60 100644
--- a/themes/default/images/index.php
+++ b/themes/default/images/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/themes/default/index.php b/themes/default/index.php
index 41732f2fd..c8de97f60 100644
--- a/themes/default/index.php
+++ b/themes/default/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/themes/default/js/datepicker.js b/themes/default/js/datepicker.js
index 93e712e02..ff2c2d4d2 100644
--- a/themes/default/js/datepicker.js
+++ b/themes/default/js/datepicker.js
@@ -16,13 +16,13 @@ function pwg_common_initialization_datepicker(buttonImageName, day, month, year,
// return if linked_date is valid date
function is_valid_linked_value(linked_date_name)
{
- array_date = $(linked_date_name).val().split('-');
- return (
- (array_date.length == 3) &&
- (array_date[0] != "") &&
- (array_date[1] != "") && (array_date[1] != "0") &&
- (array_date[2] != "") && (array_date[2] != "0")
- )
+ var array_date = $(linked_date_name).val().split('-');
+ return (
+ (array_date.length == 3) &&
+ (array_date[0].length) &&
+ (array_date[1].length) && (array_date[1] != "0") &&
+ (array_date[2].length) && (array_date[2] != "0")
+ )
}
// Action on change date value
@@ -31,16 +31,16 @@ function pwg_common_initialization_datepicker(buttonImageName, day, month, year,
pwg_check_date();
if (checked_on_change != null)
{
- $(checked_on_change).attr("checked", "true");
+ $(checked_on_change).prop("checked", true);
}
}
// In order to desable element of list
function pwg_disabled_selection()
{
- array_date = $(linked_date).val().split('-');
- y = array_date[0];
- m = array_date[1];
+ var array_date = $(linked_date).val().split('-')
+ , y = array_date[0]
+ , m = array_date[1];
// Init list
$(day + " option").removeAttr("disabled");
@@ -95,7 +95,8 @@ function pwg_common_initialization_datepicker(buttonImageName, day, month, year,
// Prevent selection of invalid dates through the select controls
function pwg_check_date()
{
- last_date = $(linked_date).val();
+ var last_date = $(linked_date).val()
+ , cancel=false;
$(linked_date).val(pwg_get_fmt_from_ctrls());
@@ -107,14 +108,10 @@ function pwg_common_initialization_datepicker(buttonImageName, day, month, year,
{
cancel = ($(max_linked_date).datepicker("getDate") < $(linked_date).datepicker("getDate"));
}
- else
- {
- cancel = false;
- }
if (cancel)
{
- array_date = last_date.split('-');
+ var array_date = last_date.split('-');
$(year).val(array_date[0]);
$(month).val(array_date[1]);
$(day).val(array_date[2]);
@@ -157,7 +154,7 @@ function pwg_common_initialization_datepicker(buttonImageName, day, month, year,
}
else
{
- array_date = date.split('-');
+ var array_date = date.split('-');
$(year).val(array_date[0]);
$(month).val(array_date[1]);
$(day).val(array_date[2]);
diff --git a/themes/default/js/image.loader.js b/themes/default/js/image.loader.js
deleted file mode 100644
index cd8b9cc52..000000000
--- a/themes/default/js/image.loader.js
+++ /dev/null
@@ -1,84 +0,0 @@
-
-function ImageLoader(opts) {
- this.opts = jQuery.extend( {
- maxRequests: 6,
- onChanged: jQuery.noop
- }, opts||{} );
-}
-
-ImageLoader.prototype = {
- loaded: 0,
- errors: 0,
- errorEma: 0,
-
- pause: false,
-
- current: [],
- queue: [],
- pool: [],
-
- remaining: function() {
- return this.current.length + this.queue.length;
- },
-
- add: function(urls) {
- this.queue = this.queue.concat( urls );
- this._fireChanged("add");
- this._checkQueue();
- },
-
- clear: function() {
- this.queue.length = 0;
- while (this.current.length)
- jQuery( this.current.pop() ).unbind();
- this.loaded = this.errors = this.errorEma = 0;
- },
-
- pause: function(val) {
- if (val !== undefined)
- {
- this.paused = val;
- this._checkQueue();
- }
- return this.paused;
- },
-
- _checkQueue: function() {
- while (!this.paused
- && this.queue.length
- && this.current.length < this.opts.maxRequests)
- {
- this._processOne( this.queue.shift() );
- }
- },
-
- _processOne: function(url) {
- var img = this.pool.shift() || new Image;
- this.current.push(img);
- var that = this;
- jQuery(img).bind( "load error abort", function(e) {
- //img.onload = function(e) {
- jQuery(img).unbind();
- img.onload=null;
- that.current.splice(jQuery.inArray(img, that.current), 1);
- if (e.type==="load") {
- that.loaded++;
- that.errorEma *= 0.9;
- }
- else {
- that.errors++;
- that.errorEma++;
- if (that.errorEma>=20 && that.errorEma<21)
- that.paused = true;
- }
- that._fireChanged(e.type, img);
- that._checkQueue();
- that.pool.push(img);
- } );
- img.src = url;
- },
-
- _fireChanged: function(type, img) {
- this.opts.onChanged(type, img);
- }
-} \ No newline at end of file
diff --git a/themes/default/js/jquery.js b/themes/default/js/jquery.js
index 8c24ffc61..c5c648255 100644
--- a/themes/default/js/jquery.js
+++ b/themes/default/js/jquery.js
@@ -1,28 +1,38 @@
/*!
- * jQuery JavaScript Library v1.8.3
+ * jQuery JavaScript Library v1.10.2
* http://jquery.com/
*
* Includes Sizzle.js
* http://sizzlejs.com/
*
- * Copyright 2012 jQuery Foundation and other contributors
+ * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors
* Released under the MIT license
* http://jquery.org/license
*
- * Date: Tue Nov 13 2012 08:20:33 GMT-0500 (Eastern Standard Time)
+ * Date: 2013-07-03T13:48Z
*/
(function( window, undefined ) {
+
+// Can't do this because several apps including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+// Support: Firefox 18+
+//"use strict";
var
+ // The deferred used on DOM ready
+ readyList,
+
// A central reference to the root jQuery(document)
rootjQuery,
- // The deferred used on DOM ready
- readyList,
+ // Support: IE<10
+ // For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`
+ core_strundefined = typeof undefined,
// Use the correct document accordingly with window argument (sandbox)
- document = window.document,
location = window.location,
- navigator = window.navigator,
+ document = window.document,
+ docElem = document.documentElement,
// Map over jQuery in case of overwrite
_jQuery = window.jQuery,
@@ -30,13 +40,22 @@ var
// Map over the $ in case of overwrite
_$ = window.$,
+ // [[Class]] -> type pairs
+ class2type = {},
+
+ // List of deleted data cache ids, so we can reuse them
+ core_deletedIds = [],
+
+ core_version = "1.10.2",
+
// Save a reference to some core methods
- core_push = Array.prototype.push,
- core_slice = Array.prototype.slice,
- core_indexOf = Array.prototype.indexOf,
- core_toString = Object.prototype.toString,
- core_hasOwn = Object.prototype.hasOwnProperty,
- core_trim = String.prototype.trim,
+ core_concat = core_deletedIds.concat,
+ core_push = core_deletedIds.push,
+ core_slice = core_deletedIds.slice,
+ core_indexOf = core_deletedIds.indexOf,
+ core_toString = class2type.toString,
+ core_hasOwn = class2type.hasOwnProperty,
+ core_trim = core_version.trim,
// Define a local copy of jQuery
jQuery = function( selector, context ) {
@@ -45,18 +64,18 @@ var
},
// Used for matching numbers
- core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,
+ core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
- // Used for detecting and trimming whitespace
- core_rnotwhite = /\S/,
- core_rspace = /\s+/,
+ // Used for splitting on whitespace
+ core_rnotwhite = /\S+/g,
// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
// A simple way to check for HTML strings
// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
- rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+ // Strict HTML recognition (#11290: must start with <)
+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
// Match a standalone tag
rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
@@ -65,7 +84,7 @@ var
rvalidchars = /^[\],:{}\s]*$/,
rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
- rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,
+ rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,
// Matches dashed string for camelizing
rmsPrefix = /^-ms-/,
@@ -73,42 +92,43 @@ var
// Used by jQuery.camelCase as callback to replace()
fcamelCase = function( all, letter ) {
- return ( letter + "" ).toUpperCase();
+ return letter.toUpperCase();
},
- // The ready event handler and self cleanup method
- DOMContentLoaded = function() {
- if ( document.addEventListener ) {
- document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
- jQuery.ready();
- } else if ( document.readyState === "complete" ) {
- // we're here because readyState === "complete" in oldIE
- // which is good enough for us to call the dom ready!
- document.detachEvent( "onreadystatechange", DOMContentLoaded );
+ // The ready event handler
+ completed = function( event ) {
+
+ // readyState === "complete" is good enough for us to call the dom ready in oldIE
+ if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
+ detach();
jQuery.ready();
}
},
+ // Clean-up method for dom ready events
+ detach = function() {
+ if ( document.addEventListener ) {
+ document.removeEventListener( "DOMContentLoaded", completed, false );
+ window.removeEventListener( "load", completed, false );
- // [[Class]] -> type pairs
- class2type = {};
+ } else {
+ document.detachEvent( "onreadystatechange", completed );
+ window.detachEvent( "onload", completed );
+ }
+ };
jQuery.fn = jQuery.prototype = {
+ // The current version of jQuery being used
+ jquery: core_version,
+
constructor: jQuery,
init: function( selector, context, rootjQuery ) {
- var match, elem, ret, doc;
+ var match, elem;
- // Handle $(""), $(null), $(undefined), $(false)
+ // HANDLE: $(""), $(null), $(undefined), $(false)
if ( !selector ) {
return this;
}
- // Handle $(DOMElement)
- if ( selector.nodeType ) {
- this.context = this[0] = selector;
- this.length = 1;
- return this;
- }
-
// Handle HTML strings
if ( typeof selector === "string" ) {
if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
@@ -125,15 +145,29 @@ jQuery.fn = jQuery.prototype = {
// HANDLE: $(html) -> $(array)
if ( match[1] ) {
context = context instanceof jQuery ? context[0] : context;
- doc = ( context && context.nodeType ? context.ownerDocument || context : document );
// scripts is true for back-compat
- selector = jQuery.parseHTML( match[1], doc, true );
+ jQuery.merge( this, jQuery.parseHTML(
+ match[1],
+ context && context.nodeType ? context.ownerDocument || context : document,
+ true
+ ) );
+
+ // HANDLE: $(html, props)
if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
- this.attr.call( selector, context, true );
+ for ( match in context ) {
+ // Properties of context are called as methods if possible
+ if ( jQuery.isFunction( this[ match ] ) ) {
+ this[ match ]( context[ match ] );
+
+ // ...and otherwise set as attributes
+ } else {
+ this.attr( match, context[ match ] );
+ }
+ }
}
- return jQuery.merge( this, selector );
+ return this;
// HANDLE: $(#id)
} else {
@@ -168,6 +202,12 @@ jQuery.fn = jQuery.prototype = {
return this.constructor( context ).find( selector );
}
+ // HANDLE: $(DOMElement)
+ } else if ( selector.nodeType ) {
+ this.context = this[0] = selector;
+ this.length = 1;
+ return this;
+
// HANDLE: $(function)
// Shortcut for document ready
} else if ( jQuery.isFunction( selector ) ) {
@@ -185,17 +225,9 @@ jQuery.fn = jQuery.prototype = {
// Start with an empty selector
selector: "",
- // The current version of jQuery being used
- jquery: "1.8.3",
-
// The default length of a jQuery object is 0
length: 0,
- // The number of elements contained in the matched element set
- size: function() {
- return this.length;
- },
-
toArray: function() {
return core_slice.call( this );
},
@@ -214,22 +246,15 @@ jQuery.fn = jQuery.prototype = {
// Take an array of elements and push it onto the stack
// (returning the new matched element set)
- pushStack: function( elems, name, selector ) {
+ pushStack: function( elems ) {
// Build a new jQuery matched element set
var ret = jQuery.merge( this.constructor(), elems );
// Add the old object onto the stack (as a reference)
ret.prevObject = this;
-
ret.context = this.context;
- if ( name === "find" ) {
- ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
- } else if ( name ) {
- ret.selector = this.selector + "." + name + "(" + selector + ")";
- }
-
// Return the newly-formed element set
return ret;
},
@@ -248,11 +273,8 @@ jQuery.fn = jQuery.prototype = {
return this;
},
- eq: function( i ) {
- i = +i;
- return i === -1 ?
- this.slice( i ) :
- this.slice( i, i + 1 );
+ slice: function() {
+ return this.pushStack( core_slice.apply( this, arguments ) );
},
first: function() {
@@ -263,9 +285,10 @@ jQuery.fn = jQuery.prototype = {
return this.eq( -1 );
},
- slice: function() {
- return this.pushStack( core_slice.apply( this, arguments ),
- "slice", core_slice.call(arguments).join(",") );
+ eq: function( i ) {
+ var len = this.length,
+ j = +i + ( i < 0 ? len : 0 );
+ return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
},
map: function( callback ) {
@@ -289,7 +312,7 @@ jQuery.fn = jQuery.prototype = {
jQuery.fn.init.prototype = jQuery.fn;
jQuery.extend = jQuery.fn.extend = function() {
- var options, name, src, copy, copyIsArray, clone,
+ var src, copyIsArray, copy, name, options, clone,
target = arguments[0] || {},
i = 1,
length = arguments.length,
@@ -353,6 +376,10 @@ jQuery.extend = jQuery.fn.extend = function() {
};
jQuery.extend({
+ // Unique for each copy of jQuery on the page
+ // Non-digits removed to match rinlinejQuery
+ expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ),
+
noConflict: function( deep ) {
if ( window.$ === jQuery ) {
window.$ = _$;
@@ -391,7 +418,7 @@ jQuery.extend({
// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
if ( !document.body ) {
- return setTimeout( jQuery.ready, 1 );
+ return setTimeout( jQuery.ready );
}
// Remember that the DOM is ready
@@ -423,6 +450,7 @@ jQuery.extend({
},
isWindow: function( obj ) {
+ /* jshint eqeqeq: false */
return obj != null && obj == obj.window;
},
@@ -431,12 +459,17 @@ jQuery.extend({
},
type: function( obj ) {
- return obj == null ?
- String( obj ) :
- class2type[ core_toString.call(obj) ] || "object";
+ if ( obj == null ) {
+ return String( obj );
+ }
+ return typeof obj === "object" || typeof obj === "function" ?
+ class2type[ core_toString.call(obj) ] || "object" :
+ typeof obj;
},
isPlainObject: function( obj ) {
+ var key;
+
// Must be an Object.
// Because of IE, we also have to check the presence of the constructor property.
// Make sure that DOM nodes and window objects don't pass through, as well
@@ -456,10 +489,16 @@ jQuery.extend({
return false;
}
+ // Support: IE<9
+ // Handle iteration over inherited properties before own properties.
+ if ( jQuery.support.ownLast ) {
+ for ( key in obj ) {
+ return core_hasOwn.call( obj, key );
+ }
+ }
+
// Own properties are enumerated firstly, so to speed up,
// if last one is own, then all properties are own.
-
- var key;
for ( key in obj ) {}
return key === undefined || core_hasOwn.call( obj, key );
@@ -479,50 +518,59 @@ jQuery.extend({
// data: string of html
// context (optional): If specified, the fragment will be created in this context, defaults to document
- // scripts (optional): If true, will include scripts passed in the html string
- parseHTML: function( data, context, scripts ) {
- var parsed;
+ // keepScripts (optional): If true, will include scripts passed in the html string
+ parseHTML: function( data, context, keepScripts ) {
if ( !data || typeof data !== "string" ) {
return null;
}
if ( typeof context === "boolean" ) {
- scripts = context;
- context = 0;
+ keepScripts = context;
+ context = false;
}
context = context || document;
+ var parsed = rsingleTag.exec( data ),
+ scripts = !keepScripts && [];
+
// Single tag
- if ( (parsed = rsingleTag.exec( data )) ) {
+ if ( parsed ) {
return [ context.createElement( parsed[1] ) ];
}
- parsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] );
- return jQuery.merge( [],
- (parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes );
+ parsed = jQuery.buildFragment( [ data ], context, scripts );
+ if ( scripts ) {
+ jQuery( scripts ).remove();
+ }
+ return jQuery.merge( [], parsed.childNodes );
},
parseJSON: function( data ) {
- if ( !data || typeof data !== "string") {
- return null;
- }
-
- // Make sure leading/trailing whitespace is removed (IE can't handle it)
- data = jQuery.trim( data );
-
// Attempt to parse using the native JSON parser first
if ( window.JSON && window.JSON.parse ) {
return window.JSON.parse( data );
}
- // Make sure the incoming data is actual JSON
- // Logic borrowed from http://json.org/json2.js
- if ( rvalidchars.test( data.replace( rvalidescape, "@" )
- .replace( rvalidtokens, "]" )
- .replace( rvalidbraces, "")) ) {
+ if ( data === null ) {
+ return data;
+ }
- return ( new Function( "return " + data ) )();
+ if ( typeof data === "string" ) {
+ // Make sure leading/trailing whitespace is removed (IE can't handle it)
+ data = jQuery.trim( data );
+
+ if ( data ) {
+ // Make sure the incoming data is actual JSON
+ // Logic borrowed from http://json.org/json2.js
+ if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+ .replace( rvalidtokens, "]" )
+ .replace( rvalidbraces, "")) ) {
+
+ return ( new Function( "return " + data ) )();
+ }
+ }
}
+
jQuery.error( "Invalid JSON: " + data );
},
@@ -556,7 +604,7 @@ jQuery.extend({
// Workarounds based on findings by Jim Driscoll
// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
globalEval: function( data ) {
- if ( data && core_rnotwhite.test( data ) ) {
+ if ( data && jQuery.trim( data ) ) {
// We use execScript on Internet Explorer
// We use an anonymous function so that context is window
// rather than jQuery in Firefox
@@ -578,21 +626,25 @@ jQuery.extend({
// args is for internal usage only
each: function( obj, callback, args ) {
- var name,
+ var value,
i = 0,
length = obj.length,
- isObj = length === undefined || jQuery.isFunction( obj );
+ isArray = isArraylike( obj );
if ( args ) {
- if ( isObj ) {
- for ( name in obj ) {
- if ( callback.apply( obj[ name ], args ) === false ) {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
break;
}
}
} else {
- for ( ; i < length; ) {
- if ( callback.apply( obj[ i++ ], args ) === false ) {
+ for ( i in obj ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
break;
}
}
@@ -600,15 +652,19 @@ jQuery.extend({
// A special, fast, case for the most common use of each
} else {
- if ( isObj ) {
- for ( name in obj ) {
- if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
break;
}
}
} else {
- for ( ; i < length; ) {
- if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {
+ for ( i in obj ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
break;
}
}
@@ -635,18 +691,16 @@ jQuery.extend({
// results is for internal usage only
makeArray: function( arr, results ) {
- var type,
- ret = results || [];
+ var ret = results || [];
if ( arr != null ) {
- // The window, strings (and functions) also have 'length'
- // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
- type = jQuery.type( arr );
-
- if ( arr.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( arr ) ) {
- core_push.call( ret, arr );
+ if ( isArraylike( Object(arr) ) ) {
+ jQuery.merge( ret,
+ typeof arr === "string" ?
+ [ arr ] : arr
+ );
} else {
- jQuery.merge( ret, arr );
+ core_push.call( ret, arr );
}
}
@@ -684,7 +738,6 @@ jQuery.extend({
for ( ; j < l; j++ ) {
first[ i++ ] = second[ j ];
}
-
} else {
while ( second[j] !== undefined ) {
first[ i++ ] = second[ j++ ];
@@ -717,12 +770,11 @@ jQuery.extend({
// arg is for internal usage only
map: function( elems, callback, arg ) {
- var value, key,
- ret = [],
+ var value,
i = 0,
length = elems.length,
- // jquery objects are treated as arrays
- isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
+ isArray = isArraylike( elems ),
+ ret = [];
// Go through the array, translating each of the items to their
if ( isArray ) {
@@ -736,8 +788,8 @@ jQuery.extend({
// Go through every key on the object,
} else {
- for ( key in elems ) {
- value = callback( elems[ key ], key, arg );
+ for ( i in elems ) {
+ value = callback( elems[ i ], i, arg );
if ( value != null ) {
ret[ ret.length ] = value;
@@ -746,7 +798,7 @@ jQuery.extend({
}
// Flatten any nested arrays
- return ret.concat.apply( [], ret );
+ return core_concat.apply( [], ret );
},
// A global GUID counter for objects
@@ -755,7 +807,7 @@ jQuery.extend({
// Bind a function to a context, optionally partially applying any
// arguments.
proxy: function( fn, context ) {
- var tmp, args, proxy;
+ var args, proxy, tmp;
if ( typeof context === "string" ) {
tmp = fn[ context ];
@@ -772,7 +824,7 @@ jQuery.extend({
// Simulated bind
args = core_slice.call( arguments, 2 );
proxy = function() {
- return fn.apply( context, args.concat( core_slice.call( arguments ) ) );
+ return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );
};
// Set the guid of unique handler to the same of original handler, so it can be removed
@@ -783,46 +835,46 @@ jQuery.extend({
// Multifunctional method to get and set values of a collection
// The value/s can optionally be executed if it's a function
- access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
- var exec,
- bulk = key == null,
- i = 0,
- length = elems.length;
+ access: function( elems, fn, key, value, chainable, emptyGet, raw ) {
+ var i = 0,
+ length = elems.length,
+ bulk = key == null;
// Sets many values
- if ( key && typeof key === "object" ) {
+ if ( jQuery.type( key ) === "object" ) {
+ chainable = true;
for ( i in key ) {
- jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
+ jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
}
- chainable = 1;
// Sets one value
} else if ( value !== undefined ) {
- // Optionally, function values get executed if exec is true
- exec = pass === undefined && jQuery.isFunction( value );
+ chainable = true;
- if ( bulk ) {
- // Bulk operations only iterate when executing function values
- if ( exec ) {
- exec = fn;
- fn = function( elem, key, value ) {
- return exec.call( jQuery( elem ), value );
- };
+ if ( !jQuery.isFunction( value ) ) {
+ raw = true;
+ }
- // Otherwise they run against the entire set
- } else {
+ if ( bulk ) {
+ // Bulk operations run against the entire set
+ if ( raw ) {
fn.call( elems, value );
fn = null;
+
+ // ...except when executing function values
+ } else {
+ bulk = fn;
+ fn = function( elem, key, value ) {
+ return bulk.call( jQuery( elem ), value );
+ };
}
}
if ( fn ) {
- for (; i < length; i++ ) {
- fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+ for ( ; i < length; i++ ) {
+ fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
}
}
-
- chainable = 1;
}
return chainable ?
@@ -836,6 +888,29 @@ jQuery.extend({
now: function() {
return ( new Date() ).getTime();
+ },
+
+ // A method for quickly swapping in/out CSS properties to get correct calculations.
+ // Note: this method belongs to the css module but it's needed here for the support module.
+ // If support gets modularized, this method should be moved back to the css module.
+ swap: function( elem, options, callback, args ) {
+ var ret, name,
+ old = {};
+
+ // Remember the old values, and insert the new ones
+ for ( name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
+
+ ret = callback.apply( elem, args || [] );
+
+ // Revert the old values
+ for ( name in options ) {
+ elem.style[ name ] = old[ name ];
+ }
+
+ return ret;
}
});
@@ -849,23 +924,23 @@ jQuery.ready.promise = function( obj ) {
// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
if ( document.readyState === "complete" ) {
// Handle it asynchronously to allow scripts the opportunity to delay ready
- setTimeout( jQuery.ready, 1 );
+ setTimeout( jQuery.ready );
// Standards-based browsers support DOMContentLoaded
} else if ( document.addEventListener ) {
// Use the handy event callback
- document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+ document.addEventListener( "DOMContentLoaded", completed, false );
// A fallback to window.onload, that will always work
- window.addEventListener( "load", jQuery.ready, false );
+ window.addEventListener( "load", completed, false );
// If IE event model is used
} else {
// Ensure firing before onload, maybe late but safe also for iframes
- document.attachEvent( "onreadystatechange", DOMContentLoaded );
+ document.attachEvent( "onreadystatechange", completed );
// A fallback to window.onload, that will always work
- window.attachEvent( "onload", jQuery.ready );
+ window.attachEvent( "onload", completed );
// If IE and not a frame
// continually check to see if the document is ready
@@ -887,6 +962,9 @@ jQuery.ready.promise = function( obj ) {
return setTimeout( doScrollCheck, 50 );
}
+ // detach all dom ready events
+ detach();
+
// and execute any waiting functions
jQuery.ready();
}
@@ -898,19 +976,2015 @@ jQuery.ready.promise = function( obj ) {
};
// Populate the class2type map
-jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
class2type[ "[object " + name + "]" ] = name.toLowerCase();
});
+function isArraylike( obj ) {
+ var length = obj.length,
+ type = jQuery.type( obj );
+
+ if ( jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ if ( obj.nodeType === 1 && length ) {
+ return true;
+ }
+
+ return type === "array" || type !== "function" &&
+ ( length === 0 ||
+ typeof length === "number" && length > 0 && ( length - 1 ) in obj );
+}
+
// All jQuery objects should point back to these
rootjQuery = jQuery(document);
+/*!
+ * Sizzle CSS Selector Engine v1.10.2
+ * http://sizzlejs.com/
+ *
+ * Copyright 2013 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2013-07-03
+ */
+(function( window, undefined ) {
+
+var i,
+ support,
+ cachedruns,
+ Expr,
+ getText,
+ isXML,
+ compile,
+ outermostContext,
+ sortInput,
+
+ // Local document vars
+ setDocument,
+ document,
+ docElem,
+ documentIsHTML,
+ rbuggyQSA,
+ rbuggyMatches,
+ matches,
+ contains,
+
+ // Instance-specific data
+ expando = "sizzle" + -(new Date()),
+ preferredDoc = window.document,
+ dirruns = 0,
+ done = 0,
+ classCache = createCache(),
+ tokenCache = createCache(),
+ compilerCache = createCache(),
+ hasDuplicate = false,
+ sortOrder = function( a, b ) {
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+ return 0;
+ },
+
+ // General-purpose constants
+ strundefined = typeof undefined,
+ MAX_NEGATIVE = 1 << 31,
+
+ // Instance methods
+ hasOwn = ({}).hasOwnProperty,
+ arr = [],
+ pop = arr.pop,
+ push_native = arr.push,
+ push = arr.push,
+ slice = arr.slice,
+ // Use a stripped-down indexOf if we can't use a native one
+ indexOf = arr.indexOf || function( elem ) {
+ var i = 0,
+ len = this.length;
+ for ( ; i < len; i++ ) {
+ if ( this[i] === elem ) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+ // Regular expressions
+
+ // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+ whitespace = "[\\x20\\t\\r\\n\\f]",
+ // http://www.w3.org/TR/css3-syntax/#characters
+ characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+ // Loosely modeled on CSS identifier characters
+ // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
+ // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+ identifier = characterEncoding.replace( "w", "w#" ),
+
+ // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
+ attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
+ "*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
+
+ // Prefer arguments quoted,
+ // then not containing pseudos/brackets,
+ // then attribute selectors/non-parenthetical expressions,
+ // then anything else
+ // These preferences are here to reduce the number of selectors
+ // needing tokenize in the PSEUDO preFilter
+ pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",
+
+ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+ rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+ rsibling = new RegExp( whitespace + "*[+~]" ),
+ rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*)" + whitespace + "*\\]", "g" ),
+
+ rpseudo = new RegExp( pseudos ),
+ ridentifier = new RegExp( "^" + identifier + "$" ),
+
+ matchExpr = {
+ "ID": new RegExp( "^#(" + characterEncoding + ")" ),
+ "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+ "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
+ "ATTR": new RegExp( "^" + attributes ),
+ "PSEUDO": new RegExp( "^" + pseudos ),
+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+ "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+ "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+ "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+ // For use in libraries implementing .is()
+ // We use this for POS matching in `select`
+ "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+ whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+ },
+
+ rnative = /^[^{]+\{\s*\[native \w/,
+
+ // Easily-parseable/retrievable ID or TAG or CLASS selectors
+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+ rinputs = /^(?:input|select|textarea|button)$/i,
+ rheader = /^h\d$/i,
+
+ rescape = /'|\\/g,
+
+ // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+ runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+ funescape = function( _, escaped, escapedWhitespace ) {
+ var high = "0x" + escaped - 0x10000;
+ // NaN means non-codepoint
+ // Support: Firefox
+ // Workaround erroneous numeric interpretation of +"0x"
+ return high !== high || escapedWhitespace ?
+ escaped :
+ // BMP codepoint
+ high < 0 ?
+ String.fromCharCode( high + 0x10000 ) :
+ // Supplemental Plane codepoint (surrogate pair)
+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+ };
+
+// Optimize for push.apply( _, NodeList )
+try {
+ push.apply(
+ (arr = slice.call( preferredDoc.childNodes )),
+ preferredDoc.childNodes
+ );
+ // Support: Android<4.0
+ // Detect silently failing push.apply
+ arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+ push = { apply: arr.length ?
+
+ // Leverage slice if possible
+ function( target, els ) {
+ push_native.apply( target, slice.call(els) );
+ } :
+
+ // Support: IE<9
+ // Otherwise append directly
+ function( target, els ) {
+ var j = target.length,
+ i = 0;
+ // Can't trust NodeList.length
+ while ( (target[j++] = els[i++]) ) {}
+ target.length = j - 1;
+ }
+ };
+}
+
+function Sizzle( selector, context, results, seed ) {
+ var match, elem, m, nodeType,
+ // QSA vars
+ i, groups, old, nid, newContext, newSelector;
+
+ if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+ setDocument( context );
+ }
+
+ context = context || document;
+ results = results || [];
+
+ if ( !selector || typeof selector !== "string" ) {
+ return results;
+ }
+
+ if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
+ return [];
+ }
+
+ if ( documentIsHTML && !seed ) {
+
+ // Shortcuts
+ if ( (match = rquickExpr.exec( selector )) ) {
+ // Speed-up: Sizzle("#ID")
+ if ( (m = match[1]) ) {
+ if ( nodeType === 9 ) {
+ elem = context.getElementById( m );
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ if ( elem && elem.parentNode ) {
+ // Handle the case where IE, Opera, and Webkit return items
+ // by name instead of ID
+ if ( elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ } else {
+ return results;
+ }
+ } else {
+ // Context is not a document
+ if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
+ contains( context, elem ) && elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ }
+
+ // Speed-up: Sizzle("TAG")
+ } else if ( match[2] ) {
+ push.apply( results, context.getElementsByTagName( selector ) );
+ return results;
+
+ // Speed-up: Sizzle(".CLASS")
+ } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
+ push.apply( results, context.getElementsByClassName( m ) );
+ return results;
+ }
+ }
+
+ // QSA path
+ if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+ nid = old = expando;
+ newContext = context;
+ newSelector = nodeType === 9 && selector;
+
+ // qSA works strangely on Element-rooted queries
+ // We can work around this by specifying an extra ID on the root
+ // and working up from there (Thanks to Andrew Dupont for the technique)
+ // IE 8 doesn't work on object elements
+ if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+ groups = tokenize( selector );
+
+ if ( (old = context.getAttribute("id")) ) {
+ nid = old.replace( rescape, "\\$&" );
+ } else {
+ context.setAttribute( "id", nid );
+ }
+ nid = "[id='" + nid + "'] ";
+
+ i = groups.length;
+ while ( i-- ) {
+ groups[i] = nid + toSelector( groups[i] );
+ }
+ newContext = rsibling.test( selector ) && context.parentNode || context;
+ newSelector = groups.join(",");
+ }
+
+ if ( newSelector ) {
+ try {
+ push.apply( results,
+ newContext.querySelectorAll( newSelector )
+ );
+ return results;
+ } catch(qsaError) {
+ } finally {
+ if ( !old ) {
+ context.removeAttribute("id");
+ }
+ }
+ }
+ }
+ }
+
+ // All others
+ return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
+ * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ * deleting the oldest entry
+ */
+function createCache() {
+ var keys = [];
+
+ function cache( key, value ) {
+ // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+ if ( keys.push( key += " " ) > Expr.cacheLength ) {
+ // Only keep the most recent entries
+ delete cache[ keys.shift() ];
+ }
+ return (cache[ key ] = value);
+ }
+ return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+ fn[ expando ] = true;
+ return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created div and expects a boolean result
+ */
+function assert( fn ) {
+ var div = document.createElement("div");
+
+ try {
+ return !!fn( div );
+ } catch (e) {
+ return false;
+ } finally {
+ // Remove from its parent by default
+ if ( div.parentNode ) {
+ div.parentNode.removeChild( div );
+ }
+ // release memory in IE
+ div = null;
+ }
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+ var arr = attrs.split("|"),
+ i = attrs.length;
+
+ while ( i-- ) {
+ Expr.attrHandle[ arr[i] ] = handler;
+ }
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+ var cur = b && a,
+ diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+ ( ~b.sourceIndex || MAX_NEGATIVE ) -
+ ( ~a.sourceIndex || MAX_NEGATIVE );
+
+ // Use IE sourceIndex if available on both nodes
+ if ( diff ) {
+ return diff;
+ }
+
+ // Check if b follows a
+ if ( cur ) {
+ while ( (cur = cur.nextSibling) ) {
+ if ( cur === b ) {
+ return -1;
+ }
+ }
+ }
+
+ return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return (name === "input" || name === "button") && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+ return markFunction(function( argument ) {
+ argument = +argument;
+ return markFunction(function( seed, matches ) {
+ var j,
+ matchIndexes = fn( [], seed.length, argument ),
+ i = matchIndexes.length;
+
+ // Match elements found at the specified indexes
+ while ( i-- ) {
+ if ( seed[ (j = matchIndexes[i]) ] ) {
+ seed[j] = !(matches[j] = seed[j]);
+ }
+ }
+ });
+ });
+}
+
+/**
+ * Detect xml
+ * @param {Element|Object} elem An element or a document
+ */
+isXML = Sizzle.isXML = function( elem ) {
+ // documentElement is verified for cases where it doesn't yet exist
+ // (such as loading iframes in IE - #4833)
+ var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+ var doc = node ? node.ownerDocument || node : preferredDoc,
+ parent = doc.defaultView;
+
+ // If no document and documentElement is available, return
+ if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+ return document;
+ }
+
+ // Set our document
+ document = doc;
+ docElem = doc.documentElement;
+
+ // Support tests
+ documentIsHTML = !isXML( doc );
+
+ // Support: IE>8
+ // If iframe document is assigned to "document" variable and if iframe has been reloaded,
+ // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
+ // IE6-8 do not support the defaultView property so parent will be undefined
+ if ( parent && parent.attachEvent && parent !== parent.top ) {
+ parent.attachEvent( "onbeforeunload", function() {
+ setDocument();
+ });
+ }
+
+ /* Attributes
+ ---------------------------------------------------------------------- */
+
+ // Support: IE<8
+ // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
+ support.attributes = assert(function( div ) {
+ div.className = "i";
+ return !div.getAttribute("className");
+ });
+
+ /* getElement(s)By*
+ ---------------------------------------------------------------------- */
+
+ // Check if getElementsByTagName("*") returns only elements
+ support.getElementsByTagName = assert(function( div ) {
+ div.appendChild( doc.createComment("") );
+ return !div.getElementsByTagName("*").length;
+ });
+
+ // Check if getElementsByClassName can be trusted
+ support.getElementsByClassName = assert(function( div ) {
+ div.innerHTML = "<div class='a'></div><div class='a i'></div>";
+
+ // Support: Safari<4
+ // Catch class over-caching
+ div.firstChild.className = "i";
+ // Support: Opera<10
+ // Catch gEBCN failure to find non-leading classes
+ return div.getElementsByClassName("i").length === 2;
+ });
+
+ // Support: IE<10
+ // Check if getElementById returns elements by name
+ // The broken getElementById methods don't pick up programatically-set names,
+ // so use a roundabout getElementsByName test
+ support.getById = assert(function( div ) {
+ docElem.appendChild( div ).id = expando;
+ return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
+ });
+
+ // ID find and filter
+ if ( support.getById ) {
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
+ var m = context.getElementById( id );
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ return m && m.parentNode ? [m] : [];
+ }
+ };
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ return elem.getAttribute("id") === attrId;
+ };
+ };
+ } else {
+ // Support: IE6/7
+ // getElementById is not reliable as a find shortcut
+ delete Expr.find["ID"];
+
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
+ return node && node.value === attrId;
+ };
+ };
+ }
+
+ // Tag
+ Expr.find["TAG"] = support.getElementsByTagName ?
+ function( tag, context ) {
+ if ( typeof context.getElementsByTagName !== strundefined ) {
+ return context.getElementsByTagName( tag );
+ }
+ } :
+ function( tag, context ) {
+ var elem,
+ tmp = [],
+ i = 0,
+ results = context.getElementsByTagName( tag );
+
+ // Filter out possible comments
+ if ( tag === "*" ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem.nodeType === 1 ) {
+ tmp.push( elem );
+ }
+ }
+
+ return tmp;
+ }
+ return results;
+ };
+
+ // Class
+ Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+ if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {
+ return context.getElementsByClassName( className );
+ }
+ };
+
+ /* QSA/matchesSelector
+ ---------------------------------------------------------------------- */
+
+ // QSA and matchesSelector support
+
+ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+ rbuggyMatches = [];
+
+ // qSa(:focus) reports false when true (Chrome 21)
+ // We allow this because of a bug in IE8/9 that throws an error
+ // whenever `document.activeElement` is accessed on an iframe
+ // So, we allow :focus to pass through QSA all the time to avoid the IE error
+ // See http://bugs.jquery.com/ticket/13378
+ rbuggyQSA = [];
+
+ if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
+ // Build QSA regex
+ // Regex strategy adopted from Diego Perini
+ assert(function( div ) {
+ // Select is set to empty string on purpose
+ // This is to test IE's treatment of not explicitly
+ // setting a boolean content attribute,
+ // since its presence should be enough
+ // http://bugs.jquery.com/ticket/12359
+ div.innerHTML = "<select><option selected=''></option></select>";
+
+ // Support: IE8
+ // Boolean attributes and "value" are not treated correctly
+ if ( !div.querySelectorAll("[selected]").length ) {
+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+ }
+
+ // Webkit/Opera - :checked should return selected option elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":checked").length ) {
+ rbuggyQSA.push(":checked");
+ }
+ });
+
+ assert(function( div ) {
+
+ // Support: Opera 10-12/IE8
+ // ^= $= *= and empty values
+ // Should not select anything
+ // Support: Windows 8 Native Apps
+ // The type attribute is restricted during .innerHTML assignment
+ var input = doc.createElement("input");
+ input.setAttribute( "type", "hidden" );
+ div.appendChild( input ).setAttribute( "t", "" );
+
+ if ( div.querySelectorAll("[t^='']").length ) {
+ rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+ }
+
+ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":enabled").length ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Opera 10-11 does not throw on post-comma invalid pseudos
+ div.querySelectorAll("*,:x");
+ rbuggyQSA.push(",.*:");
+ });
+ }
+
+ if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector ||
+ docElem.mozMatchesSelector ||
+ docElem.oMatchesSelector ||
+ docElem.msMatchesSelector) )) ) {
+
+ assert(function( div ) {
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9)
+ support.disconnectedMatch = matches.call( div, "div" );
+
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( div, "[s!='']:x" );
+ rbuggyMatches.push( "!=", pseudos );
+ });
+ }
+
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+ /* Contains
+ ---------------------------------------------------------------------- */
+
+ // Element contains another
+ // Purposefully does not implement inclusive descendent
+ // As in, an element does not contain itself
+ contains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ?
+ function( a, b ) {
+ var adown = a.nodeType === 9 ? a.documentElement : a,
+ bup = b && b.parentNode;
+ return a === bup || !!( bup && bup.nodeType === 1 && (
+ adown.contains ?
+ adown.contains( bup ) :
+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+ ));
+ } :
+ function( a, b ) {
+ if ( b ) {
+ while ( (b = b.parentNode) ) {
+ if ( b === a ) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ /* Sorting
+ ---------------------------------------------------------------------- */
+
+ // Document order sorting
+ sortOrder = docElem.compareDocumentPosition ?
+ function( a, b ) {
+
+ // Flag for duplicate removal
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );
+
+ if ( compare ) {
+ // Disconnected nodes
+ if ( compare & 1 ||
+ (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+ // Choose the first element that is related to our preferred document
+ if ( a === doc || contains(preferredDoc, a) ) {
+ return -1;
+ }
+ if ( b === doc || contains(preferredDoc, b) ) {
+ return 1;
+ }
+
+ // Maintain original order
+ return sortInput ?
+ ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+ 0;
+ }
+
+ return compare & 4 ? -1 : 1;
+ }
+
+ // Not directly comparable, sort on existence of method
+ return a.compareDocumentPosition ? -1 : 1;
+ } :
+ function( a, b ) {
+ var cur,
+ i = 0,
+ aup = a.parentNode,
+ bup = b.parentNode,
+ ap = [ a ],
+ bp = [ b ];
+
+ // Exit early if the nodes are identical
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+
+ // Parentless nodes are either documents or disconnected
+ } else if ( !aup || !bup ) {
+ return a === doc ? -1 :
+ b === doc ? 1 :
+ aup ? -1 :
+ bup ? 1 :
+ sortInput ?
+ ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+ 0;
+
+ // If the nodes are siblings, we can do a quick check
+ } else if ( aup === bup ) {
+ return siblingCheck( a, b );
+ }
+
+ // Otherwise we need full lists of their ancestors for comparison
+ cur = a;
+ while ( (cur = cur.parentNode) ) {
+ ap.unshift( cur );
+ }
+ cur = b;
+ while ( (cur = cur.parentNode) ) {
+ bp.unshift( cur );
+ }
+
+ // Walk down the tree looking for a discrepancy
+ while ( ap[i] === bp[i] ) {
+ i++;
+ }
+
+ return i ?
+ // Do a sibling check if the nodes have a common ancestor
+ siblingCheck( ap[i], bp[i] ) :
+
+ // Otherwise nodes in our document sort first
+ ap[i] === preferredDoc ? -1 :
+ bp[i] === preferredDoc ? 1 :
+ 0;
+ };
+
+ return doc;
+};
+
+Sizzle.matches = function( expr, elements ) {
+ return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ // Make sure that attribute selectors are quoted
+ expr = expr.replace( rattributeQuotes, "='$1']" );
+
+ if ( support.matchesSelector && documentIsHTML &&
+ ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
+
+ try {
+ var ret = matches.call( elem, expr );
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if ( ret || support.disconnectedMatch ||
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9
+ elem.document && elem.document.nodeType !== 11 ) {
+ return ret;
+ }
+ } catch(e) {}
+ }
+
+ return Sizzle( expr, document, null, [elem] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+ // Set document vars if needed
+ if ( ( context.ownerDocument || context ) !== document ) {
+ setDocument( context );
+ }
+ return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ var fn = Expr.attrHandle[ name.toLowerCase() ],
+ // Don't get fooled by Object.prototype properties (jQuery #13807)
+ val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+ fn( elem, name, !documentIsHTML ) :
+ undefined;
+
+ return val === undefined ?
+ support.attributes || !documentIsHTML ?
+ elem.getAttribute( name ) :
+ (val = elem.getAttributeNode(name)) && val.specified ?
+ val.value :
+ null :
+ val;
+};
+
+Sizzle.error = function( msg ) {
+ throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+ var elem,
+ duplicates = [],
+ j = 0,
+ i = 0;
+
+ // Unless we *know* we can detect duplicates, assume their presence
+ hasDuplicate = !support.detectDuplicates;
+ sortInput = !support.sortStable && results.slice( 0 );
+ results.sort( sortOrder );
+
+ if ( hasDuplicate ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem === results[ i ] ) {
+ j = duplicates.push( i );
+ }
+ }
+ while ( j-- ) {
+ results.splice( duplicates[ j ], 1 );
+ }
+ }
+
+ return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+ var node,
+ ret = "",
+ i = 0,
+ nodeType = elem.nodeType;
+
+ if ( !nodeType ) {
+ // If no nodeType, this is expected to be an array
+ for ( ; (node = elem[i]); i++ ) {
+ // Do not traverse comment nodes
+ ret += getText( node );
+ }
+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+ // Use textContent for elements
+ // innerText usage removed for consistency of new lines (see #11153)
+ if ( typeof elem.textContent === "string" ) {
+ return elem.textContent;
+ } else {
+ // Traverse its children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ ret += getText( elem );
+ }
+ }
+ } else if ( nodeType === 3 || nodeType === 4 ) {
+ return elem.nodeValue;
+ }
+ // Do not include comment or processing instruction nodes
+
+ return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+ // Can be adjusted by the user
+ cacheLength: 50,
+
+ createPseudo: markFunction,
+
+ match: matchExpr,
+
+ attrHandle: {},
+
+ find: {},
+
+ relative: {
+ ">": { dir: "parentNode", first: true },
+ " ": { dir: "parentNode" },
+ "+": { dir: "previousSibling", first: true },
+ "~": { dir: "previousSibling" }
+ },
+
+ preFilter: {
+ "ATTR": function( match ) {
+ match[1] = match[1].replace( runescape, funescape );
+
+ // Move the given value to match[3] whether quoted or unquoted
+ match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape );
+
+ if ( match[2] === "~=" ) {
+ match[3] = " " + match[3] + " ";
+ }
+
+ return match.slice( 0, 4 );
+ },
+
+ "CHILD": function( match ) {
+ /* matches from matchExpr["CHILD"]
+ 1 type (only|nth|...)
+ 2 what (child|of-type)
+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+ 4 xn-component of xn+y argument ([+-]?\d*n|)
+ 5 sign of xn-component
+ 6 x of xn-component
+ 7 sign of y-component
+ 8 y of y-component
+ */
+ match[1] = match[1].toLowerCase();
+
+ if ( match[1].slice( 0, 3 ) === "nth" ) {
+ // nth-* requires argument
+ if ( !match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ // numeric x and y parameters for Expr.filter.CHILD
+ // remember that false/true cast respectively to 0/1
+ match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+ match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+ // other types prohibit arguments
+ } else if ( match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ return match;
+ },
+
+ "PSEUDO": function( match ) {
+ var excess,
+ unquoted = !match[5] && match[2];
+
+ if ( matchExpr["CHILD"].test( match[0] ) ) {
+ return null;
+ }
+
+ // Accept quoted arguments as-is
+ if ( match[3] && match[4] !== undefined ) {
+ match[2] = match[4];
+
+ // Strip excess characters from unquoted arguments
+ } else if ( unquoted && rpseudo.test( unquoted ) &&
+ // Get excess from tokenize (recursively)
+ (excess = tokenize( unquoted, true )) &&
+ // advance to the next closing parenthesis
+ (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+ // excess is a negative index
+ match[0] = match[0].slice( 0, excess );
+ match[2] = unquoted.slice( 0, excess );
+ }
+
+ // Return only captures needed by the pseudo filter method (type and argument)
+ return match.slice( 0, 3 );
+ }
+ },
+
+ filter: {
+
+ "TAG": function( nodeNameSelector ) {
+ var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+ return nodeNameSelector === "*" ?
+ function() { return true; } :
+ function( elem ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+ };
+ },
+
+ "CLASS": function( className ) {
+ var pattern = classCache[ className + " " ];
+
+ return pattern ||
+ (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+ classCache( className, function( elem ) {
+ return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" );
+ });
+ },
+
+ "ATTR": function( name, operator, check ) {
+ return function( elem ) {
+ var result = Sizzle.attr( elem, name );
+
+ if ( result == null ) {
+ return operator === "!=";
+ }
+ if ( !operator ) {
+ return true;
+ }
+
+ result += "";
+
+ return operator === "=" ? result === check :
+ operator === "!=" ? result !== check :
+ operator === "^=" ? check && result.indexOf( check ) === 0 :
+ operator === "*=" ? check && result.indexOf( check ) > -1 :
+ operator === "$=" ? check && result.slice( -check.length ) === check :
+ operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
+ operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+ false;
+ };
+ },
+
+ "CHILD": function( type, what, argument, first, last ) {
+ var simple = type.slice( 0, 3 ) !== "nth",
+ forward = type.slice( -4 ) !== "last",
+ ofType = what === "of-type";
+
+ return first === 1 && last === 0 ?
+
+ // Shortcut for :nth-*(n)
+ function( elem ) {
+ return !!elem.parentNode;
+ } :
+
+ function( elem, context, xml ) {
+ var cache, outerCache, node, diff, nodeIndex, start,
+ dir = simple !== forward ? "nextSibling" : "previousSibling",
+ parent = elem.parentNode,
+ name = ofType && elem.nodeName.toLowerCase(),
+ useCache = !xml && !ofType;
+
+ if ( parent ) {
+
+ // :(first|last|only)-(child|of-type)
+ if ( simple ) {
+ while ( dir ) {
+ node = elem;
+ while ( (node = node[ dir ]) ) {
+ if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
+ return false;
+ }
+ }
+ // Reverse direction for :only-* (if we haven't yet done so)
+ start = dir = type === "only" && !start && "nextSibling";
+ }
+ return true;
+ }
+
+ start = [ forward ? parent.firstChild : parent.lastChild ];
+
+ // non-xml :nth-child(...) stores cache data on `parent`
+ if ( forward && useCache ) {
+ // Seek `elem` from a previously-cached index
+ outerCache = parent[ expando ] || (parent[ expando ] = {});
+ cache = outerCache[ type ] || [];
+ nodeIndex = cache[0] === dirruns && cache[1];
+ diff = cache[0] === dirruns && cache[2];
+ node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+ // Fallback to seeking `elem` from the start
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ // When found, cache indexes on `parent` and break
+ if ( node.nodeType === 1 && ++diff && node === elem ) {
+ outerCache[ type ] = [ dirruns, nodeIndex, diff ];
+ break;
+ }
+ }
+
+ // Use previously-cached element index if available
+ } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
+ diff = cache[1];
+
+ // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
+ } else {
+ // Use the same loop as above to seek `elem` from the start
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
+ // Cache the index of each encountered element
+ if ( useCache ) {
+ (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
+ }
+
+ if ( node === elem ) {
+ break;
+ }
+ }
+ }
+ }
+
+ // Incorporate the offset, then check against cycle size
+ diff -= last;
+ return diff === first || ( diff % first === 0 && diff / first >= 0 );
+ }
+ };
+ },
+
+ "PSEUDO": function( pseudo, argument ) {
+ // pseudo-class names are case-insensitive
+ // http://www.w3.org/TR/selectors/#pseudo-classes
+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+ // Remember that setFilters inherits from pseudos
+ var args,
+ fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+ Sizzle.error( "unsupported pseudo: " + pseudo );
+
+ // The user may use createPseudo to indicate that
+ // arguments are needed to create the filter function
+ // just as Sizzle does
+ if ( fn[ expando ] ) {
+ return fn( argument );
+ }
+
+ // But maintain support for old signatures
+ if ( fn.length > 1 ) {
+ args = [ pseudo, pseudo, "", argument ];
+ return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+ markFunction(function( seed, matches ) {
+ var idx,
+ matched = fn( seed, argument ),
+ i = matched.length;
+ while ( i-- ) {
+ idx = indexOf.call( seed, matched[i] );
+ seed[ idx ] = !( matches[ idx ] = matched[i] );
+ }
+ }) :
+ function( elem ) {
+ return fn( elem, 0, args );
+ };
+ }
+
+ return fn;
+ }
+ },
+
+ pseudos: {
+ // Potentially complex pseudos
+ "not": markFunction(function( selector ) {
+ // Trim the selector passed to compile
+ // to avoid treating leading and trailing
+ // spaces as combinators
+ var input = [],
+ results = [],
+ matcher = compile( selector.replace( rtrim, "$1" ) );
+
+ return matcher[ expando ] ?
+ markFunction(function( seed, matches, context, xml ) {
+ var elem,
+ unmatched = matcher( seed, null, xml, [] ),
+ i = seed.length;
+
+ // Match elements unmatched by `matcher`
+ while ( i-- ) {
+ if ( (elem = unmatched[i]) ) {
+ seed[i] = !(matches[i] = elem);
+ }
+ }
+ }) :
+ function( elem, context, xml ) {
+ input[0] = elem;
+ matcher( input, null, xml, results );
+ return !results.pop();
+ };
+ }),
+
+ "has": markFunction(function( selector ) {
+ return function( elem ) {
+ return Sizzle( selector, elem ).length > 0;
+ };
+ }),
+
+ "contains": markFunction(function( text ) {
+ return function( elem ) {
+ return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+ };
+ }),
+
+ // "Whether an element is represented by a :lang() selector
+ // is based solely on the element's language value
+ // being equal to the identifier C,
+ // or beginning with the identifier C immediately followed by "-".
+ // The matching of C against the element's language value is performed case-insensitively.
+ // The identifier C does not have to be a valid language name."
+ // http://www.w3.org/TR/selectors/#lang-pseudo
+ "lang": markFunction( function( lang ) {
+ // lang value must be a valid identifier
+ if ( !ridentifier.test(lang || "") ) {
+ Sizzle.error( "unsupported lang: " + lang );
+ }
+ lang = lang.replace( runescape, funescape ).toLowerCase();
+ return function( elem ) {
+ var elemLang;
+ do {
+ if ( (elemLang = documentIsHTML ?
+ elem.lang :
+ elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+ elemLang = elemLang.toLowerCase();
+ return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+ }
+ } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+ return false;
+ };
+ }),
+
+ // Miscellaneous
+ "target": function( elem ) {
+ var hash = window.location && window.location.hash;
+ return hash && hash.slice( 1 ) === elem.id;
+ },
+
+ "root": function( elem ) {
+ return elem === docElem;
+ },
+
+ "focus": function( elem ) {
+ return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+ },
+
+ // Boolean properties
+ "enabled": function( elem ) {
+ return elem.disabled === false;
+ },
+
+ "disabled": function( elem ) {
+ return elem.disabled === true;
+ },
+
+ "checked": function( elem ) {
+ // In CSS3, :checked should return both checked and selected elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ var nodeName = elem.nodeName.toLowerCase();
+ return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+ },
+
+ "selected": function( elem ) {
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ if ( elem.parentNode ) {
+ elem.parentNode.selectedIndex;
+ }
+
+ return elem.selected === true;
+ },
+
+ // Contents
+ "empty": function( elem ) {
+ // http://www.w3.org/TR/selectors/#empty-pseudo
+ // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
+ // not comment, processing instructions, or others
+ // Thanks to Diego Perini for the nodeName shortcut
+ // Greater than "@" means alpha characters (specifically not starting with "#" or "?")
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ "parent": function( elem ) {
+ return !Expr.pseudos["empty"]( elem );
+ },
+
+ // Element/input types
+ "header": function( elem ) {
+ return rheader.test( elem.nodeName );
+ },
+
+ "input": function( elem ) {
+ return rinputs.test( elem.nodeName );
+ },
+
+ "button": function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === "button" || name === "button";
+ },
+
+ "text": function( elem ) {
+ var attr;
+ // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
+ // use getAttribute instead to test this case
+ return elem.nodeName.toLowerCase() === "input" &&
+ elem.type === "text" &&
+ ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type );
+ },
+
+ // Position-in-collection
+ "first": createPositionalPseudo(function() {
+ return [ 0 ];
+ }),
+
+ "last": createPositionalPseudo(function( matchIndexes, length ) {
+ return [ length - 1 ];
+ }),
+
+ "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ return [ argument < 0 ? argument + length : argument ];
+ }),
+
+ "even": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 0;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "odd": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 1;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; --i >= 0; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; ++i < length; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ })
+ }
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+ Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+ Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+function tokenize( selector, parseOnly ) {
+ var matched, match, tokens, type,
+ soFar, groups, preFilters,
+ cached = tokenCache[ selector + " " ];
+
+ if ( cached ) {
+ return parseOnly ? 0 : cached.slice( 0 );
+ }
+
+ soFar = selector;
+ groups = [];
+ preFilters = Expr.preFilter;
+
+ while ( soFar ) {
+
+ // Comma and first run
+ if ( !matched || (match = rcomma.exec( soFar )) ) {
+ if ( match ) {
+ // Don't consume trailing commas as valid
+ soFar = soFar.slice( match[0].length ) || soFar;
+ }
+ groups.push( tokens = [] );
+ }
+
+ matched = false;
+
+ // Combinators
+ if ( (match = rcombinators.exec( soFar )) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ // Cast descendant combinators to space
+ type: match[0].replace( rtrim, " " )
+ });
+ soFar = soFar.slice( matched.length );
+ }
+
+ // Filters
+ for ( type in Expr.filter ) {
+ if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+ (match = preFilters[ type ]( match ))) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ type: type,
+ matches: match
+ });
+ soFar = soFar.slice( matched.length );
+ }
+ }
+
+ if ( !matched ) {
+ break;
+ }
+ }
+
+ // Return the length of the invalid excess
+ // if we're just parsing
+ // Otherwise, throw an error or return tokens
+ return parseOnly ?
+ soFar.length :
+ soFar ?
+ Sizzle.error( selector ) :
+ // Cache the tokens
+ tokenCache( selector, groups ).slice( 0 );
+}
+
+function toSelector( tokens ) {
+ var i = 0,
+ len = tokens.length,
+ selector = "";
+ for ( ; i < len; i++ ) {
+ selector += tokens[i].value;
+ }
+ return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+ var dir = combinator.dir,
+ checkNonElements = base && dir === "parentNode",
+ doneName = done++;
+
+ return combinator.first ?
+ // Check against closest ancestor/preceding element
+ function( elem, context, xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ return matcher( elem, context, xml );
+ }
+ }
+ } :
+
+ // Check against all ancestor/preceding elements
+ function( elem, context, xml ) {
+ var data, cache, outerCache,
+ dirkey = dirruns + " " + doneName;
+
+ // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
+ if ( xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ if ( matcher( elem, context, xml ) ) {
+ return true;
+ }
+ }
+ }
+ } else {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ outerCache = elem[ expando ] || (elem[ expando ] = {});
+ if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {
+ if ( (data = cache[1]) === true || data === cachedruns ) {
+ return data === true;
+ }
+ } else {
+ cache = outerCache[ dir ] = [ dirkey ];
+ cache[1] = matcher( elem, context, xml ) || cachedruns;
+ if ( cache[1] === true ) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ };
+}
+
+function elementMatcher( matchers ) {
+ return matchers.length > 1 ?
+ function( elem, context, xml ) {
+ var i = matchers.length;
+ while ( i-- ) {
+ if ( !matchers[i]( elem, context, xml ) ) {
+ return false;
+ }
+ }
+ return true;
+ } :
+ matchers[0];
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+ var elem,
+ newUnmatched = [],
+ i = 0,
+ len = unmatched.length,
+ mapped = map != null;
+
+ for ( ; i < len; i++ ) {
+ if ( (elem = unmatched[i]) ) {
+ if ( !filter || filter( elem, context, xml ) ) {
+ newUnmatched.push( elem );
+ if ( mapped ) {
+ map.push( i );
+ }
+ }
+ }
+ }
+
+ return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+ if ( postFilter && !postFilter[ expando ] ) {
+ postFilter = setMatcher( postFilter );
+ }
+ if ( postFinder && !postFinder[ expando ] ) {
+ postFinder = setMatcher( postFinder, postSelector );
+ }
+ return markFunction(function( seed, results, context, xml ) {
+ var temp, i, elem,
+ preMap = [],
+ postMap = [],
+ preexisting = results.length,
+
+ // Get initial elements from seed or context
+ elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+ // Prefilter to get matcher input, preserving a map for seed-results synchronization
+ matcherIn = preFilter && ( seed || !selector ) ?
+ condense( elems, preMap, preFilter, context, xml ) :
+ elems,
+
+ matcherOut = matcher ?
+ // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+ postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+ // ...intermediate processing is necessary
+ [] :
+
+ // ...otherwise use results directly
+ results :
+ matcherIn;
+
+ // Find primary matches
+ if ( matcher ) {
+ matcher( matcherIn, matcherOut, context, xml );
+ }
+
+ // Apply postFilter
+ if ( postFilter ) {
+ temp = condense( matcherOut, postMap );
+ postFilter( temp, [], context, xml );
+
+ // Un-match failing elements by moving them back to matcherIn
+ i = temp.length;
+ while ( i-- ) {
+ if ( (elem = temp[i]) ) {
+ matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+ }
+ }
+ }
+
+ if ( seed ) {
+ if ( postFinder || preFilter ) {
+ if ( postFinder ) {
+ // Get the final matcherOut by condensing this intermediate into postFinder contexts
+ temp = [];
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) ) {
+ // Restore matcherIn since elem is not yet a final match
+ temp.push( (matcherIn[i] = elem) );
+ }
+ }
+ postFinder( null, (matcherOut = []), temp, xml );
+ }
+
+ // Move matched elements from seed to results to keep them synchronized
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) &&
+ (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
+
+ seed[temp] = !(results[temp] = elem);
+ }
+ }
+ }
+
+ // Add elements to results, through postFinder if defined
+ } else {
+ matcherOut = condense(
+ matcherOut === results ?
+ matcherOut.splice( preexisting, matcherOut.length ) :
+ matcherOut
+ );
+ if ( postFinder ) {
+ postFinder( null, results, matcherOut, xml );
+ } else {
+ push.apply( results, matcherOut );
+ }
+ }
+ });
+}
+
+function matcherFromTokens( tokens ) {
+ var checkContext, matcher, j,
+ len = tokens.length,
+ leadingRelative = Expr.relative[ tokens[0].type ],
+ implicitRelative = leadingRelative || Expr.relative[" "],
+ i = leadingRelative ? 1 : 0,
+
+ // The foundational matcher ensures that elements are reachable from top-level context(s)
+ matchContext = addCombinator( function( elem ) {
+ return elem === checkContext;
+ }, implicitRelative, true ),
+ matchAnyContext = addCombinator( function( elem ) {
+ return indexOf.call( checkContext, elem ) > -1;
+ }, implicitRelative, true ),
+ matchers = [ function( elem, context, xml ) {
+ return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+ (checkContext = context).nodeType ?
+ matchContext( elem, context, xml ) :
+ matchAnyContext( elem, context, xml ) );
+ } ];
+
+ for ( ; i < len; i++ ) {
+ if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+ matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+ } else {
+ matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+ // Return special upon seeing a positional matcher
+ if ( matcher[ expando ] ) {
+ // Find the next relative operator (if any) for proper handling
+ j = ++i;
+ for ( ; j < len; j++ ) {
+ if ( Expr.relative[ tokens[j].type ] ) {
+ break;
+ }
+ }
+ return setMatcher(
+ i > 1 && elementMatcher( matchers ),
+ i > 1 && toSelector(
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+ tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+ ).replace( rtrim, "$1" ),
+ matcher,
+ i < j && matcherFromTokens( tokens.slice( i, j ) ),
+ j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+ j < len && toSelector( tokens )
+ );
+ }
+ matchers.push( matcher );
+ }
+ }
+
+ return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+ // A counter to specify which element is currently being matched
+ var matcherCachedRuns = 0,
+ bySet = setMatchers.length > 0,
+ byElement = elementMatchers.length > 0,
+ superMatcher = function( seed, context, xml, results, expandContext ) {
+ var elem, j, matcher,
+ setMatched = [],
+ matchedCount = 0,
+ i = "0",
+ unmatched = seed && [],
+ outermost = expandContext != null,
+ contextBackup = outermostContext,
+ // We must always have either seed elements or context
+ elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
+ // Use integer dirruns iff this is the outermost matcher
+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);
+
+ if ( outermost ) {
+ outermostContext = context !== document && context;
+ cachedruns = matcherCachedRuns;
+ }
+
+ // Add elements passing elementMatchers directly to results
+ // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
+ for ( ; (elem = elems[i]) != null; i++ ) {
+ if ( byElement && elem ) {
+ j = 0;
+ while ( (matcher = elementMatchers[j++]) ) {
+ if ( matcher( elem, context, xml ) ) {
+ results.push( elem );
+ break;
+ }
+ }
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ cachedruns = ++matcherCachedRuns;
+ }
+ }
+
+ // Track unmatched elements for set filters
+ if ( bySet ) {
+ // They will have gone through all possible matchers
+ if ( (elem = !matcher && elem) ) {
+ matchedCount--;
+ }
+
+ // Lengthen the array for every element, matched or not
+ if ( seed ) {
+ unmatched.push( elem );
+ }
+ }
+ }
+
+ // Apply set filters to unmatched elements
+ matchedCount += i;
+ if ( bySet && i !== matchedCount ) {
+ j = 0;
+ while ( (matcher = setMatchers[j++]) ) {
+ matcher( unmatched, setMatched, context, xml );
+ }
+
+ if ( seed ) {
+ // Reintegrate element matches to eliminate the need for sorting
+ if ( matchedCount > 0 ) {
+ while ( i-- ) {
+ if ( !(unmatched[i] || setMatched[i]) ) {
+ setMatched[i] = pop.call( results );
+ }
+ }
+ }
+
+ // Discard index placeholder values to get only actual matches
+ setMatched = condense( setMatched );
+ }
+
+ // Add matches to results
+ push.apply( results, setMatched );
+
+ // Seedless set matches succeeding multiple successful matchers stipulate sorting
+ if ( outermost && !seed && setMatched.length > 0 &&
+ ( matchedCount + setMatchers.length ) > 1 ) {
+
+ Sizzle.uniqueSort( results );
+ }
+ }
+
+ // Override manipulation of globals by nested matchers
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ outermostContext = contextBackup;
+ }
+
+ return unmatched;
+ };
+
+ return bySet ?
+ markFunction( superMatcher ) :
+ superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
+ var i,
+ setMatchers = [],
+ elementMatchers = [],
+ cached = compilerCache[ selector + " " ];
+
+ if ( !cached ) {
+ // Generate a function of recursive functions that can be used to check each element
+ if ( !group ) {
+ group = tokenize( selector );
+ }
+ i = group.length;
+ while ( i-- ) {
+ cached = matcherFromTokens( group[i] );
+ if ( cached[ expando ] ) {
+ setMatchers.push( cached );
+ } else {
+ elementMatchers.push( cached );
+ }
+ }
+
+ // Cache the compiled function
+ cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+ }
+ return cached;
+};
+
+function multipleContexts( selector, contexts, results ) {
+ var i = 0,
+ len = contexts.length;
+ for ( ; i < len; i++ ) {
+ Sizzle( selector, contexts[i], results );
+ }
+ return results;
+}
+
+function select( selector, context, results, seed ) {
+ var i, tokens, token, type, find,
+ match = tokenize( selector );
+
+ if ( !seed ) {
+ // Try to minimize operations if there is only one group
+ if ( match.length === 1 ) {
+
+ // Take a shortcut and set the context if the root selector is an ID
+ tokens = match[0] = match[0].slice( 0 );
+ if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+ support.getById && context.nodeType === 9 && documentIsHTML &&
+ Expr.relative[ tokens[1].type ] ) {
+
+ context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+ if ( !context ) {
+ return results;
+ }
+ selector = selector.slice( tokens.shift().value.length );
+ }
+
+ // Fetch a seed set for right-to-left matching
+ i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+ while ( i-- ) {
+ token = tokens[i];
+
+ // Abort if we hit a combinator
+ if ( Expr.relative[ (type = token.type) ] ) {
+ break;
+ }
+ if ( (find = Expr.find[ type ]) ) {
+ // Search, expanding context for leading sibling combinators
+ if ( (seed = find(
+ token.matches[0].replace( runescape, funescape ),
+ rsibling.test( tokens[0].type ) && context.parentNode || context
+ )) ) {
+
+ // If seed is empty or no tokens remain, we can return early
+ tokens.splice( i, 1 );
+ selector = seed.length && toSelector( tokens );
+ if ( !selector ) {
+ push.apply( results, seed );
+ return results;
+ }
+
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // Compile and execute a filtering function
+ // Provide `match` to avoid retokenization if we modified the selector above
+ compile( selector, match )(
+ seed,
+ context,
+ !documentIsHTML,
+ results,
+ rsibling.test( selector )
+ );
+ return results;
+}
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome<14
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( div1 ) {
+ // Should return 1, but returns 4 (following)
+ return div1.compareDocumentPosition( document.createElement("div") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( div ) {
+ div.innerHTML = "<a href='#'></a>";
+ return div.firstChild.getAttribute("href") === "#" ;
+}) ) {
+ addHandle( "type|href|height|width", function( elem, name, isXML ) {
+ if ( !isXML ) {
+ return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+ }
+ });
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( div ) {
+ div.innerHTML = "<input/>";
+ div.firstChild.setAttribute( "value", "" );
+ return div.firstChild.getAttribute( "value" ) === "";
+}) ) {
+ addHandle( "value", function( elem, name, isXML ) {
+ if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+ return elem.defaultValue;
+ }
+ });
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( div ) {
+ return div.getAttribute("disabled") == null;
+}) ) {
+ addHandle( booleans, function( elem, name, isXML ) {
+ var val;
+ if ( !isXML ) {
+ return (val = elem.getAttributeNode( name )) && val.specified ?
+ val.value :
+ elem[ name ] === true ? name.toLowerCase() : null;
+ }
+ });
+}
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})( window );
// String to Object options format cache
var optionsCache = {};
// Convert String-formatted options into Object-formatted ones and store in cache
function createOptions( options ) {
var object = optionsCache[ options ] = {};
- jQuery.each( options.split( core_rspace ), function( _, flag ) {
+ jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {
object[ flag ] = true;
});
return object;
@@ -946,18 +3020,18 @@ jQuery.Callbacks = function( options ) {
( optionsCache[ options ] || createOptions( options ) ) :
jQuery.extend( {}, options );
- var // Last fire value (for non-forgettable lists)
+ var // Flag to know if list is currently firing
+ firing,
+ // Last fire value (for non-forgettable lists)
memory,
// Flag to know if list was already fired
fired,
- // Flag to know if list is currently firing
- firing,
- // First callback to fire (used internally by add and fireWith)
- firingStart,
// End of the loop when firing
firingLength,
// Index of currently firing callback (modified by remove if needed)
firingIndex,
+ // First callback to fire (used internally by add and fireWith)
+ firingStart,
// Actual callback list
list = [],
// Stack of fire calls for repeatable lists
@@ -1043,13 +3117,15 @@ jQuery.Callbacks = function( options ) {
}
return this;
},
- // Control if a given callback is in the list
+ // Check if a given callback is in the list.
+ // If no argument is given, return whether or not list has callbacks attached.
has: function( fn ) {
- return jQuery.inArray( fn, list ) > -1;
+ return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
},
// Remove all callbacks from the list
empty: function() {
list = [];
+ firingLength = 0;
return this;
},
// Have the list do nothing anymore
@@ -1075,9 +3151,9 @@ jQuery.Callbacks = function( options ) {
},
// Call all callbacks with the given context and arguments
fireWith: function( context, args ) {
- args = args || [];
- args = [ context, args.slice ? args.slice() : args ];
if ( list && ( !fired || stack ) ) {
+ args = args || [];
+ args = [ context, args.slice ? args.slice() : args ];
if ( firing ) {
stack.push( args );
} else {
@@ -1122,22 +3198,19 @@ jQuery.extend({
return jQuery.Deferred(function( newDefer ) {
jQuery.each( tuples, function( i, tuple ) {
var action = tuple[ 0 ],
- fn = fns[ i ];
+ fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
// deferred[ done | fail | progress ] for forwarding actions to newDefer
- deferred[ tuple[1] ]( jQuery.isFunction( fn ) ?
- function() {
- var returned = fn.apply( this, arguments );
- if ( returned && jQuery.isFunction( returned.promise ) ) {
- returned.promise()
- .done( newDefer.resolve )
- .fail( newDefer.reject )
- .progress( newDefer.notify );
- } else {
- newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
- }
- } :
- newDefer[ action ]
- );
+ deferred[ tuple[1] ](function() {
+ var returned = fn && fn.apply( this, arguments );
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
+ returned.promise()
+ .done( newDefer.resolve )
+ .fail( newDefer.reject )
+ .progress( newDefer.notify );
+ } else {
+ newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
+ }
+ });
});
fns = null;
}).promise();
@@ -1171,8 +3244,11 @@ jQuery.extend({
}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
}
- // deferred[ resolve | reject | notify ] = list.fire
- deferred[ tuple[0] ] = list.fire;
+ // deferred[ resolve | reject | notify ]
+ deferred[ tuple[0] ] = function() {
+ deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
+ return this;
+ };
deferred[ tuple[0] + "With" ] = list.fireWith;
});
@@ -1240,30 +3316,20 @@ jQuery.extend({
return deferred.promise();
}
});
-jQuery.support = (function() {
-
- var support,
- all,
- a,
- select,
- opt,
- input,
- fragment,
- eventName,
- i,
- isSupported,
- clickFn,
+jQuery.support = (function( support ) {
+
+ var all, a, input, select, fragment, opt, eventName, isSupported, i,
div = document.createElement("div");
// Setup
div.setAttribute( "className", "t" );
div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
- // Support tests won't run in some limited or non-browser environments
- all = div.getElementsByTagName("*");
+ // Finish early in limited (non-browser) environments
+ all = div.getElementsByTagName("*") || [];
a = div.getElementsByTagName("a")[ 0 ];
- if ( !all || !a || !all.length ) {
- return {};
+ if ( !a || !a.style || !all.length ) {
+ return support;
}
// First batch of tests
@@ -1272,69 +3338,60 @@ jQuery.support = (function() {
input = div.getElementsByTagName("input")[ 0 ];
a.style.cssText = "top:1px;float:left;opacity:.5";
- support = {
- // IE strips leading whitespace when .innerHTML is used
- leadingWhitespace: ( div.firstChild.nodeType === 3 ),
-
- // Make sure that tbody elements aren't automatically inserted
- // IE will insert them into empty tables
- tbody: !div.getElementsByTagName("tbody").length,
-
- // Make sure that link elements get serialized correctly by innerHTML
- // This requires a wrapper element in IE
- htmlSerialize: !!div.getElementsByTagName("link").length,
-
- // Get the style information from getAttribute
- // (IE uses .cssText instead)
- style: /top/.test( a.getAttribute("style") ),
-
- // Make sure that URLs aren't manipulated
- // (IE normalizes it by default)
- hrefNormalized: ( a.getAttribute("href") === "/a" ),
-
- // Make sure that element opacity exists
- // (IE uses filter instead)
- // Use a regex to work around a WebKit issue. See #5145
- opacity: /^0.5/.test( a.style.opacity ),
-
- // Verify style float existence
- // (IE uses styleFloat instead of cssFloat)
- cssFloat: !!a.style.cssFloat,
-
- // Make sure that if no value is specified for a checkbox
- // that it defaults to "on".
- // (WebKit defaults to "" instead)
- checkOn: ( input.value === "on" ),
-
- // Make sure that a selected-by-default option has a working selected property.
- // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
- optSelected: opt.selected,
-
- // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
- getSetAttribute: div.className !== "t",
-
- // Tests for enctype support on a form (#6743)
- enctype: !!document.createElement("form").enctype,
-
- // Makes sure cloning an html5 element does not cause problems
- // Where outerHTML is undefined, this still works
- html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
-
- // jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
- boxModel: ( document.compatMode === "CSS1Compat" ),
-
- // Will be defined later
- submitBubbles: true,
- changeBubbles: true,
- focusinBubbles: false,
- deleteExpando: true,
- noCloneEvent: true,
- inlineBlockNeedsLayout: false,
- shrinkWrapBlocks: false,
- reliableMarginRight: true,
- boxSizingReliable: true,
- pixelPosition: false
- };
+
+ // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+ support.getSetAttribute = div.className !== "t";
+
+ // IE strips leading whitespace when .innerHTML is used
+ support.leadingWhitespace = div.firstChild.nodeType === 3;
+
+ // Make sure that tbody elements aren't automatically inserted
+ // IE will insert them into empty tables
+ support.tbody = !div.getElementsByTagName("tbody").length;
+
+ // Make sure that link elements get serialized correctly by innerHTML
+ // This requires a wrapper element in IE
+ support.htmlSerialize = !!div.getElementsByTagName("link").length;
+
+ // Get the style information from getAttribute
+ // (IE uses .cssText instead)
+ support.style = /top/.test( a.getAttribute("style") );
+
+ // Make sure that URLs aren't manipulated
+ // (IE normalizes it by default)
+ support.hrefNormalized = a.getAttribute("href") === "/a";
+
+ // Make sure that element opacity exists
+ // (IE uses filter instead)
+ // Use a regex to work around a WebKit issue. See #5145
+ support.opacity = /^0.5/.test( a.style.opacity );
+
+ // Verify style float existence
+ // (IE uses styleFloat instead of cssFloat)
+ support.cssFloat = !!a.style.cssFloat;
+
+ // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
+ support.checkOn = !!input.value;
+
+ // Make sure that a selected-by-default option has a working selected property.
+ // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+ support.optSelected = opt.selected;
+
+ // Tests for enctype support on a form (#6743)
+ support.enctype = !!document.createElement("form").enctype;
+
+ // Makes sure cloning an html5 element does not cause problems
+ // Where outerHTML is undefined, this still works
+ support.html5Clone = document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>";
+
+ // Will be defined later
+ support.inlineBlockNeedsLayout = false;
+ support.shrinkWrapBlocks = false;
+ support.pixelPosition = false;
+ support.deleteExpando = true;
+ support.noCloneEvent = true;
+ support.reliableMarginRight = true;
+ support.boxSizingReliable = true;
// Make sure checked status is properly cloned
input.checked = true;
@@ -1345,76 +3402,71 @@ jQuery.support = (function() {
select.disabled = true;
support.optDisabled = !opt.disabled;
- // Test to see if it's possible to delete an expando from an element
- // Fails in Internet Explorer
+ // Support: IE<9
try {
delete div.test;
} catch( e ) {
support.deleteExpando = false;
}
- if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
- div.attachEvent( "onclick", clickFn = function() {
- // Cloning a node shouldn't copy over any
- // bound event handlers (IE does this)
- support.noCloneEvent = false;
- });
- div.cloneNode( true ).fireEvent("onclick");
- div.detachEvent( "onclick", clickFn );
- }
-
- // Check if a radio maintains its value
- // after being appended to the DOM
+ // Check if we can trust getAttribute("value")
input = document.createElement("input");
+ input.setAttribute( "value", "" );
+ support.input = input.getAttribute( "value" ) === "";
+
+ // Check if an input maintains its value after becoming a radio
input.value = "t";
input.setAttribute( "type", "radio" );
support.radioValue = input.value === "t";
- input.setAttribute( "checked", "checked" );
-
// #11217 - WebKit loses check when the name is after the checked attribute
+ input.setAttribute( "checked", "t" );
input.setAttribute( "name", "t" );
- div.appendChild( input );
fragment = document.createDocumentFragment();
- fragment.appendChild( div.lastChild );
-
- // WebKit doesn't clone checked state correctly in fragments
- support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+ fragment.appendChild( input );
// Check if a disconnected checkbox will retain its checked
// value of true after appended to the DOM (IE6/7)
support.appendChecked = input.checked;
- fragment.removeChild( input );
- fragment.appendChild( div );
+ // WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
- // Technique from Juriy Zaytsev
- // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
- // We only care about the case where non-standard event systems
- // are used, namely in IE. Short-circuiting here helps us to
- // avoid an eval call (in setAttribute) which can cause CSP
- // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
+ // Support: IE<9
+ // Opera does not clone events (and typeof div.attachEvent === undefined).
+ // IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
if ( div.attachEvent ) {
- for ( i in {
- submit: true,
- change: true,
- focusin: true
- }) {
- eventName = "on" + i;
- isSupported = ( eventName in div );
- if ( !isSupported ) {
- div.setAttribute( eventName, "return;" );
- isSupported = ( typeof div[ eventName ] === "function" );
- }
- support[ i + "Bubbles" ] = isSupported;
- }
+ div.attachEvent( "onclick", function() {
+ support.noCloneEvent = false;
+ });
+
+ div.cloneNode( true ).click();
+ }
+
+ // Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)
+ // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
+ for ( i in { submit: true, change: true, focusin: true }) {
+ div.setAttribute( eventName = "on" + i, "t" );
+
+ support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false;
}
+ div.style.backgroundClip = "content-box";
+ div.cloneNode( true ).style.backgroundClip = "";
+ support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+ // Support: IE<9
+ // Iteration over object's inherited properties before its own.
+ for ( i in jQuery( support ) ) {
+ break;
+ }
+ support.ownLast = i !== "0";
+
// Run tests that need a body at doc ready
jQuery(function() {
- var container, div, tds, marginDiv,
- divReset = "padding:0;margin:0;border:0;display:block;overflow:hidden;",
+ var container, marginDiv, tds,
+ divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
body = document.getElementsByTagName("body")[0];
if ( !body ) {
@@ -1423,20 +3475,17 @@ jQuery.support = (function() {
}
container = document.createElement("div");
- container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px";
- body.insertBefore( container, body.firstChild );
+ container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";
- // Construct the test element
- div = document.createElement("div");
- container.appendChild( div );
+ body.appendChild( container ).appendChild( div );
+ // Support: IE8
// Check if table cells still have offsetWidth/Height when they are set
// to display:none and there are still other visible table cells in a
// table row; if so, offsetWidth/Height are not reliable for use when
// determining if an element has been hidden directly using
// display:none (it is still safe to use offsets if a parent element is
// hidden; don safety goggles and see bug #4512 for more information).
- // (only IE 8 fails this test)
div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
tds = div.getElementsByTagName("td");
tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
@@ -1445,277 +3494,297 @@ jQuery.support = (function() {
tds[ 0 ].style.display = "";
tds[ 1 ].style.display = "none";
+ // Support: IE8
// Check if empty table cells still have offsetWidth/Height
- // (IE <= 8 fail this test)
support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
- // Check box-sizing and margin behavior
+ // Check box-sizing and margin behavior.
div.innerHTML = "";
div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
- support.boxSizing = ( div.offsetWidth === 4 );
- support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
- // NOTE: To any future maintainer, we've window.getComputedStyle
- // because jsdom on node.js will break without it.
+ // Workaround failing boxSizing test due to offsetWidth returning wrong value
+ // with some non-1 values of body zoom, ticket #13543
+ jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() {
+ support.boxSizing = div.offsetWidth === 4;
+ });
+
+ // Use window.getComputedStyle because jsdom on node.js will break without it.
if ( window.getComputedStyle ) {
support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
// Check if div with explicit width and no margin-right incorrectly
- // gets computed margin-right based on width of container. For more
- // info see bug #3333
+ // gets computed margin-right based on width of container. (#3333)
// Fails in WebKit before Feb 2011 nightlies
// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
- marginDiv = document.createElement("div");
+ marginDiv = div.appendChild( document.createElement("div") );
marginDiv.style.cssText = div.style.cssText = divReset;
marginDiv.style.marginRight = marginDiv.style.width = "0";
div.style.width = "1px";
- div.appendChild( marginDiv );
+
support.reliableMarginRight =
!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
}
- if ( typeof div.style.zoom !== "undefined" ) {
+ if ( typeof div.style.zoom !== core_strundefined ) {
+ // Support: IE<8
// Check if natively block-level elements act like inline-block
// elements when setting their display to 'inline' and giving
// them layout
- // (IE < 8 does this)
div.innerHTML = "";
div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
+ // Support: IE6
// Check if elements with layout shrink-wrap their children
- // (IE 6 does this)
div.style.display = "block";
- div.style.overflow = "visible";
div.innerHTML = "<div></div>";
div.firstChild.style.width = "5px";
support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
- container.style.zoom = 1;
+ if ( support.inlineBlockNeedsLayout ) {
+ // Prevent IE 6 from affecting layout for positioned elements #11048
+ // Prevent IE from shrinking the body in IE 7 mode #12869
+ // Support: IE<8
+ body.style.zoom = 1;
+ }
}
- // Null elements to avoid leaks in IE
body.removeChild( container );
+
+ // Null elements to avoid leaks in IE
container = div = tds = marginDiv = null;
});
// Null elements to avoid leaks in IE
- fragment.removeChild( div );
- all = a = select = opt = input = fragment = div = null;
+ all = select = fragment = opt = a = input = null;
return support;
-})();
+})({});
+
var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
rmultiDash = /([A-Z])/g;
-jQuery.extend({
- cache: {},
+function internalData( elem, name, data, pvt /* Internal Use Only */ ){
+ if ( !jQuery.acceptData( elem ) ) {
+ return;
+ }
- deletedIds: [],
+ var ret, thisCache,
+ internalKey = jQuery.expando,
- // Remove at next major release (1.9/2.0)
- uuid: 0,
+ // We have to handle DOM nodes and JS objects differently because IE6-7
+ // can't GC object references properly across the DOM-JS boundary
+ isNode = elem.nodeType,
- // Unique for each copy of jQuery on the page
- // Non-digits removed to match rinlinejQuery
- expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+ // Only DOM nodes need the global jQuery cache; JS object data is
+ // attached directly to the object so GC can occur automatically
+ cache = isNode ? jQuery.cache : elem,
- // The following elements throw uncatchable exceptions if you
- // attempt to add expando properties to them.
- noData: {
- "embed": true,
- // Ban all objects except for Flash (which handle expandos)
- "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
- "applet": true
- },
+ // Only defining an ID for JS objects if its cache already exists allows
+ // the code to shortcut on the same path as a DOM node with no cache
+ id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
- hasData: function( elem ) {
- elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
- return !!elem && !isEmptyDataObject( elem );
- },
+ // Avoid doing any more work than we need to when trying to get data on an
+ // object that has no data at all
+ if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) {
+ return;
+ }
- data: function( elem, name, data, pvt /* Internal Use Only */ ) {
- if ( !jQuery.acceptData( elem ) ) {
- return;
+ if ( !id ) {
+ // Only DOM nodes need a new unique ID for each element since their data
+ // ends up in the global cache
+ if ( isNode ) {
+ id = elem[ internalKey ] = core_deletedIds.pop() || jQuery.guid++;
+ } else {
+ id = internalKey;
}
+ }
- var thisCache, ret,
- internalKey = jQuery.expando,
- getByName = typeof name === "string",
-
- // We have to handle DOM nodes and JS objects differently because IE6-7
- // can't GC object references properly across the DOM-JS boundary
- isNode = elem.nodeType,
-
- // Only DOM nodes need the global jQuery cache; JS object data is
- // attached directly to the object so GC can occur automatically
- cache = isNode ? jQuery.cache : elem,
-
- // Only defining an ID for JS objects if its cache already exists allows
- // the code to shortcut on the same path as a DOM node with no cache
- id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
-
- // Avoid doing any more work than we need to when trying to get data on an
- // object that has no data at all
- if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
- return;
- }
+ if ( !cache[ id ] ) {
+ // Avoid exposing jQuery metadata on plain JS objects when the object
+ // is serialized using JSON.stringify
+ cache[ id ] = isNode ? {} : { toJSON: jQuery.noop };
+ }
- if ( !id ) {
- // Only DOM nodes need a new unique ID for each element since their data
- // ends up in the global cache
- if ( isNode ) {
- elem[ internalKey ] = id = jQuery.deletedIds.pop() || jQuery.guid++;
- } else {
- id = internalKey;
- }
+ // An object can be passed to jQuery.data instead of a key/value pair; this gets
+ // shallow copied over onto the existing cache
+ if ( typeof name === "object" || typeof name === "function" ) {
+ if ( pvt ) {
+ cache[ id ] = jQuery.extend( cache[ id ], name );
+ } else {
+ cache[ id ].data = jQuery.extend( cache[ id ].data, name );
}
+ }
- if ( !cache[ id ] ) {
- cache[ id ] = {};
-
- // Avoids exposing jQuery metadata on plain JS objects when the object
- // is serialized using JSON.stringify
- if ( !isNode ) {
- cache[ id ].toJSON = jQuery.noop;
- }
- }
+ thisCache = cache[ id ];
- // An object can be passed to jQuery.data instead of a key/value pair; this gets
- // shallow copied over onto the existing cache
- if ( typeof name === "object" || typeof name === "function" ) {
- if ( pvt ) {
- cache[ id ] = jQuery.extend( cache[ id ], name );
- } else {
- cache[ id ].data = jQuery.extend( cache[ id ].data, name );
- }
+ // jQuery data() is stored in a separate object inside the object's internal data
+ // cache in order to avoid key collisions between internal data and user-defined
+ // data.
+ if ( !pvt ) {
+ if ( !thisCache.data ) {
+ thisCache.data = {};
}
- thisCache = cache[ id ];
-
- // jQuery data() is stored in a separate object inside the object's internal data
- // cache in order to avoid key collisions between internal data and user-defined
- // data.
- if ( !pvt ) {
- if ( !thisCache.data ) {
- thisCache.data = {};
- }
-
- thisCache = thisCache.data;
- }
+ thisCache = thisCache.data;
+ }
- if ( data !== undefined ) {
- thisCache[ jQuery.camelCase( name ) ] = data;
- }
+ if ( data !== undefined ) {
+ thisCache[ jQuery.camelCase( name ) ] = data;
+ }
- // Check for both converted-to-camel and non-converted data property names
- // If a data property was specified
- if ( getByName ) {
+ // Check for both converted-to-camel and non-converted data property names
+ // If a data property was specified
+ if ( typeof name === "string" ) {
- // First Try to find as-is property data
- ret = thisCache[ name ];
+ // First Try to find as-is property data
+ ret = thisCache[ name ];
- // Test for null|undefined property data
- if ( ret == null ) {
+ // Test for null|undefined property data
+ if ( ret == null ) {
- // Try to find the camelCased property
- ret = thisCache[ jQuery.camelCase( name ) ];
- }
- } else {
- ret = thisCache;
+ // Try to find the camelCased property
+ ret = thisCache[ jQuery.camelCase( name ) ];
}
+ } else {
+ ret = thisCache;
+ }
- return ret;
- },
+ return ret;
+}
- removeData: function( elem, name, pvt /* Internal Use Only */ ) {
- if ( !jQuery.acceptData( elem ) ) {
- return;
- }
+function internalRemoveData( elem, name, pvt ) {
+ if ( !jQuery.acceptData( elem ) ) {
+ return;
+ }
- var thisCache, i, l,
+ var thisCache, i,
+ isNode = elem.nodeType,
- isNode = elem.nodeType,
+ // See jQuery.data for more information
+ cache = isNode ? jQuery.cache : elem,
+ id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
- // See jQuery.data for more information
- cache = isNode ? jQuery.cache : elem,
- id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+ // If there is already no cache entry for this object, there is no
+ // purpose in continuing
+ if ( !cache[ id ] ) {
+ return;
+ }
- // If there is already no cache entry for this object, there is no
- // purpose in continuing
- if ( !cache[ id ] ) {
- return;
- }
+ if ( name ) {
- if ( name ) {
+ thisCache = pvt ? cache[ id ] : cache[ id ].data;
- thisCache = pvt ? cache[ id ] : cache[ id ].data;
+ if ( thisCache ) {
- if ( thisCache ) {
+ // Support array or space separated string names for data keys
+ if ( !jQuery.isArray( name ) ) {
- // Support array or space separated string names for data keys
- if ( !jQuery.isArray( name ) ) {
+ // try the string as a key before any manipulation
+ if ( name in thisCache ) {
+ name = [ name ];
+ } else {
- // try the string as a key before any manipulation
+ // split the camel cased version by spaces unless a key with the spaces exists
+ name = jQuery.camelCase( name );
if ( name in thisCache ) {
name = [ name ];
} else {
-
- // split the camel cased version by spaces unless a key with the spaces exists
- name = jQuery.camelCase( name );
- if ( name in thisCache ) {
- name = [ name ];
- } else {
- name = name.split(" ");
- }
+ name = name.split(" ");
}
}
+ } else {
+ // If "name" is an array of keys...
+ // When data is initially created, via ("key", "val") signature,
+ // keys will be converted to camelCase.
+ // Since there is no way to tell _how_ a key was added, remove
+ // both plain key and camelCase key. #12786
+ // This will only penalize the array argument path.
+ name = name.concat( jQuery.map( name, jQuery.camelCase ) );
+ }
- for ( i = 0, l = name.length; i < l; i++ ) {
- delete thisCache[ name[i] ];
- }
+ i = name.length;
+ while ( i-- ) {
+ delete thisCache[ name[i] ];
+ }
- // If there is no data left in the cache, we want to continue
- // and let the cache object itself get destroyed
- if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
- return;
- }
+ // If there is no data left in the cache, we want to continue
+ // and let the cache object itself get destroyed
+ if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {
+ return;
}
}
+ }
- // See jQuery.data for more information
- if ( !pvt ) {
- delete cache[ id ].data;
+ // See jQuery.data for more information
+ if ( !pvt ) {
+ delete cache[ id ].data;
- // Don't destroy the parent cache unless the internal data object
- // had been the only thing left in it
- if ( !isEmptyDataObject( cache[ id ] ) ) {
- return;
- }
+ // Don't destroy the parent cache unless the internal data object
+ // had been the only thing left in it
+ if ( !isEmptyDataObject( cache[ id ] ) ) {
+ return;
}
+ }
- // Destroy the cache
- if ( isNode ) {
- jQuery.cleanData( [ elem ], true );
+ // Destroy the cache
+ if ( isNode ) {
+ jQuery.cleanData( [ elem ], true );
- // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
- } else if ( jQuery.support.deleteExpando || cache != cache.window ) {
- delete cache[ id ];
+ // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
+ /* jshint eqeqeq: false */
+ } else if ( jQuery.support.deleteExpando || cache != cache.window ) {
+ /* jshint eqeqeq: true */
+ delete cache[ id ];
- // When all else fails, null
- } else {
- cache[ id ] = null;
- }
+ // When all else fails, null
+ } else {
+ cache[ id ] = null;
+ }
+}
+
+jQuery.extend({
+ cache: {},
+
+ // The following elements throw uncatchable exceptions if you
+ // attempt to add expando properties to them.
+ noData: {
+ "applet": true,
+ "embed": true,
+ // Ban all objects except for Flash (which handle expandos)
+ "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+ },
+
+ hasData: function( elem ) {
+ elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+ return !!elem && !isEmptyDataObject( elem );
+ },
+
+ data: function( elem, name, data ) {
+ return internalData( elem, name, data );
+ },
+
+ removeData: function( elem, name ) {
+ return internalRemoveData( elem, name );
},
// For internal use only.
_data: function( elem, name, data ) {
- return jQuery.data( elem, name, data, true );
+ return internalData( elem, name, data, true );
+ },
+
+ _removeData: function( elem, name ) {
+ return internalRemoveData( elem, name, true );
},
// A method for determining if a DOM node can handle the data expando
acceptData: function( elem ) {
+ // Do not set data on non-element because it will not be cleared (#8335).
+ if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {
+ return false;
+ }
+
var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
// nodes accept data unless otherwise specified; rejection can be conditional
@@ -1725,10 +3794,13 @@ jQuery.extend({
jQuery.fn.extend({
data: function( key, value ) {
- var parts, part, attr, name, l,
- elem = this[0],
+ var attrs, name,
+ data = null,
i = 0,
- data = null;
+ elem = this[0];
+
+ // Special expections of .data basically thwart jQuery.access,
+ // so implement the relevant behavior ourselves
// Gets all values
if ( key === undefined ) {
@@ -1736,12 +3808,12 @@ jQuery.fn.extend({
data = jQuery.data( elem );
if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
- attr = elem.attributes;
- for ( l = attr.length; i < l; i++ ) {
- name = attr[i].name;
+ attrs = elem.attributes;
+ for ( ; i < attrs.length; i++ ) {
+ name = attrs[i].name;
- if ( !name.indexOf( "data-" ) ) {
- name = jQuery.camelCase( name.substring(5) );
+ if ( name.indexOf("data-") === 0 ) {
+ name = jQuery.camelCase( name.slice(5) );
dataAttr( elem, name, data[ name ] );
}
@@ -1760,35 +3832,16 @@ jQuery.fn.extend({
});
}
- parts = key.split( ".", 2 );
- parts[1] = parts[1] ? "." + parts[1] : "";
- part = parts[1] + "!";
-
- return jQuery.access( this, function( value ) {
-
- if ( value === undefined ) {
- data = this.triggerHandler( "getData" + part, [ parts[0] ] );
-
- // Try to fetch any internally stored data first
- if ( data === undefined && elem ) {
- data = jQuery.data( elem, key );
- data = dataAttr( elem, key, data );
- }
+ return arguments.length > 1 ?
- return data === undefined && parts[1] ?
- this.data( parts[0] ) :
- data;
- }
-
- parts[1] = value;
+ // Sets one value
this.each(function() {
- var self = jQuery( this );
-
- self.triggerHandler( "setData" + part, parts );
jQuery.data( this, key, value );
- self.triggerHandler( "changeData" + part, parts );
- });
- }, null, value, arguments.length > 1, null, false );
+ }) :
+
+ // Gets one value
+ // Try to fetch any internally stored data first
+ elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;
},
removeData: function( key ) {
@@ -1810,12 +3863,12 @@ function dataAttr( elem, key, data ) {
if ( typeof data === "string" ) {
try {
data = data === "true" ? true :
- data === "false" ? false :
- data === "null" ? null :
- // Only convert to a number if it doesn't change the string
- +data + "" === data ? +data :
- rbrace.test( data ) ? jQuery.parseJSON( data ) :
- data;
+ data === "false" ? false :
+ data === "null" ? null :
+ // Only convert to a number if it doesn't change the string
+ +data + "" === data ? +data :
+ rbrace.test( data ) ? jQuery.parseJSON( data ) :
+ data;
} catch( e ) {}
// Make sure we set the data so it isn't changed later
@@ -1905,8 +3958,8 @@ jQuery.extend({
var key = type + "queueHooks";
return jQuery._data( elem, key ) || jQuery._data( elem, key, {
empty: jQuery.Callbacks("once memory").add(function() {
- jQuery.removeData( elem, type + "queue", true );
- jQuery.removeData( elem, key, true );
+ jQuery._removeData( elem, type + "queue" );
+ jQuery._removeData( elem, key );
})
});
}
@@ -1991,14 +4044,14 @@ jQuery.fn.extend({
return defer.promise( obj );
}
});
-var nodeHook, boolHook, fixSpecified,
- rclass = /[\t\r\n]/g,
+var nodeHook, boolHook,
+ rclass = /[\t\r\n\f]/g,
rreturn = /\r/g,
- rtype = /^(?:button|input)$/i,
- rfocusable = /^(?:button|input|object|select|textarea)$/i,
- rclickable = /^a(?:rea|)$/i,
- rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
- getSetAttribute = jQuery.support.getSetAttribute;
+ rfocusable = /^(?:input|select|textarea|button|object)$/i,
+ rclickable = /^(?:a|area)$/i,
+ ruseDefault = /^(?:checked|selected)$/i,
+ getSetAttribute = jQuery.support.getSetAttribute,
+ getSetInput = jQuery.support.input;
jQuery.fn.extend({
attr: function( name, value ) {
@@ -2027,35 +4080,37 @@ jQuery.fn.extend({
},
addClass: function( value ) {
- var classNames, i, l, elem,
- setClass, c, cl;
+ var classes, elem, cur, clazz, j,
+ i = 0,
+ len = this.length,
+ proceed = typeof value === "string" && value;
if ( jQuery.isFunction( value ) ) {
return this.each(function( j ) {
- jQuery( this ).addClass( value.call(this, j, this.className) );
+ jQuery( this ).addClass( value.call( this, j, this.className ) );
});
}
- if ( value && typeof value === "string" ) {
- classNames = value.split( core_rspace );
+ if ( proceed ) {
+ // The disjunction here is for better compressibility (see removeClass)
+ classes = ( value || "" ).match( core_rnotwhite ) || [];
- for ( i = 0, l = this.length; i < l; i++ ) {
+ for ( ; i < len; i++ ) {
elem = this[ i ];
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ " "
+ );
- if ( elem.nodeType === 1 ) {
- if ( !elem.className && classNames.length === 1 ) {
- elem.className = value;
-
- } else {
- setClass = " " + elem.className + " ";
-
- for ( c = 0, cl = classNames.length; c < cl; c++ ) {
- if ( setClass.indexOf( " " + classNames[ c ] + " " ) < 0 ) {
- setClass += classNames[ c ] + " ";
- }
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+ cur += clazz + " ";
}
- elem.className = jQuery.trim( setClass );
}
+ elem.className = jQuery.trim( cur );
+
}
}
}
@@ -2064,30 +4119,36 @@ jQuery.fn.extend({
},
removeClass: function( value ) {
- var removes, className, elem, c, cl, i, l;
+ var classes, elem, cur, clazz, j,
+ i = 0,
+ len = this.length,
+ proceed = arguments.length === 0 || typeof value === "string" && value;
if ( jQuery.isFunction( value ) ) {
return this.each(function( j ) {
- jQuery( this ).removeClass( value.call(this, j, this.className) );
+ jQuery( this ).removeClass( value.call( this, j, this.className ) );
});
}
- if ( (value && typeof value === "string") || value === undefined ) {
- removes = ( value || "" ).split( core_rspace );
+ if ( proceed ) {
+ classes = ( value || "" ).match( core_rnotwhite ) || [];
- for ( i = 0, l = this.length; i < l; i++ ) {
+ for ( ; i < len; i++ ) {
elem = this[ i ];
- if ( elem.nodeType === 1 && elem.className ) {
-
- className = (" " + elem.className + " ").replace( rclass, " " );
+ // This expression is here for better compressibility (see addClass)
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ ""
+ );
- // loop over each item in the removal list
- for ( c = 0, cl = removes.length; c < cl; c++ ) {
- // Remove until there is nothing to remove,
- while ( className.indexOf(" " + removes[ c ] + " ") >= 0 ) {
- className = className.replace( " " + removes[ c ] + " " , " " );
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ // Remove *all* instances
+ while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
+ cur = cur.replace( " " + clazz + " ", " " );
}
}
- elem.className = value ? jQuery.trim( className ) : "";
+ elem.className = value ? jQuery.trim( cur ) : "";
}
}
}
@@ -2096,8 +4157,11 @@ jQuery.fn.extend({
},
toggleClass: function( value, stateVal ) {
- var type = typeof value,
- isBool = typeof stateVal === "boolean";
+ var type = typeof value;
+
+ if ( typeof stateVal === "boolean" && type === "string" ) {
+ return stateVal ? this.addClass( value ) : this.removeClass( value );
+ }
if ( jQuery.isFunction( value ) ) {
return this.each(function( i ) {
@@ -2111,22 +4175,28 @@ jQuery.fn.extend({
var className,
i = 0,
self = jQuery( this ),
- state = stateVal,
- classNames = value.split( core_rspace );
+ classNames = value.match( core_rnotwhite ) || [];
while ( (className = classNames[ i++ ]) ) {
// check each className given, space separated list
- state = isBool ? state : !self.hasClass( className );
- self[ state ? "addClass" : "removeClass" ]( className );
+ if ( self.hasClass( className ) ) {
+ self.removeClass( className );
+ } else {
+ self.addClass( className );
+ }
}
- } else if ( type === "undefined" || type === "boolean" ) {
+ // Toggle whole class name
+ } else if ( type === core_strundefined || type === "boolean" ) {
if ( this.className ) {
// store className if set
jQuery._data( this, "__className__", this.className );
}
- // toggle whole className
+ // If the element has a class name or if we're passed "false",
+ // then remove the whole classname (if there was one, the above saved it).
+ // Otherwise bring back whatever was previously saved (if anything),
+ // falling back to the empty string if nothing was stored.
this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
}
});
@@ -2146,7 +4216,7 @@ jQuery.fn.extend({
},
val: function( value ) {
- var hooks, ret, isFunction,
+ var ret, hooks, isFunction,
elem = this[0];
if ( !arguments.length ) {
@@ -2172,15 +4242,14 @@ jQuery.fn.extend({
isFunction = jQuery.isFunction( value );
return this.each(function( i ) {
- var val,
- self = jQuery(this);
+ var val;
if ( this.nodeType !== 1 ) {
return;
}
if ( isFunction ) {
- val = value.call( this, i, self.val() );
+ val = value.call( this, i, jQuery( this ).val() );
} else {
val = value;
}
@@ -2210,10 +4279,11 @@ jQuery.extend({
valHooks: {
option: {
get: function( elem ) {
- // attributes.value is undefined in Blackberry 4.7 but
- // uses .value. See #6932
- var val = elem.attributes.value;
- return !val || val.specified ? elem.value : elem.text;
+ // Use proper attribute retrieval(#6932, #12072)
+ var val = jQuery.find.attr( elem, "value" );
+ return val != null ?
+ val :
+ elem.text;
}
},
select: {
@@ -2255,13 +4325,20 @@ jQuery.extend({
},
set: function( elem, value ) {
- var values = jQuery.makeArray( value );
+ var optionSet, option,
+ options = elem.options,
+ values = jQuery.makeArray( value ),
+ i = options.length;
- jQuery(elem).find("option").each(function() {
- this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
- });
+ while ( i-- ) {
+ option = options[ i ];
+ if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) {
+ optionSet = true;
+ }
+ }
- if ( !values.length ) {
+ // force browsers to behave consistently when non-matching value is set
+ if ( !optionSet ) {
elem.selectedIndex = -1;
}
return values;
@@ -2269,11 +4346,8 @@ jQuery.extend({
}
},
- // Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9
- attrFn: {},
-
- attr: function( elem, name, value, pass ) {
- var ret, hooks, notxml,
+ attr: function( elem, name, value ) {
+ var hooks, ret,
nType = elem.nodeType;
// don't get/set attributes on text, comment and attribute nodes
@@ -2281,31 +4355,25 @@ jQuery.extend({
return;
}
- if ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) {
- return jQuery( elem )[ name ]( value );
- }
-
// Fallback to prop when attributes are not supported
- if ( typeof elem.getAttribute === "undefined" ) {
+ if ( typeof elem.getAttribute === core_strundefined ) {
return jQuery.prop( elem, name, value );
}
- notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
// All attributes are lowercase
// Grab necessary hook if one is defined
- if ( notxml ) {
+ if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
name = name.toLowerCase();
- hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+ hooks = jQuery.attrHooks[ name ] ||
+ ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
}
if ( value !== undefined ) {
if ( value === null ) {
jQuery.removeAttr( elem, name );
- return;
- } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
+ } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
return ret;
} else {
@@ -2313,47 +4381,46 @@ jQuery.extend({
return value;
}
- } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
+ } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
return ret;
} else {
-
- ret = elem.getAttribute( name );
+ ret = jQuery.find.attr( elem, name );
// Non-existent attributes return null, we normalize to undefined
- return ret === null ?
+ return ret == null ?
undefined :
ret;
}
},
removeAttr: function( elem, value ) {
- var propName, attrNames, name, isBool,
- i = 0;
-
- if ( value && elem.nodeType === 1 ) {
-
- attrNames = value.split( core_rspace );
-
- for ( ; i < attrNames.length; i++ ) {
- name = attrNames[ i ];
-
- if ( name ) {
- propName = jQuery.propFix[ name ] || name;
- isBool = rboolean.test( name );
+ var name, propName,
+ i = 0,
+ attrNames = value && value.match( core_rnotwhite );
- // See #9699 for explanation of this approach (setting first, then removal)
- // Do not do this for boolean attributes (see #10870)
- if ( !isBool ) {
- jQuery.attr( elem, name, "" );
- }
- elem.removeAttribute( getSetAttribute ? name : propName );
+ if ( attrNames && elem.nodeType === 1 ) {
+ while ( (name = attrNames[i++]) ) {
+ propName = jQuery.propFix[ name ] || name;
- // Set corresponding property to false for boolean attributes
- if ( isBool && propName in elem ) {
+ // Boolean attributes get special treatment (#10870)
+ if ( jQuery.expr.match.bool.test( name ) ) {
+ // Set corresponding property to false
+ if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
elem[ propName ] = false;
+ // Support: IE<9
+ // Also clear defaultChecked/defaultSelected (if appropriate)
+ } else {
+ elem[ jQuery.camelCase( "default-" + name ) ] =
+ elem[ propName ] = false;
}
+
+ // See #9699 for explanation of this approach (setting first, then removal)
+ } else {
+ jQuery.attr( elem, name, "" );
}
+
+ elem.removeAttribute( getSetAttribute ? name : propName );
}
}
},
@@ -2361,13 +4428,9 @@ jQuery.extend({
attrHooks: {
type: {
set: function( elem, value ) {
- // We can't allow the type property to be changed (since it causes problems in IE)
- if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
- jQuery.error( "type property can't be changed" );
- } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+ if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
// Setting the type on a radio button after the value resets the value in IE6-9
- // Reset value to it's default in case type is set after value
- // This is for element creation
+ // Reset value to default in case type is set after value during creation
var val = elem.value;
elem.setAttribute( "type", value );
if ( val ) {
@@ -2376,41 +4439,12 @@ jQuery.extend({
return value;
}
}
- },
- // Use the value property for back compat
- // Use the nodeHook for button elements in IE6/7 (#1954)
- value: {
- get: function( elem, name ) {
- if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
- return nodeHook.get( elem, name );
- }
- return name in elem ?
- elem.value :
- null;
- },
- set: function( elem, value, name ) {
- if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
- return nodeHook.set( elem, value, name );
- }
- // Does not return so that setAttribute is also used
- elem.value = value;
- }
}
},
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"
+ "class": "className"
},
prop: function( elem, name, value ) {
@@ -2431,20 +4465,14 @@ jQuery.extend({
}
if ( value !== undefined ) {
- if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
- return ret;
-
- } else {
- return ( elem[ name ] = value );
- }
+ return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
+ ret :
+ ( elem[ name ] = value );
} else {
- if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
- return ret;
-
- } else {
- return elem[ name ];
- }
+ return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
+ ret :
+ elem[ name ];
}
},
@@ -2453,115 +4481,154 @@ jQuery.extend({
get: function( elem ) {
// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
- var attributeNode = elem.getAttributeNode("tabindex");
+ // Use proper attribute retrieval(#12072)
+ var tabindex = jQuery.find.attr( elem, "tabindex" );
- return attributeNode && attributeNode.specified ?
- parseInt( attributeNode.value, 10 ) :
+ return tabindex ?
+ parseInt( tabindex, 10 ) :
rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
0 :
- undefined;
+ -1;
}
}
}
});
-// Hook for boolean attributes
+// Hooks for boolean attributes
boolHook = {
- get: function( elem, name ) {
- // Align boolean attributes with corresponding properties
- // Fall back to attribute presence where some booleans are not supported
- var attrNode,
- property = jQuery.prop( elem, name );
- return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
- name.toLowerCase() :
- undefined;
- },
set: function( elem, value, name ) {
- var propName;
if ( value === false ) {
// Remove boolean attributes when set to false
jQuery.removeAttr( elem, name );
- } else {
- // value is true since we know at this point it's type boolean and not false
- // Set boolean attributes to the same name and set the DOM property
- propName = jQuery.propFix[ name ] || name;
- if ( propName in elem ) {
- // Only set the IDL specifically if it already exists on the element
- elem[ propName ] = true;
- }
+ } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
+ // IE<8 needs the *property* name
+ elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
- elem.setAttribute( name, name.toLowerCase() );
+ // Use defaultChecked and defaultSelected for oldIE
+ } else {
+ elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
}
+
return name;
}
};
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
+ var getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr;
+
+ jQuery.expr.attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?
+ function( elem, name, isXML ) {
+ var fn = jQuery.expr.attrHandle[ name ],
+ ret = isXML ?
+ undefined :
+ /* jshint eqeqeq: false */
+ (jQuery.expr.attrHandle[ name ] = undefined) !=
+ getter( elem, name, isXML ) ?
+
+ name.toLowerCase() :
+ null;
+ jQuery.expr.attrHandle[ name ] = fn;
+ return ret;
+ } :
+ function( elem, name, isXML ) {
+ return isXML ?
+ undefined :
+ elem[ jQuery.camelCase( "default-" + name ) ] ?
+ name.toLowerCase() :
+ null;
+ };
+});
+
+// fix oldIE attroperties
+if ( !getSetInput || !getSetAttribute ) {
+ jQuery.attrHooks.value = {
+ set: function( elem, value, name ) {
+ if ( jQuery.nodeName( elem, "input" ) ) {
+ // Does not return so that setAttribute is also used
+ elem.defaultValue = value;
+ } else {
+ // Use nodeHook if defined (#1954); otherwise setAttribute is fine
+ return nodeHook && nodeHook.set( elem, value, name );
+ }
+ }
+ };
+}
// IE6/7 do not support getting/setting some attributes with get/setAttribute
if ( !getSetAttribute ) {
- fixSpecified = {
- name: true,
- id: true,
- coords: true
- };
-
// Use this for any attribute in IE6/7
// This fixes almost every IE6/7 issue
- nodeHook = jQuery.valHooks.button = {
- get: function( elem, name ) {
- var ret;
- ret = elem.getAttributeNode( name );
- return ret && ( fixSpecified[ name ] ? ret.value !== "" : ret.specified ) ?
- ret.value :
- undefined;
- },
+ nodeHook = {
set: function( elem, value, name ) {
// Set the existing or create a new attribute node
var ret = elem.getAttributeNode( name );
if ( !ret ) {
- ret = document.createAttribute( name );
- elem.setAttributeNode( ret );
+ elem.setAttributeNode(
+ (ret = elem.ownerDocument.createAttribute( name ))
+ );
}
- return ( ret.value = value + "" );
+
+ ret.value = value += "";
+
+ // Break association with cloned elements by also using setAttribute (#9646)
+ return name === "value" || value === elem.getAttribute( name ) ?
+ value :
+ undefined;
+ }
+ };
+ jQuery.expr.attrHandle.id = jQuery.expr.attrHandle.name = jQuery.expr.attrHandle.coords =
+ // Some attributes are constructed with empty-string values when not defined
+ function( elem, name, isXML ) {
+ var ret;
+ return isXML ?
+ undefined :
+ (ret = elem.getAttributeNode( name )) && ret.value !== "" ?
+ ret.value :
+ null;
+ };
+ jQuery.valHooks.button = {
+ get: function( elem, name ) {
+ var ret = elem.getAttributeNode( name );
+ return ret && ret.specified ?
+ ret.value :
+ undefined;
+ },
+ set: nodeHook.set
+ };
+
+ // Set contenteditable to false on removals(#10429)
+ // Setting to empty string throws an error as an invalid value
+ jQuery.attrHooks.contenteditable = {
+ set: function( elem, value, name ) {
+ nodeHook.set( elem, value === "" ? false : value, name );
}
};
// Set width and height to auto instead of 0 on empty string( Bug #8150 )
// This is for removals
jQuery.each([ "width", "height" ], function( i, name ) {
- jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+ jQuery.attrHooks[ name ] = {
set: function( elem, value ) {
if ( value === "" ) {
elem.setAttribute( name, "auto" );
return value;
}
}
- });
+ };
});
-
- // Set contenteditable to false on removals(#10429)
- // Setting to empty string throws an error as an invalid value
- jQuery.attrHooks.contenteditable = {
- get: nodeHook.get,
- set: function( elem, value, name ) {
- if ( value === "" ) {
- value = "false";
- }
- nodeHook.set( elem, value, name );
- }
- };
}
// Some attributes require a special call on IE
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
if ( !jQuery.support.hrefNormalized ) {
- jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
- jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+ // href/src property should get the full normalized URL (#10299/#12915)
+ jQuery.each([ "href", "src" ], function( i, name ) {
+ jQuery.propHooks[ name ] = {
get: function( elem ) {
- var ret = elem.getAttribute( name, 2 );
- return ret === null ? undefined : ret;
+ return elem.getAttribute( name, 4 );
}
- });
+ };
});
}
@@ -2569,8 +4636,9 @@ if ( !jQuery.support.style ) {
jQuery.attrHooks.style = {
get: function( elem ) {
// Return undefined in the case of empty string
- // Normalize to lowercase since IE uppercases css property names
- return elem.style.cssText.toLowerCase() || undefined;
+ // Note: IE uppercases css property names, but if we were to .toLowerCase()
+ // .cssText, that would destroy case senstitivity in URL's, like in "background"
+ return elem.style.cssText || undefined;
},
set: function( elem, value ) {
return ( elem.style.cssText = value + "" );
@@ -2581,7 +4649,7 @@ if ( !jQuery.support.style ) {
// Safari mis-reports the default selected property of an option
// Accessing the parent's selectedIndex property fixes it
if ( !jQuery.support.optSelected ) {
- jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+ jQuery.propHooks.selected = {
get: function( elem ) {
var parent = elem.parentNode;
@@ -2595,43 +4663,65 @@ if ( !jQuery.support.optSelected ) {
}
return null;
}
- });
+ };
}
+jQuery.each([
+ "tabIndex",
+ "readOnly",
+ "maxLength",
+ "cellSpacing",
+ "cellPadding",
+ "rowSpan",
+ "colSpan",
+ "useMap",
+ "frameBorder",
+ "contentEditable"
+], function() {
+ jQuery.propFix[ this.toLowerCase() ] = this;
+});
+
// IE6/7 call enctype encoding
if ( !jQuery.support.enctype ) {
jQuery.propFix.enctype = "encoding";
}
// Radios and checkboxes getter/setter
-if ( !jQuery.support.checkOn ) {
- jQuery.each([ "radio", "checkbox" ], function() {
- jQuery.valHooks[ this ] = {
- get: function( elem ) {
- // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
- return elem.getAttribute("value") === null ? "on" : elem.value;
- }
- };
- });
-}
jQuery.each([ "radio", "checkbox" ], function() {
- jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+ jQuery.valHooks[ this ] = {
set: function( elem, value ) {
if ( jQuery.isArray( value ) ) {
return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
}
}
- });
+ };
+ if ( !jQuery.support.checkOn ) {
+ jQuery.valHooks[ this ].get = function( elem ) {
+ // Support: Webkit
+ // "" is returned instead of "on" if a value isn't specified
+ return elem.getAttribute("value") === null ? "on" : elem.value;
+ };
+ }
});
-var rformElems = /^(?:textarea|input|select)$/i,
- rtypenamespace = /^([^\.]*|)(?:\.(.+)|)$/,
- rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
+var rformElems = /^(?:input|select|textarea)$/i,
rkeyEvent = /^key/,
rmouseEvent = /^(?:mouse|contextmenu)|click/,
rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
- hoverHack = function( events ) {
- return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
- };
+ rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
+
+function returnTrue() {
+ return true;
+}
+
+function returnFalse() {
+ return false;
+}
+
+function safeActiveElement() {
+ try {
+ return document.activeElement;
+ } catch ( err ) { }
+}
/*
* Helper functions for managing events -- not part of the public interface.
@@ -2639,14 +4729,16 @@ var rformElems = /^(?:textarea|input|select)$/i,
*/
jQuery.event = {
- add: function( elem, types, handler, data, selector ) {
+ global: {},
- var elemData, eventHandle, events,
- t, tns, type, namespaces, handleObj,
- handleObjIn, handlers, special;
+ add: function( elem, types, handler, data, selector ) {
+ var tmp, events, t, handleObjIn,
+ special, eventHandle, handleObj,
+ handlers, type, namespaces, origType,
+ elemData = jQuery._data( elem );
- // Don't attach events to noData or text/comment nodes (allow plain objects tho)
- if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
+ if ( !elemData ) {
return;
}
@@ -2663,16 +4755,14 @@ jQuery.event = {
}
// Init the element's event structure and main handler, if this is the first
- events = elemData.events;
- if ( !events ) {
- elemData.events = events = {};
+ if ( !(events = elemData.events) ) {
+ events = elemData.events = {};
}
- eventHandle = elemData.handle;
- if ( !eventHandle ) {
- elemData.handle = eventHandle = function( e ) {
+ if ( !(eventHandle = elemData.handle) ) {
+ eventHandle = elemData.handle = function( e ) {
// Discard the second event of a jQuery.event.trigger() and
// when an event is called after a page has unloaded
- return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
+ return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?
jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
undefined;
};
@@ -2681,13 +4771,17 @@ jQuery.event = {
}
// Handle multiple events separated by a space
- // jQuery(...).bind("mouseover mouseout", fn);
- types = jQuery.trim( hoverHack(types) ).split( " " );
- for ( t = 0; t < types.length; t++ ) {
-
- tns = rtypenamespace.exec( types[t] ) || [];
- type = tns[1];
- namespaces = ( tns[2] || "" ).split( "." ).sort();
+ types = ( types || "" ).match( core_rnotwhite ) || [""];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+ // There *must* be a type, no attaching namespace-only handlers
+ if ( !type ) {
+ continue;
+ }
// If event changes its type, use the special event handlers for the changed type
special = jQuery.event.special[ type ] || {};
@@ -2701,7 +4795,7 @@ jQuery.event = {
// handleObj is passed to all event handlers
handleObj = jQuery.extend({
type: type,
- origType: tns[1],
+ origType: origType,
data: data,
handler: handler,
guid: handler.guid,
@@ -2711,8 +4805,7 @@ jQuery.event = {
}, handleObjIn );
// Init the event handler queue if we're the first
- handlers = events[ type ];
- if ( !handlers ) {
+ if ( !(handlers = events[ type ]) ) {
handlers = events[ type ] = [];
handlers.delegateCount = 0;
@@ -2751,13 +4844,12 @@ jQuery.event = {
elem = null;
},
- global: {},
-
// Detach an event or set of events from an element
remove: function( elem, types, handler, selector, mappedTypes ) {
-
- var t, tns, type, origType, namespaces, origCount,
- j, events, special, eventType, handleObj,
+ var j, handleObj, tmp,
+ origCount, t, events,
+ special, handlers, type,
+ namespaces, origType,
elemData = jQuery.hasData( elem ) && jQuery._data( elem );
if ( !elemData || !(events = elemData.events) ) {
@@ -2765,11 +4857,12 @@ jQuery.event = {
}
// Once for each type.namespace in types; type may be omitted
- types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
- for ( t = 0; t < types.length; t++ ) {
- tns = rtypenamespace.exec( types[t] ) || [];
- type = origType = tns[1];
- namespaces = tns[2];
+ types = ( types || "" ).match( core_rnotwhite ) || [""];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
// Unbind all events (on this namespace, if provided) for the element
if ( !type ) {
@@ -2780,23 +4873,23 @@ jQuery.event = {
}
special = jQuery.event.special[ type ] || {};
- type = ( selector? special.delegateType : special.bindType ) || type;
- eventType = events[ type ] || [];
- origCount = eventType.length;
- namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+ handlers = events[ type ] || [];
+ tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
// Remove matching events
- for ( j = 0; j < eventType.length; j++ ) {
- handleObj = eventType[ j ];
+ origCount = j = handlers.length;
+ while ( j-- ) {
+ handleObj = handlers[ j ];
if ( ( mappedTypes || origType === handleObj.origType ) &&
- ( !handler || handler.guid === handleObj.guid ) &&
- ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
- ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
- eventType.splice( j--, 1 );
+ ( !handler || handler.guid === handleObj.guid ) &&
+ ( !tmp || tmp.test( handleObj.namespace ) ) &&
+ ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+ handlers.splice( j, 1 );
if ( handleObj.selector ) {
- eventType.delegateCount--;
+ handlers.delegateCount--;
}
if ( special.remove ) {
special.remove.call( elem, handleObj );
@@ -2806,7 +4899,7 @@ jQuery.event = {
// Remove generic event handler if we removed something and no more handlers exist
// (avoids potential for endless recursion during removal of special event handlers)
- if ( eventType.length === 0 && origCount !== eventType.length ) {
+ if ( origCount && !handlers.length ) {
if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
jQuery.removeEvent( elem, type, elemData.handle );
}
@@ -2821,80 +4914,48 @@ jQuery.event = {
// removeData also checks for emptiness and clears the expando if empty
// so use it instead of delete
- jQuery.removeData( elem, "events", true );
+ jQuery._removeData( elem, "events" );
}
},
- // Events that are safe to short-circuit if no handlers are attached.
- // Native DOM events should not be added, they may have inline handlers.
- customEvent: {
- "getData": true,
- "setData": true,
- "changeData": true
- },
-
trigger: function( event, data, elem, onlyHandlers ) {
+ var handle, ontype, cur,
+ bubbleType, special, tmp, i,
+ eventPath = [ elem || document ],
+ type = core_hasOwn.call( event, "type" ) ? event.type : event,
+ namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
+
+ cur = tmp = elem = elem || document;
+
// Don't do events on text and comment nodes
- if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
return;
}
- // Event object or event type
- var cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType,
- type = event.type || event,
- namespaces = [];
-
// focus/blur morphs to focusin/out; ensure we're not firing them right now
if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
return;
}
- if ( type.indexOf( "!" ) >= 0 ) {
- // Exclusive events trigger only for the exact event (no namespaces)
- type = type.slice(0, -1);
- exclusive = true;
- }
-
- if ( type.indexOf( "." ) >= 0 ) {
+ if ( type.indexOf(".") >= 0 ) {
// Namespaced trigger; create a regexp to match event type in handle()
namespaces = type.split(".");
type = namespaces.shift();
namespaces.sort();
}
+ ontype = type.indexOf(":") < 0 && "on" + type;
- if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
- // No jQuery handlers for this event type, and it can't have inline handlers
- return;
- }
-
- // Caller can pass in an Event, Object, or just an event type string
- event = typeof event === "object" ?
- // jQuery.Event object
- event[ jQuery.expando ] ? event :
- // Object literal
- new jQuery.Event( type, event ) :
- // Just the event type (string)
- new jQuery.Event( type );
-
- event.type = type;
- event.isTrigger = true;
- event.exclusive = exclusive;
- event.namespace = namespaces.join( "." );
- event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
- ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
-
- // Handle a global trigger
- if ( !elem ) {
+ // Caller can pass in a jQuery.Event object, Object, or just an event type string
+ event = event[ jQuery.expando ] ?
+ event :
+ new jQuery.Event( type, typeof event === "object" && event );
- // TODO: Stop taunting the data cache; remove global events and always attach to document
- cache = jQuery.cache;
- for ( i in cache ) {
- if ( cache[ i ].events && cache[ i ].events[ type ] ) {
- jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
- }
- }
- return;
- }
+ // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+ event.isTrigger = onlyHandlers ? 2 : 3;
+ event.namespace = namespaces.join(".");
+ event.namespace_re = event.namespace ?
+ new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
+ null;
// Clean up the event in case it is being reused
event.result = undefined;
@@ -2903,44 +4964,50 @@ jQuery.event = {
}
// Clone any incoming data and prepend the event, creating the handler arg list
- data = data != null ? jQuery.makeArray( data ) : [];
- data.unshift( event );
+ data = data == null ?
+ [ event ] :
+ jQuery.makeArray( data, [ event ] );
// Allow special events to draw outside the lines
special = jQuery.event.special[ type ] || {};
- if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
+ if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
return;
}
// Determine event propagation path in advance, per W3C events spec (#9951)
// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
- eventPath = [[ elem, special.bindType || type ]];
if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
bubbleType = special.delegateType || type;
- cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
- for ( old = elem; cur; cur = cur.parentNode ) {
- eventPath.push([ cur, bubbleType ]);
- old = cur;
+ if ( !rfocusMorph.test( bubbleType + type ) ) {
+ cur = cur.parentNode;
+ }
+ for ( ; cur; cur = cur.parentNode ) {
+ eventPath.push( cur );
+ tmp = cur;
}
// Only add window if we got to document (e.g., not plain obj or detached DOM)
- if ( old === (elem.ownerDocument || document) ) {
- eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
+ if ( tmp === (elem.ownerDocument || document) ) {
+ eventPath.push( tmp.defaultView || tmp.parentWindow || window );
}
}
// Fire handlers on the event path
- for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
+ i = 0;
+ while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
- cur = eventPath[i][0];
- event.type = eventPath[i][1];
+ event.type = i > 1 ?
+ bubbleType :
+ special.bindType || type;
+ // jQuery handler
handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
if ( handle ) {
handle.apply( cur, data );
}
- // Note that this is a bare JS function and not a jQuery handler
+
+ // Native handler
handle = ontype && cur[ ontype ];
if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
event.preventDefault();
@@ -2951,29 +5018,33 @@ jQuery.event = {
// If nobody prevented the default action, do it now
if ( !onlyHandlers && !event.isDefaultPrevented() ) {
- if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
- !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+ if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
+ jQuery.acceptData( elem ) ) {
// Call a native DOM method on the target with the same name name as the event.
// Can't use an .isFunction() check here because IE6/7 fails that test.
// Don't do default actions on window, that's where global variables be (#6170)
- // IE<9 dies on focus/blur to hidden element (#1486)
- if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
+ if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
// Don't re-trigger an onFOO event when we call its FOO() method
- old = elem[ ontype ];
+ tmp = elem[ ontype ];
- if ( old ) {
+ if ( tmp ) {
elem[ ontype ] = null;
}
// Prevent re-triggering of the same event, since we already bubbled it above
jQuery.event.triggered = type;
- elem[ type ]();
+ try {
+ elem[ type ]();
+ } catch ( e ) {
+ // IE<9 dies on focus/blur to hidden element (#1486,#12518)
+ // only reproducible on winXP IE8 native, not IE9 in IE8 mode
+ }
jQuery.event.triggered = undefined;
- if ( old ) {
- elem[ ontype ] = old;
+ if ( tmp ) {
+ elem[ ontype ] = tmp;
}
}
}
@@ -2985,15 +5056,13 @@ jQuery.event = {
dispatch: function( event ) {
// Make a writable jQuery.Event from the native event object
- event = jQuery.event.fix( event || window.event );
+ event = jQuery.event.fix( event );
- var i, j, cur, ret, selMatch, matched, matches, handleObj, sel, related,
- handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
- delegateCount = handlers.delegateCount,
+ var i, ret, handleObj, matched, j,
+ handlerQueue = [],
args = core_slice.call( arguments ),
- run_all = !event.exclusive && !event.namespace,
- special = jQuery.event.special[ event.type ] || {},
- handlerQueue = [];
+ handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
+ special = jQuery.event.special[ event.type ] || {};
// Use the fix-ed jQuery.Event rather than the (read-only) native event
args[0] = event;
@@ -3004,81 +5073,142 @@ jQuery.event = {
return;
}
- // Determine handlers that should run if there are delegated events
+ // Determine handlers
+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+ // Run delegates first; they may want to stop propagation beneath us
+ i = 0;
+ while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
+ event.currentTarget = matched.elem;
+
+ j = 0;
+ while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
+
+ // Triggered event must either 1) have no namespace, or
+ // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+ if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
+
+ event.handleObj = handleObj;
+ event.data = handleObj.data;
+
+ ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+ .apply( matched.elem, args );
+
+ if ( ret !== undefined ) {
+ if ( (event.result = ret) === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+ }
+
+ // Call the postDispatch hook for the mapped type
+ if ( special.postDispatch ) {
+ special.postDispatch.call( this, event );
+ }
+
+ return event.result;
+ },
+
+ handlers: function( event, handlers ) {
+ var sel, handleObj, matches, i,
+ handlerQueue = [],
+ delegateCount = handlers.delegateCount,
+ cur = event.target;
+
+ // Find delegate handlers
+ // Black-hole SVG <use> instance trees (#13180)
// Avoid non-left-click bubbling in Firefox (#3861)
- if ( delegateCount && !(event.button && event.type === "click") ) {
+ if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
- for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
+ /* jshint eqeqeq: false */
+ for ( ; cur != this; cur = cur.parentNode || this ) {
+ /* jshint eqeqeq: true */
- // Don't process clicks (ONLY) on disabled elements (#6911, #8165, #11382, #11764)
- if ( cur.disabled !== true || event.type !== "click" ) {
- selMatch = {};
+ // Don't check non-elements (#13208)
+ // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+ if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) {
matches = [];
for ( i = 0; i < delegateCount; i++ ) {
handleObj = handlers[ i ];
- sel = handleObj.selector;
- if ( selMatch[ sel ] === undefined ) {
- selMatch[ sel ] = handleObj.needsContext ?
+ // Don't conflict with Object.prototype properties (#13203)
+ sel = handleObj.selector + " ";
+
+ if ( matches[ sel ] === undefined ) {
+ matches[ sel ] = handleObj.needsContext ?
jQuery( sel, this ).index( cur ) >= 0 :
jQuery.find( sel, this, null, [ cur ] ).length;
}
- if ( selMatch[ sel ] ) {
+ if ( matches[ sel ] ) {
matches.push( handleObj );
}
}
if ( matches.length ) {
- handlerQueue.push({ elem: cur, matches: matches });
+ handlerQueue.push({ elem: cur, handlers: matches });
}
}
}
}
// Add the remaining (directly-bound) handlers
- if ( handlers.length > delegateCount ) {
- handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
+ if ( delegateCount < handlers.length ) {
+ handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
}
- // Run delegates first; they may want to stop propagation beneath us
- for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
- matched = handlerQueue[ i ];
- event.currentTarget = matched.elem;
+ return handlerQueue;
+ },
- for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
- handleObj = matched.matches[ j ];
+ fix: function( event ) {
+ if ( event[ jQuery.expando ] ) {
+ return event;
+ }
- // Triggered event must either 1) be non-exclusive and have no namespace, or
- // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
- if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
+ // Create a writable copy of the event object and normalize some properties
+ var i, prop, copy,
+ type = event.type,
+ originalEvent = event,
+ fixHook = this.fixHooks[ type ];
- event.data = handleObj.data;
- event.handleObj = handleObj;
+ if ( !fixHook ) {
+ this.fixHooks[ type ] = fixHook =
+ rmouseEvent.test( type ) ? this.mouseHooks :
+ rkeyEvent.test( type ) ? this.keyHooks :
+ {};
+ }
+ copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
- ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
- .apply( matched.elem, args );
+ event = new jQuery.Event( originalEvent );
- if ( ret !== undefined ) {
- event.result = ret;
- if ( ret === false ) {
- event.preventDefault();
- event.stopPropagation();
- }
- }
- }
- }
+ i = copy.length;
+ while ( i-- ) {
+ prop = copy[ i ];
+ event[ prop ] = originalEvent[ prop ];
}
- // Call the postDispatch hook for the mapped type
- if ( special.postDispatch ) {
- special.postDispatch.call( this, event );
+ // Support: IE<9
+ // Fix target property (#1925)
+ if ( !event.target ) {
+ event.target = originalEvent.srcElement || document;
}
- return event.result;
+ // Support: Chrome 23+, Safari?
+ // Target should not be a text node (#504, #13143)
+ if ( event.target.nodeType === 3 ) {
+ event.target = event.target.parentNode;
+ }
+
+ // Support: IE<9
+ // For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
+ event.metaKey = !!event.metaKey;
+
+ return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
},
// Includes some event props shared by KeyEvent and MouseEvent
- // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
- props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+ props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
fixHooks: {},
@@ -3098,7 +5228,7 @@ jQuery.event = {
mouseHooks: {
props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
filter: function( event, original ) {
- var eventDoc, doc, body,
+ var body, eventDoc, doc,
button = original.button,
fromElement = original.fromElement;
@@ -3127,64 +5257,57 @@ jQuery.event = {
}
},
- fix: function( event ) {
- if ( event[ jQuery.expando ] ) {
- return event;
- }
-
- // Create a writable copy of the event object and normalize some properties
- var i, prop,
- originalEvent = event,
- fixHook = jQuery.event.fixHooks[ event.type ] || {},
- copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
-
- event = jQuery.Event( originalEvent );
-
- for ( i = copy.length; i; ) {
- prop = copy[ --i ];
- event[ prop ] = originalEvent[ prop ];
- }
-
- // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
- if ( !event.target ) {
- event.target = originalEvent.srcElement || document;
- }
-
- // Target should not be a text node (#504, Safari)
- if ( event.target.nodeType === 3 ) {
- event.target = event.target.parentNode;
- }
-
- // For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8)
- event.metaKey = !!event.metaKey;
-
- return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
- },
-
special: {
load: {
// Prevent triggered image.load events from bubbling to window.load
noBubble: true
},
-
focus: {
+ // Fire native event if possible so blur/focus sequence is correct
+ trigger: function() {
+ if ( this !== safeActiveElement() && this.focus ) {
+ try {
+ this.focus();
+ return false;
+ } catch ( e ) {
+ // Support: IE<9
+ // If we error on focus to hidden element (#1486, #12518),
+ // let .trigger() run the handlers
+ }
+ }
+ },
delegateType: "focusin"
},
blur: {
+ trigger: function() {
+ if ( this === safeActiveElement() && this.blur ) {
+ this.blur();
+ return false;
+ }
+ },
delegateType: "focusout"
},
-
- beforeunload: {
- setup: function( data, namespaces, eventHandle ) {
- // We only want to do this special case on windows
- if ( jQuery.isWindow( this ) ) {
- this.onbeforeunload = eventHandle;
+ click: {
+ // For checkbox, fire native event so checked state will be right
+ trigger: function() {
+ if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
+ this.click();
+ return false;
}
},
- teardown: function( namespaces, eventHandle ) {
- if ( this.onbeforeunload === eventHandle ) {
- this.onbeforeunload = null;
+ // For cross-browser consistency, don't fire native .click() on links
+ _default: function( event ) {
+ return jQuery.nodeName( event.target, "a" );
+ }
+ },
+
+ beforeunload: {
+ postDispatch: function( event ) {
+
+ // Even when returnValue equals to undefined Firefox will still show alert
+ if ( event.result !== undefined ) {
+ event.originalEvent.returnValue = event.result;
}
}
}
@@ -3197,7 +5320,8 @@ jQuery.event = {
var e = jQuery.extend(
new jQuery.Event(),
event,
- { type: type,
+ {
+ type: type,
isSimulated: true,
originalEvent: {}
}
@@ -3213,10 +5337,6 @@ jQuery.event = {
}
};
-// Some plugins are using, but it's undocumented/deprecated and will be removed.
-// The 1.7 special event interface should provide all the hooks needed now.
-jQuery.event.handle = jQuery.event.dispatch;
-
jQuery.removeEvent = document.removeEventListener ?
function( elem, type, handle ) {
if ( elem.removeEventListener ) {
@@ -3230,7 +5350,7 @@ jQuery.removeEvent = document.removeEventListener ?
// #8545, #7054, preventing memory leaks for custom events in IE6-8
// detachEvent needed property on element, by name of that event, to properly expose it to GC
- if ( typeof elem[ name ] === "undefined" ) {
+ if ( typeof elem[ name ] === core_strundefined ) {
elem[ name ] = null;
}
@@ -3271,54 +5391,51 @@ jQuery.Event = function( src, props ) {
this[ jQuery.expando ] = true;
};
-function returnFalse() {
- return false;
-}
-function returnTrue() {
- return true;
-}
-
// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
jQuery.Event.prototype = {
- preventDefault: function() {
- this.isDefaultPrevented = returnTrue;
+ isDefaultPrevented: returnFalse,
+ isPropagationStopped: returnFalse,
+ isImmediatePropagationStopped: returnFalse,
+ preventDefault: function() {
var e = this.originalEvent;
+
+ this.isDefaultPrevented = returnTrue;
if ( !e ) {
return;
}
- // if preventDefault exists run it on the original event
+ // If preventDefault exists, run it on the original event
if ( e.preventDefault ) {
e.preventDefault();
- // otherwise set the returnValue property of the original event to false (IE)
+ // Support: IE
+ // Otherwise set the returnValue property of the original event to false
} else {
e.returnValue = false;
}
},
stopPropagation: function() {
- this.isPropagationStopped = returnTrue;
-
var e = this.originalEvent;
+
+ this.isPropagationStopped = returnTrue;
if ( !e ) {
return;
}
- // if stopPropagation exists run it on the original event
+ // If stopPropagation exists, run it on the original event
if ( e.stopPropagation ) {
e.stopPropagation();
}
- // otherwise set the cancelBubble property of the original event to true (IE)
+
+ // Support: IE
+ // Set the cancelBubble property of the original event to true
e.cancelBubble = true;
},
stopImmediatePropagation: function() {
this.isImmediatePropagationStopped = returnTrue;
this.stopPropagation();
- },
- isDefaultPrevented: returnFalse,
- isPropagationStopped: returnFalse,
- isImmediatePropagationStopped: returnFalse
+ }
};
// Create mouseenter/leave events using mouseover/out and event-time checks
@@ -3334,8 +5451,7 @@ jQuery.each({
var ret,
target = this,
related = event.relatedTarget,
- handleObj = event.handleObj,
- selector = handleObj.selector;
+ handleObj = event.handleObj;
// For mousenter/leave call the handler if related is outside the target.
// NB: No relatedTarget if the mouse left/entered the browser window
@@ -3364,11 +5480,11 @@ if ( !jQuery.support.submitBubbles ) {
// Node name check avoids a VML-related crash in IE (#9807)
var elem = e.target,
form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
- if ( form && !jQuery._data( form, "_submit_attached" ) ) {
+ if ( form && !jQuery._data( form, "submitBubbles" ) ) {
jQuery.event.add( form, "submit._submit", function( event ) {
event._submit_bubble = true;
});
- jQuery._data( form, "_submit_attached", true );
+ jQuery._data( form, "submitBubbles", true );
}
});
// return undefined since we don't need an event listener
@@ -3427,13 +5543,13 @@ if ( !jQuery.support.changeBubbles ) {
jQuery.event.add( this, "beforeactivate._change", function( e ) {
var elem = e.target;
- if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "_change_attached" ) ) {
+ if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) {
jQuery.event.add( elem, "change._change", function( event ) {
if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
jQuery.event.simulate( "change", this.parentNode, event, true );
}
});
- jQuery._data( elem, "_change_attached", true );
+ jQuery._data( elem, "changeBubbles", true );
}
});
},
@@ -3483,12 +5599,12 @@ if ( !jQuery.support.focusinBubbles ) {
jQuery.fn.extend({
on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
- var origFn, type;
+ var type, origFn;
// Types can be a map of types/handlers
if ( typeof types === "object" ) {
// ( types-Object, selector, data )
- if ( typeof selector !== "string" ) { // && selector != null
+ if ( typeof selector !== "string" ) {
// ( types-Object, data )
data = data || selector;
selector = undefined;
@@ -3570,1790 +5686,20 @@ jQuery.fn.extend({
});
},
- bind: function( types, data, fn ) {
- return this.on( types, null, data, fn );
- },
- unbind: function( types, fn ) {
- return this.off( types, null, fn );
- },
-
- live: function( types, data, fn ) {
- jQuery( this.context ).on( types, this.selector, data, fn );
- return this;
- },
- die: function( types, fn ) {
- jQuery( this.context ).off( types, this.selector || "**", fn );
- return this;
- },
-
- delegate: function( selector, types, data, fn ) {
- return this.on( types, selector, data, fn );
- },
- undelegate: function( selector, types, fn ) {
- // ( namespace ) or ( selector, types [, fn] )
- return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
- },
-
trigger: function( type, data ) {
return this.each(function() {
jQuery.event.trigger( type, data, this );
});
},
triggerHandler: function( type, data ) {
- if ( this[0] ) {
- return jQuery.event.trigger( type, data, this[0], true );
- }
- },
-
- toggle: function( fn ) {
- // Save reference to arguments for access in closure
- var args = arguments,
- guid = fn.guid || jQuery.guid++,
- i = 0,
- toggler = function( event ) {
- // Figure out which function to execute
- var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
- jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
-
- // Make sure that clicks stop
- event.preventDefault();
-
- // and execute the function
- return args[ lastToggle ].apply( this, arguments ) || false;
- };
-
- // link all the functions, so any of them can unbind this click handler
- toggler.guid = guid;
- while ( i < args.length ) {
- args[ i++ ].guid = guid;
- }
-
- return this.click( toggler );
- },
-
- hover: function( fnOver, fnOut ) {
- return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
- }
-});
-
-jQuery.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 contextmenu").split(" "), function( i, name ) {
-
- // Handle event binding
- jQuery.fn[ name ] = function( data, fn ) {
- if ( fn == null ) {
- fn = data;
- data = null;
+ var elem = this[0];
+ if ( elem ) {
+ return jQuery.event.trigger( type, data, elem, true );
}
-
- return arguments.length > 0 ?
- this.on( name, null, data, fn ) :
- this.trigger( name );
- };
-
- if ( rkeyEvent.test( name ) ) {
- jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
- }
-
- if ( rmouseEvent.test( name ) ) {
- jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
}
});
-/*!
- * Sizzle CSS Selector Engine
- * Copyright 2012 jQuery Foundation and other contributors
- * Released under the MIT license
- * http://sizzlejs.com/
- */
-(function( window, undefined ) {
-
-var cachedruns,
- assertGetIdNotName,
- Expr,
- getText,
- isXML,
- contains,
- compile,
- sortOrder,
- hasDuplicate,
- outermostContext,
-
- baseHasDuplicate = true,
- strundefined = "undefined",
-
- expando = ( "sizcache" + Math.random() ).replace( ".", "" ),
-
- Token = String,
- document = window.document,
- docElem = document.documentElement,
- dirruns = 0,
- done = 0,
- pop = [].pop,
- push = [].push,
- slice = [].slice,
- // Use a stripped-down indexOf if a native one is unavailable
- indexOf = [].indexOf || function( elem ) {
- var i = 0,
- len = this.length;
- for ( ; i < len; i++ ) {
- if ( this[i] === elem ) {
- return i;
- }
- }
- return -1;
- },
-
- // Augment a function for special use by Sizzle
- markFunction = function( fn, value ) {
- fn[ expando ] = value == null || value;
- return fn;
- },
-
- createCache = function() {
- var cache = {},
- keys = [];
-
- return markFunction(function( key, value ) {
- // Only keep the most recent entries
- if ( keys.push( key ) > Expr.cacheLength ) {
- delete cache[ keys.shift() ];
- }
-
- // Retrieve with (key + " ") to avoid collision with native Object.prototype properties (see Issue #157)
- return (cache[ key + " " ] = value);
- }, cache );
- },
-
- classCache = createCache(),
- tokenCache = createCache(),
- compilerCache = createCache(),
-
- // Regex
-
- // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
- whitespace = "[\\x20\\t\\r\\n\\f]",
- // http://www.w3.org/TR/css3-syntax/#characters
- characterEncoding = "(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",
-
- // Loosely modeled on CSS identifier characters
- // An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors)
- // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
- identifier = characterEncoding.replace( "w", "w#" ),
-
- // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
- operators = "([*^$|!~]?=)",
- attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
- "*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
-
- // Prefer arguments not in parens/brackets,
- // then attribute selectors and non-pseudos (denoted by :),
- // then anything else
- // These preferences are here to reduce the number of selectors
- // needing tokenize in the PSEUDO preFilter
- pseudos = ":(" + characterEncoding + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:" + attributes + ")|[^:]|\\\\.)*|.*))\\)|)",
-
- // For matchExpr.POS and matchExpr.needsContext
- pos = ":(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
- "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)",
-
- // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
- rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
-
- rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
- rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),
- rpseudo = new RegExp( pseudos ),
-
- // Easily-parseable/retrievable ID or TAG or CLASS selectors
- rquickExpr = /^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,
-
- rnot = /^:not/,
- rsibling = /[\x20\t\r\n\f]*[+~]/,
- rendsWithNot = /:not\($/,
-
- rheader = /h\d/i,
- rinputs = /input|select|textarea|button/i,
-
- rbackslash = /\\(?!\\)/g,
-
- matchExpr = {
- "ID": new RegExp( "^#(" + characterEncoding + ")" ),
- "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
- "NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),
- "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
- "ATTR": new RegExp( "^" + attributes ),
- "PSEUDO": new RegExp( "^" + pseudos ),
- "POS": new RegExp( pos, "i" ),
- "CHILD": new RegExp( "^:(only|nth|first|last)-child(?:\\(" + whitespace +
- "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
- "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
- // For use in libraries implementing .is()
- "needsContext": new RegExp( "^" + whitespace + "*[>+~]|" + pos, "i" )
- },
-
- // Support
-
- // Used for testing something on an element
- assert = function( fn ) {
- var div = document.createElement("div");
-
- try {
- return fn( div );
- } catch (e) {
- return false;
- } finally {
- // release memory in IE
- div = null;
- }
- },
-
- // Check if getElementsByTagName("*") returns only elements
- assertTagNameNoComments = assert(function( div ) {
- div.appendChild( document.createComment("") );
- return !div.getElementsByTagName("*").length;
- }),
-
- // Check if getAttribute returns normalized href attributes
- assertHrefNotNormalized = assert(function( div ) {
- div.innerHTML = "<a href='#'></a>";
- return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&
- div.firstChild.getAttribute("href") === "#";
- }),
-
- // Check if attributes should be retrieved by attribute nodes
- assertAttributes = assert(function( div ) {
- div.innerHTML = "<select></select>";
- var type = typeof div.lastChild.getAttribute("multiple");
- // IE8 returns a string for some attributes even when not present
- return type !== "boolean" && type !== "string";
- }),
-
- // Check if getElementsByClassName can be trusted
- assertUsableClassName = assert(function( div ) {
- // Opera can't find a second classname (in 9.6)
- div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";
- if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) {
- return false;
- }
-
- // Safari 3.2 caches class attributes and doesn't catch changes
- div.lastChild.className = "e";
- return div.getElementsByClassName("e").length === 2;
- }),
-
- // Check if getElementById returns elements by name
- // Check if getElementsByName privileges form controls or returns elements by ID
- assertUsableName = assert(function( div ) {
- // Inject content
- div.id = expando + 0;
- div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";
- docElem.insertBefore( div, docElem.firstChild );
-
- // Test
- var pass = document.getElementsByName &&
- // buggy browsers will return fewer than the correct 2
- document.getElementsByName( expando ).length === 2 +
- // buggy browsers will return more than the correct 0
- document.getElementsByName( expando + 0 ).length;
- assertGetIdNotName = !document.getElementById( expando );
-
- // Cleanup
- docElem.removeChild( div );
-
- return pass;
- });
-
-// If slice is not available, provide a backup
-try {
- slice.call( docElem.childNodes, 0 )[0].nodeType;
-} catch ( e ) {
- slice = function( i ) {
- var elem,
- results = [];
- for ( ; (elem = this[i]); i++ ) {
- results.push( elem );
- }
- return results;
- };
-}
-
-function Sizzle( selector, context, results, seed ) {
- results = results || [];
- context = context || document;
- var match, elem, xml, m,
- nodeType = context.nodeType;
-
- if ( !selector || typeof selector !== "string" ) {
- return results;
- }
-
- if ( nodeType !== 1 && nodeType !== 9 ) {
- return [];
- }
-
- xml = isXML( context );
-
- if ( !xml && !seed ) {
- if ( (match = rquickExpr.exec( selector )) ) {
- // Speed-up: Sizzle("#ID")
- if ( (m = match[1]) ) {
- if ( nodeType === 9 ) {
- elem = context.getElementById( m );
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- if ( elem && elem.parentNode ) {
- // Handle the case where IE, Opera, and Webkit return items
- // by name instead of ID
- if ( elem.id === m ) {
- results.push( elem );
- return results;
- }
- } else {
- return results;
- }
- } else {
- // Context is not a document
- if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
- contains( context, elem ) && elem.id === m ) {
- results.push( elem );
- return results;
- }
- }
-
- // Speed-up: Sizzle("TAG")
- } else if ( match[2] ) {
- push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );
- return results;
-
- // Speed-up: Sizzle(".CLASS")
- } else if ( (m = match[3]) && assertUsableClassName && context.getElementsByClassName ) {
- push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );
- return results;
- }
- }
- }
-
- // All others
- return select( selector.replace( rtrim, "$1" ), context, results, seed, xml );
-}
-
-Sizzle.matches = function( expr, elements ) {
- return Sizzle( expr, null, null, elements );
-};
-
-Sizzle.matchesSelector = function( elem, expr ) {
- return Sizzle( expr, null, null, [ elem ] ).length > 0;
-};
-
-// Returns a function to use in pseudos for input types
-function createInputPseudo( type ) {
- return function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return name === "input" && elem.type === type;
- };
-}
-
-// Returns a function to use in pseudos for buttons
-function createButtonPseudo( type ) {
- return function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return (name === "input" || name === "button") && elem.type === type;
- };
-}
-
-// Returns a function to use in pseudos for positionals
-function createPositionalPseudo( fn ) {
- return markFunction(function( argument ) {
- argument = +argument;
- return markFunction(function( seed, matches ) {
- var j,
- matchIndexes = fn( [], seed.length, argument ),
- i = matchIndexes.length;
-
- // Match elements found at the specified indexes
- while ( i-- ) {
- if ( seed[ (j = matchIndexes[i]) ] ) {
- seed[j] = !(matches[j] = seed[j]);
- }
- }
- });
- });
-}
-
-/**
- * Utility function for retrieving the text value of an array of DOM nodes
- * @param {Array|Element} elem
- */
-getText = Sizzle.getText = function( elem ) {
- var node,
- ret = "",
- i = 0,
- nodeType = elem.nodeType;
-
- if ( nodeType ) {
- if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
- // Use textContent for elements
- // innerText usage removed for consistency of new lines (see #11153)
- if ( typeof elem.textContent === "string" ) {
- return elem.textContent;
- } else {
- // Traverse its children
- for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
- ret += getText( elem );
- }
- }
- } else if ( nodeType === 3 || nodeType === 4 ) {
- return elem.nodeValue;
- }
- // Do not include comment or processing instruction nodes
- } else {
-
- // If no nodeType, this is expected to be an array
- for ( ; (node = elem[i]); i++ ) {
- // Do not traverse comment nodes
- ret += getText( node );
- }
- }
- return ret;
-};
-
-isXML = Sizzle.isXML = function( elem ) {
- // documentElement is verified for cases where it doesn't yet exist
- // (such as loading iframes in IE - #4833)
- var documentElement = elem && (elem.ownerDocument || elem).documentElement;
- return documentElement ? documentElement.nodeName !== "HTML" : false;
-};
-
-// Element contains another
-contains = Sizzle.contains = docElem.contains ?
- function( a, b ) {
- var adown = a.nodeType === 9 ? a.documentElement : a,
- bup = b && b.parentNode;
- return a === bup || !!( bup && bup.nodeType === 1 && adown.contains && adown.contains(bup) );
- } :
- docElem.compareDocumentPosition ?
- function( a, b ) {
- return b && !!( a.compareDocumentPosition( b ) & 16 );
- } :
- function( a, b ) {
- while ( (b = b.parentNode) ) {
- if ( b === a ) {
- return true;
- }
- }
- return false;
- };
-
-Sizzle.attr = function( elem, name ) {
- var val,
- xml = isXML( elem );
-
- if ( !xml ) {
- name = name.toLowerCase();
- }
- if ( (val = Expr.attrHandle[ name ]) ) {
- return val( elem );
- }
- if ( xml || assertAttributes ) {
- return elem.getAttribute( name );
- }
- val = elem.getAttributeNode( name );
- return val ?
- typeof elem[ name ] === "boolean" ?
- elem[ name ] ? name : null :
- val.specified ? val.value : null :
- null;
-};
-
-Expr = Sizzle.selectors = {
-
- // Can be adjusted by the user
- cacheLength: 50,
-
- createPseudo: markFunction,
-
- match: matchExpr,
-
- // IE6/7 return a modified href
- attrHandle: assertHrefNotNormalized ?
- {} :
- {
- "href": function( elem ) {
- return elem.getAttribute( "href", 2 );
- },
- "type": function( elem ) {
- return elem.getAttribute("type");
- }
- },
-
- find: {
- "ID": assertGetIdNotName ?
- function( id, context, xml ) {
- if ( typeof context.getElementById !== strundefined && !xml ) {
- var m = context.getElementById( id );
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- return m && m.parentNode ? [m] : [];
- }
- } :
- function( id, context, xml ) {
- if ( typeof context.getElementById !== strundefined && !xml ) {
- var m = context.getElementById( id );
-
- return m ?
- m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?
- [m] :
- undefined :
- [];
- }
- },
-
- "TAG": assertTagNameNoComments ?
- function( tag, context ) {
- if ( typeof context.getElementsByTagName !== strundefined ) {
- return context.getElementsByTagName( tag );
- }
- } :
- function( tag, context ) {
- var results = context.getElementsByTagName( tag );
-
- // Filter out possible comments
- if ( tag === "*" ) {
- var elem,
- tmp = [],
- i = 0;
-
- for ( ; (elem = results[i]); i++ ) {
- if ( elem.nodeType === 1 ) {
- tmp.push( elem );
- }
- }
-
- return tmp;
- }
- return results;
- },
-
- "NAME": assertUsableName && function( tag, context ) {
- if ( typeof context.getElementsByName !== strundefined ) {
- return context.getElementsByName( name );
- }
- },
-
- "CLASS": assertUsableClassName && function( className, context, xml ) {
- if ( typeof context.getElementsByClassName !== strundefined && !xml ) {
- return context.getElementsByClassName( className );
- }
- }
- },
-
- relative: {
- ">": { dir: "parentNode", first: true },
- " ": { dir: "parentNode" },
- "+": { dir: "previousSibling", first: true },
- "~": { dir: "previousSibling" }
- },
-
- preFilter: {
- "ATTR": function( match ) {
- match[1] = match[1].replace( rbackslash, "" );
-
- // Move the given value to match[3] whether quoted or unquoted
- match[3] = ( match[4] || match[5] || "" ).replace( rbackslash, "" );
-
- if ( match[2] === "~=" ) {
- match[3] = " " + match[3] + " ";
- }
-
- return match.slice( 0, 4 );
- },
-
- "CHILD": function( match ) {
- /* matches from matchExpr["CHILD"]
- 1 type (only|nth|...)
- 2 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
- 3 xn-component of xn+y argument ([+-]?\d*n|)
- 4 sign of xn-component
- 5 x of xn-component
- 6 sign of y-component
- 7 y of y-component
- */
- match[1] = match[1].toLowerCase();
-
- if ( match[1] === "nth" ) {
- // nth-child requires argument
- if ( !match[2] ) {
- Sizzle.error( match[0] );
- }
-
- // numeric x and y parameters for Expr.filter.CHILD
- // remember that false/true cast respectively to 0/1
- match[3] = +( match[3] ? match[4] + (match[5] || 1) : 2 * ( match[2] === "even" || match[2] === "odd" ) );
- match[4] = +( ( match[6] + match[7] ) || match[2] === "odd" );
-
- // other types prohibit arguments
- } else if ( match[2] ) {
- Sizzle.error( match[0] );
- }
-
- return match;
- },
-
- "PSEUDO": function( match ) {
- var unquoted, excess;
- if ( matchExpr["CHILD"].test( match[0] ) ) {
- return null;
- }
-
- if ( match[3] ) {
- match[2] = match[3];
- } else if ( (unquoted = match[4]) ) {
- // Only check arguments that contain a pseudo
- if ( rpseudo.test(unquoted) &&
- // Get excess from tokenize (recursively)
- (excess = tokenize( unquoted, true )) &&
- // advance to the next closing parenthesis
- (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
-
- // excess is a negative index
- unquoted = unquoted.slice( 0, excess );
- match[0] = match[0].slice( 0, excess );
- }
- match[2] = unquoted;
- }
-
- // Return only captures needed by the pseudo filter method (type and argument)
- return match.slice( 0, 3 );
- }
- },
-
- filter: {
- "ID": assertGetIdNotName ?
- function( id ) {
- id = id.replace( rbackslash, "" );
- return function( elem ) {
- return elem.getAttribute("id") === id;
- };
- } :
- function( id ) {
- id = id.replace( rbackslash, "" );
- return function( elem ) {
- var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
- return node && node.value === id;
- };
- },
-
- "TAG": function( nodeName ) {
- if ( nodeName === "*" ) {
- return function() { return true; };
- }
- nodeName = nodeName.replace( rbackslash, "" ).toLowerCase();
-
- return function( elem ) {
- return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
- };
- },
-
- "CLASS": function( className ) {
- var pattern = classCache[ expando ][ className + " " ];
-
- return pattern ||
- (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
- classCache( className, function( elem ) {
- return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );
- });
- },
-
- "ATTR": function( name, operator, check ) {
- return function( elem, context ) {
- var result = Sizzle.attr( elem, name );
-
- if ( result == null ) {
- return operator === "!=";
- }
- if ( !operator ) {
- return true;
- }
-
- result += "";
-
- return operator === "=" ? result === check :
- operator === "!=" ? result !== check :
- operator === "^=" ? check && result.indexOf( check ) === 0 :
- operator === "*=" ? check && result.indexOf( check ) > -1 :
- operator === "$=" ? check && result.substr( result.length - check.length ) === check :
- operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
- operator === "|=" ? result === check || result.substr( 0, check.length + 1 ) === check + "-" :
- false;
- };
- },
-
- "CHILD": function( type, argument, first, last ) {
-
- if ( type === "nth" ) {
- return function( elem ) {
- var node, diff,
- parent = elem.parentNode;
-
- if ( first === 1 && last === 0 ) {
- return true;
- }
-
- if ( parent ) {
- diff = 0;
- for ( node = parent.firstChild; node; node = node.nextSibling ) {
- if ( node.nodeType === 1 ) {
- diff++;
- if ( elem === node ) {
- break;
- }
- }
- }
- }
-
- // Incorporate the offset (or cast to NaN), then check against cycle size
- diff -= last;
- return diff === first || ( diff % first === 0 && diff / first >= 0 );
- };
- }
-
- return function( elem ) {
- var node = elem;
-
- switch ( type ) {
- case "only":
- case "first":
- while ( (node = node.previousSibling) ) {
- if ( node.nodeType === 1 ) {
- return false;
- }
- }
-
- if ( type === "first" ) {
- return true;
- }
-
- node = elem;
-
- /* falls through */
- case "last":
- while ( (node = node.nextSibling) ) {
- if ( node.nodeType === 1 ) {
- return false;
- }
- }
-
- return true;
- }
- };
- },
-
- "PSEUDO": function( pseudo, argument ) {
- // pseudo-class names are case-insensitive
- // http://www.w3.org/TR/selectors/#pseudo-classes
- // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
- // Remember that setFilters inherits from pseudos
- var args,
- fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
- Sizzle.error( "unsupported pseudo: " + pseudo );
-
- // The user may use createPseudo to indicate that
- // arguments are needed to create the filter function
- // just as Sizzle does
- if ( fn[ expando ] ) {
- return fn( argument );
- }
-
- // But maintain support for old signatures
- if ( fn.length > 1 ) {
- args = [ pseudo, pseudo, "", argument ];
- return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
- markFunction(function( seed, matches ) {
- var idx,
- matched = fn( seed, argument ),
- i = matched.length;
- while ( i-- ) {
- idx = indexOf.call( seed, matched[i] );
- seed[ idx ] = !( matches[ idx ] = matched[i] );
- }
- }) :
- function( elem ) {
- return fn( elem, 0, args );
- };
- }
-
- return fn;
- }
- },
-
- pseudos: {
- "not": markFunction(function( selector ) {
- // Trim the selector passed to compile
- // to avoid treating leading and trailing
- // spaces as combinators
- var input = [],
- results = [],
- matcher = compile( selector.replace( rtrim, "$1" ) );
-
- return matcher[ expando ] ?
- markFunction(function( seed, matches, context, xml ) {
- var elem,
- unmatched = matcher( seed, null, xml, [] ),
- i = seed.length;
-
- // Match elements unmatched by `matcher`
- while ( i-- ) {
- if ( (elem = unmatched[i]) ) {
- seed[i] = !(matches[i] = elem);
- }
- }
- }) :
- function( elem, context, xml ) {
- input[0] = elem;
- matcher( input, null, xml, results );
- return !results.pop();
- };
- }),
-
- "has": markFunction(function( selector ) {
- return function( elem ) {
- return Sizzle( selector, elem ).length > 0;
- };
- }),
-
- "contains": markFunction(function( text ) {
- return function( elem ) {
- return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
- };
- }),
-
- "enabled": function( elem ) {
- return elem.disabled === false;
- },
-
- "disabled": function( elem ) {
- return elem.disabled === true;
- },
-
- "checked": function( elem ) {
- // In CSS3, :checked should return both checked and selected elements
- // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
- var nodeName = elem.nodeName.toLowerCase();
- return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
- },
-
- "selected": function( elem ) {
- // Accessing this property makes selected-by-default
- // options in Safari work properly
- if ( elem.parentNode ) {
- elem.parentNode.selectedIndex;
- }
-
- return elem.selected === true;
- },
-
- "parent": function( elem ) {
- return !Expr.pseudos["empty"]( elem );
- },
-
- "empty": function( elem ) {
- // http://www.w3.org/TR/selectors/#empty-pseudo
- // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
- // not comment, processing instructions, or others
- // Thanks to Diego Perini for the nodeName shortcut
- // Greater than "@" means alpha characters (specifically not starting with "#" or "?")
- var nodeType;
- elem = elem.firstChild;
- while ( elem ) {
- if ( elem.nodeName > "@" || (nodeType = elem.nodeType) === 3 || nodeType === 4 ) {
- return false;
- }
- elem = elem.nextSibling;
- }
- return true;
- },
-
- "header": function( elem ) {
- return rheader.test( elem.nodeName );
- },
-
- "text": function( elem ) {
- var type, attr;
- // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
- // use getAttribute instead to test this case
- return elem.nodeName.toLowerCase() === "input" &&
- (type = elem.type) === "text" &&
- ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === type );
- },
-
- // Input types
- "radio": createInputPseudo("radio"),
- "checkbox": createInputPseudo("checkbox"),
- "file": createInputPseudo("file"),
- "password": createInputPseudo("password"),
- "image": createInputPseudo("image"),
-
- "submit": createButtonPseudo("submit"),
- "reset": createButtonPseudo("reset"),
-
- "button": function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return name === "input" && elem.type === "button" || name === "button";
- },
-
- "input": function( elem ) {
- return rinputs.test( elem.nodeName );
- },
-
- "focus": function( elem ) {
- var doc = elem.ownerDocument;
- return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
- },
-
- "active": function( elem ) {
- return elem === elem.ownerDocument.activeElement;
- },
-
- // Positional types
- "first": createPositionalPseudo(function() {
- return [ 0 ];
- }),
-
- "last": createPositionalPseudo(function( matchIndexes, length ) {
- return [ length - 1 ];
- }),
-
- "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
- return [ argument < 0 ? argument + length : argument ];
- }),
-
- "even": createPositionalPseudo(function( matchIndexes, length ) {
- for ( var i = 0; i < length; i += 2 ) {
- matchIndexes.push( i );
- }
- return matchIndexes;
- }),
-
- "odd": createPositionalPseudo(function( matchIndexes, length ) {
- for ( var i = 1; i < length; i += 2 ) {
- matchIndexes.push( i );
- }
- return matchIndexes;
- }),
-
- "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
- for ( var i = argument < 0 ? argument + length : argument; --i >= 0; ) {
- matchIndexes.push( i );
- }
- return matchIndexes;
- }),
-
- "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
- for ( var i = argument < 0 ? argument + length : argument; ++i < length; ) {
- matchIndexes.push( i );
- }
- return matchIndexes;
- })
- }
-};
-
-function siblingCheck( a, b, ret ) {
- if ( a === b ) {
- return ret;
- }
-
- var cur = a.nextSibling;
-
- while ( cur ) {
- if ( cur === b ) {
- return -1;
- }
-
- cur = cur.nextSibling;
- }
-
- return 1;
-}
-
-sortOrder = docElem.compareDocumentPosition ?
- function( a, b ) {
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
- }
-
- return ( !a.compareDocumentPosition || !b.compareDocumentPosition ?
- a.compareDocumentPosition :
- a.compareDocumentPosition(b) & 4
- ) ? -1 : 1;
- } :
- function( a, b ) {
- // The nodes are identical, we can exit early
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
-
- // Fallback to using sourceIndex (in IE) if it's available on both nodes
- } else if ( a.sourceIndex && b.sourceIndex ) {
- return a.sourceIndex - b.sourceIndex;
- }
-
- var al, bl,
- ap = [],
- bp = [],
- aup = a.parentNode,
- bup = b.parentNode,
- cur = aup;
-
- // If the nodes are siblings (or identical) we can do a quick check
- if ( aup === bup ) {
- return siblingCheck( a, b );
-
- // If no parents were found then the nodes are disconnected
- } else if ( !aup ) {
- return -1;
-
- } else if ( !bup ) {
- return 1;
- }
-
- // Otherwise they're somewhere else in the tree so we need
- // to build up a full list of the parentNodes for comparison
- while ( cur ) {
- ap.unshift( cur );
- cur = cur.parentNode;
- }
-
- cur = bup;
-
- while ( cur ) {
- bp.unshift( cur );
- cur = cur.parentNode;
- }
-
- al = ap.length;
- bl = bp.length;
-
- // Start walking down the tree looking for a discrepancy
- for ( var i = 0; i < al && i < bl; i++ ) {
- if ( ap[i] !== bp[i] ) {
- return siblingCheck( ap[i], bp[i] );
- }
- }
-
- // We ended someplace up the tree so do a sibling check
- return i === al ?
- siblingCheck( a, bp[i], -1 ) :
- siblingCheck( ap[i], b, 1 );
- };
-
-// Always assume the presence of duplicates if sort doesn't
-// pass them to our comparison function (as in Google Chrome).
-[0, 0].sort( sortOrder );
-baseHasDuplicate = !hasDuplicate;
-
-// Document sorting and removing duplicates
-Sizzle.uniqueSort = function( results ) {
- var elem,
- duplicates = [],
- i = 1,
- j = 0;
-
- hasDuplicate = baseHasDuplicate;
- results.sort( sortOrder );
-
- if ( hasDuplicate ) {
- for ( ; (elem = results[i]); i++ ) {
- if ( elem === results[ i - 1 ] ) {
- j = duplicates.push( i );
- }
- }
- while ( j-- ) {
- results.splice( duplicates[ j ], 1 );
- }
- }
-
- return results;
-};
-
-Sizzle.error = function( msg ) {
- throw new Error( "Syntax error, unrecognized expression: " + msg );
-};
-
-function tokenize( selector, parseOnly ) {
- var matched, match, tokens, type,
- soFar, groups, preFilters,
- cached = tokenCache[ expando ][ selector + " " ];
-
- if ( cached ) {
- return parseOnly ? 0 : cached.slice( 0 );
- }
-
- soFar = selector;
- groups = [];
- preFilters = Expr.preFilter;
-
- while ( soFar ) {
-
- // Comma and first run
- if ( !matched || (match = rcomma.exec( soFar )) ) {
- if ( match ) {
- // Don't consume trailing commas as valid
- soFar = soFar.slice( match[0].length ) || soFar;
- }
- groups.push( tokens = [] );
- }
-
- matched = false;
-
- // Combinators
- if ( (match = rcombinators.exec( soFar )) ) {
- tokens.push( matched = new Token( match.shift() ) );
- soFar = soFar.slice( matched.length );
-
- // Cast descendant combinators to space
- matched.type = match[0].replace( rtrim, " " );
- }
-
- // Filters
- for ( type in Expr.filter ) {
- if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
- (match = preFilters[ type ]( match ))) ) {
-
- tokens.push( matched = new Token( match.shift() ) );
- soFar = soFar.slice( matched.length );
- matched.type = type;
- matched.matches = match;
- }
- }
-
- if ( !matched ) {
- break;
- }
- }
-
- // Return the length of the invalid excess
- // if we're just parsing
- // Otherwise, throw an error or return tokens
- return parseOnly ?
- soFar.length :
- soFar ?
- Sizzle.error( selector ) :
- // Cache the tokens
- tokenCache( selector, groups ).slice( 0 );
-}
-
-function addCombinator( matcher, combinator, base ) {
- var dir = combinator.dir,
- checkNonElements = base && combinator.dir === "parentNode",
- doneName = done++;
-
- return combinator.first ?
- // Check against closest ancestor/preceding element
- function( elem, context, xml ) {
- while ( (elem = elem[ dir ]) ) {
- if ( checkNonElements || elem.nodeType === 1 ) {
- return matcher( elem, context, xml );
- }
- }
- } :
-
- // Check against all ancestor/preceding elements
- function( elem, context, xml ) {
- // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
- if ( !xml ) {
- var cache,
- dirkey = dirruns + " " + doneName + " ",
- cachedkey = dirkey + cachedruns;
- while ( (elem = elem[ dir ]) ) {
- if ( checkNonElements || elem.nodeType === 1 ) {
- if ( (cache = elem[ expando ]) === cachedkey ) {
- return elem.sizset;
- } else if ( typeof cache === "string" && cache.indexOf(dirkey) === 0 ) {
- if ( elem.sizset ) {
- return elem;
- }
- } else {
- elem[ expando ] = cachedkey;
- if ( matcher( elem, context, xml ) ) {
- elem.sizset = true;
- return elem;
- }
- elem.sizset = false;
- }
- }
- }
- } else {
- while ( (elem = elem[ dir ]) ) {
- if ( checkNonElements || elem.nodeType === 1 ) {
- if ( matcher( elem, context, xml ) ) {
- return elem;
- }
- }
- }
- }
- };
-}
-
-function elementMatcher( matchers ) {
- return matchers.length > 1 ?
- function( elem, context, xml ) {
- var i = matchers.length;
- while ( i-- ) {
- if ( !matchers[i]( elem, context, xml ) ) {
- return false;
- }
- }
- return true;
- } :
- matchers[0];
-}
-
-function condense( unmatched, map, filter, context, xml ) {
- var elem,
- newUnmatched = [],
- i = 0,
- len = unmatched.length,
- mapped = map != null;
-
- for ( ; i < len; i++ ) {
- if ( (elem = unmatched[i]) ) {
- if ( !filter || filter( elem, context, xml ) ) {
- newUnmatched.push( elem );
- if ( mapped ) {
- map.push( i );
- }
- }
- }
- }
-
- return newUnmatched;
-}
-
-function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
- if ( postFilter && !postFilter[ expando ] ) {
- postFilter = setMatcher( postFilter );
- }
- if ( postFinder && !postFinder[ expando ] ) {
- postFinder = setMatcher( postFinder, postSelector );
- }
- return markFunction(function( seed, results, context, xml ) {
- var temp, i, elem,
- preMap = [],
- postMap = [],
- preexisting = results.length,
-
- // Get initial elements from seed or context
- elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
-
- // Prefilter to get matcher input, preserving a map for seed-results synchronization
- matcherIn = preFilter && ( seed || !selector ) ?
- condense( elems, preMap, preFilter, context, xml ) :
- elems,
-
- matcherOut = matcher ?
- // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
- postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
-
- // ...intermediate processing is necessary
- [] :
-
- // ...otherwise use results directly
- results :
- matcherIn;
-
- // Find primary matches
- if ( matcher ) {
- matcher( matcherIn, matcherOut, context, xml );
- }
-
- // Apply postFilter
- if ( postFilter ) {
- temp = condense( matcherOut, postMap );
- postFilter( temp, [], context, xml );
-
- // Un-match failing elements by moving them back to matcherIn
- i = temp.length;
- while ( i-- ) {
- if ( (elem = temp[i]) ) {
- matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
- }
- }
- }
-
- if ( seed ) {
- if ( postFinder || preFilter ) {
- if ( postFinder ) {
- // Get the final matcherOut by condensing this intermediate into postFinder contexts
- temp = [];
- i = matcherOut.length;
- while ( i-- ) {
- if ( (elem = matcherOut[i]) ) {
- // Restore matcherIn since elem is not yet a final match
- temp.push( (matcherIn[i] = elem) );
- }
- }
- postFinder( null, (matcherOut = []), temp, xml );
- }
-
- // Move matched elements from seed to results to keep them synchronized
- i = matcherOut.length;
- while ( i-- ) {
- if ( (elem = matcherOut[i]) &&
- (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
-
- seed[temp] = !(results[temp] = elem);
- }
- }
- }
-
- // Add elements to results, through postFinder if defined
- } else {
- matcherOut = condense(
- matcherOut === results ?
- matcherOut.splice( preexisting, matcherOut.length ) :
- matcherOut
- );
- if ( postFinder ) {
- postFinder( null, results, matcherOut, xml );
- } else {
- push.apply( results, matcherOut );
- }
- }
- });
-}
-
-function matcherFromTokens( tokens ) {
- var checkContext, matcher, j,
- len = tokens.length,
- leadingRelative = Expr.relative[ tokens[0].type ],
- implicitRelative = leadingRelative || Expr.relative[" "],
- i = leadingRelative ? 1 : 0,
-
- // The foundational matcher ensures that elements are reachable from top-level context(s)
- matchContext = addCombinator( function( elem ) {
- return elem === checkContext;
- }, implicitRelative, true ),
- matchAnyContext = addCombinator( function( elem ) {
- return indexOf.call( checkContext, elem ) > -1;
- }, implicitRelative, true ),
- matchers = [ function( elem, context, xml ) {
- return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
- (checkContext = context).nodeType ?
- matchContext( elem, context, xml ) :
- matchAnyContext( elem, context, xml ) );
- } ];
-
- for ( ; i < len; i++ ) {
- if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
- matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
- } else {
- matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
-
- // Return special upon seeing a positional matcher
- if ( matcher[ expando ] ) {
- // Find the next relative operator (if any) for proper handling
- j = ++i;
- for ( ; j < len; j++ ) {
- if ( Expr.relative[ tokens[j].type ] ) {
- break;
- }
- }
- return setMatcher(
- i > 1 && elementMatcher( matchers ),
- i > 1 && tokens.slice( 0, i - 1 ).join("").replace( rtrim, "$1" ),
- matcher,
- i < j && matcherFromTokens( tokens.slice( i, j ) ),
- j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
- j < len && tokens.join("")
- );
- }
- matchers.push( matcher );
- }
- }
-
- return elementMatcher( matchers );
-}
-
-function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
- var bySet = setMatchers.length > 0,
- byElement = elementMatchers.length > 0,
- superMatcher = function( seed, context, xml, results, expandContext ) {
- var elem, j, matcher,
- setMatched = [],
- matchedCount = 0,
- i = "0",
- unmatched = seed && [],
- outermost = expandContext != null,
- contextBackup = outermostContext,
- // We must always have either seed elements or context
- elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
- // Nested matchers should use non-integer dirruns
- dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.E);
-
- if ( outermost ) {
- outermostContext = context !== document && context;
- cachedruns = superMatcher.el;
- }
-
- // Add elements passing elementMatchers directly to results
- for ( ; (elem = elems[i]) != null; i++ ) {
- if ( byElement && elem ) {
- for ( j = 0; (matcher = elementMatchers[j]); j++ ) {
- if ( matcher( elem, context, xml ) ) {
- results.push( elem );
- break;
- }
- }
- if ( outermost ) {
- dirruns = dirrunsUnique;
- cachedruns = ++superMatcher.el;
- }
- }
-
- // Track unmatched elements for set filters
- if ( bySet ) {
- // They will have gone through all possible matchers
- if ( (elem = !matcher && elem) ) {
- matchedCount--;
- }
-
- // Lengthen the array for every element, matched or not
- if ( seed ) {
- unmatched.push( elem );
- }
- }
- }
-
- // Apply set filters to unmatched elements
- matchedCount += i;
- if ( bySet && i !== matchedCount ) {
- for ( j = 0; (matcher = setMatchers[j]); j++ ) {
- matcher( unmatched, setMatched, context, xml );
- }
-
- if ( seed ) {
- // Reintegrate element matches to eliminate the need for sorting
- if ( matchedCount > 0 ) {
- while ( i-- ) {
- if ( !(unmatched[i] || setMatched[i]) ) {
- setMatched[i] = pop.call( results );
- }
- }
- }
-
- // Discard index placeholder values to get only actual matches
- setMatched = condense( setMatched );
- }
-
- // Add matches to results
- push.apply( results, setMatched );
-
- // Seedless set matches succeeding multiple successful matchers stipulate sorting
- if ( outermost && !seed && setMatched.length > 0 &&
- ( matchedCount + setMatchers.length ) > 1 ) {
-
- Sizzle.uniqueSort( results );
- }
- }
-
- // Override manipulation of globals by nested matchers
- if ( outermost ) {
- dirruns = dirrunsUnique;
- outermostContext = contextBackup;
- }
-
- return unmatched;
- };
-
- superMatcher.el = 0;
- return bySet ?
- markFunction( superMatcher ) :
- superMatcher;
-}
-
-compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
- var i,
- setMatchers = [],
- elementMatchers = [],
- cached = compilerCache[ expando ][ selector + " " ];
-
- if ( !cached ) {
- // Generate a function of recursive functions that can be used to check each element
- if ( !group ) {
- group = tokenize( selector );
- }
- i = group.length;
- while ( i-- ) {
- cached = matcherFromTokens( group[i] );
- if ( cached[ expando ] ) {
- setMatchers.push( cached );
- } else {
- elementMatchers.push( cached );
- }
- }
-
- // Cache the compiled function
- cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
- }
- return cached;
-};
-
-function multipleContexts( selector, contexts, results ) {
- var i = 0,
- len = contexts.length;
- for ( ; i < len; i++ ) {
- Sizzle( selector, contexts[i], results );
- }
- return results;
-}
-
-function select( selector, context, results, seed, xml ) {
- var i, tokens, token, type, find,
- match = tokenize( selector ),
- j = match.length;
-
- if ( !seed ) {
- // Try to minimize operations if there is only one group
- if ( match.length === 1 ) {
-
- // Take a shortcut and set the context if the root selector is an ID
- tokens = match[0] = match[0].slice( 0 );
- if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
- context.nodeType === 9 && !xml &&
- Expr.relative[ tokens[1].type ] ) {
-
- context = Expr.find["ID"]( token.matches[0].replace( rbackslash, "" ), context, xml )[0];
- if ( !context ) {
- return results;
- }
-
- selector = selector.slice( tokens.shift().length );
- }
-
- // Fetch a seed set for right-to-left matching
- for ( i = matchExpr["POS"].test( selector ) ? -1 : tokens.length - 1; i >= 0; i-- ) {
- token = tokens[i];
-
- // Abort if we hit a combinator
- if ( Expr.relative[ (type = token.type) ] ) {
- break;
- }
- if ( (find = Expr.find[ type ]) ) {
- // Search, expanding context for leading sibling combinators
- if ( (seed = find(
- token.matches[0].replace( rbackslash, "" ),
- rsibling.test( tokens[0].type ) && context.parentNode || context,
- xml
- )) ) {
-
- // If seed is empty or no tokens remain, we can return early
- tokens.splice( i, 1 );
- selector = seed.length && tokens.join("");
- if ( !selector ) {
- push.apply( results, slice.call( seed, 0 ) );
- return results;
- }
-
- break;
- }
- }
- }
- }
- }
-
- // Compile and execute a filtering function
- // Provide `match` to avoid retokenization if we modified the selector above
- compile( selector, match )(
- seed,
- context,
- xml,
- results,
- rsibling.test( selector )
- );
- return results;
-}
-
-if ( document.querySelectorAll ) {
- (function() {
- var disconnectedMatch,
- oldSelect = select,
- rescape = /'|\\/g,
- rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
-
- // qSa(:focus) reports false when true (Chrome 21), no need to also add to buggyMatches since matches checks buggyQSA
- // A support test would require too much code (would include document ready)
- rbuggyQSA = [ ":focus" ],
-
- // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
- // A support test would require too much code (would include document ready)
- // just skip matchesSelector for :active
- rbuggyMatches = [ ":active" ],
- matches = docElem.matchesSelector ||
- docElem.mozMatchesSelector ||
- docElem.webkitMatchesSelector ||
- docElem.oMatchesSelector ||
- docElem.msMatchesSelector;
-
- // Build QSA regex
- // Regex strategy adopted from Diego Perini
- assert(function( div ) {
- // Select is set to empty string on purpose
- // This is to test IE's treatment of not explictly
- // setting a boolean content attribute,
- // since its presence should be enough
- // http://bugs.jquery.com/ticket/12359
- div.innerHTML = "<select><option selected=''></option></select>";
-
- // IE8 - Some boolean attributes are not treated correctly
- if ( !div.querySelectorAll("[selected]").length ) {
- rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );
- }
-
- // Webkit/Opera - :checked should return selected option elements
- // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
- // IE8 throws error here (do not put tests after this one)
- if ( !div.querySelectorAll(":checked").length ) {
- rbuggyQSA.push(":checked");
- }
- });
-
- assert(function( div ) {
-
- // Opera 10-12/IE9 - ^= $= *= and empty values
- // Should not select anything
- div.innerHTML = "<p test=''></p>";
- if ( div.querySelectorAll("[test^='']").length ) {
- rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );
- }
-
- // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
- // IE8 throws error here (do not put tests after this one)
- div.innerHTML = "<input type='hidden'/>";
- if ( !div.querySelectorAll(":enabled").length ) {
- rbuggyQSA.push(":enabled", ":disabled");
- }
- });
-
- // rbuggyQSA always contains :focus, so no need for a length check
- rbuggyQSA = /* rbuggyQSA.length && */ new RegExp( rbuggyQSA.join("|") );
-
- select = function( selector, context, results, seed, xml ) {
- // Only use querySelectorAll when not filtering,
- // when this is not xml,
- // and when no QSA bugs apply
- if ( !seed && !xml && !rbuggyQSA.test( selector ) ) {
- var groups, i,
- old = true,
- nid = expando,
- newContext = context,
- newSelector = context.nodeType === 9 && selector;
-
- // qSA works strangely on Element-rooted queries
- // We can work around this by specifying an extra ID on the root
- // and working up from there (Thanks to Andrew Dupont for the technique)
- // IE 8 doesn't work on object elements
- if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
- groups = tokenize( selector );
-
- if ( (old = context.getAttribute("id")) ) {
- nid = old.replace( rescape, "\\$&" );
- } else {
- context.setAttribute( "id", nid );
- }
- nid = "[id='" + nid + "'] ";
-
- i = groups.length;
- while ( i-- ) {
- groups[i] = nid + groups[i].join("");
- }
- newContext = rsibling.test( selector ) && context.parentNode || context;
- newSelector = groups.join(",");
- }
-
- if ( newSelector ) {
- try {
- push.apply( results, slice.call( newContext.querySelectorAll(
- newSelector
- ), 0 ) );
- return results;
- } catch(qsaError) {
- } finally {
- if ( !old ) {
- context.removeAttribute("id");
- }
- }
- }
- }
-
- return oldSelect( selector, context, results, seed, xml );
- };
-
- if ( matches ) {
- assert(function( div ) {
- // Check to see if it's possible to do matchesSelector
- // on a disconnected node (IE 9)
- disconnectedMatch = matches.call( div, "div" );
-
- // This should fail with an exception
- // Gecko does not error, returns false instead
- try {
- matches.call( div, "[test!='']:sizzle" );
- rbuggyMatches.push( "!=", pseudos );
- } catch ( e ) {}
- });
-
- // rbuggyMatches always contains :active and :focus, so no need for a length check
- rbuggyMatches = /* rbuggyMatches.length && */ new RegExp( rbuggyMatches.join("|") );
-
- Sizzle.matchesSelector = function( elem, expr ) {
- // Make sure that attribute selectors are quoted
- expr = expr.replace( rattributeQuotes, "='$1']" );
-
- // rbuggyMatches always contains :active, so no need for an existence check
- if ( !isXML( elem ) && !rbuggyMatches.test( expr ) && !rbuggyQSA.test( expr ) ) {
- try {
- var ret = matches.call( elem, expr );
-
- // IE 9's matchesSelector returns false on disconnected nodes
- if ( ret || disconnectedMatch ||
- // As well, disconnected nodes are said to be in a document
- // fragment in IE 9
- elem.document && elem.document.nodeType !== 11 ) {
- return ret;
- }
- } catch(e) {}
- }
-
- return Sizzle( expr, null, null, [ elem ] ).length > 0;
- };
- }
- })();
-}
-
-// Deprecated
-Expr.pseudos["nth"] = Expr.pseudos["eq"];
-
-// Back-compat
-function setFilters() {}
-Expr.filters = setFilters.prototype = Expr.pseudos;
-Expr.setFilters = new setFilters();
-
-// Override sizzle attribute retrieval
-Sizzle.attr = jQuery.attr;
-jQuery.find = Sizzle;
-jQuery.expr = Sizzle.selectors;
-jQuery.expr[":"] = jQuery.expr.pseudos;
-jQuery.unique = Sizzle.uniqueSort;
-jQuery.text = Sizzle.getText;
-jQuery.isXMLDoc = Sizzle.isXML;
-jQuery.contains = Sizzle.contains;
-
-
-})( window );
-var runtil = /Until$/,
+var isSimple = /^.[^:#\[\.,]*$/,
rparentsprev = /^(?:parents|prev(?:Until|All))/,
- isSimple = /^.[^:#\[\.,]*$/,
rneedsContext = jQuery.expr.match.needsContext,
// methods guaranteed to produce a unique set when starting from a unique set
guaranteedUnique = {
@@ -5365,38 +5711,28 @@ var runtil = /Until$/,
jQuery.fn.extend({
find: function( selector ) {
- var i, l, length, n, r, ret,
- self = this;
+ var i,
+ ret = [],
+ self = this,
+ len = self.length;
if ( typeof selector !== "string" ) {
- return jQuery( selector ).filter(function() {
- for ( i = 0, l = self.length; i < l; i++ ) {
+ return this.pushStack( jQuery( selector ).filter(function() {
+ for ( i = 0; i < len; i++ ) {
if ( jQuery.contains( self[ i ], this ) ) {
return true;
}
}
- });
+ }) );
}
- ret = this.pushStack( "", "find", selector );
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- length = ret.length;
- jQuery.find( selector, this[i], ret );
-
- if ( i > 0 ) {
- // Make sure that the results are unique
- for ( n = length; n < ret.length; n++ ) {
- for ( r = 0; r < length; r++ ) {
- if ( ret[r] === ret[n] ) {
- ret.splice(n--, 1);
- break;
- }
- }
- }
- }
+ for ( i = 0; i < len; i++ ) {
+ jQuery.find( selector, self[ i ], ret );
}
+ // Needed because $( selector, context ) becomes $( context ).find( selector )
+ ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
+ ret.selector = this.selector ? this.selector + " " + selector : selector;
return ret;
},
@@ -5415,22 +5751,24 @@ jQuery.fn.extend({
},
not: function( selector ) {
- return this.pushStack( winnow(this, selector, false), "not", selector);
+ return this.pushStack( winnow(this, selector || [], true) );
},
filter: function( selector ) {
- return this.pushStack( winnow(this, selector, true), "filter", selector );
+ return this.pushStack( winnow(this, selector || [], false) );
},
is: function( selector ) {
- return !!selector && (
- typeof selector === "string" ?
- // If this is a positional/relative selector, check membership in the returned set
- // so $("p:first").is("p:last") won't return true for a doc with two "p".
- rneedsContext.test( selector ) ?
- jQuery( selector, this.context ).index( this[0] ) >= 0 :
- jQuery.filter( selector, this ).length > 0 :
- this.filter( selector ).length > 0 );
+ return !!winnow(
+ this,
+
+ // If this is a positional/relative selector, check membership in the returned set
+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
+ typeof selector === "string" && rneedsContext.test( selector ) ?
+ jQuery( selector ) :
+ selector || [],
+ false
+ ).length;
},
closest: function( selectors, context ) {
@@ -5443,20 +5781,22 @@ jQuery.fn.extend({
0;
for ( ; i < l; i++ ) {
- cur = this[i];
+ for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
+ // Always skip document fragments
+ if ( cur.nodeType < 11 && (pos ?
+ pos.index(cur) > -1 :
+
+ // Don't pass non-elements to Sizzle
+ cur.nodeType === 1 &&
+ jQuery.find.matchesSelector(cur, selectors)) ) {
- while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
- if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
- ret.push( cur );
+ cur = ret.push( cur );
break;
}
- cur = cur.parentNode;
}
}
- ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
-
- return this.pushStack( ret, "closest", selectors );
+ return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );
},
// Determine the position of an element within
@@ -5465,7 +5805,7 @@ jQuery.fn.extend({
// No argument, return index in parent
if ( !elem ) {
- return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
+ return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;
}
// index in selector
@@ -5485,9 +5825,7 @@ jQuery.fn.extend({
jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
all = jQuery.merge( this.get(), set );
- return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
- all :
- jQuery.unique( all ) );
+ return this.pushStack( jQuery.unique(all) );
},
addBack: function( selector ) {
@@ -5497,14 +5835,6 @@ jQuery.fn.extend({
}
});
-jQuery.fn.andSelf = jQuery.fn.addBack;
-
-// A painfully simple check to see if an element is disconnected
-// from a document (should be improved, where feasible).
-function isDisconnected( node ) {
- return !node || !node.parentNode || node.parentNode.nodeType === 11;
-}
-
function sibling( cur, dir ) {
do {
cur = cur[ dir ];
@@ -5557,7 +5887,7 @@ jQuery.each({
jQuery.fn[ name ] = function( until, selector ) {
var ret = jQuery.map( this, fn, until );
- if ( !runtil.test( name ) ) {
+ if ( name.slice( -5 ) !== "Until" ) {
selector = until;
}
@@ -5565,25 +5895,35 @@ jQuery.each({
ret = jQuery.filter( selector, ret );
}
- ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+ if ( this.length > 1 ) {
+ // Remove duplicates
+ if ( !guaranteedUnique[ name ] ) {
+ ret = jQuery.unique( ret );
+ }
- if ( this.length > 1 && rparentsprev.test( name ) ) {
- ret = ret.reverse();
+ // Reverse order for parents* and prev-derivatives
+ if ( rparentsprev.test( name ) ) {
+ ret = ret.reverse();
+ }
}
- return this.pushStack( ret, name, core_slice.call( arguments ).join(",") );
+ return this.pushStack( ret );
};
});
jQuery.extend({
filter: function( expr, elems, not ) {
+ var elem = elems[ 0 ];
+
if ( not ) {
expr = ":not(" + expr + ")";
}
- return elems.length === 1 ?
- jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
- jQuery.find.matches(expr, elems);
+ return elems.length === 1 && elem.nodeType === 1 ?
+ jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
+ jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+ return elem.nodeType === 1;
+ }));
},
dir: function( elem, dir, until ) {
@@ -5613,42 +5953,37 @@ jQuery.extend({
});
// Implement the identical functionality for filter and not
-function winnow( elements, qualifier, keep ) {
-
- // Can't pass null or undefined to indexOf in Firefox 4
- // Set to 0 to skip string check
- qualifier = qualifier || 0;
-
+function winnow( elements, qualifier, not ) {
if ( jQuery.isFunction( qualifier ) ) {
- return jQuery.grep(elements, function( elem, i ) {
- var retVal = !!qualifier.call( elem, i, elem );
- return retVal === keep;
+ return jQuery.grep( elements, function( elem, i ) {
+ /* jshint -W018 */
+ return !!qualifier.call( elem, i, elem ) !== not;
});
- } else if ( qualifier.nodeType ) {
- return jQuery.grep(elements, function( elem, i ) {
- return ( elem === qualifier ) === keep;
- });
+ }
- } else if ( typeof qualifier === "string" ) {
- var filtered = jQuery.grep(elements, function( elem ) {
- return elem.nodeType === 1;
+ if ( qualifier.nodeType ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( elem === qualifier ) !== not;
});
+ }
+
+ if ( typeof qualifier === "string" ) {
if ( isSimple.test( qualifier ) ) {
- return jQuery.filter(qualifier, filtered, !keep);
- } else {
- qualifier = jQuery.filter( qualifier, filtered );
+ return jQuery.filter( qualifier, elements, not );
}
+
+ qualifier = jQuery.filter( qualifier, elements );
}
- return jQuery.grep(elements, function( elem, i ) {
- return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
+ return jQuery.grep( elements, function( elem ) {
+ return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;
});
}
function createSafeFragment( document ) {
var list = nodeNames.split( "|" ),
- safeFrag = document.createDocumentFragment();
+ safeFrag = document.createDocumentFragment();
if ( safeFrag.createElement ) {
while ( list.length ) {
@@ -5663,28 +5998,34 @@ function createSafeFragment( document ) {
var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
+ rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
rleadingWhitespace = /^\s+/,
rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
rtagName = /<([\w:]+)/,
rtbody = /<tbody/i,
rhtml = /<|&#?\w+;/,
rnoInnerhtml = /<(?:script|style|link)/i,
- rnocache = /<(?:script|object|embed|option|style)/i,
- rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
- rcheckableType = /^(?:checkbox|radio)$/,
+ manipulation_rcheckableType = /^(?:checkbox|radio)$/i,
// checked="checked" or checked
rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
- rscriptType = /\/(java|ecma)script/i,
- rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,
+ rscriptType = /^$|\/(?:java|ecma)script/i,
+ rscriptTypeMasked = /^true\/(.*)/,
+ rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
+
+ // We have to close these tags to support XHTML (#13200)
wrapMap = {
option: [ 1, "<select multiple='multiple'>", "</select>" ],
legend: [ 1, "<fieldset>", "</fieldset>" ],
+ area: [ 1, "<map>", "</map>" ],
+ param: [ 1, "<object>", "</object>" ],
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, "", "" ]
+ td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+
+ // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
+ // unless wrapped in a div with non-breaking characters in front of it.
+ _default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>" ]
},
safeFragment = createSafeFragment( document ),
fragmentDiv = safeFragment.appendChild( document.createElement("div") );
@@ -5693,12 +6034,6 @@ wrapMap.optgroup = wrapMap.option;
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
wrapMap.th = wrapMap.td;
-// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
-// unless wrapped in a div with non-breaking characters in front of it.
-if ( !jQuery.support.htmlSerialize ) {
- wrapMap._default = [ 1, "X<div>", "</div>" ];
-}
-
jQuery.fn.extend({
text: function( value ) {
return jQuery.access( this, function( value ) {
@@ -5708,128 +6043,57 @@ jQuery.fn.extend({
}, null, value, arguments.length );
},
- wrapAll: function( html ) {
- if ( jQuery.isFunction( html ) ) {
- return this.each(function(i) {
- jQuery(this).wrapAll( html.call(this, i) );
- });
- }
-
- if ( this[0] ) {
- // The elements to wrap the target around
- var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
-
- if ( this[0].parentNode ) {
- wrap.insertBefore( this[0] );
- }
-
- wrap.map(function() {
- var elem = this;
-
- while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
- elem = elem.firstChild;
- }
-
- return elem;
- }).append( this );
- }
-
- return this;
- },
-
- wrapInner: function( html ) {
- if ( jQuery.isFunction( html ) ) {
- return this.each(function(i) {
- jQuery(this).wrapInner( html.call(this, i) );
- });
- }
-
- return this.each(function() {
- var self = jQuery( this ),
- contents = self.contents();
-
- if ( contents.length ) {
- contents.wrapAll( html );
-
- } else {
- self.append( html );
- }
- });
- },
-
- wrap: function( html ) {
- var isFunction = jQuery.isFunction( html );
-
- return this.each(function(i) {
- jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
- });
- },
-
- unwrap: function() {
- return this.parent().each(function() {
- if ( !jQuery.nodeName( this, "body" ) ) {
- jQuery( this ).replaceWith( this.childNodes );
- }
- }).end();
- },
-
append: function() {
- return this.domManip(arguments, true, function( elem ) {
- if ( this.nodeType === 1 || this.nodeType === 11 ) {
- this.appendChild( elem );
+ return this.domManip( arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.appendChild( elem );
}
});
},
prepend: function() {
- return this.domManip(arguments, true, function( elem ) {
- if ( this.nodeType === 1 || this.nodeType === 11 ) {
- this.insertBefore( elem, this.firstChild );
+ return this.domManip( arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.insertBefore( elem, target.firstChild );
}
});
},
before: function() {
- if ( !isDisconnected( this[0] ) ) {
- return this.domManip(arguments, false, function( elem ) {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.parentNode ) {
this.parentNode.insertBefore( elem, this );
- });
- }
-
- if ( arguments.length ) {
- var set = jQuery.clean( arguments );
- return this.pushStack( jQuery.merge( set, this ), "before", this.selector );
- }
+ }
+ });
},
after: function() {
- if ( !isDisconnected( this[0] ) ) {
- return this.domManip(arguments, false, function( elem ) {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.parentNode ) {
this.parentNode.insertBefore( elem, this.nextSibling );
- });
- }
-
- if ( arguments.length ) {
- var set = jQuery.clean( arguments );
- return this.pushStack( jQuery.merge( this, set ), "after", this.selector );
- }
+ }
+ });
},
// keepData is for internal use only--do not document
remove: function( selector, keepData ) {
var elem,
+ elems = selector ? jQuery.filter( selector, this ) : this,
i = 0;
- for ( ; (elem = this[i]) != null; i++ ) {
- if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
- if ( !keepData && elem.nodeType === 1 ) {
- jQuery.cleanData( elem.getElementsByTagName("*") );
- jQuery.cleanData( [ elem ] );
- }
+ for ( ; (elem = elems[i]) != null; i++ ) {
+
+ if ( !keepData && elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem ) );
+ }
- if ( elem.parentNode ) {
- elem.parentNode.removeChild( elem );
+ if ( elem.parentNode ) {
+ if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
+ setGlobalEval( getAll( elem, "script" ) );
}
+ elem.parentNode.removeChild( elem );
}
}
@@ -5843,13 +6107,19 @@ jQuery.fn.extend({
for ( ; (elem = this[i]) != null; i++ ) {
// Remove element nodes and prevent memory leaks
if ( elem.nodeType === 1 ) {
- jQuery.cleanData( elem.getElementsByTagName("*") );
+ jQuery.cleanData( getAll( elem, false ) );
}
// Remove any remaining nodes
while ( elem.firstChild ) {
elem.removeChild( elem.firstChild );
}
+
+ // If this is a select, ensure that it displays empty (#12336)
+ // Support: IE<9
+ if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
+ elem.options.length = 0;
+ }
}
return this;
@@ -5889,7 +6159,7 @@ jQuery.fn.extend({
// Remove element nodes and prevent memory leaks
elem = this[i] || {};
if ( elem.nodeType === 1 ) {
- jQuery.cleanData( elem.getElementsByTagName( "*" ) );
+ jQuery.cleanData( getAll( elem, false ) );
elem.innerHTML = value;
}
}
@@ -5906,73 +6176,65 @@ jQuery.fn.extend({
}, null, value, arguments.length );
},
- replaceWith: function( value ) {
- if ( !isDisconnected( this[0] ) ) {
- // Make sure that the elements are removed from the DOM before they are inserted
- // this can help fix replacing a parent with child elements
- if ( jQuery.isFunction( value ) ) {
- return this.each(function(i) {
- var self = jQuery(this), old = self.html();
- self.replaceWith( value.call( this, i, old ) );
- });
- }
+ replaceWith: function() {
+ var
+ // Snapshot the DOM in case .domManip sweeps something relevant into its fragment
+ args = jQuery.map( this, function( elem ) {
+ return [ elem.nextSibling, elem.parentNode ];
+ }),
+ i = 0;
- if ( typeof value !== "string" ) {
- value = jQuery( value ).detach();
- }
+ // Make the changes, replacing each context element with the new content
+ this.domManip( arguments, function( elem ) {
+ var next = args[ i++ ],
+ parent = args[ i++ ];
- return this.each(function() {
- var next = this.nextSibling,
- parent = this.parentNode;
-
- jQuery( this ).remove();
-
- if ( next ) {
- jQuery(next).before( value );
- } else {
- jQuery(parent).append( value );
+ if ( parent ) {
+ // Don't use the snapshot next if it has moved (#13810)
+ if ( next && next.parentNode !== parent ) {
+ next = this.nextSibling;
}
- });
- }
+ jQuery( this ).remove();
+ parent.insertBefore( elem, next );
+ }
+ // Allow new content to include elements from the context set
+ }, true );
- return this.length ?
- this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
- this;
+ // Force removal if there was no new content (e.g., from empty arguments)
+ return i ? this : this.remove();
},
detach: function( selector ) {
return this.remove( selector, true );
},
- domManip: function( args, table, callback ) {
+ domManip: function( args, callback, allowIntersection ) {
// Flatten any nested arrays
- args = [].concat.apply( [], args );
+ args = core_concat.apply( [], args );
- var results, first, fragment, iNoClone,
+ var first, node, hasScripts,
+ scripts, doc, fragment,
i = 0,
+ l = this.length,
+ set = this,
+ iNoClone = l - 1,
value = args[0],
- scripts = [],
- l = this.length;
+ isFunction = jQuery.isFunction( value );
// We can't cloneNode fragments that contain checked, in WebKit
- if ( !jQuery.support.checkClone && l > 1 && typeof value === "string" && rchecked.test( value ) ) {
- return this.each(function() {
- jQuery(this).domManip( args, table, callback );
- });
- }
-
- if ( jQuery.isFunction(value) ) {
- return this.each(function(i) {
- var self = jQuery(this);
- args[0] = value.call( this, i, table ? self.html() : undefined );
- self.domManip( args, table, callback );
+ if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {
+ return this.each(function( index ) {
+ var self = set.eq( index );
+ if ( isFunction ) {
+ args[0] = value.call( this, index, self.html() );
+ }
+ self.domManip( args, callback, allowIntersection );
});
}
- if ( this[0] ) {
- results = jQuery.buildFragment( args, this, scripts );
- fragment = results.fragment;
+ if ( l ) {
+ fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this );
first = fragment.firstChild;
if ( fragment.childNodes.length === 1 ) {
@@ -5980,49 +6242,50 @@ jQuery.fn.extend({
}
if ( first ) {
- table = table && jQuery.nodeName( first, "tr" );
+ scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+ hasScripts = scripts.length;
// Use the original fragment for the last item instead of the first because it can end up
// being emptied incorrectly in certain situations (#8070).
- // Fragments from the fragment cache must always be cloned and never used in place.
- for ( iNoClone = results.cacheable || l - 1; i < l; i++ ) {
- callback.call(
- table && jQuery.nodeName( this[i], "table" ) ?
- findOrAppend( this[i], "tbody" ) :
- this[i],
- i === iNoClone ?
- fragment :
- jQuery.clone( fragment, true, true )
- );
- }
- }
+ for ( ; i < l; i++ ) {
+ node = fragment;
- // Fix #11809: Avoid leaking memory
- fragment = first = null;
+ if ( i !== iNoClone ) {
+ node = jQuery.clone( node, true, true );
- if ( scripts.length ) {
- jQuery.each( scripts, function( i, elem ) {
- if ( elem.src ) {
- if ( jQuery.ajax ) {
- jQuery.ajax({
- url: elem.src,
- type: "GET",
- dataType: "script",
- async: false,
- global: false,
- "throws": true
- });
- } else {
- jQuery.error("no ajax");
+ // Keep references to cloned scripts for later restoration
+ if ( hasScripts ) {
+ jQuery.merge( scripts, getAll( node, "script" ) );
}
- } else {
- jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "" ) );
}
- if ( elem.parentNode ) {
- elem.parentNode.removeChild( elem );
+ callback.call( this[i], node, i );
+ }
+
+ if ( hasScripts ) {
+ doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+ // Reenable scripts
+ jQuery.map( scripts, restoreScript );
+
+ // Evaluate executable scripts on first document insertion
+ for ( i = 0; i < hasScripts; i++ ) {
+ node = scripts[ i ];
+ if ( rscriptType.test( node.type || "" ) &&
+ !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
+
+ if ( node.src ) {
+ // Hope ajax is available...
+ jQuery._evalUrl( node.src );
+ } else {
+ jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
+ }
+ }
}
- });
+ }
+
+ // Fix #11809: Avoid leaking memory
+ fragment = first = null;
}
}
@@ -6030,8 +6293,39 @@ jQuery.fn.extend({
}
});
-function findOrAppend( elem, tag ) {
- return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
+// Support: IE<8
+// Manipulating tables requires a tbody
+function manipulationTarget( elem, content ) {
+ return jQuery.nodeName( elem, "table" ) &&
+ jQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, "tr" ) ?
+
+ elem.getElementsByTagName("tbody")[0] ||
+ elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
+ elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+ elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type;
+ return elem;
+}
+function restoreScript( elem ) {
+ var match = rscriptTypeMasked.exec( elem.type );
+ if ( match ) {
+ elem.type = match[1];
+ } else {
+ elem.removeAttribute("type");
+ }
+ return elem;
+}
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+ var elem,
+ i = 0;
+ for ( ; (elem = elems[i]) != null; i++ ) {
+ jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) );
+ }
}
function cloneCopyEvent( src, dest ) {
@@ -6062,31 +6356,36 @@ function cloneCopyEvent( src, dest ) {
}
}
-function cloneFixAttributes( src, dest ) {
- var nodeName;
+function fixCloneNodeIssues( src, dest ) {
+ var nodeName, e, data;
// We do not need to do anything for non-Elements
if ( dest.nodeType !== 1 ) {
return;
}
- // clearAttributes removes the attributes, which we don't want,
- // but also removes the attachEvent events, which we *do* want
- if ( dest.clearAttributes ) {
- dest.clearAttributes();
- }
+ nodeName = dest.nodeName.toLowerCase();
+
+ // IE6-8 copies events bound via attachEvent when using cloneNode.
+ if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {
+ data = jQuery._data( dest );
+
+ for ( e in data.events ) {
+ jQuery.removeEvent( dest, e, data.handle );
+ }
- // mergeAttributes, in contrast, only merges back on the
- // original attributes, not the events
- if ( dest.mergeAttributes ) {
- dest.mergeAttributes( src );
+ // Event data gets referenced instead of copied if the expando gets copied too
+ dest.removeAttribute( jQuery.expando );
}
- nodeName = dest.nodeName.toLowerCase();
+ // IE blanks contents when cloning scripts, and tries to evaluate newly-set text
+ if ( nodeName === "script" && dest.text !== src.text ) {
+ disableScript( dest ).text = src.text;
+ restoreScript( dest );
- if ( nodeName === "object" ) {
- // IE6-10 improperly clones children of object elements using classid.
- // IE10 throws NoModificationAllowedError if parent is null, #12132.
+ // IE6-10 improperly clones children of object elements using classid.
+ // IE10 throws NoModificationAllowedError if parent is null, #12132.
+ } else if ( nodeName === "object" ) {
if ( dest.parentNode ) {
dest.outerHTML = src.outerHTML;
}
@@ -6095,11 +6394,11 @@ function cloneFixAttributes( src, dest ) {
// element in IE9, the outerHTML strategy above is not sufficient.
// If the src has innerHTML and the destination does not,
// copy the src.innerHTML into the dest.innerHTML. #10324
- if ( jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML)) ) {
+ if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
dest.innerHTML = src.innerHTML;
}
- } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+ } else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) {
// IE6-8 fails to persist the checked state of a cloned checkbox
// or radio button. Worse, IE6-7 fail to give the cloned element
// a checked appearance if the defaultChecked value isn't also set
@@ -6115,66 +6414,15 @@ function cloneFixAttributes( src, dest ) {
// IE6-8 fails to return the selected option to the default selected
// state when cloning options
} else if ( nodeName === "option" ) {
- dest.selected = src.defaultSelected;
+ dest.defaultSelected = dest.selected = src.defaultSelected;
// IE6-8 fails to set the defaultValue to the correct value when
// cloning other types of input fields
} else if ( nodeName === "input" || nodeName === "textarea" ) {
dest.defaultValue = src.defaultValue;
-
- // IE blanks contents when cloning scripts
- } else if ( nodeName === "script" && dest.text !== src.text ) {
- dest.text = src.text;
}
-
- // Event data gets referenced instead of copied if the expando
- // gets copied too
- dest.removeAttribute( jQuery.expando );
}
-jQuery.buildFragment = function( args, context, scripts ) {
- var fragment, cacheable, cachehit,
- first = args[ 0 ];
-
- // Set context from what may come in as undefined or a jQuery collection or a node
- // Updated to fix #12266 where accessing context[0] could throw an exception in IE9/10 &
- // also doubles as fix for #8950 where plain objects caused createDocumentFragment exception
- context = context || document;
- context = !context.nodeType && context[0] || context;
- context = context.ownerDocument || context;
-
- // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
- // Cloning options loses the selected state, so don't cache them
- // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
- // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
- // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
- if ( args.length === 1 && typeof first === "string" && first.length < 512 && context === document &&
- first.charAt(0) === "<" && !rnocache.test( first ) &&
- (jQuery.support.checkClone || !rchecked.test( first )) &&
- (jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
-
- // Mark cacheable and look for a hit
- cacheable = true;
- fragment = jQuery.fragments[ first ];
- cachehit = fragment !== undefined;
- }
-
- if ( !fragment ) {
- fragment = context.createDocumentFragment();
- jQuery.clean( args, context, fragment, scripts );
-
- // Update the cache, but only store false
- // unless this is a second parsing of the same content
- if ( cacheable ) {
- jQuery.fragments[ first ] = cachehit && fragment;
- }
- }
-
- return { fragment: fragment, cacheable: cacheable };
-};
-
-jQuery.fragments = {};
-
jQuery.each({
appendTo: "append",
prependTo: "prepend",
@@ -6187,49 +6435,53 @@ jQuery.each({
i = 0,
ret = [],
insert = jQuery( selector ),
- l = insert.length,
- parent = this.length === 1 && this[0].parentNode;
+ last = insert.length - 1;
- if ( (parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && l === 1 ) {
- insert[ original ]( this[0] );
- return this;
- } else {
- for ( ; i < l; i++ ) {
- elems = ( i > 0 ? this.clone(true) : this ).get();
- jQuery( insert[i] )[ original ]( elems );
- ret = ret.concat( elems );
- }
+ for ( ; i <= last; i++ ) {
+ elems = i === last ? this : this.clone(true);
+ jQuery( insert[i] )[ original ]( elems );
- return this.pushStack( ret, name, insert.selector );
+ // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
+ core_push.apply( ret, elems.get() );
}
+
+ return this.pushStack( ret );
};
});
-function getAll( elem ) {
- if ( typeof elem.getElementsByTagName !== "undefined" ) {
- return elem.getElementsByTagName( "*" );
-
- } else if ( typeof elem.querySelectorAll !== "undefined" ) {
- return elem.querySelectorAll( "*" );
+function getAll( context, tag ) {
+ var elems, elem,
+ i = 0,
+ found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) :
+ typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) :
+ undefined;
- } else {
- return [];
+ if ( !found ) {
+ for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {
+ if ( !tag || jQuery.nodeName( elem, tag ) ) {
+ found.push( elem );
+ } else {
+ jQuery.merge( found, getAll( elem, tag ) );
+ }
+ }
}
+
+ return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+ jQuery.merge( [ context ], found ) :
+ found;
}
-// Used in clean, fixes the defaultChecked property
+// Used in buildFragment, fixes the defaultChecked property
function fixDefaultChecked( elem ) {
- if ( rcheckableType.test( elem.type ) ) {
+ if ( manipulation_rcheckableType.test( elem.type ) ) {
elem.defaultChecked = elem.checked;
}
}
jQuery.extend({
clone: function( elem, dataAndEvents, deepDataAndEvents ) {
- var srcElements,
- destElements,
- i,
- clone;
+ var destElements, node, clone, i, srcElements,
+ inPage = jQuery.contains( elem.ownerDocument, elem );
if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
clone = elem.cloneNode( true );
@@ -6242,185 +6494,175 @@ jQuery.extend({
if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
- // IE copies events bound via attachEvent when using cloneNode.
- // Calling detachEvent on the clone will also remove the events
- // from the original. In order to get around this, we use some
- // proprietary methods to clear the events. Thanks to MooTools
- // guys for this hotness.
- cloneFixAttributes( elem, clone );
-
- // Using Sizzle here is crazy slow, so we use getElementsByTagName instead
- srcElements = getAll( elem );
+ // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
destElements = getAll( clone );
+ srcElements = getAll( elem );
- // Weird iteration because IE will replace the length property
- // with an element if you are cloning the body and one of the
- // elements on the page has a name or id of "length"
- for ( i = 0; srcElements[i]; ++i ) {
+ // Fix all IE cloning issues
+ for ( i = 0; (node = srcElements[i]) != null; ++i ) {
// Ensure that the destination node is not null; Fixes #9587
if ( destElements[i] ) {
- cloneFixAttributes( srcElements[i], destElements[i] );
+ fixCloneNodeIssues( node, destElements[i] );
}
}
}
// Copy the events from the original to the clone
if ( dataAndEvents ) {
- cloneCopyEvent( elem, clone );
-
if ( deepDataAndEvents ) {
- srcElements = getAll( elem );
- destElements = getAll( clone );
+ srcElements = srcElements || getAll( elem );
+ destElements = destElements || getAll( clone );
- for ( i = 0; srcElements[i]; ++i ) {
- cloneCopyEvent( srcElements[i], destElements[i] );
+ for ( i = 0; (node = srcElements[i]) != null; i++ ) {
+ cloneCopyEvent( node, destElements[i] );
}
+ } else {
+ cloneCopyEvent( elem, clone );
}
}
- srcElements = destElements = null;
+ // Preserve script evaluation history
+ destElements = getAll( clone, "script" );
+ if ( destElements.length > 0 ) {
+ setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+ }
+
+ destElements = srcElements = node = null;
// Return the cloned set
return clone;
},
- clean: function( elems, context, fragment, scripts ) {
- var i, j, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags,
- safe = context === document && safeFragment,
- ret = [];
+ buildFragment: function( elems, context, scripts, selection ) {
+ var j, elem, contains,
+ tmp, tag, tbody, wrap,
+ l = elems.length,
- // Ensure that context is a document
- if ( !context || typeof context.createDocumentFragment === "undefined" ) {
- context = document;
- }
+ // Ensure a safe fragment
+ safe = createSafeFragment( context ),
- // Use the already-created safe fragment if context permits
- for ( i = 0; (elem = elems[i]) != null; i++ ) {
- if ( typeof elem === "number" ) {
- elem += "";
- }
+ nodes = [],
+ i = 0;
- if ( !elem ) {
- continue;
- }
+ for ( ; i < l; i++ ) {
+ elem = elems[ i ];
- // Convert html string into DOM nodes
- if ( typeof elem === "string" ) {
- if ( !rhtml.test( elem ) ) {
- elem = context.createTextNode( elem );
- } else {
- // Ensure a safe container in which to render the html
- safe = safe || createSafeFragment( context );
- div = context.createElement("div");
- safe.appendChild( div );
+ if ( elem || elem === 0 ) {
+
+ // Add nodes directly
+ if ( jQuery.type( elem ) === "object" ) {
+ jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
- // Fix "XHTML"-style tags in all browsers
- elem = elem.replace(rxhtmlTag, "<$1></$2>");
+ // Convert non-html into a text node
+ } else if ( !rhtml.test( elem ) ) {
+ nodes.push( context.createTextNode( elem ) );
+
+ // Convert html into DOM nodes
+ } else {
+ tmp = tmp || safe.appendChild( context.createElement("div") );
- // Go to html and back, then peel off extra wrappers
+ // Deserialize a standard representation
tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
wrap = wrapMap[ tag ] || wrapMap._default;
- depth = wrap[0];
- div.innerHTML = wrap[1] + elem + wrap[2];
- // Move to the right depth
- while ( depth-- ) {
- div = div.lastChild;
+ tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[2];
+
+ // Descend through wrappers to the right content
+ j = wrap[0];
+ while ( j-- ) {
+ tmp = tmp.lastChild;
+ }
+
+ // Manually add leading whitespace removed by IE
+ if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+ nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
}
// Remove IE's autoinserted <tbody> from table fragments
if ( !jQuery.support.tbody ) {
// String was a <table>, *may* have spurious <tbody>
- hasBody = rtbody.test(elem);
- tbody = tag === "table" && !hasBody ?
- div.firstChild && div.firstChild.childNodes :
-
- // String was a bare <thead> or <tfoot>
- wrap[1] === "<table>" && !hasBody ?
- div.childNodes :
- [];
-
- for ( j = tbody.length - 1; j >= 0 ; --j ) {
- if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
- tbody[ j ].parentNode.removeChild( tbody[ j ] );
+ elem = tag === "table" && !rtbody.test( elem ) ?
+ tmp.firstChild :
+
+ // String was a bare <thead> or <tfoot>
+ wrap[1] === "<table>" && !rtbody.test( elem ) ?
+ tmp :
+ 0;
+
+ j = elem && elem.childNodes.length;
+ while ( j-- ) {
+ if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) {
+ elem.removeChild( tbody );
}
}
}
- // IE completely kills leading whitespace when innerHTML is used
- if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
- div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
- }
+ jQuery.merge( nodes, tmp.childNodes );
- elem = div.childNodes;
+ // Fix #12392 for WebKit and IE > 9
+ tmp.textContent = "";
- // Take out of fragment container (we need a fresh div each time)
- div.parentNode.removeChild( div );
- }
- }
+ // Fix #12392 for oldIE
+ while ( tmp.firstChild ) {
+ tmp.removeChild( tmp.firstChild );
+ }
- if ( elem.nodeType ) {
- ret.push( elem );
- } else {
- jQuery.merge( ret, elem );
+ // Remember the top-level container for proper cleanup
+ tmp = safe.lastChild;
+ }
}
}
- // Fix #11356: Clear elements from safeFragment
- if ( div ) {
- elem = div = safe = null;
+ // Fix #11356: Clear elements from fragment
+ if ( tmp ) {
+ safe.removeChild( tmp );
}
// Reset defaultChecked for any radios and checkboxes
// about to be appended to the DOM in IE 6/7 (#8060)
if ( !jQuery.support.appendChecked ) {
- for ( i = 0; (elem = ret[i]) != null; i++ ) {
- if ( jQuery.nodeName( elem, "input" ) ) {
- fixDefaultChecked( elem );
- } else if ( typeof elem.getElementsByTagName !== "undefined" ) {
- jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
- }
- }
+ jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
}
- // Append elements to a provided document fragment
- if ( fragment ) {
- // Special handling of each script element
- handleScript = function( elem ) {
- // Check if we consider it executable
- if ( !elem.type || rscriptType.test( elem.type ) ) {
- // Detach the script and store it in the scripts array (if provided) or the fragment
- // Return truthy to indicate that it has been handled
- return scripts ?
- scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
- fragment.appendChild( elem );
- }
- };
+ i = 0;
+ while ( (elem = nodes[ i++ ]) ) {
+
+ // #4087 - If origin and destination elements are the same, and this is
+ // that element, do not do anything
+ if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
+ continue;
+ }
+
+ contains = jQuery.contains( elem.ownerDocument, elem );
- for ( i = 0; (elem = ret[i]) != null; i++ ) {
- // Check if we're done after handling an executable script
- if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
- // Append to fragment and handle embedded scripts
- fragment.appendChild( elem );
- if ( typeof elem.getElementsByTagName !== "undefined" ) {
- // handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
- jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
-
- // Splice the scripts into ret after their former ancestor and advance our index beyond them
- ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
- i += jsTags.length;
+ // Append to fragment
+ tmp = getAll( safe.appendChild( elem ), "script" );
+
+ // Preserve script evaluation history
+ if ( contains ) {
+ setGlobalEval( tmp );
+ }
+
+ // Capture executables
+ if ( scripts ) {
+ j = 0;
+ while ( (elem = tmp[ j++ ]) ) {
+ if ( rscriptType.test( elem.type || "" ) ) {
+ scripts.push( elem );
}
}
}
}
- return ret;
+ tmp = null;
+
+ return safe;
},
cleanData: function( elems, /* internal */ acceptData ) {
- var data, id, elem, type,
+ var elem, type, id, data,
i = 0,
internalKey = jQuery.expando,
cache = jQuery.cache,
@@ -6458,86 +6700,100 @@ jQuery.extend({
if ( deleteExpando ) {
delete elem[ internalKey ];
- } else if ( elem.removeAttribute ) {
+ } else if ( typeof elem.removeAttribute !== core_strundefined ) {
elem.removeAttribute( internalKey );
} else {
elem[ internalKey ] = null;
}
- jQuery.deletedIds.push( id );
+ core_deletedIds.push( id );
}
}
}
}
+ },
+
+ _evalUrl: function( url ) {
+ return jQuery.ajax({
+ url: url,
+ type: "GET",
+ dataType: "script",
+ async: false,
+ global: false,
+ "throws": true
+ });
}
});
-// Limit scope pollution from any deprecated API
-(function() {
+jQuery.fn.extend({
+ wrapAll: function( html ) {
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function(i) {
+ jQuery(this).wrapAll( html.call(this, i) );
+ });
+ }
-var matched, browser;
+ if ( this[0] ) {
+ // The elements to wrap the target around
+ var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
-// Use of jQuery.browser is frowned upon.
-// More details: http://api.jquery.com/jQuery.browser
-// jQuery.uaMatch maintained for back-compat
-jQuery.uaMatch = function( ua ) {
- ua = ua.toLowerCase();
+ if ( this[0].parentNode ) {
+ wrap.insertBefore( this[0] );
+ }
- var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
- /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
- /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
- /(msie) ([\w.]+)/.exec( ua ) ||
- ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
- [];
+ wrap.map(function() {
+ var elem = this;
- return {
- browser: match[ 1 ] || "",
- version: match[ 2 ] || "0"
- };
-};
+ while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+ elem = elem.firstChild;
+ }
-matched = jQuery.uaMatch( navigator.userAgent );
-browser = {};
+ return elem;
+ }).append( this );
+ }
-if ( matched.browser ) {
- browser[ matched.browser ] = true;
- browser.version = matched.version;
-}
+ return this;
+ },
-// Chrome is Webkit, but Webkit is also Safari.
-if ( browser.chrome ) {
- browser.webkit = true;
-} else if ( browser.webkit ) {
- browser.safari = true;
-}
+ wrapInner: function( html ) {
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function(i) {
+ jQuery(this).wrapInner( html.call(this, i) );
+ });
+ }
-jQuery.browser = browser;
+ return this.each(function() {
+ var self = jQuery( this ),
+ contents = self.contents();
-jQuery.sub = function() {
- function jQuerySub( selector, context ) {
- return new jQuerySub.fn.init( selector, context );
- }
- jQuery.extend( true, jQuerySub, this );
- jQuerySub.superclass = this;
- jQuerySub.fn = jQuerySub.prototype = this();
- jQuerySub.fn.constructor = jQuerySub;
- jQuerySub.sub = this.sub;
- jQuerySub.fn.init = function init( selector, context ) {
- if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
- context = jQuerySub( context );
- }
+ if ( contents.length ) {
+ contents.wrapAll( html );
- return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
- };
- jQuerySub.fn.init.prototype = jQuerySub.fn;
- var rootjQuerySub = jQuerySub(document);
- return jQuerySub;
-};
+ } else {
+ self.append( html );
+ }
+ });
+ },
+
+ wrap: function( html ) {
+ var isFunction = jQuery.isFunction( html );
+
+ return this.each(function(i) {
+ jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+ });
+ },
-})();
-var curCSS, iframe, iframeDoc,
+ unwrap: function() {
+ return this.parent().each(function() {
+ if ( !jQuery.nodeName( this, "body" ) ) {
+ jQuery( this ).replaceWith( this.childNodes );
+ }
+ }).end();
+ }
+});
+var iframe, getStyles, curCSS,
ralpha = /alpha\([^)]*\)/i,
- ropacity = /opacity=([^)]*)/,
+ ropacity = /opacity\s*=\s*([^)]*)/,
rposition = /^(top|right|bottom|left)$/,
// swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
@@ -6545,7 +6801,7 @@ var curCSS, iframe, iframeDoc,
rmargin = /^margin/,
rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
- rrelNum = new RegExp( "^([-+])=(" + core_pnum + ")", "i" ),
+ rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ),
elemdisplay = { BODY: "block" },
cssShow = { position: "absolute", visibility: "hidden", display: "block" },
@@ -6555,9 +6811,7 @@ var curCSS, iframe, iframeDoc,
},
cssExpand = [ "Top", "Right", "Bottom", "Left" ],
- cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
-
- eventsToggle = jQuery.fn.toggle;
+ cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
// return a css property mapped to a potentially vendor prefixed property
function vendorPropName( style, name ) {
@@ -6583,12 +6837,14 @@ function vendorPropName( style, name ) {
}
function isHidden( elem, el ) {
+ // isHidden might be called from jQuery#filter function;
+ // in that case, element will be second argument
elem = el || elem;
return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
}
function showHide( elements, show ) {
- var elem, display,
+ var display, elem, hidden,
values = [],
index = 0,
length = elements.length;
@@ -6598,11 +6854,13 @@ function showHide( elements, show ) {
if ( !elem.style ) {
continue;
}
+
values[ index ] = jQuery._data( elem, "olddisplay" );
+ display = elem.style.display;
if ( show ) {
// Reset the inline display of this element to learn if it is
// being hidden by cascaded rules or not
- if ( !values[ index ] && elem.style.display === "none" ) {
+ if ( !values[ index ] && display === "none" ) {
elem.style.display = "";
}
@@ -6613,10 +6871,13 @@ function showHide( elements, show ) {
values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
}
} else {
- display = curCSS( elem, "display" );
- if ( !values[ index ] && display !== "none" ) {
- jQuery._data( elem, "olddisplay", display );
+ if ( !values[ index ] ) {
+ hidden = isHidden( elem );
+
+ if ( display && display !== "none" || !hidden ) {
+ jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
+ }
}
}
}
@@ -6639,6 +6900,21 @@ function showHide( elements, show ) {
jQuery.fn.extend({
css: function( name, value ) {
return jQuery.access( this, function( elem, name, value ) {
+ var len, styles,
+ map = {},
+ i = 0;
+
+ if ( jQuery.isArray( name ) ) {
+ styles = getStyles( elem );
+ len = name.length;
+
+ for ( ; i < len; i++ ) {
+ map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+ }
+
+ return map;
+ }
+
return value !== undefined ?
jQuery.style( elem, name, value ) :
jQuery.css( elem, name );
@@ -6650,15 +6926,13 @@ jQuery.fn.extend({
hide: function() {
return showHide( this );
},
- toggle: function( state, fn2 ) {
- var bool = typeof state === "boolean";
-
- if ( jQuery.isFunction( state ) && jQuery.isFunction( fn2 ) ) {
- return eventsToggle.apply( this, arguments );
+ toggle: function( state ) {
+ if ( typeof state === "boolean" ) {
+ return state ? this.show() : this.hide();
}
return this.each(function() {
- if ( bool ? state : isHidden( this ) ) {
+ if ( isHidden( this ) ) {
jQuery( this ).show();
} else {
jQuery( this ).hide();
@@ -6677,18 +6951,19 @@ jQuery.extend({
// We should always get a number back from opacity
var ret = curCSS( elem, "opacity" );
return ret === "" ? "1" : ret;
-
}
}
}
},
- // Exclude the following css properties to add px
+ // Don't automatically add "px" to these possibly-unitless properties
cssNumber: {
+ "columnCount": true,
"fillOpacity": true,
"fontWeight": true,
"lineHeight": true,
"opacity": true,
+ "order": true,
"orphans": true,
"widows": true,
"zIndex": true,
@@ -6741,8 +7016,15 @@ jQuery.extend({
value += "px";
}
+ // Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
+ // but it would mean to define eight (for every problematic property) identical functions
+ if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) {
+ style[ name ] = "inherit";
+ }
+
// If a hook was provided, use that value, otherwise just set the specified value
if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
+
// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
// Fixes bug #5509
try {
@@ -6761,8 +7043,8 @@ jQuery.extend({
}
},
- css: function( elem, name, numeric, extra ) {
- var val, num, hooks,
+ css: function( elem, name, extra, styles ) {
+ var num, val, hooks,
origName = jQuery.camelCase( name );
// Make sure that we're working with the right name
@@ -6779,7 +7061,7 @@ jQuery.extend({
// Otherwise, if a way to get the computed value exists, use that
if ( val === undefined ) {
- val = curCSS( elem, name );
+ val = curCSS( elem, name, styles );
}
//convert "normal" to computed value
@@ -6788,47 +7070,30 @@ jQuery.extend({
}
// Return, converting to number if forced or a qualifier was provided and val looks numeric
- if ( numeric || extra !== undefined ) {
+ if ( extra === "" || extra ) {
num = parseFloat( val );
- return numeric || jQuery.isNumeric( num ) ? num || 0 : val;
+ return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
}
return val;
- },
-
- // A method for quickly swapping in/out CSS properties to get correct calculations
- swap: function( elem, options, callback ) {
- var ret, name,
- old = {};
-
- // Remember the old values, and insert the new ones
- for ( name in options ) {
- old[ name ] = elem.style[ name ];
- elem.style[ name ] = options[ name ];
- }
-
- ret = callback.call( elem );
-
- // Revert the old values
- for ( name in options ) {
- elem.style[ name ] = old[ name ];
- }
-
- return ret;
}
});
-// NOTE: To any future maintainer, we've window.getComputedStyle
+// NOTE: we've included the "window" in window.getComputedStyle
// because jsdom on node.js will break without it.
if ( window.getComputedStyle ) {
- curCSS = function( elem, name ) {
- var ret, width, minWidth, maxWidth,
- computed = window.getComputedStyle( elem, null ),
- style = elem.style;
+ getStyles = function( elem ) {
+ return window.getComputedStyle( elem, null );
+ };
- if ( computed ) {
+ curCSS = function( elem, name, _computed ) {
+ var width, minWidth, maxWidth,
+ computed = _computed || getStyles( elem ),
// getPropertyValue is only needed for .css('filter') in IE9, see #12537
- ret = computed.getPropertyValue( name ) || computed[ name ];
+ ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,
+ style = elem.style;
+
+ if ( computed ) {
if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
ret = jQuery.style( elem, name );
@@ -6839,13 +7104,17 @@ if ( window.getComputedStyle ) {
// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+
+ // Remember the original values
width = style.width;
minWidth = style.minWidth;
maxWidth = style.maxWidth;
+ // Put in the new values to get a computed value out
style.minWidth = style.maxWidth = style.width = ret;
ret = computed.width;
+ // Revert the changed values
style.width = width;
style.minWidth = minWidth;
style.maxWidth = maxWidth;
@@ -6855,9 +7124,14 @@ if ( window.getComputedStyle ) {
return ret;
};
} else if ( document.documentElement.currentStyle ) {
- curCSS = function( elem, name ) {
- var left, rsLeft,
- ret = elem.currentStyle && elem.currentStyle[ name ],
+ getStyles = function( elem ) {
+ return elem.currentStyle;
+ };
+
+ curCSS = function( elem, name, _computed ) {
+ var left, rs, rsLeft,
+ computed = _computed || getStyles( elem ),
+ ret = computed ? computed[ name ] : undefined,
style = elem.style;
// Avoid setting ret to empty string here
@@ -6877,11 +7151,12 @@ if ( window.getComputedStyle ) {
// Remember the original values
left = style.left;
- rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
+ rs = elem.runtimeStyle;
+ rsLeft = rs && rs.left;
// Put in the new values to get a computed value out
if ( rsLeft ) {
- elem.runtimeStyle.left = elem.currentStyle.left;
+ rs.left = elem.currentStyle.left;
}
style.left = name === "fontSize" ? "1em" : ret;
ret = style.pixelLeft + "px";
@@ -6889,7 +7164,7 @@ if ( window.getComputedStyle ) {
// Revert the changed values
style.left = left;
if ( rsLeft ) {
- elem.runtimeStyle.left = rsLeft;
+ rs.left = rsLeft;
}
}
@@ -6900,11 +7175,12 @@ if ( window.getComputedStyle ) {
function setPositiveNumber( elem, value, subtract ) {
var matches = rnumsplit.exec( value );
return matches ?
- Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
- value;
+ // Guard against undefined "subtract", e.g., when used as in cssHooks
+ Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+ value;
}
-function augmentWidthOrHeight( elem, name, extra, isBorderBox ) {
+function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
var i = extra === ( isBorderBox ? "border" : "content" ) ?
// If we already have the right measurement, avoid augmentation
4 :
@@ -6916,29 +7192,26 @@ function augmentWidthOrHeight( elem, name, extra, isBorderBox ) {
for ( ; i < 4; i += 2 ) {
// both box models exclude margin, so add it if we want it
if ( extra === "margin" ) {
- // we use jQuery.css instead of curCSS here
- // because of the reliableMarginRight CSS hook!
- val += jQuery.css( elem, extra + cssExpand[ i ], true );
+ val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
}
- // From this point on we use curCSS for maximum performance (relevant in animations)
if ( isBorderBox ) {
// border-box includes padding, so remove it if we want content
if ( extra === "content" ) {
- val -= parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
+ val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
}
// at this point, extra isn't border nor margin, so remove border
if ( extra !== "margin" ) {
- val -= parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+ val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
}
} else {
// at this point, extra isn't content, so add padding
- val += parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
+ val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
// at this point, extra isn't content nor padding, so add border
if ( extra !== "padding" ) {
- val += parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+ val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
}
}
}
@@ -6949,16 +7222,17 @@ function augmentWidthOrHeight( elem, name, extra, isBorderBox ) {
function getWidthOrHeight( elem, name, extra ) {
// Start with offset property, which is equivalent to the border-box value
- var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
- valueIsBorderBox = true,
- isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box";
+ var valueIsBorderBox = true,
+ val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+ styles = getStyles( elem ),
+ isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
// some non-html elements return undefined for offsetWidth, so check for null/undefined
// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
if ( val <= 0 || val == null ) {
// Fall back to computed then uncomputed css if necessary
- val = curCSS( elem, name );
+ val = curCSS( elem, name, styles );
if ( val < 0 || val == null ) {
val = elem.style[ name ];
}
@@ -6982,52 +7256,49 @@ function getWidthOrHeight( elem, name, extra ) {
elem,
name,
extra || ( isBorderBox ? "border" : "content" ),
- valueIsBorderBox
+ valueIsBorderBox,
+ styles
)
) + "px";
}
-
// Try to determine the default display value of an element
function css_defaultDisplay( nodeName ) {
- if ( elemdisplay[ nodeName ] ) {
- return elemdisplay[ nodeName ];
- }
+ var doc = document,
+ display = elemdisplay[ nodeName ];
- var elem = jQuery( "<" + nodeName + ">" ).appendTo( document.body ),
- display = elem.css("display");
- elem.remove();
+ if ( !display ) {
+ display = actualDisplay( nodeName, doc );
- // If the simple way fails,
- // get element's real default display by attaching it to a temp iframe
- if ( display === "none" || display === "" ) {
- // Use the already-created iframe if possible
- iframe = document.body.appendChild(
- iframe || jQuery.extend( document.createElement("iframe"), {
- frameBorder: 0,
- width: 0,
- height: 0
- })
- );
+ // If the simple way fails, read from inside an iframe
+ if ( display === "none" || !display ) {
+ // Use the already-created iframe if possible
+ iframe = ( iframe ||
+ jQuery("<iframe frameborder='0' width='0' height='0'/>")
+ .css( "cssText", "display:block !important" )
+ ).appendTo( doc.documentElement );
- // Create a cacheable copy of the iframe document on first call.
- // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
- // document to it; WebKit & Firefox won't allow reusing the iframe document.
- if ( !iframeDoc || !iframe.createElement ) {
- iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
- iframeDoc.write("<!doctype html><html><body>");
- iframeDoc.close();
- }
+ // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
+ doc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;
+ doc.write("<!doctype html><html><body>");
+ doc.close();
- elem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) );
+ display = actualDisplay( nodeName, doc );
+ iframe.detach();
+ }
- display = curCSS( elem, "display" );
- document.body.removeChild( iframe );
+ // Store the correct default display
+ elemdisplay[ nodeName ] = display;
}
- // Store the correct default display
- elemdisplay[ nodeName ] = display;
+ return display;
+}
+// Called ONLY from within css_defaultDisplay
+function actualDisplay( name, doc ) {
+ var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
+ display = jQuery.css( elem[0], "display" );
+ elem.remove();
return display;
}
@@ -7037,23 +7308,23 @@ jQuery.each([ "height", "width" ], function( i, name ) {
if ( computed ) {
// certain elements can have dimension info if we invisibly show them
// however, it must have a current display style that would benefit from this
- if ( elem.offsetWidth === 0 && rdisplayswap.test( curCSS( elem, "display" ) ) ) {
- return jQuery.swap( elem, cssShow, function() {
+ return elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ?
+ jQuery.swap( elem, cssShow, function() {
return getWidthOrHeight( elem, name, extra );
- });
- } else {
- return getWidthOrHeight( elem, name, extra );
- }
+ }) :
+ getWidthOrHeight( elem, name, extra );
}
},
set: function( elem, value, extra ) {
+ var styles = extra && getStyles( elem );
return setPositiveNumber( elem, value, extra ?
augmentWidthOrHeight(
elem,
name,
extra,
- jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box"
+ jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+ styles
) : 0
);
}
@@ -7080,16 +7351,18 @@ if ( !jQuery.support.opacity ) {
style.zoom = 1;
// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
- if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
- style.removeAttribute ) {
+ // if value === "", then remove inline opacity #12685
+ if ( ( value >= 1 || value === "" ) &&
+ jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
+ style.removeAttribute ) {
// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
// if "filter:" is present at all, clearType is disabled, we want to avoid this
// style.removeAttribute is IE Only, but so apparently is this code path...
style.removeAttribute( "filter" );
- // if there there is no filter style applied in a css rule, we are done
- if ( currentStyle && !currentStyle.filter ) {
+ // if there is no filter style applied in a css rule or unset inline opacity, we are done
+ if ( value === "" || currentStyle && !currentStyle.filter ) {
return;
}
}
@@ -7108,13 +7381,12 @@ jQuery(function() {
if ( !jQuery.support.reliableMarginRight ) {
jQuery.cssHooks.marginRight = {
get: function( elem, computed ) {
- // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
- // Work around by temporarily setting element display to inline-block
- return jQuery.swap( elem, { "display": "inline-block" }, function() {
- if ( computed ) {
- return curCSS( elem, "marginRight" );
- }
- });
+ if ( computed ) {
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ // Work around by temporarily setting element display to inline-block
+ return jQuery.swap( elem, { "display": "inline-block" },
+ curCSS, [ elem, "marginRight" ] );
+ }
}
};
}
@@ -7127,9 +7399,11 @@ jQuery(function() {
jQuery.cssHooks[ prop ] = {
get: function( elem, computed ) {
if ( computed ) {
- var ret = curCSS( elem, prop );
+ computed = curCSS( elem, prop );
// if curCSS returns percentage, fallback to offset
- return rnumnonpx.test( ret ) ? jQuery( elem ).position()[ prop ] + "px" : ret;
+ return rnumnonpx.test( computed ) ?
+ jQuery( elem ).position()[ prop ] + "px" :
+ computed;
}
}
};
@@ -7140,7 +7414,10 @@ jQuery(function() {
if ( jQuery.expr && jQuery.expr.filters ) {
jQuery.expr.filters.hidden = function( elem ) {
- return ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || curCSS( elem, "display" )) === "none");
+ // Support: Opera <= 12.12
+ // Opera reports offsetWidths and offsetHeights less than zero on some elements
+ return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||
+ (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
};
jQuery.expr.filters.visible = function( elem ) {
@@ -7156,13 +7433,13 @@ jQuery.each({
}, function( prefix, suffix ) {
jQuery.cssHooks[ prefix + suffix ] = {
expand: function( value ) {
- var i,
+ var i = 0,
+ expanded = {},
// assumes a single number if not a string
- parts = typeof value === "string" ? value.split(" ") : [ value ],
- expanded = {};
+ parts = typeof value === "string" ? value.split(" ") : [ value ];
- for ( i = 0; i < 4; i++ ) {
+ for ( ; i < 4; i++ ) {
expanded[ prefix + cssExpand[ i ] + suffix ] =
parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
}
@@ -7178,8 +7455,8 @@ jQuery.each({
var r20 = /%20/g,
rbracket = /\[\]$/,
rCRLF = /\r?\n/g,
- rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
- rselectTextarea = /^(?:select|textarea)/i;
+ rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+ rsubmittable = /^(?:input|select|textarea|keygen)/i;
jQuery.fn.extend({
serialize: function() {
@@ -7187,12 +7464,16 @@ jQuery.fn.extend({
},
serializeArray: function() {
return this.map(function(){
- return this.elements ? jQuery.makeArray( this.elements ) : this;
+ // Can add propHook for "elements" to filter or add form elements
+ var elements = jQuery.prop( this, "elements" );
+ return elements ? jQuery.makeArray( elements ) : this;
})
.filter(function(){
- return this.name && !this.disabled &&
- ( this.checked || rselectTextarea.test( this.nodeName ) ||
- rinput.test( this.type ) );
+ var type = this.type;
+ // Use .is(":disabled") so that fieldset[disabled] works
+ return this.name && !jQuery( this ).is( ":disabled" ) &&
+ rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+ ( this.checked || !manipulation_rcheckableType.test( type ) );
})
.map(function( i, elem ){
var val = jQuery( this ).val();
@@ -7200,7 +7481,7 @@ jQuery.fn.extend({
return val == null ?
null :
jQuery.isArray( val ) ?
- jQuery.map( val, function( val, i ){
+ jQuery.map( val, function( val ){
return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
}) :
{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
@@ -7254,13 +7535,7 @@ function buildParams( prefix, obj, traditional, add ) {
add( prefix, v );
} else {
- // If array item is non-scalar (array or object), encode its
- // numeric index to resolve deserialization ambiguity issues.
- // Note that rack (as of 1.0.0) can't currently deserialize
- // nested arrays properly, and attempting to do so may cause
- // a server error. Possible fixes are to modify rack's
- // deserialization algorithm or to provide an option or flag
- // to force array serialization to be shallow.
+ // Item is non-scalar (array or object), encode its numeric index.
buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
}
});
@@ -7276,21 +7551,53 @@ function buildParams( prefix, obj, traditional, add ) {
add( prefix, obj );
}
}
+jQuery.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 contextmenu").split(" "), function( i, name ) {
+
+ // Handle event binding
+ jQuery.fn[ name ] = function( data, fn ) {
+ return arguments.length > 0 ?
+ this.on( name, null, data, fn ) :
+ this.trigger( name );
+ };
+});
+
+jQuery.fn.extend({
+ hover: function( fnOver, fnOut ) {
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+ },
+
+ bind: function( types, data, fn ) {
+ return this.on( types, null, data, fn );
+ },
+ unbind: function( types, fn ) {
+ return this.off( types, null, fn );
+ },
+
+ delegate: function( selector, types, data, fn ) {
+ return this.on( types, selector, data, fn );
+ },
+ undelegate: function( selector, types, fn ) {
+ // ( namespace ) or ( selector, types [, fn] )
+ return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
+ }
+});
var
// Document location
ajaxLocParts,
ajaxLocation,
+ ajax_nonce = jQuery.now(),
+ ajax_rquery = /\?/,
rhash = /#.*$/,
+ rts = /([?&])_=[^&]*/,
rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
// #7653, #8125, #8152: local protocol detection
- rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
+ rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
rnoContent = /^(?:GET|HEAD)$/,
rprotocol = /^\/\//,
- rquery = /\?/,
- rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
- rts = /([?&])_=[^&]*/,
- rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
+ rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
// Keep a copy of the old load method
_load = jQuery.fn.load,
@@ -7314,7 +7621,7 @@ var
transports = {},
// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
- allTypes = ["*/"] + ["*"];
+ allTypes = "*/".concat("*");
// #8138, IE may throw an exception when accessing
// a field from window.location if document.domain has been set
@@ -7342,83 +7649,69 @@ function addToPrefiltersOrTransports( structure ) {
dataTypeExpression = "*";
}
- var dataType, list, placeBefore,
- dataTypes = dataTypeExpression.toLowerCase().split( core_rspace ),
+ var dataType,
i = 0,
- length = dataTypes.length;
+ dataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];
if ( jQuery.isFunction( func ) ) {
// For each dataType in the dataTypeExpression
- for ( ; i < length; i++ ) {
- dataType = dataTypes[ i ];
- // We control if we're asked to add before
- // any existing element
- placeBefore = /^\+/.test( dataType );
- if ( placeBefore ) {
- dataType = dataType.substr( 1 ) || "*";
+ while ( (dataType = dataTypes[i++]) ) {
+ // Prepend if requested
+ if ( dataType[0] === "+" ) {
+ dataType = dataType.slice( 1 ) || "*";
+ (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
+
+ // Otherwise append
+ } else {
+ (structure[ dataType ] = structure[ dataType ] || []).push( func );
}
- list = structure[ dataType ] = structure[ dataType ] || [];
- // then we add to the structure accordingly
- list[ placeBefore ? "unshift" : "push" ]( func );
}
}
};
}
// Base inspection function for prefilters and transports
-function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
- dataType /* internal */, inspected /* internal */ ) {
-
- dataType = dataType || options.dataTypes[ 0 ];
- inspected = inspected || {};
-
- inspected[ dataType ] = true;
-
- var selection,
- list = structure[ dataType ],
- i = 0,
- length = list ? list.length : 0,
- executeOnly = ( structure === prefilters );
-
- for ( ; i < length && ( executeOnly || !selection ); i++ ) {
- selection = list[ i ]( options, originalOptions, jqXHR );
- // If we got redirected to another dataType
- // we try there if executing only and not done already
- if ( typeof selection === "string" ) {
- if ( !executeOnly || inspected[ selection ] ) {
- selection = undefined;
- } else {
- options.dataTypes.unshift( selection );
- selection = inspectPrefiltersOrTransports(
- structure, options, originalOptions, jqXHR, selection, inspected );
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+ var inspected = {},
+ seekingTransport = ( structure === transports );
+
+ function inspect( dataType ) {
+ var selected;
+ inspected[ dataType ] = true;
+ jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+ var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+ if( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+ options.dataTypes.unshift( dataTypeOrTransport );
+ inspect( dataTypeOrTransport );
+ return false;
+ } else if ( seekingTransport ) {
+ return !( selected = dataTypeOrTransport );
}
- }
- }
- // If we're only executing or nothing was selected
- // we try the catchall dataType if not done already
- if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
- selection = inspectPrefiltersOrTransports(
- structure, options, originalOptions, jqXHR, "*", inspected );
+ });
+ return selected;
}
- // unnecessary when only executing (prefilters)
- // but it'll be ignored by the caller in that case
- return selection;
+
+ return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
}
// A special extend for ajax options
// that takes "flat" options (not to be deep extended)
// Fixes #9887
function ajaxExtend( target, src ) {
- var key, deep,
+ var deep, key,
flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
for ( key in src ) {
if ( src[ key ] !== undefined ) {
- ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+ ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
}
}
if ( deep ) {
jQuery.extend( true, target, deep );
}
+
+ return target;
}
jQuery.fn.load = function( url, params, callback ) {
@@ -7426,12 +7719,7 @@ jQuery.fn.load = function( url, params, callback ) {
return _load.apply( this, arguments );
}
- // Don't do a request if no elements are being requested
- if ( !this.length ) {
- return this;
- }
-
- var selector, type, response,
+ var selector, response, type,
self = this,
off = url.indexOf(" ");
@@ -7452,105 +7740,61 @@ jQuery.fn.load = function( url, params, callback ) {
type = "POST";
}
- // Request the remote document
- jQuery.ajax({
- url: url,
-
- // if "type" variable is undefined, then "GET" method will be used
- type: type,
- dataType: "html",
- data: params,
- complete: function( jqXHR, status ) {
- if ( callback ) {
- self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
- }
- }
- }).done(function( responseText ) {
-
- // Save response for use in complete callback
- response = arguments;
+ // If we have elements to modify, make the request
+ if ( self.length > 0 ) {
+ jQuery.ajax({
+ url: url,
- // See if a selector was specified
- self.html( selector ?
+ // if "type" variable is undefined, then "GET" method will be used
+ type: type,
+ dataType: "html",
+ data: params
+ }).done(function( responseText ) {
- // Create a dummy div to hold the results
- jQuery("<div>")
+ // Save response for use in complete callback
+ response = arguments;
- // inject the contents of the document in, removing the scripts
- // to avoid any 'Permission Denied' errors in IE
- .append( responseText.replace( rscript, "" ) )
+ self.html( selector ?
- // Locate the specified elements
- .find( selector ) :
+ // If a selector was specified, locate the right elements in a dummy div
+ // Exclude scripts to avoid IE 'Permission Denied' errors
+ jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
- // If not, just inject the full result
- responseText );
+ // Otherwise use the full result
+ responseText );
- });
+ }).complete( callback && function( jqXHR, status ) {
+ self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+ });
+ }
return this;
};
// Attach a bunch of functions for handling common AJAX events
-jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
- jQuery.fn[ o ] = function( f ){
- return this.on( o, f );
- };
-});
-
-jQuery.each( [ "get", "post" ], function( i, method ) {
- jQuery[ method ] = function( url, data, callback, type ) {
- // shift arguments if data argument was omitted
- if ( jQuery.isFunction( data ) ) {
- type = type || callback;
- callback = data;
- data = undefined;
- }
-
- return jQuery.ajax({
- type: method,
- url: url,
- data: data,
- success: callback,
- dataType: type
- });
+jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ){
+ jQuery.fn[ type ] = function( fn ){
+ return this.on( type, fn );
};
});
jQuery.extend({
- getScript: function( url, callback ) {
- return jQuery.get( url, undefined, callback, "script" );
- },
-
- getJSON: function( url, data, callback ) {
- return jQuery.get( url, data, callback, "json" );
- },
+ // Counter for holding the number of active queries
+ active: 0,
- // Creates a full fledged settings object into target
- // with both ajaxSettings and settings fields.
- // If target is omitted, writes into ajaxSettings.
- ajaxSetup: function( target, settings ) {
- if ( settings ) {
- // Building a settings object
- ajaxExtend( target, jQuery.ajaxSettings );
- } else {
- // Extending ajaxSettings
- settings = target;
- target = jQuery.ajaxSettings;
- }
- ajaxExtend( target, settings );
- return target;
- },
+ // Last-Modified header cache for next request
+ lastModified: {},
+ etag: {},
ajaxSettings: {
url: ajaxLocation,
+ type: "GET",
isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
global: true,
- type: "GET",
- contentType: "application/x-www-form-urlencoded; charset=UTF-8",
processData: true,
async: true,
+ contentType: "application/x-www-form-urlencoded; charset=UTF-8",
/*
timeout: 0,
data: null,
@@ -7564,11 +7808,11 @@ jQuery.extend({
*/
accepts: {
- xml: "application/xml, text/xml",
- html: "text/html",
+ "*": allTypes,
text: "text/plain",
- json: "application/json, text/javascript",
- "*": allTypes
+ html: "text/html",
+ xml: "application/xml, text/xml",
+ json: "application/json, text/javascript"
},
contents: {
@@ -7579,16 +7823,16 @@ jQuery.extend({
responseFields: {
xml: "responseXML",
- text: "responseText"
+ text: "responseText",
+ json: "responseJSON"
},
- // List of data converters
- // 1) key format is "source_type destination_type" (a single space in-between)
- // 2) the catchall symbol "*" can be used for source_type
+ // Data converters
+ // Keys separate source (or catchall "*") and destination types with a single space
converters: {
// Convert anything to text
- "* text": window.String,
+ "* text": String,
// Text to html (true = no transformation)
"text html": true,
@@ -7605,11 +7849,24 @@ jQuery.extend({
// and when you create one that shouldn't be
// deep extended (see ajaxExtend)
flatOptions: {
- context: true,
- url: true
+ url: true,
+ context: true
}
},
+ // Creates a full fledged settings object into target
+ // with both ajaxSettings and settings fields.
+ // If target is omitted, writes into ajaxSettings.
+ ajaxSetup: function( target, settings ) {
+ return settings ?
+
+ // Building a settings object
+ ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+ // Extending ajaxSettings
+ ajaxExtend( jQuery.ajaxSettings, target );
+ },
+
ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
ajaxTransport: addToPrefiltersOrTransports( transports ),
@@ -7625,34 +7882,34 @@ jQuery.extend({
// Force options to be an object
options = options || {};
- var // ifModified key
- ifModifiedKey,
- // Response headers
+ var // Cross-domain detection vars
+ parts,
+ // Loop variable
+ i,
+ // URL without anti-cache param
+ cacheURL,
+ // Response headers as string
responseHeadersString,
- responseHeaders,
- // transport
- transport,
// timeout handle
timeoutTimer,
- // Cross-domain detection vars
- parts,
+
// To know if global events are to be dispatched
fireGlobals,
- // Loop variable
- i,
+
+ transport,
+ // Response headers
+ responseHeaders,
// Create the final options object
s = jQuery.ajaxSetup( {}, options ),
// Callbacks context
callbackContext = s.context || s,
- // Context for global events
- // It's the callbackContext if one was provided in the options
- // and if it's a DOM node or a jQuery collection
- globalEventContext = callbackContext !== s &&
- ( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
- jQuery( callbackContext ) : jQuery.event,
+ // Context for global events is callbackContext if it is a DOM node or jQuery collection
+ globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
+ jQuery( callbackContext ) :
+ jQuery.event,
// Deferreds
deferred = jQuery.Deferred(),
- completeDeferred = jQuery.Callbacks( "once memory" ),
+ completeDeferred = jQuery.Callbacks("once memory"),
// Status-dependent callbacks
statusCode = s.statusCode || {},
// Headers (they are sent all at once)
@@ -7664,37 +7921,36 @@ jQuery.extend({
strAbort = "canceled",
// Fake xhr
jqXHR = {
-
readyState: 0,
- // Caches the header
- setRequestHeader: function( name, value ) {
- if ( !state ) {
- var lname = name.toLowerCase();
- name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
- requestHeaders[ name ] = value;
- }
- return this;
- },
-
- // Raw string
- getAllResponseHeaders: function() {
- return state === 2 ? responseHeadersString : null;
- },
-
// Builds headers hashtable if needed
getResponseHeader: function( key ) {
var match;
if ( state === 2 ) {
if ( !responseHeaders ) {
responseHeaders = {};
- while( ( match = rheaders.exec( responseHeadersString ) ) ) {
+ while ( (match = rheaders.exec( responseHeadersString )) ) {
responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
}
}
match = responseHeaders[ key.toLowerCase() ];
}
- return match === undefined ? null : match;
+ return match == null ? null : match;
+ },
+
+ // Raw string
+ getAllResponseHeaders: function() {
+ return state === 2 ? responseHeadersString : null;
+ },
+
+ // Caches the header
+ setRequestHeader: function( name, value ) {
+ var lname = name.toLowerCase();
+ if ( !state ) {
+ name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+ requestHeaders[ name ] = value;
+ }
+ return this;
},
// Overrides response content-type header
@@ -7705,164 +7961,58 @@ jQuery.extend({
return this;
},
+ // Status-dependent callbacks
+ statusCode: function( map ) {
+ var code;
+ if ( map ) {
+ if ( state < 2 ) {
+ for ( code in map ) {
+ // Lazy-add the new callback in a way that preserves old ones
+ statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+ }
+ } else {
+ // Execute the appropriate callbacks
+ jqXHR.always( map[ jqXHR.status ] );
+ }
+ }
+ return this;
+ },
+
// Cancel the request
abort: function( statusText ) {
- statusText = statusText || strAbort;
+ var finalText = statusText || strAbort;
if ( transport ) {
- transport.abort( statusText );
+ transport.abort( finalText );
}
- done( 0, statusText );
+ done( 0, finalText );
return this;
}
};
- // Callback for when everything is done
- // It is defined here because jslint complains if it is declared
- // at the end of the function (which would be more logical and readable)
- function done( status, nativeStatusText, responses, headers ) {
- var isSuccess, success, error, response, modified,
- statusText = nativeStatusText;
-
- // Called once
- if ( state === 2 ) {
- return;
- }
-
- // State is "done" now
- state = 2;
-
- // Clear timeout if it exists
- if ( timeoutTimer ) {
- clearTimeout( timeoutTimer );
- }
-
- // Dereference transport for early garbage collection
- // (no matter how long the jqXHR object will be used)
- transport = undefined;
-
- // Cache response headers
- responseHeadersString = headers || "";
-
- // Set readyState
- jqXHR.readyState = status > 0 ? 4 : 0;
-
- // Get response data
- if ( responses ) {
- response = ajaxHandleResponses( s, jqXHR, responses );
- }
-
- // If successful, handle type chaining
- if ( status >= 200 && status < 300 || status === 304 ) {
-
- // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
- if ( s.ifModified ) {
-
- modified = jqXHR.getResponseHeader("Last-Modified");
- if ( modified ) {
- jQuery.lastModified[ ifModifiedKey ] = modified;
- }
- modified = jqXHR.getResponseHeader("Etag");
- if ( modified ) {
- jQuery.etag[ ifModifiedKey ] = modified;
- }
- }
-
- // If not modified
- if ( status === 304 ) {
-
- statusText = "notmodified";
- isSuccess = true;
-
- // If we have data
- } else {
-
- isSuccess = ajaxConvert( s, response );
- statusText = isSuccess.state;
- success = isSuccess.data;
- error = isSuccess.error;
- isSuccess = !error;
- }
- } else {
- // We extract error from statusText
- // then normalize statusText and status for non-aborts
- error = statusText;
- if ( !statusText || status ) {
- statusText = "error";
- if ( status < 0 ) {
- status = 0;
- }
- }
- }
-
- // Set data for the fake xhr object
- jqXHR.status = status;
- jqXHR.statusText = ( nativeStatusText || statusText ) + "";
-
- // Success/Error
- if ( isSuccess ) {
- deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
- } else {
- deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
- }
-
- // Status-dependent callbacks
- jqXHR.statusCode( statusCode );
- statusCode = undefined;
-
- if ( fireGlobals ) {
- globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
- [ jqXHR, s, isSuccess ? success : error ] );
- }
-
- // Complete
- completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
-
- if ( fireGlobals ) {
- globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
- // Handle the global AJAX counter
- if ( !( --jQuery.active ) ) {
- jQuery.event.trigger( "ajaxStop" );
- }
- }
- }
-
// Attach deferreds
- deferred.promise( jqXHR );
+ deferred.promise( jqXHR ).complete = completeDeferred.add;
jqXHR.success = jqXHR.done;
jqXHR.error = jqXHR.fail;
- jqXHR.complete = completeDeferred.add;
-
- // Status-dependent callbacks
- jqXHR.statusCode = function( map ) {
- if ( map ) {
- var tmp;
- if ( state < 2 ) {
- for ( tmp in map ) {
- statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
- }
- } else {
- tmp = map[ jqXHR.status ];
- jqXHR.always( tmp );
- }
- }
- return this;
- };
// Remove hash character (#7531: and string promotion)
// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+ // Handle falsy url in the settings object (#10093: consistency with old signature)
// We also use the url parameter if available
- s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+ s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+ // Alias method option to type as per ticket #12004
+ s.type = options.method || options.type || s.method || s.type;
// Extract dataTypes list
- s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( core_rspace );
+ s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( core_rnotwhite ) || [""];
// A cross-domain request is in order when we have a protocol:host:port mismatch
if ( s.crossDomain == null ) {
parts = rurl.exec( s.url.toLowerCase() );
s.crossDomain = !!( parts &&
( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
- ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
- ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
+ ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
+ ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
);
}
@@ -7882,58 +8032,58 @@ jQuery.extend({
// We can fire global events as of now if asked to
fireGlobals = s.global;
+ // Watch for a new set of requests
+ if ( fireGlobals && jQuery.active++ === 0 ) {
+ jQuery.event.trigger("ajaxStart");
+ }
+
// Uppercase the type
s.type = s.type.toUpperCase();
// Determine if request has content
s.hasContent = !rnoContent.test( s.type );
- // Watch for a new set of requests
- if ( fireGlobals && jQuery.active++ === 0 ) {
- jQuery.event.trigger( "ajaxStart" );
- }
+ // Save the URL in case we're toying with the If-Modified-Since
+ // and/or If-None-Match header later on
+ cacheURL = s.url;
// More options handling for requests with no content
if ( !s.hasContent ) {
// If data is available, append data to url
if ( s.data ) {
- s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+ cacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
// #9682: remove data so that it's not used in an eventual retry
delete s.data;
}
- // Get ifModifiedKey before adding the anti-cache parameter
- ifModifiedKey = s.url;
-
// Add anti-cache in url if needed
if ( s.cache === false ) {
+ s.url = rts.test( cacheURL ) ?
- var ts = jQuery.now(),
- // try replacing _= if it is there
- ret = s.url.replace( rts, "$1_=" + ts );
+ // If there is already a '_' parameter, set its value
+ cacheURL.replace( rts, "$1_=" + ajax_nonce++ ) :
- // if nothing was replaced, add timestamp to the end
- s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+ // Otherwise add one to the end
+ cacheURL + ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ajax_nonce++;
}
}
- // Set the correct header, if data is being sent
- if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
- jqXHR.setRequestHeader( "Content-Type", s.contentType );
- }
-
// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
if ( s.ifModified ) {
- ifModifiedKey = ifModifiedKey || s.url;
- if ( jQuery.lastModified[ ifModifiedKey ] ) {
- jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
+ if ( jQuery.lastModified[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
}
- if ( jQuery.etag[ ifModifiedKey ] ) {
- jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
+ if ( jQuery.etag[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
}
}
+ // Set the correct header, if data is being sent
+ if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+ jqXHR.setRequestHeader( "Content-Type", s.contentType );
+ }
+
// Set the Accepts header for the server, depending on the dataType
jqXHR.setRequestHeader(
"Accept",
@@ -7949,9 +8099,8 @@ jQuery.extend({
// Allow custom headers/mimetypes and early abort
if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
- // Abort if not done already and return
- return jqXHR.abort();
-
+ // Abort if not done already and return
+ return jqXHR.abort();
}
// aborting is no longer a cancellation
@@ -7970,21 +8119,22 @@ jQuery.extend({
done( -1, "No Transport" );
} else {
jqXHR.readyState = 1;
+
// Send global event
if ( fireGlobals ) {
globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
}
// Timeout
if ( s.async && s.timeout > 0 ) {
- timeoutTimer = setTimeout( function(){
- jqXHR.abort( "timeout" );
+ timeoutTimer = setTimeout(function() {
+ jqXHR.abort("timeout");
}, s.timeout );
}
try {
state = 1;
transport.send( requestHeaders, done );
- } catch (e) {
+ } catch ( e ) {
// Propagate exception as error if not done
if ( state < 2 ) {
done( -1, e );
@@ -7995,42 +8145,164 @@ jQuery.extend({
}
}
+ // Callback for when everything is done
+ function done( status, nativeStatusText, responses, headers ) {
+ var isSuccess, success, error, response, modified,
+ statusText = nativeStatusText;
+
+ // Called once
+ if ( state === 2 ) {
+ return;
+ }
+
+ // State is "done" now
+ state = 2;
+
+ // Clear timeout if it exists
+ if ( timeoutTimer ) {
+ clearTimeout( timeoutTimer );
+ }
+
+ // Dereference transport for early garbage collection
+ // (no matter how long the jqXHR object will be used)
+ transport = undefined;
+
+ // Cache response headers
+ responseHeadersString = headers || "";
+
+ // Set readyState
+ jqXHR.readyState = status > 0 ? 4 : 0;
+
+ // Determine if successful
+ isSuccess = status >= 200 && status < 300 || status === 304;
+
+ // Get response data
+ if ( responses ) {
+ response = ajaxHandleResponses( s, jqXHR, responses );
+ }
+
+ // Convert no matter what (that way responseXXX fields are always set)
+ response = ajaxConvert( s, response, jqXHR, isSuccess );
+
+ // If successful, handle type chaining
+ if ( isSuccess ) {
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ modified = jqXHR.getResponseHeader("Last-Modified");
+ if ( modified ) {
+ jQuery.lastModified[ cacheURL ] = modified;
+ }
+ modified = jqXHR.getResponseHeader("etag");
+ if ( modified ) {
+ jQuery.etag[ cacheURL ] = modified;
+ }
+ }
+
+ // if no content
+ if ( status === 204 || s.type === "HEAD" ) {
+ statusText = "nocontent";
+
+ // if not modified
+ } else if ( status === 304 ) {
+ statusText = "notmodified";
+
+ // If we have data, let's convert it
+ } else {
+ statusText = response.state;
+ success = response.data;
+ error = response.error;
+ isSuccess = !error;
+ }
+ } else {
+ // We extract error from statusText
+ // then normalize statusText and status for non-aborts
+ error = statusText;
+ if ( status || !statusText ) {
+ statusText = "error";
+ if ( status < 0 ) {
+ status = 0;
+ }
+ }
+ }
+
+ // Set data for the fake xhr object
+ jqXHR.status = status;
+ jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+ // Success/Error
+ if ( isSuccess ) {
+ deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+ } else {
+ deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+ }
+
+ // Status-dependent callbacks
+ jqXHR.statusCode( statusCode );
+ statusCode = undefined;
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
+ [ jqXHR, s, isSuccess ? success : error ] );
+ }
+
+ // Complete
+ completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+ // Handle the global AJAX counter
+ if ( !( --jQuery.active ) ) {
+ jQuery.event.trigger("ajaxStop");
+ }
+ }
+ }
+
return jqXHR;
},
- // Counter for holding the number of active queries
- active: 0,
+ getJSON: function( url, data, callback ) {
+ return jQuery.get( url, data, callback, "json" );
+ },
- // Last-Modified header cache for next request
- lastModified: {},
- etag: {}
+ getScript: function( url, callback ) {
+ return jQuery.get( url, undefined, callback, "script" );
+ }
+});
+jQuery.each( [ "get", "post" ], function( i, method ) {
+ jQuery[ method ] = function( url, data, callback, type ) {
+ // shift arguments if data argument was omitted
+ if ( jQuery.isFunction( data ) ) {
+ type = type || callback;
+ callback = data;
+ data = undefined;
+ }
+
+ return jQuery.ajax({
+ url: url,
+ type: method,
+ dataType: type,
+ data: data,
+ success: callback
+ });
+ };
});
/* Handles responses to an ajax request:
- * - sets all responseXXX fields accordingly
* - finds the right dataType (mediates between content-type and expected dataType)
* - returns the corresponding response
*/
function ajaxHandleResponses( s, jqXHR, responses ) {
-
- var ct, type, finalDataType, firstDataType,
+ var firstDataType, ct, finalDataType, type,
contents = s.contents,
- dataTypes = s.dataTypes,
- responseFields = s.responseFields;
-
- // Fill responseXXX fields
- for ( type in responseFields ) {
- if ( type in responses ) {
- jqXHR[ responseFields[type] ] = responses[ type ];
- }
- }
+ dataTypes = s.dataTypes;
// Remove auto dataType and get content-type in the process
while( dataTypes[ 0 ] === "*" ) {
dataTypes.shift();
if ( ct === undefined ) {
- ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
+ ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
}
}
@@ -8073,20 +8345,14 @@ function ajaxHandleResponses( s, jqXHR, responses ) {
}
}
-// Chain conversions given the request and the original response
-function ajaxConvert( s, response ) {
-
- var conv, conv2, current, tmp,
- // Work with a copy of dataTypes in case we need to modify it for conversion
- dataTypes = s.dataTypes.slice(),
- prev = dataTypes[ 0 ],
+/* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
+ var conv2, current, conv, tmp, prev,
converters = {},
- i = 0;
-
- // Apply the dataFilter if provided
- if ( s.dataFilter ) {
- response = s.dataFilter( response, s.dataType );
- }
+ // Work with a copy of dataTypes in case we need to modify it for conversion
+ dataTypes = s.dataTypes.slice();
// Create converters map with lowercased keys
if ( dataTypes[ 1 ] ) {
@@ -8095,14 +8361,32 @@ function ajaxConvert( s, response ) {
}
}
- // Convert to each sequential dataType, tolerating list modification
- for ( ; (current = dataTypes[++i]); ) {
+ current = dataTypes.shift();
+
+ // Convert to each sequential dataType
+ while ( current ) {
+
+ if ( s.responseFields[ current ] ) {
+ jqXHR[ s.responseFields[ current ] ] = response;
+ }
+
+ // Apply the dataFilter if provided
+ if ( !prev && isSuccess && s.dataFilter ) {
+ response = s.dataFilter( response, s.dataType );
+ }
+
+ prev = current;
+ current = dataTypes.shift();
- // There's only work to do if current dataType is non-auto
- if ( current !== "*" ) {
+ if ( current ) {
+
+ // There's only work to do if current dataType is non-auto
+ if ( current === "*" ) {
+
+ current = prev;
// Convert response if prev dataType is non-auto and differs from current
- if ( prev !== "*" && prev !== current ) {
+ } else if ( prev !== "*" && prev !== current ) {
// Seek a direct converter
conv = converters[ prev + " " + current ] || converters[ "* " + current ];
@@ -8112,7 +8396,7 @@ function ajaxConvert( s, response ) {
for ( conv2 in converters ) {
// If conv2 outputs current
- tmp = conv2.split(" ");
+ tmp = conv2.split( " " );
if ( tmp[ 1 ] === current ) {
// If prev can be converted to accepted input
@@ -8126,9 +8410,8 @@ function ajaxConvert( s, response ) {
// Otherwise, insert the intermediate dataType
} else if ( converters[ conv2 ] !== true ) {
current = tmp[ 0 ];
- dataTypes.splice( i--, 0, current );
+ dataTypes.unshift( tmp[ 1 ] );
}
-
break;
}
}
@@ -8139,7 +8422,7 @@ function ajaxConvert( s, response ) {
if ( conv !== true ) {
// Unless errors are allowed to bubble, catch and return them
- if ( conv && s["throws"] ) {
+ if ( conv && s[ "throws" ] ) {
response = conv( response );
} else {
try {
@@ -8150,108 +8433,18 @@ function ajaxConvert( s, response ) {
}
}
}
-
- // Update prev for next iteration
- prev = current;
}
}
return { state: "success", data: response };
}
-var oldCallbacks = [],
- rquestion = /\?/,
- rjsonp = /(=)\?(?=&|$)|\?\?/,
- nonce = jQuery.now();
-
-// Default jsonp settings
-jQuery.ajaxSetup({
- jsonp: "callback",
- jsonpCallback: function() {
- var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
- this[ callback ] = true;
- return callback;
- }
-});
-
-// Detect, normalize options and install callbacks for jsonp requests
-jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
-
- var callbackName, overwritten, responseContainer,
- data = s.data,
- url = s.url,
- hasCallback = s.jsonp !== false,
- replaceInUrl = hasCallback && rjsonp.test( url ),
- replaceInData = hasCallback && !replaceInUrl && typeof data === "string" &&
- !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") &&
- rjsonp.test( data );
-
- // Handle iff the expected data type is "jsonp" or we have a parameter to set
- if ( s.dataTypes[ 0 ] === "jsonp" || replaceInUrl || replaceInData ) {
-
- // Get callback name, remembering preexisting value associated with it
- callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
- s.jsonpCallback() :
- s.jsonpCallback;
- overwritten = window[ callbackName ];
-
- // Insert callback into url or form data
- if ( replaceInUrl ) {
- s.url = url.replace( rjsonp, "$1" + callbackName );
- } else if ( replaceInData ) {
- s.data = data.replace( rjsonp, "$1" + callbackName );
- } else if ( hasCallback ) {
- s.url += ( rquestion.test( url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
- }
-
- // Use data converter to retrieve json after script execution
- s.converters["script json"] = function() {
- if ( !responseContainer ) {
- jQuery.error( callbackName + " was not called" );
- }
- return responseContainer[ 0 ];
- };
-
- // force json dataType
- s.dataTypes[ 0 ] = "json";
-
- // Install callback
- window[ callbackName ] = function() {
- responseContainer = arguments;
- };
-
- // Clean-up function (fires after converters)
- jqXHR.always(function() {
- // Restore preexisting value
- window[ callbackName ] = overwritten;
-
- // Save back as free
- if ( s[ callbackName ] ) {
- // make sure that re-using the options doesn't screw things around
- s.jsonpCallback = originalSettings.jsonpCallback;
-
- // save the callback name for future use
- oldCallbacks.push( callbackName );
- }
-
- // Call if it was a function and we have a response
- if ( responseContainer && jQuery.isFunction( overwritten ) ) {
- overwritten( responseContainer[ 0 ] );
- }
-
- responseContainer = overwritten = undefined;
- });
-
- // Delegate to script
- return "script";
- }
-});
// Install script dataType
jQuery.ajaxSetup({
accepts: {
script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
},
contents: {
- script: /javascript|ecmascript/
+ script: /(?:java|ecma)script/
},
converters: {
"text script": function( text ) {
@@ -8279,15 +8472,15 @@ jQuery.ajaxTransport( "script", function(s) {
if ( s.crossDomain ) {
var script,
- head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+ head = document.head || jQuery("head")[0] || document.documentElement;
return {
send: function( _, callback ) {
- script = document.createElement( "script" );
+ script = document.createElement("script");
- script.async = "async";
+ script.async = true;
if ( s.scriptCharset ) {
script.charset = s.scriptCharset;
@@ -8304,12 +8497,12 @@ jQuery.ajaxTransport( "script", function(s) {
script.onload = script.onreadystatechange = null;
// Remove the script
- if ( head && script.parentNode ) {
- head.removeChild( script );
+ if ( script.parentNode ) {
+ script.parentNode.removeChild( script );
}
// Dereference the script
- script = undefined;
+ script = null;
// Callback if not abort
if ( !isAbort ) {
@@ -8317,28 +8510,110 @@ jQuery.ajaxTransport( "script", function(s) {
}
}
};
- // Use insertBefore instead of appendChild to circumvent an IE6 bug.
- // This arises when a base node is used (#2709 and #4378).
+
+ // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
+ // Use native DOM manipulation to avoid our domManip AJAX trickery
head.insertBefore( script, head.firstChild );
},
abort: function() {
if ( script ) {
- script.onload( 0, 1 );
+ script.onload( undefined, true );
}
}
};
}
});
-var xhrCallbacks,
+var oldCallbacks = [],
+ rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+ jsonp: "callback",
+ jsonpCallback: function() {
+ var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( ajax_nonce++ ) );
+ this[ callback ] = true;
+ return callback;
+ }
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+ var callbackName, overwritten, responseContainer,
+ jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+ "url" :
+ typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
+ );
+
+ // Handle iff the expected data type is "jsonp" or we have a parameter to set
+ if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
+
+ // Get callback name, remembering preexisting value associated with it
+ callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+ s.jsonpCallback() :
+ s.jsonpCallback;
+
+ // Insert callback into url or form data
+ if ( jsonProp ) {
+ s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+ } else if ( s.jsonp !== false ) {
+ s.url += ( ajax_rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+ }
+
+ // Use data converter to retrieve json after script execution
+ s.converters["script json"] = function() {
+ if ( !responseContainer ) {
+ jQuery.error( callbackName + " was not called" );
+ }
+ return responseContainer[ 0 ];
+ };
+
+ // force json dataType
+ s.dataTypes[ 0 ] = "json";
+
+ // Install callback
+ overwritten = window[ callbackName ];
+ window[ callbackName ] = function() {
+ responseContainer = arguments;
+ };
+
+ // Clean-up function (fires after converters)
+ jqXHR.always(function() {
+ // Restore preexisting value
+ window[ callbackName ] = overwritten;
+
+ // Save back as free
+ if ( s[ callbackName ] ) {
+ // make sure that re-using the options doesn't screw things around
+ s.jsonpCallback = originalSettings.jsonpCallback;
+
+ // save the callback name for future use
+ oldCallbacks.push( callbackName );
+ }
+
+ // Call if it was a function and we have a response
+ if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+ overwritten( responseContainer[ 0 ] );
+ }
+
+ responseContainer = overwritten = undefined;
+ });
+
+ // Delegate to script
+ return "script";
+ }
+});
+var xhrCallbacks, xhrSupported,
+ xhrId = 0,
// #5280: Internet Explorer will keep connections alive if we don't abort on unload
- xhrOnUnloadAbort = window.ActiveXObject ? function() {
+ xhrOnUnloadAbort = window.ActiveXObject && function() {
// Abort all pending requests
- for ( var key in xhrCallbacks ) {
- xhrCallbacks[ key ]( 0, 1 );
+ var key;
+ for ( key in xhrCallbacks ) {
+ xhrCallbacks[ key ]( undefined, true );
}
- } : false,
- xhrId = 0;
+ };
// Functions to create xhrs
function createStandardXHR() {
@@ -8349,7 +8624,7 @@ function createStandardXHR() {
function createActiveXHR() {
try {
- return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+ return new window.ActiveXObject("Microsoft.XMLHTTP");
} catch( e ) {}
}
@@ -8369,15 +8644,12 @@ jQuery.ajaxSettings.xhr = window.ActiveXObject ?
createStandardXHR;
// Determine support properties
-(function( xhr ) {
- jQuery.extend( jQuery.support, {
- ajax: !!xhr,
- cors: !!xhr && ( "withCredentials" in xhr )
- });
-})( jQuery.ajaxSettings.xhr() );
+xhrSupported = jQuery.ajaxSettings.xhr();
+jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+xhrSupported = jQuery.support.ajax = !!xhrSupported;
// Create transport if the browser can provide an xhr
-if ( jQuery.support.ajax ) {
+if ( xhrSupported ) {
jQuery.ajaxTransport(function( s ) {
// Cross domain only allowed if supported through XMLHttpRequest
@@ -8418,7 +8690,7 @@ if ( jQuery.support.ajax ) {
// (it can always be set on a per-request basis or even using ajaxSetup)
// For same-domain requests, won't change header if already provided.
if ( !s.crossDomain && !headers["X-Requested-With"] ) {
- headers[ "X-Requested-With" ] = "XMLHttpRequest";
+ headers["X-Requested-With"] = "XMLHttpRequest";
}
// Need an extra try/catch for cross domain requests in Firefox 3
@@ -8426,7 +8698,7 @@ if ( jQuery.support.ajax ) {
for ( i in headers ) {
xhr.setRequestHeader( i, headers[ i ] );
}
- } catch( _ ) {}
+ } catch( err ) {}
// Do send the request
// This may raise an exception which is actually
@@ -8435,12 +8707,7 @@ if ( jQuery.support.ajax ) {
// Listener
callback = function( _, isAbort ) {
-
- var status,
- statusText,
- responseHeaders,
- responses,
- xml;
+ var status, responseHeaders, statusText, responses;
// Firefox throws exceptions when accessing properties
// of an xhr when a network error occurred
@@ -8468,21 +8735,14 @@ if ( jQuery.support.ajax ) {
xhr.abort();
}
} else {
+ responses = {};
status = xhr.status;
responseHeaders = xhr.getAllResponseHeaders();
- responses = {};
- xml = xhr.responseXML;
-
- // Construct response list
- if ( xml && xml.documentElement /* #4958 */ ) {
- responses.xml = xml;
- }
// When requesting binary data, IE6-9 will throw an exception
// on any attempt to access responseText (#11426)
- try {
+ if ( typeof xhr.responseText === "string" ) {
responses.text = xhr.responseText;
- } catch( e ) {
}
// Firefox throws an exception when accessing
@@ -8525,7 +8785,7 @@ if ( jQuery.support.ajax ) {
} else if ( xhr.readyState === 4 ) {
// (IE6 & IE7) if it's in cache and has been
// retrieved directly we need to fire the callback
- setTimeout( callback, 0 );
+ setTimeout( callback );
} else {
handle = ++xhrId;
if ( xhrOnUnloadAbort ) {
@@ -8544,7 +8804,7 @@ if ( jQuery.support.ajax ) {
abort: function() {
if ( callback ) {
- callback(0,1);
+ callback( undefined, true );
}
}
};
@@ -8553,49 +8813,56 @@ if ( jQuery.support.ajax ) {
}
var fxNow, timerId,
rfxtypes = /^(?:toggle|show|hide)$/,
- rfxnum = new RegExp( "^(?:([-+])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
+ rfxnum = new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
rrun = /queueHooks$/,
animationPrefilters = [ defaultPrefilter ],
tweeners = {
"*": [function( prop, value ) {
- var end, unit,
- tween = this.createTween( prop, value ),
- parts = rfxnum.exec( value ),
+ var tween = this.createTween( prop, value ),
target = tween.cur(),
- start = +target || 0,
+ parts = rfxnum.exec( value ),
+ unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+ // Starting value computation is required for potential unit mismatches
+ start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
+ rfxnum.exec( jQuery.css( tween.elem, prop ) ),
scale = 1,
maxIterations = 20;
- if ( parts ) {
- end = +parts[2];
- unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+ if ( start && start[ 3 ] !== unit ) {
+ // Trust units reported by jQuery.css
+ unit = unit || start[ 3 ];
- // We need to compute starting value
- if ( unit !== "px" && start ) {
- // Iteratively approximate from a nonzero starting point
- // Prefer the current property, because this process will be trivial if it uses the same units
- // Fallback to end or a simple constant
- start = jQuery.css( tween.elem, prop, true ) || end || 1;
+ // Make sure we update the tween properties later on
+ parts = parts || [];
- do {
- // If previous iteration zeroed out, double until we get *something*
- // Use a string for doubling factor so we don't accidentally see scale as unchanged below
- scale = scale || ".5";
+ // Iteratively approximate from a nonzero starting point
+ start = +target || 1;
- // Adjust and apply
- start = start / scale;
- jQuery.style( tween.elem, prop, start + unit );
+ do {
+ // If previous iteration zeroed out, double until we get *something*
+ // Use a string for doubling factor so we don't accidentally see scale as unchanged below
+ scale = scale || ".5";
- // Update scale, tolerating zero or NaN from tween.cur()
- // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
- } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
- }
+ // Adjust and apply
+ start = start / scale;
+ jQuery.style( tween.elem, prop, start + unit );
+
+ // Update scale, tolerating zero or NaN from tween.cur()
+ // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
+ } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
+ }
+ // Update tween properties
+ if ( parts ) {
+ start = tween.start = +start || +target || 0;
tween.unit = unit;
- tween.start = start;
// If a +=/-= token was provided, we're doing a relative animation
- tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
+ tween.end = parts[ 1 ] ?
+ start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
+ +parts[ 2 ];
}
+
return tween;
}]
};
@@ -8604,35 +8871,37 @@ var fxNow, timerId,
function createFxNow() {
setTimeout(function() {
fxNow = undefined;
- }, 0 );
+ });
return ( fxNow = jQuery.now() );
}
-function createTweens( animation, props ) {
- jQuery.each( props, function( prop, value ) {
- var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
- index = 0,
- length = collection.length;
- for ( ; index < length; index++ ) {
- if ( collection[ index ].call( animation, prop, value ) ) {
+function createTween( value, prop, animation ) {
+ var tween,
+ collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+ index = 0,
+ length = collection.length;
+ for ( ; index < length; index++ ) {
+ if ( (tween = collection[ index ].call( animation, prop, value )) ) {
- // we're done with this property
- return;
- }
+ // we're done with this property
+ return tween;
}
- });
+ }
}
function Animation( elem, properties, options ) {
var result,
+ stopped,
index = 0,
- tweenerIndex = 0,
length = animationPrefilters.length,
deferred = jQuery.Deferred().always( function() {
// don't match elem in the :animated selector
delete tick.elem;
}),
tick = function() {
+ if ( stopped ) {
+ return false;
+ }
var currentTime = fxNow || createFxNow(),
remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
@@ -8663,7 +8932,7 @@ function Animation( elem, properties, options ) {
startTime: fxNow || createFxNow(),
duration: options.duration,
tweens: [],
- createTween: function( prop, end, easing ) {
+ createTween: function( prop, end ) {
var tween = jQuery.Tween( elem, animation.opts, prop, end,
animation.opts.specialEasing[ prop ] || animation.opts.easing );
animation.tweens.push( tween );
@@ -8674,7 +8943,10 @@ function Animation( elem, properties, options ) {
// if we are going to the end, we want to run all the tweens
// otherwise we skip this part
length = gotoEnd ? animation.tweens.length : 0;
-
+ if ( stopped ) {
+ return this;
+ }
+ stopped = true;
for ( ; index < length ; index++ ) {
animation.tweens[ index ].run( 1 );
}
@@ -8700,7 +8972,7 @@ function Animation( elem, properties, options ) {
}
}
- createTweens( animation, props );
+ jQuery.map( props, createTween, animation );
if ( jQuery.isFunction( animation.opts.start ) ) {
animation.opts.start.call( elem, animation );
@@ -8708,9 +8980,9 @@ function Animation( elem, properties, options ) {
jQuery.fx.timer(
jQuery.extend( tick, {
+ elem: elem,
anim: animation,
- queue: animation.opts.queue,
- elem: elem
+ queue: animation.opts.queue
})
);
@@ -8789,12 +9061,13 @@ jQuery.Animation = jQuery.extend( Animation, {
});
function defaultPrefilter( elem, props, opts ) {
- var index, prop, value, length, dataShow, toggle, tween, hooks, oldfire,
+ /* jshint validthis: true */
+ var prop, value, toggle, tween, hooks, oldfire,
anim = this,
- style = elem.style,
orig = {},
- handled = [],
- hidden = elem.nodeType && isHidden( elem );
+ style = elem.style,
+ hidden = elem.nodeType && isHidden( elem ),
+ dataShow = jQuery._data( elem, "fxshow" );
// handle queue: false promises
if ( !opts.queue ) {
@@ -8849,7 +9122,7 @@ function defaultPrefilter( elem, props, opts ) {
if ( opts.overflow ) {
style.overflow = "hidden";
if ( !jQuery.support.shrinkWrapBlocks ) {
- anim.done(function() {
+ anim.always(function() {
style.overflow = opts.overflow[ 0 ];
style.overflowX = opts.overflow[ 1 ];
style.overflowY = opts.overflow[ 2 ];
@@ -8859,23 +9132,25 @@ function defaultPrefilter( elem, props, opts ) {
// show/hide pass
- for ( index in props ) {
- value = props[ index ];
+ for ( prop in props ) {
+ value = props[ prop ];
if ( rfxtypes.exec( value ) ) {
- delete props[ index ];
+ delete props[ prop ];
toggle = toggle || value === "toggle";
if ( value === ( hidden ? "hide" : "show" ) ) {
continue;
}
- handled.push( index );
+ orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
}
}
- length = handled.length;
- if ( length ) {
- dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
- if ( "hidden" in dataShow ) {
- hidden = dataShow.hidden;
+ if ( !jQuery.isEmptyObject( orig ) ) {
+ if ( dataShow ) {
+ if ( "hidden" in dataShow ) {
+ hidden = dataShow.hidden;
+ }
+ } else {
+ dataShow = jQuery._data( elem, "fxshow", {} );
}
// store state if its toggle - enables .stop().toggle() to "reverse"
@@ -8891,15 +9166,13 @@ function defaultPrefilter( elem, props, opts ) {
}
anim.done(function() {
var prop;
- jQuery.removeData( elem, "fxshow", true );
+ jQuery._removeData( elem, "fxshow" );
for ( prop in orig ) {
jQuery.style( elem, prop, orig[ prop ] );
}
});
- for ( index = 0 ; index < length ; index++ ) {
- prop = handled[ index ];
- tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
- orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
+ for ( prop in orig ) {
+ tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
if ( !( prop in dataShow ) ) {
dataShow[ prop ] = tween.start;
@@ -8973,11 +9246,11 @@ Tween.propHooks = {
return tween.elem[ tween.prop ];
}
- // passing any value as a 4th parameter to .css will automatically
+ // passing an empty string as a 3rd parameter to .css will automatically
// attempt a parseFloat and fallback to a string if the parse fails
// so, simple values such as "10px" are parsed to Float.
// complex values such as "rotate(1rad)" are returned as is.
- result = jQuery.css( tween.elem, tween.prop, false, "" );
+ result = jQuery.css( tween.elem, tween.prop, "" );
// Empty strings, null, undefined and "auto" are converted to 0.
return !result || result === "auto" ? 0 : result;
},
@@ -8995,8 +9268,8 @@ Tween.propHooks = {
}
};
-// Remove in 2.0 - this supports IE8's panic based approach
-// to setting things on disconnected nodes
+// Support: IE <=9
+// Panic based approach to setting things on disconnected nodes
Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
set: function( tween ) {
@@ -9009,9 +9282,7 @@ Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
var cssFn = jQuery.fn[ name ];
jQuery.fn[ name ] = function( speed, easing, callback ) {
- return speed == null || typeof speed === "boolean" ||
- // special check for .toggle( handler, handler, ... )
- ( !i && jQuery.isFunction( speed ) && jQuery.isFunction( easing ) ) ?
+ return speed == null || typeof speed === "boolean" ?
cssFn.apply( this, arguments ) :
this.animate( genFx( name, true ), speed, easing, callback );
};
@@ -9033,11 +9304,12 @@ jQuery.fn.extend({
// Operate on a copy of prop so per-property easing won't be lost
var anim = Animation( this, jQuery.extend( {}, prop ), optall );
- // Empty animations resolve immediately
- if ( empty ) {
+ // Empty animations, or finishing resolves immediately
+ if ( empty || jQuery._data( this, "finish" ) ) {
anim.stop( true );
}
};
+ doAnimation.finish = doAnimation;
return empty || optall.queue === false ?
this.each( doAnimation ) :
@@ -9092,6 +9364,47 @@ jQuery.fn.extend({
jQuery.dequeue( this, type );
}
});
+ },
+ finish: function( type ) {
+ if ( type !== false ) {
+ type = type || "fx";
+ }
+ return this.each(function() {
+ var index,
+ data = jQuery._data( this ),
+ queue = data[ type + "queue" ],
+ hooks = data[ type + "queueHooks" ],
+ timers = jQuery.timers,
+ length = queue ? queue.length : 0;
+
+ // enable finishing flag on private data
+ data.finish = true;
+
+ // empty the queue first
+ jQuery.queue( this, type, [] );
+
+ if ( hooks && hooks.stop ) {
+ hooks.stop.call( this, true );
+ }
+
+ // look for any active animations, and finish them
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+ timers[ index ].anim.stop( true );
+ timers.splice( index, 1 );
+ }
+ }
+
+ // look for any animations in the old queue and finish them
+ for ( index = 0; index < length; index++ ) {
+ if ( queue[ index ] && queue[ index ].finish ) {
+ queue[ index ].finish.call( this );
+ }
+ }
+
+ // turn off finishing flag
+ delete data.finish;
+ });
}
});
@@ -9195,13 +9508,19 @@ jQuery.fx.tick = function() {
};
jQuery.fx.timer = function( timer ) {
- if ( timer() && jQuery.timers.push( timer ) && !timerId ) {
- timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+ if ( timer() && jQuery.timers.push( timer ) ) {
+ jQuery.fx.start();
}
};
jQuery.fx.interval = 13;
+jQuery.fx.start = function() {
+ if ( !timerId ) {
+ timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+ }
+};
+
jQuery.fx.stop = function() {
clearInterval( timerId );
timerId = null;
@@ -9224,8 +9543,6 @@ if ( jQuery.expr && jQuery.expr.filters ) {
}).length;
};
}
-var rroot = /^(?:body|html)$/i;
-
jQuery.fn.offset = function( options ) {
if ( arguments.length ) {
return options === undefined ?
@@ -9235,7 +9552,7 @@ jQuery.fn.offset = function( options ) {
});
}
- var docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft,
+ var docElem, win,
box = { top: 0, left: 0 },
elem = this[ 0 ],
doc = elem && elem.ownerDocument;
@@ -9244,10 +9561,6 @@ jQuery.fn.offset = function( options ) {
return;
}
- if ( (body = doc.body) === elem ) {
- return jQuery.offset.bodyOffset( elem );
- }
-
docElem = doc.documentElement;
// Make sure it's not a disconnected DOM node
@@ -9257,34 +9570,18 @@ jQuery.fn.offset = function( options ) {
// If we don't have gBCR, just use 0,0 rather than error
// BlackBerry 5, iOS 3 (original iPhone)
- if ( typeof elem.getBoundingClientRect !== "undefined" ) {
+ if ( typeof elem.getBoundingClientRect !== core_strundefined ) {
box = elem.getBoundingClientRect();
}
win = getWindow( doc );
- clientTop = docElem.clientTop || body.clientTop || 0;
- clientLeft = docElem.clientLeft || body.clientLeft || 0;
- scrollTop = win.pageYOffset || docElem.scrollTop;
- scrollLeft = win.pageXOffset || docElem.scrollLeft;
return {
- top: box.top + scrollTop - clientTop,
- left: box.left + scrollLeft - clientLeft
+ top: box.top + ( win.pageYOffset || docElem.scrollTop ) - ( docElem.clientTop || 0 ),
+ left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
};
};
jQuery.offset = {
- bodyOffset: function( body ) {
- var top = body.offsetTop,
- left = body.offsetLeft;
-
- if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
- top += parseFloat( jQuery.css(body, "marginTop") ) || 0;
- left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
- }
-
- return { top: top, left: left };
- },
-
setOffset: function( elem, options, i ) {
var position = jQuery.css( elem, "position" );
@@ -9333,43 +9630,49 @@ jQuery.offset = {
jQuery.fn.extend({
position: function() {
- if ( !this[0] ) {
+ if ( !this[ 0 ] ) {
return;
}
- var elem = this[0],
+ var offsetParent, offset,
+ parentOffset = { top: 0, left: 0 },
+ elem = this[ 0 ];
+
+ // fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent
+ if ( jQuery.css( elem, "position" ) === "fixed" ) {
+ // we assume that getBoundingClientRect is available when computed position is fixed
+ offset = elem.getBoundingClientRect();
+ } else {
+ // Get *real* offsetParent
+ offsetParent = this.offsetParent();
- // Get *real* offsetParent
- offsetParent = this.offsetParent(),
+ // Get correct offsets
+ offset = this.offset();
+ if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
+ parentOffset = offsetParent.offset();
+ }
- // Get correct offsets
- offset = this.offset(),
- parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+ // Add offsetParent borders
+ parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
+ parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
+ }
- // Subtract element margins
+ // Subtract parent offsets and element margins
// note: when an element has margin: auto the offsetLeft and marginLeft
// are the same in Safari causing offset.left to incorrectly be 0
- offset.top -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
- offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
-
- // Add offsetParent borders
- parentOffset.top += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
- parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
-
- // Subtract the two offsets
return {
- top: offset.top - parentOffset.top,
- left: offset.left - parentOffset.left
+ top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+ left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
};
},
offsetParent: function() {
return this.map(function() {
- var offsetParent = this.offsetParent || document.body;
- while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+ var offsetParent = this.offsetParent || docElem;
+ while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) {
offsetParent = offsetParent.offsetParent;
}
- return offsetParent || document.body;
+ return offsetParent || docElem;
});
}
});
@@ -9392,7 +9695,7 @@ jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( me
if ( win ) {
win.scrollTo(
!top ? val : jQuery( win ).scrollLeft(),
- top ? val : jQuery( win ).scrollTop()
+ top ? val : jQuery( win ).scrollTop()
);
} else {
@@ -9442,7 +9745,7 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
return value === undefined ?
// Get width or height on the element, requesting but not forcing parseFloat
- jQuery.css( elem, type, value, extra ) :
+ jQuery.css( elem, type, extra ) :
// Set width or height on the element
jQuery.style( elem, type, value, extra );
@@ -9450,23 +9753,37 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
};
});
});
-// Expose jQuery to the global object
-window.jQuery = window.$ = jQuery;
-
-// Expose jQuery as an AMD module, but only for AMD loaders that
-// understand the issues with loading multiple versions of jQuery
-// in a page that all might call define(). The loader will indicate
-// they have special allowances for multiple jQuery versions by
-// specifying define.amd.jQuery = true. Register as a named module,
-// since jQuery can be concatenated with other files that may use define,
-// but not use a proper concatenation script that understands anonymous
-// AMD modules. A named AMD is safest and most robust way to register.
-// Lowercase jquery is used because AMD module names are derived from
-// file names, and jQuery is normally delivered in a lowercase file name.
-// Do this after creating the global so that if an AMD module wants to call
-// noConflict to hide this version of jQuery, it will work.
-if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
- define( "jquery", [], function () { return jQuery; } );
+// Limit scope pollution from any deprecated API
+// (function() {
+
+// The number of elements contained in the matched element set
+jQuery.fn.size = function() {
+ return this.length;
+};
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+// })();
+if ( typeof module === "object" && module && typeof module.exports === "object" ) {
+ // Expose jQuery as module.exports in loaders that implement the Node
+ // module pattern (including browserify). Do not create the global, since
+ // the user will be storing it themselves locally, and globals are frowned
+ // upon in the Node module world.
+ module.exports = jQuery;
+} else {
+ // Otherwise expose jQuery to the global object as usual
+ window.jQuery = window.$ = jQuery;
+
+ // Register as a named AMD module, since jQuery can be concatenated with other
+ // files that may use define, but not via a proper concatenation script that
+ // understands anonymous AMD modules. A named AMD is safest and most robust
+ // way to register. Lowercase jquery is used because AMD module names are
+ // derived from file names, and jQuery is normally delivered in a lowercase
+ // file name. Do this after creating the global so that if an AMD module wants
+ // to call noConflict to hide this version of jQuery, it will work.
+ if ( typeof define === "function" && define.amd ) {
+ define( "jquery", [], function () { return jQuery; } );
+ }
}
})( window );
diff --git a/themes/default/js/jquery.min.js b/themes/default/js/jquery.min.js
index 388377952..da4170647 100644
--- a/themes/default/js/jquery.min.js
+++ b/themes/default/js/jquery.min.js
@@ -1,2 +1,6 @@
-/*! jQuery v1.8.3 jquery.com | jquery.org/license */
-(function(e,t){function _(e){var t=M[e]={};return v.each(e.split(y),function(e,n){t[n]=!0}),t}function H(e,n,r){if(r===t&&e.nodeType===1){var i="data-"+n.replace(P,"-$1").toLowerCase();r=e.getAttribute(i);if(typeof r=="string"){try{r=r==="true"?!0:r==="false"?!1:r==="null"?null:+r+""===r?+r:D.test(r)?v.parseJSON(r):r}catch(s){}v.data(e,n,r)}else r=t}return r}function B(e){var t;for(t in e){if(t==="data"&&v.isEmptyObject(e[t]))continue;if(t!=="toJSON")return!1}return!0}function et(){return!1}function tt(){return!0}function ut(e){return!e||!e.parentNode||e.parentNode.nodeType===11}function at(e,t){do e=e[t];while(e&&e.nodeType!==1);return e}function ft(e,t,n){t=t||0;if(v.isFunction(t))return v.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return v.grep(e,function(e,r){return e===t===n});if(typeof t=="string"){var r=v.grep(e,function(e){return e.nodeType===1});if(it.test(t))return v.filter(t,r,!n);t=v.filter(t,r)}return v.grep(e,function(e,r){return v.inArray(e,t)>=0===n})}function lt(e){var t=ct.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function At(e,t){if(t.nodeType!==1||!v.hasData(e))return;var n,r,i,s=v._data(e),o=v._data(t,s),u=s.events;if(u){delete o.handle,o.events={};for(n in u)for(r=0,i=u[n].length;r<i;r++)v.event.add(t,n,u[n][r])}o.data&&(o.data=v.extend({},o.data))}function Ot(e,t){var n;if(t.nodeType!==1)return;t.clearAttributes&&t.clearAttributes(),t.mergeAttributes&&t.mergeAttributes(e),n=t.nodeName.toLowerCase(),n==="object"?(t.parentNode&&(t.outerHTML=e.outerHTML),v.support.html5Clone&&e.innerHTML&&!v.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):n==="input"&&Et.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):n==="option"?t.selected=e.defaultSelected:n==="input"||n==="textarea"?t.defaultValue=e.defaultValue:n==="script"&&t.text!==e.text&&(t.text=e.text),t.removeAttribute(v.expando)}function Mt(e){return typeof e.getElementsByTagName!="undefined"?e.getElementsByTagName("*"):typeof e.querySelectorAll!="undefined"?e.querySelectorAll("*"):[]}function _t(e){Et.test(e.type)&&(e.defaultChecked=e.checked)}function Qt(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Jt.length;while(i--){t=Jt[i]+n;if(t in e)return t}return r}function Gt(e,t){return e=t||e,v.css(e,"display")==="none"||!v.contains(e.ownerDocument,e)}function Yt(e,t){var n,r,i=[],s=0,o=e.length;for(;s<o;s++){n=e[s];if(!n.style)continue;i[s]=v._data(n,"olddisplay"),t?(!i[s]&&n.style.display==="none"&&(n.style.display=""),n.style.display===""&&Gt(n)&&(i[s]=v._data(n,"olddisplay",nn(n.nodeName)))):(r=Dt(n,"display"),!i[s]&&r!=="none"&&v._data(n,"olddisplay",r))}for(s=0;s<o;s++){n=e[s];if(!n.style)continue;if(!t||n.style.display==="none"||n.style.display==="")n.style.display=t?i[s]||"":"none"}return e}function Zt(e,t,n){var r=Rt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function en(e,t,n,r){var i=n===(r?"border":"content")?4:t==="width"?1:0,s=0;for(;i<4;i+=2)n==="margin"&&(s+=v.css(e,n+$t[i],!0)),r?(n==="content"&&(s-=parseFloat(Dt(e,"padding"+$t[i]))||0),n!=="margin"&&(s-=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0)):(s+=parseFloat(Dt(e,"padding"+$t[i]))||0,n!=="padding"&&(s+=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0));return s}function tn(e,t,n){var r=t==="width"?e.offsetWidth:e.offsetHeight,i=!0,s=v.support.boxSizing&&v.css(e,"boxSizing")==="border-box";if(r<=0||r==null){r=Dt(e,t);if(r<0||r==null)r=e.style[t];if(Ut.test(r))return r;i=s&&(v.support.boxSizingReliable||r===e.style[t]),r=parseFloat(r)||0}return r+en(e,t,n||(s?"border":"content"),i)+"px"}function nn(e){if(Wt[e])return Wt[e];var t=v("<"+e+">").appendTo(i.body),n=t.css("display");t.remove();if(n==="none"||n===""){Pt=i.body.appendChild(Pt||v.extend(i.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!Ht||!Pt.createElement)Ht=(Pt.contentWindow||Pt.contentDocument).document,Ht.write("<!doctype html><html><body>"),Ht.close();t=Ht.body.appendChild(Ht.createElement(e)),n=Dt(t,"display"),i.body.removeChild(Pt)}return Wt[e]=n,n}function fn(e,t,n,r){var i;if(v.isArray(t))v.each(t,function(t,i){n||sn.test(e)?r(e,i):fn(e+"["+(typeof i=="object"?t:"")+"]",i,n,r)});else if(!n&&v.type(t)==="object")for(i in t)fn(e+"["+i+"]",t[i],n,r);else r(e,t)}function Cn(e){return function(t,n){typeof t!="string"&&(n=t,t="*");var r,i,s,o=t.toLowerCase().split(y),u=0,a=o.length;if(v.isFunction(n))for(;u<a;u++)r=o[u],s=/^\+/.test(r),s&&(r=r.substr(1)||"*"),i=e[r]=e[r]||[],i[s?"unshift":"push"](n)}}function kn(e,n,r,i,s,o){s=s||n.dataTypes[0],o=o||{},o[s]=!0;var u,a=e[s],f=0,l=a?a.length:0,c=e===Sn;for(;f<l&&(c||!u);f++)u=a[f](n,r,i),typeof u=="string"&&(!c||o[u]?u=t:(n.dataTypes.unshift(u),u=kn(e,n,r,i,u,o)));return(c||!u)&&!o["*"]&&(u=kn(e,n,r,i,"*",o)),u}function Ln(e,n){var r,i,s=v.ajaxSettings.flatOptions||{};for(r in n)n[r]!==t&&((s[r]?e:i||(i={}))[r]=n[r]);i&&v.extend(!0,e,i)}function An(e,n,r){var i,s,o,u,a=e.contents,f=e.dataTypes,l=e.responseFields;for(s in l)s in r&&(n[l[s]]=r[s]);while(f[0]==="*")f.shift(),i===t&&(i=e.mimeType||n.getResponseHeader("content-type"));if(i)for(s in a)if(a[s]&&a[s].test(i)){f.unshift(s);break}if(f[0]in r)o=f[0];else{for(s in r){if(!f[0]||e.converters[s+" "+f[0]]){o=s;break}u||(u=s)}o=o||u}if(o)return o!==f[0]&&f.unshift(o),r[o]}function On(e,t){var n,r,i,s,o=e.dataTypes.slice(),u=o[0],a={},f=0;e.dataFilter&&(t=e.dataFilter(t,e.dataType));if(o[1])for(n in e.converters)a[n.toLowerCase()]=e.converters[n];for(;i=o[++f];)if(i!=="*"){if(u!=="*"&&u!==i){n=a[u+" "+i]||a["* "+i];if(!n)for(r in a){s=r.split(" ");if(s[1]===i){n=a[u+" "+s[0]]||a["* "+s[0]];if(n){n===!0?n=a[r]:a[r]!==!0&&(i=s[0],o.splice(f--,0,i));break}}}if(n!==!0)if(n&&e["throws"])t=n(t);else try{t=n(t)}catch(l){return{state:"parsererror",error:n?l:"No conversion from "+u+" to "+i}}}u=i}return{state:"success",data:t}}function Fn(){try{return new e.XMLHttpRequest}catch(t){}}function In(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function $n(){return setTimeout(function(){qn=t},0),qn=v.now()}function Jn(e,t){v.each(t,function(t,n){var r=(Vn[t]||[]).concat(Vn["*"]),i=0,s=r.length;for(;i<s;i++)if(r[i].call(e,t,n))return})}function Kn(e,t,n){var r,i=0,s=0,o=Xn.length,u=v.Deferred().always(function(){delete a.elem}),a=function(){var t=qn||$n(),n=Math.max(0,f.startTime+f.duration-t),r=n/f.duration||0,i=1-r,s=0,o=f.tweens.length;for(;s<o;s++)f.tweens[s].run(i);return u.notifyWith(e,[f,i,n]),i<1&&o?n:(u.resolveWith(e,[f]),!1)},f=u.promise({elem:e,props:v.extend({},t),opts:v.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:qn||$n(),duration:n.duration,tweens:[],createTween:function(t,n,r){var i=v.Tween(e,f.opts,t,n,f.opts.specialEasing[t]||f.opts.easing);return f.tweens.push(i),i},stop:function(t){var n=0,r=t?f.tweens.length:0;for(;n<r;n++)f.tweens[n].run(1);return t?u.resolveWith(e,[f,t]):u.rejectWith(e,[f,t]),this}}),l=f.props;Qn(l,f.opts.specialEasing);for(;i<o;i++){r=Xn[i].call(f,e,l,f.opts);if(r)return r}return Jn(f,l),v.isFunction(f.opts.start)&&f.opts.start.call(e,f),v.fx.timer(v.extend(a,{anim:f,queue:f.opts.queue,elem:e})),f.progress(f.opts.progress).done(f.opts.done,f.opts.complete).fail(f.opts.fail).always(f.opts.always)}function Qn(e,t){var n,r,i,s,o;for(n in e){r=v.camelCase(n),i=t[r],s=e[n],v.isArray(s)&&(i=s[1],s=e[n]=s[0]),n!==r&&(e[r]=s,delete e[n]),o=v.cssHooks[r];if(o&&"expand"in o){s=o.expand(s),delete e[r];for(n in s)n in e||(e[n]=s[n],t[n]=i)}else t[r]=i}}function Gn(e,t,n){var r,i,s,o,u,a,f,l,c,h=this,p=e.style,d={},m=[],g=e.nodeType&&Gt(e);n.queue||(l=v._queueHooks(e,"fx"),l.unqueued==null&&(l.unqueued=0,c=l.empty.fire,l.empty.fire=function(){l.unqueued||c()}),l.unqueued++,h.always(function(){h.always(function(){l.unqueued--,v.queue(e,"fx").length||l.empty.fire()})})),e.nodeType===1&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],v.css(e,"display")==="inline"&&v.css(e,"float")==="none"&&(!v.support.inlineBlockNeedsLayout||nn(e.nodeName)==="inline"?p.display="inline-block":p.zoom=1)),n.overflow&&(p.overflow="hidden",v.support.shrinkWrapBlocks||h.done(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t){s=t[r];if(Un.exec(s)){delete t[r],a=a||s==="toggle";if(s===(g?"hide":"show"))continue;m.push(r)}}o=m.length;if(o){u=v._data(e,"fxshow")||v._data(e,"fxshow",{}),"hidden"in u&&(g=u.hidden),a&&(u.hidden=!g),g?v(e).show():h.done(function(){v(e).hide()}),h.done(function(){var t;v.removeData(e,"fxshow",!0);for(t in d)v.style(e,t,d[t])});for(r=0;r<o;r++)i=m[r],f=h.createTween(i,g?u[i]:0),d[i]=u[i]||v.style(e,i),i in u||(u[i]=f.start,g&&(f.end=f.start,f.start=i==="width"||i==="height"?1:0))}}function Yn(e,t,n,r,i){return new Yn.prototype.init(e,t,n,r,i)}function Zn(e,t){var n,r={height:e},i=0;t=t?1:0;for(;i<4;i+=2-t)n=$t[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function tr(e){return v.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:!1}var n,r,i=e.document,s=e.location,o=e.navigator,u=e.jQuery,a=e.$,f=Array.prototype.push,l=Array.prototype.slice,c=Array.prototype.indexOf,h=Object.prototype.toString,p=Object.prototype.hasOwnProperty,d=String.prototype.trim,v=function(e,t){return new v.fn.init(e,t,n)},m=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,g=/\S/,y=/\s+/,b=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,w=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,E=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,S=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,T=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,N=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,C=/^-ms-/,k=/-([\da-z])/gi,L=function(e,t){return(t+"").toUpperCase()},A=function(){i.addEventListener?(i.removeEventListener("DOMContentLoaded",A,!1),v.ready()):i.readyState==="complete"&&(i.detachEvent("onreadystatechange",A),v.ready())},O={};v.fn=v.prototype={constructor:v,init:function(e,n,r){var s,o,u,a;if(!e)return this;if(e.nodeType)return this.context=this[0]=e,this.length=1,this;if(typeof e=="string"){e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3?s=[null,e,null]:s=w.exec(e);if(s&&(s[1]||!n)){if(s[1])return n=n instanceof v?n[0]:n,a=n&&n.nodeType?n.ownerDocument||n:i,e=v.parseHTML(s[1],a,!0),E.test(s[1])&&v.isPlainObject(n)&&this.attr.call(e,n,!0),v.merge(this,e);o=i.getElementById(s[2]);if(o&&o.parentNode){if(o.id!==s[2])return r.find(e);this.length=1,this[0]=o}return this.context=i,this.selector=e,this}return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e)}return v.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),v.makeArray(e,this))},selector:"",jquery:"1.8.3",length:0,size:function(){return this.length},toArray:function(){return l.call(this)},get:function(e){return e==null?this.toArray():e<0?this[this.length+e]:this[e]},pushStack:function(e,t,n){var r=v.merge(this.constructor(),e);return r.prevObject=this,r.context=this.context,t==="find"?r.selector=this.selector+(this.selector?" ":"")+n:t&&(r.selector=this.selector+"."+t+"("+n+")"),r},each:function(e,t){return v.each(this,e,t)},ready:function(e){return v.ready.promise().done(e),this},eq:function(e){return e=+e,e===-1?this.slice(e):this.slice(e,e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(l.apply(this,arguments),"slice",l.call(arguments).join(","))},map:function(e){return this.pushStack(v.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:[].sort,splice:[].splice},v.fn.init.prototype=v.fn,v.extend=v.fn.extend=function(){var e,n,r,i,s,o,u=arguments[0]||{},a=1,f=arguments.length,l=!1;typeof u=="boolean"&&(l=u,u=arguments[1]||{},a=2),typeof u!="object"&&!v.isFunction(u)&&(u={}),f===a&&(u=this,--a);for(;a<f;a++)if((e=arguments[a])!=null)for(n in e){r=u[n],i=e[n];if(u===i)continue;l&&i&&(v.isPlainObject(i)||(s=v.isArray(i)))?(s?(s=!1,o=r&&v.isArray(r)?r:[]):o=r&&v.isPlainObject(r)?r:{},u[n]=v.extend(l,o,i)):i!==t&&(u[n]=i)}return u},v.extend({noConflict:function(t){return e.$===v&&(e.$=a),t&&e.jQuery===v&&(e.jQuery=u),v},isReady:!1,readyWait:1,holdReady:function(e){e?v.readyWait++:v.ready(!0)},ready:function(e){if(e===!0?--v.readyWait:v.isReady)return;if(!i.body)return setTimeout(v.ready,1);v.isReady=!0;if(e!==!0&&--v.readyWait>0)return;r.resolveWith(i,[v]),v.fn.trigger&&v(i).trigger("ready").off("ready")},isFunction:function(e){return v.type(e)==="function"},isArray:Array.isArray||function(e){return v.type(e)==="array"},isWindow:function(e){return e!=null&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return e==null?String(e):O[h.call(e)]||"object"},isPlainObject:function(e){if(!e||v.type(e)!=="object"||e.nodeType||v.isWindow(e))return!1;try{if(e.constructor&&!p.call(e,"constructor")&&!p.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||p.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw new Error(e)},parseHTML:function(e,t,n){var r;return!e||typeof e!="string"?null:(typeof t=="boolean"&&(n=t,t=0),t=t||i,(r=E.exec(e))?[t.createElement(r[1])]:(r=v.buildFragment([e],t,n?null:[]),v.merge([],(r.cacheable?v.clone(r.fragment):r.fragment).childNodes)))},parseJSON:function(t){if(!t||typeof t!="string")return null;t=v.trim(t);if(e.JSON&&e.JSON.parse)return e.JSON.parse(t);if(S.test(t.replace(T,"@").replace(N,"]").replace(x,"")))return(new Function("return "+t))();v.error("Invalid JSON: "+t)},parseXML:function(n){var r,i;if(!n||typeof n!="string")return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(s){r=t}return(!r||!r.documentElement||r.getElementsByTagName("parsererror").length)&&v.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&g.test(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(C,"ms-").replace(k,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,n,r){var i,s=0,o=e.length,u=o===t||v.isFunction(e);if(r){if(u){for(i in e)if(n.apply(e[i],r)===!1)break}else for(;s<o;)if(n.apply(e[s++],r)===!1)break}else if(u){for(i in e)if(n.call(e[i],i,e[i])===!1)break}else for(;s<o;)if(n.call(e[s],s,e[s++])===!1)break;return e},trim:d&&!d.call("\ufeff\u00a0")?function(e){return e==null?"":d.call(e)}:function(e){return e==null?"":(e+"").replace(b,"")},makeArray:function(e,t){var n,r=t||[];return e!=null&&(n=v.type(e),e.length==null||n==="string"||n==="function"||n==="regexp"||v.isWindow(e)?f.call(r,e):v.merge(r,e)),r},inArray:function(e,t,n){var r;if(t){if(c)return c.call(t,e,n);r=t.length,n=n?n<0?Math.max(0,r+n):n:0;for(;n<r;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,s=0;if(typeof r=="number")for(;s<r;s++)e[i++]=n[s];else while(n[s]!==t)e[i++]=n[s++];return e.length=i,e},grep:function(e,t,n){var r,i=[],s=0,o=e.length;n=!!n;for(;s<o;s++)r=!!t(e[s],s),n!==r&&i.push(e[s]);return i},map:function(e,n,r){var i,s,o=[],u=0,a=e.length,f=e instanceof v||a!==t&&typeof a=="number"&&(a>0&&e[0]&&e[a-1]||a===0||v.isArray(e));if(f)for(;u<a;u++)i=n(e[u],u,r),i!=null&&(o[o.length]=i);else for(s in e)i=n(e[s],s,r),i!=null&&(o[o.length]=i);return o.concat.apply([],o)},guid:1,proxy:function(e,n){var r,i,s;return typeof n=="string"&&(r=e[n],n=e,e=r),v.isFunction(e)?(i=l.call(arguments,2),s=function(){return e.apply(n,i.concat(l.call(arguments)))},s.guid=e.guid=e.guid||v.guid++,s):t},access:function(e,n,r,i,s,o,u){var a,f=r==null,l=0,c=e.length;if(r&&typeof r=="object"){for(l in r)v.access(e,n,l,r[l],1,o,i);s=1}else if(i!==t){a=u===t&&v.isFunction(i),f&&(a?(a=n,n=function(e,t,n){return a.call(v(e),n)}):(n.call(e,i),n=null));if(n)for(;l<c;l++)n(e[l],r,a?i.call(e[l],l,n(e[l],r)):i,u);s=1}return s?e:f?n.call(e):c?n(e[0],r):o},now:function(){return(new Date).getTime()}}),v.ready.promise=function(t){if(!r){r=v.Deferred();if(i.readyState==="complete")setTimeout(v.ready,1);else if(i.addEventListener)i.addEventListener("DOMContentLoaded",A,!1),e.addEventListener("load",v.ready,!1);else{i.attachEvent("onreadystatechange",A),e.attachEvent("onload",v.ready);var n=!1;try{n=e.frameElement==null&&i.documentElement}catch(s){}n&&n.doScroll&&function o(){if(!v.isReady){try{n.doScroll("left")}catch(e){return setTimeout(o,50)}v.ready()}}()}}return r.promise(t)},v.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(e,t){O["[object "+t+"]"]=t.toLowerCase()}),n=v(i);var M={};v.Callbacks=function(e){e=typeof e=="string"?M[e]||_(e):v.extend({},e);var n,r,i,s,o,u,a=[],f=!e.once&&[],l=function(t){n=e.memory&&t,r=!0,u=s||0,s=0,o=a.length,i=!0;for(;a&&u<o;u++)if(a[u].apply(t[0],t[1])===!1&&e.stopOnFalse){n=!1;break}i=!1,a&&(f?f.length&&l(f.shift()):n?a=[]:c.disable())},c={add:function(){if(a){var t=a.length;(function r(t){v.each(t,function(t,n){var i=v.type(n);i==="function"?(!e.unique||!c.has(n))&&a.push(n):n&&n.length&&i!=="string"&&r(n)})})(arguments),i?o=a.length:n&&(s=t,l(n))}return this},remove:function(){return a&&v.each(arguments,function(e,t){var n;while((n=v.inArray(t,a,n))>-1)a.splice(n,1),i&&(n<=o&&o--,n<=u&&u--)}),this},has:function(e){return v.inArray(e,a)>-1},empty:function(){return a=[],this},disable:function(){return a=f=n=t,this},disabled:function(){return!a},lock:function(){return f=t,n||c.disable(),this},locked:function(){return!f},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],a&&(!r||f)&&(i?f.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},v.extend({Deferred:function(e){var t=[["resolve","done",v.Callbacks("once memory"),"resolved"],["reject","fail",v.Callbacks("once memory"),"rejected"],["notify","progress",v.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return v.Deferred(function(n){v.each(t,function(t,r){var s=r[0],o=e[t];i[r[1]](v.isFunction(o)?function(){var e=o.apply(this,arguments);e&&v.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===i?n:this,[e])}:n[s])}),e=null}).promise()},promise:function(e){return e!=null?v.extend(e,r):r}},i={};return r.pipe=r.then,v.each(t,function(e,s){var o=s[2],u=s[3];r[s[1]]=o.add,u&&o.add(function(){n=u},t[e^1][2].disable,t[2][2].lock),i[s[0]]=o.fire,i[s[0]+"With"]=o.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=l.call(arguments),r=n.length,i=r!==1||e&&v.isFunction(e.promise)?r:0,s=i===1?e:v.Deferred(),o=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?l.call(arguments):r,n===u?s.notifyWith(t,n):--i||s.resolveWith(t,n)}},u,a,f;if(r>1){u=new Array(r),a=new Array(r),f=new Array(r);for(;t<r;t++)n[t]&&v.isFunction(n[t].promise)?n[t].promise().done(o(t,f,n)).fail(s.reject).progress(o(t,a,u)):--i}return i||s.resolveWith(f,n),s.promise()}}),v.support=function(){var t,n,r,s,o,u,a,f,l,c,h,p=i.createElement("div");p.setAttribute("className","t"),p.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=p.getElementsByTagName("*"),r=p.getElementsByTagName("a")[0];if(!n||!r||!n.length)return{};s=i.createElement("select"),o=s.appendChild(i.createElement("option")),u=p.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:r.getAttribute("href")==="/a",opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:u.value==="on",optSelected:o.selected,getSetAttribute:p.className!=="t",enctype:!!i.createElement("form").enctype,html5Clone:i.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:i.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},u.checked=!0,t.noCloneChecked=u.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!o.disabled;try{delete p.test}catch(d){t.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",h=function(){t.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick"),p.detachEvent("onclick",h)),u=i.createElement("input"),u.value="t",u.setAttribute("type","radio"),t.radioValue=u.value==="t",u.setAttribute("checked","checked"),u.setAttribute("name","t"),p.appendChild(u),a=i.createDocumentFragment(),a.appendChild(p.lastChild),t.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,t.appendChecked=u.checked,a.removeChild(u),a.appendChild(p);if(p.attachEvent)for(l in{submit:!0,change:!0,focusin:!0})f="on"+l,c=f in p,c||(p.setAttribute(f,"return;"),c=typeof p[f]=="function"),t[l+"Bubbles"]=c;return v(function(){var n,r,s,o,u="padding:0;margin:0;border:0;display:block;overflow:hidden;",a=i.getElementsByTagName("body")[0];if(!a)return;n=i.createElement("div"),n.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",a.insertBefore(n,a.firstChild),r=i.createElement("div"),n.appendChild(r),r.innerHTML="<table><tr><td></td><td>t</td></tr></table>",s=r.getElementsByTagName("td"),s[0].style.cssText="padding:0;margin:0;border:0;display:none",c=s[0].offsetHeight===0,s[0].style.display="",s[1].style.display="none",t.reliableHiddenOffsets=c&&s[0].offsetHeight===0,r.innerHTML="",r.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=r.offsetWidth===4,t.doesNotIncludeMarginInBodyOffset=a.offsetTop!==1,e.getComputedStyle&&(t.pixelPosition=(e.getComputedStyle(r,null)||{}).top!=="1%",t.boxSizingReliable=(e.getComputedStyle(r,null)||{width:"4px"}).width==="4px",o=i.createElement("div"),o.style.cssText=r.style.cssText=u,o.style.marginRight=o.style.width="0",r.style.width="1px",r.appendChild(o),t.reliableMarginRight=!parseFloat((e.getComputedStyle(o,null)||{}).marginRight)),typeof r.style.zoom!="undefined"&&(r.innerHTML="",r.style.cssText=u+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=r.offsetWidth===3,r.style.display="block",r.style.overflow="visible",r.innerHTML="<div></div>",r.firstChild.style.width="5px",t.shrinkWrapBlocks=r.offsetWidth!==3,n.style.zoom=1),a.removeChild(n),n=r=s=o=null}),a.removeChild(p),n=r=s=o=u=a=p=null,t}();var D=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;v.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(v.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?v.cache[e[v.expando]]:e[v.expando],!!e&&!B(e)},data:function(e,n,r,i){if(!v.acceptData(e))return;var s,o,u=v.expando,a=typeof n=="string",f=e.nodeType,l=f?v.cache:e,c=f?e[u]:e[u]&&u;if((!c||!l[c]||!i&&!l[c].data)&&a&&r===t)return;c||(f?e[u]=c=v.deletedIds.pop()||v.guid++:c=u),l[c]||(l[c]={},f||(l[c].toJSON=v.noop));if(typeof n=="object"||typeof n=="function")i?l[c]=v.extend(l[c],n):l[c].data=v.extend(l[c].data,n);return s=l[c],i||(s.data||(s.data={}),s=s.data),r!==t&&(s[v.camelCase(n)]=r),a?(o=s[n],o==null&&(o=s[v.camelCase(n)])):o=s,o},removeData:function(e,t,n){if(!v.acceptData(e))return;var r,i,s,o=e.nodeType,u=o?v.cache:e,a=o?e[v.expando]:v.expando;if(!u[a])return;if(t){r=n?u[a]:u[a].data;if(r){v.isArray(t)||(t in r?t=[t]:(t=v.camelCase(t),t in r?t=[t]:t=t.split(" ")));for(i=0,s=t.length;i<s;i++)delete r[t[i]];if(!(n?B:v.isEmptyObject)(r))return}}if(!n){delete u[a].data;if(!B(u[a]))return}o?v.cleanData([e],!0):v.support.deleteExpando||u!=u.window?delete u[a]:u[a]=null},_data:function(e,t,n){return v.data(e,t,n,!0)},acceptData:function(e){var t=e.nodeName&&v.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),v.fn.extend({data:function(e,n){var r,i,s,o,u,a=this[0],f=0,l=null;if(e===t){if(this.length){l=v.data(a);if(a.nodeType===1&&!v._data(a,"parsedAttrs")){s=a.attributes;for(u=s.length;f<u;f++)o=s[f].name,o.indexOf("data-")||(o=v.camelCase(o.substring(5)),H(a,o,l[o]));v._data(a,"parsedAttrs",!0)}}return l}return typeof e=="object"?this.each(function(){v.data(this,e)}):(r=e.split(".",2),r[1]=r[1]?"."+r[1]:"",i=r[1]+"!",v.access(this,function(n){if(n===t)return l=this.triggerHandler("getData"+i,[r[0]]),l===t&&a&&(l=v.data(a,e),l=H(a,e,l)),l===t&&r[1]?this.data(r[0]):l;r[1]=n,this.each(function(){var t=v(this);t.triggerHandler("setData"+i,r),v.data(this,e,n),t.triggerHandler("changeData"+i,r)})},null,n,arguments.length>1,null,!1))},removeData:function(e){return this.each(function(){v.removeData(this,e)})}}),v.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=v._data(e,t),n&&(!r||v.isArray(n)?r=v._data(e,t,v.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=v.queue(e,t),r=n.length,i=n.shift(),s=v._queueHooks(e,t),o=function(){v.dequeue(e,t)};i==="inprogress"&&(i=n.shift(),r--),i&&(t==="fx"&&n.unshift("inprogress"),delete s.stop,i.call(e,o,s)),!r&&s&&s.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return v._data(e,n)||v._data(e,n,{empty:v.Callbacks("once memory").add(function(){v.removeData(e,t+"queue",!0),v.removeData(e,n,!0)})})}}),v.fn.extend({queue:function(e,n){var r=2;return typeof e!="string"&&(n=e,e="fx",r--),arguments.length<r?v.queue(this[0],e):n===t?this:this.each(function(){var t=v.queue(this,e,n);v._queueHooks(this,e),e==="fx"&&t[0]!=="inprogress"&&v.dequeue(this,e)})},dequeue:function(e){return this.each(function(){v.dequeue(this,e)})},delay:function(e,t){return e=v.fx?v.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,s=v.Deferred(),o=this,u=this.length,a=function(){--i||s.resolveWith(o,[o])};typeof e!="string"&&(n=e,e=t),e=e||"fx";while(u--)r=v._data(o[u],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(a));return a(),s.promise(n)}});var j,F,I,q=/[\t\r\n]/g,R=/\r/g,U=/^(?:button|input)$/i,z=/^(?:button|input|object|select|textarea)$/i,W=/^a(?:rea|)$/i,X=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,V=v.support.getSetAttribute;v.fn.extend({attr:function(e,t){return v.access(this,v.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){v.removeAttr(this,e)})},prop:function(e,t){return v.access(this,v.prop,e,t,arguments.length>1)},removeProp:function(e){return e=v.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,s,o,u;if(v.isFunction(e))return this.each(function(t){v(this).addClass(e.call(this,t,this.className))});if(e&&typeof e=="string"){t=e.split(y);for(n=0,r=this.length;n<r;n++){i=this[n];if(i.nodeType===1)if(!i.className&&t.length===1)i.className=e;else{s=" "+i.className+" ";for(o=0,u=t.length;o<u;o++)s.indexOf(" "+t[o]+" ")<0&&(s+=t[o]+" ");i.className=v.trim(s)}}}return this},removeClass:function(e){var n,r,i,s,o,u,a;if(v.isFunction(e))return this.each(function(t){v(this).removeClass(e.call(this,t,this.className))});if(e&&typeof e=="string"||e===t){n=(e||"").split(y);for(u=0,a=this.length;u<a;u++){i=this[u];if(i.nodeType===1&&i.className){r=(" "+i.className+" ").replace(q," ");for(s=0,o=n.length;s<o;s++)while(r.indexOf(" "+n[s]+" ")>=0)r=r.replace(" "+n[s]+" "," ");i.className=e?v.trim(r):""}}}return this},toggleClass:function(e,t){var n=typeof e,r=typeof t=="boolean";return v.isFunction(e)?this.each(function(n){v(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if(n==="string"){var i,s=0,o=v(this),u=t,a=e.split(y);while(i=a[s++])u=r?u:!o.hasClass(i),o[u?"addClass":"removeClass"](i)}else if(n==="undefined"||n==="boolean")this.className&&v._data(this,"__className__",this.className),this.className=this.className||e===!1?"":v._data(this,"__className__")||""})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;n<r;n++)if(this[n].nodeType===1&&(" "+this[n].className+" ").replace(q," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,s=this[0];if(!arguments.length){if(s)return n=v.valHooks[s.type]||v.valHooks[s.nodeName.toLowerCase()],n&&"get"in n&&(r=n.get(s,"value"))!==t?r:(r=s.value,typeof r=="string"?r.replace(R,""):r==null?"":r);return}return i=v.isFunction(e),this.each(function(r){var s,o=v(this);if(this.nodeType!==1)return;i?s=e.call(this,r,o.val()):s=e,s==null?s="":typeof s=="number"?s+="":v.isArray(s)&&(s=v.map(s,function(e){return e==null?"":e+""})),n=v.valHooks[this.type]||v.valHooks[this.nodeName.toLowerCase()];if(!n||!("set"in n)||n.set(this,s,"value")===t)this.value=s})}}),v.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,s=e.type==="select-one"||i<0,o=s?null:[],u=s?i+1:r.length,a=i<0?u:s?i:0;for(;a<u;a++){n=r[a];if((n.selected||a===i)&&(v.support.optDisabled?!n.disabled:n.getAttribute("disabled")===null)&&(!n.parentNode.disabled||!v.nodeName(n.parentNode,"optgroup"))){t=v(n).val();if(s)return t;o.push(t)}}return o},set:function(e,t){var n=v.makeArray(t);return v(e).find("option").each(function(){this.selected=v.inArray(v(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attrFn:{},attr:function(e,n,r,i){var s,o,u,a=e.nodeType;if(!e||a===3||a===8||a===2)return;if(i&&v.isFunction(v.fn[n]))return v(e)[n](r);if(typeof e.getAttribute=="undefined")return v.prop(e,n,r);u=a!==1||!v.isXMLDoc(e),u&&(n=n.toLowerCase(),o=v.attrHooks[n]||(X.test(n)?F:j));if(r!==t){if(r===null){v.removeAttr(e,n);return}return o&&"set"in o&&u&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r)}return o&&"get"in o&&u&&(s=o.get(e,n))!==null?s:(s=e.getAttribute(n),s===null?t:s)},removeAttr:function(e,t){var n,r,i,s,o=0;if(t&&e.nodeType===1){r=t.split(y);for(;o<r.length;o++)i=r[o],i&&(n=v.propFix[i]||i,s=X.test(i),s||v.attr(e,i,""),e.removeAttribute(V?i:n),s&&n in e&&(e[n]=!1))}},attrHooks:{type:{set:function(e,t){if(U.test(e.nodeName)&&e.parentNode)v.error("type property can't be changed");else if(!v.support.radioValue&&t==="radio"&&v.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}},value:{get:function(e,t){return j&&v.nodeName(e,"button")?j.get(e,t):t in e?e.value:null},set:function(e,t,n){if(j&&v.nodeName(e,"button"))return j.set(e,t,n);e.value=t}}},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(e,n,r){var i,s,o,u=e.nodeType;if(!e||u===3||u===8||u===2)return;return o=u!==1||!v.isXMLDoc(e),o&&(n=v.propFix[n]||n,s=v.propHooks[n]),r!==t?s&&"set"in s&&(i=s.set(e,r,n))!==t?i:e[n]=r:s&&"get"in s&&(i=s.get(e,n))!==null?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):z.test(e.nodeName)||W.test(e.nodeName)&&e.href?0:t}}}}),F={get:function(e,n){var r,i=v.prop(e,n);return i===!0||typeof i!="boolean"&&(r=e.getAttributeNode(n))&&r.nodeValue!==!1?n.toLowerCase():t},set:function(e,t,n){var r;return t===!1?v.removeAttr(e,n):(r=v.propFix[n]||n,r in e&&(e[r]=!0),e.setAttribute(n,n.toLowerCase())),n}},V||(I={name:!0,id:!0,coords:!0},j=v.valHooks.button={get:function(e,n){var r;return r=e.getAttributeNode(n),r&&(I[n]?r.value!=="":r.specified)?r.value:t},set:function(e,t,n){var r=e.getAttributeNode(n);return r||(r=i.createAttribute(n),e.setAttributeNode(r)),r.value=t+""}},v.each(["width","height"],function(e,t){v.attrHooks[t]=v.extend(v.attrHooks[t],{set:function(e,n){if(n==="")return e.setAttribute(t,"auto"),n}})}),v.attrHooks.contenteditable={get:j.get,set:function(e,t,n){t===""&&(t="false"),j.set(e,t,n)}}),v.support.hrefNormalized||v.each(["href","src","width","height"],function(e,n){v.attrHooks[n]=v.extend(v.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return r===null?t:r}})}),v.support.style||(v.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||t},set:function(e,t){return e.style.cssText=t+""}}),v.support.optSelected||(v.propHooks.selected=v.extend(v.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),v.support.enctype||(v.propFix.enctype="encoding"),v.support.checkOn||v.each(["radio","checkbox"],function(){v.valHooks[this]={get:function(e){return e.getAttribute("value")===null?"on":e.value}}}),v.each(["radio","checkbox"],function(){v.valHooks[this]=v.extend(v.valHooks[this],{set:function(e,t){if(v.isArray(t))return e.checked=v.inArray(v(e).val(),t)>=0}})});var $=/^(?:textarea|input|select)$/i,J=/^([^\.]*|)(?:\.(.+)|)$/,K=/(?:^|\s)hover(\.\S+|)\b/,Q=/^key/,G=/^(?:mouse|contextmenu)|click/,Y=/^(?:focusinfocus|focusoutblur)$/,Z=function(e){return v.event.special.hover?e:e.replace(K,"mouseenter$1 mouseleave$1")};v.event={add:function(e,n,r,i,s){var o,u,a,f,l,c,h,p,d,m,g;if(e.nodeType===3||e.nodeType===8||!n||!r||!(o=v._data(e)))return;r.handler&&(d=r,r=d.handler,s=d.selector),r.guid||(r.guid=v.guid++),a=o.events,a||(o.events=a={}),u=o.handle,u||(o.handle=u=function(e){return typeof v=="undefined"||!!e&&v.event.triggered===e.type?t:v.event.dispatch.apply(u.elem,arguments)},u.elem=e),n=v.trim(Z(n)).split(" ");for(f=0;f<n.length;f++){l=J.exec(n[f])||[],c=l[1],h=(l[2]||"").split(".").sort(),g=v.event.special[c]||{},c=(s?g.delegateType:g.bindType)||c,g=v.event.special[c]||{},p=v.extend({type:c,origType:l[1],data:i,handler:r,guid:r.guid,selector:s,needsContext:s&&v.expr.match.needsContext.test(s),namespace:h.join(".")},d),m=a[c];if(!m){m=a[c]=[],m.delegateCount=0;if(!g.setup||g.setup.call(e,i,h,u)===!1)e.addEventListener?e.addEventListener(c,u,!1):e.attachEvent&&e.attachEvent("on"+c,u)}g.add&&(g.add.call(e,p),p.handler.guid||(p.handler.guid=r.guid)),s?m.splice(m.delegateCount++,0,p):m.push(p),v.event.global[c]=!0}e=null},global:{},remove:function(e,t,n,r,i){var s,o,u,a,f,l,c,h,p,d,m,g=v.hasData(e)&&v._data(e);if(!g||!(h=g.events))return;t=v.trim(Z(t||"")).split(" ");for(s=0;s<t.length;s++){o=J.exec(t[s])||[],u=a=o[1],f=o[2];if(!u){for(u in h)v.event.remove(e,u+t[s],n,r,!0);continue}p=v.event.special[u]||{},u=(r?p.delegateType:p.bindType)||u,d=h[u]||[],l=d.length,f=f?new RegExp("(^|\\.)"+f.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(c=0;c<d.length;c++)m=d[c],(i||a===m.origType)&&(!n||n.guid===m.guid)&&(!f||f.test(m.namespace))&&(!r||r===m.selector||r==="**"&&m.selector)&&(d.splice(c--,1),m.selector&&d.delegateCount--,p.remove&&p.remove.call(e,m));d.length===0&&l!==d.length&&((!p.teardown||p.teardown.call(e,f,g.handle)===!1)&&v.removeEvent(e,u,g.handle),delete h[u])}v.isEmptyObject(h)&&(delete g.handle,v.removeData(e,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(n,r,s,o){if(!s||s.nodeType!==3&&s.nodeType!==8){var u,a,f,l,c,h,p,d,m,g,y=n.type||n,b=[];if(Y.test(y+v.event.triggered))return;y.indexOf("!")>=0&&(y=y.slice(0,-1),a=!0),y.indexOf(".")>=0&&(b=y.split("."),y=b.shift(),b.sort());if((!s||v.event.customEvent[y])&&!v.event.global[y])return;n=typeof n=="object"?n[v.expando]?n:new v.Event(y,n):new v.Event(y),n.type=y,n.isTrigger=!0,n.exclusive=a,n.namespace=b.join("."),n.namespace_re=n.namespace?new RegExp("(^|\\.)"+b.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,h=y.indexOf(":")<0?"on"+y:"";if(!s){u=v.cache;for(f in u)u[f].events&&u[f].events[y]&&v.event.trigger(n,r,u[f].handle.elem,!0);return}n.result=t,n.target||(n.target=s),r=r!=null?v.makeArray(r):[],r.unshift(n),p=v.event.special[y]||{};if(p.trigger&&p.trigger.apply(s,r)===!1)return;m=[[s,p.bindType||y]];if(!o&&!p.noBubble&&!v.isWindow(s)){g=p.delegateType||y,l=Y.test(g+y)?s:s.parentNode;for(c=s;l;l=l.parentNode)m.push([l,g]),c=l;c===(s.ownerDocument||i)&&m.push([c.defaultView||c.parentWindow||e,g])}for(f=0;f<m.length&&!n.isPropagationStopped();f++)l=m[f][0],n.type=m[f][1],d=(v._data(l,"events")||{})[n.type]&&v._data(l,"handle"),d&&d.apply(l,r),d=h&&l[h],d&&v.acceptData(l)&&d.apply&&d.apply(l,r)===!1&&n.preventDefault();return n.type=y,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(s.ownerDocument,r)===!1)&&(y!=="click"||!v.nodeName(s,"a"))&&v.acceptData(s)&&h&&s[y]&&(y!=="focus"&&y!=="blur"||n.target.offsetWidth!==0)&&!v.isWindow(s)&&(c=s[h],c&&(s[h]=null),v.event.triggered=y,s[y](),v.event.triggered=t,c&&(s[h]=c)),n.result}return},dispatch:function(n){n=v.event.fix(n||e.event);var r,i,s,o,u,a,f,c,h,p,d=(v._data(this,"events")||{})[n.type]||[],m=d.delegateCount,g=l.call(arguments),y=!n.exclusive&&!n.namespace,b=v.event.special[n.type]||{},w=[];g[0]=n,n.delegateTarget=this;if(b.preDispatch&&b.preDispatch.call(this,n)===!1)return;if(m&&(!n.button||n.type!=="click"))for(s=n.target;s!=this;s=s.parentNode||this)if(s.disabled!==!0||n.type!=="click"){u={},f=[];for(r=0;r<m;r++)c=d[r],h=c.selector,u[h]===t&&(u[h]=c.needsContext?v(h,this).index(s)>=0:v.find(h,this,null,[s]).length),u[h]&&f.push(c);f.length&&w.push({elem:s,matches:f})}d.length>m&&w.push({elem:this,matches:d.slice(m)});for(r=0;r<w.length&&!n.isPropagationStopped();r++){a=w[r],n.currentTarget=a.elem;for(i=0;i<a.matches.length&&!n.isImmediatePropagationStopped();i++){c=a.matches[i];if(y||!n.namespace&&!c.namespace||n.namespace_re&&n.namespace_re.test(c.namespace))n.data=c.data,n.handleObj=c,o=((v.event.special[c.origType]||{}).handle||c.handler).apply(a.elem,g),o!==t&&(n.result=o,o===!1&&(n.preventDefault(),n.stopPropagation()))}}return b.postDispatch&&b.postDispatch.call(this,n),n.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return e.which==null&&(e.which=t.charCode!=null?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,s,o,u=n.button,a=n.fromElement;return e.pageX==null&&n.clientX!=null&&(r=e.target.ownerDocument||i,s=r.documentElement,o=r.body,e.pageX=n.clientX+(s&&s.scrollLeft||o&&o.scrollLeft||0)-(s&&s.clientLeft||o&&o.clientLeft||0),e.pageY=n.clientY+(s&&s.scrollTop||o&&o.scrollTop||0)-(s&&s.clientTop||o&&o.clientTop||0)),!e.relatedTarget&&a&&(e.relatedTarget=a===e.target?n.toElement:a),!e.which&&u!==t&&(e.which=u&1?1:u&2?3:u&4?2:0),e}},fix:function(e){if(e[v.expando])return e;var t,n,r=e,s=v.event.fixHooks[e.type]||{},o=s.props?this.props.concat(s.props):this.props;e=v.Event(r);for(t=o.length;t;)n=o[--t],e[n]=r[n];return e.target||(e.target=r.srcElement||i),e.target.nodeType===3&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,r):e},special:{load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(e,t,n){v.isWindow(this)&&(this.onbeforeunload=n)},teardown:function(e,t){this.onbeforeunload===t&&(this.onbeforeunload=null)}}},simulate:function(e,t,n,r){var i=v.extend(new v.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?v.event.trigger(i,null,t):v.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},v.event.handle=v.event.dispatch,v.removeEvent=i.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]=="undefined"&&(e[r]=null),e.detachEvent(r,n))},v.Event=function(e,t){if(!(this instanceof v.Event))return new v.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?tt:et):this.type=e,t&&v.extend(this,t),this.timeStamp=e&&e.timeStamp||v.now(),this[v.expando]=!0},v.Event.prototype={preventDefault:function(){this.isDefaultPrevented=tt;var e=this.originalEvent;if(!e)return;e.preventDefault?e.preventDefault():e.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=tt;var e=this.originalEvent;if(!e)return;e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=tt,this.stopPropagation()},isDefaultPrevented:et,isPropagationStopped:et,isImmediatePropagationStopped:et},v.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){v.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,s=e.handleObj,o=s.selector;if(!i||i!==r&&!v.contains(r,i))e.type=s.origType,n=s.handler.apply(this,arguments),e.type=t;return n}}}),v.support.submitBubbles||(v.event.special.submit={setup:function(){if(v.nodeName(this,"form"))return!1;v.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=v.nodeName(n,"input")||v.nodeName(n,"button")?n.form:t;r&&!v._data(r,"_submit_attached")&&(v.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),v._data(r,"_submit_attached",!0))})},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&v.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){if(v.nodeName(this,"form"))return!1;v.event.remove(this,"._submit")}}),v.support.changeBubbles||(v.event.special.change={setup:function(){if($.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")v.event.add(this,"propertychange._change",function(e){e.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),v.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),v.event.simulate("change",this,e,!0)});return!1}v.event.add(this,"beforeactivate._change",function(e){var t=e.target;$.test(t.nodeName)&&!v._data(t,"_change_attached")&&(v.event.add(t,"change._change",function(e){this.parentNode&&!e.isSimulated&&!e.isTrigger&&v.event.simulate("change",this.parentNode,e,!0)}),v._data(t,"_change_attached",!0))})},handle:function(e){var t=e.target;if(this!==t||e.isSimulated||e.isTrigger||t.type!=="radio"&&t.type!=="checkbox")return e.handleObj.handler.apply(this,arguments)},teardown:function(){return v.event.remove(this,"._change"),!$.test(this.nodeName)}}),v.support.focusinBubbles||v.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){v.event.simulate(t,e.target,v.event.fix(e),!0)};v.event.special[t]={setup:function(){n++===0&&i.addEventListener(e,r,!0)},teardown:function(){--n===0&&i.removeEventListener(e,r,!0)}}}),v.fn.extend({on:function(e,n,r,i,s){var o,u;if(typeof e=="object"){typeof n!="string"&&(r=r||n,n=t);for(u in e)this.on(u,n,r,e[u],s);return this}r==null&&i==null?(i=n,r=n=t):i==null&&(typeof n=="string"?(i=r,r=t):(i=r,r=n,n=t));if(i===!1)i=et;else if(!i)return this;return s===1&&(o=i,i=function(e){return v().off(e),o.apply(this,arguments)},i.guid=o.guid||(o.guid=v.guid++)),this.each(function(){v.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,s;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,v(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if(typeof e=="object"){for(s in e)this.off(s,n,e[s]);return this}if(n===!1||typeof n=="function")r=n,n=t;return r===!1&&(r=et),this.each(function(){v.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},live:function(e,t,n){return v(this.context).on(e,this.selector,t,n),this},die:function(e,t){return v(this.context).off(e,this.selector||"**",t),this},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return arguments.length===1?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){v.event.trigger(e,t,this)})},triggerHandler:function(e,t){if(this[0])return v.event.trigger(e,t,this[0],!0)},toggle:function(e){var t=arguments,n=e.guid||v.guid++,r=0,i=function(n){var i=(v._data(this,"lastToggle"+e.guid)||0)%r;return v._data(this,"lastToggle"+e.guid,i+1),n.preventDefault(),t[i].apply(this,arguments)||!1};i.guid=n;while(r<t.length)t[r++].guid=n;return this.click(i)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),v.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 contextmenu".split(" "),function(e,t){v.fn[t]=function(e,n){return n==null&&(n=e,e=null),arguments.length>0?this.on(t,null,e,n):this.trigger(t)},Q.test(t)&&(v.event.fixHooks[t]=v.event.keyHooks),G.test(t)&&(v.event.fixHooks[t]=v.event.mouseHooks)}),function(e,t){function nt(e,t,n,r){n=n||[],t=t||g;var i,s,a,f,l=t.nodeType;if(!e||typeof e!="string")return n;if(l!==1&&l!==9)return[];a=o(t);if(!a&&!r)if(i=R.exec(e))if(f=i[1]){if(l===9){s=t.getElementById(f);if(!s||!s.parentNode)return n;if(s.id===f)return n.push(s),n}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(f))&&u(t,s)&&s.id===f)return n.push(s),n}else{if(i[2])return S.apply(n,x.call(t.getElementsByTagName(e),0)),n;if((f=i[3])&&Z&&t.getElementsByClassName)return S.apply(n,x.call(t.getElementsByClassName(f),0)),n}return vt(e.replace(j,"$1"),t,n,r,a)}function rt(e){return function(t){var n=t.nodeName.toLowerCase();return n==="input"&&t.type===e}}function it(e){return function(t){var n=t.nodeName.toLowerCase();return(n==="input"||n==="button")&&t.type===e}}function st(e){return N(function(t){return t=+t,N(function(n,r){var i,s=e([],n.length,t),o=s.length;while(o--)n[i=s[o]]&&(n[i]=!(r[i]=n[i]))})})}function ot(e,t,n){if(e===t)return n;var r=e.nextSibling;while(r){if(r===t)return-1;r=r.nextSibling}return 1}function ut(e,t){var n,r,s,o,u,a,f,l=L[d][e+" "];if(l)return t?0:l.slice(0);u=e,a=[],f=i.preFilter;while(u){if(!n||(r=F.exec(u)))r&&(u=u.slice(r[0].length)||u),a.push(s=[]);n=!1;if(r=I.exec(u))s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=r[0].replace(j," ");for(o in i.filter)(r=J[o].exec(u))&&(!f[o]||(r=f[o](r)))&&(s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=o,n.matches=r);if(!n)break}return t?u.length:u?nt.error(e):L(e,a).slice(0)}function at(e,t,r){var i=t.dir,s=r&&t.dir==="parentNode",o=w++;return t.first?function(t,n,r){while(t=t[i])if(s||t.nodeType===1)return e(t,n,r)}:function(t,r,u){if(!u){var a,f=b+" "+o+" ",l=f+n;while(t=t[i])if(s||t.nodeType===1){if((a=t[d])===l)return t.sizset;if(typeof a=="string"&&a.indexOf(f)===0){if(t.sizset)return t}else{t[d]=l;if(e(t,r,u))return t.sizset=!0,t;t.sizset=!1}}}else while(t=t[i])if(s||t.nodeType===1)if(e(t,r,u))return t}}function ft(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function lt(e,t,n,r,i){var s,o=[],u=0,a=e.length,f=t!=null;for(;u<a;u++)if(s=e[u])if(!n||n(s,r,i))o.push(s),f&&t.push(u);return o}function ct(e,t,n,r,i,s){return r&&!r[d]&&(r=ct(r)),i&&!i[d]&&(i=ct(i,s)),N(function(s,o,u,a){var f,l,c,h=[],p=[],d=o.length,v=s||dt(t||"*",u.nodeType?[u]:u,[]),m=e&&(s||!t)?lt(v,h,e,u,a):v,g=n?i||(s?e:d||r)?[]:o:m;n&&n(m,g,u,a);if(r){f=lt(g,p),r(f,[],u,a),l=f.length;while(l--)if(c=f[l])g[p[l]]=!(m[p[l]]=c)}if(s){if(i||e){if(i){f=[],l=g.length;while(l--)(c=g[l])&&f.push(m[l]=c);i(null,g=[],f,a)}l=g.length;while(l--)(c=g[l])&&(f=i?T.call(s,c):h[l])>-1&&(s[f]=!(o[f]=c))}}else g=lt(g===o?g.splice(d,g.length):g),i?i(null,o,g,a):S.apply(o,g)})}function ht(e){var t,n,r,s=e.length,o=i.relative[e[0].type],u=o||i.relative[" "],a=o?1:0,f=at(function(e){return e===t},u,!0),l=at(function(e){return T.call(t,e)>-1},u,!0),h=[function(e,n,r){return!o&&(r||n!==c)||((t=n).nodeType?f(e,n,r):l(e,n,r))}];for(;a<s;a++)if(n=i.relative[e[a].type])h=[at(ft(h),n)];else{n=i.filter[e[a].type].apply(null,e[a].matches);if(n[d]){r=++a;for(;r<s;r++)if(i.relative[e[r].type])break;return ct(a>1&&ft(h),a>1&&e.slice(0,a-1).join("").replace(j,"$1"),n,a<r&&ht(e.slice(a,r)),r<s&&ht(e=e.slice(r)),r<s&&e.join(""))}h.push(n)}return ft(h)}function pt(e,t){var r=t.length>0,s=e.length>0,o=function(u,a,f,l,h){var p,d,v,m=[],y=0,w="0",x=u&&[],T=h!=null,N=c,C=u||s&&i.find.TAG("*",h&&a.parentNode||a),k=b+=N==null?1:Math.E;T&&(c=a!==g&&a,n=o.el);for(;(p=C[w])!=null;w++){if(s&&p){for(d=0;v=e[d];d++)if(v(p,a,f)){l.push(p);break}T&&(b=k,n=++o.el)}r&&((p=!v&&p)&&y--,u&&x.push(p))}y+=w;if(r&&w!==y){for(d=0;v=t[d];d++)v(x,m,a,f);if(u){if(y>0)while(w--)!x[w]&&!m[w]&&(m[w]=E.call(l));m=lt(m)}S.apply(l,m),T&&!u&&m.length>0&&y+t.length>1&&nt.uniqueSort(l)}return T&&(b=k,c=N),x};return o.el=0,r?N(o):o}function dt(e,t,n){var r=0,i=t.length;for(;r<i;r++)nt(e,t[r],n);return n}function vt(e,t,n,r,s){var o,u,f,l,c,h=ut(e),p=h.length;if(!r&&h.length===1){u=h[0]=h[0].slice(0);if(u.length>2&&(f=u[0]).type==="ID"&&t.nodeType===9&&!s&&i.relative[u[1].type]){t=i.find.ID(f.matches[0].replace($,""),t,s)[0];if(!t)return n;e=e.slice(u.shift().length)}for(o=J.POS.test(e)?-1:u.length-1;o>=0;o--){f=u[o];if(i.relative[l=f.type])break;if(c=i.find[l])if(r=c(f.matches[0].replace($,""),z.test(u[0].type)&&t.parentNode||t,s)){u.splice(o,1),e=r.length&&u.join("");if(!e)return S.apply(n,x.call(r,0)),n;break}}}return a(e,h)(r,t,s,n,z.test(e)),n}function mt(){}var n,r,i,s,o,u,a,f,l,c,h=!0,p="undefined",d=("sizcache"+Math.random()).replace(".",""),m=String,g=e.document,y=g.documentElement,b=0,w=0,E=[].pop,S=[].push,x=[].slice,T=[].indexOf||function(e){var t=0,n=this.length;for(;t<n;t++)if(this[t]===e)return t;return-1},N=function(e,t){return e[d]=t==null||t,e},C=function(){var e={},t=[];return N(function(n,r){return t.push(n)>i.cacheLength&&delete e[t.shift()],e[n+" "]=r},e)},k=C(),L=C(),A=C(),O="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",_=M.replace("w","w#"),D="([*^$|!~]?=)",P="\\["+O+"*("+M+")"+O+"*(?:"+D+O+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+_+")|)|)"+O+"*\\]",H=":("+M+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+P+")|[^:]|\\\\.)*|.*))\\)|)",B=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+O+"*((?:-\\d)?\\d*)"+O+"*\\)|)(?=[^-]|$)",j=new RegExp("^"+O+"+|((?:^|[^\\\\])(?:\\\\.)*)"+O+"+$","g"),F=new RegExp("^"+O+"*,"+O+"*"),I=new RegExp("^"+O+"*([\\x20\\t\\r\\n\\f>+~])"+O+"*"),q=new RegExp(H),R=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,U=/^:not/,z=/[\x20\t\r\n\f]*[+~]/,W=/:not\($/,X=/h\d/i,V=/input|select|textarea|button/i,$=/\\(?!\\)/g,J={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),NAME:new RegExp("^\\[name=['\"]?("+M+")['\"]?\\]"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+H),POS:new RegExp(B,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+O+"*(even|odd|(([+-]|)(\\d*)n|)"+O+"*(?:([+-]|)"+O+"*(\\d+)|))"+O+"*\\)|)","i"),needsContext:new RegExp("^"+O+"*[>+~]|"+B,"i")},K=function(e){var t=g.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}},Q=K(function(e){return e.appendChild(g.createComment("")),!e.getElementsByTagName("*").length}),G=K(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==p&&e.firstChild.getAttribute("href")==="#"}),Y=K(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return t!=="boolean"&&t!=="string"}),Z=K(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!e.getElementsByClassName||!e.getElementsByClassName("e").length?!1:(e.lastChild.className="e",e.getElementsByClassName("e").length===2)}),et=K(function(e){e.id=d+0,e.innerHTML="<a name='"+d+"'></a><div name='"+d+"'></div>",y.insertBefore(e,y.firstChild);var t=g.getElementsByName&&g.getElementsByName(d).length===2+g.getElementsByName(d+0).length;return r=!g.getElementById(d),y.removeChild(e),t});try{x.call(y.childNodes,0)[0].nodeType}catch(tt){x=function(e){var t,n=[];for(;t=this[e];e++)n.push(t);return n}}nt.matches=function(e,t){return nt(e,null,null,t)},nt.matchesSelector=function(e,t){return nt(t,null,null,[e]).length>0},s=nt.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(i===1||i===9||i===11){if(typeof e.textContent=="string")return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=s(e)}else if(i===3||i===4)return e.nodeValue}else for(;t=e[r];r++)n+=s(t);return n},o=nt.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?t.nodeName!=="HTML":!1},u=nt.contains=y.contains?function(e,t){var n=e.nodeType===9?e.documentElement:e,r=t&&t.parentNode;return e===r||!!(r&&r.nodeType===1&&n.contains&&n.contains(r))}:y.compareDocumentPosition?function(e,t){return t&&!!(e.compareDocumentPosition(t)&16)}:function(e,t){while(t=t.parentNode)if(t===e)return!0;return!1},nt.attr=function(e,t){var n,r=o(e);return r||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):r||Y?e.getAttribute(t):(n=e.getAttributeNode(t),n?typeof e[t]=="boolean"?e[t]?t:null:n.specified?n.value:null:null)},i=nt.selectors={cacheLength:50,createPseudo:N,match:J,attrHandle:G?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},find:{ID:r?function(e,t,n){if(typeof t.getElementById!==p&&!n){var r=t.getElementById(e);return r&&r.parentNode?[r]:[]}}:function(e,n,r){if(typeof n.getElementById!==p&&!r){var i=n.getElementById(e);return i?i.id===e||typeof i.getAttributeNode!==p&&i.getAttributeNode("id").value===e?[i]:t:[]}},TAG:Q?function(e,t){if(typeof t.getElementsByTagName!==p)return t.getElementsByTagName(e)}:function(e,t){var n=t.getElementsByTagName(e);if(e==="*"){var r,i=[],s=0;for(;r=n[s];s++)r.nodeType===1&&i.push(r);return i}return n},NAME:et&&function(e,t){if(typeof t.getElementsByName!==p)return t.getElementsByName(name)},CLASS:Z&&function(e,t,n){if(typeof t.getElementsByClassName!==p&&!n)return t.getElementsByClassName(e)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace($,""),e[3]=(e[4]||e[5]||"").replace($,""),e[2]==="~="&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),e[1]==="nth"?(e[2]||nt.error(e[0]),e[3]=+(e[3]?e[4]+(e[5]||1):2*(e[2]==="even"||e[2]==="odd")),e[4]=+(e[6]+e[7]||e[2]==="odd")):e[2]&&nt.error(e[0]),e},PSEUDO:function(e){var t,n;if(J.CHILD.test(e[0]))return null;if(e[3])e[2]=e[3];else if(t=e[4])q.test(t)&&(n=ut(t,!0))&&(n=t.indexOf(")",t.length-n)-t.length)&&(t=t.slice(0,n),e[0]=e[0].slice(0,n)),e[2]=t;return e.slice(0,3)}},filter:{ID:r?function(e){return e=e.replace($,""),function(t){return t.getAttribute("id")===e}}:function(e){return e=e.replace($,""),function(t){var n=typeof t.getAttributeNode!==p&&t.getAttributeNode("id");return n&&n.value===e}},TAG:function(e){return e==="*"?function(){return!0}:(e=e.replace($,"").toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[d][e+" "];return t||(t=new RegExp("(^|"+O+")"+e+"("+O+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==p&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r,i){var s=nt.attr(r,e);return s==null?t==="!=":t?(s+="",t==="="?s===n:t==="!="?s!==n:t==="^="?n&&s.indexOf(n)===0:t==="*="?n&&s.indexOf(n)>-1:t==="$="?n&&s.substr(s.length-n.length)===n:t==="~="?(" "+s+" ").indexOf(n)>-1:t==="|="?s===n||s.substr(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r){return e==="nth"?function(e){var t,i,s=e.parentNode;if(n===1&&r===0)return!0;if(s){i=0;for(t=s.firstChild;t;t=t.nextSibling)if(t.nodeType===1){i++;if(e===t)break}}return i-=r,i===n||i%n===0&&i/n>=0}:function(t){var n=t;switch(e){case"only":case"first":while(n=n.previousSibling)if(n.nodeType===1)return!1;if(e==="first")return!0;n=t;case"last":while(n=n.nextSibling)if(n.nodeType===1)return!1;return!0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||nt.error("unsupported pseudo: "+e);return r[d]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?N(function(e,n){var i,s=r(e,t),o=s.length;while(o--)i=T.call(e,s[o]),e[i]=!(n[i]=s[o])}):function(e){return r(e,0,n)}):r}},pseudos:{not:N(function(e){var t=[],n=[],r=a(e.replace(j,"$1"));return r[d]?N(function(e,t,n,i){var s,o=r(e,null,i,[]),u=e.length;while(u--)if(s=o[u])e[u]=!(t[u]=s)}):function(e,i,s){return t[0]=e,r(t,null,s,n),!n.pop()}}),has:N(function(e){return function(t){return nt(e,t).length>0}}),contains:N(function(e){return function(t){return(t.textContent||t.innerText||s(t)).indexOf(e)>-1}}),enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&!!e.checked||t==="option"&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},parent:function(e){return!i.pseudos.empty(e)},empty:function(e){var t;e=e.firstChild;while(e){if(e.nodeName>"@"||(t=e.nodeType)===3||t===4)return!1;e=e.nextSibling}return!0},header:function(e){return X.test(e.nodeName)},text:function(e){var t,n;return e.nodeName.toLowerCase()==="input"&&(t=e.type)==="text"&&((n=e.getAttribute("type"))==null||n.toLowerCase()===t)},radio:rt("radio"),checkbox:rt("checkbox"),file:rt("file"),password:rt("password"),image:rt("image"),submit:it("submit"),reset:it("reset"),button:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&e.type==="button"||t==="button"},input:function(e){return V.test(e.nodeName)},focus:function(e){var t=e.ownerDocument;return e===t.activeElement&&(!t.hasFocus||t.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},active:function(e){return e===e.ownerDocument.activeElement},first:st(function(){return[0]}),last:st(function(e,t){return[t-1]}),eq:st(function(e,t,n){return[n<0?n+t:n]}),even:st(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:st(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:st(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:st(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},f=y.compareDocumentPosition?function(e,t){return e===t?(l=!0,0):(!e.compareDocumentPosition||!t.compareDocumentPosition?e.compareDocumentPosition:e.compareDocumentPosition(t)&4)?-1:1}:function(e,t){if(e===t)return l=!0,0;if(e.sourceIndex&&t.sourceIndex)return e.sourceIndex-t.sourceIndex;var n,r,i=[],s=[],o=e.parentNode,u=t.parentNode,a=o;if(o===u)return ot(e,t);if(!o)return-1;if(!u)return 1;while(a)i.unshift(a),a=a.parentNode;a=u;while(a)s.unshift(a),a=a.parentNode;n=i.length,r=s.length;for(var f=0;f<n&&f<r;f++)if(i[f]!==s[f])return ot(i[f],s[f]);return f===n?ot(e,s[f],-1):ot(i[f],t,1)},[0,0].sort(f),h=!l,nt.uniqueSort=function(e){var t,n=[],r=1,i=0;l=h,e.sort(f);if(l){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e},nt.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},a=nt.compile=function(e,t){var n,r=[],i=[],s=A[d][e+" "];if(!s){t||(t=ut(e)),n=t.length;while(n--)s=ht(t[n]),s[d]?r.push(s):i.push(s);s=A(e,pt(i,r))}return s},g.querySelectorAll&&function(){var e,t=vt,n=/'|\\/g,r=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,i=[":focus"],s=[":active"],u=y.matchesSelector||y.mozMatchesSelector||y.webkitMatchesSelector||y.oMatchesSelector||y.msMatchesSelector;K(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||i.push("\\["+O+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||i.push(":checked")}),K(function(e){e.innerHTML="<p test=''></p>",e.querySelectorAll("[test^='']").length&&i.push("[*^$]="+O+"*(?:\"\"|'')"),e.innerHTML="<input type='hidden'/>",e.querySelectorAll(":enabled").length||i.push(":enabled",":disabled")}),i=new RegExp(i.join("|")),vt=function(e,r,s,o,u){if(!o&&!u&&!i.test(e)){var a,f,l=!0,c=d,h=r,p=r.nodeType===9&&e;if(r.nodeType===1&&r.nodeName.toLowerCase()!=="object"){a=ut(e),(l=r.getAttribute("id"))?c=l.replace(n,"\\$&"):r.setAttribute("id",c),c="[id='"+c+"'] ",f=a.length;while(f--)a[f]=c+a[f].join("");h=z.test(e)&&r.parentNode||r,p=a.join(",")}if(p)try{return S.apply(s,x.call(h.querySelectorAll(p),0)),s}catch(v){}finally{l||r.removeAttribute("id")}}return t(e,r,s,o,u)},u&&(K(function(t){e=u.call(t,"div");try{u.call(t,"[test!='']:sizzle"),s.push("!=",H)}catch(n){}}),s=new RegExp(s.join("|")),nt.matchesSelector=function(t,n){n=n.replace(r,"='$1']");if(!o(t)&&!s.test(n)&&!i.test(n))try{var a=u.call(t,n);if(a||e||t.document&&t.document.nodeType!==11)return a}catch(f){}return nt(n,null,null,[t]).length>0})}(),i.pseudos.nth=i.pseudos.eq,i.filters=mt.prototype=i.pseudos,i.setFilters=new mt,nt.attr=v.attr,v.find=nt,v.expr=nt.selectors,v.expr[":"]=v.expr.pseudos,v.unique=nt.uniqueSort,v.text=nt.getText,v.isXMLDoc=nt.isXML,v.contains=nt.contains}(e);var nt=/Until$/,rt=/^(?:parents|prev(?:Until|All))/,it=/^.[^:#\[\.,]*$/,st=v.expr.match.needsContext,ot={children:!0,contents:!0,next:!0,prev:!0};v.fn.extend({find:function(e){var t,n,r,i,s,o,u=this;if(typeof e!="string")return v(e).filter(function(){for(t=0,n=u.length;t<n;t++)if(v.contains(u[t],this))return!0});o=this.pushStack("","find",e);for(t=0,n=this.length;t<n;t++){r=o.length,v.find(e,this[t],o);if(t>0)for(i=r;i<o.length;i++)for(s=0;s<r;s++)if(o[s]===o[i]){o.splice(i--,1);break}}return o},has:function(e){var t,n=v(e,this),r=n.length;return this.filter(function(){for(t=0;t<r;t++)if(v.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1),"not",e)},filter:function(e){return this.pushStack(ft(this,e,!0),"filter",e)},is:function(e){return!!e&&(typeof e=="string"?st.test(e)?v(e,this.context).index(this[0])>=0:v.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,s=[],o=st.test(e)||typeof e!="string"?v(e,t||this.context):0;for(;r<i;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&n.nodeType!==11){if(o?o.index(n)>-1:v.find.matchesSelector(n,e)){s.push(n);break}n=n.parentNode}}return s=s.length>1?v.unique(s):s,this.pushStack(s,"closest",e)},index:function(e){return e?typeof e=="string"?v.inArray(this[0],v(e)):v.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(e,t){var n=typeof e=="string"?v(e,t):v.makeArray(e&&e.nodeType?[e]:e),r=v.merge(this.get(),n);return this.pushStack(ut(n[0])||ut(r[0])?r:v.unique(r))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}}),v.fn.andSelf=v.fn.addBack,v.each({parent:function(e){var t=e.parentNode;return t&&t.nodeType!==11?t:null},parents:function(e){return v.dir(e,"parentNode")},parentsUntil:function(e,t,n){return v.dir(e,"parentNode",n)},next:function(e){return at(e,"nextSibling")},prev:function(e){return at(e,"previousSibling")},nextAll:function(e){return v.dir(e,"nextSibling")},prevAll:function(e){return v.dir(e,"previousSibling")},nextUntil:function(e,t,n){return v.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return v.dir(e,"previousSibling",n)},siblings:function(e){return v.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return v.sibling(e.firstChild)},contents:function(e){return v.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:v.merge([],e.childNodes)}},function(e,t){v.fn[e]=function(n,r){var i=v.map(this,t,n);return nt.test(e)||(r=n),r&&typeof r=="string"&&(i=v.filter(r,i)),i=this.length>1&&!ot[e]?v.unique(i):i,this.length>1&&rt.test(e)&&(i=i.reverse()),this.pushStack(i,e,l.call(arguments).join(","))}}),v.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),t.length===1?v.find.matchesSelector(t[0],e)?[t[0]]:[]:v.find.matches(e,t)},dir:function(e,n,r){var i=[],s=e[n];while(s&&s.nodeType!==9&&(r===t||s.nodeType!==1||!v(s).is(r)))s.nodeType===1&&i.push(s),s=s[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)e.nodeType===1&&e!==t&&n.push(e);return n}});var ct="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ht=/ jQuery\d+="(?:null|\d+)"/g,pt=/^\s+/,dt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,vt=/<([\w:]+)/,mt=/<tbody/i,gt=/<|&#?\w+;/,yt=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,wt=new RegExp("<(?:"+ct+")[\\s/>]","i"),Et=/^(?:checkbox|radio)$/,St=/checked\s*(?:[^=]|=\s*.checked.)/i,xt=/\/(java|ecma)script/i,Tt=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,Nt={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,"",""]},Ct=lt(i),kt=Ct.appendChild(i.createElement("div"));Nt.optgroup=Nt.option,Nt.tbody=Nt.tfoot=Nt.colgroup=Nt.caption=Nt.thead,Nt.th=Nt.td,v.support.htmlSerialize||(Nt._default=[1,"X<div>","</div>"]),v.fn.extend({text:function(e){return v.access(this,function(e){return e===t?v.text(this):this.empty().append((this[0]&&this[0].ownerDocument||i).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(v.isFunction(e))return this.each(function(t){v(this).wrapAll(e.call(this,t))});if(this[0]){var t=v(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&e.firstChild.nodeType===1)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return v.isFunction(e)?this.each(function(t){v(this).wrapInner(e.call(this,t))}):this.each(function(){var t=v(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=v.isFunction(e);return this.each(function(n){v(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){v.nodeName(this,"body")||v(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(e,this.firstChild)})},before:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(e,this),"before",this.selector)}},after:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this.nextSibling)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(this,e),"after",this.selector)}},remove:function(e,t){var n,r=0;for(;(n=this[r])!=null;r++)if(!e||v.filter(e,[n]).length)!t&&n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),v.cleanData([n])),n.parentNode&&n.parentNode.removeChild(n);return this},empty:function(){var e,t=0;for(;(e=this[t])!=null;t++){e.nodeType===1&&v.cleanData(e.getElementsByTagName("*"));while(e.firstChild)e.removeChild(e.firstChild)}return this},clone:function(e,t){return e=e==null?!1:e,t=t==null?e:t,this.map(function(){return v.clone(this,e,t)})},html:function(e){return v.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return n.nodeType===1?n.innerHTML.replace(ht,""):t;if(typeof e=="string"&&!yt.test(e)&&(v.support.htmlSerialize||!wt.test(e))&&(v.support.leadingWhitespace||!pt.test(e))&&!Nt[(vt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(dt,"<$1></$2>");try{for(;r<i;r++)n=this[r]||{},n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),n.innerHTML=e);n=0}catch(s){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){return ut(this[0])?this.length?this.pushStack(v(v.isFunction(e)?e():e),"replaceWith",e):this:v.isFunction(e)?this.each(function(t){var n=v(this),r=n.html();n.replaceWith(e.call(this,t,r))}):(typeof e!="string"&&(e=v(e).detach()),this.each(function(){var t=this.nextSibling,n=this.parentNode;v(this).remove(),t?v(t).before(e):v(n).append(e)}))},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=[].concat.apply([],e);var i,s,o,u,a=0,f=e[0],l=[],c=this.length;if(!v.support.checkClone&&c>1&&typeof f=="string"&&St.test(f))return this.each(function(){v(this).domManip(e,n,r)});if(v.isFunction(f))return this.each(function(i){var s=v(this);e[0]=f.call(this,i,n?s.html():t),s.domManip(e,n,r)});if(this[0]){i=v.buildFragment(e,this,l),o=i.fragment,s=o.firstChild,o.childNodes.length===1&&(o=s);if(s){n=n&&v.nodeName(s,"tr");for(u=i.cacheable||c-1;a<c;a++)r.call(n&&v.nodeName(this[a],"table")?Lt(this[a],"tbody"):this[a],a===u?o:v.clone(o,!0,!0))}o=s=null,l.length&&v.each(l,function(e,t){t.src?v.ajax?v.ajax({url:t.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):v.error("no ajax"):v.globalEval((t.text||t.textContent||t.innerHTML||"").replace(Tt,"")),t.parentNode&&t.parentNode.removeChild(t)})}return this}}),v.buildFragment=function(e,n,r){var s,o,u,a=e[0];return n=n||i,n=!n.nodeType&&n[0]||n,n=n.ownerDocument||n,e.length===1&&typeof a=="string"&&a.length<512&&n===i&&a.charAt(0)==="<"&&!bt.test(a)&&(v.support.checkClone||!St.test(a))&&(v.support.html5Clone||!wt.test(a))&&(o=!0,s=v.fragments[a],u=s!==t),s||(s=n.createDocumentFragment(),v.clean(e,n,s,r),o&&(v.fragments[a]=u&&s)),{fragment:s,cacheable:o}},v.fragments={},v.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){v.fn[e]=function(n){var r,i=0,s=[],o=v(n),u=o.length,a=this.length===1&&this[0].parentNode;if((a==null||a&&a.nodeType===11&&a.childNodes.length===1)&&u===1)return o[t](this[0]),this;for(;i<u;i++)r=(i>0?this.clone(!0):this).get(),v(o[i])[t](r),s=s.concat(r);return this.pushStack(s,e,o.selector)}}),v.extend({clone:function(e,t,n){var r,i,s,o;v.support.html5Clone||v.isXMLDoc(e)||!wt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(kt.innerHTML=e.outerHTML,kt.removeChild(o=kt.firstChild));if((!v.support.noCloneEvent||!v.support.noCloneChecked)&&(e.nodeType===1||e.nodeType===11)&&!v.isXMLDoc(e)){Ot(e,o),r=Mt(e),i=Mt(o);for(s=0;r[s];++s)i[s]&&Ot(r[s],i[s])}if(t){At(e,o);if(n){r=Mt(e),i=Mt(o);for(s=0;r[s];++s)At(r[s],i[s])}}return r=i=null,o},clean:function(e,t,n,r){var s,o,u,a,f,l,c,h,p,d,m,g,y=t===i&&Ct,b=[];if(!t||typeof t.createDocumentFragment=="undefined")t=i;for(s=0;(u=e[s])!=null;s++){typeof u=="number"&&(u+="");if(!u)continue;if(typeof u=="string")if(!gt.test(u))u=t.createTextNode(u);else{y=y||lt(t),c=t.createElement("div"),y.appendChild(c),u=u.replace(dt,"<$1></$2>"),a=(vt.exec(u)||["",""])[1].toLowerCase(),f=Nt[a]||Nt._default,l=f[0],c.innerHTML=f[1]+u+f[2];while(l--)c=c.lastChild;if(!v.support.tbody){h=mt.test(u),p=a==="table"&&!h?c.firstChild&&c.firstChild.childNodes:f[1]==="<table>"&&!h?c.childNodes:[];for(o=p.length-1;o>=0;--o)v.nodeName(p[o],"tbody")&&!p[o].childNodes.length&&p[o].parentNode.removeChild(p[o])}!v.support.leadingWhitespace&&pt.test(u)&&c.insertBefore(t.createTextNode(pt.exec(u)[0]),c.firstChild),u=c.childNodes,c.parentNode.removeChild(c)}u.nodeType?b.push(u):v.merge(b,u)}c&&(u=c=y=null);if(!v.support.appendChecked)for(s=0;(u=b[s])!=null;s++)v.nodeName(u,"input")?_t(u):typeof u.getElementsByTagName!="undefined"&&v.grep(u.getElementsByTagName("input"),_t);if(n){m=function(e){if(!e.type||xt.test(e.type))return r?r.push(e.parentNode?e.parentNode.removeChild(e):e):n.appendChild(e)};for(s=0;(u=b[s])!=null;s++)if(!v.nodeName(u,"script")||!m(u))n.appendChild(u),typeof u.getElementsByTagName!="undefined"&&(g=v.grep(v.merge([],u.getElementsByTagName("script")),m),b.splice.apply(b,[s+1,0].concat(g)),s+=g.length)}return b},cleanData:function(e,t){var n,r,i,s,o=0,u=v.expando,a=v.cache,f=v.support.deleteExpando,l=v.event.special;for(;(i=e[o])!=null;o++)if(t||v.acceptData(i)){r=i[u],n=r&&a[r];if(n){if(n.events)for(s in n.events)l[s]?v.event.remove(i,s):v.removeEvent(i,s,n.handle);a[r]&&(delete a[r],f?delete i[u]:i.removeAttribute?i.removeAttribute(u):i[u]=null,v.deletedIds.push(r))}}}}),function(){var e,t;v.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e=v.uaMatch(o.userAgent),t={},e.browser&&(t[e.browser]=!0,t.version=e.version),t.chrome?t.webkit=!0:t.webkit&&(t.safari=!0),v.browser=t,v.sub=function(){function e(t,n){return new e.fn.init(t,n)}v.extend(!0,e,this),e.superclass=this,e.fn=e.prototype=this(),e.fn.constructor=e,e.sub=this.sub,e.fn.init=function(r,i){return i&&i instanceof v&&!(i instanceof e)&&(i=e(i)),v.fn.init.call(this,r,i,t)},e.fn.init.prototype=e.fn;var t=e(i);return e}}();var Dt,Pt,Ht,Bt=/alpha\([^)]*\)/i,jt=/opacity=([^)]*)/,Ft=/^(top|right|bottom|left)$/,It=/^(none|table(?!-c[ea]).+)/,qt=/^margin/,Rt=new RegExp("^("+m+")(.*)$","i"),Ut=new RegExp("^("+m+")(?!px)[a-z%]+$","i"),zt=new RegExp("^([-+])=("+m+")","i"),Wt={BODY:"block"},Xt={position:"absolute",visibility:"hidden",display:"block"},Vt={letterSpacing:0,fontWeight:400},$t=["Top","Right","Bottom","Left"],Jt=["Webkit","O","Moz","ms"],Kt=v.fn.toggle;v.fn.extend({css:function(e,n){return v.access(this,function(e,n,r){return r!==t?v.style(e,n,r):v.css(e,n)},e,n,arguments.length>1)},show:function(){return Yt(this,!0)},hide:function(){return Yt(this)},toggle:function(e,t){var n=typeof e=="boolean";return v.isFunction(e)&&v.isFunction(t)?Kt.apply(this,arguments):this.each(function(){(n?e:Gt(this))?v(this).show():v(this).hide()})}}),v.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Dt(e,"opacity");return n===""?"1":n}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":v.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(!e||e.nodeType===3||e.nodeType===8||!e.style)return;var s,o,u,a=v.camelCase(n),f=e.style;n=v.cssProps[a]||(v.cssProps[a]=Qt(f,a)),u=v.cssHooks[n]||v.cssHooks[a];if(r===t)return u&&"get"in u&&(s=u.get(e,!1,i))!==t?s:f[n];o=typeof r,o==="string"&&(s=zt.exec(r))&&(r=(s[1]+1)*s[2]+parseFloat(v.css(e,n)),o="number");if(r==null||o==="number"&&isNaN(r))return;o==="number"&&!v.cssNumber[a]&&(r+="px");if(!u||!("set"in u)||(r=u.set(e,r,i))!==t)try{f[n]=r}catch(l){}},css:function(e,n,r,i){var s,o,u,a=v.camelCase(n);return n=v.cssProps[a]||(v.cssProps[a]=Qt(e.style,a)),u=v.cssHooks[n]||v.cssHooks[a],u&&"get"in u&&(s=u.get(e,!0,i)),s===t&&(s=Dt(e,n)),s==="normal"&&n in Vt&&(s=Vt[n]),r||i!==t?(o=parseFloat(s),r||v.isNumeric(o)?o||0:s):s},swap:function(e,t,n){var r,i,s={};for(i in t)s[i]=e.style[i],e.style[i]=t[i];r=n.call(e);for(i in t)e.style[i]=s[i];return r}}),e.getComputedStyle?Dt=function(t,n){var r,i,s,o,u=e.getComputedStyle(t,null),a=t.style;return u&&(r=u.getPropertyValue(n)||u[n],r===""&&!v.contains(t.ownerDocument,t)&&(r=v.style(t,n)),Ut.test(r)&&qt.test(n)&&(i=a.width,s=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=r,r=u.width,a.width=i,a.minWidth=s,a.maxWidth=o)),r}:i.documentElement.currentStyle&&(Dt=function(e,t){var n,r,i=e.currentStyle&&e.currentStyle[t],s=e.style;return i==null&&s&&s[t]&&(i=s[t]),Ut.test(i)&&!Ft.test(t)&&(n=s.left,r=e.runtimeStyle&&e.runtimeStyle.left,r&&(e.runtimeStyle.left=e.currentStyle.left),s.left=t==="fontSize"?"1em":i,i=s.pixelLeft+"px",s.left=n,r&&(e.runtimeStyle.left=r)),i===""?"auto":i}),v.each(["height","width"],function(e,t){v.cssHooks[t]={get:function(e,n,r){if(n)return e.offsetWidth===0&&It.test(Dt(e,"display"))?v.swap(e,Xt,function(){return tn(e,t,r)}):tn(e,t,r)},set:function(e,n,r){return Zt(e,n,r?en(e,t,r,v.support.boxSizing&&v.css(e,"boxSizing")==="border-box"):0)}}}),v.support.opacity||(v.cssHooks.opacity={get:function(e,t){return jt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=v.isNumeric(t)?"alpha(opacity="+t*100+")":"",s=r&&r.filter||n.filter||"";n.zoom=1;if(t>=1&&v.trim(s.replace(Bt,""))===""&&n.removeAttribute){n.removeAttribute("filter");if(r&&!r.filter)return}n.filter=Bt.test(s)?s.replace(Bt,i):s+" "+i}}),v(function(){v.support.reliableMarginRight||(v.cssHooks.marginRight={get:function(e,t){return v.swap(e,{display:"inline-block"},function(){if(t)return Dt(e,"marginRight")})}}),!v.support.pixelPosition&&v.fn.position&&v.each(["top","left"],function(e,t){v.cssHooks[t]={get:function(e,n){if(n){var r=Dt(e,t);return Ut.test(r)?v(e).position()[t]+"px":r}}}})}),v.expr&&v.expr.filters&&(v.expr.filters.hidden=function(e){return e.offsetWidth===0&&e.offsetHeight===0||!v.support.reliableHiddenOffsets&&(e.style&&e.style.display||Dt(e,"display"))==="none"},v.expr.filters.visible=function(e){return!v.expr.filters.hidden(e)}),v.each({margin:"",padding:"",border:"Width"},function(e,t){v.cssHooks[e+t]={expand:function(n){var r,i=typeof n=="string"?n.split(" "):[n],s={};for(r=0;r<4;r++)s[e+$t[r]+t]=i[r]||i[r-2]||i[0];return s}},qt.test(e)||(v.cssHooks[e+t].set=Zt)});var rn=/%20/g,sn=/\[\]$/,on=/\r?\n/g,un=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,an=/^(?:select|textarea)/i;v.fn.extend({serialize:function(){return v.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?v.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||an.test(this.nodeName)||un.test(this.type))}).map(function(e,t){var n=v(this).val();return n==null?null:v.isArray(n)?v.map(n,function(e,n){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),v.param=function(e,n){var r,i=[],s=function(e,t){t=v.isFunction(t)?t():t==null?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};n===t&&(n=v.ajaxSettings&&v.ajaxSettings.traditional);if(v.isArray(e)||e.jquery&&!v.isPlainObject(e))v.each(e,function(){s(this.name,this.value)});else for(r in e)fn(r,e[r],n,s);return i.join("&").replace(rn,"+")};var ln,cn,hn=/#.*$/,pn=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,dn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,vn=/^(?:GET|HEAD)$/,mn=/^\/\//,gn=/\?/,yn=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bn=/([?&])_=[^&]*/,wn=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,En=v.fn.load,Sn={},xn={},Tn=["*/"]+["*"];try{cn=s.href}catch(Nn){cn=i.createElement("a"),cn.href="",cn=cn.href}ln=wn.exec(cn.toLowerCase())||[],v.fn.load=function(e,n,r){if(typeof e!="string"&&En)return En.apply(this,arguments);if(!this.length)return this;var i,s,o,u=this,a=e.indexOf(" ");return a>=0&&(i=e.slice(a,e.length),e=e.slice(0,a)),v.isFunction(n)?(r=n,n=t):n&&typeof n=="object"&&(s="POST"),v.ajax({url:e,type:s,dataType:"html",data:n,complete:function(e,t){r&&u.each(r,o||[e.responseText,t,e])}}).done(function(e){o=arguments,u.html(i?v("<div>").append(e.replace(yn,"")).find(i):e)}),this},v.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,t){v.fn[t]=function(e){return this.on(t,e)}}),v.each(["get","post"],function(e,n){v[n]=function(e,r,i,s){return v.isFunction(r)&&(s=s||i,i=r,r=t),v.ajax({type:n,url:e,data:r,success:i,dataType:s})}}),v.extend({getScript:function(e,n){return v.get(e,t,n,"script")},getJSON:function(e,t,n){return v.get(e,t,n,"json")},ajaxSetup:function(e,t){return t?Ln(e,v.ajaxSettings):(t=e,e=v.ajaxSettings),Ln(e,t),e},ajaxSettings:{url:cn,isLocal:dn.test(ln[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":Tn},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":v.parseJSON,"text xml":v.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:Cn(Sn),ajaxTransport:Cn(xn),ajax:function(e,n){function T(e,n,s,a){var l,y,b,w,S,T=n;if(E===2)return;E=2,u&&clearTimeout(u),o=t,i=a||"",x.readyState=e>0?4:0,s&&(w=An(c,x,s));if(e>=200&&e<300||e===304)c.ifModified&&(S=x.getResponseHeader("Last-Modified"),S&&(v.lastModified[r]=S),S=x.getResponseHeader("Etag"),S&&(v.etag[r]=S)),e===304?(T="notmodified",l=!0):(l=On(c,w),T=l.state,y=l.data,b=l.error,l=!b);else{b=T;if(!T||e)T="error",e<0&&(e=0)}x.status=e,x.statusText=(n||T)+"",l?d.resolveWith(h,[y,T,x]):d.rejectWith(h,[x,T,b]),x.statusCode(g),g=t,f&&p.trigger("ajax"+(l?"Success":"Error"),[x,c,l?y:b]),m.fireWith(h,[x,T]),f&&(p.trigger("ajaxComplete",[x,c]),--v.active||v.event.trigger("ajaxStop"))}typeof e=="object"&&(n=e,e=t),n=n||{};var r,i,s,o,u,a,f,l,c=v.ajaxSetup({},n),h=c.context||c,p=h!==c&&(h.nodeType||h instanceof v)?v(h):v.event,d=v.Deferred(),m=v.Callbacks("once memory"),g=c.statusCode||{},b={},w={},E=0,S="canceled",x={readyState:0,setRequestHeader:function(e,t){if(!E){var n=e.toLowerCase();e=w[n]=w[n]||e,b[e]=t}return this},getAllResponseHeaders:function(){return E===2?i:null},getResponseHeader:function(e){var n;if(E===2){if(!s){s={};while(n=pn.exec(i))s[n[1].toLowerCase()]=n[2]}n=s[e.toLowerCase()]}return n===t?null:n},overrideMimeType:function(e){return E||(c.mimeType=e),this},abort:function(e){return e=e||S,o&&o.abort(e),T(0,e),this}};d.promise(x),x.success=x.done,x.error=x.fail,x.complete=m.add,x.statusCode=function(e){if(e){var t;if(E<2)for(t in e)g[t]=[g[t],e[t]];else t=e[x.status],x.always(t)}return this},c.url=((e||c.url)+"").replace(hn,"").replace(mn,ln[1]+"//"),c.dataTypes=v.trim(c.dataType||"*").toLowerCase().split(y),c.crossDomain==null&&(a=wn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===ln[1]&&a[2]===ln[2]&&(a[3]||(a[1]==="http:"?80:443))==(ln[3]||(ln[1]==="http:"?80:443)))),c.data&&c.processData&&typeof c.data!="string"&&(c.data=v.param(c.data,c.traditional)),kn(Sn,c,n,x);if(E===2)return x;f=c.global,c.type=c.type.toUpperCase(),c.hasContent=!vn.test(c.type),f&&v.active++===0&&v.event.trigger("ajaxStart");if(!c.hasContent){c.data&&(c.url+=(gn.test(c.url)?"&":"?")+c.data,delete c.data),r=c.url;if(c.cache===!1){var N=v.now(),C=c.url.replace(bn,"$1_="+N);c.url=C+(C===c.url?(gn.test(c.url)?"&":"?")+"_="+N:"")}}(c.data&&c.hasContent&&c.contentType!==!1||n.contentType)&&x.setRequestHeader("Content-Type",c.contentType),c.ifModified&&(r=r||c.url,v.lastModified[r]&&x.setRequestHeader("If-Modified-Since",v.lastModified[r]),v.etag[r]&&x.setRequestHeader("If-None-Match",v.etag[r])),x.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+(c.dataTypes[0]!=="*"?", "+Tn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)x.setRequestHeader(l,c.headers[l]);if(!c.beforeSend||c.beforeSend.call(h,x,c)!==!1&&E!==2){S="abort";for(l in{success:1,error:1,complete:1})x[l](c[l]);o=kn(xn,c,n,x);if(!o)T(-1,"No Transport");else{x.readyState=1,f&&p.trigger("ajaxSend",[x,c]),c.async&&c.timeout>0&&(u=setTimeout(function(){x.abort("timeout")},c.timeout));try{E=1,o.send(b,T)}catch(k){if(!(E<2))throw k;T(-1,k)}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var Mn=[],_n=/\?/,Dn=/(=)\?(?=&|$)|\?\?/,Pn=v.now();v.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Mn.pop()||v.expando+"_"+Pn++;return this[e]=!0,e}}),v.ajaxPrefilter("json jsonp",function(n,r,i){var s,o,u,a=n.data,f=n.url,l=n.jsonp!==!1,c=l&&Dn.test(f),h=l&&!c&&typeof a=="string"&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Dn.test(a);if(n.dataTypes[0]==="jsonp"||c||h)return s=n.jsonpCallback=v.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,o=e[s],c?n.url=f.replace(Dn,"$1"+s):h?n.data=a.replace(Dn,"$1"+s):l&&(n.url+=(_n.test(f)?"&":"?")+n.jsonp+"="+s),n.converters["script json"]=function(){return u||v.error(s+" was not called"),u[0]},n.dataTypes[0]="json",e[s]=function(){u=arguments},i.always(function(){e[s]=o,n[s]&&(n.jsonpCallback=r.jsonpCallback,Mn.push(s)),u&&v.isFunction(o)&&o(u[0]),u=o=t}),"script"}),v.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){return v.globalEval(e),e}}}),v.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),v.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=i.head||i.getElementsByTagName("head")[0]||i.documentElement;return{send:function(s,o){n=i.createElement("script"),n.async="async",e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,i){if(i||!n.readyState||/loaded|complete/.test(n.readyState))n.onload=n.onreadystatechange=null,r&&n.parentNode&&r.removeChild(n),n=t,i||o(200,"success")},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(0,1)}}}});var Hn,Bn=e.ActiveXObject?function(){for(var e in Hn)Hn[e](0,1)}:!1,jn=0;v.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&Fn()||In()}:Fn,function(e){v.extend(v.support,{ajax:!!e,cors:!!e&&"withCredentials"in e})}(v.ajaxSettings.xhr()),v.support.ajax&&v.ajaxTransport(function(n){if(!n.crossDomain||v.support.cors){var r;return{send:function(i,s){var o,u,a=n.xhr();n.username?a.open(n.type,n.url,n.async,n.username,n.password):a.open(n.type,n.url,n.async);if(n.xhrFields)for(u in n.xhrFields)a[u]=n.xhrFields[u];n.mimeType&&a.overrideMimeType&&a.overrideMimeType(n.mimeType),!n.crossDomain&&!i["X-Requested-With"]&&(i["X-Requested-With"]="XMLHttpRequest");try{for(u in i)a.setRequestHeader(u,i[u])}catch(f){}a.send(n.hasContent&&n.data||null),r=function(e,i){var u,f,l,c,h;try{if(r&&(i||a.readyState===4)){r=t,o&&(a.onreadystatechange=v.noop,Bn&&delete Hn[o]);if(i)a.readyState!==4&&a.abort();else{u=a.status,l=a.getAllResponseHeaders(),c={},h=a.responseXML,h&&h.documentElement&&(c.xml=h);try{c.text=a.responseText}catch(p){}try{f=a.statusText}catch(p){f=""}!u&&n.isLocal&&!n.crossDomain?u=c.text?200:404:u===1223&&(u=204)}}}catch(d){i||s(-1,d)}c&&s(u,f,c,l)},n.async?a.readyState===4?setTimeout(r,0):(o=++jn,Bn&&(Hn||(Hn={},v(e).unload(Bn)),Hn[o]=r),a.onreadystatechange=r):r()},abort:function(){r&&r(0,1)}}}});var qn,Rn,Un=/^(?:toggle|show|hide)$/,zn=new RegExp("^(?:([-+])=|)("+m+")([a-z%]*)$","i"),Wn=/queueHooks$/,Xn=[Gn],Vn={"*":[function(e,t){var n,r,i=this.createTween(e,t),s=zn.exec(t),o=i.cur(),u=+o||0,a=1,f=20;if(s){n=+s[2],r=s[3]||(v.cssNumber[e]?"":"px");if(r!=="px"&&u){u=v.css(i.elem,e,!0)||n||1;do a=a||".5",u/=a,v.style(i.elem,e,u+r);while(a!==(a=i.cur()/o)&&a!==1&&--f)}i.unit=r,i.start=u,i.end=s[1]?u+(s[1]+1)*n:n}return i}]};v.Animation=v.extend(Kn,{tweener:function(e,t){v.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;r<i;r++)n=e[r],Vn[n]=Vn[n]||[],Vn[n].unshift(t)},prefilter:function(e,t){t?Xn.unshift(e):Xn.push(e)}}),v.Tween=Yn,Yn.prototype={constructor:Yn,init:function(e,t,n,r,i,s){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=s||(v.cssNumber[n]?"":"px")},cur:function(){var e=Yn.propHooks[this.prop];return e&&e.get?e.get(this):Yn.propHooks._default.get(this)},run:function(e){var t,n=Yn.propHooks[this.prop];return this.options.duration?this.pos=t=v.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Yn.propHooks._default.set(this),this}},Yn.prototype.init.prototype=Yn.prototype,Yn.propHooks={_default:{get:function(e){var t;return e.elem[e.prop]==null||!!e.elem.style&&e.elem.style[e.prop]!=null?(t=v.css(e.elem,e.prop,!1,""),!t||t==="auto"?0:t):e.elem[e.prop]},set:function(e){v.fx.step[e.prop]?v.fx.step[e.prop](e):e.elem.style&&(e.elem.style[v.cssProps[e.prop]]!=null||v.cssHooks[e.prop])?v.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Yn.propHooks.scrollTop=Yn.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},v.each(["toggle","show","hide"],function(e,t){var n=v.fn[t];v.fn[t]=function(r,i,s){return r==null||typeof r=="boolean"||!e&&v.isFunction(r)&&v.isFunction(i)?n.apply(this,arguments):this.animate(Zn(t,!0),r,i,s)}}),v.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Gt).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=v.isEmptyObject(e),s=v.speed(t,n,r),o=function(){var t=Kn(this,v.extend({},e),s);i&&t.stop(!0)};return i||s.queue===!1?this.each(o):this.queue(s.queue,o)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return typeof e!="string"&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=e!=null&&e+"queueHooks",s=v.timers,o=v._data(this);if(n)o[n]&&o[n].stop&&i(o[n]);else for(n in o)o[n]&&o[n].stop&&Wn.test(n)&&i(o[n]);for(n=s.length;n--;)s[n].elem===this&&(e==null||s[n].queue===e)&&(s[n].anim.stop(r),t=!1,s.splice(n,1));(t||!r)&&v.dequeue(this,e)})}}),v.each({slideDown:Zn("show"),slideUp:Zn("hide"),slideToggle:Zn("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){v.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),v.speed=function(e,t,n){var r=e&&typeof e=="object"?v.extend({},e):{complete:n||!n&&t||v.isFunction(e)&&e,duration:e,easing:n&&t||t&&!v.isFunction(t)&&t};r.duration=v.fx.off?0:typeof r.duration=="number"?r.duration:r.duration in v.fx.speeds?v.fx.speeds[r.duration]:v.fx.speeds._default;if(r.queue==null||r.queue===!0)r.queue="fx";return r.old=r.complete,r.complete=function(){v.isFunction(r.old)&&r.old.call(this),r.queue&&v.dequeue(this,r.queue)},r},v.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},v.timers=[],v.fx=Yn.prototype.init,v.fx.tick=function(){var e,n=v.timers,r=0;qn=v.now();for(;r<n.length;r++)e=n[r],!e()&&n[r]===e&&n.splice(r--,1);n.length||v.fx.stop(),qn=t},v.fx.timer=function(e){e()&&v.timers.push(e)&&!Rn&&(Rn=setInterval(v.fx.tick,v.fx.interval))},v.fx.interval=13,v.fx.stop=function(){clearInterval(Rn),Rn=null},v.fx.speeds={slow:600,fast:200,_default:400},v.fx.step={},v.expr&&v.expr.filters&&(v.expr.filters.animated=function(e){return v.grep(v.timers,function(t){return e===t.elem}).length});var er=/^(?:body|html)$/i;v.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){v.offset.setOffset(this,e,t)});var n,r,i,s,o,u,a,f={top:0,left:0},l=this[0],c=l&&l.ownerDocument;if(!c)return;return(r=c.body)===l?v.offset.bodyOffset(l):(n=c.documentElement,v.contains(n,l)?(typeof l.getBoundingClientRect!="undefined"&&(f=l.getBoundingClientRect()),i=tr(c),s=n.clientTop||r.clientTop||0,o=n.clientLeft||r.clientLeft||0,u=i.pageYOffset||n.scrollTop,a=i.pageXOffset||n.scrollLeft,{top:f.top+u-s,left:f.left+a-o}):f)},v.offset={bodyOffset:function(e){var t=e.offsetTop,n=e.offsetLeft;return v.support.doesNotIncludeMarginInBodyOffset&&(t+=parseFloat(v.css(e,"marginTop"))||0,n+=parseFloat(v.css(e,"marginLeft"))||0),{top:t,left:n}},setOffset:function(e,t,n){var r=v.css(e,"position");r==="static"&&(e.style.position="relative");var i=v(e),s=i.offset(),o=v.css(e,"top"),u=v.css(e,"left"),a=(r==="absolute"||r==="fixed")&&v.inArray("auto",[o,u])>-1,f={},l={},c,h;a?(l=i.position(),c=l.top,h=l.left):(c=parseFloat(o)||0,h=parseFloat(u)||0),v.isFunction(t)&&(t=t.call(e,n,s)),t.top!=null&&(f.top=t.top-s.top+c),t.left!=null&&(f.left=t.left-s.left+h),"using"in t?t.using.call(e,f):i.css(f)}},v.fn.extend({position:function(){if(!this[0])return;var e=this[0],t=this.offsetParent(),n=this.offset(),r=er.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(v.css(e,"marginTop"))||0,n.left-=parseFloat(v.css(e,"marginLeft"))||0,r.top+=parseFloat(v.css(t[0],"borderTopWidth"))||0,r.left+=parseFloat(v.css(t[0],"borderLeftWidth"))||0,{top:n.top-r.top,left:n.left-r.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||i.body;while(e&&!er.test(e.nodeName)&&v.css(e,"position")==="static")e=e.offsetParent;return e||i.body})}}),v.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);v.fn[e]=function(i){return v.access(this,function(e,i,s){var o=tr(e);if(s===t)return o?n in o?o[n]:o.document.documentElement[i]:e[i];o?o.scrollTo(r?v(o).scrollLeft():s,r?s:v(o).scrollTop()):e[i]=s},e,i,arguments.length,null)}}),v.each({Height:"height",Width:"width"},function(e,n){v.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){v.fn[i]=function(i,s){var o=arguments.length&&(r||typeof i!="boolean"),u=r||(i===!0||s===!0?"margin":"border");return v.access(this,function(n,r,i){var s;return v.isWindow(n)?n.document.documentElement["client"+e]:n.nodeType===9?(s=n.documentElement,Math.max(n.body["scroll"+e],s["scroll"+e],n.body["offset"+e],s["offset"+e],s["client"+e])):i===t?v.css(n,r,i,u):v.style(n,r,i,u)},n,o?i:t,o,null)}})}),e.jQuery=e.$=v,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return v})})(window); \ No newline at end of file
+/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
+//@ sourceMappingURL=jquery-1.10.2.min.map
+*/
+(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav></:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t
+}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Ct=/^(?:checkbox|radio)$/i,Nt=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle);
+u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=un(e,t),Pt.detach()),Gt[e]=n),n}function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,n){x.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(x.css(e,"display"))?x.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x.support.opacity||(x.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=x.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===x.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,n){return n?x.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,n){x.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?x(e).position()[n]+"px":r):t}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!x.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||x.css(e,"display"))},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(x.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Ct.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),x.param=function(e,n){var r,i=[],o=function(e,t){t=x.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}x.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 contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var mn,yn,vn=x.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Cn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Nn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=x.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=o.href}catch(Ln){yn=a.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(T)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(l){var u;return o[l]=!0,x.each(e[l]||[],function(e,l){var c=l(n,r,i);return"string"!=typeof c||a||o[c]?a?!(u=c):t:(n.dataTypes.unshift(c),s(c),!1)}),u}return s(n.dataTypes[0])||!o["*"]&&s("*")}function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,l=e.indexOf(" ");return l>=0&&(i=e.slice(l,e.length),e=e.slice(0,l)),x.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&x.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?x("<div>").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks("once memory"),m=p.statusCode||{},y={},v={},b=0,w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||"*").toLowerCase().match(T)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(mn[3]||("http:"===mn[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&C.setRequestHeader("If-None-Match",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w="abort";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger("ajaxSend",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort("timeout")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||"",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader("Last-Modified"),T&&(x.lastModified[o]=T),T=C.getResponseHeader("etag"),T&&(x.etag[o]=T)),204===e||"HEAD"===p.type?N="nocontent":304===e?N="notmodified":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+"",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger("ajaxComplete",[C,p]),--x.active||x.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,n){return x.get(e,t,n,"script")}}),x.each(["get","post"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+" "+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(p){return{state:"parsererror",error:a?p:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),x.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=a.head||x("head")[0]||a.documentElement;return{send:function(t,i){n=a.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Fn.pop()||x.expando+"_"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return l||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||x.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&"withCredentials"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),"string"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+w+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),a=(x.cssNumber[e]||"px"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,"fxshow");n.queue||(s=x._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(x.support.inlineBlockNeedsLayout&&"inline"!==ln(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?"hidden"in d&&(f=d.hidden):d=x._data(e,"fxshow",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);(i||x._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=x._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,"position");"static"===r&&(e.style.position="relative");var i=x(e),o=i.offset(),a=x.css(e,"top"),s=x.css(e,"left"),l=("absolute"===r||"fixed"===r)&&x.inArray("auto",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),"using"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===x.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(n=e.offset()),n.top+=x.css(e[0],"borderTopWidth",!0),n.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-x.css(r,"marginTop",!0),left:t.left-n.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:"height",Width:"width"},function(e,n){x.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}))})(window);
diff --git a/themes/default/js/plugins/chosen-sprite@2x.png b/themes/default/js/plugins/chosen-sprite@2x.png
new file mode 100644
index 000000000..ffe4d7d11
--- /dev/null
+++ b/themes/default/js/plugins/chosen-sprite@2x.png
Binary files differ
diff --git a/themes/default/js/plugins/chosen.css b/themes/default/js/plugins/chosen.css
index 8f6db26f4..d203a0719 100644
--- a/themes/default/js/plugins/chosen.css
+++ b/themes/default/js/plugins/chosen.css
@@ -1,413 +1,430 @@
/* @group Base */
-.chzn-container {
- font-size: 13px;
+.chosen-container {
position: relative;
display: inline-block;
+ vertical-align: middle;
+ font-size: 13px;
zoom: 1;
*display: inline;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
}
-.chzn-container .chzn-drop {
- background: #fff;
+.chosen-container .chosen-drop {
+ position: absolute;
+ top: 100%;
+ left: -9999px;
+ z-index: 1010;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 100%;
border: 1px solid #aaa;
border-top: 0;
- position: absolute;
- top: 29px;
+ background: #fff;
+ box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15);
+}
+.chosen-container.chosen-with-drop .chosen-drop {
left: 0;
- -webkit-box-shadow: 0 4px 5px rgba(0,0,0,.15);
- -moz-box-shadow : 0 4px 5px rgba(0,0,0,.15);
- box-shadow : 0 4px 5px rgba(0,0,0,.15);
- z-index: 1010;
}
-/* @end */
+.chosen-container a {
+ cursor: pointer;
+}
+/* @end */
/* @group Single Chosen */
-.chzn-container-single .chzn-single {
- background-color: #ffffff;
- filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0 );
- background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4));
- background-image: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
- background-image: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
- background-image: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
- background-image: linear-gradient(#ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
- -webkit-border-radius: 5px;
- -moz-border-radius : 5px;
- border-radius : 5px;
- -moz-background-clip : padding;
- -webkit-background-clip: padding-box;
- background-clip : padding-box;
- border: 1px solid #aaaaaa;
- -webkit-box-shadow: 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
- -moz-box-shadow : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
- box-shadow : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
+.chosen-container-single .chosen-single {
+ position: relative;
display: block;
overflow: hidden;
- white-space: nowrap;
- position: relative;
- height: 23px;
- line-height: 24px;
padding: 0 0 0 8px;
- color: #444444;
+ height: 23px;
+ border: 1px solid #aaa;
+ border-radius: 5px;
+ background-color: #fff;
+ background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4));
+ background: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+ background: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+ background: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+ background: linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+ background-clip: padding-box;
+ box-shadow: 0 0 3px white inset, 0 1px 1px rgba(0, 0, 0, 0.1);
+ color: #444;
text-decoration: none;
+ white-space: nowrap;
+ line-height: 24px;
}
-.chzn-container-single .chzn-default {
+.chosen-container-single .chosen-default {
color: #999;
}
-.chzn-container-single .chzn-single span {
- margin-right: 26px;
+.chosen-container-single .chosen-single span {
display: block;
overflow: hidden;
- white-space: nowrap;
- -o-text-overflow: ellipsis;
- -ms-text-overflow: ellipsis;
+ margin-right: 26px;
text-overflow: ellipsis;
+ white-space: nowrap;
}
-.chzn-container-single .chzn-single abbr {
- display: block;
+.chosen-container-single .chosen-single-with-deselect span {
+ margin-right: 38px;
+}
+.chosen-container-single .chosen-single abbr {
position: absolute;
- right: 26px;
top: 6px;
+ right: 26px;
+ display: block;
width: 12px;
height: 12px;
- font-size: 1px;
background: url('chosen-sprite.png') -42px 1px no-repeat;
+ font-size: 1px;
}
-.chzn-container-single .chzn-single abbr:hover {
+.chosen-container-single .chosen-single abbr:hover {
background-position: -42px -10px;
}
-.chzn-container-single.chzn-disabled .chzn-single abbr:hover {
+.chosen-container-single.chosen-disabled .chosen-single abbr:hover {
background-position: -42px -10px;
}
-.chzn-container-single .chzn-single div {
+.chosen-container-single .chosen-single div {
position: absolute;
- right: 0;
top: 0;
+ right: 0;
display: block;
- height: 100%;
width: 18px;
+ height: 100%;
}
-.chzn-container-single .chzn-single div b {
- background: url('chosen-sprite.png') no-repeat 0px 2px;
+.chosen-container-single .chosen-single div b {
display: block;
width: 100%;
height: 100%;
+ background: url('chosen-sprite.png') no-repeat 0px 2px;
}
-.chzn-container-single .chzn-search {
- padding: 3px 4px;
+.chosen-container-single .chosen-search {
position: relative;
+ z-index: 1010;
margin: 0;
+ padding: 3px 4px;
white-space: nowrap;
- z-index: 1010;
}
-.chzn-container-single .chzn-search input {
- background: #fff url('chosen-sprite.png') no-repeat 100% -20px;
- background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-gradient(linear, 0 0, 0 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
- background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
- background: url('chosen-sprite.png') no-repeat 100% -20px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
- background: url('chosen-sprite.png') no-repeat 100% -20px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
- background: url('chosen-sprite.png') no-repeat 100% -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
+.chosen-container-single .chosen-search input[type="text"] {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
margin: 1px 0;
padding: 4px 20px 4px 5px;
+ width: 100%;
+ height: auto;
outline: 0;
border: 1px solid #aaa;
- font-family: sans-serif;
+ background: white url('chosen-sprite.png') no-repeat 100% -20px;
+ background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
+ background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%);
+ background: url('chosen-sprite.png') no-repeat 100% -20px, -moz-linear-gradient(#eeeeee 1%, #ffffff 15%);
+ background: url('chosen-sprite.png') no-repeat 100% -20px, -o-linear-gradient(#eeeeee 1%, #ffffff 15%);
+ background: url('chosen-sprite.png') no-repeat 100% -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
font-size: 1em;
+ font-family: sans-serif;
+ line-height: normal;
+ border-radius: 0;
}
-.chzn-container-single .chzn-drop {
- -webkit-border-radius: 0 0 4px 4px;
- -moz-border-radius : 0 0 4px 4px;
- border-radius : 0 0 4px 4px;
- -moz-background-clip : padding;
- -webkit-background-clip: padding-box;
- background-clip : padding-box;
+.chosen-container-single .chosen-drop {
+ margin-top: -1px;
+ border-radius: 0 0 4px 4px;
+ background-clip: padding-box;
}
-/* @end */
-
-.chzn-container-single-nosearch .chzn-search input {
+.chosen-container-single.chosen-container-single-nosearch .chosen-search {
position: absolute;
- left: -9000px;
+ left: -9999px;
}
+/* @end */
+/* @group Results */
+.chosen-container .chosen-results {
+ position: relative;
+ overflow-x: hidden;
+ overflow-y: auto;
+ margin: 0 4px 4px 0;
+ padding: 0 0 0 4px;
+ max-height: 240px;
+ -webkit-overflow-scrolling: touch;
+}
+.chosen-container .chosen-results li {
+ display: none;
+ margin: 0;
+ padding: 5px 6px;
+ list-style: none;
+ line-height: 15px;
+}
+.chosen-container .chosen-results li.active-result {
+ display: list-item;
+ cursor: pointer;
+}
+.chosen-container .chosen-results li.disabled-result {
+ display: list-item;
+ color: #ccc;
+ cursor: default;
+}
+.chosen-container .chosen-results li.highlighted {
+ background-color: #3875d7;
+ background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc));
+ background-image: -webkit-linear-gradient(#3875d7 20%, #2a62bc 90%);
+ background-image: -moz-linear-gradient(#3875d7 20%, #2a62bc 90%);
+ background-image: -o-linear-gradient(#3875d7 20%, #2a62bc 90%);
+ background-image: linear-gradient(#3875d7 20%, #2a62bc 90%);
+ color: #fff;
+}
+.chosen-container .chosen-results li.no-results {
+ display: list-item;
+ background: #f4f4f4;
+}
+.chosen-container .chosen-results li.group-result {
+ display: list-item;
+ font-weight: bold;
+ cursor: default;
+}
+.chosen-container .chosen-results li.group-option {
+ padding-left: 15px;
+}
+.chosen-container .chosen-results li em {
+ font-style: normal;
+ text-decoration: underline;
+}
+
+/* @end */
/* @group Multi Chosen */
-.chzn-container-multi .chzn-choices {
- background-color: #fff;
- background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
- background-image: -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
- background-image: -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
- background-image: -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
- background-image: linear-gradient(#eeeeee 1%, #ffffff 15%);
- border: 1px solid #aaa;
+.chosen-container-multi .chosen-choices {
+ position: relative;
+ overflow: hidden;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
margin: 0;
padding: 0;
- cursor: text;
- overflow: hidden;
+ width: 100%;
height: auto !important;
height: 1%;
- position: relative;
+ border: 1px solid #aaa;
+ background-color: #fff;
+ background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
+ background-image: -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%);
+ background-image: -moz-linear-gradient(#eeeeee 1%, #ffffff 15%);
+ background-image: -o-linear-gradient(#eeeeee 1%, #ffffff 15%);
+ background-image: linear-gradient(#eeeeee 1%, #ffffff 15%);
+ cursor: text;
}
-.chzn-container-multi .chzn-choices li {
+.chosen-container-multi .chosen-choices li {
float: left;
list-style: none;
}
-.chzn-container-multi .chzn-choices .search-field {
- white-space: nowrap;
+.chosen-container-multi .chosen-choices li.search-field {
margin: 0;
padding: 0;
+ white-space: nowrap;
}
-.chzn-container-multi .chzn-choices .search-field input {
- color: #666;
- background: transparent !important;
- border: 0 !important;
- font-family: sans-serif;
- font-size: 100%;
- height: 15px;
- padding: 5px;
+.chosen-container-multi .chosen-choices li.search-field input[type="text"] {
margin: 1px 0;
+ padding: 5px;
+ height: 15px;
outline: 0;
- -webkit-box-shadow: none;
- -moz-box-shadow : none;
- box-shadow : none;
+ border: 0 !important;
+ background: transparent !important;
+ box-shadow: none;
+ color: #666;
+ font-size: 100%;
+ font-family: sans-serif;
+ line-height: normal;
+ border-radius: 0;
}
-.chzn-container-multi .chzn-choices .search-field .default {
+.chosen-container-multi .chosen-choices li.search-field .default {
color: #999;
}
-.chzn-container-multi .chzn-choices .search-choice {
- -webkit-border-radius: 3px;
- -moz-border-radius : 3px;
- border-radius : 3px;
- -moz-background-clip : padding;
- -webkit-background-clip: padding-box;
- background-clip : padding-box;
+.chosen-container-multi .chosen-choices li.search-choice {
+ position: relative;
+ margin: 3px 0 3px 5px;
+ padding: 3px 20px 3px 5px;
+ border: 1px solid #aaa;
+ border-radius: 3px;
background-color: #e4e4e4;
- filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0 );
- background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
- background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
- background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
- background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
- background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
- -webkit-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
- -moz-box-shadow : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
- box-shadow : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
+ background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
+ background-image: -webkit-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+ background-image: -moz-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+ background-image: -o-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+ background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+ background-clip: padding-box;
+ box-shadow: 0 0 2px white inset, 0 1px 0 rgba(0, 0, 0, 0.05);
color: #333;
- border: 1px solid #aaaaaa;
line-height: 13px;
- padding: 3px 20px 3px 5px;
- margin: 3px 0 3px 5px;
- position: relative;
cursor: default;
}
-.chzn-container-multi .chzn-choices .search-choice.search-choice-disabled {
- background-color: #e4e4e4;
- filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0 );
- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
- background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
- background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
- background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
- background-image: -ms-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
- background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
- color: #666;
- border: 1px solid #cccccc;
- padding-right: 5px;
-}
-.chzn-container-multi .chzn-choices .search-choice-focus {
- background: #d4d4d4;
-}
-.chzn-container-multi .chzn-choices .search-choice .search-choice-close {
- display: block;
+.chosen-container-multi .chosen-choices li.search-choice .search-choice-close {
position: absolute;
- right: 3px;
top: 4px;
+ right: 3px;
+ display: block;
width: 12px;
height: 12px;
- font-size: 1px;
background: url('chosen-sprite.png') -42px 1px no-repeat;
+ font-size: 1px;
}
-.chzn-container-multi .chzn-choices .search-choice .search-choice-close:hover {
+.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover {
background-position: -42px -10px;
}
-.chzn-container-multi .chzn-choices .search-choice-focus .search-choice-close {
- background-position: -42px -10px;
+.chosen-container-multi .chosen-choices li.search-choice-disabled {
+ padding-right: 5px;
+ border: 1px solid #ccc;
+ background-color: #e4e4e4;
+ background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
+ background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+ background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+ background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+ background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+ color: #666;
}
-/* @end */
-
-/* @group Results */
-.chzn-container .chzn-results {
- margin: 0 4px 4px 0;
- max-height: 240px;
- padding: 0 0 0 4px;
- position: relative;
- overflow-x: hidden;
- overflow-y: auto;
- -webkit-overflow-scrolling: touch;
+.chosen-container-multi .chosen-choices li.search-choice-focus {
+ background: #d4d4d4;
}
-.chzn-container-multi .chzn-results {
- margin: -1px 0 0;
- padding: 0;
+.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close {
+ background-position: -42px -10px;
}
-.chzn-container .chzn-results li {
- display: none;
- line-height: 15px;
- padding: 5px 6px;
+.chosen-container-multi .chosen-results {
margin: 0;
- list-style: none;
-}
-.chzn-container .chzn-results .active-result {
- cursor: pointer;
- display: list-item;
-}
-.chzn-container .chzn-results .highlighted {
- background-color: #3875d7;
- filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3875d7', endColorstr='#2a62bc', GradientType=0 );
- background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc));
- background-image: -webkit-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
- background-image: -moz-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
- background-image: -o-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
- background-image: linear-gradient(#3875d7 20%, #2a62bc 90%);
- color: #fff;
-}
-.chzn-container .chzn-results li em {
- background: #feffde;
- font-style: normal;
-}
-.chzn-container .chzn-results .highlighted em {
- background: transparent;
+ padding: 0;
}
-.chzn-container .chzn-results .no-results {
- background: #f4f4f4;
+.chosen-container-multi .chosen-drop .result-selected {
display: list-item;
-}
-.chzn-container .chzn-results .group-result {
+ color: #ccc;
cursor: default;
- color: #999;
- font-weight: bold;
}
-.chzn-container .chzn-results .group-option {
- padding-left: 15px;
-}
-.chzn-container-multi .chzn-drop .result-selected {
- display: none;
-}
-.chzn-container .chzn-results-scroll {
- background: white;
- margin: 0 4px;
- position: absolute;
- text-align: center;
- width: 321px; /* This should by dynamic with js */
- z-index: 1;
-}
-.chzn-container .chzn-results-scroll span {
- display: inline-block;
- height: 17px;
- text-indent: -5000px;
- width: 9px;
-}
-.chzn-container .chzn-results-scroll-down {
- bottom: 0;
-}
-.chzn-container .chzn-results-scroll-down span {
- background: url('chosen-sprite.png') no-repeat -4px -3px;
-}
-.chzn-container .chzn-results-scroll-up span {
- background: url('chosen-sprite.png') no-repeat -22px -3px;
-}
-/* @end */
+/* @end */
/* @group Active */
-.chzn-container-active .chzn-single {
- -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
- -moz-box-shadow : 0 0 5px rgba(0,0,0,.3);
- box-shadow : 0 0 5px rgba(0,0,0,.3);
+.chosen-container-active .chosen-single {
border: 1px solid #5897fb;
+ box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
}
-.chzn-container-active .chzn-single-with-drop {
+.chosen-container-active.chosen-with-drop .chosen-single {
border: 1px solid #aaa;
- -webkit-box-shadow: 0 1px 0 #fff inset;
- -moz-box-shadow : 0 1px 0 #fff inset;
- box-shadow : 0 1px 0 #fff inset;
- background-color: #eee;
- filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0 );
- background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #eeeeee), color-stop(80%, #ffffff));
- background-image: -webkit-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
- background-image: -moz-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
- background-image: -o-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
- background-image: linear-gradient(#eeeeee 20%, #ffffff 80%);
- -webkit-border-bottom-left-radius : 0;
- -webkit-border-bottom-right-radius: 0;
- -moz-border-radius-bottomleft : 0;
-moz-border-radius-bottomright: 0;
- border-bottom-left-radius : 0;
border-bottom-right-radius: 0;
+ -moz-border-radius-bottomleft: 0;
+ border-bottom-left-radius: 0;
+ background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #eeeeee), color-stop(80%, #ffffff));
+ background-image: -webkit-linear-gradient(#eeeeee 20%, #ffffff 80%);
+ background-image: -moz-linear-gradient(#eeeeee 20%, #ffffff 80%);
+ background-image: -o-linear-gradient(#eeeeee 20%, #ffffff 80%);
+ background-image: linear-gradient(#eeeeee 20%, #ffffff 80%);
+ box-shadow: 0 1px 0 #fff inset;
}
-.chzn-container-active .chzn-single-with-drop div {
- background: transparent;
+.chosen-container-active.chosen-with-drop .chosen-single div {
border-left: none;
+ background: transparent;
}
-.chzn-container-active .chzn-single-with-drop div b {
+.chosen-container-active.chosen-with-drop .chosen-single div b {
background-position: -18px 2px;
}
-.chzn-container-active .chzn-choices {
- -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
- -moz-box-shadow : 0 0 5px rgba(0,0,0,.3);
- box-shadow : 0 0 5px rgba(0,0,0,.3);
+.chosen-container-active .chosen-choices {
border: 1px solid #5897fb;
+ box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
}
-.chzn-container-active .chzn-choices .search-field input {
+.chosen-container-active .chosen-choices li.search-field input[type="text"] {
color: #111 !important;
}
-/* @end */
+/* @end */
/* @group Disabled Support */
-.chzn-disabled {
+.chosen-disabled {
+ opacity: 0.5 !important;
cursor: default;
- opacity:0.5 !important;
}
-.chzn-disabled .chzn-single {
+.chosen-disabled .chosen-single {
cursor: default;
}
-.chzn-disabled .chzn-choices .search-choice .search-choice-close {
+.chosen-disabled .chosen-choices .search-choice .search-choice-close {
cursor: default;
}
+/* @end */
/* @group Right to Left */
-.chzn-rtl { text-align: right; }
-.chzn-rtl .chzn-single { padding: 0 8px 0 0; overflow: visible; }
-.chzn-rtl .chzn-single span { margin-left: 26px; margin-right: 0; direction: rtl; }
-
-.chzn-rtl .chzn-single div { left: 3px; right: auto; }
-.chzn-rtl .chzn-single abbr {
+.chosen-rtl {
+ text-align: right;
+}
+.chosen-rtl .chosen-single {
+ overflow: visible;
+ padding: 0 8px 0 0;
+}
+.chosen-rtl .chosen-single span {
+ margin-right: 0;
+ margin-left: 26px;
+ direction: rtl;
+}
+.chosen-rtl .chosen-single-with-deselect span {
+ margin-left: 38px;
+}
+.chosen-rtl .chosen-single div {
+ right: auto;
+ left: 3px;
+}
+.chosen-rtl .chosen-single abbr {
+ right: auto;
left: 26px;
+}
+.chosen-rtl .chosen-choices li {
+ float: right;
+}
+.chosen-rtl .chosen-choices li.search-field input[type="text"] {
+ direction: rtl;
+}
+.chosen-rtl .chosen-choices li.search-choice {
+ margin: 3px 5px 3px 0;
+ padding: 3px 5px 3px 19px;
+}
+.chosen-rtl .chosen-choices li.search-choice .search-choice-close {
right: auto;
+ left: 4px;
}
-.chzn-rtl .chzn-choices .search-field input { direction: rtl; }
-.chzn-rtl .chzn-choices li { float: right; }
-.chzn-rtl .chzn-choices .search-choice { padding: 3px 5px 3px 19px; margin: 3px 5px 3px 0; }
-.chzn-rtl .chzn-choices .search-choice .search-choice-close { left: 4px; right: auto; }
-.chzn-rtl.chzn-container-single .chzn-results { margin: 0 0 4px 4px; padding: 0 4px 0 0; }
-.chzn-rtl .chzn-results .group-option { padding-left: 0; padding-right: 15px; }
-.chzn-rtl.chzn-container-active .chzn-single-with-drop div { border-right: none; }
-.chzn-rtl .chzn-search input {
- background: #fff url('chosen-sprite.png') no-repeat -30px -20px;
- background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-gradient(linear, 0 0, 0 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
- background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
- background: url('chosen-sprite.png') no-repeat -30px -20px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
- background: url('chosen-sprite.png') no-repeat -30px -20px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
- background: url('chosen-sprite.png') no-repeat -30px -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
+.chosen-rtl.chosen-container-single-nosearch .chosen-search,
+.chosen-rtl .chosen-drop {
+ left: 9999px;
+}
+.chosen-rtl.chosen-container-single .chosen-results {
+ margin: 0 0 4px 4px;
+ padding: 0 4px 0 0;
+}
+.chosen-rtl .chosen-results li.group-option {
+ padding-right: 15px;
+ padding-left: 0;
+}
+.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div {
+ border-right: none;
+}
+.chosen-rtl .chosen-search input[type="text"] {
padding: 4px 5px 4px 20px;
+ background: white url('chosen-sprite.png') no-repeat -30px -20px;
+ background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
+ background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%);
+ background: url('chosen-sprite.png') no-repeat -30px -20px, -moz-linear-gradient(#eeeeee 1%, #ffffff 15%);
+ background: url('chosen-sprite.png') no-repeat -30px -20px, -o-linear-gradient(#eeeeee 1%, #ffffff 15%);
+ background: url('chosen-sprite.png') no-repeat -30px -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
direction: rtl;
}
-.chzn-container-single.chzn-rtl .chzn-single div b {
+.chosen-rtl.chosen-container-single .chosen-single div b {
background-position: 6px 2px;
}
-.chzn-container-single.chzn-rtl .chzn-single-with-drop div b {
+.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b {
background-position: -12px 2px;
}
-/* @end */
+/* @end */
/* @group Retina compatibility */
-@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 144dpi) {
- .chzn-rtl .chzn-search input, .chzn-container-single .chzn-single abbr, .chzn-container-single .chzn-single div b, .chzn-container-single .chzn-search input, .chzn-container-multi .chzn-choices .search-choice .search-choice-close, .chzn-container .chzn-results-scroll-down span, .chzn-container .chzn-results-scroll-up span {
- background-image: url('chosen-sprite@2x.png') !important;
- background-repeat: no-repeat !important;
- background-size: 52px 37px !important;
+@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 144dpi) {
+ .chosen-rtl .chosen-search input[type="text"],
+ .chosen-container-single .chosen-single abbr,
+ .chosen-container-single .chosen-single div b,
+ .chosen-container-single .chosen-search input[type="text"],
+ .chosen-container-multi .chosen-choices .search-choice .search-choice-close,
+ .chosen-container .chosen-results-scroll-down span,
+ .chosen-container .chosen-results-scroll-up span {
+ background-image: url('chosen-sprite@2x.png') !important;
+ background-size: 52px 37px !important;
+ background-repeat: no-repeat !important;
}
}
/* @end */
diff --git a/themes/default/js/plugins/chosen.jquery.min.js b/themes/default/js/plugins/chosen.jquery.min.js
index 2ee0d7f8f..ad430c46a 100644
--- a/themes/default/js/plugins/chosen.jquery.min.js
+++ b/themes/default/js/plugins/chosen.jquery.min.js
@@ -1,10 +1,2 @@
-// Chosen, a Select Box Enhancer for jQuery and Protoype
-// by Patrick Filler for Harvest, http://getharvest.com
-//
-// Version 0.9.11
-// Full source at https://github.com/harvesthq/chosen
-// Copyright (c) 2011 Harvest http://getharvest.com
-
-// MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
-// This file is generated by `cake build`, do not edit it by hand.
-(function(){var e;e=function(){function e(){this.options_index=0,this.parsed=[]}return e.prototype.add_node=function(e){return e.nodeName.toUpperCase()==="OPTGROUP"?this.add_group(e):this.add_option(e)},e.prototype.add_group=function(e){var t,n,r,i,s,o;t=this.parsed.length,this.parsed.push({array_index:t,group:!0,label:e.label,children:0,disabled:e.disabled}),s=e.childNodes,o=[];for(r=0,i=s.length;r<i;r++)n=s[r],o.push(this.add_option(n,t,e.disabled));return o},e.prototype.add_option=function(e,t,n){if(e.nodeName.toUpperCase()==="OPTION")return e.text!==""?(t!=null&&(this.parsed[t].children+=1),this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,value:e.value,text:e.text,html:e.innerHTML,selected:e.selected,disabled:n===!0?n:e.disabled,group_array_index:t,classes:e.className,style:e.style.cssText})):this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,empty:!0}),this.options_index+=1},e}(),e.select_to_array=function(t){var n,r,i,s,o;r=new e,o=t.childNodes;for(i=0,s=o.length;i<s;i++)n=o[i],r.add_node(n);return r.parsed},this.SelectParser=e}).call(this),function(){var e,t;t=this,e=function(){function e(e,t){this.form_field=e,this.options=t!=null?t:{},this.is_multiple=this.form_field.multiple,this.set_default_text(),this.set_default_values(),this.setup(),this.set_up_html(),this.register_observers(),this.finish_setup()}return e.prototype.set_default_values=function(){var e=this;return this.click_test_action=function(t){return e.test_active_click(t)},this.activate_action=function(t){return e.activate_field(t)},this.active_field=!1,this.mouse_on_container=!1,this.results_showing=!1,this.result_highlighted=null,this.result_single_selected=null,this.allow_single_deselect=this.options.allow_single_deselect!=null&&this.form_field.options[0]!=null&&this.form_field.options[0].text===""?this.options.allow_single_deselect:!1,this.disable_search_threshold=this.options.disable_search_threshold||0,this.disable_search=this.options.disable_search||!1,this.enable_split_word_search=this.options.enable_split_word_search!=null?this.options.enable_split_word_search:!0,this.search_contains=this.options.search_contains||!1,this.choices=0,this.single_backstroke_delete=this.options.single_backstroke_delete||!1,this.max_selected_options=this.options.max_selected_options||Infinity,this.inherit_select_classes=this.options.inherit_select_classes||!1},e.prototype.set_default_text=function(){return this.form_field.getAttribute("data-placeholder")?this.default_text=this.form_field.getAttribute("data-placeholder"):this.is_multiple?this.default_text=this.options.placeholder_text_multiple||this.options.placeholder_text||"Select Some Options":this.default_text=this.options.placeholder_text_single||this.options.placeholder_text||"Select an Option",this.results_none_found=this.form_field.getAttribute("data-no_results_text")||this.options.no_results_text||"No results match"},e.prototype.mouse_enter=function(){return this.mouse_on_container=!0},e.prototype.mouse_leave=function(){return this.mouse_on_container=!1},e.prototype.input_focus=function(e){var t=this;if(this.is_multiple){if(!this.active_field)return setTimeout(function(){return t.container_mousedown()},50)}else if(!this.active_field)return this.activate_field()},e.prototype.input_blur=function(e){var t=this;if(!this.mouse_on_container)return this.active_field=!1,setTimeout(function(){return t.blur_test()},100)},e.prototype.result_add_option=function(e){var t,n;return e.disabled?"":(e.dom_id=this.container_id+"_o_"+e.array_index,t=e.selected&&this.is_multiple?[]:["active-result"],e.selected&&t.push("result-selected"),e.group_array_index!=null&&t.push("group-option"),e.classes!==""&&t.push(e.classes),n=e.style.cssText!==""?' style="'+e.style+'"':"",'<li id="'+e.dom_id+'" class="'+t.join(" ")+'"'+n+">"+e.html+"</li>")},e.prototype.results_update_field=function(){return this.is_multiple||this.results_reset_cleanup(),this.result_clear_highlight(),this.result_single_selected=null,this.results_build()},e.prototype.results_toggle=function(){return this.results_showing?this.results_hide():this.results_show()},e.prototype.results_search=function(e){return this.results_showing?this.winnow_results():this.results_show()},e.prototype.keyup_checker=function(e){var t,n;t=(n=e.which)!=null?n:e.keyCode,this.search_field_scale();switch(t){case 8:if(this.is_multiple&&this.backstroke_length<1&&this.choices>0)return this.keydown_backstroke();if(!this.pending_backstroke)return this.result_clear_highlight(),this.results_search();break;case 13:e.preventDefault();if(this.results_showing)return this.result_select(e);break;case 27:return this.results_showing&&this.results_hide(),!0;case 9:case 38:case 40:case 16:case 91:case 17:break;default:return this.results_search()}},e.prototype.generate_field_id=function(){var e;return e=this.generate_random_id(),this.form_field.id=e,e},e.prototype.generate_random_char=function(){var e,t,n;return e="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",n=Math.floor(Math.random()*e.length),t=e.substring(n,n+1)},e}(),t.AbstractChosen=e}.call(this),function(){var e,t,n,r,i={}.hasOwnProperty,s=function(e,t){function r(){this.constructor=e}for(var n in t)i.call(t,n)&&(e[n]=t[n]);return r.prototype=t.prototype,e.prototype=new r,e.__super__=t.prototype,e};r=this,e=jQuery,e.fn.extend({chosen:function(n){var r,i,s;return s=navigator.userAgent.toLowerCase(),i=/(msie) ([\w.]+)/.exec(s)||[],r={name:i[1]||"",version:i[2]||"0"},r.name==="msie"&&(r.version==="6.0"||r.version==="7.0"&&document.documentMode===7)?this:this.each(function(r){var i;i=e(this);if(!i.hasClass("chzn-done"))return i.data("chosen",new t(this,n))})}}),t=function(t){function i(){return i.__super__.constructor.apply(this,arguments)}return s(i,t),i.prototype.setup=function(){return this.form_field_jq=e(this.form_field),this.current_value=this.form_field_jq.val(),this.is_rtl=this.form_field_jq.hasClass("chzn-rtl")},i.prototype.finish_setup=function(){return this.form_field_jq.addClass("chzn-done")},i.prototype.set_up_html=function(){var t,r,i,s,o,u;return this.container_id=this.form_field.id.length?this.form_field.id.replace(/[^\w]/g,"_"):this.generate_field_id(),this.container_id+="_chzn",t=["chzn-container"],t.push("chzn-container-"+(this.is_multiple?"multi":"single")),this.inherit_select_classes&&this.form_field.className&&t.push(this.form_field.className),this.is_rtl&&t.push("chzn-rtl"),this.f_width=this.form_field_jq.outerWidth(),i={id:this.container_id,"class":t.join(" "),style:"width: "+this.f_width+"px;",title:this.form_field.title},r=e("<div />",i),this.is_multiple?r.html('<ul class="chzn-choices"><li class="search-field"><input type="text" value="'+this.default_text+'" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chzn-drop" style="left:-9000px;"><ul class="chzn-results"></ul></div>'):r.html('<a href="javascript:void(0)" class="chzn-single chzn-default" tabindex="-1"><span>'+this.default_text+'</span><div><b></b></div></a><div class="chzn-drop" style="left:-9000px;"><div class="chzn-search"><input type="text" autocomplete="off" /></div><ul class="chzn-results"></ul></div>'),this.form_field_jq.hide().after(r),this.container=e("#"+this.container_id),this.dropdown=this.container.find("div.chzn-drop").first(),s=this.container.height(),o=this.f_width-n(this.dropdown),this.dropdown.css({width:o+"px",top:s+"px"}),this.search_field=this.container.find("input").first(),this.search_results=this.container.find("ul.chzn-results").first(),this.search_field_scale(),this.search_no_results=this.container.find("li.no-results").first(),this.is_multiple?(this.search_choices=this.container.find("ul.chzn-choices").first(),this.search_container=this.container.find("li.search-field").first()):(this.search_container=this.container.find("div.chzn-search").first(),this.selected_item=this.container.find(".chzn-single").first(),u=o-n(this.search_container)-n(this.search_field),this.search_field.css({width:u+"px"})),this.results_build(),this.set_tab_index(),this.form_field_jq.trigger("liszt:ready",{chosen:this})},i.prototype.register_observers=function(){var e=this;return this.container.mousedown(function(t){return e.container_mousedown(t)}),this.container.mouseup(function(t){return e.container_mouseup(t)}),this.container.mouseenter(function(t){return e.mouse_enter(t)}),this.container.mouseleave(function(t){return e.mouse_leave(t)}),this.search_results.mouseup(function(t){return e.search_results_mouseup(t)}),this.search_results.mouseover(function(t){return e.search_results_mouseover(t)}),this.search_results.mouseout(function(t){return e.search_results_mouseout(t)}),this.form_field_jq.bind("liszt:updated",function(t){return e.results_update_field(t)}),this.form_field_jq.bind("liszt:activate",function(t){return e.activate_field(t)}),this.form_field_jq.bind("liszt:open",function(t){return e.container_mousedown(t)}),this.search_field.blur(function(t){return e.input_blur(t)}),this.search_field.keyup(function(t){return e.keyup_checker(t)}),this.search_field.keydown(function(t){return e.keydown_checker(t)}),this.search_field.focus(function(t){return e.input_focus(t)}),this.is_multiple?this.search_choices.click(function(t){return e.choices_click(t)}):this.container.click(function(e){return e.preventDefault()})},i.prototype.search_field_disabled=function(){this.is_disabled=this.form_field_jq[0].disabled;if(this.is_disabled)return this.container.addClass("chzn-disabled"),this.search_field[0].disabled=!0,this.is_multiple||this.selected_item.unbind("focus",this.activate_action),this.close_field();this.container.removeClass("chzn-disabled"),this.search_field[0].disabled=!1;if(!this.is_multiple)return this.selected_item.bind("focus",this.activate_action)},i.prototype.container_mousedown=function(t){var n;if(!this.is_disabled)return n=t!=null?e(t.target).hasClass("search-choice-close"):!1,t&&t.type==="mousedown"&&!this.results_showing&&t.preventDefault(),!this.pending_destroy_click&&!n?(this.active_field?!this.is_multiple&&t&&(e(t.target)[0]===this.selected_item[0]||e(t.target).parents("a.chzn-single").length)&&(t.preventDefault(),this.results_toggle()):(this.is_multiple&&this.search_field.val(""),e(document).click(this.click_test_action),this.results_show()),this.activate_field()):this.pending_destroy_click=!1},i.prototype.container_mouseup=function(e){if(e.target.nodeName==="ABBR"&&!this.is_disabled)return this.results_reset(e)},i.prototype.blur_test=function(e){if(!this.active_field&&this.container.hasClass("chzn-container-active"))return this.close_field()},i.prototype.close_field=function(){return e(document).unbind("click",this.click_test_action),this.active_field=!1,this.results_hide(),this.container.removeClass("chzn-container-active"),this.winnow_results_clear(),this.clear_backstroke(),this.show_search_field_default(),this.search_field_scale()},i.prototype.activate_field=function(){return this.container.addClass("chzn-container-active"),this.active_field=!0,this.search_field.val(this.search_field.val()),this.search_field.focus()},i.prototype.test_active_click=function(t){return e(t.target).parents("#"+this.container_id).length?this.active_field=!0:this.close_field()},i.prototype.results_build=function(){var e,t,n,i,s;this.parsing=!0,this.results_data=r.SelectParser.select_to_array(this.form_field),this.is_multiple&&this.choices>0?(this.search_choices.find("li.search-choice").remove(),this.choices=0):this.is_multiple||(this.selected_item.addClass("chzn-default").find("span").text(this.default_text),this.disable_search||this.form_field.options.length<=this.disable_search_threshold?this.container.addClass("chzn-container-single-nosearch"):this.container.removeClass("chzn-container-single-nosearch")),e="",s=this.results_data;for(n=0,i=s.length;n<i;n++)t=s[n],t.group?e+=this.result_add_group(t):t.empty||(e+=this.result_add_option(t),t.selected&&this.is_multiple?this.choice_build(t):t.selected&&!this.is_multiple&&(this.selected_item.removeClass("chzn-default").find("span").text(t.text),this.allow_single_deselect&&this.single_deselect_control_build()));return this.search_field_disabled(),this.show_search_field_default(),this.search_field_scale(),this.search_results.html(e),this.parsing=!1},i.prototype.result_add_group=function(t){return t.disabled?"":(t.dom_id=this.container_id+"_g_"+t.array_index,'<li id="'+t.dom_id+'" class="group-result">'+e("<div />").text(t.label).html()+"</li>")},i.prototype.result_do_highlight=function(e){var t,n,r,i,s;if(e.length){this.result_clear_highlight(),this.result_highlight=e,this.result_highlight.addClass("highlighted"),r=parseInt(this.search_results.css("maxHeight"),10),s=this.search_results.scrollTop(),i=r+s,n=this.result_highlight.position().top+this.search_results.scrollTop(),t=n+this.result_highlight.outerHeight();if(t>=i)return this.search_results.scrollTop(t-r>0?t-r:0);if(n<s)return this.search_results.scrollTop(n)}},i.prototype.result_clear_highlight=function(){return this.result_highlight&&this.result_highlight.removeClass("highlighted"),this.result_highlight=null},i.prototype.results_show=function(){var e;if(!this.is_multiple)this.selected_item.addClass("chzn-single-with-drop"),this.result_single_selected&&this.result_do_highlight(this.result_single_selected);else if(this.max_selected_options<=this.choices)return this.form_field_jq.trigger("liszt:maxselected",{chosen:this}),!1;return e=this.is_multiple?this.container.height():this.container.height()-1,this.form_field_jq.trigger("liszt:showing_dropdown",{chosen:this}),this.dropdown.css({top:e+"px",left:0}),this.results_showing=!0,this.search_field.focus(),this.search_field.val(this.search_field.val()),this.winnow_results()},i.prototype.results_hide=function(){return this.is_multiple||this.selected_item.removeClass("chzn-single-with-drop"),this.result_clear_highlight(),this.form_field_jq.trigger("liszt:hiding_dropdown",{chosen:this}),this.dropdown.css({left:"-9000px"}),this.results_showing=!1},i.prototype.set_tab_index=function(e){var t;if(this.form_field_jq.attr("tabindex"))return t=this.form_field_jq.attr("tabindex"),this.form_field_jq.attr("tabindex",-1),this.search_field.attr("tabindex",t)},i.prototype.show_search_field_default=function(){return this.is_multiple&&this.choices<1&&!this.active_field?(this.search_field.val(this.default_text),this.search_field.addClass("default")):(this.search_field.val(""),this.search_field.removeClass("default"))},i.prototype.search_results_mouseup=function(t){var n;n=e(t.target).hasClass("active-result")?e(t.target):e(t.target).parents(".active-result").first();if(n.length)return this.result_highlight=n,this.result_select(t),this.search_field.focus()},i.prototype.search_results_mouseover=function(t){var n;n=e(t.target).hasClass("active-result")?e(t.target):e(t.target).parents(".active-result").first();if(n)return this.result_do_highlight(n)},i.prototype.search_results_mouseout=function(t){if(e(t.target).hasClass("active-result"))return this.result_clear_highlight()},i.prototype.choices_click=function(t){t.preventDefault();if(this.active_field&&!e(t.target).hasClass("search-choice")&&!this.results_showing)return this.results_show()},i.prototype.choice_build=function(t){var n,r,i,s=this;return this.is_multiple&&this.max_selected_options<=this.choices?(this.form_field_jq.trigger("liszt:maxselected",{chosen:this}),!1):(n=this.container_id+"_c_"+t.array_index,this.choices+=1,t.disabled?r='<li class="search-choice search-choice-disabled" id="'+n+'"><span>'+t.html+"</span></li>":r='<li class="search-choice" id="'+n+'"><span>'+t.html+'</span><a href="javascript:void(0)" class="search-choice-close" rel="'+t.array_index+'"></a></li>',this.search_container.before(r),i=e("#"+n).find("a").first(),i.click(function(e){return s.choice_destroy_link_click(e)}))},i.prototype.choice_destroy_link_click=function(t){return t.preventDefault(),this.is_disabled?t.stopPropagation:(this.pending_destroy_click=!0,this.choice_destroy(e(t.target)))},i.prototype.choice_destroy=function(e){if(this.result_deselect(e.attr("rel")))return this.choices-=1,this.show_search_field_default(),this.is_multiple&&this.choices>0&&this.search_field.val().length<1&&this.results_hide(),e.parents("li").first().remove(),this.search_field_scale()},i.prototype.results_reset=function(){this.form_field.options[0].selected=!0,this.selected_item.find("span").text(this.default_text),this.is_multiple||this.selected_item.addClass("chzn-default"),this.show_search_field_default(),this.results_reset_cleanup(),this.form_field_jq.trigger("change");if(this.active_field)return this.results_hide()},i.prototype.results_reset_cleanup=function(){return this.current_value=this.form_field_jq.val(),this.selected_item.find("abbr").remove()},i.prototype.result_select=function(e){var t,n,r,i;if(this.result_highlight)return t=this.result_highlight,n=t.attr("id"),this.result_clear_highlight(),this.is_multiple?this.result_deactivate(t):(this.search_results.find(".result-selected").removeClass("result-selected"),this.result_single_selected=t,this.selected_item.removeClass("chzn-default")),t.addClass("result-selected"),i=n.substr(n.lastIndexOf("_")+1),r=this.results_data[i],r.selected=!0,this.form_field.options[r.options_index].selected=!0,this.is_multiple?this.choice_build(r):(this.selected_item.find("span").first().text(r.text),this.allow_single_deselect&&this.single_deselect_control_build()),(!e.metaKey&&!e.ctrlKey||!this.is_multiple)&&this.results_hide(),this.search_field.val(""),(this.is_multiple||this.form_field_jq.val()!==this.current_value)&&this.form_field_jq.trigger("change",{selected:this.form_field.options[r.options_index].value}),this.current_value=this.form_field_jq.val(),this.search_field_scale()},i.prototype.result_activate=function(e){return e.addClass("active-result")},i.prototype.result_deactivate=function(e){return e.removeClass("active-result")},i.prototype.result_deselect=function(t){var n,r;return r=this.results_data[t],this.form_field.options[r.options_index].disabled?!1:(r.selected=!1,this.form_field.options[r.options_index].selected=!1,n=e("#"+this.container_id+"_o_"+t),n.removeClass("result-selected").addClass("active-result").show(),this.result_clear_highlight(),this.winnow_results(),this.form_field_jq.trigger("change",{deselected:this.form_field.options[r.options_index].value}),this.search_field_scale(),!0)},i.prototype.single_deselect_control_build=function(){if(this.allow_single_deselect&&this.selected_item.find("abbr").length<1)return this.selected_item.find("span").first().after('<abbr class="search-choice-close"></abbr>')},i.prototype.winnow_results=function(){var t,n,r,i,s,o,u,a,f,l,c,h,p,d,v,m,g,y;this.no_results_clear(),f=0,l=this.search_field.val()===this.default_text?"":e("<div/>").text(e.trim(this.search_field.val())).html(),o=this.search_contains?"":"^",s=new RegExp(o+l.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),p=new RegExp(l.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),y=this.results_data;for(d=0,m=y.length;d<m;d++){n=y[d];if(!n.disabled&&!n.empty)if(n.group)e("#"+n.dom_id).css("display","none");else if(!this.is_multiple||!n.selected){t=!1,a=n.dom_id,u=e("#"+a);if(s.test(n.html))t=!0,f+=1;else if(this.enable_split_word_search&&(n.html.indexOf(" ")>=0||n.html.indexOf("[")===0)){i=n.html.replace(/\[|\]/g,"").split(" ");if(i.length)for(v=0,g=i.length;v<g;v++)r=i[v],s.test(r)&&(t=!0,f+=1)}t?(l.length?(c=n.html.search(p),h=n.html.substr(0,c+l.length)+"</em>"+n.html.substr(c+l.length),h=h.substr(0,c)+"<em>"+h.substr(c)):h=n.html,u.html(h),this.result_activate(u),n.group_array_index!=null&&e("#"+this.results_data[n.group_array_index].dom_id).css("display","list-item")):(this.result_highlight&&a===this.result_highlight.attr("id")&&this.result_clear_highlight(),this.result_deactivate(u))}}return f<1&&l.length?this.no_results(l):this.winnow_results_set_highlight()},i.prototype.winnow_results_clear=function(){var t,n,r,i,s;this.search_field.val(""),n=this.search_results.find("li"),s=[];for(r=0,i=n.length;r<i;r++)t=n[r],t=e(t),t.hasClass("group-result")?s.push(t.css("display","auto")):!this.is_multiple||!t.hasClass("result-selected")?s.push(this.result_activate(t)):s.push(void 0);return s},i.prototype.winnow_results_set_highlight=function(){var e,t;if(!this.result_highlight){t=this.is_multiple?[]:this.search_results.find(".result-selected.active-result"),e=t.length?t.first():this.search_results.find(".active-result").first();if(e!=null)return this.result_do_highlight(e)}},i.prototype.no_results=function(t){var n;return n=e('<li class="no-results">'+this.results_none_found+' "<span></span>"</li>'),n.find("span").first().html(t),this.search_results.append(n)},i.prototype.no_results_clear=function(){return this.search_results.find(".no-results").remove()},i.prototype.keydown_arrow=function(){var t,n;this.result_highlight?this.results_showing&&(n=this.result_highlight.nextAll("li.active-result").first(),n&&this.result_do_highlight(n)):(t=this.search_results.find("li.active-result").first(),t&&this.result_do_highlight(e(t)));if(!this.results_showing)return this.results_show()},i.prototype.keyup_arrow=function(){var e;if(!this.results_showing&&!this.is_multiple)return this.results_show();if(this.result_highlight)return e=this.result_highlight.prevAll("li.active-result"),e.length?this.result_do_highlight(e.first()):(this.choices>0&&this.results_hide(),this.result_clear_highlight())},i.prototype.keydown_backstroke=function(){var e;if(this.pending_backstroke)return this.choice_destroy(this.pending_backstroke.find("a").first()),this.clear_backstroke();e=this.search_container.siblings("li.search-choice").last();if(e.length&&!e.hasClass("search-choice-disabled"))return this.pending_backstroke=e,this.single_backstroke_delete?this.keydown_backstroke():this.pending_backstroke.addClass("search-choice-focus")},i.prototype.clear_backstroke=function(){return this.pending_backstroke&&this.pending_backstroke.removeClass("search-choice-focus"),this.pending_backstroke=null},i.prototype.keydown_checker=function(e){var t,n;t=(n=e.which)!=null?n:e.keyCode,this.search_field_scale(),t!==8&&this.pending_backstroke&&this.clear_backstroke();switch(t){case 8:this.backstroke_length=this.search_field.val().length;break;case 9:this.results_showing&&!this.is_multiple&&this.result_select(e),this.mouse_on_container=!1;break;case 13:e.preventDefault();break;case 38:e.preventDefault(),this.keyup_arrow();break;case 40:this.keydown_arrow()}},i.prototype.search_field_scale=function(){var t,n,r,i,s,o,u,a,f;if(this.is_multiple){r=0,u=0,s="position:absolute; left: -1000px; top: -1000px; display:none;",o=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"];for(a=0,f=o.length;a<f;a++)i=o[a],s+=i+":"+this.search_field.css(i)+";";return n=e("<div />",{style:s}),n.text(this.search_field.val()),e("body").append(n),u=n.width()+25,n.remove(),u>this.f_width-10&&(u=this.f_width-10),this.search_field.css({width:u+"px"}),t=this.container.height(),this.dropdown.css({top:t+"px"})}},i.prototype.generate_random_id=function(){var t;t="sel"+this.generate_random_char()+this.generate_random_char()+this.generate_random_char();while(e("#"+t).length>0)t+=this.generate_random_char();return t},i}(AbstractChosen),r.Chosen=t,n=function(e){var t;return t=e.outerWidth()-e.width()},r.get_side_border_padding=n}.call(this); \ No newline at end of file
+/* Chosen v1.0.0 | (c) 2011-2013 by Harvest | MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md */
+!function(){var a,AbstractChosen,Chosen,SelectParser,b,c={}.hasOwnProperty,d=function(a,b){function d(){this.constructor=a}for(var e in b)c.call(b,e)&&(a[e]=b[e]);return d.prototype=b.prototype,a.prototype=new d,a.__super__=b.prototype,a};SelectParser=function(){function SelectParser(){this.options_index=0,this.parsed=[]}return SelectParser.prototype.add_node=function(a){return"OPTGROUP"===a.nodeName.toUpperCase()?this.add_group(a):this.add_option(a)},SelectParser.prototype.add_group=function(a){var b,c,d,e,f,g;for(b=this.parsed.length,this.parsed.push({array_index:b,group:!0,label:this.escapeExpression(a.label),children:0,disabled:a.disabled}),f=a.childNodes,g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(this.add_option(c,b,a.disabled));return g},SelectParser.prototype.add_option=function(a,b,c){return"OPTION"===a.nodeName.toUpperCase()?(""!==a.text?(null!=b&&(this.parsed[b].children+=1),this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,value:a.value,text:a.text,html:a.innerHTML,selected:a.selected,disabled:c===!0?c:a.disabled,group_array_index:b,classes:a.className,style:a.style.cssText})):this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,empty:!0}),this.options_index+=1):void 0},SelectParser.prototype.escapeExpression=function(a){var b,c;return null==a||a===!1?"":/[\&\<\>\"\'\`]/.test(a)?(b={"<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"},c=/&(?!\w+;)|[\<\>\"\'\`]/g,a.replace(c,function(a){return b[a]||"&amp;"})):a},SelectParser}(),SelectParser.select_to_array=function(a){var b,c,d,e,f;for(c=new SelectParser,f=a.childNodes,d=0,e=f.length;e>d;d++)b=f[d],c.add_node(b);return c.parsed},AbstractChosen=function(){function AbstractChosen(a,b){this.form_field=a,this.options=null!=b?b:{},AbstractChosen.browser_is_supported()&&(this.is_multiple=this.form_field.multiple,this.set_default_text(),this.set_default_values(),this.setup(),this.set_up_html(),this.register_observers())}return AbstractChosen.prototype.set_default_values=function(){var a=this;return this.click_test_action=function(b){return a.test_active_click(b)},this.activate_action=function(b){return a.activate_field(b)},this.active_field=!1,this.mouse_on_container=!1,this.results_showing=!1,this.result_highlighted=null,this.result_single_selected=null,this.allow_single_deselect=null!=this.options.allow_single_deselect&&null!=this.form_field.options[0]&&""===this.form_field.options[0].text?this.options.allow_single_deselect:!1,this.disable_search_threshold=this.options.disable_search_threshold||0,this.disable_search=this.options.disable_search||!1,this.enable_split_word_search=null!=this.options.enable_split_word_search?this.options.enable_split_word_search:!0,this.group_search=null!=this.options.group_search?this.options.group_search:!0,this.search_contains=this.options.search_contains||!1,this.single_backstroke_delete=null!=this.options.single_backstroke_delete?this.options.single_backstroke_delete:!0,this.max_selected_options=this.options.max_selected_options||1/0,this.inherit_select_classes=this.options.inherit_select_classes||!1,this.display_selected_options=null!=this.options.display_selected_options?this.options.display_selected_options:!0,this.display_disabled_options=null!=this.options.display_disabled_options?this.options.display_disabled_options:!0},AbstractChosen.prototype.set_default_text=function(){return this.default_text=this.form_field.getAttribute("data-placeholder")?this.form_field.getAttribute("data-placeholder"):this.is_multiple?this.options.placeholder_text_multiple||this.options.placeholder_text||AbstractChosen.default_multiple_text:this.options.placeholder_text_single||this.options.placeholder_text||AbstractChosen.default_single_text,this.results_none_found=this.form_field.getAttribute("data-no_results_text")||this.options.no_results_text||AbstractChosen.default_no_result_text},AbstractChosen.prototype.mouse_enter=function(){return this.mouse_on_container=!0},AbstractChosen.prototype.mouse_leave=function(){return this.mouse_on_container=!1},AbstractChosen.prototype.input_focus=function(){var a=this;if(this.is_multiple){if(!this.active_field)return setTimeout(function(){return a.container_mousedown()},50)}else if(!this.active_field)return this.activate_field()},AbstractChosen.prototype.input_blur=function(){var a=this;return this.mouse_on_container?void 0:(this.active_field=!1,setTimeout(function(){return a.blur_test()},100))},AbstractChosen.prototype.results_option_build=function(a){var b,c,d,e,f;for(b="",f=this.results_data,d=0,e=f.length;e>d;d++)c=f[d],b+=c.group?this.result_add_group(c):this.result_add_option(c),(null!=a?a.first:void 0)&&(c.selected&&this.is_multiple?this.choice_build(c):c.selected&&!this.is_multiple&&this.single_set_selected_text(c.text));return b},AbstractChosen.prototype.result_add_option=function(a){var b,c;return a.search_match?this.include_option_in_results(a)?(b=[],a.disabled||a.selected&&this.is_multiple||b.push("active-result"),!a.disabled||a.selected&&this.is_multiple||b.push("disabled-result"),a.selected&&b.push("result-selected"),null!=a.group_array_index&&b.push("group-option"),""!==a.classes&&b.push(a.classes),c=""!==a.style.cssText?' style="'+a.style+'"':"",'<li class="'+b.join(" ")+'"'+c+' data-option-array-index="'+a.array_index+'">'+a.search_text+"</li>"):"":""},AbstractChosen.prototype.result_add_group=function(a){return a.search_match||a.group_match?a.active_options>0?'<li class="group-result">'+a.search_text+"</li>":"":""},AbstractChosen.prototype.results_update_field=function(){return this.set_default_text(),this.is_multiple||this.results_reset_cleanup(),this.result_clear_highlight(),this.result_single_selected=null,this.results_build(),this.results_showing?this.winnow_results():void 0},AbstractChosen.prototype.results_toggle=function(){return this.results_showing?this.results_hide():this.results_show()},AbstractChosen.prototype.results_search=function(){return this.results_showing?this.winnow_results():this.results_show()},AbstractChosen.prototype.winnow_results=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m;for(this.no_results_clear(),e=0,g=this.get_search_text(),a=g.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),d=this.search_contains?"":"^",c=new RegExp(d+a,"i"),j=new RegExp(a,"i"),m=this.results_data,k=0,l=m.length;l>k;k++)b=m[k],b.search_match=!1,f=null,this.include_option_in_results(b)&&(b.group&&(b.group_match=!1,b.active_options=0),null!=b.group_array_index&&this.results_data[b.group_array_index]&&(f=this.results_data[b.group_array_index],0===f.active_options&&f.search_match&&(e+=1),f.active_options+=1),(!b.group||this.group_search)&&(b.search_text=b.group?b.label:b.html,b.search_match=this.search_string_match(b.search_text,c),b.search_match&&!b.group&&(e+=1),b.search_match?(g.length&&(h=b.search_text.search(j),i=b.search_text.substr(0,h+g.length)+"</em>"+b.search_text.substr(h+g.length),b.search_text=i.substr(0,h)+"<em>"+i.substr(h)),null!=f&&(f.group_match=!0)):null!=b.group_array_index&&this.results_data[b.group_array_index].search_match&&(b.search_match=!0)));return this.result_clear_highlight(),1>e&&g.length?(this.update_results_content(""),this.no_results(g)):(this.update_results_content(this.results_option_build()),this.winnow_results_set_highlight())},AbstractChosen.prototype.search_string_match=function(a,b){var c,d,e,f;if(b.test(a))return!0;if(this.enable_split_word_search&&(a.indexOf(" ")>=0||0===a.indexOf("["))&&(d=a.replace(/\[|\]/g,"").split(" "),d.length))for(e=0,f=d.length;f>e;e++)if(c=d[e],b.test(c))return!0},AbstractChosen.prototype.choices_count=function(){var a,b,c,d;if(null!=this.selected_option_count)return this.selected_option_count;for(this.selected_option_count=0,d=this.form_field.options,b=0,c=d.length;c>b;b++)a=d[b],a.selected&&(this.selected_option_count+=1);return this.selected_option_count},AbstractChosen.prototype.choices_click=function(a){return a.preventDefault(),this.results_showing||this.is_disabled?void 0:this.results_show()},AbstractChosen.prototype.keyup_checker=function(a){var b,c;switch(b=null!=(c=a.which)?c:a.keyCode,this.search_field_scale(),b){case 8:if(this.is_multiple&&this.backstroke_length<1&&this.choices_count()>0)return this.keydown_backstroke();if(!this.pending_backstroke)return this.result_clear_highlight(),this.results_search();break;case 13:if(a.preventDefault(),this.results_showing)return this.result_select(a);break;case 27:return this.results_showing&&this.results_hide(),!0;case 9:case 38:case 40:case 16:case 91:case 17:break;default:return this.results_search()}},AbstractChosen.prototype.container_width=function(){return null!=this.options.width?this.options.width:""+this.form_field.offsetWidth+"px"},AbstractChosen.prototype.include_option_in_results=function(a){return this.is_multiple&&!this.display_selected_options&&a.selected?!1:!this.display_disabled_options&&a.disabled?!1:a.empty?!1:!0},AbstractChosen.browser_is_supported=function(){return"Microsoft Internet Explorer"===window.navigator.appName?document.documentMode>=8:/iP(od|hone)/i.test(window.navigator.userAgent)?!1:/Android/i.test(window.navigator.userAgent)&&/Mobile/i.test(window.navigator.userAgent)?!1:!0},AbstractChosen.default_multiple_text="Select Some Options",AbstractChosen.default_single_text="Select an Option",AbstractChosen.default_no_result_text="No results match",AbstractChosen}(),a=jQuery,a.fn.extend({chosen:function(b){return AbstractChosen.browser_is_supported()?this.each(function(){var c,d;c=a(this),d=c.data("chosen"),"destroy"===b&&d?d.destroy():d||c.data("chosen",new Chosen(this,b))}):this}}),Chosen=function(c){function Chosen(){return b=Chosen.__super__.constructor.apply(this,arguments)}return d(Chosen,c),Chosen.prototype.setup=function(){return this.form_field_jq=a(this.form_field),this.current_selectedIndex=this.form_field.selectedIndex,this.is_rtl=this.form_field_jq.hasClass("chosen-rtl")},Chosen.prototype.set_up_html=function(){var b,c;return b=["chosen-container"],b.push("chosen-container-"+(this.is_multiple?"multi":"single")),this.inherit_select_classes&&this.form_field.className&&b.push(this.form_field.className),this.is_rtl&&b.push("chosen-rtl"),c={"class":b.join(" "),style:"width: "+this.container_width()+";",title:this.form_field.title},this.form_field.id.length&&(c.id=this.form_field.id.replace(/[^\w]/g,"_")+"_chosen"),this.container=a("<div />",c),this.is_multiple?this.container.html('<ul class="chosen-choices"><li class="search-field"><input type="text" value="'+this.default_text+'" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chosen-drop"><ul class="chosen-results"></ul></div>'):this.container.html('<a class="chosen-single chosen-default" tabindex="-1"><span>'+this.default_text+'</span><div><b></b></div></a><div class="chosen-drop"><div class="chosen-search"><input type="text" autocomplete="off" /></div><ul class="chosen-results"></ul></div>'),this.form_field_jq.hide().after(this.container),this.dropdown=this.container.find("div.chosen-drop").first(),this.search_field=this.container.find("input").first(),this.search_results=this.container.find("ul.chosen-results").first(),this.search_field_scale(),this.search_no_results=this.container.find("li.no-results").first(),this.is_multiple?(this.search_choices=this.container.find("ul.chosen-choices").first(),this.search_container=this.container.find("li.search-field").first()):(this.search_container=this.container.find("div.chosen-search").first(),this.selected_item=this.container.find(".chosen-single").first()),this.results_build(),this.set_tab_index(),this.set_label_behavior(),this.form_field_jq.trigger("chosen:ready",{chosen:this})},Chosen.prototype.register_observers=function(){var a=this;return this.container.bind("mousedown.chosen",function(b){a.container_mousedown(b)}),this.container.bind("mouseup.chosen",function(b){a.container_mouseup(b)}),this.container.bind("mouseenter.chosen",function(b){a.mouse_enter(b)}),this.container.bind("mouseleave.chosen",function(b){a.mouse_leave(b)}),this.search_results.bind("mouseup.chosen",function(b){a.search_results_mouseup(b)}),this.search_results.bind("mouseover.chosen",function(b){a.search_results_mouseover(b)}),this.search_results.bind("mouseout.chosen",function(b){a.search_results_mouseout(b)}),this.search_results.bind("mousewheel.chosen DOMMouseScroll.chosen",function(b){a.search_results_mousewheel(b)}),this.form_field_jq.bind("chosen:updated.chosen",function(b){a.results_update_field(b)}),this.form_field_jq.bind("chosen:activate.chosen",function(b){a.activate_field(b)}),this.form_field_jq.bind("chosen:open.chosen",function(b){a.container_mousedown(b)}),this.search_field.bind("blur.chosen",function(b){a.input_blur(b)}),this.search_field.bind("keyup.chosen",function(b){a.keyup_checker(b)}),this.search_field.bind("keydown.chosen",function(b){a.keydown_checker(b)}),this.search_field.bind("focus.chosen",function(b){a.input_focus(b)}),this.is_multiple?this.search_choices.bind("click.chosen",function(b){a.choices_click(b)}):this.container.bind("click.chosen",function(a){a.preventDefault()})},Chosen.prototype.destroy=function(){return a(document).unbind("click.chosen",this.click_test_action),this.search_field[0].tabIndex&&(this.form_field_jq[0].tabIndex=this.search_field[0].tabIndex),this.container.remove(),this.form_field_jq.removeData("chosen"),this.form_field_jq.show()},Chosen.prototype.search_field_disabled=function(){return this.is_disabled=this.form_field_jq[0].disabled,this.is_disabled?(this.container.addClass("chosen-disabled"),this.search_field[0].disabled=!0,this.is_multiple||this.selected_item.unbind("focus.chosen",this.activate_action),this.close_field()):(this.container.removeClass("chosen-disabled"),this.search_field[0].disabled=!1,this.is_multiple?void 0:this.selected_item.bind("focus.chosen",this.activate_action))},Chosen.prototype.container_mousedown=function(b){return this.is_disabled||(b&&"mousedown"===b.type&&!this.results_showing&&b.preventDefault(),null!=b&&a(b.target).hasClass("search-choice-close"))?void 0:(this.active_field?this.is_multiple||!b||a(b.target)[0]!==this.selected_item[0]&&!a(b.target).parents("a.chosen-single").length||(b.preventDefault(),this.results_toggle()):(this.is_multiple&&this.search_field.val(""),a(document).bind("click.chosen",this.click_test_action),this.results_show()),this.activate_field())},Chosen.prototype.container_mouseup=function(a){return"ABBR"!==a.target.nodeName||this.is_disabled?void 0:this.results_reset(a)},Chosen.prototype.search_results_mousewheel=function(a){var b,c,d;return b=-(null!=(c=a.originalEvent)?c.wheelDelta:void 0)||(null!=(d=a.originialEvent)?d.detail:void 0),null!=b?(a.preventDefault(),"DOMMouseScroll"===a.type&&(b=40*b),this.search_results.scrollTop(b+this.search_results.scrollTop())):void 0},Chosen.prototype.blur_test=function(){return!this.active_field&&this.container.hasClass("chosen-container-active")?this.close_field():void 0},Chosen.prototype.close_field=function(){return a(document).unbind("click.chosen",this.click_test_action),this.active_field=!1,this.results_hide(),this.container.removeClass("chosen-container-active"),this.clear_backstroke(),this.show_search_field_default(),this.search_field_scale()},Chosen.prototype.activate_field=function(){return this.container.addClass("chosen-container-active"),this.active_field=!0,this.search_field.val(this.search_field.val()),this.search_field.focus()},Chosen.prototype.test_active_click=function(b){return this.container.is(a(b.target).closest(".chosen-container"))?this.active_field=!0:this.close_field()},Chosen.prototype.results_build=function(){return this.parsing=!0,this.selected_option_count=null,this.results_data=SelectParser.select_to_array(this.form_field),this.is_multiple?this.search_choices.find("li.search-choice").remove():this.is_multiple||(this.single_set_selected_text(),this.disable_search||this.form_field.options.length<=this.disable_search_threshold?(this.search_field[0].readOnly=!0,this.container.addClass("chosen-container-single-nosearch")):(this.search_field[0].readOnly=!1,this.container.removeClass("chosen-container-single-nosearch"))),this.update_results_content(this.results_option_build({first:!0})),this.search_field_disabled(),this.show_search_field_default(),this.search_field_scale(),this.parsing=!1},Chosen.prototype.result_do_highlight=function(a){var b,c,d,e,f;if(a.length){if(this.result_clear_highlight(),this.result_highlight=a,this.result_highlight.addClass("highlighted"),d=parseInt(this.search_results.css("maxHeight"),10),f=this.search_results.scrollTop(),e=d+f,c=this.result_highlight.position().top+this.search_results.scrollTop(),b=c+this.result_highlight.outerHeight(),b>=e)return this.search_results.scrollTop(b-d>0?b-d:0);if(f>c)return this.search_results.scrollTop(c)}},Chosen.prototype.result_clear_highlight=function(){return this.result_highlight&&this.result_highlight.removeClass("highlighted"),this.result_highlight=null},Chosen.prototype.results_show=function(){return this.is_multiple&&this.max_selected_options<=this.choices_count()?(this.form_field_jq.trigger("chosen:maxselected",{chosen:this}),!1):(this.container.addClass("chosen-with-drop"),this.form_field_jq.trigger("chosen:showing_dropdown",{chosen:this}),this.results_showing=!0,this.search_field.focus(),this.search_field.val(this.search_field.val()),this.winnow_results())},Chosen.prototype.update_results_content=function(a){return this.search_results.html(a)},Chosen.prototype.results_hide=function(){return this.results_showing&&(this.result_clear_highlight(),this.container.removeClass("chosen-with-drop"),this.form_field_jq.trigger("chosen:hiding_dropdown",{chosen:this})),this.results_showing=!1},Chosen.prototype.set_tab_index=function(){var a;return this.form_field.tabIndex?(a=this.form_field.tabIndex,this.form_field.tabIndex=-1,this.search_field[0].tabIndex=a):void 0},Chosen.prototype.set_label_behavior=function(){var b=this;return this.form_field_label=this.form_field_jq.parents("label"),!this.form_field_label.length&&this.form_field.id.length&&(this.form_field_label=a("label[for='"+this.form_field.id+"']")),this.form_field_label.length>0?this.form_field_label.bind("click.chosen",function(a){return b.is_multiple?b.container_mousedown(a):b.activate_field()}):void 0},Chosen.prototype.show_search_field_default=function(){return this.is_multiple&&this.choices_count()<1&&!this.active_field?(this.search_field.val(this.default_text),this.search_field.addClass("default")):(this.search_field.val(""),this.search_field.removeClass("default"))},Chosen.prototype.search_results_mouseup=function(b){var c;return c=a(b.target).hasClass("active-result")?a(b.target):a(b.target).parents(".active-result").first(),c.length?(this.result_highlight=c,this.result_select(b),this.search_field.focus()):void 0},Chosen.prototype.search_results_mouseover=function(b){var c;return c=a(b.target).hasClass("active-result")?a(b.target):a(b.target).parents(".active-result").first(),c?this.result_do_highlight(c):void 0},Chosen.prototype.search_results_mouseout=function(b){return a(b.target).hasClass("active-result")?this.result_clear_highlight():void 0},Chosen.prototype.choice_build=function(b){var c,d,e=this;return c=a("<li />",{"class":"search-choice"}).html("<span>"+b.html+"</span>"),b.disabled?c.addClass("search-choice-disabled"):(d=a("<a />",{"class":"search-choice-close","data-option-array-index":b.array_index}),d.bind("click.chosen",function(a){return e.choice_destroy_link_click(a)}),c.append(d)),this.search_container.before(c)},Chosen.prototype.choice_destroy_link_click=function(b){return b.preventDefault(),b.stopPropagation(),this.is_disabled?void 0:this.choice_destroy(a(b.target))},Chosen.prototype.choice_destroy=function(a){return this.result_deselect(a[0].getAttribute("data-option-array-index"))?(this.show_search_field_default(),this.is_multiple&&this.choices_count()>0&&this.search_field.val().length<1&&this.results_hide(),a.parents("li").first().remove(),this.search_field_scale()):void 0},Chosen.prototype.results_reset=function(){return this.form_field.options[0].selected=!0,this.selected_option_count=null,this.single_set_selected_text(),this.show_search_field_default(),this.results_reset_cleanup(),this.form_field_jq.trigger("change"),this.active_field?this.results_hide():void 0},Chosen.prototype.results_reset_cleanup=function(){return this.current_selectedIndex=this.form_field.selectedIndex,this.selected_item.find("abbr").remove()},Chosen.prototype.result_select=function(a){var b,c,d;return this.result_highlight?(b=this.result_highlight,this.result_clear_highlight(),this.is_multiple&&this.max_selected_options<=this.choices_count()?(this.form_field_jq.trigger("chosen:maxselected",{chosen:this}),!1):(this.is_multiple?b.removeClass("active-result"):(this.result_single_selected&&(this.result_single_selected.removeClass("result-selected"),d=this.result_single_selected[0].getAttribute("data-option-array-index"),this.results_data[d].selected=!1),this.result_single_selected=b),b.addClass("result-selected"),c=this.results_data[b[0].getAttribute("data-option-array-index")],c.selected=!0,this.form_field.options[c.options_index].selected=!0,this.selected_option_count=null,this.is_multiple?this.choice_build(c):this.single_set_selected_text(c.text),(a.metaKey||a.ctrlKey)&&this.is_multiple||this.results_hide(),this.search_field.val(""),(this.is_multiple||this.form_field.selectedIndex!==this.current_selectedIndex)&&this.form_field_jq.trigger("change",{selected:this.form_field.options[c.options_index].value}),this.current_selectedIndex=this.form_field.selectedIndex,this.search_field_scale())):void 0},Chosen.prototype.single_set_selected_text=function(a){return null==a&&(a=this.default_text),a===this.default_text?this.selected_item.addClass("chosen-default"):(this.single_deselect_control_build(),this.selected_item.removeClass("chosen-default")),this.selected_item.find("span").text(a)},Chosen.prototype.result_deselect=function(a){var b;return b=this.results_data[a],this.form_field.options[b.options_index].disabled?!1:(b.selected=!1,this.form_field.options[b.options_index].selected=!1,this.selected_option_count=null,this.result_clear_highlight(),this.results_showing&&this.winnow_results(),this.form_field_jq.trigger("change",{deselected:this.form_field.options[b.options_index].value}),this.search_field_scale(),!0)},Chosen.prototype.single_deselect_control_build=function(){return this.allow_single_deselect?(this.selected_item.find("abbr").length||this.selected_item.find("span").first().after('<abbr class="search-choice-close"></abbr>'),this.selected_item.addClass("chosen-single-with-deselect")):void 0},Chosen.prototype.get_search_text=function(){return this.search_field.val()===this.default_text?"":a("<div/>").text(a.trim(this.search_field.val())).html()},Chosen.prototype.winnow_results_set_highlight=function(){var a,b;return b=this.is_multiple?[]:this.search_results.find(".result-selected.active-result"),a=b.length?b.first():this.search_results.find(".active-result").first(),null!=a?this.result_do_highlight(a):void 0},Chosen.prototype.no_results=function(b){var c;return c=a('<li class="no-results">'+this.results_none_found+' "<span></span>"</li>'),c.find("span").first().html(b),this.search_results.append(c)},Chosen.prototype.no_results_clear=function(){return this.search_results.find(".no-results").remove()},Chosen.prototype.keydown_arrow=function(){var a;return this.results_showing&&this.result_highlight?(a=this.result_highlight.nextAll("li.active-result").first())?this.result_do_highlight(a):void 0:this.results_show()},Chosen.prototype.keyup_arrow=function(){var a;return this.results_showing||this.is_multiple?this.result_highlight?(a=this.result_highlight.prevAll("li.active-result"),a.length?this.result_do_highlight(a.first()):(this.choices_count()>0&&this.results_hide(),this.result_clear_highlight())):void 0:this.results_show()},Chosen.prototype.keydown_backstroke=function(){var a;return this.pending_backstroke?(this.choice_destroy(this.pending_backstroke.find("a").first()),this.clear_backstroke()):(a=this.search_container.siblings("li.search-choice").last(),a.length&&!a.hasClass("search-choice-disabled")?(this.pending_backstroke=a,this.single_backstroke_delete?this.keydown_backstroke():this.pending_backstroke.addClass("search-choice-focus")):void 0)},Chosen.prototype.clear_backstroke=function(){return this.pending_backstroke&&this.pending_backstroke.removeClass("search-choice-focus"),this.pending_backstroke=null},Chosen.prototype.keydown_checker=function(a){var b,c;switch(b=null!=(c=a.which)?c:a.keyCode,this.search_field_scale(),8!==b&&this.pending_backstroke&&this.clear_backstroke(),b){case 8:this.backstroke_length=this.search_field.val().length;break;case 9:this.results_showing&&!this.is_multiple&&this.result_select(a),this.mouse_on_container=!1;break;case 13:a.preventDefault();break;case 38:a.preventDefault(),this.keyup_arrow();break;case 40:a.preventDefault(),this.keydown_arrow()}},Chosen.prototype.search_field_scale=function(){var b,c,d,e,f,g,h,i,j;if(this.is_multiple){for(d=0,h=0,f="position:absolute; left: -1000px; top: -1000px; display:none;",g=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"],i=0,j=g.length;j>i;i++)e=g[i],f+=e+":"+this.search_field.css(e)+";";return b=a("<div />",{style:f}),b.text(this.search_field.val()),a("body").append(b),h=b.width()+25,b.remove(),c=this.container.outerWidth(),h>c-10&&(h=c-10),this.search_field.css({width:h+"px"})}},Chosen}(AbstractChosen)}.call(this); \ No newline at end of file
diff --git a/themes/default/js/plugins/datatables/css/demo_page.css b/themes/default/js/plugins/datatables/css/demo_page.css
new file mode 100644
index 000000000..ba5b2a6c3
--- /dev/null
+++ b/themes/default/js/plugins/datatables/css/demo_page.css
@@ -0,0 +1,122 @@
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * General page setup
+ */
+#dt_example {
+ font: 80%/1.45em "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
+ margin: 0;
+ padding: 0;
+ color: #333;
+ background-color: #fff;
+}
+
+
+#dt_example #container {
+ width: 800px;
+ margin: 30px auto;
+ padding: 0;
+}
+
+
+#dt_example #footer {
+ margin: 50px auto 0 auto;
+ padding: 0;
+}
+
+#dt_example #demo {
+ margin: 30px auto 0 auto;
+}
+
+#dt_example .demo_jui {
+ margin: 30px auto 0 auto;
+}
+
+#dt_example .big {
+ font-size: 1.3em;
+ font-weight: bold;
+ line-height: 1.6em;
+ color: #4E6CA3;
+}
+
+#dt_example .spacer {
+ height: 20px;
+ clear: both;
+}
+
+#dt_example .clear {
+ clear: both;
+}
+
+#dt_example pre {
+ padding: 15px;
+ background-color: #F5F5F5;
+ border: 1px solid #CCCCCC;
+}
+
+#dt_example h1 {
+ margin-top: 2em;
+ font-size: 1.3em;
+ font-weight: normal;
+ line-height: 1.6em;
+ color: #4E6CA3;
+ border-bottom: 1px solid #B0BED9;
+ clear: both;
+}
+
+#dt_example h2 {
+ font-size: 1.2em;
+ font-weight: normal;
+ line-height: 1.6em;
+ color: #4E6CA3;
+ clear: both;
+}
+
+#dt_example a {
+ color: #0063DC;
+ text-decoration: none;
+}
+
+#dt_example a:hover {
+ text-decoration: underline;
+}
+
+#dt_example ul {
+ color: #4E6CA3;
+}
+
+.css_right {
+ float: right;
+}
+
+.css_left {
+ float: left;
+}
+
+.demo_links {
+ float: left;
+ width: 50%;
+ margin-bottom: 1em;
+}
+
+#demo_info {
+ padding: 5px;
+ border: 1px solid #B0BED9;
+ height: 100px;
+ width: 100%;
+ overflow: auto;
+}
+
+#dt_example code {
+ font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
+ padding: 2px 4px !important;
+ white-space: nowrap;
+ font-size: 0.9em;
+
+ color: #D14;
+ background-color: #F7F7F9;
+
+ border: 1px solid #E1E1E8;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+}
diff --git a/themes/default/js/plugins/datatables/css/demo_table.css b/themes/default/js/plugins/datatables/css/demo_table.css
new file mode 100644
index 000000000..12f352dac
--- /dev/null
+++ b/themes/default/js/plugins/datatables/css/demo_table.css
@@ -0,0 +1,577 @@
+/*
+ * File: demo_table.css
+ * CVS: $Id$
+ * Description: CSS descriptions for DataTables demo pages
+ * Author: Allan Jardine
+ * Created: Tue May 12 06:47:22 BST 2009
+ * Modified: $Date$ by $Author$
+ * Language: CSS
+ * Project: DataTables
+ *
+ * Copyright 2009 Allan Jardine. All Rights Reserved.
+ *
+ * ***************************************************************************
+ * DESCRIPTION
+ *
+ * The styles given here are suitable for the demos that are used with the standard DataTables
+ * distribution (see www.datatables.net). You will most likely wish to modify these styles to
+ * meet the layout requirements of your site.
+ *
+ * Common issues:
+ * 'full_numbers' pagination - I use an extra selector on the body tag to ensure that there is
+ * no conflict between the two pagination types. If you want to use full_numbers pagination
+ * ensure that you either have "example_alt_pagination" as a body class name, or better yet,
+ * modify that selector.
+ * Note that the path used for Images is relative. All images are by default located in
+ * ../images/ - relative to this CSS file.
+ */
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * DataTables features
+ */
+
+.dataTables_wrapper {
+ position: relative;
+ clear: both;
+ zoom: 1; /* Feeling sorry for IE */
+}
+
+.dataTables_processing {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ width: 250px;
+ height: 30px;
+ margin-left: -125px;
+ margin-top: -15px;
+ padding: 14px 0 2px 0;
+ border: 1px solid #ddd;
+ text-align: center;
+ color: #999;
+ font-size: 14px;
+ background-color: white;
+}
+
+.dataTables_length {
+ width: 40%;
+ float: left;
+}
+
+.dataTables_filter {
+ width: 50%;
+ float: right;
+ text-align: right;
+}
+
+.dataTables_info {
+ width: 60%;
+ float: left;
+}
+
+.dataTables_paginate {
+ float: right;
+ text-align: right;
+}
+
+/* Pagination nested */
+.paginate_disabled_previous, .paginate_enabled_previous,
+.paginate_disabled_next, .paginate_enabled_next {
+ height: 19px;
+ float: left;
+ cursor: pointer;
+ *cursor: hand;
+ color: #111 !important;
+}
+.paginate_disabled_previous:hover, .paginate_enabled_previous:hover,
+.paginate_disabled_next:hover, .paginate_enabled_next:hover {
+ text-decoration: none !important;
+}
+.paginate_disabled_previous:active, .paginate_enabled_previous:active,
+.paginate_disabled_next:active, .paginate_enabled_next:active {
+ outline: none;
+}
+
+.paginate_disabled_previous,
+.paginate_disabled_next {
+ color: #666 !important;
+}
+.paginate_disabled_previous, .paginate_enabled_previous {
+ padding-left: 23px;
+}
+.paginate_disabled_next, .paginate_enabled_next {
+ padding-right: 23px;
+ margin-left: 10px;
+}
+
+.paginate_disabled_previous {
+ background: url('../images/back_disabled.png') no-repeat top left;
+}
+
+.paginate_enabled_previous {
+ background: url('../images/back_enabled.png') no-repeat top left;
+}
+.paginate_enabled_previous:hover {
+ background: url('../images/back_enabled_hover.png') no-repeat top left;
+}
+
+.paginate_disabled_next {
+ background: url('../images/forward_disabled.png') no-repeat top right;
+}
+
+.paginate_enabled_next {
+ background: url('../images/forward_enabled.png') no-repeat top right;
+}
+.paginate_enabled_next:hover {
+ background: url('../images/forward_enabled_hover.png') no-repeat top right;
+}
+
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * DataTables display
+ */
+table.display {
+ margin: 0 auto;
+ clear: both;
+ width: 100%;
+
+ /* Note Firefox 3.5 and before have a bug with border-collapse
+ * ( https://bugzilla.mozilla.org/show%5Fbug.cgi?id=155955 )
+ * border-spacing: 0; is one possible option. Conditional-css.com is
+ * useful for this kind of thing
+ *
+ * Further note IE 6/7 has problems when calculating widths with border width.
+ * It subtracts one px relative to the other browsers from the first column, and
+ * adds one to the end...
+ *
+ * If you want that effect I'd suggest setting a border-top/left on th/td's and
+ * then filling in the gaps with other borders.
+ */
+}
+
+table.display thead th {
+ padding: 3px 18px 3px 10px;
+ border-bottom: 1px solid black;
+ font-weight: bold;
+ cursor: pointer;
+ * cursor: hand;
+}
+
+table.display tfoot th {
+ padding: 3px 18px 3px 10px;
+ border-top: 1px solid black;
+ font-weight: bold;
+}
+
+table.display tr.heading2 td {
+ border-bottom: 1px solid #aaa;
+}
+
+table.display td {
+ padding: 3px 10px;
+}
+
+table.display td.center {
+ text-align: center;
+}
+
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * DataTables sorting
+ */
+
+.sorting_asc {
+ background: url('../images/sort_asc.png') no-repeat center right;
+}
+
+.sorting_desc {
+ background: url('../images/sort_desc.png') no-repeat center right;
+}
+
+.sorting {
+ background: url('../images/sort_both.png') no-repeat center right;
+}
+
+.sorting_asc_disabled {
+ background: url('../images/sort_asc_disabled.png') no-repeat center right;
+}
+
+.sorting_desc_disabled {
+ background: url('../images/sort_desc_disabled.png') no-repeat center right;
+}
+
+table.display thead th:active,
+table.display thead td:active {
+ outline: none;
+}
+
+
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * DataTables row classes
+ */
+table.display tr.odd.gradeA {
+ background-color: #ddffdd;
+}
+
+table.display tr.even.gradeA {
+ background-color: #eeffee;
+}
+
+table.display tr.odd.gradeC {
+ background-color: #ddddff;
+}
+
+table.display tr.even.gradeC {
+ background-color: #eeeeff;
+}
+
+table.display tr.odd.gradeX {
+ background-color: #ffdddd;
+}
+
+table.display tr.even.gradeX {
+ background-color: #ffeeee;
+}
+
+table.display tr.odd.gradeU {
+ background-color: #ddd;
+}
+
+table.display tr.even.gradeU {
+ background-color: #eee;
+}
+
+
+tr.odd {
+ background-color: #E2E4FF;
+}
+
+tr.even {
+ background-color: white;
+}
+
+
+
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Misc
+ */
+.dataTables_scroll {
+ clear: both;
+}
+
+.dataTables_scrollBody {
+ *margin-top: -1px;
+ -webkit-overflow-scrolling: touch;
+}
+
+.top, .bottom {
+ padding: 15px;
+ background-color: #F5F5F5;
+ border: 1px solid #CCCCCC;
+}
+
+.top .dataTables_info {
+ float: none;
+}
+
+.clear {
+ clear: both;
+}
+
+.dataTables_empty {
+ text-align: center;
+}
+
+tfoot input {
+ margin: 0.5em 0;
+ width: 100%;
+ color: #444;
+}
+
+tfoot input.search_init {
+ color: #999;
+}
+
+td.group {
+ background-color: #d1cfd0;
+ border-bottom: 2px solid #A19B9E;
+ border-top: 2px solid #A19B9E;
+}
+
+td.details {
+ background-color: #d1cfd0;
+ border: 2px solid #A19B9E;
+}
+
+
+.example_alt_pagination div.dataTables_info {
+ width: 40%;
+}
+
+.paging_full_numbers {
+ width: 400px;
+ height: 22px;
+ line-height: 22px;
+}
+
+.paging_full_numbers a:active {
+ outline: none
+}
+
+.paging_full_numbers a:hover {
+ text-decoration: none;
+}
+
+.paging_full_numbers a.paginate_button,
+ .paging_full_numbers a.paginate_active {
+ border: 1px solid #aaa;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ padding: 2px 5px;
+ margin: 0 3px;
+ cursor: pointer;
+ *cursor: hand;
+ color: #333 !important;
+}
+
+.paging_full_numbers a.paginate_button {
+ background-color: #ddd;
+}
+
+.paging_full_numbers a.paginate_button:hover {
+ background-color: #ccc;
+ text-decoration: none !important;
+}
+
+.paging_full_numbers a.paginate_active {
+ background-color: #99B3FF;
+}
+
+table.display tr.even.row_selected td {
+ background-color: #B0BED9;
+}
+
+table.display tr.odd.row_selected td {
+ background-color: #9FAFD1;
+}
+
+
+/*
+ * Sorting classes for columns
+ */
+/* For the standard odd/even */
+tr.odd td.sorting_1 {
+ background-color: #D3D6FF;
+}
+
+tr.odd td.sorting_2 {
+ background-color: #DADCFF;
+}
+
+tr.odd td.sorting_3 {
+ background-color: #E0E2FF;
+}
+
+tr.even td.sorting_1 {
+ background-color: #EAEBFF;
+}
+
+tr.even td.sorting_2 {
+ background-color: #F2F3FF;
+}
+
+tr.even td.sorting_3 {
+ background-color: #F9F9FF;
+}
+
+
+/* For the Conditional-CSS grading rows */
+/*
+ Colour calculations (based off the main row colours)
+ Level 1:
+ dd > c4
+ ee > d5
+ Level 2:
+ dd > d1
+ ee > e2
+ */
+tr.odd.gradeA td.sorting_1 {
+ background-color: #c4ffc4;
+}
+
+tr.odd.gradeA td.sorting_2 {
+ background-color: #d1ffd1;
+}
+
+tr.odd.gradeA td.sorting_3 {
+ background-color: #d1ffd1;
+}
+
+tr.even.gradeA td.sorting_1 {
+ background-color: #d5ffd5;
+}
+
+tr.even.gradeA td.sorting_2 {
+ background-color: #e2ffe2;
+}
+
+tr.even.gradeA td.sorting_3 {
+ background-color: #e2ffe2;
+}
+
+tr.odd.gradeC td.sorting_1 {
+ background-color: #c4c4ff;
+}
+
+tr.odd.gradeC td.sorting_2 {
+ background-color: #d1d1ff;
+}
+
+tr.odd.gradeC td.sorting_3 {
+ background-color: #d1d1ff;
+}
+
+tr.even.gradeC td.sorting_1 {
+ background-color: #d5d5ff;
+}
+
+tr.even.gradeC td.sorting_2 {
+ background-color: #e2e2ff;
+}
+
+tr.even.gradeC td.sorting_3 {
+ background-color: #e2e2ff;
+}
+
+tr.odd.gradeX td.sorting_1 {
+ background-color: #ffc4c4;
+}
+
+tr.odd.gradeX td.sorting_2 {
+ background-color: #ffd1d1;
+}
+
+tr.odd.gradeX td.sorting_3 {
+ background-color: #ffd1d1;
+}
+
+tr.even.gradeX td.sorting_1 {
+ background-color: #ffd5d5;
+}
+
+tr.even.gradeX td.sorting_2 {
+ background-color: #ffe2e2;
+}
+
+tr.even.gradeX td.sorting_3 {
+ background-color: #ffe2e2;
+}
+
+tr.odd.gradeU td.sorting_1 {
+ background-color: #c4c4c4;
+}
+
+tr.odd.gradeU td.sorting_2 {
+ background-color: #d1d1d1;
+}
+
+tr.odd.gradeU td.sorting_3 {
+ background-color: #d1d1d1;
+}
+
+tr.even.gradeU td.sorting_1 {
+ background-color: #d5d5d5;
+}
+
+tr.even.gradeU td.sorting_2 {
+ background-color: #e2e2e2;
+}
+
+tr.even.gradeU td.sorting_3 {
+ background-color: #e2e2e2;
+}
+
+
+/*
+ * Row highlighting example
+ */
+.ex_highlight #example tbody tr.even:hover, #example tbody tr.even td.highlighted {
+ background-color: #ECFFB3;
+}
+
+.ex_highlight #example tbody tr.odd:hover, #example tbody tr.odd td.highlighted {
+ background-color: #E6FF99;
+}
+
+.ex_highlight_row #example tr.even:hover {
+ background-color: #ECFFB3;
+}
+
+.ex_highlight_row #example tr.even:hover td.sorting_1 {
+ background-color: #DDFF75;
+}
+
+.ex_highlight_row #example tr.even:hover td.sorting_2 {
+ background-color: #E7FF9E;
+}
+
+.ex_highlight_row #example tr.even:hover td.sorting_3 {
+ background-color: #E2FF89;
+}
+
+.ex_highlight_row #example tr.odd:hover {
+ background-color: #E6FF99;
+}
+
+.ex_highlight_row #example tr.odd:hover td.sorting_1 {
+ background-color: #D6FF5C;
+}
+
+.ex_highlight_row #example tr.odd:hover td.sorting_2 {
+ background-color: #E0FF84;
+}
+
+.ex_highlight_row #example tr.odd:hover td.sorting_3 {
+ background-color: #DBFF70;
+}
+
+
+/*
+ * KeyTable
+ */
+table.KeyTable td {
+ border: 3px solid transparent;
+}
+
+table.KeyTable td.focus {
+ border: 3px solid #3366FF;
+}
+
+table.display tr.gradeA {
+ background-color: #eeffee;
+}
+
+table.display tr.gradeC {
+ background-color: #ddddff;
+}
+
+table.display tr.gradeX {
+ background-color: #ffdddd;
+}
+
+table.display tr.gradeU {
+ background-color: #ddd;
+}
+
+div.box {
+ height: 100px;
+ padding: 10px;
+ overflow: auto;
+ border: 1px solid #8080FF;
+ background-color: #E5E5FF;
+}
diff --git a/themes/default/js/plugins/datatables/css/demo_table_jui.css b/themes/default/js/plugins/datatables/css/demo_table_jui.css
new file mode 100644
index 000000000..a210af51a
--- /dev/null
+++ b/themes/default/js/plugins/datatables/css/demo_table_jui.css
@@ -0,0 +1,501 @@
+/*
+ * File: demo_table_jui.css
+ * CVS: $Id$
+ * Description: CSS descriptions for DataTables demo pages
+ * Author: Allan Jardine
+ * Created: Tue May 12 06:47:22 BST 2009
+ * Modified: $Date$ by $Author$
+ * Language: CSS
+ * Project: DataTables
+ *
+ * Copyright 2009 Allan Jardine. All Rights Reserved.
+ *
+ * ***************************************************************************
+ * DESCRIPTION
+ *
+ * The styles given here are suitable for the demos that are used with the standard DataTables
+ * distribution (see www.datatables.net). You will most likely wish to modify these styles to
+ * meet the layout requirements of your site.
+ *
+ * Common issues:
+ * 'full_numbers' pagination - I use an extra selector on the body tag to ensure that there is
+ * no conflict between the two pagination types. If you want to use full_numbers pagination
+ * ensure that you either have "example_alt_pagination" as a body class name, or better yet,
+ * modify that selector.
+ * Note that the path used for Images is relative. All images are by default located in
+ * ../images/ - relative to this CSS file.
+ */
+
+
+/*
+ * jQuery UI specific styling
+ */
+
+.paging_two_button .ui-button {
+ float: left;
+ cursor: pointer;
+ * cursor: hand;
+}
+
+.paging_full_numbers .ui-button {
+ padding: 2px 6px;
+ margin: 0;
+ cursor: pointer;
+ * cursor: hand;
+ color: #333 !important;
+}
+
+.dataTables_paginate .ui-button {
+ margin-right: -0.1em !important;
+}
+
+.paging_full_numbers {
+ width: 350px !important;
+}
+
+.dataTables_wrapper .ui-toolbar {
+ padding: 5px;
+}
+
+.dataTables_paginate {
+ width: auto;
+}
+
+.dataTables_info {
+ padding-top: 3px;
+}
+
+table.display thead th {
+ padding: 3px 0px 3px 10px;
+ cursor: pointer;
+ * cursor: hand;
+}
+
+div.dataTables_wrapper .ui-widget-header {
+ font-weight: normal;
+}
+
+
+/*
+ * Sort arrow icon positioning
+ */
+table.display thead th div.DataTables_sort_wrapper {
+ position: relative;
+ padding-right: 20px;
+}
+
+table.display thead th div.DataTables_sort_wrapper span {
+ position: absolute;
+ top: 50%;
+ margin-top: -8px;
+ right: 0;
+}
+
+
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ *
+ * Everything below this line is the same as demo_table.css. This file is
+ * required for 'cleanliness' of the markup
+ *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * DataTables features
+ */
+
+.dataTables_wrapper {
+ position: relative;
+ clear: both;
+}
+
+.dataTables_processing {
+ position: absolute;
+ top: 0px;
+ left: 50%;
+ width: 250px;
+ margin-left: -125px;
+ border: 1px solid #ddd;
+ text-align: center;
+ color: #999;
+ font-size: 11px;
+ padding: 2px 0;
+}
+
+.dataTables_length {
+ width: 40%;
+ float: left;
+}
+
+.dataTables_filter {
+ width: 50%;
+ float: right;
+ text-align: right;
+}
+
+.dataTables_info {
+ width: 50%;
+ float: left;
+}
+
+.dataTables_paginate {
+ float: right;
+ text-align: right;
+}
+
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * DataTables display
+ */
+table.display {
+ margin: 0 auto;
+ width: 100%;
+ clear: both;
+ border-collapse: collapse;
+}
+
+table.display tfoot th {
+ padding: 3px 0px 3px 10px;
+ font-weight: bold;
+ font-weight: normal;
+}
+
+table.display tr.heading2 td {
+ border-bottom: 1px solid #aaa;
+}
+
+table.display td {
+ padding: 3px 10px;
+}
+
+table.display td.center {
+ text-align: center;
+}
+
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * DataTables sorting
+ */
+
+.sorting_asc {
+ background: url('../images/sort_asc.png') no-repeat center right;
+}
+
+.sorting_desc {
+ background: url('../images/sort_desc.png') no-repeat center right;
+}
+
+.sorting {
+ background: url('../images/sort_both.png') no-repeat center right;
+}
+
+.sorting_asc_disabled {
+ background: url('../images/sort_asc_disabled.png') no-repeat center right;
+}
+
+.sorting_desc_disabled {
+ background: url('../images/sort_desc_disabled.png') no-repeat center right;
+}
+
+
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * DataTables row classes
+ */
+table.display tr.odd.gradeA {
+ background-color: #ddffdd;
+}
+
+table.display tr.even.gradeA {
+ background-color: #eeffee;
+}
+
+
+
+
+table.display tr.odd.gradeA {
+ background-color: #ddffdd;
+}
+
+table.display tr.even.gradeA {
+ background-color: #eeffee;
+}
+
+table.display tr.odd.gradeC {
+ background-color: #ddddff;
+}
+
+table.display tr.even.gradeC {
+ background-color: #eeeeff;
+}
+
+table.display tr.odd.gradeX {
+ background-color: #ffdddd;
+}
+
+table.display tr.even.gradeX {
+ background-color: #ffeeee;
+}
+
+table.display tr.odd.gradeU {
+ background-color: #ddd;
+}
+
+table.display tr.even.gradeU {
+ background-color: #eee;
+}
+
+
+tr.odd {
+ background-color: #E2E4FF;
+}
+
+tr.even {
+ background-color: white;
+}
+
+
+
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Misc
+ */
+.dataTables_scroll {
+ clear: both;
+}
+
+.dataTables_scrollBody {
+ -webkit-overflow-scrolling: touch;
+}
+
+.top, .bottom {
+ padding: 15px;
+ background-color: #F5F5F5;
+ border: 1px solid #CCCCCC;
+}
+
+.top .dataTables_info {
+ float: none;
+}
+
+.clear {
+ clear: both;
+}
+
+.dataTables_empty {
+ text-align: center;
+}
+
+tfoot input {
+ margin: 0.5em 0;
+ width: 100%;
+ color: #444;
+}
+
+tfoot input.search_init {
+ color: #999;
+}
+
+td.group {
+ background-color: #d1cfd0;
+ border-bottom: 2px solid #A19B9E;
+ border-top: 2px solid #A19B9E;
+}
+
+td.details {
+ background-color: #d1cfd0;
+ border: 2px solid #A19B9E;
+}
+
+
+.example_alt_pagination div.dataTables_info {
+ width: 40%;
+}
+
+.paging_full_numbers a.paginate_button,
+ .paging_full_numbers a.paginate_active {
+ border: 1px solid #aaa;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ padding: 2px 5px;
+ margin: 0 3px;
+ cursor: pointer;
+ *cursor: hand;
+ color: #333 !important;
+}
+
+.paging_full_numbers a.paginate_button {
+ background-color: #ddd;
+}
+
+.paging_full_numbers a.paginate_button:hover {
+ background-color: #ccc;
+ text-decoration: none !important;
+}
+
+.paging_full_numbers a.paginate_active {
+ background-color: #99B3FF;
+}
+
+table.display tr.even.row_selected td {
+ background-color: #B0BED9;
+}
+
+table.display tr.odd.row_selected td {
+ background-color: #9FAFD1;
+}
+
+
+/*
+ * Sorting classes for columns
+ */
+/* For the standard odd/even */
+tr.odd td.sorting_1 {
+ background-color: #D3D6FF;
+}
+
+tr.odd td.sorting_2 {
+ background-color: #DADCFF;
+}
+
+tr.odd td.sorting_3 {
+ background-color: #E0E2FF;
+}
+
+tr.even td.sorting_1 {
+ background-color: #EAEBFF;
+}
+
+tr.even td.sorting_2 {
+ background-color: #F2F3FF;
+}
+
+tr.even td.sorting_3 {
+ background-color: #F9F9FF;
+}
+
+
+/* For the Conditional-CSS grading rows */
+/*
+ Colour calculations (based off the main row colours)
+ Level 1:
+ dd > c4
+ ee > d5
+ Level 2:
+ dd > d1
+ ee > e2
+ */
+tr.odd.gradeA td.sorting_1 {
+ background-color: #c4ffc4;
+}
+
+tr.odd.gradeA td.sorting_2 {
+ background-color: #d1ffd1;
+}
+
+tr.odd.gradeA td.sorting_3 {
+ background-color: #d1ffd1;
+}
+
+tr.even.gradeA td.sorting_1 {
+ background-color: #d5ffd5;
+}
+
+tr.even.gradeA td.sorting_2 {
+ background-color: #e2ffe2;
+}
+
+tr.even.gradeA td.sorting_3 {
+ background-color: #e2ffe2;
+}
+
+tr.odd.gradeC td.sorting_1 {
+ background-color: #c4c4ff;
+}
+
+tr.odd.gradeC td.sorting_2 {
+ background-color: #d1d1ff;
+}
+
+tr.odd.gradeC td.sorting_3 {
+ background-color: #d1d1ff;
+}
+
+tr.even.gradeC td.sorting_1 {
+ background-color: #d5d5ff;
+}
+
+tr.even.gradeC td.sorting_2 {
+ background-color: #e2e2ff;
+}
+
+tr.even.gradeC td.sorting_3 {
+ background-color: #e2e2ff;
+}
+
+tr.odd.gradeX td.sorting_1 {
+ background-color: #ffc4c4;
+}
+
+tr.odd.gradeX td.sorting_2 {
+ background-color: #ffd1d1;
+}
+
+tr.odd.gradeX td.sorting_3 {
+ background-color: #ffd1d1;
+}
+
+tr.even.gradeX td.sorting_1 {
+ background-color: #ffd5d5;
+}
+
+tr.even.gradeX td.sorting_2 {
+ background-color: #ffe2e2;
+}
+
+tr.even.gradeX td.sorting_3 {
+ background-color: #ffe2e2;
+}
+
+tr.odd.gradeU td.sorting_1 {
+ background-color: #c4c4c4;
+}
+
+tr.odd.gradeU td.sorting_2 {
+ background-color: #d1d1d1;
+}
+
+tr.odd.gradeU td.sorting_3 {
+ background-color: #d1d1d1;
+}
+
+tr.even.gradeU td.sorting_1 {
+ background-color: #d5d5d5;
+}
+
+tr.even.gradeU td.sorting_2 {
+ background-color: #e2e2e2;
+}
+
+tr.even.gradeU td.sorting_3 {
+ background-color: #e2e2e2;
+}
+
+
+/*
+ * Row highlighting example
+ */
+.ex_highlight #example tbody tr.even:hover, #example tbody tr.even td.highlighted {
+ background-color: #ECFFB3;
+}
+
+.ex_highlight #example tbody tr.odd:hover, #example tbody tr.odd td.highlighted {
+ background-color: #E6FF99;
+} \ No newline at end of file
diff --git a/themes/default/js/plugins/datatables/css/jquery.dataTables.css b/themes/default/js/plugins/datatables/css/jquery.dataTables.css
new file mode 100644
index 000000000..7da7faec8
--- /dev/null
+++ b/themes/default/js/plugins/datatables/css/jquery.dataTables.css
@@ -0,0 +1,221 @@
+
+/*
+ * Table
+ */
+table.dataTable {
+ margin: 0 auto;
+ clear: both;
+ width: 100%;
+}
+
+table.dataTable thead th {
+ padding: 3px 18px 3px 10px;
+ border-bottom: 1px solid black;
+ font-weight: bold;
+ cursor: pointer;
+ *cursor: hand;
+}
+
+table.dataTable tfoot th {
+ padding: 3px 18px 3px 10px;
+ border-top: 1px solid black;
+ font-weight: bold;
+}
+
+table.dataTable td {
+ padding: 3px 10px;
+}
+
+table.dataTable td.center,
+table.dataTable td.dataTables_empty {
+ text-align: center;
+}
+
+table.dataTable tr.odd { background-color: #E2E4FF; }
+table.dataTable tr.even { background-color: white; }
+
+table.dataTable tr.odd td.sorting_1 { background-color: #D3D6FF; }
+table.dataTable tr.odd td.sorting_2 { background-color: #DADCFF; }
+table.dataTable tr.odd td.sorting_3 { background-color: #E0E2FF; }
+table.dataTable tr.even td.sorting_1 { background-color: #EAEBFF; }
+table.dataTable tr.even td.sorting_2 { background-color: #F2F3FF; }
+table.dataTable tr.even td.sorting_3 { background-color: #F9F9FF; }
+
+
+/*
+ * Table wrapper
+ */
+.dataTables_wrapper {
+ position: relative;
+ clear: both;
+ *zoom: 1;
+}
+
+
+/*
+ * Page length menu
+ */
+.dataTables_length {
+ float: left;
+}
+
+
+/*
+ * Filter
+ */
+.dataTables_filter {
+ float: right;
+ text-align: right;
+}
+
+
+/*
+ * Table information
+ */
+.dataTables_info {
+ clear: both;
+ float: left;
+}
+
+
+/*
+ * Pagination
+ */
+.dataTables_paginate {
+ float: right;
+ text-align: right;
+}
+
+/* Two button pagination - previous / next */
+.paginate_disabled_previous,
+.paginate_enabled_previous,
+.paginate_disabled_next,
+.paginate_enabled_next {
+ height: 19px;
+ float: left;
+ cursor: pointer;
+ *cursor: hand;
+ color: #111 !important;
+}
+.paginate_disabled_previous:hover,
+.paginate_enabled_previous:hover,
+.paginate_disabled_next:hover,
+.paginate_enabled_next:hover {
+ text-decoration: none !important;
+}
+.paginate_disabled_previous:active,
+.paginate_enabled_previous:active,
+.paginate_disabled_next:active,
+.paginate_enabled_next:active {
+ outline: none;
+}
+
+.paginate_disabled_previous,
+.paginate_disabled_next {
+ color: #666 !important;
+}
+.paginate_disabled_previous,
+.paginate_enabled_previous {
+ padding-left: 23px;
+}
+.paginate_disabled_next,
+.paginate_enabled_next {
+ padding-right: 23px;
+ margin-left: 10px;
+}
+
+.paginate_enabled_previous { background: url('../images/back_enabled.png') no-repeat top left; }
+.paginate_enabled_previous:hover { background: url('../images/back_enabled_hover.png') no-repeat top left; }
+.paginate_disabled_previous { background: url('../images/back_disabled.png') no-repeat top left; }
+
+.paginate_enabled_next { background: url('../images/forward_enabled.png') no-repeat top right; }
+.paginate_enabled_next:hover { background: url('../images/forward_enabled_hover.png') no-repeat top right; }
+.paginate_disabled_next { background: url('../images/forward_disabled.png') no-repeat top right; }
+
+/* Full number pagination */
+.paging_full_numbers {
+ height: 22px;
+ line-height: 22px;
+}
+.paging_full_numbers a:active {
+ outline: none
+}
+.paging_full_numbers a:hover {
+ text-decoration: none;
+}
+
+.paging_full_numbers a.paginate_button,
+.paging_full_numbers a.paginate_active {
+ border: 1px solid #aaa;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+ padding: 2px 5px;
+ margin: 0 3px;
+ cursor: pointer;
+ *cursor: hand;
+ color: #333 !important;
+}
+
+.paging_full_numbers a.paginate_button {
+ background-color: #ddd;
+}
+
+.paging_full_numbers a.paginate_button:hover {
+ background-color: #ccc;
+ text-decoration: none !important;
+}
+
+.paging_full_numbers a.paginate_active {
+ background-color: #99B3FF;
+}
+
+
+/*
+ * Processing indicator
+ */
+.dataTables_processing {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ width: 250px;
+ height: 30px;
+ margin-left: -125px;
+ margin-top: -15px;
+ padding: 14px 0 2px 0;
+ border: 1px solid #ddd;
+ text-align: center;
+ color: #999;
+ font-size: 14px;
+ background-color: white;
+}
+
+
+/*
+ * Sorting
+ */
+.sorting { background: url('../images/sort_both.png') no-repeat center right; }
+.sorting_asc { background: url('../images/sort_asc.png') no-repeat center right; }
+.sorting_desc { background: url('../images/sort_desc.png') no-repeat center right; }
+
+.sorting_asc_disabled { background: url('../images/sort_asc_disabled.png') no-repeat center right; }
+.sorting_desc_disabled { background: url('../images/sort_desc_disabled.png') no-repeat center right; }
+
+table.dataTable thead th:active,
+table.dataTable thead td:active {
+ outline: none;
+}
+
+
+/*
+ * Scrolling
+ */
+.dataTables_scroll {
+ clear: both;
+}
+
+.dataTables_scrollBody {
+ *margin-top: -1px;
+ -webkit-overflow-scrolling: touch;
+}
+
diff --git a/themes/default/js/plugins/datatables/css/jquery.dataTables_themeroller.css b/themes/default/js/plugins/datatables/css/jquery.dataTables_themeroller.css
new file mode 100644
index 000000000..cf1d4ed79
--- /dev/null
+++ b/themes/default/js/plugins/datatables/css/jquery.dataTables_themeroller.css
@@ -0,0 +1,244 @@
+
+
+/*
+ * Table
+ */
+table.dataTable {
+ margin: 0 auto;
+ clear: both;
+ width: 100%;
+ border-collapse: collapse;
+}
+
+table.dataTable thead th {
+ padding: 3px 0px 3px 10px;
+ cursor: pointer;
+ *cursor: hand;
+}
+
+table.dataTable tfoot th {
+ padding: 3px 10px;
+}
+
+table.dataTable td {
+ padding: 3px 10px;
+}
+
+table.dataTable td.center,
+table.dataTable td.dataTables_empty {
+ text-align: center;
+}
+
+table.dataTable tr.odd { background-color: #E2E4FF; }
+table.dataTable tr.even { background-color: white; }
+
+table.dataTable tr.odd td.sorting_1 { background-color: #D3D6FF; }
+table.dataTable tr.odd td.sorting_2 { background-color: #DADCFF; }
+table.dataTable tr.odd td.sorting_3 { background-color: #E0E2FF; }
+table.dataTable tr.even td.sorting_1 { background-color: #EAEBFF; }
+table.dataTable tr.even td.sorting_2 { background-color: #F2F3FF; }
+table.dataTable tr.even td.sorting_3 { background-color: #F9F9FF; }
+
+
+/*
+ * Table wrapper
+ */
+.dataTables_wrapper {
+ position: relative;
+ clear: both;
+ *zoom: 1;
+}
+.dataTables_wrapper .ui-widget-header {
+ font-weight: normal;
+}
+.dataTables_wrapper .ui-toolbar {
+ padding: 5px;
+}
+
+
+/*
+ * Page length menu
+ */
+.dataTables_length {
+ float: left;
+}
+
+
+/*
+ * Filter
+ */
+.dataTables_filter {
+ float: right;
+ text-align: right;
+}
+
+
+/*
+ * Table information
+ */
+.dataTables_info {
+ padding-top: 3px;
+ clear: both;
+ float: left;
+}
+
+
+/*
+ * Pagination
+ */
+.dataTables_paginate {
+ float: right;
+ text-align: right;
+}
+
+.dataTables_paginate .ui-button {
+ margin-right: -0.1em !important;
+}
+
+.paging_two_button .ui-button {
+ float: left;
+ cursor: pointer;
+ * cursor: hand;
+}
+
+.paging_full_numbers .ui-button {
+ padding: 2px 6px;
+ margin: 0;
+ cursor: pointer;
+ * cursor: hand;
+ color: #333 !important;
+}
+
+/* Two button pagination - previous / next */
+.paginate_disabled_previous,
+.paginate_enabled_previous,
+.paginate_disabled_next,
+.paginate_enabled_next {
+ height: 19px;
+ float: left;
+ cursor: pointer;
+ *cursor: hand;
+ color: #111 !important;
+}
+.paginate_disabled_previous:hover,
+.paginate_enabled_previous:hover,
+.paginate_disabled_next:hover,
+.paginate_enabled_next:hover {
+ text-decoration: none !important;
+}
+.paginate_disabled_previous:active,
+.paginate_enabled_previous:active,
+.paginate_disabled_next:active,
+.paginate_enabled_next:active {
+ outline: none;
+}
+
+.paginate_disabled_previous,
+.paginate_disabled_next {
+ color: #666 !important;
+}
+.paginate_disabled_previous,
+.paginate_enabled_previous {
+ padding-left: 23px;
+}
+.paginate_disabled_next,
+.paginate_enabled_next {
+ padding-right: 23px;
+ margin-left: 10px;
+}
+
+.paginate_enabled_previous { background: url('../images/back_enabled.png') no-repeat top left; }
+.paginate_enabled_previous:hover { background: url('../images/back_enabled_hover.png') no-repeat top left; }
+.paginate_disabled_previous { background: url('../images/back_disabled.png') no-repeat top left; }
+
+.paginate_enabled_next { background: url('../images/forward_enabled.png') no-repeat top right; }
+.paginate_enabled_next:hover { background: url('../images/forward_enabled_hover.png') no-repeat top right; }
+.paginate_disabled_next { background: url('../images/forward_disabled.png') no-repeat top right; }
+
+/* Full number pagination */
+.paging_full_numbers a:active {
+ outline: none
+}
+.paging_full_numbers a:hover {
+ text-decoration: none;
+}
+
+.paging_full_numbers a.paginate_button,
+.paging_full_numbers a.paginate_active {
+ border: 1px solid #aaa;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+ padding: 2px 5px;
+ margin: 0 3px;
+ cursor: pointer;
+ *cursor: hand;
+ color: #333 !important;
+}
+
+.paging_full_numbers a.paginate_button {
+ background-color: #ddd;
+}
+
+.paging_full_numbers a.paginate_button:hover {
+ background-color: #ccc;
+ text-decoration: none !important;
+}
+
+.paging_full_numbers a.paginate_active {
+ background-color: #99B3FF;
+}
+
+
+/*
+ * Processing indicator
+ */
+.dataTables_processing {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ width: 250px;
+ height: 30px;
+ margin-left: -125px;
+ margin-top: -15px;
+ padding: 14px 0 2px 0;
+ border: 1px solid #ddd;
+ text-align: center;
+ color: #999;
+ font-size: 14px;
+ background-color: white;
+}
+
+
+/*
+ * Sorting
+ */
+table.dataTable thead th div.DataTables_sort_wrapper {
+ position: relative;
+ padding-right: 20px;
+}
+
+table.dataTable thead th div.DataTables_sort_wrapper span {
+ position: absolute;
+ top: 50%;
+ margin-top: -8px;
+ right: 0;
+}
+
+table.dataTable th:active {
+ outline: none;
+}
+
+
+/*
+ * Scrolling
+ */
+.dataTables_scroll {
+ clear: both;
+}
+
+.dataTables_scrollBody {
+ *margin-top: -1px;
+ -webkit-overflow-scrolling: touch;
+}
+
diff --git a/themes/default/js/plugins/datatables/images/Sorting icons.psd b/themes/default/js/plugins/datatables/images/Sorting icons.psd
new file mode 100644
index 000000000..53b2e0685
--- /dev/null
+++ b/themes/default/js/plugins/datatables/images/Sorting icons.psd
Binary files differ
diff --git a/themes/default/js/plugins/datatables/images/back_disabled.png b/themes/default/js/plugins/datatables/images/back_disabled.png
new file mode 100644
index 000000000..881de7976
--- /dev/null
+++ b/themes/default/js/plugins/datatables/images/back_disabled.png
Binary files differ
diff --git a/themes/default/js/plugins/datatables/images/back_enabled.png b/themes/default/js/plugins/datatables/images/back_enabled.png
new file mode 100644
index 000000000..c608682b0
--- /dev/null
+++ b/themes/default/js/plugins/datatables/images/back_enabled.png
Binary files differ
diff --git a/themes/default/js/plugins/datatables/images/back_enabled_hover.png b/themes/default/js/plugins/datatables/images/back_enabled_hover.png
new file mode 100644
index 000000000..d300f1064
--- /dev/null
+++ b/themes/default/js/plugins/datatables/images/back_enabled_hover.png
Binary files differ
diff --git a/themes/default/js/plugins/datatables/images/favicon.ico b/themes/default/js/plugins/datatables/images/favicon.ico
new file mode 100644
index 000000000..6eeaa2a0d
--- /dev/null
+++ b/themes/default/js/plugins/datatables/images/favicon.ico
Binary files differ
diff --git a/themes/default/js/plugins/datatables/images/forward_disabled.png b/themes/default/js/plugins/datatables/images/forward_disabled.png
new file mode 100644
index 000000000..6a6ded7de
--- /dev/null
+++ b/themes/default/js/plugins/datatables/images/forward_disabled.png
Binary files differ
diff --git a/themes/default/js/plugins/datatables/images/forward_enabled.png b/themes/default/js/plugins/datatables/images/forward_enabled.png
new file mode 100644
index 000000000..a4e6b5384
--- /dev/null
+++ b/themes/default/js/plugins/datatables/images/forward_enabled.png
Binary files differ
diff --git a/themes/default/js/plugins/datatables/images/forward_enabled_hover.png b/themes/default/js/plugins/datatables/images/forward_enabled_hover.png
new file mode 100644
index 000000000..fc46c5ebf
--- /dev/null
+++ b/themes/default/js/plugins/datatables/images/forward_enabled_hover.png
Binary files differ
diff --git a/themes/default/js/plugins/datatables/images/sort_asc.png b/themes/default/js/plugins/datatables/images/sort_asc.png
new file mode 100644
index 000000000..a88d7975f
--- /dev/null
+++ b/themes/default/js/plugins/datatables/images/sort_asc.png
Binary files differ
diff --git a/themes/default/js/plugins/datatables/images/sort_asc_disabled.png b/themes/default/js/plugins/datatables/images/sort_asc_disabled.png
new file mode 100644
index 000000000..4e144cf0b
--- /dev/null
+++ b/themes/default/js/plugins/datatables/images/sort_asc_disabled.png
Binary files differ
diff --git a/themes/default/js/plugins/datatables/images/sort_both.png b/themes/default/js/plugins/datatables/images/sort_both.png
new file mode 100644
index 000000000..18670406b
--- /dev/null
+++ b/themes/default/js/plugins/datatables/images/sort_both.png
Binary files differ
diff --git a/themes/default/js/plugins/datatables/images/sort_desc.png b/themes/default/js/plugins/datatables/images/sort_desc.png
new file mode 100644
index 000000000..def071ed5
--- /dev/null
+++ b/themes/default/js/plugins/datatables/images/sort_desc.png
Binary files differ
diff --git a/themes/default/js/plugins/datatables/images/sort_desc_disabled.png b/themes/default/js/plugins/datatables/images/sort_desc_disabled.png
new file mode 100644
index 000000000..7824973cc
--- /dev/null
+++ b/themes/default/js/plugins/datatables/images/sort_desc_disabled.png
Binary files differ
diff --git a/themes/default/js/plugins/jgrowl-alert.png b/themes/default/js/plugins/jgrowl-alert.png
new file mode 100644
index 000000000..350822e8c
--- /dev/null
+++ b/themes/default/js/plugins/jgrowl-alert.png
Binary files differ
diff --git a/themes/default/js/plugins/jgrowl-check.png b/themes/default/js/plugins/jgrowl-check.png
new file mode 100644
index 000000000..fccf6c78c
--- /dev/null
+++ b/themes/default/js/plugins/jgrowl-check.png
Binary files differ
diff --git a/themes/default/js/plugins/jgrowl-error.png b/themes/default/js/plugins/jgrowl-error.png
new file mode 100644
index 000000000..542f96311
--- /dev/null
+++ b/themes/default/js/plugins/jgrowl-error.png
Binary files differ
diff --git a/themes/default/js/plugins/jquery.dataTables.js b/themes/default/js/plugins/jquery.dataTables.js
new file mode 100644
index 000000000..1d8a220ba
--- /dev/null
+++ b/themes/default/js/plugins/jquery.dataTables.js
@@ -0,0 +1,12099 @@
+/**
+ * @summary DataTables
+ * @description Paginate, search and sort HTML tables
+ * @version 1.9.4
+ * @file jquery.dataTables.js
+ * @author Allan Jardine (www.sprymedia.co.uk)
+ * @contact www.sprymedia.co.uk/contact
+ *
+ * @copyright Copyright 2008-2012 Allan Jardine, all rights reserved.
+ *
+ * This source file is free software, under either the GPL v2 license or a
+ * BSD style license, available at:
+ * http://datatables.net/license_gpl2
+ * http://datatables.net/license_bsd
+ *
+ * This source file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
+ *
+ * For details please refer to: http://www.datatables.net
+ */
+
+/*jslint evil: true, undef: true, browser: true */
+/*globals $, jQuery,define,_fnExternApiFunc,_fnInitialise,_fnInitComplete,_fnLanguageCompat,_fnAddColumn,_fnColumnOptions,_fnAddData,_fnCreateTr,_fnGatherData,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnServerParams,_fnAddOptionsHtml,_fnFeatureHtmlTable,_fnScrollDraw,_fnAdjustColumnSizing,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnBuildSearchArray,_fnBuildSearchRow,_fnFilterCreateSearch,_fnDataToSearch,_fnSort,_fnSortAttachListener,_fnSortingClasses,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnFeatureHtmlLength,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnNodeToDataIndex,_fnVisbleColumns,_fnCalculateEnd,_fnConvertToWidth,_fnCalculateColumnWidths,_fnScrollingWidthAdjust,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnDetectType,_fnSettingsFromNode,_fnGetDataMaster,_fnGetTrNodes,_fnGetTdNodes,_fnEscapeRegex,_fnDeleteIndex,_fnReOrderIndex,_fnColumnOrdering,_fnLog,_fnClearTable,_fnSaveState,_fnLoadState,_fnCreateCookie,_fnReadCookie,_fnDetectHeader,_fnGetUniqueThs,_fnScrollBarWidth,_fnApplyToChildren,_fnMap,_fnGetRowData,_fnGetCellData,_fnSetCellData,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnApplyColumnDefs,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnJsonString,_fnRender,_fnNodeToColumnIndex,_fnInfoMacros,_fnBrowserDetect,_fnGetColumns*/
+
+(/** @lends <global> */function( window, document, undefined ) {
+
+(function( factory ) {
+ "use strict";
+
+ // Define as an AMD module if possible
+ if ( typeof define === 'function' && define.amd )
+ {
+ define( ['jquery'], factory );
+ }
+ /* Define using browser globals otherwise
+ * Prevent multiple instantiations if the script is loaded twice
+ */
+ else if ( jQuery && !jQuery.fn.dataTable )
+ {
+ factory( jQuery );
+ }
+}
+(/** @lends <global> */function( $ ) {
+ "use strict";
+ /**
+ * DataTables is a plug-in for the jQuery Javascript library. It is a
+ * highly flexible tool, based upon the foundations of progressive
+ * enhancement, which will add advanced interaction controls to any
+ * HTML table. For a full list of features please refer to
+ * <a href="http://datatables.net">DataTables.net</a>.
+ *
+ * Note that the <i>DataTable</i> object is not a global variable but is
+ * aliased to <i>jQuery.fn.DataTable</i> and <i>jQuery.fn.dataTable</i> through which
+ * it may be accessed.
+ *
+ * @class
+ * @param {object} [oInit={}] Configuration object for DataTables. Options
+ * are defined by {@link DataTable.defaults}
+ * @requires jQuery 1.3+
+ *
+ * @example
+ * // Basic initialisation
+ * $(document).ready( function {
+ * $('#example').dataTable();
+ * } );
+ *
+ * @example
+ * // Initialisation with configuration options - in this case, disable
+ * // pagination and sorting.
+ * $(document).ready( function {
+ * $('#example').dataTable( {
+ * "bPaginate": false,
+ * "bSort": false
+ * } );
+ * } );
+ */
+ var DataTable = function( oInit )
+ {
+
+
+ /**
+ * Add a column to the list used for the table with default values
+ * @param {object} oSettings dataTables settings object
+ * @param {node} nTh The th element for this column
+ * @memberof DataTable#oApi
+ */
+ function _fnAddColumn( oSettings, nTh )
+ {
+ var oDefaults = DataTable.defaults.columns;
+ var iCol = oSettings.aoColumns.length;
+ var oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, {
+ "sSortingClass": oSettings.oClasses.sSortable,
+ "sSortingClassJUI": oSettings.oClasses.sSortJUI,
+ "nTh": nTh ? nTh : document.createElement('th'),
+ "sTitle": oDefaults.sTitle ? oDefaults.sTitle : nTh ? nTh.innerHTML : '',
+ "aDataSort": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],
+ "mData": oDefaults.mData ? oDefaults.oDefaults : iCol
+ } );
+ oSettings.aoColumns.push( oCol );
+
+ /* Add a column specific filter */
+ if ( oSettings.aoPreSearchCols[ iCol ] === undefined || oSettings.aoPreSearchCols[ iCol ] === null )
+ {
+ oSettings.aoPreSearchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch );
+ }
+ else
+ {
+ var oPre = oSettings.aoPreSearchCols[ iCol ];
+
+ /* Don't require that the user must specify bRegex, bSmart or bCaseInsensitive */
+ if ( oPre.bRegex === undefined )
+ {
+ oPre.bRegex = true;
+ }
+
+ if ( oPre.bSmart === undefined )
+ {
+ oPre.bSmart = true;
+ }
+
+ if ( oPre.bCaseInsensitive === undefined )
+ {
+ oPre.bCaseInsensitive = true;
+ }
+ }
+
+ /* Use the column options function to initialise classes etc */
+ _fnColumnOptions( oSettings, iCol, null );
+ }
+
+
+ /**
+ * Apply options for a column
+ * @param {object} oSettings dataTables settings object
+ * @param {int} iCol column index to consider
+ * @param {object} oOptions object with sType, bVisible and bSearchable etc
+ * @memberof DataTable#oApi
+ */
+ function _fnColumnOptions( oSettings, iCol, oOptions )
+ {
+ var oCol = oSettings.aoColumns[ iCol ];
+
+ /* User specified column options */
+ if ( oOptions !== undefined && oOptions !== null )
+ {
+ /* Backwards compatibility for mDataProp */
+ if ( oOptions.mDataProp && !oOptions.mData )
+ {
+ oOptions.mData = oOptions.mDataProp;
+ }
+
+ if ( oOptions.sType !== undefined )
+ {
+ oCol.sType = oOptions.sType;
+ oCol._bAutoType = false;
+ }
+
+ $.extend( oCol, oOptions );
+ _fnMap( oCol, oOptions, "sWidth", "sWidthOrig" );
+
+ /* iDataSort to be applied (backwards compatibility), but aDataSort will take
+ * priority if defined
+ */
+ if ( oOptions.iDataSort !== undefined )
+ {
+ oCol.aDataSort = [ oOptions.iDataSort ];
+ }
+ _fnMap( oCol, oOptions, "aDataSort" );
+ }
+
+ /* Cache the data get and set functions for speed */
+ var mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null;
+ var mData = _fnGetObjectDataFn( oCol.mData );
+
+ oCol.fnGetData = function (oData, sSpecific) {
+ var innerData = mData( oData, sSpecific );
+
+ if ( oCol.mRender && (sSpecific && sSpecific !== '') )
+ {
+ return mRender( innerData, sSpecific, oData );
+ }
+ return innerData;
+ };
+ oCol.fnSetData = _fnSetObjectDataFn( oCol.mData );
+
+ /* Feature sorting overrides column specific when off */
+ if ( !oSettings.oFeatures.bSort )
+ {
+ oCol.bSortable = false;
+ }
+
+ /* Check that the class assignment is correct for sorting */
+ if ( !oCol.bSortable ||
+ ($.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1) )
+ {
+ oCol.sSortingClass = oSettings.oClasses.sSortableNone;
+ oCol.sSortingClassJUI = "";
+ }
+ else if ( $.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1 )
+ {
+ oCol.sSortingClass = oSettings.oClasses.sSortable;
+ oCol.sSortingClassJUI = oSettings.oClasses.sSortJUI;
+ }
+ else if ( $.inArray('asc', oCol.asSorting) != -1 && $.inArray('desc', oCol.asSorting) == -1 )
+ {
+ oCol.sSortingClass = oSettings.oClasses.sSortableAsc;
+ oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIAscAllowed;
+ }
+ else if ( $.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) != -1 )
+ {
+ oCol.sSortingClass = oSettings.oClasses.sSortableDesc;
+ oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIDescAllowed;
+ }
+ }
+
+
+ /**
+ * Adjust the table column widths for new data. Note: you would probably want to
+ * do a redraw after calling this function!
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnAdjustColumnSizing ( oSettings )
+ {
+ /* Not interested in doing column width calculation if auto-width is disabled */
+ if ( oSettings.oFeatures.bAutoWidth === false )
+ {
+ return false;
+ }
+
+ _fnCalculateColumnWidths( oSettings );
+ for ( var i=0 , iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+ {
+ oSettings.aoColumns[i].nTh.style.width = oSettings.aoColumns[i].sWidth;
+ }
+ }
+
+
+ /**
+ * Covert the index of a visible column to the index in the data array (take account
+ * of hidden columns)
+ * @param {object} oSettings dataTables settings object
+ * @param {int} iMatch Visible column index to lookup
+ * @returns {int} i the data index
+ * @memberof DataTable#oApi
+ */
+ function _fnVisibleToColumnIndex( oSettings, iMatch )
+ {
+ var aiVis = _fnGetColumns( oSettings, 'bVisible' );
+
+ return typeof aiVis[iMatch] === 'number' ?
+ aiVis[iMatch] :
+ null;
+ }
+
+
+ /**
+ * Covert the index of an index in the data array and convert it to the visible
+ * column index (take account of hidden columns)
+ * @param {int} iMatch Column index to lookup
+ * @param {object} oSettings dataTables settings object
+ * @returns {int} i the data index
+ * @memberof DataTable#oApi
+ */
+ function _fnColumnIndexToVisible( oSettings, iMatch )
+ {
+ var aiVis = _fnGetColumns( oSettings, 'bVisible' );
+ var iPos = $.inArray( iMatch, aiVis );
+
+ return iPos !== -1 ? iPos : null;
+ }
+
+
+ /**
+ * Get the number of visible columns
+ * @param {object} oSettings dataTables settings object
+ * @returns {int} i the number of visible columns
+ * @memberof DataTable#oApi
+ */
+ function _fnVisbleColumns( oSettings )
+ {
+ return _fnGetColumns( oSettings, 'bVisible' ).length;
+ }
+
+
+ /**
+ * Get an array of column indexes that match a given property
+ * @param {object} oSettings dataTables settings object
+ * @param {string} sParam Parameter in aoColumns to look for - typically
+ * bVisible or bSearchable
+ * @returns {array} Array of indexes with matched properties
+ * @memberof DataTable#oApi
+ */
+ function _fnGetColumns( oSettings, sParam )
+ {
+ var a = [];
+
+ $.map( oSettings.aoColumns, function(val, i) {
+ if ( val[sParam] ) {
+ a.push( i );
+ }
+ } );
+
+ return a;
+ }
+
+
+ /**
+ * Get the sort type based on an input string
+ * @param {string} sData data we wish to know the type of
+ * @returns {string} type (defaults to 'string' if no type can be detected)
+ * @memberof DataTable#oApi
+ */
+ function _fnDetectType( sData )
+ {
+ var aTypes = DataTable.ext.aTypes;
+ var iLen = aTypes.length;
+
+ for ( var i=0 ; i<iLen ; i++ )
+ {
+ var sType = aTypes[i]( sData );
+ if ( sType !== null )
+ {
+ return sType;
+ }
+ }
+
+ return 'string';
+ }
+
+
+ /**
+ * Figure out how to reorder a display list
+ * @param {object} oSettings dataTables settings object
+ * @returns array {int} aiReturn index list for reordering
+ * @memberof DataTable#oApi
+ */
+ function _fnReOrderIndex ( oSettings, sColumns )
+ {
+ var aColumns = sColumns.split(',');
+ var aiReturn = [];
+
+ for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+ {
+ for ( var j=0 ; j<iLen ; j++ )
+ {
+ if ( oSettings.aoColumns[i].sName == aColumns[j] )
+ {
+ aiReturn.push( j );
+ break;
+ }
+ }
+ }
+
+ return aiReturn;
+ }
+
+
+ /**
+ * Get the column ordering that DataTables expects
+ * @param {object} oSettings dataTables settings object
+ * @returns {string} comma separated list of names
+ * @memberof DataTable#oApi
+ */
+ function _fnColumnOrdering ( oSettings )
+ {
+ var sNames = '';
+ for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+ {
+ sNames += oSettings.aoColumns[i].sName+',';
+ }
+ if ( sNames.length == iLen )
+ {
+ return "";
+ }
+ return sNames.slice(0, -1);
+ }
+
+
+ /**
+ * Take the column definitions and static columns arrays and calculate how
+ * they relate to column indexes. The callback function will then apply the
+ * definition found for a column to a suitable configuration object.
+ * @param {object} oSettings dataTables settings object
+ * @param {array} aoColDefs The aoColumnDefs array that is to be applied
+ * @param {array} aoCols The aoColumns array that defines columns individually
+ * @param {function} fn Callback function - takes two parameters, the calculated
+ * column index and the definition for that column.
+ * @memberof DataTable#oApi
+ */
+ function _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn )
+ {
+ var i, iLen, j, jLen, k, kLen;
+
+ // Column definitions with aTargets
+ if ( aoColDefs )
+ {
+ /* Loop over the definitions array - loop in reverse so first instance has priority */
+ for ( i=aoColDefs.length-1 ; i>=0 ; i-- )
+ {
+ /* Each definition can target multiple columns, as it is an array */
+ var aTargets = aoColDefs[i].aTargets;
+ if ( !$.isArray( aTargets ) )
+ {
+ _fnLog( oSettings, 1, 'aTargets must be an array of targets, not a '+(typeof aTargets) );
+ }
+
+ for ( j=0, jLen=aTargets.length ; j<jLen ; j++ )
+ {
+ if ( typeof aTargets[j] === 'number' && aTargets[j] >= 0 )
+ {
+ /* Add columns that we don't yet know about */
+ while( oSettings.aoColumns.length <= aTargets[j] )
+ {
+ _fnAddColumn( oSettings );
+ }
+
+ /* Integer, basic index */
+ fn( aTargets[j], aoColDefs[i] );
+ }
+ else if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 )
+ {
+ /* Negative integer, right to left column counting */
+ fn( oSettings.aoColumns.length+aTargets[j], aoColDefs[i] );
+ }
+ else if ( typeof aTargets[j] === 'string' )
+ {
+ /* Class name matching on TH element */
+ for ( k=0, kLen=oSettings.aoColumns.length ; k<kLen ; k++ )
+ {
+ if ( aTargets[j] == "_all" ||
+ $(oSettings.aoColumns[k].nTh).hasClass( aTargets[j] ) )
+ {
+ fn( k, aoColDefs[i] );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // Statically defined columns array
+ if ( aoCols )
+ {
+ for ( i=0, iLen=aoCols.length ; i<iLen ; i++ )
+ {
+ fn( i, aoCols[i] );
+ }
+ }
+ }
+
+ /**
+ * Add a data array to the table, creating DOM node etc. This is the parallel to
+ * _fnGatherData, but for adding rows from a Javascript source, rather than a
+ * DOM source.
+ * @param {object} oSettings dataTables settings object
+ * @param {array} aData data array to be added
+ * @returns {int} >=0 if successful (index of new aoData entry), -1 if failed
+ * @memberof DataTable#oApi
+ */
+ function _fnAddData ( oSettings, aDataSupplied )
+ {
+ var oCol;
+
+ /* Take an independent copy of the data source so we can bash it about as we wish */
+ var aDataIn = ($.isArray(aDataSupplied)) ?
+ aDataSupplied.slice() :
+ $.extend( true, {}, aDataSupplied );
+
+ /* Create the object for storing information about this new row */
+ var iRow = oSettings.aoData.length;
+ var oData = $.extend( true, {}, DataTable.models.oRow );
+ oData._aData = aDataIn;
+ oSettings.aoData.push( oData );
+
+ /* Create the cells */
+ var nTd, sThisType;
+ for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+ {
+ oCol = oSettings.aoColumns[i];
+
+ /* Use rendered data for filtering / sorting */
+ if ( typeof oCol.fnRender === 'function' && oCol.bUseRendered && oCol.mData !== null )
+ {
+ _fnSetCellData( oSettings, iRow, i, _fnRender(oSettings, iRow, i) );
+ }
+ else
+ {
+ _fnSetCellData( oSettings, iRow, i, _fnGetCellData( oSettings, iRow, i ) );
+ }
+
+ /* See if we should auto-detect the column type */
+ if ( oCol._bAutoType && oCol.sType != 'string' )
+ {
+ /* Attempt to auto detect the type - same as _fnGatherData() */
+ var sVarType = _fnGetCellData( oSettings, iRow, i, 'type' );
+ if ( sVarType !== null && sVarType !== '' )
+ {
+ sThisType = _fnDetectType( sVarType );
+ if ( oCol.sType === null )
+ {
+ oCol.sType = sThisType;
+ }
+ else if ( oCol.sType != sThisType && oCol.sType != "html" )
+ {
+ /* String is always the 'fallback' option */
+ oCol.sType = 'string';
+ }
+ }
+ }
+ }
+
+ /* Add to the display array */
+ oSettings.aiDisplayMaster.push( iRow );
+
+ /* Create the DOM information */
+ if ( !oSettings.oFeatures.bDeferRender )
+ {
+ _fnCreateTr( oSettings, iRow );
+ }
+
+ return iRow;
+ }
+
+
+ /**
+ * Read in the data from the target table from the DOM
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnGatherData( oSettings )
+ {
+ var iLoop, i, iLen, j, jLen, jInner,
+ nTds, nTrs, nTd, nTr, aLocalData, iThisIndex,
+ iRow, iRows, iColumn, iColumns, sNodeName,
+ oCol, oData;
+
+ /*
+ * Process by row first
+ * Add the data object for the whole table - storing the tr node. Note - no point in getting
+ * DOM based data if we are going to go and replace it with Ajax source data.
+ */
+ if ( oSettings.bDeferLoading || oSettings.sAjaxSource === null )
+ {
+ nTr = oSettings.nTBody.firstChild;
+ while ( nTr )
+ {
+ if ( nTr.nodeName.toUpperCase() == "TR" )
+ {
+ iThisIndex = oSettings.aoData.length;
+ nTr._DT_RowIndex = iThisIndex;
+ oSettings.aoData.push( $.extend( true, {}, DataTable.models.oRow, {
+ "nTr": nTr
+ } ) );
+
+ oSettings.aiDisplayMaster.push( iThisIndex );
+ nTd = nTr.firstChild;
+ jInner = 0;
+ while ( nTd )
+ {
+ sNodeName = nTd.nodeName.toUpperCase();
+ if ( sNodeName == "TD" || sNodeName == "TH" )
+ {
+ _fnSetCellData( oSettings, iThisIndex, jInner, $.trim(nTd.innerHTML) );
+ jInner++;
+ }
+ nTd = nTd.nextSibling;
+ }
+ }
+ nTr = nTr.nextSibling;
+ }
+ }
+
+ /* Gather in the TD elements of the Table - note that this is basically the same as
+ * fnGetTdNodes, but that function takes account of hidden columns, which we haven't yet
+ * setup!
+ */
+ nTrs = _fnGetTrNodes( oSettings );
+ nTds = [];
+ for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
+ {
+ nTd = nTrs[i].firstChild;
+ while ( nTd )
+ {
+ sNodeName = nTd.nodeName.toUpperCase();
+ if ( sNodeName == "TD" || sNodeName == "TH" )
+ {
+ nTds.push( nTd );
+ }
+ nTd = nTd.nextSibling;
+ }
+ }
+
+ /* Now process by column */
+ for ( iColumn=0, iColumns=oSettings.aoColumns.length ; iColumn<iColumns ; iColumn++ )
+ {
+ oCol = oSettings.aoColumns[iColumn];
+
+ /* Get the title of the column - unless there is a user set one */
+ if ( oCol.sTitle === null )
+ {
+ oCol.sTitle = oCol.nTh.innerHTML;
+ }
+
+ var
+ bAutoType = oCol._bAutoType,
+ bRender = typeof oCol.fnRender === 'function',
+ bClass = oCol.sClass !== null,
+ bVisible = oCol.bVisible,
+ nCell, sThisType, sRendered, sValType;
+
+ /* A single loop to rule them all (and be more efficient) */
+ if ( bAutoType || bRender || bClass || !bVisible )
+ {
+ for ( iRow=0, iRows=oSettings.aoData.length ; iRow<iRows ; iRow++ )
+ {
+ oData = oSettings.aoData[iRow];
+ nCell = nTds[ (iRow*iColumns) + iColumn ];
+
+ /* Type detection */
+ if ( bAutoType && oCol.sType != 'string' )
+ {
+ sValType = _fnGetCellData( oSettings, iRow, iColumn, 'type' );
+ if ( sValType !== '' )
+ {
+ sThisType = _fnDetectType( sValType );
+ if ( oCol.sType === null )
+ {
+ oCol.sType = sThisType;
+ }
+ else if ( oCol.sType != sThisType &&
+ oCol.sType != "html" )
+ {
+ /* String is always the 'fallback' option */
+ oCol.sType = 'string';
+ }
+ }
+ }
+
+ if ( oCol.mRender )
+ {
+ // mRender has been defined, so we need to get the value and set it
+ nCell.innerHTML = _fnGetCellData( oSettings, iRow, iColumn, 'display' );
+ }
+ else if ( oCol.mData !== iColumn )
+ {
+ // If mData is not the same as the column number, then we need to
+ // get the dev set value. If it is the column, no point in wasting
+ // time setting the value that is already there!
+ nCell.innerHTML = _fnGetCellData( oSettings, iRow, iColumn, 'display' );
+ }
+
+ /* Rendering */
+ if ( bRender )
+ {
+ sRendered = _fnRender( oSettings, iRow, iColumn );
+ nCell.innerHTML = sRendered;
+ if ( oCol.bUseRendered )
+ {
+ /* Use the rendered data for filtering / sorting */
+ _fnSetCellData( oSettings, iRow, iColumn, sRendered );
+ }
+ }
+
+ /* Classes */
+ if ( bClass )
+ {
+ nCell.className += ' '+oCol.sClass;
+ }
+
+ /* Column visibility */
+ if ( !bVisible )
+ {
+ oData._anHidden[iColumn] = nCell;
+ nCell.parentNode.removeChild( nCell );
+ }
+ else
+ {
+ oData._anHidden[iColumn] = null;
+ }
+
+ if ( oCol.fnCreatedCell )
+ {
+ oCol.fnCreatedCell.call( oSettings.oInstance,
+ nCell, _fnGetCellData( oSettings, iRow, iColumn, 'display' ), oData._aData, iRow, iColumn
+ );
+ }
+ }
+ }
+ }
+
+ /* Row created callbacks */
+ if ( oSettings.aoRowCreatedCallback.length !== 0 )
+ {
+ for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
+ {
+ oData = oSettings.aoData[i];
+ _fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [oData.nTr, oData._aData, i] );
+ }
+ }
+ }
+
+
+ /**
+ * Take a TR element and convert it to an index in aoData
+ * @param {object} oSettings dataTables settings object
+ * @param {node} n the TR element to find
+ * @returns {int} index if the node is found, null if not
+ * @memberof DataTable#oApi
+ */
+ function _fnNodeToDataIndex( oSettings, n )
+ {
+ return (n._DT_RowIndex!==undefined) ? n._DT_RowIndex : null;
+ }
+
+
+ /**
+ * Take a TD element and convert it into a column data index (not the visible index)
+ * @param {object} oSettings dataTables settings object
+ * @param {int} iRow The row number the TD/TH can be found in
+ * @param {node} n The TD/TH element to find
+ * @returns {int} index if the node is found, -1 if not
+ * @memberof DataTable#oApi
+ */
+ function _fnNodeToColumnIndex( oSettings, iRow, n )
+ {
+ var anCells = _fnGetTdNodes( oSettings, iRow );
+
+ for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+ {
+ if ( anCells[i] === n )
+ {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+
+ /**
+ * Get an array of data for a given row from the internal data cache
+ * @param {object} oSettings dataTables settings object
+ * @param {int} iRow aoData row id
+ * @param {string} sSpecific data get type ('type' 'filter' 'sort')
+ * @param {array} aiColumns Array of column indexes to get data from
+ * @returns {array} Data array
+ * @memberof DataTable#oApi
+ */
+ function _fnGetRowData( oSettings, iRow, sSpecific, aiColumns )
+ {
+ var out = [];
+ for ( var i=0, iLen=aiColumns.length ; i<iLen ; i++ )
+ {
+ out.push( _fnGetCellData( oSettings, iRow, aiColumns[i], sSpecific ) );
+ }
+ return out;
+ }
+
+
+ /**
+ * Get the data for a given cell from the internal cache, taking into account data mapping
+ * @param {object} oSettings dataTables settings object
+ * @param {int} iRow aoData row id
+ * @param {int} iCol Column index
+ * @param {string} sSpecific data get type ('display', 'type' 'filter' 'sort')
+ * @returns {*} Cell data
+ * @memberof DataTable#oApi
+ */
+ function _fnGetCellData( oSettings, iRow, iCol, sSpecific )
+ {
+ var sData;
+ var oCol = oSettings.aoColumns[iCol];
+ var oData = oSettings.aoData[iRow]._aData;
+
+ if ( (sData=oCol.fnGetData( oData, sSpecific )) === undefined )
+ {
+ if ( oSettings.iDrawError != oSettings.iDraw && oCol.sDefaultContent === null )
+ {
+ _fnLog( oSettings, 0, "Requested unknown parameter "+
+ (typeof oCol.mData=='function' ? '{mData function}' : "'"+oCol.mData+"'")+
+ " from the data source for row "+iRow );
+ oSettings.iDrawError = oSettings.iDraw;
+ }
+ return oCol.sDefaultContent;
+ }
+
+ /* When the data source is null, we can use default column data */
+ if ( sData === null && oCol.sDefaultContent !== null )
+ {
+ sData = oCol.sDefaultContent;
+ }
+ else if ( typeof sData === 'function' )
+ {
+ /* If the data source is a function, then we run it and use the return */
+ return sData();
+ }
+
+ if ( sSpecific == 'display' && sData === null )
+ {
+ return '';
+ }
+ return sData;
+ }
+
+
+ /**
+ * Set the value for a specific cell, into the internal data cache
+ * @param {object} oSettings dataTables settings object
+ * @param {int} iRow aoData row id
+ * @param {int} iCol Column index
+ * @param {*} val Value to set
+ * @memberof DataTable#oApi
+ */
+ function _fnSetCellData( oSettings, iRow, iCol, val )
+ {
+ var oCol = oSettings.aoColumns[iCol];
+ var oData = oSettings.aoData[iRow]._aData;
+
+ oCol.fnSetData( oData, val );
+ }
+
+
+ // Private variable that is used to match array syntax in the data property object
+ var __reArray = /\[.*?\]$/;
+
+ /**
+ * Return a function that can be used to get data from a source object, taking
+ * into account the ability to use nested objects as a source
+ * @param {string|int|function} mSource The data source for the object
+ * @returns {function} Data get function
+ * @memberof DataTable#oApi
+ */
+ function _fnGetObjectDataFn( mSource )
+ {
+ if ( mSource === null )
+ {
+ /* Give an empty string for rendering / sorting etc */
+ return function (data, type) {
+ return null;
+ };
+ }
+ else if ( typeof mSource === 'function' )
+ {
+ return function (data, type, extra) {
+ return mSource( data, type, extra );
+ };
+ }
+ else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 || mSource.indexOf('[') !== -1) )
+ {
+ /* If there is a . in the source string then the data source is in a
+ * nested object so we loop over the data for each level to get the next
+ * level down. On each loop we test for undefined, and if found immediately
+ * return. This allows entire objects to be missing and sDefaultContent to
+ * be used if defined, rather than throwing an error
+ */
+ var fetchData = function (data, type, src) {
+ var a = src.split('.');
+ var arrayNotation, out, innerSrc;
+
+ if ( src !== "" )
+ {
+ for ( var i=0, iLen=a.length ; i<iLen ; i++ )
+ {
+ // Check if we are dealing with an array notation request
+ arrayNotation = a[i].match(__reArray);
+
+ if ( arrayNotation ) {
+ a[i] = a[i].replace(__reArray, '');
+
+ // Condition allows simply [] to be passed in
+ if ( a[i] !== "" ) {
+ data = data[ a[i] ];
+ }
+ out = [];
+
+ // Get the remainder of the nested object to get
+ a.splice( 0, i+1 );
+ innerSrc = a.join('.');
+
+ // Traverse each entry in the array getting the properties requested
+ for ( var j=0, jLen=data.length ; j<jLen ; j++ ) {
+ out.push( fetchData( data[j], type, innerSrc ) );
+ }
+
+ // If a string is given in between the array notation indicators, that
+ // is used to join the strings together, otherwise an array is returned
+ var join = arrayNotation[0].substring(1, arrayNotation[0].length-1);
+ data = (join==="") ? out : out.join(join);
+
+ // The inner call to fetchData has already traversed through the remainder
+ // of the source requested, so we exit from the loop
+ break;
+ }
+
+ if ( data === null || data[ a[i] ] === undefined )
+ {
+ return undefined;
+ }
+ data = data[ a[i] ];
+ }
+ }
+
+ return data;
+ };
+
+ return function (data, type) {
+ return fetchData( data, type, mSource );
+ };
+ }
+ else
+ {
+ /* Array or flat object mapping */
+ return function (data, type) {
+ return data[mSource];
+ };
+ }
+ }
+
+
+ /**
+ * Return a function that can be used to set data from a source object, taking
+ * into account the ability to use nested objects as a source
+ * @param {string|int|function} mSource The data source for the object
+ * @returns {function} Data set function
+ * @memberof DataTable#oApi
+ */
+ function _fnSetObjectDataFn( mSource )
+ {
+ if ( mSource === null )
+ {
+ /* Nothing to do when the data source is null */
+ return function (data, val) {};
+ }
+ else if ( typeof mSource === 'function' )
+ {
+ return function (data, val) {
+ mSource( data, 'set', val );
+ };
+ }
+ else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 || mSource.indexOf('[') !== -1) )
+ {
+ /* Like the get, we need to get data from a nested object */
+ var setData = function (data, val, src) {
+ var a = src.split('.'), b;
+ var arrayNotation, o, innerSrc;
+
+ for ( var i=0, iLen=a.length-1 ; i<iLen ; i++ )
+ {
+ // Check if we are dealing with an array notation request
+ arrayNotation = a[i].match(__reArray);
+
+ if ( arrayNotation )
+ {
+ a[i] = a[i].replace(__reArray, '');
+ data[ a[i] ] = [];
+
+ // Get the remainder of the nested object to set so we can recurse
+ b = a.slice();
+ b.splice( 0, i+1 );
+ innerSrc = b.join('.');
+
+ // Traverse each entry in the array setting the properties requested
+ for ( var j=0, jLen=val.length ; j<jLen ; j++ )
+ {
+ o = {};
+ setData( o, val[j], innerSrc );
+ data[ a[i] ].push( o );
+ }
+
+ // The inner call to setData has already traversed through the remainder
+ // of the source and has set the data, thus we can exit here
+ return;
+ }
+
+ // If the nested object doesn't currently exist - since we are
+ // trying to set the value - create it
+ if ( data[ a[i] ] === null || data[ a[i] ] === undefined )
+ {
+ data[ a[i] ] = {};
+ }
+ data = data[ a[i] ];
+ }
+
+ // If array notation is used, we just want to strip it and use the property name
+ // and assign the value. If it isn't used, then we get the result we want anyway
+ data[ a[a.length-1].replace(__reArray, '') ] = val;
+ };
+
+ return function (data, val) {
+ return setData( data, val, mSource );
+ };
+ }
+ else
+ {
+ /* Array or flat object mapping */
+ return function (data, val) {
+ data[mSource] = val;
+ };
+ }
+ }
+
+
+ /**
+ * Return an array with the full table data
+ * @param {object} oSettings dataTables settings object
+ * @returns array {array} aData Master data array
+ * @memberof DataTable#oApi
+ */
+ function _fnGetDataMaster ( oSettings )
+ {
+ var aData = [];
+ var iLen = oSettings.aoData.length;
+ for ( var i=0 ; i<iLen; i++ )
+ {
+ aData.push( oSettings.aoData[i]._aData );
+ }
+ return aData;
+ }
+
+
+ /**
+ * Nuke the table
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnClearTable( oSettings )
+ {
+ oSettings.aoData.splice( 0, oSettings.aoData.length );
+ oSettings.aiDisplayMaster.splice( 0, oSettings.aiDisplayMaster.length );
+ oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length );
+ _fnCalculateEnd( oSettings );
+ }
+
+
+ /**
+ * Take an array of integers (index array) and remove a target integer (value - not
+ * the key!)
+ * @param {array} a Index array to target
+ * @param {int} iTarget value to find
+ * @memberof DataTable#oApi
+ */
+ function _fnDeleteIndex( a, iTarget )
+ {
+ var iTargetIndex = -1;
+
+ for ( var i=0, iLen=a.length ; i<iLen ; i++ )
+ {
+ if ( a[i] == iTarget )
+ {
+ iTargetIndex = i;
+ }
+ else if ( a[i] > iTarget )
+ {
+ a[i]--;
+ }
+ }
+
+ if ( iTargetIndex != -1 )
+ {
+ a.splice( iTargetIndex, 1 );
+ }
+ }
+
+
+ /**
+ * Call the developer defined fnRender function for a given cell (row/column) with
+ * the required parameters and return the result.
+ * @param {object} oSettings dataTables settings object
+ * @param {int} iRow aoData index for the row
+ * @param {int} iCol aoColumns index for the column
+ * @returns {*} Return of the developer's fnRender function
+ * @memberof DataTable#oApi
+ */
+ function _fnRender( oSettings, iRow, iCol )
+ {
+ var oCol = oSettings.aoColumns[iCol];
+
+ return oCol.fnRender( {
+ "iDataRow": iRow,
+ "iDataColumn": iCol,
+ "oSettings": oSettings,
+ "aData": oSettings.aoData[iRow]._aData,
+ "mDataProp": oCol.mData
+ }, _fnGetCellData(oSettings, iRow, iCol, 'display') );
+ }
+ /**
+ * Create a new TR element (and it's TD children) for a row
+ * @param {object} oSettings dataTables settings object
+ * @param {int} iRow Row to consider
+ * @memberof DataTable#oApi
+ */
+ function _fnCreateTr ( oSettings, iRow )
+ {
+ var oData = oSettings.aoData[iRow];
+ var nTd;
+
+ if ( oData.nTr === null )
+ {
+ oData.nTr = document.createElement('tr');
+
+ /* Use a private property on the node to allow reserve mapping from the node
+ * to the aoData array for fast look up
+ */
+ oData.nTr._DT_RowIndex = iRow;
+
+ /* Special parameters can be given by the data source to be used on the row */
+ if ( oData._aData.DT_RowId )
+ {
+ oData.nTr.id = oData._aData.DT_RowId;
+ }
+
+ if ( oData._aData.DT_RowClass )
+ {
+ oData.nTr.className = oData._aData.DT_RowClass;
+ }
+
+ /* Process each column */
+ for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+ {
+ var oCol = oSettings.aoColumns[i];
+ nTd = document.createElement( oCol.sCellType );
+
+ /* Render if needed - if bUseRendered is true then we already have the rendered
+ * value in the data source - so can just use that
+ */
+ nTd.innerHTML = (typeof oCol.fnRender === 'function' && (!oCol.bUseRendered || oCol.mData === null)) ?
+ _fnRender( oSettings, iRow, i ) :
+ _fnGetCellData( oSettings, iRow, i, 'display' );
+
+ /* Add user defined class */
+ if ( oCol.sClass !== null )
+ {
+ nTd.className = oCol.sClass;
+ }
+
+ if ( oCol.bVisible )
+ {
+ oData.nTr.appendChild( nTd );
+ oData._anHidden[i] = null;
+ }
+ else
+ {
+ oData._anHidden[i] = nTd;
+ }
+
+ if ( oCol.fnCreatedCell )
+ {
+ oCol.fnCreatedCell.call( oSettings.oInstance,
+ nTd, _fnGetCellData( oSettings, iRow, i, 'display' ), oData._aData, iRow, i
+ );
+ }
+ }
+
+ _fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [oData.nTr, oData._aData, iRow] );
+ }
+ }
+
+
+ /**
+ * Create the HTML header for the table
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnBuildHead( oSettings )
+ {
+ var i, nTh, iLen, j, jLen;
+ var iThs = $('th, td', oSettings.nTHead).length;
+ var iCorrector = 0;
+ var jqChildren;
+
+ /* If there is a header in place - then use it - otherwise it's going to get nuked... */
+ if ( iThs !== 0 )
+ {
+ /* We've got a thead from the DOM, so remove hidden columns and apply width to vis cols */
+ for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+ {
+ nTh = oSettings.aoColumns[i].nTh;
+ nTh.setAttribute('role', 'columnheader');
+ if ( oSettings.aoColumns[i].bSortable )
+ {
+ nTh.setAttribute('tabindex', oSettings.iTabIndex);
+ nTh.setAttribute('aria-controls', oSettings.sTableId);
+ }
+
+ if ( oSettings.aoColumns[i].sClass !== null )
+ {
+ $(nTh).addClass( oSettings.aoColumns[i].sClass );
+ }
+
+ /* Set the title of the column if it is user defined (not what was auto detected) */
+ if ( oSettings.aoColumns[i].sTitle != nTh.innerHTML )
+ {
+ nTh.innerHTML = oSettings.aoColumns[i].sTitle;
+ }
+ }
+ }
+ else
+ {
+ /* We don't have a header in the DOM - so we are going to have to create one */
+ var nTr = document.createElement( "tr" );
+
+ for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+ {
+ nTh = oSettings.aoColumns[i].nTh;
+ nTh.innerHTML = oSettings.aoColumns[i].sTitle;
+ nTh.setAttribute('tabindex', '0');
+
+ if ( oSettings.aoColumns[i].sClass !== null )
+ {
+ $(nTh).addClass( oSettings.aoColumns[i].sClass );
+ }
+
+ nTr.appendChild( nTh );
+ }
+ $(oSettings.nTHead).html( '' )[0].appendChild( nTr );
+ _fnDetectHeader( oSettings.aoHeader, oSettings.nTHead );
+ }
+
+ /* ARIA role for the rows */
+ $(oSettings.nTHead).children('tr').attr('role', 'row');
+
+ /* Add the extra markup needed by jQuery UI's themes */
+ if ( oSettings.bJUI )
+ {
+ for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+ {
+ nTh = oSettings.aoColumns[i].nTh;
+
+ var nDiv = document.createElement('div');
+ nDiv.className = oSettings.oClasses.sSortJUIWrapper;
+ $(nTh).contents().appendTo(nDiv);
+
+ var nSpan = document.createElement('span');
+ nSpan.className = oSettings.oClasses.sSortIcon;
+ nDiv.appendChild( nSpan );
+ nTh.appendChild( nDiv );
+ }
+ }
+
+ if ( oSettings.oFeatures.bSort )
+ {
+ for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
+ {
+ if ( oSettings.aoColumns[i].bSortable !== false )
+ {
+ _fnSortAttachListener( oSettings, oSettings.aoColumns[i].nTh, i );
+ }
+ else
+ {
+ $(oSettings.aoColumns[i].nTh).addClass( oSettings.oClasses.sSortableNone );
+ }
+ }
+ }
+
+ /* Deal with the footer - add classes if required */
+ if ( oSettings.oClasses.sFooterTH !== "" )
+ {
+ $(oSettings.nTFoot).children('tr').children('th').addClass( oSettings.oClasses.sFooterTH );
+ }
+
+ /* Cache the footer elements */
+ if ( oSettings.nTFoot !== null )
+ {
+ var anCells = _fnGetUniqueThs( oSettings, null, oSettings.aoFooter );
+ for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+ {
+ if ( anCells[i] )
+ {
+ oSettings.aoColumns[i].nTf = anCells[i];
+ if ( oSettings.aoColumns[i].sClass )
+ {
+ $(anCells[i]).addClass( oSettings.aoColumns[i].sClass );
+ }
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Draw the header (or footer) element based on the column visibility states. The
+ * methodology here is to use the layout array from _fnDetectHeader, modified for
+ * the instantaneous column visibility, to construct the new layout. The grid is
+ * traversed over cell at a time in a rows x columns grid fashion, although each
+ * cell insert can cover multiple elements in the grid - which is tracks using the
+ * aApplied array. Cell inserts in the grid will only occur where there isn't
+ * already a cell in that position.
+ * @param {object} oSettings dataTables settings object
+ * @param array {objects} aoSource Layout array from _fnDetectHeader
+ * @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc,
+ * @memberof DataTable#oApi
+ */
+ function _fnDrawHead( oSettings, aoSource, bIncludeHidden )
+ {
+ var i, iLen, j, jLen, k, kLen, n, nLocalTr;
+ var aoLocal = [];
+ var aApplied = [];
+ var iColumns = oSettings.aoColumns.length;
+ var iRowspan, iColspan;
+
+ if ( bIncludeHidden === undefined )
+ {
+ bIncludeHidden = false;
+ }
+
+ /* Make a copy of the master layout array, but without the visible columns in it */
+ for ( i=0, iLen=aoSource.length ; i<iLen ; i++ )
+ {
+ aoLocal[i] = aoSource[i].slice();
+ aoLocal[i].nTr = aoSource[i].nTr;
+
+ /* Remove any columns which are currently hidden */
+ for ( j=iColumns-1 ; j>=0 ; j-- )
+ {
+ if ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden )
+ {
+ aoLocal[i].splice( j, 1 );
+ }
+ }
+
+ /* Prep the applied array - it needs an element for each row */
+ aApplied.push( [] );
+ }
+
+ for ( i=0, iLen=aoLocal.length ; i<iLen ; i++ )
+ {
+ nLocalTr = aoLocal[i].nTr;
+
+ /* All cells are going to be replaced, so empty out the row */
+ if ( nLocalTr )
+ {
+ while( (n = nLocalTr.firstChild) )
+ {
+ nLocalTr.removeChild( n );
+ }
+ }
+
+ for ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ )
+ {
+ iRowspan = 1;
+ iColspan = 1;
+
+ /* Check to see if there is already a cell (row/colspan) covering our target
+ * insert point. If there is, then there is nothing to do.
+ */
+ if ( aApplied[i][j] === undefined )
+ {
+ nLocalTr.appendChild( aoLocal[i][j].cell );
+ aApplied[i][j] = 1;
+
+ /* Expand the cell to cover as many rows as needed */
+ while ( aoLocal[i+iRowspan] !== undefined &&
+ aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell )
+ {
+ aApplied[i+iRowspan][j] = 1;
+ iRowspan++;
+ }
+
+ /* Expand the cell to cover as many columns as needed */
+ while ( aoLocal[i][j+iColspan] !== undefined &&
+ aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell )
+ {
+ /* Must update the applied array over the rows for the columns */
+ for ( k=0 ; k<iRowspan ; k++ )
+ {
+ aApplied[i+k][j+iColspan] = 1;
+ }
+ iColspan++;
+ }
+
+ /* Do the actual expansion in the DOM */
+ aoLocal[i][j].cell.rowSpan = iRowspan;
+ aoLocal[i][j].cell.colSpan = iColspan;
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Insert the required TR nodes into the table for display
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnDraw( oSettings )
+ {
+ /* Provide a pre-callback function which can be used to cancel the draw is false is returned */
+ var aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] );
+ if ( $.inArray( false, aPreDraw ) !== -1 )
+ {
+ _fnProcessingDisplay( oSettings, false );
+ return;
+ }
+
+ var i, iLen, n;
+ var anRows = [];
+ var iRowCount = 0;
+ var iStripes = oSettings.asStripeClasses.length;
+ var iOpenRows = oSettings.aoOpenRows.length;
+
+ oSettings.bDrawing = true;
+
+ /* Check and see if we have an initial draw position from state saving */
+ if ( oSettings.iInitDisplayStart !== undefined && oSettings.iInitDisplayStart != -1 )
+ {
+ if ( oSettings.oFeatures.bServerSide )
+ {
+ oSettings._iDisplayStart = oSettings.iInitDisplayStart;
+ }
+ else
+ {
+ oSettings._iDisplayStart = (oSettings.iInitDisplayStart >= oSettings.fnRecordsDisplay()) ?
+ 0 : oSettings.iInitDisplayStart;
+ }
+ oSettings.iInitDisplayStart = -1;
+ _fnCalculateEnd( oSettings );
+ }
+
+ /* Server-side processing draw intercept */
+ if ( oSettings.bDeferLoading )
+ {
+ oSettings.bDeferLoading = false;
+ oSettings.iDraw++;
+ }
+ else if ( !oSettings.oFeatures.bServerSide )
+ {
+ oSettings.iDraw++;
+ }
+ else if ( !oSettings.bDestroying && !_fnAjaxUpdate( oSettings ) )
+ {
+ return;
+ }
+
+ if ( oSettings.aiDisplay.length !== 0 )
+ {
+ var iStart = oSettings._iDisplayStart;
+ var iEnd = oSettings._iDisplayEnd;
+
+ if ( oSettings.oFeatures.bServerSide )
+ {
+ iStart = 0;
+ iEnd = oSettings.aoData.length;
+ }
+
+ for ( var j=iStart ; j<iEnd ; j++ )
+ {
+ var aoData = oSettings.aoData[ oSettings.aiDisplay[j] ];
+ if ( aoData.nTr === null )
+ {
+ _fnCreateTr( oSettings, oSettings.aiDisplay[j] );
+ }
+
+ var nRow = aoData.nTr;
+
+ /* Remove the old striping classes and then add the new one */
+ if ( iStripes !== 0 )
+ {
+ var sStripe = oSettings.asStripeClasses[ iRowCount % iStripes ];
+ if ( aoData._sRowStripe != sStripe )
+ {
+ $(nRow).removeClass( aoData._sRowStripe ).addClass( sStripe );
+ aoData._sRowStripe = sStripe;
+ }
+ }
+
+ /* Row callback functions - might want to manipulate the row */
+ _fnCallbackFire( oSettings, 'aoRowCallback', null,
+ [nRow, oSettings.aoData[ oSettings.aiDisplay[j] ]._aData, iRowCount, j] );
+
+ anRows.push( nRow );
+ iRowCount++;
+
+ /* If there is an open row - and it is attached to this parent - attach it on redraw */
+ if ( iOpenRows !== 0 )
+ {
+ for ( var k=0 ; k<iOpenRows ; k++ )
+ {
+ if ( nRow == oSettings.aoOpenRows[k].nParent )
+ {
+ anRows.push( oSettings.aoOpenRows[k].nTr );
+ break;
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ /* Table is empty - create a row with an empty message in it */
+ anRows[ 0 ] = document.createElement( 'tr' );
+
+ if ( oSettings.asStripeClasses[0] )
+ {
+ anRows[ 0 ].className = oSettings.asStripeClasses[0];
+ }
+
+ var oLang = oSettings.oLanguage;
+ var sZero = oLang.sZeroRecords;
+ if ( oSettings.iDraw == 1 && oSettings.sAjaxSource !== null && !oSettings.oFeatures.bServerSide )
+ {
+ sZero = oLang.sLoadingRecords;
+ }
+ else if ( oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0 )
+ {
+ sZero = oLang.sEmptyTable;
+ }
+
+ var nTd = document.createElement( 'td' );
+ nTd.setAttribute( 'valign', "top" );
+ nTd.colSpan = _fnVisbleColumns( oSettings );
+ nTd.className = oSettings.oClasses.sRowEmpty;
+ nTd.innerHTML = _fnInfoMacros( oSettings, sZero );
+
+ anRows[ iRowCount ].appendChild( nTd );
+ }
+
+ /* Header and footer callbacks */
+ _fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0],
+ _fnGetDataMaster( oSettings ), oSettings._iDisplayStart, oSettings.fnDisplayEnd(), oSettings.aiDisplay ] );
+
+ _fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0],
+ _fnGetDataMaster( oSettings ), oSettings._iDisplayStart, oSettings.fnDisplayEnd(), oSettings.aiDisplay ] );
+
+ /*
+ * Need to remove any old row from the display - note we can't just empty the tbody using
+ * $().html('') since this will unbind the jQuery event handlers (even although the node
+ * still exists!) - equally we can't use innerHTML, since IE throws an exception.
+ */
+ var
+ nAddFrag = document.createDocumentFragment(),
+ nRemoveFrag = document.createDocumentFragment(),
+ nBodyPar, nTrs;
+
+ if ( oSettings.nTBody )
+ {
+ nBodyPar = oSettings.nTBody.parentNode;
+ nRemoveFrag.appendChild( oSettings.nTBody );
+
+ /* When doing infinite scrolling, only remove child rows when sorting, filtering or start
+ * up. When not infinite scroll, always do it.
+ */
+ if ( !oSettings.oScroll.bInfinite || !oSettings._bInitComplete ||
+ oSettings.bSorted || oSettings.bFiltered )
+ {
+ while( (n = oSettings.nTBody.firstChild) )
+ {
+ oSettings.nTBody.removeChild( n );
+ }
+ }
+
+ /* Put the draw table into the dom */
+ for ( i=0, iLen=anRows.length ; i<iLen ; i++ )
+ {
+ nAddFrag.appendChild( anRows[i] );
+ }
+
+ oSettings.nTBody.appendChild( nAddFrag );
+ if ( nBodyPar !== null )
+ {
+ nBodyPar.appendChild( oSettings.nTBody );
+ }
+ }
+
+ /* Call all required callback functions for the end of a draw */
+ _fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] );
+
+ /* Draw is complete, sorting and filtering must be as well */
+ oSettings.bSorted = false;
+ oSettings.bFiltered = false;
+ oSettings.bDrawing = false;
+
+ if ( oSettings.oFeatures.bServerSide )
+ {
+ _fnProcessingDisplay( oSettings, false );
+ if ( !oSettings._bInitComplete )
+ {
+ _fnInitComplete( oSettings );
+ }
+ }
+ }
+
+
+ /**
+ * Redraw the table - taking account of the various features which are enabled
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnReDraw( oSettings )
+ {
+ if ( oSettings.oFeatures.bSort )
+ {
+ /* Sorting will refilter and draw for us */
+ _fnSort( oSettings, oSettings.oPreviousSearch );
+ }
+ else if ( oSettings.oFeatures.bFilter )
+ {
+ /* Filtering will redraw for us */
+ _fnFilterComplete( oSettings, oSettings.oPreviousSearch );
+ }
+ else
+ {
+ _fnCalculateEnd( oSettings );
+ _fnDraw( oSettings );
+ }
+ }
+
+
+ /**
+ * Add the options to the page HTML for the table
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnAddOptionsHtml ( oSettings )
+ {
+ /*
+ * Create a temporary, empty, div which we can later on replace with what we have generated
+ * we do it this way to rendering the 'options' html offline - speed :-)
+ */
+ var nHolding = $('<div></div>')[0];
+ oSettings.nTable.parentNode.insertBefore( nHolding, oSettings.nTable );
+
+ /*
+ * All DataTables are wrapped in a div
+ */
+ oSettings.nTableWrapper = $('<div id="'+oSettings.sTableId+'_wrapper" class="'+oSettings.oClasses.sWrapper+'" role="grid"></div>')[0];
+ oSettings.nTableReinsertBefore = oSettings.nTable.nextSibling;
+
+ /* Track where we want to insert the option */
+ var nInsertNode = oSettings.nTableWrapper;
+
+ /* Loop over the user set positioning and place the elements as needed */
+ var aDom = oSettings.sDom.split('');
+ var nTmp, iPushFeature, cOption, nNewNode, cNext, sAttr, j;
+ for ( var i=0 ; i<aDom.length ; i++ )
+ {
+ iPushFeature = 0;
+ cOption = aDom[i];
+
+ if ( cOption == '<' )
+ {
+ /* New container div */
+ nNewNode = $('<div></div>')[0];
+
+ /* Check to see if we should append an id and/or a class name to the container */
+ cNext = aDom[i+1];
+ if ( cNext == "'" || cNext == '"' )
+ {
+ sAttr = "";
+ j = 2;
+ while ( aDom[i+j] != cNext )
+ {
+ sAttr += aDom[i+j];
+ j++;
+ }
+
+ /* Replace jQuery UI constants */
+ if ( sAttr == "H" )
+ {
+ sAttr = oSettings.oClasses.sJUIHeader;
+ }
+ else if ( sAttr == "F" )
+ {
+ sAttr = oSettings.oClasses.sJUIFooter;
+ }
+
+ /* The attribute can be in the format of "#id.class", "#id" or "class" This logic
+ * breaks the string into parts and applies them as needed
+ */
+ if ( sAttr.indexOf('.') != -1 )
+ {
+ var aSplit = sAttr.split('.');
+ nNewNode.id = aSplit[0].substr(1, aSplit[0].length-1);
+ nNewNode.className = aSplit[1];
+ }
+ else if ( sAttr.charAt(0) == "#" )
+ {
+ nNewNode.id = sAttr.substr(1, sAttr.length-1);
+ }
+ else
+ {
+ nNewNode.className = sAttr;
+ }
+
+ i += j; /* Move along the position array */
+ }
+
+ nInsertNode.appendChild( nNewNode );
+ nInsertNode = nNewNode;
+ }
+ else if ( cOption == '>' )
+ {
+ /* End container div */
+ nInsertNode = nInsertNode.parentNode;
+ }
+ else if ( cOption == 'l' && oSettings.oFeatures.bPaginate && oSettings.oFeatures.bLengthChange )
+ {
+ /* Length */
+ nTmp = _fnFeatureHtmlLength( oSettings );
+ iPushFeature = 1;
+ }
+ else if ( cOption == 'f' && oSettings.oFeatures.bFilter )
+ {
+ /* Filter */
+ nTmp = _fnFeatureHtmlFilter( oSettings );
+ iPushFeature = 1;
+ }
+ else if ( cOption == 'r' && oSettings.oFeatures.bProcessing )
+ {
+ /* pRocessing */
+ nTmp = _fnFeatureHtmlProcessing( oSettings );
+ iPushFeature = 1;
+ }
+ else if ( cOption == 't' )
+ {
+ /* Table */
+ nTmp = _fnFeatureHtmlTable( oSettings );
+ iPushFeature = 1;
+ }
+ else if ( cOption == 'i' && oSettings.oFeatures.bInfo )
+ {
+ /* Info */
+ nTmp = _fnFeatureHtmlInfo( oSettings );
+ iPushFeature = 1;
+ }
+ else if ( cOption == 'p' && oSettings.oFeatures.bPaginate )
+ {
+ /* Pagination */
+ nTmp = _fnFeatureHtmlPaginate( oSettings );
+ iPushFeature = 1;
+ }
+ else if ( DataTable.ext.aoFeatures.length !== 0 )
+ {
+ /* Plug-in features */
+ var aoFeatures = DataTable.ext.aoFeatures;
+ for ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ )
+ {
+ if ( cOption == aoFeatures[k].cFeature )
+ {
+ nTmp = aoFeatures[k].fnInit( oSettings );
+ if ( nTmp )
+ {
+ iPushFeature = 1;
+ }
+ break;
+ }
+ }
+ }
+
+ /* Add to the 2D features array */
+ if ( iPushFeature == 1 && nTmp !== null )
+ {
+ if ( typeof oSettings.aanFeatures[cOption] !== 'object' )
+ {
+ oSettings.aanFeatures[cOption] = [];
+ }
+ oSettings.aanFeatures[cOption].push( nTmp );
+ nInsertNode.appendChild( nTmp );
+ }
+ }
+
+ /* Built our DOM structure - replace the holding div with what we want */
+ nHolding.parentNode.replaceChild( oSettings.nTableWrapper, nHolding );
+ }
+
+
+ /**
+ * Use the DOM source to create up an array of header cells. The idea here is to
+ * create a layout grid (array) of rows x columns, which contains a reference
+ * to the cell that that point in the grid (regardless of col/rowspan), such that
+ * any column / row could be removed and the new grid constructed
+ * @param array {object} aLayout Array to store the calculated layout in
+ * @param {node} nThead The header/footer element for the table
+ * @memberof DataTable#oApi
+ */
+ function _fnDetectHeader ( aLayout, nThead )
+ {
+ var nTrs = $(nThead).children('tr');
+ var nTr, nCell;
+ var i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan;
+ var bUnique;
+ var fnShiftCol = function ( a, i, j ) {
+ var k = a[i];
+ while ( k[j] ) {
+ j++;
+ }
+ return j;
+ };
+
+ aLayout.splice( 0, aLayout.length );
+
+ /* We know how many rows there are in the layout - so prep it */
+ for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
+ {
+ aLayout.push( [] );
+ }
+
+ /* Calculate a layout array */
+ for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
+ {
+ nTr = nTrs[i];
+ iColumn = 0;
+
+ /* For every cell in the row... */
+ nCell = nTr.firstChild;
+ while ( nCell ) {
+ if ( nCell.nodeName.toUpperCase() == "TD" ||
+ nCell.nodeName.toUpperCase() == "TH" )
+ {
+ /* Get the col and rowspan attributes from the DOM and sanitise them */
+ iColspan = nCell.getAttribute('colspan') * 1;
+ iRowspan = nCell.getAttribute('rowspan') * 1;
+ iColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan;
+ iRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan;
+
+ /* There might be colspan cells already in this row, so shift our target
+ * accordingly
+ */
+ iColShifted = fnShiftCol( aLayout, i, iColumn );
+
+ /* Cache calculation for unique columns */
+ bUnique = iColspan === 1 ? true : false;
+
+ /* If there is col / rowspan, copy the information into the layout grid */
+ for ( l=0 ; l<iColspan ; l++ )
+ {
+ for ( k=0 ; k<iRowspan ; k++ )
+ {
+ aLayout[i+k][iColShifted+l] = {
+ "cell": nCell,
+ "unique": bUnique
+ };
+ aLayout[i+k].nTr = nTr;
+ }
+ }
+ }
+ nCell = nCell.nextSibling;
+ }
+ }
+ }
+
+
+ /**
+ * Get an array of unique th elements, one for each column
+ * @param {object} oSettings dataTables settings object
+ * @param {node} nHeader automatically detect the layout from this node - optional
+ * @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional
+ * @returns array {node} aReturn list of unique th's
+ * @memberof DataTable#oApi
+ */
+ function _fnGetUniqueThs ( oSettings, nHeader, aLayout )
+ {
+ var aReturn = [];
+ if ( !aLayout )
+ {
+ aLayout = oSettings.aoHeader;
+ if ( nHeader )
+ {
+ aLayout = [];
+ _fnDetectHeader( aLayout, nHeader );
+ }
+ }
+
+ for ( var i=0, iLen=aLayout.length ; i<iLen ; i++ )
+ {
+ for ( var j=0, jLen=aLayout[i].length ; j<jLen ; j++ )
+ {
+ if ( aLayout[i][j].unique &&
+ (!aReturn[j] || !oSettings.bSortCellsTop) )
+ {
+ aReturn[j] = aLayout[i][j].cell;
+ }
+ }
+ }
+
+ return aReturn;
+ }
+
+
+
+ /**
+ * Update the table using an Ajax call
+ * @param {object} oSettings dataTables settings object
+ * @returns {boolean} Block the table drawing or not
+ * @memberof DataTable#oApi
+ */
+ function _fnAjaxUpdate( oSettings )
+ {
+ if ( oSettings.bAjaxDataGet )
+ {
+ oSettings.iDraw++;
+ _fnProcessingDisplay( oSettings, true );
+ var iColumns = oSettings.aoColumns.length;
+ var aoData = _fnAjaxParameters( oSettings );
+ _fnServerParams( oSettings, aoData );
+
+ oSettings.fnServerData.call( oSettings.oInstance, oSettings.sAjaxSource, aoData,
+ function(json) {
+ _fnAjaxUpdateDraw( oSettings, json );
+ }, oSettings );
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+ }
+
+
+ /**
+ * Build up the parameters in an object needed for a server-side processing request
+ * @param {object} oSettings dataTables settings object
+ * @returns {bool} block the table drawing or not
+ * @memberof DataTable#oApi
+ */
+ function _fnAjaxParameters( oSettings )
+ {
+ var iColumns = oSettings.aoColumns.length;
+ var aoData = [], mDataProp, aaSort, aDataSort;
+ var i, j;
+
+ aoData.push( { "name": "sEcho", "value": oSettings.iDraw } );
+ aoData.push( { "name": "iColumns", "value": iColumns } );
+ aoData.push( { "name": "sColumns", "value": _fnColumnOrdering(oSettings) } );
+ aoData.push( { "name": "iDisplayStart", "value": oSettings._iDisplayStart } );
+ aoData.push( { "name": "iDisplayLength", "value": oSettings.oFeatures.bPaginate !== false ?
+ oSettings._iDisplayLength : -1 } );
+
+ for ( i=0 ; i<iColumns ; i++ )
+ {
+ mDataProp = oSettings.aoColumns[i].mData;
+ aoData.push( { "name": "mDataProp_"+i, "value": typeof(mDataProp)==="function" ? 'function' : mDataProp } );
+ }
+
+ /* Filtering */
+ if ( oSettings.oFeatures.bFilter !== false )
+ {
+ aoData.push( { "name": "sSearch", "value": oSettings.oPreviousSearch.sSearch } );
+ aoData.push( { "name": "bRegex", "value": oSettings.oPreviousSearch.bRegex } );
+ for ( i=0 ; i<iColumns ; i++ )
+ {
+ aoData.push( { "name": "sSearch_"+i, "value": oSettings.aoPreSearchCols[i].sSearch } );
+ aoData.push( { "name": "bRegex_"+i, "value": oSettings.aoPreSearchCols[i].bRegex } );
+ aoData.push( { "name": "bSearchable_"+i, "value": oSettings.aoColumns[i].bSearchable } );
+ }
+ }
+
+ /* Sorting */
+ if ( oSettings.oFeatures.bSort !== false )
+ {
+ var iCounter = 0;
+
+ aaSort = ( oSettings.aaSortingFixed !== null ) ?
+ oSettings.aaSortingFixed.concat( oSettings.aaSorting ) :
+ oSettings.aaSorting.slice();
+
+ for ( i=0 ; i<aaSort.length ; i++ )
+ {
+ aDataSort = oSettings.aoColumns[ aaSort[i][0] ].aDataSort;
+
+ for ( j=0 ; j<aDataSort.length ; j++ )
+ {
+ aoData.push( { "name": "iSortCol_"+iCounter, "value": aDataSort[j] } );
+ aoData.push( { "name": "sSortDir_"+iCounter, "value": aaSort[i][1] } );
+ iCounter++;
+ }
+ }
+ aoData.push( { "name": "iSortingCols", "value": iCounter } );
+
+ for ( i=0 ; i<iColumns ; i++ )
+ {
+ aoData.push( { "name": "bSortable_"+i, "value": oSettings.aoColumns[i].bSortable } );
+ }
+ }
+
+ return aoData;
+ }
+
+
+ /**
+ * Add Ajax parameters from plug-ins
+ * @param {object} oSettings dataTables settings object
+ * @param array {objects} aoData name/value pairs to send to the server
+ * @memberof DataTable#oApi
+ */
+ function _fnServerParams( oSettings, aoData )
+ {
+ _fnCallbackFire( oSettings, 'aoServerParams', 'serverParams', [aoData] );
+ }
+
+
+ /**
+ * Data the data from the server (nuking the old) and redraw the table
+ * @param {object} oSettings dataTables settings object
+ * @param {object} json json data return from the server.
+ * @param {string} json.sEcho Tracking flag for DataTables to match requests
+ * @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering
+ * @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering
+ * @param {array} json.aaData The data to display on this page
+ * @param {string} [json.sColumns] Column ordering (sName, comma separated)
+ * @memberof DataTable#oApi
+ */
+ function _fnAjaxUpdateDraw ( oSettings, json )
+ {
+ if ( json.sEcho !== undefined )
+ {
+ /* Protect against old returns over-writing a new one. Possible when you get
+ * very fast interaction, and later queries are completed much faster
+ */
+ if ( json.sEcho*1 < oSettings.iDraw )
+ {
+ return;
+ }
+ else
+ {
+ oSettings.iDraw = json.sEcho * 1;
+ }
+ }
+
+ if ( !oSettings.oScroll.bInfinite ||
+ (oSettings.oScroll.bInfinite && (oSettings.bSorted || oSettings.bFiltered)) )
+ {
+ _fnClearTable( oSettings );
+ }
+ oSettings._iRecordsTotal = parseInt(json.iTotalRecords, 10);
+ oSettings._iRecordsDisplay = parseInt(json.iTotalDisplayRecords, 10);
+
+ /* Determine if reordering is required */
+ var sOrdering = _fnColumnOrdering(oSettings);
+ var bReOrder = (json.sColumns !== undefined && sOrdering !== "" && json.sColumns != sOrdering );
+ var aiIndex;
+ if ( bReOrder )
+ {
+ aiIndex = _fnReOrderIndex( oSettings, json.sColumns );
+ }
+
+ var aData = _fnGetObjectDataFn( oSettings.sAjaxDataProp )( json );
+ for ( var i=0, iLen=aData.length ; i<iLen ; i++ )
+ {
+ if ( bReOrder )
+ {
+ /* If we need to re-order, then create a new array with the correct order and add it */
+ var aDataSorted = [];
+ for ( var j=0, jLen=oSettings.aoColumns.length ; j<jLen ; j++ )
+ {
+ aDataSorted.push( aData[i][ aiIndex[j] ] );
+ }
+ _fnAddData( oSettings, aDataSorted );
+ }
+ else
+ {
+ /* No re-order required, sever got it "right" - just straight add */
+ _fnAddData( oSettings, aData[i] );
+ }
+ }
+ oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
+
+ oSettings.bAjaxDataGet = false;
+ _fnDraw( oSettings );
+ oSettings.bAjaxDataGet = true;
+ _fnProcessingDisplay( oSettings, false );
+ }
+
+
+
+ /**
+ * Generate the node required for filtering text
+ * @returns {node} Filter control element
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnFeatureHtmlFilter ( oSettings )
+ {
+ var oPreviousSearch = oSettings.oPreviousSearch;
+
+ var sSearchStr = oSettings.oLanguage.sSearch;
+ sSearchStr = (sSearchStr.indexOf('_INPUT_') !== -1) ?
+ sSearchStr.replace('_INPUT_', '<input type="text" />') :
+ sSearchStr==="" ? '<input type="text" />' : sSearchStr+' <input type="text" />';
+
+ var nFilter = document.createElement( 'div' );
+ nFilter.className = oSettings.oClasses.sFilter;
+ nFilter.innerHTML = '<label>'+sSearchStr+'</label>';
+ if ( !oSettings.aanFeatures.f )
+ {
+ nFilter.id = oSettings.sTableId+'_filter';
+ }
+
+ var jqFilter = $('input[type="text"]', nFilter);
+
+ // Store a reference to the input element, so other input elements could be
+ // added to the filter wrapper if needed (submit button for example)
+ nFilter._DT_Input = jqFilter[0];
+
+ jqFilter.val( oPreviousSearch.sSearch.replace('"','&quot;') );
+ jqFilter.bind( 'keyup.DT', function(e) {
+ /* Update all other filter input elements for the new display */
+ var n = oSettings.aanFeatures.f;
+ var val = this.value==="" ? "" : this.value; // mental IE8 fix :-(
+
+ for ( var i=0, iLen=n.length ; i<iLen ; i++ )
+ {
+ if ( n[i] != $(this).parents('div.dataTables_filter')[0] )
+ {
+ $(n[i]._DT_Input).val( val );
+ }
+ }
+
+ /* Now do the filter */
+ if ( val != oPreviousSearch.sSearch )
+ {
+ _fnFilterComplete( oSettings, {
+ "sSearch": val,
+ "bRegex": oPreviousSearch.bRegex,
+ "bSmart": oPreviousSearch.bSmart ,
+ "bCaseInsensitive": oPreviousSearch.bCaseInsensitive
+ } );
+ }
+ } );
+
+ jqFilter
+ .attr('aria-controls', oSettings.sTableId)
+ .bind( 'keypress.DT', function(e) {
+ /* Prevent form submission */
+ if ( e.keyCode == 13 )
+ {
+ return false;
+ }
+ }
+ );
+
+ return nFilter;
+ }
+
+
+ /**
+ * Filter the table using both the global filter and column based filtering
+ * @param {object} oSettings dataTables settings object
+ * @param {object} oSearch search information
+ * @param {int} [iForce] force a research of the master array (1) or not (undefined or 0)
+ * @memberof DataTable#oApi
+ */
+ function _fnFilterComplete ( oSettings, oInput, iForce )
+ {
+ var oPrevSearch = oSettings.oPreviousSearch;
+ var aoPrevSearch = oSettings.aoPreSearchCols;
+ var fnSaveFilter = function ( oFilter ) {
+ /* Save the filtering values */
+ oPrevSearch.sSearch = oFilter.sSearch;
+ oPrevSearch.bRegex = oFilter.bRegex;
+ oPrevSearch.bSmart = oFilter.bSmart;
+ oPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive;
+ };
+
+ /* In server-side processing all filtering is done by the server, so no point hanging around here */
+ if ( !oSettings.oFeatures.bServerSide )
+ {
+ /* Global filter */
+ _fnFilter( oSettings, oInput.sSearch, iForce, oInput.bRegex, oInput.bSmart, oInput.bCaseInsensitive );
+ fnSaveFilter( oInput );
+
+ /* Now do the individual column filter */
+ for ( var i=0 ; i<oSettings.aoPreSearchCols.length ; i++ )
+ {
+ _fnFilterColumn( oSettings, aoPrevSearch[i].sSearch, i, aoPrevSearch[i].bRegex,
+ aoPrevSearch[i].bSmart, aoPrevSearch[i].bCaseInsensitive );
+ }
+
+ /* Custom filtering */
+ _fnFilterCustom( oSettings );
+ }
+ else
+ {
+ fnSaveFilter( oInput );
+ }
+
+ /* Tell the draw function we have been filtering */
+ oSettings.bFiltered = true;
+ $(oSettings.oInstance).trigger('filter', oSettings);
+
+ /* Redraw the table */
+ oSettings._iDisplayStart = 0;
+ _fnCalculateEnd( oSettings );
+ _fnDraw( oSettings );
+
+ /* Rebuild search array 'offline' */
+ _fnBuildSearchArray( oSettings, 0 );
+ }
+
+
+ /**
+ * Apply custom filtering functions
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnFilterCustom( oSettings )
+ {
+ var afnFilters = DataTable.ext.afnFiltering;
+ var aiFilterColumns = _fnGetColumns( oSettings, 'bSearchable' );
+
+ for ( var i=0, iLen=afnFilters.length ; i<iLen ; i++ )
+ {
+ var iCorrector = 0;
+ for ( var j=0, jLen=oSettings.aiDisplay.length ; j<jLen ; j++ )
+ {
+ var iDisIndex = oSettings.aiDisplay[j-iCorrector];
+ var bTest = afnFilters[i](
+ oSettings,
+ _fnGetRowData( oSettings, iDisIndex, 'filter', aiFilterColumns ),
+ iDisIndex
+ );
+
+ /* Check if we should use this row based on the filtering function */
+ if ( !bTest )
+ {
+ oSettings.aiDisplay.splice( j-iCorrector, 1 );
+ iCorrector++;
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Filter the table on a per-column basis
+ * @param {object} oSettings dataTables settings object
+ * @param {string} sInput string to filter on
+ * @param {int} iColumn column to filter
+ * @param {bool} bRegex treat search string as a regular expression or not
+ * @param {bool} bSmart use smart filtering or not
+ * @param {bool} bCaseInsensitive Do case insenstive matching or not
+ * @memberof DataTable#oApi
+ */
+ function _fnFilterColumn ( oSettings, sInput, iColumn, bRegex, bSmart, bCaseInsensitive )
+ {
+ if ( sInput === "" )
+ {
+ return;
+ }
+
+ var iIndexCorrector = 0;
+ var rpSearch = _fnFilterCreateSearch( sInput, bRegex, bSmart, bCaseInsensitive );
+
+ for ( var i=oSettings.aiDisplay.length-1 ; i>=0 ; i-- )
+ {
+ var sData = _fnDataToSearch( _fnGetCellData( oSettings, oSettings.aiDisplay[i], iColumn, 'filter' ),
+ oSettings.aoColumns[iColumn].sType );
+ if ( ! rpSearch.test( sData ) )
+ {
+ oSettings.aiDisplay.splice( i, 1 );
+ iIndexCorrector++;
+ }
+ }
+ }
+
+
+ /**
+ * Filter the data table based on user input and draw the table
+ * @param {object} oSettings dataTables settings object
+ * @param {string} sInput string to filter on
+ * @param {int} iForce optional - force a research of the master array (1) or not (undefined or 0)
+ * @param {bool} bRegex treat as a regular expression or not
+ * @param {bool} bSmart perform smart filtering or not
+ * @param {bool} bCaseInsensitive Do case insenstive matching or not
+ * @memberof DataTable#oApi
+ */
+ function _fnFilter( oSettings, sInput, iForce, bRegex, bSmart, bCaseInsensitive )
+ {
+ var i;
+ var rpSearch = _fnFilterCreateSearch( sInput, bRegex, bSmart, bCaseInsensitive );
+ var oPrevSearch = oSettings.oPreviousSearch;
+
+ /* Check if we are forcing or not - optional parameter */
+ if ( !iForce )
+ {
+ iForce = 0;
+ }
+
+ /* Need to take account of custom filtering functions - always filter */
+ if ( DataTable.ext.afnFiltering.length !== 0 )
+ {
+ iForce = 1;
+ }
+
+ /*
+ * If the input is blank - we want the full data set
+ */
+ if ( sInput.length <= 0 )
+ {
+ oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length);
+ oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
+ }
+ else
+ {
+ /*
+ * We are starting a new search or the new search string is smaller
+ * then the old one (i.e. delete). Search from the master array
+ */
+ if ( oSettings.aiDisplay.length == oSettings.aiDisplayMaster.length ||
+ oPrevSearch.sSearch.length > sInput.length || iForce == 1 ||
+ sInput.indexOf(oPrevSearch.sSearch) !== 0 )
+ {
+ /* Nuke the old display array - we are going to rebuild it */
+ oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length);
+
+ /* Force a rebuild of the search array */
+ _fnBuildSearchArray( oSettings, 1 );
+
+ /* Search through all records to populate the search array
+ * The the oSettings.aiDisplayMaster and asDataSearch arrays have 1 to 1
+ * mapping
+ */
+ for ( i=0 ; i<oSettings.aiDisplayMaster.length ; i++ )
+ {
+ if ( rpSearch.test(oSettings.asDataSearch[i]) )
+ {
+ oSettings.aiDisplay.push( oSettings.aiDisplayMaster[i] );
+ }
+ }
+ }
+ else
+ {
+ /* Using old search array - refine it - do it this way for speed
+ * Don't have to search the whole master array again
+ */
+ var iIndexCorrector = 0;
+
+ /* Search the current results */
+ for ( i=0 ; i<oSettings.asDataSearch.length ; i++ )
+ {
+ if ( ! rpSearch.test(oSettings.asDataSearch[i]) )
+ {
+ oSettings.aiDisplay.splice( i-iIndexCorrector, 1 );
+ iIndexCorrector++;
+ }
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Create an array which can be quickly search through
+ * @param {object} oSettings dataTables settings object
+ * @param {int} iMaster use the master data array - optional
+ * @memberof DataTable#oApi
+ */
+ function _fnBuildSearchArray ( oSettings, iMaster )
+ {
+ if ( !oSettings.oFeatures.bServerSide )
+ {
+ /* Clear out the old data */
+ oSettings.asDataSearch = [];
+
+ var aiFilterColumns = _fnGetColumns( oSettings, 'bSearchable' );
+ var aiIndex = (iMaster===1) ?
+ oSettings.aiDisplayMaster :
+ oSettings.aiDisplay;
+
+ for ( var i=0, iLen=aiIndex.length ; i<iLen ; i++ )
+ {
+ oSettings.asDataSearch[i] = _fnBuildSearchRow(
+ oSettings,
+ _fnGetRowData( oSettings, aiIndex[i], 'filter', aiFilterColumns )
+ );
+ }
+ }
+ }
+
+
+ /**
+ * Create a searchable string from a single data row
+ * @param {object} oSettings dataTables settings object
+ * @param {array} aData Row data array to use for the data to search
+ * @memberof DataTable#oApi
+ */
+ function _fnBuildSearchRow( oSettings, aData )
+ {
+ var sSearch = aData.join(' ');
+
+ /* If it looks like there is an HTML entity in the string, attempt to decode it */
+ if ( sSearch.indexOf('&') !== -1 )
+ {
+ sSearch = $('<div>').html(sSearch).text();
+ }
+
+ // Strip newline characters
+ return sSearch.replace( /[\n\r]/g, " " );
+ }
+
+ /**
+ * Build a regular expression object suitable for searching a table
+ * @param {string} sSearch string to search for
+ * @param {bool} bRegex treat as a regular expression or not
+ * @param {bool} bSmart perform smart filtering or not
+ * @param {bool} bCaseInsensitive Do case insensitive matching or not
+ * @returns {RegExp} constructed object
+ * @memberof DataTable#oApi
+ */
+ function _fnFilterCreateSearch( sSearch, bRegex, bSmart, bCaseInsensitive )
+ {
+ var asSearch, sRegExpString;
+
+ if ( bSmart )
+ {
+ /* Generate the regular expression to use. Something along the lines of:
+ * ^(?=.*?\bone\b)(?=.*?\btwo\b)(?=.*?\bthree\b).*$
+ */
+ asSearch = bRegex ? sSearch.split( ' ' ) : _fnEscapeRegex( sSearch ).split( ' ' );
+ sRegExpString = '^(?=.*?'+asSearch.join( ')(?=.*?' )+').*$';
+ return new RegExp( sRegExpString, bCaseInsensitive ? "i" : "" );
+ }
+ else
+ {
+ sSearch = bRegex ? sSearch : _fnEscapeRegex( sSearch );
+ return new RegExp( sSearch, bCaseInsensitive ? "i" : "" );
+ }
+ }
+
+
+ /**
+ * Convert raw data into something that the user can search on
+ * @param {string} sData data to be modified
+ * @param {string} sType data type
+ * @returns {string} search string
+ * @memberof DataTable#oApi
+ */
+ function _fnDataToSearch ( sData, sType )
+ {
+ if ( typeof DataTable.ext.ofnSearch[sType] === "function" )
+ {
+ return DataTable.ext.ofnSearch[sType]( sData );
+ }
+ else if ( sData === null )
+ {
+ return '';
+ }
+ else if ( sType == "html" )
+ {
+ return sData.replace(/[\r\n]/g," ").replace( /<.*?>/g, "" );
+ }
+ else if ( typeof sData === "string" )
+ {
+ return sData.replace(/[\r\n]/g," ");
+ }
+ return sData;
+ }
+
+
+ /**
+ * scape a string such that it can be used in a regular expression
+ * @param {string} sVal string to escape
+ * @returns {string} escaped string
+ * @memberof DataTable#oApi
+ */
+ function _fnEscapeRegex ( sVal )
+ {
+ var acEscape = [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^', '-' ];
+ var reReplace = new RegExp( '(\\' + acEscape.join('|\\') + ')', 'g' );
+ return sVal.replace(reReplace, '\\$1');
+ }
+
+
+ /**
+ * Generate the node required for the info display
+ * @param {object} oSettings dataTables settings object
+ * @returns {node} Information element
+ * @memberof DataTable#oApi
+ */
+ function _fnFeatureHtmlInfo ( oSettings )
+ {
+ var nInfo = document.createElement( 'div' );
+ nInfo.className = oSettings.oClasses.sInfo;
+
+ /* Actions that are to be taken once only for this feature */
+ if ( !oSettings.aanFeatures.i )
+ {
+ /* Add draw callback */
+ oSettings.aoDrawCallback.push( {
+ "fn": _fnUpdateInfo,
+ "sName": "information"
+ } );
+
+ /* Add id */
+ nInfo.id = oSettings.sTableId+'_info';
+ }
+ oSettings.nTable.setAttribute( 'aria-describedby', oSettings.sTableId+'_info' );
+
+ return nInfo;
+ }
+
+
+ /**
+ * Update the information elements in the display
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnUpdateInfo ( oSettings )
+ {
+ /* Show information about the table */
+ if ( !oSettings.oFeatures.bInfo || oSettings.aanFeatures.i.length === 0 )
+ {
+ return;
+ }
+
+ var
+ oLang = oSettings.oLanguage,
+ iStart = oSettings._iDisplayStart+1,
+ iEnd = oSettings.fnDisplayEnd(),
+ iMax = oSettings.fnRecordsTotal(),
+ iTotal = oSettings.fnRecordsDisplay(),
+ sOut;
+
+ if ( iTotal === 0 )
+ {
+ /* Empty record set */
+ sOut = oLang.sInfoEmpty;
+ }
+ else {
+ /* Normal record set */
+ sOut = oLang.sInfo;
+ }
+
+ if ( iTotal != iMax )
+ {
+ /* Record set after filtering */
+ sOut += ' ' + oLang.sInfoFiltered;
+ }
+
+ // Convert the macros
+ sOut += oLang.sInfoPostFix;
+ sOut = _fnInfoMacros( oSettings, sOut );
+
+ if ( oLang.fnInfoCallback !== null )
+ {
+ sOut = oLang.fnInfoCallback.call( oSettings.oInstance,
+ oSettings, iStart, iEnd, iMax, iTotal, sOut );
+ }
+
+ var n = oSettings.aanFeatures.i;
+ for ( var i=0, iLen=n.length ; i<iLen ; i++ )
+ {
+ $(n[i]).html( sOut );
+ }
+ }
+
+
+ function _fnInfoMacros ( oSettings, str )
+ {
+ var
+ iStart = oSettings._iDisplayStart+1,
+ sStart = oSettings.fnFormatNumber( iStart ),
+ iEnd = oSettings.fnDisplayEnd(),
+ sEnd = oSettings.fnFormatNumber( iEnd ),
+ iTotal = oSettings.fnRecordsDisplay(),
+ sTotal = oSettings.fnFormatNumber( iTotal ),
+ iMax = oSettings.fnRecordsTotal(),
+ sMax = oSettings.fnFormatNumber( iMax );
+
+ // When infinite scrolling, we are always starting at 1. _iDisplayStart is used only
+ // internally
+ if ( oSettings.oScroll.bInfinite )
+ {
+ sStart = oSettings.fnFormatNumber( 1 );
+ }
+
+ return str.
+ replace(/_START_/g, sStart).
+ replace(/_END_/g, sEnd).
+ replace(/_TOTAL_/g, sTotal).
+ replace(/_MAX_/g, sMax);
+ }
+
+
+
+ /**
+ * Draw the table for the first time, adding all required features
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnInitialise ( oSettings )
+ {
+ var i, iLen, iAjaxStart=oSettings.iInitDisplayStart;
+
+ /* Ensure that the table data is fully initialised */
+ if ( oSettings.bInitialised === false )
+ {
+ setTimeout( function(){ _fnInitialise( oSettings ); }, 200 );
+ return;
+ }
+
+ /* Show the display HTML options */
+ _fnAddOptionsHtml( oSettings );
+
+ /* Build and draw the header / footer for the table */
+ _fnBuildHead( oSettings );
+ _fnDrawHead( oSettings, oSettings.aoHeader );
+ if ( oSettings.nTFoot )
+ {
+ _fnDrawHead( oSettings, oSettings.aoFooter );
+ }
+
+ /* Okay to show that something is going on now */
+ _fnProcessingDisplay( oSettings, true );
+
+ /* Calculate sizes for columns */
+ if ( oSettings.oFeatures.bAutoWidth )
+ {
+ _fnCalculateColumnWidths( oSettings );
+ }
+
+ for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+ {
+ if ( oSettings.aoColumns[i].sWidth !== null )
+ {
+ oSettings.aoColumns[i].nTh.style.width = _fnStringToCss( oSettings.aoColumns[i].sWidth );
+ }
+ }
+
+ /* If there is default sorting required - let's do it. The sort function will do the
+ * drawing for us. Otherwise we draw the table regardless of the Ajax source - this allows
+ * the table to look initialised for Ajax sourcing data (show 'loading' message possibly)
+ */
+ if ( oSettings.oFeatures.bSort )
+ {
+ _fnSort( oSettings );
+ }
+ else if ( oSettings.oFeatures.bFilter )
+ {
+ _fnFilterComplete( oSettings, oSettings.oPreviousSearch );
+ }
+ else
+ {
+ oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
+ _fnCalculateEnd( oSettings );
+ _fnDraw( oSettings );
+ }
+
+ /* if there is an ajax source load the data */
+ if ( oSettings.sAjaxSource !== null && !oSettings.oFeatures.bServerSide )
+ {
+ var aoData = [];
+ _fnServerParams( oSettings, aoData );
+ oSettings.fnServerData.call( oSettings.oInstance, oSettings.sAjaxSource, aoData, function(json) {
+ var aData = (oSettings.sAjaxDataProp !== "") ?
+ _fnGetObjectDataFn( oSettings.sAjaxDataProp )(json) : json;
+
+ /* Got the data - add it to the table */
+ for ( i=0 ; i<aData.length ; i++ )
+ {
+ _fnAddData( oSettings, aData[i] );
+ }
+
+ /* Reset the init display for cookie saving. We've already done a filter, and
+ * therefore cleared it before. So we need to make it appear 'fresh'
+ */
+ oSettings.iInitDisplayStart = iAjaxStart;
+
+ if ( oSettings.oFeatures.bSort )
+ {
+ _fnSort( oSettings );
+ }
+ else
+ {
+ oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
+ _fnCalculateEnd( oSettings );
+ _fnDraw( oSettings );
+ }
+
+ _fnProcessingDisplay( oSettings, false );
+ _fnInitComplete( oSettings, json );
+ }, oSettings );
+ return;
+ }
+
+ /* Server-side processing initialisation complete is done at the end of _fnDraw */
+ if ( !oSettings.oFeatures.bServerSide )
+ {
+ _fnProcessingDisplay( oSettings, false );
+ _fnInitComplete( oSettings );
+ }
+ }
+
+
+ /**
+ * Draw the table for the first time, adding all required features
+ * @param {object} oSettings dataTables settings object
+ * @param {object} [json] JSON from the server that completed the table, if using Ajax source
+ * with client-side processing (optional)
+ * @memberof DataTable#oApi
+ */
+ function _fnInitComplete ( oSettings, json )
+ {
+ oSettings._bInitComplete = true;
+ _fnCallbackFire( oSettings, 'aoInitComplete', 'init', [oSettings, json] );
+ }
+
+
+ /**
+ * Language compatibility - when certain options are given, and others aren't, we
+ * need to duplicate the values over, in order to provide backwards compatibility
+ * with older language files.
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnLanguageCompat( oLanguage )
+ {
+ var oDefaults = DataTable.defaults.oLanguage;
+
+ /* Backwards compatibility - if there is no sEmptyTable given, then use the same as
+ * sZeroRecords - assuming that is given.
+ */
+ if ( !oLanguage.sEmptyTable && oLanguage.sZeroRecords &&
+ oDefaults.sEmptyTable === "No data available in table" )
+ {
+ _fnMap( oLanguage, oLanguage, 'sZeroRecords', 'sEmptyTable' );
+ }
+
+ /* Likewise with loading records */
+ if ( !oLanguage.sLoadingRecords && oLanguage.sZeroRecords &&
+ oDefaults.sLoadingRecords === "Loading..." )
+ {
+ _fnMap( oLanguage, oLanguage, 'sZeroRecords', 'sLoadingRecords' );
+ }
+ }
+
+
+
+ /**
+ * Generate the node required for user display length changing
+ * @param {object} oSettings dataTables settings object
+ * @returns {node} Display length feature node
+ * @memberof DataTable#oApi
+ */
+ function _fnFeatureHtmlLength ( oSettings )
+ {
+ if ( oSettings.oScroll.bInfinite )
+ {
+ return null;
+ }
+
+ /* This can be overruled by not using the _MENU_ var/macro in the language variable */
+ var sName = 'name="'+oSettings.sTableId+'_length"';
+ var sStdMenu = '<select size="1" '+sName+'>';
+ var i, iLen;
+ var aLengthMenu = oSettings.aLengthMenu;
+
+ if ( aLengthMenu.length == 2 && typeof aLengthMenu[0] === 'object' &&
+ typeof aLengthMenu[1] === 'object' )
+ {
+ for ( i=0, iLen=aLengthMenu[0].length ; i<iLen ; i++ )
+ {
+ sStdMenu += '<option value="'+aLengthMenu[0][i]+'">'+aLengthMenu[1][i]+'</option>';
+ }
+ }
+ else
+ {
+ for ( i=0, iLen=aLengthMenu.length ; i<iLen ; i++ )
+ {
+ sStdMenu += '<option value="'+aLengthMenu[i]+'">'+aLengthMenu[i]+'</option>';
+ }
+ }
+ sStdMenu += '</select>';
+
+ var nLength = document.createElement( 'div' );
+ if ( !oSettings.aanFeatures.l )
+ {
+ nLength.id = oSettings.sTableId+'_length';
+ }
+ nLength.className = oSettings.oClasses.sLength;
+ nLength.innerHTML = '<label>'+oSettings.oLanguage.sLengthMenu.replace( '_MENU_', sStdMenu )+'</label>';
+
+ /*
+ * Set the length to the current display length - thanks to Andrea Pavlovic for this fix,
+ * and Stefan Skopnik for fixing the fix!
+ */
+ $('select option[value="'+oSettings._iDisplayLength+'"]', nLength).attr("selected", true);
+
+ $('select', nLength).bind( 'change.DT', function(e) {
+ var iVal = $(this).val();
+
+ /* Update all other length options for the new display */
+ var n = oSettings.aanFeatures.l;
+ for ( i=0, iLen=n.length ; i<iLen ; i++ )
+ {
+ if ( n[i] != this.parentNode )
+ {
+ $('select', n[i]).val( iVal );
+ }
+ }
+
+ /* Redraw the table */
+ oSettings._iDisplayLength = parseInt(iVal, 10);
+ _fnCalculateEnd( oSettings );
+
+ /* If we have space to show extra rows (backing up from the end point - then do so */
+ if ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() )
+ {
+ oSettings._iDisplayStart = oSettings.fnDisplayEnd() - oSettings._iDisplayLength;
+ if ( oSettings._iDisplayStart < 0 )
+ {
+ oSettings._iDisplayStart = 0;
+ }
+ }
+
+ if ( oSettings._iDisplayLength == -1 )
+ {
+ oSettings._iDisplayStart = 0;
+ }
+
+ _fnDraw( oSettings );
+ } );
+
+
+ $('select', nLength).attr('aria-controls', oSettings.sTableId);
+
+ return nLength;
+ }
+
+
+ /**
+ * Recalculate the end point based on the start point
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnCalculateEnd( oSettings )
+ {
+ if ( oSettings.oFeatures.bPaginate === false )
+ {
+ oSettings._iDisplayEnd = oSettings.aiDisplay.length;
+ }
+ else
+ {
+ /* Set the end point of the display - based on how many elements there are
+ * still to display
+ */
+ if ( oSettings._iDisplayStart + oSettings._iDisplayLength > oSettings.aiDisplay.length ||
+ oSettings._iDisplayLength == -1 )
+ {
+ oSettings._iDisplayEnd = oSettings.aiDisplay.length;
+ }
+ else
+ {
+ oSettings._iDisplayEnd = oSettings._iDisplayStart + oSettings._iDisplayLength;
+ }
+ }
+ }
+
+
+
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Note that most of the paging logic is done in
+ * DataTable.ext.oPagination
+ */
+
+ /**
+ * Generate the node required for default pagination
+ * @param {object} oSettings dataTables settings object
+ * @returns {node} Pagination feature node
+ * @memberof DataTable#oApi
+ */
+ function _fnFeatureHtmlPaginate ( oSettings )
+ {
+ if ( oSettings.oScroll.bInfinite )
+ {
+ return null;
+ }
+
+ var nPaginate = document.createElement( 'div' );
+ nPaginate.className = oSettings.oClasses.sPaging+oSettings.sPaginationType;
+
+ DataTable.ext.oPagination[ oSettings.sPaginationType ].fnInit( oSettings, nPaginate,
+ function( oSettings ) {
+ _fnCalculateEnd( oSettings );
+ _fnDraw( oSettings );
+ }
+ );
+
+ /* Add a draw callback for the pagination on first instance, to update the paging display */
+ if ( !oSettings.aanFeatures.p )
+ {
+ oSettings.aoDrawCallback.push( {
+ "fn": function( oSettings ) {
+ DataTable.ext.oPagination[ oSettings.sPaginationType ].fnUpdate( oSettings, function( oSettings ) {
+ _fnCalculateEnd( oSettings );
+ _fnDraw( oSettings );
+ } );
+ },
+ "sName": "pagination"
+ } );
+ }
+ return nPaginate;
+ }
+
+
+ /**
+ * Alter the display settings to change the page
+ * @param {object} oSettings dataTables settings object
+ * @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last"
+ * or page number to jump to (integer)
+ * @returns {bool} true page has changed, false - no change (no effect) eg 'first' on page 1
+ * @memberof DataTable#oApi
+ */
+ function _fnPageChange ( oSettings, mAction )
+ {
+ var iOldStart = oSettings._iDisplayStart;
+
+ if ( typeof mAction === "number" )
+ {
+ oSettings._iDisplayStart = mAction * oSettings._iDisplayLength;
+ if ( oSettings._iDisplayStart > oSettings.fnRecordsDisplay() )
+ {
+ oSettings._iDisplayStart = 0;
+ }
+ }
+ else if ( mAction == "first" )
+ {
+ oSettings._iDisplayStart = 0;
+ }
+ else if ( mAction == "previous" )
+ {
+ oSettings._iDisplayStart = oSettings._iDisplayLength>=0 ?
+ oSettings._iDisplayStart - oSettings._iDisplayLength :
+ 0;
+
+ /* Correct for under-run */
+ if ( oSettings._iDisplayStart < 0 )
+ {
+ oSettings._iDisplayStart = 0;
+ }
+ }
+ else if ( mAction == "next" )
+ {
+ if ( oSettings._iDisplayLength >= 0 )
+ {
+ /* Make sure we are not over running the display array */
+ if ( oSettings._iDisplayStart + oSettings._iDisplayLength < oSettings.fnRecordsDisplay() )
+ {
+ oSettings._iDisplayStart += oSettings._iDisplayLength;
+ }
+ }
+ else
+ {
+ oSettings._iDisplayStart = 0;
+ }
+ }
+ else if ( mAction == "last" )
+ {
+ if ( oSettings._iDisplayLength >= 0 )
+ {
+ var iPages = parseInt( (oSettings.fnRecordsDisplay()-1) / oSettings._iDisplayLength, 10 ) + 1;
+ oSettings._iDisplayStart = (iPages-1) * oSettings._iDisplayLength;
+ }
+ else
+ {
+ oSettings._iDisplayStart = 0;
+ }
+ }
+ else
+ {
+ _fnLog( oSettings, 0, "Unknown paging action: "+mAction );
+ }
+ $(oSettings.oInstance).trigger('page', oSettings);
+
+ return iOldStart != oSettings._iDisplayStart;
+ }
+
+
+
+ /**
+ * Generate the node required for the processing node
+ * @param {object} oSettings dataTables settings object
+ * @returns {node} Processing element
+ * @memberof DataTable#oApi
+ */
+ function _fnFeatureHtmlProcessing ( oSettings )
+ {
+ var nProcessing = document.createElement( 'div' );
+
+ if ( !oSettings.aanFeatures.r )
+ {
+ nProcessing.id = oSettings.sTableId+'_processing';
+ }
+ nProcessing.innerHTML = oSettings.oLanguage.sProcessing;
+ nProcessing.className = oSettings.oClasses.sProcessing;
+ oSettings.nTable.parentNode.insertBefore( nProcessing, oSettings.nTable );
+
+ return nProcessing;
+ }
+
+
+ /**
+ * Display or hide the processing indicator
+ * @param {object} oSettings dataTables settings object
+ * @param {bool} bShow Show the processing indicator (true) or not (false)
+ * @memberof DataTable#oApi
+ */
+ function _fnProcessingDisplay ( oSettings, bShow )
+ {
+ if ( oSettings.oFeatures.bProcessing )
+ {
+ var an = oSettings.aanFeatures.r;
+ for ( var i=0, iLen=an.length ; i<iLen ; i++ )
+ {
+ an[i].style.visibility = bShow ? "visible" : "hidden";
+ }
+ }
+
+ $(oSettings.oInstance).trigger('processing', [oSettings, bShow]);
+ }
+
+ /**
+ * Add any control elements for the table - specifically scrolling
+ * @param {object} oSettings dataTables settings object
+ * @returns {node} Node to add to the DOM
+ * @memberof DataTable#oApi
+ */
+ function _fnFeatureHtmlTable ( oSettings )
+ {
+ /* Check if scrolling is enabled or not - if not then leave the DOM unaltered */
+ if ( oSettings.oScroll.sX === "" && oSettings.oScroll.sY === "" )
+ {
+ return oSettings.nTable;
+ }
+
+ /*
+ * The HTML structure that we want to generate in this function is:
+ * div - nScroller
+ * div - nScrollHead
+ * div - nScrollHeadInner
+ * table - nScrollHeadTable
+ * thead - nThead
+ * div - nScrollBody
+ * table - oSettings.nTable
+ * thead - nTheadSize
+ * tbody - nTbody
+ * div - nScrollFoot
+ * div - nScrollFootInner
+ * table - nScrollFootTable
+ * tfoot - nTfoot
+ */
+ var
+ nScroller = document.createElement('div'),
+ nScrollHead = document.createElement('div'),
+ nScrollHeadInner = document.createElement('div'),
+ nScrollBody = document.createElement('div'),
+ nScrollFoot = document.createElement('div'),
+ nScrollFootInner = document.createElement('div'),
+ nScrollHeadTable = oSettings.nTable.cloneNode(false),
+ nScrollFootTable = oSettings.nTable.cloneNode(false),
+ nThead = oSettings.nTable.getElementsByTagName('thead')[0],
+ nTfoot = oSettings.nTable.getElementsByTagName('tfoot').length === 0 ? null :
+ oSettings.nTable.getElementsByTagName('tfoot')[0],
+ oClasses = oSettings.oClasses;
+
+ nScrollHead.appendChild( nScrollHeadInner );
+ nScrollFoot.appendChild( nScrollFootInner );
+ nScrollBody.appendChild( oSettings.nTable );
+ nScroller.appendChild( nScrollHead );
+ nScroller.appendChild( nScrollBody );
+ nScrollHeadInner.appendChild( nScrollHeadTable );
+ nScrollHeadTable.appendChild( nThead );
+ if ( nTfoot !== null )
+ {
+ nScroller.appendChild( nScrollFoot );
+ nScrollFootInner.appendChild( nScrollFootTable );
+ nScrollFootTable.appendChild( nTfoot );
+ }
+
+ nScroller.className = oClasses.sScrollWrapper;
+ nScrollHead.className = oClasses.sScrollHead;
+ nScrollHeadInner.className = oClasses.sScrollHeadInner;
+ nScrollBody.className = oClasses.sScrollBody;
+ nScrollFoot.className = oClasses.sScrollFoot;
+ nScrollFootInner.className = oClasses.sScrollFootInner;
+
+ if ( oSettings.oScroll.bAutoCss )
+ {
+ nScrollHead.style.overflow = "hidden";
+ nScrollHead.style.position = "relative";
+ nScrollFoot.style.overflow = "hidden";
+ nScrollBody.style.overflow = "auto";
+ }
+
+ nScrollHead.style.border = "0";
+ nScrollHead.style.width = "100%";
+ nScrollFoot.style.border = "0";
+ nScrollHeadInner.style.width = oSettings.oScroll.sXInner !== "" ?
+ oSettings.oScroll.sXInner : "100%"; /* will be overwritten */
+
+ /* Modify attributes to respect the clones */
+ nScrollHeadTable.removeAttribute('id');
+ nScrollHeadTable.style.marginLeft = "0";
+ oSettings.nTable.style.marginLeft = "0";
+ if ( nTfoot !== null )
+ {
+ nScrollFootTable.removeAttribute('id');
+ nScrollFootTable.style.marginLeft = "0";
+ }
+
+ /* Move caption elements from the body to the header, footer or leave where it is
+ * depending on the configuration. Note that the DTD says there can be only one caption */
+ var nCaption = $(oSettings.nTable).children('caption');
+ if ( nCaption.length > 0 )
+ {
+ nCaption = nCaption[0];
+ if ( nCaption._captionSide === "top" )
+ {
+ nScrollHeadTable.appendChild( nCaption );
+ }
+ else if ( nCaption._captionSide === "bottom" && nTfoot )
+ {
+ nScrollFootTable.appendChild( nCaption );
+ }
+ }
+
+ /*
+ * Sizing
+ */
+ /* When x-scrolling add the width and a scroller to move the header with the body */
+ if ( oSettings.oScroll.sX !== "" )
+ {
+ nScrollHead.style.width = _fnStringToCss( oSettings.oScroll.sX );
+ nScrollBody.style.width = _fnStringToCss( oSettings.oScroll.sX );
+
+ if ( nTfoot !== null )
+ {
+ nScrollFoot.style.width = _fnStringToCss( oSettings.oScroll.sX );
+ }
+
+ /* When the body is scrolled, then we also want to scroll the headers */
+ $(nScrollBody).scroll( function (e) {
+ nScrollHead.scrollLeft = this.scrollLeft;
+
+ if ( nTfoot !== null )
+ {
+ nScrollFoot.scrollLeft = this.scrollLeft;
+ }
+ } );
+ }
+
+ /* When yscrolling, add the height */
+ if ( oSettings.oScroll.sY !== "" )
+ {
+ nScrollBody.style.height = _fnStringToCss( oSettings.oScroll.sY );
+ }
+
+ /* Redraw - align columns across the tables */
+ oSettings.aoDrawCallback.push( {
+ "fn": _fnScrollDraw,
+ "sName": "scrolling"
+ } );
+
+ /* Infinite scrolling event handlers */
+ if ( oSettings.oScroll.bInfinite )
+ {
+ $(nScrollBody).scroll( function() {
+ /* Use a blocker to stop scrolling from loading more data while other data is still loading */
+ if ( !oSettings.bDrawing && $(this).scrollTop() !== 0 )
+ {
+ /* Check if we should load the next data set */
+ if ( $(this).scrollTop() + $(this).height() >
+ $(oSettings.nTable).height() - oSettings.oScroll.iLoadGap )
+ {
+ /* Only do the redraw if we have to - we might be at the end of the data */
+ if ( oSettings.fnDisplayEnd() < oSettings.fnRecordsDisplay() )
+ {
+ _fnPageChange( oSettings, 'next' );
+ _fnCalculateEnd( oSettings );
+ _fnDraw( oSettings );
+ }
+ }
+ }
+ } );
+ }
+
+ oSettings.nScrollHead = nScrollHead;
+ oSettings.nScrollFoot = nScrollFoot;
+
+ return nScroller;
+ }
+
+
+ /**
+ * Update the various tables for resizing. It's a bit of a pig this function, but
+ * basically the idea to:
+ * 1. Re-create the table inside the scrolling div
+ * 2. Take live measurements from the DOM
+ * 3. Apply the measurements
+ * 4. Clean up
+ * @param {object} o dataTables settings object
+ * @returns {node} Node to add to the DOM
+ * @memberof DataTable#oApi
+ */
+ function _fnScrollDraw ( o )
+ {
+ var
+ nScrollHeadInner = o.nScrollHead.getElementsByTagName('div')[0],
+ nScrollHeadTable = nScrollHeadInner.getElementsByTagName('table')[0],
+ nScrollBody = o.nTable.parentNode,
+ i, iLen, j, jLen, anHeadToSize, anHeadSizers, anFootSizers, anFootToSize, oStyle, iVis,
+ nTheadSize, nTfootSize,
+ iWidth, aApplied=[], aAppliedFooter=[], iSanityWidth,
+ nScrollFootInner = (o.nTFoot !== null) ? o.nScrollFoot.getElementsByTagName('div')[0] : null,
+ nScrollFootTable = (o.nTFoot !== null) ? nScrollFootInner.getElementsByTagName('table')[0] : null,
+ ie67 = o.oBrowser.bScrollOversize,
+ zeroOut = function(nSizer) {
+ oStyle = nSizer.style;
+ oStyle.paddingTop = "0";
+ oStyle.paddingBottom = "0";
+ oStyle.borderTopWidth = "0";
+ oStyle.borderBottomWidth = "0";
+ oStyle.height = 0;
+ };
+
+ /*
+ * 1. Re-create the table inside the scrolling div
+ */
+
+ /* Remove the old minimised thead and tfoot elements in the inner table */
+ $(o.nTable).children('thead, tfoot').remove();
+
+ /* Clone the current header and footer elements and then place it into the inner table */
+ nTheadSize = $(o.nTHead).clone()[0];
+ o.nTable.insertBefore( nTheadSize, o.nTable.childNodes[0] );
+ anHeadToSize = o.nTHead.getElementsByTagName('tr');
+ anHeadSizers = nTheadSize.getElementsByTagName('tr');
+
+ if ( o.nTFoot !== null )
+ {
+ nTfootSize = $(o.nTFoot).clone()[0];
+ o.nTable.insertBefore( nTfootSize, o.nTable.childNodes[1] );
+ anFootToSize = o.nTFoot.getElementsByTagName('tr');
+ anFootSizers = nTfootSize.getElementsByTagName('tr');
+ }
+
+ /*
+ * 2. Take live measurements from the DOM - do not alter the DOM itself!
+ */
+
+ /* Remove old sizing and apply the calculated column widths
+ * Get the unique column headers in the newly created (cloned) header. We want to apply the
+ * calculated sizes to this header
+ */
+ if ( o.oScroll.sX === "" )
+ {
+ nScrollBody.style.width = '100%';
+ nScrollHeadInner.parentNode.style.width = '100%';
+ }
+
+ var nThs = _fnGetUniqueThs( o, nTheadSize );
+ for ( i=0, iLen=nThs.length ; i<iLen ; i++ )
+ {
+ iVis = _fnVisibleToColumnIndex( o, i );
+ nThs[i].style.width = o.aoColumns[iVis].sWidth;
+ }
+
+ if ( o.nTFoot !== null )
+ {
+ _fnApplyToChildren( function(n) {
+ n.style.width = "";
+ }, anFootSizers );
+ }
+
+ // If scroll collapse is enabled, when we put the headers back into the body for sizing, we
+ // will end up forcing the scrollbar to appear, making our measurements wrong for when we
+ // then hide it (end of this function), so add the header height to the body scroller.
+ if ( o.oScroll.bCollapse && o.oScroll.sY !== "" )
+ {
+ nScrollBody.style.height = (nScrollBody.offsetHeight + o.nTHead.offsetHeight)+"px";
+ }
+
+ /* Size the table as a whole */
+ iSanityWidth = $(o.nTable).outerWidth();
+ if ( o.oScroll.sX === "" )
+ {
+ /* No x scrolling */
+ o.nTable.style.width = "100%";
+
+ /* I know this is rubbish - but IE7 will make the width of the table when 100% include
+ * the scrollbar - which is shouldn't. When there is a scrollbar we need to take this
+ * into account.
+ */
+ if ( ie67 && ($('tbody', nScrollBody).height() > nScrollBody.offsetHeight ||
+ $(nScrollBody).css('overflow-y') == "scroll") )
+ {
+ o.nTable.style.width = _fnStringToCss( $(o.nTable).outerWidth() - o.oScroll.iBarWidth);
+ }
+ }
+ else
+ {
+ if ( o.oScroll.sXInner !== "" )
+ {
+ /* x scroll inner has been given - use it */
+ o.nTable.style.width = _fnStringToCss(o.oScroll.sXInner);
+ }
+ else if ( iSanityWidth == $(nScrollBody).width() &&
+ $(nScrollBody).height() < $(o.nTable).height() )
+ {
+ /* There is y-scrolling - try to take account of the y scroll bar */
+ o.nTable.style.width = _fnStringToCss( iSanityWidth-o.oScroll.iBarWidth );
+ if ( $(o.nTable).outerWidth() > iSanityWidth-o.oScroll.iBarWidth )
+ {
+ /* Not possible to take account of it */
+ o.nTable.style.width = _fnStringToCss( iSanityWidth );
+ }
+ }
+ else
+ {
+ /* All else fails */
+ o.nTable.style.width = _fnStringToCss( iSanityWidth );
+ }
+ }
+
+ /* Recalculate the sanity width - now that we've applied the required width, before it was
+ * a temporary variable. This is required because the column width calculation is done
+ * before this table DOM is created.
+ */
+ iSanityWidth = $(o.nTable).outerWidth();
+
+ /* We want the hidden header to have zero height, so remove padding and borders. Then
+ * set the width based on the real headers
+ */
+
+ // Apply all styles in one pass. Invalidates layout only once because we don't read any
+ // DOM properties.
+ _fnApplyToChildren( zeroOut, anHeadSizers );
+
+ // Read all widths in next pass. Forces layout only once because we do not change
+ // any DOM properties.
+ _fnApplyToChildren( function(nSizer) {
+ aApplied.push( _fnStringToCss( $(nSizer).width() ) );
+ }, anHeadSizers );
+
+ // Apply all widths in final pass. Invalidates layout only once because we do not
+ // read any DOM properties.
+ _fnApplyToChildren( function(nToSize, i) {
+ nToSize.style.width = aApplied[i];
+ }, anHeadToSize );
+
+ $(anHeadSizers).height(0);
+
+ /* Same again with the footer if we have one */
+ if ( o.nTFoot !== null )
+ {
+ _fnApplyToChildren( zeroOut, anFootSizers );
+
+ _fnApplyToChildren( function(nSizer) {
+ aAppliedFooter.push( _fnStringToCss( $(nSizer).width() ) );
+ }, anFootSizers );
+
+ _fnApplyToChildren( function(nToSize, i) {
+ nToSize.style.width = aAppliedFooter[i];
+ }, anFootToSize );
+
+ $(anFootSizers).height(0);
+ }
+
+ /*
+ * 3. Apply the measurements
+ */
+
+ /* "Hide" the header and footer that we used for the sizing. We want to also fix their width
+ * to what they currently are
+ */
+ _fnApplyToChildren( function(nSizer, i) {
+ nSizer.innerHTML = "";
+ nSizer.style.width = aApplied[i];
+ }, anHeadSizers );
+
+ if ( o.nTFoot !== null )
+ {
+ _fnApplyToChildren( function(nSizer, i) {
+ nSizer.innerHTML = "";
+ nSizer.style.width = aAppliedFooter[i];
+ }, anFootSizers );
+ }
+
+ /* Sanity check that the table is of a sensible width. If not then we are going to get
+ * misalignment - try to prevent this by not allowing the table to shrink below its min width
+ */
+ if ( $(o.nTable).outerWidth() < iSanityWidth )
+ {
+ /* The min width depends upon if we have a vertical scrollbar visible or not */
+ var iCorrection = ((nScrollBody.scrollHeight > nScrollBody.offsetHeight ||
+ $(nScrollBody).css('overflow-y') == "scroll")) ?
+ iSanityWidth+o.oScroll.iBarWidth : iSanityWidth;
+
+ /* IE6/7 are a law unto themselves... */
+ if ( ie67 && (nScrollBody.scrollHeight >
+ nScrollBody.offsetHeight || $(nScrollBody).css('overflow-y') == "scroll") )
+ {
+ o.nTable.style.width = _fnStringToCss( iCorrection-o.oScroll.iBarWidth );
+ }
+
+ /* Apply the calculated minimum width to the table wrappers */
+ nScrollBody.style.width = _fnStringToCss( iCorrection );
+ o.nScrollHead.style.width = _fnStringToCss( iCorrection );
+
+ if ( o.nTFoot !== null )
+ {
+ o.nScrollFoot.style.width = _fnStringToCss( iCorrection );
+ }
+
+ /* And give the user a warning that we've stopped the table getting too small */
+ if ( o.oScroll.sX === "" )
+ {
+ _fnLog( o, 1, "The table cannot fit into the current element which will cause column"+
+ " misalignment. The table has been drawn at its minimum possible width." );
+ }
+ else if ( o.oScroll.sXInner !== "" )
+ {
+ _fnLog( o, 1, "The table cannot fit into the current element which will cause column"+
+ " misalignment. Increase the sScrollXInner value or remove it to allow automatic"+
+ " calculation" );
+ }
+ }
+ else
+ {
+ nScrollBody.style.width = _fnStringToCss( '100%' );
+ o.nScrollHead.style.width = _fnStringToCss( '100%' );
+
+ if ( o.nTFoot !== null )
+ {
+ o.nScrollFoot.style.width = _fnStringToCss( '100%' );
+ }
+ }
+
+
+ /*
+ * 4. Clean up
+ */
+ if ( o.oScroll.sY === "" )
+ {
+ /* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting
+ * the scrollbar height from the visible display, rather than adding it on. We need to
+ * set the height in order to sort this. Don't want to do it in any other browsers.
+ */
+ if ( ie67 )
+ {
+ nScrollBody.style.height = _fnStringToCss( o.nTable.offsetHeight+o.oScroll.iBarWidth );
+ }
+ }
+
+ if ( o.oScroll.sY !== "" && o.oScroll.bCollapse )
+ {
+ nScrollBody.style.height = _fnStringToCss( o.oScroll.sY );
+
+ var iExtra = (o.oScroll.sX !== "" && o.nTable.offsetWidth > nScrollBody.offsetWidth) ?
+ o.oScroll.iBarWidth : 0;
+ if ( o.nTable.offsetHeight < nScrollBody.offsetHeight )
+ {
+ nScrollBody.style.height = _fnStringToCss( o.nTable.offsetHeight+iExtra );
+ }
+ }
+
+ /* Finally set the width's of the header and footer tables */
+ var iOuterWidth = $(o.nTable).outerWidth();
+ nScrollHeadTable.style.width = _fnStringToCss( iOuterWidth );
+ nScrollHeadInner.style.width = _fnStringToCss( iOuterWidth );
+
+ // Figure out if there are scrollbar present - if so then we need a the header and footer to
+ // provide a bit more space to allow "overflow" scrolling (i.e. past the scrollbar)
+ var bScrolling = $(o.nTable).height() > nScrollBody.clientHeight || $(nScrollBody).css('overflow-y') == "scroll";
+ nScrollHeadInner.style.paddingRight = bScrolling ? o.oScroll.iBarWidth+"px" : "0px";
+
+ if ( o.nTFoot !== null )
+ {
+ nScrollFootTable.style.width = _fnStringToCss( iOuterWidth );
+ nScrollFootInner.style.width = _fnStringToCss( iOuterWidth );
+ nScrollFootInner.style.paddingRight = bScrolling ? o.oScroll.iBarWidth+"px" : "0px";
+ }
+
+ /* Adjust the position of the header in case we loose the y-scrollbar */
+ $(nScrollBody).scroll();
+
+ /* If sorting or filtering has occurred, jump the scrolling back to the top */
+ if ( o.bSorted || o.bFiltered )
+ {
+ nScrollBody.scrollTop = 0;
+ }
+ }
+
+
+ /**
+ * Apply a given function to the display child nodes of an element array (typically
+ * TD children of TR rows
+ * @param {function} fn Method to apply to the objects
+ * @param array {nodes} an1 List of elements to look through for display children
+ * @param array {nodes} an2 Another list (identical structure to the first) - optional
+ * @memberof DataTable#oApi
+ */
+ function _fnApplyToChildren( fn, an1, an2 )
+ {
+ var index=0, i=0, iLen=an1.length;
+ var nNode1, nNode2;
+
+ while ( i < iLen )
+ {
+ nNode1 = an1[i].firstChild;
+ nNode2 = an2 ? an2[i].firstChild : null;
+ while ( nNode1 )
+ {
+ if ( nNode1.nodeType === 1 )
+ {
+ if ( an2 )
+ {
+ fn( nNode1, nNode2, index );
+ }
+ else
+ {
+ fn( nNode1, index );
+ }
+ index++;
+ }
+ nNode1 = nNode1.nextSibling;
+ nNode2 = an2 ? nNode2.nextSibling : null;
+ }
+ i++;
+ }
+ }
+
+ /**
+ * Convert a CSS unit width to pixels (e.g. 2em)
+ * @param {string} sWidth width to be converted
+ * @param {node} nParent parent to get the with for (required for relative widths) - optional
+ * @returns {int} iWidth width in pixels
+ * @memberof DataTable#oApi
+ */
+ function _fnConvertToWidth ( sWidth, nParent )
+ {
+ if ( !sWidth || sWidth === null || sWidth === '' )
+ {
+ return 0;
+ }
+
+ if ( !nParent )
+ {
+ nParent = document.body;
+ }
+
+ var iWidth;
+ var nTmp = document.createElement( "div" );
+ nTmp.style.width = _fnStringToCss( sWidth );
+
+ nParent.appendChild( nTmp );
+ iWidth = nTmp.offsetWidth;
+ nParent.removeChild( nTmp );
+
+ return ( iWidth );
+ }
+
+
+ /**
+ * Calculate the width of columns for the table
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnCalculateColumnWidths ( oSettings )
+ {
+ var iTableWidth = oSettings.nTable.offsetWidth;
+ var iUserInputs = 0;
+ var iTmpWidth;
+ var iVisibleColumns = 0;
+ var iColums = oSettings.aoColumns.length;
+ var i, iIndex, iCorrector, iWidth;
+ var oHeaders = $('th', oSettings.nTHead);
+ var widthAttr = oSettings.nTable.getAttribute('width');
+ var nWrapper = oSettings.nTable.parentNode;
+
+ /* Convert any user input sizes into pixel sizes */
+ for ( i=0 ; i<iColums ; i++ )
+ {
+ if ( oSettings.aoColumns[i].bVisible )
+ {
+ iVisibleColumns++;
+
+ if ( oSettings.aoColumns[i].sWidth !== null )
+ {
+ iTmpWidth = _fnConvertToWidth( oSettings.aoColumns[i].sWidthOrig,
+ nWrapper );
+ if ( iTmpWidth !== null )
+ {
+ oSettings.aoColumns[i].sWidth = _fnStringToCss( iTmpWidth );
+ }
+
+ iUserInputs++;
+ }
+ }
+ }
+
+ /* If the number of columns in the DOM equals the number that we have to process in
+ * DataTables, then we can use the offsets that are created by the web-browser. No custom
+ * sizes can be set in order for this to happen, nor scrolling used
+ */
+ if ( iColums == oHeaders.length && iUserInputs === 0 && iVisibleColumns == iColums &&
+ oSettings.oScroll.sX === "" && oSettings.oScroll.sY === "" )
+ {
+ for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
+ {
+ iTmpWidth = $(oHeaders[i]).width();
+ if ( iTmpWidth !== null )
+ {
+ oSettings.aoColumns[i].sWidth = _fnStringToCss( iTmpWidth );
+ }
+ }
+ }
+ else
+ {
+ /* Otherwise we are going to have to do some calculations to get the width of each column.
+ * Construct a 1 row table with the widest node in the data, and any user defined widths,
+ * then insert it into the DOM and allow the browser to do all the hard work of
+ * calculating table widths.
+ */
+ var
+ nCalcTmp = oSettings.nTable.cloneNode( false ),
+ nTheadClone = oSettings.nTHead.cloneNode(true),
+ nBody = document.createElement( 'tbody' ),
+ nTr = document.createElement( 'tr' ),
+ nDivSizing;
+
+ nCalcTmp.removeAttribute( "id" );
+ nCalcTmp.appendChild( nTheadClone );
+ if ( oSettings.nTFoot !== null )
+ {
+ nCalcTmp.appendChild( oSettings.nTFoot.cloneNode(true) );
+ _fnApplyToChildren( function(n) {
+ n.style.width = "";
+ }, nCalcTmp.getElementsByTagName('tr') );
+ }
+
+ nCalcTmp.appendChild( nBody );
+ nBody.appendChild( nTr );
+
+ /* Remove any sizing that was previously applied by the styles */
+ var jqColSizing = $('thead th', nCalcTmp);
+ if ( jqColSizing.length === 0 )
+ {
+ jqColSizing = $('tbody tr:eq(0)>td', nCalcTmp);
+ }
+
+ /* Apply custom sizing to the cloned header */
+ var nThs = _fnGetUniqueThs( oSettings, nTheadClone );
+ iCorrector = 0;
+ for ( i=0 ; i<iColums ; i++ )
+ {
+ var oColumn = oSettings.aoColumns[i];
+ if ( oColumn.bVisible && oColumn.sWidthOrig !== null && oColumn.sWidthOrig !== "" )
+ {
+ nThs[i-iCorrector].style.width = _fnStringToCss( oColumn.sWidthOrig );
+ }
+ else if ( oColumn.bVisible )
+ {
+ nThs[i-iCorrector].style.width = "";
+ }
+ else
+ {
+ iCorrector++;
+ }
+ }
+
+ /* Find the biggest td for each column and put it into the table */
+ for ( i=0 ; i<iColums ; i++ )
+ {
+ if ( oSettings.aoColumns[i].bVisible )
+ {
+ var nTd = _fnGetWidestNode( oSettings, i );
+ if ( nTd !== null )
+ {
+ nTd = nTd.cloneNode(true);
+ if ( oSettings.aoColumns[i].sContentPadding !== "" )
+ {
+ nTd.innerHTML += oSettings.aoColumns[i].sContentPadding;
+ }
+ nTr.appendChild( nTd );
+ }
+ }
+ }
+
+ /* Build the table and 'display' it */
+ nWrapper.appendChild( nCalcTmp );
+
+ /* When scrolling (X or Y) we want to set the width of the table as appropriate. However,
+ * when not scrolling leave the table width as it is. This results in slightly different,
+ * but I think correct behaviour
+ */
+ if ( oSettings.oScroll.sX !== "" && oSettings.oScroll.sXInner !== "" )
+ {
+ nCalcTmp.style.width = _fnStringToCss(oSettings.oScroll.sXInner);
+ }
+ else if ( oSettings.oScroll.sX !== "" )
+ {
+ nCalcTmp.style.width = "";
+ if ( $(nCalcTmp).width() < nWrapper.offsetWidth )
+ {
+ nCalcTmp.style.width = _fnStringToCss( nWrapper.offsetWidth );
+ }
+ }
+ else if ( oSettings.oScroll.sY !== "" )
+ {
+ nCalcTmp.style.width = _fnStringToCss( nWrapper.offsetWidth );
+ }
+ else if ( widthAttr )
+ {
+ nCalcTmp.style.width = _fnStringToCss( widthAttr );
+ }
+ nCalcTmp.style.visibility = "hidden";
+
+ /* Scrolling considerations */
+ _fnScrollingWidthAdjust( oSettings, nCalcTmp );
+
+ /* Read the width's calculated by the browser and store them for use by the caller. We
+ * first of all try to use the elements in the body, but it is possible that there are
+ * no elements there, under which circumstances we use the header elements
+ */
+ var oNodes = $("tbody tr:eq(0)", nCalcTmp).children();
+ if ( oNodes.length === 0 )
+ {
+ oNodes = _fnGetUniqueThs( oSettings, $('thead', nCalcTmp)[0] );
+ }
+
+ /* Browsers need a bit of a hand when a width is assigned to any columns when
+ * x-scrolling as they tend to collapse the table to the min-width, even if
+ * we sent the column widths. So we need to keep track of what the table width
+ * should be by summing the user given values, and the automatic values
+ */
+ if ( oSettings.oScroll.sX !== "" )
+ {
+ var iTotal = 0;
+ iCorrector = 0;
+ for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
+ {
+ if ( oSettings.aoColumns[i].bVisible )
+ {
+ if ( oSettings.aoColumns[i].sWidthOrig === null )
+ {
+ iTotal += $(oNodes[iCorrector]).outerWidth();
+ }
+ else
+ {
+ iTotal += parseInt(oSettings.aoColumns[i].sWidth.replace('px',''), 10) +
+ ($(oNodes[iCorrector]).outerWidth() - $(oNodes[iCorrector]).width());
+ }
+ iCorrector++;
+ }
+ }
+
+ nCalcTmp.style.width = _fnStringToCss( iTotal );
+ oSettings.nTable.style.width = _fnStringToCss( iTotal );
+ }
+
+ iCorrector = 0;
+ for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
+ {
+ if ( oSettings.aoColumns[i].bVisible )
+ {
+ iWidth = $(oNodes[iCorrector]).width();
+ if ( iWidth !== null && iWidth > 0 )
+ {
+ oSettings.aoColumns[i].sWidth = _fnStringToCss( iWidth );
+ }
+ iCorrector++;
+ }
+ }
+
+ var cssWidth = $(nCalcTmp).css('width');
+ oSettings.nTable.style.width = (cssWidth.indexOf('%') !== -1) ?
+ cssWidth : _fnStringToCss( $(nCalcTmp).outerWidth() );
+ nCalcTmp.parentNode.removeChild( nCalcTmp );
+ }
+
+ if ( widthAttr )
+ {
+ oSettings.nTable.style.width = _fnStringToCss( widthAttr );
+ }
+ }
+
+
+ /**
+ * Adjust a table's width to take account of scrolling
+ * @param {object} oSettings dataTables settings object
+ * @param {node} n table node
+ * @memberof DataTable#oApi
+ */
+ function _fnScrollingWidthAdjust ( oSettings, n )
+ {
+ if ( oSettings.oScroll.sX === "" && oSettings.oScroll.sY !== "" )
+ {
+ /* When y-scrolling only, we want to remove the width of the scroll bar so the table
+ * + scroll bar will fit into the area avaialble.
+ */
+ var iOrigWidth = $(n).width();
+ n.style.width = _fnStringToCss( $(n).outerWidth()-oSettings.oScroll.iBarWidth );
+ }
+ else if ( oSettings.oScroll.sX !== "" )
+ {
+ /* When x-scrolling both ways, fix the table at it's current size, without adjusting */
+ n.style.width = _fnStringToCss( $(n).outerWidth() );
+ }
+ }
+
+
+ /**
+ * Get the widest node
+ * @param {object} oSettings dataTables settings object
+ * @param {int} iCol column of interest
+ * @returns {node} widest table node
+ * @memberof DataTable#oApi
+ */
+ function _fnGetWidestNode( oSettings, iCol )
+ {
+ var iMaxIndex = _fnGetMaxLenString( oSettings, iCol );
+ if ( iMaxIndex < 0 )
+ {
+ return null;
+ }
+
+ if ( oSettings.aoData[iMaxIndex].nTr === null )
+ {
+ var n = document.createElement('td');
+ n.innerHTML = _fnGetCellData( oSettings, iMaxIndex, iCol, '' );
+ return n;
+ }
+ return _fnGetTdNodes(oSettings, iMaxIndex)[iCol];
+ }
+
+
+ /**
+ * Get the maximum strlen for each data column
+ * @param {object} oSettings dataTables settings object
+ * @param {int} iCol column of interest
+ * @returns {string} max string length for each column
+ * @memberof DataTable#oApi
+ */
+ function _fnGetMaxLenString( oSettings, iCol )
+ {
+ var iMax = -1;
+ var iMaxIndex = -1;
+
+ for ( var i=0 ; i<oSettings.aoData.length ; i++ )
+ {
+ var s = _fnGetCellData( oSettings, i, iCol, 'display' )+"";
+ s = s.replace( /<.*?>/g, "" );
+ if ( s.length > iMax )
+ {
+ iMax = s.length;
+ iMaxIndex = i;
+ }
+ }
+
+ return iMaxIndex;
+ }
+
+
+ /**
+ * Append a CSS unit (only if required) to a string
+ * @param {array} aArray1 first array
+ * @param {array} aArray2 second array
+ * @returns {int} 0 if match, 1 if length is different, 2 if no match
+ * @memberof DataTable#oApi
+ */
+ function _fnStringToCss( s )
+ {
+ if ( s === null )
+ {
+ return "0px";
+ }
+
+ if ( typeof s == 'number' )
+ {
+ if ( s < 0 )
+ {
+ return "0px";
+ }
+ return s+"px";
+ }
+
+ /* Check if the last character is not 0-9 */
+ var c = s.charCodeAt( s.length-1 );
+ if (c < 0x30 || c > 0x39)
+ {
+ return s;
+ }
+ return s+"px";
+ }
+
+
+ /**
+ * Get the width of a scroll bar in this browser being used
+ * @returns {int} width in pixels
+ * @memberof DataTable#oApi
+ */
+ function _fnScrollBarWidth ()
+ {
+ var inner = document.createElement('p');
+ var style = inner.style;
+ style.width = "100%";
+ style.height = "200px";
+ style.padding = "0px";
+
+ var outer = document.createElement('div');
+ style = outer.style;
+ style.position = "absolute";
+ style.top = "0px";
+ style.left = "0px";
+ style.visibility = "hidden";
+ style.width = "200px";
+ style.height = "150px";
+ style.padding = "0px";
+ style.overflow = "hidden";
+ outer.appendChild(inner);
+
+ document.body.appendChild(outer);
+ var w1 = inner.offsetWidth;
+ outer.style.overflow = 'scroll';
+ var w2 = inner.offsetWidth;
+ if ( w1 == w2 )
+ {
+ w2 = outer.clientWidth;
+ }
+
+ document.body.removeChild(outer);
+ return (w1 - w2);
+ }
+
+ /**
+ * Change the order of the table
+ * @param {object} oSettings dataTables settings object
+ * @param {bool} bApplyClasses optional - should we apply classes or not
+ * @memberof DataTable#oApi
+ */
+ function _fnSort ( oSettings, bApplyClasses )
+ {
+ var
+ i, iLen, j, jLen, k, kLen,
+ sDataType, nTh,
+ aaSort = [],
+ aiOrig = [],
+ oSort = DataTable.ext.oSort,
+ aoData = oSettings.aoData,
+ aoColumns = oSettings.aoColumns,
+ oAria = oSettings.oLanguage.oAria;
+
+ /* No sorting required if server-side or no sorting array */
+ if ( !oSettings.oFeatures.bServerSide &&
+ (oSettings.aaSorting.length !== 0 || oSettings.aaSortingFixed !== null) )
+ {
+ aaSort = ( oSettings.aaSortingFixed !== null ) ?
+ oSettings.aaSortingFixed.concat( oSettings.aaSorting ) :
+ oSettings.aaSorting.slice();
+
+ /* If there is a sorting data type, and a function belonging to it, then we need to
+ * get the data from the developer's function and apply it for this column
+ */
+ for ( i=0 ; i<aaSort.length ; i++ )
+ {
+ var iColumn = aaSort[i][0];
+ var iVisColumn = _fnColumnIndexToVisible( oSettings, iColumn );
+ sDataType = oSettings.aoColumns[ iColumn ].sSortDataType;
+ if ( DataTable.ext.afnSortData[sDataType] )
+ {
+ var aData = DataTable.ext.afnSortData[sDataType].call(
+ oSettings.oInstance, oSettings, iColumn, iVisColumn
+ );
+ if ( aData.length === aoData.length )
+ {
+ for ( j=0, jLen=aoData.length ; j<jLen ; j++ )
+ {
+ _fnSetCellData( oSettings, j, iColumn, aData[j] );
+ }
+ }
+ else
+ {
+ _fnLog( oSettings, 0, "Returned data sort array (col "+iColumn+") is the wrong length" );
+ }
+ }
+ }
+
+ /* Create a value - key array of the current row positions such that we can use their
+ * current position during the sort, if values match, in order to perform stable sorting
+ */
+ for ( i=0, iLen=oSettings.aiDisplayMaster.length ; i<iLen ; i++ )
+ {
+ aiOrig[ oSettings.aiDisplayMaster[i] ] = i;
+ }
+
+ /* Build an internal data array which is specific to the sort, so we can get and prep
+ * the data to be sorted only once, rather than needing to do it every time the sorting
+ * function runs. This make the sorting function a very simple comparison
+ */
+ var iSortLen = aaSort.length;
+ var fnSortFormat, aDataSort;
+ for ( i=0, iLen=aoData.length ; i<iLen ; i++ )
+ {
+ for ( j=0 ; j<iSortLen ; j++ )
+ {
+ aDataSort = aoColumns[ aaSort[j][0] ].aDataSort;
+
+ for ( k=0, kLen=aDataSort.length ; k<kLen ; k++ )
+ {
+ sDataType = aoColumns[ aDataSort[k] ].sType;
+ fnSortFormat = oSort[ (sDataType ? sDataType : 'string')+"-pre" ];
+
+ aoData[i]._aSortData[ aDataSort[k] ] = fnSortFormat ?
+ fnSortFormat( _fnGetCellData( oSettings, i, aDataSort[k], 'sort' ) ) :
+ _fnGetCellData( oSettings, i, aDataSort[k], 'sort' );
+ }
+ }
+ }
+
+ /* Do the sort - here we want multi-column sorting based on a given data source (column)
+ * and sorting function (from oSort) in a certain direction. It's reasonably complex to
+ * follow on it's own, but this is what we want (example two column sorting):
+ * fnLocalSorting = function(a,b){
+ * var iTest;
+ * iTest = oSort['string-asc']('data11', 'data12');
+ * if (iTest !== 0)
+ * return iTest;
+ * iTest = oSort['numeric-desc']('data21', 'data22');
+ * if (iTest !== 0)
+ * return iTest;
+ * return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );
+ * }
+ * Basically we have a test for each sorting column, if the data in that column is equal,
+ * test the next column. If all columns match, then we use a numeric sort on the row
+ * positions in the original data array to provide a stable sort.
+ */
+ oSettings.aiDisplayMaster.sort( function ( a, b ) {
+ var k, l, lLen, iTest, aDataSort, sDataType;
+ for ( k=0 ; k<iSortLen ; k++ )
+ {
+ aDataSort = aoColumns[ aaSort[k][0] ].aDataSort;
+
+ for ( l=0, lLen=aDataSort.length ; l<lLen ; l++ )
+ {
+ sDataType = aoColumns[ aDataSort[l] ].sType;
+
+ iTest = oSort[ (sDataType ? sDataType : 'string')+"-"+aaSort[k][1] ](
+ aoData[a]._aSortData[ aDataSort[l] ],
+ aoData[b]._aSortData[ aDataSort[l] ]
+ );
+
+ if ( iTest !== 0 )
+ {
+ return iTest;
+ }
+ }
+ }
+
+ return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );
+ } );
+ }
+
+ /* Alter the sorting classes to take account of the changes */
+ if ( (bApplyClasses === undefined || bApplyClasses) && !oSettings.oFeatures.bDeferRender )
+ {
+ _fnSortingClasses( oSettings );
+ }
+
+ for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+ {
+ var sTitle = aoColumns[i].sTitle.replace( /<.*?>/g, "" );
+ nTh = aoColumns[i].nTh;
+ nTh.removeAttribute('aria-sort');
+ nTh.removeAttribute('aria-label');
+
+ /* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */
+ if ( aoColumns[i].bSortable )
+ {
+ if ( aaSort.length > 0 && aaSort[0][0] == i )
+ {
+ nTh.setAttribute('aria-sort', aaSort[0][1]=="asc" ? "ascending" : "descending" );
+
+ var nextSort = (aoColumns[i].asSorting[ aaSort[0][2]+1 ]) ?
+ aoColumns[i].asSorting[ aaSort[0][2]+1 ] : aoColumns[i].asSorting[0];
+ nTh.setAttribute('aria-label', sTitle+
+ (nextSort=="asc" ? oAria.sSortAscending : oAria.sSortDescending) );
+ }
+ else
+ {
+ nTh.setAttribute('aria-label', sTitle+
+ (aoColumns[i].asSorting[0]=="asc" ? oAria.sSortAscending : oAria.sSortDescending) );
+ }
+ }
+ else
+ {
+ nTh.setAttribute('aria-label', sTitle);
+ }
+ }
+
+ /* Tell the draw function that we have sorted the data */
+ oSettings.bSorted = true;
+ $(oSettings.oInstance).trigger('sort', oSettings);
+
+ /* Copy the master data into the draw array and re-draw */
+ if ( oSettings.oFeatures.bFilter )
+ {
+ /* _fnFilter() will redraw the table for us */
+ _fnFilterComplete( oSettings, oSettings.oPreviousSearch, 1 );
+ }
+ else
+ {
+ oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
+ oSettings._iDisplayStart = 0; /* reset display back to page 0 */
+ _fnCalculateEnd( oSettings );
+ _fnDraw( oSettings );
+ }
+ }
+
+
+ /**
+ * Attach a sort handler (click) to a node
+ * @param {object} oSettings dataTables settings object
+ * @param {node} nNode node to attach the handler to
+ * @param {int} iDataIndex column sorting index
+ * @param {function} [fnCallback] callback function
+ * @memberof DataTable#oApi
+ */
+ function _fnSortAttachListener ( oSettings, nNode, iDataIndex, fnCallback )
+ {
+ _fnBindAction( nNode, {}, function (e) {
+ /* If the column is not sortable - don't to anything */
+ if ( oSettings.aoColumns[iDataIndex].bSortable === false )
+ {
+ return;
+ }
+
+ /*
+ * This is a little bit odd I admit... I declare a temporary function inside the scope of
+ * _fnBuildHead and the click handler in order that the code presented here can be used
+ * twice - once for when bProcessing is enabled, and another time for when it is
+ * disabled, as we need to perform slightly different actions.
+ * Basically the issue here is that the Javascript engine in modern browsers don't
+ * appear to allow the rendering engine to update the display while it is still executing
+ * it's thread (well - it does but only after long intervals). This means that the
+ * 'processing' display doesn't appear for a table sort. To break the js thread up a bit
+ * I force an execution break by using setTimeout - but this breaks the expected
+ * thread continuation for the end-developer's point of view (their code would execute
+ * too early), so we only do it when we absolutely have to.
+ */
+ var fnInnerSorting = function () {
+ var iColumn, iNextSort;
+
+ /* If the shift key is pressed then we are multiple column sorting */
+ if ( e.shiftKey )
+ {
+ /* Are we already doing some kind of sort on this column? */
+ var bFound = false;
+ for ( var i=0 ; i<oSettings.aaSorting.length ; i++ )
+ {
+ if ( oSettings.aaSorting[i][0] == iDataIndex )
+ {
+ bFound = true;
+ iColumn = oSettings.aaSorting[i][0];
+ iNextSort = oSettings.aaSorting[i][2]+1;
+
+ if ( !oSettings.aoColumns[iColumn].asSorting[iNextSort] )
+ {
+ /* Reached the end of the sorting options, remove from multi-col sort */
+ oSettings.aaSorting.splice( i, 1 );
+ }
+ else
+ {
+ /* Move onto next sorting direction */
+ oSettings.aaSorting[i][1] = oSettings.aoColumns[iColumn].asSorting[iNextSort];
+ oSettings.aaSorting[i][2] = iNextSort;
+ }
+ break;
+ }
+ }
+
+ /* No sort yet - add it in */
+ if ( bFound === false )
+ {
+ oSettings.aaSorting.push( [ iDataIndex,
+ oSettings.aoColumns[iDataIndex].asSorting[0], 0 ] );
+ }
+ }
+ else
+ {
+ /* If no shift key then single column sort */
+ if ( oSettings.aaSorting.length == 1 && oSettings.aaSorting[0][0] == iDataIndex )
+ {
+ iColumn = oSettings.aaSorting[0][0];
+ iNextSort = oSettings.aaSorting[0][2]+1;
+ if ( !oSettings.aoColumns[iColumn].asSorting[iNextSort] )
+ {
+ iNextSort = 0;
+ }
+ oSettings.aaSorting[0][1] = oSettings.aoColumns[iColumn].asSorting[iNextSort];
+ oSettings.aaSorting[0][2] = iNextSort;
+ }
+ else
+ {
+ oSettings.aaSorting.splice( 0, oSettings.aaSorting.length );
+ oSettings.aaSorting.push( [ iDataIndex,
+ oSettings.aoColumns[iDataIndex].asSorting[0], 0 ] );
+ }
+ }
+
+ /* Run the sort */
+ _fnSort( oSettings );
+ }; /* /fnInnerSorting */
+
+ if ( !oSettings.oFeatures.bProcessing )
+ {
+ fnInnerSorting();
+ }
+ else
+ {
+ _fnProcessingDisplay( oSettings, true );
+ setTimeout( function() {
+ fnInnerSorting();
+ if ( !oSettings.oFeatures.bServerSide )
+ {
+ _fnProcessingDisplay( oSettings, false );
+ }
+ }, 0 );
+ }
+
+ /* Call the user specified callback function - used for async user interaction */
+ if ( typeof fnCallback == 'function' )
+ {
+ fnCallback( oSettings );
+ }
+ } );
+ }
+
+
+ /**
+ * Set the sorting classes on the header, Note: it is safe to call this function
+ * when bSort and bSortClasses are false
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnSortingClasses( oSettings )
+ {
+ var i, iLen, j, jLen, iFound;
+ var aaSort, sClass;
+ var iColumns = oSettings.aoColumns.length;
+ var oClasses = oSettings.oClasses;
+
+ for ( i=0 ; i<iColumns ; i++ )
+ {
+ if ( oSettings.aoColumns[i].bSortable )
+ {
+ $(oSettings.aoColumns[i].nTh).removeClass( oClasses.sSortAsc +" "+ oClasses.sSortDesc +
+ " "+ oSettings.aoColumns[i].sSortingClass );
+ }
+ }
+
+ if ( oSettings.aaSortingFixed !== null )
+ {
+ aaSort = oSettings.aaSortingFixed.concat( oSettings.aaSorting );
+ }
+ else
+ {
+ aaSort = oSettings.aaSorting.slice();
+ }
+
+ /* Apply the required classes to the header */
+ for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
+ {
+ if ( oSettings.aoColumns[i].bSortable )
+ {
+ sClass = oSettings.aoColumns[i].sSortingClass;
+ iFound = -1;
+ for ( j=0 ; j<aaSort.length ; j++ )
+ {
+ if ( aaSort[j][0] == i )
+ {
+ sClass = ( aaSort[j][1] == "asc" ) ?
+ oClasses.sSortAsc : oClasses.sSortDesc;
+ iFound = j;
+ break;
+ }
+ }
+ $(oSettings.aoColumns[i].nTh).addClass( sClass );
+
+ if ( oSettings.bJUI )
+ {
+ /* jQuery UI uses extra markup */
+ var jqSpan = $("span."+oClasses.sSortIcon, oSettings.aoColumns[i].nTh);
+ jqSpan.removeClass(oClasses.sSortJUIAsc +" "+ oClasses.sSortJUIDesc +" "+
+ oClasses.sSortJUI +" "+ oClasses.sSortJUIAscAllowed +" "+ oClasses.sSortJUIDescAllowed );
+
+ var sSpanClass;
+ if ( iFound == -1 )
+ {
+ sSpanClass = oSettings.aoColumns[i].sSortingClassJUI;
+ }
+ else if ( aaSort[iFound][1] == "asc" )
+ {
+ sSpanClass = oClasses.sSortJUIAsc;
+ }
+ else
+ {
+ sSpanClass = oClasses.sSortJUIDesc;
+ }
+
+ jqSpan.addClass( sSpanClass );
+ }
+ }
+ else
+ {
+ /* No sorting on this column, so add the base class. This will have been assigned by
+ * _fnAddColumn
+ */
+ $(oSettings.aoColumns[i].nTh).addClass( oSettings.aoColumns[i].sSortingClass );
+ }
+ }
+
+ /*
+ * Apply the required classes to the table body
+ * Note that this is given as a feature switch since it can significantly slow down a sort
+ * on large data sets (adding and removing of classes is always slow at the best of times..)
+ * Further to this, note that this code is admittedly fairly ugly. It could be made a lot
+ * simpler using jQuery selectors and add/removeClass, but that is significantly slower
+ * (on the order of 5 times slower) - hence the direct DOM manipulation here.
+ * Note that for deferred drawing we do use jQuery - the reason being that taking the first
+ * row found to see if the whole column needs processed can miss classes since the first
+ * column might be new.
+ */
+ sClass = oClasses.sSortColumn;
+
+ if ( oSettings.oFeatures.bSort && oSettings.oFeatures.bSortClasses )
+ {
+ var nTds = _fnGetTdNodes( oSettings );
+
+ /* Determine what the sorting class for each column should be */
+ var iClass, iTargetCol;
+ var asClasses = [];
+ for (i = 0; i < iColumns; i++)
+ {
+ asClasses.push("");
+ }
+ for (i = 0, iClass = 1; i < aaSort.length; i++)
+ {
+ iTargetCol = parseInt( aaSort[i][0], 10 );
+ asClasses[iTargetCol] = sClass + iClass;
+
+ if ( iClass < 3 )
+ {
+ iClass++;
+ }
+ }
+
+ /* Make changes to the classes for each cell as needed */
+ var reClass = new RegExp(sClass + "[123]");
+ var sTmpClass, sCurrentClass, sNewClass;
+ for ( i=0, iLen=nTds.length; i<iLen; i++ )
+ {
+ /* Determine which column we're looking at */
+ iTargetCol = i % iColumns;
+
+ /* What is the full list of classes now */
+ sCurrentClass = nTds[i].className;
+ /* What sorting class should be applied? */
+ sNewClass = asClasses[iTargetCol];
+ /* What would the new full list be if we did a replacement? */
+ sTmpClass = sCurrentClass.replace(reClass, sNewClass);
+
+ if ( sTmpClass != sCurrentClass )
+ {
+ /* We changed something */
+ nTds[i].className = $.trim( sTmpClass );
+ }
+ else if ( sNewClass.length > 0 && sCurrentClass.indexOf(sNewClass) == -1 )
+ {
+ /* We need to add a class */
+ nTds[i].className = sCurrentClass + " " + sNewClass;
+ }
+ }
+ }
+ }
+
+
+
+ /**
+ * Save the state of a table in a cookie such that the page can be reloaded
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnSaveState ( oSettings )
+ {
+ if ( !oSettings.oFeatures.bStateSave || oSettings.bDestroying )
+ {
+ return;
+ }
+
+ /* Store the interesting variables */
+ var i, iLen, bInfinite=oSettings.oScroll.bInfinite;
+ var oState = {
+ "iCreate": new Date().getTime(),
+ "iStart": (bInfinite ? 0 : oSettings._iDisplayStart),
+ "iEnd": (bInfinite ? oSettings._iDisplayLength : oSettings._iDisplayEnd),
+ "iLength": oSettings._iDisplayLength,
+ "aaSorting": $.extend( true, [], oSettings.aaSorting ),
+ "oSearch": $.extend( true, {}, oSettings.oPreviousSearch ),
+ "aoSearchCols": $.extend( true, [], oSettings.aoPreSearchCols ),
+ "abVisCols": []
+ };
+
+ for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+ {
+ oState.abVisCols.push( oSettings.aoColumns[i].bVisible );
+ }
+
+ _fnCallbackFire( oSettings, "aoStateSaveParams", 'stateSaveParams', [oSettings, oState] );
+
+ oSettings.fnStateSave.call( oSettings.oInstance, oSettings, oState );
+ }
+
+
+ /**
+ * Attempt to load a saved table state from a cookie
+ * @param {object} oSettings dataTables settings object
+ * @param {object} oInit DataTables init object so we can override settings
+ * @memberof DataTable#oApi
+ */
+ function _fnLoadState ( oSettings, oInit )
+ {
+ if ( !oSettings.oFeatures.bStateSave )
+ {
+ return;
+ }
+
+ var oData = oSettings.fnStateLoad.call( oSettings.oInstance, oSettings );
+ if ( !oData )
+ {
+ return;
+ }
+
+ /* Allow custom and plug-in manipulation functions to alter the saved data set and
+ * cancelling of loading by returning false
+ */
+ var abStateLoad = _fnCallbackFire( oSettings, 'aoStateLoadParams', 'stateLoadParams', [oSettings, oData] );
+ if ( $.inArray( false, abStateLoad ) !== -1 )
+ {
+ return;
+ }
+
+ /* Store the saved state so it might be accessed at any time */
+ oSettings.oLoadedState = $.extend( true, {}, oData );
+
+ /* Restore key features */
+ oSettings._iDisplayStart = oData.iStart;
+ oSettings.iInitDisplayStart = oData.iStart;
+ oSettings._iDisplayEnd = oData.iEnd;
+ oSettings._iDisplayLength = oData.iLength;
+ oSettings.aaSorting = oData.aaSorting.slice();
+ oSettings.saved_aaSorting = oData.aaSorting.slice();
+
+ /* Search filtering */
+ $.extend( oSettings.oPreviousSearch, oData.oSearch );
+ $.extend( true, oSettings.aoPreSearchCols, oData.aoSearchCols );
+
+ /* Column visibility state
+ * Pass back visibility settings to the init handler, but to do not here override
+ * the init object that the user might have passed in
+ */
+ oInit.saved_aoColumns = [];
+ for ( var i=0 ; i<oData.abVisCols.length ; i++ )
+ {
+ oInit.saved_aoColumns[i] = {};
+ oInit.saved_aoColumns[i].bVisible = oData.abVisCols[i];
+ }
+
+ _fnCallbackFire( oSettings, 'aoStateLoaded', 'stateLoaded', [oSettings, oData] );
+ }
+
+
+ /**
+ * Create a new cookie with a value to store the state of a table
+ * @param {string} sName name of the cookie to create
+ * @param {string} sValue the value the cookie should take
+ * @param {int} iSecs duration of the cookie
+ * @param {string} sBaseName sName is made up of the base + file name - this is the base
+ * @param {function} fnCallback User definable function to modify the cookie
+ * @memberof DataTable#oApi
+ */
+ function _fnCreateCookie ( sName, sValue, iSecs, sBaseName, fnCallback )
+ {
+ var date = new Date();
+ date.setTime( date.getTime()+(iSecs*1000) );
+
+ /*
+ * Shocking but true - it would appear IE has major issues with having the path not having
+ * a trailing slash on it. We need the cookie to be available based on the path, so we
+ * have to append the file name to the cookie name. Appalling. Thanks to vex for adding the
+ * patch to use at least some of the path
+ */
+ var aParts = window.location.pathname.split('/');
+ var sNameFile = sName + '_' + aParts.pop().replace(/[\/:]/g,"").toLowerCase();
+ var sFullCookie, oData;
+
+ if ( fnCallback !== null )
+ {
+ oData = (typeof $.parseJSON === 'function') ?
+ $.parseJSON( sValue ) : eval( '('+sValue+')' );
+ sFullCookie = fnCallback( sNameFile, oData, date.toGMTString(),
+ aParts.join('/')+"/" );
+ }
+ else
+ {
+ sFullCookie = sNameFile + "=" + encodeURIComponent(sValue) +
+ "; expires=" + date.toGMTString() +"; path=" + aParts.join('/')+"/";
+ }
+
+ /* Are we going to go over the cookie limit of 4KiB? If so, try to delete a cookies
+ * belonging to DataTables.
+ */
+ var
+ aCookies =document.cookie.split(';'),
+ iNewCookieLen = sFullCookie.split(';')[0].length,
+ aOldCookies = [];
+
+ if ( iNewCookieLen+document.cookie.length+10 > 4096 ) /* Magic 10 for padding */
+ {
+ for ( var i=0, iLen=aCookies.length ; i<iLen ; i++ )
+ {
+ if ( aCookies[i].indexOf( sBaseName ) != -1 )
+ {
+ /* It's a DataTables cookie, so eval it and check the time stamp */
+ var aSplitCookie = aCookies[i].split('=');
+ try {
+ oData = eval( '('+decodeURIComponent(aSplitCookie[1])+')' );
+
+ if ( oData && oData.iCreate )
+ {
+ aOldCookies.push( {
+ "name": aSplitCookie[0],
+ "time": oData.iCreate
+ } );
+ }
+ }
+ catch( e ) {}
+ }
+ }
+
+ // Make sure we delete the oldest ones first
+ aOldCookies.sort( function (a, b) {
+ return b.time - a.time;
+ } );
+
+ // Eliminate as many old DataTables cookies as we need to
+ while ( iNewCookieLen + document.cookie.length + 10 > 4096 ) {
+ if ( aOldCookies.length === 0 ) {
+ // Deleted all DT cookies and still not enough space. Can't state save
+ return;
+ }
+
+ var old = aOldCookies.pop();
+ document.cookie = old.name+"=; expires=Thu, 01-Jan-1970 00:00:01 GMT; path="+
+ aParts.join('/') + "/";
+ }
+ }
+
+ document.cookie = sFullCookie;
+ }
+
+
+ /**
+ * Read an old cookie to get a cookie with an old table state
+ * @param {string} sName name of the cookie to read
+ * @returns {string} contents of the cookie - or null if no cookie with that name found
+ * @memberof DataTable#oApi
+ */
+ function _fnReadCookie ( sName )
+ {
+ var
+ aParts = window.location.pathname.split('/'),
+ sNameEQ = sName + '_' + aParts[aParts.length-1].replace(/[\/:]/g,"").toLowerCase() + '=',
+ sCookieContents = document.cookie.split(';');
+
+ for( var i=0 ; i<sCookieContents.length ; i++ )
+ {
+ var c = sCookieContents[i];
+
+ while (c.charAt(0)==' ')
+ {
+ c = c.substring(1,c.length);
+ }
+
+ if (c.indexOf(sNameEQ) === 0)
+ {
+ return decodeURIComponent( c.substring(sNameEQ.length,c.length) );
+ }
+ }
+ return null;
+ }
+
+
+ /**
+ * Return the settings object for a particular table
+ * @param {node} nTable table we are using as a dataTable
+ * @returns {object} Settings object - or null if not found
+ * @memberof DataTable#oApi
+ */
+ function _fnSettingsFromNode ( nTable )
+ {
+ for ( var i=0 ; i<DataTable.settings.length ; i++ )
+ {
+ if ( DataTable.settings[i].nTable === nTable )
+ {
+ return DataTable.settings[i];
+ }
+ }
+
+ return null;
+ }
+
+
+ /**
+ * Return an array with the TR nodes for the table
+ * @param {object} oSettings dataTables settings object
+ * @returns {array} TR array
+ * @memberof DataTable#oApi
+ */
+ function _fnGetTrNodes ( oSettings )
+ {
+ var aNodes = [];
+ var aoData = oSettings.aoData;
+ for ( var i=0, iLen=aoData.length ; i<iLen ; i++ )
+ {
+ if ( aoData[i].nTr !== null )
+ {
+ aNodes.push( aoData[i].nTr );
+ }
+ }
+ return aNodes;
+ }
+
+
+ /**
+ * Return an flat array with all TD nodes for the table, or row
+ * @param {object} oSettings dataTables settings object
+ * @param {int} [iIndividualRow] aoData index to get the nodes for - optional
+ * if not given then the return array will contain all nodes for the table
+ * @returns {array} TD array
+ * @memberof DataTable#oApi
+ */
+ function _fnGetTdNodes ( oSettings, iIndividualRow )
+ {
+ var anReturn = [];
+ var iCorrector;
+ var anTds, nTd;
+ var iRow, iRows=oSettings.aoData.length,
+ iColumn, iColumns, oData, sNodeName, iStart=0, iEnd=iRows;
+
+ /* Allow the collection to be limited to just one row */
+ if ( iIndividualRow !== undefined )
+ {
+ iStart = iIndividualRow;
+ iEnd = iIndividualRow+1;
+ }
+
+ for ( iRow=iStart ; iRow<iEnd ; iRow++ )
+ {
+ oData = oSettings.aoData[iRow];
+ if ( oData.nTr !== null )
+ {
+ /* get the TD child nodes - taking into account text etc nodes */
+ anTds = [];
+ nTd = oData.nTr.firstChild;
+ while ( nTd )
+ {
+ sNodeName = nTd.nodeName.toLowerCase();
+ if ( sNodeName == 'td' || sNodeName == 'th' )
+ {
+ anTds.push( nTd );
+ }
+ nTd = nTd.nextSibling;
+ }
+
+ iCorrector = 0;
+ for ( iColumn=0, iColumns=oSettings.aoColumns.length ; iColumn<iColumns ; iColumn++ )
+ {
+ if ( oSettings.aoColumns[iColumn].bVisible )
+ {
+ anReturn.push( anTds[iColumn-iCorrector] );
+ }
+ else
+ {
+ anReturn.push( oData._anHidden[iColumn] );
+ iCorrector++;
+ }
+ }
+ }
+ }
+
+ return anReturn;
+ }
+
+
+ /**
+ * Log an error message
+ * @param {object} oSettings dataTables settings object
+ * @param {int} iLevel log error messages, or display them to the user
+ * @param {string} sMesg error message
+ * @memberof DataTable#oApi
+ */
+ function _fnLog( oSettings, iLevel, sMesg )
+ {
+ var sAlert = (oSettings===null) ?
+ "DataTables warning: "+sMesg :
+ "DataTables warning (table id = '"+oSettings.sTableId+"'): "+sMesg;
+
+ if ( iLevel === 0 )
+ {
+ if ( DataTable.ext.sErrMode == 'alert' )
+ {
+ alert( sAlert );
+ }
+ else
+ {
+ throw new Error(sAlert);
+ }
+ return;
+ }
+ else if ( window.console && console.log )
+ {
+ console.log( sAlert );
+ }
+ }
+
+
+ /**
+ * See if a property is defined on one object, if so assign it to the other object
+ * @param {object} oRet target object
+ * @param {object} oSrc source object
+ * @param {string} sName property
+ * @param {string} [sMappedName] name to map too - optional, sName used if not given
+ * @memberof DataTable#oApi
+ */
+ function _fnMap( oRet, oSrc, sName, sMappedName )
+ {
+ if ( sMappedName === undefined )
+ {
+ sMappedName = sName;
+ }
+ if ( oSrc[sName] !== undefined )
+ {
+ oRet[sMappedName] = oSrc[sName];
+ }
+ }
+
+
+ /**
+ * Extend objects - very similar to jQuery.extend, but deep copy objects, and shallow
+ * copy arrays. The reason we need to do this, is that we don't want to deep copy array
+ * init values (such as aaSorting) since the dev wouldn't be able to override them, but
+ * we do want to deep copy arrays.
+ * @param {object} oOut Object to extend
+ * @param {object} oExtender Object from which the properties will be applied to oOut
+ * @returns {object} oOut Reference, just for convenience - oOut === the return.
+ * @memberof DataTable#oApi
+ * @todo This doesn't take account of arrays inside the deep copied objects.
+ */
+ function _fnExtend( oOut, oExtender )
+ {
+ var val;
+
+ for ( var prop in oExtender )
+ {
+ if ( oExtender.hasOwnProperty(prop) )
+ {
+ val = oExtender[prop];
+
+ if ( typeof oInit[prop] === 'object' && val !== null && $.isArray(val) === false )
+ {
+ $.extend( true, oOut[prop], val );
+ }
+ else
+ {
+ oOut[prop] = val;
+ }
+ }
+ }
+
+ return oOut;
+ }
+
+
+ /**
+ * Bind an event handers to allow a click or return key to activate the callback.
+ * This is good for accessibility since a return on the keyboard will have the
+ * same effect as a click, if the element has focus.
+ * @param {element} n Element to bind the action to
+ * @param {object} oData Data object to pass to the triggered function
+ * @param {function} fn Callback function for when the event is triggered
+ * @memberof DataTable#oApi
+ */
+ function _fnBindAction( n, oData, fn )
+ {
+ $(n)
+ .bind( 'click.DT', oData, function (e) {
+ n.blur(); // Remove focus outline for mouse users
+ fn(e);
+ } )
+ .bind( 'keypress.DT', oData, function (e){
+ if ( e.which === 13 ) {
+ fn(e);
+ } } )
+ .bind( 'selectstart.DT', function () {
+ /* Take the brutal approach to cancelling text selection */
+ return false;
+ } );
+ }
+
+
+ /**
+ * Register a callback function. Easily allows a callback function to be added to
+ * an array store of callback functions that can then all be called together.
+ * @param {object} oSettings dataTables settings object
+ * @param {string} sStore Name of the array storage for the callbacks in oSettings
+ * @param {function} fn Function to be called back
+ * @param {string} sName Identifying name for the callback (i.e. a label)
+ * @memberof DataTable#oApi
+ */
+ function _fnCallbackReg( oSettings, sStore, fn, sName )
+ {
+ if ( fn )
+ {
+ oSettings[sStore].push( {
+ "fn": fn,
+ "sName": sName
+ } );
+ }
+ }
+
+
+ /**
+ * Fire callback functions and trigger events. Note that the loop over the callback
+ * array store is done backwards! Further note that you do not want to fire off triggers
+ * in time sensitive applications (for example cell creation) as its slow.
+ * @param {object} oSettings dataTables settings object
+ * @param {string} sStore Name of the array storage for the callbacks in oSettings
+ * @param {string} sTrigger Name of the jQuery custom event to trigger. If null no trigger
+ * is fired
+ * @param {array} aArgs Array of arguments to pass to the callback function / trigger
+ * @memberof DataTable#oApi
+ */
+ function _fnCallbackFire( oSettings, sStore, sTrigger, aArgs )
+ {
+ var aoStore = oSettings[sStore];
+ var aRet =[];
+
+ for ( var i=aoStore.length-1 ; i>=0 ; i-- )
+ {
+ aRet.push( aoStore[i].fn.apply( oSettings.oInstance, aArgs ) );
+ }
+
+ if ( sTrigger !== null )
+ {
+ $(oSettings.oInstance).trigger(sTrigger, aArgs);
+ }
+
+ return aRet;
+ }
+
+
+ /**
+ * JSON stringify. If JSON.stringify it provided by the browser, json2.js or any other
+ * library, then we use that as it is fast, safe and accurate. If the function isn't
+ * available then we need to built it ourselves - the inspiration for this function comes
+ * from Craig Buckler ( http://www.sitepoint.com/javascript-json-serialization/ ). It is
+ * not perfect and absolutely should not be used as a replacement to json2.js - but it does
+ * do what we need, without requiring a dependency for DataTables.
+ * @param {object} o JSON object to be converted
+ * @returns {string} JSON string
+ * @memberof DataTable#oApi
+ */
+ var _fnJsonString = (window.JSON) ? JSON.stringify : function( o )
+ {
+ /* Not an object or array */
+ var sType = typeof o;
+ if (sType !== "object" || o === null)
+ {
+ // simple data type
+ if (sType === "string")
+ {
+ o = '"'+o+'"';
+ }
+ return o+"";
+ }
+
+ /* If object or array, need to recurse over it */
+ var
+ sProp, mValue,
+ json = [],
+ bArr = $.isArray(o);
+
+ for (sProp in o)
+ {
+ mValue = o[sProp];
+ sType = typeof mValue;
+
+ if (sType === "string")
+ {
+ mValue = '"'+mValue+'"';
+ }
+ else if (sType === "object" && mValue !== null)
+ {
+ mValue = _fnJsonString(mValue);
+ }
+
+ json.push((bArr ? "" : '"'+sProp+'":') + mValue);
+ }
+
+ return (bArr ? "[" : "{") + json + (bArr ? "]" : "}");
+ };
+
+
+ /**
+ * From some browsers (specifically IE6/7) we need special handling to work around browser
+ * bugs - this function is used to detect when these workarounds are needed.
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnBrowserDetect( oSettings )
+ {
+ /* IE6/7 will oversize a width 100% element inside a scrolling element, to include the
+ * width of the scrollbar, while other browsers ensure the inner element is contained
+ * without forcing scrolling
+ */
+ var n = $(
+ '<div style="position:absolute; top:0; left:0; height:1px; width:1px; overflow:hidden">'+
+ '<div style="position:absolute; top:1px; left:1px; width:100px; overflow:scroll;">'+
+ '<div id="DT_BrowserTest" style="width:100%; height:10px;"></div>'+
+ '</div>'+
+ '</div>')[0];
+
+ document.body.appendChild( n );
+ oSettings.oBrowser.bScrollOversize = $('#DT_BrowserTest', n)[0].offsetWidth === 100 ? true : false;
+ document.body.removeChild( n );
+ }
+
+
+ /**
+ * Perform a jQuery selector action on the table's TR elements (from the tbody) and
+ * return the resulting jQuery object.
+ * @param {string|node|jQuery} sSelector jQuery selector or node collection to act on
+ * @param {object} [oOpts] Optional parameters for modifying the rows to be included
+ * @param {string} [oOpts.filter=none] Select TR elements that meet the current filter
+ * criterion ("applied") or all TR elements (i.e. no filter).
+ * @param {string} [oOpts.order=current] Order of the TR elements in the processed array.
+ * Can be either 'current', whereby the current sorting of the table is used, or
+ * 'original' whereby the original order the data was read into the table is used.
+ * @param {string} [oOpts.page=all] Limit the selection to the currently displayed page
+ * ("current") or not ("all"). If 'current' is given, then order is assumed to be
+ * 'current' and filter is 'applied', regardless of what they might be given as.
+ * @returns {object} jQuery object, filtered by the given selector.
+ * @dtopt API
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Highlight every second row
+ * oTable.$('tr:odd').css('backgroundColor', 'blue');
+ * } );
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Filter to rows with 'Webkit' in them, add a background colour and then
+ * // remove the filter, thus highlighting the 'Webkit' rows only.
+ * oTable.fnFilter('Webkit');
+ * oTable.$('tr', {"filter": "applied"}).css('backgroundColor', 'blue');
+ * oTable.fnFilter('');
+ * } );
+ */
+ this.$ = function ( sSelector, oOpts )
+ {
+ var i, iLen, a = [], tr;
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+ var aoData = oSettings.aoData;
+ var aiDisplay = oSettings.aiDisplay;
+ var aiDisplayMaster = oSettings.aiDisplayMaster;
+
+ if ( !oOpts )
+ {
+ oOpts = {};
+ }
+
+ oOpts = $.extend( {}, {
+ "filter": "none", // applied
+ "order": "current", // "original"
+ "page": "all" // current
+ }, oOpts );
+
+ // Current page implies that order=current and fitler=applied, since it is fairly
+ // senseless otherwise
+ if ( oOpts.page == 'current' )
+ {
+ for ( i=oSettings._iDisplayStart, iLen=oSettings.fnDisplayEnd() ; i<iLen ; i++ )
+ {
+ tr = aoData[ aiDisplay[i] ].nTr;
+ if ( tr )
+ {
+ a.push( tr );
+ }
+ }
+ }
+ else if ( oOpts.order == "current" && oOpts.filter == "none" )
+ {
+ for ( i=0, iLen=aiDisplayMaster.length ; i<iLen ; i++ )
+ {
+ tr = aoData[ aiDisplayMaster[i] ].nTr;
+ if ( tr )
+ {
+ a.push( tr );
+ }
+ }
+ }
+ else if ( oOpts.order == "current" && oOpts.filter == "applied" )
+ {
+ for ( i=0, iLen=aiDisplay.length ; i<iLen ; i++ )
+ {
+ tr = aoData[ aiDisplay[i] ].nTr;
+ if ( tr )
+ {
+ a.push( tr );
+ }
+ }
+ }
+ else if ( oOpts.order == "original" && oOpts.filter == "none" )
+ {
+ for ( i=0, iLen=aoData.length ; i<iLen ; i++ )
+ {
+ tr = aoData[ i ].nTr ;
+ if ( tr )
+ {
+ a.push( tr );
+ }
+ }
+ }
+ else if ( oOpts.order == "original" && oOpts.filter == "applied" )
+ {
+ for ( i=0, iLen=aoData.length ; i<iLen ; i++ )
+ {
+ tr = aoData[ i ].nTr;
+ if ( $.inArray( i, aiDisplay ) !== -1 && tr )
+ {
+ a.push( tr );
+ }
+ }
+ }
+ else
+ {
+ _fnLog( oSettings, 1, "Unknown selection options" );
+ }
+
+ /* We need to filter on the TR elements and also 'find' in their descendants
+ * to make the selector act like it would in a full table - so we need
+ * to build both results and then combine them together
+ */
+ var jqA = $(a);
+ var jqTRs = jqA.filter( sSelector );
+ var jqDescendants = jqA.find( sSelector );
+
+ return $( [].concat($.makeArray(jqTRs), $.makeArray(jqDescendants)) );
+ };
+
+
+ /**
+ * Almost identical to $ in operation, but in this case returns the data for the matched
+ * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes
+ * rather than any descendants, so the data can be obtained for the row/cell. If matching
+ * rows are found, the data returned is the original data array/object that was used to
+ * create the row (or a generated array if from a DOM source).
+ *
+ * This method is often useful in-combination with $ where both functions are given the
+ * same parameters and the array indexes will match identically.
+ * @param {string|node|jQuery} sSelector jQuery selector or node collection to act on
+ * @param {object} [oOpts] Optional parameters for modifying the rows to be included
+ * @param {string} [oOpts.filter=none] Select elements that meet the current filter
+ * criterion ("applied") or all elements (i.e. no filter).
+ * @param {string} [oOpts.order=current] Order of the data in the processed array.
+ * Can be either 'current', whereby the current sorting of the table is used, or
+ * 'original' whereby the original order the data was read into the table is used.
+ * @param {string} [oOpts.page=all] Limit the selection to the currently displayed page
+ * ("current") or not ("all"). If 'current' is given, then order is assumed to be
+ * 'current' and filter is 'applied', regardless of what they might be given as.
+ * @returns {array} Data for the matched elements. If any elements, as a result of the
+ * selector, were not TR, TD or TH elements in the DataTable, they will have a null
+ * entry in the array.
+ * @dtopt API
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Get the data from the first row in the table
+ * var data = oTable._('tr:first');
+ *
+ * // Do something useful with the data
+ * alert( "First cell is: "+data[0] );
+ * } );
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Filter to 'Webkit' and get all data for
+ * oTable.fnFilter('Webkit');
+ * var data = oTable._('tr', {"filter": "applied"});
+ *
+ * // Do something with the data
+ * alert( data.length+" rows matched the filter" );
+ * } );
+ */
+ this._ = function ( sSelector, oOpts )
+ {
+ var aOut = [];
+ var i, iLen, iIndex;
+ var aTrs = this.$( sSelector, oOpts );
+
+ for ( i=0, iLen=aTrs.length ; i<iLen ; i++ )
+ {
+ aOut.push( this.fnGetData(aTrs[i]) );
+ }
+
+ return aOut;
+ };
+
+
+ /**
+ * Add a single new row or multiple rows of data to the table. Please note
+ * that this is suitable for client-side processing only - if you are using
+ * server-side processing (i.e. "bServerSide": true), then to add data, you
+ * must add it to the data source, i.e. the server-side, through an Ajax call.
+ * @param {array|object} mData The data to be added to the table. This can be:
+ * <ul>
+ * <li>1D array of data - add a single row with the data provided</li>
+ * <li>2D array of arrays - add multiple rows in a single call</li>
+ * <li>object - data object when using <i>mData</i></li>
+ * <li>array of objects - multiple data objects when using <i>mData</i></li>
+ * </ul>
+ * @param {bool} [bRedraw=true] redraw the table or not
+ * @returns {array} An array of integers, representing the list of indexes in
+ * <i>aoData</i> ({@link DataTable.models.oSettings}) that have been added to
+ * the table.
+ * @dtopt API
+ *
+ * @example
+ * // Global var for counter
+ * var giCount = 2;
+ *
+ * $(document).ready(function() {
+ * $('#example').dataTable();
+ * } );
+ *
+ * function fnClickAddRow() {
+ * $('#example').dataTable().fnAddData( [
+ * giCount+".1",
+ * giCount+".2",
+ * giCount+".3",
+ * giCount+".4" ]
+ * );
+ *
+ * giCount++;
+ * }
+ */
+ this.fnAddData = function( mData, bRedraw )
+ {
+ if ( mData.length === 0 )
+ {
+ return [];
+ }
+
+ var aiReturn = [];
+ var iTest;
+
+ /* Find settings from table node */
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+
+ /* Check if we want to add multiple rows or not */
+ if ( typeof mData[0] === "object" && mData[0] !== null )
+ {
+ for ( var i=0 ; i<mData.length ; i++ )
+ {
+ iTest = _fnAddData( oSettings, mData[i] );
+ if ( iTest == -1 )
+ {
+ return aiReturn;
+ }
+ aiReturn.push( iTest );
+ }
+ }
+ else
+ {
+ iTest = _fnAddData( oSettings, mData );
+ if ( iTest == -1 )
+ {
+ return aiReturn;
+ }
+ aiReturn.push( iTest );
+ }
+
+ oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
+
+ if ( bRedraw === undefined || bRedraw )
+ {
+ _fnReDraw( oSettings );
+ }
+ return aiReturn;
+ };
+
+
+ /**
+ * This function will make DataTables recalculate the column sizes, based on the data
+ * contained in the table and the sizes applied to the columns (in the DOM, CSS or
+ * through the sWidth parameter). This can be useful when the width of the table's
+ * parent element changes (for example a window resize).
+ * @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to
+ * @dtopt API
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable( {
+ * "sScrollY": "200px",
+ * "bPaginate": false
+ * } );
+ *
+ * $(window).bind('resize', function () {
+ * oTable.fnAdjustColumnSizing();
+ * } );
+ * } );
+ */
+ this.fnAdjustColumnSizing = function ( bRedraw )
+ {
+ var oSettings = _fnSettingsFromNode(this[DataTable.ext.iApiIndex]);
+ _fnAdjustColumnSizing( oSettings );
+
+ if ( bRedraw === undefined || bRedraw )
+ {
+ this.fnDraw( false );
+ }
+ else if ( oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "" )
+ {
+ /* If not redrawing, but scrolling, we want to apply the new column sizes anyway */
+ this.oApi._fnScrollDraw(oSettings);
+ }
+ };
+
+
+ /**
+ * Quickly and simply clear a table
+ * @param {bool} [bRedraw=true] redraw the table or not
+ * @dtopt API
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...)
+ * oTable.fnClearTable();
+ * } );
+ */
+ this.fnClearTable = function( bRedraw )
+ {
+ /* Find settings from table node */
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+ _fnClearTable( oSettings );
+
+ if ( bRedraw === undefined || bRedraw )
+ {
+ _fnDraw( oSettings );
+ }
+ };
+
+
+ /**
+ * The exact opposite of 'opening' a row, this function will close any rows which
+ * are currently 'open'.
+ * @param {node} nTr the table row to 'close'
+ * @returns {int} 0 on success, or 1 if failed (can't find the row)
+ * @dtopt API
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable;
+ *
+ * // 'open' an information row when a row is clicked on
+ * $('#example tbody tr').click( function () {
+ * if ( oTable.fnIsOpen(this) ) {
+ * oTable.fnClose( this );
+ * } else {
+ * oTable.fnOpen( this, "Temporary row opened", "info_row" );
+ * }
+ * } );
+ *
+ * oTable = $('#example').dataTable();
+ * } );
+ */
+ this.fnClose = function( nTr )
+ {
+ /* Find settings from table node */
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+
+ for ( var i=0 ; i<oSettings.aoOpenRows.length ; i++ )
+ {
+ if ( oSettings.aoOpenRows[i].nParent == nTr )
+ {
+ var nTrParent = oSettings.aoOpenRows[i].nTr.parentNode;
+ if ( nTrParent )
+ {
+ /* Remove it if it is currently on display */
+ nTrParent.removeChild( oSettings.aoOpenRows[i].nTr );
+ }
+ oSettings.aoOpenRows.splice( i, 1 );
+ return 0;
+ }
+ }
+ return 1;
+ };
+
+
+ /**
+ * Remove a row for the table
+ * @param {mixed} mTarget The index of the row from aoData to be deleted, or
+ * the TR element you want to delete
+ * @param {function|null} [fnCallBack] Callback function
+ * @param {bool} [bRedraw=true] Redraw the table or not
+ * @returns {array} The row that was deleted
+ * @dtopt API
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Immediately remove the first row
+ * oTable.fnDeleteRow( 0 );
+ * } );
+ */
+ this.fnDeleteRow = function( mTarget, fnCallBack, bRedraw )
+ {
+ /* Find settings from table node */
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+ var i, iLen, iAODataIndex;
+
+ iAODataIndex = (typeof mTarget === 'object') ?
+ _fnNodeToDataIndex(oSettings, mTarget) : mTarget;
+
+ /* Return the data array from this row */
+ var oData = oSettings.aoData.splice( iAODataIndex, 1 );
+
+ /* Update the _DT_RowIndex parameter */
+ for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
+ {
+ if ( oSettings.aoData[i].nTr !== null )
+ {
+ oSettings.aoData[i].nTr._DT_RowIndex = i;
+ }
+ }
+
+ /* Remove the target row from the search array */
+ var iDisplayIndex = $.inArray( iAODataIndex, oSettings.aiDisplay );
+ oSettings.asDataSearch.splice( iDisplayIndex, 1 );
+
+ /* Delete from the display arrays */
+ _fnDeleteIndex( oSettings.aiDisplayMaster, iAODataIndex );
+ _fnDeleteIndex( oSettings.aiDisplay, iAODataIndex );
+
+ /* If there is a user callback function - call it */
+ if ( typeof fnCallBack === "function" )
+ {
+ fnCallBack.call( this, oSettings, oData );
+ }
+
+ /* Check for an 'overflow' they case for displaying the table */
+ if ( oSettings._iDisplayStart >= oSettings.fnRecordsDisplay() )
+ {
+ oSettings._iDisplayStart -= oSettings._iDisplayLength;
+ if ( oSettings._iDisplayStart < 0 )
+ {
+ oSettings._iDisplayStart = 0;
+ }
+ }
+
+ if ( bRedraw === undefined || bRedraw )
+ {
+ _fnCalculateEnd( oSettings );
+ _fnDraw( oSettings );
+ }
+
+ return oData;
+ };
+
+
+ /**
+ * Restore the table to it's original state in the DOM by removing all of DataTables
+ * enhancements, alterations to the DOM structure of the table and event listeners.
+ * @param {boolean} [bRemove=false] Completely remove the table from the DOM
+ * @dtopt API
+ *
+ * @example
+ * $(document).ready(function() {
+ * // This example is fairly pointless in reality, but shows how fnDestroy can be used
+ * var oTable = $('#example').dataTable();
+ * oTable.fnDestroy();
+ * } );
+ */
+ this.fnDestroy = function ( bRemove )
+ {
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+ var nOrig = oSettings.nTableWrapper.parentNode;
+ var nBody = oSettings.nTBody;
+ var i, iLen;
+
+ bRemove = (bRemove===undefined) ? false : bRemove;
+
+ /* Flag to note that the table is currently being destroyed - no action should be taken */
+ oSettings.bDestroying = true;
+
+ /* Fire off the destroy callbacks for plug-ins etc */
+ _fnCallbackFire( oSettings, "aoDestroyCallback", "destroy", [oSettings] );
+
+ /* If the table is not being removed, restore the hidden columns */
+ if ( !bRemove )
+ {
+ for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+ {
+ if ( oSettings.aoColumns[i].bVisible === false )
+ {
+ this.fnSetColumnVis( i, true );
+ }
+ }
+ }
+
+ /* Blitz all DT events */
+ $(oSettings.nTableWrapper).find('*').andSelf().unbind('.DT');
+
+ /* If there is an 'empty' indicator row, remove it */
+ $('tbody>tr>td.'+oSettings.oClasses.sRowEmpty, oSettings.nTable).parent().remove();
+
+ /* When scrolling we had to break the table up - restore it */
+ if ( oSettings.nTable != oSettings.nTHead.parentNode )
+ {
+ $(oSettings.nTable).children('thead').remove();
+ oSettings.nTable.appendChild( oSettings.nTHead );
+ }
+
+ if ( oSettings.nTFoot && oSettings.nTable != oSettings.nTFoot.parentNode )
+ {
+ $(oSettings.nTable).children('tfoot').remove();
+ oSettings.nTable.appendChild( oSettings.nTFoot );
+ }
+
+ /* Remove the DataTables generated nodes, events and classes */
+ oSettings.nTable.parentNode.removeChild( oSettings.nTable );
+ $(oSettings.nTableWrapper).remove();
+
+ oSettings.aaSorting = [];
+ oSettings.aaSortingFixed = [];
+ _fnSortingClasses( oSettings );
+
+ $(_fnGetTrNodes( oSettings )).removeClass( oSettings.asStripeClasses.join(' ') );
+
+ $('th, td', oSettings.nTHead).removeClass( [
+ oSettings.oClasses.sSortable,
+ oSettings.oClasses.sSortableAsc,
+ oSettings.oClasses.sSortableDesc,
+ oSettings.oClasses.sSortableNone ].join(' ')
+ );
+ if ( oSettings.bJUI )
+ {
+ $('th span.'+oSettings.oClasses.sSortIcon
+ + ', td span.'+oSettings.oClasses.sSortIcon, oSettings.nTHead).remove();
+
+ $('th, td', oSettings.nTHead).each( function () {
+ var jqWrapper = $('div.'+oSettings.oClasses.sSortJUIWrapper, this);
+ var kids = jqWrapper.contents();
+ $(this).append( kids );
+ jqWrapper.remove();
+ } );
+ }
+
+ /* Add the TR elements back into the table in their original order */
+ if ( !bRemove && oSettings.nTableReinsertBefore )
+ {
+ nOrig.insertBefore( oSettings.nTable, oSettings.nTableReinsertBefore );
+ }
+ else if ( !bRemove )
+ {
+ nOrig.appendChild( oSettings.nTable );
+ }
+
+ for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
+ {
+ if ( oSettings.aoData[i].nTr !== null )
+ {
+ nBody.appendChild( oSettings.aoData[i].nTr );
+ }
+ }
+
+ /* Restore the width of the original table */
+ if ( oSettings.oFeatures.bAutoWidth === true )
+ {
+ oSettings.nTable.style.width = _fnStringToCss(oSettings.sDestroyWidth);
+ }
+
+ /* If the were originally stripe classes - then we add them back here. Note
+ * this is not fool proof (for example if not all rows had stripe classes - but
+ * it's a good effort without getting carried away
+ */
+ iLen = oSettings.asDestroyStripes.length;
+ if (iLen)
+ {
+ var anRows = $(nBody).children('tr');
+ for ( i=0 ; i<iLen ; i++ )
+ {
+ anRows.filter(':nth-child(' + iLen + 'n + ' + i + ')').addClass( oSettings.asDestroyStripes[i] );
+ }
+ }
+
+ /* Remove the settings object from the settings array */
+ for ( i=0, iLen=DataTable.settings.length ; i<iLen ; i++ )
+ {
+ if ( DataTable.settings[i] == oSettings )
+ {
+ DataTable.settings.splice( i, 1 );
+ }
+ }
+
+ /* End it all */
+ oSettings = null;
+ oInit = null;
+ };
+
+
+ /**
+ * Redraw the table
+ * @param {bool} [bComplete=true] Re-filter and resort (if enabled) the table before the draw.
+ * @dtopt API
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Re-draw the table - you wouldn't want to do it here, but it's an example :-)
+ * oTable.fnDraw();
+ * } );
+ */
+ this.fnDraw = function( bComplete )
+ {
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+ if ( bComplete === false )
+ {
+ _fnCalculateEnd( oSettings );
+ _fnDraw( oSettings );
+ }
+ else
+ {
+ _fnReDraw( oSettings );
+ }
+ };
+
+
+ /**
+ * Filter the input based on data
+ * @param {string} sInput String to filter the table on
+ * @param {int|null} [iColumn] Column to limit filtering to
+ * @param {bool} [bRegex=false] Treat as regular expression or not
+ * @param {bool} [bSmart=true] Perform smart filtering or not
+ * @param {bool} [bShowGlobal=true] Show the input global filter in it's input box(es)
+ * @param {bool} [bCaseInsensitive=true] Do case-insensitive matching (true) or not (false)
+ * @dtopt API
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Sometime later - filter...
+ * oTable.fnFilter( 'test string' );
+ * } );
+ */
+ this.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal, bCaseInsensitive )
+ {
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+
+ if ( !oSettings.oFeatures.bFilter )
+ {
+ return;
+ }
+
+ if ( bRegex === undefined || bRegex === null )
+ {
+ bRegex = false;
+ }
+
+ if ( bSmart === undefined || bSmart === null )
+ {
+ bSmart = true;
+ }
+
+ if ( bShowGlobal === undefined || bShowGlobal === null )
+ {
+ bShowGlobal = true;
+ }
+
+ if ( bCaseInsensitive === undefined || bCaseInsensitive === null )
+ {
+ bCaseInsensitive = true;
+ }
+
+ if ( iColumn === undefined || iColumn === null )
+ {
+ /* Global filter */
+ _fnFilterComplete( oSettings, {
+ "sSearch":sInput+"",
+ "bRegex": bRegex,
+ "bSmart": bSmart,
+ "bCaseInsensitive": bCaseInsensitive
+ }, 1 );
+
+ if ( bShowGlobal && oSettings.aanFeatures.f )
+ {
+ var n = oSettings.aanFeatures.f;
+ for ( var i=0, iLen=n.length ; i<iLen ; i++ )
+ {
+ // IE9 throws an 'unknown error' if document.activeElement is used
+ // inside an iframe or frame...
+ try {
+ if ( n[i]._DT_Input != document.activeElement )
+ {
+ $(n[i]._DT_Input).val( sInput );
+ }
+ }
+ catch ( e ) {
+ $(n[i]._DT_Input).val( sInput );
+ }
+ }
+ }
+ }
+ else
+ {
+ /* Single column filter */
+ $.extend( oSettings.aoPreSearchCols[ iColumn ], {
+ "sSearch": sInput+"",
+ "bRegex": bRegex,
+ "bSmart": bSmart,
+ "bCaseInsensitive": bCaseInsensitive
+ } );
+ _fnFilterComplete( oSettings, oSettings.oPreviousSearch, 1 );
+ }
+ };
+
+
+ /**
+ * Get the data for the whole table, an individual row or an individual cell based on the
+ * provided parameters.
+ * @param {int|node} [mRow] A TR row node, TD/TH cell node or an integer. If given as
+ * a TR node then the data source for the whole row will be returned. If given as a
+ * TD/TH cell node then iCol will be automatically calculated and the data for the
+ * cell returned. If given as an integer, then this is treated as the aoData internal
+ * data index for the row (see fnGetPosition) and the data for that row used.
+ * @param {int} [iCol] Optional column index that you want the data of.
+ * @returns {array|object|string} If mRow is undefined, then the data for all rows is
+ * returned. If mRow is defined, just data for that row, and is iCol is
+ * defined, only data for the designated cell is returned.
+ * @dtopt API
+ *
+ * @example
+ * // Row data
+ * $(document).ready(function() {
+ * oTable = $('#example').dataTable();
+ *
+ * oTable.$('tr').click( function () {
+ * var data = oTable.fnGetData( this );
+ * // ... do something with the array / object of data for the row
+ * } );
+ * } );
+ *
+ * @example
+ * // Individual cell data
+ * $(document).ready(function() {
+ * oTable = $('#example').dataTable();
+ *
+ * oTable.$('td').click( function () {
+ * var sData = oTable.fnGetData( this );
+ * alert( 'The cell clicked on had the value of '+sData );
+ * } );
+ * } );
+ */
+ this.fnGetData = function( mRow, iCol )
+ {
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+
+ if ( mRow !== undefined )
+ {
+ var iRow = mRow;
+ if ( typeof mRow === 'object' )
+ {
+ var sNode = mRow.nodeName.toLowerCase();
+ if (sNode === "tr" )
+ {
+ iRow = _fnNodeToDataIndex(oSettings, mRow);
+ }
+ else if ( sNode === "td" )
+ {
+ iRow = _fnNodeToDataIndex(oSettings, mRow.parentNode);
+ iCol = _fnNodeToColumnIndex( oSettings, iRow, mRow );
+ }
+ }
+
+ if ( iCol !== undefined )
+ {
+ return _fnGetCellData( oSettings, iRow, iCol, '' );
+ }
+ return (oSettings.aoData[iRow]!==undefined) ?
+ oSettings.aoData[iRow]._aData : null;
+ }
+ return _fnGetDataMaster( oSettings );
+ };
+
+
+ /**
+ * Get an array of the TR nodes that are used in the table's body. Note that you will
+ * typically want to use the '$' API method in preference to this as it is more
+ * flexible.
+ * @param {int} [iRow] Optional row index for the TR element you want
+ * @returns {array|node} If iRow is undefined, returns an array of all TR elements
+ * in the table's body, or iRow is defined, just the TR element requested.
+ * @dtopt API
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Get the nodes from the table
+ * var nNodes = oTable.fnGetNodes( );
+ * } );
+ */
+ this.fnGetNodes = function( iRow )
+ {
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+
+ if ( iRow !== undefined ) {
+ return (oSettings.aoData[iRow]!==undefined) ?
+ oSettings.aoData[iRow].nTr : null;
+ }
+ return _fnGetTrNodes( oSettings );
+ };
+
+
+ /**
+ * Get the array indexes of a particular cell from it's DOM element
+ * and column index including hidden columns
+ * @param {node} nNode this can either be a TR, TD or TH in the table's body
+ * @returns {int} If nNode is given as a TR, then a single index is returned, or
+ * if given as a cell, an array of [row index, column index (visible),
+ * column index (all)] is given.
+ * @dtopt API
+ *
+ * @example
+ * $(document).ready(function() {
+ * $('#example tbody td').click( function () {
+ * // Get the position of the current data from the node
+ * var aPos = oTable.fnGetPosition( this );
+ *
+ * // Get the data array for this row
+ * var aData = oTable.fnGetData( aPos[0] );
+ *
+ * // Update the data array and return the value
+ * aData[ aPos[1] ] = 'clicked';
+ * this.innerHTML = 'clicked';
+ * } );
+ *
+ * // Init DataTables
+ * oTable = $('#example').dataTable();
+ * } );
+ */
+ this.fnGetPosition = function( nNode )
+ {
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+ var sNodeName = nNode.nodeName.toUpperCase();
+
+ if ( sNodeName == "TR" )
+ {
+ return _fnNodeToDataIndex(oSettings, nNode);
+ }
+ else if ( sNodeName == "TD" || sNodeName == "TH" )
+ {
+ var iDataIndex = _fnNodeToDataIndex( oSettings, nNode.parentNode );
+ var iColumnIndex = _fnNodeToColumnIndex( oSettings, iDataIndex, nNode );
+ return [ iDataIndex, _fnColumnIndexToVisible(oSettings, iColumnIndex ), iColumnIndex ];
+ }
+ return null;
+ };
+
+
+ /**
+ * Check to see if a row is 'open' or not.
+ * @param {node} nTr the table row to check
+ * @returns {boolean} true if the row is currently open, false otherwise
+ * @dtopt API
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable;
+ *
+ * // 'open' an information row when a row is clicked on
+ * $('#example tbody tr').click( function () {
+ * if ( oTable.fnIsOpen(this) ) {
+ * oTable.fnClose( this );
+ * } else {
+ * oTable.fnOpen( this, "Temporary row opened", "info_row" );
+ * }
+ * } );
+ *
+ * oTable = $('#example').dataTable();
+ * } );
+ */
+ this.fnIsOpen = function( nTr )
+ {
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+ var aoOpenRows = oSettings.aoOpenRows;
+
+ for ( var i=0 ; i<oSettings.aoOpenRows.length ; i++ )
+ {
+ if ( oSettings.aoOpenRows[i].nParent == nTr )
+ {
+ return true;
+ }
+ }
+ return false;
+ };
+
+
+ /**
+ * This function will place a new row directly after a row which is currently
+ * on display on the page, with the HTML contents that is passed into the
+ * function. This can be used, for example, to ask for confirmation that a
+ * particular record should be deleted.
+ * @param {node} nTr The table row to 'open'
+ * @param {string|node|jQuery} mHtml The HTML to put into the row
+ * @param {string} sClass Class to give the new TD cell
+ * @returns {node} The row opened. Note that if the table row passed in as the
+ * first parameter, is not found in the table, this method will silently
+ * return.
+ * @dtopt API
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable;
+ *
+ * // 'open' an information row when a row is clicked on
+ * $('#example tbody tr').click( function () {
+ * if ( oTable.fnIsOpen(this) ) {
+ * oTable.fnClose( this );
+ * } else {
+ * oTable.fnOpen( this, "Temporary row opened", "info_row" );
+ * }
+ * } );
+ *
+ * oTable = $('#example').dataTable();
+ * } );
+ */
+ this.fnOpen = function( nTr, mHtml, sClass )
+ {
+ /* Find settings from table node */
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+
+ /* Check that the row given is in the table */
+ var nTableRows = _fnGetTrNodes( oSettings );
+ if ( $.inArray(nTr, nTableRows) === -1 )
+ {
+ return;
+ }
+
+ /* the old open one if there is one */
+ this.fnClose( nTr );
+
+ var nNewRow = document.createElement("tr");
+ var nNewCell = document.createElement("td");
+ nNewRow.appendChild( nNewCell );
+ nNewCell.className = sClass;
+ nNewCell.colSpan = _fnVisbleColumns( oSettings );
+
+ if (typeof mHtml === "string")
+ {
+ nNewCell.innerHTML = mHtml;
+ }
+ else
+ {
+ $(nNewCell).html( mHtml );
+ }
+
+ /* If the nTr isn't on the page at the moment - then we don't insert at the moment */
+ var nTrs = $('tr', oSettings.nTBody);
+ if ( $.inArray(nTr, nTrs) != -1 )
+ {
+ $(nNewRow).insertAfter(nTr);
+ }
+
+ oSettings.aoOpenRows.push( {
+ "nTr": nNewRow,
+ "nParent": nTr
+ } );
+
+ return nNewRow;
+ };
+
+
+ /**
+ * Change the pagination - provides the internal logic for pagination in a simple API
+ * function. With this function you can have a DataTables table go to the next,
+ * previous, first or last pages.
+ * @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last"
+ * or page number to jump to (integer), note that page 0 is the first page.
+ * @param {bool} [bRedraw=true] Redraw the table or not
+ * @dtopt API
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ * oTable.fnPageChange( 'next' );
+ * } );
+ */
+ this.fnPageChange = function ( mAction, bRedraw )
+ {
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+ _fnPageChange( oSettings, mAction );
+ _fnCalculateEnd( oSettings );
+
+ if ( bRedraw === undefined || bRedraw )
+ {
+ _fnDraw( oSettings );
+ }
+ };
+
+
+ /**
+ * Show a particular column
+ * @param {int} iCol The column whose display should be changed
+ * @param {bool} bShow Show (true) or hide (false) the column
+ * @param {bool} [bRedraw=true] Redraw the table or not
+ * @dtopt API
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Hide the second column after initialisation
+ * oTable.fnSetColumnVis( 1, false );
+ * } );
+ */
+ this.fnSetColumnVis = function ( iCol, bShow, bRedraw )
+ {
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+ var i, iLen;
+ var aoColumns = oSettings.aoColumns;
+ var aoData = oSettings.aoData;
+ var nTd, bAppend, iBefore;
+
+ /* No point in doing anything if we are requesting what is already true */
+ if ( aoColumns[iCol].bVisible == bShow )
+ {
+ return;
+ }
+
+ /* Show the column */
+ if ( bShow )
+ {
+ var iInsert = 0;
+ for ( i=0 ; i<iCol ; i++ )
+ {
+ if ( aoColumns[i].bVisible )
+ {
+ iInsert++;
+ }
+ }
+
+ /* Need to decide if we should use appendChild or insertBefore */
+ bAppend = (iInsert >= _fnVisbleColumns( oSettings ));
+
+ /* Which coloumn should we be inserting before? */
+ if ( !bAppend )
+ {
+ for ( i=iCol ; i<aoColumns.length ; i++ )
+ {
+ if ( aoColumns[i].bVisible )
+ {
+ iBefore = i;
+ break;
+ }
+ }
+ }
+
+ for ( i=0, iLen=aoData.length ; i<iLen ; i++ )
+ {
+ if ( aoData[i].nTr !== null )
+ {
+ if ( bAppend )
+ {
+ aoData[i].nTr.appendChild(
+ aoData[i]._anHidden[iCol]
+ );
+ }
+ else
+ {
+ aoData[i].nTr.insertBefore(
+ aoData[i]._anHidden[iCol],
+ _fnGetTdNodes( oSettings, i )[iBefore] );
+ }
+ }
+ }
+ }
+ else
+ {
+ /* Remove a column from display */
+ for ( i=0, iLen=aoData.length ; i<iLen ; i++ )
+ {
+ if ( aoData[i].nTr !== null )
+ {
+ nTd = _fnGetTdNodes( oSettings, i )[iCol];
+ aoData[i]._anHidden[iCol] = nTd;
+ nTd.parentNode.removeChild( nTd );
+ }
+ }
+ }
+
+ /* Clear to set the visible flag */
+ aoColumns[iCol].bVisible = bShow;
+
+ /* Redraw the header and footer based on the new column visibility */
+ _fnDrawHead( oSettings, oSettings.aoHeader );
+ if ( oSettings.nTFoot )
+ {
+ _fnDrawHead( oSettings, oSettings.aoFooter );
+ }
+
+ /* If there are any 'open' rows, then we need to alter the colspan for this col change */
+ for ( i=0, iLen=oSettings.aoOpenRows.length ; i<iLen ; i++ )
+ {
+ oSettings.aoOpenRows[i].nTr.colSpan = _fnVisbleColumns( oSettings );
+ }
+
+ /* Do a redraw incase anything depending on the table columns needs it
+ * (built-in: scrolling)
+ */
+ if ( bRedraw === undefined || bRedraw )
+ {
+ _fnAdjustColumnSizing( oSettings );
+ _fnDraw( oSettings );
+ }
+
+ _fnSaveState( oSettings );
+ };
+
+
+ /**
+ * Get the settings for a particular table for external manipulation
+ * @returns {object} DataTables settings object. See
+ * {@link DataTable.models.oSettings}
+ * @dtopt API
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ * var oSettings = oTable.fnSettings();
+ *
+ * // Show an example parameter from the settings
+ * alert( oSettings._iDisplayStart );
+ * } );
+ */
+ this.fnSettings = function()
+ {
+ return _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+ };
+
+
+ /**
+ * Sort the table by a particular column
+ * @param {int} iCol the data index to sort on. Note that this will not match the
+ * 'display index' if you have hidden data entries
+ * @dtopt API
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Sort immediately with columns 0 and 1
+ * oTable.fnSort( [ [0,'asc'], [1,'asc'] ] );
+ * } );
+ */
+ this.fnSort = function( aaSort )
+ {
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+ oSettings.aaSorting = aaSort;
+ _fnSort( oSettings );
+ };
+
+
+ /**
+ * Attach a sort listener to an element for a given column
+ * @param {node} nNode the element to attach the sort listener to
+ * @param {int} iColumn the column that a click on this node will sort on
+ * @param {function} [fnCallback] callback function when sort is run
+ * @dtopt API
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Sort on column 1, when 'sorter' is clicked on
+ * oTable.fnSortListener( document.getElementById('sorter'), 1 );
+ * } );
+ */
+ this.fnSortListener = function( nNode, iColumn, fnCallback )
+ {
+ _fnSortAttachListener( _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ), nNode, iColumn,
+ fnCallback );
+ };
+
+
+ /**
+ * Update a table cell or row - this method will accept either a single value to
+ * update the cell with, an array of values with one element for each column or
+ * an object in the same format as the original data source. The function is
+ * self-referencing in order to make the multi column updates easier.
+ * @param {object|array|string} mData Data to update the cell/row with
+ * @param {node|int} mRow TR element you want to update or the aoData index
+ * @param {int} [iColumn] The column to update (not used of mData is an array or object)
+ * @param {bool} [bRedraw=true] Redraw the table or not
+ * @param {bool} [bAction=true] Perform pre-draw actions or not
+ * @returns {int} 0 on success, 1 on error
+ * @dtopt API
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ * oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell
+ * oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], 1, 0 ); // Row
+ * } );
+ */
+ this.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction )
+ {
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
+ var i, iLen, sDisplay;
+ var iRow = (typeof mRow === 'object') ?
+ _fnNodeToDataIndex(oSettings, mRow) : mRow;
+
+ if ( $.isArray(mData) && iColumn === undefined )
+ {
+ /* Array update - update the whole row */
+ oSettings.aoData[iRow]._aData = mData.slice();
+
+ /* Flag to the function that we are recursing */
+ for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
+ {
+ this.fnUpdate( _fnGetCellData( oSettings, iRow, i ), iRow, i, false, false );
+ }
+ }
+ else if ( $.isPlainObject(mData) && iColumn === undefined )
+ {
+ /* Object update - update the whole row - assume the developer gets the object right */
+ oSettings.aoData[iRow]._aData = $.extend( true, {}, mData );
+
+ for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
+ {
+ this.fnUpdate( _fnGetCellData( oSettings, iRow, i ), iRow, i, false, false );
+ }
+ }
+ else
+ {
+ /* Individual cell update */
+ _fnSetCellData( oSettings, iRow, iColumn, mData );
+ sDisplay = _fnGetCellData( oSettings, iRow, iColumn, 'display' );
+
+ var oCol = oSettings.aoColumns[iColumn];
+ if ( oCol.fnRender !== null )
+ {
+ sDisplay = _fnRender( oSettings, iRow, iColumn );
+ if ( oCol.bUseRendered )
+ {
+ _fnSetCellData( oSettings, iRow, iColumn, sDisplay );
+ }
+ }
+
+ if ( oSettings.aoData[iRow].nTr !== null )
+ {
+ /* Do the actual HTML update */
+ _fnGetTdNodes( oSettings, iRow )[iColumn].innerHTML = sDisplay;
+ }
+ }
+
+ /* Modify the search index for this row (strictly this is likely not needed, since fnReDraw
+ * will rebuild the search array - however, the redraw might be disabled by the user)
+ */
+ var iDisplayIndex = $.inArray( iRow, oSettings.aiDisplay );
+ oSettings.asDataSearch[iDisplayIndex] = _fnBuildSearchRow(
+ oSettings,
+ _fnGetRowData( oSettings, iRow, 'filter', _fnGetColumns( oSettings, 'bSearchable' ) )
+ );
+
+ /* Perform pre-draw actions */
+ if ( bAction === undefined || bAction )
+ {
+ _fnAdjustColumnSizing( oSettings );
+ }
+
+ /* Redraw the table */
+ if ( bRedraw === undefined || bRedraw )
+ {
+ _fnReDraw( oSettings );
+ }
+ return 0;
+ };
+
+
+ /**
+ * Provide a common method for plug-ins to check the version of DataTables being used, in order
+ * to ensure compatibility.
+ * @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note that the
+ * formats "X" and "X.Y" are also acceptable.
+ * @returns {boolean} true if this version of DataTables is greater or equal to the required
+ * version, or false if this version of DataTales is not suitable
+ * @method
+ * @dtopt API
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ * alert( oTable.fnVersionCheck( '1.9.0' ) );
+ * } );
+ */
+ this.fnVersionCheck = DataTable.ext.fnVersionCheck;
+
+
+ /*
+ * This is really a good bit rubbish this method of exposing the internal methods
+ * publicly... - To be fixed in 2.0 using methods on the prototype
+ */
+
+
+ /**
+ * Create a wrapper function for exporting an internal functions to an external API.
+ * @param {string} sFunc API function name
+ * @returns {function} wrapped function
+ * @memberof DataTable#oApi
+ */
+ function _fnExternApiFunc (sFunc)
+ {
+ return function() {
+ var aArgs = [_fnSettingsFromNode(this[DataTable.ext.iApiIndex])].concat(
+ Array.prototype.slice.call(arguments) );
+ return DataTable.ext.oApi[sFunc].apply( this, aArgs );
+ };
+ }
+
+
+ /**
+ * Reference to internal functions for use by plug-in developers. Note that these
+ * methods are references to internal functions and are considered to be private.
+ * If you use these methods, be aware that they are liable to change between versions
+ * (check the upgrade notes).
+ * @namespace
+ */
+ this.oApi = {
+ "_fnExternApiFunc": _fnExternApiFunc,
+ "_fnInitialise": _fnInitialise,
+ "_fnInitComplete": _fnInitComplete,
+ "_fnLanguageCompat": _fnLanguageCompat,
+ "_fnAddColumn": _fnAddColumn,
+ "_fnColumnOptions": _fnColumnOptions,
+ "_fnAddData": _fnAddData,
+ "_fnCreateTr": _fnCreateTr,
+ "_fnGatherData": _fnGatherData,
+ "_fnBuildHead": _fnBuildHead,
+ "_fnDrawHead": _fnDrawHead,
+ "_fnDraw": _fnDraw,
+ "_fnReDraw": _fnReDraw,
+ "_fnAjaxUpdate": _fnAjaxUpdate,
+ "_fnAjaxParameters": _fnAjaxParameters,
+ "_fnAjaxUpdateDraw": _fnAjaxUpdateDraw,
+ "_fnServerParams": _fnServerParams,
+ "_fnAddOptionsHtml": _fnAddOptionsHtml,
+ "_fnFeatureHtmlTable": _fnFeatureHtmlTable,
+ "_fnScrollDraw": _fnScrollDraw,
+ "_fnAdjustColumnSizing": _fnAdjustColumnSizing,
+ "_fnFeatureHtmlFilter": _fnFeatureHtmlFilter,
+ "_fnFilterComplete": _fnFilterComplete,
+ "_fnFilterCustom": _fnFilterCustom,
+ "_fnFilterColumn": _fnFilterColumn,
+ "_fnFilter": _fnFilter,
+ "_fnBuildSearchArray": _fnBuildSearchArray,
+ "_fnBuildSearchRow": _fnBuildSearchRow,
+ "_fnFilterCreateSearch": _fnFilterCreateSearch,
+ "_fnDataToSearch": _fnDataToSearch,
+ "_fnSort": _fnSort,
+ "_fnSortAttachListener": _fnSortAttachListener,
+ "_fnSortingClasses": _fnSortingClasses,
+ "_fnFeatureHtmlPaginate": _fnFeatureHtmlPaginate,
+ "_fnPageChange": _fnPageChange,
+ "_fnFeatureHtmlInfo": _fnFeatureHtmlInfo,
+ "_fnUpdateInfo": _fnUpdateInfo,
+ "_fnFeatureHtmlLength": _fnFeatureHtmlLength,
+ "_fnFeatureHtmlProcessing": _fnFeatureHtmlProcessing,
+ "_fnProcessingDisplay": _fnProcessingDisplay,
+ "_fnVisibleToColumnIndex": _fnVisibleToColumnIndex,
+ "_fnColumnIndexToVisible": _fnColumnIndexToVisible,
+ "_fnNodeToDataIndex": _fnNodeToDataIndex,
+ "_fnVisbleColumns": _fnVisbleColumns,
+ "_fnCalculateEnd": _fnCalculateEnd,
+ "_fnConvertToWidth": _fnConvertToWidth,
+ "_fnCalculateColumnWidths": _fnCalculateColumnWidths,
+ "_fnScrollingWidthAdjust": _fnScrollingWidthAdjust,
+ "_fnGetWidestNode": _fnGetWidestNode,
+ "_fnGetMaxLenString": _fnGetMaxLenString,
+ "_fnStringToCss": _fnStringToCss,
+ "_fnDetectType": _fnDetectType,
+ "_fnSettingsFromNode": _fnSettingsFromNode,
+ "_fnGetDataMaster": _fnGetDataMaster,
+ "_fnGetTrNodes": _fnGetTrNodes,
+ "_fnGetTdNodes": _fnGetTdNodes,
+ "_fnEscapeRegex": _fnEscapeRegex,
+ "_fnDeleteIndex": _fnDeleteIndex,
+ "_fnReOrderIndex": _fnReOrderIndex,
+ "_fnColumnOrdering": _fnColumnOrdering,
+ "_fnLog": _fnLog,
+ "_fnClearTable": _fnClearTable,
+ "_fnSaveState": _fnSaveState,
+ "_fnLoadState": _fnLoadState,
+ "_fnCreateCookie": _fnCreateCookie,
+ "_fnReadCookie": _fnReadCookie,
+ "_fnDetectHeader": _fnDetectHeader,
+ "_fnGetUniqueThs": _fnGetUniqueThs,
+ "_fnScrollBarWidth": _fnScrollBarWidth,
+ "_fnApplyToChildren": _fnApplyToChildren,
+ "_fnMap": _fnMap,
+ "_fnGetRowData": _fnGetRowData,
+ "_fnGetCellData": _fnGetCellData,
+ "_fnSetCellData": _fnSetCellData,
+ "_fnGetObjectDataFn": _fnGetObjectDataFn,
+ "_fnSetObjectDataFn": _fnSetObjectDataFn,
+ "_fnApplyColumnDefs": _fnApplyColumnDefs,
+ "_fnBindAction": _fnBindAction,
+ "_fnExtend": _fnExtend,
+ "_fnCallbackReg": _fnCallbackReg,
+ "_fnCallbackFire": _fnCallbackFire,
+ "_fnJsonString": _fnJsonString,
+ "_fnRender": _fnRender,
+ "_fnNodeToColumnIndex": _fnNodeToColumnIndex,
+ "_fnInfoMacros": _fnInfoMacros,
+ "_fnBrowserDetect": _fnBrowserDetect,
+ "_fnGetColumns": _fnGetColumns
+ };
+
+ $.extend( DataTable.ext.oApi, this.oApi );
+
+ for ( var sFunc in DataTable.ext.oApi )
+ {
+ if ( sFunc )
+ {
+ this[sFunc] = _fnExternApiFunc(sFunc);
+ }
+ }
+
+
+ var _that = this;
+ this.each(function() {
+ var i=0, iLen, j, jLen, k, kLen;
+ var sId = this.getAttribute( 'id' );
+ var bInitHandedOff = false;
+ var bUsePassedData = false;
+
+
+ /* Sanity check */
+ if ( this.nodeName.toLowerCase() != 'table' )
+ {
+ _fnLog( null, 0, "Attempted to initialise DataTables on a node which is not a "+
+ "table: "+this.nodeName );
+ return;
+ }
+
+ /* Check to see if we are re-initialising a table */
+ for ( i=0, iLen=DataTable.settings.length ; i<iLen ; i++ )
+ {
+ /* Base check on table node */
+ if ( DataTable.settings[i].nTable == this )
+ {
+ if ( oInit === undefined || oInit.bRetrieve )
+ {
+ return DataTable.settings[i].oInstance;
+ }
+ else if ( oInit.bDestroy )
+ {
+ DataTable.settings[i].oInstance.fnDestroy();
+ break;
+ }
+ else
+ {
+ _fnLog( DataTable.settings[i], 0, "Cannot reinitialise DataTable.\n\n"+
+ "To retrieve the DataTables object for this table, pass no arguments or see "+
+ "the docs for bRetrieve and bDestroy" );
+ return;
+ }
+ }
+
+ /* If the element we are initialising has the same ID as a table which was previously
+ * initialised, but the table nodes don't match (from before) then we destroy the old
+ * instance by simply deleting it. This is under the assumption that the table has been
+ * destroyed by other methods. Anyone using non-id selectors will need to do this manually
+ */
+ if ( DataTable.settings[i].sTableId == this.id )
+ {
+ DataTable.settings.splice( i, 1 );
+ break;
+ }
+ }
+
+ /* Ensure the table has an ID - required for accessibility */
+ if ( sId === null || sId === "" )
+ {
+ sId = "DataTables_Table_"+(DataTable.ext._oExternConfig.iNextUnique++);
+ this.id = sId;
+ }
+
+ /* Create the settings object for this table and set some of the default parameters */
+ var oSettings = $.extend( true, {}, DataTable.models.oSettings, {
+ "nTable": this,
+ "oApi": _that.oApi,
+ "oInit": oInit,
+ "sDestroyWidth": $(this).width(),
+ "sInstance": sId,
+ "sTableId": sId
+ } );
+ DataTable.settings.push( oSettings );
+
+ // Need to add the instance after the instance after the settings object has been added
+ // to the settings array, so we can self reference the table instance if more than one
+ oSettings.oInstance = (_that.length===1) ? _that : $(this).dataTable();
+
+ /* Setting up the initialisation object */
+ if ( !oInit )
+ {
+ oInit = {};
+ }
+
+ // Backwards compatibility, before we apply all the defaults
+ if ( oInit.oLanguage )
+ {
+ _fnLanguageCompat( oInit.oLanguage );
+ }
+
+ oInit = _fnExtend( $.extend(true, {}, DataTable.defaults), oInit );
+
+ // Map the initialisation options onto the settings object
+ _fnMap( oSettings.oFeatures, oInit, "bPaginate" );
+ _fnMap( oSettings.oFeatures, oInit, "bLengthChange" );
+ _fnMap( oSettings.oFeatures, oInit, "bFilter" );
+ _fnMap( oSettings.oFeatures, oInit, "bSort" );
+ _fnMap( oSettings.oFeatures, oInit, "bInfo" );
+ _fnMap( oSettings.oFeatures, oInit, "bProcessing" );
+ _fnMap( oSettings.oFeatures, oInit, "bAutoWidth" );
+ _fnMap( oSettings.oFeatures, oInit, "bSortClasses" );
+ _fnMap( oSettings.oFeatures, oInit, "bServerSide" );
+ _fnMap( oSettings.oFeatures, oInit, "bDeferRender" );
+ _fnMap( oSettings.oScroll, oInit, "sScrollX", "sX" );
+ _fnMap( oSettings.oScroll, oInit, "sScrollXInner", "sXInner" );
+ _fnMap( oSettings.oScroll, oInit, "sScrollY", "sY" );
+ _fnMap( oSettings.oScroll, oInit, "bScrollCollapse", "bCollapse" );
+ _fnMap( oSettings.oScroll, oInit, "bScrollInfinite", "bInfinite" );
+ _fnMap( oSettings.oScroll, oInit, "iScrollLoadGap", "iLoadGap" );
+ _fnMap( oSettings.oScroll, oInit, "bScrollAutoCss", "bAutoCss" );
+ _fnMap( oSettings, oInit, "asStripeClasses" );
+ _fnMap( oSettings, oInit, "asStripClasses", "asStripeClasses" ); // legacy
+ _fnMap( oSettings, oInit, "fnServerData" );
+ _fnMap( oSettings, oInit, "fnFormatNumber" );
+ _fnMap( oSettings, oInit, "sServerMethod" );
+ _fnMap( oSettings, oInit, "aaSorting" );
+ _fnMap( oSettings, oInit, "aaSortingFixed" );
+ _fnMap( oSettings, oInit, "aLengthMenu" );
+ _fnMap( oSettings, oInit, "sPaginationType" );
+ _fnMap( oSettings, oInit, "sAjaxSource" );
+ _fnMap( oSettings, oInit, "sAjaxDataProp" );
+ _fnMap( oSettings, oInit, "iCookieDuration" );
+ _fnMap( oSettings, oInit, "sCookiePrefix" );
+ _fnMap( oSettings, oInit, "sDom" );
+ _fnMap( oSettings, oInit, "bSortCellsTop" );
+ _fnMap( oSettings, oInit, "iTabIndex" );
+ _fnMap( oSettings, oInit, "oSearch", "oPreviousSearch" );
+ _fnMap( oSettings, oInit, "aoSearchCols", "aoPreSearchCols" );
+ _fnMap( oSettings, oInit, "iDisplayLength", "_iDisplayLength" );
+ _fnMap( oSettings, oInit, "bJQueryUI", "bJUI" );
+ _fnMap( oSettings, oInit, "fnCookieCallback" );
+ _fnMap( oSettings, oInit, "fnStateLoad" );
+ _fnMap( oSettings, oInit, "fnStateSave" );
+ _fnMap( oSettings.oLanguage, oInit, "fnInfoCallback" );
+
+ /* Callback functions which are array driven */
+ _fnCallbackReg( oSettings, 'aoDrawCallback', oInit.fnDrawCallback, 'user' );
+ _fnCallbackReg( oSettings, 'aoServerParams', oInit.fnServerParams, 'user' );
+ _fnCallbackReg( oSettings, 'aoStateSaveParams', oInit.fnStateSaveParams, 'user' );
+ _fnCallbackReg( oSettings, 'aoStateLoadParams', oInit.fnStateLoadParams, 'user' );
+ _fnCallbackReg( oSettings, 'aoStateLoaded', oInit.fnStateLoaded, 'user' );
+ _fnCallbackReg( oSettings, 'aoRowCallback', oInit.fnRowCallback, 'user' );
+ _fnCallbackReg( oSettings, 'aoRowCreatedCallback', oInit.fnCreatedRow, 'user' );
+ _fnCallbackReg( oSettings, 'aoHeaderCallback', oInit.fnHeaderCallback, 'user' );
+ _fnCallbackReg( oSettings, 'aoFooterCallback', oInit.fnFooterCallback, 'user' );
+ _fnCallbackReg( oSettings, 'aoInitComplete', oInit.fnInitComplete, 'user' );
+ _fnCallbackReg( oSettings, 'aoPreDrawCallback', oInit.fnPreDrawCallback, 'user' );
+
+ if ( oSettings.oFeatures.bServerSide && oSettings.oFeatures.bSort &&
+ oSettings.oFeatures.bSortClasses )
+ {
+ /* Enable sort classes for server-side processing. Safe to do it here, since server-side
+ * processing must be enabled by the developer
+ */
+ _fnCallbackReg( oSettings, 'aoDrawCallback', _fnSortingClasses, 'server_side_sort_classes' );
+ }
+ else if ( oSettings.oFeatures.bDeferRender )
+ {
+ _fnCallbackReg( oSettings, 'aoDrawCallback', _fnSortingClasses, 'defer_sort_classes' );
+ }
+
+ if ( oInit.bJQueryUI )
+ {
+ /* Use the JUI classes object for display. You could clone the oStdClasses object if
+ * you want to have multiple tables with multiple independent classes
+ */
+ $.extend( oSettings.oClasses, DataTable.ext.oJUIClasses );
+
+ if ( oInit.sDom === DataTable.defaults.sDom && DataTable.defaults.sDom === "lfrtip" )
+ {
+ /* Set the DOM to use a layout suitable for jQuery UI's theming */
+ oSettings.sDom = '<"H"lfr>t<"F"ip>';
+ }
+ }
+ else
+ {
+ $.extend( oSettings.oClasses, DataTable.ext.oStdClasses );
+ }
+ $(this).addClass( oSettings.oClasses.sTable );
+
+ /* Calculate the scroll bar width and cache it for use later on */
+ if ( oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "" )
+ {
+ oSettings.oScroll.iBarWidth = _fnScrollBarWidth();
+ }
+
+ if ( oSettings.iInitDisplayStart === undefined )
+ {
+ /* Display start point, taking into account the save saving */
+ oSettings.iInitDisplayStart = oInit.iDisplayStart;
+ oSettings._iDisplayStart = oInit.iDisplayStart;
+ }
+
+ /* Must be done after everything which can be overridden by a cookie! */
+ if ( oInit.bStateSave )
+ {
+ oSettings.oFeatures.bStateSave = true;
+ _fnLoadState( oSettings, oInit );
+ _fnCallbackReg( oSettings, 'aoDrawCallback', _fnSaveState, 'state_save' );
+ }
+
+ if ( oInit.iDeferLoading !== null )
+ {
+ oSettings.bDeferLoading = true;
+ var tmp = $.isArray( oInit.iDeferLoading );
+ oSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading;
+ oSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading;
+ }
+
+ if ( oInit.aaData !== null )
+ {
+ bUsePassedData = true;
+ }
+
+ /* Language definitions */
+ if ( oInit.oLanguage.sUrl !== "" )
+ {
+ /* Get the language definitions from a file - because this Ajax call makes the language
+ * get async to the remainder of this function we use bInitHandedOff to indicate that
+ * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor
+ */
+ oSettings.oLanguage.sUrl = oInit.oLanguage.sUrl;
+ $.getJSON( oSettings.oLanguage.sUrl, null, function( json ) {
+ _fnLanguageCompat( json );
+ $.extend( true, oSettings.oLanguage, oInit.oLanguage, json );
+ _fnInitialise( oSettings );
+ } );
+ bInitHandedOff = true;
+ }
+ else
+ {
+ $.extend( true, oSettings.oLanguage, oInit.oLanguage );
+ }
+
+
+ /*
+ * Stripes
+ */
+ if ( oInit.asStripeClasses === null )
+ {
+ oSettings.asStripeClasses =[
+ oSettings.oClasses.sStripeOdd,
+ oSettings.oClasses.sStripeEven
+ ];
+ }
+
+ /* Remove row stripe classes if they are already on the table row */
+ iLen=oSettings.asStripeClasses.length;
+ oSettings.asDestroyStripes = [];
+ if (iLen)
+ {
+ var bStripeRemove = false;
+ var anRows = $(this).children('tbody').children('tr:lt(' + iLen + ')');
+ for ( i=0 ; i<iLen ; i++ )
+ {
+ if ( anRows.hasClass( oSettings.asStripeClasses[i] ) )
+ {
+ bStripeRemove = true;
+
+ /* Store the classes which we are about to remove so they can be re-added on destroy */
+ oSettings.asDestroyStripes.push( oSettings.asStripeClasses[i] );
+ }
+ }
+
+ if ( bStripeRemove )
+ {
+ anRows.removeClass( oSettings.asStripeClasses.join(' ') );
+ }
+ }
+
+ /*
+ * Columns
+ * See if we should load columns automatically or use defined ones
+ */
+ var anThs = [];
+ var aoColumnsInit;
+ var nThead = this.getElementsByTagName('thead');
+ if ( nThead.length !== 0 )
+ {
+ _fnDetectHeader( oSettings.aoHeader, nThead[0] );
+ anThs = _fnGetUniqueThs( oSettings );
+ }
+
+ /* If not given a column array, generate one with nulls */
+ if ( oInit.aoColumns === null )
+ {
+ aoColumnsInit = [];
+ for ( i=0, iLen=anThs.length ; i<iLen ; i++ )
+ {
+ aoColumnsInit.push( null );
+ }
+ }
+ else
+ {
+ aoColumnsInit = oInit.aoColumns;
+ }
+
+ /* Add the columns */
+ for ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ )
+ {
+ /* Short cut - use the loop to check if we have column visibility state to restore */
+ if ( oInit.saved_aoColumns !== undefined && oInit.saved_aoColumns.length == iLen )
+ {
+ if ( aoColumnsInit[i] === null )
+ {
+ aoColumnsInit[i] = {};
+ }
+ aoColumnsInit[i].bVisible = oInit.saved_aoColumns[i].bVisible;
+ }
+
+ _fnAddColumn( oSettings, anThs ? anThs[i] : null );
+ }
+
+ /* Apply the column definitions */
+ _fnApplyColumnDefs( oSettings, oInit.aoColumnDefs, aoColumnsInit, function (iCol, oDef) {
+ _fnColumnOptions( oSettings, iCol, oDef );
+ } );
+
+
+ /*
+ * Sorting
+ * Check the aaSorting array
+ */
+ for ( i=0, iLen=oSettings.aaSorting.length ; i<iLen ; i++ )
+ {
+ if ( oSettings.aaSorting[i][0] >= oSettings.aoColumns.length )
+ {
+ oSettings.aaSorting[i][0] = 0;
+ }
+ var oColumn = oSettings.aoColumns[ oSettings.aaSorting[i][0] ];
+
+ /* Add a default sorting index */
+ if ( oSettings.aaSorting[i][2] === undefined )
+ {
+ oSettings.aaSorting[i][2] = 0;
+ }
+
+ /* If aaSorting is not defined, then we use the first indicator in asSorting */
+ if ( oInit.aaSorting === undefined && oSettings.saved_aaSorting === undefined )
+ {
+ oSettings.aaSorting[i][1] = oColumn.asSorting[0];
+ }
+
+ /* Set the current sorting index based on aoColumns.asSorting */
+ for ( j=0, jLen=oColumn.asSorting.length ; j<jLen ; j++ )
+ {
+ if ( oSettings.aaSorting[i][1] == oColumn.asSorting[j] )
+ {
+ oSettings.aaSorting[i][2] = j;
+ break;
+ }
+ }
+ }
+
+ /* Do a first pass on the sorting classes (allows any size changes to be taken into
+ * account, and also will apply sorting disabled classes if disabled
+ */
+ _fnSortingClasses( oSettings );
+
+
+ /*
+ * Final init
+ * Cache the header, body and footer as required, creating them if needed
+ */
+
+ /* Browser support detection */
+ _fnBrowserDetect( oSettings );
+
+ // Work around for Webkit bug 83867 - store the caption-side before removing from doc
+ var captions = $(this).children('caption').each( function () {
+ this._captionSide = $(this).css('caption-side');
+ } );
+
+ var thead = $(this).children('thead');
+ if ( thead.length === 0 )
+ {
+ thead = [ document.createElement( 'thead' ) ];
+ this.appendChild( thead[0] );
+ }
+ oSettings.nTHead = thead[0];
+
+ var tbody = $(this).children('tbody');
+ if ( tbody.length === 0 )
+ {
+ tbody = [ document.createElement( 'tbody' ) ];
+ this.appendChild( tbody[0] );
+ }
+ oSettings.nTBody = tbody[0];
+ oSettings.nTBody.setAttribute( "role", "alert" );
+ oSettings.nTBody.setAttribute( "aria-live", "polite" );
+ oSettings.nTBody.setAttribute( "aria-relevant", "all" );
+
+ var tfoot = $(this).children('tfoot');
+ if ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "") )
+ {
+ // If we are a scrolling table, and no footer has been given, then we need to create
+ // a tfoot element for the caption element to be appended to
+ tfoot = [ document.createElement( 'tfoot' ) ];
+ this.appendChild( tfoot[0] );
+ }
+
+ if ( tfoot.length > 0 )
+ {
+ oSettings.nTFoot = tfoot[0];
+ _fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot );
+ }
+
+ /* Check if there is data passing into the constructor */
+ if ( bUsePassedData )
+ {
+ for ( i=0 ; i<oInit.aaData.length ; i++ )
+ {
+ _fnAddData( oSettings, oInit.aaData[ i ] );
+ }
+ }
+ else
+ {
+ /* Grab the data from the page */
+ _fnGatherData( oSettings );
+ }
+
+ /* Copy the data index array */
+ oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
+
+ /* Initialisation complete - table can be drawn */
+ oSettings.bInitialised = true;
+
+ /* Check if we need to initialise the table (it might not have been handed off to the
+ * language processor)
+ */
+ if ( bInitHandedOff === false )
+ {
+ _fnInitialise( oSettings );
+ }
+ } );
+ _that = null;
+ return this;
+ };
+
+
+
+ /**
+ * Provide a common method for plug-ins to check the version of DataTables being used, in order
+ * to ensure compatibility.
+ * @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note that the
+ * formats "X" and "X.Y" are also acceptable.
+ * @returns {boolean} true if this version of DataTables is greater or equal to the required
+ * version, or false if this version of DataTales is not suitable
+ * @static
+ * @dtopt API-Static
+ *
+ * @example
+ * alert( $.fn.dataTable.fnVersionCheck( '1.9.0' ) );
+ */
+ DataTable.fnVersionCheck = function( sVersion )
+ {
+ /* This is cheap, but effective */
+ var fnZPad = function (Zpad, count)
+ {
+ while(Zpad.length < count) {
+ Zpad += '0';
+ }
+ return Zpad;
+ };
+ var aThis = DataTable.ext.sVersion.split('.');
+ var aThat = sVersion.split('.');
+ var sThis = '', sThat = '';
+
+ for ( var i=0, iLen=aThat.length ; i<iLen ; i++ )
+ {
+ sThis += fnZPad( aThis[i], 3 );
+ sThat += fnZPad( aThat[i], 3 );
+ }
+
+ return parseInt(sThis, 10) >= parseInt(sThat, 10);
+ };
+
+
+ /**
+ * Check if a TABLE node is a DataTable table already or not.
+ * @param {node} nTable The TABLE node to check if it is a DataTable or not (note that other
+ * node types can be passed in, but will always return false).
+ * @returns {boolean} true the table given is a DataTable, or false otherwise
+ * @static
+ * @dtopt API-Static
+ *
+ * @example
+ * var ex = document.getElementById('example');
+ * if ( ! $.fn.DataTable.fnIsDataTable( ex ) ) {
+ * $(ex).dataTable();
+ * }
+ */
+ DataTable.fnIsDataTable = function ( nTable )
+ {
+ var o = DataTable.settings;
+
+ for ( var i=0 ; i<o.length ; i++ )
+ {
+ if ( o[i].nTable === nTable || o[i].nScrollHead === nTable || o[i].nScrollFoot === nTable )
+ {
+ return true;
+ }
+ }
+
+ return false;
+ };
+
+
+ /**
+ * Get all DataTable tables that have been initialised - optionally you can select to
+ * get only currently visible tables.
+ * @param {boolean} [bVisible=false] Flag to indicate if you want all (default) or
+ * visible tables only.
+ * @returns {array} Array of TABLE nodes (not DataTable instances) which are DataTables
+ * @static
+ * @dtopt API-Static
+ *
+ * @example
+ * var table = $.fn.dataTable.fnTables(true);
+ * if ( table.length > 0 ) {
+ * $(table).dataTable().fnAdjustColumnSizing();
+ * }
+ */
+ DataTable.fnTables = function ( bVisible )
+ {
+ var out = [];
+
+ jQuery.each( DataTable.settings, function (i, o) {
+ if ( !bVisible || (bVisible === true && $(o.nTable).is(':visible')) )
+ {
+ out.push( o.nTable );
+ }
+ } );
+
+ return out;
+ };
+
+
+ /**
+ * Version string for plug-ins to check compatibility. Allowed format is
+ * a.b.c.d.e where: a:int, b:int, c:int, d:string(dev|beta), e:int. d and
+ * e are optional
+ * @member
+ * @type string
+ * @default Version number
+ */
+ DataTable.version = "1.9.4";
+
+ /**
+ * Private data store, containing all of the settings objects that are created for the
+ * tables on a given page.
+ *
+ * Note that the <i>DataTable.settings</i> object is aliased to <i>jQuery.fn.dataTableExt</i>
+ * through which it may be accessed and manipulated, or <i>jQuery.fn.dataTable.settings</i>.
+ * @member
+ * @type array
+ * @default []
+ * @private
+ */
+ DataTable.settings = [];
+
+ /**
+ * Object models container, for the various models that DataTables has available
+ * to it. These models define the objects that are used to hold the active state
+ * and configuration of the table.
+ * @namespace
+ */
+ DataTable.models = {};
+
+
+ /**
+ * DataTables extension options and plug-ins. This namespace acts as a collection "area"
+ * for plug-ins that can be used to extend the default DataTables behaviour - indeed many
+ * of the build in methods use this method to provide their own capabilities (sorting methods
+ * for example).
+ *
+ * Note that this namespace is aliased to jQuery.fn.dataTableExt so it can be readily accessed
+ * and modified by plug-ins.
+ * @namespace
+ */
+ DataTable.models.ext = {
+ /**
+ * Plug-in filtering functions - this method of filtering is complimentary to the default
+ * type based filtering, and a lot more comprehensive as it allows you complete control
+ * over the filtering logic. Each element in this array is a function (parameters
+ * described below) that is called for every row in the table, and your logic decides if
+ * it should be included in the filtered data set or not.
+ * <ul>
+ * <li>
+ * Function input parameters:
+ * <ul>
+ * <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>
+ * <li>{array|object} Data for the row to be processed (same as the original format
+ * that was passed in as the data source, or an array from a DOM data source</li>
+ * <li>{int} Row index in aoData ({@link DataTable.models.oSettings.aoData}), which can
+ * be useful to retrieve the TR element if you need DOM interaction.</li>
+ * </ul>
+ * </li>
+ * <li>
+ * Function return:
+ * <ul>
+ * <li>{boolean} Include the row in the filtered result set (true) or not (false)</li>
+ * </ul>
+ * </il>
+ * </ul>
+ * @type array
+ * @default []
+ *
+ * @example
+ * // The following example shows custom filtering being applied to the fourth column (i.e.
+ * // the aData[3] index) based on two input values from the end-user, matching the data in
+ * // a certain range.
+ * $.fn.dataTableExt.afnFiltering.push(
+ * function( oSettings, aData, iDataIndex ) {
+ * var iMin = document.getElementById('min').value * 1;
+ * var iMax = document.getElementById('max').value * 1;
+ * var iVersion = aData[3] == "-" ? 0 : aData[3]*1;
+ * if ( iMin == "" && iMax == "" ) {
+ * return true;
+ * }
+ * else if ( iMin == "" && iVersion < iMax ) {
+ * return true;
+ * }
+ * else if ( iMin < iVersion && "" == iMax ) {
+ * return true;
+ * }
+ * else if ( iMin < iVersion && iVersion < iMax ) {
+ * return true;
+ * }
+ * return false;
+ * }
+ * );
+ */
+ "afnFiltering": [],
+
+
+ /**
+ * Plug-in sorting functions - this method of sorting is complimentary to the default type
+ * based sorting that DataTables does automatically, allowing much greater control over the
+ * the data that is being used to sort a column. This is useful if you want to do sorting
+ * based on live data (for example the contents of an 'input' element) rather than just the
+ * static string that DataTables knows of. The way these plug-ins work is that you create
+ * an array of the values you wish to be sorted for the column in question and then return
+ * that array. Which pre-sorting function is run here depends on the sSortDataType parameter
+ * that is used for the column (if any). This is the corollary of <i>ofnSearch</i> for sort
+ * data.
+ * <ul>
+ * <li>
+ * Function input parameters:
+ * <ul>
+ * <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>
+ * <li>{int} Target column index</li>
+ * </ul>
+ * </li>
+ * <li>
+ * Function return:
+ * <ul>
+ * <li>{array} Data for the column to be sorted upon</li>
+ * </ul>
+ * </il>
+ * </ul>
+ *
+ * Note that as of v1.9, it is typically preferable to use <i>mData</i> to prepare data for
+ * the different uses that DataTables can put the data to. Specifically <i>mData</i> when
+ * used as a function will give you a 'type' (sorting, filtering etc) that you can use to
+ * prepare the data as required for the different types. As such, this method is deprecated.
+ * @type array
+ * @default []
+ * @deprecated
+ *
+ * @example
+ * // Updating the cached sorting information with user entered values in HTML input elements
+ * jQuery.fn.dataTableExt.afnSortData['dom-text'] = function ( oSettings, iColumn )
+ * {
+ * var aData = [];
+ * $( 'td:eq('+iColumn+') input', oSettings.oApi._fnGetTrNodes(oSettings) ).each( function () {
+ * aData.push( this.value );
+ * } );
+ * return aData;
+ * }
+ */
+ "afnSortData": [],
+
+
+ /**
+ * Feature plug-ins - This is an array of objects which describe the feature plug-ins that are
+ * available to DataTables. These feature plug-ins are accessible through the sDom initialisation
+ * option. As such, each feature plug-in must describe a function that is used to initialise
+ * itself (fnInit), a character so the feature can be enabled by sDom (cFeature) and the name
+ * of the feature (sFeature). Thus the objects attached to this method must provide:
+ * <ul>
+ * <li>{function} fnInit Initialisation of the plug-in
+ * <ul>
+ * <li>
+ * Function input parameters:
+ * <ul>
+ * <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>
+ * </ul>
+ * </li>
+ * <li>
+ * Function return:
+ * <ul>
+ * <li>{node|null} The element which contains your feature. Note that the return
+ * may also be void if your plug-in does not require to inject any DOM elements
+ * into DataTables control (sDom) - for example this might be useful when
+ * developing a plug-in which allows table control via keyboard entry.</li>
+ * </ul>
+ * </il>
+ * </ul>
+ * </li>
+ * <li>{character} cFeature Character that will be matched in sDom - case sensitive</li>
+ * <li>{string} sFeature Feature name</li>
+ * </ul>
+ * @type array
+ * @default []
+ *
+ * @example
+ * // How TableTools initialises itself.
+ * $.fn.dataTableExt.aoFeatures.push( {
+ * "fnInit": function( oSettings ) {
+ * return new TableTools( { "oDTSettings": oSettings } );
+ * },
+ * "cFeature": "T",
+ * "sFeature": "TableTools"
+ * } );
+ */
+ "aoFeatures": [],
+
+
+ /**
+ * Type detection plug-in functions - DataTables utilises types to define how sorting and
+ * filtering behave, and types can be either be defined by the developer (sType for the
+ * column) or they can be automatically detected by the methods in this array. The functions
+ * defined in the array are quite simple, taking a single parameter (the data to analyse)
+ * and returning the type if it is a known type, or null otherwise.
+ * <ul>
+ * <li>
+ * Function input parameters:
+ * <ul>
+ * <li>{*} Data from the column cell to be analysed</li>
+ * </ul>
+ * </li>
+ * <li>
+ * Function return:
+ * <ul>
+ * <li>{string|null} Data type detected, or null if unknown (and thus pass it
+ * on to the other type detection functions.</li>
+ * </ul>
+ * </il>
+ * </ul>
+ * @type array
+ * @default []
+ *
+ * @example
+ * // Currency type detection plug-in:
+ * jQuery.fn.dataTableExt.aTypes.push(
+ * function ( sData ) {
+ * var sValidChars = "0123456789.-";
+ * var Char;
+ *
+ * // Check the numeric part
+ * for ( i=1 ; i<sData.length ; i++ ) {
+ * Char = sData.charAt(i);
+ * if (sValidChars.indexOf(Char) == -1) {
+ * return null;
+ * }
+ * }
+ *
+ * // Check prefixed by currency
+ * if ( sData.charAt(0) == '$' || sData.charAt(0) == '&pound;' ) {
+ * return 'currency';
+ * }
+ * return null;
+ * }
+ * );
+ */
+ "aTypes": [],
+
+
+ /**
+ * Provide a common method for plug-ins to check the version of DataTables being used,
+ * in order to ensure compatibility.
+ * @type function
+ * @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note
+ * that the formats "X" and "X.Y" are also acceptable.
+ * @returns {boolean} true if this version of DataTables is greater or equal to the
+ * required version, or false if this version of DataTales is not suitable
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ * alert( oTable.fnVersionCheck( '1.9.0' ) );
+ * } );
+ */
+ "fnVersionCheck": DataTable.fnVersionCheck,
+
+
+ /**
+ * Index for what 'this' index API functions should use
+ * @type int
+ * @default 0
+ */
+ "iApiIndex": 0,
+
+
+ /**
+ * Pre-processing of filtering data plug-ins - When you assign the sType for a column
+ * (or have it automatically detected for you by DataTables or a type detection plug-in),
+ * you will typically be using this for custom sorting, but it can also be used to provide
+ * custom filtering by allowing you to pre-processing the data and returning the data in
+ * the format that should be filtered upon. This is done by adding functions this object
+ * with a parameter name which matches the sType for that target column. This is the
+ * corollary of <i>afnSortData</i> for filtering data.
+ * <ul>
+ * <li>
+ * Function input parameters:
+ * <ul>
+ * <li>{*} Data from the column cell to be prepared for filtering</li>
+ * </ul>
+ * </li>
+ * <li>
+ * Function return:
+ * <ul>
+ * <li>{string|null} Formatted string that will be used for the filtering.</li>
+ * </ul>
+ * </il>
+ * </ul>
+ *
+ * Note that as of v1.9, it is typically preferable to use <i>mData</i> to prepare data for
+ * the different uses that DataTables can put the data to. Specifically <i>mData</i> when
+ * used as a function will give you a 'type' (sorting, filtering etc) that you can use to
+ * prepare the data as required for the different types. As such, this method is deprecated.
+ * @type object
+ * @default {}
+ * @deprecated
+ *
+ * @example
+ * $.fn.dataTableExt.ofnSearch['title-numeric'] = function ( sData ) {
+ * return sData.replace(/\n/g," ").replace( /<.*?>/g, "" );
+ * }
+ */
+ "ofnSearch": {},
+
+
+ /**
+ * Container for all private functions in DataTables so they can be exposed externally
+ * @type object
+ * @default {}
+ */
+ "oApi": {},
+
+
+ /**
+ * Storage for the various classes that DataTables uses
+ * @type object
+ * @default {}
+ */
+ "oStdClasses": {},
+
+
+ /**
+ * Storage for the various classes that DataTables uses - jQuery UI suitable
+ * @type object
+ * @default {}
+ */
+ "oJUIClasses": {},
+
+
+ /**
+ * Pagination plug-in methods - The style and controls of the pagination can significantly
+ * impact on how the end user interacts with the data in your table, and DataTables allows
+ * the addition of pagination controls by extending this object, which can then be enabled
+ * through the <i>sPaginationType</i> initialisation parameter. Each pagination type that
+ * is added is an object (the property name of which is what <i>sPaginationType</i> refers
+ * to) that has two properties, both methods that are used by DataTables to update the
+ * control's state.
+ * <ul>
+ * <li>
+ * fnInit - Initialisation of the paging controls. Called only during initialisation
+ * of the table. It is expected that this function will add the required DOM elements
+ * to the page for the paging controls to work. The element pointer
+ * 'oSettings.aanFeatures.p' array is provided by DataTables to contain the paging
+ * controls (note that this is a 2D array to allow for multiple instances of each
+ * DataTables DOM element). It is suggested that you add the controls to this element
+ * as children
+ * <ul>
+ * <li>
+ * Function input parameters:
+ * <ul>
+ * <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>
+ * <li>{node} Container into which the pagination controls must be inserted</li>
+ * <li>{function} Draw callback function - whenever the controls cause a page
+ * change, this method must be called to redraw the table.</li>
+ * </ul>
+ * </li>
+ * <li>
+ * Function return:
+ * <ul>
+ * <li>No return required</li>
+ * </ul>
+ * </il>
+ * </ul>
+ * </il>
+ * <li>
+ * fnInit - This function is called whenever the paging status of the table changes and is
+ * typically used to update classes and/or text of the paging controls to reflex the new
+ * status.
+ * <ul>
+ * <li>
+ * Function input parameters:
+ * <ul>
+ * <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>
+ * <li>{function} Draw callback function - in case you need to redraw the table again
+ * or attach new event listeners</li>
+ * </ul>
+ * </li>
+ * <li>
+ * Function return:
+ * <ul>
+ * <li>No return required</li>
+ * </ul>
+ * </il>
+ * </ul>
+ * </il>
+ * </ul>
+ * @type object
+ * @default {}
+ *
+ * @example
+ * $.fn.dataTableExt.oPagination.four_button = {
+ * "fnInit": function ( oSettings, nPaging, fnCallbackDraw ) {
+ * nFirst = document.createElement( 'span' );
+ * nPrevious = document.createElement( 'span' );
+ * nNext = document.createElement( 'span' );
+ * nLast = document.createElement( 'span' );
+ *
+ * nFirst.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sFirst ) );
+ * nPrevious.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sPrevious ) );
+ * nNext.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sNext ) );
+ * nLast.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sLast ) );
+ *
+ * nFirst.className = "paginate_button first";
+ * nPrevious.className = "paginate_button previous";
+ * nNext.className="paginate_button next";
+ * nLast.className = "paginate_button last";
+ *
+ * nPaging.appendChild( nFirst );
+ * nPaging.appendChild( nPrevious );
+ * nPaging.appendChild( nNext );
+ * nPaging.appendChild( nLast );
+ *
+ * $(nFirst).click( function () {
+ * oSettings.oApi._fnPageChange( oSettings, "first" );
+ * fnCallbackDraw( oSettings );
+ * } );
+ *
+ * $(nPrevious).click( function() {
+ * oSettings.oApi._fnPageChange( oSettings, "previous" );
+ * fnCallbackDraw( oSettings );
+ * } );
+ *
+ * $(nNext).click( function() {
+ * oSettings.oApi._fnPageChange( oSettings, "next" );
+ * fnCallbackDraw( oSettings );
+ * } );
+ *
+ * $(nLast).click( function() {
+ * oSettings.oApi._fnPageChange( oSettings, "last" );
+ * fnCallbackDraw( oSettings );
+ * } );
+ *
+ * $(nFirst).bind( 'selectstart', function () { return false; } );
+ * $(nPrevious).bind( 'selectstart', function () { return false; } );
+ * $(nNext).bind( 'selectstart', function () { return false; } );
+ * $(nLast).bind( 'selectstart', function () { return false; } );
+ * },
+ *
+ * "fnUpdate": function ( oSettings, fnCallbackDraw ) {
+ * if ( !oSettings.aanFeatures.p ) {
+ * return;
+ * }
+ *
+ * // Loop over each instance of the pager
+ * var an = oSettings.aanFeatures.p;
+ * for ( var i=0, iLen=an.length ; i<iLen ; i++ ) {
+ * var buttons = an[i].getElementsByTagName('span');
+ * if ( oSettings._iDisplayStart === 0 ) {
+ * buttons[0].className = "paginate_disabled_previous";
+ * buttons[1].className = "paginate_disabled_previous";
+ * }
+ * else {
+ * buttons[0].className = "paginate_enabled_previous";
+ * buttons[1].className = "paginate_enabled_previous";
+ * }
+ *
+ * if ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() ) {
+ * buttons[2].className = "paginate_disabled_next";
+ * buttons[3].className = "paginate_disabled_next";
+ * }
+ * else {
+ * buttons[2].className = "paginate_enabled_next";
+ * buttons[3].className = "paginate_enabled_next";
+ * }
+ * }
+ * }
+ * };
+ */
+ "oPagination": {},
+
+
+ /**
+ * Sorting plug-in methods - Sorting in DataTables is based on the detected type of the
+ * data column (you can add your own type detection functions, or override automatic
+ * detection using sType). With this specific type given to the column, DataTables will
+ * apply the required sort from the functions in the object. Each sort type must provide
+ * two mandatory methods, one each for ascending and descending sorting, and can optionally
+ * provide a pre-formatting method that will help speed up sorting by allowing DataTables
+ * to pre-format the sort data only once (rather than every time the actual sort functions
+ * are run). The two sorting functions are typical Javascript sort methods:
+ * <ul>
+ * <li>
+ * Function input parameters:
+ * <ul>
+ * <li>{*} Data to compare to the second parameter</li>
+ * <li>{*} Data to compare to the first parameter</li>
+ * </ul>
+ * </li>
+ * <li>
+ * Function return:
+ * <ul>
+ * <li>{int} Sorting match: <0 if first parameter should be sorted lower than
+ * the second parameter, ===0 if the two parameters are equal and >0 if
+ * the first parameter should be sorted height than the second parameter.</li>
+ * </ul>
+ * </il>
+ * </ul>
+ * @type object
+ * @default {}
+ *
+ * @example
+ * // Case-sensitive string sorting, with no pre-formatting method
+ * $.extend( $.fn.dataTableExt.oSort, {
+ * "string-case-asc": function(x,y) {
+ * return ((x < y) ? -1 : ((x > y) ? 1 : 0));
+ * },
+ * "string-case-desc": function(x,y) {
+ * return ((x < y) ? 1 : ((x > y) ? -1 : 0));
+ * }
+ * } );
+ *
+ * @example
+ * // Case-insensitive string sorting, with pre-formatting
+ * $.extend( $.fn.dataTableExt.oSort, {
+ * "string-pre": function(x) {
+ * return x.toLowerCase();
+ * },
+ * "string-asc": function(x,y) {
+ * return ((x < y) ? -1 : ((x > y) ? 1 : 0));
+ * },
+ * "string-desc": function(x,y) {
+ * return ((x < y) ? 1 : ((x > y) ? -1 : 0));
+ * }
+ * } );
+ */
+ "oSort": {},
+
+
+ /**
+ * Version string for plug-ins to check compatibility. Allowed format is
+ * a.b.c.d.e where: a:int, b:int, c:int, d:string(dev|beta), e:int. d and
+ * e are optional
+ * @type string
+ * @default Version number
+ */
+ "sVersion": DataTable.version,
+
+
+ /**
+ * How should DataTables report an error. Can take the value 'alert' or 'throw'
+ * @type string
+ * @default alert
+ */
+ "sErrMode": "alert",
+
+
+ /**
+ * Store information for DataTables to access globally about other instances
+ * @namespace
+ * @private
+ */
+ "_oExternConfig": {
+ /* int:iNextUnique - next unique number for an instance */
+ "iNextUnique": 0
+ }
+ };
+
+
+
+
+ /**
+ * Template object for the way in which DataTables holds information about
+ * search information for the global filter and individual column filters.
+ * @namespace
+ */
+ DataTable.models.oSearch = {
+ /**
+ * Flag to indicate if the filtering should be case insensitive or not
+ * @type boolean
+ * @default true
+ */
+ "bCaseInsensitive": true,
+
+ /**
+ * Applied search term
+ * @type string
+ * @default <i>Empty string</i>
+ */
+ "sSearch": "",
+
+ /**
+ * Flag to indicate if the search term should be interpreted as a
+ * regular expression (true) or not (false) and therefore and special
+ * regex characters escaped.
+ * @type boolean
+ * @default false
+ */
+ "bRegex": false,
+
+ /**
+ * Flag to indicate if DataTables is to use its smart filtering or not.
+ * @type boolean
+ * @default true
+ */
+ "bSmart": true
+ };
+
+
+
+
+ /**
+ * Template object for the way in which DataTables holds information about
+ * each individual row. This is the object format used for the settings
+ * aoData array.
+ * @namespace
+ */
+ DataTable.models.oRow = {
+ /**
+ * TR element for the row
+ * @type node
+ * @default null
+ */
+ "nTr": null,
+
+ /**
+ * Data object from the original data source for the row. This is either
+ * an array if using the traditional form of DataTables, or an object if
+ * using mData options. The exact type will depend on the passed in
+ * data from the data source, or will be an array if using DOM a data
+ * source.
+ * @type array|object
+ * @default []
+ */
+ "_aData": [],
+
+ /**
+ * Sorting data cache - this array is ostensibly the same length as the
+ * number of columns (although each index is generated only as it is
+ * needed), and holds the data that is used for sorting each column in the
+ * row. We do this cache generation at the start of the sort in order that
+ * the formatting of the sort data need be done only once for each cell
+ * per sort. This array should not be read from or written to by anything
+ * other than the master sorting methods.
+ * @type array
+ * @default []
+ * @private
+ */
+ "_aSortData": [],
+
+ /**
+ * Array of TD elements that are cached for hidden rows, so they can be
+ * reinserted into the table if a column is made visible again (or to act
+ * as a store if a column is made hidden). Only hidden columns have a
+ * reference in the array. For non-hidden columns the value is either
+ * undefined or null.
+ * @type array nodes
+ * @default []
+ * @private
+ */
+ "_anHidden": [],
+
+ /**
+ * Cache of the class name that DataTables has applied to the row, so we
+ * can quickly look at this variable rather than needing to do a DOM check
+ * on className for the nTr property.
+ * @type string
+ * @default <i>Empty string</i>
+ * @private
+ */
+ "_sRowStripe": ""
+ };
+
+
+
+ /**
+ * Template object for the column information object in DataTables. This object
+ * is held in the settings aoColumns array and contains all the information that
+ * DataTables needs about each individual column.
+ *
+ * Note that this object is related to {@link DataTable.defaults.columns}
+ * but this one is the internal data store for DataTables's cache of columns.
+ * It should NOT be manipulated outside of DataTables. Any configuration should
+ * be done through the initialisation options.
+ * @namespace
+ */
+ DataTable.models.oColumn = {
+ /**
+ * A list of the columns that sorting should occur on when this column
+ * is sorted. That this property is an array allows multi-column sorting
+ * to be defined for a column (for example first name / last name columns
+ * would benefit from this). The values are integers pointing to the
+ * columns to be sorted on (typically it will be a single integer pointing
+ * at itself, but that doesn't need to be the case).
+ * @type array
+ */
+ "aDataSort": null,
+
+ /**
+ * Define the sorting directions that are applied to the column, in sequence
+ * as the column is repeatedly sorted upon - i.e. the first value is used
+ * as the sorting direction when the column if first sorted (clicked on).
+ * Sort it again (click again) and it will move on to the next index.
+ * Repeat until loop.
+ * @type array
+ */
+ "asSorting": null,
+
+ /**
+ * Flag to indicate if the column is searchable, and thus should be included
+ * in the filtering or not.
+ * @type boolean
+ */
+ "bSearchable": null,
+
+ /**
+ * Flag to indicate if the column is sortable or not.
+ * @type boolean
+ */
+ "bSortable": null,
+
+ /**
+ * <code>Deprecated</code> When using fnRender, you have two options for what
+ * to do with the data, and this property serves as the switch. Firstly, you
+ * can have the sorting and filtering use the rendered value (true - default),
+ * or you can have the sorting and filtering us the original value (false).
+ *
+ * Please note that this option has now been deprecated and will be removed
+ * in the next version of DataTables. Please use mRender / mData rather than
+ * fnRender.
+ * @type boolean
+ * @deprecated
+ */
+ "bUseRendered": null,
+
+ /**
+ * Flag to indicate if the column is currently visible in the table or not
+ * @type boolean
+ */
+ "bVisible": null,
+
+ /**
+ * Flag to indicate to the type detection method if the automatic type
+ * detection should be used, or if a column type (sType) has been specified
+ * @type boolean
+ * @default true
+ * @private
+ */
+ "_bAutoType": true,
+
+ /**
+ * Developer definable function that is called whenever a cell is created (Ajax source,
+ * etc) or processed for input (DOM source). This can be used as a compliment to mRender
+ * allowing you to modify the DOM element (add background colour for example) when the
+ * element is available.
+ * @type function
+ * @param {element} nTd The TD node that has been created
+ * @param {*} sData The Data for the cell
+ * @param {array|object} oData The data for the whole row
+ * @param {int} iRow The row index for the aoData data store
+ * @default null
+ */
+ "fnCreatedCell": null,
+
+ /**
+ * Function to get data from a cell in a column. You should <b>never</b>
+ * access data directly through _aData internally in DataTables - always use
+ * the method attached to this property. It allows mData to function as
+ * required. This function is automatically assigned by the column
+ * initialisation method
+ * @type function
+ * @param {array|object} oData The data array/object for the array
+ * (i.e. aoData[]._aData)
+ * @param {string} sSpecific The specific data type you want to get -
+ * 'display', 'type' 'filter' 'sort'
+ * @returns {*} The data for the cell from the given row's data
+ * @default null
+ */
+ "fnGetData": null,
+
+ /**
+ * <code>Deprecated</code> Custom display function that will be called for the
+ * display of each cell in this column.
+ *
+ * Please note that this option has now been deprecated and will be removed
+ * in the next version of DataTables. Please use mRender / mData rather than
+ * fnRender.
+ * @type function
+ * @param {object} o Object with the following parameters:
+ * @param {int} o.iDataRow The row in aoData
+ * @param {int} o.iDataColumn The column in question
+ * @param {array} o.aData The data for the row in question
+ * @param {object} o.oSettings The settings object for this DataTables instance
+ * @returns {string} The string you which to use in the display
+ * @default null
+ * @deprecated
+ */
+ "fnRender": null,
+
+ /**
+ * Function to set data for a cell in the column. You should <b>never</b>
+ * set the data directly to _aData internally in DataTables - always use
+ * this method. It allows mData to function as required. This function
+ * is automatically assigned by the column initialisation method
+ * @type function
+ * @param {array|object} oData The data array/object for the array
+ * (i.e. aoData[]._aData)
+ * @param {*} sValue Value to set
+ * @default null
+ */
+ "fnSetData": null,
+
+ /**
+ * Property to read the value for the cells in the column from the data
+ * source array / object. If null, then the default content is used, if a
+ * function is given then the return from the function is used.
+ * @type function|int|string|null
+ * @default null
+ */
+ "mData": null,
+
+ /**
+ * Partner property to mData which is used (only when defined) to get
+ * the data - i.e. it is basically the same as mData, but without the
+ * 'set' option, and also the data fed to it is the result from mData.
+ * This is the rendering method to match the data method of mData.
+ * @type function|int|string|null
+ * @default null
+ */
+ "mRender": null,
+
+ /**
+ * Unique header TH/TD element for this column - this is what the sorting
+ * listener is attached to (if sorting is enabled.)
+ * @type node
+ * @default null
+ */
+ "nTh": null,
+
+ /**
+ * Unique footer TH/TD element for this column (if there is one). Not used
+ * in DataTables as such, but can be used for plug-ins to reference the
+ * footer for each column.
+ * @type node
+ * @default null
+ */
+ "nTf": null,
+
+ /**
+ * The class to apply to all TD elements in the table's TBODY for the column
+ * @type string
+ * @default null
+ */
+ "sClass": null,
+
+ /**
+ * When DataTables calculates the column widths to assign to each column,
+ * it finds the longest string in each column and then constructs a
+ * temporary table and reads the widths from that. The problem with this
+ * is that "mmm" is much wider then "iiii", but the latter is a longer
+ * string - thus the calculation can go wrong (doing it properly and putting
+ * it into an DOM object and measuring that is horribly(!) slow). Thus as
+ * a "work around" we provide this option. It will append its value to the
+ * text that is found to be the longest string for the column - i.e. padding.
+ * @type string
+ */
+ "sContentPadding": null,
+
+ /**
+ * Allows a default value to be given for a column's data, and will be used
+ * whenever a null data source is encountered (this can be because mData
+ * is set to null, or because the data source itself is null).
+ * @type string
+ * @default null
+ */
+ "sDefaultContent": null,
+
+ /**
+ * Name for the column, allowing reference to the column by name as well as
+ * by index (needs a lookup to work by name).
+ * @type string
+ */
+ "sName": null,
+
+ /**
+ * Custom sorting data type - defines which of the available plug-ins in
+ * afnSortData the custom sorting will use - if any is defined.
+ * @type string
+ * @default std
+ */
+ "sSortDataType": 'std',
+
+ /**
+ * Class to be applied to the header element when sorting on this column
+ * @type string
+ * @default null
+ */
+ "sSortingClass": null,
+
+ /**
+ * Class to be applied to the header element when sorting on this column -
+ * when jQuery UI theming is used.
+ * @type string
+ * @default null
+ */
+ "sSortingClassJUI": null,
+
+ /**
+ * Title of the column - what is seen in the TH element (nTh).
+ * @type string
+ */
+ "sTitle": null,
+
+ /**
+ * Column sorting and filtering type
+ * @type string
+ * @default null
+ */
+ "sType": null,
+
+ /**
+ * Width of the column
+ * @type string
+ * @default null
+ */
+ "sWidth": null,
+
+ /**
+ * Width of the column when it was first "encountered"
+ * @type string
+ * @default null
+ */
+ "sWidthOrig": null
+ };
+
+
+
+ /**
+ * Initialisation options that can be given to DataTables at initialisation
+ * time.
+ * @namespace
+ */
+ DataTable.defaults = {
+ /**
+ * An array of data to use for the table, passed in at initialisation which
+ * will be used in preference to any data which is already in the DOM. This is
+ * particularly useful for constructing tables purely in Javascript, for
+ * example with a custom Ajax call.
+ * @type array
+ * @default null
+ * @dtopt Option
+ *
+ * @example
+ * // Using a 2D array data source
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "aaData": [
+ * ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'],
+ * ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'],
+ * ],
+ * "aoColumns": [
+ * { "sTitle": "Engine" },
+ * { "sTitle": "Browser" },
+ * { "sTitle": "Platform" },
+ * { "sTitle": "Version" },
+ * { "sTitle": "Grade" }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using an array of objects as a data source (mData)
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "aaData": [
+ * {
+ * "engine": "Trident",
+ * "browser": "Internet Explorer 4.0",
+ * "platform": "Win 95+",
+ * "version": 4,
+ * "grade": "X"
+ * },
+ * {
+ * "engine": "Trident",
+ * "browser": "Internet Explorer 5.0",
+ * "platform": "Win 95+",
+ * "version": 5,
+ * "grade": "C"
+ * }
+ * ],
+ * "aoColumns": [
+ * { "sTitle": "Engine", "mData": "engine" },
+ * { "sTitle": "Browser", "mData": "browser" },
+ * { "sTitle": "Platform", "mData": "platform" },
+ * { "sTitle": "Version", "mData": "version" },
+ * { "sTitle": "Grade", "mData": "grade" }
+ * ]
+ * } );
+ * } );
+ */
+ "aaData": null,
+
+
+ /**
+ * If sorting is enabled, then DataTables will perform a first pass sort on
+ * initialisation. You can define which column(s) the sort is performed upon,
+ * and the sorting direction, with this variable. The aaSorting array should
+ * contain an array for each column to be sorted initially containing the
+ * column's index and a direction string ('asc' or 'desc').
+ * @type array
+ * @default [[0,'asc']]
+ * @dtopt Option
+ *
+ * @example
+ * // Sort by 3rd column first, and then 4th column
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aaSorting": [[2,'asc'], [3,'desc']]
+ * } );
+ * } );
+ *
+ * // No initial sorting
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aaSorting": []
+ * } );
+ * } );
+ */
+ "aaSorting": [[0,'asc']],
+
+
+ /**
+ * This parameter is basically identical to the aaSorting parameter, but
+ * cannot be overridden by user interaction with the table. What this means
+ * is that you could have a column (visible or hidden) which the sorting will
+ * always be forced on first - any sorting after that (from the user) will
+ * then be performed as required. This can be useful for grouping rows
+ * together.
+ * @type array
+ * @default null
+ * @dtopt Option
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aaSortingFixed": [[0,'asc']]
+ * } );
+ * } )
+ */
+ "aaSortingFixed": null,
+
+
+ /**
+ * This parameter allows you to readily specify the entries in the length drop
+ * down menu that DataTables shows when pagination is enabled. It can be
+ * either a 1D array of options which will be used for both the displayed
+ * option and the value, or a 2D array which will use the array in the first
+ * position as the value, and the array in the second position as the
+ * displayed options (useful for language strings such as 'All').
+ * @type array
+ * @default [ 10, 25, 50, 100 ]
+ * @dtopt Option
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aLengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]]
+ * } );
+ * } );
+ *
+ * @example
+ * // Setting the default display length as well as length menu
+ * // This is likely to be wanted if you remove the '10' option which
+ * // is the iDisplayLength default.
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "iDisplayLength": 25,
+ * "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]]
+ * } );
+ * } );
+ */
+ "aLengthMenu": [ 10, 25, 50, 100 ],
+
+
+ /**
+ * The aoColumns option in the initialisation parameter allows you to define
+ * details about the way individual columns behave. For a full list of
+ * column options that can be set, please see
+ * {@link DataTable.defaults.columns}. Note that if you use aoColumns to
+ * define your columns, you must have an entry in the array for every single
+ * column that you have in your table (these can be null if you don't which
+ * to specify any options).
+ * @member
+ */
+ "aoColumns": null,
+
+ /**
+ * Very similar to aoColumns, aoColumnDefs allows you to target a specific
+ * column, multiple columns, or all columns, using the aTargets property of
+ * each object in the array. This allows great flexibility when creating
+ * tables, as the aoColumnDefs arrays can be of any length, targeting the
+ * columns you specifically want. aoColumnDefs may use any of the column
+ * options available: {@link DataTable.defaults.columns}, but it _must_
+ * have aTargets defined in each object in the array. Values in the aTargets
+ * array may be:
+ * <ul>
+ * <li>a string - class name will be matched on the TH for the column</li>
+ * <li>0 or a positive integer - column index counting from the left</li>
+ * <li>a negative integer - column index counting from the right</li>
+ * <li>the string "_all" - all columns (i.e. assign a default)</li>
+ * </ul>
+ * @member
+ */
+ "aoColumnDefs": null,
+
+
+ /**
+ * Basically the same as oSearch, this parameter defines the individual column
+ * filtering state at initialisation time. The array must be of the same size
+ * as the number of columns, and each element be an object with the parameters
+ * "sSearch" and "bEscapeRegex" (the latter is optional). 'null' is also
+ * accepted and the default will be used.
+ * @type array
+ * @default []
+ * @dtopt Option
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aoSearchCols": [
+ * null,
+ * { "sSearch": "My filter" },
+ * null,
+ * { "sSearch": "^[0-9]", "bEscapeRegex": false }
+ * ]
+ * } );
+ * } )
+ */
+ "aoSearchCols": [],
+
+
+ /**
+ * An array of CSS classes that should be applied to displayed rows. This
+ * array may be of any length, and DataTables will apply each class
+ * sequentially, looping when required.
+ * @type array
+ * @default null <i>Will take the values determined by the oClasses.sStripe*
+ * options</i>
+ * @dtopt Option
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "asStripeClasses": [ 'strip1', 'strip2', 'strip3' ]
+ * } );
+ * } )
+ */
+ "asStripeClasses": null,
+
+
+ /**
+ * Enable or disable automatic column width calculation. This can be disabled
+ * as an optimisation (it takes some time to calculate the widths) if the
+ * tables widths are passed in using aoColumns.
+ * @type boolean
+ * @default true
+ * @dtopt Features
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "bAutoWidth": false
+ * } );
+ * } );
+ */
+ "bAutoWidth": true,
+
+
+ /**
+ * Deferred rendering can provide DataTables with a huge speed boost when you
+ * are using an Ajax or JS data source for the table. This option, when set to
+ * true, will cause DataTables to defer the creation of the table elements for
+ * each row until they are needed for a draw - saving a significant amount of
+ * time.
+ * @type boolean
+ * @default false
+ * @dtopt Features
+ *
+ * @example
+ * $(document).ready( function() {
+ * var oTable = $('#example').dataTable( {
+ * "sAjaxSource": "sources/arrays.txt",
+ * "bDeferRender": true
+ * } );
+ * } );
+ */
+ "bDeferRender": false,
+
+
+ /**
+ * Replace a DataTable which matches the given selector and replace it with
+ * one which has the properties of the new initialisation object passed. If no
+ * table matches the selector, then the new DataTable will be constructed as
+ * per normal.
+ * @type boolean
+ * @default false
+ * @dtopt Options
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "sScrollY": "200px",
+ * "bPaginate": false
+ * } );
+ *
+ * // Some time later....
+ * $('#example').dataTable( {
+ * "bFilter": false,
+ * "bDestroy": true
+ * } );
+ * } );
+ */
+ "bDestroy": false,
+
+
+ /**
+ * Enable or disable filtering of data. Filtering in DataTables is "smart" in
+ * that it allows the end user to input multiple words (space separated) and
+ * will match a row containing those words, even if not in the order that was
+ * specified (this allow matching across multiple columns). Note that if you
+ * wish to use filtering in DataTables this must remain 'true' - to remove the
+ * default filtering input box and retain filtering abilities, please use
+ * {@link DataTable.defaults.sDom}.
+ * @type boolean
+ * @default true
+ * @dtopt Features
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "bFilter": false
+ * } );
+ * } );
+ */
+ "bFilter": true,
+
+
+ /**
+ * Enable or disable the table information display. This shows information
+ * about the data that is currently visible on the page, including information
+ * about filtered data if that action is being performed.
+ * @type boolean
+ * @default true
+ * @dtopt Features
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "bInfo": false
+ * } );
+ * } );
+ */
+ "bInfo": true,
+
+
+ /**
+ * Enable jQuery UI ThemeRoller support (required as ThemeRoller requires some
+ * slightly different and additional mark-up from what DataTables has
+ * traditionally used).
+ * @type boolean
+ * @default false
+ * @dtopt Features
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "bJQueryUI": true
+ * } );
+ * } );
+ */
+ "bJQueryUI": false,
+
+
+ /**
+ * Allows the end user to select the size of a formatted page from a select
+ * menu (sizes are 10, 25, 50 and 100). Requires pagination (bPaginate).
+ * @type boolean
+ * @default true
+ * @dtopt Features
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "bLengthChange": false
+ * } );
+ * } );
+ */
+ "bLengthChange": true,
+
+
+ /**
+ * Enable or disable pagination.
+ * @type boolean
+ * @default true
+ * @dtopt Features
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "bPaginate": false
+ * } );
+ * } );
+ */
+ "bPaginate": true,
+
+
+ /**
+ * Enable or disable the display of a 'processing' indicator when the table is
+ * being processed (e.g. a sort). This is particularly useful for tables with
+ * large amounts of data where it can take a noticeable amount of time to sort
+ * the entries.
+ * @type boolean
+ * @default false
+ * @dtopt Features
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "bProcessing": true
+ * } );
+ * } );
+ */
+ "bProcessing": false,
+
+
+ /**
+ * Retrieve the DataTables object for the given selector. Note that if the
+ * table has already been initialised, this parameter will cause DataTables
+ * to simply return the object that has already been set up - it will not take
+ * account of any changes you might have made to the initialisation object
+ * passed to DataTables (setting this parameter to true is an acknowledgement
+ * that you understand this). bDestroy can be used to reinitialise a table if
+ * you need.
+ * @type boolean
+ * @default false
+ * @dtopt Options
+ *
+ * @example
+ * $(document).ready( function() {
+ * initTable();
+ * tableActions();
+ * } );
+ *
+ * function initTable ()
+ * {
+ * return $('#example').dataTable( {
+ * "sScrollY": "200px",
+ * "bPaginate": false,
+ * "bRetrieve": true
+ * } );
+ * }
+ *
+ * function tableActions ()
+ * {
+ * var oTable = initTable();
+ * // perform API operations with oTable
+ * }
+ */
+ "bRetrieve": false,
+
+
+ /**
+ * Indicate if DataTables should be allowed to set the padding / margin
+ * etc for the scrolling header elements or not. Typically you will want
+ * this.
+ * @type boolean
+ * @default true
+ * @dtopt Options
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "bScrollAutoCss": false,
+ * "sScrollY": "200px"
+ * } );
+ * } );
+ */
+ "bScrollAutoCss": true,
+
+
+ /**
+ * When vertical (y) scrolling is enabled, DataTables will force the height of
+ * the table's viewport to the given height at all times (useful for layout).
+ * However, this can look odd when filtering data down to a small data set,
+ * and the footer is left "floating" further down. This parameter (when
+ * enabled) will cause DataTables to collapse the table's viewport down when
+ * the result set will fit within the given Y height.
+ * @type boolean
+ * @default false
+ * @dtopt Options
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "sScrollY": "200",
+ * "bScrollCollapse": true
+ * } );
+ * } );
+ */
+ "bScrollCollapse": false,
+
+
+ /**
+ * Enable infinite scrolling for DataTables (to be used in combination with
+ * sScrollY). Infinite scrolling means that DataTables will continually load
+ * data as a user scrolls through a table, which is very useful for large
+ * dataset. This cannot be used with pagination, which is automatically
+ * disabled. Note - the Scroller extra for DataTables is recommended in
+ * in preference to this option.
+ * @type boolean
+ * @default false
+ * @dtopt Features
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "bScrollInfinite": true,
+ * "bScrollCollapse": true,
+ * "sScrollY": "200px"
+ * } );
+ * } );
+ */
+ "bScrollInfinite": false,
+
+
+ /**
+ * Configure DataTables to use server-side processing. Note that the
+ * sAjaxSource parameter must also be given in order to give DataTables a
+ * source to obtain the required data for each draw.
+ * @type boolean
+ * @default false
+ * @dtopt Features
+ * @dtopt Server-side
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "bServerSide": true,
+ * "sAjaxSource": "xhr.php"
+ * } );
+ * } );
+ */
+ "bServerSide": false,
+
+
+ /**
+ * Enable or disable sorting of columns. Sorting of individual columns can be
+ * disabled by the "bSortable" option for each column.
+ * @type boolean
+ * @default true
+ * @dtopt Features
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "bSort": false
+ * } );
+ * } );
+ */
+ "bSort": true,
+
+
+ /**
+ * Allows control over whether DataTables should use the top (true) unique
+ * cell that is found for a single column, or the bottom (false - default).
+ * This is useful when using complex headers.
+ * @type boolean
+ * @default false
+ * @dtopt Options
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "bSortCellsTop": true
+ * } );
+ * } );
+ */
+ "bSortCellsTop": false,
+
+
+ /**
+ * Enable or disable the addition of the classes 'sorting_1', 'sorting_2' and
+ * 'sorting_3' to the columns which are currently being sorted on. This is
+ * presented as a feature switch as it can increase processing time (while
+ * classes are removed and added) so for large data sets you might want to
+ * turn this off.
+ * @type boolean
+ * @default true
+ * @dtopt Features
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "bSortClasses": false
+ * } );
+ * } );
+ */
+ "bSortClasses": true,
+
+
+ /**
+ * Enable or disable state saving. When enabled a cookie will be used to save
+ * table display information such as pagination information, display length,
+ * filtering and sorting. As such when the end user reloads the page the
+ * display display will match what thy had previously set up.
+ * @type boolean
+ * @default false
+ * @dtopt Features
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "bStateSave": true
+ * } );
+ * } );
+ */
+ "bStateSave": false,
+
+
+ /**
+ * Customise the cookie and / or the parameters being stored when using
+ * DataTables with state saving enabled. This function is called whenever
+ * the cookie is modified, and it expects a fully formed cookie string to be
+ * returned. Note that the data object passed in is a Javascript object which
+ * must be converted to a string (JSON.stringify for example).
+ * @type function
+ * @param {string} sName Name of the cookie defined by DataTables
+ * @param {object} oData Data to be stored in the cookie
+ * @param {string} sExpires Cookie expires string
+ * @param {string} sPath Path of the cookie to set
+ * @returns {string} Cookie formatted string (which should be encoded by
+ * using encodeURIComponent())
+ * @dtopt Callbacks
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "fnCookieCallback": function (sName, oData, sExpires, sPath) {
+ * // Customise oData or sName or whatever else here
+ * return sName + "="+JSON.stringify(oData)+"; expires=" + sExpires +"; path=" + sPath;
+ * }
+ * } );
+ * } );
+ */
+ "fnCookieCallback": null,
+
+
+ /**
+ * This function is called when a TR element is created (and all TD child
+ * elements have been inserted), or registered if using a DOM source, allowing
+ * manipulation of the TR element (adding classes etc).
+ * @type function
+ * @param {node} nRow "TR" element for the current row
+ * @param {array} aData Raw data array for this row
+ * @param {int} iDataIndex The index of this row in aoData
+ * @dtopt Callbacks
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "fnCreatedRow": function( nRow, aData, iDataIndex ) {
+ * // Bold the grade for all 'A' grade browsers
+ * if ( aData[4] == "A" )
+ * {
+ * $('td:eq(4)', nRow).html( '<b>A</b>' );
+ * }
+ * }
+ * } );
+ * } );
+ */
+ "fnCreatedRow": null,
+
+
+ /**
+ * This function is called on every 'draw' event, and allows you to
+ * dynamically modify any aspect you want about the created DOM.
+ * @type function
+ * @param {object} oSettings DataTables settings object
+ * @dtopt Callbacks
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "fnDrawCallback": function( oSettings ) {
+ * alert( 'DataTables has redrawn the table' );
+ * }
+ * } );
+ * } );
+ */
+ "fnDrawCallback": null,
+
+
+ /**
+ * Identical to fnHeaderCallback() but for the table footer this function
+ * allows you to modify the table footer on every 'draw' even.
+ * @type function
+ * @param {node} nFoot "TR" element for the footer
+ * @param {array} aData Full table data (as derived from the original HTML)
+ * @param {int} iStart Index for the current display starting point in the
+ * display array
+ * @param {int} iEnd Index for the current display ending point in the
+ * display array
+ * @param {array int} aiDisplay Index array to translate the visual position
+ * to the full data array
+ * @dtopt Callbacks
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "fnFooterCallback": function( nFoot, aData, iStart, iEnd, aiDisplay ) {
+ * nFoot.getElementsByTagName('th')[0].innerHTML = "Starting index is "+iStart;
+ * }
+ * } );
+ * } )
+ */
+ "fnFooterCallback": null,
+
+
+ /**
+ * When rendering large numbers in the information element for the table
+ * (i.e. "Showing 1 to 10 of 57 entries") DataTables will render large numbers
+ * to have a comma separator for the 'thousands' units (e.g. 1 million is
+ * rendered as "1,000,000") to help readability for the end user. This
+ * function will override the default method DataTables uses.
+ * @type function
+ * @member
+ * @param {int} iIn number to be formatted
+ * @returns {string} formatted string for DataTables to show the number
+ * @dtopt Callbacks
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "fnFormatNumber": function ( iIn ) {
+ * if ( iIn &lt; 1000 ) {
+ * return iIn;
+ * } else {
+ * var
+ * s=(iIn+""),
+ * a=s.split(""), out="",
+ * iLen=s.length;
+ *
+ * for ( var i=0 ; i&lt;iLen ; i++ ) {
+ * if ( i%3 === 0 &amp;&amp; i !== 0 ) {
+ * out = "'"+out;
+ * }
+ * out = a[iLen-i-1]+out;
+ * }
+ * }
+ * return out;
+ * };
+ * } );
+ * } );
+ */
+ "fnFormatNumber": function ( iIn ) {
+ if ( iIn < 1000 )
+ {
+ // A small optimisation for what is likely to be the majority of use cases
+ return iIn;
+ }
+
+ var s=(iIn+""), a=s.split(""), out="", iLen=s.length;
+
+ for ( var i=0 ; i<iLen ; i++ )
+ {
+ if ( i%3 === 0 && i !== 0 )
+ {
+ out = this.oLanguage.sInfoThousands+out;
+ }
+ out = a[iLen-i-1]+out;
+ }
+ return out;
+ },
+
+
+ /**
+ * This function is called on every 'draw' event, and allows you to
+ * dynamically modify the header row. This can be used to calculate and
+ * display useful information about the table.
+ * @type function
+ * @param {node} nHead "TR" element for the header
+ * @param {array} aData Full table data (as derived from the original HTML)
+ * @param {int} iStart Index for the current display starting point in the
+ * display array
+ * @param {int} iEnd Index for the current display ending point in the
+ * display array
+ * @param {array int} aiDisplay Index array to translate the visual position
+ * to the full data array
+ * @dtopt Callbacks
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "fnHeaderCallback": function( nHead, aData, iStart, iEnd, aiDisplay ) {
+ * nHead.getElementsByTagName('th')[0].innerHTML = "Displaying "+(iEnd-iStart)+" records";
+ * }
+ * } );
+ * } )
+ */
+ "fnHeaderCallback": null,
+
+
+ /**
+ * The information element can be used to convey information about the current
+ * state of the table. Although the internationalisation options presented by
+ * DataTables are quite capable of dealing with most customisations, there may
+ * be times where you wish to customise the string further. This callback
+ * allows you to do exactly that.
+ * @type function
+ * @param {object} oSettings DataTables settings object
+ * @param {int} iStart Starting position in data for the draw
+ * @param {int} iEnd End position in data for the draw
+ * @param {int} iMax Total number of rows in the table (regardless of
+ * filtering)
+ * @param {int} iTotal Total number of rows in the data set, after filtering
+ * @param {string} sPre The string that DataTables has formatted using it's
+ * own rules
+ * @returns {string} The string to be displayed in the information element.
+ * @dtopt Callbacks
+ *
+ * @example
+ * $('#example').dataTable( {
+ * "fnInfoCallback": function( oSettings, iStart, iEnd, iMax, iTotal, sPre ) {
+ * return iStart +" to "+ iEnd;
+ * }
+ * } );
+ */
+ "fnInfoCallback": null,
+
+
+ /**
+ * Called when the table has been initialised. Normally DataTables will
+ * initialise sequentially and there will be no need for this function,
+ * however, this does not hold true when using external language information
+ * since that is obtained using an async XHR call.
+ * @type function
+ * @param {object} oSettings DataTables settings object
+ * @param {object} json The JSON object request from the server - only
+ * present if client-side Ajax sourced data is used
+ * @dtopt Callbacks
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "fnInitComplete": function(oSettings, json) {
+ * alert( 'DataTables has finished its initialisation.' );
+ * }
+ * } );
+ * } )
+ */
+ "fnInitComplete": null,
+
+
+ /**
+ * Called at the very start of each table draw and can be used to cancel the
+ * draw by returning false, any other return (including undefined) results in
+ * the full draw occurring).
+ * @type function
+ * @param {object} oSettings DataTables settings object
+ * @returns {boolean} False will cancel the draw, anything else (including no
+ * return) will allow it to complete.
+ * @dtopt Callbacks
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "fnPreDrawCallback": function( oSettings ) {
+ * if ( $('#test').val() == 1 ) {
+ * return false;
+ * }
+ * }
+ * } );
+ * } );
+ */
+ "fnPreDrawCallback": null,
+
+
+ /**
+ * This function allows you to 'post process' each row after it have been
+ * generated for each table draw, but before it is rendered on screen. This
+ * function might be used for setting the row class name etc.
+ * @type function
+ * @param {node} nRow "TR" element for the current row
+ * @param {array} aData Raw data array for this row
+ * @param {int} iDisplayIndex The display index for the current table draw
+ * @param {int} iDisplayIndexFull The index of the data in the full list of
+ * rows (after filtering)
+ * @dtopt Callbacks
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "fnRowCallback": function( nRow, aData, iDisplayIndex, iDisplayIndexFull ) {
+ * // Bold the grade for all 'A' grade browsers
+ * if ( aData[4] == "A" )
+ * {
+ * $('td:eq(4)', nRow).html( '<b>A</b>' );
+ * }
+ * }
+ * } );
+ * } );
+ */
+ "fnRowCallback": null,
+
+
+ /**
+ * This parameter allows you to override the default function which obtains
+ * the data from the server ($.getJSON) so something more suitable for your
+ * application. For example you could use POST data, or pull information from
+ * a Gears or AIR database.
+ * @type function
+ * @member
+ * @param {string} sSource HTTP source to obtain the data from (sAjaxSource)
+ * @param {array} aoData A key/value pair object containing the data to send
+ * to the server
+ * @param {function} fnCallback to be called on completion of the data get
+ * process that will draw the data on the page.
+ * @param {object} oSettings DataTables settings object
+ * @dtopt Callbacks
+ * @dtopt Server-side
+ *
+ * @example
+ * // POST data to server
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "bProcessing": true,
+ * "bServerSide": true,
+ * "sAjaxSource": "xhr.php",
+ * "fnServerData": function ( sSource, aoData, fnCallback, oSettings ) {
+ * oSettings.jqXHR = $.ajax( {
+ * "dataType": 'json',
+ * "type": "POST",
+ * "url": sSource,
+ * "data": aoData,
+ * "success": fnCallback
+ * } );
+ * }
+ * } );
+ * } );
+ */
+ "fnServerData": function ( sUrl, aoData, fnCallback, oSettings ) {
+ oSettings.jqXHR = $.ajax( {
+ "url": sUrl,
+ "data": aoData,
+ "success": function (json) {
+ if ( json.sError ) {
+ oSettings.oApi._fnLog( oSettings, 0, json.sError );
+ }
+
+ $(oSettings.oInstance).trigger('xhr', [oSettings, json]);
+ fnCallback( json );
+ },
+ "dataType": "json",
+ "cache": false,
+ "type": oSettings.sServerMethod,
+ "error": function (xhr, error, thrown) {
+ if ( error == "parsererror" ) {
+ oSettings.oApi._fnLog( oSettings, 0, "DataTables warning: JSON data from "+
+ "server could not be parsed. This is caused by a JSON formatting error." );
+ }
+ }
+ } );
+ },
+
+
+ /**
+ * It is often useful to send extra data to the server when making an Ajax
+ * request - for example custom filtering information, and this callback
+ * function makes it trivial to send extra information to the server. The
+ * passed in parameter is the data set that has been constructed by
+ * DataTables, and you can add to this or modify it as you require.
+ * @type function
+ * @param {array} aoData Data array (array of objects which are name/value
+ * pairs) that has been constructed by DataTables and will be sent to the
+ * server. In the case of Ajax sourced data with server-side processing
+ * this will be an empty array, for server-side processing there will be a
+ * significant number of parameters!
+ * @returns {undefined} Ensure that you modify the aoData array passed in,
+ * as this is passed by reference.
+ * @dtopt Callbacks
+ * @dtopt Server-side
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "bProcessing": true,
+ * "bServerSide": true,
+ * "sAjaxSource": "scripts/server_processing.php",
+ * "fnServerParams": function ( aoData ) {
+ * aoData.push( { "name": "more_data", "value": "my_value" } );
+ * }
+ * } );
+ * } );
+ */
+ "fnServerParams": null,
+
+
+ /**
+ * Load the table state. With this function you can define from where, and how, the
+ * state of a table is loaded. By default DataTables will load from its state saving
+ * cookie, but you might wish to use local storage (HTML5) or a server-side database.
+ * @type function
+ * @member
+ * @param {object} oSettings DataTables settings object
+ * @return {object} The DataTables state object to be loaded
+ * @dtopt Callbacks
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "bStateSave": true,
+ * "fnStateLoad": function (oSettings) {
+ * var o;
+ *
+ * // Send an Ajax request to the server to get the data. Note that
+ * // this is a synchronous request.
+ * $.ajax( {
+ * "url": "/state_load",
+ * "async": false,
+ * "dataType": "json",
+ * "success": function (json) {
+ * o = json;
+ * }
+ * } );
+ *
+ * return o;
+ * }
+ * } );
+ * } );
+ */
+ "fnStateLoad": function ( oSettings ) {
+ var sData = this.oApi._fnReadCookie( oSettings.sCookiePrefix+oSettings.sInstance );
+ var oData;
+
+ try {
+ oData = (typeof $.parseJSON === 'function') ?
+ $.parseJSON(sData) : eval( '('+sData+')' );
+ } catch (e) {
+ oData = null;
+ }
+
+ return oData;
+ },
+
+
+ /**
+ * Callback which allows modification of the saved state prior to loading that state.
+ * This callback is called when the table is loading state from the stored data, but
+ * prior to the settings object being modified by the saved state. Note that for
+ * plug-in authors, you should use the 'stateLoadParams' event to load parameters for
+ * a plug-in.
+ * @type function
+ * @param {object} oSettings DataTables settings object
+ * @param {object} oData The state object that is to be loaded
+ * @dtopt Callbacks
+ *
+ * @example
+ * // Remove a saved filter, so filtering is never loaded
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "bStateSave": true,
+ * "fnStateLoadParams": function (oSettings, oData) {
+ * oData.oSearch.sSearch = "";
+ * }
+ * } );
+ * } );
+ *
+ * @example
+ * // Disallow state loading by returning false
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "bStateSave": true,
+ * "fnStateLoadParams": function (oSettings, oData) {
+ * return false;
+ * }
+ * } );
+ * } );
+ */
+ "fnStateLoadParams": null,
+
+
+ /**
+ * Callback that is called when the state has been loaded from the state saving method
+ * and the DataTables settings object has been modified as a result of the loaded state.
+ * @type function
+ * @param {object} oSettings DataTables settings object
+ * @param {object} oData The state object that was loaded
+ * @dtopt Callbacks
+ *
+ * @example
+ * // Show an alert with the filtering value that was saved
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "bStateSave": true,
+ * "fnStateLoaded": function (oSettings, oData) {
+ * alert( 'Saved filter was: '+oData.oSearch.sSearch );
+ * }
+ * } );
+ * } );
+ */
+ "fnStateLoaded": null,
+
+
+ /**
+ * Save the table state. This function allows you to define where and how the state
+ * information for the table is stored - by default it will use a cookie, but you
+ * might want to use local storage (HTML5) or a server-side database.
+ * @type function
+ * @member
+ * @param {object} oSettings DataTables settings object
+ * @param {object} oData The state object to be saved
+ * @dtopt Callbacks
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "bStateSave": true,
+ * "fnStateSave": function (oSettings, oData) {
+ * // Send an Ajax request to the server with the state object
+ * $.ajax( {
+ * "url": "/state_save",
+ * "data": oData,
+ * "dataType": "json",
+ * "method": "POST"
+ * "success": function () {}
+ * } );
+ * }
+ * } );
+ * } );
+ */
+ "fnStateSave": function ( oSettings, oData ) {
+ this.oApi._fnCreateCookie(
+ oSettings.sCookiePrefix+oSettings.sInstance,
+ this.oApi._fnJsonString(oData),
+ oSettings.iCookieDuration,
+ oSettings.sCookiePrefix,
+ oSettings.fnCookieCallback
+ );
+ },
+
+
+ /**
+ * Callback which allows modification of the state to be saved. Called when the table
+ * has changed state a new state save is required. This method allows modification of
+ * the state saving object prior to actually doing the save, including addition or
+ * other state properties or modification. Note that for plug-in authors, you should
+ * use the 'stateSaveParams' event to save parameters for a plug-in.
+ * @type function
+ * @param {object} oSettings DataTables settings object
+ * @param {object} oData The state object to be saved
+ * @dtopt Callbacks
+ *
+ * @example
+ * // Remove a saved filter, so filtering is never saved
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "bStateSave": true,
+ * "fnStateSaveParams": function (oSettings, oData) {
+ * oData.oSearch.sSearch = "";
+ * }
+ * } );
+ * } );
+ */
+ "fnStateSaveParams": null,
+
+
+ /**
+ * Duration of the cookie which is used for storing session information. This
+ * value is given in seconds.
+ * @type int
+ * @default 7200 <i>(2 hours)</i>
+ * @dtopt Options
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "iCookieDuration": 60*60*24; // 1 day
+ * } );
+ * } )
+ */
+ "iCookieDuration": 7200,
+
+
+ /**
+ * When enabled DataTables will not make a request to the server for the first
+ * page draw - rather it will use the data already on the page (no sorting etc
+ * will be applied to it), thus saving on an XHR at load time. iDeferLoading
+ * is used to indicate that deferred loading is required, but it is also used
+ * to tell DataTables how many records there are in the full table (allowing
+ * the information element and pagination to be displayed correctly). In the case
+ * where a filtering is applied to the table on initial load, this can be
+ * indicated by giving the parameter as an array, where the first element is
+ * the number of records available after filtering and the second element is the
+ * number of records without filtering (allowing the table information element
+ * to be shown correctly).
+ * @type int | array
+ * @default null
+ * @dtopt Options
+ *
+ * @example
+ * // 57 records available in the table, no filtering applied
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "bServerSide": true,
+ * "sAjaxSource": "scripts/server_processing.php",
+ * "iDeferLoading": 57
+ * } );
+ * } );
+ *
+ * @example
+ * // 57 records after filtering, 100 without filtering (an initial filter applied)
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "bServerSide": true,
+ * "sAjaxSource": "scripts/server_processing.php",
+ * "iDeferLoading": [ 57, 100 ],
+ * "oSearch": {
+ * "sSearch": "my_filter"
+ * }
+ * } );
+ * } );
+ */
+ "iDeferLoading": null,
+
+
+ /**
+ * Number of rows to display on a single page when using pagination. If
+ * feature enabled (bLengthChange) then the end user will be able to override
+ * this to a custom setting using a pop-up menu.
+ * @type int
+ * @default 10
+ * @dtopt Options
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "iDisplayLength": 50
+ * } );
+ * } )
+ */
+ "iDisplayLength": 10,
+
+
+ /**
+ * Define the starting point for data display when using DataTables with
+ * pagination. Note that this parameter is the number of records, rather than
+ * the page number, so if you have 10 records per page and want to start on
+ * the third page, it should be "20".
+ * @type int
+ * @default 0
+ * @dtopt Options
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "iDisplayStart": 20
+ * } );
+ * } )
+ */
+ "iDisplayStart": 0,
+
+
+ /**
+ * The scroll gap is the amount of scrolling that is left to go before
+ * DataTables will load the next 'page' of data automatically. You typically
+ * want a gap which is big enough that the scrolling will be smooth for the
+ * user, while not so large that it will load more data than need.
+ * @type int
+ * @default 100
+ * @dtopt Options
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "bScrollInfinite": true,
+ * "bScrollCollapse": true,
+ * "sScrollY": "200px",
+ * "iScrollLoadGap": 50
+ * } );
+ * } );
+ */
+ "iScrollLoadGap": 100,
+
+
+ /**
+ * By default DataTables allows keyboard navigation of the table (sorting, paging,
+ * and filtering) by adding a tabindex attribute to the required elements. This
+ * allows you to tab through the controls and press the enter key to activate them.
+ * The tabindex is default 0, meaning that the tab follows the flow of the document.
+ * You can overrule this using this parameter if you wish. Use a value of -1 to
+ * disable built-in keyboard navigation.
+ * @type int
+ * @default 0
+ * @dtopt Options
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "iTabIndex": 1
+ * } );
+ * } );
+ */
+ "iTabIndex": 0,
+
+
+ /**
+ * All strings that DataTables uses in the user interface that it creates
+ * are defined in this object, allowing you to modified them individually or
+ * completely replace them all as required.
+ * @namespace
+ */
+ "oLanguage": {
+ /**
+ * Strings that are used for WAI-ARIA labels and controls only (these are not
+ * actually visible on the page, but will be read by screenreaders, and thus
+ * must be internationalised as well).
+ * @namespace
+ */
+ "oAria": {
+ /**
+ * ARIA label that is added to the table headers when the column may be
+ * sorted ascending by activing the column (click or return when focused).
+ * Note that the column header is prefixed to this string.
+ * @type string
+ * @default : activate to sort column ascending
+ * @dtopt Language
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "oLanguage": {
+ * "oAria": {
+ * "sSortAscending": " - click/return to sort ascending"
+ * }
+ * }
+ * } );
+ * } );
+ */
+ "sSortAscending": ": activate to sort column ascending",
+
+ /**
+ * ARIA label that is added to the table headers when the column may be
+ * sorted descending by activing the column (click or return when focused).
+ * Note that the column header is prefixed to this string.
+ * @type string
+ * @default : activate to sort column ascending
+ * @dtopt Language
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "oLanguage": {
+ * "oAria": {
+ * "sSortDescending": " - click/return to sort descending"
+ * }
+ * }
+ * } );
+ * } );
+ */
+ "sSortDescending": ": activate to sort column descending"
+ },
+
+ /**
+ * Pagination string used by DataTables for the two built-in pagination
+ * control types ("two_button" and "full_numbers")
+ * @namespace
+ */
+ "oPaginate": {
+ /**
+ * Text to use when using the 'full_numbers' type of pagination for the
+ * button to take the user to the first page.
+ * @type string
+ * @default First
+ * @dtopt Language
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "oLanguage": {
+ * "oPaginate": {
+ * "sFirst": "First page"
+ * }
+ * }
+ * } );
+ * } );
+ */
+ "sFirst": "First",
+
+
+ /**
+ * Text to use when using the 'full_numbers' type of pagination for the
+ * button to take the user to the last page.
+ * @type string
+ * @default Last
+ * @dtopt Language
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "oLanguage": {
+ * "oPaginate": {
+ * "sLast": "Last page"
+ * }
+ * }
+ * } );
+ * } );
+ */
+ "sLast": "Last",
+
+
+ /**
+ * Text to use for the 'next' pagination button (to take the user to the
+ * next page).
+ * @type string
+ * @default Next
+ * @dtopt Language
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "oLanguage": {
+ * "oPaginate": {
+ * "sNext": "Next page"
+ * }
+ * }
+ * } );
+ * } );
+ */
+ "sNext": "Next",
+
+
+ /**
+ * Text to use for the 'previous' pagination button (to take the user to
+ * the previous page).
+ * @type string
+ * @default Previous
+ * @dtopt Language
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "oLanguage": {
+ * "oPaginate": {
+ * "sPrevious": "Previous page"
+ * }
+ * }
+ * } );
+ * } );
+ */
+ "sPrevious": "Previous"
+ },
+
+ /**
+ * This string is shown in preference to sZeroRecords when the table is
+ * empty of data (regardless of filtering). Note that this is an optional
+ * parameter - if it is not given, the value of sZeroRecords will be used
+ * instead (either the default or given value).
+ * @type string
+ * @default No data available in table
+ * @dtopt Language
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "oLanguage": {
+ * "sEmptyTable": "No data available in table"
+ * }
+ * } );
+ * } );
+ */
+ "sEmptyTable": "No data available in table",
+
+
+ /**
+ * This string gives information to the end user about the information that
+ * is current on display on the page. The _START_, _END_ and _TOTAL_
+ * variables are all dynamically replaced as the table display updates, and
+ * can be freely moved or removed as the language requirements change.
+ * @type string
+ * @default Showing _START_ to _END_ of _TOTAL_ entries
+ * @dtopt Language
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "oLanguage": {
+ * "sInfo": "Got a total of _TOTAL_ entries to show (_START_ to _END_)"
+ * }
+ * } );
+ * } );
+ */
+ "sInfo": "Showing _START_ to _END_ of _TOTAL_ entries",
+
+
+ /**
+ * Display information string for when the table is empty. Typically the
+ * format of this string should match sInfo.
+ * @type string
+ * @default Showing 0 to 0 of 0 entries
+ * @dtopt Language
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "oLanguage": {
+ * "sInfoEmpty": "No entries to show"
+ * }
+ * } );
+ * } );
+ */
+ "sInfoEmpty": "Showing 0 to 0 of 0 entries",
+
+
+ /**
+ * When a user filters the information in a table, this string is appended
+ * to the information (sInfo) to give an idea of how strong the filtering
+ * is. The variable _MAX_ is dynamically updated.
+ * @type string
+ * @default (filtered from _MAX_ total entries)
+ * @dtopt Language
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "oLanguage": {
+ * "sInfoFiltered": " - filtering from _MAX_ records"
+ * }
+ * } );
+ * } );
+ */
+ "sInfoFiltered": "(filtered from _MAX_ total entries)",
+
+
+ /**
+ * If can be useful to append extra information to the info string at times,
+ * and this variable does exactly that. This information will be appended to
+ * the sInfo (sInfoEmpty and sInfoFiltered in whatever combination they are
+ * being used) at all times.
+ * @type string
+ * @default <i>Empty string</i>
+ * @dtopt Language
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "oLanguage": {
+ * "sInfoPostFix": "All records shown are derived from real information."
+ * }
+ * } );
+ * } );
+ */
+ "sInfoPostFix": "",
+
+
+ /**
+ * DataTables has a build in number formatter (fnFormatNumber) which is used
+ * to format large numbers that are used in the table information. By
+ * default a comma is used, but this can be trivially changed to any
+ * character you wish with this parameter.
+ * @type string
+ * @default ,
+ * @dtopt Language
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "oLanguage": {
+ * "sInfoThousands": "'"
+ * }
+ * } );
+ * } );
+ */
+ "sInfoThousands": ",",
+
+
+ /**
+ * Detail the action that will be taken when the drop down menu for the
+ * pagination length option is changed. The '_MENU_' variable is replaced
+ * with a default select list of 10, 25, 50 and 100, and can be replaced
+ * with a custom select box if required.
+ * @type string
+ * @default Show _MENU_ entries
+ * @dtopt Language
+ *
+ * @example
+ * // Language change only
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "oLanguage": {
+ * "sLengthMenu": "Display _MENU_ records"
+ * }
+ * } );
+ * } );
+ *
+ * @example
+ * // Language and options change
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "oLanguage": {
+ * "sLengthMenu": 'Display <select>'+
+ * '<option value="10">10</option>'+
+ * '<option value="20">20</option>'+
+ * '<option value="30">30</option>'+
+ * '<option value="40">40</option>'+
+ * '<option value="50">50</option>'+
+ * '<option value="-1">All</option>'+
+ * '</select> records'
+ * }
+ * } );
+ * } );
+ */
+ "sLengthMenu": "Show _MENU_ entries",
+
+
+ /**
+ * When using Ajax sourced data and during the first draw when DataTables is
+ * gathering the data, this message is shown in an empty row in the table to
+ * indicate to the end user the the data is being loaded. Note that this
+ * parameter is not used when loading data by server-side processing, just
+ * Ajax sourced data with client-side processing.
+ * @type string
+ * @default Loading...
+ * @dtopt Language
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "oLanguage": {
+ * "sLoadingRecords": "Please wait - loading..."
+ * }
+ * } );
+ * } );
+ */
+ "sLoadingRecords": "Loading...",
+
+
+ /**
+ * Text which is displayed when the table is processing a user action
+ * (usually a sort command or similar).
+ * @type string
+ * @default Processing...
+ * @dtopt Language
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "oLanguage": {
+ * "sProcessing": "DataTables is currently busy"
+ * }
+ * } );
+ * } );
+ */
+ "sProcessing": "Processing...",
+
+
+ /**
+ * Details the actions that will be taken when the user types into the
+ * filtering input text box. The variable "_INPUT_", if used in the string,
+ * is replaced with the HTML text box for the filtering input allowing
+ * control over where it appears in the string. If "_INPUT_" is not given
+ * then the input box is appended to the string automatically.
+ * @type string
+ * @default Search:
+ * @dtopt Language
+ *
+ * @example
+ * // Input text box will be appended at the end automatically
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "oLanguage": {
+ * "sSearch": "Filter records:"
+ * }
+ * } );
+ * } );
+ *
+ * @example
+ * // Specify where the filter should appear
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "oLanguage": {
+ * "sSearch": "Apply filter _INPUT_ to table"
+ * }
+ * } );
+ * } );
+ */
+ "sSearch": "Search:",
+
+
+ /**
+ * All of the language information can be stored in a file on the
+ * server-side, which DataTables will look up if this parameter is passed.
+ * It must store the URL of the language file, which is in a JSON format,
+ * and the object has the same properties as the oLanguage object in the
+ * initialiser object (i.e. the above parameters). Please refer to one of
+ * the example language files to see how this works in action.
+ * @type string
+ * @default <i>Empty string - i.e. disabled</i>
+ * @dtopt Language
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "oLanguage": {
+ * "sUrl": "http://www.sprymedia.co.uk/dataTables/lang.txt"
+ * }
+ * } );
+ * } );
+ */
+ "sUrl": "",
+
+
+ /**
+ * Text shown inside the table records when the is no information to be
+ * displayed after filtering. sEmptyTable is shown when there is simply no
+ * information in the table at all (regardless of filtering).
+ * @type string
+ * @default No matching records found
+ * @dtopt Language
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "oLanguage": {
+ * "sZeroRecords": "No records to display"
+ * }
+ * } );
+ * } );
+ */
+ "sZeroRecords": "No matching records found"
+ },
+
+
+ /**
+ * This parameter allows you to have define the global filtering state at
+ * initialisation time. As an object the "sSearch" parameter must be
+ * defined, but all other parameters are optional. When "bRegex" is true,
+ * the search string will be treated as a regular expression, when false
+ * (default) it will be treated as a straight string. When "bSmart"
+ * DataTables will use it's smart filtering methods (to word match at
+ * any point in the data), when false this will not be done.
+ * @namespace
+ * @extends DataTable.models.oSearch
+ * @dtopt Options
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "oSearch": {"sSearch": "Initial search"}
+ * } );
+ * } )
+ */
+ "oSearch": $.extend( {}, DataTable.models.oSearch ),
+
+
+ /**
+ * By default DataTables will look for the property 'aaData' when obtaining
+ * data from an Ajax source or for server-side processing - this parameter
+ * allows that property to be changed. You can use Javascript dotted object
+ * notation to get a data source for multiple levels of nesting.
+ * @type string
+ * @default aaData
+ * @dtopt Options
+ * @dtopt Server-side
+ *
+ * @example
+ * // Get data from { "data": [...] }
+ * $(document).ready( function() {
+ * var oTable = $('#example').dataTable( {
+ * "sAjaxSource": "sources/data.txt",
+ * "sAjaxDataProp": "data"
+ * } );
+ * } );
+ *
+ * @example
+ * // Get data from { "data": { "inner": [...] } }
+ * $(document).ready( function() {
+ * var oTable = $('#example').dataTable( {
+ * "sAjaxSource": "sources/data.txt",
+ * "sAjaxDataProp": "data.inner"
+ * } );
+ * } );
+ */
+ "sAjaxDataProp": "aaData",
+
+
+ /**
+ * You can instruct DataTables to load data from an external source using this
+ * parameter (use aData if you want to pass data in you already have). Simply
+ * provide a url a JSON object can be obtained from. This object must include
+ * the parameter 'aaData' which is the data source for the table.
+ * @type string
+ * @default null
+ * @dtopt Options
+ * @dtopt Server-side
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "sAjaxSource": "http://www.sprymedia.co.uk/dataTables/json.php"
+ * } );
+ * } )
+ */
+ "sAjaxSource": null,
+
+
+ /**
+ * This parameter can be used to override the default prefix that DataTables
+ * assigns to a cookie when state saving is enabled.
+ * @type string
+ * @default SpryMedia_DataTables_
+ * @dtopt Options
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "sCookiePrefix": "my_datatable_",
+ * } );
+ * } );
+ */
+ "sCookiePrefix": "SpryMedia_DataTables_",
+
+
+ /**
+ * This initialisation variable allows you to specify exactly where in the
+ * DOM you want DataTables to inject the various controls it adds to the page
+ * (for example you might want the pagination controls at the top of the
+ * table). DIV elements (with or without a custom class) can also be added to
+ * aid styling. The follow syntax is used:
+ * <ul>
+ * <li>The following options are allowed:
+ * <ul>
+ * <li>'l' - Length changing</li
+ * <li>'f' - Filtering input</li>
+ * <li>'t' - The table!</li>
+ * <li>'i' - Information</li>
+ * <li>'p' - Pagination</li>
+ * <li>'r' - pRocessing</li>
+ * </ul>
+ * </li>
+ * <li>The following constants are allowed:
+ * <ul>
+ * <li>'H' - jQueryUI theme "header" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')</li>
+ * <li>'F' - jQueryUI theme "footer" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')</li>
+ * </ul>
+ * </li>
+ * <li>The following syntax is expected:
+ * <ul>
+ * <li>'&lt;' and '&gt;' - div elements</li>
+ * <li>'&lt;"class" and '&gt;' - div with a class</li>
+ * <li>'&lt;"#id" and '&gt;' - div with an ID</li>
+ * </ul>
+ * </li>
+ * <li>Examples:
+ * <ul>
+ * <li>'&lt;"wrapper"flipt&gt;'</li>
+ * <li>'&lt;lf&lt;t&gt;ip&gt;'</li>
+ * </ul>
+ * </li>
+ * </ul>
+ * @type string
+ * @default lfrtip <i>(when bJQueryUI is false)</i> <b>or</b>
+ * <"H"lfr>t<"F"ip> <i>(when bJQueryUI is true)</i>
+ * @dtopt Options
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "sDom": '&lt;"top"i&gt;rt&lt;"bottom"flp&gt;&lt;"clear"&gt;'
+ * } );
+ * } );
+ */
+ "sDom": "lfrtip",
+
+
+ /**
+ * DataTables features two different built-in pagination interaction methods
+ * ('two_button' or 'full_numbers') which present different page controls to
+ * the end user. Further methods can be added using the API (see below).
+ * @type string
+ * @default two_button
+ * @dtopt Options
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "sPaginationType": "full_numbers"
+ * } );
+ * } )
+ */
+ "sPaginationType": "two_button",
+
+
+ /**
+ * Enable horizontal scrolling. When a table is too wide to fit into a certain
+ * layout, or you have a large number of columns in the table, you can enable
+ * x-scrolling to show the table in a viewport, which can be scrolled. This
+ * property can be any CSS unit, or a number (in which case it will be treated
+ * as a pixel measurement).
+ * @type string
+ * @default <i>blank string - i.e. disabled</i>
+ * @dtopt Features
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "sScrollX": "100%",
+ * "bScrollCollapse": true
+ * } );
+ * } );
+ */
+ "sScrollX": "",
+
+
+ /**
+ * This property can be used to force a DataTable to use more width than it
+ * might otherwise do when x-scrolling is enabled. For example if you have a
+ * table which requires to be well spaced, this parameter is useful for
+ * "over-sizing" the table, and thus forcing scrolling. This property can by
+ * any CSS unit, or a number (in which case it will be treated as a pixel
+ * measurement).
+ * @type string
+ * @default <i>blank string - i.e. disabled</i>
+ * @dtopt Options
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "sScrollX": "100%",
+ * "sScrollXInner": "110%"
+ * } );
+ * } );
+ */
+ "sScrollXInner": "",
+
+
+ /**
+ * Enable vertical scrolling. Vertical scrolling will constrain the DataTable
+ * to the given height, and enable scrolling for any data which overflows the
+ * current viewport. This can be used as an alternative to paging to display
+ * a lot of data in a small area (although paging and scrolling can both be
+ * enabled at the same time). This property can be any CSS unit, or a number
+ * (in which case it will be treated as a pixel measurement).
+ * @type string
+ * @default <i>blank string - i.e. disabled</i>
+ * @dtopt Features
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "sScrollY": "200px",
+ * "bPaginate": false
+ * } );
+ * } );
+ */
+ "sScrollY": "",
+
+
+ /**
+ * Set the HTTP method that is used to make the Ajax call for server-side
+ * processing or Ajax sourced data.
+ * @type string
+ * @default GET
+ * @dtopt Options
+ * @dtopt Server-side
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "bServerSide": true,
+ * "sAjaxSource": "scripts/post.php",
+ * "sServerMethod": "POST"
+ * } );
+ * } );
+ */
+ "sServerMethod": "GET"
+ };
+
+
+
+ /**
+ * Column options that can be given to DataTables at initialisation time.
+ * @namespace
+ */
+ DataTable.defaults.columns = {
+ /**
+ * Allows a column's sorting to take multiple columns into account when
+ * doing a sort. For example first name / last name columns make sense to
+ * do a multi-column sort over the two columns.
+ * @type array
+ * @default null <i>Takes the value of the column index automatically</i>
+ * @dtopt Columns
+ *
+ * @example
+ * // Using aoColumnDefs
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aoColumnDefs": [
+ * { "aDataSort": [ 0, 1 ], "aTargets": [ 0 ] },
+ * { "aDataSort": [ 1, 0 ], "aTargets": [ 1 ] },
+ * { "aDataSort": [ 2, 3, 4 ], "aTargets": [ 2 ] }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using aoColumns
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aoColumns": [
+ * { "aDataSort": [ 0, 1 ] },
+ * { "aDataSort": [ 1, 0 ] },
+ * { "aDataSort": [ 2, 3, 4 ] },
+ * null,
+ * null
+ * ]
+ * } );
+ * } );
+ */
+ "aDataSort": null,
+
+
+ /**
+ * You can control the default sorting direction, and even alter the behaviour
+ * of the sort handler (i.e. only allow ascending sorting etc) using this
+ * parameter.
+ * @type array
+ * @default [ 'asc', 'desc' ]
+ * @dtopt Columns
+ *
+ * @example
+ * // Using aoColumnDefs
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aoColumnDefs": [
+ * { "asSorting": [ "asc" ], "aTargets": [ 1 ] },
+ * { "asSorting": [ "desc", "asc", "asc" ], "aTargets": [ 2 ] },
+ * { "asSorting": [ "desc" ], "aTargets": [ 3 ] }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using aoColumns
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aoColumns": [
+ * null,
+ * { "asSorting": [ "asc" ] },
+ * { "asSorting": [ "desc", "asc", "asc" ] },
+ * { "asSorting": [ "desc" ] },
+ * null
+ * ]
+ * } );
+ * } );
+ */
+ "asSorting": [ 'asc', 'desc' ],
+
+
+ /**
+ * Enable or disable filtering on the data in this column.
+ * @type boolean
+ * @default true
+ * @dtopt Columns
+ *
+ * @example
+ * // Using aoColumnDefs
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aoColumnDefs": [
+ * { "bSearchable": false, "aTargets": [ 0 ] }
+ * ] } );
+ * } );
+ *
+ * @example
+ * // Using aoColumns
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aoColumns": [
+ * { "bSearchable": false },
+ * null,
+ * null,
+ * null,
+ * null
+ * ] } );
+ * } );
+ */
+ "bSearchable": true,
+
+
+ /**
+ * Enable or disable sorting on this column.
+ * @type boolean
+ * @default true
+ * @dtopt Columns
+ *
+ * @example
+ * // Using aoColumnDefs
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aoColumnDefs": [
+ * { "bSortable": false, "aTargets": [ 0 ] }
+ * ] } );
+ * } );
+ *
+ * @example
+ * // Using aoColumns
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aoColumns": [
+ * { "bSortable": false },
+ * null,
+ * null,
+ * null,
+ * null
+ * ] } );
+ * } );
+ */
+ "bSortable": true,
+
+
+ /**
+ * <code>Deprecated</code> When using fnRender() for a column, you may wish
+ * to use the original data (before rendering) for sorting and filtering
+ * (the default is to used the rendered data that the user can see). This
+ * may be useful for dates etc.
+ *
+ * Please note that this option has now been deprecated and will be removed
+ * in the next version of DataTables. Please use mRender / mData rather than
+ * fnRender.
+ * @type boolean
+ * @default true
+ * @dtopt Columns
+ * @deprecated
+ */
+ "bUseRendered": true,
+
+
+ /**
+ * Enable or disable the display of this column.
+ * @type boolean
+ * @default true
+ * @dtopt Columns
+ *
+ * @example
+ * // Using aoColumnDefs
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aoColumnDefs": [
+ * { "bVisible": false, "aTargets": [ 0 ] }
+ * ] } );
+ * } );
+ *
+ * @example
+ * // Using aoColumns
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aoColumns": [
+ * { "bVisible": false },
+ * null,
+ * null,
+ * null,
+ * null
+ * ] } );
+ * } );
+ */
+ "bVisible": true,
+
+
+ /**
+ * Developer definable function that is called whenever a cell is created (Ajax source,
+ * etc) or processed for input (DOM source). This can be used as a compliment to mRender
+ * allowing you to modify the DOM element (add background colour for example) when the
+ * element is available.
+ * @type function
+ * @param {element} nTd The TD node that has been created
+ * @param {*} sData The Data for the cell
+ * @param {array|object} oData The data for the whole row
+ * @param {int} iRow The row index for the aoData data store
+ * @param {int} iCol The column index for aoColumns
+ * @dtopt Columns
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aoColumnDefs": [ {
+ * "aTargets": [3],
+ * "fnCreatedCell": function (nTd, sData, oData, iRow, iCol) {
+ * if ( sData == "1.7" ) {
+ * $(nTd).css('color', 'blue')
+ * }
+ * }
+ * } ]
+ * });
+ * } );
+ */
+ "fnCreatedCell": null,
+
+
+ /**
+ * <code>Deprecated</code> Custom display function that will be called for the
+ * display of each cell in this column.
+ *
+ * Please note that this option has now been deprecated and will be removed
+ * in the next version of DataTables. Please use mRender / mData rather than
+ * fnRender.
+ * @type function
+ * @param {object} o Object with the following parameters:
+ * @param {int} o.iDataRow The row in aoData
+ * @param {int} o.iDataColumn The column in question
+ * @param {array} o.aData The data for the row in question
+ * @param {object} o.oSettings The settings object for this DataTables instance
+ * @param {object} o.mDataProp The data property used for this column
+ * @param {*} val The current cell value
+ * @returns {string} The string you which to use in the display
+ * @dtopt Columns
+ * @deprecated
+ */
+ "fnRender": null,
+
+
+ /**
+ * The column index (starting from 0!) that you wish a sort to be performed
+ * upon when this column is selected for sorting. This can be used for sorting
+ * on hidden columns for example.
+ * @type int
+ * @default -1 <i>Use automatically calculated column index</i>
+ * @dtopt Columns
+ *
+ * @example
+ * // Using aoColumnDefs
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aoColumnDefs": [
+ * { "iDataSort": 1, "aTargets": [ 0 ] }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using aoColumns
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aoColumns": [
+ * { "iDataSort": 1 },
+ * null,
+ * null,
+ * null,
+ * null
+ * ]
+ * } );
+ * } );
+ */
+ "iDataSort": -1,
+
+
+ /**
+ * This parameter has been replaced by mData in DataTables to ensure naming
+ * consistency. mDataProp can still be used, as there is backwards compatibility
+ * in DataTables for this option, but it is strongly recommended that you use
+ * mData in preference to mDataProp.
+ * @name DataTable.defaults.columns.mDataProp
+ */
+
+
+ /**
+ * This property can be used to read data from any JSON data source property,
+ * including deeply nested objects / properties. mData can be given in a
+ * number of different ways which effect its behaviour:
+ * <ul>
+ * <li>integer - treated as an array index for the data source. This is the
+ * default that DataTables uses (incrementally increased for each column).</li>
+ * <li>string - read an object property from the data source. Note that you can
+ * use Javascript dotted notation to read deep properties / arrays from the
+ * data source.</li>
+ * <li>null - the sDefaultContent option will be used for the cell (null
+ * by default, so you will need to specify the default content you want -
+ * typically an empty string). This can be useful on generated columns such
+ * as edit / delete action columns.</li>
+ * <li>function - the function given will be executed whenever DataTables
+ * needs to set or get the data for a cell in the column. The function
+ * takes three parameters:
+ * <ul>
+ * <li>{array|object} The data source for the row</li>
+ * <li>{string} The type call data requested - this will be 'set' when
+ * setting data or 'filter', 'display', 'type', 'sort' or undefined when
+ * gathering data. Note that when <i>undefined</i> is given for the type
+ * DataTables expects to get the raw data for the object back</li>
+ * <li>{*} Data to set when the second parameter is 'set'.</li>
+ * </ul>
+ * The return value from the function is not required when 'set' is the type
+ * of call, but otherwise the return is what will be used for the data
+ * requested.</li>
+ * </ul>
+ *
+ * Note that prior to DataTables 1.9.2 mData was called mDataProp. The name change
+ * reflects the flexibility of this property and is consistent with the naming of
+ * mRender. If 'mDataProp' is given, then it will still be used by DataTables, as
+ * it automatically maps the old name to the new if required.
+ * @type string|int|function|null
+ * @default null <i>Use automatically calculated column index</i>
+ * @dtopt Columns
+ *
+ * @example
+ * // Read table data from objects
+ * $(document).ready( function() {
+ * var oTable = $('#example').dataTable( {
+ * "sAjaxSource": "sources/deep.txt",
+ * "aoColumns": [
+ * { "mData": "engine" },
+ * { "mData": "browser" },
+ * { "mData": "platform.inner" },
+ * { "mData": "platform.details.0" },
+ * { "mData": "platform.details.1" }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using mData as a function to provide different information for
+ * // sorting, filtering and display. In this case, currency (price)
+ * $(document).ready( function() {
+ * var oTable = $('#example').dataTable( {
+ * "aoColumnDefs": [ {
+ * "aTargets": [ 0 ],
+ * "mData": function ( source, type, val ) {
+ * if (type === 'set') {
+ * source.price = val;
+ * // Store the computed dislay and filter values for efficiency
+ * source.price_display = val=="" ? "" : "$"+numberFormat(val);
+ * source.price_filter = val=="" ? "" : "$"+numberFormat(val)+" "+val;
+ * return;
+ * }
+ * else if (type === 'display') {
+ * return source.price_display;
+ * }
+ * else if (type === 'filter') {
+ * return source.price_filter;
+ * }
+ * // 'sort', 'type' and undefined all just use the integer
+ * return source.price;
+ * }
+ * } ]
+ * } );
+ * } );
+ */
+ "mData": null,
+
+
+ /**
+ * This property is the rendering partner to mData and it is suggested that
+ * when you want to manipulate data for display (including filtering, sorting etc)
+ * but not altering the underlying data for the table, use this property. mData
+ * can actually do everything this property can and more, but this parameter is
+ * easier to use since there is no 'set' option. Like mData is can be given
+ * in a number of different ways to effect its behaviour, with the addition of
+ * supporting array syntax for easy outputting of arrays (including arrays of
+ * objects):
+ * <ul>
+ * <li>integer - treated as an array index for the data source. This is the
+ * default that DataTables uses (incrementally increased for each column).</li>
+ * <li>string - read an object property from the data source. Note that you can
+ * use Javascript dotted notation to read deep properties / arrays from the
+ * data source and also array brackets to indicate that the data reader should
+ * loop over the data source array. When characters are given between the array
+ * brackets, these characters are used to join the data source array together.
+ * For example: "accounts[, ].name" would result in a comma separated list with
+ * the 'name' value from the 'accounts' array of objects.</li>
+ * <li>function - the function given will be executed whenever DataTables
+ * needs to set or get the data for a cell in the column. The function
+ * takes three parameters:
+ * <ul>
+ * <li>{array|object} The data source for the row (based on mData)</li>
+ * <li>{string} The type call data requested - this will be 'filter', 'display',
+ * 'type' or 'sort'.</li>
+ * <li>{array|object} The full data source for the row (not based on mData)</li>
+ * </ul>
+ * The return value from the function is what will be used for the data
+ * requested.</li>
+ * </ul>
+ * @type string|int|function|null
+ * @default null <i>Use mData</i>
+ * @dtopt Columns
+ *
+ * @example
+ * // Create a comma separated list from an array of objects
+ * $(document).ready( function() {
+ * var oTable = $('#example').dataTable( {
+ * "sAjaxSource": "sources/deep.txt",
+ * "aoColumns": [
+ * { "mData": "engine" },
+ * { "mData": "browser" },
+ * {
+ * "mData": "platform",
+ * "mRender": "[, ].name"
+ * }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Use as a function to create a link from the data source
+ * $(document).ready( function() {
+ * var oTable = $('#example').dataTable( {
+ * "aoColumnDefs": [
+ * {
+ * "aTargets": [ 0 ],
+ * "mData": "download_link",
+ * "mRender": function ( data, type, full ) {
+ * return '<a href="'+data+'">Download</a>';
+ * }
+ * ]
+ * } );
+ * } );
+ */
+ "mRender": null,
+
+
+ /**
+ * Change the cell type created for the column - either TD cells or TH cells. This
+ * can be useful as TH cells have semantic meaning in the table body, allowing them
+ * to act as a header for a row (you may wish to add scope='row' to the TH elements).
+ * @type string
+ * @default td
+ * @dtopt Columns
+ *
+ * @example
+ * // Make the first column use TH cells
+ * $(document).ready( function() {
+ * var oTable = $('#example').dataTable( {
+ * "aoColumnDefs": [ {
+ * "aTargets": [ 0 ],
+ * "sCellType": "th"
+ * } ]
+ * } );
+ * } );
+ */
+ "sCellType": "td",
+
+
+ /**
+ * Class to give to each cell in this column.
+ * @type string
+ * @default <i>Empty string</i>
+ * @dtopt Columns
+ *
+ * @example
+ * // Using aoColumnDefs
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aoColumnDefs": [
+ * { "sClass": "my_class", "aTargets": [ 0 ] }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using aoColumns
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aoColumns": [
+ * { "sClass": "my_class" },
+ * null,
+ * null,
+ * null,
+ * null
+ * ]
+ * } );
+ * } );
+ */
+ "sClass": "",
+
+ /**
+ * When DataTables calculates the column widths to assign to each column,
+ * it finds the longest string in each column and then constructs a
+ * temporary table and reads the widths from that. The problem with this
+ * is that "mmm" is much wider then "iiii", but the latter is a longer
+ * string - thus the calculation can go wrong (doing it properly and putting
+ * it into an DOM object and measuring that is horribly(!) slow). Thus as
+ * a "work around" we provide this option. It will append its value to the
+ * text that is found to be the longest string for the column - i.e. padding.
+ * Generally you shouldn't need this, and it is not documented on the
+ * general DataTables.net documentation
+ * @type string
+ * @default <i>Empty string<i>
+ * @dtopt Columns
+ *
+ * @example
+ * // Using aoColumns
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aoColumns": [
+ * null,
+ * null,
+ * null,
+ * {
+ * "sContentPadding": "mmm"
+ * }
+ * ]
+ * } );
+ * } );
+ */
+ "sContentPadding": "",
+
+
+ /**
+ * Allows a default value to be given for a column's data, and will be used
+ * whenever a null data source is encountered (this can be because mData
+ * is set to null, or because the data source itself is null).
+ * @type string
+ * @default null
+ * @dtopt Columns
+ *
+ * @example
+ * // Using aoColumnDefs
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aoColumnDefs": [
+ * {
+ * "mData": null,
+ * "sDefaultContent": "Edit",
+ * "aTargets": [ -1 ]
+ * }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using aoColumns
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aoColumns": [
+ * null,
+ * null,
+ * null,
+ * {
+ * "mData": null,
+ * "sDefaultContent": "Edit"
+ * }
+ * ]
+ * } );
+ * } );
+ */
+ "sDefaultContent": null,
+
+
+ /**
+ * This parameter is only used in DataTables' server-side processing. It can
+ * be exceptionally useful to know what columns are being displayed on the
+ * client side, and to map these to database fields. When defined, the names
+ * also allow DataTables to reorder information from the server if it comes
+ * back in an unexpected order (i.e. if you switch your columns around on the
+ * client-side, your server-side code does not also need updating).
+ * @type string
+ * @default <i>Empty string</i>
+ * @dtopt Columns
+ *
+ * @example
+ * // Using aoColumnDefs
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aoColumnDefs": [
+ * { "sName": "engine", "aTargets": [ 0 ] },
+ * { "sName": "browser", "aTargets": [ 1 ] },
+ * { "sName": "platform", "aTargets": [ 2 ] },
+ * { "sName": "version", "aTargets": [ 3 ] },
+ * { "sName": "grade", "aTargets": [ 4 ] }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using aoColumns
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aoColumns": [
+ * { "sName": "engine" },
+ * { "sName": "browser" },
+ * { "sName": "platform" },
+ * { "sName": "version" },
+ * { "sName": "grade" }
+ * ]
+ * } );
+ * } );
+ */
+ "sName": "",
+
+
+ /**
+ * Defines a data source type for the sorting which can be used to read
+ * real-time information from the table (updating the internally cached
+ * version) prior to sorting. This allows sorting to occur on user editable
+ * elements such as form inputs.
+ * @type string
+ * @default std
+ * @dtopt Columns
+ *
+ * @example
+ * // Using aoColumnDefs
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aoColumnDefs": [
+ * { "sSortDataType": "dom-text", "aTargets": [ 2, 3 ] },
+ * { "sType": "numeric", "aTargets": [ 3 ] },
+ * { "sSortDataType": "dom-select", "aTargets": [ 4 ] },
+ * { "sSortDataType": "dom-checkbox", "aTargets": [ 5 ] }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using aoColumns
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aoColumns": [
+ * null,
+ * null,
+ * { "sSortDataType": "dom-text" },
+ * { "sSortDataType": "dom-text", "sType": "numeric" },
+ * { "sSortDataType": "dom-select" },
+ * { "sSortDataType": "dom-checkbox" }
+ * ]
+ * } );
+ * } );
+ */
+ "sSortDataType": "std",
+
+
+ /**
+ * The title of this column.
+ * @type string
+ * @default null <i>Derived from the 'TH' value for this column in the
+ * original HTML table.</i>
+ * @dtopt Columns
+ *
+ * @example
+ * // Using aoColumnDefs
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aoColumnDefs": [
+ * { "sTitle": "My column title", "aTargets": [ 0 ] }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using aoColumns
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aoColumns": [
+ * { "sTitle": "My column title" },
+ * null,
+ * null,
+ * null,
+ * null
+ * ]
+ * } );
+ * } );
+ */
+ "sTitle": null,
+
+
+ /**
+ * The type allows you to specify how the data for this column will be sorted.
+ * Four types (string, numeric, date and html (which will strip HTML tags
+ * before sorting)) are currently available. Note that only date formats
+ * understood by Javascript's Date() object will be accepted as type date. For
+ * example: "Mar 26, 2008 5:03 PM". May take the values: 'string', 'numeric',
+ * 'date' or 'html' (by default). Further types can be adding through
+ * plug-ins.
+ * @type string
+ * @default null <i>Auto-detected from raw data</i>
+ * @dtopt Columns
+ *
+ * @example
+ * // Using aoColumnDefs
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aoColumnDefs": [
+ * { "sType": "html", "aTargets": [ 0 ] }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using aoColumns
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aoColumns": [
+ * { "sType": "html" },
+ * null,
+ * null,
+ * null,
+ * null
+ * ]
+ * } );
+ * } );
+ */
+ "sType": null,
+
+
+ /**
+ * Defining the width of the column, this parameter may take any CSS value
+ * (3em, 20px etc). DataTables apples 'smart' widths to columns which have not
+ * been given a specific width through this interface ensuring that the table
+ * remains readable.
+ * @type string
+ * @default null <i>Automatic</i>
+ * @dtopt Columns
+ *
+ * @example
+ * // Using aoColumnDefs
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aoColumnDefs": [
+ * { "sWidth": "20%", "aTargets": [ 0 ] }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using aoColumns
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "aoColumns": [
+ * { "sWidth": "20%" },
+ * null,
+ * null,
+ * null,
+ * null
+ * ]
+ * } );
+ * } );
+ */
+ "sWidth": null
+ };
+
+
+
+ /**
+ * DataTables settings object - this holds all the information needed for a
+ * given table, including configuration, data and current application of the
+ * table options. DataTables does not have a single instance for each DataTable
+ * with the settings attached to that instance, but rather instances of the
+ * DataTable "class" are created on-the-fly as needed (typically by a
+ * $().dataTable() call) and the settings object is then applied to that
+ * instance.
+ *
+ * Note that this object is related to {@link DataTable.defaults} but this
+ * one is the internal data store for DataTables's cache of columns. It should
+ * NOT be manipulated outside of DataTables. Any configuration should be done
+ * through the initialisation options.
+ * @namespace
+ * @todo Really should attach the settings object to individual instances so we
+ * don't need to create new instances on each $().dataTable() call (if the
+ * table already exists). It would also save passing oSettings around and
+ * into every single function. However, this is a very significant
+ * architecture change for DataTables and will almost certainly break
+ * backwards compatibility with older installations. This is something that
+ * will be done in 2.0.
+ */
+ DataTable.models.oSettings = {
+ /**
+ * Primary features of DataTables and their enablement state.
+ * @namespace
+ */
+ "oFeatures": {
+
+ /**
+ * Flag to say if DataTables should automatically try to calculate the
+ * optimum table and columns widths (true) or not (false).
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bAutoWidth": null,
+
+ /**
+ * Delay the creation of TR and TD elements until they are actually
+ * needed by a driven page draw. This can give a significant speed
+ * increase for Ajax source and Javascript source data, but makes no
+ * difference at all fro DOM and server-side processing tables.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bDeferRender": null,
+
+ /**
+ * Enable filtering on the table or not. Note that if this is disabled
+ * then there is no filtering at all on the table, including fnFilter.
+ * To just remove the filtering input use sDom and remove the 'f' option.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bFilter": null,
+
+ /**
+ * Table information element (the 'Showing x of y records' div) enable
+ * flag.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bInfo": null,
+
+ /**
+ * Present a user control allowing the end user to change the page size
+ * when pagination is enabled.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bLengthChange": null,
+
+ /**
+ * Pagination enabled or not. Note that if this is disabled then length
+ * changing must also be disabled.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bPaginate": null,
+
+ /**
+ * Processing indicator enable flag whenever DataTables is enacting a
+ * user request - typically an Ajax request for server-side processing.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bProcessing": null,
+
+ /**
+ * Server-side processing enabled flag - when enabled DataTables will
+ * get all data from the server for every draw - there is no filtering,
+ * sorting or paging done on the client-side.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bServerSide": null,
+
+ /**
+ * Sorting enablement flag.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bSort": null,
+
+ /**
+ * Apply a class to the columns which are being sorted to provide a
+ * visual highlight or not. This can slow things down when enabled since
+ * there is a lot of DOM interaction.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bSortClasses": null,
+
+ /**
+ * State saving enablement flag.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bStateSave": null
+ },
+
+
+ /**
+ * Scrolling settings for a table.
+ * @namespace
+ */
+ "oScroll": {
+ /**
+ * Indicate if DataTables should be allowed to set the padding / margin
+ * etc for the scrolling header elements or not. Typically you will want
+ * this.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bAutoCss": null,
+
+ /**
+ * When the table is shorter in height than sScrollY, collapse the
+ * table container down to the height of the table (when true).
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bCollapse": null,
+
+ /**
+ * Infinite scrolling enablement flag. Now deprecated in favour of
+ * using the Scroller plug-in.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bInfinite": null,
+
+ /**
+ * Width of the scrollbar for the web-browser's platform. Calculated
+ * during table initialisation.
+ * @type int
+ * @default 0
+ */
+ "iBarWidth": 0,
+
+ /**
+ * Space (in pixels) between the bottom of the scrolling container and
+ * the bottom of the scrolling viewport before the next page is loaded
+ * when using infinite scrolling.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type int
+ */
+ "iLoadGap": null,
+
+ /**
+ * Viewport width for horizontal scrolling. Horizontal scrolling is
+ * disabled if an empty string.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type string
+ */
+ "sX": null,
+
+ /**
+ * Width to expand the table to when using x-scrolling. Typically you
+ * should not need to use this.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type string
+ * @deprecated
+ */
+ "sXInner": null,
+
+ /**
+ * Viewport height for vertical scrolling. Vertical scrolling is disabled
+ * if an empty string.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type string
+ */
+ "sY": null
+ },
+
+ /**
+ * Language information for the table.
+ * @namespace
+ * @extends DataTable.defaults.oLanguage
+ */
+ "oLanguage": {
+ /**
+ * Information callback function. See
+ * {@link DataTable.defaults.fnInfoCallback}
+ * @type function
+ * @default null
+ */
+ "fnInfoCallback": null
+ },
+
+ /**
+ * Browser support parameters
+ * @namespace
+ */
+ "oBrowser": {
+ /**
+ * Indicate if the browser incorrectly calculates width:100% inside a
+ * scrolling element (IE6/7)
+ * @type boolean
+ * @default false
+ */
+ "bScrollOversize": false
+ },
+
+ /**
+ * Array referencing the nodes which are used for the features. The
+ * parameters of this object match what is allowed by sDom - i.e.
+ * <ul>
+ * <li>'l' - Length changing</li>
+ * <li>'f' - Filtering input</li>
+ * <li>'t' - The table!</li>
+ * <li>'i' - Information</li>
+ * <li>'p' - Pagination</li>
+ * <li>'r' - pRocessing</li>
+ * </ul>
+ * @type array
+ * @default []
+ */
+ "aanFeatures": [],
+
+ /**
+ * Store data information - see {@link DataTable.models.oRow} for detailed
+ * information.
+ * @type array
+ * @default []
+ */
+ "aoData": [],
+
+ /**
+ * Array of indexes which are in the current display (after filtering etc)
+ * @type array
+ * @default []
+ */
+ "aiDisplay": [],
+
+ /**
+ * Array of indexes for display - no filtering
+ * @type array
+ * @default []
+ */
+ "aiDisplayMaster": [],
+
+ /**
+ * Store information about each column that is in use
+ * @type array
+ * @default []
+ */
+ "aoColumns": [],
+
+ /**
+ * Store information about the table's header
+ * @type array
+ * @default []
+ */
+ "aoHeader": [],
+
+ /**
+ * Store information about the table's footer
+ * @type array
+ * @default []
+ */
+ "aoFooter": [],
+
+ /**
+ * Search data array for regular expression searching
+ * @type array
+ * @default []
+ */
+ "asDataSearch": [],
+
+ /**
+ * Store the applied global search information in case we want to force a
+ * research or compare the old search to a new one.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @namespace
+ * @extends DataTable.models.oSearch
+ */
+ "oPreviousSearch": {},
+
+ /**
+ * Store the applied search for each column - see
+ * {@link DataTable.models.oSearch} for the format that is used for the
+ * filtering information for each column.
+ * @type array
+ * @default []
+ */
+ "aoPreSearchCols": [],
+
+ /**
+ * Sorting that is applied to the table. Note that the inner arrays are
+ * used in the following manner:
+ * <ul>
+ * <li>Index 0 - column number</li>
+ * <li>Index 1 - current sorting direction</li>
+ * <li>Index 2 - index of asSorting for this column</li>
+ * </ul>
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type array
+ * @todo These inner arrays should really be objects
+ */
+ "aaSorting": null,
+
+ /**
+ * Sorting that is always applied to the table (i.e. prefixed in front of
+ * aaSorting).
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type array|null
+ * @default null
+ */
+ "aaSortingFixed": null,
+
+ /**
+ * Classes to use for the striping of a table.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type array
+ * @default []
+ */
+ "asStripeClasses": null,
+
+ /**
+ * If restoring a table - we should restore its striping classes as well
+ * @type array
+ * @default []
+ */
+ "asDestroyStripes": [],
+
+ /**
+ * If restoring a table - we should restore its width
+ * @type int
+ * @default 0
+ */
+ "sDestroyWidth": 0,
+
+ /**
+ * Callback functions array for every time a row is inserted (i.e. on a draw).
+ * @type array
+ * @default []
+ */
+ "aoRowCallback": [],
+
+ /**
+ * Callback functions for the header on each draw.
+ * @type array
+ * @default []
+ */
+ "aoHeaderCallback": [],
+
+ /**
+ * Callback function for the footer on each draw.
+ * @type array
+ * @default []
+ */
+ "aoFooterCallback": [],
+
+ /**
+ * Array of callback functions for draw callback functions
+ * @type array
+ * @default []
+ */
+ "aoDrawCallback": [],
+
+ /**
+ * Array of callback functions for row created function
+ * @type array
+ * @default []
+ */
+ "aoRowCreatedCallback": [],
+
+ /**
+ * Callback functions for just before the table is redrawn. A return of
+ * false will be used to cancel the draw.
+ * @type array
+ * @default []
+ */
+ "aoPreDrawCallback": [],
+
+ /**
+ * Callback functions for when the table has been initialised.
+ * @type array
+ * @default []
+ */
+ "aoInitComplete": [],
+
+
+ /**
+ * Callbacks for modifying the settings to be stored for state saving, prior to
+ * saving state.
+ * @type array
+ * @default []
+ */
+ "aoStateSaveParams": [],
+
+ /**
+ * Callbacks for modifying the settings that have been stored for state saving
+ * prior to using the stored values to restore the state.
+ * @type array
+ * @default []
+ */
+ "aoStateLoadParams": [],
+
+ /**
+ * Callbacks for operating on the settings object once the saved state has been
+ * loaded
+ * @type array
+ * @default []
+ */
+ "aoStateLoaded": [],
+
+ /**
+ * Cache the table ID for quick access
+ * @type string
+ * @default <i>Empty string</i>
+ */
+ "sTableId": "",
+
+ /**
+ * The TABLE node for the main table
+ * @type node
+ * @default null
+ */
+ "nTable": null,
+
+ /**
+ * Permanent ref to the thead element
+ * @type node
+ * @default null
+ */
+ "nTHead": null,
+
+ /**
+ * Permanent ref to the tfoot element - if it exists
+ * @type node
+ * @default null
+ */
+ "nTFoot": null,
+
+ /**
+ * Permanent ref to the tbody element
+ * @type node
+ * @default null
+ */
+ "nTBody": null,
+
+ /**
+ * Cache the wrapper node (contains all DataTables controlled elements)
+ * @type node
+ * @default null
+ */
+ "nTableWrapper": null,
+
+ /**
+ * Indicate if when using server-side processing the loading of data
+ * should be deferred until the second draw.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ * @default false
+ */
+ "bDeferLoading": false,
+
+ /**
+ * Indicate if all required information has been read in
+ * @type boolean
+ * @default false
+ */
+ "bInitialised": false,
+
+ /**
+ * Information about open rows. Each object in the array has the parameters
+ * 'nTr' and 'nParent'
+ * @type array
+ * @default []
+ */
+ "aoOpenRows": [],
+
+ /**
+ * Dictate the positioning of DataTables' control elements - see
+ * {@link DataTable.model.oInit.sDom}.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type string
+ * @default null
+ */
+ "sDom": null,
+
+ /**
+ * Which type of pagination should be used.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type string
+ * @default two_button
+ */
+ "sPaginationType": "two_button",
+
+ /**
+ * The cookie duration (for bStateSave) in seconds.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type int
+ * @default 0
+ */
+ "iCookieDuration": 0,
+
+ /**
+ * The cookie name prefix.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type string
+ * @default <i>Empty string</i>
+ */
+ "sCookiePrefix": "",
+
+ /**
+ * Callback function for cookie creation.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type function
+ * @default null
+ */
+ "fnCookieCallback": null,
+
+ /**
+ * Array of callback functions for state saving. Each array element is an
+ * object with the following parameters:
+ * <ul>
+ * <li>function:fn - function to call. Takes two parameters, oSettings
+ * and the JSON string to save that has been thus far created. Returns
+ * a JSON string to be inserted into a json object
+ * (i.e. '"param": [ 0, 1, 2]')</li>
+ * <li>string:sName - name of callback</li>
+ * </ul>
+ * @type array
+ * @default []
+ */
+ "aoStateSave": [],
+
+ /**
+ * Array of callback functions for state loading. Each array element is an
+ * object with the following parameters:
+ * <ul>
+ * <li>function:fn - function to call. Takes two parameters, oSettings
+ * and the object stored. May return false to cancel state loading</li>
+ * <li>string:sName - name of callback</li>
+ * </ul>
+ * @type array
+ * @default []
+ */
+ "aoStateLoad": [],
+
+ /**
+ * State that was loaded from the cookie. Useful for back reference
+ * @type object
+ * @default null
+ */
+ "oLoadedState": null,
+
+ /**
+ * Source url for AJAX data for the table.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type string
+ * @default null
+ */
+ "sAjaxSource": null,
+
+ /**
+ * Property from a given object from which to read the table data from. This
+ * can be an empty string (when not server-side processing), in which case
+ * it is assumed an an array is given directly.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type string
+ */
+ "sAjaxDataProp": null,
+
+ /**
+ * Note if draw should be blocked while getting data
+ * @type boolean
+ * @default true
+ */
+ "bAjaxDataGet": true,
+
+ /**
+ * The last jQuery XHR object that was used for server-side data gathering.
+ * This can be used for working with the XHR information in one of the
+ * callbacks
+ * @type object
+ * @default null
+ */
+ "jqXHR": null,
+
+ /**
+ * Function to get the server-side data.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type function
+ */
+ "fnServerData": null,
+
+ /**
+ * Functions which are called prior to sending an Ajax request so extra
+ * parameters can easily be sent to the server
+ * @type array
+ * @default []
+ */
+ "aoServerParams": [],
+
+ /**
+ * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if
+ * required).
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type string
+ */
+ "sServerMethod": null,
+
+ /**
+ * Format numbers for display.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type function
+ */
+ "fnFormatNumber": null,
+
+ /**
+ * List of options that can be used for the user selectable length menu.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type array
+ * @default []
+ */
+ "aLengthMenu": null,
+
+ /**
+ * Counter for the draws that the table does. Also used as a tracker for
+ * server-side processing
+ * @type int
+ * @default 0
+ */
+ "iDraw": 0,
+
+ /**
+ * Indicate if a redraw is being done - useful for Ajax
+ * @type boolean
+ * @default false
+ */
+ "bDrawing": false,
+
+ /**
+ * Draw index (iDraw) of the last error when parsing the returned data
+ * @type int
+ * @default -1
+ */
+ "iDrawError": -1,
+
+ /**
+ * Paging display length
+ * @type int
+ * @default 10
+ */
+ "_iDisplayLength": 10,
+
+ /**
+ * Paging start point - aiDisplay index
+ * @type int
+ * @default 0
+ */
+ "_iDisplayStart": 0,
+
+ /**
+ * Paging end point - aiDisplay index. Use fnDisplayEnd rather than
+ * this property to get the end point
+ * @type int
+ * @default 10
+ * @private
+ */
+ "_iDisplayEnd": 10,
+
+ /**
+ * Server-side processing - number of records in the result set
+ * (i.e. before filtering), Use fnRecordsTotal rather than
+ * this property to get the value of the number of records, regardless of
+ * the server-side processing setting.
+ * @type int
+ * @default 0
+ * @private
+ */
+ "_iRecordsTotal": 0,
+
+ /**
+ * Server-side processing - number of records in the current display set
+ * (i.e. after filtering). Use fnRecordsDisplay rather than
+ * this property to get the value of the number of records, regardless of
+ * the server-side processing setting.
+ * @type boolean
+ * @default 0
+ * @private
+ */
+ "_iRecordsDisplay": 0,
+
+ /**
+ * Flag to indicate if jQuery UI marking and classes should be used.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bJUI": null,
+
+ /**
+ * The classes to use for the table
+ * @type object
+ * @default {}
+ */
+ "oClasses": {},
+
+ /**
+ * Flag attached to the settings object so you can check in the draw
+ * callback if filtering has been done in the draw. Deprecated in favour of
+ * events.
+ * @type boolean
+ * @default false
+ * @deprecated
+ */
+ "bFiltered": false,
+
+ /**
+ * Flag attached to the settings object so you can check in the draw
+ * callback if sorting has been done in the draw. Deprecated in favour of
+ * events.
+ * @type boolean
+ * @default false
+ * @deprecated
+ */
+ "bSorted": false,
+
+ /**
+ * Indicate that if multiple rows are in the header and there is more than
+ * one unique cell per column, if the top one (true) or bottom one (false)
+ * should be used for sorting / title by DataTables.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bSortCellsTop": null,
+
+ /**
+ * Initialisation object that is used for the table
+ * @type object
+ * @default null
+ */
+ "oInit": null,
+
+ /**
+ * Destroy callback functions - for plug-ins to attach themselves to the
+ * destroy so they can clean up markup and events.
+ * @type array
+ * @default []
+ */
+ "aoDestroyCallback": [],
+
+
+ /**
+ * Get the number of records in the current record set, before filtering
+ * @type function
+ */
+ "fnRecordsTotal": function ()
+ {
+ if ( this.oFeatures.bServerSide ) {
+ return parseInt(this._iRecordsTotal, 10);
+ } else {
+ return this.aiDisplayMaster.length;
+ }
+ },
+
+ /**
+ * Get the number of records in the current record set, after filtering
+ * @type function
+ */
+ "fnRecordsDisplay": function ()
+ {
+ if ( this.oFeatures.bServerSide ) {
+ return parseInt(this._iRecordsDisplay, 10);
+ } else {
+ return this.aiDisplay.length;
+ }
+ },
+
+ /**
+ * Set the display end point - aiDisplay index
+ * @type function
+ * @todo Should do away with _iDisplayEnd and calculate it on-the-fly here
+ */
+ "fnDisplayEnd": function ()
+ {
+ if ( this.oFeatures.bServerSide ) {
+ if ( this.oFeatures.bPaginate === false || this._iDisplayLength == -1 ) {
+ return this._iDisplayStart+this.aiDisplay.length;
+ } else {
+ return Math.min( this._iDisplayStart+this._iDisplayLength,
+ this._iRecordsDisplay );
+ }
+ } else {
+ return this._iDisplayEnd;
+ }
+ },
+
+ /**
+ * The DataTables object for this table
+ * @type object
+ * @default null
+ */
+ "oInstance": null,
+
+ /**
+ * Unique identifier for each instance of the DataTables object. If there
+ * is an ID on the table node, then it takes that value, otherwise an
+ * incrementing internal counter is used.
+ * @type string
+ * @default null
+ */
+ "sInstance": null,
+
+ /**
+ * tabindex attribute value that is added to DataTables control elements, allowing
+ * keyboard navigation of the table and its controls.
+ */
+ "iTabIndex": 0,
+
+ /**
+ * DIV container for the footer scrolling table if scrolling
+ */
+ "nScrollHead": null,
+
+ /**
+ * DIV container for the footer scrolling table if scrolling
+ */
+ "nScrollFoot": null
+ };
+
+ /**
+ * Extension object for DataTables that is used to provide all extension options.
+ *
+ * Note that the <i>DataTable.ext</i> object is available through
+ * <i>jQuery.fn.dataTable.ext</i> where it may be accessed and manipulated. It is
+ * also aliased to <i>jQuery.fn.dataTableExt</i> for historic reasons.
+ * @namespace
+ * @extends DataTable.models.ext
+ */
+ DataTable.ext = $.extend( true, {}, DataTable.models.ext );
+
+ $.extend( DataTable.ext.oStdClasses, {
+ "sTable": "dataTable",
+
+ /* Two buttons buttons */
+ "sPagePrevEnabled": "paginate_enabled_previous",
+ "sPagePrevDisabled": "paginate_disabled_previous",
+ "sPageNextEnabled": "paginate_enabled_next",
+ "sPageNextDisabled": "paginate_disabled_next",
+ "sPageJUINext": "",
+ "sPageJUIPrev": "",
+
+ /* Full numbers paging buttons */
+ "sPageButton": "paginate_button",
+ "sPageButtonActive": "paginate_active",
+ "sPageButtonStaticDisabled": "paginate_button paginate_button_disabled",
+ "sPageFirst": "first",
+ "sPagePrevious": "previous",
+ "sPageNext": "next",
+ "sPageLast": "last",
+
+ /* Striping classes */
+ "sStripeOdd": "odd",
+ "sStripeEven": "even",
+
+ /* Empty row */
+ "sRowEmpty": "dataTables_empty",
+
+ /* Features */
+ "sWrapper": "dataTables_wrapper",
+ "sFilter": "dataTables_filter",
+ "sInfo": "dataTables_info",
+ "sPaging": "dataTables_paginate paging_", /* Note that the type is postfixed */
+ "sLength": "dataTables_length",
+ "sProcessing": "dataTables_processing",
+
+ /* Sorting */
+ "sSortAsc": "sorting_asc",
+ "sSortDesc": "sorting_desc",
+ "sSortable": "sorting", /* Sortable in both directions */
+ "sSortableAsc": "sorting_asc_disabled",
+ "sSortableDesc": "sorting_desc_disabled",
+ "sSortableNone": "sorting_disabled",
+ "sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */
+ "sSortJUIAsc": "",
+ "sSortJUIDesc": "",
+ "sSortJUI": "",
+ "sSortJUIAscAllowed": "",
+ "sSortJUIDescAllowed": "",
+ "sSortJUIWrapper": "",
+ "sSortIcon": "",
+
+ /* Scrolling */
+ "sScrollWrapper": "dataTables_scroll",
+ "sScrollHead": "dataTables_scrollHead",
+ "sScrollHeadInner": "dataTables_scrollHeadInner",
+ "sScrollBody": "dataTables_scrollBody",
+ "sScrollFoot": "dataTables_scrollFoot",
+ "sScrollFootInner": "dataTables_scrollFootInner",
+
+ /* Misc */
+ "sFooterTH": "",
+ "sJUIHeader": "",
+ "sJUIFooter": ""
+ } );
+
+
+ $.extend( DataTable.ext.oJUIClasses, DataTable.ext.oStdClasses, {
+ /* Two buttons buttons */
+ "sPagePrevEnabled": "fg-button ui-button ui-state-default ui-corner-left",
+ "sPagePrevDisabled": "fg-button ui-button ui-state-default ui-corner-left ui-state-disabled",
+ "sPageNextEnabled": "fg-button ui-button ui-state-default ui-corner-right",
+ "sPageNextDisabled": "fg-button ui-button ui-state-default ui-corner-right ui-state-disabled",
+ "sPageJUINext": "ui-icon ui-icon-circle-arrow-e",
+ "sPageJUIPrev": "ui-icon ui-icon-circle-arrow-w",
+
+ /* Full numbers paging buttons */
+ "sPageButton": "fg-button ui-button ui-state-default",
+ "sPageButtonActive": "fg-button ui-button ui-state-default ui-state-disabled",
+ "sPageButtonStaticDisabled": "fg-button ui-button ui-state-default ui-state-disabled",
+ "sPageFirst": "first ui-corner-tl ui-corner-bl",
+ "sPageLast": "last ui-corner-tr ui-corner-br",
+
+ /* Features */
+ "sPaging": "dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi "+
+ "ui-buttonset-multi paging_", /* Note that the type is postfixed */
+
+ /* Sorting */
+ "sSortAsc": "ui-state-default",
+ "sSortDesc": "ui-state-default",
+ "sSortable": "ui-state-default",
+ "sSortableAsc": "ui-state-default",
+ "sSortableDesc": "ui-state-default",
+ "sSortableNone": "ui-state-default",
+ "sSortJUIAsc": "css_right ui-icon ui-icon-triangle-1-n",
+ "sSortJUIDesc": "css_right ui-icon ui-icon-triangle-1-s",
+ "sSortJUI": "css_right ui-icon ui-icon-carat-2-n-s",
+ "sSortJUIAscAllowed": "css_right ui-icon ui-icon-carat-1-n",
+ "sSortJUIDescAllowed": "css_right ui-icon ui-icon-carat-1-s",
+ "sSortJUIWrapper": "DataTables_sort_wrapper",
+ "sSortIcon": "DataTables_sort_icon",
+
+ /* Scrolling */
+ "sScrollHead": "dataTables_scrollHead ui-state-default",
+ "sScrollFoot": "dataTables_scrollFoot ui-state-default",
+
+ /* Misc */
+ "sFooterTH": "ui-state-default",
+ "sJUIHeader": "fg-toolbar ui-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix",
+ "sJUIFooter": "fg-toolbar ui-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix"
+ } );
+
+ /*
+ * Variable: oPagination
+ * Purpose:
+ * Scope: jQuery.fn.dataTableExt
+ */
+ $.extend( DataTable.ext.oPagination, {
+ /*
+ * Variable: two_button
+ * Purpose: Standard two button (forward/back) pagination
+ * Scope: jQuery.fn.dataTableExt.oPagination
+ */
+ "two_button": {
+ /*
+ * Function: oPagination.two_button.fnInit
+ * Purpose: Initialise dom elements required for pagination with forward/back buttons only
+ * Returns: -
+ * Inputs: object:oSettings - dataTables settings object
+ * node:nPaging - the DIV which contains this pagination control
+ * function:fnCallbackDraw - draw function which must be called on update
+ */
+ "fnInit": function ( oSettings, nPaging, fnCallbackDraw )
+ {
+ var oLang = oSettings.oLanguage.oPaginate;
+ var oClasses = oSettings.oClasses;
+ var fnClickHandler = function ( e ) {
+ if ( oSettings.oApi._fnPageChange( oSettings, e.data.action ) )
+ {
+ fnCallbackDraw( oSettings );
+ }
+ };
+
+ var sAppend = (!oSettings.bJUI) ?
+ '<a class="'+oSettings.oClasses.sPagePrevDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button">'+oLang.sPrevious+'</a>'+
+ '<a class="'+oSettings.oClasses.sPageNextDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button">'+oLang.sNext+'</a>'
+ :
+ '<a class="'+oSettings.oClasses.sPagePrevDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button"><span class="'+oSettings.oClasses.sPageJUIPrev+'"></span></a>'+
+ '<a class="'+oSettings.oClasses.sPageNextDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button"><span class="'+oSettings.oClasses.sPageJUINext+'"></span></a>';
+ $(nPaging).append( sAppend );
+
+ var els = $('a', nPaging);
+ var nPrevious = els[0],
+ nNext = els[1];
+
+ oSettings.oApi._fnBindAction( nPrevious, {action: "previous"}, fnClickHandler );
+ oSettings.oApi._fnBindAction( nNext, {action: "next"}, fnClickHandler );
+
+ /* ID the first elements only */
+ if ( !oSettings.aanFeatures.p )
+ {
+ nPaging.id = oSettings.sTableId+'_paginate';
+ nPrevious.id = oSettings.sTableId+'_previous';
+ nNext.id = oSettings.sTableId+'_next';
+
+ nPrevious.setAttribute('aria-controls', oSettings.sTableId);
+ nNext.setAttribute('aria-controls', oSettings.sTableId);
+ }
+ },
+
+ /*
+ * Function: oPagination.two_button.fnUpdate
+ * Purpose: Update the two button pagination at the end of the draw
+ * Returns: -
+ * Inputs: object:oSettings - dataTables settings object
+ * function:fnCallbackDraw - draw function to call on page change
+ */
+ "fnUpdate": function ( oSettings, fnCallbackDraw )
+ {
+ if ( !oSettings.aanFeatures.p )
+ {
+ return;
+ }
+
+ var oClasses = oSettings.oClasses;
+ var an = oSettings.aanFeatures.p;
+ var nNode;
+
+ /* Loop over each instance of the pager */
+ for ( var i=0, iLen=an.length ; i<iLen ; i++ )
+ {
+ nNode = an[i].firstChild;
+ if ( nNode )
+ {
+ /* Previous page */
+ nNode.className = ( oSettings._iDisplayStart === 0 ) ?
+ oClasses.sPagePrevDisabled : oClasses.sPagePrevEnabled;
+
+ /* Next page */
+ nNode = nNode.nextSibling;
+ nNode.className = ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() ) ?
+ oClasses.sPageNextDisabled : oClasses.sPageNextEnabled;
+ }
+ }
+ }
+ },
+
+
+ /*
+ * Variable: iFullNumbersShowPages
+ * Purpose: Change the number of pages which can be seen
+ * Scope: jQuery.fn.dataTableExt.oPagination
+ */
+ "iFullNumbersShowPages": 5,
+
+ /*
+ * Variable: full_numbers
+ * Purpose: Full numbers pagination
+ * Scope: jQuery.fn.dataTableExt.oPagination
+ */
+ "full_numbers": {
+ /*
+ * Function: oPagination.full_numbers.fnInit
+ * Purpose: Initialise dom elements required for pagination with a list of the pages
+ * Returns: -
+ * Inputs: object:oSettings - dataTables settings object
+ * node:nPaging - the DIV which contains this pagination control
+ * function:fnCallbackDraw - draw function which must be called on update
+ */
+ "fnInit": function ( oSettings, nPaging, fnCallbackDraw )
+ {
+ var oLang = oSettings.oLanguage.oPaginate;
+ var oClasses = oSettings.oClasses;
+ var fnClickHandler = function ( e ) {
+ if ( oSettings.oApi._fnPageChange( oSettings, e.data.action ) )
+ {
+ fnCallbackDraw( oSettings );
+ }
+ };
+
+ $(nPaging).append(
+ '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPageFirst+'">'+oLang.sFirst+'</a>'+
+ '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPagePrevious+'">'+oLang.sPrevious+'</a>'+
+ '<span></span>'+
+ '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPageNext+'">'+oLang.sNext+'</a>'+
+ '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPageLast+'">'+oLang.sLast+'</a>'
+ );
+ var els = $('a', nPaging);
+ var nFirst = els[0],
+ nPrev = els[1],
+ nNext = els[2],
+ nLast = els[3];
+
+ oSettings.oApi._fnBindAction( nFirst, {action: "first"}, fnClickHandler );
+ oSettings.oApi._fnBindAction( nPrev, {action: "previous"}, fnClickHandler );
+ oSettings.oApi._fnBindAction( nNext, {action: "next"}, fnClickHandler );
+ oSettings.oApi._fnBindAction( nLast, {action: "last"}, fnClickHandler );
+
+ /* ID the first elements only */
+ if ( !oSettings.aanFeatures.p )
+ {
+ nPaging.id = oSettings.sTableId+'_paginate';
+ nFirst.id =oSettings.sTableId+'_first';
+ nPrev.id =oSettings.sTableId+'_previous';
+ nNext.id =oSettings.sTableId+'_next';
+ nLast.id =oSettings.sTableId+'_last';
+ }
+ },
+
+ /*
+ * Function: oPagination.full_numbers.fnUpdate
+ * Purpose: Update the list of page buttons shows
+ * Returns: -
+ * Inputs: object:oSettings - dataTables settings object
+ * function:fnCallbackDraw - draw function to call on page change
+ */
+ "fnUpdate": function ( oSettings, fnCallbackDraw )
+ {
+ if ( !oSettings.aanFeatures.p )
+ {
+ return;
+ }
+
+ var iPageCount = DataTable.ext.oPagination.iFullNumbersShowPages;
+ var iPageCountHalf = Math.floor(iPageCount / 2);
+ var iPages = Math.ceil((oSettings.fnRecordsDisplay()) / oSettings._iDisplayLength);
+ var iCurrentPage = Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength) + 1;
+ var sList = "";
+ var iStartButton, iEndButton, i, iLen;
+ var oClasses = oSettings.oClasses;
+ var anButtons, anStatic, nPaginateList, nNode;
+ var an = oSettings.aanFeatures.p;
+ var fnBind = function (j) {
+ oSettings.oApi._fnBindAction( this, {"page": j+iStartButton-1}, function(e) {
+ /* Use the information in the element to jump to the required page */
+ oSettings.oApi._fnPageChange( oSettings, e.data.page );
+ fnCallbackDraw( oSettings );
+ e.preventDefault();
+ } );
+ };
+
+ /* Pages calculation */
+ if ( oSettings._iDisplayLength === -1 )
+ {
+ iStartButton = 1;
+ iEndButton = 1;
+ iCurrentPage = 1;
+ }
+ else if (iPages < iPageCount)
+ {
+ iStartButton = 1;
+ iEndButton = iPages;
+ }
+ else if (iCurrentPage <= iPageCountHalf)
+ {
+ iStartButton = 1;
+ iEndButton = iPageCount;
+ }
+ else if (iCurrentPage >= (iPages - iPageCountHalf))
+ {
+ iStartButton = iPages - iPageCount + 1;
+ iEndButton = iPages;
+ }
+ else
+ {
+ iStartButton = iCurrentPage - Math.ceil(iPageCount / 2) + 1;
+ iEndButton = iStartButton + iPageCount - 1;
+ }
+
+
+ /* Build the dynamic list */
+ for ( i=iStartButton ; i<=iEndButton ; i++ )
+ {
+ sList += (iCurrentPage !== i) ?
+ '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+'">'+oSettings.fnFormatNumber(i)+'</a>' :
+ '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButtonActive+'">'+oSettings.fnFormatNumber(i)+'</a>';
+ }
+
+ /* Loop over each instance of the pager */
+ for ( i=0, iLen=an.length ; i<iLen ; i++ )
+ {
+ nNode = an[i];
+ if ( !nNode.hasChildNodes() )
+ {
+ continue;
+ }
+
+ /* Build up the dynamic list first - html and listeners */
+ $('span:eq(0)', nNode)
+ .html( sList )
+ .children('a').each( fnBind );
+
+ /* Update the permanent button's classes */
+ anButtons = nNode.getElementsByTagName('a');
+ anStatic = [
+ anButtons[0], anButtons[1],
+ anButtons[anButtons.length-2], anButtons[anButtons.length-1]
+ ];
+
+ $(anStatic).removeClass( oClasses.sPageButton+" "+oClasses.sPageButtonActive+" "+oClasses.sPageButtonStaticDisabled );
+ $([anStatic[0], anStatic[1]]).addClass(
+ (iCurrentPage==1) ?
+ oClasses.sPageButtonStaticDisabled :
+ oClasses.sPageButton
+ );
+ $([anStatic[2], anStatic[3]]).addClass(
+ (iPages===0 || iCurrentPage===iPages || oSettings._iDisplayLength===-1) ?
+ oClasses.sPageButtonStaticDisabled :
+ oClasses.sPageButton
+ );
+ }
+ }
+ }
+ } );
+
+ $.extend( DataTable.ext.oSort, {
+ /*
+ * text sorting
+ */
+ "string-pre": function ( a )
+ {
+ if ( typeof a != 'string' ) {
+ a = (a !== null && a.toString) ? a.toString() : '';
+ }
+ return a.toLowerCase();
+ },
+
+ "string-asc": function ( x, y )
+ {
+ return ((x < y) ? -1 : ((x > y) ? 1 : 0));
+ },
+
+ "string-desc": function ( x, y )
+ {
+ return ((x < y) ? 1 : ((x > y) ? -1 : 0));
+ },
+
+
+ /*
+ * html sorting (ignore html tags)
+ */
+ "html-pre": function ( a )
+ {
+ return a.replace( /<.*?>/g, "" ).toLowerCase();
+ },
+
+ "html-asc": function ( x, y )
+ {
+ return ((x < y) ? -1 : ((x > y) ? 1 : 0));
+ },
+
+ "html-desc": function ( x, y )
+ {
+ return ((x < y) ? 1 : ((x > y) ? -1 : 0));
+ },
+
+
+ /*
+ * date sorting
+ */
+ "date-pre": function ( a )
+ {
+ var x = Date.parse( a );
+
+ if ( isNaN(x) || x==="" )
+ {
+ x = Date.parse( "01/01/1970 00:00:00" );
+ }
+ return x;
+ },
+
+ "date-asc": function ( x, y )
+ {
+ return x - y;
+ },
+
+ "date-desc": function ( x, y )
+ {
+ return y - x;
+ },
+
+
+ /*
+ * numerical sorting
+ */
+ "numeric-pre": function ( a )
+ {
+ return (a=="-" || a==="") ? 0 : a*1;
+ },
+
+ "numeric-asc": function ( x, y )
+ {
+ return x - y;
+ },
+
+ "numeric-desc": function ( x, y )
+ {
+ return y - x;
+ }
+ } );
+
+
+ $.extend( DataTable.ext.aTypes, [
+ /*
+ * Function: -
+ * Purpose: Check to see if a string is numeric
+ * Returns: string:'numeric' or null
+ * Inputs: mixed:sText - string to check
+ */
+ function ( sData )
+ {
+ /* Allow zero length strings as a number */
+ if ( typeof sData === 'number' )
+ {
+ return 'numeric';
+ }
+ else if ( typeof sData !== 'string' )
+ {
+ return null;
+ }
+
+ var sValidFirstChars = "0123456789-";
+ var sValidChars = "0123456789.";
+ var Char;
+ var bDecimal = false;
+
+ /* Check for a valid first char (no period and allow negatives) */
+ Char = sData.charAt(0);
+ if (sValidFirstChars.indexOf(Char) == -1)
+ {
+ return null;
+ }
+
+ /* Check all the other characters are valid */
+ for ( var i=1 ; i<sData.length ; i++ )
+ {
+ Char = sData.charAt(i);
+ if (sValidChars.indexOf(Char) == -1)
+ {
+ return null;
+ }
+
+ /* Only allowed one decimal place... */
+ if ( Char == "." )
+ {
+ if ( bDecimal )
+ {
+ return null;
+ }
+ bDecimal = true;
+ }
+ }
+
+ return 'numeric';
+ },
+
+ /*
+ * Function: -
+ * Purpose: Check to see if a string is actually a formatted date
+ * Returns: string:'date' or null
+ * Inputs: string:sText - string to check
+ */
+ function ( sData )
+ {
+ var iParse = Date.parse(sData);
+ if ( (iParse !== null && !isNaN(iParse)) || (typeof sData === 'string' && sData.length === 0) )
+ {
+ return 'date';
+ }
+ return null;
+ },
+
+ /*
+ * Function: -
+ * Purpose: Check to see if a string should be treated as an HTML string
+ * Returns: string:'html' or null
+ * Inputs: string:sText - string to check
+ */
+ function ( sData )
+ {
+ if ( typeof sData === 'string' && sData.indexOf('<') != -1 && sData.indexOf('>') != -1 )
+ {
+ return 'html';
+ }
+ return null;
+ }
+ ] );
+
+
+ // jQuery aliases
+ $.fn.DataTable = DataTable;
+ $.fn.dataTable = DataTable;
+ $.fn.dataTableSettings = DataTable.settings;
+ $.fn.dataTableExt = DataTable.ext;
+
+
+ // Information about events fired by DataTables - for documentation.
+ /**
+ * Draw event, fired whenever the table is redrawn on the page, at the same point as
+ * fnDrawCallback. This may be useful for binding events or performing calculations when
+ * the table is altered at all.
+ * @name DataTable#draw
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+ */
+
+ /**
+ * Filter event, fired when the filtering applied to the table (using the build in global
+ * global filter, or column filters) is altered.
+ * @name DataTable#filter
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+ */
+
+ /**
+ * Page change event, fired when the paging of the table is altered.
+ * @name DataTable#page
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+ */
+
+ /**
+ * Sort event, fired when the sorting applied to the table is altered.
+ * @name DataTable#sort
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+ */
+
+ /**
+ * DataTables initialisation complete event, fired when the table is fully drawn,
+ * including Ajax data loaded, if Ajax data is required.
+ * @name DataTable#init
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} oSettings DataTables settings object
+ * @param {object} json The JSON object request from the server - only
+ * present if client-side Ajax sourced data is used</li></ol>
+ */
+
+ /**
+ * State save event, fired when the table has changed state a new state save is required.
+ * This method allows modification of the state saving object prior to actually doing the
+ * save, including addition or other state properties (for plug-ins) or modification
+ * of a DataTables core property.
+ * @name DataTable#stateSaveParams
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} oSettings DataTables settings object
+ * @param {object} json The state information to be saved
+ */
+
+ /**
+ * State load event, fired when the table is loading state from the stored data, but
+ * prior to the settings object being modified by the saved state - allowing modification
+ * of the saved state is required or loading of state for a plug-in.
+ * @name DataTable#stateLoadParams
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} oSettings DataTables settings object
+ * @param {object} json The saved state information
+ */
+
+ /**
+ * State loaded event, fired when state has been loaded from stored data and the settings
+ * object has been modified by the loaded data.
+ * @name DataTable#stateLoaded
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} oSettings DataTables settings object
+ * @param {object} json The saved state information
+ */
+
+ /**
+ * Processing event, fired when DataTables is doing some kind of processing (be it,
+ * sort, filter or anything else). Can be used to indicate to the end user that
+ * there is something happening, or that something has finished.
+ * @name DataTable#processing
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} oSettings DataTables settings object
+ * @param {boolean} bShow Flag for if DataTables is doing processing or not
+ */
+
+ /**
+ * Ajax (XHR) event, fired whenever an Ajax request is completed from a request to
+ * made to the server for new data (note that this trigger is called in fnServerData,
+ * if you override fnServerData and which to use this event, you need to trigger it in
+ * you success function).
+ * @name DataTable#xhr
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+ * @param {object} json JSON returned from the server
+ */
+
+ /**
+ * Destroy event, fired when the DataTable is destroyed by calling fnDestroy or passing
+ * the bDestroy:true parameter in the initialisation object. This can be used to remove
+ * bound events, added DOM nodes, etc.
+ * @name DataTable#destroy
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+ */
+}));
+
+}(window, document));
+
diff --git a/admin/themes/default/uploadify.jGrowl.css b/themes/default/js/plugins/jquery.jgrowl.css
index 44216e6b1..376d224c2 100644
--- a/admin/themes/default/uploadify.jGrowl.css
+++ b/themes/default/js/plugins/jquery.jgrowl.css
@@ -1,87 +1,92 @@
-/*
-Default jGrowl style definitions for:
-
-Uploadify v1.6.2
-Copyright (C) 2009 by Ronnie Garcia
-Co-developed by Travis Nickels
-*/
+div.jGrowl {
+ z-index: 9999;
+ color: #fff;
+ font-size: 12px;
+}
-/** Uploadify Styling here Styling **/
-div.jGrowl div.success {
- background: url(images/jgrowl-check.png) no-repeat 6px 6px;
+div.jGrowl-notification.success>div,
+div.jGrowl-notification.error>div,
+div.jGrowl-notification.warning>div{
+ margin-left:45px;
+}
+div.jGrowl-notification.success {
+ background: url(jgrowl-check.png) no-repeat 5px 5px;
}
-div.jGrowl div.error {
- background: url(images/jgrowl-error.png) no-repeat 6px center;
+div.jGrowl-notification.error {
+ background: url(jgrowl-error.png) no-repeat 5px 5px;
}
-div.jGrowl div.warning {
- background: url(images/jgrowl-alert.png) no-repeat 6px 6px;
+div.jGrowl-notification.warning {
+ background: url(jgrowl-alert.png) no-repeat 5px 5px;
}
-div.jGrowl div.warning:before {
+div.jGrowl-notification.warning:before {
content:none;
}
+/** Cross Browser Styling **/
+div.center div.jGrowl-notification, div.center div.jGrowl-closer {
+ margin-left: auto;
+ margin-right: auto;
+}
+
div.jGrowl div.jGrowl-notification, div.jGrowl div.jGrowl-closer {
background-color: #000;
- color: #fff;
opacity: .85;
- filter: alpha(opacity = 85);
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=85)";
+ filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=85);
zoom: 1;
width: 300px;
- padding: 10px;
+ padding: 5px;
margin-top: 5px;
margin-bottom: 5px;
font-family: Tahoma, Arial, Helvetica, sans-serif;
- font-size: 12px;
+ font-size: 1em;
text-align: left;
display: none;
+ border-radius: 5px;
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
}
-/* original jGrowl css styling */
+div.jGrowl div.jGrowl-notification {
+ min-height: 40px;
+}
-div.center div.jGrowl-notification, div.center div.jGrowl-closer {
- margin-left: auto;
- margin-right: auto;
+div.jGrowl div.jGrowl-notification,
+div.jGrowl div.jGrowl-closer {
+ margin: 8px;
}
-div.jGrowl div.jGrowl-notification {
- min-height: 40px;
+div.jGrowl div.jGrowl-notification div.jGrowl-header {
+ font-weight: bold;
+ font-size: 1em;
+}
+
+div.jGrowl div.jGrowl-notification div.jGrowl-message {
+ font-size: 0.9em;
}
-div.jGrowl div.jGrowl-notification div.close {
+div.jGrowl div.jGrowl-notification div.jGrowl-close {
+ z-index: 99;
float: right;
font-weight: bold;
- font-size: 12px;
+ font-size: 1em;
cursor: pointer;
}
div.jGrowl div.jGrowl-closer {
- height: 15px;
padding-top: 4px;
padding-bottom: 4px;
cursor: pointer;
- font-size: 11px;
+ font-size: .9em;
font-weight: bold;
text-align: center;
}
-div.jGrowl div.jGrowl-notification div.header {
- font-weight: bold;
- font-size: 14px;
- margin-left: 47px;
-}
-div.jGrowl div.jGrowl-notification div.message {
- font-size: 12px;
- margin-left: 47px;
-}
-div.jGrowl div.jGrowl-notification p {
- font-size: 6px;
-}
-
-div.jGrowl {
- padding: 10px;
- z-index: 9999;
+/** Hide jGrowl when printing **/
+@media print {
+ div.jGrowl {
+ display: none;
+ }
}
/** Special IE6 Style Positioning **/
@@ -93,7 +98,7 @@ div.ie6.top-right {
right: auto;
bottom: auto;
left: expression( ( 0 - jGrowl.offsetWidth + ( document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth ) + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' );
- top: expression( ( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' );
+ top: expression( ( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' );
}
div.ie6.top-left {
@@ -118,33 +123,36 @@ div.ie6.center {
}
/** Normal Style Positions **/
+div.jGrowl {
+ position: absolute;
+}
+
body > div.jGrowl {
position: fixed;
}
-body > div.jGrowl.top-left {
+div.jGrowl.top-left {
left: 0px;
top: 0px;
}
-body > div.jGrowl.top-right {
+div.jGrowl.top-right {
right: 0px;
top: 0px;
}
-body > div.jGrowl.bottom-left {
+div.jGrowl.bottom-left {
left: 0px;
bottom: 0px;
}
-body > div.jGrowl.bottom-right {
+div.jGrowl.bottom-right {
right: 0px;
bottom: 0px;
}
-body > div.jGrowl.center {
+div.jGrowl.center {
top: 0px;
width: 50%;
left: 25%;
-}
-
+} \ No newline at end of file
diff --git a/themes/default/js/plugins/jquery.jgrowl_minimized.js b/themes/default/js/plugins/jquery.jgrowl_minimized.js
index 02503a0db..4aca192d7 100644
--- a/themes/default/js/plugins/jquery.jgrowl_minimized.js
+++ b/themes/default/js/plugins/jquery.jgrowl_minimized.js
@@ -1,9 +1,4 @@
-(function($){$.jGrowl=function(m,o){if($('#jGrowl').size()==0)
-$('<div id="jGrowl"></div>').addClass($.jGrowl.defaults.position).appendTo('body');$('#jGrowl').jGrowl(m,o);};$.fn.jGrowl=function(m,o){if($.isFunction(this.each)){var args=arguments;return this.each(function(){var self=this;if($(this).data('jGrowl.instance')==undefined){$(this).data('jGrowl.instance',$.extend(new $.fn.jGrowl(),{notifications:[],element:null,interval:null}));$(this).data('jGrowl.instance').startup(this);}
-if($.isFunction($(this).data('jGrowl.instance')[m])){$(this).data('jGrowl.instance')[m].apply($(this).data('jGrowl.instance'),$.makeArray(args).slice(1));}else{$(this).data('jGrowl.instance').create(m,o);}});};};$.extend($.fn.jGrowl.prototype,{defaults:{pool:0,header:'',group:'',sticky:false,position:'top-right',glue:'after',theme:'default',corners:'10px',check:250,life:3000,speed:'normal',easing:'swing',closer:true,closeTemplate:'&times;',closerTemplate:'<div>[ close all ]</div>',log:function(e,m,o){},beforeOpen:function(e,m,o){},open:function(e,m,o){},beforeClose:function(e,m,o){},close:function(e,m,o){},animateOpen:{opacity:'show'},animateClose:{opacity:'hide'}},notifications:[],element:null,interval:null,create:function(message,o){var o=$.extend({},this.defaults,o);this.notifications.push({message:message,options:o});o.log.apply(this.element,[this.element,message,o]);},render:function(notification){var self=this;var message=notification.message;var o=notification.options;var notification=$('<div class="jGrowl-notification ui-state-highlight ui-corner-all'+
-((o.group!=undefined&&o.group!='')?' '+o.group:'')+'">'+'<div class="close">'+o.closeTemplate+'</div>'+'<div class="header">'+o.header+'</div>'+'<div class="message">'+message+'</div></div>').data("jGrowl",o).addClass(o.theme).children('div.close').bind("click.jGrowl",function(){$(this).parent().trigger('jGrowl.close');}).parent();$(notification).bind("mouseover.jGrowl",function(){$('div.jGrowl-notification',self.element).data("jGrowl.pause",true);}).bind("mouseout.jGrowl",function(){$('div.jGrowl-notification',self.element).data("jGrowl.pause",false);}).bind('jGrowl.beforeOpen',function(){if(o.beforeOpen.apply(notification,[notification,message,o,self.element])!=false){$(this).trigger('jGrowl.open');}}).bind('jGrowl.open',function(){if(o.open.apply(notification,[notification,message,o,self.element])!=false){if(o.glue=='after'){$('div.jGrowl-notification:last',self.element).after(notification);}else{$('div.jGrowl-notification:first',self.element).before(notification);}
-$(this).animate(o.animateOpen,o.speed,o.easing,function(){if($.browser.msie&&(parseInt($(this).css('opacity'),10)===1||parseInt($(this).css('opacity'),10)===0))
-this.style.removeAttribute('filter');$(this).data("jGrowl").created=new Date();});}}).bind('jGrowl.beforeClose',function(){if(o.beforeClose.apply(notification,[notification,message,o,self.element])!=false)
-$(this).trigger('jGrowl.close');}).bind('jGrowl.close',function(){$(this).data('jGrowl.pause',true);$(this).animate(o.animateClose,o.speed,o.easing,function(){$(this).remove();var close=o.close.apply(notification,[notification,message,o,self.element]);if($.isFunction(close))
-close.apply(notification,[notification,message,o,self.element]);});}).trigger('jGrowl.beforeOpen');if($.fn.corner!=undefined)$(notification).corner(o.corners);if($('div.jGrowl-notification:parent',self.element).size()>1&&$('div.jGrowl-closer',self.element).size()==0&&this.defaults.closer!=false){$(this.defaults.closerTemplate).addClass('jGrowl-closer ui-state-highlight ui-corner-all').addClass(this.defaults.theme).appendTo(self.element).animate(this.defaults.animateOpen,this.defaults.speed,this.defaults.easing).bind("click.jGrowl",function(){$(this).siblings().children('div.close').trigger("click.jGrowl");if($.isFunction(self.defaults.closer)){self.defaults.closer.apply($(this).parent()[0],[$(this).parent()[0]]);}});};},update:function(){$(this.element).find('div.jGrowl-notification:parent').each(function(){if($(this).data("jGrowl")!=undefined&&$(this).data("jGrowl").created!=undefined&&($(this).data("jGrowl").created.getTime()+$(this).data("jGrowl").life)<(new Date()).getTime()&&$(this).data("jGrowl").sticky!=true&&($(this).data("jGrowl.pause")==undefined||$(this).data("jGrowl.pause")!=true)){$(this).trigger('jGrowl.beforeClose');}});if(this.notifications.length>0&&(this.defaults.pool==0||$(this.element).find('div.jGrowl-notification:parent').size()<this.defaults.pool))
-this.render(this.notifications.shift());if($(this.element).find('div.jGrowl-notification:parent').size()<2){$(this.element).find('div.jGrowl-closer').animate(this.defaults.animateClose,this.defaults.speed,this.defaults.easing,function(){$(this).remove();});}},startup:function(e){this.element=$(e).addClass('jGrowl').append('<div class="jGrowl-notification"></div>');this.interval=setInterval(function(){$(e).data('jGrowl.instance').update();},this.defaults.check);if($.browser.msie&&parseInt($.browser.version)<7&&!window["XMLHttpRequest"]){$(this.element).addClass('ie6');}},shutdown:function(){$(this.element).removeClass('jGrowl').find('div.jGrowl-notification').remove();clearInterval(this.interval);},close:function(){$(this.element).find('div.jGrowl-notification').each(function(){$(this).trigger('jGrowl.beforeClose');});}});$.jGrowl.defaults=$.fn.jGrowl.prototype.defaults;})(jQuery); \ No newline at end of file
+(function(e){var t=function(){return!1===e.support.boxModel&&e.support.objectAll&&e.support.leadingWhitespace}();e.jGrowl=function(t,i){0==e("#jGrowl").size()&&e('<div id="jGrowl"></div>').addClass(i&&i.position?i.position:e.jGrowl.defaults.position).appendTo("body"),e("#jGrowl").jGrowl(t,i)},e.fn.jGrowl=function(t,i){if(e.isFunction(this.each)){var o=arguments;return this.each(function(){void 0==e(this).data("jGrowl.instance")&&(e(this).data("jGrowl.instance",e.extend(new e.fn.jGrowl,{notifications:[],element:null,interval:null})),e(this).data("jGrowl.instance").startup(this)),e.isFunction(e(this).data("jGrowl.instance")[t])?e(this).data("jGrowl.instance")[t].apply(e(this).data("jGrowl.instance"),e.makeArray(o).slice(1)):e(this).data("jGrowl.instance").create(t,i)})}},e.extend(e.fn.jGrowl.prototype,{defaults:{pool:0,header:"",group:"",sticky:!1,position:"top-right",glue:"after",theme:"default",themeState:"highlight",corners:"10px",check:250,life:3e3,closeDuration:"normal",openDuration:"normal",easing:"swing",closer:!0,closeTemplate:"&times;",closerTemplate:"<div>[ close all ]</div>",log:function(){},beforeOpen:function(){},afterOpen:function(){},open:function(){},beforeClose:function(){},close:function(){},animateOpen:{opacity:"show"},animateClose:{opacity:"hide"}},notifications:[],element:null,interval:null,create:function(t,i){var i=e.extend({},this.defaults,i);i.speed!==void 0&&(i.openDuration=i.speed,i.closeDuration=i.speed),this.notifications.push({message:t,options:i}),i.log.apply(this.element,[this.element,t,i])},render:function(t){var i=this,o=t.message,n=t.options;n.themeState=""==n.themeState?"":"ui-state-"+n.themeState;var t=e("<div/>").addClass("jGrowl-notification "+n.themeState+" ui-corner-all"+(void 0!=n.group&&""!=n.group?" "+n.group:"")).append(e("<div/>").addClass("jGrowl-close").html(n.closeTemplate)).append(e("<div/>").addClass("jGrowl-header").html(n.header)).append(e("<div/>").addClass("jGrowl-message").html(o)).data("jGrowl",n).addClass(n.theme).children("div.jGrowl-close").bind("click.jGrowl",function(){e(this).parent().trigger("jGrowl.beforeClose")}).parent();e(t).bind("mouseover.jGrowl",function(){e("div.jGrowl-notification",i.element).data("jGrowl.pause",!0)}).bind("mouseout.jGrowl",function(){e("div.jGrowl-notification",i.element).data("jGrowl.pause",!1)}).bind("jGrowl.beforeOpen",function(){n.beforeOpen.apply(t,[t,o,n,i.element])!==!1&&e(this).trigger("jGrowl.open")}).bind("jGrowl.open",function(){n.open.apply(t,[t,o,n,i.element])!==!1&&("after"==n.glue?e("div.jGrowl-notification:last",i.element).after(t):e("div.jGrowl-notification:first",i.element).before(t),e(this).animate(n.animateOpen,n.openDuration,n.easing,function(){e.support.opacity===!1&&this.style.removeAttribute("filter"),null!==e(this).data("jGrowl")&&(e(this).data("jGrowl").created=new Date),e(this).trigger("jGrowl.afterOpen")}))}).bind("jGrowl.afterOpen",function(){n.afterOpen.apply(t,[t,o,n,i.element])}).bind("jGrowl.beforeClose",function(){n.beforeClose.apply(t,[t,o,n,i.element])!==!1&&e(this).trigger("jGrowl.close")}).bind("jGrowl.close",function(){e(this).data("jGrowl.pause",!0),e(this).animate(n.animateClose,n.closeDuration,n.easing,function(){e.isFunction(n.close)?n.close.apply(t,[t,o,n,i.element])!==!1&&e(this).remove():e(this).remove()})}).trigger("jGrowl.beforeOpen"),""!=n.corners&&void 0!=e.fn.corner&&e(t).corner(n.corners),e("div.jGrowl-notification:parent",i.element).size()>1&&0==e("div.jGrowl-closer",i.element).size()&&this.defaults.closer!==!1&&e(this.defaults.closerTemplate).addClass("jGrowl-closer "+this.defaults.themeState+" ui-corner-all").addClass(this.defaults.theme).appendTo(i.element).animate(this.defaults.animateOpen,this.defaults.speed,this.defaults.easing).bind("click.jGrowl",function(){e(this).siblings().trigger("jGrowl.beforeClose"),e.isFunction(i.defaults.closer)&&i.defaults.closer.apply(e(this).parent()[0],[e(this).parent()[0]])})},update:function(){e(this.element).find("div.jGrowl-notification:parent").each(function(){void 0!=e(this).data("jGrowl")&&void 0!==e(this).data("jGrowl").created&&e(this).data("jGrowl").created.getTime()+parseInt(e(this).data("jGrowl").life)<(new Date).getTime()&&e(this).data("jGrowl").sticky!==!0&&(void 0==e(this).data("jGrowl.pause")||e(this).data("jGrowl.pause")!==!0)&&e(this).trigger("jGrowl.beforeClose")}),this.notifications.length>0&&(0==this.defaults.pool||e(this.element).find("div.jGrowl-notification:parent").size()<this.defaults.pool)&&this.render(this.notifications.shift()),2>e(this.element).find("div.jGrowl-notification:parent").size()&&e(this.element).find("div.jGrowl-closer").animate(this.defaults.animateClose,this.defaults.speed,this.defaults.easing,function(){e(this).remove()})},startup:function(i){this.element=e(i).addClass("jGrowl").append('<div class="jGrowl-notification"></div>'),this.interval=setInterval(function(){e(i).data("jGrowl.instance").update()},parseInt(this.defaults.check)),t&&e(this.element).addClass("ie6")},shutdown:function(){e(this.element).removeClass("jGrowl").find("div.jGrowl-notification").trigger("jGrowl.close").parent().empty()},close:function(){e(this.element).find("div.jGrowl-notification").each(function(){e(this).trigger("jGrowl.beforeClose")})}}),e.jGrowl.defaults=e.fn.jGrowl.prototype.defaults})(jQuery);
+/*
+//@ sourceMappingURL=jquery.jgrowl.map
+*/ \ No newline at end of file
diff --git a/themes/default/js/plugins/jquery.tokeninput.css b/themes/default/js/plugins/jquery.tokeninput.css
new file mode 100644
index 000000000..6eb101b2a
--- /dev/null
+++ b/themes/default/js/plugins/jquery.tokeninput.css
@@ -0,0 +1,16 @@
+/* TokenInput (with Facebook style) */
+ul.token-input-list {overflow: hidden; height: auto !important; height: 1%;width: 400px;border: 1px solid #8496ba;cursor: text;font-size: 12px;font-family: Verdana;min-height: 1px;z-index: 999;margin: 0;padding: 0;background-color: #fff;list-style-type: none;clear: left;}
+ul.token-input-list li input {border: 0;width: 100px;padding: 3px 8px;background-color: white;margin: 2px 0;-webkit-appearance: caret;color: black;}
+li.token-input-token {overflow: hidden; height: auto !important; height: 15px;margin: 3px;padding: 1px 3px;background-color: #eff2f7;color: #000;cursor: default;border: 1px solid #ccd5e4;font-size: 11px;border-radius: 5px;-moz-border-radius: 5px;-webkit-border-radius: 5px;float: left;white-space: nowrap;}
+li.token-input-token p {display: inline;padding: 0;margin: 0;}
+li.token-input-token span {color: #a6b3cf;margin-left: 5px;font-weight: bold;cursor: pointer;}
+li.token-input-selected-token {background-color: #5670a6;border: 1px solid #3b5998;color: #fff;}
+li.token-input-input-token {float: left;margin: 0;padding: 0;list-style-type: none;width:10px;}
+div.token-input-dropdown {position: absolute;width: 400px;background-color: #fff;overflow: hidden;border-left: 1px solid #ccc;border-right: 1px solid #ccc;border-bottom: 1px solid #ccc;cursor: default;font-size: 11px;font-family: Verdana;z-index: 1;}
+div.token-input-dropdown p {margin: 0;padding: 5px;font-weight: bold;color: #777;}
+div.token-input-dropdown ul {margin: 0;padding: 0;}
+div.token-input-dropdown ul li {background-color: #fff;padding: 3px;margin: 0;list-style-type: none;}
+div.token-input-dropdown ul li.token-input-dropdown-item {background-color: #fff;}
+div.token-input-dropdown ul li.token-input-dropdown-item2 {background-color: #fff;}
+div.token-input-dropdown ul li em {font-weight: bold;font-style: normal;}
+div.token-input-dropdown ul li.token-input-selected-dropdown-item {background-color: #3b5998;color: #fff;} \ No newline at end of file
diff --git a/themes/default/js/plugins/jquery.tokeninput.js b/themes/default/js/plugins/jquery.tokeninput.js
index 0c8662b3b..7348639ae 100644
--- a/themes/default/js/plugins/jquery.tokeninput.js
+++ b/themes/default/js/plugins/jquery.tokeninput.js
@@ -1,50 +1,85 @@
-/**
- DON'T MAKE AUTOMATIC UPGRADE
- This is a merged version of :
- + https://github.com/gr2m/jquery-tokeninput/
- + https://github.com/mistic100/jquery-tokeninput/
-*/
-
/*
* jQuery Plugin: Tokenizing Autocomplete Text Entry
- * Version 1.4.2
+ * Version 1.6.1
*
* Copyright (c) 2009 James Smith (http://loopj.com)
* Licensed jointly under the GPL and MIT licenses,
* choose which one suits your project best!
*
+ * https://github.com/mistic100/jquery-tokeninput
*/
(function ($) {
// Default settings
var DEFAULT_SETTINGS = {
- hintText: "Type in a search term",
- noResultsText: "No results",
- searchingText: "Searching...",
- newText: "(new)",
- deleteText: "&times;",
+ // Search settings
+ method: "GET",
+ queryParam: "q",
searchDelay: 300,
minChars: 1,
- tokenLimit: null,
+ propertyToSearch: "name",
jsonContainer: null,
- method: "GET",
contentType: "json",
- queryParam: "q",
- tokenDelimiter: ",",
- preventDuplicates: false,
+
+ // Prepopulation settings
prePopulate: null,
processPrePopulate: false,
+
+ // Display settings
+ hintText: "Type in a search term",
+ noResultsText: "No results",
+ searchingText: "Searching...",
+ deleteText: "&times;",
+ newText: " (new)",
animateDropdown: true,
+ placeholder: null,
+ theme: null,
+ zindex: 999,
+ resultsLimit: null,
+
+ enableHTML: false,
+
+ resultsFormatter: function(item) {
+ var string = item[this.propertyToSearch];
+ return "<li>" + (this.enableHTML ? string : _escapeHTML(string)) + "</li>";
+ },
+
+ tokenFormatter: function(item) {
+ var string = item[this.propertyToSearch];
+ return "<li><p>" + (this.enableHTML ? string : _escapeHTML(string)) + "</p></li>";
+ },
+
+ // Tokenization settings
+ tokenLimit: null,
+ tokenDelimiter: ",",
+ preventDuplicates: false,
+ tokenValue: "id",
+
+ // Behavioral settings
+ allowFreeTagging: false,
+ freeTaggingHint: true,
+ allowTabOut: false,
+
+ // Callbacks
onResult: null,
+ onCachedResult: null,
onAdd: null,
+ onFreeTaggingAdd: null,
onDelete: null,
- allowCreation: false
+ onReady: null,
+
+ // Other settings
+ idPrefix: "token-input-",
+
+ // Keep track if the input is currently in disabled mode
+ disabled: false
};
// Default classes to use when theming
var DEFAULT_CLASSES = {
tokenList: "token-input-list",
token: "token-input-token",
+ tokenReadOnly: "token-input-token-readonly",
tokenDelete: "token-input-delete-token",
selectedToken: "token-input-selected-token",
highlightedToken: "token-input-highlighted-token",
@@ -52,7 +87,9 @@ var DEFAULT_CLASSES = {
dropdownItem: "token-input-dropdown-item",
dropdownItem2: "token-input-dropdown-item2",
selectedDropdownItem: "token-input-selected-dropdown-item",
- inputToken: "token-input-input-token"
+ inputToken: "token-input-input-token",
+ focused: "token-input-focused",
+ disabled: "token-input-disabled"
};
// Input box position "enum"
@@ -81,16 +118,82 @@ var KEY = {
COMMA: 188
};
+var HTML_ESCAPES = {
+ '&': '&amp;',
+ '<': '&lt;',
+ '>': '&gt;',
+ '"': '&quot;',
+ "'": '&#x27;',
+ '/': '&#x2F;'
+};
-// Expose the .tokenInput function to jQuery as a plugin
-$.fn.tokenInput = function (url_or_data, options) {
- var settings = $.extend({}, DEFAULT_SETTINGS, options || {});
+var HTML_ESCAPE_CHARS = /[&<>"'\/]/g;
+
+function coerceToString(val) {
+ return String((val === null || val === undefined) ? '' : val);
+}
+
+function _escapeHTML(text) {
+ return coerceToString(text).replace(HTML_ESCAPE_CHARS, function(match) {
+ return HTML_ESCAPES[match];
+ });
+}
+
+// Additional public (exposed) methods
+var methods = {
+ init: function(url_or_data_or_function, options) {
+ var settings = $.extend({}, DEFAULT_SETTINGS, options || {});
- return this.each(function () {
- new $.TokenList(this, url_or_data, settings);
- });
+ return this.each(function () {
+ $(this).data("settings", settings);
+ $(this).data("tokenInputObject", new $.TokenList(this, url_or_data_or_function, settings));
+ });
+ },
+ clear: function() {
+ this.data("tokenInputObject").clear();
+ return this;
+ },
+ add: function(item) {
+ this.data("tokenInputObject").add(item);
+ return this;
+ },
+ remove: function(item) {
+ this.data("tokenInputObject").remove(item);
+ return this;
+ },
+ get: function() {
+ return this.data("tokenInputObject").getTokens();
+ },
+ toggleDisabled: function(disable) {
+ this.data("tokenInputObject").toggleDisabled(disable);
+ return this;
+ },
+ setOptions: function(options){
+ $(this).data("settings", $.extend({}, $(this).data("settings"), options || {}));
+ return this;
+ },
+ destroy: function () {
+ if(this.data("tokenInputObject")){
+ this.data("tokenInputObject").clear();
+ var tmpInput = this;
+ var closest = this.parent();
+ closest.empty();
+ tmpInput.show();
+ closest.append(tmpInput);
+ return tmpInput;
+ }
+ }
};
+// Expose the .tokenInput function to jQuery as a plugin
+$.fn.tokenInput = function (method) {
+ // Method calling and initialization logic
+ if(methods[method]) {
+ return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
+ } else {
+ return methods.init.apply(this, arguments);
+ }
+};
// TokenList class for each input
$.TokenList = function (input, url_or_data, settings) {
@@ -99,35 +202,38 @@ $.TokenList = function (input, url_or_data, settings) {
//
// Configure the data source
- if(typeof(url_or_data) === "string") {
+ if($.type(url_or_data) === "string" || $.type(url_or_data) === "function") {
// Set the url to query against
- settings.url = url_or_data;
+ $(input).data("settings").url = url_or_data;
+
+ // If the URL is a function, evaluate it here to do our initalization work
+ var url = computeURL();
// Make a smart guess about cross-domain if it wasn't explicitly specified
- if(settings.crossDomain === undefined) {
- if(settings.url.indexOf("://") === -1) {
- settings.crossDomain = false;
+ if($(input).data("settings").crossDomain === undefined && typeof url === "string") {
+ if(url.indexOf("://") === -1) {
+ $(input).data("settings").crossDomain = false;
} else {
- settings.crossDomain = (location.href.split(/\/+/g)[1] !== settings.url.split(/\/+/g)[1]);
+ $(input).data("settings").crossDomain = (location.href.split(/\/+/g)[1] !== url.split(/\/+/g)[1]);
}
}
} else if(typeof(url_or_data) === "object") {
// Set the local data to search through
- settings.local_data = url_or_data;
+ $(input).data("settings").local_data = url_or_data;
}
// Build class names
- if(settings.classes) {
+ if($(input).data("settings").classes) {
// Use custom class names
- settings.classes = $.extend({}, DEFAULT_CLASSES, settings.classes);
- } else if(settings.theme) {
+ $(input).data("settings").classes = $.extend({}, DEFAULT_CLASSES, $(input).data("settings").classes);
+ } else if($(input).data("settings").theme) {
// Use theme-suffixed default class names
- settings.classes = {};
+ $(input).data("settings").classes = {};
$.each(DEFAULT_CLASSES, function(key, value) {
- settings.classes[key] = value + "-" + settings.theme;
+ $(input).data("settings").classes[key] = value + "-" + $(input).data("settings").theme;
});
} else {
- settings.classes = DEFAULT_CLASSES;
+ $(input).data("settings").classes = DEFAULT_CLASSES;
}
@@ -145,17 +251,29 @@ $.TokenList = function (input, url_or_data, settings) {
var input_val;
// Create a new text input an attach keyup events
- var input_box = $("<input type=\"text\" autocomplete=\"off\">")
+ var input_box = $("<input type=\"text\" autocomplete=\"off\" autocapitalize=\"off\">")
.css({
outline: "none"
})
+ .attr("id", $(input).data("settings").idPrefix + input.id)
.focus(function () {
- if (settings.tokenLimit === null || settings.tokenLimit !== token_count) {
+ if ($(input).data("settings").disabled) {
+ return false;
+ } else
+ if ($(input).data("settings").tokenLimit === null || $(input).data("settings").tokenLimit !== token_count) {
show_dropdown_hint();
}
+ token_list.addClass($(input).data("settings").classes.focused);
})
.blur(function () {
hide_dropdown();
+
+ if ($(input).data("settings").allowFreeTagging) {
+ add_freetagging_tokens();
+ }
+
+ $(this).val("");
+ token_list.removeClass($(input).data("settings").classes.focused);
})
.bind("keyup keydown blur update", resize_input)
.keydown(function (event) {
@@ -197,8 +315,8 @@ $.TokenList = function (input, url_or_data, settings) {
if(dropdown_item.length) {
select_dropdown_item(dropdown_item);
}
- return false;
}
+ return false;
break;
case KEY.BACKSPACE:
@@ -207,6 +325,7 @@ $.TokenList = function (input, url_or_data, settings) {
if(!$(this).val().length) {
if(selected_token) {
delete_token($(selected_token));
+ hidden_input.change();
} else if(previous_token.length) {
select_token($(previous_token.get(0)));
}
@@ -225,10 +344,25 @@ $.TokenList = function (input, url_or_data, settings) {
case KEY.NUMPAD_ENTER:
case KEY.COMMA:
if(selected_dropdown_item) {
- add_token($(selected_dropdown_item));
- return false;
+ add_token($(selected_dropdown_item).data("tokeninput"));
+ hidden_input.change();
+ } else {
+ if ($(input).data("settings").allowFreeTagging) {
+ if($(input).data("settings").allowTabOut && $(this).val() === "") {
+ return true;
+ } else {
+ add_freetagging_tokens();
+ }
+ } else {
+ $(this).val("");
+ if($(input).data("settings").allowTabOut) {
+ return true;
+ }
+ }
+ event.stopPropagation();
+ event.preventDefault();
}
- break;
+ return false;
case KEY.ESCAPE:
hide_dropdown();
@@ -243,29 +377,52 @@ $.TokenList = function (input, url_or_data, settings) {
}
});
+ // Keep reference for placeholder
+ if (settings.placeholder)
+ input_box.attr("placeholder", settings.placeholder)
+
if ($(input).get(0).tagName == 'SELECT') {
- // Create a new input to store selected tokens, original will be delete later
- var hidden_input = $("<input type=\"text\" name=\"" + $(input).attr('name') + "\" autocomplete=\"off\">")
- .hide()
- .val("")
- .focus(function () {
- input_box.focus();
- })
- .blur(function () {
- input_box.blur();
- })
- .insertBefore(input);
+ // Create a new input to store selected tokens, original will be removed later
+ var hidden_input = $("<input type=\"text\" name=\"" + $(input).attr('name') + "\" autocomplete=\"off\">")
+ .hide()
+ .val("")
+ .focus(function () {
+ focus_with_timeout(input_box);
+ })
+ .blur(function () {
+ input_box.blur();
+ return hidden_input;
+ })
+ .insertBefore(input);
+
+ // get prepopulate options and store them in hidden_input
+ var select_data = [];
+ $(input).children('option').each(function () {
+ var item = {};
+ item[$(input).data("settings").tokenValue] = $(this).attr('value');
+ item[$(input).data("settings").propertyToSearch] = $(this).text();
+ select_data[ select_data.length ] = item;
+ });
+ hidden_input.data("pre", select_data);
+
+ // remove the SELECT object
+ hidden_input.data("settings", $(input).data("settings"));
+ $(input).remove();
+ input = hidden_input[0];
+
} else {
- // Keep a reference to the original input box
- var hidden_input = $(input)
- .hide()
- .val("")
- .focus(function () {
- input_box.focus();
- })
- .blur(function () {
- input_box.blur();
- });
+ // Keep a reference to the original input box
+ var hidden_input = $(input)
+ .hide()
+ .val("")
+ .focus(function () {
+ focus_with_timeout(input_box);
+ })
+ .blur(function () {
+ input_box.blur();
+ //return the object to this can be referenced in the callback functions.
+ return hidden_input;
+ });
}
// Keep a reference to the selected token and dropdown item
@@ -275,7 +432,7 @@ $.TokenList = function (input, url_or_data, settings) {
// The list to store the token items in
var token_list = $("<ul />")
- .addClass(settings.classes.tokenList)
+ .addClass($(input).data("settings").classes.tokenList)
.click(function (event) {
var li = $(event.target).closest("li");
if(li && li.get(0) && $.data(li.get(0), "tokeninput")) {
@@ -287,32 +444,32 @@ $.TokenList = function (input, url_or_data, settings) {
}
// Focus input box
- input_box.focus();
+ focus_with_timeout(input_box);
}
})
.mouseover(function (event) {
var li = $(event.target).closest("li");
if(li && selected_token !== this) {
- li.addClass(settings.classes.highlightedToken);
+ li.addClass($(input).data("settings").classes.highlightedToken);
}
})
.mouseout(function (event) {
var li = $(event.target).closest("li");
if(li && selected_token !== this) {
- li.removeClass(settings.classes.highlightedToken);
+ li.removeClass($(input).data("settings").classes.highlightedToken);
}
})
.insertBefore(hidden_input);
// The token holding the input box
var input_token = $("<li />")
- .addClass(settings.classes.inputToken)
+ .addClass($(input).data("settings").classes.inputToken)
.appendTo(token_list)
.append(input_box);
// The list to store the dropdown items in
var dropdown = $("<div>")
- .addClass(settings.classes.dropdown)
+ .addClass($(input).data("settings").classes.dropdown)
.appendTo("body")
.hide();
@@ -333,36 +490,116 @@ $.TokenList = function (input, url_or_data, settings) {
// Pre-populate list if items exist
hidden_input.val("");
- var li_data = settings.prePopulate || hidden_input.data("pre");
- if(settings.processPrePopulate && $.isFunction(settings.onResult)) {
- li_data = settings.onResult.call(hidden_input, li_data);
- }
+ var li_data = $(input).data("settings").prePopulate || hidden_input.data("pre");
+ if($(input).data("settings").processPrePopulate && $.isFunction($(input).data("settings").onResult)) {
+ li_data = $(input).data("settings").onResult.call(hidden_input, li_data);
+ }
if(li_data && li_data.length) {
$.each(li_data, function (index, value) {
- insert_token(value.id, value.name);
+ insert_token(value);
+ checkTokenLimit();
+ input_box.attr("placeholder", null)
});
}
-
- // Pre-populate from SELECT options
- if ($(input).get(0).tagName == 'SELECT') {
- $(input).children('option').each(function () {
- insert_token($(this).attr('value'), $(this).text());
- });
+
+ // Check if widget should initialize as disabled
+ if ($(input).data("settings").disabled) {
+ toggleDisabled(true);
}
+ // Initialization is done
+ if($.isFunction($(input).data("settings").onReady)) {
+ $(input).data("settings").onReady.call();
+ }
+
+ //
+ // Public functions
+ //
+
+ this.clear = function() {
+ token_list.children("li").each(function() {
+ if ($(this).children("input").length === 0) {
+ delete_token($(this));
+ }
+ });
+ };
+
+ this.add = function(item) {
+ add_token(item);
+ };
+
+ this.remove = function(item) {
+ token_list.children("li").each(function() {
+ if ($(this).children("input").length === 0) {
+ var currToken = $(this).data("tokeninput");
+ var match = true;
+ for (var prop in item) {
+ if (item[prop] !== currToken[prop]) {
+ match = false;
+ break;
+ }
+ }
+ if (match) {
+ delete_token($(this));
+ }
+ }
+ });
+ };
+
+ this.getTokens = function() {
+ return saved_tokens;
+ };
+
+ this.toggleDisabled = function(disable) {
+ toggleDisabled(disable);
+ };
+ // Resize input to maximum width so the placeholder can be seen
+ resize_input();
//
// Private functions
//
+ function escapeHTML(text) {
+ return $(input).data("settings").enableHTML ? text : _escapeHTML(text);
+ }
+
+ // Toggles the widget between enabled and disabled state, or according
+ // to the [disable] parameter.
+ function toggleDisabled(disable) {
+ if (typeof disable === 'boolean') {
+ $(input).data("settings").disabled = disable
+ } else {
+ $(input).data("settings").disabled = !$(input).data("settings").disabled;
+ }
+ input_box.attr('disabled', $(input).data("settings").disabled);
+ token_list.toggleClass($(input).data("settings").classes.disabled, $(input).data("settings").disabled);
+ // if there is any token selected we deselect it
+ if(selected_token) {
+ deselect_token($(selected_token), POSITION.END);
+ }
+ hidden_input.attr('disabled', $(input).data("settings").disabled);
+ }
+
+ function checkTokenLimit() {
+ if($(input).data("settings").tokenLimit !== null && token_count >= $(input).data("settings").tokenLimit) {
+ input_box.hide();
+ hide_dropdown();
+ return;
+ }
+ }
+
function resize_input() {
if(input_val === (input_val = input_box.val())) {return;}
+ // Get width left on the current line
+ var width_left = token_list.width() - input_box.offset().left - token_list.offset().left;
// Enter new content into resizer and resize input accordingly
- var escaped = input_val.replace(/&/g, '&amp;').replace(/\s/g,' ').replace(/</g, '&lt;').replace(/>/g, '&gt;');
- input_resizer.html(escaped);
- input_box.width(input_resizer.width() + 30);
+ input_resizer.html(_escapeHTML(input_val));
+ // Get maximum width, minimum the size of input and maximum the widget's width
+ input_box.width(Math.min(token_list.width(),
+ Math.max(width_left, input_resizer.width() + 30)));
}
function is_printable_character(keycode) {
@@ -372,52 +609,79 @@ $.TokenList = function (input, url_or_data, settings) {
(keycode >= 219 && keycode <= 222)); // ( \ ) '
}
+ function add_freetagging_tokens() {
+ var value = $.trim(input_box.val());
+ var tokens = value.split($(input).data("settings").tokenDelimiter);
+ $.each(tokens, function(i, token) {
+ if (!token) {
+ return;
+ }
+
+ if ($.isFunction($(input).data("settings").onFreeTaggingAdd)) {
+ token = $(input).data("settings").onFreeTaggingAdd.call(hidden_input, token);
+ }
+ var object = {};
+ object[$(input).data("settings").tokenValue] = object[$(input).data("settings").propertyToSearch] = token;
+ add_token(object);
+ });
+ }
+
// Inner function to a token to the list
- function insert_token(id, value) {
- var this_token = $("<li><p>"+ value +"</p></li>")
- .addClass(settings.classes.token)
- .insertBefore(input_token);
+ function insert_token(item) {
+ var $this_token = $($(input).data("settings").tokenFormatter(item));
+ var readonly = item.readonly === true ? true : false;
+
+ if(readonly) $this_token.addClass($(input).data("settings").classes.tokenReadOnly);
+
+ $this_token.addClass($(input).data("settings").classes.token).insertBefore(input_token);
// The 'delete token' button
- $("<span>" + settings.deleteText + "</span>")
- .addClass(settings.classes.tokenDelete)
- .appendTo(this_token)
- .click(function () {
- delete_token($(this).parent());
- return false;
- });
+ if(!readonly) {
+ $("<span>" + $(input).data("settings").deleteText + "</span>")
+ .addClass($(input).data("settings").classes.tokenDelete)
+ .appendTo($this_token)
+ .click(function () {
+ if (!$(input).data("settings").disabled) {
+ delete_token($(this).parent());
+ hidden_input.change();
+ return false;
+ }
+ });
+ }
// Store data on the token
- var token_data = {"id": id, "name": value};
- $.data(this_token.get(0), "tokeninput", token_data);
+ var token_data = item;
+ $.data($this_token.get(0), "tokeninput", item);
// Save this token for duplicate checking
saved_tokens = saved_tokens.slice(0,selected_token_index).concat([token_data]).concat(saved_tokens.slice(selected_token_index));
selected_token_index++;
// Update the hidden input
- var token_ids = $.map(saved_tokens, function (el) {
- return el.id;
- });
- hidden_input.val(token_ids.join(settings.tokenDelimiter));
+ update_hidden_input(saved_tokens, hidden_input);
token_count += 1;
- return this_token;
+ // Check the token limit
+ if($(input).data("settings").tokenLimit !== null && token_count >= $(input).data("settings").tokenLimit) {
+ input_box.hide();
+ hide_dropdown();
+ }
+
+ return $this_token;
}
// Add a token to the token list based on user input
function add_token (item) {
- var li_data = $.data(item.get(0), "tokeninput");
- var callback = settings.onAdd;
+ var callback = $(input).data("settings").onAdd;
// See if the token already exists and select it if we don't want duplicates
- if(token_count > 0 && settings.preventDuplicates) {
+ if(token_count > 0 && $(input).data("settings").preventDuplicates) {
var found_existing_token = null;
token_list.children().each(function () {
var existing_token = $(this);
var existing_data = $.data(existing_token.get(0), "tokeninput");
- if(existing_data && existing_data.id === li_data.id) {
+ if(existing_data && existing_data[settings.tokenValue] === item[settings.tokenValue]) {
found_existing_token = existing_token;
return false;
}
@@ -426,21 +690,20 @@ $.TokenList = function (input, url_or_data, settings) {
if(found_existing_token) {
select_token(found_existing_token);
input_token.insertAfter(found_existing_token);
- input_box.focus();
+ focus_with_timeout(input_box);
return;
}
}
- // Insert the new tokens
- insert_token(li_data.id, li_data.name);
+ // Squeeze input_box so we force no unnecessary line break
+ input_box.width(0);
- // Check the token limit
- if(settings.tokenLimit !== null && token_count >= settings.tokenLimit) {
- input_box.hide();
- hide_dropdown();
- return;
- } else {
- input_box.focus();
+ // Insert the new tokens
+ if($(input).data("settings").tokenLimit == null || token_count < $(input).data("settings").tokenLimit) {
+ insert_token(item);
+ // Remove the placeholder so it's not seen after you've added a token
+ input_box.attr("placeholder", null)
+ checkTokenLimit();
}
// Clear input box
@@ -451,25 +714,27 @@ $.TokenList = function (input, url_or_data, settings) {
// Execute the onAdd callback if defined
if($.isFunction(callback)) {
- callback.call(hidden_input,li_data);
+ callback.call(hidden_input,item);
}
}
// Select a token in the token list
function select_token (token) {
- token.addClass(settings.classes.selectedToken);
- selected_token = token.get(0);
+ if (!$(input).data("settings").disabled) {
+ token.addClass($(input).data("settings").classes.selectedToken);
+ selected_token = token.get(0);
- // Hide input box
- input_box.val("");
+ // Hide input box
+ input_box.val("");
- // Hide dropdown if it is visible (eg if we clicked to select token)
- hide_dropdown();
+ // Hide dropdown if it is visible (eg if we clicked to select token)
+ hide_dropdown();
+ }
}
// Deselect a token in the token list
function deselect_token (token, position) {
- token.removeClass(settings.classes.selectedToken);
+ token.removeClass($(input).data("settings").classes.selectedToken);
selected_token = null;
if(position === POSITION.BEFORE) {
@@ -484,7 +749,7 @@ $.TokenList = function (input, url_or_data, settings) {
}
// Show the input box and give it focus again
- input_box.focus();
+ focus_with_timeout(input_box);
}
// Toggle selection of a token in the token list
@@ -506,7 +771,7 @@ $.TokenList = function (input, url_or_data, settings) {
function delete_token (token) {
// Remove the id from the saved list
var token_data = $.data(token.get(0), "tokeninput");
- var callback = settings.onDelete;
+ var callback = $(input).data("settings").onDelete;
var index = token.prevAll().length;
if(index > selected_token_index) index--;
@@ -516,25 +781,25 @@ $.TokenList = function (input, url_or_data, settings) {
selected_token = null;
// Show the input box and give it focus again
- input_box.focus();
+ focus_with_timeout(input_box);
// Remove this token from the saved list
saved_tokens = saved_tokens.slice(0,index).concat(saved_tokens.slice(index+1));
+ if (saved_tokens.length == 0) {
+ input_box.attr("placeholder", settings.placeholder)
+ }
if(index < selected_token_index) selected_token_index--;
// Update the hidden input
- var token_ids = $.map(saved_tokens, function (el) {
- return el.id;
- });
- hidden_input.val(token_ids.join(settings.tokenDelimiter));
+ update_hidden_input(saved_tokens, hidden_input);
token_count -= 1;
- if(settings.tokenLimit !== null) {
+ if($(input).data("settings").tokenLimit !== null) {
input_box
.show()
- .val("")
- .focus();
+ .val("");
+ focus_with_timeout(input_box);
}
// Execute the onDelete callback if defined
@@ -543,6 +808,18 @@ $.TokenList = function (input, url_or_data, settings) {
}
}
+ // Update the hidden input box value
+ function update_hidden_input(saved_tokens, hidden_input) {
+ var token_values = $.map(saved_tokens, function (el) {
+ if(typeof $(input).data("settings").tokenValue == 'function')
+ return $(input).data("settings").tokenValue.call(this, el);
+
+ return el[$(input).data("settings").tokenValue];
+ });
+ hidden_input.val(token_values.join($(input).data("settings").tokenDelimiter));
+
+ }
+
// Hide and clear the results dropdown
function hide_dropdown () {
dropdown.hide().empty();
@@ -553,30 +830,47 @@ $.TokenList = function (input, url_or_data, settings) {
dropdown
.css({
position: "absolute",
- top: $(token_list).offset().top + $(token_list).outerHeight(),
- left: $(token_list).offset().left,
- zindex: 999
+ top: token_list.offset().top + token_list.outerHeight(),
+ left: token_list.offset().left,
+ width: token_list.width(),
+ 'z-index': $(input).data("settings").zindex
})
.show();
}
function show_dropdown_searching () {
- if(settings.searchingText) {
- dropdown.html("<p>"+settings.searchingText+"</p>");
+ if($(input).data("settings").searchingText) {
+ dropdown.html("<p>" + escapeHTML($(input).data("settings").searchingText) + "</p>");
show_dropdown();
}
}
function show_dropdown_hint () {
- if(settings.hintText) {
- dropdown.html("<p>"+settings.hintText+"</p>");
+ if($(input).data("settings").hintText) {
+ dropdown.html("<p>" + escapeHTML($(input).data("settings").hintText) + "</p>");
show_dropdown();
}
}
+ var regexp_special_chars = new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\-]', 'g');
+ function regexp_escape(term) {
+ return term.replace(regexp_special_chars, '\\$&');
+ }
+
// Highlight the query part of the search term
function highlight_term(value, term) {
- return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<b>$1</b>");
+ return value.replace(
+ new RegExp(
+ "(?![^&;]+;)(?!<[^<>]*)(" + regexp_escape(term) + ")(?![^<>]*>)(?![^&;]+;)",
+ "gi"
+ ), function(match, p1) {
+ return "<b>" + escapeHTML(p1) + "</b>";
+ }
+ );
+ }
+
+ function find_value_and_highlight_term(template, value, term) {
+ return template.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + regexp_escape(value) + ")(?![^<>]*>)(?![^&;]+;)", "g"), highlight_term(value, term));
}
// Populate the results dropdown with some results
@@ -589,38 +883,46 @@ $.TokenList = function (input, url_or_data, settings) {
select_dropdown_item($(event.target).closest("li"));
})
.mousedown(function (event) {
- add_token($(event.target).closest("li"));
+ add_token($(event.target).closest("li").data("tokeninput"));
+ hidden_input.change();
return false;
})
.hide();
+ if ($(input).data("settings").resultsLimit && results.length > $(input).data("settings").resultsLimit) {
+ results = results.slice(0, $(input).data("settings").resultsLimit);
+ }
+
$.each(results, function(index, value) {
- var this_li = $("<li>" + highlight_term(value.name, query) + "</li>")
- .appendTo(dropdown_ul);
+ var this_li = $(input).data("settings").resultsFormatter(value);
+
+ this_li = find_value_and_highlight_term(this_li ,value[$(input).data("settings").propertyToSearch], query);
+
+ this_li = $(this_li).appendTo(dropdown_ul);
if(index % 2) {
- this_li.addClass(settings.classes.dropdownItem);
+ this_li.addClass($(input).data("settings").classes.dropdownItem);
} else {
- this_li.addClass(settings.classes.dropdownItem2);
+ this_li.addClass($(input).data("settings").classes.dropdownItem2);
}
if(index === 0) {
select_dropdown_item(this_li);
}
- $.data(this_li.get(0), "tokeninput", {"id": value.id, "name": value.name});
+ $.data(this_li.get(0), "tokeninput", value);
});
show_dropdown();
- if(settings.animateDropdown) {
+ if($(input).data("settings").animateDropdown) {
dropdown_ul.slideDown("fast");
} else {
dropdown_ul.show();
}
} else {
- if(settings.noResultsText) {
- dropdown.html("<p>"+settings.noResultsText+"</p>");
+ if($(input).data("settings").noResultsText) {
+ dropdown.html("<p>" + escapeHTML($(input).data("settings").noResultsText) + "</p>");
show_dropdown();
}
}
@@ -633,34 +935,34 @@ $.TokenList = function (input, url_or_data, settings) {
deselect_dropdown_item($(selected_dropdown_item));
}
- item.addClass(settings.classes.selectedDropdownItem);
+ item.addClass($(input).data("settings").classes.selectedDropdownItem);
selected_dropdown_item = item.get(0);
}
}
// Remove highlighting from an item in the results dropdown
function deselect_dropdown_item (item) {
- item.removeClass(settings.classes.selectedDropdownItem);
+ item.removeClass($(input).data("settings").classes.selectedDropdownItem);
selected_dropdown_item = null;
}
// Do a search and show the "searching" dropdown if the input is longer
- // than settings.minChars
+ // than $(input).data("settings").minChars
function do_search() {
- var query = input_box.val().toLowerCase();
+ var query = input_box.val();
if(query && query.length) {
if(selected_token) {
deselect_token($(selected_token), POSITION.AFTER);
}
- if(query.length >= settings.minChars) {
+ if(query.length >= $(input).data("settings").minChars) {
show_dropdown_searching();
clearTimeout(timeout);
timeout = setTimeout(function(){
run_search(query);
- }, settings.searchDelay);
+ }, $(input).data("settings").searchDelay);
} else {
hide_dropdown();
}
@@ -669,17 +971,22 @@ $.TokenList = function (input, url_or_data, settings) {
// Do the actual search
function run_search(query) {
- var cached_results = cache.get(query);
+ var cache_key = query + computeURL();
+ var cached_results = cache.get(cache_key);
if(cached_results) {
+ if ($.isFunction($(input).data("settings").onCachedResult)) {
+ cached_results = $(input).data("settings").onCachedResult.call(hidden_input, cached_results);
+ }
populate_dropdown(query, cached_results);
} else {
// Are we doing an ajax search or local data search?
- if(settings.url) {
+ if($(input).data("settings").url) {
+ var url = computeURL();
// Extract exisiting get params
var ajax_params = {};
ajax_params.data = {};
- if(settings.url.indexOf("?") > -1) {
- var parts = settings.url.split("?");
+ if(url.indexOf("?") > -1) {
+ var parts = url.split("?");
ajax_params.url = parts[0];
var param_array = parts[1].split("&");
@@ -688,60 +995,73 @@ $.TokenList = function (input, url_or_data, settings) {
ajax_params.data[kv[0]] = kv[1];
});
} else {
- ajax_params.url = settings.url;
+ ajax_params.url = url;
}
// Prepare the request
- ajax_params.data[settings.queryParam] = query;
- ajax_params.type = settings.method;
- ajax_params.dataType = settings.contentType;
- if(settings.crossDomain) {
+ ajax_params.data[$(input).data("settings").queryParam] = query;
+ ajax_params.type = $(input).data("settings").method;
+ ajax_params.dataType = $(input).data("settings").contentType;
+ if($(input).data("settings").crossDomain) {
ajax_params.dataType = "jsonp";
}
// Attach the success callback
ajax_params.success = function(results) {
- if($.isFunction(settings.onResult)) {
- results = settings.onResult.call(hidden_input, results);
+ cache.add(cache_key, $(input).data("settings").jsonContainer ? results[$(input).data("settings").jsonContainer] : results);
+ if($.isFunction($(input).data("settings").onResult)) {
+ results = $(input).data("settings").onResult.call(hidden_input, results);
}
- if(settings.allowCreation) {
- results.push({name: input_box.val() + settings.newText, id: input_box.val()});
+ if($(input).data("settings").allowFreeTagging && $(input).data("settings").freeTaggingHint) {
+ results.push({name: input_box.val() + $(input).data("settings").newText, id: input_box.val()});
}
- cache.add(query, settings.jsonContainer ? results[settings.jsonContainer] : results);
// only populate the dropdown if the results are associated with the active search query
- if(input_box.val().toLowerCase() === query) {
- populate_dropdown(query, settings.jsonContainer ? results[settings.jsonContainer] : results);
+ if(input_box.val() === query) {
+ populate_dropdown(query, $(input).data("settings").jsonContainer ? results[$(input).data("settings").jsonContainer] : results);
}
};
// Make the request
$.ajax(ajax_params);
- } else if(settings.local_data) {
+ } else if($(input).data("settings").local_data) {
// Do the search through local data
- var results = $.grep(settings.local_data, function (row) {
- return row.name.toLowerCase().indexOf(query.toLowerCase()) > -1;
+ var results = $.grep($(input).data("settings").local_data, function (row) {
+ return row[$(input).data("settings").propertyToSearch].toLowerCase().indexOf(query.toLowerCase()) > -1;
});
-
- if($.isFunction(settings.onResult)) {
- results = settings.onResult.call(hidden_input, results);
- }
- if(settings.allowCreation) {
- results.push({name: input_box.val() + settings.newText, id: input_box.val()});
+ if($(input).data("settings").allowFreeTagging && $(input).data("settings").freeTaggingHint) {
+ results.push({name: input_box.val() + $(input).data("settings").newText, id: input_box.val()});
+ }
+
+ cache.add(cache_key, results);
+ if($.isFunction($(input).data("settings").onResult)) {
+ results = $(input).data("settings").onResult.call(hidden_input, results);
}
-
- cache.add(query, results);
-
populate_dropdown(query, results);
}
}
}
-
- if ($(input).get(0).tagName == 'SELECT') {
- $(input).remove();
+
+ // compute the dynamic URL
+ function computeURL() {
+ var url = $(input).data("settings").url;
+ if(typeof $(input).data("settings").url == 'function') {
+ url = $(input).data("settings").url.call($(input).data("settings"));
+ }
+ return url;
}
+
+ // Bring browser focus to the specified object.
+ // Use of setTimeout is to get around an IE bug.
+ // (See, e.g., http://stackoverflow.com/questions/2600186/focus-doesnt-work-in-ie)
+ //
+ // obj: a jQuery object to focus()
+ function focus_with_timeout(obj) {
+ setTimeout(function() { obj.focus(); }, 50);
+ }
+
};
// Really basic cache for the results
@@ -775,3 +1095,4 @@ $.TokenList.Cache = function (options) {
};
};
}(jQuery));
+
diff --git a/themes/default/js/plugins/underscore.js b/themes/default/js/plugins/underscore.js
new file mode 100644
index 000000000..b50115df5
--- /dev/null
+++ b/themes/default/js/plugins/underscore.js
@@ -0,0 +1,1276 @@
+// Underscore.js 1.5.2
+// http://underscorejs.org
+// (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+// Underscore may be freely distributed under the MIT license.
+
+(function() {
+
+ // Baseline setup
+ // --------------
+
+ // Establish the root object, `window` in the browser, or `exports` 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
+ push = ArrayProto.push,
+ slice = ArrayProto.slice,
+ concat = ArrayProto.concat,
+ 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) {
+ if (obj instanceof _) return obj;
+ if (!(this instanceof _)) return new _(obj);
+ this._wrapped = obj;
+ };
+
+ // Export the Underscore object for **Node.js**, with
+ // backwards-compatibility for the old `require()` API. If we're in
+ // the browser, add `_` as a global object via a string identifier,
+ // for Closure Compiler "advanced" mode.
+ if (typeof exports !== 'undefined') {
+ if (typeof module !== 'undefined' && module.exports) {
+ exports = module.exports = _;
+ }
+ exports._ = _;
+ } else {
+ root._ = _;
+ }
+
+ // Current version.
+ _.VERSION = '1.5.2';
+
+ // 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, length = obj.length; i < length; i++) {
+ if (iterator.call(context, obj[i], i, obj) === breaker) return;
+ }
+ } else {
+ var keys = _.keys(obj);
+ for (var i = 0, length = keys.length; i < length; i++) {
+ if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return;
+ }
+ }
+ };
+
+ // Return the results of applying the iterator to each element.
+ // Delegates to **ECMAScript 5**'s native `map` if available.
+ _.map = _.collect = 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.push(iterator.call(context, value, index, list));
+ });
+ return results;
+ };
+
+ var reduceError = 'Reduce of empty array with no initial value';
+
+ // **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(reduceError);
+ 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 length = obj.length;
+ if (length !== +length) {
+ var keys = _.keys(obj);
+ length = keys.length;
+ }
+ each(obj, function(value, index, list) {
+ index = keys ? keys[--length] : --length;
+ if (!initial) {
+ memo = obj[index];
+ initial = true;
+ } else {
+ memo = iterator.call(context, memo, obj[index], index, list);
+ }
+ });
+ if (!initial) throw new TypeError(reduceError);
+ return memo;
+ };
+
+ // 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.push(value);
+ });
+ return results;
+ };
+
+ // Return all the elements for which a truth test fails.
+ _.reject = function(obj, iterator, context) {
+ return _.filter(obj, function(value, index, list) {
+ return !iterator.call(context, value, index, list);
+ }, context);
+ };
+
+ // 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) {
+ iterator || (iterator = _.identity);
+ 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 the array or object contains a given value (using `===`).
+ // Aliased as `include`.
+ _.contains = _.include = function(obj, target) {
+ if (obj == null) return false;
+ if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
+ return any(obj, function(value) {
+ return value === target;
+ });
+ };
+
+ // Invoke a method (with arguments) on every item in a collection.
+ _.invoke = function(obj, method) {
+ var args = slice.call(arguments, 2);
+ var isFunc = _.isFunction(method);
+ return _.map(obj, function(value) {
+ return (isFunc ? method : 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]; });
+ };
+
+ // Convenience version of a common use case of `filter`: selecting only objects
+ // containing specific `key:value` pairs.
+ _.where = function(obj, attrs, first) {
+ if (_.isEmpty(attrs)) return first ? void 0 : [];
+ return _[first ? 'find' : 'filter'](obj, function(value) {
+ for (var key in attrs) {
+ if (attrs[key] !== value[key]) return false;
+ }
+ return true;
+ });
+ };
+
+ // Convenience version of a common use case of `find`: getting the first object
+ // containing specific `key:value` pairs.
+ _.findWhere = function(obj, attrs) {
+ return _.where(obj, attrs, true);
+ };
+
+ // Return the maximum element or (element-based computation).
+ // Can't optimize arrays of integers longer than 65,535 elements.
+ // See [WebKit Bug 80797](https://bugs.webkit.org/show_bug.cgi?id=80797)
+ _.max = function(obj, iterator, context) {
+ if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
+ return Math.max.apply(Math, obj);
+ }
+ if (!iterator && _.isEmpty(obj)) return -Infinity;
+ var result = {computed : -Infinity, value: -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) && obj[0] === +obj[0] && obj.length < 65535) {
+ return Math.min.apply(Math, obj);
+ }
+ if (!iterator && _.isEmpty(obj)) return Infinity;
+ var result = {computed : Infinity, value: 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, using the modern version of the
+ // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
+ _.shuffle = function(obj) {
+ var rand;
+ var index = 0;
+ var shuffled = [];
+ each(obj, function(value) {
+ rand = _.random(index++);
+ shuffled[index - 1] = shuffled[rand];
+ shuffled[rand] = value;
+ });
+ return shuffled;
+ };
+
+ // Sample **n** random values from an array.
+ // If **n** is not specified, returns a single random element from the array.
+ // The internal `guard` argument allows it to work with `map`.
+ _.sample = function(obj, n, guard) {
+ if (arguments.length < 2 || guard) {
+ return obj[_.random(obj.length - 1)];
+ }
+ return _.shuffle(obj).slice(0, Math.max(0, n));
+ };
+
+ // An internal function to generate lookup iterators.
+ var lookupIterator = function(value) {
+ return _.isFunction(value) ? value : function(obj){ return obj[value]; };
+ };
+
+ // Sort the object's values by a criterion produced by an iterator.
+ _.sortBy = function(obj, value, context) {
+ var iterator = lookupIterator(value);
+ return _.pluck(_.map(obj, function(value, index, list) {
+ return {
+ value: value,
+ index: index,
+ criteria: iterator.call(context, value, index, list)
+ };
+ }).sort(function(left, right) {
+ var a = left.criteria;
+ var b = right.criteria;
+ if (a !== b) {
+ if (a > b || a === void 0) return 1;
+ if (a < b || b === void 0) return -1;
+ }
+ return left.index - right.index;
+ }), 'value');
+ };
+
+ // An internal function used for aggregate "group by" operations.
+ var group = function(behavior) {
+ return function(obj, value, context) {
+ var result = {};
+ var iterator = value == null ? _.identity : lookupIterator(value);
+ each(obj, function(value, index) {
+ var key = iterator.call(context, value, index, obj);
+ behavior(result, key, value);
+ });
+ return result;
+ };
+ };
+
+ // Groups the object's values by a criterion. Pass either a string attribute
+ // to group by, or a function that returns the criterion.
+ _.groupBy = group(function(result, key, value) {
+ (_.has(result, key) ? result[key] : (result[key] = [])).push(value);
+ });
+
+ // Indexes the object's values by a criterion, similar to `groupBy`, but for
+ // when you know that your index values will be unique.
+ _.indexBy = group(function(result, key, value) {
+ result[key] = value;
+ });
+
+ // Counts instances of an object that group by a certain criterion. Pass
+ // either a string attribute to count by, or a function that returns the
+ // criterion.
+ _.countBy = group(function(result, key) {
+ _.has(result, key) ? result[key]++ : result[key] = 1;
+ });
+
+ // Use a comparator function to figure out the smallest index at which
+ // an object should be inserted so as to maintain order. Uses binary search.
+ _.sortedIndex = function(array, obj, iterator, context) {
+ iterator = iterator == null ? _.identity : lookupIterator(iterator);
+ var value = iterator.call(context, obj);
+ var low = 0, high = array.length;
+ while (low < high) {
+ var mid = (low + high) >>> 1;
+ iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid;
+ }
+ return low;
+ };
+
+ // Safely create a real, live array from anything iterable.
+ _.toArray = function(obj) {
+ if (!obj) return [];
+ if (_.isArray(obj)) return slice.call(obj);
+ if (obj.length === +obj.length) return _.map(obj, _.identity);
+ return _.values(obj);
+ };
+
+ // Return the number of elements in an object.
+ _.size = function(obj) {
+ if (obj == null) return 0;
+ return (obj.length === +obj.length) ? obj.length : _.keys(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` and `take`. The **guard** check
+ // allows it to work with `_.map`.
+ _.first = _.head = _.take = function(array, n, guard) {
+ if (array == null) return void 0;
+ return (n == null) || guard ? array[0] : slice.call(array, 0, n);
+ };
+
+ // Returns everything but the last entry of the array. Especially 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 (array == null) return void 0;
+ if ((n == null) || guard) {
+ return array[array.length - 1];
+ } else {
+ return slice.call(array, Math.max(array.length - n, 0));
+ }
+ };
+
+ // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
+ // Especially useful on the arguments object. Passing an **n** will return
+ // the rest N values in the array. The **guard**
+ // check allows it to work with `_.map`.
+ _.rest = _.tail = _.drop = function(array, n, guard) {
+ return slice.call(array, (n == null) || guard ? 1 : n);
+ };
+
+ // Trim out all falsy values from an array.
+ _.compact = function(array) {
+ return _.filter(array, _.identity);
+ };
+
+ // Internal implementation of a recursive `flatten` function.
+ var flatten = function(input, shallow, output) {
+ if (shallow && _.every(input, _.isArray)) {
+ return concat.apply(output, input);
+ }
+ each(input, function(value) {
+ if (_.isArray(value) || _.isArguments(value)) {
+ shallow ? push.apply(output, value) : flatten(value, shallow, output);
+ } else {
+ output.push(value);
+ }
+ });
+ return output;
+ };
+
+ // Flatten out an array, either recursively (by default), or just one level.
+ _.flatten = function(array, shallow) {
+ return flatten(array, shallow, []);
+ };
+
+ // 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, context) {
+ if (_.isFunction(isSorted)) {
+ context = iterator;
+ iterator = isSorted;
+ isSorted = false;
+ }
+ var initial = iterator ? _.map(array, iterator, context) : array;
+ var results = [];
+ var seen = [];
+ each(initial, function(value, index) {
+ if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) {
+ seen.push(value);
+ results.push(array[index]);
+ }
+ });
+ return results;
+ };
+
+ // 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.
+ _.intersection = 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 = concat.apply(ArrayProto, slice.call(arguments, 1));
+ return _.filter(array, function(value){ return !_.contains(rest, value); });
+ };
+
+ // Zip together multiple lists into a single array -- elements that share
+ // an index go together.
+ _.zip = function() {
+ var length = _.max(_.pluck(arguments, "length").concat(0));
+ var results = new Array(length);
+ for (var i = 0; i < length; i++) {
+ results[i] = _.pluck(arguments, '' + i);
+ }
+ return results;
+ };
+
+ // Converts lists into objects. Pass either a single array of `[key, value]`
+ // pairs, or two parallel arrays of the same length -- one of keys, and one of
+ // the corresponding values.
+ _.object = function(list, values) {
+ if (list == null) return {};
+ var result = {};
+ for (var i = 0, length = list.length; i < length; i++) {
+ if (values) {
+ result[list[i]] = values[i];
+ } else {
+ result[list[i][0]] = list[i][1];
+ }
+ }
+ return result;
+ };
+
+ // 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 = 0, length = array.length;
+ if (isSorted) {
+ if (typeof isSorted == 'number') {
+ i = (isSorted < 0 ? Math.max(0, length + isSorted) : isSorted);
+ } else {
+ i = _.sortedIndex(array, item);
+ return array[i] === item ? i : -1;
+ }
+ }
+ if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);
+ for (; i < length; i++) if (array[i] === item) return i;
+ return -1;
+ };
+
+ // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.
+ _.lastIndexOf = function(array, item, from) {
+ if (array == null) return -1;
+ var hasIndex = from != null;
+ if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) {
+ return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item);
+ }
+ var i = (hasIndex ? from : array.length);
+ while (i--) if (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 length = Math.max(Math.ceil((stop - start) / step), 0);
+ var idx = 0;
+ var range = new Array(length);
+
+ while(idx < length) {
+ 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). Delegates to **ECMAScript 5**'s native `Function.bind` if
+ // available.
+ _.bind = function(func, context) {
+ var args, bound;
+ if (nativeBind && func.bind === 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;
+ ctor.prototype = null;
+ var result = func.apply(self, args.concat(slice.call(arguments)));
+ if (Object(result) === result) return result;
+ return self;
+ };
+ };
+
+ // Partially apply a function by creating a version that has had some of its
+ // arguments pre-filled, without changing its dynamic `this` context.
+ _.partial = function(func) {
+ var args = slice.call(arguments, 1);
+ return function() {
+ return func.apply(this, args.concat(slice.call(arguments)));
+ };
+ };
+
+ // 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) throw new Error("bindAll must be passed function names");
+ 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 _.has(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(null, 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. Normally, the throttled function will run
+ // as much as it can, without ever going more than once per `wait` duration;
+ // but if you'd like to disable the execution on the leading edge, pass
+ // `{leading: false}`. To disable execution on the trailing edge, ditto.
+ _.throttle = function(func, wait, options) {
+ var context, args, result;
+ var timeout = null;
+ var previous = 0;
+ options || (options = {});
+ var later = function() {
+ previous = options.leading === false ? 0 : new Date;
+ timeout = null;
+ result = func.apply(context, args);
+ };
+ return function() {
+ var now = new Date;
+ if (!previous && options.leading === false) previous = now;
+ var remaining = wait - (now - previous);
+ context = this;
+ args = arguments;
+ if (remaining <= 0) {
+ clearTimeout(timeout);
+ timeout = null;
+ previous = now;
+ result = func.apply(context, args);
+ } else if (!timeout && options.trailing !== false) {
+ timeout = setTimeout(later, remaining);
+ }
+ return result;
+ };
+ };
+
+ // 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. If `immediate` is passed, trigger the function on the
+ // leading edge, instead of the trailing.
+ _.debounce = function(func, wait, immediate) {
+ var timeout, args, context, timestamp, result;
+ return function() {
+ context = this;
+ args = arguments;
+ timestamp = new Date();
+ var later = function() {
+ var last = (new Date()) - timestamp;
+ if (last < wait) {
+ timeout = setTimeout(later, wait - last);
+ } else {
+ timeout = null;
+ if (!immediate) result = func.apply(context, args);
+ }
+ };
+ var callNow = immediate && !timeout;
+ if (!timeout) {
+ timeout = setTimeout(later, wait);
+ }
+ if (callNow) result = func.apply(context, args);
+ return result;
+ };
+ };
+
+ // 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;
+ memo = func.apply(this, arguments);
+ func = null;
+ return memo;
+ };
+ };
+
+ // 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 = [func];
+ push.apply(args, 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) {
+ 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 (_.has(obj, key)) keys.push(key);
+ return keys;
+ };
+
+ // Retrieve the values of an object's properties.
+ _.values = function(obj) {
+ var keys = _.keys(obj);
+ var length = keys.length;
+ var values = new Array(length);
+ for (var i = 0; i < length; i++) {
+ values[i] = obj[keys[i]];
+ }
+ return values;
+ };
+
+ // Convert an object into a list of `[key, value]` pairs.
+ _.pairs = function(obj) {
+ var keys = _.keys(obj);
+ var length = keys.length;
+ var pairs = new Array(length);
+ for (var i = 0; i < length; i++) {
+ pairs[i] = [keys[i], obj[keys[i]]];
+ }
+ return pairs;
+ };
+
+ // Invert the keys and values of an object. The values must be serializable.
+ _.invert = function(obj) {
+ var result = {};
+ var keys = _.keys(obj);
+ for (var i = 0, length = keys.length; i < length; i++) {
+ result[obj[keys[i]]] = keys[i];
+ }
+ return result;
+ };
+
+ // 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) {
+ if (source) {
+ for (var prop in source) {
+ obj[prop] = source[prop];
+ }
+ }
+ });
+ return obj;
+ };
+
+ // Return a copy of the object only containing the whitelisted properties.
+ _.pick = function(obj) {
+ var copy = {};
+ var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
+ each(keys, function(key) {
+ if (key in obj) copy[key] = obj[key];
+ });
+ return copy;
+ };
+
+ // Return a copy of the object without the blacklisted properties.
+ _.omit = function(obj) {
+ var copy = {};
+ var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
+ for (var key in obj) {
+ if (!_.contains(keys, key)) copy[key] = obj[key];
+ }
+ return copy;
+ };
+
+ // Fill in a given object with default properties.
+ _.defaults = function(obj) {
+ each(slice.call(arguments, 1), function(source) {
+ if (source) {
+ for (var prop in source) {
+ if (obj[prop] === void 0) 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 for `isEqual`.
+ var eq = function(a, b, aStack, bStack) {
+ // 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 instanceof _) a = a._wrapped;
+ if (b instanceof _) b = b._wrapped;
+ // 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 = aStack.length;
+ while (length--) {
+ // Linear search. Performance is inversely proportional to the number of
+ // unique nested structures.
+ if (aStack[length] == a) return bStack[length] == b;
+ }
+ // Objects with different constructors are not equivalent, but `Object`s
+ // from different frames are.
+ var aCtor = a.constructor, bCtor = b.constructor;
+ if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) &&
+ _.isFunction(bCtor) && (bCtor instanceof bCtor))) {
+ return false;
+ }
+ // Add the first object to the stack of traversed objects.
+ aStack.push(a);
+ bStack.push(b);
+ 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--) {
+ if (!(result = eq(a[size], b[size], aStack, bStack))) break;
+ }
+ }
+ } else {
+ // Deep compare objects.
+ for (var key in a) {
+ if (_.has(a, key)) {
+ // Count the expected number of properties.
+ size++;
+ // Deep compare each member.
+ if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;
+ }
+ }
+ // Ensure that both objects contain the same number of properties.
+ if (result) {
+ for (key in b) {
+ if (_.has(b, key) && !(size--)) break;
+ }
+ result = !size;
+ }
+ }
+ // Remove the first object from the stack of traversed objects.
+ aStack.pop();
+ bStack.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 (obj == null) return true;
+ if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
+ for (var key in obj) if (_.has(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);
+ };
+
+ // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.
+ each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
+ _['is' + name] = function(obj) {
+ return toString.call(obj) == '[object ' + name + ']';
+ };
+ });
+
+ // Define a fallback version of the method in browsers (ahem, IE), where
+ // there isn't any inspectable "Arguments" type.
+ if (!_.isArguments(arguments)) {
+ _.isArguments = function(obj) {
+ return !!(obj && _.has(obj, 'callee'));
+ };
+ }
+
+ // Optimize `isFunction` if appropriate.
+ if (typeof (/./) !== 'function') {
+ _.isFunction = function(obj) {
+ return typeof obj === 'function';
+ };
+ }
+
+ // Is a given object a finite number?
+ _.isFinite = function(obj) {
+ return isFinite(obj) && !isNaN(parseFloat(obj));
+ };
+
+ // Is the given value `NaN`? (NaN is the only number which does not equal itself).
+ _.isNaN = function(obj) {
+ return _.isNumber(obj) && 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 equal to null?
+ _.isNull = function(obj) {
+ return obj === null;
+ };
+
+ // Is a given variable undefined?
+ _.isUndefined = function(obj) {
+ return obj === void 0;
+ };
+
+ // Shortcut function for checking if an object has a given property directly
+ // on itself (in other words, not on a prototype).
+ _.has = function(obj, key) {
+ return hasOwnProperty.call(obj, key);
+ };
+
+ // 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) {
+ var accum = Array(Math.max(0, n));
+ for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i);
+ return accum;
+ };
+
+ // Return a random integer between min and max (inclusive).
+ _.random = function(min, max) {
+ if (max == null) {
+ max = min;
+ min = 0;
+ }
+ return min + Math.floor(Math.random() * (max - min + 1));
+ };
+
+ // List of HTML entities for escaping.
+ var entityMap = {
+ escape: {
+ '&': '&amp;',
+ '<': '&lt;',
+ '>': '&gt;',
+ '"': '&quot;',
+ "'": '&#x27;'
+ }
+ };
+ entityMap.unescape = _.invert(entityMap.escape);
+
+ // Regexes containing the keys and values listed immediately above.
+ var entityRegexes = {
+ escape: new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'),
+ unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g')
+ };
+
+ // Functions for escaping and unescaping strings to/from HTML interpolation.
+ _.each(['escape', 'unescape'], function(method) {
+ _[method] = function(string) {
+ if (string == null) return '';
+ return ('' + string).replace(entityRegexes[method], function(match) {
+ return entityMap[method][match];
+ });
+ };
+ });
+
+ // If the value of the named `property` is a function then invoke it with the
+ // `object` as context; otherwise, return it.
+ _.result = function(object, property) {
+ if (object == null) return void 0;
+ var value = object[property];
+ return _.isFunction(value) ? value.call(object) : value;
+ };
+
+ // Add your own custom functions to the Underscore object.
+ _.mixin = function(obj) {
+ each(_.functions(obj), function(name) {
+ var func = _[name] = obj[name];
+ _.prototype[name] = function() {
+ var args = [this._wrapped];
+ push.apply(args, arguments);
+ return result.call(this, func.apply(_, args));
+ };
+ });
+ };
+
+ // 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
+ };
+
+ // When customizing `templateSettings`, if you don't want to define an
+ // interpolation, evaluation or escaping regex, we need one that is
+ // guaranteed not to match.
+ var noMatch = /(.)^/;
+
+ // Certain characters need to be escaped so that they can be put into a
+ // string literal.
+ var escapes = {
+ "'": "'",
+ '\\': '\\',
+ '\r': 'r',
+ '\n': 'n',
+ '\t': 't',
+ '\u2028': 'u2028',
+ '\u2029': 'u2029'
+ };
+
+ var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/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(text, data, settings) {
+ var render;
+ settings = _.defaults({}, settings, _.templateSettings);
+
+ // Combine delimiters into one regular expression via alternation.
+ var matcher = new RegExp([
+ (settings.escape || noMatch).source,
+ (settings.interpolate || noMatch).source,
+ (settings.evaluate || noMatch).source
+ ].join('|') + '|$', 'g');
+
+ // Compile the template source, escaping string literals appropriately.
+ var index = 0;
+ var source = "__p+='";
+ text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
+ source += text.slice(index, offset)
+ .replace(escaper, function(match) { return '\\' + escapes[match]; });
+
+ if (escape) {
+ source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
+ }
+ if (interpolate) {
+ source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
+ }
+ if (evaluate) {
+ source += "';\n" + evaluate + "\n__p+='";
+ }
+ index = offset + match.length;
+ return match;
+ });
+ source += "';\n";
+
+ // If a variable is not specified, place data values in local scope.
+ if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
+
+ source = "var __t,__p='',__j=Array.prototype.join," +
+ "print=function(){__p+=__j.call(arguments,'');};\n" +
+ source + "return __p;\n";
+
+ try {
+ render = new Function(settings.variable || 'obj', '_', source);
+ } catch (e) {
+ e.source = source;
+ throw e;
+ }
+
+ if (data) return render(data, _);
+ var template = function(data) {
+ return render.call(this, data, _);
+ };
+
+ // Provide the compiled function source as a convenience for precompilation.
+ template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
+
+ return template;
+ };
+
+ // Add a "chain" function, which will delegate to the wrapper.
+ _.chain = function(obj) {
+ return _(obj).chain();
+ };
+
+ // OOP
+ // ---------------
+ // 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.
+
+ // Helper function to continue chaining intermediate results.
+ var result = function(obj) {
+ return this._chain ? _(obj).chain() : obj;
+ };
+
+ // 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];
+ _.prototype[name] = function() {
+ var obj = this._wrapped;
+ method.apply(obj, arguments);
+ if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0];
+ return result.call(this, obj);
+ };
+ });
+
+ // Add all accessor Array functions to the wrapper.
+ each(['concat', 'join', 'slice'], function(name) {
+ var method = ArrayProto[name];
+ _.prototype[name] = function() {
+ return result.call(this, method.apply(this._wrapped, arguments));
+ };
+ });
+
+ _.extend(_.prototype, {
+
+ // Start chaining a wrapped Underscore object.
+ chain: function() {
+ this._chain = true;
+ return this;
+ },
+
+ // Extracts the result from a wrapped and chained object.
+ value: function() {
+ return this._wrapped;
+ }
+
+ });
+
+}).call(this);
diff --git a/themes/default/js/raphael.js b/themes/default/js/raphael.js
deleted file mode 100644
index 9b1a60ef0..000000000
--- a/themes/default/js/raphael.js
+++ /dev/null
@@ -1,5501 +0,0 @@
-// ┌────────────────────────────────────────────────────────────────────┠\\
-// │ Raphaël 2.0.2 - JavaScript Vector Library │ \\
-// ├────────────────────────────────────────────────────────────────────┤ \\
-// │ Copyright © 2008-2012 Dmitry Baranovskiy (http://raphaeljs.com) │ \\
-// │ Copyright © 2008-2012 Sencha Labs (http://sencha.com) │ \\
-// ├────────────────────────────────────────────────────────────────────┤ \\
-// │ Licensed under the MIT (http://raphaeljs.com/license.html) license.│ \\
-// └────────────────────────────────────────────────────────────────────┘ \\
-// ┌──────────────────────────────────────────────────────────────────────────────────────┠\\
-// │ Eve 0.3.4 - JavaScript Events Library │ \\
-// ├──────────────────────────────────────────────────────────────────────────────────────┤ \\
-// │ Copyright (c) 2008-2011 Dmitry Baranovskiy (http://dmitry.baranovskiy.com/) │ \\
-// │ Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. │ \\
-// └──────────────────────────────────────────────────────────────────────────────────────┘ \\
-
-(function (glob) {
- var version = "0.3.4",
- has = "hasOwnProperty",
- separator = /[\.\/]/,
- wildcard = "*",
- fun = function () {},
- numsort = function (a, b) {
- return a - b;
- },
- current_event,
- stop,
- events = {n: {}},
-
- eve = function (name, scope) {
- var e = events,
- oldstop = stop,
- args = Array.prototype.slice.call(arguments, 2),
- listeners = eve.listeners(name),
- z = 0,
- f = false,
- l,
- indexed = [],
- queue = {},
- out = [],
- ce = current_event,
- errors = [];
- current_event = name;
- stop = 0;
- for (var i = 0, ii = listeners.length; i < ii; i++) if ("zIndex" in listeners[i]) {
- indexed.push(listeners[i].zIndex);
- if (listeners[i].zIndex < 0) {
- queue[listeners[i].zIndex] = listeners[i];
- }
- }
- indexed.sort(numsort);
- while (indexed[z] < 0) {
- l = queue[indexed[z++]];
- out.push(l.apply(scope, args));
- if (stop) {
- stop = oldstop;
- return out;
- }
- }
- for (i = 0; i < ii; i++) {
- l = listeners[i];
- if ("zIndex" in l) {
- if (l.zIndex == indexed[z]) {
- out.push(l.apply(scope, args));
- if (stop) {
- break;
- }
- do {
- z++;
- l = queue[indexed[z]];
- l && out.push(l.apply(scope, args));
- if (stop) {
- break;
- }
- } while (l)
- } else {
- queue[l.zIndex] = l;
- }
- } else {
- out.push(l.apply(scope, args));
- if (stop) {
- break;
- }
- }
- }
- stop = oldstop;
- current_event = ce;
- return out.length ? out : null;
- };
-
- eve.listeners = function (name) {
- var names = name.split(separator),
- e = events,
- item,
- items,
- k,
- i,
- ii,
- j,
- jj,
- nes,
- es = [e],
- out = [];
- for (i = 0, ii = names.length; i < ii; i++) {
- nes = [];
- for (j = 0, jj = es.length; j < jj; j++) {
- e = es[j].n;
- items = [e[names[i]], e[wildcard]];
- k = 2;
- while (k--) {
- item = items[k];
- if (item) {
- nes.push(item);
- out = out.concat(item.f || []);
- }
- }
- }
- es = nes;
- }
- return out;
- };
-
-
- eve.on = function (name, f) {
- var names = name.split(separator),
- e = events;
- for (var i = 0, ii = names.length; i < ii; i++) {
- e = e.n;
- !e[names[i]] && (e[names[i]] = {n: {}});
- e = e[names[i]];
- }
- e.f = e.f || [];
- for (i = 0, ii = e.f.length; i < ii; i++) if (e.f[i] == f) {
- return fun;
- }
- e.f.push(f);
- return function (zIndex) {
- if (+zIndex == +zIndex) {
- f.zIndex = +zIndex;
- }
- };
- };
-
- eve.stop = function () {
- stop = 1;
- };
-
- eve.nt = function (subname) {
- if (subname) {
- return new RegExp("(?:\\.|\\/|^)" + subname + "(?:\\.|\\/|$)").test(current_event);
- }
- return current_event;
- };
-
-
- eve.off = eve.unbind = function (name, f) {
- var names = name.split(separator),
- e,
- key,
- splice,
- i, ii, j, jj,
- cur = [events];
- for (i = 0, ii = names.length; i < ii; i++) {
- for (j = 0; j < cur.length; j += splice.length - 2) {
- splice = [j, 1];
- e = cur[j].n;
- if (names[i] != wildcard) {
- if (e[names[i]]) {
- splice.push(e[names[i]]);
- }
- } else {
- for (key in e) if (e[has](key)) {
- splice.push(e[key]);
- }
- }
- cur.splice.apply(cur, splice);
- }
- }
- for (i = 0, ii = cur.length; i < ii; i++) {
- e = cur[i];
- while (e.n) {
- if (f) {
- if (e.f) {
- for (j = 0, jj = e.f.length; j < jj; j++) if (e.f[j] == f) {
- e.f.splice(j, 1);
- break;
- }
- !e.f.length && delete e.f;
- }
- for (key in e.n) if (e.n[has](key) && e.n[key].f) {
- var funcs = e.n[key].f;
- for (j = 0, jj = funcs.length; j < jj; j++) if (funcs[j] == f) {
- funcs.splice(j, 1);
- break;
- }
- !funcs.length && delete e.n[key].f;
- }
- } else {
- delete e.f;
- for (key in e.n) if (e.n[has](key) && e.n[key].f) {
- delete e.n[key].f;
- }
- }
- e = e.n;
- }
- }
- };
-
- eve.once = function (name, f) {
- var f2 = function () {
- var res = f.apply(this, arguments);
- eve.unbind(name, f2);
- return res;
- };
- return eve.on(name, f2);
- };
-
- eve.version = version;
- eve.toString = function () {
- return "You are running Eve " + version;
- };
- (typeof module != "undefined" && module.exports) ? (module.exports = eve) : (typeof define != "undefined" ? (define("eve", [], function() { return eve; })) : (glob.eve = eve));
-})(this);
-
-
-// ┌─────────────────────────────────────────────────────────────────────┠\\
-// │ "Raphaël 2.0.2" - JavaScript Vector Library │ \\
-// ├─────────────────────────────────────────────────────────────────────┤ \\
-// │ Copyright (c) 2008-2011 Dmitry Baranovskiy (http://raphaeljs.com) │ \\
-// │ Copyright (c) 2008-2011 Sencha Labs (http://sencha.com) │ \\
-// │ Licensed under the MIT (http://raphaeljs.com/license.html) license. │ \\
-// └─────────────────────────────────────────────────────────────────────┘ \\
-(function () {
-
- function R(first) {
- if (R.is(first, "function")) {
- return loaded ? first() : eve.on("DOMload", first);
- } else if (R.is(first, array)) {
- return R._engine.create[apply](R, first.splice(0, 3 + R.is(first[0], nu))).add(first);
- } else {
- var args = Array.prototype.slice.call(arguments, 0);
- if (R.is(args[args.length - 1], "function")) {
- var f = args.pop();
- return loaded ? f.call(R._engine.create[apply](R, args)) : eve.on("DOMload", function () {
- f.call(R._engine.create[apply](R, args));
- });
- } else {
- return R._engine.create[apply](R, arguments);
- }
- }
- }
- R.version = "2.0.2";
- R.eve = eve;
- var loaded,
- separator = /[, ]+/,
- elements = {circle: 1, rect: 1, path: 1, ellipse: 1, text: 1, image: 1},
- formatrg = /\{(\d+)\}/g,
- proto = "prototype",
- has = "hasOwnProperty",
- g = {
- doc: document,
- win: window
- },
- oldRaphael = {
- was: Object.prototype[has].call(g.win, "Raphael"),
- is: g.win.Raphael
- },
- Paper = function () {
-
-
- this.ca = this.customAttributes = {};
- },
- paperproto,
- appendChild = "appendChild",
- apply = "apply",
- concat = "concat",
- supportsTouch = "createTouch" in g.doc,
- E = "",
- S = " ",
- Str = String,
- split = "split",
- events = "click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel"[split](S),
- touchMap = {
- mousedown: "touchstart",
- mousemove: "touchmove",
- mouseup: "touchend"
- },
- lowerCase = Str.prototype.toLowerCase,
- math = Math,
- mmax = math.max,
- mmin = math.min,
- abs = math.abs,
- pow = math.pow,
- PI = math.PI,
- nu = "number",
- string = "string",
- array = "array",
- toString = "toString",
- fillString = "fill",
- objectToString = Object.prototype.toString,
- paper = {},
- push = "push",
- ISURL = R._ISURL = /^url\(['"]?([^\)]+?)['"]?\)$/i,
- colourRegExp = /^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i,
- isnan = {"NaN": 1, "Infinity": 1, "-Infinity": 1},
- bezierrg = /^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,
- round = math.round,
- setAttribute = "setAttribute",
- toFloat = parseFloat,
- toInt = parseInt,
- upperCase = Str.prototype.toUpperCase,
- availableAttrs = R._availableAttrs = {
- "arrow-end": "none",
- "arrow-start": "none",
- blur: 0,
- "clip-rect": "0 0 1e9 1e9",
- cursor: "default",
- cx: 0,
- cy: 0,
- fill: "#fff",
- "fill-opacity": 1,
- font: '10px "Arial"',
- "font-family": '"Arial"',
- "font-size": "10",
- "font-style": "normal",
- "font-weight": 400,
- gradient: 0,
- height: 0,
- href: "http://raphaeljs.com/",
- "letter-spacing": 0,
- opacity: 1,
- path: "M0,0",
- r: 0,
- rx: 0,
- ry: 0,
- src: "",
- stroke: "#000",
- "stroke-dasharray": "",
- "stroke-linecap": "butt",
- "stroke-linejoin": "butt",
- "stroke-miterlimit": 0,
- "stroke-opacity": 1,
- "stroke-width": 1,
- target: "_blank",
- "text-anchor": "middle",
- title: "Raphael",
- transform: "",
- width: 0,
- x: 0,
- y: 0
- },
- availableAnimAttrs = R._availableAnimAttrs = {
- blur: nu,
- "clip-rect": "csv",
- cx: nu,
- cy: nu,
- fill: "colour",
- "fill-opacity": nu,
- "font-size": nu,
- height: nu,
- opacity: nu,
- path: "path",
- r: nu,
- rx: nu,
- ry: nu,
- stroke: "colour",
- "stroke-opacity": nu,
- "stroke-width": nu,
- transform: "transform",
- width: nu,
- x: nu,
- y: nu
- },
- whitespace = /[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]/g,
- commaSpaces = /[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/,
- hsrg = {hs: 1, rg: 1},
- p2s = /,?([achlmqrstvxz]),?/gi,
- pathCommand = /([achlmrqstvz])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/ig,
- tCommand = /([rstm])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/ig,
- pathValues = /(-?\d*\.?\d*(?:e[\-+]?\d+)?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/ig,
- radial_gradient = R._radial_gradient = /^r(?:\(([^,]+?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*([^\)]+?)\))?/,
- eldata = {},
- sortByKey = function (a, b) {
- return a.key - b.key;
- },
- sortByNumber = function (a, b) {
- return toFloat(a) - toFloat(b);
- },
- fun = function () {},
- pipe = function (x) {
- return x;
- },
- rectPath = R._rectPath = function (x, y, w, h, r) {
- if (r) {
- return [["M", x + r, y], ["l", w - r * 2, 0], ["a", r, r, 0, 0, 1, r, r], ["l", 0, h - r * 2], ["a", r, r, 0, 0, 1, -r, r], ["l", r * 2 - w, 0], ["a", r, r, 0, 0, 1, -r, -r], ["l", 0, r * 2 - h], ["a", r, r, 0, 0, 1, r, -r], ["z"]];
- }
- return [["M", x, y], ["l", w, 0], ["l", 0, h], ["l", -w, 0], ["z"]];
- },
- ellipsePath = function (x, y, rx, ry) {
- if (ry == null) {
- ry = rx;
- }
- return [["M", x, y], ["m", 0, -ry], ["a", rx, ry, 0, 1, 1, 0, 2 * ry], ["a", rx, ry, 0, 1, 1, 0, -2 * ry], ["z"]];
- },
- getPath = R._getPath = {
- path: function (el) {
- return el.attr("path");
- },
- circle: function (el) {
- var a = el.attrs;
- return ellipsePath(a.cx, a.cy, a.r);
- },
- ellipse: function (el) {
- var a = el.attrs;
- return ellipsePath(a.cx, a.cy, a.rx, a.ry);
- },
- rect: function (el) {
- var a = el.attrs;
- return rectPath(a.x, a.y, a.width, a.height, a.r);
- },
- image: function (el) {
- var a = el.attrs;
- return rectPath(a.x, a.y, a.width, a.height);
- },
- text: function (el) {
- var bbox = el._getBBox();
- return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);
- }
- },
- mapPath = R.mapPath = function (path, matrix) {
- if (!matrix) {
- return path;
- }
- var x, y, i, j, ii, jj, pathi;
- path = path2curve(path);
- for (i = 0, ii = path.length; i < ii; i++) {
- pathi = path[i];
- for (j = 1, jj = pathi.length; j < jj; j += 2) {
- x = matrix.x(pathi[j], pathi[j + 1]);
- y = matrix.y(pathi[j], pathi[j + 1]);
- pathi[j] = x;
- pathi[j + 1] = y;
- }
- }
- return path;
- };
-
- R._g = g;
-
- R.type = (g.win.SVGAngle || g.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") ? "SVG" : "VML");
- if (R.type == "VML") {
- var d = g.doc.createElement("div"),
- b;
- d.innerHTML = '<v:shape adj="1"/>';
- b = d.firstChild;
- b.style.behavior = "url(#default#VML)";
- if (!(b && typeof b.adj == "object")) {
- return (R.type = E);
- }
- d = null;
- }
-
-
- R.svg = !(R.vml = R.type == "VML");
- R._Paper = Paper;
-
- R.fn = paperproto = Paper.prototype = R.prototype;
- R._id = 0;
- R._oid = 0;
-
- R.is = function (o, type) {
- type = lowerCase.call(type);
- if (type == "finite") {
- return !isnan[has](+o);
- }
- if (type == "array") {
- return o instanceof Array;
- }
- return (type == "null" && o === null) ||
- (type == typeof o && o !== null) ||
- (type == "object" && o === Object(o)) ||
- (type == "array" && Array.isArray && Array.isArray(o)) ||
- objectToString.call(o).slice(8, -1).toLowerCase() == type;
- };
-
- R.angle = function (x1, y1, x2, y2, x3, y3) {
- if (x3 == null) {
- var x = x1 - x2,
- y = y1 - y2;
- if (!x && !y) {
- return 0;
- }
- return (180 + math.atan2(-y, -x) * 180 / PI + 360) % 360;
- } else {
- return R.angle(x1, y1, x3, y3) - R.angle(x2, y2, x3, y3);
- }
- };
-
- R.rad = function (deg) {
- return deg % 360 * PI / 180;
- };
-
- R.deg = function (rad) {
- return rad * 180 / PI % 360;
- };
-
- R.snapTo = function (values, value, tolerance) {
- tolerance = R.is(tolerance, "finite") ? tolerance : 10;
- if (R.is(values, array)) {
- var i = values.length;
- while (i--) if (abs(values[i] - value) <= tolerance) {
- return values[i];
- }
- } else {
- values = +values;
- var rem = value % values;
- if (rem < tolerance) {
- return value - rem;
- }
- if (rem > values - tolerance) {
- return value - rem + values;
- }
- }
- return value;
- };
-
-
- var createUUID = R.createUUID = (function (uuidRegEx, uuidReplacer) {
- return function () {
- return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(uuidRegEx, uuidReplacer).toUpperCase();
- };
- })(/[xy]/g, function (c) {
- var r = math.random() * 16 | 0,
- v = c == "x" ? r : (r & 3 | 8);
- return v.toString(16);
- });
-
-
- R.setWindow = function (newwin) {
- eve("setWindow", R, g.win, newwin);
- g.win = newwin;
- g.doc = g.win.document;
- if (R._engine.initWin) {
- R._engine.initWin(g.win);
- }
- };
- var toHex = function (color) {
- if (R.vml) {
- // http://dean.edwards.name/weblog/2009/10/convert-any-colour-value-to-hex-in-msie/
- var trim = /^\s+|\s+$/g;
- var bod;
- try {
- var docum = new ActiveXObject("htmlfile");
- docum.write("<body>");
- docum.close();
- bod = docum.body;
- } catch(e) {
- bod = createPopup().document.body;
- }
- var range = bod.createTextRange();
- toHex = cacher(function (color) {
- try {
- bod.style.color = Str(color).replace(trim, E);
- var value = range.queryCommandValue("ForeColor");
- value = ((value & 255) << 16) | (value & 65280) | ((value & 16711680) >>> 16);
- return "#" + ("000000" + value.toString(16)).slice(-6);
- } catch(e) {
- return "none";
- }
- });
- } else {
- var i = g.doc.createElement("i");
- i.title = "Rapha\xebl Colour Picker";
- i.style.display = "none";
- g.doc.body.appendChild(i);
- toHex = cacher(function (color) {
- i.style.color = color;
- return g.doc.defaultView.getComputedStyle(i, E).getPropertyValue("color");
- });
- }
- return toHex(color);
- },
- hsbtoString = function () {
- return "hsb(" + [this.h, this.s, this.b] + ")";
- },
- hsltoString = function () {
- return "hsl(" + [this.h, this.s, this.l] + ")";
- },
- rgbtoString = function () {
- return this.hex;
- },
- prepareRGB = function (r, g, b) {
- if (g == null && R.is(r, "object") && "r" in r && "g" in r && "b" in r) {
- b = r.b;
- g = r.g;
- r = r.r;
- }
- if (g == null && R.is(r, string)) {
- var clr = R.getRGB(r);
- r = clr.r;
- g = clr.g;
- b = clr.b;
- }
- if (r > 1 || g > 1 || b > 1) {
- r /= 255;
- g /= 255;
- b /= 255;
- }
-
- return [r, g, b];
- },
- packageRGB = function (r, g, b, o) {
- r *= 255;
- g *= 255;
- b *= 255;
- var rgb = {
- r: r,
- g: g,
- b: b,
- hex: R.rgb(r, g, b),
- toString: rgbtoString
- };
- R.is(o, "finite") && (rgb.opacity = o);
- return rgb;
- };
-
-
- R.color = function (clr) {
- var rgb;
- if (R.is(clr, "object") && "h" in clr && "s" in clr && "b" in clr) {
- rgb = R.hsb2rgb(clr);
- clr.r = rgb.r;
- clr.g = rgb.g;
- clr.b = rgb.b;
- clr.hex = rgb.hex;
- } else if (R.is(clr, "object") && "h" in clr && "s" in clr && "l" in clr) {
- rgb = R.hsl2rgb(clr);
- clr.r = rgb.r;
- clr.g = rgb.g;
- clr.b = rgb.b;
- clr.hex = rgb.hex;
- } else {
- if (R.is(clr, "string")) {
- clr = R.getRGB(clr);
- }
- if (R.is(clr, "object") && "r" in clr && "g" in clr && "b" in clr) {
- rgb = R.rgb2hsl(clr);
- clr.h = rgb.h;
- clr.s = rgb.s;
- clr.l = rgb.l;
- rgb = R.rgb2hsb(clr);
- clr.v = rgb.b;
- } else {
- clr = {hex: "none"};
- clr.r = clr.g = clr.b = clr.h = clr.s = clr.v = clr.l = -1;
- }
- }
- clr.toString = rgbtoString;
- return clr;
- };
-
- R.hsb2rgb = function (h, s, v, o) {
- if (this.is(h, "object") && "h" in h && "s" in h && "b" in h) {
- v = h.b;
- s = h.s;
- h = h.h;
- o = h.o;
- }
- h *= 360;
- var R, G, B, X, C;
- h = (h % 360) / 60;
- C = v * s;
- X = C * (1 - abs(h % 2 - 1));
- R = G = B = v - C;
-
- h = ~~h;
- R += [C, X, 0, 0, X, C][h];
- G += [X, C, C, X, 0, 0][h];
- B += [0, 0, X, C, C, X][h];
- return packageRGB(R, G, B, o);
- };
-
- R.hsl2rgb = function (h, s, l, o) {
- if (this.is(h, "object") && "h" in h && "s" in h && "l" in h) {
- l = h.l;
- s = h.s;
- h = h.h;
- }
- if (h > 1 || s > 1 || l > 1) {
- h /= 360;
- s /= 100;
- l /= 100;
- }
- h *= 360;
- var R, G, B, X, C;
- h = (h % 360) / 60;
- C = 2 * s * (l < .5 ? l : 1 - l);
- X = C * (1 - abs(h % 2 - 1));
- R = G = B = l - C / 2;
-
- h = ~~h;
- R += [C, X, 0, 0, X, C][h];
- G += [X, C, C, X, 0, 0][h];
- B += [0, 0, X, C, C, X][h];
- return packageRGB(R, G, B, o);
- };
-
- R.rgb2hsb = function (r, g, b) {
- b = prepareRGB(r, g, b);
- r = b[0];
- g = b[1];
- b = b[2];
-
- var H, S, V, C;
- V = mmax(r, g, b);
- C = V - mmin(r, g, b);
- H = (C == 0 ? null :
- V == r ? (g - b) / C :
- V == g ? (b - r) / C + 2 :
- (r - g) / C + 4
- );
- H = ((H + 360) % 6) * 60 / 360;
- S = C == 0 ? 0 : C / V;
- return {h: H, s: S, b: V, toString: hsbtoString};
- };
-
- R.rgb2hsl = function (r, g, b) {
- b = prepareRGB(r, g, b);
- r = b[0];
- g = b[1];
- b = b[2];
-
- var H, S, L, M, m, C;
- M = mmax(r, g, b);
- m = mmin(r, g, b);
- C = M - m;
- H = (C == 0 ? null :
- M == r ? (g - b) / C :
- M == g ? (b - r) / C + 2 :
- (r - g) / C + 4);
- H = ((H + 360) % 6) * 60 / 360;
- L = (M + m) / 2;
- S = (C == 0 ? 0 :
- L < .5 ? C / (2 * L) :
- C / (2 - 2 * L));
- return {h: H, s: S, l: L, toString: hsltoString};
- };
- R._path2string = function () {
- return this.join(",").replace(p2s, "$1");
- };
- function repush(array, item) {
- for (var i = 0, ii = array.length; i < ii; i++) if (array[i] === item) {
- return array.push(array.splice(i, 1)[0]);
- }
- }
- function cacher(f, scope, postprocessor) {
- function newf() {
- var arg = Array.prototype.slice.call(arguments, 0),
- args = arg.join("\u2400"),
- cache = newf.cache = newf.cache || {},
- count = newf.count = newf.count || [];
- if (cache[has](args)) {
- repush(count, args);
- return postprocessor ? postprocessor(cache[args]) : cache[args];
- }
- count.length >= 1e3 && delete cache[count.shift()];
- count.push(args);
- cache[args] = f[apply](scope, arg);
- return postprocessor ? postprocessor(cache[args]) : cache[args];
- }
- return newf;
- }
-
- var preload = R._preload = function (src, f) {
- var img = g.doc.createElement("img");
- img.style.cssText = "position:absolute;left:-9999em;top:-9999em";
- img.onload = function () {
- f.call(this);
- this.onload = null;
- g.doc.body.removeChild(this);
- };
- img.onerror = function () {
- g.doc.body.removeChild(this);
- };
- g.doc.body.appendChild(img);
- img.src = src;
- };
-
- function clrToString() {
- return this.hex;
- }
-
-
- R.getRGB = cacher(function (colour) {
- if (!colour || !!((colour = Str(colour)).indexOf("-") + 1)) {
- return {r: -1, g: -1, b: -1, hex: "none", error: 1, toString: clrToString};
- }
- if (colour == "none") {
- return {r: -1, g: -1, b: -1, hex: "none", toString: clrToString};
- }
- !(hsrg[has](colour.toLowerCase().substring(0, 2)) || colour.charAt() == "#") && (colour = toHex(colour));
- var res,
- red,
- green,
- blue,
- opacity,
- t,
- values,
- rgb = colour.match(colourRegExp);
- if (rgb) {
- if (rgb[2]) {
- blue = toInt(rgb[2].substring(5), 16);
- green = toInt(rgb[2].substring(3, 5), 16);
- red = toInt(rgb[2].substring(1, 3), 16);
- }
- if (rgb[3]) {
- blue = toInt((t = rgb[3].charAt(3)) + t, 16);
- green = toInt((t = rgb[3].charAt(2)) + t, 16);
- red = toInt((t = rgb[3].charAt(1)) + t, 16);
- }
- if (rgb[4]) {
- values = rgb[4][split](commaSpaces);
- red = toFloat(values[0]);
- values[0].slice(-1) == "%" && (red *= 2.55);
- green = toFloat(values[1]);
- values[1].slice(-1) == "%" && (green *= 2.55);
- blue = toFloat(values[2]);
- values[2].slice(-1) == "%" && (blue *= 2.55);
- rgb[1].toLowerCase().slice(0, 4) == "rgba" && (opacity = toFloat(values[3]));
- values[3] && values[3].slice(-1) == "%" && (opacity /= 100);
- }
- if (rgb[5]) {
- values = rgb[5][split](commaSpaces);
- red = toFloat(values[0]);
- values[0].slice(-1) == "%" && (red *= 2.55);
- green = toFloat(values[1]);
- values[1].slice(-1) == "%" && (green *= 2.55);
- blue = toFloat(values[2]);
- values[2].slice(-1) == "%" && (blue *= 2.55);
- (values[0].slice(-3) == "deg" || values[0].slice(-1) == "\xb0") && (red /= 360);
- rgb[1].toLowerCase().slice(0, 4) == "hsba" && (opacity = toFloat(values[3]));
- values[3] && values[3].slice(-1) == "%" && (opacity /= 100);
- return R.hsb2rgb(red, green, blue, opacity);
- }
- if (rgb[6]) {
- values = rgb[6][split](commaSpaces);
- red = toFloat(values[0]);
- values[0].slice(-1) == "%" && (red *= 2.55);
- green = toFloat(values[1]);
- values[1].slice(-1) == "%" && (green *= 2.55);
- blue = toFloat(values[2]);
- values[2].slice(-1) == "%" && (blue *= 2.55);
- (values[0].slice(-3) == "deg" || values[0].slice(-1) == "\xb0") && (red /= 360);
- rgb[1].toLowerCase().slice(0, 4) == "hsla" && (opacity = toFloat(values[3]));
- values[3] && values[3].slice(-1) == "%" && (opacity /= 100);
- return R.hsl2rgb(red, green, blue, opacity);
- }
- rgb = {r: red, g: green, b: blue, toString: clrToString};
- rgb.hex = "#" + (16777216 | blue | (green << 8) | (red << 16)).toString(16).slice(1);
- R.is(opacity, "finite") && (rgb.opacity = opacity);
- return rgb;
- }
- return {r: -1, g: -1, b: -1, hex: "none", error: 1, toString: clrToString};
- }, R);
-
- R.hsb = cacher(function (h, s, b) {
- return R.hsb2rgb(h, s, b).hex;
- });
-
- R.hsl = cacher(function (h, s, l) {
- return R.hsl2rgb(h, s, l).hex;
- });
-
- R.rgb = cacher(function (r, g, b) {
- return "#" + (16777216 | b | (g << 8) | (r << 16)).toString(16).slice(1);
- });
-
- R.getColor = function (value) {
- var start = this.getColor.start = this.getColor.start || {h: 0, s: 1, b: value || .75},
- rgb = this.hsb2rgb(start.h, start.s, start.b);
- start.h += .075;
- if (start.h > 1) {
- start.h = 0;
- start.s -= .2;
- start.s <= 0 && (this.getColor.start = {h: 0, s: 1, b: start.b});
- }
- return rgb.hex;
- };
-
- R.getColor.reset = function () {
- delete this.start;
- };
-
- // http://schepers.cc/getting-to-the-point
- function catmullRom2bezier(crp, z) {
- var d = [];
- for (var i = 0, iLen = crp.length; iLen - 2 * !z > i; i += 2) {
- var p = [
- {x: +crp[i - 2], y: +crp[i - 1]},
- {x: +crp[i], y: +crp[i + 1]},
- {x: +crp[i + 2], y: +crp[i + 3]},
- {x: +crp[i + 4], y: +crp[i + 5]}
- ];
- if (z) {
- if (!i) {
- p[0] = {x: +crp[iLen - 2], y: +crp[iLen - 1]};
- } else if (iLen - 4 == i) {
- p[3] = {x: +crp[0], y: +crp[1]};
- } else if (iLen - 2 == i) {
- p[2] = {x: +crp[0], y: +crp[1]};
- p[3] = {x: +crp[2], y: +crp[3]};
- }
- } else {
- if (iLen - 4 == i) {
- p[3] = p[2];
- } else if (!i) {
- p[0] = {x: +crp[i], y: +crp[i + 1]};
- }
- }
- d.push(["C",
- (-p[0].x + 6 * p[1].x + p[2].x) / 6,
- (-p[0].y + 6 * p[1].y + p[2].y) / 6,
- (p[1].x + 6 * p[2].x - p[3].x) / 6,
- (p[1].y + 6*p[2].y - p[3].y) / 6,
- p[2].x,
- p[2].y
- ]);
- }
-
- return d;
- }
-
- R.parsePathString = cacher(function (pathString) {
- if (!pathString) {
- return null;
- }
- var paramCounts = {a: 7, c: 6, h: 1, l: 2, m: 2, r: 4, q: 4, s: 4, t: 2, v: 1, z: 0},
- data = [];
- if (R.is(pathString, array) && R.is(pathString[0], array)) { // rough assumption
- data = pathClone(pathString);
- }
- if (!data.length) {
- Str(pathString).replace(pathCommand, function (a, b, c) {
- var params = [],
- name = b.toLowerCase();
- c.replace(pathValues, function (a, b) {
- b && params.push(+b);
- });
- if (name == "m" && params.length > 2) {
- data.push([b][concat](params.splice(0, 2)));
- name = "l";
- b = b == "m" ? "l" : "L";
- }
- if (name == "r") {
- data.push([b][concat](params));
- } else while (params.length >= paramCounts[name]) {
- data.push([b][concat](params.splice(0, paramCounts[name])));
- if (!paramCounts[name]) {
- break;
- }
- }
- });
- }
- data.toString = R._path2string;
- return data;
- });
-
- R.parseTransformString = cacher(function (TString) {
- if (!TString) {
- return null;
- }
- var paramCounts = {r: 3, s: 4, t: 2, m: 6},
- data = [];
- if (R.is(TString, array) && R.is(TString[0], array)) { // rough assumption
- data = pathClone(TString);
- }
- if (!data.length) {
- Str(TString).replace(tCommand, function (a, b, c) {
- var params = [],
- name = lowerCase.call(b);
- c.replace(pathValues, function (a, b) {
- b && params.push(+b);
- });
- data.push([b][concat](params));
- });
- }
- data.toString = R._path2string;
- return data;
- });
-
- R.findDotsAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {
- var t1 = 1 - t,
- t13 = pow(t1, 3),
- t12 = pow(t1, 2),
- t2 = t * t,
- t3 = t2 * t,
- x = t13 * p1x + t12 * 3 * t * c1x + t1 * 3 * t * t * c2x + t3 * p2x,
- y = t13 * p1y + t12 * 3 * t * c1y + t1 * 3 * t * t * c2y + t3 * p2y,
- mx = p1x + 2 * t * (c1x - p1x) + t2 * (c2x - 2 * c1x + p1x),
- my = p1y + 2 * t * (c1y - p1y) + t2 * (c2y - 2 * c1y + p1y),
- nx = c1x + 2 * t * (c2x - c1x) + t2 * (p2x - 2 * c2x + c1x),
- ny = c1y + 2 * t * (c2y - c1y) + t2 * (p2y - 2 * c2y + c1y),
- ax = t1 * p1x + t * c1x,
- ay = t1 * p1y + t * c1y,
- cx = t1 * c2x + t * p2x,
- cy = t1 * c2y + t * p2y,
- alpha = (90 - math.atan2(mx - nx, my - ny) * 180 / PI);
- (mx > nx || my < ny) && (alpha += 180);
- return {
- x: x,
- y: y,
- m: {x: mx, y: my},
- n: {x: nx, y: ny},
- start: {x: ax, y: ay},
- end: {x: cx, y: cy},
- alpha: alpha
- };
- };
- R._removedFactory = function (methodname) {
- return function () {
- throw new Error("Rapha\xebl: you are calling to method \u201c" + methodname + "\u201d of removed object");
- };
- };
- var pathDimensions = cacher(function (path) {
- if (!path) {
- return {x: 0, y: 0, width: 0, height: 0};
- }
- path = path2curve(path);
- var x = 0,
- y = 0,
- X = [],
- Y = [],
- p;
- for (var i = 0, ii = path.length; i < ii; i++) {
- p = path[i];
- if (p[0] == "M") {
- x = p[1];
- y = p[2];
- X.push(x);
- Y.push(y);
- } else {
- var dim = curveDim(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);
- X = X[concat](dim.min.x, dim.max.x);
- Y = Y[concat](dim.min.y, dim.max.y);
- x = p[5];
- y = p[6];
- }
- }
- var xmin = mmin[apply](0, X),
- ymin = mmin[apply](0, Y);
- return {
- x: xmin,
- y: ymin,
- width: mmax[apply](0, X) - xmin,
- height: mmax[apply](0, Y) - ymin
- };
- }, null, function (o) {
- return {
- x: o.x,
- y: o.y,
- width: o.width,
- height: o.height
- };
- }),
- pathClone = function (pathArray) {
- var res = [];
- if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption
- pathArray = R.parsePathString(pathArray);
- }
- for (var i = 0, ii = pathArray.length; i < ii; i++) {
- res[i] = [];
- for (var j = 0, jj = pathArray[i].length; j < jj; j++) {
- res[i][j] = pathArray[i][j];
- }
- }
- res.toString = R._path2string;
- return res;
- },
- pathToRelative = R._pathToRelative = cacher(function (pathArray) {
- if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption
- pathArray = R.parsePathString(pathArray);
- }
- var res = [],
- x = 0,
- y = 0,
- mx = 0,
- my = 0,
- start = 0;
- if (pathArray[0][0] == "M") {
- x = pathArray[0][1];
- y = pathArray[0][2];
- mx = x;
- my = y;
- start++;
- res.push(["M", x, y]);
- }
- for (var i = start, ii = pathArray.length; i < ii; i++) {
- var r = res[i] = [],
- pa = pathArray[i];
- if (pa[0] != lowerCase.call(pa[0])) {
- r[0] = lowerCase.call(pa[0]);
- switch (r[0]) {
- case "a":
- r[1] = pa[1];
- r[2] = pa[2];
- r[3] = pa[3];
- r[4] = pa[4];
- r[5] = pa[5];
- r[6] = +(pa[6] - x).toFixed(3);
- r[7] = +(pa[7] - y).toFixed(3);
- break;
- case "v":
- r[1] = +(pa[1] - y).toFixed(3);
- break;
- case "m":
- mx = pa[1];
- my = pa[2];
- default:
- for (var j = 1, jj = pa.length; j < jj; j++) {
- r[j] = +(pa[j] - ((j % 2) ? x : y)).toFixed(3);
- }
- }
- } else {
- r = res[i] = [];
- if (pa[0] == "m") {
- mx = pa[1] + x;
- my = pa[2] + y;
- }
- for (var k = 0, kk = pa.length; k < kk; k++) {
- res[i][k] = pa[k];
- }
- }
- var len = res[i].length;
- switch (res[i][0]) {
- case "z":
- x = mx;
- y = my;
- break;
- case "h":
- x += +res[i][len - 1];
- break;
- case "v":
- y += +res[i][len - 1];
- break;
- default:
- x += +res[i][len - 2];
- y += +res[i][len - 1];
- }
- }
- res.toString = R._path2string;
- return res;
- }, 0, pathClone),
- pathToAbsolute = R._pathToAbsolute = cacher(function (pathArray) {
- if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption
- pathArray = R.parsePathString(pathArray);
- }
- if (!pathArray || !pathArray.length) {
- return [["M", 0, 0]];
- }
- var res = [],
- x = 0,
- y = 0,
- mx = 0,
- my = 0,
- start = 0;
- if (pathArray[0][0] == "M") {
- x = +pathArray[0][1];
- y = +pathArray[0][2];
- mx = x;
- my = y;
- start++;
- res[0] = ["M", x, y];
- }
- var crz = pathArray.length == 3 && pathArray[0][0] == "M" && pathArray[1][0].toUpperCase() == "R" && pathArray[2][0].toUpperCase() == "Z";
- for (var r, pa, i = start, ii = pathArray.length; i < ii; i++) {
- res.push(r = []);
- pa = pathArray[i];
- if (pa[0] != upperCase.call(pa[0])) {
- r[0] = upperCase.call(pa[0]);
- switch (r[0]) {
- case "A":
- r[1] = pa[1];
- r[2] = pa[2];
- r[3] = pa[3];
- r[4] = pa[4];
- r[5] = pa[5];
- r[6] = +(pa[6] + x);
- r[7] = +(pa[7] + y);
- break;
- case "V":
- r[1] = +pa[1] + y;
- break;
- case "H":
- r[1] = +pa[1] + x;
- break;
- case "R":
- var dots = [x, y][concat](pa.slice(1));
- for (var j = 2, jj = dots.length; j < jj; j++) {
- dots[j] = +dots[j] + x;
- dots[++j] = +dots[j] + y;
- }
- res.pop();
- res = res[concat](catmullRom2bezier(dots, crz));
- break;
- case "M":
- mx = +pa[1] + x;
- my = +pa[2] + y;
- default:
- for (j = 1, jj = pa.length; j < jj; j++) {
- r[j] = +pa[j] + ((j % 2) ? x : y);
- }
- }
- } else if (pa[0] == "R") {
- dots = [x, y][concat](pa.slice(1));
- res.pop();
- res = res[concat](catmullRom2bezier(dots, crz));
- r = ["R"][concat](pa.slice(-2));
- } else {
- for (var k = 0, kk = pa.length; k < kk; k++) {
- r[k] = pa[k];
- }
- }
- switch (r[0]) {
- case "Z":
- x = mx;
- y = my;
- break;
- case "H":
- x = r[1];
- break;
- case "V":
- y = r[1];
- break;
- case "M":
- mx = r[r.length - 2];
- my = r[r.length - 1];
- default:
- x = r[r.length - 2];
- y = r[r.length - 1];
- }
- }
- res.toString = R._path2string;
- return res;
- }, null, pathClone),
- l2c = function (x1, y1, x2, y2) {
- return [x1, y1, x2, y2, x2, y2];
- },
- q2c = function (x1, y1, ax, ay, x2, y2) {
- var _13 = 1 / 3,
- _23 = 2 / 3;
- return [
- _13 * x1 + _23 * ax,
- _13 * y1 + _23 * ay,
- _13 * x2 + _23 * ax,
- _13 * y2 + _23 * ay,
- x2,
- y2
- ];
- },
- a2c = function (x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) {
- // for more information of where this math came from visit:
- // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes
- var _120 = PI * 120 / 180,
- rad = PI / 180 * (+angle || 0),
- res = [],
- xy,
- rotate = cacher(function (x, y, rad) {
- var X = x * math.cos(rad) - y * math.sin(rad),
- Y = x * math.sin(rad) + y * math.cos(rad);
- return {x: X, y: Y};
- });
- if (!recursive) {
- xy = rotate(x1, y1, -rad);
- x1 = xy.x;
- y1 = xy.y;
- xy = rotate(x2, y2, -rad);
- x2 = xy.x;
- y2 = xy.y;
- var cos = math.cos(PI / 180 * angle),
- sin = math.sin(PI / 180 * angle),
- x = (x1 - x2) / 2,
- y = (y1 - y2) / 2;
- var h = (x * x) / (rx * rx) + (y * y) / (ry * ry);
- if (h > 1) {
- h = math.sqrt(h);
- rx = h * rx;
- ry = h * ry;
- }
- var rx2 = rx * rx,
- ry2 = ry * ry,
- k = (large_arc_flag == sweep_flag ? -1 : 1) *
- math.sqrt(abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))),
- cx = k * rx * y / ry + (x1 + x2) / 2,
- cy = k * -ry * x / rx + (y1 + y2) / 2,
- f1 = math.asin(((y1 - cy) / ry).toFixed(9)),
- f2 = math.asin(((y2 - cy) / ry).toFixed(9));
-
- f1 = x1 < cx ? PI - f1 : f1;
- f2 = x2 < cx ? PI - f2 : f2;
- f1 < 0 && (f1 = PI * 2 + f1);
- f2 < 0 && (f2 = PI * 2 + f2);
- if (sweep_flag && f1 > f2) {
- f1 = f1 - PI * 2;
- }
- if (!sweep_flag && f2 > f1) {
- f2 = f2 - PI * 2;
- }
- } else {
- f1 = recursive[0];
- f2 = recursive[1];
- cx = recursive[2];
- cy = recursive[3];
- }
- var df = f2 - f1;
- if (abs(df) > _120) {
- var f2old = f2,
- x2old = x2,
- y2old = y2;
- f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1);
- x2 = cx + rx * math.cos(f2);
- y2 = cy + ry * math.sin(f2);
- res = a2c(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]);
- }
- df = f2 - f1;
- var c1 = math.cos(f1),
- s1 = math.sin(f1),
- c2 = math.cos(f2),
- s2 = math.sin(f2),
- t = math.tan(df / 4),
- hx = 4 / 3 * rx * t,
- hy = 4 / 3 * ry * t,
- m1 = [x1, y1],
- m2 = [x1 + hx * s1, y1 - hy * c1],
- m3 = [x2 + hx * s2, y2 - hy * c2],
- m4 = [x2, y2];
- m2[0] = 2 * m1[0] - m2[0];
- m2[1] = 2 * m1[1] - m2[1];
- if (recursive) {
- return [m2, m3, m4][concat](res);
- } else {
- res = [m2, m3, m4][concat](res).join()[split](",");
- var newres = [];
- for (var i = 0, ii = res.length; i < ii; i++) {
- newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x;
- }
- return newres;
- }
- },
- findDotAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {
- var t1 = 1 - t;
- return {
- x: pow(t1, 3) * p1x + pow(t1, 2) * 3 * t * c1x + t1 * 3 * t * t * c2x + pow(t, 3) * p2x,
- y: pow(t1, 3) * p1y + pow(t1, 2) * 3 * t * c1y + t1 * 3 * t * t * c2y + pow(t, 3) * p2y
- };
- },
- curveDim = cacher(function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {
- var a = (c2x - 2 * c1x + p1x) - (p2x - 2 * c2x + c1x),
- b = 2 * (c1x - p1x) - 2 * (c2x - c1x),
- c = p1x - c1x,
- t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a,
- t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a,
- y = [p1y, p2y],
- x = [p1x, p2x],
- dot;
- abs(t1) > "1e12" && (t1 = .5);
- abs(t2) > "1e12" && (t2 = .5);
- if (t1 > 0 && t1 < 1) {
- dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1);
- x.push(dot.x);
- y.push(dot.y);
- }
- if (t2 > 0 && t2 < 1) {
- dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2);
- x.push(dot.x);
- y.push(dot.y);
- }
- a = (c2y - 2 * c1y + p1y) - (p2y - 2 * c2y + c1y);
- b = 2 * (c1y - p1y) - 2 * (c2y - c1y);
- c = p1y - c1y;
- t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a;
- t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a;
- abs(t1) > "1e12" && (t1 = .5);
- abs(t2) > "1e12" && (t2 = .5);
- if (t1 > 0 && t1 < 1) {
- dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1);
- x.push(dot.x);
- y.push(dot.y);
- }
- if (t2 > 0 && t2 < 1) {
- dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2);
- x.push(dot.x);
- y.push(dot.y);
- }
- return {
- min: {x: mmin[apply](0, x), y: mmin[apply](0, y)},
- max: {x: mmax[apply](0, x), y: mmax[apply](0, y)}
- };
- }),
- path2curve = R._path2curve = cacher(function (path, path2) {
- var p = pathToAbsolute(path),
- p2 = path2 && pathToAbsolute(path2),
- attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},
- attrs2 = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},
- processPath = function (path, d) {
- var nx, ny;
- if (!path) {
- return ["C", d.x, d.y, d.x, d.y, d.x, d.y];
- }
- !(path[0] in {T:1, Q:1}) && (d.qx = d.qy = null);
- switch (path[0]) {
- case "M":
- d.X = path[1];
- d.Y = path[2];
- break;
- case "A":
- path = ["C"][concat](a2c[apply](0, [d.x, d.y][concat](path.slice(1))));
- break;
- case "S":
- nx = d.x + (d.x - (d.bx || d.x));
- ny = d.y + (d.y - (d.by || d.y));
- path = ["C", nx, ny][concat](path.slice(1));
- break;
- case "T":
- d.qx = d.x + (d.x - (d.qx || d.x));
- d.qy = d.y + (d.y - (d.qy || d.y));
- path = ["C"][concat](q2c(d.x, d.y, d.qx, d.qy, path[1], path[2]));
- break;
- case "Q":
- d.qx = path[1];
- d.qy = path[2];
- path = ["C"][concat](q2c(d.x, d.y, path[1], path[2], path[3], path[4]));
- break;
- case "L":
- path = ["C"][concat](l2c(d.x, d.y, path[1], path[2]));
- break;
- case "H":
- path = ["C"][concat](l2c(d.x, d.y, path[1], d.y));
- break;
- case "V":
- path = ["C"][concat](l2c(d.x, d.y, d.x, path[1]));
- break;
- case "Z":
- path = ["C"][concat](l2c(d.x, d.y, d.X, d.Y));
- break;
- }
- return path;
- },
- fixArc = function (pp, i) {
- if (pp[i].length > 7) {
- pp[i].shift();
- var pi = pp[i];
- while (pi.length) {
- pp.splice(i++, 0, ["C"][concat](pi.splice(0, 6)));
- }
- pp.splice(i, 1);
- ii = mmax(p.length, p2 && p2.length || 0);
- }
- },
- fixM = function (path1, path2, a1, a2, i) {
- if (path1 && path2 && path1[i][0] == "M" && path2[i][0] != "M") {
- path2.splice(i, 0, ["M", a2.x, a2.y]);
- a1.bx = 0;
- a1.by = 0;
- a1.x = path1[i][1];
- a1.y = path1[i][2];
- ii = mmax(p.length, p2 && p2.length || 0);
- }
- };
- for (var i = 0, ii = mmax(p.length, p2 && p2.length || 0); i < ii; i++) {
- p[i] = processPath(p[i], attrs);
- fixArc(p, i);
- p2 && (p2[i] = processPath(p2[i], attrs2));
- p2 && fixArc(p2, i);
- fixM(p, p2, attrs, attrs2, i);
- fixM(p2, p, attrs2, attrs, i);
- var seg = p[i],
- seg2 = p2 && p2[i],
- seglen = seg.length,
- seg2len = p2 && seg2.length;
- attrs.x = seg[seglen - 2];
- attrs.y = seg[seglen - 1];
- attrs.bx = toFloat(seg[seglen - 4]) || attrs.x;
- attrs.by = toFloat(seg[seglen - 3]) || attrs.y;
- attrs2.bx = p2 && (toFloat(seg2[seg2len - 4]) || attrs2.x);
- attrs2.by = p2 && (toFloat(seg2[seg2len - 3]) || attrs2.y);
- attrs2.x = p2 && seg2[seg2len - 2];
- attrs2.y = p2 && seg2[seg2len - 1];
- }
- return p2 ? [p, p2] : p;
- }, null, pathClone),
- parseDots = R._parseDots = cacher(function (gradient) {
- var dots = [];
- for (var i = 0, ii = gradient.length; i < ii; i++) {
- var dot = {},
- par = gradient[i].match(/^([^:]*):?([\d\.]*)/);
- dot.color = R.getRGB(par[1]);
- if (dot.color.error) {
- return null;
- }
- dot.color = dot.color.hex;
- par[2] && (dot.offset = par[2] + "%");
- dots.push(dot);
- }
- for (i = 1, ii = dots.length - 1; i < ii; i++) {
- if (!dots[i].offset) {
- var start = toFloat(dots[i - 1].offset || 0),
- end = 0;
- for (var j = i + 1; j < ii; j++) {
- if (dots[j].offset) {
- end = dots[j].offset;
- break;
- }
- }
- if (!end) {
- end = 100;
- j = ii;
- }
- end = toFloat(end);
- var d = (end - start) / (j - i + 1);
- for (; i < j; i++) {
- start += d;
- dots[i].offset = start + "%";
- }
- }
- }
- return dots;
- }),
- tear = R._tear = function (el, paper) {
- el == paper.top && (paper.top = el.prev);
- el == paper.bottom && (paper.bottom = el.next);
- el.next && (el.next.prev = el.prev);
- el.prev && (el.prev.next = el.next);
- },
- tofront = R._tofront = function (el, paper) {
- if (paper.top === el) {
- return;
- }
- tear(el, paper);
- el.next = null;
- el.prev = paper.top;
- paper.top.next = el;
- paper.top = el;
- },
- toback = R._toback = function (el, paper) {
- if (paper.bottom === el) {
- return;
- }
- tear(el, paper);
- el.next = paper.bottom;
- el.prev = null;
- paper.bottom.prev = el;
- paper.bottom = el;
- },
- insertafter = R._insertafter = function (el, el2, paper) {
- tear(el, paper);
- el2 == paper.top && (paper.top = el);
- el2.next && (el2.next.prev = el);
- el.next = el2.next;
- el.prev = el2;
- el2.next = el;
- },
- insertbefore = R._insertbefore = function (el, el2, paper) {
- tear(el, paper);
- el2 == paper.bottom && (paper.bottom = el);
- el2.prev && (el2.prev.next = el);
- el.prev = el2.prev;
- el2.prev = el;
- el.next = el2;
- },
- extractTransform = R._extractTransform = function (el, tstr) {
- if (tstr == null) {
- return el._.transform;
- }
- tstr = Str(tstr).replace(/\.{3}|\u2026/g, el._.transform || E);
- var tdata = R.parseTransformString(tstr),
- deg = 0,
- dx = 0,
- dy = 0,
- sx = 1,
- sy = 1,
- _ = el._,
- m = new Matrix;
- _.transform = tdata || [];
- if (tdata) {
- for (var i = 0, ii = tdata.length; i < ii; i++) {
- var t = tdata[i],
- tlen = t.length,
- command = Str(t[0]).toLowerCase(),
- absolute = t[0] != command,
- inver = absolute ? m.invert() : 0,
- x1,
- y1,
- x2,
- y2,
- bb;
- if (command == "t" && tlen == 3) {
- if (absolute) {
- x1 = inver.x(0, 0);
- y1 = inver.y(0, 0);
- x2 = inver.x(t[1], t[2]);
- y2 = inver.y(t[1], t[2]);
- m.translate(x2 - x1, y2 - y1);
- } else {
- m.translate(t[1], t[2]);
- }
- } else if (command == "r") {
- if (tlen == 2) {
- bb = bb || el.getBBox(1);
- m.rotate(t[1], bb.x + bb.width / 2, bb.y + bb.height / 2);
- deg += t[1];
- } else if (tlen == 4) {
- if (absolute) {
- x2 = inver.x(t[2], t[3]);
- y2 = inver.y(t[2], t[3]);
- m.rotate(t[1], x2, y2);
- } else {
- m.rotate(t[1], t[2], t[3]);
- }
- deg += t[1];
- }
- } else if (command == "s") {
- if (tlen == 2 || tlen == 3) {
- bb = bb || el.getBBox(1);
- m.scale(t[1], t[tlen - 1], bb.x + bb.width / 2, bb.y + bb.height / 2);
- sx *= t[1];
- sy *= t[tlen - 1];
- } else if (tlen == 5) {
- if (absolute) {
- x2 = inver.x(t[3], t[4]);
- y2 = inver.y(t[3], t[4]);
- m.scale(t[1], t[2], x2, y2);
- } else {
- m.scale(t[1], t[2], t[3], t[4]);
- }
- sx *= t[1];
- sy *= t[2];
- }
- } else if (command == "m" && tlen == 7) {
- m.add(t[1], t[2], t[3], t[4], t[5], t[6]);
- }
- _.dirtyT = 1;
- el.matrix = m;
- }
- }
-
- el.matrix = m;
-
- _.sx = sx;
- _.sy = sy;
- _.deg = deg;
- _.dx = dx = m.e;
- _.dy = dy = m.f;
-
- if (sx == 1 && sy == 1 && !deg && _.bbox) {
- _.bbox.x += +dx;
- _.bbox.y += +dy;
- } else {
- _.dirtyT = 1;
- }
- },
- getEmpty = function (item) {
- var l = item[0];
- switch (l.toLowerCase()) {
- case "t": return [l, 0, 0];
- case "m": return [l, 1, 0, 0, 1, 0, 0];
- case "r": if (item.length == 4) {
- return [l, 0, item[2], item[3]];
- } else {
- return [l, 0];
- }
- case "s": if (item.length == 5) {
- return [l, 1, 1, item[3], item[4]];
- } else if (item.length == 3) {
- return [l, 1, 1];
- } else {
- return [l, 1];
- }
- }
- },
- equaliseTransform = R._equaliseTransform = function (t1, t2) {
- t2 = Str(t2).replace(/\.{3}|\u2026/g, t1);
- t1 = R.parseTransformString(t1) || [];
- t2 = R.parseTransformString(t2) || [];
- var maxlength = mmax(t1.length, t2.length),
- from = [],
- to = [],
- i = 0, j, jj,
- tt1, tt2;
- for (; i < maxlength; i++) {
- tt1 = t1[i] || getEmpty(t2[i]);
- tt2 = t2[i] || getEmpty(tt1);
- if ((tt1[0] != tt2[0]) ||
- (tt1[0].toLowerCase() == "r" && (tt1[2] != tt2[2] || tt1[3] != tt2[3])) ||
- (tt1[0].toLowerCase() == "s" && (tt1[3] != tt2[3] || tt1[4] != tt2[4]))
- ) {
- return;
- }
- from[i] = [];
- to[i] = [];
- for (j = 0, jj = mmax(tt1.length, tt2.length); j < jj; j++) {
- j in tt1 && (from[i][j] = tt1[j]);
- j in tt2 && (to[i][j] = tt2[j]);
- }
- }
- return {
- from: from,
- to: to
- };
- };
- R._getContainer = function (x, y, w, h) {
- var container;
- container = h == null && !R.is(x, "object") ? g.doc.getElementById(x) : x;
- if (container == null) {
- return;
- }
- if (container.tagName) {
- if (y == null) {
- return {
- container: container,
- width: container.style.pixelWidth || container.offsetWidth,
- height: container.style.pixelHeight || container.offsetHeight
- };
- } else {
- return {
- container: container,
- width: y,
- height: w
- };
- }
- }
- return {
- container: 1,
- x: x,
- y: y,
- width: w,
- height: h
- };
- };
-
- R.pathToRelative = pathToRelative;
- R._engine = {};
-
- R.path2curve = path2curve;
-
- R.matrix = function (a, b, c, d, e, f) {
- return new Matrix(a, b, c, d, e, f);
- };
- function Matrix(a, b, c, d, e, f) {
- if (a != null) {
- this.a = +a;
- this.b = +b;
- this.c = +c;
- this.d = +d;
- this.e = +e;
- this.f = +f;
- } else {
- this.a = 1;
- this.b = 0;
- this.c = 0;
- this.d = 1;
- this.e = 0;
- this.f = 0;
- }
- }
- (function (matrixproto) {
-
- matrixproto.add = function (a, b, c, d, e, f) {
- var out = [[], [], []],
- m = [[this.a, this.c, this.e], [this.b, this.d, this.f], [0, 0, 1]],
- matrix = [[a, c, e], [b, d, f], [0, 0, 1]],
- x, y, z, res;
-
- if (a && a instanceof Matrix) {
- matrix = [[a.a, a.c, a.e], [a.b, a.d, a.f], [0, 0, 1]];
- }
-
- for (x = 0; x < 3; x++) {
- for (y = 0; y < 3; y++) {
- res = 0;
- for (z = 0; z < 3; z++) {
- res += m[x][z] * matrix[z][y];
- }
- out[x][y] = res;
- }
- }
- this.a = out[0][0];
- this.b = out[1][0];
- this.c = out[0][1];
- this.d = out[1][1];
- this.e = out[0][2];
- this.f = out[1][2];
- };
-
- matrixproto.invert = function () {
- var me = this,
- x = me.a * me.d - me.b * me.c;
- return new Matrix(me.d / x, -me.b / x, -me.c / x, me.a / x, (me.c * me.f - me.d * me.e) / x, (me.b * me.e - me.a * me.f) / x);
- };
-
- matrixproto.clone = function () {
- return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f);
- };
-
- matrixproto.translate = function (x, y) {
- this.add(1, 0, 0, 1, x, y);
- };
-
- matrixproto.scale = function (x, y, cx, cy) {
- y == null && (y = x);
- (cx || cy) && this.add(1, 0, 0, 1, cx, cy);
- this.add(x, 0, 0, y, 0, 0);
- (cx || cy) && this.add(1, 0, 0, 1, -cx, -cy);
- };
-
- matrixproto.rotate = function (a, x, y) {
- a = R.rad(a);
- x = x || 0;
- y = y || 0;
- var cos = +math.cos(a).toFixed(9),
- sin = +math.sin(a).toFixed(9);
- this.add(cos, sin, -sin, cos, x, y);
- this.add(1, 0, 0, 1, -x, -y);
- };
-
- matrixproto.x = function (x, y) {
- return x * this.a + y * this.c + this.e;
- };
-
- matrixproto.y = function (x, y) {
- return x * this.b + y * this.d + this.f;
- };
- matrixproto.get = function (i) {
- return +this[Str.fromCharCode(97 + i)].toFixed(4);
- };
- matrixproto.toString = function () {
- return R.svg ?
- "matrix(" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)].join() + ")" :
- [this.get(0), this.get(2), this.get(1), this.get(3), 0, 0].join();
- };
- matrixproto.toFilter = function () {
- return "progid:DXImageTransform.Microsoft.Matrix(M11=" + this.get(0) +
- ", M12=" + this.get(2) + ", M21=" + this.get(1) + ", M22=" + this.get(3) +
- ", Dx=" + this.get(4) + ", Dy=" + this.get(5) + ", sizingmethod='auto expand')";
- };
- matrixproto.offset = function () {
- return [this.e.toFixed(4), this.f.toFixed(4)];
- };
- function norm(a) {
- return a[0] * a[0] + a[1] * a[1];
- }
- function normalize(a) {
- var mag = math.sqrt(norm(a));
- a[0] && (a[0] /= mag);
- a[1] && (a[1] /= mag);
- }
-
- matrixproto.split = function () {
- var out = {};
- // translation
- out.dx = this.e;
- out.dy = this.f;
-
- // scale and shear
- var row = [[this.a, this.c], [this.b, this.d]];
- out.scalex = math.sqrt(norm(row[0]));
- normalize(row[0]);
-
- out.shear = row[0][0] * row[1][0] + row[0][1] * row[1][1];
- row[1] = [row[1][0] - row[0][0] * out.shear, row[1][1] - row[0][1] * out.shear];
-
- out.scaley = math.sqrt(norm(row[1]));
- normalize(row[1]);
- out.shear /= out.scaley;
-
- // rotation
- var sin = -row[0][1],
- cos = row[1][1];
- if (cos < 0) {
- out.rotate = R.deg(math.acos(cos));
- if (sin < 0) {
- out.rotate = 360 - out.rotate;
- }
- } else {
- out.rotate = R.deg(math.asin(sin));
- }
-
- out.isSimple = !+out.shear.toFixed(9) && (out.scalex.toFixed(9) == out.scaley.toFixed(9) || !out.rotate);
- out.isSuperSimple = !+out.shear.toFixed(9) && out.scalex.toFixed(9) == out.scaley.toFixed(9) && !out.rotate;
- out.noRotation = !+out.shear.toFixed(9) && !out.rotate;
- return out;
- };
-
- matrixproto.toTransformString = function (shorter) {
- var s = shorter || this[split]();
- if (s.isSimple) {
- s.scalex = +s.scalex.toFixed(4);
- s.scaley = +s.scaley.toFixed(4);
- s.rotate = +s.rotate.toFixed(4);
- return (s.dx || s.dy ? "t" + [s.dx, s.dy] : E) +
- (s.scalex != 1 || s.scaley != 1 ? "s" + [s.scalex, s.scaley, 0, 0] : E) +
- (s.rotate ? "r" + [s.rotate, 0, 0] : E);
- } else {
- return "m" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)];
- }
- };
- })(Matrix.prototype);
-
- // WebKit rendering bug workaround method
- var version = navigator.userAgent.match(/Version\/(.*?)\s/) || navigator.userAgent.match(/Chrome\/(\d+)/);
- if ((navigator.vendor == "Apple Computer, Inc.") && (version && version[1] < 4 || navigator.platform.slice(0, 2) == "iP") ||
- (navigator.vendor == "Google Inc." && version && version[1] < 8)) {
-
- paperproto.safari = function () {
- var rect = this.rect(-99, -99, this.width + 99, this.height + 99).attr({stroke: "none"});
- setTimeout(function () {rect.remove();});
- };
- } else {
- paperproto.safari = fun;
- }
-
- var preventDefault = function () {
- this.returnValue = false;
- },
- preventTouch = function () {
- return this.originalEvent.preventDefault();
- },
- stopPropagation = function () {
- this.cancelBubble = true;
- },
- stopTouch = function () {
- return this.originalEvent.stopPropagation();
- },
- addEvent = (function () {
- if (g.doc.addEventListener) {
- return function (obj, type, fn, element) {
- var realName = supportsTouch && touchMap[type] ? touchMap[type] : type,
- f = function (e) {
- var scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop,
- scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft,
- x = e.clientX + scrollX,
- y = e.clientY + scrollY;
- if (supportsTouch && touchMap[has](type)) {
- for (var i = 0, ii = e.targetTouches && e.targetTouches.length; i < ii; i++) {
- if (e.targetTouches[i].target == obj) {
- var olde = e;
- e = e.targetTouches[i];
- e.originalEvent = olde;
- e.preventDefault = preventTouch;
- e.stopPropagation = stopTouch;
- break;
- }
- }
- }
- return fn.call(element, e, x, y);
- };
- obj.addEventListener(realName, f, false);
- return function () {
- obj.removeEventListener(realName, f, false);
- return true;
- };
- };
- } else if (g.doc.attachEvent) {
- return function (obj, type, fn, element) {
- var f = function (e) {
- e = e || g.win.event;
- var scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop,
- scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft,
- x = e.clientX + scrollX,
- y = e.clientY + scrollY;
- e.preventDefault = e.preventDefault || preventDefault;
- e.stopPropagation = e.stopPropagation || stopPropagation;
- return fn.call(element, e, x, y);
- };
- obj.attachEvent("on" + type, f);
- var detacher = function () {
- obj.detachEvent("on" + type, f);
- return true;
- };
- return detacher;
- };
- }
- })(),
- drag = [],
- dragMove = function (e) {
- var x = e.clientX,
- y = e.clientY,
- scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop,
- scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft,
- dragi,
- j = drag.length;
- while (j--) {
- dragi = drag[j];
- if (supportsTouch) {
- var i = e.touches.length,
- touch;
- while (i--) {
- touch = e.touches[i];
- if (touch.identifier == dragi.el._drag.id) {
- x = touch.clientX;
- y = touch.clientY;
- (e.originalEvent ? e.originalEvent : e).preventDefault();
- break;
- }
- }
- } else {
- e.preventDefault();
- }
- var node = dragi.el.node,
- o,
- next = node.nextSibling,
- parent = node.parentNode,
- display = node.style.display;
- g.win.opera && parent.removeChild(node);
- node.style.display = "none";
- o = dragi.el.paper.getElementByPoint(x, y);
- node.style.display = display;
- g.win.opera && (next ? parent.insertBefore(node, next) : parent.appendChild(node));
- o && eve("drag.over." + dragi.el.id, dragi.el, o);
- x += scrollX;
- y += scrollY;
- eve("drag.move." + dragi.el.id, dragi.move_scope || dragi.el, x - dragi.el._drag.x, y - dragi.el._drag.y, x, y, e);
- }
- },
- dragUp = function (e) {
- R.unmousemove(dragMove).unmouseup(dragUp);
- var i = drag.length,
- dragi;
- while (i--) {
- dragi = drag[i];
- dragi.el._drag = {};
- eve("drag.end." + dragi.el.id, dragi.end_scope || dragi.start_scope || dragi.move_scope || dragi.el, e);
- }
- drag = [];
- },
-
- elproto = R.el = {};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- for (var i = events.length; i--;) {
- (function (eventName) {
- R[eventName] = elproto[eventName] = function (fn, scope) {
- if (R.is(fn, "function")) {
- this.events = this.events || [];
- this.events.push({name: eventName, f: fn, unbind: addEvent(this.shape || this.node || g.doc, eventName, fn, scope || this)});
- }
- return this;
- };
- R["un" + eventName] = elproto["un" + eventName] = function (fn) {
- var events = this.events || [],
- l = events.length;
- while (l--) if (events[l].name == eventName && events[l].f == fn) {
- events[l].unbind();
- events.splice(l, 1);
- !events.length && delete this.events;
- return this;
- }
- return this;
- };
- })(events[i]);
- }
-
-
- elproto.data = function (key, value) {
- var data = eldata[this.id] = eldata[this.id] || {};
- if (arguments.length == 1) {
- if (R.is(key, "object")) {
- for (var i in key) if (key[has](i)) {
- this.data(i, key[i]);
- }
- return this;
- }
- eve("data.get." + this.id, this, data[key], key);
- return data[key];
- }
- data[key] = value;
- eve("data.set." + this.id, this, value, key);
- return this;
- };
-
- elproto.removeData = function (key) {
- if (key == null) {
- eldata[this.id] = {};
- } else {
- eldata[this.id] && delete eldata[this.id][key];
- }
- return this;
- };
-
- elproto.hover = function (f_in, f_out, scope_in, scope_out) {
- return this.mouseover(f_in, scope_in).mouseout(f_out, scope_out || scope_in);
- };
-
- elproto.unhover = function (f_in, f_out) {
- return this.unmouseover(f_in).unmouseout(f_out);
- };
- var draggable = [];
-
- elproto.drag = function (onmove, onstart, onend, move_scope, start_scope, end_scope) {
- function start(e) {
- (e.originalEvent || e).preventDefault();
- var scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop,
- scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft;
- this._drag.x = e.clientX + scrollX;
- this._drag.y = e.clientY + scrollY;
- this._drag.id = e.identifier;
- !drag.length && R.mousemove(dragMove).mouseup(dragUp);
- drag.push({el: this, move_scope: move_scope, start_scope: start_scope, end_scope: end_scope});
- onstart && eve.on("drag.start." + this.id, onstart);
- onmove && eve.on("drag.move." + this.id, onmove);
- onend && eve.on("drag.end." + this.id, onend);
- eve("drag.start." + this.id, start_scope || move_scope || this, e.clientX + scrollX, e.clientY + scrollY, e);
- }
- this._drag = {};
- draggable.push({el: this, start: start});
- this.mousedown(start);
- return this;
- };
-
- elproto.onDragOver = function (f) {
- f ? eve.on("drag.over." + this.id, f) : eve.unbind("drag.over." + this.id);
- };
-
- elproto.undrag = function () {
- var i = draggable.length;
- while (i--) if (draggable[i].el == this) {
- this.unmousedown(draggable[i].start);
- draggable.splice(i, 1);
- eve.unbind("drag.*." + this.id);
- }
- !draggable.length && R.unmousemove(dragMove).unmouseup(dragUp);
- };
-
- paperproto.circle = function (x, y, r) {
- var out = R._engine.circle(this, x || 0, y || 0, r || 0);
- this.__set__ && this.__set__.push(out);
- return out;
- };
-
- paperproto.rect = function (x, y, w, h, r) {
- var out = R._engine.rect(this, x || 0, y || 0, w || 0, h || 0, r || 0);
- this.__set__ && this.__set__.push(out);
- return out;
- };
-
- paperproto.ellipse = function (x, y, rx, ry) {
- var out = R._engine.ellipse(this, x || 0, y || 0, rx || 0, ry || 0);
- this.__set__ && this.__set__.push(out);
- return out;
- };
-
- paperproto.path = function (pathString) {
- pathString && !R.is(pathString, string) && !R.is(pathString[0], array) && (pathString += E);
- var out = R._engine.path(R.format[apply](R, arguments), this);
- this.__set__ && this.__set__.push(out);
- return out;
- };
-
- paperproto.image = function (src, x, y, w, h) {
- var out = R._engine.image(this, src || "about:blank", x || 0, y || 0, w || 0, h || 0);
- this.__set__ && this.__set__.push(out);
- return out;
- };
-
- paperproto.text = function (x, y, text) {
- var out = R._engine.text(this, x || 0, y || 0, Str(text));
- this.__set__ && this.__set__.push(out);
- return out;
- };
-
- paperproto.set = function (itemsArray) {
- !R.is(itemsArray, "array") && (itemsArray = Array.prototype.splice.call(arguments, 0, arguments.length));
- var out = new Set(itemsArray);
- this.__set__ && this.__set__.push(out);
- return out;
- };
-
- paperproto.setStart = function (set) {
- this.__set__ = set || this.set();
- };
-
- paperproto.setFinish = function (set) {
- var out = this.__set__;
- delete this.__set__;
- return out;
- };
-
- paperproto.setSize = function (width, height) {
- return R._engine.setSize.call(this, width, height);
- };
-
- paperproto.setViewBox = function (x, y, w, h, fit) {
- return R._engine.setViewBox.call(this, x, y, w, h, fit);
- };
-
-
- paperproto.top = paperproto.bottom = null;
-
- paperproto.raphael = R;
- var getOffset = function (elem) {
- var box = elem.getBoundingClientRect(),
- doc = elem.ownerDocument,
- body = doc.body,
- docElem = doc.documentElement,
- clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
- top = box.top + (g.win.pageYOffset || docElem.scrollTop || body.scrollTop ) - clientTop,
- left = box.left + (g.win.pageXOffset || docElem.scrollLeft || body.scrollLeft) - clientLeft;
- return {
- y: top,
- x: left
- };
- };
-
- paperproto.getElementByPoint = function (x, y) {
- var paper = this,
- svg = paper.canvas,
- target = g.doc.elementFromPoint(x, y);
- if (g.win.opera && target.tagName == "svg") {
- var so = getOffset(svg),
- sr = svg.createSVGRect();
- sr.x = x - so.x;
- sr.y = y - so.y;
- sr.width = sr.height = 1;
- var hits = svg.getIntersectionList(sr, null);
- if (hits.length) {
- target = hits[hits.length - 1];
- }
- }
- if (!target) {
- return null;
- }
- while (target.parentNode && target != svg.parentNode && !target.raphael) {
- target = target.parentNode;
- }
- target == paper.canvas.parentNode && (target = svg);
- target = target && target.raphael ? paper.getById(target.raphaelid) : null;
- return target;
- };
-
- paperproto.getById = function (id) {
- var bot = this.bottom;
- while (bot) {
- if (bot.id == id) {
- return bot;
- }
- bot = bot.next;
- }
- return null;
- };
-
- paperproto.forEach = function (callback, thisArg) {
- var bot = this.bottom;
- while (bot) {
- if (callback.call(thisArg, bot) === false) {
- return this;
- }
- bot = bot.next;
- }
- return this;
- };
- function x_y() {
- return this.x + S + this.y;
- }
- function x_y_w_h() {
- return this.x + S + this.y + S + this.width + " \xd7 " + this.height;
- }
-
- elproto.getBBox = function (isWithoutTransform) {
- if (this.removed) {
- return {};
- }
- var _ = this._;
- if (isWithoutTransform) {
- if (_.dirty || !_.bboxwt) {
- this.realPath = getPath[this.type](this);
- _.bboxwt = pathDimensions(this.realPath);
- _.bboxwt.toString = x_y_w_h;
- _.dirty = 0;
- }
- return _.bboxwt;
- }
- if (_.dirty || _.dirtyT || !_.bbox) {
- if (_.dirty || !this.realPath) {
- _.bboxwt = 0;
- this.realPath = getPath[this.type](this);
- }
- _.bbox = pathDimensions(mapPath(this.realPath, this.matrix));
- _.bbox.toString = x_y_w_h;
- _.dirty = _.dirtyT = 0;
- }
- return _.bbox;
- };
-
- elproto.clone = function () {
- if (this.removed) {
- return null;
- }
- var out = this.paper[this.type]().attr(this.attr());
- this.__set__ && this.__set__.push(out);
- return out;
- };
-
- elproto.glow = function (glow) {
- if (this.type == "text") {
- return null;
- }
- glow = glow || {};
- var s = {
- width: (glow.width || 10) + (+this.attr("stroke-width") || 1),
- fill: glow.fill || false,
- opacity: glow.opacity || .5,
- offsetx: glow.offsetx || 0,
- offsety: glow.offsety || 0,
- color: glow.color || "#000"
- },
- c = s.width / 2,
- r = this.paper,
- out = r.set(),
- path = this.realPath || getPath[this.type](this);
- path = this.matrix ? mapPath(path, this.matrix) : path;
- for (var i = 1; i < c + 1; i++) {
- out.push(r.path(path).attr({
- stroke: s.color,
- fill: s.fill ? s.color : "none",
- "stroke-linejoin": "round",
- "stroke-linecap": "round",
- "stroke-width": +(s.width / c * i).toFixed(3),
- opacity: +(s.opacity / c).toFixed(3)
- }));
- }
- return out.insertBefore(this).translate(s.offsetx, s.offsety);
- };
- var curveslengths = {},
- getPointAtSegmentLength = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length) {
- var len = 0,
- precision = 100,
- name = [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y].join(),
- cache = curveslengths[name],
- old, dot;
- !cache && (curveslengths[name] = cache = {data: []});
- cache.timer && clearTimeout(cache.timer);
- cache.timer = setTimeout(function () {delete curveslengths[name];}, 2e3);
- if (length != null && !cache.precision) {
- var total = getPointAtSegmentLength(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y);
- cache.precision = ~~total * 10;
- cache.data = [];
- }
- precision = cache.precision || precision;
- for (var i = 0; i < precision + 1; i++) {
- if (cache.data[i * precision]) {
- dot = cache.data[i * precision];
- } else {
- dot = R.findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, i / precision);
- cache.data[i * precision] = dot;
- }
- i && (len += pow(pow(old.x - dot.x, 2) + pow(old.y - dot.y, 2), .5));
- if (length != null && len >= length) {
- return dot;
- }
- old = dot;
- }
- if (length == null) {
- return len;
- }
- },
- getLengthFactory = function (istotal, subpath) {
- return function (path, length, onlystart) {
- path = path2curve(path);
- var x, y, p, l, sp = "", subpaths = {}, point,
- len = 0;
- for (var i = 0, ii = path.length; i < ii; i++) {
- p = path[i];
- if (p[0] == "M") {
- x = +p[1];
- y = +p[2];
- } else {
- l = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);
- if (len + l > length) {
- if (subpath && !subpaths.start) {
- point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);
- sp += ["C" + point.start.x, point.start.y, point.m.x, point.m.y, point.x, point.y];
- if (onlystart) {return sp;}
- subpaths.start = sp;
- sp = ["M" + point.x, point.y + "C" + point.n.x, point.n.y, point.end.x, point.end.y, p[5], p[6]].join();
- len += l;
- x = +p[5];
- y = +p[6];
- continue;
- }
- if (!istotal && !subpath) {
- point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);
- return {x: point.x, y: point.y, alpha: point.alpha};
- }
- }
- len += l;
- x = +p[5];
- y = +p[6];
- }
- sp += p.shift() + p;
- }
- subpaths.end = sp;
- point = istotal ? len : subpath ? subpaths : R.findDotsAtSegment(x, y, p[0], p[1], p[2], p[3], p[4], p[5], 1);
- point.alpha && (point = {x: point.x, y: point.y, alpha: point.alpha});
- return point;
- };
- };
- var getTotalLength = getLengthFactory(1),
- getPointAtLength = getLengthFactory(),
- getSubpathsAtLength = getLengthFactory(0, 1);
-
- R.getTotalLength = getTotalLength;
-
- R.getPointAtLength = getPointAtLength;
-
- R.getSubpath = function (path, from, to) {
- if (this.getTotalLength(path) - to < 1e-6) {
- return getSubpathsAtLength(path, from).end;
- }
- var a = getSubpathsAtLength(path, to, 1);
- return from ? getSubpathsAtLength(a, from).end : a;
- };
-
- elproto.getTotalLength = function () {
- if (this.type != "path") {return;}
- if (this.node.getTotalLength) {
- return this.node.getTotalLength();
- }
- return getTotalLength(this.attrs.path);
- };
-
- elproto.getPointAtLength = function (length) {
- if (this.type != "path") {return;}
- return getPointAtLength(this.attrs.path, length);
- };
-
- elproto.getSubpath = function (from, to) {
- if (this.type != "path") {return;}
- return R.getSubpath(this.attrs.path, from, to);
- };
-
- var ef = R.easing_formulas = {
- linear: function (n) {
- return n;
- },
- "<": function (n) {
- return pow(n, 1.7);
- },
- ">": function (n) {
- return pow(n, .48);
- },
- "<>": function (n) {
- var q = .48 - n / 1.04,
- Q = math.sqrt(.1734 + q * q),
- x = Q - q,
- X = pow(abs(x), 1 / 3) * (x < 0 ? -1 : 1),
- y = -Q - q,
- Y = pow(abs(y), 1 / 3) * (y < 0 ? -1 : 1),
- t = X + Y + .5;
- return (1 - t) * 3 * t * t + t * t * t;
- },
- backIn: function (n) {
- var s = 1.70158;
- return n * n * ((s + 1) * n - s);
- },
- backOut: function (n) {
- n = n - 1;
- var s = 1.70158;
- return n * n * ((s + 1) * n + s) + 1;
- },
- elastic: function (n) {
- if (n == !!n) {
- return n;
- }
- return pow(2, -10 * n) * math.sin((n - .075) * (2 * PI) / .3) + 1;
- },
- bounce: function (n) {
- var s = 7.5625,
- p = 2.75,
- l;
- if (n < (1 / p)) {
- l = s * n * n;
- } else {
- if (n < (2 / p)) {
- n -= (1.5 / p);
- l = s * n * n + .75;
- } else {
- if (n < (2.5 / p)) {
- n -= (2.25 / p);
- l = s * n * n + .9375;
- } else {
- n -= (2.625 / p);
- l = s * n * n + .984375;
- }
- }
- }
- return l;
- }
- };
- ef.easeIn = ef["ease-in"] = ef["<"];
- ef.easeOut = ef["ease-out"] = ef[">"];
- ef.easeInOut = ef["ease-in-out"] = ef["<>"];
- ef["back-in"] = ef.backIn;
- ef["back-out"] = ef.backOut;
-
- var animationElements = [],
- requestAnimFrame = window.requestAnimationFrame ||
- window.webkitRequestAnimationFrame ||
- window.mozRequestAnimationFrame ||
- window.oRequestAnimationFrame ||
- window.msRequestAnimationFrame ||
- function (callback) {
- setTimeout(callback, 16);
- },
- animation = function () {
- var Now = +new Date,
- l = 0;
- for (; l < animationElements.length; l++) {
- var e = animationElements[l];
- if (e.el.removed || e.paused) {
- continue;
- }
- var time = Now - e.start,
- ms = e.ms,
- easing = e.easing,
- from = e.from,
- diff = e.diff,
- to = e.to,
- t = e.t,
- that = e.el,
- set = {},
- now,
- init = {},
- key;
- if (e.initstatus) {
- time = (e.initstatus * e.anim.top - e.prev) / (e.percent - e.prev) * ms;
- e.status = e.initstatus;
- delete e.initstatus;
- e.stop && animationElements.splice(l--, 1);
- } else {
- e.status = (e.prev + (e.percent - e.prev) * (time / ms)) / e.anim.top;
- }
- if (time < 0) {
- continue;
- }
- if (time < ms) {
- var pos = easing(time / ms);
- for (var attr in from) if (from[has](attr)) {
- switch (availableAnimAttrs[attr]) {
- case nu:
- now = +from[attr] + pos * ms * diff[attr];
- break;
- case "colour":
- now = "rgb(" + [
- upto255(round(from[attr].r + pos * ms * diff[attr].r)),
- upto255(round(from[attr].g + pos * ms * diff[attr].g)),
- upto255(round(from[attr].b + pos * ms * diff[attr].b))
- ].join(",") + ")";
- break;
- case "path":
- now = [];
- for (var i = 0, ii = from[attr].length; i < ii; i++) {
- now[i] = [from[attr][i][0]];
- for (var j = 1, jj = from[attr][i].length; j < jj; j++) {
- now[i][j] = +from[attr][i][j] + pos * ms * diff[attr][i][j];
- }
- now[i] = now[i].join(S);
- }
- now = now.join(S);
- break;
- case "transform":
- if (diff[attr].real) {
- now = [];
- for (i = 0, ii = from[attr].length; i < ii; i++) {
- now[i] = [from[attr][i][0]];
- for (j = 1, jj = from[attr][i].length; j < jj; j++) {
- now[i][j] = from[attr][i][j] + pos * ms * diff[attr][i][j];
- }
- }
- } else {
- var get = function (i) {
- return +from[attr][i] + pos * ms * diff[attr][i];
- };
- // now = [["r", get(2), 0, 0], ["t", get(3), get(4)], ["s", get(0), get(1), 0, 0]];
- now = [["m", get(0), get(1), get(2), get(3), get(4), get(5)]];
- }
- break;
- case "csv":
- if (attr == "clip-rect") {
- now = [];
- i = 4;
- while (i--) {
- now[i] = +from[attr][i] + pos * ms * diff[attr][i];
- }
- }
- break;
- default:
- var from2 = [][concat](from[attr]);
- now = [];
- i = that.paper.customAttributes[attr].length;
- while (i--) {
- now[i] = +from2[i] + pos * ms * diff[attr][i];
- }
- break;
- }
- set[attr] = now;
- }
- that.attr(set);
- (function (id, that, anim) {
- setTimeout(function () {
- eve("anim.frame." + id, that, anim);
- });
- })(that.id, that, e.anim);
- } else {
- (function(f, el, a) {
- setTimeout(function() {
- eve("anim.frame." + el.id, el, a);
- eve("anim.finish." + el.id, el, a);
- R.is(f, "function") && f.call(el);
- });
- })(e.callback, that, e.anim);
- that.attr(to);
- animationElements.splice(l--, 1);
- if (e.repeat > 1 && !e.next) {
- for (key in to) if (to[has](key)) {
- init[key] = e.totalOrigin[key];
- }
- e.el.attr(init);
- runAnimation(e.anim, e.el, e.anim.percents[0], null, e.totalOrigin, e.repeat - 1);
- }
- if (e.next && !e.stop) {
- runAnimation(e.anim, e.el, e.next, null, e.totalOrigin, e.repeat);
- }
- }
- }
- R.svg && that && that.paper && that.paper.safari();
- animationElements.length && requestAnimFrame(animation);
- },
- upto255 = function (color) {
- return color > 255 ? 255 : color < 0 ? 0 : color;
- };
-
- elproto.animateWith = function (el, anim, params, ms, easing, callback) {
- var element = this;
- if (element.removed) {
- callback && callback.call(element);
- return element;
- }
- var a = params instanceof Animation ? params : R.animation(params, ms, easing, callback),
- x, y;
- runAnimation(a, element, a.percents[0], null, element.attr());
- for (var i = 0, ii = animationElements.length; i < ii; i++) {
- if (animationElements[i].anim == anim && animationElements[i].el == el) {
- animationElements[ii - 1].start = animationElements[i].start;
- break;
- }
- }
- return element;
- //
- //
- // var a = params ? R.animation(params, ms, easing, callback) : anim,
- // status = element.status(anim);
- // return this.animate(a).status(a, status * anim.ms / a.ms);
- };
- function CubicBezierAtTime(t, p1x, p1y, p2x, p2y, duration) {
- var cx = 3 * p1x,
- bx = 3 * (p2x - p1x) - cx,
- ax = 1 - cx - bx,
- cy = 3 * p1y,
- by = 3 * (p2y - p1y) - cy,
- ay = 1 - cy - by;
- function sampleCurveX(t) {
- return ((ax * t + bx) * t + cx) * t;
- }
- function solve(x, epsilon) {
- var t = solveCurveX(x, epsilon);
- return ((ay * t + by) * t + cy) * t;
- }
- function solveCurveX(x, epsilon) {
- var t0, t1, t2, x2, d2, i;
- for(t2 = x, i = 0; i < 8; i++) {
- x2 = sampleCurveX(t2) - x;
- if (abs(x2) < epsilon) {
- return t2;
- }
- d2 = (3 * ax * t2 + 2 * bx) * t2 + cx;
- if (abs(d2) < 1e-6) {
- break;
- }
- t2 = t2 - x2 / d2;
- }
- t0 = 0;
- t1 = 1;
- t2 = x;
- if (t2 < t0) {
- return t0;
- }
- if (t2 > t1) {
- return t1;
- }
- while (t0 < t1) {
- x2 = sampleCurveX(t2);
- if (abs(x2 - x) < epsilon) {
- return t2;
- }
- if (x > x2) {
- t0 = t2;
- } else {
- t1 = t2;
- }
- t2 = (t1 - t0) / 2 + t0;
- }
- return t2;
- }
- return solve(t, 1 / (200 * duration));
- }
- elproto.onAnimation = function (f) {
- f ? eve.on("anim.frame." + this.id, f) : eve.unbind("anim.frame." + this.id);
- return this;
- };
- function Animation(anim, ms) {
- var percents = [],
- newAnim = {};
- this.ms = ms;
- this.times = 1;
- if (anim) {
- for (var attr in anim) if (anim[has](attr)) {
- newAnim[toFloat(attr)] = anim[attr];
- percents.push(toFloat(attr));
- }
- percents.sort(sortByNumber);
- }
- this.anim = newAnim;
- this.top = percents[percents.length - 1];
- this.percents = percents;
- }
-
- Animation.prototype.delay = function (delay) {
- var a = new Animation(this.anim, this.ms);
- a.times = this.times;
- a.del = +delay || 0;
- return a;
- };
-
- Animation.prototype.repeat = function (times) {
- var a = new Animation(this.anim, this.ms);
- a.del = this.del;
- a.times = math.floor(mmax(times, 0)) || 1;
- return a;
- };
- function runAnimation(anim, element, percent, status, totalOrigin, times) {
- percent = toFloat(percent);
- var params,
- isInAnim,
- isInAnimSet,
- percents = [],
- next,
- prev,
- timestamp,
- ms = anim.ms,
- from = {},
- to = {},
- diff = {};
- if (status) {
- for (i = 0, ii = animationElements.length; i < ii; i++) {
- var e = animationElements[i];
- if (e.el.id == element.id && e.anim == anim) {
- if (e.percent != percent) {
- animationElements.splice(i, 1);
- isInAnimSet = 1;
- } else {
- isInAnim = e;
- }
- element.attr(e.totalOrigin);
- break;
- }
- }
- } else {
- status = +to; // NaN
- }
- for (var i = 0, ii = anim.percents.length; i < ii; i++) {
- if (anim.percents[i] == percent || anim.percents[i] > status * anim.top) {
- percent = anim.percents[i];
- prev = anim.percents[i - 1] || 0;
- ms = ms / anim.top * (percent - prev);
- next = anim.percents[i + 1];
- params = anim.anim[percent];
- break;
- } else if (status) {
- element.attr(anim.anim[anim.percents[i]]);
- }
- }
- if (!params) {
- return;
- }
- if (!isInAnim) {
- for (var attr in params) if (params[has](attr)) {
- if (availableAnimAttrs[has](attr) || element.paper.customAttributes[has](attr)) {
- from[attr] = element.attr(attr);
- (from[attr] == null) && (from[attr] = availableAttrs[attr]);
- to[attr] = params[attr];
- switch (availableAnimAttrs[attr]) {
- case nu:
- diff[attr] = (to[attr] - from[attr]) / ms;
- break;
- case "colour":
- from[attr] = R.getRGB(from[attr]);
- var toColour = R.getRGB(to[attr]);
- diff[attr] = {
- r: (toColour.r - from[attr].r) / ms,
- g: (toColour.g - from[attr].g) / ms,
- b: (toColour.b - from[attr].b) / ms
- };
- break;
- case "path":
- var pathes = path2curve(from[attr], to[attr]),
- toPath = pathes[1];
- from[attr] = pathes[0];
- diff[attr] = [];
- for (i = 0, ii = from[attr].length; i < ii; i++) {
- diff[attr][i] = [0];
- for (var j = 1, jj = from[attr][i].length; j < jj; j++) {
- diff[attr][i][j] = (toPath[i][j] - from[attr][i][j]) / ms;
- }
- }
- break;
- case "transform":
- var _ = element._,
- eq = equaliseTransform(_[attr], to[attr]);
- if (eq) {
- from[attr] = eq.from;
- to[attr] = eq.to;
- diff[attr] = [];
- diff[attr].real = true;
- for (i = 0, ii = from[attr].length; i < ii; i++) {
- diff[attr][i] = [from[attr][i][0]];
- for (j = 1, jj = from[attr][i].length; j < jj; j++) {
- diff[attr][i][j] = (to[attr][i][j] - from[attr][i][j]) / ms;
- }
- }
- } else {
- var m = (element.matrix || new Matrix),
- to2 = {
- _: {transform: _.transform},
- getBBox: function () {
- return element.getBBox(1);
- }
- };
- from[attr] = [
- m.a,
- m.b,
- m.c,
- m.d,
- m.e,
- m.f
- ];
- extractTransform(to2, to[attr]);
- to[attr] = to2._.transform;
- diff[attr] = [
- (to2.matrix.a - m.a) / ms,
- (to2.matrix.b - m.b) / ms,
- (to2.matrix.c - m.c) / ms,
- (to2.matrix.d - m.d) / ms,
- (to2.matrix.e - m.e) / ms,
- (to2.matrix.e - m.f) / ms
- ];
- // from[attr] = [_.sx, _.sy, _.deg, _.dx, _.dy];
- // var to2 = {_:{}, getBBox: function () { return element.getBBox(); }};
- // extractTransform(to2, to[attr]);
- // diff[attr] = [
- // (to2._.sx - _.sx) / ms,
- // (to2._.sy - _.sy) / ms,
- // (to2._.deg - _.deg) / ms,
- // (to2._.dx - _.dx) / ms,
- // (to2._.dy - _.dy) / ms
- // ];
- }
- break;
- case "csv":
- var values = Str(params[attr])[split](separator),
- from2 = Str(from[attr])[split](separator);
- if (attr == "clip-rect") {
- from[attr] = from2;
- diff[attr] = [];
- i = from2.length;
- while (i--) {
- diff[attr][i] = (values[i] - from[attr][i]) / ms;
- }
- }
- to[attr] = values;
- break;
- default:
- values = [][concat](params[attr]);
- from2 = [][concat](from[attr]);
- diff[attr] = [];
- i = element.paper.customAttributes[attr].length;
- while (i--) {
- diff[attr][i] = ((values[i] || 0) - (from2[i] || 0)) / ms;
- }
- break;
- }
- }
- }
- var easing = params.easing,
- easyeasy = R.easing_formulas[easing];
- if (!easyeasy) {
- easyeasy = Str(easing).match(bezierrg);
- if (easyeasy && easyeasy.length == 5) {
- var curve = easyeasy;
- easyeasy = function (t) {
- return CubicBezierAtTime(t, +curve[1], +curve[2], +curve[3], +curve[4], ms);
- };
- } else {
- easyeasy = pipe;
- }
- }
- timestamp = params.start || anim.start || +new Date;
- e = {
- anim: anim,
- percent: percent,
- timestamp: timestamp,
- start: timestamp + (anim.del || 0),
- status: 0,
- initstatus: status || 0,
- stop: false,
- ms: ms,
- easing: easyeasy,
- from: from,
- diff: diff,
- to: to,
- el: element,
- callback: params.callback,
- prev: prev,
- next: next,
- repeat: times || anim.times,
- origin: element.attr(),
- totalOrigin: totalOrigin
- };
- animationElements.push(e);
- if (status && !isInAnim && !isInAnimSet) {
- e.stop = true;
- e.start = new Date - ms * status;
- if (animationElements.length == 1) {
- return animation();
- }
- }
- if (isInAnimSet) {
- e.start = new Date - e.ms * status;
- }
- animationElements.length == 1 && requestAnimFrame(animation);
- } else {
- isInAnim.initstatus = status;
- isInAnim.start = new Date - isInAnim.ms * status;
- }
- eve("anim.start." + element.id, element, anim);
- }
-
- R.animation = function (params, ms, easing, callback) {
- if (params instanceof Animation) {
- return params;
- }
- if (R.is(easing, "function") || !easing) {
- callback = callback || easing || null;
- easing = null;
- }
- params = Object(params);
- ms = +ms || 0;
- var p = {},
- json,
- attr;
- for (attr in params) if (params[has](attr) && toFloat(attr) != attr && toFloat(attr) + "%" != attr) {
- json = true;
- p[attr] = params[attr];
- }
- if (!json) {
- return new Animation(params, ms);
- } else {
- easing && (p.easing = easing);
- callback && (p.callback = callback);
- return new Animation({100: p}, ms);
- }
- };
-
- elproto.animate = function (params, ms, easing, callback) {
- var element = this;
- if (element.removed) {
- callback && callback.call(element);
- return element;
- }
- var anim = params instanceof Animation ? params : R.animation(params, ms, easing, callback);
- runAnimation(anim, element, anim.percents[0], null, element.attr());
- return element;
- };
-
- elproto.setTime = function (anim, value) {
- if (anim && value != null) {
- this.status(anim, mmin(value, anim.ms) / anim.ms);
- }
- return this;
- };
-
- elproto.status = function (anim, value) {
- var out = [],
- i = 0,
- len,
- e;
- if (value != null) {
- runAnimation(anim, this, -1, mmin(value, 1));
- return this;
- } else {
- len = animationElements.length;
- for (; i < len; i++) {
- e = animationElements[i];
- if (e.el.id == this.id && (!anim || e.anim == anim)) {
- if (anim) {
- return e.status;
- }
- out.push({
- anim: e.anim,
- status: e.status
- });
- }
- }
- if (anim) {
- return 0;
- }
- return out;
- }
- };
-
- elproto.pause = function (anim) {
- for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) {
- if (eve("anim.pause." + this.id, this, animationElements[i].anim) !== false) {
- animationElements[i].paused = true;
- }
- }
- return this;
- };
-
- elproto.resume = function (anim) {
- for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) {
- var e = animationElements[i];
- if (eve("anim.resume." + this.id, this, e.anim) !== false) {
- delete e.paused;
- this.status(e.anim, e.status);
- }
- }
- return this;
- };
-
- elproto.stop = function (anim) {
- for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) {
- if (eve("anim.stop." + this.id, this, animationElements[i].anim) !== false) {
- animationElements.splice(i--, 1);
- }
- }
- return this;
- };
- elproto.toString = function () {
- return "Rapha\xebl\u2019s object";
- };
-
- // Set
- var Set = function (items) {
- this.items = [];
- this.length = 0;
- this.type = "set";
- if (items) {
- for (var i = 0, ii = items.length; i < ii; i++) {
- if (items[i] && (items[i].constructor == elproto.constructor || items[i].constructor == Set)) {
- this[this.items.length] = this.items[this.items.length] = items[i];
- this.length++;
- }
- }
- }
- },
- setproto = Set.prototype;
-
- setproto.push = function () {
- var item,
- len;
- for (var i = 0, ii = arguments.length; i < ii; i++) {
- item = arguments[i];
- if (item && (item.constructor == elproto.constructor || item.constructor == Set)) {
- len = this.items.length;
- this[len] = this.items[len] = item;
- this.length++;
- }
- }
- return this;
- };
-
- setproto.pop = function () {
- this.length && delete this[this.length--];
- return this.items.pop();
- };
-
- setproto.forEach = function (callback, thisArg) {
- for (var i = 0, ii = this.items.length; i < ii; i++) {
- if (callback.call(thisArg, this.items[i], i) === false) {
- return this;
- }
- }
- return this;
- };
- for (var method in elproto) if (elproto[has](method)) {
- setproto[method] = (function (methodname) {
- return function () {
- var arg = arguments;
- return this.forEach(function (el) {
- el[methodname][apply](el, arg);
- });
- };
- })(method);
- }
- setproto.attr = function (name, value) {
- if (name && R.is(name, array) && R.is(name[0], "object")) {
- for (var j = 0, jj = name.length; j < jj; j++) {
- this.items[j].attr(name[j]);
- }
- } else {
- for (var i = 0, ii = this.items.length; i < ii; i++) {
- this.items[i].attr(name, value);
- }
- }
- return this;
- };
-
- setproto.clear = function () {
- while (this.length) {
- this.pop();
- }
- };
-
- setproto.splice = function (index, count, insertion) {
- index = index < 0 ? mmax(this.length + index, 0) : index;
- count = mmax(0, mmin(this.length - index, count));
- var tail = [],
- todel = [],
- args = [],
- i;
- for (i = 2; i < arguments.length; i++) {
- args.push(arguments[i]);
- }
- for (i = 0; i < count; i++) {
- todel.push(this[index + i]);
- }
- for (; i < this.length - index; i++) {
- tail.push(this[index + i]);
- }
- var arglen = args.length;
- for (i = 0; i < arglen + tail.length; i++) {
- this.items[index + i] = this[index + i] = i < arglen ? args[i] : tail[i - arglen];
- }
- i = this.items.length = this.length -= count - arglen;
- while (this[i]) {
- delete this[i++];
- }
- return new Set(todel);
- };
-
- setproto.exclude = function (el) {
- for (var i = 0, ii = this.length; i < ii; i++) if (this[i] == el) {
- this.splice(i, 1);
- return true;
- }
- };
- setproto.animate = function (params, ms, easing, callback) {
- (R.is(easing, "function") || !easing) && (callback = easing || null);
- var len = this.items.length,
- i = len,
- item,
- set = this,
- collector;
- if (!len) {
- return this;
- }
- callback && (collector = function () {
- !--len && callback.call(set);
- });
- easing = R.is(easing, string) ? easing : collector;
- var anim = R.animation(params, ms, easing, collector);
- item = this.items[--i].animate(anim);
- while (i--) {
- this.items[i] && !this.items[i].removed && this.items[i].animateWith(item, anim, anim);
- }
- return this;
- };
- setproto.insertAfter = function (el) {
- var i = this.items.length;
- while (i--) {
- this.items[i].insertAfter(el);
- }
- return this;
- };
- setproto.getBBox = function () {
- var x = [],
- y = [],
- w = [],
- h = [];
- for (var i = this.items.length; i--;) if (!this.items[i].removed) {
- var box = this.items[i].getBBox();
- x.push(box.x);
- y.push(box.y);
- w.push(box.x + box.width);
- h.push(box.y + box.height);
- }
- x = mmin[apply](0, x);
- y = mmin[apply](0, y);
- return {
- x: x,
- y: y,
- width: mmax[apply](0, w) - x,
- height: mmax[apply](0, h) - y
- };
- };
- setproto.clone = function (s) {
- s = new Set;
- for (var i = 0, ii = this.items.length; i < ii; i++) {
- s.push(this.items[i].clone());
- }
- return s;
- };
- setproto.toString = function () {
- return "Rapha\xebl\u2018s set";
- };
-
-
- R.registerFont = function (font) {
- if (!font.face) {
- return font;
- }
- this.fonts = this.fonts || {};
- var fontcopy = {
- w: font.w,
- face: {},
- glyphs: {}
- },
- family = font.face["font-family"];
- for (var prop in font.face) if (font.face[has](prop)) {
- fontcopy.face[prop] = font.face[prop];
- }
- if (this.fonts[family]) {
- this.fonts[family].push(fontcopy);
- } else {
- this.fonts[family] = [fontcopy];
- }
- if (!font.svg) {
- fontcopy.face["units-per-em"] = toInt(font.face["units-per-em"], 10);
- for (var glyph in font.glyphs) if (font.glyphs[has](glyph)) {
- var path = font.glyphs[glyph];
- fontcopy.glyphs[glyph] = {
- w: path.w,
- k: {},
- d: path.d && "M" + path.d.replace(/[mlcxtrv]/g, function (command) {
- return {l: "L", c: "C", x: "z", t: "m", r: "l", v: "c"}[command] || "M";
- }) + "z"
- };
- if (path.k) {
- for (var k in path.k) if (path[has](k)) {
- fontcopy.glyphs[glyph].k[k] = path.k[k];
- }
- }
- }
- }
- return font;
- };
-
- paperproto.getFont = function (family, weight, style, stretch) {
- stretch = stretch || "normal";
- style = style || "normal";
- weight = +weight || {normal: 400, bold: 700, lighter: 300, bolder: 800}[weight] || 400;
- if (!R.fonts) {
- return;
- }
- var font = R.fonts[family];
- if (!font) {
- var name = new RegExp("(^|\\s)" + family.replace(/[^\w\d\s+!~.:_-]/g, E) + "(\\s|$)", "i");
- for (var fontName in R.fonts) if (R.fonts[has](fontName)) {
- if (name.test(fontName)) {
- font = R.fonts[fontName];
- break;
- }
- }
- }
- var thefont;
- if (font) {
- for (var i = 0, ii = font.length; i < ii; i++) {
- thefont = font[i];
- if (thefont.face["font-weight"] == weight && (thefont.face["font-style"] == style || !thefont.face["font-style"]) && thefont.face["font-stretch"] == stretch) {
- break;
- }
- }
- }
- return thefont;
- };
-
- paperproto.print = function (x, y, string, font, size, origin, letter_spacing) {
- origin = origin || "middle"; // baseline|middle
- letter_spacing = mmax(mmin(letter_spacing || 0, 1), -1);
- var out = this.set(),
- letters = Str(string)[split](E),
- shift = 0,
- path = E,
- scale;
- R.is(font, string) && (font = this.getFont(font));
- if (font) {
- scale = (size || 16) / font.face["units-per-em"];
- var bb = font.face.bbox[split](separator),
- top = +bb[0],
- height = +bb[1] + (origin == "baseline" ? bb[3] - bb[1] + (+font.face.descent) : (bb[3] - bb[1]) / 2);
- for (var i = 0, ii = letters.length; i < ii; i++) {
- var prev = i && font.glyphs[letters[i - 1]] || {},
- curr = font.glyphs[letters[i]];
- shift += i ? (prev.w || font.w) + (prev.k && prev.k[letters[i]] || 0) + (font.w * letter_spacing) : 0;
- curr && curr.d && out.push(this.path(curr.d).attr({
- fill: "#000",
- stroke: "none",
- transform: [["t", shift * scale, 0]]
- }));
- }
- out.transform(["...s", scale, scale, top, height, "t", (x - top) / scale, (y - height) / scale]);
- }
- return out;
- };
-
-
- paperproto.add = function (json) {
- if (R.is(json, "array")) {
- var res = this.set(),
- i = 0,
- ii = json.length,
- j;
- for (; i < ii; i++) {
- j = json[i] || {};
- elements[has](j.type) && res.push(this[j.type]().attr(j));
- }
- }
- return res;
- };
-
-
- R.format = function (token, params) {
- var args = R.is(params, array) ? [0][concat](params) : arguments;
- token && R.is(token, string) && args.length - 1 && (token = token.replace(formatrg, function (str, i) {
- return args[++i] == null ? E : args[i];
- }));
- return token || E;
- };
-
- R.fullfill = (function () {
- var tokenRegex = /\{([^\}]+)\}/g,
- objNotationRegex = /(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g, // matches .xxxxx or ["xxxxx"] to run over object properties
- replacer = function (all, key, obj) {
- var res = obj;
- key.replace(objNotationRegex, function (all, name, quote, quotedName, isFunc) {
- name = name || quotedName;
- if (res) {
- if (name in res) {
- res = res[name];
- }
- typeof res == "function" && isFunc && (res = res());
- }
- });
- res = (res == null || res == obj ? all : res) + "";
- return res;
- };
- return function (str, obj) {
- return String(str).replace(tokenRegex, function (all, key) {
- return replacer(all, key, obj);
- });
- };
- })();
-
- R.ninja = function () {
- oldRaphael.was ? (g.win.Raphael = oldRaphael.is) : delete Raphael;
- return R;
- };
-
- R.st = setproto;
- // Firefox <3.6 fix: http://webreflection.blogspot.com/2009/11/195-chars-to-help-lazy-loading.html
- (function (doc, loaded, f) {
- if (doc.readyState == null && doc.addEventListener){
- doc.addEventListener(loaded, f = function () {
- doc.removeEventListener(loaded, f, false);
- doc.readyState = "complete";
- }, false);
- doc.readyState = "loading";
- }
- function isLoaded() {
- (/in/).test(doc.readyState) ? setTimeout(isLoaded, 9) : R.eve("DOMload");
- }
- isLoaded();
- })(document, "DOMContentLoaded");
-
- oldRaphael.was ? (g.win.Raphael = R) : (Raphael = R);
-
- eve.on("DOMload", function () {
- loaded = true;
- });
-})();
-
-
-// ┌─────────────────────────────────────────────────────────────────────┠\\
-// │ Raphaël - JavaScript Vector Library │ \\
-// ├─────────────────────────────────────────────────────────────────────┤ \\
-// │ SVG Module │ \\
-// ├─────────────────────────────────────────────────────────────────────┤ \\
-// │ Copyright (c) 2008-2011 Dmitry Baranovskiy (http://raphaeljs.com) │ \\
-// │ Copyright (c) 2008-2011 Sencha Labs (http://sencha.com) │ \\
-// │ Licensed under the MIT (http://raphaeljs.com/license.html) license. │ \\
-// └─────────────────────────────────────────────────────────────────────┘ \\
-window.Raphael.svg && function (R) {
- var has = "hasOwnProperty",
- Str = String,
- toFloat = parseFloat,
- toInt = parseInt,
- math = Math,
- mmax = math.max,
- abs = math.abs,
- pow = math.pow,
- separator = /[, ]+/,
- eve = R.eve,
- E = "",
- S = " ";
- var xlink = "http://www.w3.org/1999/xlink",
- markers = {
- block: "M5,0 0,2.5 5,5z",
- classic: "M5,0 0,2.5 5,5 3.5,3 3.5,2z",
- diamond: "M2.5,0 5,2.5 2.5,5 0,2.5z",
- open: "M6,1 1,3.5 6,6",
- oval: "M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z"
- },
- markerCounter = {};
- R.toString = function () {
- return "Your browser supports SVG.\nYou are running Rapha\xebl " + this.version;
- };
- var $ = function (el, attr) {
- if (attr) {
- if (typeof el == "string") {
- el = $(el);
- }
- for (var key in attr) if (attr[has](key)) {
- if (key.substring(0, 6) == "xlink:") {
- el.setAttributeNS(xlink, key.substring(6), Str(attr[key]));
- } else {
- el.setAttribute(key, Str(attr[key]));
- }
- }
- } else {
- el = R._g.doc.createElementNS("http://www.w3.org/2000/svg", el);
- el.style && (el.style.webkitTapHighlightColor = "rgba(0,0,0,0)");
- }
- return el;
- },
- addGradientFill = function (element, gradient) {
- var type = "linear",
- id = element.id + gradient,
- fx = .5, fy = .5,
- o = element.node,
- SVG = element.paper,
- s = o.style,
- el = R._g.doc.getElementById(id);
- if (!el) {
- gradient = Str(gradient).replace(R._radial_gradient, function (all, _fx, _fy) {
- type = "radial";
- if (_fx && _fy) {
- fx = toFloat(_fx);
- fy = toFloat(_fy);
- var dir = ((fy > .5) * 2 - 1);
- pow(fx - .5, 2) + pow(fy - .5, 2) > .25 &&
- (fy = math.sqrt(.25 - pow(fx - .5, 2)) * dir + .5) &&
- fy != .5 &&
- (fy = fy.toFixed(5) - 1e-5 * dir);
- }
- return E;
- });
- gradient = gradient.split(/\s*\-\s*/);
- if (type == "linear") {
- var angle = gradient.shift();
- angle = -toFloat(angle);
- if (isNaN(angle)) {
- return null;
- }
- var vector = [0, 0, math.cos(R.rad(angle)), math.sin(R.rad(angle))],
- max = 1 / (mmax(abs(vector[2]), abs(vector[3])) || 1);
- vector[2] *= max;
- vector[3] *= max;
- if (vector[2] < 0) {
- vector[0] = -vector[2];
- vector[2] = 0;
- }
- if (vector[3] < 0) {
- vector[1] = -vector[3];
- vector[3] = 0;
- }
- }
- var dots = R._parseDots(gradient);
- if (!dots) {
- return null;
- }
- id = id.replace(/[\(\)\s,\xb0#]/g, "_");
-
- if (element.gradient && id != element.gradient.id) {
- SVG.defs.removeChild(element.gradient);
- delete element.gradient;
- }
-
- if (!element.gradient) {
- el = $(type + "Gradient", {id: id});
- element.gradient = el;
- $(el, type == "radial" ? {
- fx: fx,
- fy: fy
- } : {
- x1: vector[0],
- y1: vector[1],
- x2: vector[2],
- y2: vector[3],
- gradientTransform: element.matrix.invert()
- });
- SVG.defs.appendChild(el);
- for (var i = 0, ii = dots.length; i < ii; i++) {
- el.appendChild($("stop", {
- offset: dots[i].offset ? dots[i].offset : i ? "100%" : "0%",
- "stop-color": dots[i].color || "#fff"
- }));
- }
- }
- }
- $(o, {
- fill: "url(#" + id + ")",
- opacity: 1,
- "fill-opacity": 1
- });
- s.fill = E;
- s.opacity = 1;
- s.fillOpacity = 1;
- return 1;
- },
- updatePosition = function (o) {
- var bbox = o.getBBox(1);
- $(o.pattern, {patternTransform: o.matrix.invert() + " translate(" + bbox.x + "," + bbox.y + ")"});
- },
- addArrow = function (o, value, isEnd) {
- if (o.type == "path") {
- var values = Str(value).toLowerCase().split("-"),
- p = o.paper,
- se = isEnd ? "end" : "start",
- node = o.node,
- attrs = o.attrs,
- stroke = attrs["stroke-width"],
- i = values.length,
- type = "classic",
- from,
- to,
- dx,
- refX,
- attr,
- w = 3,
- h = 3,
- t = 5;
- while (i--) {
- switch (values[i]) {
- case "block":
- case "classic":
- case "oval":
- case "diamond":
- case "open":
- case "none":
- type = values[i];
- break;
- case "wide": h = 5; break;
- case "narrow": h = 2; break;
- case "long": w = 5; break;
- case "short": w = 2; break;
- }
- }
- if (type == "open") {
- w += 2;
- h += 2;
- t += 2;
- dx = 1;
- refX = isEnd ? 4 : 1;
- attr = {
- fill: "none",
- stroke: attrs.stroke
- };
- } else {
- refX = dx = w / 2;
- attr = {
- fill: attrs.stroke,
- stroke: "none"
- };
- }
- if (o._.arrows) {
- if (isEnd) {
- o._.arrows.endPath && markerCounter[o._.arrows.endPath]--;
- o._.arrows.endMarker && markerCounter[o._.arrows.endMarker]--;
- } else {
- o._.arrows.startPath && markerCounter[o._.arrows.startPath]--;
- o._.arrows.startMarker && markerCounter[o._.arrows.startMarker]--;
- }
- } else {
- o._.arrows = {};
- }
- if (type != "none") {
- var pathId = "raphael-marker-" + type,
- markerId = "raphael-marker-" + se + type + w + h;
- if (!R._g.doc.getElementById(pathId)) {
- p.defs.appendChild($($("path"), {
- "stroke-linecap": "round",
- d: markers[type],
- id: pathId
- }));
- markerCounter[pathId] = 1;
- } else {
- markerCounter[pathId]++;
- }
- var marker = R._g.doc.getElementById(markerId),
- use;
- if (!marker) {
- marker = $($("marker"), {
- id: markerId,
- markerHeight: h,
- markerWidth: w,
- orient: "auto",
- refX: refX,
- refY: h / 2
- });
- use = $($("use"), {
- "xlink:href": "#" + pathId,
- transform: (isEnd ? "rotate(180 " + w / 2 + " " + h / 2 + ") " : E) + "scale(" + w / t + "," + h / t + ")",
- "stroke-width": (1 / ((w / t + h / t) / 2)).toFixed(4)
- });
- marker.appendChild(use);
- p.defs.appendChild(marker);
- markerCounter[markerId] = 1;
- } else {
- markerCounter[markerId]++;
- use = marker.getElementsByTagName("use")[0];
- }
- $(use, attr);
- var delta = dx * (type != "diamond" && type != "oval");
- if (isEnd) {
- from = o._.arrows.startdx * stroke || 0;
- to = R.getTotalLength(attrs.path) - delta * stroke;
- } else {
- from = delta * stroke;
- to = R.getTotalLength(attrs.path) - (o._.arrows.enddx * stroke || 0);
- }
- attr = {};
- attr["marker-" + se] = "url(#" + markerId + ")";
- if (to || from) {
- attr.d = Raphael.getSubpath(attrs.path, from, to);
- }
- $(node, attr);
- o._.arrows[se + "Path"] = pathId;
- o._.arrows[se + "Marker"] = markerId;
- o._.arrows[se + "dx"] = delta;
- o._.arrows[se + "Type"] = type;
- o._.arrows[se + "String"] = value;
- } else {
- if (isEnd) {
- from = o._.arrows.startdx * stroke || 0;
- to = R.getTotalLength(attrs.path) - from;
- } else {
- from = 0;
- to = R.getTotalLength(attrs.path) - (o._.arrows.enddx * stroke || 0);
- }
- o._.arrows[se + "Path"] && $(node, {d: Raphael.getSubpath(attrs.path, from, to)});
- delete o._.arrows[se + "Path"];
- delete o._.arrows[se + "Marker"];
- delete o._.arrows[se + "dx"];
- delete o._.arrows[se + "Type"];
- delete o._.arrows[se + "String"];
- }
- for (attr in markerCounter) if (markerCounter[has](attr) && !markerCounter[attr]) {
- var item = R._g.doc.getElementById(attr);
- item && item.parentNode.removeChild(item);
- }
- }
- },
- dasharray = {
- "": [0],
- "none": [0],
- "-": [3, 1],
- ".": [1, 1],
- "-.": [3, 1, 1, 1],
- "-..": [3, 1, 1, 1, 1, 1],
- ". ": [1, 3],
- "- ": [4, 3],
- "--": [8, 3],
- "- .": [4, 3, 1, 3],
- "--.": [8, 3, 1, 3],
- "--..": [8, 3, 1, 3, 1, 3]
- },
- addDashes = function (o, value, params) {
- value = dasharray[Str(value).toLowerCase()];
- if (value) {
- var width = o.attrs["stroke-width"] || "1",
- butt = {round: width, square: width, butt: 0}[o.attrs["stroke-linecap"] || params["stroke-linecap"]] || 0,
- dashes = [],
- i = value.length;
- while (i--) {
- dashes[i] = value[i] * width + ((i % 2) ? 1 : -1) * butt;
- }
- $(o.node, {"stroke-dasharray": dashes.join(",")});
- }
- },
- setFillAndStroke = function (o, params) {
- var node = o.node,
- attrs = o.attrs,
- vis = node.style.visibility;
- node.style.visibility = "hidden";
- for (var att in params) {
- if (params[has](att)) {
- if (!R._availableAttrs[has](att)) {
- continue;
- }
- var value = params[att];
- attrs[att] = value;
- switch (att) {
- case "blur":
- o.blur(value);
- break;
- case "href":
- case "title":
- case "target":
- var pn = node.parentNode;
- if (pn.tagName.toLowerCase() != "a") {
- var hl = $("a");
- pn.insertBefore(hl, node);
- hl.appendChild(node);
- pn = hl;
- }
- if (att == "target") {
- pn.setAttributeNS(xlink, "show", value == "blank" ? "new" : value);
- } else {
- pn.setAttributeNS(xlink, att, value);
- }
- break;
- case "cursor":
- node.style.cursor = value;
- break;
- case "transform":
- o.transform(value);
- break;
- case "arrow-start":
- addArrow(o, value);
- break;
- case "arrow-end":
- addArrow(o, value, 1);
- break;
- case "clip-rect":
- var rect = Str(value).split(separator);
- if (rect.length == 4) {
- o.clip && o.clip.parentNode.parentNode.removeChild(o.clip.parentNode);
- var el = $("clipPath"),
- rc = $("rect");
- el.id = R.createUUID();
- $(rc, {
- x: rect[0],
- y: rect[1],
- width: rect[2],
- height: rect[3]
- });
- el.appendChild(rc);
- o.paper.defs.appendChild(el);
- $(node, {"clip-path": "url(#" + el.id + ")"});
- o.clip = rc;
- }
- if (!value) {
- var path = node.getAttribute("clip-path");
- if (path) {
- var clip = R._g.doc.getElementById(path.replace(/(^url\(#|\)$)/g, E));
- clip && clip.parentNode.removeChild(clip);
- $(node, {"clip-path": E});
- delete o.clip;
- }
- }
- break;
- case "path":
- if (o.type == "path") {
- $(node, {d: value ? attrs.path = R._pathToAbsolute(value) : "M0,0"});
- o._.dirty = 1;
- if (o._.arrows) {
- "startString" in o._.arrows && addArrow(o, o._.arrows.startString);
- "endString" in o._.arrows && addArrow(o, o._.arrows.endString, 1);
- }
- }
- break;
- case "width":
- node.setAttribute(att, value);
- o._.dirty = 1;
- if (attrs.fx) {
- att = "x";
- value = attrs.x;
- } else {
- break;
- }
- case "x":
- if (attrs.fx) {
- value = -attrs.x - (attrs.width || 0);
- }
- case "rx":
- if (att == "rx" && o.type == "rect") {
- break;
- }
- case "cx":
- node.setAttribute(att, value);
- o.pattern && updatePosition(o);
- o._.dirty = 1;
- break;
- case "height":
- node.setAttribute(att, value);
- o._.dirty = 1;
- if (attrs.fy) {
- att = "y";
- value = attrs.y;
- } else {
- break;
- }
- case "y":
- if (attrs.fy) {
- value = -attrs.y - (attrs.height || 0);
- }
- case "ry":
- if (att == "ry" && o.type == "rect") {
- break;
- }
- case "cy":
- node.setAttribute(att, value);
- o.pattern && updatePosition(o);
- o._.dirty = 1;
- break;
- case "r":
- if (o.type == "rect") {
- $(node, {rx: value, ry: value});
- } else {
- node.setAttribute(att, value);
- }
- o._.dirty = 1;
- break;
- case "src":
- if (o.type == "image") {
- node.setAttributeNS(xlink, "href", value);
- }
- break;
- case "stroke-width":
- if (o._.sx != 1 || o._.sy != 1) {
- value /= mmax(abs(o._.sx), abs(o._.sy)) || 1;
- }
- if (o.paper._vbSize) {
- value *= o.paper._vbSize;
- }
- node.setAttribute(att, value);
- if (attrs["stroke-dasharray"]) {
- addDashes(o, attrs["stroke-dasharray"], params);
- }
- if (o._.arrows) {
- "startString" in o._.arrows && addArrow(o, o._.arrows.startString);
- "endString" in o._.arrows && addArrow(o, o._.arrows.endString, 1);
- }
- break;
- case "stroke-dasharray":
- addDashes(o, value, params);
- break;
- case "fill":
- var isURL = Str(value).match(R._ISURL);
- if (isURL) {
- el = $("pattern");
- var ig = $("image");
- el.id = R.createUUID();
- $(el, {x: 0, y: 0, patternUnits: "userSpaceOnUse", height: 1, width: 1});
- $(ig, {x: 0, y: 0, "xlink:href": isURL[1]});
- el.appendChild(ig);
-
- (function (el) {
- R._preload(isURL[1], function () {
- var w = this.offsetWidth,
- h = this.offsetHeight;
- $(el, {width: w, height: h});
- $(ig, {width: w, height: h});
- o.paper.safari();
- });
- })(el);
- o.paper.defs.appendChild(el);
- $(node, {fill: "url(#" + el.id + ")"});
- o.pattern = el;
- o.pattern && updatePosition(o);
- break;
- }
- var clr = R.getRGB(value);
- if (!clr.error) {
- delete params.gradient;
- delete attrs.gradient;
- !R.is(attrs.opacity, "undefined") &&
- R.is(params.opacity, "undefined") &&
- $(node, {opacity: attrs.opacity});
- !R.is(attrs["fill-opacity"], "undefined") &&
- R.is(params["fill-opacity"], "undefined") &&
- $(node, {"fill-opacity": attrs["fill-opacity"]});
- } else if ((o.type == "circle" || o.type == "ellipse" || Str(value).charAt() != "r") && addGradientFill(o, value)) {
- if ("opacity" in attrs || "fill-opacity" in attrs) {
- var gradient = R._g.doc.getElementById(node.getAttribute("fill").replace(/^url\(#|\)$/g, E));
- if (gradient) {
- var stops = gradient.getElementsByTagName("stop");
- $(stops[stops.length - 1], {"stop-opacity": ("opacity" in attrs ? attrs.opacity : 1) * ("fill-opacity" in attrs ? attrs["fill-opacity"] : 1)});
- }
- }
- attrs.gradient = value;
- attrs.fill = "none";
- break;
- }
- clr[has]("opacity") && $(node, {"fill-opacity": clr.opacity > 1 ? clr.opacity / 100 : clr.opacity});
- case "stroke":
- clr = R.getRGB(value);
- node.setAttribute(att, clr.hex);
- att == "stroke" && clr[has]("opacity") && $(node, {"stroke-opacity": clr.opacity > 1 ? clr.opacity / 100 : clr.opacity});
- if (att == "stroke" && o._.arrows) {
- "startString" in o._.arrows && addArrow(o, o._.arrows.startString);
- "endString" in o._.arrows && addArrow(o, o._.arrows.endString, 1);
- }
- break;
- case "gradient":
- (o.type == "circle" || o.type == "ellipse" || Str(value).charAt() != "r") && addGradientFill(o, value);
- break;
- case "opacity":
- if (attrs.gradient && !attrs[has]("stroke-opacity")) {
- $(node, {"stroke-opacity": value > 1 ? value / 100 : value});
- }
- // fall
- case "fill-opacity":
- if (attrs.gradient) {
- gradient = R._g.doc.getElementById(node.getAttribute("fill").replace(/^url\(#|\)$/g, E));
- if (gradient) {
- stops = gradient.getElementsByTagName("stop");
- $(stops[stops.length - 1], {"stop-opacity": value});
- }
- break;
- }
- default:
- att == "font-size" && (value = toInt(value, 10) + "px");
- var cssrule = att.replace(/(\-.)/g, function (w) {
- return w.substring(1).toUpperCase();
- });
- node.style[cssrule] = value;
- o._.dirty = 1;
- node.setAttribute(att, value);
- break;
- }
- }
- }
-
- tuneText(o, params);
- node.style.visibility = vis;
- },
- leading = 1.2,
- tuneText = function (el, params) {
- if (el.type != "text" || !(params[has]("text") || params[has]("font") || params[has]("font-size") || params[has]("x") || params[has]("y"))) {
- return;
- }
- var a = el.attrs,
- node = el.node,
- fontSize = node.firstChild ? toInt(R._g.doc.defaultView.getComputedStyle(node.firstChild, E).getPropertyValue("font-size"), 10) : 10;
-
- if (params[has]("text")) {
- a.text = params.text;
- while (node.firstChild) {
- node.removeChild(node.firstChild);
- }
- var texts = Str(params.text).split("\n"),
- tspans = [],
- tspan;
- for (var i = 0, ii = texts.length; i < ii; i++) {
- tspan = $("tspan");
- i && $(tspan, {dy: fontSize * leading, x: a.x});
- tspan.appendChild(R._g.doc.createTextNode(texts[i]));
- node.appendChild(tspan);
- tspans[i] = tspan;
- }
- } else {
- tspans = node.getElementsByTagName("tspan");
- for (i = 0, ii = tspans.length; i < ii; i++) if (i) {
- $(tspans[i], {dy: fontSize * leading, x: a.x});
- } else {
- $(tspans[0], {dy: 0});
- }
- }
- $(node, {x: a.x, y: a.y});
- el._.dirty = 1;
- var bb = el._getBBox(),
- dif = a.y - (bb.y + bb.height / 2);
- dif && R.is(dif, "finite") && $(tspans[0], {dy: dif});
- },
- Element = function (node, svg) {
- var X = 0,
- Y = 0;
-
- this[0] = this.node = node;
-
- node.raphael = true;
-
- this.id = R._oid++;
- node.raphaelid = this.id;
- this.matrix = R.matrix();
- this.realPath = null;
-
- this.paper = svg;
- this.attrs = this.attrs || {};
- this._ = {
- transform: [],
- sx: 1,
- sy: 1,
- deg: 0,
- dx: 0,
- dy: 0,
- dirty: 1
- };
- !svg.bottom && (svg.bottom = this);
-
- this.prev = svg.top;
- svg.top && (svg.top.next = this);
- svg.top = this;
-
- this.next = null;
- },
- elproto = R.el;
-
- Element.prototype = elproto;
- elproto.constructor = Element;
-
- R._engine.path = function (pathString, SVG) {
- var el = $("path");
- SVG.canvas && SVG.canvas.appendChild(el);
- var p = new Element(el, SVG);
- p.type = "path";
- setFillAndStroke(p, {
- fill: "none",
- stroke: "#000",
- path: pathString
- });
- return p;
- };
-
- elproto.rotate = function (deg, cx, cy) {
- if (this.removed) {
- return this;
- }
- deg = Str(deg).split(separator);
- if (deg.length - 1) {
- cx = toFloat(deg[1]);
- cy = toFloat(deg[2]);
- }
- deg = toFloat(deg[0]);
- (cy == null) && (cx = cy);
- if (cx == null || cy == null) {
- var bbox = this.getBBox(1);
- cx = bbox.x + bbox.width / 2;
- cy = bbox.y + bbox.height / 2;
- }
- this.transform(this._.transform.concat([["r", deg, cx, cy]]));
- return this;
- };
-
- elproto.scale = function (sx, sy, cx, cy) {
- if (this.removed) {
- return this;
- }
- sx = Str(sx).split(separator);
- if (sx.length - 1) {
- sy = toFloat(sx[1]);
- cx = toFloat(sx[2]);
- cy = toFloat(sx[3]);
- }
- sx = toFloat(sx[0]);
- (sy == null) && (sy = sx);
- (cy == null) && (cx = cy);
- if (cx == null || cy == null) {
- var bbox = this.getBBox(1);
- }
- cx = cx == null ? bbox.x + bbox.width / 2 : cx;
- cy = cy == null ? bbox.y + bbox.height / 2 : cy;
- this.transform(this._.transform.concat([["s", sx, sy, cx, cy]]));
- return this;
- };
-
- elproto.translate = function (dx, dy) {
- if (this.removed) {
- return this;
- }
- dx = Str(dx).split(separator);
- if (dx.length - 1) {
- dy = toFloat(dx[1]);
- }
- dx = toFloat(dx[0]) || 0;
- dy = +dy || 0;
- this.transform(this._.transform.concat([["t", dx, dy]]));
- return this;
- };
-
- elproto.transform = function (tstr) {
- var _ = this._;
- if (tstr == null) {
- return _.transform;
- }
- R._extractTransform(this, tstr);
-
- this.clip && $(this.clip, {transform: this.matrix.invert()});
- this.pattern && updatePosition(this);
- this.node && $(this.node, {transform: this.matrix});
-
- if (_.sx != 1 || _.sy != 1) {
- var sw = this.attrs[has]("stroke-width") ? this.attrs["stroke-width"] : 1;
- this.attr({"stroke-width": sw});
- }
-
- return this;
- };
-
- elproto.hide = function () {
- !this.removed && this.paper.safari(this.node.style.display = "none");
- return this;
- };
-
- elproto.show = function () {
- !this.removed && this.paper.safari(this.node.style.display = "");
- return this;
- };
-
- elproto.remove = function () {
- if (this.removed) {
- return;
- }
- var paper = this.paper;
- paper.__set__ && paper.__set__.exclude(this);
- eve.unbind("*.*." + this.id);
- if (this.gradient) {
- paper.defs.removeChild(this.gradient);
- }
- R._tear(this, paper);
- if (this.node.parentNode.tagName.toLowerCase() == "a") {
- this.node.parentNode.parentNode.removeChild(this.node.parentNode);
- } else {
- this.node.parentNode.removeChild(this.node);
- }
- for (var i in this) {
- this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null;
- }
- this.removed = true;
- };
- elproto._getBBox = function () {
- if (this.node.style.display == "none") {
- this.show();
- var hide = true;
- }
- var bbox = {};
- try {
- bbox = this.node.getBBox();
- } catch(e) {
- // Firefox 3.0.x plays badly here
- } finally {
- bbox = bbox || {};
- }
- hide && this.hide();
- return bbox;
- };
-
- elproto.attr = function (name, value) {
- if (this.removed) {
- return this;
- }
- if (name == null) {
- var res = {};
- for (var a in this.attrs) if (this.attrs[has](a)) {
- res[a] = this.attrs[a];
- }
- res.gradient && res.fill == "none" && (res.fill = res.gradient) && delete res.gradient;
- res.transform = this._.transform;
- return res;
- }
- if (value == null && R.is(name, "string")) {
- if (name == "fill" && this.attrs.fill == "none" && this.attrs.gradient) {
- return this.attrs.gradient;
- }
- if (name == "transform") {
- return this._.transform;
- }
- var names = name.split(separator),
- out = {};
- for (var i = 0, ii = names.length; i < ii; i++) {
- name = names[i];
- if (name in this.attrs) {
- out[name] = this.attrs[name];
- } else if (R.is(this.paper.customAttributes[name], "function")) {
- out[name] = this.paper.customAttributes[name].def;
- } else {
- out[name] = R._availableAttrs[name];
- }
- }
- return ii - 1 ? out : out[names[0]];
- }
- if (value == null && R.is(name, "array")) {
- out = {};
- for (i = 0, ii = name.length; i < ii; i++) {
- out[name[i]] = this.attr(name[i]);
- }
- return out;
- }
- if (value != null) {
- var params = {};
- params[name] = value;
- } else if (name != null && R.is(name, "object")) {
- params = name;
- }
- for (var key in params) {
- eve("attr." + key + "." + this.id, this, params[key]);
- }
- for (key in this.paper.customAttributes) if (this.paper.customAttributes[has](key) && params[has](key) && R.is(this.paper.customAttributes[key], "function")) {
- var par = this.paper.customAttributes[key].apply(this, [].concat(params[key]));
- this.attrs[key] = params[key];
- for (var subkey in par) if (par[has](subkey)) {
- params[subkey] = par[subkey];
- }
- }
- setFillAndStroke(this, params);
- return this;
- };
-
- elproto.toFront = function () {
- if (this.removed) {
- return this;
- }
- if (this.node.parentNode.tagName.toLowerCase() == "a") {
- this.node.parentNode.parentNode.appendChild(this.node.parentNode);
- } else {
- this.node.parentNode.appendChild(this.node);
- }
- var svg = this.paper;
- svg.top != this && R._tofront(this, svg);
- return this;
- };
-
- elproto.toBack = function () {
- if (this.removed) {
- return this;
- }
- var parent = this.node.parentNode;
- if (parent.tagName.toLowerCase() == "a") {
- parent.parentNode.insertBefore(this.node.parentNode, this.node.parentNode.parentNode.firstChild);
- } else if (parent.firstChild != this.node) {
- parent.insertBefore(this.node, this.node.parentNode.firstChild);
- }
- R._toback(this, this.paper);
- var svg = this.paper;
- return this;
- };
-
- elproto.insertAfter = function (element) {
- if (this.removed) {
- return this;
- }
- var node = element.node || element[element.length - 1].node;
- if (node.nextSibling) {
- node.parentNode.insertBefore(this.node, node.nextSibling);
- } else {
- node.parentNode.appendChild(this.node);
- }
- R._insertafter(this, element, this.paper);
- return this;
- };
-
- elproto.insertBefore = function (element) {
- if (this.removed) {
- return this;
- }
- var node = element.node || element[0].node;
- node.parentNode.insertBefore(this.node, node);
- R._insertbefore(this, element, this.paper);
- return this;
- };
- elproto.blur = function (size) {
- // Experimental. No Safari support. Use it on your own risk.
- var t = this;
- if (+size !== 0) {
- var fltr = $("filter"),
- blur = $("feGaussianBlur");
- t.attrs.blur = size;
- fltr.id = R.createUUID();
- $(blur, {stdDeviation: +size || 1.5});
- fltr.appendChild(blur);
- t.paper.defs.appendChild(fltr);
- t._blur = fltr;
- $(t.node, {filter: "url(#" + fltr.id + ")"});
- } else {
- if (t._blur) {
- t._blur.parentNode.removeChild(t._blur);
- delete t._blur;
- delete t.attrs.blur;
- }
- t.node.removeAttribute("filter");
- }
- };
- R._engine.circle = function (svg, x, y, r) {
- var el = $("circle");
- svg.canvas && svg.canvas.appendChild(el);
- var res = new Element(el, svg);
- res.attrs = {cx: x, cy: y, r: r, fill: "none", stroke: "#000"};
- res.type = "circle";
- $(el, res.attrs);
- return res;
- };
- R._engine.rect = function (svg, x, y, w, h, r) {
- var el = $("rect");
- svg.canvas && svg.canvas.appendChild(el);
- var res = new Element(el, svg);
- res.attrs = {x: x, y: y, width: w, height: h, r: r || 0, rx: r || 0, ry: r || 0, fill: "none", stroke: "#000"};
- res.type = "rect";
- $(el, res.attrs);
- return res;
- };
- R._engine.ellipse = function (svg, x, y, rx, ry) {
- var el = $("ellipse");
- svg.canvas && svg.canvas.appendChild(el);
- var res = new Element(el, svg);
- res.attrs = {cx: x, cy: y, rx: rx, ry: ry, fill: "none", stroke: "#000"};
- res.type = "ellipse";
- $(el, res.attrs);
- return res;
- };
- R._engine.image = function (svg, src, x, y, w, h) {
- var el = $("image");
- $(el, {x: x, y: y, width: w, height: h, preserveAspectRatio: "none"});
- el.setAttributeNS(xlink, "href", src);
- svg.canvas && svg.canvas.appendChild(el);
- var res = new Element(el, svg);
- res.attrs = {x: x, y: y, width: w, height: h, src: src};
- res.type = "image";
- return res;
- };
- R._engine.text = function (svg, x, y, text) {
- var el = $("text");
- svg.canvas && svg.canvas.appendChild(el);
- var res = new Element(el, svg);
- res.attrs = {
- x: x,
- y: y,
- "text-anchor": "middle",
- text: text,
- font: R._availableAttrs.font,
- stroke: "none",
- fill: "#000"
- };
- res.type = "text";
- setFillAndStroke(res, res.attrs);
- return res;
- };
- R._engine.setSize = function (width, height) {
- this.width = width || this.width;
- this.height = height || this.height;
- this.canvas.setAttribute("width", this.width);
- this.canvas.setAttribute("height", this.height);
- if (this._viewBox) {
- this.setViewBox.apply(this, this._viewBox);
- }
- return this;
- };
- R._engine.create = function () {
- var con = R._getContainer.apply(0, arguments),
- container = con && con.container,
- x = con.x,
- y = con.y,
- width = con.width,
- height = con.height;
- if (!container) {
- throw new Error("SVG container not found.");
- }
- var cnvs = $("svg"),
- css = "overflow:hidden;",
- isFloating;
- x = x || 0;
- y = y || 0;
- width = width || 512;
- height = height || 342;
- $(cnvs, {
- height: height,
- version: 1.1,
- width: width,
- xmlns: "http://www.w3.org/2000/svg"
- });
- if (container == 1) {
- cnvs.style.cssText = css + "position:absolute;left:" + x + "px;top:" + y + "px";
- R._g.doc.body.appendChild(cnvs);
- isFloating = 1;
- } else {
- cnvs.style.cssText = css + "position:relative";
- if (container.firstChild) {
- container.insertBefore(cnvs, container.firstChild);
- } else {
- container.appendChild(cnvs);
- }
- }
- container = new R._Paper;
- container.width = width;
- container.height = height;
- container.canvas = cnvs;
- container.clear();
- container._left = container._top = 0;
- isFloating && (container.renderfix = function () {});
- container.renderfix();
- return container;
- };
- R._engine.setViewBox = function (x, y, w, h, fit) {
- eve("setViewBox", this, this._viewBox, [x, y, w, h, fit]);
- var size = mmax(w / this.width, h / this.height),
- top = this.top,
- aspectRatio = fit ? "meet" : "xMinYMin",
- vb,
- sw;
- if (x == null) {
- if (this._vbSize) {
- size = 1;
- }
- delete this._vbSize;
- vb = "0 0 " + this.width + S + this.height;
- } else {
- this._vbSize = size;
- vb = x + S + y + S + w + S + h;
- }
- $(this.canvas, {
- viewBox: vb,
- preserveAspectRatio: aspectRatio
- });
- while (size && top) {
- sw = "stroke-width" in top.attrs ? top.attrs["stroke-width"] : 1;
- top.attr({"stroke-width": sw});
- top._.dirty = 1;
- top._.dirtyT = 1;
- top = top.prev;
- }
- this._viewBox = [x, y, w, h, !!fit];
- return this;
- };
-
- R.prototype.renderfix = function () {
- var cnvs = this.canvas,
- s = cnvs.style,
- pos;
- try {
- pos = cnvs.getScreenCTM() || cnvs.createSVGMatrix();
- } catch (e) {
- pos = cnvs.createSVGMatrix();
- }
- var left = -pos.e % 1,
- top = -pos.f % 1;
- if (left || top) {
- if (left) {
- this._left = (this._left + left) % 1;
- s.left = this._left + "px";
- }
- if (top) {
- this._top = (this._top + top) % 1;
- s.top = this._top + "px";
- }
- }
- };
-
- R.prototype.clear = function () {
- R.eve("clear", this);
- var c = this.canvas;
- while (c.firstChild) {
- c.removeChild(c.firstChild);
- }
- this.bottom = this.top = null;
- (this.desc = $("desc")).appendChild(R._g.doc.createTextNode("Created with Rapha\xebl " + R.version));
- c.appendChild(this.desc);
- c.appendChild(this.defs = $("defs"));
- };
-
- R.prototype.remove = function () {
- eve("remove", this);
- this.canvas.parentNode && this.canvas.parentNode.removeChild(this.canvas);
- for (var i in this) {
- this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null;
- }
- };
- var setproto = R.st;
- for (var method in elproto) if (elproto[has](method) && !setproto[has](method)) {
- setproto[method] = (function (methodname) {
- return function () {
- var arg = arguments;
- return this.forEach(function (el) {
- el[methodname].apply(el, arg);
- });
- };
- })(method);
- }
-}(window.Raphael);
-
-// ┌─────────────────────────────────────────────────────────────────────┠\\
-// │ Raphaël - JavaScript Vector Library │ \\
-// ├─────────────────────────────────────────────────────────────────────┤ \\
-// │ VML Module │ \\
-// ├─────────────────────────────────────────────────────────────────────┤ \\
-// │ Copyright (c) 2008-2011 Dmitry Baranovskiy (http://raphaeljs.com) │ \\
-// │ Copyright (c) 2008-2011 Sencha Labs (http://sencha.com) │ \\
-// │ Licensed under the MIT (http://raphaeljs.com/license.html) license. │ \\
-// └─────────────────────────────────────────────────────────────────────┘ \\
-window.Raphael.vml && function (R) {
- var has = "hasOwnProperty",
- Str = String,
- toFloat = parseFloat,
- math = Math,
- round = math.round,
- mmax = math.max,
- mmin = math.min,
- abs = math.abs,
- fillString = "fill",
- separator = /[, ]+/,
- eve = R.eve,
- ms = " progid:DXImageTransform.Microsoft",
- S = " ",
- E = "",
- map = {M: "m", L: "l", C: "c", Z: "x", m: "t", l: "r", c: "v", z: "x"},
- bites = /([clmz]),?([^clmz]*)/gi,
- blurregexp = / progid:\S+Blur\([^\)]+\)/g,
- val = /-?[^,\s-]+/g,
- cssDot = "position:absolute;left:0;top:0;width:1px;height:1px",
- zoom = 21600,
- pathTypes = {path: 1, rect: 1, image: 1},
- ovalTypes = {circle: 1, ellipse: 1},
- path2vml = function (path) {
- var total = /[ahqstv]/ig,
- command = R._pathToAbsolute;
- Str(path).match(total) && (command = R._path2curve);
- total = /[clmz]/g;
- if (command == R._pathToAbsolute && !Str(path).match(total)) {
- var res = Str(path).replace(bites, function (all, command, args) {
- var vals = [],
- isMove = command.toLowerCase() == "m",
- res = map[command];
- args.replace(val, function (value) {
- if (isMove && vals.length == 2) {
- res += vals + map[command == "m" ? "l" : "L"];
- vals = [];
- }
- vals.push(round(value * zoom));
- });
- return res + vals;
- });
- return res;
- }
- var pa = command(path), p, r;
- res = [];
- for (var i = 0, ii = pa.length; i < ii; i++) {
- p = pa[i];
- r = pa[i][0].toLowerCase();
- r == "z" && (r = "x");
- for (var j = 1, jj = p.length; j < jj; j++) {
- r += round(p[j] * zoom) + (j != jj - 1 ? "," : E);
- }
- res.push(r);
- }
- return res.join(S);
- },
- compensation = function (deg, dx, dy) {
- var m = R.matrix();
- m.rotate(-deg, .5, .5);
- return {
- dx: m.x(dx, dy),
- dy: m.y(dx, dy)
- };
- },
- setCoords = function (p, sx, sy, dx, dy, deg) {
- var _ = p._,
- m = p.matrix,
- fillpos = _.fillpos,
- o = p.node,
- s = o.style,
- y = 1,
- flip = "",
- dxdy,
- kx = zoom / sx,
- ky = zoom / sy;
- s.visibility = "hidden";
- if (!sx || !sy) {
- return;
- }
- o.coordsize = abs(kx) + S + abs(ky);
- s.rotation = deg * (sx * sy < 0 ? -1 : 1);
- if (deg) {
- var c = compensation(deg, dx, dy);
- dx = c.dx;
- dy = c.dy;
- }
- sx < 0 && (flip += "x");
- sy < 0 && (flip += " y") && (y = -1);
- s.flip = flip;
- o.coordorigin = (dx * -kx) + S + (dy * -ky);
- if (fillpos || _.fillsize) {
- var fill = o.getElementsByTagName(fillString);
- fill = fill && fill[0];
- o.removeChild(fill);
- if (fillpos) {
- c = compensation(deg, m.x(fillpos[0], fillpos[1]), m.y(fillpos[0], fillpos[1]));
- fill.position = c.dx * y + S + c.dy * y;
- }
- if (_.fillsize) {
- fill.size = _.fillsize[0] * abs(sx) + S + _.fillsize[1] * abs(sy);
- }
- o.appendChild(fill);
- }
- s.visibility = "visible";
- };
- R.toString = function () {
- return "Your browser doesn\u2019t support SVG. Falling down to VML.\nYou are running Rapha\xebl " + this.version;
- };
- var addArrow = function (o, value, isEnd) {
- var values = Str(value).toLowerCase().split("-"),
- se = isEnd ? "end" : "start",
- i = values.length,
- type = "classic",
- w = "medium",
- h = "medium";
- while (i--) {
- switch (values[i]) {
- case "block":
- case "classic":
- case "oval":
- case "diamond":
- case "open":
- case "none":
- type = values[i];
- break;
- case "wide":
- case "narrow": h = values[i]; break;
- case "long":
- case "short": w = values[i]; break;
- }
- }
- var stroke = o.node.getElementsByTagName("stroke")[0];
- stroke[se + "arrow"] = type;
- stroke[se + "arrowlength"] = w;
- stroke[se + "arrowwidth"] = h;
- },
- setFillAndStroke = function (o, params) {
- // o.paper.canvas.style.display = "none";
- o.attrs = o.attrs || {};
- var node = o.node,
- a = o.attrs,
- s = node.style,
- xy,
- newpath = pathTypes[o.type] && (params.x != a.x || params.y != a.y || params.width != a.width || params.height != a.height || params.cx != a.cx || params.cy != a.cy || params.rx != a.rx || params.ry != a.ry || params.r != a.r),
- isOval = ovalTypes[o.type] && (a.cx != params.cx || a.cy != params.cy || a.r != params.r || a.rx != params.rx || a.ry != params.ry),
- res = o;
-
-
- for (var par in params) if (params[has](par)) {
- a[par] = params[par];
- }
- if (newpath) {
- a.path = R._getPath[o.type](o);
- o._.dirty = 1;
- }
- params.href && (node.href = params.href);
- params.title && (node.title = params.title);
- params.target && (node.target = params.target);
- params.cursor && (s.cursor = params.cursor);
- "blur" in params && o.blur(params.blur);
- if (params.path && o.type == "path" || newpath) {
- node.path = path2vml(~Str(a.path).toLowerCase().indexOf("r") ? R._pathToAbsolute(a.path) : a.path);
- if (o.type == "image") {
- o._.fillpos = [a.x, a.y];
- o._.fillsize = [a.width, a.height];
- setCoords(o, 1, 1, 0, 0, 0);
- }
- }
- "transform" in params && o.transform(params.transform);
- if (isOval) {
- var cx = +a.cx,
- cy = +a.cy,
- rx = +a.rx || +a.r || 0,
- ry = +a.ry || +a.r || 0;
- node.path = R.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x", round((cx - rx) * zoom), round((cy - ry) * zoom), round((cx + rx) * zoom), round((cy + ry) * zoom), round(cx * zoom));
- }
- if ("clip-rect" in params) {
- var rect = Str(params["clip-rect"]).split(separator);
- if (rect.length == 4) {
- rect[2] = +rect[2] + (+rect[0]);
- rect[3] = +rect[3] + (+rect[1]);
- var div = node.clipRect || R._g.doc.createElement("div"),
- dstyle = div.style;
- dstyle.clip = R.format("rect({1}px {2}px {3}px {0}px)", rect);
- if (!node.clipRect) {
- dstyle.position = "absolute";
- dstyle.top = 0;
- dstyle.left = 0;
- dstyle.width = o.paper.width + "px";
- dstyle.height = o.paper.height + "px";
- node.parentNode.insertBefore(div, node);
- div.appendChild(node);
- node.clipRect = div;
- }
- }
- if (!params["clip-rect"]) {
- node.clipRect && (node.clipRect.style.clip = "auto");
- }
- }
- if (o.textpath) {
- var textpathStyle = o.textpath.style;
- params.font && (textpathStyle.font = params.font);
- params["font-family"] && (textpathStyle.fontFamily = '"' + params["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g, E) + '"');
- params["font-size"] && (textpathStyle.fontSize = params["font-size"]);
- params["font-weight"] && (textpathStyle.fontWeight = params["font-weight"]);
- params["font-style"] && (textpathStyle.fontStyle = params["font-style"]);
- }
- if ("arrow-start" in params) {
- addArrow(res, params["arrow-start"]);
- }
- if ("arrow-end" in params) {
- addArrow(res, params["arrow-end"], 1);
- }
- if (params.opacity != null ||
- params["stroke-width"] != null ||
- params.fill != null ||
- params.src != null ||
- params.stroke != null ||
- params["stroke-width"] != null ||
- params["stroke-opacity"] != null ||
- params["fill-opacity"] != null ||
- params["stroke-dasharray"] != null ||
- params["stroke-miterlimit"] != null ||
- params["stroke-linejoin"] != null ||
- params["stroke-linecap"] != null) {
- var fill = node.getElementsByTagName(fillString),
- newfill = false;
- fill = fill && fill[0];
- !fill && (newfill = fill = createNode(fillString));
- if (o.type == "image" && params.src) {
- fill.src = params.src;
- }
- params.fill && (fill.on = true);
- if (fill.on == null || params.fill == "none" || params.fill === null) {
- fill.on = false;
- }
- if (fill.on && params.fill) {
- var isURL = Str(params.fill).match(R._ISURL);
- if (isURL) {
- fill.parentNode == node && node.removeChild(fill);
- fill.rotate = true;
- fill.src = isURL[1];
- fill.type = "tile";
- var bbox = o.getBBox(1);
- fill.position = bbox.x + S + bbox.y;
- o._.fillpos = [bbox.x, bbox.y];
-
- R._preload(isURL[1], function () {
- o._.fillsize = [this.offsetWidth, this.offsetHeight];
- });
- } else {
- fill.color = R.getRGB(params.fill).hex;
- fill.src = E;
- fill.type = "solid";
- if (R.getRGB(params.fill).error && (res.type in {circle: 1, ellipse: 1} || Str(params.fill).charAt() != "r") && addGradientFill(res, params.fill, fill)) {
- a.fill = "none";
- a.gradient = params.fill;
- fill.rotate = false;
- }
- }
- }
- if ("fill-opacity" in params || "opacity" in params) {
- var opacity = ((+a["fill-opacity"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1) * ((+R.getRGB(params.fill).o + 1 || 2) - 1);
- opacity = mmin(mmax(opacity, 0), 1);
- fill.opacity = opacity;
- if (fill.src) {
- fill.color = "none";
- }
- }
- node.appendChild(fill);
- var stroke = (node.getElementsByTagName("stroke") && node.getElementsByTagName("stroke")[0]),
- newstroke = false;
- !stroke && (newstroke = stroke = createNode("stroke"));
- if ((params.stroke && params.stroke != "none") ||
- params["stroke-width"] ||
- params["stroke-opacity"] != null ||
- params["stroke-dasharray"] ||
- params["stroke-miterlimit"] ||
- params["stroke-linejoin"] ||
- params["stroke-linecap"]) {
- stroke.on = true;
- }
- (params.stroke == "none" || params.stroke === null || stroke.on == null || params.stroke == 0 || params["stroke-width"] == 0) && (stroke.on = false);
- var strokeColor = R.getRGB(params.stroke);
- stroke.on && params.stroke && (stroke.color = strokeColor.hex);
- opacity = ((+a["stroke-opacity"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1) * ((+strokeColor.o + 1 || 2) - 1);
- var width = (toFloat(params["stroke-width"]) || 1) * .75;
- opacity = mmin(mmax(opacity, 0), 1);
- params["stroke-width"] == null && (width = a["stroke-width"]);
- params["stroke-width"] && (stroke.weight = width);
- width && width < 1 && (opacity *= width) && (stroke.weight = 1);
- stroke.opacity = opacity;
-
- params["stroke-linejoin"] && (stroke.joinstyle = params["stroke-linejoin"] || "miter");
- stroke.miterlimit = params["stroke-miterlimit"] || 8;
- params["stroke-linecap"] && (stroke.endcap = params["stroke-linecap"] == "butt" ? "flat" : params["stroke-linecap"] == "square" ? "square" : "round");
- if (params["stroke-dasharray"]) {
- var dasharray = {
- "-": "shortdash",
- ".": "shortdot",
- "-.": "shortdashdot",
- "-..": "shortdashdotdot",
- ". ": "dot",
- "- ": "dash",
- "--": "longdash",
- "- .": "dashdot",
- "--.": "longdashdot",
- "--..": "longdashdotdot"
- };
- stroke.dashstyle = dasharray[has](params["stroke-dasharray"]) ? dasharray[params["stroke-dasharray"]] : E;
- }
- newstroke && node.appendChild(stroke);
- }
- if (res.type == "text") {
- res.paper.canvas.style.display = E;
- var span = res.paper.span,
- m = 100,
- fontSize = a.font && a.font.match(/\d+(?:\.\d*)?(?=px)/);
- s = span.style;
- a.font && (s.font = a.font);
- a["font-family"] && (s.fontFamily = a["font-family"]);
- a["font-weight"] && (s.fontWeight = a["font-weight"]);
- a["font-style"] && (s.fontStyle = a["font-style"]);
- fontSize = toFloat(a["font-size"] || fontSize && fontSize[0]) || 10;
- s.fontSize = fontSize * m + "px";
- res.textpath.string && (span.innerHTML = Str(res.textpath.string).replace(/</g, "&#60;").replace(/&/g, "&#38;").replace(/\n/g, "<br>"));
- var brect = span.getBoundingClientRect();
- res.W = a.w = (brect.right - brect.left) / m;
- res.H = a.h = (brect.bottom - brect.top) / m;
- // res.paper.canvas.style.display = "none";
- res.X = a.x;
- res.Y = a.y + res.H / 2;
-
- ("x" in params || "y" in params) && (res.path.v = R.format("m{0},{1}l{2},{1}", round(a.x * zoom), round(a.y * zoom), round(a.x * zoom) + 1));
- var dirtyattrs = ["x", "y", "text", "font", "font-family", "font-weight", "font-style", "font-size"];
- for (var d = 0, dd = dirtyattrs.length; d < dd; d++) if (dirtyattrs[d] in params) {
- res._.dirty = 1;
- break;
- }
-
- // text-anchor emulation
- switch (a["text-anchor"]) {
- case "start":
- res.textpath.style["v-text-align"] = "left";
- res.bbx = res.W / 2;
- break;
- case "end":
- res.textpath.style["v-text-align"] = "right";
- res.bbx = -res.W / 2;
- break;
- default:
- res.textpath.style["v-text-align"] = "center";
- res.bbx = 0;
- break;
- }
- res.textpath.style["v-text-kern"] = true;
- }
- // res.paper.canvas.style.display = E;
- },
- addGradientFill = function (o, gradient, fill) {
- o.attrs = o.attrs || {};
- var attrs = o.attrs,
- pow = Math.pow,
- opacity,
- oindex,
- type = "linear",
- fxfy = ".5 .5";
- o.attrs.gradient = gradient;
- gradient = Str(gradient).replace(R._radial_gradient, function (all, fx, fy) {
- type = "radial";
- if (fx && fy) {
- fx = toFloat(fx);
- fy = toFloat(fy);
- pow(fx - .5, 2) + pow(fy - .5, 2) > .25 && (fy = math.sqrt(.25 - pow(fx - .5, 2)) * ((fy > .5) * 2 - 1) + .5);
- fxfy = fx + S + fy;
- }
- return E;
- });
- gradient = gradient.split(/\s*\-\s*/);
- if (type == "linear") {
- var angle = gradient.shift();
- angle = -toFloat(angle);
- if (isNaN(angle)) {
- return null;
- }
- }
- var dots = R._parseDots(gradient);
- if (!dots) {
- return null;
- }
- o = o.shape || o.node;
- if (dots.length) {
- o.removeChild(fill);
- fill.on = true;
- fill.method = "none";
- fill.color = dots[0].color;
- fill.color2 = dots[dots.length - 1].color;
- var clrs = [];
- for (var i = 0, ii = dots.length; i < ii; i++) {
- dots[i].offset && clrs.push(dots[i].offset + S + dots[i].color);
- }
- fill.colors = clrs.length ? clrs.join() : "0% " + fill.color;
- if (type == "radial") {
- fill.type = "gradientTitle";
- fill.focus = "100%";
- fill.focussize = "0 0";
- fill.focusposition = fxfy;
- fill.angle = 0;
- } else {
- // fill.rotate= true;
- fill.type = "gradient";
- fill.angle = (270 - angle) % 360;
- }
- o.appendChild(fill);
- }
- return 1;
- },
- Element = function (node, vml) {
- this[0] = this.node = node;
- node.raphael = true;
- this.id = R._oid++;
- node.raphaelid = this.id;
- this.X = 0;
- this.Y = 0;
- this.attrs = {};
- this.paper = vml;
- this.matrix = R.matrix();
- this._ = {
- transform: [],
- sx: 1,
- sy: 1,
- dx: 0,
- dy: 0,
- deg: 0,
- dirty: 1,
- dirtyT: 1
- };
- !vml.bottom && (vml.bottom = this);
- this.prev = vml.top;
- vml.top && (vml.top.next = this);
- vml.top = this;
- this.next = null;
- };
- var elproto = R.el;
-
- Element.prototype = elproto;
- elproto.constructor = Element;
- elproto.transform = function (tstr) {
- if (tstr == null) {
- return this._.transform;
- }
- var vbs = this.paper._viewBoxShift,
- vbt = vbs ? "s" + [vbs.scale, vbs.scale] + "-1-1t" + [vbs.dx, vbs.dy] : E,
- oldt;
- if (vbs) {
- oldt = tstr = Str(tstr).replace(/\.{3}|\u2026/g, this._.transform || E);
- }
- R._extractTransform(this, vbt + tstr);
- var matrix = this.matrix.clone(),
- skew = this.skew,
- o = this.node,
- split,
- isGrad = ~Str(this.attrs.fill).indexOf("-"),
- isPatt = !Str(this.attrs.fill).indexOf("url(");
- matrix.translate(-.5, -.5);
- if (isPatt || isGrad || this.type == "image") {
- skew.matrix = "1 0 0 1";
- skew.offset = "0 0";
- split = matrix.split();
- if ((isGrad && split.noRotation) || !split.isSimple) {
- o.style.filter = matrix.toFilter();
- var bb = this.getBBox(),
- bbt = this.getBBox(1),
- dx = bb.x - bbt.x,
- dy = bb.y - bbt.y;
- o.coordorigin = (dx * -zoom) + S + (dy * -zoom);
- setCoords(this, 1, 1, dx, dy, 0);
- } else {
- o.style.filter = E;
- setCoords(this, split.scalex, split.scaley, split.dx, split.dy, split.rotate);
- }
- } else {
- o.style.filter = E;
- skew.matrix = Str(matrix);
- skew.offset = matrix.offset();
- }
- oldt && (this._.transform = oldt);
- return this;
- };
- elproto.rotate = function (deg, cx, cy) {
- if (this.removed) {
- return this;
- }
- if (deg == null) {
- return;
- }
- deg = Str(deg).split(separator);
- if (deg.length - 1) {
- cx = toFloat(deg[1]);
- cy = toFloat(deg[2]);
- }
- deg = toFloat(deg[0]);
- (cy == null) && (cx = cy);
- if (cx == null || cy == null) {
- var bbox = this.getBBox(1);
- cx = bbox.x + bbox.width / 2;
- cy = bbox.y + bbox.height / 2;
- }
- this._.dirtyT = 1;
- this.transform(this._.transform.concat([["r", deg, cx, cy]]));
- return this;
- };
- elproto.translate = function (dx, dy) {
- if (this.removed) {
- return this;
- }
- dx = Str(dx).split(separator);
- if (dx.length - 1) {
- dy = toFloat(dx[1]);
- }
- dx = toFloat(dx[0]) || 0;
- dy = +dy || 0;
- if (this._.bbox) {
- this._.bbox.x += dx;
- this._.bbox.y += dy;
- }
- this.transform(this._.transform.concat([["t", dx, dy]]));
- return this;
- };
- elproto.scale = function (sx, sy, cx, cy) {
- if (this.removed) {
- return this;
- }
- sx = Str(sx).split(separator);
- if (sx.length - 1) {
- sy = toFloat(sx[1]);
- cx = toFloat(sx[2]);
- cy = toFloat(sx[3]);
- isNaN(cx) && (cx = null);
- isNaN(cy) && (cy = null);
- }
- sx = toFloat(sx[0]);
- (sy == null) && (sy = sx);
- (cy == null) && (cx = cy);
- if (cx == null || cy == null) {
- var bbox = this.getBBox(1);
- }
- cx = cx == null ? bbox.x + bbox.width / 2 : cx;
- cy = cy == null ? bbox.y + bbox.height / 2 : cy;
-
- this.transform(this._.transform.concat([["s", sx, sy, cx, cy]]));
- this._.dirtyT = 1;
- return this;
- };
- elproto.hide = function () {
- !this.removed && (this.node.style.display = "none");
- return this;
- };
- elproto.show = function () {
- !this.removed && (this.node.style.display = E);
- return this;
- };
- elproto._getBBox = function () {
- if (this.removed) {
- return {};
- }
- return {
- x: this.X + (this.bbx || 0) - this.W / 2,
- y: this.Y - this.H,
- width: this.W,
- height: this.H
- };
- };
- elproto.remove = function () {
- if (this.removed) {
- return;
- }
- this.paper.__set__ && this.paper.__set__.exclude(this);
- R.eve.unbind("*.*." + this.id);
- R._tear(this, this.paper);
- this.node.parentNode.removeChild(this.node);
- this.shape && this.shape.parentNode.removeChild(this.shape);
- for (var i in this) {
- this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null;
- }
- this.removed = true;
- };
- elproto.attr = function (name, value) {
- if (this.removed) {
- return this;
- }
- if (name == null) {
- var res = {};
- for (var a in this.attrs) if (this.attrs[has](a)) {
- res[a] = this.attrs[a];
- }
- res.gradient && res.fill == "none" && (res.fill = res.gradient) && delete res.gradient;
- res.transform = this._.transform;
- return res;
- }
- if (value == null && R.is(name, "string")) {
- if (name == fillString && this.attrs.fill == "none" && this.attrs.gradient) {
- return this.attrs.gradient;
- }
- var names = name.split(separator),
- out = {};
- for (var i = 0, ii = names.length; i < ii; i++) {
- name = names[i];
- if (name in this.attrs) {
- out[name] = this.attrs[name];
- } else if (R.is(this.paper.customAttributes[name], "function")) {
- out[name] = this.paper.customAttributes[name].def;
- } else {
- out[name] = R._availableAttrs[name];
- }
- }
- return ii - 1 ? out : out[names[0]];
- }
- if (this.attrs && value == null && R.is(name, "array")) {
- out = {};
- for (i = 0, ii = name.length; i < ii; i++) {
- out[name[i]] = this.attr(name[i]);
- }
- return out;
- }
- var params;
- if (value != null) {
- params = {};
- params[name] = value;
- }
- value == null && R.is(name, "object") && (params = name);
- for (var key in params) {
- eve("attr." + key + "." + this.id, this, params[key]);
- }
- if (params) {
- for (key in this.paper.customAttributes) if (this.paper.customAttributes[has](key) && params[has](key) && R.is(this.paper.customAttributes[key], "function")) {
- var par = this.paper.customAttributes[key].apply(this, [].concat(params[key]));
- this.attrs[key] = params[key];
- for (var subkey in par) if (par[has](subkey)) {
- params[subkey] = par[subkey];
- }
- }
- // this.paper.canvas.style.display = "none";
- if (params.text && this.type == "text") {
- this.textpath.string = params.text;
- }
- setFillAndStroke(this, params);
- // this.paper.canvas.style.display = E;
- }
- return this;
- };
- elproto.toFront = function () {
- !this.removed && this.node.parentNode.appendChild(this.node);
- this.paper && this.paper.top != this && R._tofront(this, this.paper);
- return this;
- };
- elproto.toBack = function () {
- if (this.removed) {
- return this;
- }
- if (this.node.parentNode.firstChild != this.node) {
- this.node.parentNode.insertBefore(this.node, this.node.parentNode.firstChild);
- R._toback(this, this.paper);
- }
- return this;
- };
- elproto.insertAfter = function (element) {
- if (this.removed) {
- return this;
- }
- if (element.constructor == R.st.constructor) {
- element = element[element.length - 1];
- }
- if (element.node.nextSibling) {
- element.node.parentNode.insertBefore(this.node, element.node.nextSibling);
- } else {
- element.node.parentNode.appendChild(this.node);
- }
- R._insertafter(this, element, this.paper);
- return this;
- };
- elproto.insertBefore = function (element) {
- if (this.removed) {
- return this;
- }
- if (element.constructor == R.st.constructor) {
- element = element[0];
- }
- element.node.parentNode.insertBefore(this.node, element.node);
- R._insertbefore(this, element, this.paper);
- return this;
- };
- elproto.blur = function (size) {
- var s = this.node.runtimeStyle,
- f = s.filter;
- f = f.replace(blurregexp, E);
- if (+size !== 0) {
- this.attrs.blur = size;
- s.filter = f + S + ms + ".Blur(pixelradius=" + (+size || 1.5) + ")";
- s.margin = R.format("-{0}px 0 0 -{0}px", round(+size || 1.5));
- } else {
- s.filter = f;
- s.margin = 0;
- delete this.attrs.blur;
- }
- };
-
- R._engine.path = function (pathString, vml) {
- var el = createNode("shape");
- el.style.cssText = cssDot;
- el.coordsize = zoom + S + zoom;
- el.coordorigin = vml.coordorigin;
- var p = new Element(el, vml),
- attr = {fill: "none", stroke: "#000"};
- pathString && (attr.path = pathString);
- p.type = "path";
- p.path = [];
- p.Path = E;
- setFillAndStroke(p, attr);
- vml.canvas.appendChild(el);
- var skew = createNode("skew");
- skew.on = true;
- el.appendChild(skew);
- p.skew = skew;
- p.transform(E);
- return p;
- };
- R._engine.rect = function (vml, x, y, w, h, r) {
- var path = R._rectPath(x, y, w, h, r),
- res = vml.path(path),
- a = res.attrs;
- res.X = a.x = x;
- res.Y = a.y = y;
- res.W = a.width = w;
- res.H = a.height = h;
- a.r = r;
- a.path = path;
- res.type = "rect";
- return res;
- };
- R._engine.ellipse = function (vml, x, y, rx, ry) {
- var res = vml.path(),
- a = res.attrs;
- res.X = x - rx;
- res.Y = y - ry;
- res.W = rx * 2;
- res.H = ry * 2;
- res.type = "ellipse";
- setFillAndStroke(res, {
- cx: x,
- cy: y,
- rx: rx,
- ry: ry
- });
- return res;
- };
- R._engine.circle = function (vml, x, y, r) {
- var res = vml.path(),
- a = res.attrs;
- res.X = x - r;
- res.Y = y - r;
- res.W = res.H = r * 2;
- res.type = "circle";
- setFillAndStroke(res, {
- cx: x,
- cy: y,
- r: r
- });
- return res;
- };
- R._engine.image = function (vml, src, x, y, w, h) {
- var path = R._rectPath(x, y, w, h),
- res = vml.path(path).attr({stroke: "none"}),
- a = res.attrs,
- node = res.node,
- fill = node.getElementsByTagName(fillString)[0];
- a.src = src;
- res.X = a.x = x;
- res.Y = a.y = y;
- res.W = a.width = w;
- res.H = a.height = h;
- a.path = path;
- res.type = "image";
- fill.parentNode == node && node.removeChild(fill);
- fill.rotate = true;
- fill.src = src;
- fill.type = "tile";
- res._.fillpos = [x, y];
- res._.fillsize = [w, h];
- node.appendChild(fill);
- setCoords(res, 1, 1, 0, 0, 0);
- return res;
- };
- R._engine.text = function (vml, x, y, text) {
- var el = createNode("shape"),
- path = createNode("path"),
- o = createNode("textpath");
- x = x || 0;
- y = y || 0;
- text = text || "";
- path.v = R.format("m{0},{1}l{2},{1}", round(x * zoom), round(y * zoom), round(x * zoom) + 1);
- path.textpathok = true;
- o.string = Str(text);
- o.on = true;
- el.style.cssText = cssDot;
- el.coordsize = zoom + S + zoom;
- el.coordorigin = "0 0";
- var p = new Element(el, vml),
- attr = {
- fill: "#000",
- stroke: "none",
- font: R._availableAttrs.font,
- text: text
- };
- p.shape = el;
- p.path = path;
- p.textpath = o;
- p.type = "text";
- p.attrs.text = Str(text);
- p.attrs.x = x;
- p.attrs.y = y;
- p.attrs.w = 1;
- p.attrs.h = 1;
- setFillAndStroke(p, attr);
- el.appendChild(o);
- el.appendChild(path);
- vml.canvas.appendChild(el);
- var skew = createNode("skew");
- skew.on = true;
- el.appendChild(skew);
- p.skew = skew;
- p.transform(E);
- return p;
- };
- R._engine.setSize = function (width, height) {
- var cs = this.canvas.style;
- this.width = width;
- this.height = height;
- width == +width && (width += "px");
- height == +height && (height += "px");
- cs.width = width;
- cs.height = height;
- cs.clip = "rect(0 " + width + " " + height + " 0)";
- if (this._viewBox) {
- R._engine.setViewBox.apply(this, this._viewBox);
- }
- return this;
- };
- R._engine.setViewBox = function (x, y, w, h, fit) {
- R.eve("setViewBox", this, this._viewBox, [x, y, w, h, fit]);
- var width = this.width,
- height = this.height,
- size = 1 / mmax(w / width, h / height),
- H, W;
- if (fit) {
- H = height / h;
- W = width / w;
- if (w * H < width) {
- x -= (width - w * H) / 2 / H;
- }
- if (h * W < height) {
- y -= (height - h * W) / 2 / W;
- }
- }
- this._viewBox = [x, y, w, h, !!fit];
- this._viewBoxShift = {
- dx: -x,
- dy: -y,
- scale: size
- };
- this.forEach(function (el) {
- el.transform("...");
- });
- return this;
- };
- var createNode;
- R._engine.initWin = function (win) {
- var doc = win.document;
- doc.createStyleSheet().addRule(".rvml", "behavior:url(#default#VML)");
- try {
- !doc.namespaces.rvml && doc.namespaces.add("rvml", "urn:schemas-microsoft-com:vml");
- createNode = function (tagName) {
- return doc.createElement('<rvml:' + tagName + ' class="rvml">');
- };
- } catch (e) {
- createNode = function (tagName) {
- return doc.createElement('<' + tagName + ' xmlns="urn:schemas-microsoft.com:vml" class="rvml">');
- };
- }
- };
- R._engine.initWin(R._g.win);
- R._engine.create = function () {
- var con = R._getContainer.apply(0, arguments),
- container = con.container,
- height = con.height,
- s,
- width = con.width,
- x = con.x,
- y = con.y;
- if (!container) {
- throw new Error("VML container not found.");
- }
- var res = new R._Paper,
- c = res.canvas = R._g.doc.createElement("div"),
- cs = c.style;
- x = x || 0;
- y = y || 0;
- width = width || 512;
- height = height || 342;
- res.width = width;
- res.height = height;
- width == +width && (width += "px");
- height == +height && (height += "px");
- res.coordsize = zoom * 1e3 + S + zoom * 1e3;
- res.coordorigin = "0 0";
- res.span = R._g.doc.createElement("span");
- res.span.style.cssText = "position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;";
- c.appendChild(res.span);
- cs.cssText = R.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden", width, height);
- if (container == 1) {
- R._g.doc.body.appendChild(c);
- cs.left = x + "px";
- cs.top = y + "px";
- cs.position = "absolute";
- } else {
- if (container.firstChild) {
- container.insertBefore(c, container.firstChild);
- } else {
- container.appendChild(c);
- }
- }
- // plugins.call(res, res, R.fn);
- res.renderfix = function () {};
- return res;
- };
- R.prototype.clear = function () {
- R.eve("clear", this);
- this.canvas.innerHTML = E;
- this.span = R._g.doc.createElement("span");
- this.span.style.cssText = "position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;";
- this.canvas.appendChild(this.span);
- this.bottom = this.top = null;
- };
- R.prototype.remove = function () {
- R.eve("remove", this);
- this.canvas.parentNode.removeChild(this.canvas);
- for (var i in this) {
- this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null;
- }
- return true;
- };
-
- var setproto = R.st;
- for (var method in elproto) if (elproto[has](method) && !setproto[has](method)) {
- setproto[method] = (function (methodname) {
- return function () {
- var arg = arguments;
- return this.forEach(function (el) {
- el[methodname].apply(el, arg);
- });
- };
- })(method);
- }
-}(window.Raphael); \ No newline at end of file
diff --git a/themes/default/js/switchbox.js b/themes/default/js/switchbox.js
new file mode 100644
index 000000000..b20f82d50
--- /dev/null
+++ b/themes/default/js/switchbox.js
@@ -0,0 +1,23 @@
+(function () {
+ var sbFunc = function(link, box) {
+ jQuery(link).click(function() {
+ var elt = jQuery(box);
+ elt.css("left", Math.min( jQuery(this).position().left, jQuery(window).width() - elt.outerWidth(true) - 5))
+ .css("top", jQuery(this).position().top + jQuery(this).outerHeight(true))
+ .toggle();
+ return false;
+ });
+ jQuery(box).on("mouseleave click", function() {
+ jQuery(this).hide();
+ });
+ };
+
+ if (window.SwitchBox) {
+ for (var i=0; i<SwitchBox.length; i+=2)
+ sbFunc(SwitchBox[i], SwitchBox[i+1]);
+ }
+
+ SwitchBox = {
+ push: sbFunc
+ }
+})(); \ No newline at end of file
diff --git a/themes/default/s26/outline_005e89.png b/themes/default/s26/outline_005e89.png
index ee114abe9..a745c0bc5 100644
--- a/themes/default/s26/outline_005e89.png
+++ b/themes/default/s26/outline_005e89.png
Binary files differ
diff --git a/themes/default/s26/outline_808060.png b/themes/default/s26/outline_808060.png
index 351cf4149..1457946f0 100644
--- a/themes/default/s26/outline_808060.png
+++ b/themes/default/s26/outline_808060.png
Binary files differ
diff --git a/themes/default/s26/outline_808080.png b/themes/default/s26/outline_808080.png
index c7a89c270..7745175ca 100644
--- a/themes/default/s26/outline_808080.png
+++ b/themes/default/s26/outline_808080.png
Binary files differ
diff --git a/themes/default/s26/outline_ff3363.png b/themes/default/s26/outline_ff3363.png
index bb2224f39..4e726eb26 100644
--- a/themes/default/s26/outline_ff3363.png
+++ b/themes/default/s26/outline_ff3363.png
Binary files differ
diff --git a/themes/default/s26/outline_ff7700.png b/themes/default/s26/outline_ff7700.png
index 6cbec3fdf..7b63f3a0f 100644
--- a/themes/default/s26/outline_ff7700.png
+++ b/themes/default/s26/outline_ff7700.png
Binary files differ
diff --git a/themes/default/s26/outline_ffff80.png b/themes/default/s26/outline_ffff80.png
index 66734159b..17f264db3 100644
--- a/themes/default/s26/outline_ffff80.png
+++ b/themes/default/s26/outline_ffff80.png
Binary files differ
diff --git a/themes/default/s26/outline_ffffff.png b/themes/default/s26/outline_ffffff.png
index 86ff920d5..d8490441d 100644
--- a/themes/default/s26/outline_ffffff.png
+++ b/themes/default/s26/outline_ffffff.png
Binary files differ
diff --git a/themes/default/template/comment_list.tpl b/themes/default/template/comment_list.tpl
index 433de1ff2..5fe4e2f47 100644
--- a/themes/default/template/comment_list.tpl
+++ b/themes/default/template/comment_list.tpl
@@ -1,16 +1,16 @@
{if isset($comment_derivative_params)}
{strip}{html_style}
-.commentElement .illustration{ldelim}
- width: {$comment_derivative_params->max_width()+5}px
+.commentElement .illustration{
+ width:{$comment_derivative_params->max_width()+5}px
}
-.content .commentElement .description{ldelim}
- min-height: {$comment_derivative_params->max_height()+5}px
+.content .commentElement .description{
+ min-height:{$comment_derivative_params->max_height()+5}px
}
{/html_style}{/strip}
-{/if}
{footer_script}var error_icon = "{$ROOT_URL}{$themeconf.icon_dir}/errors_small.png";{/footer_script}
<div class="loader"><img src="{$ROOT_URL}{$themeconf.img_dir}/ajax_loader.gif"></div>
+{/if}
<ul class="commentsList">
{foreach from=$comments item=comment name=comment_loop}
<li class="commentElement {if $smarty.foreach.comment_loop.index is odd}odd{else}even{/if}">
@@ -57,7 +57,7 @@
{/if}
<span class="commentAuthor">{if $comment.WEBSITE_URL}<a href="{$comment.WEBSITE_URL}" class="external" target="_blank" rel="nofollow">{$comment.AUTHOR}</a>{else}{$comment.AUTHOR}{/if}</span>
- {if $comment.EMAIL}- <a href="mailto:{$comment.EMAIL}">{$comment.EMAIL}</a>{/if}
+ {if isset($comment.EMAIL)}- <a href="mailto:{$comment.EMAIL}">{$comment.EMAIL}</a>{/if}
- <span class="commentDate">{$comment.DATE}</span>
{if isset($comment.IN_EDIT)}
<a name="edit_comment"></a>
diff --git a/themes/default/template/index.tpl b/themes/default/template/index.tpl
index 3ed52498c..00dccca5e 100644
--- a/themes/default/template/index.tpl
+++ b/themes/default/template/index.tpl
@@ -1,5 +1,7 @@
+{combine_script id='core.switchbox' load='async' require='jquery' path='themes/default/js/switchbox.js'}
{$MENUBAR}
+
{if isset($errors) or isset($infos)}
<div class="content messages{if isset($MENUBAR)} contentWithMenu{/if}">
{include file='infos_errors.tpl'}
@@ -12,7 +14,7 @@
<ul class="categoryActions">
{if !empty($image_orders)}
<li>{strip}<a id="sortOrderLink" title="{'Sort order'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
- <span class="pwg-icon pwg-icon-sort">&nbsp;</span><span class="pwg-button-text">{'Sort order'|@translate}</span>
+ <span class="pwg-icon pwg-icon-sort"></span><span class="pwg-button-text">{'Sort order'|@translate}</span>
</a>
<div id="sortOrderBox" class="switchBox">
<div class="switchBoxTitle">{'Sort order'|@translate}</div>
@@ -24,22 +26,12 @@
{/if}
{/foreach}
</div>
- {footer_script require='jquery'}{literal}
-jQuery("#sortOrderLink").click(function() {
- var elt = jQuery("#sortOrderBox");
- elt.css("left", Math.min( jQuery(this).offset().left, jQuery(window).width() - elt.outerWidth(true) - 5))
- .css("top", jQuery(this).offset().top + jQuery(this).outerHeight(true))
- .toggle();
-});
-jQuery("#sortOrderBox").on("mouseleave", function() {
- jQuery(this).hide();
-});
- {/literal}{/footer_script}
+ {footer_script}(SwitchBox=window.SwitchBox||[]).push("#sortOrderLink", "#sortOrderBox");{/footer_script}
{/strip}</li>
{/if}
{if !empty($image_derivatives)}
<li>{strip}<a id="derivativeSwitchLink" title="{'Photo sizes'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
- <span class="pwg-icon pwg-icon-sizes">&nbsp;</span><span class="pwg-button-text">{'Photo sizes'|@translate}</span>
+ <span class="pwg-icon pwg-icon-sizes"></span><span class="pwg-button-text">{'Photo sizes'|@translate}</span>
</a>
<div id="derivativeSwitchBox" class="switchBox">
<div class="switchBoxTitle">{'Photo sizes'|@translate}</div>
@@ -51,66 +43,57 @@ jQuery("#sortOrderBox").on("mouseleave", function() {
{/if}
{/foreach}
</div>
- {footer_script require='jquery'}{literal}
-jQuery("#derivativeSwitchLink").click(function() {
- var elt = jQuery("#derivativeSwitchBox");
- elt.css("left", Math.min( jQuery(this).offset().left, jQuery(window).width() - elt.outerWidth(true) - 5))
- .css("top", jQuery(this).offset().top + jQuery(this).outerHeight(true))
- .toggle();
-});
-jQuery("#derivativeSwitchBox").on("mouseleave", function() {
- jQuery(this).hide();
-});
- {/literal}{/footer_script}
+ {footer_script}(SwitchBox=window.SwitchBox||[]).push("#derivativeSwitchLink", "#derivativeSwitchBox");{/footer_script}
{/strip}</li>
{/if}
{if isset($favorite)}
- <li><a href="{$favorite.U_FAVORITE}" title="{'delete all photos from your favorites'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
- <span class="pwg-icon pwg-icon-favorite-del">&nbsp;</span><span class="pwg-button-text">{'delete all photos from your favorites'|@translate}</span>
+ <li id="cmdFavorite"><a href="{$favorite.U_FAVORITE}" title="{'delete all photos from your favorites'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
+ <span class="pwg-icon pwg-icon-favorite-del"></span><span class="pwg-button-text">{'delete all photos from your favorites'|@translate}</span>
</a></li>
{/if}
{if isset($U_CADDIE)}
- <li><a href="{$U_CADDIE}" title="{'Add to caddie'|@translate}" class="pwg-state-default pwg-button">
- <span class="pwg-icon pwg-icon-caddie-add">&nbsp;</span><span class="pwg-button-text">{'Caddie'|@translate}</span>
+ <li id="cmdCaddie"><a href="{$U_CADDIE}" title="{'Add to caddie'|@translate}" class="pwg-state-default pwg-button">
+ <span class="pwg-icon pwg-icon-caddie-add"></span><span class="pwg-button-text">{'Caddie'|@translate}</span>
</a></li>
{/if}
{if isset($U_EDIT)}
- <li><a href="{$U_EDIT}" title="{'Edit album'|@translate}" class="pwg-state-default pwg-button">
- <span class="pwg-icon pwg-icon-category-edit">&nbsp;</span><span class="pwg-button-text">{'Edit'|@translate}</span>
+ <li id="cmdEditAlbum"><a href="{$U_EDIT}" title="{'Edit album'|@translate}" class="pwg-state-default pwg-button">
+ <span class="pwg-icon pwg-icon-category-edit"></span><span class="pwg-button-text">{'Edit'|@translate}</span>
</a></li>
{/if}
{if isset($U_SEARCH_RULES)}
{combine_script id='core.scripts' load='async' path='themes/default/js/scripts.js'}
<li><a href="{$U_SEARCH_RULES}" onclick="popuphelp(this.href); return false;" title="{'Search rules'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
- <span class="pwg-icon pwg-icon-help">&nbsp;</span><span class="pwg-button-text">(?)</span>
+ <span class="pwg-icon pwg-icon-help"></span><span class="pwg-button-text">(?)</span>
</a></li>
{/if}
{if isset($U_SLIDESHOW)}
- <li>{strip}<a href="{$U_SLIDESHOW}" title="{'slideshow'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
- <span class="pwg-icon pwg-icon-slideshow">&nbsp;</span><span class="pwg-button-text">{'slideshow'|@translate}</span>
+ <li id="cmdSlideshow">{strip}<a href="{$U_SLIDESHOW}" title="{'slideshow'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
+ <span class="pwg-icon pwg-icon-slideshow"></span><span class="pwg-button-text">{'slideshow'|@translate}</span>
</a>{/strip}</li>
{/if}
{if isset($U_MODE_FLAT)}
<li>{strip}<a href="{$U_MODE_FLAT}" title="{'display all photos in all sub-albums'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
- <span class="pwg-icon pwg-icon-category-view-flat">&nbsp;</span><span class="pwg-button-text">{'display all photos in all sub-albums'|@translate}</span>
+ <span class="pwg-icon pwg-icon-category-view-flat"></span><span class="pwg-button-text">{'display all photos in all sub-albums'|@translate}</span>
</a>{/strip}</li>
{/if}
{if isset($U_MODE_NORMAL)}
<li>{strip}<a href="{$U_MODE_NORMAL}" title="{'return to normal view mode'|@translate}" class="pwg-state-default pwg-button">
- <span class="pwg-icon pwg-icon-category-view-normal">&nbsp;</span><span class="pwg-button-text">{'return to normal view mode'|@translate}</span>
+ <span class="pwg-icon pwg-icon-category-view-normal"></span><span class="pwg-button-text">{'return to normal view mode'|@translate}</span>
</a>{/strip}</li>
{/if}
{if isset($U_MODE_POSTED)}
<li>{strip}<a href="{$U_MODE_POSTED}" title="{'display a calendar by posted date'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
- <span class="pwg-icon pwg-icon-calendar">&nbsp;</span><span class="pwg-button-text">{'Calendar'|@translate}</span>
+ <span class="pwg-icon pwg-icon-calendar"></span><span class="pwg-button-text">{'Calendar'|@translate}</span>
</a>{/strip}</li>
{/if}
{if isset($U_MODE_CREATED)}
<li>{strip}<a href="{$U_MODE_CREATED}" title="{'display a calendar by creation date'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
- <span class="pwg-icon pwg-icon-camera-calendar">&nbsp;</span><span class="pwg-button-text">{'Calendar'|@translate}</span>
+ <span class="pwg-icon pwg-icon-camera-calendar"></span><span class="pwg-button-text">{'Calendar'|@translate}</span>
</a>{/strip}</li>
{/if}
+{if !empty($PLUGIN_INDEX_BUTTONS)}{foreach from=$PLUGIN_INDEX_BUTTONS item=button}<li>{$button}</li>{/foreach}{/if}
{if !empty($PLUGIN_INDEX_ACTIONS)}{$PLUGIN_INDEX_ACTIONS}{/if}
</ul>
@@ -118,26 +101,15 @@ jQuery("#derivativeSwitchBox").on("mouseleave", function() {
{if isset($chronology_views)}
<div class="calendarViews">{'View'|@translate}:
- <a id="calendarViewSwitchLink" href="javascript:toggleCalendarViewsBox()">
+ <a id="calendarViewSwitchLink" href="#">
{foreach from=$chronology_views item=view}{if $view.SELECTED}{$view.CONTENT}{/if}{/foreach}
- </a>
+ </a>
<div id="calendarViewSwitchBox" class="switchBox">
{foreach from=$chronology_views item=view name=loop}{if !$smarty.foreach.loop.first}<br>{/if}
<span{if !$view.SELECTED} style="visibility:hidden"{/if}>&#x2714; </span><a href="{$view.VALUE}">{$view.CONTENT}</a>
{/foreach}
</div>
- {footer_script require='jquery'}{literal}
-function toggleCalendarViewsBox() {
- var elt = jQuery("#calendarViewSwitchBox")
- , ePos = jQuery("#calendarViewSwitchLink");
- elt.css("left", Math.min( ePos.offset().left, jQuery(window).width() - elt.outerWidth(true) - 5))
- .css("top", ePos.offset().top + ePos.outerHeight(true))
- .toggle();
-};
-jQuery("#calendarViewSwitchBox").on("mouseleave", function() {
- jQuery(this).hide();
-});
- {/literal}{/footer_script}
+ {footer_script}(SwitchBox=window.SwitchBox||[]).push("#calendarViewSwitchLink", "#calendarViewSwitchBox");{/footer_script}
</div>
{/if}
@@ -180,7 +152,10 @@ jQuery("#calendarViewSwitchBox").on("mouseleave", function() {
</div>
{/if}
+{if !empty($CONTENT)}{$CONTENT}{/if}
+
{if !empty($CATEGORIES)}{$CATEGORIES}{/if}
+
{if !empty($cats_navbar)}
{include file='navigation_bar.tpl'|@get_extent:'navbar' navbar=$cats_navbar}
{/if}
diff --git a/themes/default/template/mail/index.php b/themes/default/template/mail/index.php
index 41732f2fd..c8de97f60 100644
--- a/themes/default/template/mail/index.php
+++ b/themes/default/template/mail/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/themes/default/template/mail/screenshot-clear.png b/themes/default/template/mail/screenshot-clear.png
new file mode 100644
index 000000000..ae879604a
--- /dev/null
+++ b/themes/default/template/mail/screenshot-clear.png
Binary files differ
diff --git a/themes/default/template/mail/screenshot-dark.png b/themes/default/template/mail/screenshot-dark.png
new file mode 100644
index 000000000..2906c4ec8
--- /dev/null
+++ b/themes/default/template/mail/screenshot-dark.png
Binary files differ
diff --git a/themes/default/template/mail/text/html/footer.tpl b/themes/default/template/mail/text/html/footer.tpl
index b1f1b9317..da17e4473 100644
--- a/themes/default/template/mail/text/html/footer.tpl
+++ b/themes/default/template/mail/text/html/footer.tpl
@@ -1,22 +1,23 @@
-</div> <!-- content -->
-<div id="copyright">
-<hr>
- {'Sent by'|@translate}
- <a href="{$GALLERY_URL}">{$GALLERY_TITLE}</a>
+ {* <!-- end $CONTENT --> *}
+ </td></tr>
- {* Please, do not remove this copyright. If you really want to,
- contact us on http://piwigo.org to find a solution on how
- to show the origin of the script...*}
- - {'Powered by'|@translate}
- <a href="http://piwigo.org" class="Piwigo">
- <span class="Piwigo">Piwigo</span></a>
- {$VERSION}
+ <tr><td id="footer">
+ {* <!-- begin FOOTER --> *}
+{* <!-- Please, do not remove this copyright. If you really want to,
+contact us on http://piwigo.org to find a solution on how
+to show the origin of the script... --> *}
+
+ {'Sent by'|translate} <a href="{$GALLERY_URL}">{$GALLERY_TITLE}</a>
+ - {'Powered by'|translate} <a href="{$PHPWG_URL}" class="Piwigo">Piwigo</a>
+ {if not empty($VERSION)}{$VERSION}{/if}
+
+ - {'Contact'|translate}
+ <a href="mailto:{$CONTACT_MAIL}?subject={'A comment on your site'|translate|escape:url}">{'Webmaster'|@translate}</a>
+ {* <!-- end FOOTER --> *}
+ </td></tr>
+ </table>
- - {'Contact'|@translate}
- <a href="mailto:{$MAIL}?subject={$TITLE_MAIL}">{'Webmaster'|@translate}</a>
-
-</div> <!-- copyright -->
-</div> <!-- the_page -->
-
-</body>
-</html>
+ </td></tr>
+ </table>
+ </body>
+</html> \ No newline at end of file
diff --git a/themes/default/template/mail/text/html/global-mail-css.tpl b/themes/default/template/mail/text/html/global-mail-css.tpl
index 072bcb0be..59a1bde2f 100644
--- a/themes/default/template/mail/text/html/global-mail-css.tpl
+++ b/themes/default/template/mail/text/html/global-mail-css.tpl
@@ -1,11 +1,105 @@
-/* Global mail css */
-
-body {ldelim} font-family: Univers, Helvetica, Optima; font-size:12px; margin:0px; padding:0px; }
-#the_page {ldelim} margin:0px; padding:0px; text-align:left;}
-#content {ldelim} margin:0px; padding:30px 0px 0px 30px; width:732px;}
-hr {ldelim} width:632px; margin-left:0;}
-#copyright {ldelim} font-size:10px; margin:0px; padding:48px 0px 32px 62px;}
-.PWG {ldelim} font-family:verdana, sans-serif !important; font-size:0.9em; font-weight:normal; letter-spacing:0px;}
-h2 {ldelim} padding:7px 15px; width:617px; font-weight:bold;}
-img {ldelim} margin:16px; border:16px solid #aaa; -moz-border-radius: 4px; border-radius: 4px 4px; }
-img:hover {ldelim} padding: 15px; border: 1px solid yellow; -moz-border-radius: 4px; border-radius: 4px 4px; }
+{strip}
+/* page */
+body {
+ font-family:"Verdana", "Helvetica", "Optima", sans-serif;
+ font-size:12px;
+ margin:0px;
+ padding:0px;
+}
+
+html, body, #bodyTable {
+ width:100%;
+ height:100%;
+}
+
+/* main block */
+#header {
+ padding:20px;
+}
+#header #title {
+ font-size:26px;
+ font-weight:bold;
+}
+#header #subtitle {
+ font-size:20px;
+}
+#content {
+ padding:0 20px 20px 20px;
+ font-family:"Verdana", "Helvetica", "Optima", sans-serif;
+ font-size:13px;
+}
+#footer {
+ font-size:10px;
+ padding:5px;
+}
+#topSpacer {
+ margin-bottom:20px;
+}
+
+/* images */
+img {
+ border:none;
+}
+
+h1, h2, h3, h4, h5 {
+ margin:0.5em 0 0.25em 0;
+}
+h1 { font-size:26px; }
+h2 { font-size:20px; }
+h3 { font-size:16px; }
+h4 { font-size:12px; }
+h5 { font-size:10px; }
+
+/* paragraphs */
+p {
+ margin:0.25em 0 0.5em 0;
+}
+blockquote {
+ margin-left:10px;
+ padding-left:10px;
+ font-family:"Times",serif;
+ font-size:14px;
+}
+
+/* list */
+ul, ol {
+ margin:0.5em 0 0.25em 30px;
+ padding:0;
+}
+dl {
+ margin:0.5em 0 0.25em 10px;
+}
+dt {
+ margin:0.25em 0 0 0;
+ font-weight:bold;
+}
+dd {
+ margin:0 0 0.25em 10px;
+}
+
+/* tables */
+#content table {
+ width:100%;
+ border-spacing:0;
+ border-collapse:collapse;
+}
+#content table td {
+ padding:2px 3px;
+}
+#content table th {
+ font-weight:bold;
+ text-align:center;
+ padding:4px 0;
+}
+#content table tfoot td {
+ font-size:0.8em;
+}
+
+/* line */
+hr {
+ border-width:0 0 1px 0;
+ border-color:#ddd;
+ border-style:solid;
+ margin:1em;
+}
+{/strip} \ No newline at end of file
diff --git a/themes/default/template/mail/text/html/header.tpl b/themes/default/template/mail/text/html/header.tpl
index e6af4c024..b98f5be18 100644
--- a/themes/default/template/mail/text/html/header.tpl
+++ b/themes/default/template/mail/text/html/header.tpl
@@ -1,17 +1,29 @@
------={$BOUNDARY_KEY}
-Content-Type: {$CONTENT_TYPE}; charset="{$CONTENT_ENCODING}";
-Content-Transfer-Encoding: 8bit
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="{$lang_info.code}" dir="{$lang_info.direction}">
-<head>
-<title>Piwigo Mail</title>
-<meta http-equiv="Content-Type" content="text/html; charset={$CONTENT_ENCODING}">
-<style><!-- /* Mini style for mails */
-{if isset($GLOBAL_MAIL_CSS)}{$GLOBAL_MAIL_CSS}{/if}
-{if isset($MAIL_CSS)}{$MAIL_CSS}{/if}
---></style>
-</head>
-<body>
-<div id="the_page">
-<div id="content" class="content">
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset={$CONTENT_ENCODING}"/>
+ <title>Piwigo Mail</title>
+
+ <style type="text/css">
+ {if isset($GLOBAL_MAIL_CSS)}{$GLOBAL_MAIL_CSS}{/if}
+ {if isset($MAIL_CSS)}{$MAIL_CSS}{/if}
+ </style>
+ </head>
+
+ <body>
+ <table id="bodyTable" cellspacing="0" cellpadding="10" border="0">
+ <tr><td align="center" valign="top">
+
+ <table id="contentTable" cellspacing="0" cellpadding="0" border="0">
+ <tr><td id="header">
+ {* <!-- begin HEADER --> *}
+ <div id="title">{$MAIL_TITLE}</div>
+ {if not empty($MAIL_SUBTITLE)}<div id="subtitle">{$MAIL_SUBTITLE}</div>{/if}
+ {* <!-- end HEADER --> *}
+ </td></tr>
+
+ <tr><td id="content">
+{* <!-- use an invisible div with a bottom margin to force the browser
+to merge the margin with the element bellow (typically h1/h2/...) --> *}
+ <div id="topSpacer"></div>
+ {* <!-- begin CONTENT --> *} \ No newline at end of file
diff --git a/themes/default/template/mail/text/html/index.php b/themes/default/template/mail/text/html/index.php
index 41732f2fd..c8de97f60 100644
--- a/themes/default/template/mail/text/html/index.php
+++ b/themes/default/template/mail/text/html/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/themes/default/template/mail/text/html/mail-css-clear.tpl b/themes/default/template/mail/text/html/mail-css-clear.tpl
new file mode 100644
index 000000000..98b0337d9
--- /dev/null
+++ b/themes/default/template/mail/text/html/mail-css-clear.tpl
@@ -0,0 +1,73 @@
+{strip}
+/* page */
+body {
+ color:#111;
+}
+
+html, body, #bodyTable {
+ background:#fff;
+}
+#contentTable {
+ width:600px;
+}
+
+/* main block */
+#header {
+ background:#eee;
+ background-image:radial-gradient(ellipse at center, #fefefe, #e5e5e5);
+ border-top:4px solid #f70;
+ text-align:center;
+ text-shadow:1px 1px 0px #fff;
+}
+#header #subtitle {
+ color:#e06900;
+}
+#content {
+ background:#fefefe;
+ border-width:1px;
+ border-style:solid;
+ border-color:#ddd #eee;
+ box-shadow:inset 0 0 20px #eee;
+}
+#footer {
+ background:#eee;
+ border-bottom:2px solid #f70;
+}
+
+/* links */
+a {
+ color:#f70;
+ text-decoration:none;
+}
+a:hover {
+ text-decoration:underline;
+}
+
+/* images */
+img.photo {
+ border:10px solid #ddd;
+}
+img.photo:hover {
+ border-color:#eee;
+}
+
+/* paragraphs */
+blockquote {
+ border-left:2px solid #aaa;
+ border-radius:2px;
+}
+
+/* tables */
+#content table td {
+ border-bottom:1px solid #efefef;
+}
+#content table th {
+ background:#aaa;
+ color:#fff;
+ border-right:1px solid #ddd;
+}
+#content table tfoot td {
+ background:#eee;
+ border-right:1px solid #fff;
+}
+{/strip} \ No newline at end of file
diff --git a/themes/default/template/mail/text/html/mail-css-dark.tpl b/themes/default/template/mail/text/html/mail-css-dark.tpl
new file mode 100644
index 000000000..390a7dfb6
--- /dev/null
+++ b/themes/default/template/mail/text/html/mail-css-dark.tpl
@@ -0,0 +1,87 @@
+{strip}
+/* page */
+body {
+ color:#fff;
+}
+
+html, body, #bodyTable {
+ background:#111;
+}
+#contentTable {
+ width:600px;
+}
+
+/* main block */
+#header {
+ background:#444;
+ background-image:radial-gradient(ellipse at center, #555, #333);
+ border:1px solid #000;
+ border-top:4px solid #f36;
+ text-align:center;
+ text-shadow:1px 1px 0px #000;
+}
+#header #title {
+ color:#eee;
+}
+#header #subtitle {
+ color:#C9224C;
+}
+#content {
+ background:#111;
+ border-width:1px;
+ border-style:solid;
+ border-color:#666 #000;
+ box-shadow:inset 0 0 20px #333;
+}
+#footer {
+ background:#333;
+ border:1px solid #000;
+ border-bottom:2px solid #f36;
+}
+
+/* links */
+a {
+ color:#f36;
+ text-decoration:none;
+}
+a:hover {
+ text-decoration:underline;
+}
+
+/* images */
+img.photo {
+ border:10px solid #666;
+}
+img.photo:hover {
+ border-color:#999;
+}
+
+h1, h2, h3, h4, h5 {
+ color:#bbb;
+}
+
+/* paragraphs */
+blockquote {
+ border-left:2px solid #aaa;
+ border-radius:2px;
+}
+
+/* tables */
+#content table td {
+ border-bottom:1px solid #999;
+}
+#content table th {
+ background:#666;
+ border-right:1px solid #aaa;
+}
+#content table tfoot td {
+ background:#444;
+ color:#aaa;
+ border-right:1px solid #aaa;
+}
+
+/* line */
+hr {
+ border-color:#555;
+}
+{/strip} \ No newline at end of file
diff --git a/themes/default/template/mail/text/html/notification_admin.tpl b/themes/default/template/mail/text/html/notification_admin.tpl
new file mode 100644
index 000000000..f236b8ee6
--- /dev/null
+++ b/themes/default/template/mail/text/html/notification_admin.tpl
@@ -0,0 +1,9 @@
+{$CONTENT}
+
+{if isset($TECHNICAL)}
+<p style="padding-top:10px;font-size:11px;">
+{'Connected user: %s'|translate:$TECHNICAL.username}<br>
+{'IP: %s'|translate:$TECHNICAL.ip}<br>
+{'Browser: %s'|translate:$TECHNICAL.user_agent}
+</p>
+{/if} \ No newline at end of file
diff --git a/themes/default/template/mail/text/html/notification_by_mail.tpl b/themes/default/template/mail/text/html/notification_by_mail.tpl
index 9989a32c0..df3e431e1 100644
--- a/themes/default/template/mail/text/html/notification_by_mail.tpl
+++ b/themes/default/template/mail/text/html/notification_by_mail.tpl
@@ -38,13 +38,13 @@
{/if}
<p>{'See you soon,'|@translate}</p>
<p style="text-align:center">{$SEND_AS_NAME}</p>
+<hr>
<p>
-<br><hr>
{'To unsubscribe'|@translate}{', click on'|@translate} <a href="{$UNSUBSCRIBE_LINK}">{$UNSUBSCRIBE_LINK}</a><br>
{'To subscribe'|@translate}{', click on'|@translate} <a href="{$SUBSCRIBE_LINK}">{$SUBSCRIBE_LINK}</a><br>
{'If you encounter problems or have any question, please send a message to'|@translate} <a href="mailto:{$CONTACT_EMAIL}?subject={'[NBM] Problems or questions'|@translate}">{$CONTACT_EMAIL}</a><br>
-<hr><br>
</p>
+<hr>
{if not empty($recent_posts)}
</div>
<div id="nbm_recent_post">
diff --git a/themes/default/template/mail/text/index.php b/themes/default/template/mail/text/index.php
index 41732f2fd..c8de97f60 100644
--- a/themes/default/template/mail/text/index.php
+++ b/themes/default/template/mail/text/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/themes/default/template/mail/text/plain/footer.tpl b/themes/default/template/mail/text/plain/footer.tpl
index 8574697e6..0f9ef273e 100644
--- a/themes/default/template/mail/text/plain/footer.tpl
+++ b/themes/default/template/mail/text/plain/footer.tpl
@@ -1,5 +1,7 @@
+{literal}
---
+{/literal}
+----
{'Sent by'|@translate} "{$GALLERY_TITLE}" {$GALLERY_URL}
-{'Contact'|@translate} {$MAIL}
-{'Powered by'|@translate} Piwigo {$VERSION}
+{'Powered by'|@translate} "Piwigo{if not empty($VERSION)} {$VERSION}{/if}" {$PHPWG_URL}
+{'Contact'|@translate}: {$CONTACT_MAIL} \ No newline at end of file
diff --git a/themes/default/template/mail/text/plain/header.tpl b/themes/default/template/mail/text/plain/header.tpl
index 6fcc863d2..31d7456fb 100644
--- a/themes/default/template/mail/text/plain/header.tpl
+++ b/themes/default/template/mail/text/plain/header.tpl
@@ -1,5 +1,6 @@
------={$BOUNDARY_KEY}
-Content-Type: {$CONTENT_TYPE}; charset="{$CONTENT_ENCODING}";
-Content-Transfer-Encoding: 8bit{literal}
-
-{/literal}{*note that there must be an empty line to separate the mime headers*}
+{$MAIL_TITLE}
+{if not empty($MAIL_SUBTITLE)}{$MAIL_SUBTITLE}
+{/if}
+----
+{literal}
+{/literal} \ No newline at end of file
diff --git a/themes/default/template/mail/text/plain/index.php b/themes/default/template/mail/text/plain/index.php
index 41732f2fd..c8de97f60 100644
--- a/themes/default/template/mail/text/plain/index.php
+++ b/themes/default/template/mail/text/plain/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/themes/default/template/mail/text/plain/notification_admin.tpl b/themes/default/template/mail/text/plain/notification_admin.tpl
new file mode 100644
index 000000000..e6970842f
--- /dev/null
+++ b/themes/default/template/mail/text/plain/notification_admin.tpl
@@ -0,0 +1,8 @@
+{$CONTENT}
+
+{if isset($TECHNICAL)}
+-----------------------------
+{'Connected user: %s'|translate:$TECHNICAL.username}
+{'IP: %s'|translate:$TECHNICAL.ip}
+{'Browser: %s'|translate:$TECHNICAL.user_agent}
+{/if} \ No newline at end of file
diff --git a/themes/default/template/menubar_categories.tpl b/themes/default/template/menubar_categories.tpl
index 65a149cff..c3c5b1c02 100644
--- a/themes/default/template/menubar_categories.tpl
+++ b/themes/default/template/menubar_categories.tpl
@@ -14,7 +14,7 @@
<ul>
{else}
</li>
- {'</ul></li>'|@str_repeat:$ref_level-$cat.LEVEL}
+ {'</ul></li>'|@str_repeat:($ref_level-$cat.LEVEL)}
{/if}
<li {if $cat.SELECTED}class="selected"{/if}>
<a href="{$cat.URL}" {if $cat.IS_UPPERCAT}rel="up"{/if} title="{$cat.TITLE}">{$cat.NAME}</a>
@@ -28,5 +28,5 @@
{/foreach}
{'</li></ul>'|@str_repeat:$ref_level}
- <p class="totalImages">{$pwg->l10n_dec('%d photo', '%d photos', $block->data.NB_PICTURE)}</p>
+ <p class="totalImages">{$block->data.NB_PICTURE|@translate_dec:'%d photo':'%d photos'}</p>
</dd>
diff --git a/themes/default/template/menubar_menu.tpl b/themes/default/template/menubar_menu.tpl
index 29276a48f..2eb2dd3a9 100644
--- a/themes/default/template/menubar_menu.tpl
+++ b/themes/default/template/menubar_menu.tpl
@@ -11,7 +11,7 @@
<ul>{strip}
{foreach from=$block->data item=link}
{if is_array($link)}
- <li><a href="{$link.URL}" title="{$link.TITLE}"{if isset($link.REL)} {$link.REL}{/if}>{$link.NAME}</a></li>
+ <li><a href="{$link.URL}" title="{$link.TITLE}"{if isset($link.REL)} {$link.REL}{/if}>{$link.NAME}</a>{if isset($link.COUNTER)} ({$link.COUNTER}){/if}</li>
{/if}
{/foreach}
{/strip}</ul>
diff --git a/themes/default/template/menubar_tags.tpl b/themes/default/template/menubar_tags.tpl
index 975d7eb09..d1a672837 100644
--- a/themes/default/template/menubar_tags.tpl
+++ b/themes/default/template/menubar_tags.tpl
@@ -5,7 +5,7 @@
<span>{strip}
<a class="tagLevel{$tag.level}" href=
{if isset($tag.U_ADD)}
- "{$tag.U_ADD}" title="{$pwg->l10n_dec('%d photo is also linked to current tags', '%d photos are also linked to current tags', $tag.counter)}" rel="nofollow">+
+ "{$tag.U_ADD}" title="{$tag.counter|@translate_dec:'%d photo is also linked to current tags':'%d photos are also linked to current tags'}" rel="nofollow">+
{else}
"{$tag.URL}" title="{'display photos linked to this tag'|@translate}">
{/if}
diff --git a/themes/default/template/month_calendar.tpl b/themes/default/template/month_calendar.tpl
index 904570a10..ac8fed166 100644
--- a/themes/default/template/month_calendar.tpl
+++ b/themes/default/template/month_calendar.tpl
@@ -1,31 +1,28 @@
-
-{if !empty($chronology_navigation_bars) }
+{if !empty($chronology_navigation_bars)}
{foreach from=$chronology_navigation_bars item=bar}
<div class="calendarBar">
{if isset($bar.previous)}
- <div style="float:left">&laquo; <a href="{$bar.previous.URL}">{$bar.previous.LABEL}</a></div>
+ <div style="float:left;margin-right:5px">&laquo; <a href="{$bar.previous.URL}">{$bar.previous.LABEL}</a></div>
{/if}
{if isset($bar.next)}
- <div style="float:right"><a href="{$bar.next.URL}">{$bar.next.LABEL}</a> &raquo;</div>
+ <div style="float:right;margin-left:5px"><a href="{$bar.next.URL}">{$bar.next.LABEL}</a> &raquo;</div>
{/if}
{if empty($bar.items)}
&nbsp;
{else}
{foreach from=$bar.items item=item}
- <span class="calItem{if !isset($item.URL)}Empty{/if}" {if isset($item.NB_IMAGES)}title="{$pwg->l10n_dec('%d photo', '%d photos', $item.NB_IMAGES)}"{/if}>
- {if isset($item.URL)}
- <a href="{$item.URL}">{$item.LABEL}</a>
+ {if !isset($item.URL)}
+ <span class="calItem">{$item.LABEL}</span>
{else}
- {$item.LABEL}
+ <a class="calItem"{if isset($item.NB_IMAGES)} title="{$item.NB_IMAGES|@translate_dec:'%d photo':'%d photos'}"{/if} href="{$item.URL}">{$item.LABEL}</a>
{/if}
- </span>
{/foreach}
{/if}
</div>
{/foreach}
{/if}
-{if !empty($chronology_calendar.calendar_bars) }
+{if !empty($chronology_calendar.calendar_bars)}
{foreach from=$chronology_calendar.calendar_bars item=bar}
<div class="calendarCalBar">
<span class="calCalHead"><a href="{$bar.U_HEAD}">{$bar.HEAD_LABEL}</a> ({$bar.NB_IMAGES})</span><br>
@@ -43,7 +40,7 @@
{/foreach}
{/if}
-{if isset($chronology_calendar.month_view) }
+{if isset($chronology_calendar.month_view)}
<table class="calMonth">
<thead>
<tr>
@@ -52,13 +49,11 @@
{/foreach}
</tr>
</thead>
-{html_head} {*add the style to html head for strict standard compliance*}
-<style type="text/css">
-TABLE.calMonth TBODY TD, TABLE.calMonth TBODY TD DIV.calImg {ldelim}
- width:{$chronology_calendar.month_view.CELL_WIDTH}px;height:{$chronology_calendar.month_view.CELL_HEIGHT}px;
+{html_style}
+.calMonth TD, .calMonth .calImg{
+ width:{$chronology_calendar.month_view.CELL_WIDTH}px;height:{$chronology_calendar.month_view.CELL_HEIGHT}px
}
-</style>
-{/html_head}
+{/html_style}
{foreach from=$chronology_calendar.month_view.weeks item=week}
<tr>
{foreach from=$week item=day}
@@ -68,7 +63,7 @@ TABLE.calMonth TBODY TD, TABLE.calMonth TBODY TD DIV.calImg {ldelim}
<div class="calBackDate">{$day.DAY}</div><div class="calForeDate">{$day.DAY}</div>
<div class="calImg">
<a href="{$day.U_IMG_LINK}">
- <img style="{$day.IMAGE_STYLE}" src="{$day.IMAGE}" alt="{$day.IMAGE_ALT}" title="{$pwg->l10n_dec('%d photo','%d photos', $day.NB_ELEMENTS)}">
+ <img src="{$day.IMAGE}" alt="{$day.IMAGE_ALT}" title="{$day.NB_ELEMENTS|@translate_dec:'%d photo':'%d photos'}">
</a>
</div>
{else}
@@ -78,9 +73,9 @@ TABLE.calMonth TBODY TD, TABLE.calMonth TBODY TD DIV.calImg {ldelim}
<td>
{/if}
</td>
- {/foreach} {*day in week*}
+ {/foreach}{*day in week*}
</tr>
- {/foreach} {*week in month*}
+ {/foreach}{*week in month*}
</table>
{/if}
diff --git a/themes/default/template/password.tpl b/themes/default/template/password.tpl
index 260830cdf..7b6a389ae 100644
--- a/themes/default/template/password.tpl
+++ b/themes/default/template/password.tpl
@@ -11,6 +11,8 @@
{if $action ne 'none'}
<form id="lostPassword" action="{$form_action}?action={$action}{if isset($key)}&amp;key={$key}{/if}" method="post">
+<fieldset>
+ <legend>{'Forgot your password?'|translate}</legend>
<input type="hidden" name="pwg_token" value="{$PWG_TOKEN}">
{if $action eq 'lost'}
@@ -44,7 +46,7 @@
<input type="password" name="passwordConf" id="passwordConf" value="">
</label>
</p>
-
+</fieldset>
<p class="bottomButtons"><input type="submit" name="submit" value="{'Submit'|@translate}"></p>
{/if}
diff --git a/themes/default/template/picture.tpl b/themes/default/template/picture.tpl
index eacb81beb..f64e04856 100644
--- a/themes/default/template/picture.tpl
+++ b/themes/default/template/picture.tpl
@@ -1,11 +1,11 @@
-{* Example of resizeable
-{include file='include/autosize.inc.tpl'}
-*}
+{combine_script id='core.switchbox' load='async' require='jquery' path='themes/default/js/switchbox.js'}
{if isset($MENUBAR)}{$MENUBAR}{/if}
<div id="content"{if isset($MENUBAR)} class="contentWithMenu"{/if}>
+
{if isset($errors) or not empty($infos)}
{include file='infos_errors.tpl'}
{/if}
+
{if !empty($PLUGIN_PICTURE_BEFORE)}{$PLUGIN_PICTURE_BEFORE}{/if}
<div id="imageHeaderBar">
@@ -17,6 +17,7 @@
<div id="imageToolBar">
<div class="imageNumber">{$PHOTO}</div>
{include file='picture_nav_buttons.tpl'|@get_extent:'picture_nav_buttons'}
+
<div class="actionButtons">
{if isset($current.unique_derivatives) && count($current.unique_derivatives)>1}
{footer_script require='jquery'}{literal}
@@ -30,26 +31,18 @@ function changeImgSrc(url,typeSave,typeMap)
theImg.useMap = "#map"+typeMap;
}
jQuery('#derivativeSwitchBox .switchCheck').css('visibility','hidden');
- jQuery('#derivativeChecked'+typeSave).css('visibility','visible');
+ jQuery('#derivativeChecked'+typeMap).css('visibility','visible');
document.cookie = 'picture_deriv='+typeSave+';path={/literal}{$COOKIE_PATH}{literal}';
}
-jQuery("#derivativeSwitchLink").click(function() {
- var elt = jQuery("#derivativeSwitchBox");
- elt.css("left", Math.min( jQuery(this).offset().left, jQuery(window).width() - elt.outerWidth(true) - 5))
- .css("top", jQuery(this).offset().top + jQuery(this).outerHeight(true))
- .toggle();
-});
-jQuery("#derivativeSwitchBox").on("mouseleave click", function() {
- jQuery(this).hide();
-});
+(SwitchBox=window.SwitchBox||[]).push("#derivativeSwitchLink", "#derivativeSwitchBox");
{/literal}{/footer_script}
{strip}<a id="derivativeSwitchLink" title="{'Photo sizes'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
- <span class="pwg-icon pwg-icon-sizes">&nbsp;</span><span class="pwg-button-text">{'Photo sizes'|@translate}</span>
+ <span class="pwg-icon pwg-icon-sizes"></span><span class="pwg-button-text">{'Photo sizes'|@translate}</span>
</a>
<div id="derivativeSwitchBox" class="switchBox">
<div class="switchBoxTitle">{'Photo sizes'|@translate}</div>
{foreach from=$current.unique_derivatives item=derivative key=derivative_type}
- <span class="switchCheck" id="derivativeChecked{$derivative_type}"{if $derivative->get_type() ne $current.selected_derivative->get_type()} style="visibility:hidden"{/if}>&#x2714; </span>
+ <span class="switchCheck" id="derivativeChecked{$derivative->get_type()}"{if $derivative->get_type() ne $current.selected_derivative->get_type()} style="visibility:hidden"{/if}>&#x2714; </span>
<a href="javascript:changeImgSrc('{$derivative->get_url()|@escape:javascript}','{$derivative_type}','{$derivative->get_type()}')">
{$derivative->get_type()|@translate}<span class="derivativeSizeDetails"> ({$derivative->get_size_hr()})</span>
</a><br>
@@ -63,33 +56,34 @@ jQuery("#derivativeSwitchBox").on("mouseleave click", function() {
{/if}
{strip}{if isset($U_SLIDESHOW_START)}
<a href="{$U_SLIDESHOW_START}" title="{'slideshow'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
- <span class="pwg-icon pwg-icon-slideshow"> </span><span class="pwg-button-text">{'slideshow'|@translate}</span>
+ <span class="pwg-icon pwg-icon-slideshow"></span><span class="pwg-button-text">{'slideshow'|@translate}</span>
</a>
{/if}{/strip}
{strip}{if isset($U_METADATA)}
<a href="{$U_METADATA}" title="{'Show file metadata'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
- <span class="pwg-icon pwg-icon-camera-info"> </span><span class="pwg-button-text">{'Show file metadata'|@translate}</span>
+ <span class="pwg-icon pwg-icon-camera-info"></span><span class="pwg-button-text">{'Show file metadata'|@translate}</span>
</a>
{/if}{/strip}
{strip}{if isset($current.U_DOWNLOAD)}
<a href="{$current.U_DOWNLOAD}" title="{'Download this file'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
- <span class="pwg-icon pwg-icon-save"> </span><span class="pwg-button-text">{'Download'|@translate}</span>
+ <span class="pwg-icon pwg-icon-save"></span><span class="pwg-button-text">{'Download'|@translate}</span>
</a>
{/if}{/strip}
+{if isset($PLUGIN_PICTURE_BUTTONS)}{foreach from=$PLUGIN_PICTURE_BUTTONS item=button}{$button}{/foreach}{/if}
{if isset($PLUGIN_PICTURE_ACTIONS)}{$PLUGIN_PICTURE_ACTIONS}{/if}
{strip}{if isset($favorite)}
<a href="{$favorite.U_FAVORITE}" title="{if $favorite.IS_FAVORITE}{'delete this photo from your favorites'|@translate}{else}{'add this photo to your favorites'|@translate}{/if}" class="pwg-state-default pwg-button" rel="nofollow">
- <span class="pwg-icon pwg-icon-favorite-{if $favorite.IS_FAVORITE}del{else}add{/if}"> </span><span class="pwg-button-text">{'Favorites'|@translate}</span>
+ <span class="pwg-icon pwg-icon-favorite-{if $favorite.IS_FAVORITE}del{else}add{/if}"></span><span class="pwg-button-text">{'Favorites'|@translate}</span>
</a>
{/if}{/strip}
{strip}{if isset($U_SET_AS_REPRESENTATIVE)}
- <a href="{$U_SET_AS_REPRESENTATIVE}" title="{'set as album representative'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
- <span class="pwg-icon pwg-icon-representative"> </span><span class="pwg-button-text">{'representative'|@translate}</span>
+ <a id="cmdSetRepresentative" href="{$U_SET_AS_REPRESENTATIVE}" title="{'set as album representative'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
+ <span class="pwg-icon pwg-icon-representative"></span><span class="pwg-button-text">{'representative'|@translate}</span>
</a>
{/if}{/strip}
{strip}{if isset($U_PHOTO_ADMIN)}
- <a href="{$U_PHOTO_ADMIN}" title="{'Modify information'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
- <span class="pwg-icon pwg-icon-edit"> </span><span class="pwg-button-text">{'Edit'|@translate}</span>
+ <a id="cmdEditPhoto" href="{$U_PHOTO_ADMIN}" title="{'Modify information'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
+ <span class="pwg-icon pwg-icon-edit"></span><span class="pwg-button-text">{'Edit'|@translate}</span>
</a>
{/if}{/strip}
{strip}{if isset($U_CADDIE)}{*caddie management BEGIN*}
@@ -134,15 +128,23 @@ y.callService(
{if $DISPLAY_NAV_THUMB}
<div class="navThumbs">
{if isset($previous)}
- <a class="navThumb" id="linkPrev" href="{$previous.U_IMG}" title="{'Previous'|@translate} : {$previous.TITLE|@escape}" rel="prev">
+ <a class="navThumb" id="linkPrev" href="{$previous.U_IMG}" title="{'Previous'|@translate} : {$previous.TITLE_ESC}" rel="prev">
<span class="thumbHover prevThumbHover"></span>
- <img src="{$previous.derivatives.square->get_url()}" alt="{$previous.TITLE|@escape}">
+ <img src="{$previous.derivatives.square->get_url()}" alt="{$previous.TITLE_ESC}">
+ </a>
+ {elseif isset($U_UP)}
+ <a class="navThumb" id="linkPrev" href="{$U_UP}" title="{'Thumbnails'|@translate}">
+ <div class="thumbHover">{'First Page'|@translate}<br><br>{'Go back to the album'|@translate}</div>
</a>
{/if}
{if isset($next)}
- <a class="navThumb" id="linkNext" href="{$next.U_IMG}" title="{'Next'|@translate} : {$next.TITLE|@escape}" rel="next">
+ <a class="navThumb" id="linkNext" href="{$next.U_IMG}" title="{'Next'|@translate} : {$next.TITLE_ESC}" rel="next">
<span class="thumbHover nextThumbHover"></span>
- <img src="{$next.derivatives.square->get_url()}" alt="{$next.TITLE|@escape}">
+ <img src="{$next.derivatives.square->get_url()}" alt="{$next.TITLE_ESC}">
+ </a>
+ {elseif isset($U_UP)}
+ <a class="navThumb" id="linkNext" href="{$U_UP}" title="{'Thumbnails'|@translate}">
+ <div class="thumbHover">{'Last Page'|@translate}<br><br>{'Go back to the album'|@translate}</div>
</a>
{/if}
</div>
@@ -218,12 +220,7 @@ y.callService(
<dt>{'Rating score'|@translate}</dt>
<dd>
{if $rate_summary.count}
- {if $rate_summary.count == 1}
- {assign var='rate_text' value='%d rate'|@translate}
- {else}
- {assign var='rate_text' value='%d rates'|@translate}
- {/if}
- <span id="ratingScore">{$rate_summary.score}</span> <span id="ratingCount">({$pwg->sprintf($rate_text, $rate_summary.count)})</span>
+ <span id="ratingScore">{$rate_summary.score}</span> <span id="ratingCount">({$rate_summary.count|@translate_dec:'%d rate':'%d rates'})</span>
{else}
<span id="ratingScore">{'no rate'|@translate}</span> <span id="ratingCount"></span>
{/if}
@@ -274,51 +271,38 @@ y.callService(
{/if}
{if $display_info.privacy_level and isset($available_permission_levels)}
- <div id="Privacy" class="imageInfo"><div class="relSwitchBox">
- <dt><a id="privacyLevelLink" href="javascript:togglePrivacyLevelBox()">{'Who can see this photo?'|@translate}</a></dt>
+ <div id="Privacy" class="imageInfo">
+ <dt>{'Who can see this photo?'|@translate}</dt>
<dd>
+ <div>
+ <a id="privacyLevelLink" href>{$available_permission_levels[$current.level]}</a>
+ </div>
{combine_script id='core.scripts' load='async' path='themes/default/js/scripts.js'}
-{footer_script require='jquery'}
-{literal}function setPrivacyLevel(rootUrl, id, level)
-{
-var y = new PwgWS(rootUrl);
-y.callService(
- "pwg.images.setPrivacyLevel", {image_id: id, level:level} ,
+{footer_script require='jquery'}{strip}
+function setPrivacyLevel(id, level){
+(new PwgWS('{$ROOT_URL}')).callService(
+ "pwg.images.setPrivacyLevel", { image_id:id, level:level},
{
method: "POST",
onFailure: function(num, text) { alert(num + " " + text); },
onSuccess: function(result) {
jQuery('#privacyLevelBox .switchCheck').css('visibility','hidden');
- jQuery('#levelCheck'+level).css('visibility','visible');
+ jQuery('#switchLevel'+level).prev('.switchCheck').css('visibility','visible');
+ jQuery('#privacyLevelLink').text(jQuery('#switchLevel'+level).text());
}
}
);
}
-function togglePrivacyLevelBox()
-{
- var elt = document.getElementById("privacyLevelBox"),
- ePos = document.getElementById("privacyLevelLink");
- if (elt.style.display == "none")
- {
- elt.style.left = (ePos.offsetLeft)+"px";
- elt.style.top = (ePos.offsetTop+ePos.offsetHeight)+"px";
- elt.style.display="block";
- }
- else
- elt.style.display="none";
-}
-{/literal}
-{/footer_script}
-
- <div id="privacyLevelBox" class="switchBox" onclick="togglePrivacyLevelBox()" style="display:none" onmouseout="e=event.toElement||event.relatedTarget;e.parentNode==this||e==this||togglePrivacyLevelBox()">
+(SwitchBox=window.SwitchBox||[]).push("#privacyLevelLink", "#privacyLevelBox");
+{/strip}{/footer_script}
+ <div id="privacyLevelBox" class="switchBox" style="display:none">
{foreach from=$available_permission_levels item=label key=level}
- <span id="levelCheck{$level}" class="switchCheck" {if $level != $current.level} style="visibility:hidden"{/if}>&#x2714; </span>
- <a id="switchLevel{$level}" href="javascript:setPrivacyLevel('{$ROOT_URL}', {$current.id}, {$level})">{$label}</a><br>
+ <span class="switchCheck"{if $level != $current.level} style="visibility:hidden"{/if}>&#x2714; </span>
+ <a id="switchLevel{$level}" href="javascript:setPrivacyLevel({$current.id},{$level})">{$label}</a><br>
{/foreach}
</div>
-
</dd>
- </div></div>
+ </div>
{/if}
{/strip}
</dl>
@@ -341,7 +325,7 @@ function togglePrivacyLevelBox()
{if isset($COMMENT_COUNT)}
<div id="comments" {if (!isset($comment_add) && ($COMMENT_COUNT == 0))}class="noCommentContent"{else}class="commentContent"{/if}><div id="commentsSwitcher"></div>
- <h3>{$pwg->l10n_dec('%d comment', '%d comments',$COMMENT_COUNT)}</h3>
+ <h3>{$COMMENT_COUNT|@translate_dec:'%d comment':'%d comments'}</h3>
<div id="pictureComments">
{if isset($comment_add)}
@@ -353,7 +337,7 @@ function togglePrivacyLevelBox()
<p><input type="text" name="author" id="author" value="{$comment_add.AUTHOR}"></p>
{/if}
{if $comment_add.SHOW_EMAIL}
- <p><label for="email">{'Email'|@translate}{if $comment_add.EMAIL_MANDATORY} ({'mandatory'|@translate}){/if} :</label></p>
+ <p><label for="email">{'Email address'|@translate}{if $comment_add.EMAIL_MANDATORY} ({'mandatory'|@translate}){/if} :</label></p>
<p><input type="text" name="email" id="email" value="{$comment_add.EMAIL}"></p>
{/if}
<p><label for="website_url">{'Website'|@translate} :</label></p>
diff --git a/themes/default/template/picture_content.tpl b/themes/default/template/picture_content.tpl
index 793c275ea..c2bbc2e39 100644
--- a/themes/default/template/picture_content.tpl
+++ b/themes/default/template/picture_content.tpl
@@ -4,17 +4,17 @@
{footer_script}var error_icon = "{$ROOT_URL}{$themeconf.icon_dir}/errors_small.png"{/footer_script}
{/if}
-<img {if $current.selected_derivative->is_cached()}src="{$current.selected_derivative->get_url()}" {$current.selected_derivative->get_size_htm()}{else}src="{$ROOT_URL}{$themeconf.img_dir}/ajax_loader.gif" data-src="{$current.selected_derivative->get_url()}"{/if} alt="{$ALT_IMG}" id="theMainImage" usemap="#map{$current.selected_derivative->get_type()}" title="{if isset($COMMENT_IMG)}{$COMMENT_IMG|@strip_tags:false|@replace:'"':' '}{else}{$current.TITLE|@replace:'"':' '} - {$ALT_IMG}{/if}">
+<img {if $current.selected_derivative->is_cached()}src="{$current.selected_derivative->get_url()}" {$current.selected_derivative->get_size_htm()}{else}src="{$ROOT_URL}{$themeconf.img_dir}/ajax_loader.gif" data-src="{$current.selected_derivative->get_url()}"{/if} alt="{$ALT_IMG}" id="theMainImage" usemap="#map{$current.selected_derivative->get_type()}" title="{if isset($COMMENT_IMG)}{$COMMENT_IMG|@strip_tags:false|@replace:'"':' '}{else}{$current.TITLE_ESC} - {$ALT_IMG}{/if}">
{foreach from=$current.unique_derivatives item=derivative key=derivative_type}{strip}
<map name="map{$derivative->get_type()}">
{assign var='size' value=$derivative->get_size()}
{if isset($previous)}
-<area shape=rect coords="0,0,{$size[0]/4|@intval},{$size[1]}" href="{$previous.U_IMG}" title="{'Previous'|@translate} : {$previous.TITLE|@escape}" alt="{$previous.TITLE|@escape}">
+<area shape=rect coords="0,0,{($size[0]/4)|@intval},{$size[1]}" href="{$previous.U_IMG}" title="{'Previous'|@translate} : {$previous.TITLE_ESC}" alt="{$previous.TITLE_ESC}">
{/if}
-<area shape=rect coords="{$size[0]/4|@intval},0,{$size[0]/1.34|@intval},{$size[1]/4|@intval}" href="{$U_UP}" title="{'Thumbnails'|@translate}" alt="{'Thumbnails'|@translate}">
+<area shape=rect coords="{($size[0]/4)|@intval},0,{($size[0]/1.34)|@intval},{($size[1]/4)|@intval}" href="{$U_UP}" title="{'Thumbnails'|@translate}" alt="{'Thumbnails'|@translate}">
{if isset($next)}
-<area shape=rect coords="{$size[0]/1.33|@intval},0,{$size[0]},{$size[1]}" href="{$next.U_IMG}" title="{'Next'|@translate} : {$next.TITLE|@escape}" alt="{$next.TITLE|@escape}">
+<area shape=rect coords="{($size[0]/1.33)|@intval},0,{$size[0]},{$size[1]}" href="{$next.U_IMG}" title="{'Next'|@translate} : {$next.TITLE_ESC}" alt="{$next.TITLE_ESC}">
{/if}
</map>
{/strip}{/foreach} \ No newline at end of file
diff --git a/themes/default/template/picture_nav_buttons.tpl b/themes/default/template/picture_nav_buttons.tpl
index 6da241c51..b56ab0eee 100644
--- a/themes/default/template/picture_nav_buttons.tpl
+++ b/themes/default/template/picture_nav_buttons.tpl
@@ -3,31 +3,31 @@
{if isset($slideshow)}
{if isset($slideshow.U_INC_PERIOD)}
<a href="{$slideshow.U_INC_PERIOD}" title="{'Reduce diaporama speed'|@translate}" class="pwg-state-default pwg-button">
- <span class="pwg-icon pwg-icon-clock-minus">&nbsp;</span><span class="pwg-button-text">{'Reduce diaporama speed'|@translate}</span>
+ <span class="pwg-icon pwg-icon-clock-minus"></span><span class="pwg-button-text">{'Reduce diaporama speed'|@translate}</span>
</a>
{else}
<span class="pwg-state-disabled pwg-button">
- <span class="pwg-icon pwg-icon-clock-minus">&nbsp;</span><span class="pwg-button-text">{'Reduce diaporama speed'|@translate}</span>
+ <span class="pwg-icon pwg-icon-clock-minus"></span><span class="pwg-button-text">{'Reduce diaporama speed'|@translate}</span>
</span>
{/if}
{if isset($slideshow.U_DEC_PERIOD)}
<a href="{$slideshow.U_DEC_PERIOD}" title="{'Accelerate diaporama speed'|@translate}" class="pwg-state-default pwg-button">
- <span class="pwg-icon pwg-icon-clock-plus">&nbsp;</span><span class="pwg-button-text">{'Accelerate diaporama speed'|@translate}</span>
+ <span class="pwg-icon pwg-icon-clock-plus"></span><span class="pwg-button-text">{'Accelerate diaporama speed'|@translate}</span>
</a>
{else}
<span class="pwg-state-disabled pwg-button">
- <span class="pwg-icon pwg-icon-clock-plus">&nbsp;</span><span class="pwg-button-text">{'Accelerate diaporama speed'|@translate}</span>
+ <span class="pwg-icon pwg-icon-clock-plus"></span><span class="pwg-button-text">{'Accelerate diaporama speed'|@translate}</span>
</span>
{/if}
{/if}
{if isset($slideshow.U_START_REPEAT)}
<a href="{$slideshow.U_START_REPEAT}" title="{'Repeat the slideshow'|@translate}" class="pwg-state-default pwg-button">
- <span class="pwg-icon pwg-icon-repeat-play">&nbsp;</span><span class="pwg-button-text">{'Repeat the slideshow'|@translate}</span>
+ <span class="pwg-icon pwg-icon-repeat-play"></span><span class="pwg-button-text">{'Repeat the slideshow'|@translate}</span>
</a>
{/if}
{if isset($slideshow.U_STOP_REPEAT)}
<a href="{$slideshow.U_STOP_REPEAT}" title="{'Not repeat the slideshow'|@translate}" class="pwg-state-default pwg-button">
- <span class="pwg-icon pwg-icon-repeat-stop">&nbsp;</span><span class="pwg-button-text">{'Not repeat the slideshow'|@translate}</span>
+ <span class="pwg-icon pwg-icon-repeat-stop"></span><span class="pwg-button-text">{'Not repeat the slideshow'|@translate}</span>
</a>
{/if}
{*<!--{strip}{if isset($first)}
@@ -41,35 +41,35 @@
{/if}{/strip}-->*}
{strip}{if isset($U_UP) and !isset($slideshow)}
<a href="{$U_UP}" title="{'Thumbnails'|@translate}" class="pwg-state-default pwg-button">
- <span class="pwg-icon pwg-icon-arrow-n">&nbsp;</span><span class="pwg-button-text">{'Thumbnails'|@translate}</span>
+ <span class="pwg-icon pwg-icon-arrow-n"></span><span class="pwg-button-text">{'Thumbnails'|@translate}</span>
</a>
{/if}{/strip}
{strip}{if isset($previous)}
- <a href="{$previous.U_IMG}" title="{'Previous'|@translate} : {$previous.TITLE|@escape}" class="pwg-state-default pwg-button">
- <span class="pwg-icon pwg-icon-arrow-w">&nbsp;</span><span class="pwg-button-text">{'Previous'|@translate}</span>
+ <a href="{$previous.U_IMG}" title="{'Previous'|@translate} : {$previous.TITLE_ESC}" class="pwg-state-default pwg-button">
+ <span class="pwg-icon pwg-icon-arrow-w"></span><span class="pwg-button-text">{'Previous'|@translate}</span>
</a>
{else}
<span class="pwg-state-disabled pwg-button">
- <span class="pwg-icon pwg-icon-arrow-w">&nbsp;</span><span class="pwg-button-text">{'Previous'|@translate}</span>
+ <span class="pwg-icon pwg-icon-arrow-w"></span><span class="pwg-button-text">{'Previous'|@translate}</span>
</span>
{/if}{/strip}
{if isset($slideshow.U_START_PLAY)}
<a href="{$slideshow.U_START_PLAY}" title="{'Play of slideshow'|@translate}" class="pwg-state-default pwg-button">
- <span class="pwg-icon pwg-icon-play">&nbsp;</span><span class="pwg-button-text">{'Play of slideshow'|@translate}</span>
+ <span class="pwg-icon pwg-icon-play"></span><span class="pwg-button-text">{'Play of slideshow'|@translate}</span>
</a>
{/if}
{if isset($slideshow.U_STOP_PLAY)}
<a href="{$slideshow.U_STOP_PLAY}" title="{'Pause of slideshow'|@translate}" class="pwg-state-default pwg-button">
- <span class="pwg-icon pwg-icon-pause">&nbsp;</span><span class="pwg-button-text">{'Pause of slideshow'|@translate}</span>
+ <span class="pwg-icon pwg-icon-pause"></span><span class="pwg-button-text">{'Pause of slideshow'|@translate}</span>
</a>
{/if}
{strip}{if isset($next)}
- <a href="{$next.U_IMG}" title="{'Next'|@translate} : {$next.TITLE|@escape}" class="pwg-state-default pwg-button pwg-button-icon-right">
- <span class="pwg-icon pwg-icon-arrow-e">&nbsp;</span><span class="pwg-button-text">{'Next'|@translate}</span>
+ <a href="{$next.U_IMG}" title="{'Next'|@translate} : {$next.TITLE_ESC}" class="pwg-state-default pwg-button pwg-button-icon-right">
+ <span class="pwg-icon pwg-icon-arrow-e"></span><span class="pwg-button-text">{'Next'|@translate}</span>
</a>
{else}
<span class="pwg-state-disabled pwg-button pwg-button-icon-right">
- <span class="pwg-icon pwg-icon-arrow-e">&nbsp;</span><span class="pwg-button-text">{'Next'|@translate}</span>
+ <span class="pwg-icon pwg-icon-arrow-e"></span><span class="pwg-button-text">{'Next'|@translate}</span>
</span>
{/if}{/strip}
{*<!--{strip}{if isset($last)}
diff --git a/themes/default/template/profile_content.tpl b/themes/default/template/profile_content.tpl
index 3f2245523..0c4f26c10 100644
--- a/themes/default/template/profile_content.tpl
+++ b/themes/default/template/profile_content.tpl
@@ -50,7 +50,7 @@
</li>
<li>
<span class="property">
- <label for="template">{'Interface theme'|@translate}</label>
+ <label for="template">{'Theme'|@translate}</label>
</span>
{html_options name=theme options=$template_options selected=$template_selection}
</li>
diff --git a/themes/default/template/redirect.tpl b/themes/default/template/redirect.tpl
index aa90953ec..bfab38386 100644
--- a/themes/default/template/redirect.tpl
+++ b/themes/default/template/redirect.tpl
@@ -1,12 +1,8 @@
-{html_head}
-<style type="text/css">#the_page {ldelim}text-align:center;} </style>
-{/html_head}
-
-<div>
+<div style="margin:2em;text-align:center;font-size:larger">
{$REDIRECT_MSG}
</div>
-<p style="margin: 2em">
+<p style="margin:2em;text-align:center">
<a href="{$page_refresh.U_REFRESH}">
{'Click here if your browser does not automatically forward you'|@translate}
</a>
diff --git a/themes/default/template/search.tpl b/themes/default/template/search.tpl
index c27b33202..4db60eb96 100644
--- a/themes/default/template/search.tpl
+++ b/themes/default/template/search.tpl
@@ -21,7 +21,7 @@
<ul class="categoryActions">
{combine_script id='core.scripts' load='async' path='themes/default/js/scripts.js'}
<li><a href="{$U_HELP}" onclick="popuphelp(this.href); return false;" title="{'Help'|@translate}" class="pwg-state-default pwg-button">
- <span class="pwg-icon pwg-icon-help">&nbsp;</span><span class="pwg-button-text">{'Help'|@translate}</span>
+ <span class="pwg-icon pwg-icon-help"></span><span class="pwg-button-text">{'Help'|@translate}</span>
</a></li>
</ul>
<h2><a href="{$U_HOME}">{'Home'|@translate}</a>{$LEVEL_SEPARATOR}{'Search'|@translate}</h2>
@@ -33,7 +33,7 @@
<fieldset>
<legend>{'Filter'|@translate}</legend>
<label>{'Search for words'|@translate}
- <input type="text" style="width: 300px" name="search_allwords" size="30">
+ <input type="text" name="search_allwords" size="35">
</label>
<ul>
<li><label>
@@ -44,7 +44,7 @@
</label></li>
</ul>
<label>{'Search for Author'|@translate}
- <input type="text" style="width: 300px" name="search_author" size="30">
+ <input type="text" name="search_author" size="35">
</label>
</fieldset>
@@ -111,7 +111,7 @@
<fieldset>
<legend>{'Search in albums'|@translate}</legend>
<label>{'Albums'|@translate}
- <select class="categoryList" name="cat[]" multiple="multiple" >
+ <select class="categoryList" name="cat[]" multiple="multiple" size="15">
{html_options options=$category_options selected=$category_options_selected}
</select>
</label>
diff --git a/themes/default/template/tags.tpl b/themes/default/template/tags.tpl
index c4327289a..b4f54b24d 100644
--- a/themes/default/template/tags.tpl
+++ b/themes/default/template/tags.tpl
@@ -5,12 +5,12 @@
<ul class="categoryActions">
{if $display_mode == 'letters'}
<li><a href="{$U_CLOUD}" title="{'show tag cloud'|@translate}" class="pwg-state-default pwg-button">
- <span class="pwg-icon pwg-icon-cloud">&nbsp;</span><span class="pwg-button-text">{'cloud'|@translate}</span>
+ <span class="pwg-icon pwg-icon-cloud"></span><span class="pwg-button-text">{'cloud'|@translate}</span>
</a></li>
{/if}
{if $display_mode == 'cloud'}
<li><a href="{$U_LETTERS}" title="{'group by letters'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
- <span class="pwg-icon pwg-icon-letters">&nbsp;</span><span class="pwg-button-text">{'letters'|@translate}</span>
+ <span class="pwg-icon pwg-icon-letters"></span><span class="pwg-button-text">{'letters'|@translate}</span>
</a></li>
{/if}
</ul>
@@ -23,7 +23,7 @@
{if $display_mode == 'cloud' and isset($tags)}
<div id="fullTagCloud">
{foreach from=$tags item=tag}
- <span><a href="{$tag.URL}" class="tagLevel{$tag.level}" title="{$pwg->l10n_dec('%d photo', '%d photos', $tag.counter)}">{$tag.name}</a></span>
+ <span><a href="{$tag.URL}" class="tagLevel{$tag.level}" title="{$tag.counter|@translate_dec:'%d photo':'%d photos'}">{$tag.name}</a></span>
{/foreach}
</div>
{/if}
@@ -39,7 +39,7 @@
{foreach from=$letter.tags item=tag}
<tr class="tagLine">
<td><a href="{$tag.URL}" title="{$tag.name}">{$tag.name}</a></td>
- <td class="nbEntries">{$pwg->l10n_dec('%d photo', '%d photos', $tag.counter)}</td>
+ <td class="nbEntries">{$tag.counter|@translate_dec:'%d photo':'%d photos'}</td>
</tr>
{/foreach}
</table>
diff --git a/themes/default/theme.css b/themes/default/theme.css
index 25444db30..a5f8e49ad 100644
--- a/themes/default/theme.css
+++ b/themes/default/theme.css
@@ -136,22 +136,19 @@
/* begin chronology/calendar elements*/
.calendarViews {
- display: block;
float: right;
margin: 5px 5px 0 0;
}
-.calItem, .calItemEmpty {
+.calItem {
font-weight: bold;
margin: 0 1px;
+ padding: 0 1px;
border: 1px solid gray;
}
-.calItem A { border:0 }
-
.calendarCalBar {
margin: 10px;
- text-align: left;
}
.calCalHead {
@@ -176,18 +173,6 @@ TD.calDayCellFull, TD.calDayCellEmpty {
border: 1px solid gray;
}
-.calImg {
- overflow: hidden;
- vertical-align: bottom;
- z-index: 1;
- position: relative; /*<- this required by IE*/
-}
-
-.calImg IMG {
- position: relative;
- border: 0;
-}
-
.calBackDate {
padding-left: 4px;
padding-top: 0;
@@ -378,10 +363,6 @@ TD.calDayCellFull, TD.calDayCellEmpty {
margin-bottom:5px;
}
-.relSwitchBox {
- position: relative;
-}
-
#theImage {
text-align: center;
}
@@ -399,6 +380,16 @@ TD.calDayCellFull, TD.calDayCellEmpty {
#linkNext {
float: right;
margin: 5px 5px 0 10px;
+ text-align: right;
+}
+
+
+DIV.thumbHover{ /*only first & last holders are divs*/
+ width: 108px;
+ height: 118px;
+ border: 1px solid gray;
+ padding: 0 5px;
+ line-height: 1.2;
}
.imageInfoTable UL { /*this is the album list*/
@@ -574,14 +565,12 @@ FIELDSET {
}
.tagSelection {
- width: 99%;
- margin: 1em 0;
- padding: 0;
+ margin: 1em 0 !important;
}
.tagSelection LI {
display:inline-block;
- width:150px!important;
+ width: 150px;
overflow:hidden;
white-space: nowrap;
}
@@ -590,7 +579,7 @@ FIELDSET {
font-size: 120%;
text-align: justify;
padding: 0;
- margin: 1em 2em;
+ margin: 1em;
}
#fullTagCloud SPAN {
@@ -662,7 +651,7 @@ IMG.ui-datepicker-trigger {
*/
/* So that non-links are slightly greyed out */
-.content .navigationBar, .calItemEmpty, TD.calDayCellEmpty {
+.content .navigationBar, SPAN.calItem, TD.calDayCellEmpty {
color: #b0b0b0;
}
@@ -753,10 +742,6 @@ LEGEND {
border-radius: 3px;
}
-#lostPassword {
- padding: 1em;
-}
-
#lostPassword p {
text-align: left;
margin: 1.5em 0;
diff --git a/themes/elegant/admin/admin.inc.php b/themes/elegant/admin/admin.inc.php
new file mode 100644
index 000000000..bbb03c1c7
--- /dev/null
+++ b/themes/elegant/admin/admin.inc.php
@@ -0,0 +1,30 @@
+<?php
+
+// Need upgrade?
+global $conf;
+include(PHPWG_THEMES_PATH.'elegant/admin/upgrade.inc.php');
+
+load_language('theme.lang', PHPWG_THEMES_PATH.'elegant/');
+
+$config_send= array();
+
+if(isset($_POST['submit_elegant']))
+{
+ $config_send['p_main_menu']=(isset($_POST['p_main_menu']) and !empty($_POST['p_main_menu'])) ? $_POST['p_main_menu'] : 'on';
+ $config_send['p_pict_descr']=(isset($_POST['p_pict_descr']) and !empty($_POST['p_pict_descr'])) ? $_POST['p_pict_descr'] : 'on';
+ $config_send['p_pict_comment']=(isset($_POST['p_pict_comment']) and !empty($_POST['p_pict_comment'])) ? $_POST['p_pict_comment'] : 'off';
+
+ $conf['elegant'] = serialize($config_send);
+ conf_update_param('elegant', pwg_db_real_escape_string($conf['elegant']));
+
+ array_push($page['infos'], l10n('Information data registered in database'));
+}
+
+$template->set_filenames(array(
+ 'theme_admin_content' => dirname(__FILE__) . '/admin.tpl'));
+
+$template->assign('options', unserialize($conf['elegant']));
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'theme_admin_content');
+
+?> \ No newline at end of file
diff --git a/themes/elegant/admin/admin.tpl b/themes/elegant/admin/admin.tpl
new file mode 100644
index 000000000..2cbad5e21
--- /dev/null
+++ b/themes/elegant/admin/admin.tpl
@@ -0,0 +1,44 @@
+{combine_css path="themes/default/js/ui/theme/jquery.ui.button.css"}
+{combine_css path="themes/elegant/admin/jquery.ui.button.css"}
+{footer_script require='jquery.ui.button'}
+{literal}
+jQuery(document).ready(function(){
+ jQuery( ".radio" ).buttonset();
+});
+{/literal}
+{/footer_script}
+
+<div class="titrePage">
+ <h2>{'Elegant, Configuration Page'|@translate}</h2>
+</div>
+<form method="post" class="properties" action="" ENCTYPE="multipart/form-data" name="form" class="properties">
+<div id="configContent">
+ <fieldset>
+ <legend>{'Panels options'|@translate}</legend>
+ <p>{'Choose what should be the default state for each panel, or disable the animation:'|@translate}</p>
+ <ul>
+ <li class="radio" >
+ <label for="p_main_menu"><span class="property">{'Main Menu Panel'|@translate}</span>&nbsp;</label>
+ <input type="radio" id="p_main_menu_on" name="p_main_menu" value="on" {if $options.p_main_menu=="on"}checked="checked"{/if}><label for="p_main_menu_on">{'Displayed'|@translate}</label>
+ <input type="radio" id="p_main_menu_off" name="p_main_menu" value="off" {if $options.p_main_menu=="off"}checked="checked"{/if}><label for="p_main_menu_off">{'Hidden'|@translate}</label>
+ <input type="radio" id="p_main_menu_disabled" name="p_main_menu" value="disabled" {if $options.p_main_menu=="disabled"}checked="checked"{/if}><label for="p_main_menu_disabled">{'Disable the animation'|@translate}</label>
+ </li>
+ <li class="radio" >
+ <label for="p_pict_descr"><span class="property">{'Photo Description Panel'|@translate}</span>&nbsp;</label>
+ <input type="radio" id="p_pict_descr_on" name="p_pict_descr" value="on" {if $options.p_pict_descr=="on"}checked="checked"{/if}><label for="p_pict_descr_on">{'Displayed'|@translate}</label>
+ <input type="radio" id="p_pict_descr_off" name="p_pict_descr" value="off" {if $options.p_pict_descr=="off"}checked="checked"{/if}><label for="p_pict_descr_off">{'Hidden'|@translate}</label>
+ <input type="radio" id="p_pict_descr_disabled" name="p_pict_descr" value="disabled" {if $options.p_pict_descr=="disabled"}checked="checked"{/if}><label for="p_pict_descr_disabled">{'Disable the animation'|@translate}</label>
+ </li>
+ <li class="radio" >
+ <label for="p_pict_comment"><span class="property">{'Comments Panel'|@translate}</span>&nbsp;</label>
+ <input type="radio" id="p_pict_comment_on" name="p_pict_comment" value="on" {if $options.p_pict_comment=="on"}checked="checked"{/if}><label for="p_pict_comment_on">{'Displayed'|@translate}</label>
+ <input type="radio" id="p_pict_comment_off" name="p_pict_comment" value="off" {if $options.p_pict_comment=="off"}checked="checked"{/if}><label for="p_pict_comment_off">{'Hidden'|@translate}</label>
+ <input type="radio" id="p_pict_comment_disabled" name="p_pict_comment" value="disabled" {if $options.p_pict_comment=="disabled"}checked="checked"{/if}><label for="p_pict_comment_disabled">{'Disable the animation'|@translate}</label>
+ </li>
+ </ul>
+ </fieldset>
+</div>
+<p>
+ <input class="submit" type="submit" value="{'Submit'|@translate}" name="submit_elegant" />
+</p>
+</form>
diff --git a/themes/elegant/admin/index.php b/themes/elegant/admin/index.php
new file mode 100644
index 000000000..e3365959c
--- /dev/null
+++ b/themes/elegant/admin/index.php
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/elegant/admin/jquery.ui.button.css b/themes/elegant/admin/jquery.ui.button.css
new file mode 100644
index 000000000..4bc0491e3
--- /dev/null
+++ b/themes/elegant/admin/jquery.ui.button.css
@@ -0,0 +1,571 @@
+/*! jQuery UI - v1.10.3 - 2013-06-16
+* http://jqueryui.com
+* Includes: jquery.ui.core.css, jquery.ui.button.css
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
+* Copyright 2013 jQuery Foundation and other contributors Licensed MIT */
+
+/* Layout helpers
+----------------------------------*/
+#content .ui-helper-hidden {
+ display: none;
+}
+#content .ui-helper-hidden-accessible {
+ border: 0;
+ clip: rect(0 0 0 0);
+ height: 1px;
+ margin: -1px;
+ overflow: hidden;
+ padding: 0;
+ position: absolute;
+ width: 1px;
+}
+#content .ui-helper-reset {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ outline: 0;
+ line-height: 1.3;
+ text-decoration: none;
+ font-size: 100%;
+ list-style: none;
+}
+#content .ui-helper-clearfix:before,
+#content .ui-helper-clearfix:after {
+ content: "";
+ display: table;
+ border-collapse: collapse;
+}
+#content .ui-helper-clearfix:after {
+ clear: both;
+}
+#content .ui-helper-clearfix {
+ min-height: 0; /* support: IE7 */
+}
+#content .ui-helper-zfix {
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+ position: absolute;
+ opacity: 0;
+ filter:Alpha(Opacity=0);
+}
+
+#content .ui-front {
+ z-index: 100;
+}
+
+
+/* Interaction Cues
+----------------------------------*/
+#content .ui-state-disabled {
+ cursor: default !important;
+}
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+#content .ui-icon {
+ display: block;
+ text-indent: -99999px;
+ overflow: hidden;
+ background-repeat: no-repeat;
+}
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+#content .ui-widget-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+#content .ui-button {
+ display: inline-block;
+ position: relative;
+ padding: 0;
+ line-height: normal;
+ margin-right: .1em;
+ cursor: pointer;
+ vertical-align: middle;
+ text-align: center;
+ overflow: visible; /* removes extra width in IE */
+}
+#content .ui-button,
+#content .ui-button:link,
+#content .ui-button:visited,
+#content .ui-button:hover,
+#content .ui-button:active {
+ text-decoration: none;
+}
+/* to make room for the icon, a width needs to be set here */
+#content .ui-button-icon-only {
+ width: 2.2em;
+}
+/* button elements seem to need a little more width */
+#content button.ui-button-icon-only {
+ width: 2.4em;
+}
+#content .ui-button-icons-only {
+ width: 3.4em;
+}
+#content button.ui-button-icons-only {
+ width: 3.7em;
+}
+
+/* button text element */
+#content .ui-button .ui-button-text {
+ display: block;
+ line-height: normal;
+}
+#content .ui-button-text-only .ui-button-text {
+ padding: .4em 1em;
+}
+#content .ui-button-icon-only .ui-button-text,
+#content .ui-button-icons-only .ui-button-text {
+ padding: .4em;
+ text-indent: -9999999px;
+}
+#content .ui-button-text-icon-primary .ui-button-text,
+#content .ui-button-text-icons .ui-button-text {
+ padding: .4em 1em .4em 2.1em;
+}
+#content .ui-button-text-icon-secondary .ui-button-text,
+#content .ui-button-text-icons .ui-button-text {
+ padding: .4em 2.1em .4em 1em;
+}
+#content .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 */
+#content input.ui-button {
+ padding: .4em 1em;
+}
+
+/* button icon element(s) */
+#content .ui-button-icon-only .ui-icon,
+#content .ui-button-text-icon-primary .ui-icon,
+#content .ui-button-text-icon-secondary .ui-icon,
+#content .ui-button-text-icons .ui-icon,
+#content .ui-button-icons-only .ui-icon {
+ position: absolute;
+ top: 50%;
+ margin-top: -8px;
+}
+#content .ui-button-icon-only .ui-icon {
+ left: 50%;
+ margin-left: -8px;
+}
+#content .ui-button-text-icon-primary .ui-button-icon-primary,
+#content .ui-button-text-icons .ui-button-icon-primary,
+#content .ui-button-icons-only .ui-button-icon-primary {
+ left: .5em;
+}
+#content .ui-button-text-icon-secondary .ui-button-icon-secondary,
+#content .ui-button-text-icons .ui-button-icon-secondary,
+#content .ui-button-icons-only .ui-button-icon-secondary {
+ right: .5em;
+}
+
+/* button sets */
+#content .ui-buttonset {
+ margin-right: 7px;
+}
+#content .ui-buttonset .ui-button {
+ margin-left: 0;
+ margin-right: -.3em;
+}
+
+/* workarounds */
+/* reset extra padding in Firefox, see h5bp.com/l */
+#content input.ui-button::-moz-focus-inner,
+#content button.ui-button::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+
+/* Component containers
+----------------------------------*/
+#content .ui-widget-content {
+ border: 1px solid #aaaaaa;
+ background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x;
+ color: #222222;
+}
+#content .ui-widget-content a {
+ color: #222222;
+}
+#content .ui-widget-header {
+ border: 1px solid #aaaaaa;
+ background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;
+ color: #222222;
+ font-weight: bold;
+}
+#content .ui-widget-header a {
+ color: #222222;
+}
+
+/* Interaction states
+----------------------------------*/
+#content .ui-state-default,
+#content .ui-widget-content .ui-state-default,
+#content .ui-widget-header .ui-state-default {
+ border: 1px solid #d3d3d3;
+ background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x;
+ font-weight: normal;
+ color: #555555;
+}
+#content .ui-state-default a,
+#content .ui-state-default a:link,
+#content .ui-state-default a:visited {
+ color: #555555;
+ text-decoration: none;
+}
+#content .ui-state-hover,
+#content .ui-widget-content .ui-state-hover,
+#content .ui-widget-header .ui-state-hover,
+#content .ui-state-focus,
+#content .ui-widget-content .ui-state-focus,
+#content .ui-widget-header .ui-state-focus {
+ border: 1px solid #999999;
+ background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x;
+ font-weight: normal;
+ color: #212121;
+}
+#content .ui-state-hover a,
+#content .ui-state-hover a:hover,
+#content .ui-state-hover a:link,
+#content .ui-state-hover a:visited {
+ color: #212121;
+ text-decoration: none;
+}
+#content .ui-state-active,
+#content .ui-widget-content .ui-state-active,
+#content .ui-widget-header .ui-state-active {
+ border: 1px solid #aaaaaa;
+ background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;
+ font-weight: normal;
+ color: #212121;
+}
+#content .ui-state-active a,
+#content .ui-state-active a:link,
+#content .ui-state-active a:visited {
+ color: #212121;
+ text-decoration: none;
+}
+
+/* Interaction Cues
+----------------------------------*/
+#content .ui-state-highlight,
+#content .ui-widget-content .ui-state-highlight,
+#content .ui-widget-header .ui-state-highlight {
+ border: 1px solid #fcefa1;
+ background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x;
+ color: #363636;
+}
+#content .ui-state-highlight a,
+#content .ui-widget-content .ui-state-highlight a,
+#content .ui-widget-header .ui-state-highlight a {
+ color: #363636;
+}
+#content .ui-state-error,
+#content .ui-widget-content .ui-state-error,
+#content .ui-widget-header .ui-state-error {
+ border: 1px solid #cd0a0a;
+ background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x;
+ color: #cd0a0a;
+}
+#content .ui-state-error a,
+#content .ui-widget-content .ui-state-error a,
+#content .ui-widget-header .ui-state-error a {
+ color: #cd0a0a;
+}
+#content .ui-state-error-text,
+#content .ui-widget-content .ui-state-error-text,
+#content .ui-widget-header .ui-state-error-text {
+ color: #cd0a0a;
+}
+#content .ui-priority-primary,
+#content .ui-widget-content .ui-priority-primary,
+#content .ui-widget-header .ui-priority-primary {
+ font-weight: bold;
+}
+#content .ui-priority-secondary,
+#content .ui-widget-content .ui-priority-secondary,
+#content .ui-widget-header .ui-priority-secondary {
+ opacity: .7;
+ filter:Alpha(Opacity=70);
+ font-weight: normal;
+}
+#content .ui-state-disabled,
+#content .ui-widget-content .ui-state-disabled,
+#content .ui-widget-header .ui-state-disabled {
+ opacity: .35;
+ filter:Alpha(Opacity=35);
+ background-image: none;
+}
+#content .ui-state-disabled .ui-icon {
+ filter:Alpha(Opacity=35); /* For IE8 - See #6059 */
+}
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+#content .ui-icon {
+ width: 16px;
+ height: 16px;
+}
+#content .ui-icon,
+#content .ui-widget-content .ui-icon {
+ background-image: url(images/ui-icons_222222_256x240.png);
+}
+#content .ui-widget-header .ui-icon {
+ background-image: url(images/ui-icons_222222_256x240.png);
+}
+#content .ui-state-default .ui-icon {
+ background-image: url(images/ui-icons_888888_256x240.png);
+}
+#content .ui-state-hover .ui-icon,
+#content .ui-state-focus .ui-icon {
+ background-image: url(images/ui-icons_454545_256x240.png);
+}
+#content .ui-state-active .ui-icon {
+ background-image: url(images/ui-icons_454545_256x240.png);
+}
+#content .ui-state-highlight .ui-icon {
+ background-image: url(images/ui-icons_2e83ff_256x240.png);
+}
+#content .ui-state-error .ui-icon,
+#content .ui-state-error-text .ui-icon {
+ background-image: url(images/ui-icons_cd0a0a_256x240.png);
+}
+
+/* positioning */
+#content .ui-icon-blank { background-position: 16px 16px; }
+#content .ui-icon-carat-1-n { background-position: 0 0; }
+#content .ui-icon-carat-1-ne { background-position: -16px 0; }
+#content .ui-icon-carat-1-e { background-position: -32px 0; }
+#content .ui-icon-carat-1-se { background-position: -48px 0; }
+#content .ui-icon-carat-1-s { background-position: -64px 0; }
+#content .ui-icon-carat-1-sw { background-position: -80px 0; }
+#content .ui-icon-carat-1-w { background-position: -96px 0; }
+#content .ui-icon-carat-1-nw { background-position: -112px 0; }
+#content .ui-icon-carat-2-n-s { background-position: -128px 0; }
+#content .ui-icon-carat-2-e-w { background-position: -144px 0; }
+#content .ui-icon-triangle-1-n { background-position: 0 -16px; }
+#content .ui-icon-triangle-1-ne { background-position: -16px -16px; }
+#content .ui-icon-triangle-1-e { background-position: -32px -16px; }
+#content .ui-icon-triangle-1-se { background-position: -48px -16px; }
+#content .ui-icon-triangle-1-s { background-position: -64px -16px; }
+#content .ui-icon-triangle-1-sw { background-position: -80px -16px; }
+#content .ui-icon-triangle-1-w { background-position: -96px -16px; }
+#content .ui-icon-triangle-1-nw { background-position: -112px -16px; }
+#content .ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+#content .ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+#content .ui-icon-arrow-1-n { background-position: 0 -32px; }
+#content .ui-icon-arrow-1-ne { background-position: -16px -32px; }
+#content .ui-icon-arrow-1-e { background-position: -32px -32px; }
+#content .ui-icon-arrow-1-se { background-position: -48px -32px; }
+#content .ui-icon-arrow-1-s { background-position: -64px -32px; }
+#content .ui-icon-arrow-1-sw { background-position: -80px -32px; }
+#content .ui-icon-arrow-1-w { background-position: -96px -32px; }
+#content .ui-icon-arrow-1-nw { background-position: -112px -32px; }
+#content .ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+#content .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+#content .ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+#content .ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+#content .ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+#content .ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+#content .ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+#content .ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+#content .ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+#content .ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+#content .ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+#content .ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+#content .ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+#content .ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+#content .ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+#content .ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+#content .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+#content .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+#content .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+#content .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+#content .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+#content .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+#content .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+#content .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+#content .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+#content .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+#content .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+#content .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+#content .ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+#content .ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+#content .ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+#content .ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+#content .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+#content .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+#content .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+#content .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+#content .ui-icon-arrow-4 { background-position: 0 -80px; }
+#content .ui-icon-arrow-4-diag { background-position: -16px -80px; }
+#content .ui-icon-extlink { background-position: -32px -80px; }
+#content .ui-icon-newwin { background-position: -48px -80px; }
+#content .ui-icon-refresh { background-position: -64px -80px; }
+#content .ui-icon-shuffle { background-position: -80px -80px; }
+#content .ui-icon-transfer-e-w { background-position: -96px -80px; }
+#content .ui-icon-transferthick-e-w { background-position: -112px -80px; }
+#content .ui-icon-folder-collapsed { background-position: 0 -96px; }
+#content .ui-icon-folder-open { background-position: -16px -96px; }
+#content .ui-icon-document { background-position: -32px -96px; }
+#content .ui-icon-document-b { background-position: -48px -96px; }
+#content .ui-icon-note { background-position: -64px -96px; }
+#content .ui-icon-mail-closed { background-position: -80px -96px; }
+#content .ui-icon-mail-open { background-position: -96px -96px; }
+#content .ui-icon-suitcase { background-position: -112px -96px; }
+#content .ui-icon-comment { background-position: -128px -96px; }
+#content .ui-icon-person { background-position: -144px -96px; }
+#content .ui-icon-print { background-position: -160px -96px; }
+#content .ui-icon-trash { background-position: -176px -96px; }
+#content .ui-icon-locked { background-position: -192px -96px; }
+#content .ui-icon-unlocked { background-position: -208px -96px; }
+#content .ui-icon-bookmark { background-position: -224px -96px; }
+#content .ui-icon-tag { background-position: -240px -96px; }
+#content .ui-icon-home { background-position: 0 -112px; }
+#content .ui-icon-flag { background-position: -16px -112px; }
+#content .ui-icon-calendar { background-position: -32px -112px; }
+#content .ui-icon-cart { background-position: -48px -112px; }
+#content .ui-icon-pencil { background-position: -64px -112px; }
+#content .ui-icon-clock { background-position: -80px -112px; }
+#content .ui-icon-disk { background-position: -96px -112px; }
+#content .ui-icon-calculator { background-position: -112px -112px; }
+#content .ui-icon-zoomin { background-position: -128px -112px; }
+#content .ui-icon-zoomout { background-position: -144px -112px; }
+#content .ui-icon-search { background-position: -160px -112px; }
+#content .ui-icon-wrench { background-position: -176px -112px; }
+#content .ui-icon-gear { background-position: -192px -112px; }
+#content .ui-icon-heart { background-position: -208px -112px; }
+#content .ui-icon-star { background-position: -224px -112px; }
+#content .ui-icon-link { background-position: -240px -112px; }
+#content .ui-icon-cancel { background-position: 0 -128px; }
+#content .ui-icon-plus { background-position: -16px -128px; }
+#content .ui-icon-plusthick { background-position: -32px -128px; }
+#content .ui-icon-minus { background-position: -48px -128px; }
+#content .ui-icon-minusthick { background-position: -64px -128px; }
+#content .ui-icon-close { background-position: -80px -128px; }
+#content .ui-icon-closethick { background-position: -96px -128px; }
+#content .ui-icon-key { background-position: -112px -128px; }
+#content .ui-icon-lightbulb { background-position: -128px -128px; }
+#content .ui-icon-scissors { background-position: -144px -128px; }
+#content .ui-icon-clipboard { background-position: -160px -128px; }
+#content .ui-icon-copy { background-position: -176px -128px; }
+#content .ui-icon-contact { background-position: -192px -128px; }
+#content .ui-icon-image { background-position: -208px -128px; }
+#content .ui-icon-video { background-position: -224px -128px; }
+#content .ui-icon-script { background-position: -240px -128px; }
+#content .ui-icon-alert { background-position: 0 -144px; }
+#content .ui-icon-info { background-position: -16px -144px; }
+#content .ui-icon-notice { background-position: -32px -144px; }
+#content .ui-icon-help { background-position: -48px -144px; }
+#content .ui-icon-check { background-position: -64px -144px; }
+#content .ui-icon-bullet { background-position: -80px -144px; }
+#content .ui-icon-radio-on { background-position: -96px -144px; }
+#content .ui-icon-radio-off { background-position: -112px -144px; }
+#content .ui-icon-pin-w { background-position: -128px -144px; }
+#content .ui-icon-pin-s { background-position: -144px -144px; }
+#content .ui-icon-play { background-position: 0 -160px; }
+#content .ui-icon-pause { background-position: -16px -160px; }
+#content .ui-icon-seek-next { background-position: -32px -160px; }
+#content .ui-icon-seek-prev { background-position: -48px -160px; }
+#content .ui-icon-seek-end { background-position: -64px -160px; }
+#content .ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+#content .ui-icon-seek-first { background-position: -80px -160px; }
+#content .ui-icon-stop { background-position: -96px -160px; }
+#content .ui-icon-eject { background-position: -112px -160px; }
+#content .ui-icon-volume-off { background-position: -128px -160px; }
+#content .ui-icon-volume-on { background-position: -144px -160px; }
+#content .ui-icon-power { background-position: 0 -176px; }
+#content .ui-icon-signal-diag { background-position: -16px -176px; }
+#content .ui-icon-signal { background-position: -32px -176px; }
+#content .ui-icon-battery-0 { background-position: -48px -176px; }
+#content .ui-icon-battery-1 { background-position: -64px -176px; }
+#content .ui-icon-battery-2 { background-position: -80px -176px; }
+#content .ui-icon-battery-3 { background-position: -96px -176px; }
+#content .ui-icon-circle-plus { background-position: 0 -192px; }
+#content .ui-icon-circle-minus { background-position: -16px -192px; }
+#content .ui-icon-circle-close { background-position: -32px -192px; }
+#content .ui-icon-circle-triangle-e { background-position: -48px -192px; }
+#content .ui-icon-circle-triangle-s { background-position: -64px -192px; }
+#content .ui-icon-circle-triangle-w { background-position: -80px -192px; }
+#content .ui-icon-circle-triangle-n { background-position: -96px -192px; }
+#content .ui-icon-circle-arrow-e { background-position: -112px -192px; }
+#content .ui-icon-circle-arrow-s { background-position: -128px -192px; }
+#content .ui-icon-circle-arrow-w { background-position: -144px -192px; }
+#content .ui-icon-circle-arrow-n { background-position: -160px -192px; }
+#content .ui-icon-circle-zoomin { background-position: -176px -192px; }
+#content .ui-icon-circle-zoomout { background-position: -192px -192px; }
+#content .ui-icon-circle-check { background-position: -208px -192px; }
+#content .ui-icon-circlesmall-plus { background-position: 0 -208px; }
+#content .ui-icon-circlesmall-minus { background-position: -16px -208px; }
+#content .ui-icon-circlesmall-close { background-position: -32px -208px; }
+#content .ui-icon-squaresmall-plus { background-position: -48px -208px; }
+#content .ui-icon-squaresmall-minus { background-position: -64px -208px; }
+#content .ui-icon-squaresmall-close { background-position: -80px -208px; }
+#content .ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+#content .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+#content .ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+#content .ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+#content .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+#content .ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+#content .ui-corner-all,
+#content .ui-corner-top,
+#content .ui-corner-left,
+#content .ui-corner-tl {
+ border-top-left-radius: 4px;
+}
+#content .ui-corner-all,
+#content .ui-corner-top,
+#content .ui-corner-right,
+#content .ui-corner-tr {
+ border-top-right-radius: 4px;
+}
+#content .ui-corner-all,
+#content .ui-corner-bottom,
+#content .ui-corner-left,
+#content .ui-corner-bl {
+ border-bottom-left-radius: 4px;
+}
+#content .ui-corner-all,
+#content .ui-corner-bottom,
+#content .ui-corner-right,
+#content .ui-corner-br {
+ border-bottom-right-radius: 4px;
+}
+
+/* Overlays */
+#content .ui-widget-overlay {
+ background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;
+ opacity: .3;
+ filter: Alpha(Opacity=30);
+}
+#content .ui-widget-shadow {
+ margin: -8px 0 0 -8px;
+ padding: 8px;
+ background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;
+ opacity: .3;
+ filter: Alpha(Opacity=30);
+ border-radius: 8px;
+}
diff --git a/themes/elegant/admin/upgrade.inc.php b/themes/elegant/admin/upgrade.inc.php
new file mode 100644
index 000000000..6cda1318a
--- /dev/null
+++ b/themes/elegant/admin/upgrade.inc.php
@@ -0,0 +1,31 @@
+<?php
+
+if (!defined('PHPWG_ROOT_PATH')) die('Hacking attempt!');
+
+global $prefixeTable, $conf;
+
+if (!isset($conf['elegant']))
+{
+ $config = array(
+ 'p_main_menu' => 'on',//on - off - disabled
+ 'p_pict_descr' => 'on',//on - off - disabled
+ 'p_pict_comment' => 'off',//on - off - disabled
+ );
+ $query = "
+INSERT INTO " . CONFIG_TABLE . " (param,value,comment)
+VALUES ('elegant' , '".pwg_db_real_escape_string(serialize($config))."' , 'p_main_menu#');";
+ pwg_query($query);
+ load_conf_from_db();
+}
+elseif (count(unserialize( $conf['elegant'] ))!=3)
+{
+ $conff=unserialize($conf['elegant']);
+ $config = array(
+ 'p_main_menu' => (isset($conff['p_main_menu'])) ? $conff['p_main_menu'] :'on',
+ 'p_pict_descr' => (isset($conff['p_pict_descr'])) ? $conff['p_pict_descr'] :'on',
+ 'p_pict_comment' => (isset($conff['p_pict_comment'])) ? $conff['p_pict_comment'] :'off',
+ );
+ conf_update_param('elegant', pwg_db_real_escape_string(serialize($config)));
+ load_conf_from_db();
+}
+?> \ No newline at end of file
diff --git a/themes/elegant/icon/icons_sprite-hover.png b/themes/elegant/icon/icons_sprite-hover.png
index 49f135b75..f181301af 100644
--- a/themes/elegant/icon/icons_sprite-hover.png
+++ b/themes/elegant/icon/icons_sprite-hover.png
Binary files differ
diff --git a/themes/elegant/icon/icons_sprite.png b/themes/elegant/icon/icons_sprite.png
index 992f7279d..af96ffedc 100644
--- a/themes/elegant/icon/icons_sprite.png
+++ b/themes/elegant/icon/icons_sprite.png
Binary files differ
diff --git a/themes/elegant/icon/icons_sprite.xcf b/themes/elegant/icon/icons_sprite.xcf
index 620462b08..e9dfe623f 100644
--- a/themes/elegant/icon/icons_sprite.xcf
+++ b/themes/elegant/icon/icons_sprite.xcf
Binary files differ
diff --git a/themes/elegant/index.php b/themes/elegant/index.php
index 41732f2fd..c8de97f60 100644
--- a/themes/elegant/index.php
+++ b/themes/elegant/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/themes/elegant/language/ar_SA/theme.lang.php b/themes/elegant/language/ar_SA/theme.lang.php
new file mode 100755
index 000000000..7d9d1e000
--- /dev/null
+++ b/themes/elegant/language/ar_SA/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'اختيار ما ينبغي أن تكون علية الحالة الاÙتراضية لكل لوحة، أو تعطيل الرسوم المتحركة:';
+$lang['Comments Panel'] = 'لوحة التعليقات';
+$lang['Disable the animation'] = 'تعطيل الرسوم المتحركة';
+$lang['Displayed'] = 'عرض';
+$lang['Elegant, Configuration Page'] = 'الأنيق، صÙحة التكوين';
+$lang['Hidden'] = 'مخÙÙŠ';
+$lang['Main Menu Panel'] = 'لوحة القائمة الرئيسية ';
+$lang['Panels options'] = 'خيارات اللوحات';
+$lang['Photo Description Panel'] = 'لوحة وص٠الصورة';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/bg_BG/theme.lang.php b/themes/elegant/language/bg_BG/theme.lang.php
new file mode 100755
index 000000000..b698af481
--- /dev/null
+++ b/themes/elegant/language/bg_BG/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Изберете какъв ще бъде по подразбиране вÑеки панел или забранете анимирането:';
+$lang['Photo Description Panel'] = 'Панел Ñ Ð¾Ð¿Ð¸Ñание на Ñнимки';
+$lang['Panels options'] = 'Панел опции';
+$lang['Main Menu Panel'] = 'Панел на оÑновното меню';
+$lang['Hidden'] = 'Скрито';
+$lang['Elegant, Configuration Page'] = 'Elegant, конфигурационна Ñтраница';
+$lang['Disable the animation'] = 'Забрана на анимациÑ';
+$lang['Displayed'] = 'Показани';
+$lang['Comments Panel'] = 'Панел Ñ ÐºÐ¾Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/br_FR/theme.lang.php b/themes/elegant/language/br_FR/theme.lang.php
new file mode 100755
index 000000000..1224acfa8
--- /dev/null
+++ b/themes/elegant/language/br_FR/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Comments Panel'] = 'Panell an evezhiadennoù';
+$lang['Main Menu Panel'] = 'Panell ar penn-lañser';
+$lang['Panels options'] = 'Dibarzhioù ar banelloù';
+$lang['Photo Description Panel'] = 'Panell deskrivadur al luc\'hskeudennoù';
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Dibabit peseurt stad a rank bezañ an hini dre ziouer evit pep skramm, pe diweredekait ar skeudenn-vev:';
+$lang['Hidden'] = 'Kuzhet';
+$lang['Elegant, Configuration Page'] = 'Cheuc\'h, Pajenn kefluniañ';
+$lang['Disable the animation'] = 'Diweredekaat ar skeudenn-vev';
+$lang['Displayed'] = 'Diskouezet';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/ca_ES/theme.lang.php b/themes/elegant/language/ca_ES/theme.lang.php
new file mode 100755
index 000000000..3689300d5
--- /dev/null
+++ b/themes/elegant/language/ca_ES/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Escolliu l\'estat per defecte de cada panell, o deshabiliteu l\'animació:';
+$lang['Comments Panel'] = 'Panell de comentaris';
+$lang['Disable the animation'] = 'Deshabilitar l\'animació';
+$lang['Displayed'] = 'Visualitzat';
+$lang['Elegant, Configuration Page'] = 'Elegant, Pàgina de configuració';
+$lang['Hidden'] = 'Amagat';
+$lang['Main Menu Panel'] = 'Panell del menú principal';
+$lang['Panels options'] = 'Opcions dels panells';
+$lang['Photo Description Panel'] = 'Panell de descripció de la foto';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/cs_CZ/index.php b/themes/elegant/language/cs_CZ/index.php
new file mode 100644
index 000000000..8572fdb35
--- /dev/null
+++ b/themes/elegant/language/cs_CZ/index.php
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/elegant/language/cs_CZ/theme.lang.php b/themes/elegant/language/cs_CZ/theme.lang.php
new file mode 100644
index 000000000..b5e534976
--- /dev/null
+++ b/themes/elegant/language/cs_CZ/theme.lang.php
@@ -0,0 +1,11 @@
+<?php
+$lang['Elegant, Configuration Page'] = 'Elegant, stránka s konfigurací';
+$lang['Panels options'] = 'Nastavení panelů';
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Nastavte výchozí stav pro každý panel nebo deaktivujte animaci:';
+$lang['Main Menu Panel'] = 'Hlavní menu panel';
+$lang['Displayed'] = 'Zobrazen';
+$lang['Hidden'] = 'Skryt';
+$lang['Disable the animation'] = 'Deaktivovat animaci';
+$lang['Photo Description Panel'] = 'Panel s popisem fotografií';
+$lang['Comments Panel'] = 'Panel komentářů';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/da_DK/theme.lang.php b/themes/elegant/language/da_DK/theme.lang.php
new file mode 100755
index 000000000..b225664a2
--- /dev/null
+++ b/themes/elegant/language/da_DK/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Hvad hvad der skal være hvert panels standardtilstand, eller deaktiver animationen:';
+$lang['Comments Panel'] = 'Kommentarpanel';
+$lang['Disable the animation'] = 'Deaktiver animationen';
+$lang['Displayed'] = 'Vist';
+$lang['Elegant, Configuration Page'] = 'Elegant, Opsætningspanel';
+$lang['Hidden'] = 'Skjult';
+$lang['Main Menu Panel'] = 'Panelets hovedmenu';
+$lang['Panels options'] = 'Panelindstillinger';
+$lang['Photo Description Panel'] = 'Fotobeskrivelsespanel';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/de_DE/theme.lang.php b/themes/elegant/language/de_DE/theme.lang.php
new file mode 100755
index 000000000..b6295283d
--- /dev/null
+++ b/themes/elegant/language/de_DE/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Wählen Sie den default Status eines jeden Panels aus, oder deaktivieren Sie die Animation';
+$lang['Comments Panel'] = 'Kommentar Panel';
+$lang['Disable the animation'] = 'Animation deaktivieren';
+$lang['Displayed'] = 'angezeigt';
+$lang['Elegant, Configuration Page'] = 'Elegant ,Konfigurationsseite';
+$lang['Hidden'] = 'versteckt';
+$lang['Main Menu Panel'] = 'Hauptmenü Panel';
+$lang['Panels options'] = 'Panel Optionen';
+$lang['Photo Description Panel'] = 'Panel Fotobeschreibung';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/el_GR/theme.lang.php b/themes/elegant/language/el_GR/theme.lang.php
new file mode 100755
index 000000000..d44726885
--- /dev/null
+++ b/themes/elegant/language/el_GR/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Photo Description Panel'] = 'Πάνελ ΠεÏιγÏαφής ΦωτογÏαφίας ';
+$lang['Panels options'] = 'επιλογές πάνελ';
+$lang['Main Menu Panel'] = 'Πάνελ ΚÏÏιου μενοÏ';
+$lang['Hidden'] = 'ΚÏυφό';
+$lang['Elegant, Configuration Page'] = 'Elegant, διαμόÏφωσης σελίδας';
+$lang['Displayed'] = 'Εμφανιζόμενο';
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Επιλέξτε αυτό που θα θέλατε να είναι η Ï€Ïοεπιλεγμένη κατάσταση για κάθε πάνελ, ή απενεÏγοποιήσετε τα κινοÏμενα σχέδια:';
+$lang['Disable the animation'] = 'ΑπενεÏγοποιήστε τα κινοÏμενα σχέδια';
+$lang['Comments Panel'] = 'Πάνελ Σχολίων';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/en_UK/index.php b/themes/elegant/language/en_UK/index.php
new file mode 100644
index 000000000..e3365959c
--- /dev/null
+++ b/themes/elegant/language/en_UK/index.php
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/elegant/language/en_UK/theme.lang.php b/themes/elegant/language/en_UK/theme.lang.php
new file mode 100644
index 000000000..c2eb97e86
--- /dev/null
+++ b/themes/elegant/language/en_UK/theme.lang.php
@@ -0,0 +1,11 @@
+<?php
+$lang['Elegant, Configuration Page'] = 'Elegant, Configuration Page';
+$lang['Panels options'] = 'Panels options';
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Choose what should be the default state for each panel, or disable the animation:';
+$lang['Main Menu Panel'] = 'Main Menu Panel';
+$lang['Displayed'] = 'Displayed';
+$lang['Hidden'] = 'Hidden';
+$lang['Disable the animation'] = 'Disable the animation';
+$lang['Photo Description Panel'] = 'Photo Description Panel';
+$lang['Comments Panel'] = 'Comments Panel';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/eo_EO/theme.lang.php b/themes/elegant/language/eo_EO/theme.lang.php
new file mode 100755
index 000000000..8d0b4c456
--- /dev/null
+++ b/themes/elegant/language/eo_EO/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Photo Description Panel'] = 'Fotopriskriba panelo';
+$lang['Panels options'] = 'Panelaj opcioj';
+$lang['Main Menu Panel'] = 'Panelo de la ĉefa menuo';
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Elektu, kion estu la apriora stato de ĉiu panelo, aÅ­ malÅaltu la animacio:';
+$lang['Elegant, Configuration Page'] = 'AgordopaÄo de Elegant';
+$lang['Comments Panel'] = 'Panelo por komentoj';
+$lang['Disable the animation'] = 'MalÅalti la animacion';
+$lang['Displayed'] = 'Montrita';
+$lang['Hidden'] = 'KaÅita';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/es_ES/theme.lang.php b/themes/elegant/language/es_ES/theme.lang.php
new file mode 100755
index 000000000..3c593a306
--- /dev/null
+++ b/themes/elegant/language/es_ES/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Elija lo que debería ser el estado por defecto para cada panel o desactivar la animación:';
+$lang['Comments Panel'] = 'Panel de comentarios ';
+$lang['Disable the animation'] = 'Desactivar la animación';
+$lang['Displayed'] = 'Mostrado';
+$lang['Elegant, Configuration Page'] = 'Pagina de configuración de Elegant';
+$lang['Hidden'] = 'Esconder';
+$lang['Main Menu Panel'] = 'Panel del menú principal';
+$lang['Panels options'] = 'Opciones del panel';
+$lang['Photo Description Panel'] = 'Descripción de la foto del panel';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/et_EE/theme.lang.php b/themes/elegant/language/et_EE/theme.lang.php
new file mode 100755
index 000000000..95b08e911
--- /dev/null
+++ b/themes/elegant/language/et_EE/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Vali vaikimisi oleks igale paneelile või lülita animatsioon välja:';
+$lang['Comments Panel'] = 'Kommentaaride paneel';
+$lang['Disable the animation'] = 'Lülita animatsioon välja';
+$lang['Displayed'] = 'Näidatakse';
+$lang['Elegant, Configuration Page'] = 'Elegant, seadistuspaneel';
+$lang['Hidden'] = 'Peidetud';
+$lang['Main Menu Panel'] = 'Peamenüü paneel';
+$lang['Panels options'] = 'Paneeli seaded';
+$lang['Photo Description Panel'] = 'Pildi kirjelduste paneel';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/fa_IR/theme.lang.php b/themes/elegant/language/fa_IR/theme.lang.php
new file mode 100755
index 000000000..6fd310c70
--- /dev/null
+++ b/themes/elegant/language/fa_IR/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'وضعیت پیشÙرض٠هر پنل را انتخاب کنید، یا حالت انیمیشن آنها را غیر Ùعال کنید:';
+$lang['Comments Panel'] = 'پنل٠توضیحات';
+$lang['Disable the animation'] = 'غیر Ùعال کردن٠انیمیشن';
+$lang['Displayed'] = 'نمایش داده شود';
+$lang['Elegant, Configuration Page'] = 'پیکربندی٠Elegant';
+$lang['Hidden'] = 'پنهان';
+$lang['Main Menu Panel'] = 'پنل٠منوی اصلی';
+$lang['Panels options'] = 'گزینه‌های پنل‌ها';
+$lang['Photo Description Panel'] = 'پنل٠توضیحات٠عکس';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/fi_FI/theme.lang.php b/themes/elegant/language/fi_FI/theme.lang.php
new file mode 100755
index 000000000..dbe296a51
--- /dev/null
+++ b/themes/elegant/language/fi_FI/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Valitse kunkin paneelin oletustila, tai poista animaatio käytöstä:';
+$lang['Comments Panel'] = 'Kommenttipaneeli';
+$lang['Disable the animation'] = 'Poista animaatio käytöstä';
+$lang['Displayed'] = 'Näkyvissä';
+$lang['Elegant, Configuration Page'] = 'Aistikas, asetussivu';
+$lang['Hidden'] = 'Piilotettu';
+$lang['Main Menu Panel'] = 'Päävalikkopaneeli';
+$lang['Panels options'] = 'Paneelien asetukset';
+$lang['Photo Description Panel'] = 'Kuvan tiedot -paneeli';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/fr_CA/index.php b/themes/elegant/language/fr_CA/index.php
new file mode 100644
index 000000000..e3365959c
--- /dev/null
+++ b/themes/elegant/language/fr_CA/index.php
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/elegant/language/fr_CA/theme.lang.php b/themes/elegant/language/fr_CA/theme.lang.php
new file mode 100644
index 000000000..46b8a3bcc
--- /dev/null
+++ b/themes/elegant/language/fr_CA/theme.lang.php
@@ -0,0 +1,12 @@
+<?php
+
+$lang['Elegant, Configuration Page'] = 'Élégant, Page de Configuration';
+$lang['Panels options'] = 'Options des panneaux';
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Choisissez le comportement par défaut des panneaux rétractables, ou désactivez leur animation';
+$lang['Main Menu Panel'] = 'Panneau du menu principal';
+$lang['Displayed'] = 'Affiché';
+$lang['Hidden'] = 'Caché';
+$lang['Disable the animation'] = 'Désactiver l\'animation';
+$lang['Photo Description Panel'] = 'Panneau de description de la photo';
+$lang['Comments Panel'] = 'Panneau des commentaires';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/fr_FR/index.php b/themes/elegant/language/fr_FR/index.php
new file mode 100644
index 000000000..e3365959c
--- /dev/null
+++ b/themes/elegant/language/fr_FR/index.php
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/elegant/language/fr_FR/theme.lang.php b/themes/elegant/language/fr_FR/theme.lang.php
new file mode 100644
index 000000000..5b5ad5b2e
--- /dev/null
+++ b/themes/elegant/language/fr_FR/theme.lang.php
@@ -0,0 +1,12 @@
+<?php
+
+$lang['Elegant, Configuration Page'] = 'Elegant, Page de Configuration';
+$lang['Panels options'] = 'Options des panneaux';
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Choisissez le comportement par défaut des panneaux rétractables, ou désactivez leur animation';
+$lang['Main Menu Panel'] = 'Panneau du menu principal';
+$lang['Displayed'] = 'Affiché';
+$lang['Hidden'] = 'Caché';
+$lang['Disable the animation'] = 'Désactiver l\'animation';
+$lang['Photo Description Panel'] = 'Panneau de la description de la photo';
+$lang['Comments Panel'] = 'Panneau des commentaires';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/hu_HU/theme.lang.php b/themes/elegant/language/hu_HU/theme.lang.php
new file mode 100755
index 000000000..2546f2541
--- /dev/null
+++ b/themes/elegant/language/hu_HU/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Ãllítsa be milyen legyen a panel alapértelmezett állapotban, vagy tiltsa le az animációt:';
+$lang['Panels options'] = 'Panelek lehetőségei';
+$lang['Comments Panel'] = 'Hozzászólások panel';
+$lang['Disable the animation'] = 'Animáció kikapcsolása';
+$lang['Displayed'] = 'Megjelenítés';
+$lang['Elegant, Configuration Page'] = 'Elegant, beállítás oldal';
+$lang['Hidden'] = 'Rejtett';
+$lang['Main Menu Panel'] = 'Főmenü panel';
+$lang['Photo Description Panel'] = 'Kép leírás panel';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/index.php b/themes/elegant/language/index.php
new file mode 100644
index 000000000..8572fdb35
--- /dev/null
+++ b/themes/elegant/language/index.php
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/elegant/language/it_IT/theme.lang.php b/themes/elegant/language/it_IT/theme.lang.php
new file mode 100755
index 000000000..db7d23340
--- /dev/null
+++ b/themes/elegant/language/it_IT/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Photo Description Panel'] = 'Pannello Descrizione Foto';
+$lang['Panels options'] = 'Pannelli opzioni';
+$lang['Main Menu Panel'] = 'Pannello Menu Principale';
+$lang['Hidden'] = 'Nascosto';
+$lang['Elegant, Configuration Page'] = 'Elegante, Pagina di configurazione';
+$lang['Displayed'] = 'Visualizza';
+$lang['Disable the animation'] = 'Disabilita l\'animazione';
+$lang['Comments Panel'] = 'Pannello Commenti';
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Scegli quello che dovrebbe essere lo stato predefinito per ogni pannello, o disattiva l\'animazione:';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/ja_JP/index.php b/themes/elegant/language/ja_JP/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/themes/elegant/language/ja_JP/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/elegant/language/ja_JP/theme.lang.php b/themes/elegant/language/ja_JP/theme.lang.php
new file mode 100755
index 000000000..d6e6543ac
--- /dev/null
+++ b/themes/elegant/language/ja_JP/theme.lang.php
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Comments Panel'] = 'コメント一覧';
+$lang['Disable the animation'] = 'アニメーションを使用ã—ãªã„';
+$lang['Photo Description Panel'] = '詳細';
+$lang['Panels options'] = 'オプション';
+$lang['Main Menu Panel'] = 'メインメニュー';
+$lang['Hidden'] = 'éš ã™';
+$lang['Displayed'] = '表示ã™ã‚‹';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/kn_IN/theme.lang.php b/themes/elegant/language/kn_IN/theme.lang.php
new file mode 100755
index 000000000..8ec80779c
--- /dev/null
+++ b/themes/elegant/language/kn_IN/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Elegant, Configuration Page'] = 'ಎಲಿಗà³à²¯à²¾à²‚ಟà³, ಕಾನà³à²«à²¿à²—ರೇಶನೠಪà³à²Ÿ';
+$lang['Hidden'] = 'ಬಚà³à²šà²¿à²Ÿà³à²Ÿà²¦à³à²¦à³';
+$lang['Main Menu Panel'] = 'ಮà³à²–à³à²¯ ಆಯà³à²•à³†à²ªà²Ÿà³à²Ÿà²¿ ಪà³à²¯à²¾à²¨à³†à²²à³';
+$lang['Panels options'] = 'ಪà³à²¯à²¾à²¨à³†à²²à³ ಗಳ ಆಯà³à²•à³†à²—ಳà³';
+$lang['Photo Description Panel'] = 'ಚಿತà³à²°à²¦ ವಿವರಣೆ ಪà³à²¯à²¾à²¨à³†à²²à³';
+$lang['Displayed'] = 'ಪà³à²°à²¦à²°à³à²¶à²¿à²¸à²²à²¾à²—ಿದೆ';
+$lang['Disable the animation'] = 'ಅನಿಮೇಶನೠಅನà³à²¨à³ ನಿಷà³à²•à³à²°à²¿à²¯à²—ೊಳಿಸಿ';
+$lang['Comments Panel'] = 'ಟಿಪà³à²ªà²£à²¿à²—ಳ ಪà³à²¯à²¾à²¨à³†à²²à³';
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'ಪà³à²°à²¤à²¿à²¯à³Šà²‚ದೠಪà³à²¯à²¾à²¨à³†à²²à³ ನ ಪೂರà³à²µà²¨à²¿à²¯à³‹à²œà²¿à²¤ ಸà³à²¥à²¿à²¤à²¿ à²à²¨à²¿à²°à²¬à³‡à²•à³†à²‚ದೠಆರಿಸಿ, ಅಥವಾ ಅನಿಮೇಶನೠಅನà³à²¨à³ ನಿಷà³à²•à³à²°à²¿à²¯à²—ೊಳಿಸಿ.';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/ko_KR/theme.lang.php b/themes/elegant/language/ko_KR/theme.lang.php
new file mode 100755
index 000000000..143ce22f6
--- /dev/null
+++ b/themes/elegant/language/ko_KR/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'ê° íŒ¨ë„ì˜ ê¸°ë³¸ ìƒíƒœì™€ 애니메ì´ì…˜ì„ 비활성화 í•  지 ì„ íƒí•˜ì‹­ì‹œì˜¤.';
+$lang['Comments Panel'] = '댓글 패ë„';
+$lang['Disable the animation'] = '애니메ì´ì…˜ 비활성화';
+$lang['Displayed'] = 'ë³´ìž„';
+$lang['Elegant, Configuration Page'] = 'Elegant, 설정 페ì´ì§€';
+$lang['Hidden'] = '숨김';
+$lang['Main Menu Panel'] = 'ë©”ì¸ ë©”ë‰´ 패ë„';
+$lang['Panels options'] = 'íŒ¨ë„ ì˜µì…˜';
+$lang['Photo Description Panel'] = '사진 설명 패ë„';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/lt_LT/theme.lang.php b/themes/elegant/language/lt_LT/theme.lang.php
new file mode 100755
index 000000000..b3a39bfee
--- /dev/null
+++ b/themes/elegant/language/lt_LT/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Elegant, Configuration Page'] = 'Elegant konfigūracijos puslapis';
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Pasirinkite kokia turėtų būti kiekvieno skydelio būsena arba išjunkite animaciją';
+$lang['Comments Panel'] = 'Komentarų skydelis';
+$lang['Disable the animation'] = 'IÅ¡jungti animacijÄ…';
+$lang['Displayed'] = 'Rodoma';
+$lang['Hidden'] = 'PaslÄ—pta';
+$lang['Main Menu Panel'] = 'Pagrindinio meniu skydelis';
+$lang['Panels options'] = 'Skydelių parinktys';
+$lang['Photo Description Panel'] = 'Foto aprašymo skydelis';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/lv_LV/theme.lang.php b/themes/elegant/language/lv_LV/theme.lang.php
new file mode 100755
index 000000000..8b54fe3d4
--- /dev/null
+++ b/themes/elegant/language/lv_LV/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Main Menu Panel'] = 'GalvenÄs IzvÄ“lnes Panelis';
+$lang['Hidden'] = 'Paslēpts';
+$lang['Disable the animation'] = 'atslÄ“gt animÄciju';
+$lang['Comments Panel'] = 'KomentÄru panelis';
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'IzvÄ“lÄ“ties, kas bÅ«tu katra paneļa noklusÄ“juma stÄvoklis vai atspÄ“jot animÄcijas:';
+$lang['Elegant, Configuration Page'] = 'Elegants, KonfigurÄcijas Lapa';
+$lang['Displayed'] = 'Attēlots';
+$lang['Photo Description Panel'] = 'FotogrÄfiju Apraksta Panelis';
+$lang['Panels options'] = 'Paneļa opcijas';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/mn_MN/index.php b/themes/elegant/language/mn_MN/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/themes/elegant/language/mn_MN/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/elegant/language/mn_MN/theme.lang.php b/themes/elegant/language/mn_MN/theme.lang.php
new file mode 100755
index 000000000..fe6cb3384
--- /dev/null
+++ b/themes/elegant/language/mn_MN/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Elegant, Configuration Page'] = 'Тохиргооны хуудаÑ';
+$lang['Comments Panel'] = 'СÑтгÑгдÑлийн талбар';
+$lang['Disable the animation'] = 'Ðнимейшнийг хаах ';
+$lang['Hidden'] = 'Ðуугдмал';
+$lang['Displayed'] = 'Харуулах';
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Ð¥ÑÑÑг Ñ‚ÑƒÑ Ð±Ò¯Ñ€Ð¸Ð¹Ð½ тохиргоог Ñонгох буюу анимейшнийг хаах:';
+$lang['Main Menu Panel'] = 'ҮндÑÑн цÑÑийн Ñ…ÑÑÑг';
+$lang['Panels options'] = 'Талбарын тохиргоо';
+$lang['Photo Description Panel'] = 'Зургын тайлбар Ñ…ÑÑÑг';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/nb_NO/theme.lang.php b/themes/elegant/language/nb_NO/theme.lang.php
new file mode 100755
index 000000000..b2c8f7b02
--- /dev/null
+++ b/themes/elegant/language/nb_NO/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Velg hva som skal være standard tilstand på hvert panel, eller slå av animasjon';
+$lang['Comments Panel'] = 'Kommentarpanel';
+$lang['Disable the animation'] = 'Slå av animasjon';
+$lang['Displayed'] = 'Sett';
+$lang['Elegant, Configuration Page'] = 'Elegant, konfigurasjonspanel';
+$lang['Hidden'] = 'Skult';
+$lang['Main Menu Panel'] = 'Hovedmenypanel';
+$lang['Panels options'] = 'Paneltilpassinger';
+$lang['Photo Description Panel'] = 'Bildebeskrivelesespanel';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/nl_NL/theme.lang.php b/themes/elegant/language/nl_NL/theme.lang.php
new file mode 100755
index 000000000..821ee31a0
--- /dev/null
+++ b/themes/elegant/language/nl_NL/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Geef de standaardtoestand van elk paneel, of schakel de animatie uit:';
+$lang['Comments Panel'] = 'Commentaar-paneel';
+$lang['Disable the animation'] = 'Schakel de animatie uit';
+$lang['Displayed'] = 'Weergegeven';
+$lang['Elegant, Configuration Page'] = 'Elegant, Configuratiepagina';
+$lang['Main Menu Panel'] = 'Hoofdmenu-paneel';
+$lang['Panels options'] = 'Paneel-opties';
+$lang['Photo Description Panel'] = 'Afbeeldingenbeschrijvings-paneel';
+$lang['Hidden'] = 'Verborgen';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/nn_NO/theme.lang.php b/themes/elegant/language/nn_NO/theme.lang.php
new file mode 100755
index 000000000..dd7d1db5c
--- /dev/null
+++ b/themes/elegant/language/nn_NO/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Comments Panel'] = 'Panel for kommentarar';
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Vel kva som skal vera standard for kvart panel, eller ikkje vis animering:';
+$lang['Disable the animation'] = 'Ikkje vis animasjonar';
+$lang['Elegant, Configuration Page'] = 'Elegant - innstillingsside';
+$lang['Main Menu Panel'] = 'Panel for hovudmeny';
+$lang['Panels options'] = 'Panelinnstillingar';
+$lang['Photo Description Panel'] = 'Panel for biletskildring';
+$lang['Displayed'] = 'Vist';
+$lang['Hidden'] = 'Gøymd';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/pl_PL/theme.lang.php b/themes/elegant/language/pl_PL/theme.lang.php
new file mode 100755
index 000000000..e742cd47c
--- /dev/null
+++ b/themes/elegant/language/pl_PL/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Wybierz domyślny stan dla każdego panelu lub wyłącz animację:';
+$lang['Comments Panel'] = 'Panel komentarzy';
+$lang['Disable the animation'] = 'Wyłącz animację';
+$lang['Displayed'] = 'Wyświetlane';
+$lang['Elegant, Configuration Page'] = 'Strona konfiguracyjna Elegant';
+$lang['Hidden'] = 'Ukryte';
+$lang['Main Menu Panel'] = 'Panel głównego menu';
+$lang['Panels options'] = 'Opcje panelu';
+$lang['Photo Description Panel'] = 'Panel opisu zdjęć';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/pt_BR/theme.lang.php b/themes/elegant/language/pt_BR/theme.lang.php
new file mode 100755
index 000000000..915d64975
--- /dev/null
+++ b/themes/elegant/language/pt_BR/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Escolha qual deve ser o estado padrão para cada painel, ou desativar a animação:';
+$lang['Comments Panel'] = 'Painel de Comentários';
+$lang['Disable the animation'] = 'Desabilitar a animação';
+$lang['Displayed'] = 'Exibido';
+$lang['Elegant, Configuration Page'] = 'Elegante, Página de Configuração';
+$lang['Hidden'] = 'Oculto';
+$lang['Main Menu Panel'] = 'Painel do Menu Principal';
+$lang['Panels options'] = 'Opções de painéis';
+$lang['Photo Description Panel'] = 'Painel de Descrição de Foto';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/pt_PT/theme.lang.php b/themes/elegant/language/pt_PT/theme.lang.php
new file mode 100755
index 000000000..f3db37932
--- /dev/null
+++ b/themes/elegant/language/pt_PT/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Escolha o que deverá ser definido para cada painel ou desative a animação.';
+$lang['Comments Panel'] = 'Painel de comentários';
+$lang['Disable the animation'] = 'Desativar a animação';
+$lang['Displayed'] = 'Mostrado';
+$lang['Elegant, Configuration Page'] = 'Eleganmte, página de configuração';
+$lang['Hidden'] = 'Omitido';
+$lang['Main Menu Panel'] = 'Painel do menú principal ';
+$lang['Panels options'] = 'Opções dos paineis';
+$lang['Photo Description Panel'] = 'Painel de descrição da foto';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/ro_RO/theme.lang.php b/themes/elegant/language/ro_RO/theme.lang.php
new file mode 100755
index 000000000..828106138
--- /dev/null
+++ b/themes/elegant/language/ro_RO/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Alege care ar trebui să fie starea implicită pentru fiecare panou, sau dezactivează animația.';
+$lang['Comments Panel'] = 'Panou de comentarii';
+$lang['Disable the animation'] = 'Dezactivează animația';
+$lang['Displayed'] = 'Afișat';
+$lang['Elegant, Configuration Page'] = 'Pagină de configurare pentru Elegant';
+$lang['Hidden'] = 'Ascuns';
+$lang['Main Menu Panel'] = 'Panou meniu principal';
+$lang['Panels options'] = 'Panou de optiuni';
+$lang['Photo Description Panel'] = 'Panou de descrierea fotografiei';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/ru_RU/theme.lang.php b/themes/elegant/language/ru_RU/theme.lang.php
new file mode 100755
index 000000000..95b737d74
--- /dev/null
+++ b/themes/elegant/language/ru_RU/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Выберите, что должно быть по умолчанию Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ группы, или отключите анимацию: ';
+$lang['Comments Panel'] = 'Панель комментариев';
+$lang['Disable the animation'] = 'Отключить анимацию';
+$lang['Displayed'] = 'Отображено';
+$lang['Elegant, Configuration Page'] = 'Страница наÑтройки темы Elegant';
+$lang['Hidden'] = 'Скрыто';
+$lang['Main Menu Panel'] = 'Панель главного меню';
+$lang['Panels options'] = 'Панели функций';
+$lang['Photo Description Panel'] = 'Панель опиÑÐ°Ð½Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/sk_SK/theme.lang.php b/themes/elegant/language/sk_SK/theme.lang.php
new file mode 100755
index 000000000..2643a2c9a
--- /dev/null
+++ b/themes/elegant/language/sk_SK/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Photo Description Panel'] = 'Panel popisu fotky';
+$lang['Panels options'] = 'Panlely možností';
+$lang['Main Menu Panel'] = 'Panel ponuky';
+$lang['Hidden'] = 'Skryté';
+$lang['Elegant, Configuration Page'] = 'Elegantný, stránka konfigurácie';
+$lang['Displayed'] = 'Zobrazené';
+$lang['Disable the animation'] = 'Zakázať animáciu';
+$lang['Comments Panel'] = 'Panel komentárov';
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Vyberte si, Äo by mal byÅ¥ východiskový stav pre každý panel, alebo zakázaÅ¥ animáciu';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/sl_SI/theme.lang.php b/themes/elegant/language/sl_SI/theme.lang.php
new file mode 100755
index 000000000..0b95a1070
--- /dev/null
+++ b/themes/elegant/language/sl_SI/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Izberite privzeto stanje za vsak panel ali pa onemogoÄite animacijo';
+$lang['Comments Panel'] = 'Panel komentarjev';
+$lang['Disable the animation'] = 'OnemogoÄi animacijo';
+$lang['Displayed'] = 'Prikazano';
+$lang['Elegant, Configuration Page'] = 'Elegantno, Nastavitveni panel';
+$lang['Hidden'] = 'Skrito';
+$lang['Main Menu Panel'] = 'Panel glavnega menija';
+$lang['Panels options'] = 'Možnosti panela';
+$lang['Photo Description Panel'] = 'Panel opisal fotografij';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/sv_SE/theme.lang.php b/themes/elegant/language/sv_SE/theme.lang.php
new file mode 100755
index 000000000..3582ea60c
--- /dev/null
+++ b/themes/elegant/language/sv_SE/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Photo Description Panel'] = 'Fotobeskrivnings-panel';
+$lang['Main Menu Panel'] = 'Huvudmeny-panel';
+$lang['Elegant, Configuration Page'] = 'Elegant, konfigurationssida';
+$lang['Hidden'] = 'Dölj';
+$lang['Displayed'] = 'Visa';
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Välj standardtillståndet för varje panel, eller inaktivera animationen:';
+$lang['Disable the animation'] = 'Inaktivera animationen';
+$lang['Panels options'] = 'Panelinställningar';
+$lang['Comments Panel'] = 'Kommentarspanel';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/ta_IN/theme.lang.php b/themes/elegant/language/ta_IN/theme.lang.php
new file mode 100755
index 000000000..f6b96029b
--- /dev/null
+++ b/themes/elegant/language/ta_IN/theme.lang.php
@@ -0,0 +1,33 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Hidden'] = 'மறைநà¯à®¤à¯à®³à¯à®³';
+$lang['Main Menu Panel'] = 'à®®à¯à®¤à®©à¯à®®à¯ˆ மெனà¯à®µà®¿à®²à¯à®³à¯à®³ கà¯à®´à¯';
+$lang['Panels options'] = 'பலகஙà¯à®•à®³à¯ விரà¯à®ªà¯à®ªà®™à¯à®•à®³à¯';
+$lang['Photo Description Panel'] = 'பà¯à®•à¯ˆà®ªà¯à®ªà®Ÿ விவரிபà¯à®ªà¯ பலகமà¯';
+$lang['Elegant, Configuration Page'] = 'நளினமான, ​​கடà¯à®Ÿà®®à¯ˆà®ªà¯à®ªà¯ பகà¯à®•à®®à¯';
+$lang['Displayed'] = 'காணà¯à®ªà®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®®à¯';
+$lang['Comments Panel'] = 'கரà¯à®¤à¯à®¤à¯à®°à¯ˆà®•à®³à¯ கà¯à®´à¯';
+$lang['Disable the animation'] = 'அனிமேசன௠செயலிழகà¯à®•';
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'தேரà¯à®µà¯ செயà¯à®¯à®µà¯à®®à¯ à®®à¯à®©à¯à®©à®¿à®°à¯à®ªà¯à®ªà¯ எனà¯à®©à®µà®¾à®• இரà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯
+ஒவà¯à®µà¯†à®¾à®°à¯ கà¯à®´à¯ நிலை, அலà¯à®²à®¤à¯ அனிமேஷன௠செயலிழகà¯à®•:';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/th_TH/theme.lang.php b/themes/elegant/language/th_TH/theme.lang.php
new file mode 100755
index 000000000..b95eba150
--- /dev/null
+++ b/themes/elegant/language/th_TH/theme.lang.php
@@ -0,0 +1,33 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = '
+เลือà¸à¸ªà¸´à¹ˆà¸‡à¸—ี่ควรมีในตอนเริ่มต้นสำหรับà¹à¸•à¹ˆà¸¥à¸°à¹à¸œà¸‡à¸«à¸£à¸·à¸­à¸›à¸´à¸”à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸ à¸²à¸žà¹€à¸„ลื่อนไหว :';
+$lang['Comments Panel'] = 'à¹à¸œà¸‡à¸„วามเห็น';
+$lang['Disable the animation'] = 'ปิดà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸ à¸²à¸žà¹€à¸„ลื่อนไหว';
+$lang['Displayed'] = 'à¸à¸²à¸£à¹à¸ªà¸”งผล';
+$lang['Elegant, Configuration Page'] = 'สง่างามหน้าà¸à¸²à¸£à¸à¸³à¸«à¸™à¸”ค่า';
+$lang['Hidden'] = 'ซ่อน';
+$lang['Main Menu Panel'] = 'à¹à¸œà¸‡à¹€à¸¡à¸™à¸¹à¸«à¸¥à¸±à¸';
+$lang['Panels options'] = 'ตัวเลือà¸à¹à¸œà¸‡';
+$lang['Photo Description Panel'] = 'à¹à¸œà¸‡à¸£à¸²à¸¢à¸¥à¸°à¹€à¸­à¸µà¸¢à¸”รูปภาพ';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/tr_TR/theme.lang.php b/themes/elegant/language/tr_TR/theme.lang.php
new file mode 100755
index 000000000..a2dfbc802
--- /dev/null
+++ b/themes/elegant/language/tr_TR/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Elegant, Configuration Page'] = 'Elegant, Yapılandırma Sayfası';
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Her panel için varsayılanın ne olması gerektiğini seçin veya animasyonu devre dışı bırakın:';
+$lang['Comments Panel'] = 'Yorumlar Paneli';
+$lang['Photo Description Panel'] = 'Fotoğraf Açıklama Paneli';
+$lang['Panels options'] = 'Panel seçenekleri';
+$lang['Main Menu Panel'] = 'Ana Menü Paneli';
+$lang['Hidden'] = 'Gizli';
+$lang['Displayed'] = 'Görüntülendi';
+$lang['Disable the animation'] = 'Animasyonu devre dışı bırak';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/uk_UA/theme.lang.php b/themes/elegant/language/uk_UA/theme.lang.php
new file mode 100755
index 000000000..800aee1c3
--- /dev/null
+++ b/themes/elegant/language/uk_UA/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Elegant, Configuration Page'] = 'Сторінка конфігурації теми Елегантний';
+$lang['Panels options'] = 'Панелі параметрів';
+$lang['Photo Description Panel'] = 'Панель опиÑу зображень';
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Виберіть те, що має Ñтан за замовчуваннÑм Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ñ— панелі, або відключити анімацію:';
+$lang['Comments Panel'] = 'Панель коментарів';
+$lang['Disable the animation'] = 'Вимкнути анімацію';
+$lang['Displayed'] = 'Показано';
+$lang['Hidden'] = 'Приховано';
+$lang['Main Menu Panel'] = 'Головне меню панелі';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/vi_VN/theme.lang.php b/themes/elegant/language/vi_VN/theme.lang.php
new file mode 100755
index 000000000..230ee3d2f
--- /dev/null
+++ b/themes/elegant/language/vi_VN/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'Chá»n trạng thái mặc định cho má»—i bảng, hoặc vô hiệu hóa tính năng hoạt hình';
+$lang['Comments Panel'] = 'Bảng bình luận';
+$lang['Disable the animation'] = 'Vô hiệu hóa tính năng hoạt hình';
+$lang['Displayed'] = 'Äược hiển thị';
+$lang['Elegant, Configuration Page'] = 'Elegant, Trang cấu hình';
+$lang['Hidden'] = 'Ẩn';
+$lang['Main Menu Panel'] = 'Bảng Menu chính';
+$lang['Panels options'] = 'Tùy chá»n bảng';
+$lang['Photo Description Panel'] = 'Bảng mô tả ảnh';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/zh_CN/theme.lang.php b/themes/elegant/language/zh_CN/theme.lang.php
new file mode 100755
index 000000000..c08ca9324
--- /dev/null
+++ b/themes/elegant/language/zh_CN/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = '选择æ¯ä¸ªé¢æ¿çš„默认状æ€ï¼Œæˆ–ç¦ç”¨åŠ¨ç”»ï¼š';
+$lang['Disable the animation'] = 'ç¦ç”¨åŠ¨ç”»';
+$lang['Displayed'] = '显示的';
+$lang['Elegant, Configuration Page'] = 'Elegant,设置页';
+$lang['Hidden'] = 'éšè—çš„';
+$lang['Comments Panel'] = '评论é¢æ¿';
+$lang['Main Menu Panel'] = '主èœå•é¢æ¿';
+$lang['Panels options'] = 'é¢æ¿é€‰é¡¹';
+$lang['Photo Description Panel'] = '图片æè¿°é¢æ¿';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/zh_HK/theme.lang.php b/themes/elegant/language/zh_HK/theme.lang.php
new file mode 100755
index 000000000..dfc326ad2
--- /dev/null
+++ b/themes/elegant/language/zh_HK/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'é¸æ“‡æ¯å€‹é¢æ¿çš„默èªç‹€æ…‹ï¼Œæˆ–åœç”¨å‹•ç•«ï¼š';
+$lang['Comments Panel'] = '留言é¢æ¿';
+$lang['Disable the animation'] = 'åœç”¨å‹•ç•«';
+$lang['Displayed'] = '已顯示';
+$lang['Elegant, Configuration Page'] = '優雅,設定é é¢';
+$lang['Hidden'] = '隱蔽';
+$lang['Main Menu Panel'] = '主目錄é¢æ¿';
+$lang['Panels options'] = 'é¢æ¿é¸é …';
+$lang['Photo Description Panel'] = '相片æè¿°é¢æ¿';
+?> \ No newline at end of file
diff --git a/themes/elegant/language/zh_TW/theme.lang.php b/themes/elegant/language/zh_TW/theme.lang.php
new file mode 100755
index 000000000..bf5fdd1cd
--- /dev/null
+++ b/themes/elegant/language/zh_TW/theme.lang.php
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Choose what should be the default state for each panel, or disable the animation:'] = 'é¸æ“‡æ¯å€‹é¢æ¿çš„é è¨­ç‹€æ…‹ï¼Œæˆ–關閉動畫。';
+$lang['Comments Panel'] = '回應é¢æ¿';
+$lang['Disable the animation'] = '關閉動畫';
+$lang['Displayed'] = '已顯示';
+$lang['Elegant, Configuration Page'] = '優雅,é…ç½®é é¢';
+$lang['Hidden'] = 'éš±è—';
+$lang['Main Menu Panel'] = '主è¦é¸å–®é¢æ¿';
+$lang['Panels options'] = 'é¢æ¿é¸é …';
+$lang['Photo Description Panel'] = '照片簡介é¢æ¿';
+?> \ No newline at end of file
diff --git a/themes/elegant/local_head.tpl b/themes/elegant/local_head.tpl
index a427c1726..8c2b4045c 100644
--- a/themes/elegant/local_head.tpl
+++ b/themes/elegant/local_head.tpl
@@ -1,3 +1,6 @@
+{footer_script}
+ var p_main_menu = "{$elegant.p_main_menu}", p_pict_descr = "{$elegant.p_pict_descr}", p_pict_comment = "{$elegant.p_pict_comment}";
+{/footer_script}
{if $BODY_ID=='thePicturePage'}
{combine_script id='elegant.scripts_pp' load='footer' require='jquery' path='themes/elegant/scripts_pp.js'}
{else}
diff --git a/themes/elegant/mail-css.tpl b/themes/elegant/mail-css.tpl
deleted file mode 100644
index 6399c9efd..000000000
--- a/themes/elegant/mail-css.tpl
+++ /dev/null
@@ -1,9 +0,0 @@
-/* Theme dark mail css */
-
-body {ldelim} background-color:#444; color:#fff;}
-#copyright {ldelim} color: #69c;}
-h2 {ldelim} background-color: #333; color:#fff48e;}
-img {ldelim} margin: 16px; border: 16px solid #111; -moz-border-radius: 4px; border-radius: 4px 4px; }
-img:hover {ldelim} padding: 15px; border: 1px solid yellow;background-color:#444;-moz-border-radius: 4px; border-radius: 4px 4px; }
-a {ldelim} color: #fff48e; background: transparent;border-bottom:1px dotted #005e89; }
-a:hover {ldelim} color: #fff48e;}
diff --git a/themes/elegant/scripts.js b/themes/elegant/scripts.js
index 20433ac65..1f946303e 100644
--- a/themes/elegant/scripts.js
+++ b/themes/elegant/scripts.js
@@ -1,78 +1,54 @@
-/**
- * Cookie plugin
- * Copyright (c) 2006 Klaus Hartl (stilbuero.de)
- * Dual licensed under the MIT and GPL licenses:
- */
-jQuery.cookie=function(name,value,options){if(typeof value!='undefined'){options=options||{};if(value===null){value='';options=jQuery.extend({},options);options.expires=-1;}
-var expires='';if(options.expires&&(typeof options.expires=='number'||options.expires.toUTCString)){var date;if(typeof options.expires=='number'){date=new Date();date.setTime(date.getTime()+(options.expires*24*60*60*1000));}else{date=options.expires;}
-expires='; expires='+date.toUTCString();}
-var path=options.path?'; path='+(options.path):'';var domain=options.domain?'; domain='+(options.domain):'';var secure=options.secure?'; secure':'';document.cookie=[name,'=',encodeURIComponent(value),expires,path,domain,secure].join('');}else{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]);if(cookie.substring(0,name.length+1)==(name+'=')){cookieValue=decodeURIComponent(cookie.substring(name.length+1));break;}}}
-return cookieValue;}};
-
-if (jQuery.cookie('page-menu') == 'hidden') {
- jQuery("head").append("<style type=\"text/css\">#the_page #menubar {display:none;} #content.contentWithMenu, #the_page > .content {margin-left:35px;}</style>");
-} else {
- jQuery("head").append("<style type=\"text/css\">#content.contentWithMenu, #the_page > .content {margin-left:240px;}</style>");
-}
-
-function hideMenu(delay) {
- var menubar=jQuery("#menubar");
- var menuswitcher=jQuery("#menuSwitcher");
- var content=jQuery("#the_page > .content");
- var pcontent=jQuery("#content");
-
- menubar.hide(delay);
- menuswitcher.addClass("menuhidden").removeClass("menushown");
- content.addClass("menuhidden").removeClass("menushown");
- pcontent.addClass("menuhidden").removeClass("menushown");
- jQuery.cookie('page-menu', 'hidden', {path: "/"});
-
-}
-
-function showMenu(delay) {
-
- var menubar=jQuery("#menubar");
- var menuswitcher=jQuery("#menuSwitcher");
- var content=jQuery("#the_page > .content");
- var pcontent=jQuery("#content");
-
- menubar.show(delay);
- menuswitcher.addClass("menushown").removeClass("menuhidden");
- content.addClass("menushown").removeClass("menuhidden");
- pcontent.addClass("menushown").removeClass("menuhidden");
- jQuery.cookie('page-menu', 'visible', {path: "/"});
-
-}
-
-jQuery("document").ready(function(jQuery){
-
- var sidemenu = jQuery.cookie('page-menu');
- var menubar=jQuery("#menubar");
-
- if (menubar.length == 1) {
-
- jQuery("#menuSwitcher").html("<div class=\"switchArrow\">&nbsp;</div>");
-
- // if cookie says the menu is hiding, keep it hidden!
- if (sidemenu == 'hidden') {
- hideMenu(0);
- } else {
- showMenu(0);
- }
-
- jQuery("#menuSwitcher").click(function(){
- if (jQuery("#menubar").is(":hidden")) {
- showMenu(0);
- return false;
- } else {
- hideMenu(0);
- return false;
- }
- });
-
-
- }
-
-});
-
-
+(function() {
+ var session_storage = window.sessionStorage || {};
+
+ var menubar=jQuery("#menubar"),
+ menuswitcher=jQuery("#menuSwitcher"),
+ content=jQuery("#the_page > .content"),
+ pcontent=jQuery("#content");
+
+ function hideMenu(delay) {
+ menubar.hide(delay);
+ menuswitcher.addClass("menuhidden").removeClass("menushown");
+ content.addClass("menuhidden").removeClass("menushown");
+ pcontent.addClass("menuhidden").removeClass("menushown");
+ session_storage['page-menu'] = 'hidden';
+ }
+
+ function showMenu(delay) {
+ menubar.show(delay);
+ menuswitcher.addClass("menushown").removeClass("menuhidden");
+ content.addClass("menushown").removeClass("menuhidden");
+ pcontent.addClass("menushown").removeClass("menuhidden");
+ session_storage['page-menu'] = 'visible';
+ }
+
+ jQuery(function(){
+ if (menubar.length == 1 && p_main_menu!="disabled") {
+ menuswitcher.html('<div class="switchArrow">&nbsp;</div>');
+
+ if (session_storage['page-menu'] == undefined && p_main_menu == 'off') {
+ session_storage['page-menu'] = 'hidden';
+ }
+
+ if (session_storage['page-menu'] == 'hidden') {
+ hideMenu(0);
+ }
+ else {
+ showMenu(0);
+ }
+
+ menuswitcher.click(function(e){
+ if (menubar.is(":hidden")) {
+ showMenu(0);
+ }
+ else {
+ hideMenu(0);
+ }
+ e.preventDefault();
+ });
+ }
+ else if (menubar.length == 1 && p_main_menu=="disabled") {
+ showMenu(0);
+ }
+ });
+}()); \ No newline at end of file
diff --git a/themes/elegant/scripts_pp.js b/themes/elegant/scripts_pp.js
index 92e8cfc06..c5185821f 100644
--- a/themes/elegant/scripts_pp.js
+++ b/themes/elegant/scripts_pp.js
@@ -1,176 +1,175 @@
-/**
- * Cookie plugin
- * Copyright (c) 2006 Klaus Hartl (stilbuero.de)
- * Dual licensed under the MIT and GPL licenses:
- */
-jQuery.cookie=function(name,value,options){if(typeof value!='undefined'){options=options||{};if(value===null){value='';options=jQuery.extend({},options);options.expires=-1;}
-var expires='';if(options.expires&&(typeof options.expires=='number'||options.expires.toUTCString)){var date;if(typeof options.expires=='number'){date=new Date();date.setTime(date.getTime()+(options.expires*24*60*60*1000));}else{date=options.expires;}
-expires='; expires='+date.toUTCString();}
-var path=options.path?'; path='+(options.path):'';var domain=options.domain?'; domain='+(options.domain):'';var secure=options.secure?'; secure':'';document.cookie=[name,'=',encodeURIComponent(value),expires,path,domain,secure].join('');}else{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]);if(cookie.substring(0,name.length+1)==(name+'=')){cookieValue=decodeURIComponent(cookie.substring(name.length+1));break;}}}
-return cookieValue;}};
-
-if (jQuery.cookie('picture-menu') == 'visible') {
- jQuery("head").append("<style type=\"text/css\">#content.contentWithMenu, #the_page > .content {margin-left:240px;}</style>");
-} else {
- jQuery("head").append("<style type=\"text/css\">#the_page #menubar {display:none;} #content.contentWithMenu, #the_page > .content {margin-left:35px;}</style>");
-}
-
-function hideMenu(delay) {
- var menubar=jQuery("#menubar");
- var menuswitcher=jQuery("#menuSwitcher");
- var content=jQuery("#the_page > .content");
- var pcontent=jQuery("#content");
-
- menubar.hide(delay);
- menuswitcher.addClass("menuhidden").removeClass("menushown");
- content.addClass("menuhidden").removeClass("menushown");
- pcontent.addClass("menuhidden").removeClass("menushown");
- jQuery.cookie('picture-menu', 'hidden', {path: "/"});
-
-}
-
-function showMenu(delay) {
-
- var menubar=jQuery("#menubar");
- var menuswitcher=jQuery("#menuSwitcher");
- var content=jQuery("#the_page > .content");
- var pcontent=jQuery("#content");
-
- menubar.show(delay);
- menuswitcher.addClass("menushown").removeClass("menuhidden");
- content.addClass("menushown").removeClass("menuhidden");
- pcontent.addClass("menushown").removeClass("menuhidden");
- jQuery.cookie('picture-menu', 'visible', {path: "/"});
-
-}
-
-function hideInfo(delay) {
-
- var imageInfos=jQuery("#imageInfos");
- var infoswitcher=jQuery("#infoSwitcher");
- var theImage=jQuery("#theImage");
-
- imageInfos.hide(delay);
- infoswitcher.addClass("infohidden").removeClass("infoshown");
- theImage.addClass("infohidden").removeClass("infoshown");
- jQuery.cookie('side-info', 'hidden', {path: "/"});
-
-}
-
-function showInfo(delay) {
-
- var imageInfos=jQuery("#imageInfos");
- var infoswitcher=jQuery("#infoSwitcher");
- var theImage=jQuery("#theImage");
-
- imageInfos.show(delay);
- infoswitcher.addClass("infoshown").removeClass("infohidden");
- theImage.addClass("infoshown").removeClass("infohidden");
- jQuery.cookie('side-info', 'visible', {path: "/"});
-
-}
-
-jQuery("document").ready(function(jQuery){
-
- // side-menu show/hide
-
- var sidemenu = jQuery.cookie('picture-menu');
- var menubar=jQuery("#menubar");
-
- if (menubar.length == 1) {
-
- jQuery("#menuSwitcher").html("<div class=\"switchArrow\">&nbsp;</div>");
-
- // if cookie says the menu is hiding, keep it hidden!
- if (sidemenu == 'visible') {
- showMenu(0);
- } else {
- hideMenu(0);
- }
-
- jQuery("#menuSwitcher").click(function(){
- if (jQuery("#menubar").is(":hidden")) {
- showMenu(0);
- return false;
- } else {
- hideMenu(0);
- return false;
- }
- });
-
- }
-
- // info show/hide
-
- var sideinfo = jQuery.cookie('side-info');
- var imageInfos=jQuery("#imageInfos");
-
- if (imageInfos.length == 1) {
-
- jQuery("#infoSwitcher").html("<div class=\"switchArrow\">&nbsp;</div>");
-
- // if cookie says the menu is hiding, keep it hidden!
- if (sideinfo == 'hidden') {
- hideInfo(0);
- } else {
- showInfo(0);
- }
-
- jQuery("#infoSwitcher").click(function(){
- if (jQuery("#imageInfos").is(":hidden")) {
- showInfo(0);
- return false;
- } else {
- hideInfo(0);
- return false;
- }
- });
-
- }
-
- // comments show/hide
-
- var commentsswicther=jQuery("#commentsSwitcher");
- var comments=jQuery("#thePicturePage #comments");
-
- commentsswicther.html("<div class=\"switchArrow\">&nbsp;</div>");
-
- if (comments.length == 1) {
- var comments_button=jQuery("#comments h3");
-
- if (comments_button.length == 0) {
- jQuery("#addComment").before("<h3>Comments</h3>");
- comments_button=jQuery("#comments h3");
- }
-
- if (jQuery.cookie('comments') == 'visible') {
- comments.addClass("commentsshown");
- comments_button.addClass("comments_toggle").addClass("comments_toggle_off");
- } else {
- comments.addClass("commentshidden");
- comments_button.addClass("comments_toggle").addClass("comments_toggle_on");
- }
-
- comments_button.click(function() { commentsToggle() });
- commentsswicther.click(function() { commentsToggle() });
-
- }
-
-
-});
-
-function commentsToggle() {
- var comments=jQuery("#thePicturePage #comments");
- var comments_button=jQuery("#comments h3");
-
- if (comments.hasClass("commentshidden")) {
- comments.removeClass("commentshidden").addClass("commentsshown");
- comments_button.addClass("comments_toggle_off").removeClass("comments_toggle_on");;
- jQuery.cookie('comments', 'visible', {path: "/"});
- } else {
- comments.addClass("commentshidden").removeClass("commentsshown");
- comments_button.addClass("comments_toggle_on").removeClass("comments_toggle_off");;
- jQuery.cookie('comments', 'hidden', {path: "/"});
- }
-
-}
+(function() {
+ var session_storage = window.sessionStorage || {};
+
+ var menubar=jQuery("#menubar"),
+ menuswitcher,
+ content=jQuery("#the_page > .content"),
+ pcontent=jQuery("#content"),
+ imageInfos=jQuery("#imageInfos"),
+ infoswitcher,
+ theImage=jQuery("#theImage"),
+ comments=jQuery("#thePicturePage #comments"),
+ comments_button,
+ commentsswitcher,
+ comments_add,
+ comments_top_offset = 0;
+
+ function hideMenu(delay) {
+ menubar.hide(delay);
+ menuswitcher.addClass("menuhidden").removeClass("menushown");
+ content.addClass("menuhidden").removeClass("menushown");
+ pcontent.addClass("menuhidden").removeClass("menushown");
+ session_storage['picture-menu'] = 'hidden';
+ }
+
+ function showMenu(delay) {
+ menubar.show(delay);
+ menuswitcher.addClass("menushown").removeClass("menuhidden");
+ content.addClass("menushown").removeClass("menuhidden");
+ pcontent.addClass("menushown").removeClass("menuhidden");
+ session_storage['picture-menu'] = 'visible';
+ }
+
+ function hideInfo(delay) {
+ imageInfos.hide(delay);
+ infoswitcher.addClass("infohidden").removeClass("infoshown");
+ theImage.addClass("infohidden").removeClass("infoshown");
+ session_storage['side-info'] = 'hidden';
+ }
+
+ function showInfo(delay) {
+ imageInfos.show(delay);
+ infoswitcher.addClass("infoshown").removeClass("infohidden");
+ theImage.addClass("infoshown").removeClass("infohidden");
+ session_storage['side-info'] = 'visible';
+ }
+
+ function commentsToggle() {
+ if (comments.hasClass("commentshidden")) {
+ comments.removeClass("commentshidden").addClass("commentsshown");
+ comments_button.addClass("comments_toggle_off").removeClass("comments_toggle_on");;
+ session_storage['comments'] = 'visible';
+ comments_top_offset = comments_add.offset().top - parseFloat(comments_add.css('marginTop').replace(/auto/, 0));
+ }
+ else {
+ comments.addClass("commentshidden").removeClass("commentsshown");
+ comments_button.addClass("comments_toggle_on").removeClass("comments_toggle_off");;
+ session_storage['comments'] = 'hidden';
+ comments_top_offset = 0;
+ }
+ }
+
+ jQuery(function(){
+ // side-menu show/hide
+ if (menubar.length == 1 && p_main_menu!="disabled") {
+ menuswitcher=jQuery("#menuSwitcher");
+
+ menuswitcher.html('<div class="switchArrow">&nbsp;</div>');
+
+ if (session_storage['picture-menu'] == undefined && p_main_menu == 'off') {
+ session_storage['picture-menu'] = 'hidden';
+ }
+
+ if (session_storage['picture-menu'] == 'hidden') {
+ hideMenu(0);
+ }
+ else {
+ showMenu(0);
+ }
+
+ menuswitcher.click(function(e){
+ if (menubar.is(":hidden")) {
+ showMenu(0);
+ }
+ else {
+ hideMenu(0);
+ }
+ e.preventDefault();
+ });
+ }
+ else if (menubar.length == 1 && p_main_menu=="disabled") {
+ showMenu(0);
+ }
+
+ // info show/hide
+ if (imageInfos.length == 1 && p_pict_descr!="disabled") {
+ infoswitcher=jQuery("#infoSwitcher");
+
+ infoswitcher.html('<div class="switchArrow">&nbsp;</div>');
+
+ if (session_storage['side-info'] == undefined && p_pict_descr == 'off') {
+ session_storage['side-info'] = 'hidden';
+ }
+
+ if (session_storage['side-info'] == 'hidden') {
+ hideInfo(0);
+ }
+ else {
+ showInfo(0);
+ }
+
+ infoswitcher.click(function(e){
+ if (imageInfos.is(":hidden")) {
+ showInfo(0);
+ }
+ else {
+ hideInfo(0);
+ }
+ e.preventDefault();
+ });
+ }
+
+ // comments show/hide
+ if (comments.length == 1 && p_pict_comment!="disabled") {
+ commentsswitcher=jQuery("#commentsSwitcher");
+ comments_button=jQuery("#comments h3");
+ comments_add=jQuery('#commentAdd');
+
+ commentsswitcher.html('<div class="switchArrow">&nbsp;</div>');
+
+ if (comments_button.length == 0) {
+ jQuery("#addComment").before("<h3>Comments</h3>");
+ comments_button=jQuery("#comments h3");
+ }
+
+ if (session_storage['comments'] == undefined && p_pict_comment == 'off') {
+ session_storage['comments'] = 'hidden';
+ }
+
+ if (session_storage['comments'] == 'hidden') {
+ comments.addClass("commentshidden");
+ comments_button.addClass("comments_toggle comments_toggle_on");
+ }
+ else {
+ comments.addClass("commentsshown");
+ comments_button.addClass("comments_toggle comments_toggle_off");
+ }
+
+ comments_button.click(commentsToggle);
+ commentsswitcher.click(commentsToggle);
+
+ jQuery(window).scroll(function (event) {
+ if (comments_top_offset==0) return;
+
+ var y = jQuery(this).scrollTop();
+
+ if (y >= comments_top_offset) {
+ comments_add.css({
+ 'position': 'absolute',
+ 'top': y-comments.offset().top+10
+ });
+ }
+ else {
+ comments_add.css({
+ 'position': 'static',
+ 'top': 0
+ });
+ }
+ });
+
+ if (comments_add.is(":visible")) {
+ comments_top_offset = comments_add.offset().top - parseFloat(comments_add.css('marginTop').replace(/auto/, 0));
+ }
+ }
+ });
+}()); \ No newline at end of file
diff --git a/themes/elegant/theme.css b/themes/elegant/theme.css
index 95f7c7a92..83f130deb 100644
--- a/themes/elegant/theme.css
+++ b/themes/elegant/theme.css
@@ -220,10 +220,9 @@ a:hover { border-bottom: none;}
}
#imageInfos .navThumbs { width: 250px; height: 130px; margin: auto; padding: 0 5px;}
-#imageInfos .navThumb { position: relative; width: 120px; height: 120px; margin: 0; overflow: hidden;}
+#imageInfos .navThumb { position: relative; margin: 0; overflow: hidden;}
#imageInfos #linkPrev { float: left;}
-#imageInfos #linkNext { float: right;}
-#imageInfos .thumbHover { position: absolute; width: 100%; height: 100%;}
+#imageInfos #linkNext { float: right;}
#imageInfos .prevThumbHover { background: transparent url(icon/none.png) no-repeat center center;}
#imageInfos .prevThumbHover:hover { background: transparent url(icon/img_prev.png) no-repeat center center;}
#imageInfos .nextThumbHover { background: transparent url(icon/none.png) no-repeat center center;}
@@ -238,7 +237,7 @@ a:hover { border-bottom: none;}
/* image comments */
-#thePicturePage #comments { padding: 2px 5px;}
+#thePicturePage #comments { padding: 2px 5px; position:relative;}
#thePicturePage #comments h3 { margin: 10px 0;}
#thePicturePage #comments form { margin: 10px 0;}
#thePicturePage #comments fieldset { margin: 0 1em;}
@@ -256,7 +255,6 @@ a:hover { border-bottom: none;}
font-family: Arial,Helvetica,sans-serif;
font-size: 100%;
}
-
#pictureCommentList .commentsOrder { float: left; margin-bottom: 5px;}
#pictureCommentList .navigationBar { float: right; margin-bottom: 5px;}
#pictureComments h4 { margin: 0;}
diff --git a/themes/elegant/themeconf.inc.php b/themes/elegant/themeconf.inc.php
index 1c0e1feb3..d5afc6f6e 100644
--- a/themes/elegant/themeconf.inc.php
+++ b/themes/elegant/themeconf.inc.php
@@ -1,9 +1,9 @@
<?php
/*
Theme Name: elegant
-Version: 2.5.0
+Version: 2.6.0
Description: Dark background, grayscale.
-Theme URI:
+Theme URI: http://piwigo.org/ext/extension_view.php?eid=685
Author: Piwigo team
Author URI: http://piwigo.org
*/
@@ -12,4 +12,16 @@ $themeconf = array(
'parent' => 'default',
'local_head' => 'local_head.tpl'
);
+// Need upgrade?
+global $conf;
+include(PHPWG_THEMES_PATH.'elegant/admin/upgrade.inc.php');
+
+add_event_handler('init', 'set_config_values_elegant');
+function set_config_values_elegant()
+{
+ global $conf, $template;
+ $config = unserialize( $conf['elegant'] );
+ $template->assign( 'elegant', $config );
+}
+
?>
diff --git a/themes/index.php b/themes/index.php
index 41732f2fd..c8de97f60 100644
--- a/themes/index.php
+++ b/themes/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/themes/smartpocket/admin/admin.inc.php b/themes/smartpocket/admin/admin.inc.php
new file mode 100644
index 000000000..a5a9300c4
--- /dev/null
+++ b/themes/smartpocket/admin/admin.inc.php
@@ -0,0 +1,29 @@
+<?php
+
+// Need upgrade?
+global $conf;
+include(PHPWG_THEMES_PATH.'smartpocket/admin/upgrade.inc.php');
+
+load_language('theme.lang', PHPWG_THEMES_PATH.'smartpocket/');
+
+$config_send= array();
+
+if(isset($_POST['submit_smartpocket']))
+{
+ $config_send['loop'] = isset($_POST['loop']);
+ $config_send['autohide'] = (isset($_POST['autohide']) ? 5000 : 0);
+
+ $conf['smartpocket'] = serialize($config_send);
+ conf_update_param('smartpocket', pwg_db_real_escape_string($conf['smartpocket']));
+
+ array_push($page['infos'], l10n('Information data registered in database'));
+}
+
+$template->set_filenames(array(
+ 'theme_admin_content' => dirname(__FILE__) . '/admin.tpl'));
+
+$template->assign('options', unserialize($conf['smartpocket']));
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'theme_admin_content');
+
+?> \ No newline at end of file
diff --git a/themes/smartpocket/admin/admin.tpl b/themes/smartpocket/admin/admin.tpl
new file mode 100644
index 000000000..baf6d47fe
--- /dev/null
+++ b/themes/smartpocket/admin/admin.tpl
@@ -0,0 +1,47 @@
+{html_style}
+.graphicalCheckbox {
+ font-size:16px;
+ line-height:16px;
+}
+
+input[type=checkbox] {
+ display:none;
+}
+{/html_style}
+
+{footer_script}{literal}
+jQuery(document).ready(function() {
+ jQuery('form li label input[type=checkbox]').change(function() {
+ jQuery(this).prev().toggleClass('icon-check icon-check-empty');
+ });
+});
+{/literal}{/footer_script}
+
+<div class="titrePage">
+ <h2>{'Smartpocket, Configuration Page'|@translate}</h2>
+</div>
+<form method="post" class="properties" action="" ENCTYPE="multipart/form-data" name="form" class="properties">
+<div id="configContent">
+ <fieldset>
+ <legend>{'Slideshow Options'|@translate}</legend>
+ <ul>
+
+ <li><label>
+ <span class="property">{'Loop the slideshow'|@translate}</span>&nbsp;
+ <span class="graphicalCheckbox icon-check{if not $options.loop}-empty{/if}">&nbsp;</span>
+ <input type="checkbox" name="loop"{if $options.loop} checked="checked"{/if}>
+ </label></li>
+
+ <li><label>
+ <span class="property">{'Autohide the bar of the slideshow'|@translate}</span>&nbsp;
+ <span class="graphicalCheckbox icon-check{if $options.autohide != 5000}-empty{/if}">&nbsp;</span>
+ <input type="checkbox" name="autohide"{if $options.autohide == 5000} checked="checked"{/if}>
+ </label></li>
+
+ </ul>
+ </fieldset>
+</div>
+<p>
+ <input class="submit" type="submit" value="{'Submit'|@translate}" name="submit_smartpocket" />
+</p>
+</form>
diff --git a/themes/smartpocket/admin/index.php b/themes/smartpocket/admin/index.php
new file mode 100644
index 000000000..e3365959c
--- /dev/null
+++ b/themes/smartpocket/admin/index.php
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/smartpocket/admin/maintain.inc.php b/themes/smartpocket/admin/maintain.inc.php
new file mode 100644
index 000000000..d3beb4873
--- /dev/null
+++ b/themes/smartpocket/admin/maintain.inc.php
@@ -0,0 +1,45 @@
+<?php
+class smartpocket_maintain extends ThemeMaintain
+{
+ private $installed = false;
+
+ private $default_conf = array(
+ 'loop' => true,//true - false
+ 'autohide' => 5000,//5000 - 0
+ );
+
+ function activate($theme_version, &$errors=array())
+ {
+ global $conf, $prefixeTable;
+
+ if (empty($conf['smartpocket']))
+ {
+ $conf['smartpocket'] = serialize($this->default_conf);
+ $query = "
+ INSERT INTO " . CONFIG_TABLE . " (param,value,comment)
+ VALUES ('smartpocket' , '".pwg_db_real_escape_string($conf['smartpocket'])."' , 'loop#autohide');";
+ pwg_query($query);
+ }
+ elseif (count(unserialize( $conf['smartpocket'] ))!=2)
+ {
+ $conff=unserialize($conf['smartpocket']);
+ $config = array(
+ 'loop' => (!empty($conff['loop'])) ? $conff['loop'] :true,
+ 'autohide' => (!empty($conff['autohide'])) ? $conff['autohide'] :5000,
+ );
+ conf_update_param('smartpocket', pwg_db_real_escape_string(serialize($config)));
+ load_conf_from_db();
+ }
+ $this->installed = true;
+ }
+
+ function deactivate()
+ { }
+
+ function delete()
+ {
+ // delete configuration
+ conf_delete_param('smartpocket');
+ }
+}
+?> \ No newline at end of file
diff --git a/themes/smartpocket/admin/upgrade.inc.php b/themes/smartpocket/admin/upgrade.inc.php
new file mode 100644
index 000000000..1e1925d77
--- /dev/null
+++ b/themes/smartpocket/admin/upgrade.inc.php
@@ -0,0 +1,29 @@
+<?php
+
+if (!defined('PHPWG_ROOT_PATH')) die('Hacking attempt!');
+
+global $prefixeTable, $conf;
+
+if (!isset($conf['smartpocket']))
+{
+ $config = array(
+ 'loop' => true,//true - false
+ 'autohide' => 5000,//5000 - 0
+ );
+ $query = "
+INSERT INTO " . CONFIG_TABLE . " (param,value,comment)
+VALUES ('smartpocket' , '".pwg_db_real_escape_string(serialize($config))."' , 'loop#autohide');";
+ pwg_query($query);
+ load_conf_from_db();
+}
+elseif (count(unserialize( $conf['smartpocket'] ))!=2)
+{
+ $conff=unserialize($conf['smartpocket']);
+ $config = array(
+ 'loop' => (!empty($conff['loop'])) ? $conff['loop'] :true,
+ 'autohide' => (!empty($conff['autohide'])) ? $conff['autohide'] :5000,
+ );
+ conf_update_param('smartpocket', pwg_db_real_escape_string(serialize($config)));
+ load_conf_from_db();
+}
+?> \ No newline at end of file
diff --git a/themes/smartpocket/images/ajax-loader.gif b/themes/smartpocket/images/ajax-loader.gif
new file mode 100644
index 000000000..fd1a189c2
--- /dev/null
+++ b/themes/smartpocket/images/ajax-loader.gif
Binary files differ
diff --git a/themes/smartpocket/images/icons-18-black.png b/themes/smartpocket/images/icons-18-black.png
index 32fa6e7e6..791646384 100644
--- a/themes/smartpocket/images/icons-18-black.png
+++ b/themes/smartpocket/images/icons-18-black.png
Binary files differ
diff --git a/themes/smartpocket/images/icons-18-white.png b/themes/smartpocket/images/icons-18-white.png
index f4e6787a1..3419b81f6 100644
--- a/themes/smartpocket/images/icons-18-white.png
+++ b/themes/smartpocket/images/icons-18-white.png
Binary files differ
diff --git a/themes/smartpocket/images/icons-36-black.png b/themes/smartpocket/images/icons-36-black.png
index e508159e7..043bfcd52 100644
--- a/themes/smartpocket/images/icons-36-black.png
+++ b/themes/smartpocket/images/icons-36-black.png
Binary files differ
diff --git a/themes/smartpocket/images/icons-36-white.png b/themes/smartpocket/images/icons-36-white.png
index 3f342ccbe..12455c907 100644
--- a/themes/smartpocket/images/icons-36-white.png
+++ b/themes/smartpocket/images/icons-36-white.png
Binary files differ
diff --git a/themes/smartpocket/jquery.mobile.css b/themes/smartpocket/jquery.mobile.css
index 84229a5fb..422d175b7 100644
--- a/themes/smartpocket/jquery.mobile.css
+++ b/themes/smartpocket/jquery.mobile.css
@@ -1,70 +1,71 @@
/*
-* jQuery Mobile Framework 1.0.1
+* jQuery Mobile 1.3.1
+* Git HEAD hash: 74b4bec049fd93e4fe40205e6157de16eb64eb46 <> Date: Mon Apr 8 2013 19:41:28 UTC
* http://jquerymobile.com
*
-* Copyright 2011-2012 (c) jQuery Project
-* Dual licensed under the MIT or GPL Version 2 licenses.
+* Copyright 2010, 2013 jQuery Foundation, Inc. and other contributors
+* Released under the MIT license.
* http://jquery.org/license
*
*/
-/* Swatches */
+
+/* Swatches */
/* A
-----------------------------------------------------------------------------------------------------------*/
-
.ui-bar-a {
- border: 1px solid #2A2A2A /*{a-bar-border}*/;
- background: #111111 /*{a-bar-background-color}*/;
- color: #ffffff /*{a-bar-color}*/;
+ border: 1px solid #333 /*{a-bar-border}*/;
+ background: #111 /*{a-bar-background-color}*/;
+ color: #fff /*{a-bar-color}*/;
font-weight: bold;
- text-shadow: 0 /*{a-bar-shadow-x}*/ -1px /*{a-bar-shadow-y}*/ 1px /*{a-bar-shadow-radius}*/ #000000 /*{a-bar-shadow-color}*/;
+ text-shadow: 0 /*{a-bar-shadow-x}*/ -1px /*{a-bar-shadow-y}*/ 0 /*{a-bar-shadow-radius}*/ #000 /*{a-bar-shadow-color}*/;
background-image: -webkit-gradient(linear, left top, left bottom, from( #3c3c3c /*{a-bar-background-start}*/), to( #111 /*{a-bar-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient(#3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient(#3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient(#3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient(#3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient(#3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/);
-}
-.ui-bar-a,
-.ui-bar-a input,
-.ui-bar-a select,
-.ui-bar-a textarea,
+ background-image: -webkit-linear-gradient( #3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/);
+}
+.ui-bar-a,
+.ui-bar-a input,
+.ui-bar-a select,
+.ui-bar-a textarea,
.ui-bar-a button {
font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
}
.ui-bar-a .ui-link-inherit {
color: #fff /*{a-bar-color}*/;
}
-
-.ui-bar-a .ui-link {
+.ui-bar-a a.ui-link {
color: #7cc4e7 /*{a-bar-link-color}*/;
font-weight: bold;
}
-
-.ui-bar-a .ui-link:hover {
- color: #2489CE /*{a-bar-link-hover}*/;
+.ui-bar-a a.ui-link:visited {
+ color: #2489ce /*{a-bar-link-visited}*/;
}
-
-.ui-bar-a .ui-link:active {
- color: #2489CE /*{a-bar-link-active}*/;
+.ui-bar-a a.ui-link:hover {
+ color: #2489ce /*{a-bar-link-hover}*/;
}
-
-.ui-bar-a .ui-link:visited {
- color: #2489CE /*{a-bar-link-visited}*/;
+.ui-bar-a a.ui-link:active {
+ color: #2489ce /*{a-bar-link-active}*/;
}
.ui-body-a,
-.ui-dialog.ui-overlay-a {
- border: 1px solid #2A2A2A /*{a-body-border}*/;
- background: #222222 /*{a-body-background-color}*/;
+.ui-overlay-a {
+ border: 1px solid #444 /*{a-body-border}*/;
+ background: #222 /*{a-body-background-color}*/;
color: #fff /*{a-body-color}*/;
- text-shadow: 0 /*{a-body-shadow-x}*/ 1px /*{a-body-shadow-y}*/ 0 /*{a-body-shadow-radius}*/ #000 /*{a-body-shadow-color}*/;
+ text-shadow: 0 /*{a-body-shadow-x}*/ 1px /*{a-body-shadow-y}*/ 0 /*{a-body-shadow-radius}*/ #111 /*{a-body-shadow-color}*/;
font-weight: normal;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #666 /*{a-body-background-start}*/), to( #222 /*{a-body-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient(#666 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient(#666 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient(#666 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient(#666 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient(#666 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/);
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #444 /*{a-body-background-start}*/), to( #222 /*{a-body-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #444 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #444 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #444 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #444 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #444 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/);
+}
+.ui-overlay-a {
+ background-image: none;
+ border-width: 0;
}
.ui-body-a,
.ui-body-a input,
@@ -76,69 +77,69 @@
.ui-body-a .ui-link-inherit {
color: #fff /*{a-body-color}*/;
}
-
.ui-body-a .ui-link {
- color: #2489CE /*{a-body-link-color}*/;
+ color: #2489ce /*{a-body-link-color}*/;
font-weight: bold;
}
-
+.ui-body-a .ui-link:visited {
+ color: #2489ce /*{a-body-link-visited}*/;
+}
.ui-body-a .ui-link:hover {
- color: #2489CE /*{a-body-link-hover}*/;
+ color: #2489ce /*{a-body-link-hover}*/;
}
-
.ui-body-a .ui-link:active {
- color: #2489CE /*{a-body-link-active}*/;
-}
-
-.ui-body-a .ui-link:visited {
- color: #2489CE /*{a-body-link-visited}*/;
+ color: #2489ce /*{a-body-link-active}*/;
}
-
.ui-btn-up-a {
- border: 1px solid #222 /*{a-bup-border}*/;
- background: #333333 /*{a-bup-background-color}*/;
+ border: 1px solid #111 /*{a-bup-border}*/;
+ background: #333 /*{a-bup-background-color}*/;
font-weight: bold;
color: #fff /*{a-bup-color}*/;
- text-shadow: 0 /*{a-bup-shadow-x}*/ -1px /*{a-bup-shadow-y}*/ 1px /*{a-bup-shadow-radius}*/ #000 /*{a-bup-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #555 /*{a-bup-background-start}*/), to( #333 /*{a-bup-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient(#555 /*{a-bup-background-start}*/, #333 /*{a-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient(#555 /*{a-bup-background-start}*/, #333 /*{a-bup-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient(#555 /*{a-bup-background-start}*/, #333 /*{a-bup-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient(#555 /*{a-bup-background-start}*/, #333 /*{a-bup-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient(#555 /*{a-bup-background-start}*/, #333 /*{a-bup-background-end}*/);
-}
+ text-shadow: 0 /*{a-bup-shadow-x}*/ 1px /*{a-bup-shadow-y}*/ 0 /*{a-bup-shadow-radius}*/ #111 /*{a-bup-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #444 /*{a-bup-background-start}*/), to( #2d2d2d /*{a-bup-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #444 /*{a-bup-background-start}*/, #2d2d2d /*{a-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #444 /*{a-bup-background-start}*/, #2d2d2d /*{a-bup-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #444 /*{a-bup-background-start}*/, #2d2d2d /*{a-bup-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #444 /*{a-bup-background-start}*/, #2d2d2d /*{a-bup-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #444 /*{a-bup-background-start}*/, #2d2d2d /*{a-bup-background-end}*/);
+}
+.ui-btn-up-a:visited,
.ui-btn-up-a a.ui-link-inherit {
color: #fff /*{a-bup-color}*/;
}
.ui-btn-hover-a {
border: 1px solid #000 /*{a-bhover-border}*/;
- background: #444444 /*{a-bhover-background-color}*/;
+ background: #444 /*{a-bhover-background-color}*/;
font-weight: bold;
color: #fff /*{a-bhover-color}*/;
- text-shadow: 0 /*{a-bhover-shadow-x}*/ -1px /*{a-bhover-shadow-y}*/ 1px /*{a-bhover-shadow-radius}*/ #000 /*{a-bhover-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #666 /*{a-bhover-background-start}*/), to( #444 /*{a-bhover-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient(#666 /*{a-bhover-background-start}*/, #444 /*{a-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient(#666 /*{a-bhover-background-start}*/, #444 /*{a-bhover-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient(#666 /*{a-bhover-background-start}*/, #444 /*{a-bhover-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient(#666 /*{a-bhover-background-start}*/, #444 /*{a-bhover-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient(#666 /*{a-bhover-background-start}*/, #444 /*{a-bhover-background-end}*/);
-}
+ text-shadow: 0 /*{a-bhover-shadow-x}*/ 1px /*{a-bhover-shadow-y}*/ 0 /*{a-bhover-shadow-radius}*/ #111 /*{a-bhover-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #555 /*{a-bhover-background-start}*/), to( #383838 /*{a-bhover-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #555 /*{a-bhover-background-start}*/, #383838 /*{a-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #555 /*{a-bhover-background-start}*/, #383838 /*{a-bhover-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #555 /*{a-bhover-background-start}*/, #383838 /*{a-bhover-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #555 /*{a-bhover-background-start}*/, #383838 /*{a-bhover-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #555 /*{a-bhover-background-start}*/, #383838 /*{a-bhover-background-end}*/);
+}
+.ui-btn-hover-a:visited,
+.ui-btn-hover-a:hover,
.ui-btn-hover-a a.ui-link-inherit {
color: #fff /*{a-bhover-color}*/;
}
.ui-btn-down-a {
border: 1px solid #000 /*{a-bdown-border}*/;
- background: #3d3d3d /*{a-bdown-background-color}*/;
+ background: #222 /*{a-bdown-background-color}*/;
font-weight: bold;
color: #fff /*{a-bdown-color}*/;
- text-shadow: 0 /*{a-bdown-shadow-x}*/ -1px /*{a-bdown-shadow-y}*/ 1px /*{a-bdown-shadow-radius}*/ #000 /*{a-bdown-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #333 /*{a-bdown-background-start}*/), to( #5a5a5a /*{a-bdown-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient(#333 /*{a-bdown-background-start}*/, #5a5a5a /*{a-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient(#333 /*{a-bdown-background-start}*/, #5a5a5a /*{a-bdown-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient(#333 /*{a-bdown-background-start}*/, #5a5a5a /*{a-bdown-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient(#333 /*{a-bdown-background-start}*/, #5a5a5a /*{a-bdown-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient(#333 /*{a-bdown-background-start}*/, #5a5a5a /*{a-bdown-background-end}*/);
-}
+ text-shadow: 0 /*{a-bdown-shadow-x}*/ 1px /*{a-bdown-shadow-y}*/ 0 /*{a-bdown-shadow-radius}*/ #111 /*{a-bdown-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #202020 /*{a-bdown-background-start}*/), to( #2c2c2c /*{a-bdown-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #202020 /*{a-bdown-background-start}*/, #2c2c2c /*{a-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #202020 /*{a-bdown-background-start}*/, #2c2c2c /*{a-bdown-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #202020 /*{a-bdown-background-start}*/, #2c2c2c /*{a-bdown-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #202020 /*{a-bdown-background-start}*/, #2c2c2c /*{a-bdown-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #202020 /*{a-bdown-background-start}*/, #2c2c2c /*{a-bdown-background-end}*/);
+}
+.ui-btn-down-a:visited,
+.ui-btn-down-a:hover,
.ui-btn-down-a a.ui-link-inherit {
color: #fff /*{a-bdown-color}*/;
}
@@ -148,23 +149,20 @@
font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
text-decoration: none;
}
-
-
/* B
-----------------------------------------------------------------------------------------------------------*/
-
.ui-bar-b {
border: 1px solid #456f9a /*{b-bar-border}*/;
background: #5e87b0 /*{b-bar-background-color}*/;
color: #fff /*{b-bar-color}*/;
font-weight: bold;
- text-shadow: 0 /*{b-bar-shadow-x}*/ -1px /*{b-bar-shadow-y}*/ 1px /*{b-bar-shadow-radius}*/ #254f7a /*{b-bar-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #81a8ce /*{b-bar-background-start}*/), to( #5e87b0 /*{b-bar-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient(#81a8ce /*{b-bar-background-start}*/, #5e87b0 /*{b-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient(#81a8ce /*{b-bar-background-start}*/, #5e87b0 /*{b-bar-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient(#81a8ce /*{b-bar-background-start}*/, #5e87b0 /*{b-bar-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient(#81a8ce /*{b-bar-background-start}*/, #5e87b0 /*{b-bar-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient(#81a8ce /*{b-bar-background-start}*/, #5e87b0 /*{b-bar-background-end}*/);
+ text-shadow: 0 /*{b-bar-shadow-x}*/ 1px /*{b-bar-shadow-y}*/ 0 /*{b-bar-shadow-radius}*/ #3e6790 /*{b-bar-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #6facd5 /*{b-bar-background-start}*/), to( #497bae /*{b-bar-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #6facd5 /*{b-bar-background-start}*/, #497bae /*{b-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #6facd5 /*{b-bar-background-start}*/, #497bae /*{b-bar-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #6facd5 /*{b-bar-background-start}*/, #497bae /*{b-bar-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #6facd5 /*{b-bar-background-start}*/, #497bae /*{b-bar-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #6facd5 /*{b-bar-background-start}*/, #497bae /*{b-bar-background-end}*/);
}
.ui-bar-b,
.ui-bar-b input,
@@ -176,35 +174,36 @@
.ui-bar-b .ui-link-inherit {
color: #fff /*{b-bar-color}*/;
}
-.ui-bar-b .ui-link {
+.ui-bar-b a.ui-link {
color: #ddf0f8 /*{b-bar-link-color}*/;
font-weight: bold;
}
-
-.ui-bar-b .ui-link:hover {
+.ui-bar-b a.ui-link:visited {
+ color: #ddf0f8 /*{b-bar-link-visited}*/;
+}
+.ui-bar-b a.ui-link:hover {
color: #ddf0f8 /*{b-bar-link-hover}*/;
}
-
-.ui-bar-b .ui-link:active {
+.ui-bar-b a.ui-link:active {
color: #ddf0f8 /*{b-bar-link-active}*/;
}
-
-.ui-bar-b .ui-link:visited {
- color: #ddf0f8 /*{b-bar-link-visited}*/;
-}
.ui-body-b,
-.ui-dialog.ui-overlay-b {
- border: 1px solid #C6C6C6 /*{b-body-border}*/;
- background: #cccccc /*{b-body-background-color}*/;
- color: #333333 /*{b-body-color}*/;
+.ui-overlay-b {
+ border: 1px solid #999 /*{b-body-border}*/;
+ background: #f3f3f3 /*{b-body-background-color}*/;
+ color: #222 /*{b-body-color}*/;
text-shadow: 0 /*{b-body-shadow-x}*/ 1px /*{b-body-shadow-y}*/ 0 /*{b-body-shadow-radius}*/ #fff /*{b-body-shadow-color}*/;
font-weight: normal;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #e6e6e6 /*{b-body-background-start}*/), to( #ccc /*{b-body-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient(#e6e6e6 /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient(#e6e6e6 /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient(#e6e6e6 /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient(#e6e6e6 /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient(#e6e6e6 /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/);
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #ddd /*{b-body-background-start}*/), to( #ccc /*{b-body-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #ddd /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #ddd /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #ddd /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #ddd /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #ddd /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/);
+}
+.ui-overlay-b {
+ background-image: none;
+ border-width: 0;
}
.ui-body-b,
.ui-body-b input,
@@ -214,55 +213,53 @@
font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
}
.ui-body-b .ui-link-inherit {
- color: #333333 /*{b-body-color}*/;
+ color: #333 /*{b-body-color}*/;
}
-
.ui-body-b .ui-link {
- color: #2489CE /*{b-body-link-color}*/;
+ color: #2489ce /*{b-body-link-color}*/;
font-weight: bold;
}
-
+.ui-body-b .ui-link:visited {
+ color: #2489ce /*{b-body-link-visited}*/;
+}
.ui-body-b .ui-link:hover {
- color: #2489CE /*{b-body-link-hover}*/;
+ color: #2489ce /*{b-body-link-hover}*/;
}
-
.ui-body-b .ui-link:active {
- color: #2489CE /*{b-body-link-active}*/;
-}
-
-.ui-body-b .ui-link:visited {
- color: #2489CE /*{b-body-link-visited}*/;
+ color: #2489ce /*{b-body-link-active}*/;
}
-
.ui-btn-up-b {
- border: 1px solid #145072 /*{b-bup-border}*/;
- background: #2567ab /*{b-bup-background-color}*/;
+ border: 1px solid #044062 /*{b-bup-border}*/;
+ background: #396b9e /*{b-bup-background-color}*/;
font-weight: bold;
color: #fff /*{b-bup-color}*/;
- text-shadow: 0 /*{b-bup-shadow-x}*/ -1px /*{b-bup-shadow-y}*/ 1px /*{b-bup-shadow-radius}*/ #145072 /*{b-bup-shadow-color}*/;
+ text-shadow: 0 /*{b-bup-shadow-x}*/ 1px /*{b-bup-shadow-y}*/ 0 /*{b-bup-shadow-radius}*/ #194b7e /*{b-bup-shadow-color}*/;
background-image: -webkit-gradient(linear, left top, left bottom, from( #5f9cc5 /*{b-bup-background-start}*/), to( #396b9e /*{b-bup-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient(#5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient(#5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient(#5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient(#5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient(#5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/);
+ background-image: -webkit-linear-gradient( #5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/);
}
+.ui-btn-up-b:visited,
.ui-btn-up-b a.ui-link-inherit {
color: #fff /*{b-bup-color}*/;
}
.ui-btn-hover-b {
- border: 1px solid #00516e /*{b-bhover-border}*/;
+ border: 1px solid #00415e /*{b-bhover-border}*/;
background: #4b88b6 /*{b-bhover-background-color}*/;
font-weight: bold;
color: #fff /*{b-bhover-color}*/;
- text-shadow: 0 /*{b-bhover-shadow-x}*/ -1px /*{b-bhover-shadow-y}*/ 1px /*{b-bhover-shadow-radius}*/ #014D68 /*{b-bhover-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #72b0d4 /*{b-bhover-background-start}*/), to( #4b88b6 /*{b-bhover-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient(#72b0d4 /*{b-bhover-background-start}*/, #4b88b6 /*{b-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient(#72b0d4 /*{b-bhover-background-start}*/, #4b88b6 /*{b-bhover-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient(#72b0d4 /*{b-bhover-background-start}*/, #4b88b6 /*{b-bhover-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient(#72b0d4 /*{b-bhover-background-start}*/, #4b88b6 /*{b-bhover-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient(#72b0d4 /*{b-bhover-background-start}*/, #4b88b6 /*{b-bhover-background-end}*/);
-}
+ text-shadow: 0 /*{b-bhover-shadow-x}*/ 1px /*{b-bhover-shadow-y}*/ 0 /*{b-bhover-shadow-radius}*/ #194b7e /*{b-bhover-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #6facd5 /*{b-bhover-background-start}*/), to( #4272a4 /*{b-bhover-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #6facd5 /*{b-bhover-background-start}*/, #4272a4 /*{b-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #6facd5 /*{b-bhover-background-start}*/, #4272a4 /*{b-bhover-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #6facd5 /*{b-bhover-background-start}*/, #4272a4 /*{b-bhover-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #6facd5 /*{b-bhover-background-start}*/, #4272a4 /*{b-bhover-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #6facd5 /*{b-bhover-background-start}*/, #4272a4 /*{b-bhover-background-end}*/);
+}
+.ui-btn-hover-b:visited,
+.ui-btn-hover-b:hover,
.ui-btn-hover-b a.ui-link-inherit {
color: #fff /*{b-bhover-color}*/;
}
@@ -271,14 +268,16 @@
background: #4e89c5 /*{b-bdown-background-color}*/;
font-weight: bold;
color: #fff /*{b-bdown-color}*/;
- text-shadow: 0 /*{b-bdown-shadow-x}*/ -1px /*{b-bdown-shadow-y}*/ 1px /*{b-bdown-shadow-radius}*/ #225377 /*{b-bdown-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #396b9e /*{b-bdown-background-start}*/), to( #4e89c5 /*{b-bdown-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient(#396b9e /*{b-bdown-background-start}*/, #4e89c5 /*{b-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient(#396b9e /*{b-bdown-background-start}*/, #4e89c5 /*{b-bdown-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient(#396b9e /*{b-bdown-background-start}*/, #4e89c5 /*{b-bdown-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient(#396b9e /*{b-bdown-background-start}*/, #4e89c5 /*{b-bdown-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient(#396b9e /*{b-bdown-background-start}*/, #4e89c5 /*{b-bdown-background-end}*/);
-}
+ text-shadow: 0 /*{b-bdown-shadow-x}*/ 1px /*{b-bdown-shadow-y}*/ 0 /*{b-bdown-shadow-radius}*/ #194b7e /*{b-bdown-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #295b8e /*{b-bdown-background-start}*/), to( #3e79b5 /*{b-bdown-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #295b8e /*{b-bdown-background-start}*/, #3e79b5 /*{b-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #295b8e /*{b-bdown-background-start}*/, #3e79b5 /*{b-bdown-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #295b8e /*{b-bdown-background-start}*/, #3e79b5 /*{b-bdown-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #295b8e /*{b-bdown-background-start}*/, #3e79b5 /*{b-bdown-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #295b8e /*{b-bdown-background-start}*/, #3e79b5 /*{b-bdown-background-end}*/);
+}
+.ui-btn-down-b:visited,
+.ui-btn-down-b:hover,
.ui-btn-down-b a.ui-link-inherit {
color: #fff /*{b-bdown-color}*/;
}
@@ -288,45 +287,37 @@
font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
text-decoration: none;
}
-
-
/* C
-----------------------------------------------------------------------------------------------------------*/
-
.ui-bar-c {
- border: 1px solid #B3B3B3 /*{c-bar-border}*/;
- background: #e9eaeb /*{c-bar-background-color}*/;
- color: #3E3E3E /*{c-bar-color}*/;
+ border: 1px solid #b3b3b3 /*{c-bar-border}*/;
+ background: #eee /*{c-bar-background-color}*/;
+ color: #3e3e3e /*{c-bar-color}*/;
font-weight: bold;
- text-shadow: 0 /*{c-bar-shadow-x}*/ 1px /*{c-bar-shadow-y}*/ 1px /*{c-bar-shadow-radius}*/ #fff /*{c-bar-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #f0f0f0 /*{c-bar-background-start}*/), to( #e9eaeb /*{c-bar-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient(#f0f0f0 /*{c-bar-background-start}*/, #e9eaeb /*{c-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient(#f0f0f0 /*{c-bar-background-start}*/, #e9eaeb /*{c-bar-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient(#f0f0f0 /*{c-bar-background-start}*/, #e9eaeb /*{c-bar-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient(#f0f0f0 /*{c-bar-background-start}*/, #e9eaeb /*{c-bar-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient(#f0f0f0 /*{c-bar-background-start}*/, #e9eaeb /*{c-bar-background-end}*/);
+ text-shadow: 0 /*{c-bar-shadow-x}*/ 1px /*{c-bar-shadow-y}*/ 0 /*{c-bar-shadow-radius}*/ #fff /*{c-bar-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #f0f0f0 /*{c-bar-background-start}*/), to( #ddd /*{c-bar-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #f0f0f0 /*{c-bar-background-start}*/, #ddd /*{c-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #f0f0f0 /*{c-bar-background-start}*/, #ddd /*{c-bar-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #f0f0f0 /*{c-bar-background-start}*/, #ddd /*{c-bar-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #f0f0f0 /*{c-bar-background-start}*/, #ddd /*{c-bar-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #f0f0f0 /*{c-bar-background-start}*/, #ddd /*{c-bar-background-end}*/);
}
-
.ui-bar-c .ui-link-inherit {
- color: #3E3E3E /*{c-bar-color}*/;
+ color: #3e3e3e /*{c-bar-color}*/;
}
-.ui-bar-c .ui-link {
+.ui-bar-c a.ui-link {
color: #7cc4e7 /*{c-bar-link-color}*/;
font-weight: bold;
}
-
-.ui-bar-c .ui-link:hover {
- color: #2489CE /*{c-bar-link-hover}*/;
+.ui-bar-c a.ui-link:visited {
+ color: #2489ce /*{c-bar-link-visited}*/;
}
-
-.ui-bar-c .ui-link:active {
- color: #2489CE /*{c-bar-link-active}*/;
+.ui-bar-c a.ui-link:hover {
+ color: #2489ce /*{c-bar-link-hover}*/;
}
-
-.ui-bar-c .ui-link:visited {
- color: #2489CE /*{c-bar-link-visited}*/;
+.ui-bar-c a.ui-link:active {
+ color: #2489ce /*{c-bar-link-active}*/;
}
-
.ui-bar-c,
.ui-bar-c input,
.ui-bar-c select,
@@ -335,17 +326,21 @@
font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
}
.ui-body-c,
-.ui-dialog.ui-overlay-c {
- border: 1px solid #B3B3B3 /*{c-body-border}*/;
- color: #333333 /*{c-body-color}*/;
+.ui-overlay-c {
+ border: 1px solid #aaa /*{c-body-border}*/;
+ color: #333 /*{c-body-color}*/;
text-shadow: 0 /*{c-body-shadow-x}*/ 1px /*{c-body-shadow-y}*/ 0 /*{c-body-shadow-radius}*/ #fff /*{c-body-shadow-color}*/;
- background: #f0f0f0 /*{c-body-background-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #eee /*{c-body-background-start}*/), to( #ddd /*{c-body-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient(#eee /*{c-body-background-start}*/, #ddd /*{c-body-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient(#eee /*{c-body-background-start}*/, #ddd /*{c-body-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient(#eee /*{c-body-background-start}*/, #ddd /*{c-body-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient(#eee /*{c-body-background-start}*/, #ddd /*{c-body-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient(#eee /*{c-body-background-start}*/, #ddd /*{c-body-background-end}*/);
+ background: #f9f9f9 /*{c-body-background-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #f9f9f9 /*{c-body-background-start}*/), to( #eee /*{c-body-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #f9f9f9 /*{c-body-background-start}*/, #eee /*{c-body-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #f9f9f9 /*{c-body-background-start}*/, #eee /*{c-body-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #f9f9f9 /*{c-body-background-start}*/, #eee /*{c-body-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #f9f9f9 /*{c-body-background-start}*/, #eee /*{c-body-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #f9f9f9 /*{c-body-background-start}*/, #eee /*{c-body-background-end}*/);
+}
+.ui-overlay-c {
+ background-image: none;
+ border-width: 0;
}
.ui-body-c,
.ui-body-c input,
@@ -354,76 +349,74 @@
.ui-body-c button {
font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
}
-
.ui-body-c .ui-link-inherit {
- color: #333333 /*{c-body-color}*/;
+ color: #333 /*{c-body-color}*/;
}
-
.ui-body-c .ui-link {
- color: #2489CE /*{c-body-link-color}*/;
+ color: #2489ce /*{c-body-link-color}*/;
font-weight: bold;
}
-
+.ui-body-c .ui-link:visited {
+ color: #2489ce /*{c-body-link-visited}*/;
+}
.ui-body-c .ui-link:hover {
- color: #2489CE /*{c-body-link-hover}*/;
+ color: #2489ce /*{c-body-link-hover}*/;
}
-
.ui-body-c .ui-link:active {
- color: #2489CE /*{c-body-link-active}*/;
+ color: #2489ce /*{c-body-link-active}*/;
}
-
-.ui-body-c .ui-link:visited {
- color: #2489CE /*{c-body-link-visited}*/;
-}
-
.ui-btn-up-c {
border: 1px solid #ccc /*{c-bup-border}*/;
background: #eee /*{c-bup-background-color}*/;
font-weight: bold;
- color: #444 /*{c-bup-color}*/;
- text-shadow: 0 /*{c-bup-shadow-x}*/ 1px /*{c-bup-shadow-y}*/ 1px /*{c-bup-shadow-radius}*/ #f6f6f6 /*{c-bup-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #fdfdfd /*{c-bup-background-start}*/), to( #eee /*{c-bup-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient(#fdfdfd /*{c-bup-background-start}*/, #eee /*{c-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient(#fdfdfd /*{c-bup-background-start}*/, #eee /*{c-bup-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient(#fdfdfd /*{c-bup-background-start}*/, #eee /*{c-bup-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient(#fdfdfd /*{c-bup-background-start}*/, #eee /*{c-bup-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient(#fdfdfd /*{c-bup-background-start}*/, #eee /*{c-bup-background-end}*/);
-}
+ color: #222 /*{c-bup-color}*/;
+ text-shadow: 0 /*{c-bup-shadow-x}*/ 1px /*{c-bup-shadow-y}*/ 0 /*{c-bup-shadow-radius}*/ #fff /*{c-bup-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #fff /*{c-bup-background-start}*/), to( #f1f1f1 /*{c-bup-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #fff /*{c-bup-background-start}*/, #f1f1f1 /*{c-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #fff /*{c-bup-background-start}*/, #f1f1f1 /*{c-bup-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #fff /*{c-bup-background-start}*/, #f1f1f1 /*{c-bup-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #fff /*{c-bup-background-start}*/, #f1f1f1 /*{c-bup-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #fff /*{c-bup-background-start}*/, #f1f1f1 /*{c-bup-background-end}*/);
+}
+.ui-btn-up-c:visited,
.ui-btn-up-c a.ui-link-inherit {
- color: #2F3E46 /*{c-bup-color}*/;
+ color: #2f3e46 /*{c-bup-color}*/;
}
-
.ui-btn-hover-c {
- border: 1px solid #bbbbbb /*{c-bhover-border}*/;
- background: #dadada /*{c-bhover-background-color}*/;
+ border: 1px solid #bbb /*{c-bhover-border}*/;
+ background: #dfdfdf /*{c-bhover-background-color}*/;
font-weight: bold;
- color: #101010 /*{c-bhover-color}*/;
- text-shadow: 0 /*{c-bhover-shadow-x}*/ 1px /*{c-bhover-shadow-y}*/ 1px /*{c-bhover-shadow-radius}*/ #fff /*{c-bhover-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #ededed /*{c-bhover-background-start}*/), to( #dadada /*{c-bhover-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient(#ededed /*{c-bhover-background-start}*/, #dadada /*{c-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient(#ededed /*{c-bhover-background-start}*/, #dadada /*{c-bhover-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient(#ededed /*{c-bhover-background-start}*/, #dadada /*{c-bhover-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient(#ededed /*{c-bhover-background-start}*/, #dadada /*{c-bhover-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient(#ededed /*{c-bhover-background-start}*/, #dadada /*{c-bhover-background-end}*/);
-}
+ color: #222 /*{c-bhover-color}*/;
+ text-shadow: 0 /*{c-bhover-shadow-x}*/ 1px /*{c-bhover-shadow-y}*/ 0 /*{c-bhover-shadow-radius}*/ #fff /*{c-bhover-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #f6f6f6 /*{c-bhover-background-start}*/), to( #e0e0e0 /*{c-bhover-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #f6f6f6 /*{c-bhover-background-start}*/, #e0e0e0 /*{c-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #f6f6f6 /*{c-bhover-background-start}*/, #e0e0e0 /*{c-bhover-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #f6f6f6 /*{c-bhover-background-start}*/, #e0e0e0 /*{c-bhover-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #f6f6f6 /*{c-bhover-background-start}*/, #e0e0e0 /*{c-bhover-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #f6f6f6 /*{c-bhover-background-start}*/, #e0e0e0 /*{c-bhover-background-end}*/);
+}
+.ui-btn-hover-c:visited,
+.ui-btn-hover-c:hover,
.ui-btn-hover-c a.ui-link-inherit {
- color: #2F3E46 /*{c-bhover-color}*/;
+ color: #2f3e46 /*{c-bhover-color}*/;
}
.ui-btn-down-c {
- border: 1px solid #808080 /*{c-bdown-border}*/;
- background: #fdfdfd /*{c-bdown-background-color}*/;
+ border: 1px solid #bbb /*{c-bdown-border}*/;
+ background: #d6d6d6 /*{c-bdown-background-color}*/;
font-weight: bold;
- color: #111111 /*{c-bdown-color}*/;
- text-shadow: 0 /*{c-bdown-shadow-x}*/ 1px /*{c-bdown-shadow-y}*/ 1px /*{c-bdown-shadow-radius}*/ #ffffff /*{c-bdown-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #eee /*{c-bdown-background-start}*/), to( #fdfdfd /*{c-bdown-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient(#eee /*{c-bdown-background-start}*/, #fdfdfd /*{c-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient(#eee /*{c-bdown-background-start}*/, #fdfdfd /*{c-bdown-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient(#eee /*{c-bdown-background-start}*/, #fdfdfd /*{c-bdown-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient(#eee /*{c-bdown-background-start}*/, #fdfdfd /*{c-bdown-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient(#eee /*{c-bdown-background-start}*/, #fdfdfd /*{c-bdown-background-end}*/);
-}
+ color: #222 /*{c-bdown-color}*/;
+ text-shadow: 0 /*{c-bdown-shadow-x}*/ 1px /*{c-bdown-shadow-y}*/ 0 /*{c-bdown-shadow-radius}*/ #fff /*{c-bdown-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #d0d0d0 /*{c-bdown-background-start}*/), to( #dfdfdf /*{c-bdown-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #d0d0d0 /*{c-bdown-background-start}*/, #dfdfdf /*{c-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #d0d0d0 /*{c-bdown-background-start}*/, #dfdfdf /*{c-bdown-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #d0d0d0 /*{c-bdown-background-start}*/, #dfdfdf /*{c-bdown-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #d0d0d0 /*{c-bdown-background-start}*/, #dfdfdf /*{c-bdown-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #d0d0d0 /*{c-bdown-background-start}*/, #dfdfdf /*{c-bdown-background-end}*/);
+}
+.ui-btn-down-c:visited,
+.ui-btn-down-c:hover,
.ui-btn-down-c a.ui-link-inherit {
- color: #2F3E46 /*{c-bdown-color}*/;
+ color: #2f3e46 /*{c-bdown-color}*/;
}
.ui-btn-up-c,
.ui-btn-hover-c,
@@ -431,22 +424,20 @@
font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
text-decoration: none;
}
-
-
/* D
-----------------------------------------------------------------------------------------------------------*/
-
.ui-bar-d {
- border: 1px solid #ccc /*{d-bar-border}*/;
+ border: 1px solid #bbb /*{d-bar-border}*/;
background: #bbb /*{d-bar-background-color}*/;
color: #333 /*{d-bar-color}*/;
+ font-weight: bold;
text-shadow: 0 /*{d-bar-shadow-x}*/ 1px /*{d-bar-shadow-y}*/ 0 /*{d-bar-shadow-radius}*/ #eee /*{d-bar-shadow-color}*/;
background-image: -webkit-gradient(linear, left top, left bottom, from( #ddd /*{d-bar-background-start}*/), to( #bbb /*{d-bar-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient(#ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient(#ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient(#ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient(#ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient(#ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/);
+ background-image: -webkit-linear-gradient( #ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/);
}
.ui-bar-d,
.ui-bar-d input,
@@ -455,39 +446,38 @@
.ui-bar-d button {
font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
}
-
.ui-bar-d .ui-link-inherit {
- color: #333333 /*{d-bar-color}*/;
+ color: #333 /*{d-bar-color}*/;
}
-.ui-bar-d .ui-link {
- color: #2489CE /*{d-bar-link-color}*/;
+.ui-bar-d a.ui-link {
+ color: #2489ce /*{d-bar-link-color}*/;
font-weight: bold;
}
-
-.ui-bar-d .ui-link:hover {
- color: #2489CE /*{d-bar-link-hover}*/;
+.ui-bar-d a.ui-link:visited {
+ color: #2489ce /*{d-bar-link-visited}*/;
}
-
-.ui-bar-d .ui-link:active {
- color: #2489CE /*{d-bar-link-active}*/;
+.ui-bar-d a.ui-link:hover {
+ color: #2489ce /*{d-bar-link-hover}*/;
}
-
-.ui-bar-d .ui-link:visited {
- color: #2489CE /*{d-bar-link-visited}*/;
+.ui-bar-d a.ui-link:active {
+ color: #2489ce /*{d-bar-link-active}*/;
}
-
.ui-body-d,
-.ui-dialog.ui-overlay-d {
- border: 1px solid #ccc /*{d-body-border}*/;
- color: #333333 /*{d-body-color}*/;
+.ui-overlay-d {
+ border: 1px solid #bbb /*{d-body-border}*/;
+ color: #333 /*{d-body-color}*/;
text-shadow: 0 /*{d-body-shadow-x}*/ 1px /*{d-body-shadow-y}*/ 0 /*{d-body-shadow-radius}*/ #fff /*{d-body-shadow-color}*/;
- background: #ffffff /*{d-body-background-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #fff), to( #fff /*{d-body-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient(#fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient(#fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient(#fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient(#fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient(#fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/);
+ background: #fff /*{d-body-background-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #fff /*{d-body-background-start}*/), to( #fff /*{d-body-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/);
+}
+.ui-overlay-d {
+ background-image: none;
+ border-width: 0;
}
.ui-body-d,
.ui-body-d input,
@@ -496,76 +486,75 @@
.ui-body-d button {
font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
}
-
.ui-body-d .ui-link-inherit {
- color: #333333 /*{d-body-color}*/;
+ color: #333 /*{d-body-color}*/;
}
-
.ui-body-d .ui-link {
- color: #2489CE /*{d-body-link-color}*/;
+ color: #2489ce /*{d-body-link-color}*/;
font-weight: bold;
}
-
+.ui-body-d .ui-link:visited {
+ color: #2489ce /*{d-body-link-visited}*/;
+}
.ui-body-d .ui-link:hover {
- color: #2489CE /*{d-body-link-hover}*/;
+ color: #2489ce /*{d-body-link-hover}*/;
}
-
.ui-body-d .ui-link:active {
- color: #2489CE /*{d-body-link-active}*/;
+ color: #2489ce /*{d-body-link-active}*/;
}
-
-.ui-body-d .ui-link:visited {
- color: #2489CE /*{d-body-link-visited}*/;
-}
-
.ui-btn-up-d {
- border: 1px solid #ccc /*{d-bup-border}*/;
+ border: 1px solid #bbb /*{d-bup-border}*/;
background: #fff /*{d-bup-background-color}*/;
font-weight: bold;
- color: #444 /*{d-bup-color}*/;
- text-shadow: 0 /*{d-bup-shadow-x}*/ 1px /*{d-bup-shadow-y}*/ 1px /*{d-bup-shadow-radius}*/ #fff /*{d-bup-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #fff), to( #fff /*{d-bup-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient(#fff /*{d-bup-background-start}*/, #fff /*{d-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient(#fff /*{d-bup-background-start}*/, #fff /*{d-bup-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient(#fff /*{d-bup-background-start}*/, #fff /*{d-bup-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient(#fff /*{d-bup-background-start}*/, #fff /*{d-bup-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient(#fff /*{d-bup-background-start}*/, #fff /*{d-bup-background-end}*/);
-}
+ color: #333 /*{d-bup-color}*/;
+ text-shadow: 0 /*{d-bup-shadow-x}*/ 1px /*{d-bup-shadow-y}*/ 0 /*{d-bup-shadow-radius}*/ #fff /*{d-bup-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #fafafa /*{d-bup-background-start}*/), to( #f6f6f6 /*{d-bup-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #fafafa /*{d-bup-background-start}*/, #f6f6f6 /*{d-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #fafafa /*{d-bup-background-start}*/, #f6f6f6 /*{d-bup-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #fafafa /*{d-bup-background-start}*/, #f6f6f6 /*{d-bup-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #fafafa /*{d-bup-background-start}*/, #f6f6f6 /*{d-bup-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #fafafa /*{d-bup-background-start}*/, #f6f6f6 /*{d-bup-background-end}*/);
+}
+.ui-btn-up-d:visited,
.ui-btn-up-d a.ui-link-inherit {
color: #333 /*{d-bup-color}*/;
}
.ui-btn-hover-d {
border: 1px solid #aaa /*{d-bhover-border}*/;
- background: #eeeeee /*{d-bhover-background-color}*/;
+ background: #eee /*{d-bhover-background-color}*/;
font-weight: bold;
- color: #222 /*{d-bhover-color}*/;
+ color: #333 /*{d-bhover-color}*/;
cursor: pointer;
- text-shadow: 0 /*{d-bhover-shadow-x}*/ 1px /*{d-bhover-shadow-y}*/ 1px /*{d-bhover-shadow-radius}*/ #fff /*{d-bhover-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #fdfdfd), to( #eee /*{d-bhover-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient(#fdfdfd /*{d-bhover-background-start}*/, #eee /*{d-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient(#fdfdfd /*{d-bhover-background-start}*/, #eee /*{d-bhover-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient(#fdfdfd /*{d-bhover-background-start}*/, #eee /*{d-bhover-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient(#fdfdfd /*{d-bhover-background-start}*/, #eee /*{d-bhover-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient(#fdfdfd /*{d-bhover-background-start}*/, #eee /*{d-bhover-background-end}*/);
-}
+ text-shadow: 0 /*{d-bhover-shadow-x}*/ 1px /*{d-bhover-shadow-y}*/ 0 /*{d-bhover-shadow-radius}*/ #fff /*{d-bhover-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #eee /*{d-bhover-background-start}*/), to( #fff /*{d-bhover-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #eee /*{d-bhover-background-start}*/, #fff /*{d-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #eee /*{d-bhover-background-start}*/, #fff /*{d-bhover-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #eee /*{d-bhover-background-start}*/, #fff /*{d-bhover-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #eee /*{d-bhover-background-start}*/, #fff /*{d-bhover-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #eee /*{d-bhover-background-start}*/, #fff /*{d-bhover-background-end}*/);
+}
+.ui-btn-hover-d:visited,
+.ui-btn-hover-d:hover,
.ui-btn-hover-d a.ui-link-inherit {
- color: #222 /*{d-bhover-color}*/;
+ color: #333 /*{d-bhover-color}*/;
}
.ui-btn-down-d {
- border: 1px solid #aaaaaa /*{d-bdown-border}*/;
- background: #ffffff /*{d-bdown-background-color}*/;
+ border: 1px solid #aaa /*{d-bdown-border}*/;
+ background: #eee /*{d-bdown-background-color}*/;
font-weight: bold;
- color: #111 /*{d-bdown-color}*/;
- text-shadow: 0 /*{d-bdown-shadow-x}*/ 1px /*{d-bdown-shadow-y}*/ 1px /*{d-bdown-shadow-radius}*/ #ffffff /*{d-bdown-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #eee /*{d-bdown-background-start}*/), to( #fff /*{d-bdown-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient(#eee /*{d-bdown-background-start}*/, #fff /*{d-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient(#eee /*{d-bdown-background-start}*/, #fff /*{d-bdown-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient(#eee /*{d-bdown-background-start}*/, #fff /*{d-bdown-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient(#eee /*{d-bdown-background-start}*/, #fff /*{d-bdown-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient(#eee /*{d-bdown-background-start}*/, #fff /*{d-bdown-background-end}*/);
-}
+ color: #333 /*{d-bdown-color}*/;
+ text-shadow: 0 /*{d-bdown-shadow-x}*/ 1px /*{d-bdown-shadow-y}*/ 0 /*{d-bdown-shadow-radius}*/ #fff /*{d-bdown-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #e5e5e5 /*{d-bdown-background-start}*/), to( #f2f2f2 /*{d-bdown-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #e5e5e5 /*{d-bdown-background-start}*/, #f2f2f2 /*{d-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #e5e5e5 /*{d-bdown-background-start}*/, #f2f2f2 /*{d-bdown-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #e5e5e5 /*{d-bdown-background-start}*/, #f2f2f2 /*{d-bdown-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #e5e5e5 /*{d-bdown-background-start}*/, #f2f2f2 /*{d-bdown-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #e5e5e5 /*{d-bdown-background-start}*/, #f2f2f2 /*{d-bdown-background-end}*/);
+}
+.ui-btn-down-d:visited,
+.ui-btn-down-d:hover,
.ui-btn-down-d a.ui-link-inherit {
- color: #111 /*{d-bdown-color}*/;
+ color: #333 /*{d-bdown-color}*/;
}
.ui-btn-up-d,
.ui-btn-hover-d,
@@ -573,22 +562,20 @@
font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
text-decoration: none;
}
-
-
/* E
-----------------------------------------------------------------------------------------------------------*/
-
.ui-bar-e {
- border: 1px solid #F7C942 /*{e-bar-border}*/;
+ border: 1px solid #f7c942 /*{e-bar-border}*/;
background: #fadb4e /*{e-bar-background-color}*/;
color: #333 /*{e-bar-color}*/;
+ font-weight: bold;
text-shadow: 0 /*{e-bar-shadow-x}*/ 1px /*{e-bar-shadow-y}*/ 0 /*{e-bar-shadow-radius}*/ #fff /*{e-bar-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #fceda7 /*{e-bar-background-start}*/), to( #fadb4e /*{e-bar-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient(#fceda7 /*{e-bar-background-start}*/, #fadb4e /*{e-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient(#fceda7 /*{e-bar-background-start}*/, #fadb4e /*{e-bar-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient(#fceda7 /*{e-bar-background-start}*/, #fadb4e /*{e-bar-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient(#fceda7 /*{e-bar-background-start}*/, #fadb4e /*{e-bar-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient(#fceda7 /*{e-bar-background-start}*/, #fadb4e /*{e-bar-background-end}*/);
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #fceda7 /*{e-bar-background-start}*/), to( #fbef7e /*{e-bar-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #fceda7 /*{e-bar-background-start}*/, #fbef7e /*{e-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #fceda7 /*{e-bar-background-start}*/, #fbef7e /*{e-bar-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #fceda7 /*{e-bar-background-start}*/, #fbef7e /*{e-bar-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #fceda7 /*{e-bar-background-start}*/, #fbef7e /*{e-bar-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #fceda7 /*{e-bar-background-start}*/, #fbef7e /*{e-bar-background-end}*/);
}
.ui-bar-e,
.ui-bar-e input,
@@ -598,37 +585,37 @@
font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
}
.ui-bar-e .ui-link-inherit {
- color: #333333 /*{e-bar-color}*/;
+ color: #333 /*{e-bar-color}*/;
}
-.ui-bar-e .ui-link {
- color: #2489CE /*{e-bar-link-color}*/;
+.ui-bar-e a.ui-link {
+ color: #2489ce /*{e-bar-link-color}*/;
font-weight: bold;
}
-
-.ui-bar-e .ui-link:hover {
- color: #2489CE /*{e-bar-link-hover}*/;
+.ui-bar-e a.ui-link:visited {
+ color: #2489ce /*{e-bar-link-visited}*/;
}
-
-.ui-bar-e .ui-link:active {
- color: #2489CE /*{e-bar-link-active}*/;
+.ui-bar-e a.ui-link:hover {
+ color: #2489ce /*{e-bar-link-hover}*/;
}
-
-.ui-bar-e .ui-link:visited {
- color: #2489CE /*{e-bar-link-visited}*/;
+.ui-bar-e a.ui-link:active {
+ color: #2489ce /*{e-bar-link-active}*/;
}
-
.ui-body-e,
-.ui-dialog.ui-overlay-e {
- border: 1px solid #F7C942 /*{e-body-border}*/;
- color: #333333 /*{e-body-color}*/;
+.ui-overlay-e {
+ border: 1px solid #f7c942 /*{e-body-border}*/;
+ color: #222 /*{e-body-color}*/;
text-shadow: 0 /*{e-body-shadow-x}*/ 1px /*{e-body-shadow-y}*/ 0 /*{e-body-shadow-radius}*/ #fff /*{e-body-shadow-color}*/;
- background: #faeb9e /*{e-body-background-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #fff /*{e-body-background-start}*/), to( #faeb9e /*{e-body-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient(#fff /*{e-body-background-start}*/, #faeb9e /*{e-body-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient(#fff /*{e-body-background-start}*/, #faeb9e /*{e-body-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient(#fff /*{e-body-background-start}*/, #faeb9e /*{e-body-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient(#fff /*{e-body-background-start}*/, #faeb9e /*{e-body-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient(#fff /*{e-body-background-start}*/, #faeb9e /*{e-body-background-end}*/);
+ background: #fff9df /*{e-body-background-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #fffadf /*{e-body-background-start}*/), to( #fff3a5 /*{e-body-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #fffadf /*{e-body-background-start}*/, #fff3a5 /*{e-body-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #fffadf /*{e-body-background-start}*/, #fff3a5 /*{e-body-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #fffadf /*{e-body-background-start}*/, #fff3a5 /*{e-body-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #fffadf /*{e-body-background-start}*/, #fff3a5 /*{e-body-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #fffadf /*{e-body-background-start}*/, #fff3a5 /*{e-body-background-end}*/);
+}
+.ui-overlay-e {
+ background-image: none;
+ border-width: 0;
}
.ui-body-e,
.ui-body-e input,
@@ -638,72 +625,71 @@
font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
}
.ui-body-e .ui-link-inherit {
- color: #333333 /*{e-body-color}*/;
+ color: #222 /*{e-body-color}*/;
}
-
.ui-body-e .ui-link {
- color: #2489CE /*{e-body-link-color}*/;
+ color: #2489ce /*{e-body-link-color}*/;
font-weight: bold;
}
-
+.ui-body-e .ui-link:visited {
+ color: #2489ce /*{e-body-link-visited}*/;
+}
.ui-body-e .ui-link:hover {
- color: #2489CE /*{e-body-link-hover}*/;
+ color: #2489ce /*{e-body-link-hover}*/;
}
-
.ui-body-e .ui-link:active {
- color: #2489CE /*{e-body-link-active}*/;
-}
-
-.ui-body-e .ui-link:visited {
- color: #2489CE /*{e-body-link-visited}*/;
+ color: #2489ce /*{e-body-link-active}*/;
}
-
.ui-btn-up-e {
- border: 1px solid #F7C942 /*{e-bup-border}*/;
+ border: 1px solid #f4c63f /*{e-bup-border}*/;
background: #fadb4e /*{e-bup-background-color}*/;
font-weight: bold;
- color: #333 /*{e-bup-color}*/;
+ color: #222 /*{e-bup-color}*/;
text-shadow: 0 /*{e-bup-shadow-x}*/ 1px /*{e-bup-shadow-y}*/ 0 /*{e-bup-shadow-radius}*/ #fff /*{e-bup-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #fceda7 /*{e-bup-background-start}*/), to( #fadb4e /*{e-bup-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient(#fceda7 /*{e-bup-background-start}*/, #fadb4e /*{e-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient(#fceda7 /*{e-bup-background-start}*/, #fadb4e /*{e-bup-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient(#fceda7 /*{e-bup-background-start}*/, #fadb4e /*{e-bup-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient(#fceda7 /*{e-bup-background-start}*/, #fadb4e /*{e-bup-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient(#fceda7 /*{e-bup-background-start}*/, #fadb4e /*{e-bup-background-end}*/);
-}
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #ffefaa /*{e-bup-background-start}*/), to( #ffe155 /*{e-bup-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #ffefaa /*{e-bup-background-start}*/, #ffe155 /*{e-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #ffefaa /*{e-bup-background-start}*/, #ffe155 /*{e-bup-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #ffefaa /*{e-bup-background-start}*/, #ffe155 /*{e-bup-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #ffefaa /*{e-bup-background-start}*/, #ffe155 /*{e-bup-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #ffefaa /*{e-bup-background-start}*/, #ffe155 /*{e-bup-background-end}*/);
+}
+.ui-btn-up-e:visited,
.ui-btn-up-e a.ui-link-inherit {
- color: #333 /*{e-bup-color}*/;
+ color: #222 /*{e-bup-color}*/;
}
.ui-btn-hover-e {
- border: 1px solid #e79952 /*{e-bhover-border}*/;
+ border: 1px solid #f2c43d /*{e-bhover-border}*/;
background: #fbe26f /*{e-bhover-background-color}*/;
font-weight: bold;
color: #111 /*{e-bhover-color}*/;
- text-shadow: 0 /*{e-bhover-shadow-x}*/ 1px /*{e-bhover-shadow-y}*/ 1px /*{e-bhover-shadow-radius}*/ #fff /*{e-bhover-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #fcf0b5 /*{e-bhover-background-start}*/), to( #fbe26f /*{e-bhover-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient(#fcf0b5 /*{e-bhover-background-start}*/, #fbe26f /*{e-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient(#fcf0b5 /*{e-bhover-background-start}*/, #fbe26f /*{e-bhover-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient(#fcf0b5 /*{e-bhover-background-start}*/, #fbe26f /*{e-bhover-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient(#fcf0b5 /*{e-bhover-background-start}*/, #fbe26f /*{e-bhover-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient(#fcf0b5 /*{e-bhover-background-start}*/, #fbe26f /*{e-bhover-background-end}*/);
-}
-
+ text-shadow: 0 /*{e-bhover-shadow-x}*/ 1px /*{e-bhover-shadow-y}*/ 0 /*{e-bhover-shadow-radius}*/ #fff /*{e-bhover-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #fff5ba /*{e-bhover-background-start}*/), to( #fbdd52 /*{e-bhover-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #fff5ba /*{e-bhover-background-start}*/, #fbdd52 /*{e-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #fff5ba /*{e-bhover-background-start}*/, #fbdd52 /*{e-bhover-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #fff5ba /*{e-bhover-background-start}*/, #fbdd52 /*{e-bhover-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #fff5ba /*{e-bhover-background-start}*/, #fbdd52 /*{e-bhover-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #fff5ba /*{e-bhover-background-start}*/, #fbdd52 /*{e-bhover-background-end}*/);
+}
+.ui-btn-hover-e:visited,
+.ui-btn-hover-e:hover,
.ui-btn-hover-e a.ui-link-inherit {
color: #333 /*{e-bhover-color}*/;
}
.ui-btn-down-e {
- border: 1px solid #F7C942 /*{e-bdown-border}*/;
+ border: 1px solid #f2c43d /*{e-bdown-border}*/;
background: #fceda7 /*{e-bdown-background-color}*/;
font-weight: bold;
color: #111 /*{e-bdown-color}*/;
- text-shadow: 0 /*{e-bdown-shadow-x}*/ 1px /*{e-bdown-shadow-y}*/ 1px /*{e-bdown-shadow-radius}*/ #ffffff /*{e-bdown-shadow-color}*/;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #fadb4e /*{e-bdown-background-start}*/), to( #fceda7 /*{e-bdown-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient(#fadb4e /*{e-bdown-background-start}*/, #fceda7 /*{e-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient(#fadb4e /*{e-bdown-background-start}*/, #fceda7 /*{e-bdown-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient(#fadb4e /*{e-bdown-background-start}*/, #fceda7 /*{e-bdown-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient(#fadb4e /*{e-bdown-background-start}*/, #fceda7 /*{e-bdown-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient(#fadb4e /*{e-bdown-background-start}*/, #fceda7 /*{e-bdown-background-end}*/);
-}
+ text-shadow: 0 /*{e-bdown-shadow-x}*/ 1px /*{e-bdown-shadow-y}*/ 0 /*{e-bdown-shadow-radius}*/ #fff /*{e-bdown-shadow-color}*/;
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #f8d94c /*{e-bdown-background-start}*/), to( #fadb4e /*{e-bdown-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #f8d94c /*{e-bdown-background-start}*/, #fadb4e /*{e-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #f8d94c /*{e-bdown-background-start}*/, #fadb4e /*{e-bdown-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #f8d94c /*{e-bdown-background-start}*/, #fadb4e /*{e-bdown-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #f8d94c /*{e-bdown-background-start}*/, #fadb4e /*{e-bdown-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #f8d94c /*{e-bdown-background-start}*/, #fadb4e /*{e-bdown-background-end}*/);
+}
+.ui-btn-down-e:visited,
+.ui-btn-down-e:hover,
.ui-btn-down-e a.ui-link-inherit {
color: #333 /*{e-bdown-color}*/;
}
@@ -713,263 +699,274 @@
font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
text-decoration: none;
}
-
/* Structure */
-
/* links within "buttons"
-----------------------------------------------------------------------------------------------------------*/
-
a.ui-link-inherit {
text-decoration: none !important;
}
-
-
/* Active class used as the "on" state across all themes
-----------------------------------------------------------------------------------------------------------*/
-
.ui-btn-active {
- border: 1px solid #155678 /*{global-active-border}*/;
- background: #4596ce /*{global-active-background-color}*/;
+ border: 1px solid #2373a5 /*{global-active-border}*/;
+ background: #5393c5 /*{global-active-background-color}*/;
font-weight: bold;
color: #fff /*{global-active-color}*/;
cursor: pointer;
- text-shadow: 0 /*{global-active-shadow-x}*/ -1px /*{global-active-shadow-y}*/ 1px /*{global-active-shadow-radius}*/ #145072 /*{global-active-shadow-color}*/;
+ text-shadow: 0 /*{global-active-shadow-x}*/ 1px /*{global-active-shadow-y}*/ 0 /*{global-active-shadow-radius}*/ #3373a5 /*{global-active-shadow-color}*/;
text-decoration: none;
- background-image: -webkit-gradient(linear, left top, left bottom, from( #85bae4 /*{global-active-background-start}*/), to( #5393c5 /*{global-active-background-end}*/)); /* Saf4+, Chrome */
- background-image: -webkit-linear-gradient(#85bae4 /*{global-active-background-start}*/, #5393c5 /*{global-active-background-end}*/); /* Chrome 10+, Saf5.1+ */
- background-image: -moz-linear-gradient(#85bae4 /*{global-active-background-start}*/, #5393c5 /*{global-active-background-end}*/); /* FF3.6 */
- background-image: -ms-linear-gradient(#85bae4 /*{global-active-background-start}*/, #5393c5 /*{global-active-background-end}*/); /* IE10 */
- background-image: -o-linear-gradient(#85bae4 /*{global-active-background-start}*/, #5393c5 /*{global-active-background-end}*/); /* Opera 11.10+ */
- background-image: linear-gradient(#85bae4 /*{global-active-background-start}*/, #5393c5 /*{global-active-background-end}*/);
+ background-image: -webkit-gradient(linear, left top, left bottom, from( #5393c5 /*{global-active-background-start}*/), to( #6facd5 /*{global-active-background-end}*/)); /* Saf4+, Chrome */
+ background-image: -webkit-linear-gradient( #5393c5 /*{global-active-background-start}*/, #6facd5 /*{global-active-background-end}*/); /* Chrome 10+, Saf5.1+ */
+ background-image: -moz-linear-gradient( #5393c5 /*{global-active-background-start}*/, #6facd5 /*{global-active-background-end}*/); /* FF3.6 */
+ background-image: -ms-linear-gradient( #5393c5 /*{global-active-background-start}*/, #6facd5 /*{global-active-background-end}*/); /* IE10 */
+ background-image: -o-linear-gradient( #5393c5 /*{global-active-background-start}*/, #6facd5 /*{global-active-background-end}*/); /* Opera 11.10+ */
+ background-image: linear-gradient( #5393c5 /*{global-active-background-start}*/, #6facd5 /*{global-active-background-end}*/);
font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
}
+.ui-btn-active:visited,
+.ui-btn-active:hover,
.ui-btn-active a.ui-link-inherit {
color: #fff /*{global-active-color}*/;
}
-
-
/* button inner top highlight
-----------------------------------------------------------------------------------------------------------*/
-
.ui-btn-inner {
border-top: 1px solid #fff;
border-color: rgba(255,255,255,.3);
}
-
-
/* corner rounding classes
-----------------------------------------------------------------------------------------------------------*/
-
-.ui-corner-tl {
- -moz-border-radius-topleft: .6em /*{global-radii-blocks}*/;
- -webkit-border-top-left-radius: .6em /*{global-radii-blocks}*/;
- border-top-left-radius: .6em /*{global-radii-blocks}*/;
-}
-.ui-corner-tr {
- -moz-border-radius-topright: .6em /*{global-radii-blocks}*/;
- -webkit-border-top-right-radius: .6em /*{global-radii-blocks}*/;
- border-top-right-radius: .6em /*{global-radii-blocks}*/;
-}
-.ui-corner-bl {
- -moz-border-radius-bottomleft: .6em /*{global-radii-blocks}*/;
- -webkit-border-bottom-left-radius: .6em /*{global-radii-blocks}*/;
- border-bottom-left-radius: .6em /*{global-radii-blocks}*/;
-}
-.ui-corner-br {
- -moz-border-radius-bottomright: .6em /*{global-radii-blocks}*/;
- -webkit-border-bottom-right-radius: .6em /*{global-radii-blocks}*/;
- border-bottom-right-radius: .6em /*{global-radii-blocks}*/;
-}
-.ui-corner-top {
- -moz-border-radius-topleft: .6em /*{global-radii-blocks}*/;
- -webkit-border-top-left-radius: .6em /*{global-radii-blocks}*/;
- border-top-left-radius: .6em /*{global-radii-blocks}*/;
- -moz-border-radius-topright: .6em /*{global-radii-blocks}*/;
- -webkit-border-top-right-radius: .6em /*{global-radii-blocks}*/;
- border-top-right-radius: .6em /*{global-radii-blocks}*/;
-}
-.ui-corner-bottom {
- -moz-border-radius-bottomleft: .6em /*{global-radii-blocks}*/;
- -webkit-border-bottom-left-radius: .6em /*{global-radii-blocks}*/;
- border-bottom-left-radius: .6em /*{global-radii-blocks}*/;
- -moz-border-radius-bottomright: .6em /*{global-radii-blocks}*/;
- -webkit-border-bottom-right-radius: .6em /*{global-radii-blocks}*/;
- border-bottom-right-radius: .6em /*{global-radii-blocks}*/;
- }
-.ui-corner-right {
- -moz-border-radius-topright: .6em /*{global-radii-blocks}*/;
- -webkit-border-top-right-radius: .6em /*{global-radii-blocks}*/;
- border-top-right-radius: .6em /*{global-radii-blocks}*/;
- -moz-border-radius-bottomright: .6em /*{global-radii-blocks}*/;
- -webkit-border-bottom-right-radius: .6em /*{global-radii-blocks}*/;
- border-bottom-right-radius: .6em /*{global-radii-blocks}*/;
-}
-.ui-corner-left {
- -moz-border-radius-topleft: .6em /*{global-radii-blocks}*/;
- -webkit-border-top-left-radius: .6em /*{global-radii-blocks}*/;
- border-top-left-radius: .6em /*{global-radii-blocks}*/;
- -moz-border-radius-bottomleft: .6em /*{global-radii-blocks}*/;
- -webkit-border-bottom-left-radius: .6em /*{global-radii-blocks}*/;
- border-bottom-left-radius: .6em /*{global-radii-blocks}*/;
-}
.ui-corner-all {
- -moz-border-radius: .6em /*{global-radii-blocks}*/;
-webkit-border-radius: .6em /*{global-radii-blocks}*/;
border-radius: .6em /*{global-radii-blocks}*/;
}
-.ui-corner-none {
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- border-radius: 0;
-}
-
/* Form field separator
-----------------------------------------------------------------------------------------------------------*/
.ui-br {
- border-bottom: rgb(130,130,130);
- border-bottom: rgba(130,130,130,.3);
- border-bottom-width: 1px;
- border-bottom-style: solid;
+ border-color: rgb(130,130,130);
+ border-color: rgba(130,130,130,.3);
+ border-style: solid;
}
-
/* Interaction cues
-----------------------------------------------------------------------------------------------------------*/
.ui-disabled {
- opacity: .3;
+ filter: Alpha(Opacity=30);
+ opacity: .3;
+ zoom: 1;
}
.ui-disabled,
.ui-disabled a {
+ cursor: default !important;
pointer-events: none;
- cursor: default;
}
-
/* Icons
-----------------------------------------------------------------------------------------------------------*/
-
.ui-icon,
.ui-icon-searchfield:after {
- background: #666 /*{global-icon-color}*/;
- background: rgba(0,0,0,.4) /*{global-icon-disc}*/;
+ background-color: #666 /*{global-icon-color}*/;
+ background-color: rgba(0,0,0,.4) /*{global-icon-disc}*/;
background-image: url(images/icons-18-white.png) /*{global-icon-set}*/;
background-repeat: no-repeat;
- -moz-border-radius: 9px;
-webkit-border-radius: 9px;
border-radius: 9px;
}
-
-
/* Alt icon color
-----------------------------------------------------------------------------------------------------------*/
-
-.ui-icon-alt {
- background: #fff;
- background: rgba(255,255,255,.3);
+.ui-icon-alt .ui-icon,
+.ui-icon-alt .ui-icon-searchfield:after {
+ background-color: #fff;
+ background-color: rgba(255,255,255,.3);
background-image: url(images/icons-18-black.png);
background-repeat: no-repeat;
}
-
-/* HD/"retina" sprite
+/* No disc
-----------------------------------------------------------------------------------------------------------*/
-
-@media only screen and (-webkit-min-device-pixel-ratio: 1.5),
- only screen and (min--moz-device-pixel-ratio: 1.5),
- only screen and (min-resolution: 240dpi) {
-
- .ui-icon-plus, .ui-icon-minus, .ui-icon-delete, .ui-icon-arrow-r,
- .ui-icon-arrow-l, .ui-icon-arrow-u, .ui-icon-arrow-d, .ui-icon-check,
- .ui-icon-gear, .ui-icon-refresh, .ui-icon-forward, .ui-icon-back,
- .ui-icon-grid, .ui-icon-star, .ui-icon-alert, .ui-icon-info, .ui-icon-home, .ui-icon-search, .ui-icon-searchfield:after,
- .ui-icon-checkbox-off, .ui-icon-checkbox-on, .ui-icon-radio-off, .ui-icon-radio-on {
- background-image: url(images/icons-36-white.png);
- -moz-background-size: 776px 18px;
- -o-background-size: 776px 18px;
- -webkit-background-size: 776px 18px;
- background-size: 776px 18px;
- }
- .ui-icon-alt {
- background-image: url(images/icons-36-black.png);
- }
+.ui-icon-nodisc .ui-icon,
+.ui-icon-nodisc .ui-icon-searchfield:after,
+.ui-icon-nodisc .ui-icon-alt .ui-icon,
+.ui-icon-nodisc .ui-icon-alt .ui-icon-searchfield:after {
+ background-color: transparent;
}
-
+/* Icon sprite
+-----------------------------------------------------------------------------------------------------------*/
/* plus minus */
.ui-icon-plus {
- background-position: -0 50%;
+ background-position: -1px -1px;
}
.ui-icon-minus {
- background-position: -36px 50%;
+ background-position: -37px -1px;
}
-
/* delete/close */
.ui-icon-delete {
- background-position: -72px 50%;
+ background-position: -73px -1px;
}
-
/* arrows */
.ui-icon-arrow-r {
- background-position: -108px 50%;
+ background-position: -108px -1px;
}
.ui-icon-arrow-l {
- background-position: -144px 50%;
+ background-position: -144px -1px;
}
.ui-icon-arrow-u {
- background-position: -180px 50%;
+ background-position: -180px -1px;
}
.ui-icon-arrow-d {
- background-position: -216px 50%;
+ background-position: -216px -1px;
}
-
/* misc */
.ui-icon-check {
- background-position: -252px 50%;
+ background-position: -252px -1px;
}
.ui-icon-gear {
- background-position: -288px 50%;
+ background-position: -288px -1px;
}
.ui-icon-refresh {
- background-position: -324px 50%;
+ background-position: -323px -1px;
}
.ui-icon-forward {
- background-position: -360px 50%;
+ background-position: -360px -1px;
}
.ui-icon-back {
- background-position: -396px 50%;
+ background-position: -396px -1px;
}
.ui-icon-grid {
- background-position: -432px 50%;
+ background-position: -432px -1px;
}
.ui-icon-star {
- background-position: -468px 50%;
+ background-position: -467px -1px;
}
.ui-icon-alert {
- background-position: -504px 50%;
+ background-position: -503px -1px;
}
.ui-icon-info {
- background-position: -540px 50%;
+ background-position: -539px -1px;
}
.ui-icon-home {
- background-position: -576px 50%;
+ background-position: -575px -1px;
}
+/* search */
.ui-icon-search,
.ui-icon-searchfield:after {
- background-position: -612px 50%;
+ background-position: -611px -1px;
+}
+/* checkbox radio */
+.ui-icon-checkbox-on {
+ background-position: -647px -1px;
}
.ui-icon-checkbox-off {
- background-position: -684px 50%;
+ background-position: -683px -1px;
}
-.ui-icon-checkbox-on {
- background-position: -648px 50%;
+.ui-icon-radio-on {
+ background-position: -718px -1px;
}
.ui-icon-radio-off {
- background-position: -756px 50%;
+ background-position: -754px -1px;
}
-.ui-icon-radio-on {
- background-position: -720px 50%;
+/* menu edit */
+.ui-icon-bars {
+ background-position: -788px -1px;
+}
+.ui-icon-edit {
+ background-position: -824px -1px;
+}
+/* HD/"retina" sprite
+-----------------------------------------------------------------------------------------------------------*/
+@media only screen and (-webkit-min-device-pixel-ratio: 1.3),
+ only screen and (min--moz-device-pixel-ratio: 1.3),
+ only screen and (min-resolution: 200dpi) {
+
+ .ui-icon-plus, .ui-icon-minus, .ui-icon-delete, .ui-icon-arrow-r,
+ .ui-icon-arrow-l, .ui-icon-arrow-u, .ui-icon-arrow-d, .ui-icon-check,
+ .ui-icon-gear, .ui-icon-refresh, .ui-icon-forward, .ui-icon-back,
+ .ui-icon-grid, .ui-icon-star, .ui-icon-alert, .ui-icon-info, .ui-icon-home, .ui-icon-bars, .ui-icon-edit,
+ .ui-icon-search, .ui-icon-searchfield:after,
+ .ui-icon-checkbox-off, .ui-icon-checkbox-on, .ui-icon-radio-off, .ui-icon-radio-on {
+ background-image: url(images/icons-36-white.png);
+ -moz-background-size: 864px 18px;
+ -o-background-size: 864px 18px;
+ -webkit-background-size: 864px 18px;
+ background-size: 864px 18px;
+ }
+ .ui-icon-alt .ui-icon {
+ background-image: url(images/icons-36-black.png);
+ }
+ .ui-icon-plus {
+ background-position: 0 50%;
+ }
+ .ui-icon-minus {
+ background-position: -36px 50%;
+ }
+ .ui-icon-delete {
+ background-position: -72px 50%;
+ }
+ .ui-icon-arrow-r {
+ background-position: -108px 50%;
+ }
+ .ui-icon-arrow-l {
+ background-position: -144px 50%;
+ }
+ .ui-icon-arrow-u {
+ background-position: -179px 50%;
+ }
+ .ui-icon-arrow-d {
+ background-position: -215px 50%;
+ }
+ .ui-icon-check {
+ background-position: -252px 50%;
+ }
+ .ui-icon-gear {
+ background-position: -287px 50%;
+ }
+ .ui-icon-refresh {
+ background-position: -323px 50%;
+ }
+ .ui-icon-forward {
+ background-position: -360px 50%;
+ }
+ .ui-icon-back {
+ background-position: -395px 50%;
+ }
+ .ui-icon-grid {
+ background-position: -431px 50%;
+ }
+ .ui-icon-star {
+ background-position: -467px 50%;
+ }
+ .ui-icon-alert {
+ background-position: -503px 50%;
+ }
+ .ui-icon-info {
+ background-position: -538px 50%;
+ }
+ .ui-icon-home {
+ background-position: -575px 50%;
+ }
+ .ui-icon-search,
+ .ui-icon-searchfield:after {
+ background-position: -611px 50%;
+ }
+ .ui-icon-checkbox-on {
+ background-position: -647px 50%;
+ }
+ .ui-icon-checkbox-off {
+ background-position: -683px 50%;
+ }
+ .ui-icon-radio-on {
+ background-position: -718px 50%;
+ }
+ .ui-icon-radio-off {
+ background-position: -754px 50%;
+ }
+ .ui-icon-bars {
+ background-position: -788px 50%;
+
+ }.ui-icon-edit {
+ background-position: -824px 50%;
+ }
}
-
-
/* checks,radios */
-.ui-checkbox .ui-icon {
- -moz-border-radius: 3px;
+.ui-checkbox .ui-icon,
+.ui-selectmenu-list .ui-icon {
-webkit-border-radius: 3px;
border-radius: 3px;
}
@@ -981,451 +978,609 @@ a.ui-link-inherit {
.ui-radio-on .ui-icon {
background-color: #4596ce /*{global-active-background-color}*/; /* NOTE: this hex should match the active state color. It's repeated here for cascade */
}
-
/* loading icon */
.ui-icon-loading {
- background-image: url(images/ajax-loader.png);
- width: 40px;
- height: 40px;
- -moz-border-radius: 20px;
- -webkit-border-radius: 20px;
- border-radius: 20px;
- background-size: 35px 35px;
+ background: url(images/ajax-loader.gif);
+ background-size: 46px 46px;
}
-
-
-/* Button corner classes
+/* Button corner class
-----------------------------------------------------------------------------------------------------------*/
-
-.ui-btn-corner-tl {
- -moz-border-radius-topleft: 1em /*{global-radii-buttons}*/;
- -webkit-border-top-left-radius: 1em /*{global-radii-buttons}*/;
- border-top-left-radius: 1em /*{global-radii-buttons}*/;
-}
-.ui-btn-corner-tr {
- -moz-border-radius-topright: 1em /*{global-radii-buttons}*/;
- -webkit-border-top-right-radius: 1em /*{global-radii-buttons}*/;
- border-top-right-radius: 1em /*{global-radii-buttons}*/;
-}
-.ui-btn-corner-bl {
- -moz-border-radius-bottomleft: 1em /*{global-radii-buttons}*/;
- -webkit-border-bottom-left-radius: 1em /*{global-radii-buttons}*/;
- border-bottom-left-radius: 1em /*{global-radii-buttons}*/;
-}
-.ui-btn-corner-br {
- -moz-border-radius-bottomright: 1em /*{global-radii-buttons}*/;
- -webkit-border-bottom-right-radius: 1em /*{global-radii-buttons}*/;
- border-bottom-right-radius: 1em /*{global-radii-buttons}*/;
-}
-.ui-btn-corner-top {
- -moz-border-radius-topleft: 1em /*{global-radii-buttons}*/;
- -webkit-border-top-left-radius: 1em /*{global-radii-buttons}*/;
- border-top-left-radius: 1em /*{global-radii-buttons}*/;
- -moz-border-radius-topright: 1em /*{global-radii-buttons}*/;
- -webkit-border-top-right-radius: 1em /*{global-radii-buttons}*/;
- border-top-right-radius: 1em /*{global-radii-buttons}*/;
-}
-.ui-btn-corner-bottom {
- -moz-border-radius-bottomleft: 1em /*{global-radii-buttons}*/;
- -webkit-border-bottom-left-radius: 1em /*{global-radii-buttons}*/;
- border-bottom-left-radius: 1em /*{global-radii-buttons}*/;
- -moz-border-radius-bottomright: 1em /*{global-radii-buttons}*/;
- -webkit-border-bottom-right-radius: 1em /*{global-radii-buttons}*/;
- border-bottom-right-radius: 1em /*{global-radii-buttons}*/;
-}
-.ui-btn-corner-right {
- -moz-border-radius-topright: 1em /*{global-radii-buttons}*/;
- -webkit-border-top-right-radius: 1em /*{global-radii-buttons}*/;
- border-top-right-radius: 1em /*{global-radii-buttons}*/;
- -moz-border-radius-bottomright: 1em /*{global-radii-buttons}*/;
- -webkit-border-bottom-right-radius: 1em /*{global-radii-buttons}*/;
- border-bottom-right-radius: 1em /*{global-radii-buttons}*/;
-}
-.ui-btn-corner-left {
- -moz-border-radius-topleft: 1em /*{global-radii-buttons}*/;
- -webkit-border-top-left-radius: 1em /*{global-radii-buttons}*/;
- border-top-left-radius: 1em /*{global-radii-buttons}*/;
- -moz-border-radius-bottomleft: 1em /*{global-radii-buttons}*/;
- -webkit-border-bottom-left-radius: 1em /*{global-radii-buttons}*/;
- border-bottom-left-radius: 1em /*{global-radii-buttons}*/;
-}
.ui-btn-corner-all {
- -moz-border-radius: 1em /*{global-radii-buttons}*/;
-webkit-border-radius: 1em /*{global-radii-buttons}*/;
border-radius: 1em /*{global-radii-buttons}*/;
}
-
/* radius clip workaround for cleaning up corner trapping */
-.ui-corner-tl,
-.ui-corner-tr,
-.ui-corner-bl,
-.ui-corner-br,
-.ui-corner-top,
-.ui-corner-bottom,
-.ui-corner-right,
-.ui-corner-left,
.ui-corner-all,
-.ui-btn-corner-tl,
-.ui-btn-corner-tr,
-.ui-btn-corner-bl,
-.ui-btn-corner-br,
-.ui-btn-corner-top,
-.ui-btn-corner-bottom,
-.ui-btn-corner-right,
-.ui-btn-corner-left,
.ui-btn-corner-all {
- -webkit-background-clip: padding-box;
- -moz-background-clip: padding;
- background-clip: padding-box;
+ -webkit-background-clip: padding;
+ background-clip: padding-box;
}
-
/* Overlay / modal
-----------------------------------------------------------------------------------------------------------*/
-
.ui-overlay {
background: #666;
- opacity: .5;
filter: Alpha(Opacity=50);
+ opacity: .5;
position: absolute;
width: 100%;
height: 100%;
}
.ui-overlay-shadow {
- -moz-box-shadow: 0px 0px 12px rgba(0,0,0,.6);
- -webkit-box-shadow: 0px 0px 12px rgba(0,0,0,.6);
- box-shadow: 0px 0px 12px rgba(0,0,0,.6);
+ -moz-box-shadow: 0 0 12px rgba(0,0,0,.6);
+ -webkit-box-shadow: 0 0 12px rgba(0,0,0,.6);
+ box-shadow: 0 0 12px rgba(0,0,0,.6);
}
.ui-shadow {
- -moz-box-shadow: 0px 1px 4px /*{global-box-shadow-size}*/ rgba(0,0,0,.3) /*{global-box-shadow-color}*/;
- -webkit-box-shadow: 0px 1px 4px /*{global-box-shadow-size}*/ rgba(0,0,0,.3) /*{global-box-shadow-color}*/;
- box-shadow: 0px 1px 4px /*{global-box-shadow-size}*/ rgba(0,0,0,.3) /*{global-box-shadow-color}*/;
+ -moz-box-shadow: 0 1px 3px /*{global-box-shadow-size}*/ rgba(0,0,0,.2) /*{global-box-shadow-color}*/;
+ -webkit-box-shadow: 0 1px 3px /*{global-box-shadow-size}*/ rgba(0,0,0,.2) /*{global-box-shadow-color}*/;
+ box-shadow: 0 1px 3px /*{global-box-shadow-size}*/ rgba(0,0,0,.2) /*{global-box-shadow-color}*/
}
.ui-bar-a .ui-shadow,
.ui-bar-b .ui-shadow ,
.ui-bar-c .ui-shadow {
- -moz-box-shadow: 0px 1px 0 rgba(255,255,255,.3);
- -webkit-box-shadow: 0px 1px 0 rgba(255,255,255,.3);
- box-shadow: 0px 1px 0 rgba(255,255,255,.3);
+ -moz-box-shadow: 0 1px 0 rgba(255,255,255,.3);
+ -webkit-box-shadow: 0 1px 0 rgba(255,255,255,.3);
+ box-shadow: 0 1px 0 rgba(255,255,255,.3);
}
.ui-shadow-inset {
- -moz-box-shadow: inset 0px 1px 4px rgba(0,0,0,.2);
- -webkit-box-shadow: inset 0px 1px 4px rgba(0,0,0,.2);
- box-shadow: inset 0px 1px 4px rgba(0,0,0,.2);
+ -moz-box-shadow: inset 0 1px 4px rgba(0,0,0,.2);
+ -webkit-box-shadow: inset 0 1px 4px rgba(0,0,0,.2);
+ box-shadow: inset 0 1px 4px rgba(0,0,0,.2);
}
.ui-icon-shadow {
- -moz-box-shadow: 0px 1px 0 rgba(255,255,255,.4);
- -webkit-box-shadow: 0px 1px 0 rgba(255,255,255,.4);
- box-shadow: 0px 1px 0 rgba(255,255,255,.4);
+ -moz-box-shadow: 0 1px 0 rgba(255,255,255,.4) /*{global-icon-shadow}*/;
+ -webkit-box-shadow: 0 1px 0 rgba(255,255,255,.4) /*{global-icon-shadow}*/;
+ box-shadow: 0 1px 0 rgba(255,255,255,.4) /*{global-icon-shadow}*/;
}
-
-/* Focus state - set here for specificity
+/* Focus state - set here for specificity (note: these classes are added by JavaScript)
-----------------------------------------------------------------------------------------------------------*/
-
-.ui-focus {
- -moz-box-shadow: 0px 0px 12px #387bbe /*{global-active-background-color}*/;
- -webkit-box-shadow: 0px 0px 12px #387bbe /*{global-active-background-color}*/;
- box-shadow: 0px 0px 12px #387bbe /*{global-active-background-color}*/;
+.ui-btn:focus, .ui-link-inherit:focus {
+ outline: 0;
+}
+.ui-btn.ui-focus {
+ z-index: 1;
+}
+.ui-focus,
+.ui-btn:focus {
+ -moz-box-shadow: inset 0 0 3px #387bbe /*{global-active-background-color}*/, 0 0 9px #387bbe /*{global-active-background-color}*/;
+ -webkit-box-shadow: inset 0 0 3px #387bbe /*{global-active-background-color}*/, 0 0 9px #387bbe /*{global-active-background-color}*/;
+ box-shadow: inset 0 0 3px #387bbe /*{global-active-background-color}*/, 0 0 9px #387bbe /*{global-active-background-color}*/;
+}
+.ui-input-text.ui-focus,
+.ui-input-search.ui-focus {
+ -moz-box-shadow: 0 0 12px #387bbe /*{global-active-background-color}*/;
+ -webkit-box-shadow: 0 0 12px #387bbe /*{global-active-background-color}*/;
+ box-shadow: 0 0 12px #387bbe /*{global-active-background-color}*/;
}
-
/* unset box shadow in browsers that don't do it right
-----------------------------------------------------------------------------------------------------------*/
-
.ui-mobile-nosupport-boxshadow * {
-moz-box-shadow: none !important;
-webkit-box-shadow: none !important;
box-shadow: none !important;
}
-
/* ...and bring back focus */
-.ui-mobile-nosupport-boxshadow .ui-focus {
- outline-width: 2px;
+.ui-mobile-nosupport-boxshadow .ui-focus,
+.ui-mobile-nosupport-boxshadow .ui-btn:focus,
+.ui-mobile-nosupport-boxshadow .ui-link-inherit:focus {
+ outline-width: 1px;
+ outline-style: auto;
}
/* some unsets - more probably needed */
-.ui-mobile, .ui-mobile body { height: 100%; }
+.ui-mobile, .ui-mobile body { height: 99.9%; }
.ui-mobile fieldset, .ui-page { padding: 0; margin: 0; }
.ui-mobile a img, .ui-mobile fieldset { border-width: 0; }
-
/* responsive page widths */
-.ui-mobile-viewport { margin: 0; overflow-x: visible; -webkit-text-size-adjust: none; -ms-text-size-adjust:none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); }
+.ui-mobile-viewport { margin: 0; overflow-x: visible; -webkit-text-size-adjust: 100%; -ms-text-size-adjust:none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); }
/* Issue #2066 */
body.ui-mobile-viewport,
div.ui-mobile-viewport { overflow-x: hidden; }
-
/* "page" containers - full-screen views, one should always be in view post-pageload */
.ui-mobile [data-role=page], .ui-mobile [data-role=dialog], .ui-page { top: 0; left: 0; width: 100%; min-height: 100%; position: absolute; display: none; border: 0; }
.ui-mobile .ui-page-active { display: block; overflow: visible; }
-
/* on ios4, setting focus on the page element causes flashing during transitions when there is an outline, so we turn off outlines */
.ui-page { outline: none; }
-
/*orientations from js are available */
@media screen and (orientation: portrait){
-.ui-mobile, .ui-mobile .ui-page { min-height: 420px; }
+.ui-mobile .ui-page { min-height: 420px; }
}
@media screen and (orientation: landscape){
-.ui-mobile, .ui-mobile .ui-page { min-height: 300px; }
-}
-
-/* native overflow scrolling */
-.ui-page.ui-mobile-touch-overflow,
-.ui-mobile-touch-overflow.ui-native-fixed .ui-content {
- overflow: auto;
- height: 100%;
- left: 0;
- right: 0;
- -webkit-overflow-scrolling: touch;
- -moz-overflow-scrolling: touch;
- -o-overflow-scrolling: touch;
- -ms-overflow-scrolling: touch;
- overflow-scrolling: touch;
-}
-.ui-page.ui-mobile-touch-overflow,
-.ui-page.ui-mobile-touch-overflow * {
- /* some level of transform keeps elements from blinking out of visibility on iOS */
- -webkit-transform: rotateY(0);
-}
-.ui-page.ui-mobile-pre-transition {
- display: block;
-}
-.ui-mobile-touch-overflow.ui-native-fixed .ui-content .ui-listview {
- margin-top: 0;
-}
-.ui-mobile-touch-overflow.ui-native-fixed .ui-content .ui-listview-inset {
- margin-top: 1em;
-}
-.ui-mobile-touch-overflow.ui-native-fixed .ui-content .ui-listview-filter {
- margin-top: .2em;
- margin-bottom: 0;
-}
-.ui-mobile-touch-overflow.ui-native-fixed .ui-content .ui-listview-filter-inset {
- margin-bottom: -.9em;
+.ui-mobile .ui-page { min-height: 300px; }
}
-.ui-mobile-touch-overflow.ui-native-fixed .ui-header .ui-btn {
- z-index: 10;
-}
-
/* loading screen */
-.ui-loading .ui-mobile-viewport { overflow: hidden !important; }
.ui-loading .ui-loader { display: block; }
-.ui-loading .ui-page { overflow: hidden; }
-.ui-loader { display: none; position: absolute; opacity: .85; z-index: 100; left: 50%; width: 200px; margin-left: -130px; margin-top: -35px; padding: 10px 30px; }
-.ui-loader h1 { font-size: 15px; text-align: center; }
-.ui-loader .ui-icon { position: static; display: block; opacity: .9; margin: 0 auto; width: 35px; height: 35px; background-color: transparent; }
-
+.ui-loader { display: none; z-index: 9999999; position: fixed; top: 50%; left: 50%; border:0; }
+.ui-loader-default { background: none; filter: Alpha(Opacity=18); opacity: .18; width: 46px; height: 46px; margin-left: -23px; margin-top: -23px; }
+.ui-loader-verbose { width: 200px; filter: Alpha(Opacity=88); opacity: .88; box-shadow: 0 1px 1px -1px #fff; height: auto; margin-left: -110px; margin-top: -43px; padding: 10px; }
+.ui-loader-default h1 { font-size: 0; width: 0; height: 0; overflow: hidden; }
+.ui-loader-verbose h1 { font-size: 16px; margin: 0; text-align: center; }
+.ui-loader .ui-icon { background-color: #000; display: block; margin: 0; width: 44px; height: 44px; padding: 1px; -webkit-border-radius: 36px; border-radius: 36px; }
+.ui-loader-verbose .ui-icon { margin: 0 auto 10px; filter: Alpha(Opacity=75); opacity: .75; }
+.ui-loader-textonly { padding: 15px; margin-left: -115px; }
+.ui-loader-textonly .ui-icon { display: none; }
+.ui-loader-fakefix { position: absolute; }
/*fouc*/
.ui-mobile-rendering > * { visibility: hidden; }
-
/*headers, content panels*/
-.ui-bar, .ui-body { position: relative; padding: .4em 15px; overflow: hidden; display: block; clear:both; }
+.ui-bar, .ui-body { position: relative; padding: .4em 15px; overflow: hidden; display: block; clear:both; }
.ui-bar { font-size: 16px; margin: 0; }
.ui-bar h1, .ui-bar h2, .ui-bar h3, .ui-bar h4, .ui-bar h5, .ui-bar h6 { margin: 0; padding: 0; font-size: 16px; display: inline-block; }
-
-.ui-header, .ui-footer { display: block; }
-.ui-page .ui-header, .ui-page .ui-footer { position: relative; }
-.ui-header .ui-btn-left { position: absolute; left: 10px; top: .4em; }
-.ui-header .ui-btn-right { position: absolute; right: 10px; top: .4em; }
-.ui-header .ui-title, .ui-footer .ui-title { min-height: 1.1em; text-align: center; font-size: 16px; display: block; margin: .6em 90px .8em; padding: 0; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; outline: 0 !important; }
-.ui-footer .ui-title { margin: .6em 15px .8em; }
-
-/*content area*/
+.ui-header, .ui-footer { position: relative; zoom: 1; }
+.ui-mobile .ui-header, .ui-mobile .ui-footer { border-left-width: 0; border-right-width: 0; }
+.ui-header .ui-btn-left,
+.ui-header .ui-btn-right,
+.ui-footer .ui-btn-left,
+.ui-footer .ui-btn-right,
+.ui-header-fixed.ui-fixed-hidden .ui-btn-left,
+.ui-header-fixed.ui-fixed-hidden .ui-btn-right { position: absolute; top: 3px; }
+.ui-header-fixed .ui-btn-left,
+.ui-header-fixed .ui-btn-right { top: 4px;}
+.ui-header .ui-btn-left,
+.ui-footer .ui-btn-left { left: 5px; }
+.ui-header .ui-btn-right,
+.ui-footer .ui-btn-right { right: 5px; }
+.ui-footer > .ui-btn-icon-notext,
+.ui-header > .ui-btn-icon-notext,
+.ui-header-fixed.ui-fixed-hidden > .ui-btn-icon-notext { top: 6px; }
+.ui-header-fixed > .ui-btn-icon-notext { top: 7px;}
+.ui-header .ui-title, .ui-footer .ui-title { min-height: 1.1em; text-align: center; font-size: 16px; display: block; margin: .6em 30% .8em; padding: 0; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; outline: 0 !important; }
+.ui-footer .ui-title { margin: .6em 15px .8em; }
+/* content area*/
.ui-content { border-width: 0; overflow: visible; overflow-x: hidden; padding: 15px; }
-.ui-page-fullscreen .ui-content { padding:0; }
-
-/* native fixed headers and footers */
-.ui-mobile-touch-overflow.ui-page.ui-native-fixed,
-.ui-mobile-touch-overflow.ui-page.ui-native-fullscreen {
- overflow: visible;
-}
-.ui-mobile-touch-overflow.ui-native-fixed .ui-header,
-.ui-mobile-touch-overflow.ui-native-fixed .ui-footer {
- position: fixed;
- left: 0;
- right: 0;
- top: 0;
- z-index: 200;
-}
-.ui-mobile-touch-overflow.ui-page.ui-native-fixed .ui-footer {
- top: auto;
- bottom: 0;
-}
-.ui-mobile-touch-overflow.ui-native-fixed .ui-content {
- padding-top: 2.5em;
- padding-bottom: 3em;
- top: 0;
- bottom: 0;
- height: auto;
- position: absolute;
-}
-.ui-mobile-touch-overflow.ui-native-fullscreen .ui-content {
- padding-top: 0;
- padding-bottom: 0;
-}
-.ui-mobile-touch-overflow.ui-native-fullscreen .ui-header,
-.ui-mobile-touch-overflow.ui-native-fullscreen .ui-footer {
- opacity: .9;
+/* corner styling for dialogs and popups */
+.ui-corner-all > .ui-header:first-child,
+.ui-corner-all > .ui-content:first-child,
+.ui-corner-all > .ui-footer:first-child {
+ -webkit-border-top-left-radius: inherit;
+ border-top-left-radius: inherit;
+ -webkit-border-top-right-radius: inherit;
+ border-top-right-radius: inherit;
+}
+.ui-corner-all > .ui-header:last-child,
+.ui-corner-all > .ui-content:last-child,
+.ui-corner-all > .ui-footer:last-child {
+ -webkit-border-bottom-left-radius: inherit;
+ border-bottom-left-radius: inherit;
+ -webkit-border-bottom-right-radius: inherit;
+ border-bottom-right-radius: inherit;
}
-.ui-native-bars-hidden {
- display: none;
-}
-
/* icons sizing */
.ui-icon { width: 18px; height: 18px; }
-
-/* fullscreen class on ui-content div */
-.ui-fullscreen { }
-.ui-fullscreen img { max-width: 100%; }
-
/* non-js content hiding */
.ui-nojs { position: absolute; left: -9999px; }
-
/* accessible content hiding */
-.ui-hide-label label,
+.ui-hide-label label.ui-input-text, .ui-hide-label label.ui-select, .ui-hide-label label.ui-slider, .ui-hide-label label.ui-submit, .ui-hide-label .ui-controlgroup-label,
.ui-hidden-accessible { position: absolute !important; left: -9999px; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
-.spin {
- -webkit-transform: rotate(360deg);
- -webkit-animation-name: spin;
- -webkit-animation-duration: 1s;
- -webkit-animation-iteration-count: infinite;
- -webkit-animation-timing-function: linear;
+/* Transitions originally inspired by those from jQtouch, nice work, folks */
+.ui-mobile-viewport-transitioning,
+.ui-mobile-viewport-transitioning .ui-page {
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
}
-@-webkit-keyframes spin {
- from {-webkit-transform: rotate(0deg);}
- to {-webkit-transform: rotate(360deg);}
+.ui-page-pre-in {
+ opacity: 0;
}
-
-/* Transitions from jQtouch (with small modifications): http://www.jqtouch.com/
-Built by David Kaneda and maintained by Jonathan Stark.
-*/
-.in, .out {
- -webkit-animation-timing-function: ease-in-out;
+.in {
+ -webkit-animation-timing-function: ease-out;
-webkit-animation-duration: 350ms;
+ -moz-animation-timing-function: ease-out;
+ -moz-animation-duration: 350ms;
+ animation-timing-function: ease-out;
+ animation-duration: 350ms;
+}
+.out {
+ -webkit-animation-timing-function: ease-in;
+ -webkit-animation-duration: 225ms;
+ -moz-animation-timing-function: ease-in;
+ -moz-animation-duration: 225ms;
+ animation-timing-function: ease-in;
+ animation-duration: 225ms;
+}
+@-webkit-keyframes fadein {
+ from { opacity: 0; }
+ to { opacity: 1; }
+}
+@-moz-keyframes fadein {
+ from { opacity: 0; }
+ to { opacity: 1; }
+}
+@keyframes fadein {
+ from { opacity: 0; }
+ to { opacity: 1; }
+}
+@-webkit-keyframes fadeout {
+ from { opacity: 1; }
+ to { opacity: 0; }
+}
+@-moz-keyframes fadeout {
+ from { opacity: 1; }
+ to { opacity: 0; }
+}
+@keyframes fadeout {
+ from { opacity: 1; }
+ to { opacity: 0; }
+}
+.fade.out {
+ opacity: 0;
+ -webkit-animation-duration: 125ms;
+ -webkit-animation-name: fadeout;
+ -moz-animation-duration: 125ms;
+ -moz-animation-name: fadeout;
+ animation-duration: 125ms;
+ animation-name: fadeout;
+}
+.fade.in {
+ opacity: 1;
+ -webkit-animation-duration: 225ms;
+ -webkit-animation-name: fadein;
+ -moz-animation-duration: 225ms;
+ -moz-animation-name: fadein;
+ animation-duration: 225ms;
+ animation-name: fadein;
+}
+.pop {
+ -webkit-transform-origin: 50% 50%;
+ -moz-transform-origin: 50% 50%;
+ transform-origin: 50% 50%;
+}
+.pop.in {
+ -webkit-transform: scale(1);
+ -webkit-animation-name: popin;
+ -webkit-animation-duration: 350ms;
+ -moz-transform: scale(1);
+ -moz-animation-name: popin;
+ -moz-animation-duration: 350ms;
+ transform: scale(1);
+ animation-name: popin;
+ animation-duration: 350ms;
+ opacity: 1;
+}
+.pop.out {
+ -webkit-animation-name: fadeout;
+ -webkit-animation-duration: 100ms;
+ -moz-animation-name: fadeout;
+ -moz-animation-duration: 100ms;
+ animation-name: fadeout;
+ animation-duration: 100ms;
+ opacity: 0;
+}
+.pop.in.reverse {
+ -webkit-animation-name: fadein;
+ -moz-animation-name: fadein;
+ animation-name: fadein;
+}
+.pop.out.reverse {
+ -webkit-transform: scale(.8);
+ -webkit-animation-name: popout;
+ -moz-transform: scale(.8);
+ -moz-animation-name: popout;
+ transform: scale(.8);
+ animation-name: popout;
+}
+@-webkit-keyframes popin {
+ from {
+ -webkit-transform: scale(.8);
+ opacity: 0;
+ }
+ to {
+ -webkit-transform: scale(1);
+ opacity: 1;
+ }
+}
+@-moz-keyframes popin {
+ from {
+ -moz-transform: scale(.8);
+ opacity: 0;
+ }
+ to {
+ -moz-transform: scale(1);
+ opacity: 1;
+ }
+}
+@keyframes popin {
+ from {
+ transform: scale(.8);
+ opacity: 0;
+ }
+ to {
+ transform: scale(1);
+ opacity: 1;
+ }
+}
+@-webkit-keyframes popout {
+ from {
+ -webkit-transform: scale(1);
+ opacity: 1;
+ }
+ to {
+ -webkit-transform: scale(.8);
+ opacity: 0;
+ }
+}
+@-moz-keyframes popout {
+ from {
+ -moz-transform: scale(1);
+ opacity: 1;
+ }
+ to {
+ -moz-transform: scale(.8);
+ opacity: 0;
+ }
+}
+@keyframes popout {
+ from {
+ transform: scale(1);
+ opacity: 1;
+ }
+ to {
+ transform: scale(.8);
+ opacity: 0;
+ }
+}
+/* keyframes for slidein from sides */
+@-webkit-keyframes slideinfromright {
+ from { -webkit-transform: translate3d(100%,0,0); }
+ to { -webkit-transform: translate3d(0,0,0); }
+}
+@-moz-keyframes slideinfromright {
+ from { -moz-transform: translateX(100%); }
+ to { -moz-transform: translateX(0); }
+}
+@keyframes slideinfromright {
+ from { transform: translateX(100%); }
+ to { transform: translateX(0); }
+}
+@-webkit-keyframes slideinfromleft {
+ from { -webkit-transform: translate3d(-100%,0,0); }
+ to { -webkit-transform: translate3d(0,0,0); }
+}
+@-moz-keyframes slideinfromleft {
+ from { -moz-transform: translateX(-100%); }
+ to { -moz-transform: translateX(0); }
+}
+@keyframes slideinfromleft {
+ from { transform: translateX(-100%); }
+ to { transform: translateX(0); }
+}
+/* keyframes for slideout to sides */
+@-webkit-keyframes slideouttoleft {
+ from { -webkit-transform: translate3d(0,0,0); }
+ to { -webkit-transform: translate3d(-100%,0,0); }
+}
+@-moz-keyframes slideouttoleft {
+ from { -moz-transform: translateX(0); }
+ to { -moz-transform: translateX(-100%); }
+}
+@keyframes slideouttoleft {
+ from { transform: translateX(0); }
+ to { transform: translateX(-100%); }
+}
+@-webkit-keyframes slideouttoright {
+ from { -webkit-transform: translate3d(0,0,0); }
+ to { -webkit-transform: translate3d(100%,0,0); }
+}
+@-moz-keyframes slideouttoright {
+ from { -moz-transform: translateX(0); }
+ to { -moz-transform: translateX(100%); }
+}
+@keyframes slideouttoright {
+ from { transform: translateX(0); }
+ to { transform: translateX(100%); }
+}
+.slide.out, .slide.in {
+ -webkit-animation-timing-function: ease-out;
+ -webkit-animation-duration: 350ms;
+ -moz-animation-timing-function: ease-out;
+ -moz-animation-duration: 350ms;
+ animation-timing-function: ease-out;
+ animation-duration: 350ms;
}
-
-
.slide.out {
- -webkit-transform: translateX(-100%);
+ -webkit-transform: translate3d(-100%,0,0);
-webkit-animation-name: slideouttoleft;
+ -moz-transform: translateX(-100%);
+ -moz-animation-name: slideouttoleft;
+ transform: translateX(-100%);
+ animation-name: slideouttoleft;
}
-
.slide.in {
- -webkit-transform: translateX(0);
+ -webkit-transform: translate3d(0,0,0);
-webkit-animation-name: slideinfromright;
+ -moz-transform: translateX(0);
+ -moz-animation-name: slideinfromright;
+ transform: translateX(0);
+ animation-name: slideinfromright;
}
-
.slide.out.reverse {
- -webkit-transform: translateX(100%);
+ -webkit-transform: translate3d(100%,0,0);
-webkit-animation-name: slideouttoright;
+ -moz-transform: translateX(100%);
+ -moz-animation-name: slideouttoright;
+ transform: translateX(100%);
+ animation-name: slideouttoright;
}
-
.slide.in.reverse {
- -webkit-transform: translateX(0);
+ -webkit-transform: translate3d(0,0,0);
-webkit-animation-name: slideinfromleft;
+ -moz-transform: translateX(0);
+ -moz-animation-name: slideinfromleft;
+ transform: translateX(0);
+ animation-name: slideinfromleft;
}
-
-.slideup.out {
- -webkit-animation-name: dontmove;
- z-index: 0;
-}
-
-.slideup.in {
- -webkit-transform: translateY(0);
- -webkit-animation-name: slideinfrombottom;
- z-index: 10;
-}
-
-.slideup.in.reverse {
- z-index: 0;
- -webkit-animation-name: dontmove;
-}
-
-.slideup.out.reverse {
- -webkit-transform: translateY(100%);
- z-index: 10;
- -webkit-animation-name: slideouttobottom;
-}
-
+.slidefade.out {
+ -webkit-transform: translateX(-100%);
+ -webkit-animation-name: slideouttoleft;
+ -webkit-animation-duration: 225ms;
+ -moz-transform: translateX(-100%);
+ -moz-animation-name: slideouttoleft;
+ -moz-animation-duration: 225ms;
+ transform: translateX(-100%);
+ animation-name: slideouttoleft;
+ animation-duration: 225ms;
+}
+.slidefade.in {
+ -webkit-transform: translateX(0);
+ -webkit-animation-name: fadein;
+ -webkit-animation-duration: 200ms;
+ -moz-transform: translateX(0);
+ -moz-animation-name: fadein;
+ -moz-animation-duration: 200ms;
+ transform: translateX(0);
+ animation-name: fadein;
+ animation-duration: 200ms;
+}
+.slidefade.out.reverse {
+ -webkit-transform: translateX(100%);
+ -webkit-animation-name: slideouttoright;
+ -webkit-animation-duration: 200ms;
+ -moz-transform: translateX(100%);
+ -moz-animation-name: slideouttoright;
+ -moz-animation-duration: 200ms;
+ transform: translateX(100%);
+ animation-name: slideouttoright;
+ animation-duration: 200ms;
+}
+.slidefade.in.reverse {
+ -webkit-transform: translateX(0);
+ -webkit-animation-name: fadein;
+ -webkit-animation-duration: 200ms;
+ -moz-transform: translateX(0);
+ -moz-animation-name: fadein;
+ -moz-animation-duration: 200ms;
+ transform: translateX(0);
+ animation-name: fadein;
+ animation-duration: 200ms;
+}
+/* slide down */
.slidedown.out {
- -webkit-animation-name: dontmove;
- z-index: 0;
+ -webkit-animation-name: fadeout;
+ -webkit-animation-duration: 100ms;
+ -moz-animation-name: fadeout;
+ -moz-animation-duration: 100ms;
+ animation-name: fadeout;
+ animation-duration: 100ms;
}
-
.slidedown.in {
-webkit-transform: translateY(0);
-webkit-animation-name: slideinfromtop;
- z-index: 10;
+ -webkit-animation-duration: 250ms;
+ -moz-transform: translateY(0);
+ -moz-animation-name: slideinfromtop;
+ -moz-animation-duration: 250ms;
+ transform: translateY(0);
+ animation-name: slideinfromtop;
+ animation-duration: 250ms;
}
-
.slidedown.in.reverse {
- z-index: 0;
- -webkit-animation-name: dontmove;
+ -webkit-animation-name: fadein;
+ -webkit-animation-duration: 150ms;
+ -moz-animation-name: fadein;
+ -moz-animation-duration: 150ms;
+ animation-name: fadein;
+ animation-duration: 150ms;
}
-
.slidedown.out.reverse {
-webkit-transform: translateY(-100%);
- z-index: 10;
-webkit-animation-name: slideouttotop;
+ -webkit-animation-duration: 200ms;
+ -moz-transform: translateY(-100%);
+ -moz-animation-name: slideouttotop;
+ -moz-animation-duration: 200ms;
+ transform: translateY(-100%);
+ animation-name: slideouttotop;
+ animation-duration: 200ms;
}
-
-@-webkit-keyframes slideinfromright {
- from { -webkit-transform: translateX(100%); }
- to { -webkit-transform: translateX(0); }
-}
-
-@-webkit-keyframes slideinfromleft {
- from { -webkit-transform: translateX(-100%); }
- to { -webkit-transform: translateX(0); }
-}
-
-@-webkit-keyframes slideouttoleft {
- from { -webkit-transform: translateX(0); }
- to { -webkit-transform: translateX(-100%); }
-}
-
-@-webkit-keyframes slideouttoright {
- from { -webkit-transform: translateX(0); }
- to { -webkit-transform: translateX(100%); }
-}
-
@-webkit-keyframes slideinfromtop {
from { -webkit-transform: translateY(-100%); }
to { -webkit-transform: translateY(0); }
}
-
-@-webkit-keyframes slideinfrombottom {
- from { -webkit-transform: translateY(100%); }
- to { -webkit-transform: translateY(0); }
+@-moz-keyframes slideinfromtop {
+ from { -moz-transform: translateY(-100%); }
+ to { -moz-transform: translateY(0); }
}
-
-@-webkit-keyframes slideouttobottom {
- from { -webkit-transform: translateY(0); }
- to { -webkit-transform: translateY(100%); }
+@keyframes slideinfromtop {
+ from { transform: translateY(-100%); }
+ to { transform: translateY(0); }
}
-
@-webkit-keyframes slideouttotop {
from { -webkit-transform: translateY(0); }
to { -webkit-transform: translateY(-100%); }
}
-@-webkit-keyframes fadein {
- from { opacity: 0; }
- to { opacity: 1; }
+@-moz-keyframes slideouttotop {
+ from { -moz-transform: translateY(0); }
+ to { -moz-transform: translateY(-100%); }
}
-
-@-webkit-keyframes fadeout {
- from { opacity: 1; }
- to { opacity: 0; }
+@keyframes slideouttotop {
+ from { transform: translateY(0); }
+ to { transform: translateY(-100%); }
}
-
-.fade.out {
- z-index: 0;
+/* slide up */
+.slideup.out {
-webkit-animation-name: fadeout;
+ -webkit-animation-duration: 100ms;
+ -moz-animation-name: fadeout;
+ -moz-animation-duration: 100ms;
+ animation-name: fadeout;
+ animation-duration: 100ms;
}
-
-.fade.in {
- opacity: 1;
- z-index: 10;
+.slideup.in {
+ -webkit-transform: translateY(0);
+ -webkit-animation-name: slideinfrombottom;
+ -webkit-animation-duration: 250ms;
+ -moz-transform: translateY(0);
+ -moz-animation-name: slideinfrombottom;
+ -moz-animation-duration: 250ms;
+ transform: translateY(0);
+ animation-name: slideinfrombottom;
+ animation-duration: 250ms;
+}
+.slideup.in.reverse {
-webkit-animation-name: fadein;
+ -webkit-animation-duration: 150ms;
+ -moz-animation-name: fadein;
+ -moz-animation-duration: 150ms;
+ animation-name: fadein;
+ animation-duration: 150ms;
+}
+.slideup.out.reverse {
+ -webkit-transform: translateY(100%);
+ -webkit-animation-name: slideouttobottom;
+ -webkit-animation-duration: 200ms;
+ -moz-transform: translateY(100%);
+ -moz-animation-name: slideouttobottom;
+ -moz-animation-duration: 200ms;
+ transform: translateY(100%);
+ animation-name: slideouttobottom;
+ animation-duration: 200ms;
+}
+@-webkit-keyframes slideinfrombottom {
+ from { -webkit-transform: translateY(100%); }
+ to { -webkit-transform: translateY(0); }
+}
+@-moz-keyframes slideinfrombottom {
+ from { -moz-transform: translateY(100%); }
+ to { -moz-transform: translateY(0); }
+}
+@keyframes slideinfrombottom {
+ from { transform: translateY(100%); }
+ to { transform: translateY(0); }
+}
+@-webkit-keyframes slideouttobottom {
+ from { -webkit-transform: translateY(0); }
+ to { -webkit-transform: translateY(100%); }
+}
+@-moz-keyframes slideouttobottom {
+ from { -moz-transform: translateY(0); }
+ to { -moz-transform: translateY(100%); }
+}
+@keyframes slideouttobottom {
+ from { transform: translateY(0); }
+ to { transform: translateY(100%); }
}
-
/* The properties in this rule are only necessary for the 'flip' transition.
* We need specify the perspective to create a projection matrix. This will add
* some depth as the element flips. The depth number represents the distance of
@@ -1434,436 +1589,1778 @@ Built by David Kaneda and maintained by Jonathan Stark.
*/
.viewport-flip {
-webkit-perspective: 1000;
+ -moz-perspective: 1000;
+ perspective: 1000;
position: absolute;
}
-
-.ui-mobile-viewport-transitioning,
-.ui-mobile-viewport-transitioning .ui-page {
- width: 100%;
- height: 100%;
- overflow: hidden;
-}
-
.flip {
- -webkit-animation-duration: .65s;
- -webkit-backface-visibility:hidden;
- -webkit-transform:translateX(0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */
+ -webkit-backface-visibility: hidden;
+ -webkit-transform: translateX(0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */
+ -moz-backface-visibility: hidden;
+ -moz-transform: translateX(0);
+ backface-visibility: hidden;
+ transform: translateX(0);
}
-
.flip.out {
- -webkit-transform: rotateY(-180deg) scale(.8);
+ -webkit-transform: rotateY(-90deg) scale(.9);
-webkit-animation-name: flipouttoleft;
+ -webkit-animation-duration: 175ms;
+ -moz-transform: rotateY(-90deg) scale(.9);
+ -moz-animation-name: flipouttoleft;
+ -moz-animation-duration: 175ms;
+ transform: rotateY(-90deg) scale(.9);
+ animation-name: flipouttoleft;
+ animation-duration: 175ms;
}
-
.flip.in {
- -webkit-transform: rotateY(0) scale(1);
- -webkit-animation-name: flipinfromleft;
+ -webkit-animation-name: flipintoright;
+ -webkit-animation-duration: 225ms;
+ -moz-animation-name: flipintoright;
+ -moz-animation-duration: 225ms;
+ animation-name: flipintoright;
+ animation-duration: 225ms;
}
-
-/* Shake it all about */
-
.flip.out.reverse {
- -webkit-transform: rotateY(180deg) scale(.8);
+ -webkit-transform: rotateY(90deg) scale(.9);
-webkit-animation-name: flipouttoright;
+ -moz-transform: rotateY(90deg) scale(.9);
+ -moz-animation-name: flipouttoright;
+ transform: rotateY(90deg) scale(.9);
+ animation-name: flipouttoright;
}
-
.flip.in.reverse {
- -webkit-transform: rotateY(0) scale(1);
- -webkit-animation-name: flipinfromright;
+ -webkit-animation-name: flipintoleft;
+ -moz-animation-name: flipintoleft;
+ animation-name: flipintoleft;
}
-
-@-webkit-keyframes flipinfromright {
- from { -webkit-transform: rotateY(-180deg) scale(.8); }
- to { -webkit-transform: rotateY(0) scale(1); }
+@-webkit-keyframes flipouttoleft {
+ from { -webkit-transform: rotateY(0); }
+ to { -webkit-transform: rotateY(-90deg) scale(.9); }
}
-
-@-webkit-keyframes flipinfromleft {
- from { -webkit-transform: rotateY(180deg) scale(.8); }
- to { -webkit-transform: rotateY(0) scale(1); }
+@-moz-keyframes flipouttoleft {
+ from { -moz-transform: rotateY(0); }
+ to { -moz-transform: rotateY(-90deg) scale(.9); }
}
-
-@-webkit-keyframes flipouttoleft {
- from { -webkit-transform: rotateY(0) scale(1); }
- to { -webkit-transform: rotateY(-180deg) scale(.8); }
+@keyframes flipouttoleft {
+ from { transform: rotateY(0); }
+ to { transform: rotateY(-90deg) scale(.9); }
}
-
@-webkit-keyframes flipouttoright {
- from { -webkit-transform: rotateY(0) scale(1); }
- to { -webkit-transform: rotateY(180deg) scale(.8); }
+ from { -webkit-transform: rotateY(0) ; }
+ to { -webkit-transform: rotateY(90deg) scale(.9); }
}
-
-
-/* Hackish, but reliable. */
-
-@-webkit-keyframes dontmove {
- from { opacity: 1; }
- to { opacity: 1; }
+@-moz-keyframes flipouttoright {
+ from { -moz-transform: rotateY(0); }
+ to { -moz-transform: rotateY(90deg) scale(.9); }
}
-
-.pop {
- -webkit-transform-origin: 50% 50%;
+@keyframes flipouttoright {
+ from { transform: rotateY(0); }
+ to { transform: rotateY(90deg) scale(.9); }
}
-
-.pop.in {
- -webkit-transform: scale(1);
- opacity: 1;
- -webkit-animation-name: popin;
- z-index: 10;
+@-webkit-keyframes flipintoleft {
+ from { -webkit-transform: rotateY(-90deg) scale(.9); }
+ to { -webkit-transform: rotateY(0); }
}
-
-.pop.in.reverse {
- z-index: 0;
- -webkit-animation-name: dontmove;
+@-moz-keyframes flipintoleft {
+ from { -moz-transform: rotateY(-90deg) scale(.9); }
+ to { -moz-transform: rotateY(0); }
}
-
-.pop.out.reverse {
- -webkit-transform: scale(.2);
- opacity: 0;
- -webkit-animation-name: popout;
- z-index: 10;
+@keyframes flipintoleft {
+ from { transform: rotateY(-90deg) scale(.9); }
+ to { transform: rotateY(0); }
}
-
-@-webkit-keyframes popin {
- from {
- -webkit-transform: scale(.2);
- opacity: 0;
- }
- to {
- -webkit-transform: scale(1);
- opacity: 1;
- }
+@-webkit-keyframes flipintoright {
+ from { -webkit-transform: rotateY(90deg) scale(.9); }
+ to { -webkit-transform: rotateY(0); }
}
-
-@-webkit-keyframes popout {
- from {
- -webkit-transform: scale(1);
- opacity: 1;
- }
- to {
- -webkit-transform: scale(.2);
- opacity: 0;
- }
-}/* content configurations. */
+@-moz-keyframes flipintoright {
+ from { -moz-transform: rotateY(90deg) scale(.9); }
+ to { -moz-transform: rotateY(0); }
+}
+@keyframes flipintoright {
+ from { transform: rotateY(90deg) scale(.9); }
+ to { transform: rotateY(0); }
+}
+/* The properties in this rule are only necessary for the 'flip' transition.
+ * We need specify the perspective to create a projection matrix. This will add
+ * some depth as the element flips. The depth number represents the distance of
+ * the viewer from the z-plane. According to the CSS3 spec, 1000 is a moderate
+ * value.
+ */
+.viewport-turn {
+ -webkit-perspective: 200px;
+ -moz-perspective: 200px;
+ -ms-perspective: 200px;
+ perspective: 200px;
+ position: absolute;
+}
+.turn {
+ -webkit-backface-visibility: hidden;
+ -webkit-transform: translateX(0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */
+ -webkit-transform-origin: 0;
+
+ -moz-backface-visibility: hidden;
+ -moz-transform: translateX(0);
+ -moz-transform-origin: 0;
+
+ backface-visibility :hidden;
+ transform: translateX(0);
+ transform-origin: 0;
+}
+.turn.out {
+ -webkit-transform: rotateY(-90deg) scale(.9);
+ -webkit-animation-name: flipouttoleft;
+ -webkit-animation-duration: 125ms;
+ -moz-transform: rotateY(-90deg) scale(.9);
+ -moz-animation-name: flipouttoleft;
+ -moz-animation-duration: 125ms;
+ transform: rotateY(-90deg) scale(.9);
+ animation-name: flipouttoleft;
+ animation-duration: 125ms;
+}
+.turn.in {
+ -webkit-animation-name: flipintoright;
+ -webkit-animation-duration: 250ms;
+ -moz-animation-name: flipintoright;
+ -moz-animation-duration: 250ms;
+ animation-name: flipintoright;
+ animation-duration: 250ms;
+
+}
+.turn.out.reverse {
+ -webkit-transform: rotateY(90deg) scale(.9);
+ -webkit-animation-name: flipouttoright;
+ -moz-transform: rotateY(90deg) scale(.9);
+ -moz-animation-name: flipouttoright;
+ transform: rotateY(90deg) scale(.9);
+ animation-name: flipouttoright;
+}
+.turn.in.reverse {
+ -webkit-animation-name: flipintoleft;
+ -moz-animation-name: flipintoleft;
+ animation-name: flipintoleft;
+}
+@-webkit-keyframes flipouttoleft {
+ from { -webkit-transform: rotateY(0); }
+ to { -webkit-transform: rotateY(-90deg) scale(.9); }
+}
+@-moz-keyframes flipouttoleft {
+ from { -moz-transform: rotateY(0); }
+ to { -moz-transform: rotateY(-90deg) scale(.9); }
+}
+@keyframes flipouttoleft {
+ from { transform: rotateY(0); }
+ to { transform: rotateY(-90deg) scale(.9); }
+}
+@-webkit-keyframes flipouttoright {
+ from { -webkit-transform: rotateY(0) ; }
+ to { -webkit-transform: rotateY(90deg) scale(.9); }
+}
+@-moz-keyframes flipouttoright {
+ from { -moz-transform: rotateY(0); }
+ to { -moz-transform: rotateY(90deg) scale(.9); }
+}
+@keyframes flipouttoright {
+ from { transform: rotateY(0); }
+ to { transform: rotateY(90deg) scale(.9); }
+}
+@-webkit-keyframes flipintoleft {
+ from { -webkit-transform: rotateY(-90deg) scale(.9); }
+ to { -webkit-transform: rotateY(0); }
+}
+@-moz-keyframes flipintoleft {
+ from { -moz-transform: rotateY(-90deg) scale(.9); }
+ to { -moz-transform: rotateY(0); }
+}
+@keyframes flipintoleft {
+ from { transform: rotateY(-90deg) scale(.9); }
+ to { transform: rotateY(0); }
+}
+@-webkit-keyframes flipintoright {
+ from { -webkit-transform: rotateY(90deg) scale(.9); }
+ to { -webkit-transform: rotateY(0); }
+}
+@-moz-keyframes flipintoright {
+ from { -moz-transform: rotateY(90deg) scale(.9); }
+ to { -moz-transform: rotateY(0); }
+}
+@keyframes flipintoright {
+ from { transform: rotateY(90deg) scale(.9); }
+ to { transform: rotateY(0); }
+}
+/* flow transition */
+.flow {
+ -webkit-transform-origin: 50% 30%;
+ -webkit-box-shadow: 0 0 20px rgba(0,0,0,.4);
+ -moz-transform-origin: 50% 30%;
+ -moz-box-shadow: 0 0 20px rgba(0,0,0,.4);
+ transform-origin: 50% 30%;
+ box-shadow: 0 0 20px rgba(0,0,0,.4);
+}
+.ui-dialog.flow {
+ -webkit-transform-origin: none;
+ -webkit-box-shadow: none;
+ -moz-transform-origin: none;
+ -moz-box-shadow: none;
+ transform-origin: none;
+ box-shadow: none;
+}
+.flow.out {
+ -webkit-transform: translateX(-100%) scale(.7);
+ -webkit-animation-name: flowouttoleft;
+ -webkit-animation-timing-function: ease;
+ -webkit-animation-duration: 350ms;
+ -moz-transform: translateX(-100%) scale(.7);
+ -moz-animation-name: flowouttoleft;
+ -moz-animation-timing-function: ease;
+ -moz-animation-duration: 350ms;
+ transform: translateX(-100%) scale(.7);
+ animation-name: flowouttoleft;
+ animation-timing-function: ease;
+ animation-duration: 350ms;
+}
+.flow.in {
+ -webkit-transform: translateX(0) scale(1);
+ -webkit-animation-name: flowinfromright;
+ -webkit-animation-timing-function: ease;
+ -webkit-animation-duration: 350ms;
+ -moz-transform: translateX(0) scale(1);
+ -moz-animation-name: flowinfromright;
+ -moz-animation-timing-function: ease;
+ -moz-animation-duration: 350ms;
+ transform: translateX(0) scale(1);
+ animation-name: flowinfromright;
+ animation-timing-function: ease;
+ animation-duration: 350ms;
+}
+.flow.out.reverse {
+ -webkit-transform: translateX(100%);
+ -webkit-animation-name: flowouttoright;
+ -moz-transform: translateX(100%);
+ -moz-animation-name: flowouttoright;
+ transform: translateX(100%);
+ animation-name: flowouttoright;
+}
+.flow.in.reverse {
+ -webkit-animation-name: flowinfromleft;
+ -moz-animation-name: flowinfromleft;
+ animation-name: flowinfromleft;
+}
+@-webkit-keyframes flowouttoleft {
+ 0% { -webkit-transform: translateX(0) scale(1); }
+ 60%, 70% { -webkit-transform: translateX(0) scale(.7); }
+ 100% { -webkit-transform: translateX(-100%) scale(.7); }
+}
+@-moz-keyframes flowouttoleft {
+ 0% { -moz-transform: translateX(0) scale(1); }
+ 60%, 70% { -moz-transform: translateX(0) scale(.7); }
+ 100% { -moz-transform: translateX(-100%) scale(.7); }
+}
+@keyframes flowouttoleft {
+ 0% { transform: translateX(0) scale(1); }
+ 60%, 70% { transform: translateX(0) scale(.7); }
+ 100% { transform: translateX(-100%) scale(.7); }
+}
+@-webkit-keyframes flowouttoright {
+ 0% { -webkit-transform: translateX(0) scale(1); }
+ 60%, 70% { -webkit-transform: translateX(0) scale(.7); }
+ 100% { -webkit-transform: translateX(100%) scale(.7); }
+}
+@-moz-keyframes flowouttoright {
+ 0% { -moz-transform: translateX(0) scale(1); }
+ 60%, 70% { -moz-transform: translateX(0) scale(.7); }
+ 100% { -moz-transform: translateX(100%) scale(.7); }
+}
+@keyframes flowouttoright {
+ 0% { transform: translateX(0) scale(1); }
+ 60%, 70% { transform: translateX(0) scale(.7); }
+ 100% { transform: translateX(100%) scale(.7); }
+}
+@-webkit-keyframes flowinfromleft {
+ 0% { -webkit-transform: translateX(-100%) scale(.7); }
+ 30%, 40% { -webkit-transform: translateX(0) scale(.7); }
+ 100% { -webkit-transform: translateX(0) scale(1); }
+}
+@-moz-keyframes flowinfromleft {
+ 0% { -moz-transform: translateX(-100%) scale(.7); }
+ 30%, 40% { -moz-transform: translateX(0) scale(.7); }
+ 100% { -moz-transform: translateX(0) scale(1); }
+}
+@keyframes flowinfromleft {
+ 0% { transform: translateX(-100%) scale(.7); }
+ 30%, 40% { transform: translateX(0) scale(.7); }
+ 100% { transform: translateX(0) scale(1); }
+}
+@-webkit-keyframes flowinfromright {
+ 0% { -webkit-transform: translateX(100%) scale(.7); }
+ 30%, 40% { -webkit-transform: translateX(0) scale(.7); }
+ 100% { -webkit-transform: translateX(0) scale(1); }
+}
+@-moz-keyframes flowinfromright {
+ 0% { -moz-transform: translateX(100%) scale(.7); }
+ 30%, 40% { -moz-transform: translateX(0) scale(.7); }
+ 100% { -moz-transform: translateX(0) scale(1); }
+}
+@keyframes flowinfromright {
+ 0% { transform: translateX(100%) scale(.7); }
+ 30%, 40% { transform: translateX(0) scale(.7); }
+ 100% { transform: translateX(0) scale(1); }
+}
+/* content configurations. */
.ui-grid-a, .ui-grid-b, .ui-grid-c, .ui-grid-d { overflow: hidden; }
-.ui-block-a, .ui-block-b, .ui-block-c, .ui-block-d, .ui-block-e { margin: 0; padding: 0; border: 0; float: left; min-height:1px;}
-
+.ui-block-a, .ui-block-b, .ui-block-c, .ui-block-d, .ui-block-e { margin: 0; padding: 0; border: 0; float: left; min-height: 1px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; -ms-box-sizing: border-box; box-sizing: border-box; }
/* grid solo: 100 - single item fallback */
-.ui-grid-solo .ui-block-a { width: 100%; float: none; }
-
+.ui-grid-solo .ui-block-a { display: block; float: none; }
+/* Lower percentages for older browsers (i.e. IE7) to prevent wrapping. -.5px to fix BB5 wrap issue. */
/* grid a: 50/50 */
-.ui-grid-a .ui-block-a, .ui-grid-a .ui-block-b { width: 50%; }
+.ui-grid-a .ui-block-a, .ui-grid-a .ui-block-b { width: 49.95%; }
+.ui-grid-a > :nth-child(n) { width: 50%; margin-right: -.5px; }
.ui-grid-a .ui-block-a { clear: left; }
-
/* grid b: 33/33/33 */
-.ui-grid-b .ui-block-a, .ui-grid-b .ui-block-b, .ui-grid-b .ui-block-c { width: 33.333%; }
+.ui-grid-b .ui-block-a, .ui-grid-b .ui-block-b, .ui-grid-b .ui-block-c { width: 33.25%; }
+.ui-grid-b > :nth-child(n) { width: 33.333%; margin-right: -.5px; }
.ui-grid-b .ui-block-a { clear: left; }
-
/* grid c: 25/25/25/25 */
-.ui-grid-c .ui-block-a, .ui-grid-c .ui-block-b, .ui-grid-c .ui-block-c, .ui-grid-c .ui-block-d { width: 25%; }
+.ui-grid-c .ui-block-a, .ui-grid-c .ui-block-b, .ui-grid-c .ui-block-c, .ui-grid-c .ui-block-d { width: 24.925%; }
+.ui-grid-c > :nth-child(n) { width: 25%; margin-right: -.5px; }
.ui-grid-c .ui-block-a { clear: left; }
-
/* grid d: 20/20/20/20/20 */
-.ui-grid-d .ui-block-a, .ui-grid-d .ui-block-b, .ui-grid-d .ui-block-c, .ui-grid-d .ui-block-d, .ui-grid-d .ui-block-e { width: 20%; }
+.ui-grid-d .ui-block-a, .ui-grid-d .ui-block-b, .ui-grid-d .ui-block-c, .ui-grid-d .ui-block-d, .ui-grid-d .ui-block-e { width: 19.925%; }
+.ui-grid-d > :nth-child(n) { width: 20%; }
.ui-grid-d .ui-block-a { clear: left; }
+/* preset breakpoint to switch to stacked grid styles below 35em (560px) */
+@media all and (max-width: 35em) {
+ .ui-responsive .ui-block-a,
+ .ui-responsive .ui-block-b,
+ .ui-responsive .ui-block-c,
+ .ui-responsive .ui-block-d,
+ .ui-responsive .ui-block-e {
+ width: 100%;
+ float:none;
+ }
+}
/* fixed page header & footer configuration */
-.ui-header, .ui-footer, .ui-page-fullscreen .ui-header, .ui-page-fullscreen .ui-footer { position: absolute; overflow: hidden; width: 100%; border-left-width: 0; border-right-width: 0; }
-.ui-header-fixed, .ui-footer-fixed {
+.ui-header-fixed,
+.ui-footer-fixed {
+ left: 0;
+ right: 0;
+ width: 100%;
+ position: fixed;
z-index: 1000;
- -webkit-transform: translateZ(0); /* Force header/footer rendering to go through the same rendering pipeline as native page scrolling. */
-}
-.ui-footer-duplicate, .ui-page-fullscreen .ui-fixed-inline { display: none; }
-.ui-page-fullscreen .ui-header, .ui-page-fullscreen .ui-footer { opacity: .9; }
-.ui-navbar { overflow: hidden; }
-.ui-navbar ul, .ui-navbar-expanded ul { list-style:none; padding: 0; margin: 0; position: relative; display: block; border: 0;}
-.ui-navbar-collapsed ul { float: left; width: 75%; margin-right: -2px; }
-.ui-navbar-collapsed .ui-navbar-toggle { float: left; width: 25%; }
-.ui-navbar li.ui-navbar-truncate { position: absolute; left: -9999px; top: -9999px; }
-.ui-navbar li .ui-btn, .ui-navbar .ui-navbar-toggle .ui-btn { display: block; font-size: 12px; text-align: center; margin: 0; border-right-width: 0; max-width: 100%; }
-.ui-navbar li .ui-btn { margin-right: -1px; }
-.ui-navbar li .ui-btn:last-child { margin-right: 0; }
-.ui-header .ui-navbar li .ui-btn, .ui-header .ui-navbar .ui-navbar-toggle .ui-btn,
-.ui-footer .ui-navbar li .ui-btn, .ui-footer .ui-navbar .ui-navbar-toggle .ui-btn { border-top-width: 0; border-bottom-width: 0; }
-.ui-navbar .ui-btn-inner { padding-left: 2px; padding-right: 2px; }
-.ui-navbar-noicons li .ui-btn .ui-btn-inner, .ui-navbar-noicons .ui-navbar-toggle .ui-btn-inner { padding-top: .8em; padding-bottom: .9em; }
-/*expanded page styles*/
-.ui-navbar-expanded .ui-btn { margin: 0; font-size: 14px; }
-.ui-navbar-expanded .ui-btn-inner { padding-left: 5px; padding-right: 5px; }
-.ui-navbar-expanded .ui-btn-icon-top .ui-btn-inner { padding: 45px 5px 15px; text-align: center; }
-.ui-navbar-expanded .ui-btn-icon-top .ui-icon { top: 15px; }
-.ui-navbar-expanded .ui-btn-icon-bottom .ui-btn-inner { padding: 15px 5px 45px; text-align: center; }
-.ui-navbar-expanded .ui-btn-icon-bottom .ui-icon { bottom: 15px; }
-.ui-navbar-expanded li .ui-btn .ui-btn-inner { min-height: 2.5em; }
-.ui-navbar-expanded .ui-navbar-noicons .ui-btn .ui-btn-inner { padding-top: 1.8em; padding-bottom: 1.9em; }
-.ui-btn { display: block; text-align: center; cursor:pointer; position: relative; margin: .5em 5px; padding: 0; }
-.ui-header .ui-btn, .ui-footer .ui-btn, .ui-bar .ui-btn { display: inline-block; font-size: 13px; margin: 0; }
-.ui-btn-inline { display: inline-block; }
-.ui-btn-inner { padding: .6em 25px; display: block; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; position: relative; zoom: 1; }
+}
+.ui-header-fixed {
+ top: -1px;
+ padding-top: 1px;
+}
+.ui-header-fixed.ui-fixed-hidden {
+ top: 0;
+ padding-top: 0;
+}
+.ui-footer-fixed {
+ bottom: -1px;
+ padding-bottom: 1px;
+}
+.ui-footer-fixed.ui-fixed-hidden {
+ bottom: 0;
+ padding-bottom: 0;
+}
+.ui-header-fullscreen,
+.ui-footer-fullscreen {
+ filter: Alpha(Opacity=90);
+ opacity: .9;
+}
+.ui-page-header-fixed {
+ padding-top: 2.6875em;
+}
+.ui-page-footer-fixed {
+ padding-bottom: 2.6875em;
+}
+.ui-page-header-fullscreen > .ui-content,
+.ui-page-footer-fullscreen > .ui-content {
+ padding: 0;
+}
+.ui-fixed-hidden {
+ position: absolute;
+}
+.ui-page-header-fullscreen .ui-fixed-hidden,
+.ui-page-footer-fullscreen .ui-fixed-hidden {
+ left: -9999px;
+}
+.ui-header-fixed .ui-btn,
+.ui-footer-fixed .ui-btn {
+ z-index: 10;
+}
+/* workarounds for other widgets */
+.ui-android-2x-fixed .ui-li-has-thumb {
+ -webkit-transform: translate3d(0,0,0);
+}
+.ui-navbar { max-width: 100%; }
+.ui-navbar.ui-mini { margin: 0; }
+.ui-navbar ul:before, .ui-navbar ul:after { content: " "; display: table; }
+.ui-navbar ul:after { clear: both; }
+.ui-navbar ul { list-style:none; margin: 0; padding: 0; position: relative; display: block; border: 0; max-width: 100%; overflow: visible; zoom: 1; }
+.ui-navbar li .ui-btn { display: block; text-align: center; margin: 0 -1px 0 0; border-right-width: 0; }
+.ui-navbar li .ui-btn-icon-right .ui-icon { right: 6px; }
+/* add border if not in header/footer (full width) */
+.ui-navbar li:last-child .ui-btn,
+.ui-navbar .ui-grid-duo .ui-block-b .ui-btn { margin-right: 0; border-right-width: 1px; }
+.ui-header .ui-navbar li:last-child .ui-btn,
+.ui-footer .ui-navbar li:last-child .ui-btn,
+.ui-header .ui-navbar .ui-grid-duo .ui-block-b .ui-btn,
+.ui-footer .ui-navbar .ui-grid-duo .ui-block-b .ui-btn { margin-right: -1px; border-right-width: 0; }
+.ui-navbar .ui-grid-duo li.ui-block-a:last-child .ui-btn { margin-right: -1px; border-right-width: 1px; }
+.ui-header .ui-navbar li .ui-btn,
+.ui-footer .ui-navbar li .ui-btn { border-top-width: 0; border-bottom-width: 0; }
+/* fixing gaps caused by subpixel problem */
+.ui-header .ui-navbar .ui-grid-b li.ui-block-c .ui-btn,
+.ui-footer .ui-navbar .ui-grid-b li.ui-block-c .ui-btn { margin-right: -5px; }
+.ui-header .ui-navbar .ui-grid-c li.ui-block-d .ui-btn,
+.ui-footer .ui-navbar .ui-grid-c li.ui-block-d .ui-btn,
+.ui-header .ui-navbar .ui-grid-d li.ui-block-e .ui-btn,
+.ui-footer .ui-navbar .ui-grid-d li.ui-block-e .ui-btn { margin-right: -4px; }
+.ui-header .ui-navbar .ui-grid-b li.ui-block-c .ui-btn-icon-right .ui-icon,
+.ui-footer .ui-navbar .ui-grid-b li.ui-block-c .ui-btn-icon-right .ui-icon,
+.ui-header .ui-navbar .ui-grid-c li.ui-block-d .ui-btn-icon-right .ui-icon,
+.ui-footer .ui-navbar .ui-grid-c li.ui-block-d .ui-btn-icon-right .ui-icon,
+.ui-header .ui-navbar .ui-grid-d li.ui-block-e .ui-btn-icon-right .ui-icon,
+.ui-footer .ui-navbar .ui-grid-d li.ui-block-e .ui-btn-icon-right .ui-icon { right: 8px; }
+.ui-navbar li .ui-btn .ui-btn-inner { padding-top: .7em; padding-bottom: .8em }
+.ui-navbar li .ui-btn-icon-top .ui-btn-inner { padding-top: 30px; }
+.ui-navbar li .ui-btn-icon-bottom .ui-btn-inner { padding-bottom: 30px; }
+.ui-btn { display: block; text-align: center; cursor:pointer; position: relative; margin: .5em 0; padding: 0; }
+.ui-mini { margin-top: .25em; margin-bottom: .25em; }
+.ui-btn-left, .ui-btn-right, .ui-input-clear, .ui-btn-inline,
+.ui-grid-a .ui-btn, .ui-grid-b .ui-btn, .ui-grid-c .ui-btn, .ui-grid-d .ui-btn, .ui-grid-e .ui-btn, .ui-grid-solo .ui-btn { margin-right: 5px; margin-left: 5px; }
+.ui-btn-inner { font-size: 16px; padding: .6em 20px; min-width: .75em; display: block; position: relative; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; zoom: 1; }
.ui-btn input, .ui-btn button { z-index: 2; }
-.ui-header .ui-btn-inner, .ui-footer .ui-btn-inner, .ui-bar .ui-btn-inner { padding: .4em 8px .5em; }
+.ui-btn-left, .ui-btn-right, .ui-btn-inline { display: inline-block; vertical-align: middle; }
+.ui-mobile .ui-btn-left, .ui-mobile .ui-btn-right, .ui-btn-left > .ui-btn, .ui-btn-right > .ui-btn { margin: 0; } /* .ui-mobile to increase specificity level */
+.ui-btn-block { display: block; }
+.ui-header > .ui-btn,
+.ui-footer > .ui-btn { display: inline-block; margin: 0; }
+.ui-header .ui-btn-block,
+.ui-footer .ui-btn-block { display: block; }
+.ui-header .ui-btn-inner,
+.ui-footer .ui-btn-inner,
+.ui-mini .ui-btn-inner { font-size: 12.5px; padding: .55em 11px .5em; }
+.ui-fullsize .ui-btn-inner,
+.ui-fullsize .ui-btn-inner { font-size: 16px; padding: .6em 20px; }
.ui-btn-icon-notext { width: 24px; height: 24px; }
-.ui-btn-icon-notext .ui-btn-inner { padding: 2px 1px 2px 3px; }
-.ui-btn-text { position: relative; z-index: 1; }
+.ui-btn-icon-notext .ui-btn-inner { padding: 0; height: 100%; }
+.ui-btn-icon-notext .ui-btn-inner .ui-icon { margin: 2px 1px 2px 3px; float: left; }
+.ui-btn-text { position: relative; z-index: 1; width: 100%; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none; }
+div.ui-btn-text { width: auto; }
.ui-btn-icon-notext .ui-btn-text { position: absolute; left: -9999px; }
-.ui-btn-icon-left .ui-btn-inner { padding-left: 33px; }
+.ui-btn-icon-left .ui-btn-inner { padding-left: 40px; }
+.ui-btn-icon-right .ui-btn-inner { padding-right: 40px; }
+.ui-btn-icon-top .ui-btn-inner { padding-top: 40px; }
+.ui-btn-icon-bottom .ui-btn-inner { padding-bottom: 40px; }
.ui-header .ui-btn-icon-left .ui-btn-inner,
.ui-footer .ui-btn-icon-left .ui-btn-inner,
-.ui-bar .ui-btn-icon-left .ui-btn-inner { padding-left: 27px; }
-.ui-btn-icon-right .ui-btn-inner { padding-right: 33px; }
+.ui-mini.ui-btn-icon-left .ui-btn-inner,
+.ui-mini .ui-btn-icon-left .ui-btn-inner { padding-left: 30px; }
.ui-header .ui-btn-icon-right .ui-btn-inner,
.ui-footer .ui-btn-icon-right .ui-btn-inner,
-.ui-bar .ui-btn-icon-right .ui-btn-inner { padding-right: 27px; }
-.ui-btn-icon-top .ui-btn-inner { padding-top: 33px; }
+.ui-mini.ui-btn-icon-right .ui-btn-inner,
+.ui-mini .ui-btn-icon-right .ui-btn-inner { padding-right: 30px; }
.ui-header .ui-btn-icon-top .ui-btn-inner,
-.ui-footer .ui-btn-icon-top .ui-btn-inner,
-.ui-bar .ui-btn-icon-top .ui-btn-inner { padding-top: 27px; }
-.ui-btn-icon-bottom .ui-btn-inner { padding-bottom: 33px; }
+.ui-footer .ui-btn-icon-top .ui-btn-inner { padding: 30px 3px .5em 3px; }
+.ui-mini.ui-btn-icon-top .ui-btn-inner,
+.ui-mini .ui-btn-icon-top .ui-btn-inner { padding-top: 30px; }
.ui-header .ui-btn-icon-bottom .ui-btn-inner,
-.ui-footer .ui-btn-icon-bottom .ui-btn-inner,
-.ui-bar .ui-btn-icon-bottom .ui-btn-inner { padding-bottom: 27px; }
-
+.ui-footer .ui-btn-icon-bottom .ui-btn-inner { padding: .55em 3px 30px 3px; }
+.ui-mini.ui-btn-icon-bottom .ui-btn-inner,
+.ui-mini .ui-btn-icon-bottom .ui-btn-inner { padding-bottom: 30px; }
+/* Corner styling inheritance */
+.ui-btn-inner {
+ -webkit-border-radius: inherit;
+ border-radius: inherit;
+}
/*btn icon positioning*/
.ui-btn-icon-notext .ui-icon { display: block; z-index: 0;}
-.ui-btn-icon-left .ui-icon, .ui-btn-icon-right .ui-icon { position: absolute; top: 50%; margin-top: -9px; }
-.ui-btn-icon-top .ui-icon, .ui-btn-icon-bottom .ui-icon { position: absolute; left: 50%; margin-left: -9px; }
+.ui-btn-icon-left > .ui-btn-inner > .ui-icon, .ui-btn-icon-right > .ui-btn-inner > .ui-icon { position: absolute; top: 50%; margin-top: -9px; }
+.ui-btn-icon-top .ui-btn-inner .ui-icon, .ui-btn-icon-bottom .ui-btn-inner .ui-icon { position: absolute; left: 50%; margin-left: -9px; }
.ui-btn-icon-left .ui-icon { left: 10px; }
.ui-btn-icon-right .ui-icon { right: 10px; }
.ui-btn-icon-top .ui-icon { top: 10px; }
-.ui-btn-icon-bottom .ui-icon { bottom: 10px; }
+.ui-btn-icon-bottom .ui-icon { top: auto; bottom: 10px; }
.ui-header .ui-btn-icon-left .ui-icon,
.ui-footer .ui-btn-icon-left .ui-icon,
-.ui-bar .ui-btn-icon-left .ui-icon { left: 4px; }
+.ui-mini.ui-btn-icon-left .ui-icon,
+.ui-mini .ui-btn-icon-left .ui-icon { left: 5px; }
.ui-header .ui-btn-icon-right .ui-icon,
.ui-footer .ui-btn-icon-right .ui-icon,
-.ui-bar .ui-btn-icon-right .ui-icon { right: 4px; }
+.ui-mini.ui-btn-icon-right .ui-icon,
+.ui-mini .ui-btn-icon-right .ui-icon { right: 5px; }
.ui-header .ui-btn-icon-top .ui-icon,
.ui-footer .ui-btn-icon-top .ui-icon,
-.ui-bar .ui-btn-icon-top .ui-icon { top: 4px; }
+.ui-mini.ui-btn-icon-top .ui-icon,
+.ui-mini .ui-btn-icon-top .ui-icon { top: 5px; }
.ui-header .ui-btn-icon-bottom .ui-icon,
.ui-footer .ui-btn-icon-bottom .ui-icon,
-.ui-bar .ui-btn-icon-bottom .ui-icon { bottom: 4px; }
-
+.ui-mini.ui-btn-icon-bottom .ui-icon,
+.ui-mini .ui-btn-icon-bottom .ui-icon { bottom: 5px; }
/*hiding native button,inputs */
-.ui-btn-hidden { position: absolute; top: 0; left: 0; width: 100%; height: 100%; -webkit-appearance: button; opacity: .1; cursor: pointer; background: #fff; background: rgba(255,255,255,0); filter: Alpha(Opacity=.0001); font-size: 1px; border: none; line-height: 999px; }
-.ui-collapsible { margin: .5em 0; }
-.ui-collapsible-heading { font-size: 16px; display: block; margin: 0 -8px; padding: 0; border-width: 0 0 1px 0; position: relative; }
-.ui-collapsible-heading a { text-align: left; margin: 0; }
-.ui-collapsible-heading a .ui-btn-inner { padding-left: 40px; }
-.ui-collapsible-heading a span.ui-btn { position: absolute; left: 6px; top: 50%; margin: -12px 0 0 0; width: 20px; height: 20px; padding: 1px 0px 1px 2px; text-indent: -9999px; }
-.ui-collapsible-heading a span.ui-btn .ui-btn-inner { padding: 10px 0; }
-.ui-collapsible-heading a span.ui-btn .ui-icon { left: 0; margin-top: -10px; }
-.ui-collapsible-heading-status { position: absolute; top: -9999px; left:0px; }
+.ui-btn-hidden { position: absolute; top: 0; left: 0; width: 100%; height: 100%; -webkit-appearance: none; cursor: pointer; background: #fff; background: rgba(255,255,255,0); filter: Alpha(Opacity=0); opacity: .1; font-size: 1px; border: none; text-indent: -9999px; }
+/* Fixes IE/WP filter alpha opacity bugs */
+.ui-disabled .ui-btn-hidden { display: none; }
+.ui-disabled { z-index: 1; }
+.ui-field-contain .ui-btn.ui-submit { margin: 0; }
+label.ui-submit { font-size: 16px; line-height: 1.4; font-weight: normal; margin: 0 0 .3em; display: block; }
+@media all and (min-width: 28em){
+ .ui-field-contain label.ui-submit { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0; }
+ .ui-field-contain .ui-btn.ui-submit { width: 78%; display: inline-block; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; -ms-box-sizing: border-box; box-sizing: border-box; }
+ .ui-hide-label .ui-btn.ui-submit { width: auto; display: block; }
+}
+.ui-collapsible-inset { margin: .5em 0; }
+.ui-collapsible-heading { font-size: 16px; display: block; margin: 0 -15px; padding: 0; position: relative; }
+.ui-collapsible-inset .ui-collapsible-heading { margin: 0; }
+.ui-collapsible-heading .ui-btn { text-align: left; margin: 0; border-left-width: 0; border-right-width: 0; }
+.ui-collapsible-inset .ui-collapsible-heading .ui-btn { border-right-width: 1px; border-left-width: 1px; }
+.ui-collapsible-collapsed + .ui-collapsible:not(.ui-collapsible-inset) .ui-collapsible-heading .ui-btn { border-top-width: 0; }
+.ui-collapsible-set .ui-collapsible:not(.ui-collapsible-inset) .ui-collapsible-heading .ui-btn { border-top-width: 1px; }
+.ui-collapsible-heading .ui-btn-inner { padding-left: 12px; padding-right: 12px; }
+.ui-collapsible-heading .ui-btn-icon-left .ui-btn-inner { padding-left: 40px; }
+.ui-collapsible-heading .ui-btn-icon-right .ui-btn-inner { padding-right: 40px; }
+.ui-collapsible-heading .ui-btn-icon-top .ui-btn-inner,
+.ui-collapsible-heading .ui-btn-icon-bottom .ui-btn-inner { text-align: center; }
+.ui-collapsible-heading .ui-btn-icon-left.ui-mini .ui-btn-inner { padding-left: 30px; }
+.ui-collapsible-heading .ui-btn-icon-right.ui-mini .ui-btn-inner { padding-right: 30px; }
+.ui-collapsible-heading .ui-btn span.ui-btn { position: absolute; left: 6px; top: 50%; margin: -12px 0 0 0; width: 20px; height: 20px; padding: 1px 0 1px 2px; text-indent: -9999px; }
+.ui-collapsible-heading .ui-btn span.ui-btn .ui-btn-inner { padding: 10px 0; }
+.ui-collapsible-heading .ui-btn span.ui-btn .ui-icon { left: 0; margin-top: -10px; }
+.ui-collapsible-heading-status { position: absolute; top: -9999px; left: 0; }
.ui-collapsible-content {
display: block;
- margin: 0 -8px;
- padding: 10px 16px;
- border-top: none; /* Overrides ui-btn-up-* */
- background-image: none; /* Overrides ui-btn-up-* */
- font-weight: normal; /* Overrides ui-btn-up-* */
-}
+ margin: 0 -15px;
+ padding: 10px 15px;
+ border-left-width: 0;
+ border-right-width: 0;
+ border-top: none; /* Overrides ui-body-* */
+ background-image: none; /* Overrides ui-body-* */
+}
+.ui-collapsible-inset .ui-collapsible-content { margin: 0; border-right-width: 1px; border-left-width: 1px; }
.ui-collapsible-content-collapsed { display: none; }
-
+.ui-collapsible-set > .ui-collapsible.ui-corner-all {
+ -webkit-border-radius: 0;
+ border-radius: 0;
+}
+.ui-collapsible-heading,
+.ui-collapsible-heading > .ui-btn {
+ -webkit-border-radius: inherit;
+ border-radius: inherit;
+}
+.ui-collapsible-set .ui-collapsible.ui-first-child {
+ -webkit-border-top-right-radius: inherit;
+ border-top-right-radius: inherit;
+ -webkit-border-top-left-radius: inherit;
+ border-top-left-radius: inherit;
+}
+.ui-collapsible-content,
+.ui-collapsible-set .ui-collapsible.ui-last-child {
+ -webkit-border-bottom-right-radius: inherit;
+ border-bottom-right-radius: inherit;
+ -webkit-border-bottom-left-radius: inherit;
+ border-bottom-left-radius: inherit;
+}
+.ui-collapsible-themed-content:not(.ui-collapsible-collapsed) > .ui-collapsible-heading {
+ -webkit-border-bottom-right-radius: 0;
+ border-bottom-right-radius: 0;
+ -webkit-border-bottom-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
.ui-collapsible-set { margin: .5em 0; }
.ui-collapsible-set .ui-collapsible { margin: -1px 0 0; }
-.ui-controlgroup, fieldset.ui-controlgroup { padding: 0; margin: .5em 0 1em; }
-.ui-bar .ui-controlgroup { margin: 0 .3em; }
-.ui-controlgroup-label { font-size: 16px; line-height: 1.4; font-weight: normal; margin: 0 0 .3em; }
-.ui-controlgroup-controls { display: block; width: 100%;}
+.ui-collapsible-set .ui-collapsible.ui-first-child { margin-top: 0; }
+.ui-controlgroup, fieldset.ui-controlgroup { padding: 0; margin: .5em 0; zoom: 1; }
+.ui-controlgroup.ui-mini, fieldset.ui-controlgroup.ui-mini { margin: .25em 0; }
+.ui-field-contain .ui-controlgroup, .ui-field-contain fieldset.ui-controlgroup { margin: 0; }
+.ui-bar .ui-controlgroup { margin: 0 5px; }
+.ui-controlgroup-label { font-size: 16px; line-height: 1.4; font-weight: normal; margin: 0 0 .4em; }
+.ui-controlgroup-controls label.ui-select,
+.ui-controlgroup-controls label.ui-submit { position: absolute; left: -9999px; }
.ui-controlgroup li { list-style: none; }
-.ui-controlgroup-vertical .ui-btn,
-.ui-controlgroup-vertical .ui-checkbox, .ui-controlgroup-vertical .ui-radio { margin: 0; border-bottom-width: 0; }
-.ui-controlgroup-controls label.ui-select { position: absolute; left: -9999px; }
-
-.ui-controlgroup-vertical .ui-controlgroup-last { border-bottom-width: 1px; }
-.ui-controlgroup-horizontal { padding: 0; }
-.ui-controlgroup-horizontal .ui-btn, .ui-controlgroup-horizontal .ui-select { display: inline-block; margin: 0 -5px 0 0; }
-.ui-controlgroup-horizontal .ui-checkbox, .ui-controlgroup-horizontal .ui-radio { float: left; margin: 0 -1px 0 0; }
-.ui-controlgroup-horizontal .ui-checkbox .ui-btn, .ui-controlgroup-horizontal .ui-radio .ui-btn,
-.ui-controlgroup-horizontal .ui-checkbox:last-child, .ui-controlgroup-horizontal .ui-radio:last-child { margin-right: 0; }
-.ui-controlgroup-horizontal .ui-controlgroup-last { margin-right: 0; }
-.ui-controlgroup .ui-checkbox label, .ui-controlgroup .ui-radio label { font-size: 16px; }
-/* conflicts with listview..
-.ui-controlgroup .ui-btn-icon-notext { width: 30px; height: 30px; text-indent: -9999px; }
-.ui-controlgroup .ui-btn-icon-notext .ui-btn-inner { padding: 5px 6px 5px 5px; }
-*/
-
-@media all and (min-width: 450px){
- .ui-field-contain .ui-controlgroup-label { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0; }
- .ui-field-contain .ui-controlgroup-controls { width: 60%; display: inline-block; }
- .ui-field-contain .ui-controlgroup .ui-select { width: 100%; }
+.ui-controlgroup .ui-btn { margin: 0; }
+.ui-controlgroup .ui-btn-icon-notext { width: auto; height: auto; top: auto; }
+.ui-controlgroup .ui-btn-icon-notext .ui-btn-inner { height: 20px; padding: .6em 20px .6em 20px }
+.ui-controlgroup-horizontal .ui-btn-icon-notext .ui-btn-inner { width: 18px; }
+.ui-controlgroup.ui-mini .ui-btn-icon-notext .ui-btn-inner,
+.ui-header .ui-controlgroup .ui-btn-icon-notext .ui-btn-inner,
+.ui-footer .ui-controlgroup .ui-btn-icon-notext .ui-btn-inner { height: 16px; padding: .55em 11px .5em 11px; }
+.ui-controlgroup .ui-btn-icon-notext .ui-btn-inner .ui-icon { position: absolute; top: 50%; right: 50%; margin: -9px -9px 0 0; }
+.ui-controlgroup-horizontal .ui-btn-inner { text-align: center; }
+.ui-controlgroup-horizontal.ui-mini .ui-btn-inner { height: 16px; line-height: 16px; }
+.ui-controlgroup .ui-checkbox label, .ui-controlgroup .ui-radio label { font-size: 16px; }
+.ui-controlgroup-horizontal .ui-controlgroup-controls:before,
+.ui-controlgroup-horizontal .ui-controlgroup-controls:after { content: ""; display: table; }
+.ui-controlgroup-horizontal .ui-controlgroup-controls:after { clear: both; }
+.ui-controlgroup-horizontal .ui-controlgroup-controls { display: inline-block; vertical-align: middle; zoom: 1; }
+.ui-controlgroup-horizontal .ui-controlgroup-controls > .ui-btn, .ui-controlgroup-horizontal .ui-controlgroup-controls li > .ui-btn,
+.ui-controlgroup-horizontal .ui-checkbox, .ui-controlgroup-horizontal .ui-radio,
+.ui-controlgroup-horizontal .ui-select { float: left; clear: none; margin: 0; }
+/* On IE7 the floating selects will be displayed as block if .ui-btn-text has width 100% */
+.ui-controlgroup-horizontal .ui-select .ui-btn-text { width: auto; }
+.ui-controlgroup-vertical .ui-btn { border-bottom-width: 0; }
+.ui-controlgroup-vertical .ui-btn.ui-last-child { border-bottom-width: 1px; }
+.ui-controlgroup-horizontal .ui-btn { border-right-width: 0; }
+.ui-controlgroup-horizontal .ui-btn.ui-last-child { border-right-width: 1px; }
+.ui-controlgroup .ui-btn-corner-all {
+ -webkit-border-radius: 0;
+ border-radius: 0;
+}
+.ui-controlgroup .ui-controlgroup-controls,
+.ui-controlgroup .ui-radio,
+.ui-controlgroup .ui-checkbox,
+.ui-controlgroup .ui-select,
+.ui-controlgroup li {
+ -webkit-border-radius: inherit;
+ border-radius: inherit;
+}
+.ui-controlgroup-vertical .ui-btn.ui-first-child {
+ -webkit-border-top-left-radius: inherit;
+ border-top-left-radius: inherit;
+ -webkit-border-top-right-radius: inherit;
+ border-top-right-radius: inherit;
+}
+.ui-controlgroup-vertical .ui-btn.ui-last-child {
+ -webkit-border-bottom-left-radius: inherit;
+ border-bottom-left-radius: inherit;
+ -webkit-border-bottom-right-radius: inherit;
+ border-bottom-right-radius: inherit;
+}
+.ui-controlgroup-horizontal .ui-btn.ui-first-child {
+ -webkit-border-top-left-radius: inherit;
+ border-top-left-radius: inherit;
+ -webkit-border-bottom-left-radius: inherit;
+ border-bottom-left-radius: inherit;
+}
+.ui-controlgroup-horizontal .ui-btn.ui-last-child {
+ -webkit-border-top-right-radius: inherit;
+ border-top-right-radius: inherit;
+ -webkit-border-bottom-right-radius: inherit;
+ border-bottom-right-radius: inherit;
+}
+.ui-controlgroup .ui-shadow:not(.ui-focus) {
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
+@media all and (min-width: 28em){
+ .ui-field-contain .ui-controlgroup-label { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0; }
+ .ui-field-contain .ui-controlgroup-controls { width: 78%; display: inline-block; }
+ .ui-field-contain .ui-controlgroup .ui-select { width: 100%; display: block; }
.ui-field-contain .ui-controlgroup-horizontal .ui-select { width: auto; }
-} .ui-dialog { min-height: 480px; }
-.ui-dialog .ui-header,
-.ui-dialog .ui-content,
-.ui-dialog .ui-footer {
- max-width: 500px;
- margin: 10% auto 15px auto;
- width: 85%;
+ .ui-hide-label .ui-controlgroup-controls { width: 100%; }
+}
+.ui-dialog {
+ background: none !important; /* this is to ensure that dialog theming does not apply (by default at least) on the page div */
+}
+.ui-dialog-contain {
+ width: 92.5%;
+ max-width: 500px;
+ margin: 10% auto 15px auto;
+ padding: 0;
+ position: relative;
+ top: -15px;
+}
+.ui-dialog-contain > .ui-header,
+.ui-dialog-contain > .ui-content,
+.ui-dialog-contain > .ui-footer {
+ display: block;
position: relative;
+ width: auto;
+ margin: 0;
}
-.ui-dialog .ui-header,
-.ui-dialog .ui-footer {
- padding: 0 15px;
+.ui-dialog-contain > .ui-header {
+ border: none;
+ overflow: hidden;
z-index: 10;
+ padding: 0;
}
-.ui-dialog .ui-content {
+.ui-dialog-contain > .ui-content {
padding: 15px;
}
-.ui-dialog .ui-content,
-.ui-dialog .ui-footer {
- margin-top: -15px;
+.ui-dialog-contain > .ui-footer {
+ z-index: 10;
+ padding: 0 15px;
+}
+.ui-popup-open .ui-header-fixed,
+.ui-popup-open .ui-footer-fixed {
+ position: absolute !important; /* See line #553 of popup.js */
}
-.ui-checkbox, .ui-radio { position:relative; margin: .2em 0 .5em; z-index: 1; }
-.ui-checkbox .ui-btn, .ui-radio .ui-btn { margin: 0; text-align: left; z-index: 2; }
+.ui-popup-screen {
+ background-image: url(data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==); /* Necessary to set some form of background to ensure element is clickable in IE6/7. While legacy IE won't understand the data-URI'd image, it ensures no additional requests occur in all other browsers with little overhead. */
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 1px;
+ position: absolute;
+ filter: Alpha(Opacity=0);
+ opacity: 0;
+ z-index: 1099;
+}
+.ui-popup-screen.in {
+ opacity: 0.5;
+ filter: Alpha(Opacity=50);
+}
+.ui-popup-screen.out {
+ opacity: 0;
+ filter: Alpha(Opacity=0);
+}
+.ui-popup-container {
+ z-index: 1100;
+ display: inline-block;
+ position: absolute;
+ padding: 0;
+ outline: 0;
+}
+.ui-popup {
+ position: relative;
+}
+.ui-popup.ui-content,
+.ui-popup .ui-content {
+ overflow: visible;
+}
+.ui-popup > p,
+.ui-popup > h1,
+.ui-popup > h2,
+.ui-popup > h3,
+.ui-popup > h4,
+.ui-popup > h5,
+.ui-popup > h6 {
+ margin: .5em 7px;
+}
+.ui-popup > span {
+ display: block;
+ margin: .5em 7px;
+}
+.ui-popup .ui-title {
+ font-size: 16px;
+ font-weight: bold;
+ margin-top: .5em;
+ margin-bottom: .5em;
+}
+.ui-popup-container .ui-content > p,
+.ui-popup-container .ui-content > h1,
+.ui-popup-container .ui-content > h2,
+.ui-popup-container .ui-content > h3,
+.ui-popup-container .ui-content > h4,
+.ui-popup-container .ui-content > h5,
+.ui-popup-container .ui-content > h6 {
+ margin: .5em 0;
+}
+.ui-popup-container .ui-content > span {
+ margin: 0;
+}
+.ui-popup-container .ui-content > p:first-child,
+.ui-popup-container .ui-content > h1:first-child,
+.ui-popup-container .ui-content > h2:first-child,
+.ui-popup-container .ui-content > h3:first-child,
+.ui-popup-container .ui-content > h4:first-child,
+.ui-popup-container .ui-content > h5:first-child,
+.ui-popup-container .ui-content > h6:first-child {
+ margin-top: 0;
+}
+.ui-popup-container .ui-content > p:last-child,
+.ui-popup-container .ui-content > h1:last-child,
+.ui-popup-container .ui-content > h2:last-child,
+.ui-popup-container .ui-content > h3:last-child,
+.ui-popup-container .ui-content > h4:last-child,
+.ui-popup-container .ui-content > h5:last-child,
+.ui-popup-container .ui-content > h6:last-child {
+ margin-bottom: 0;
+}
+.ui-popup > img {
+ width: auto;
+ height: auto;
+ max-width: 100%;
+ max-height: 100%;
+ vertical-align: middle;
+}
+.ui-popup:not(.ui-content) > img:only-child,
+.ui-popup:not(.ui-content) > .ui-btn-left:first-child + img:last-child,
+.ui-popup:not(.ui-content) > .ui-btn-right:first-child + img:last-child {
+ -webkit-border-radius: inherit;
+ border-radius: inherit;
+}
+.ui-popup iframe {
+ vertical-align: middle;
+}
+@media all and (min-width: 28em){
+ .ui-popup .ui-field-contain label.ui-submit,
+ .ui-popup .ui-field-contain .ui-controlgroup-label,
+ .ui-popup .ui-field-contain label.ui-select,
+ .ui-popup .ui-field-contain label.ui-input-text {
+ font-size: 16px; line-height: 1.4; display: block; font-weight: normal; margin: 0 0 .3em;
+ }
+ .ui-popup .ui-field-contain .ui-btn.ui-submit,
+ .ui-popup .ui-field-contain .ui-controlgroup-controls,
+ .ui-popup .ui-field-contain .ui-select,
+ .ui-popup .ui-field-contain input.ui-input-text,
+ .ui-popup .ui-field-contain textarea.ui-input-text,
+ .ui-popup .ui-field-contain .ui-input-search {
+ width: 100%; display: block;
+ }
+}
+.ui-popup > .ui-btn-left,
+.ui-popup > .ui-btn-right {
+ position: absolute;
+ top: -9px;
+ margin: 0;
+ z-index: 1101;
+}
+.ui-popup > .ui-btn-left { left: -9px; }
+.ui-popup > .ui-btn-right { right: -9px; }
+.ui-popup-hidden { top: -99999px; left: -9999px; }
+.ui-checkbox, .ui-radio { position: relative; clear: both; margin: 0; z-index: 1; }
+.ui-checkbox .ui-btn, .ui-radio .ui-btn { text-align: left; z-index: 2; }
+.ui-controlgroup .ui-checkbox .ui-btn, .ui-controlgroup .ui-radio .ui-btn { margin: 0; }
.ui-checkbox .ui-btn-inner, .ui-radio .ui-btn-inner { white-space: normal; }
.ui-checkbox .ui-btn-icon-left .ui-btn-inner,.ui-radio .ui-btn-icon-left .ui-btn-inner { padding-left: 45px; }
+.ui-checkbox .ui-mini.ui-btn-icon-left .ui-btn-inner,.ui-radio .ui-mini.ui-btn-icon-left .ui-btn-inner { padding-left: 36px; }
.ui-checkbox .ui-btn-icon-right .ui-btn-inner, .ui-radio .ui-btn-icon-right .ui-btn-inner { padding-right: 45px; }
+.ui-checkbox .ui-mini.ui-btn-icon-right .ui-btn-inner, .ui-radio .ui-mini.ui-btn-icon-right .ui-btn-inner { padding-right: 36px; }
+.ui-checkbox .ui-btn-icon-top .ui-btn-inner, .ui-radio .ui-btn-icon-top .ui-btn-inner { padding-right: 0; padding-left: 0; text-align: center; }
+.ui-checkbox .ui-btn-icon-bottom .ui-btn-inner, .ui-radio .ui-btn-icon-bottom .ui-btn-inner { padding-right: 0; padding-left: 0; text-align: center; }
.ui-checkbox .ui-icon, .ui-radio .ui-icon { top: 1.1em; }
-.ui-checkbox .ui-btn-icon-left .ui-icon, .ui-radio .ui-btn-icon-left .ui-icon {left: 15px; }
-.ui-checkbox .ui-btn-icon-right .ui-icon, .ui-radio .ui-btn-icon-right .ui-icon {right: 15px; }
+.ui-checkbox .ui-btn-icon-left .ui-icon, .ui-radio .ui-btn-icon-left .ui-icon { left: 15px; }
+.ui-checkbox .ui-mini.ui-btn-icon-left .ui-icon, .ui-radio .ui-mini.ui-btn-icon-left .ui-icon { left: 9px; }
+.ui-checkbox .ui-btn-icon-right .ui-icon, .ui-radio .ui-btn-icon-right .ui-icon { right: 15px; }
+.ui-checkbox .ui-mini.ui-btn-icon-right .ui-icon, .ui-radio .ui-mini.ui-btn-icon-right .ui-icon { right: 9px; }
+.ui-checkbox .ui-btn-icon-top .ui-icon, .ui-radio .ui-btn-icon-top .ui-icon { top: 10px; }
+.ui-checkbox .ui-btn-icon-bottom .ui-icon, .ui-radio .ui-btn-icon-bottom .ui-icon { top: auto; bottom: 10px; }
+.ui-checkbox .ui-btn-icon-right .ui-icon, .ui-radio .ui-btn-icon-right .ui-icon { right: 15px; }
+.ui-checkbox .ui-mini.ui-btn-icon-right .ui-icon, .ui-radio .ui-mini.ui-btn-icon-right .ui-icon { right: 9px; }
+.ui-controlgroup-horizontal .ui-checkbox .ui-icon,
+.ui-controlgroup-horizontal .ui-radio .ui-icon { display: none; }
+.ui-controlgroup-horizontal .ui-checkbox .ui-btn-inner,
+.ui-controlgroup-horizontal .ui-radio .ui-btn-inner { padding: .6em 20px; }
+.ui-controlgroup-horizontal .ui-checkbox .ui-mini .ui-btn-inner,
+.ui-controlgroup-horizontal .ui-radio .ui-mini .ui-btn-inner { padding: .55em 11px .5em; }
/* input, label positioning */
-.ui-checkbox input,.ui-radio input { position:absolute; left:20px; top:50%; width: 10px; height: 10px; margin:-5px 0 0 0; outline: 0 !important; z-index: 1; }.ui-field-contain, fieldset.ui-field-contain { padding: 1.5em 0; margin: 0; border-width: 0 0 1px 0; overflow: visible; }
-.ui-field-contain:first-child { border-top-width: 0; }
-@media all and (min-width: 450px){
+.ui-checkbox input,.ui-radio input { position:absolute; left:20px; top:50%; width: 10px; height: 10px; margin:-5px 0 0 0; outline: 0 !important; z-index: 1; }
+.ui-field-contain, fieldset.ui-field-contain { padding: .8em 0; margin: 0; border-width: 0 0 1px 0; overflow: visible; }
+.ui-field-contain:last-child { border-bottom-width: 0; }
+.ui-field-contain { max-width: 100%; } /* This prevents horizontal scrollbar in IE7 */
+@media all and (min-width: 28em){
.ui-field-contain, .ui-mobile fieldset.ui-field-contain { border-width: 0; padding: 0; margin: 1em 0; }
-} .ui-select { display: block; position: relative; }
+}
+.ui-select { display: block; position: relative; }
.ui-select select { position: absolute; left: -9999px; top: -9999px; }
-.ui-select .ui-btn { overflow: hidden; }
-
-
.ui-select .ui-btn { opacity: 1; }
-
-/* Fixes #2588 — When Windows Phone 7.5 (Mango) tries to calculate a numeric opacity for a select—including “inheritâ€â€”without explicitly specifying an opacity on the parent to give it context, a bug appears where clicking elsewhere on the page after opening the select will open the select again. */
-.ui-select .ui-btn select { cursor: pointer; -webkit-appearance: button; left: 0; top:0; width: 100%; min-height: 1.5em; min-height: 100%; height: 3em; max-height: 100%; opacity: 0; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter: alpha(opacity=0); z-index: 2; }
-
+.ui-field-contain .ui-select .ui-btn { margin: 0; }
+/* Fixes #2588: When Windows Phone 7.5 (Mango) tries to calculate a numeric opacity for a select (including "inherit") without explicitly specifying an opacity on the parent to give it context, a bug appears where clicking elsewhere on the page after opening the select will open the select again. */
+.ui-select .ui-btn select { cursor: pointer; -webkit-appearance: none; left: 0; top:0; width: 100%; min-height: 1.5em; min-height: 100%; height: 3em; max-height: 100%; filter: Alpha(Opacity=0); opacity: 0; z-index: 2; }
.ui-select .ui-disabled { opacity: .3; }
-
-@-moz-document url-prefix() {.ui-select .ui-btn select { opacity: 0.0001; }}
-.ui-select .ui-btn select.ui-select-nativeonly { opacity: 1; text-indent: 0; }
-
-.ui-select .ui-btn-icon-right .ui-btn-inner { padding-right: 45px; }
-.ui-select .ui-btn-icon-right .ui-icon { right: 15px; }
-
+/* Display none because of issues with IE/WP's filter alpha opacity */
+.ui-select .ui-disabled select { display: none; }
+@-moz-document url-prefix() { .ui-select .ui-btn select { opacity: 0.0001; }}
+.ui-select .ui-btn.ui-select-nativeonly { border-radius: 0; border: 0; }
+.ui-select .ui-btn.ui-select-nativeonly select { opacity: 1; text-indent: 0; display: block; }
+.ui-select .ui-disabled.ui-select-nativeonly .ui-btn-inner { opacity: 0; }
+.ui-select .ui-btn-icon-right .ui-btn-inner, .ui-select .ui-li-has-count .ui-btn-inner { padding-right: 45px; }
+.ui-select .ui-mini.ui-btn-icon-right .ui-btn-inner { padding-right: 32px; }
+.ui-select .ui-btn-icon-right.ui-li-has-count .ui-btn-inner { padding-right: 80px; }
+.ui-select .ui-mini.ui-btn-icon-right.ui-li-has-count .ui-btn-inner { padding-right: 67px; }
+.ui-select .ui-btn-icon-right .ui-icon { right: 15px; }
+.ui-select .ui-mini.ui-btn-icon-right .ui-icon { right: 7px; }
+.ui-select .ui-btn-icon-right.ui-li-has-count .ui-li-count { right: 45px; }
+.ui-select .ui-mini.ui-btn-icon-right.ui-li-has-count .ui-li-count { right: 32px; }
/* labels */
-label.ui-select { font-size: 16px; line-height: 1.4; font-weight: normal; margin: 0 0 .3em; display: block; }
-
+label.ui-select { font-size: 16px; line-height: 1.4; font-weight: normal; margin: 0 0 .3em; display: block; }
/*listbox*/
-.ui-select .ui-btn-text, .ui-selectmenu .ui-btn-text { display: block; min-height: 1em; overflow: hidden; }
+.ui-select .ui-btn-text, .ui-selectmenu .ui-btn-text { display: block; min-height: 1em; overflow: hidden !important;
+/* This !important is required for iPad Safari specifically. See https://github.com/jquery/jquery-mobile/issues/2647 */ }
.ui-select .ui-btn-text { text-overflow: ellipsis; }
-
-.ui-selectmenu { position: absolute; padding: 0; z-index: 1100 !important; width: 80%; max-width: 350px; padding: 6px; }
+.ui-selectmenu { padding: 6px; min-width: 160px; }
.ui-selectmenu .ui-listview { margin: 0; }
.ui-selectmenu .ui-btn.ui-li-divider { cursor: default; }
-.ui-selectmenu-hidden { top: -9999px; left: -9999px; }
-.ui-selectmenu-screen { position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 99; }
.ui-screen-hidden, .ui-selectmenu-list .ui-li .ui-icon { display: none; }
.ui-selectmenu-list .ui-li .ui-icon { display: block; }
.ui-li.ui-selectmenu-placeholder { display: none; }
+.ui-selectmenu .ui-header { margin: 0; padding: 0; }
+.ui-selectmenu.ui-popup .ui-header { -webkit-border-top-left-radius: 0; border-top-left-radius: 0; -webkit-border-top-right-radius: 0; border-top-right-radius: 0; }
.ui-selectmenu .ui-header .ui-title { margin: 0.6em 46px 0.8em; }
-
-@media all and (min-width: 450px){
- .ui-field-contain label.ui-select { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0; }
- .ui-field-contain .ui-select { width: 60%; display: inline-block; }
+@media all and (min-width: 28em){
+ .ui-field-contain label.ui-select { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0; }
+ .ui-field-contain .ui-select { width: 78%; display: inline-block; }
+ .ui-hide-label .ui-select { width: 100%; }
}
-
/* when no placeholder is defined in a multiple select, the header height doesn't even extend past the close button. this shim's content in there */
.ui-selectmenu .ui-header h1:after { content: '.'; visibility: hidden; }
-
-/* TODO when the custom select css us moved out to it's own file this should be included */
-.ui-li-static .ui-select .ui-li-count { right: 38px; }
label.ui-input-text { font-size: 16px; line-height: 1.4; display: block; font-weight: normal; margin: 0 0 .3em; }
-input.ui-input-text, textarea.ui-input-text { background-image: none; padding: .4em; line-height: 1.4; font-size: 16px; display: block; width: 97%; }
+input.ui-input-text, textarea.ui-input-text { background-image: none; padding: .4em; margin: .5em 0; min-height: 1.4em; line-height: 1.4em; font-size: 16px; display: block; width: 100%; outline: 0; }
+input.ui-mini, .ui-mini input, textarea.ui-mini { font-size: 14px; }
+div.ui-input-text input.ui-input-text, div.ui-input-text textarea.ui-input-text,
+.ui-input-search input.ui-input-text { border: none; width: 100%; padding: .4em 0; margin: 0; display: block; background: transparent none; outline: 0 !important; }
+.ui-input-search, div.ui-input-text { margin: .5em 0; background-image: none; position: relative; }
+.ui-input-search { padding: 0 30px; }
+div.ui-input-text { padding: 0 .4em; }
+div.ui-input-has-clear { padding: 0 30px 0 .4em; }
+input.ui-input-text.ui-mini, textarea.ui-input-text.ui-mini,
+.ui-input-search.ui-mini, div.ui-input-text.ui-mini { margin: .25em 0; }
+.ui-field-contain input.ui-input-text, .ui-field-contain textarea.ui-input-text,
+.ui-field-contain .ui-input-search, .ui-field-contain div.ui-input-text { margin: 0; }
+textarea.ui-input-text { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; -ms-box-sizing: border-box; box-sizing: border-box; }
input.ui-input-text { -webkit-appearance: none; }
textarea.ui-input-text { height: 50px; -webkit-transition: height 200ms linear; -moz-transition: height 200ms linear; -o-transition: height 200ms linear; transition: height 200ms linear; }
-.ui-input-search { padding: 0 30px; background-image: none; position: relative; }
+textarea.ui-mini { height: 45px; }
.ui-icon-searchfield:after { position: absolute; left: 7px; top: 50%; margin-top: -9px; content: ""; width: 18px; height: 18px; opacity: .5; }
-.ui-input-search input.ui-input-text { border: none; width: 98%; padding: .4em 0; margin: 0; display: block; background: transparent none; outline: 0 !important; }
-.ui-input-search .ui-input-clear { position: absolute; right: 0; top: 50%; margin-top: -13px; }
-.ui-input-search .ui-input-clear-hidden { display: none; }
-
-/* orientation adjustments - incomplete!*/
-@media all and (min-width: 450px){
- .ui-field-contain label.ui-input-text { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0 }
- .ui-field-contain input.ui-input-text,
- .ui-field-contain textarea.ui-input-text,
- .ui-field-contain .ui-input-search { width: 60%; display: inline-block; }
- .ui-field-contain .ui-input-search { width: 50%; }
- .ui-hide-label input.ui-input-text,
- .ui-hide-label textarea.ui-input-text,
- .ui-hide-label .ui-input-search { padding: .4em; width: 97%; }
- .ui-input-search input.ui-input-text { width: 98%; /*echos rule from above*/ }
-}.ui-listview { margin: 0; counter-reset: listnumbering; }
-.ui-content .ui-listview { margin: -15px; }
-.ui-content .ui-listview-inset { margin: 1em 0; }
-.ui-listview, .ui-li { list-style:none; padding:0; }
-.ui-li, .ui-li.ui-field-contain { display: block; margin:0; position: relative; overflow: visible; text-align: left; border-width: 0; border-top-width: 1px; }
-.ui-li .ui-btn-text a.ui-link-inherit { text-overflow: ellipsis; overflow: hidden; white-space: nowrap; }
-.ui-li-divider, .ui-li-static { padding: .5em 15px; font-size: 14px; font-weight: bold; }
-.ui-li-divider { counter-reset: listnumbering; }
-ol.ui-listview .ui-link-inherit:before, ol.ui-listview .ui-li-static:before, .ui-li-dec { font-size: .8em; display: inline-block; padding-right: .3em; font-weight: normal;counter-increment: listnumbering; content: counter(listnumbering) ". "; }
-ol.ui-listview .ui-li-jsnumbering:before { content: "" !important; } /* to avoid chance of duplication */
+.ui-input-search .ui-input-clear, .ui-input-text .ui-input-clear { position: absolute; right: 0; top: 50%; margin-top: -13px; }
+.ui-mini .ui-input-clear { right: -3px; }
+.ui-input-search .ui-input-clear-hidden, .ui-input-text .ui-input-clear-hidden { display: none; }
+/* Resolves issue #5166: Added to support issue introduced in Firefox 15. We can likely remove this in the future. */
+input::-moz-placeholder, textarea::-moz-placeholder { color: #aaa; }
+/* Resolves issue #5131: Width of textinput depends on its type, for Android 4.1 */
+input[type=number]::-webkit-outer-spin-button { margin: 0; }
+@media all and (min-width: 28em){
+ .ui-field-contain label.ui-input-text { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0 }
+ .ui-field-contain input.ui-input-text,
+ .ui-field-contain textarea.ui-input-text,
+ .ui-field-contain .ui-input-search,
+ .ui-field-contain div.ui-input-text { width: 78%; display: inline-block; }
+ .ui-field-contain .ui-input-search,
+ .ui-field-contain div.ui-input-text { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; -ms-box-sizing: border-box; box-sizing: border-box; }
+ .ui-hide-label input.ui-input-text,
+ .ui-hide-label textarea.ui-input-text,
+ .ui-hide-label .ui-input-search,
+ .ui-hide-label div.ui-input-text,
+ .ui-input-search input.ui-input-text,
+ div.ui-input-text input.ui-input-text { width: 100%; }
+}
+.ui-rangeslider {
+ zoom: 1;
+ margin: 0;
+}
+.ui-rangeslider:before,
+.ui-rangeslider:after {
+ content: "";
+ display: table;
+}
+.ui-rangeslider:after {
+ clear: both;
+}
+/* Margin-top/bottom: .5em * 16px/14px to make it equal to ui-rangeslider-sliders margin (input font-size is 14px) */
+.ui-rangeslider input.ui-input-text.ui-slider-input {
+ margin: .57143em 0;
+}
+.ui-rangeslider.ui-mini input.ui-slider-input {
+ margin: .28571em 0;
+}
+.ui-rangeslider input.ui-slider-input.ui-rangeslider-last {
+ float: right;
+}
+.ui-rangeslider .ui-rangeslider-sliders {
+ position: relative;
+ overflow: visible;
+ height: 30px;
+ margin: .5em 68px;
+}
+.ui-rangeslider.ui-mini .ui-rangeslider-sliders {
+ margin: .25em 68px;
+}
+.ui-field-contain .ui-rangeslider input.ui-slider-input,
+.ui-field-contain .ui-rangeslider.ui-mini input.ui-slider-input,
+.ui-field-contain .ui-rangeslider .ui-rangeslider-sliders,
+.ui-field-contain .ui-rangeslider.ui-mini .ui-rangeslider-sliders {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+.ui-rangeslider .ui-rangeslider-sliders .ui-slider-track {
+ position: absolute;
+ top: 6px;
+ right: 0;
+ left: 0;
+ margin: 0;
+}
+.ui-rangeslider.ui-mini .ui-rangeslider-sliders .ui-slider-track {
+ top: 8px;
+}
+.ui-rangeslider .ui-slider-track:first-child .ui-slider-bg {
+ display: none;
+}
+.ui-rangeslider .ui-rangeslider-sliders .ui-slider-track:first-child {
+ background-color: transparent;
+ background: none;
+ border-width: 0;
+ height: 0;
+}
+/* this makes ie6 and ie7 set height to 0 to fix z-index problem */
+html >/**/body .ui-rangeslider .ui-rangeslider-sliders .ui-slider-track:first-child {
+ height: 15px;
+ border-width: 1px;
+}
+html >/**/body .ui-rangeslider.ui-mini .ui-rangeslider-sliders .ui-slider-track:first-child {
+ height: 12px;
+}
+@media all and (min-width: 28em){
+ .ui-field-contain .ui-rangeslider label.ui-slider {
+ float: left;
+ }
+ .ui-field-contain .ui-rangeslider input.ui-slider-input {
+ position: relative;
+ z-index: 1;
+ }
+ .ui-field-contain .ui-rangeslider input.ui-slider-input.ui-rangeslider-first,
+ .ui-field-contain .ui-rangeslider.ui-mini input.ui-slider-input.ui-rangeslider-first {
+ margin-right: 17px;
+ }
+ .ui-field-contain .ui-rangeslider .ui-rangeslider-sliders,
+ .ui-field-contain .ui-rangeslider.ui-mini .ui-rangeslider-sliders {
+ float: left;
+ width: 78%;
+ margin: 0 -68px;
+ }
+ .ui-field-contain .ui-rangeslider .ui-slider-track,
+ .ui-field-contain .ui-rangeslider.ui-mini .ui-slider-track {
+ right: 68px;
+ left: 68px;
+ }
+ .ui-field-contain.ui-hide-label .ui-rangeslider input.ui-slider-input.ui-rangeslider-first {
+ margin: 0;
+ }
+ .ui-field-contain.ui-hide-label .ui-rangeslider .ui-rangeslider-sliders,
+ .ui-field-contain.ui-hide-label .ui-rangeslider.ui-mini .ui-rangeslider-sliders {
+ width: auto;
+ float: none;
+ margin: 0 68px;
+ }
+ .ui-field-contain.ui-hide-label .ui-rangeslider .ui-slider-track,
+ .ui-field-contain.ui-hide-label .ui-rangeslider.ui-mini .ui-slider-track {
+ right: 0;
+ left: 0;
+ }
+}
+.ui-listview { margin: 0; }
+ol.ui-listview, ol.ui-listview .ui-li-divider { counter-reset: listnumbering; }
+.ui-content .ui-listview, .ui-panel-inner > .ui-listview { margin: -15px; }
+.ui-collapsible-content > .ui-listview { margin: -10px -15px; }
+.ui-content .ui-listview-inset, .ui-panel-inner .ui-listview-inset { margin: 1em 0; }
+.ui-collapsible-content .ui-listview-inset { margin: .5em 0; }
+.ui-listview, .ui-li { list-style: none; padding: 0; }
+.ui-li, .ui-li.ui-field-contain { display: block; margin: 0; position: relative; overflow: visible; text-align: left; border-width: 0; border-top-width: 1px; }
+.ui-li.ui-btn, .ui-li.ui-field-contain, .ui-li-divider, .ui-li-static { margin: 0; }
.ui-listview-inset .ui-li { border-right-width: 1px; border-left-width: 1px; }
-.ui-li:last-child, .ui-li.ui-field-contain:last-child { border-bottom-width: 1px; }
+.ui-li.ui-last-child, .ui-li.ui-field-contain.ui-last-child { border-bottom-width: 1px; }
+.ui-collapsible-content > .ui-listview:not(.ui-listview-inset) > .ui-li.ui-first-child { border-top-width: 0; }
+.ui-collapsible-themed-content .ui-listview:not(.ui-listview-inset) > .ui-li.ui-last-child { border-bottom-width: 0; }
+.ui-li .ui-btn-text a.ui-link-inherit { text-overflow: ellipsis; overflow: hidden; white-space: nowrap; }
+.ui-li-static { background-image: none; }
+.ui-li-divider { padding: .5em 15px; font-size: 14px; font-weight: bold; }
+ol.ui-listview .ui-link-inherit:before, ol.ui-listview .ui-li-static:before, .ui-li-dec { font-size: .8em; display: inline-block; padding-right: .3em; font-weight: normal; counter-increment: listnumbering; content: counter(listnumbering) ". "; }
+ol.ui-listview .ui-li-jsnumbering:before { content: "" !important; } /* to avoid chance of duplication */
+.ui-listview .ui-li > .ui-btn-text {
+ -webkit-border-radius: inherit;
+ border-radius: inherit;
+}
+.ui-listview > .ui-li.ui-first-child,
+.ui-listview .ui-btn.ui-first-child > .ui-li > .ui-btn-text > .ui-link-inherit {
+ -webkit-border-top-right-radius: inherit;
+ border-top-right-radius: inherit;
+ -webkit-border-top-left-radius: inherit;
+ border-top-left-radius: inherit;
+}
+.ui-listview > .ui-li.ui-last-child,
+.ui-listview .ui-btn.ui-last-child > .ui-li > .ui-btn-text > .ui-link-inherit,
+.ui-collapsible-content > .ui-listview:not(.ui-listview-inset),
+.ui-collapsible-content > .ui-listview:not(.ui-listview-inset) .ui-li.ui-last-child {
+ -webkit-border-bottom-right-radius: inherit;
+ border-bottom-right-radius: inherit;
+ -webkit-border-bottom-left-radius: inherit;
+ border-bottom-left-radius: inherit;
+}
+.ui-listview > .ui-li.ui-first-child .ui-li-link-alt {
+ -webkit-border-top-right-radius: inherit;
+ border-top-right-radius: inherit;
+}
+.ui-listview > .ui-li.ui-last-child .ui-li-link-alt {
+ -webkit-border-bottom-right-radius: inherit;
+ border-bottom-right-radius: inherit;
+}
+.ui-listview > .ui-li.ui-first-child .ui-li-thumb:not(.ui-li-icon) {
+ -webkit-border-top-left-radius: inherit;
+ border-top-left-radius: inherit;
+}
+.ui-listview > .ui-li.ui-last-child .ui-li-thumb:not(.ui-li-icon) {
+ -webkit-border-bottom-left-radius: inherit;
+ border-bottom-left-radius: inherit;
+}
.ui-li>.ui-btn-inner { display: block; position: relative; padding: 0; }
-.ui-li .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li { padding: .7em 15px .7em 15px; display: block; }
-.ui-li-has-thumb .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-thumb { min-height: 60px; padding-left: 100px; }
-.ui-li-has-icon .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-icon { min-height: 20px; padding-left: 40px; }
-.ui-li-has-count .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-count { padding-right: 45px; }
-.ui-li-has-arrow .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-arrow { padding-right: 30px; }
+.ui-li .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li { padding: .7em 15px; display: block; }
+.ui-li-has-thumb .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-thumb { min-height: 59px; padding-left: 100px; }
+.ui-li-has-icon .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-icon { min-height: 20px; padding-left: 40px; }
+.ui-li-has-count .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-count, .ui-li-divider.ui-li-has-count { padding-right: 45px; }
+.ui-li-has-arrow .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-arrow { padding-right: 40px; }
.ui-li-has-arrow.ui-li-has-count .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-arrow.ui-li-has-count { padding-right: 75px; }
-.ui-li-has-count .ui-btn-text { padding-right: 15px; }
-.ui-li-heading { font-size: 16px; font-weight: bold; display: block; margin: .6em 0; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; }
-.ui-li-desc { font-size: 12px; font-weight: normal; display: block; margin: -.5em 0 .6em; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; }
+.ui-li-heading { font-size: 16px; font-weight: bold; display: block; margin: .6em 0; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; }
+.ui-li-desc { font-size: 12px; font-weight: normal; display: block; margin: -.5em 0 .6em; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; }
+ol.ui-listview > .ui-li .ui-li-heading { display: inline-block; width: 100%; margin-left: -1.3em; text-indent: 1.3em; vertical-align: middle; }
+ol.ui-listview > .ui-li .ui-li-desc:not(.ui-li-aside) { text-indent: 1.55em; }
.ui-li-thumb, .ui-listview .ui-li-icon { position: absolute; left: 1px; top: 0; max-height: 80px; max-width: 80px; }
-.ui-listview .ui-li-icon { max-height: 40px; max-width: 40px; left: 10px; top: .9em; }
+.ui-listview .ui-li-icon { max-height: 16px; max-width: 16px; left: 10px; top: .9em; }
.ui-li-thumb, .ui-listview .ui-li-icon, .ui-li-content { float: left; margin-right: 10px; }
-
.ui-li-aside { float: right; width: 50%; text-align: right; margin: .3em 0; }
@media all and (min-width: 480px){
.ui-li-aside { width: 45%; }
}
.ui-li-divider { cursor: default; }
-.ui-li-has-alt .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-alt { padding-right: 95px; }
-.ui-li-has-count .ui-li-count { position: absolute; font-size: 11px; font-weight: bold; padding: .2em .5em; top: 50%; margin-top: -.9em; right: 38px; }
-.ui-li-divider .ui-li-count, .ui-li-static .ui-li-count { right: 10px; }
-.ui-li-has-alt .ui-li-count { right: 55px; }
+.ui-li-has-alt .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-alt { padding-right: 53px; }
+.ui-li-has-alt.ui-li-has-count .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-alt.ui-li-has-count { padding-right: 88px; }
+.ui-li-has-count .ui-li-count { position: absolute; font-size: 11px; font-weight: bold; padding: .2em .5em; top: 50%; margin-top: -.9em; right: 10px; }
+.ui-li-has-count.ui-li-divider .ui-li-count, .ui-li-has-count .ui-link-inherit .ui-li-count { margin-top: -.95em; }
+.ui-li-has-arrow.ui-li-has-count .ui-li-count { right: 40px; }
+.ui-li-has-alt.ui-li-has-count .ui-li-count { right: 53px; }
.ui-li-link-alt { position: absolute; width: 40px; height: 100%; border-width: 0; border-left-width: 1px; top: 0; right: 0; margin: 0; padding: 0; z-index: 2; }
-.ui-li-link-alt .ui-btn { overflow: hidden; position: absolute; right: 8px; top: 50%; margin: -11px 0 0 0; border-bottom-width: 1px; z-index: -1;}
+.ui-li-link-alt .ui-btn { overflow: hidden; position: absolute; right: 8px; top: 50%; margin: -13px 0 0 0; border-bottom-width: 1px; z-index: -1;}
.ui-li-link-alt .ui-btn-inner { padding: 0; height: 100%; position: absolute; width: 100%; top: 0; left: 0;}
-.ui-li-link-alt .ui-btn .ui-icon { right: 50%; margin-right: -9px; }
-
-.ui-listview * .ui-btn-inner > .ui-btn > .ui-btn-inner { border-top: 0px; }
-
-.ui-listview-filter { border-width: 0; overflow: hidden; margin: -15px -15px 15px -15px }
+.ui-li-link-alt .ui-btn .ui-icon { right: 50%; margin-right: -9px; }
+.ui-li-link-alt .ui-btn-icon-notext .ui-btn-inner .ui-icon { position: absolute; top: 50%; margin-top: -9px; }
+.ui-listview * .ui-btn-inner > .ui-btn > .ui-btn-inner { border-top: 0; }
+.ui-listview-filter { border-width: 0; overflow: hidden; margin: -15px -15px 15px -15px; }
+.ui-collapsible-content .ui-listview-filter { margin: -10px -15px 10px -15px; border-bottom: inherit; }
+.ui-listview-filter-inset { margin: -15px -5px; background: transparent; }
+.ui-collapsible-content .ui-listview-filter-inset { margin: -5px; border-bottom-width: 0; }
.ui-listview-filter .ui-input-search { margin: 5px; width: auto; display: block; }
-
-.ui-listview-filter-inset { margin: -15px -5px -15px -5px; background: transparent; }
-.ui-li.ui-screen-hidden{display:none;}
+.ui-li.ui-screen-hidden{ display:none; }
/* Odd iPad positioning issue. */
@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) {
.ui-li .ui-btn-text { overflow: visible; }
-}label.ui-slider { font-size: 16px; line-height: 1.4; font-weight: normal; margin: 0 0 .3em; display: block; }
-input.ui-slider-input,
-.ui-field-contain input.ui-slider-input { display: inline-block; width: 50px; }
-select.ui-slider-switch { display: none; }
-div.ui-slider { position: relative; display: inline-block; overflow: visible; height: 15px; padding: 0; margin: 0 2% 0 20px; top: 4px; width: 60%; }
-div.ui-slider-switch { width: 99.8%; }
-a.ui-slider-handle { position: absolute; z-index: 10; top: 50%; width: 28px; height: 28px; margin-top: -15px; margin-left: -15px; }
-a.ui-slider-handle .ui-btn-inner { padding-left: 0; padding-right: 0; }
-@media all and (min-width: 480px){
- .ui-field-contain label.ui-slider { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0; }
- .ui-field-contain div.ui-slider { width: 43%; }
+}
+label.ui-slider {
+ font-size: 16px;
+ line-height: 1.4;
+ font-weight: normal;
+ margin: 0;
+ display: block;
+}
+.ui-field-contain label.ui-slider {
+ margin-bottom: .4em;
+}
+div.ui-slider {
+ height: 30px;
+ margin: .5em 0;
+ zoom: 1;
+}
+div.ui-slider.ui-mini {
+ margin: .25em 0;
+}
+.ui-field-contain div.ui-slider,
+.ui-field-contain div.ui-slider.ui-mini {
+ margin: 0;
+}
+div.ui-slider:before, div.ui-slider:after {
+ content: "";
+ display: table;
+}
+div.ui-slider:after {
+ clear: both;
+}
+/* High level of specificity to override Textinput CSS. */
+input.ui-input-text.ui-slider-input {
+ display: block;
+ float: left;
+ margin: 0;
+ padding: 4px;
+ width: 40px;
+ height: 22px;
+ line-height: 22px;
+ font-size: 14px;
+ border-width: 0;
+ background-image: none;
+ font-weight: bold;
+ text-align: center;
+ vertical-align: text-bottom;
+ outline: 0;
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ -ms-box-sizing: content-box;
+ box-sizing: content-box;
+}
+.ui-slider-input::-webkit-outer-spin-button,
+.ui-slider-input::-webkit-inner-spin-button {
+ -webkit-appearance: none;
+ margin: 0;
+}
+.ui-slider-track,
+.ui-slider-switch {
+ position: relative;
+ overflow: visible;
+ height: 15px;
+ margin: 0 15px 0 68px;
+ top: 6px;
+}
+.ui-slider-track.ui-mini {
+ height: 12px;
+ top: 8px;
+}
+.ui-slider-bg {
+ border: none;
+ height: 100%;
+}
+/* High level of specificity to override button margins in grids */
+.ui-slider-track .ui-btn.ui-slider-handle,
+.ui-slider-switch .ui-btn.ui-slider-handle {
+ position: absolute;
+ z-index: 1;
+ top: 50%;
+ width: 28px;
+ height: 28px;
+ margin: -15px 0 0 -15px;
+ outline: 0;
+}
+.ui-slider-track.ui-mini .ui-slider-handle {
+ height: 14px;
+ width: 14px;
+ margin: -8px 0 0 -7px;
+}
+.ui-slider-handle .ui-btn-inner {
+ padding: 0;
+ height: 100%;
+}
+.ui-slider-track.ui-mini .ui-slider-handle .ui-btn-inner {
+ height: 30px;
+ width: 30px;
+ padding: 0;
+ margin: -9px 0 0 -9px;
+ border-top: none;
+}
+select.ui-slider-switch {
+ display: none;
+}
+div.ui-slider-switch {
+ display: inline-block;
+ height: 32px;
+ width: 5.8em;
+ margin: .5em 0;
+ top: 0;
+}
+/* reset the clearfix */
+div.ui-slider-switch:before, div.ui-slider-switch:after {
+ display: none;
+ clear: none;
+}
+div.ui-slider-switch.ui-mini {
+ width: 5em;
+ height: 29px;
+ margin: .25em 0;
+ top: 0;
+}
+.ui-field-contain .ui-slider-switch,
+.ui-field-contain .ui-slider-switch.ui-mini {
+ margin: 0;
+}
+.ui-slider-inneroffset {
+ margin: 0 16px;
+ position: relative;
+ z-index: 1;
+}
+.ui-slider-switch.ui-mini .ui-slider-inneroffset {
+ margin: 0 15px 0 14px;
+}
+.ui-slider-switch .ui-btn.ui-slider-handle {
+ margin: 1px 0 0 -15px;
+}
+.ui-slider-switch.ui-mini .ui-slider-handle {
+ width: 25px;
+ height: 25px;
+ margin: 1px 0 0 -13px;
+ padding: 0;
+}
+.ui-slider-handle-snapping {
+ -webkit-transition: left 70ms linear;
+ -moz-transition: left 70ms linear;
+}
+.ui-slider-switch.ui-mini .ui-slider-handle .ui-btn-inner {
+ height: 30px;
+ width: 30px;
+ padding: 0;
+ margin: 0;
+ border-top: none;
+}
+.ui-slider-switch .ui-slider-label {
+ position: absolute;
+ text-align: center;
+ width: 100%;
+ overflow: hidden;
+ font-size: 16px;
+ top: 0;
+ line-height: 2;
+ min-height: 100%;
+ border-width: 0;
+ white-space: nowrap;
+ cursor: pointer;
+}
+.ui-slider-switch.ui-mini .ui-slider-label {
+ font-size: 14px;
+}
+.ui-slider-switch .ui-slider-label-a {
+ z-index: 1;
+ left: 0;
+ text-indent: -1.5em;
+}
+.ui-slider-switch .ui-slider-label-b {
+ z-index: 0;
+ right: 0;
+ text-indent: 1.5em;
+}
+@media all and (min-width: 28em){
+ .ui-field-contain label.ui-slider {
+ vertical-align: top;
+ display: inline-block;
+ width: 20%;
+ margin: 0 2% 0 0;
+ }
+ .ui-field-contain div.ui-slider {
+ display: inline-block;
+ width: 78%;
+ }
+ .ui-field-contain.ui-hide-label div.ui-slider {
+ display: block;
+ width: auto;
+ }
+ .ui-field-contain div.ui-slider-switch,
+ .ui-field-contain.ui-hide-label div.ui-slider-switch {
+ display: inline-block;
+ width: 5.8em;
+ }
+ .ui-field-contain div.ui-slider-switch.ui-mini {
+ width: 5em;
+ }
}
-
-div.ui-slider-switch { height: 32px; overflow: hidden; margin-left: 0; }
-div.ui-slider-inneroffset { margin-left: 50%; position: absolute; top: 1px; height: 100%; width: 50%; }
-a.ui-slider-handle-snapping { -webkit-transition: left 70ms linear; -moz-transition: left 70ms linear; }
-div.ui-slider-labelbg { position: absolute; top:0; margin: 0; border-width: 0; }
-div.ui-slider-switch div.ui-slider-labelbg-a { width: 60%; height: 100%; left: 0; }
-div.ui-slider-switch div.ui-slider-labelbg-b { width: 60%; height: 100%; right: 0; }
-.ui-slider-switch-a div.ui-slider-labelbg-a, .ui-slider-switch-b div.ui-slider-labelbg-b { z-index: -1; }
-.ui-slider-switch-a div.ui-slider-labelbg-b, .ui-slider-switch-b div.ui-slider-labelbg-a { z-index: 0; }
-
-div.ui-slider-switch a.ui-slider-handle { z-index: 20; width: 101%; height: 32px; margin-top: -18px; margin-left: -101%; }
-span.ui-slider-label { width: 100%; position: absolute;height: 32px; font-size: 16px; text-align: center; line-height: 2; background: none; border-color: transparent; }
-span.ui-slider-label-a { left: -100%; margin-right: -1px }
-span.ui-slider-label-b { right: -100%; margin-left: -1px }
+.ui-table {
+ border: 0;
+ border-collapse: collapse;
+ padding: 0;
+ width: 100%;
+}
+.ui-table th,
+.ui-table td {
+ line-height: 1.5em;
+ text-align: left;
+ padding: .4em .5em;
+ vertical-align:top;
+}
+.ui-table th .ui-btn,
+.ui-table td .ui-btn {
+ line-height: normal;
+}
+.ui-table th {
+ font-weight: bold;
+}
+.ui-table caption {
+ text-align:left;
+ margin-bottom:1.4em;
+ opacity: .5;
+}
+/* Add strokes between each row */
+.table-stroke thead th {
+ border-bottom: 1px solid #d6d6d6; /* non-RGBA fallback */
+ border-bottom: 1px solid rgba(0, 0, 0, .1);
+}
+.table-stroke tbody th,
+.table-stroke tbody td {
+ border-bottom: 1px solid #e6e6e6; /* non-RGBA fallback */
+ border-bottom: 1px solid rgba(0, 0, 0, .05);
+}
+/* Add alternating row stripes */
+.table-stripe tbody tr:nth-child(odd) td,
+.table-stripe tbody tr:nth-child(odd) th {
+ background-color: #eeeeee; /* non-RGBA fallback */
+ background-color: rgba(0,0,0,0.04);
+}
+/* Add stroke to the header and last item */
+.table-stripe thead th,
+.table-stripe tbody tr:last-child {
+ border-bottom: 1px solid #d6d6d6; /* non-RGBA fallback */
+ border-bottom: 1px solid rgba(0, 0, 0, .1);
+}
+/*
+ Styles for the table columntoggle mode
+*/
+.ui-table-columntoggle-btn {
+ float: right;
+ margin-bottom:.8em;
+}
+/* Remove top/bottom margins around the fieldcontain on check list */
+.ui-table-columntoggle-popup fieldset {
+ margin:0;
+}
+/* Hide all prioritized columns by default */
+@media only all {
+ th.ui-table-priority-6,
+ td.ui-table-priority-6,
+ th.ui-table-priority-5,
+ td.ui-table-priority-5,
+ th.ui-table-priority-4,
+ td.ui-table-priority-4,
+ th.ui-table-priority-3,
+ td.ui-table-priority-3,
+ th.ui-table-priority-2,
+ td.ui-table-priority-2,
+ th.ui-table-priority-1,
+ td.ui-table-priority-1 {
+ display: none;
+ }
+}
+/* Preset breakpoints if ".ui-responsive" class added to table */
+/* Show priority 1 at 320px (20em x 16px) */
+@media screen and (min-width: 20em) {
+ .ui-table-columntoggle.ui-responsive th.ui-table-priority-1,
+ .ui-table-columntoggle.ui-responsive td.ui-table-priority-1 {
+ display: table-cell;
+ }
+}
+/* Show priority 2 at 480px (30em x 16px) */
+@media screen and (min-width: 30em) {
+ .ui-table-columntoggle.ui-responsive th.ui-table-priority-2,
+ .ui-table-columntoggle.ui-responsive td.ui-table-priority-2 {
+ display: table-cell;
+ }
+}
+/* Show priority 3 at 640px (40em x 16px) */
+@media screen and (min-width: 40em) {
+ .ui-table-columntoggle.ui-responsive th.ui-table-priority-3,
+ .ui-table-columntoggle.ui-responsive td.ui-table-priority-3 {
+ display: table-cell;
+ }
+}
+/* Show priority 4 at 800px (50em x 16px) */
+@media screen and (min-width: 50em) {
+ .ui-table-columntoggle.ui-responsive th.ui-table-priority-4,
+ .ui-table-columntoggle.ui-responsive td.ui-table-priority-4 {
+ display: table-cell;
+ }
+}
+/* Show priority 5 at 960px (60em x 16px) */
+@media screen and (min-width: 60em) {
+ .ui-table-columntoggle.ui-responsive th.ui-table-priority-5,
+ .ui-table-columntoggle.ui-responsive td.ui-table-priority-5 {
+ display: table-cell;
+ }
+}
+/* Show priority 6 at 1,120px (70em x 16px) */
+@media screen and (min-width: 70em) {
+ .ui-table-columntoggle.ui-responsive th.ui-table-priority-6,
+ .ui-table-columntoggle.ui-responsive td.ui-table-priority-6 {
+ display: table-cell;
+ }
+}
+/* Unchecked manually: Always hide */
+.ui-table-columntoggle th.ui-table-cell-hidden,
+.ui-table-columntoggle td.ui-table-cell-hidden,
+.ui-table-columntoggle.ui-responsive th.ui-table-cell-hidden,
+.ui-table-columntoggle.ui-responsive td.ui-table-cell-hidden {
+ display: none;
+}
+/* Checked manually: Always show */
+.ui-table-columntoggle th.ui-table-cell-visible,
+.ui-table-columntoggle td.ui-table-cell-visible,
+.ui-table-columntoggle.ui-responsive th.ui-table-cell-visible,
+.ui-table-columntoggle.ui-responsive td.ui-table-cell-visible {
+ display: table-cell;
+}
+/*
+ Styles for the table columntoggle mode
+*/
+.ui-table-reflow td .ui-table-cell-label,
+.ui-table-reflow th .ui-table-cell-label {
+ display: none;
+}
+/* Mobile first styles: Begin with the stacked presentation at narrow widths */
+@media only all {
+ /* Hide the table headers */
+ .ui-table-reflow thead td,
+ .ui-table-reflow thead th {
+ display: none;
+ }
+ /* Show the table cells as a block level element */
+ .ui-table-reflow td,
+ .ui-table-reflow th {
+ text-align: left;
+ display: block;
+ }
+ /* Add a fair amount of top margin to visually separate each row when stacked */
+ .ui-table-reflow tbody th {
+ margin-top: 3em;
+ }
+ /* Make the label elements a percentage width */
+ .ui-table-reflow td .ui-table-cell-label,
+ .ui-table-reflow th .ui-table-cell-label {
+ display: block;
+ padding: .4em;
+ min-width: 30%;
+ display: inline-block;
+ margin: -.4em 1em -.4em -.4em;
+ }
+ /* For grouped headers, have a different style to visually separate the levels by classing the first label in each col group */
+ .ui-table-reflow th .ui-table-cell-label-top,
+ .ui-table-reflow td .ui-table-cell-label-top {
+ display: block;
+ padding: .4em 0;
+ margin: .4em 0;
+ text-transform: uppercase;
+ font-size: .9em;
+ font-weight: normal;
+ }
+}
+/* Breakpoint to show as a standard table at 560px (35em x 16px) or wider */
+@media ( min-width: 35em ) {
+ /* Fixes table rendering when switching between breakpoints in Safari <= 5. See https://github.com/jquery/jquery-mobile/issues/5380 */
+ .ui-table-reflow.ui-responsive {
+ display: table-row-group;
+ }
+ /* Show the table header rows */
+ .ui-table-reflow.ui-responsive td,
+ .ui-table-reflow.ui-responsive th,
+ .ui-table-reflow.ui-responsive tbody th,
+ .ui-table-reflow.ui-responsive tbody td,
+ .ui-table-reflow.ui-responsive thead td,
+ .ui-table-reflow.ui-responsive thead th {
+ display: table-cell;
+ margin: 0;
+ }
+ /* Hide the labels in each cell */
+ .ui-table-reflow.ui-responsive td .ui-table-cell-label,
+ .ui-table-reflow.ui-responsive th .ui-table-cell-label {
+ display: none;
+ }
+}
+/* Hack to make IE9 and WP7.5 treat cells like block level elements, scoped to ui-responsive class */
+/* Applied in a max-width media query up to the table layout breakpoint so we don't need to negate this*/
+@media ( max-width: 35em ) {
+ .ui-table-reflow.ui-responsive td,
+ .ui-table-reflow.ui-responsive th {
+ width: 100%;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ float: left;
+ clear: left;
+ }
+}
+/* panel */
+.ui-panel {
+ width: 17em;
+ min-height: 100%;
+ max-height: none;
+ border-width: 0;
+ position: absolute;
+ top: 0;
+ display: block;
+}
+.ui-panel-closed {
+ width: 0;
+ max-height: 100%;
+ overflow: hidden;
+ visibility: hidden;
+}
+.ui-panel-fixed {
+ position: fixed;
+ bottom: -1px; /* fixes gap on Chrome for Android */
+ padding-bottom: 1px;
+}
+.ui-panel-display-overlay {
+ z-index: 1001; /* fixed toolbars have z-index 1000 */
+}
+.ui-panel-display-reveal {
+ z-index: 0;
+}
+.ui-panel-display-push {
+ z-index: 999;
+}
+.ui-panel-inner {
+ padding: 15px;
+}
+/* content-wrap */
+.ui-panel-content-wrap {
+ position: relative;
+ left: 0;
+ min-height: inherit;
+ border: none;
+ z-index: 999;
+}
+.ui-panel-content-wrap-display-overlay,
+.ui-panel-animate.ui-panel-content-wrap > .ui-header, /* ios4 fix */
+.ui-panel-content-wrap-closed {
+ position: static;
+}
+/* dismiss */
+.ui-panel-dismiss {
+ position: absolute;
+ top: 0;
+ left:0;
+ height: 100%;
+ width: 100%;
+ z-index: 1002;
+ display: none;
+}
+.ui-panel-dismiss-open {
+ display: block;
+}
+/* animate class is added to panel, wrapper and fixed toolbars */
+.ui-panel-animate {
+ -webkit-transition: -webkit-transform 350ms ease;
+ -moz-transition: -moz-transform 350ms ease;
+ transition: transform 350ms ease;
+}
+/* hardware acceleration for smoother transitions on WebKit browsers */
+.ui-panel-animate.ui-panel:not(.ui-panel-display-reveal),
+.ui-panel-animate.ui-panel:not(.ui-panel-display-reveal) > div,
+.ui-panel-animate.ui-panel-closed.ui-panel-display-reveal > div,
+.ui-panel-animate.ui-panel-content-wrap,
+.ui-panel-animate.ui-panel-content-fixed-toolbar {
+ -webkit-backface-visibility: hidden;
+ -webkit-transform: translate3d(0,0,0);
+}
+/* positioning: panel */
+/* panel left */
+.ui-panel-position-left {
+ left: -17em;
+}
+/* animated: panel left (for overlay and push) */
+.ui-panel-animate.ui-panel-position-left.ui-panel-display-overlay,
+.ui-panel-animate.ui-panel-position-left.ui-panel-display-push {
+ left: 0;
+ -webkit-transform: translate3d(-17em,0,0);
+ -moz-transform: translate3d(-17em,0,0);
+ transform: translate3d(-17em,0,0);
+}
+/* panel left open */
+.ui-panel-position-left.ui-panel-display-reveal, /* negate "panel left" for reveal */
+.ui-panel-position-left.ui-panel-open {
+ left: 0;
+}
+/* animated: panel left open (for overlay and push) */
+.ui-panel-animate.ui-panel-position-left.ui-panel-open.ui-panel-display-overlay,
+.ui-panel-animate.ui-panel-position-left.ui-panel-open.ui-panel-display-push {
+ -webkit-transform: translate3d(0,0,0);
+ transform: translate3d(0,0,0);
+ -moz-transform: none;
+}
+/* panel right */
+.ui-panel-position-right {
+ right: -17em;
+}
+/* animated: panel right (for overlay and push) */
+.ui-panel-animate.ui-panel-position-right.ui-panel-display-overlay,
+.ui-panel-animate.ui-panel-position-right.ui-panel-display-push {
+ right: 0;
+ -webkit-transform: translate3d(17em,0,0);
+ -moz-transform: translate3d(17em,0,0);
+ transform: translate3d(17em,0,0);
+}
+/* panel right open */
+.ui-panel-position-right.ui-panel-display-reveal, /* negate "panel right" for reveal */
+.ui-panel-position-right.ui-panel-open {
+ right: 0;
+}
+/* animated: panel right open (for overlay and push) */
+.ui-panel-animate.ui-panel-position-right.ui-panel-open.ui-panel-display-overlay,
+.ui-panel-animate.ui-panel-position-right.ui-panel-open.ui-panel-display-push {
+ -webkit-transform: translate3d(0,0,0);
+ transform: translate3d(0,0,0);
+ -moz-transform: none;
+}
+/* positioning: content wrap, fixed toolbars and dismiss */
+/* panel left open */
+.ui-panel-content-fixed-toolbar-position-left.ui-panel-content-fixed-toolbar-open,
+.ui-panel-content-wrap-position-left.ui-panel-content-wrap-open,
+.ui-panel-dismiss-position-left.ui-panel-dismiss-open {
+ left: 17em;
+ right: -17em;
+}
+/* animated: panel left open (for reveal and push) */
+.ui-panel-animate.ui-panel-content-fixed-toolbar-position-left.ui-panel-content-fixed-toolbar-open.ui-panel-content-fixed-toolbar-display-reveal,
+.ui-panel-animate.ui-panel-content-fixed-toolbar-position-left.ui-panel-content-fixed-toolbar-open.ui-panel-content-fixed-toolbar-display-push,
+.ui-panel-animate.ui-panel-content-wrap-position-left.ui-panel-content-wrap-open.ui-panel-content-wrap-display-reveal,
+.ui-panel-animate.ui-panel-content-wrap-position-left.ui-panel-content-wrap-open.ui-panel-content-wrap-display-push {
+ left: 0;
+ right: 0;
+ -webkit-transform: translate3d(17em,0,0);
+ -moz-transform: translate3d(17em,0,0);
+ transform: translate3d(17em,0,0);
+}
+/* panel right open */
+.ui-panel-content-fixed-toolbar-position-right.ui-panel-content-fixed-toolbar-open,
+.ui-panel-content-wrap-position-right.ui-panel-content-wrap-open,
+.ui-panel-dismiss-position-right.ui-panel-dismiss-open {
+ left: -17em;
+ right: 17em;
+}
+/* animated: panel right open (for reveal and push) */
+.ui-panel-animate.ui-panel-content-fixed-toolbar-position-right.ui-panel-content-fixed-toolbar-open.ui-panel-content-fixed-toolbar-display-reveal,
+.ui-panel-animate.ui-panel-content-fixed-toolbar-position-right.ui-panel-content-fixed-toolbar-open.ui-panel-content-fixed-toolbar-display-push,
+.ui-panel-animate.ui-panel-content-wrap-position-right.ui-panel-content-wrap-open.ui-panel-content-wrap-display-reveal,
+.ui-panel-animate.ui-panel-content-wrap-position-right.ui-panel-content-wrap-open.ui-panel-content-wrap-display-push {
+ left: 0;
+ right: 0;
+ -webkit-transform: translate3d(-17em,0,0);
+ -moz-transform: translate3d(-17em,0,0);
+ transform: translate3d(-17em,0,0);
+}
+/* negate "panel left/right open" for overlay */
+.ui-panel-content-fixed-toolbar-open.ui-panel-content-fixed-toolbar-display-overlay,
+.ui-panel-content-wrap-open.ui-panel-content-wrap-display-overlay {
+ left: 0;
+}
+/* always disable overflow-x to prevent zoom issue on Android */
+.ui-page-active.ui-page-panel {
+ overflow-x: hidden;
+}
+/* shadows and borders */
+.ui-panel-display-reveal {
+ -webkit-box-shadow: inset -5px 0 5px rgba(0,0,0,.15);
+ -moz-box-shadow: inset -5px 0 5px rgba(0,0,0,.15);
+ box-shadow: inset -5px 0 5px rgba(0,0,0,.15);
+}
+.ui-panel-position-right.ui-panel-display-reveal {
+ -webkit-box-shadow: inset 5px 0 5px rgba(0,0,0,.15);
+ -moz-box-shadow: inset 5px 0 5px rgba(0,0,0,.15);
+ box-shadow: inset 5px 0 5px rgba(0,0,0,.15);
+}
+.ui-panel-display-overlay {
+ -webkit-box-shadow: 5px 0 5px rgba(0,0,0,.15);
+ -moz-box-shadow: 5px 0 5px rgba(0,0,0,.15);
+ box-shadow: 5px 0 5px rgba(0,0,0,.15);
+}
+.ui-panel-position-right.ui-panel-display-overlay {
+ -webkit-box-shadow: -5px 0 5px rgba(0,0,0,.15);
+ -moz-box-shadow: -5px 0 5px rgba(0,0,0,.15);
+ box-shadow: -5px 0 5px rgba(0,0,0,.15);
+}
+.ui-panel-display-push.ui-panel-open.ui-panel-position-left {
+ border-right-width: 1px;
+ margin-right: -1px;
+}
+.ui-panel-animate.ui-panel-content-fixed-toolbar-position-left.ui-panel-content-fixed-toolbar-open.ui-panel-content-fixed-toolbar-display-push {
+ margin-left: 1px;
+}
+.ui-panel-display-push.ui-panel-open.ui-panel-position-right {
+ border-left-width: 1px;
+ margin-left: -1px;
+}
+.ui-panel-animate.ui-panel-content-fixed-toolbar-position-right.ui-panel-content-fixed-toolbar-open.ui-panel-content-fixed-toolbar-display-push {
+ margin-right: 1px;
+}
+/* wrap on wide viewports once open */
+@media (min-width:55em){
+ .ui-responsive-panel.ui-page-panel-open .ui-panel-content-fixed-toolbar-display-push.ui-panel-content-fixed-toolbar-position-left,
+ .ui-responsive-panel.ui-page-panel-open .ui-panel-content-fixed-toolbar-display-reveal.ui-panel-content-fixed-toolbar-position-left,
+ .ui-responsive-panel.ui-page-panel-open .ui-panel-content-wrap-display-push.ui-panel-content-wrap-position-left,
+ .ui-responsive-panel.ui-page-panel-open .ui-panel-content-wrap-display-reveal.ui-panel-content-wrap-position-left {
+ margin-right: 17em;
+ }
+ .ui-responsive-panel.ui-page-panel-open .ui-panel-content-fixed-toolbar-display-push.ui-panel-content-fixed-toolbar-position-right,
+ .ui-responsive-panel.ui-page-panel-open .ui-panel-content-fixed-toolbar-display-reveal.ui-panel-content-fixed-toolbar-position-right,
+ .ui-responsive-panel.ui-page-panel-open .ui-panel-content-wrap-display-push.ui-panel-content-wrap-position-right,
+ .ui-responsive-panel.ui-page-panel-open .ui-panel-content-wrap-display-reveal.ui-panel-content-wrap-position-right {
+ margin-left: 17em;
+ }
+ .ui-responsive-panel.ui-page-panel-open .ui-panel-content-fixed-toolbar-display-push,
+ .ui-responsive-panel.ui-page-panel-open .ui-panel-content-fixed-toolbar-display-reveal {
+ width: auto;
+ }
+ .ui-responsive-panel .ui-panel-dismiss-display-push {
+ display: none;
+ }
+}
diff --git a/themes/smartpocket/js/code.photoswipe.min.js b/themes/smartpocket/js/code.photoswipe.min.js
index 8d6a7b843..95bc29020 100644
--- a/themes/smartpocket/js/code.photoswipe.min.js
+++ b/themes/smartpocket/js/code.photoswipe.min.js
@@ -1,7 +1,7 @@
// PhotoSwipe - http://www.photoswipe.com/
-// Copyright (c) 2011 by Code Computerlove (http://www.codecomputerlove.com)
+// Copyright (c) 2012 by Code Computerlove (http://www.codecomputerlove.com)
// Licensed under the MIT license
-// version: 3.0.4
+// version: 3.0.5
(function(e){if(!Function.prototype.bind)Function.prototype.bind=function(c){var a=[].slice,b=a.call(arguments,1),d=this,f=function(){},g=function(){return d.apply(this instanceof f?this:c||{},b.concat(a.call(arguments)))};f.prototype=d.prototype;g.prototype=new f;return g};if(typeof e.Code==="undefined")e.Code={};e.Code.Util={registerNamespace:function(){var c=arguments,a=null,b,d,f,g,h;b=0;for(g=c.length;b<g;b++){f=c[b];f=f.split(".");a=f[0];typeof e[a]==="undefined"&&(e[a]={});a=e[a];d=1;for(h=
f.length;d<h;++d)a[f[d]]=a[f[d]]||{},a=a[f[d]]}},coalesce:function(){var c,a;c=0;for(a=arguments.length;c<a;c++)if(!this.isNothing(arguments[c]))return arguments[c];return null},extend:function(c,a,b){var d;this.isNothing(b)&&(b=!0);if(c&&a&&this.isObject(a))for(d in a)this.objectHasProperty(a,d)&&(b?c[d]=a[d]:typeof c[d]==="undefined"&&(c[d]=a[d]))},clone:function(c){var a={};this.extend(a,c);return a},isObject:function(c){return c instanceof Object},isFunction:function(c){return{}.toString.call(c)===
"[object Function]"},isArray:function(c){return c instanceof Array},isLikeArray:function(c){return typeof c.length==="number"},isNumber:function(c){return typeof c==="number"},isString:function(c){return typeof c==="string"},isNothing:function(c){if(typeof c==="undefined"||c===null)return!0;return!1},swapArrayElements:function(c,a,b){var d=c[a];c[a]=c[b];c[b]=d},trim:function(c){return c.replace(/^\s\s*/,"").replace(/\s\s*$/,"")},toCamelCase:function(c){return c.replace(/(\-[a-z])/g,function(a){return a.toUpperCase().replace("-",
@@ -120,7 +120,7 @@ left:0,top:0,overflow:"hidden",zIndex:this.settings.zIndex,opacity:0});a.DOM.hid
(function(e,c,a){a.registerNamespace("Code.PhotoSwipe.ZoomPanRotate");e=e.Code.PhotoSwipe;e.ZoomPanRotate.CssClasses={zoomPanRotate:"ps-zoom-pan-rotate"};e.ZoomPanRotate.EventTypes={onTransform:"PhotoSwipeZoomPanRotateOnTransform"}})(window,window.klass,window.Code.Util);
(function(e,c,a){a.registerNamespace("Code.PhotoSwipe.ZoomPanRotate");var b=e.Code.PhotoSwipe;b.ZoomPanRotate.ZoomPanRotateClass=c({el:null,settings:null,containerEl:null,imageEl:null,transformSettings:null,panStartingPoint:null,transformEl:null,dispose:function(){var b;a.DOM.removeChild(this.el,this.el.parentNode);for(b in this)a.objectHasProperty(this,b)&&(this[b]=null)},initialize:function(c,f,g){var h,j,i;this.settings=c;this.settings.target===e?(c=document.body,h=a.DOM.windowWidth(),j=a.DOM.windowHeight(),
i=a.DOM.windowScrollTop()+"px"):(c=this.settings.target,h=a.DOM.width(c),j=a.DOM.height(c),i="0px");this.imageEl=f.imageEl.cloneNode(!1);a.DOM.setStyle(this.imageEl,{zIndex:1});this.transformSettings={startingScale:1,scale:1,startingRotation:0,rotation:0,startingTranslateX:0,startingTranslateY:0,translateX:0,translateY:0};this.el=a.DOM.createElement("div",{"class":b.ZoomPanRotate.CssClasses.zoomPanRotate},"");a.DOM.setStyle(this.el,{left:0,top:i,position:"absolute",width:h,height:j,zIndex:this.settings.zIndex,
-display:"block"});a.DOM.insertBefore(this.el,g.el,c);a.Browser.iOS?(this.containerEl=a.DOM.createElement("div"),a.DOM.setStyle(this.containerEl,{left:0,top:0,width:h,height:j,position:"absolute",zIndex:1}),a.DOM.appendChild(this.imageEl,this.containerEl),a.DOM.appendChild(this.containerEl,this.el),a.Animation.resetTranslate(this.containerEl),a.Animation.resetTranslate(this.imageEl),this.transformEl=this.containerEl):(a.DOM.appendChild(this.imageEl,this.el),this.transformEl=this.imageEl)},setStartingTranslateFromCurrentTransform:function(){var b=
+display:"block"});a.DOM.insertBefore(this.el,g.el,c);a.Browser.iOS?(this.containerEl=a.DOM.createElement("div","",""),a.DOM.setStyle(this.containerEl,{left:0,top:0,width:h,height:j,position:"absolute",zIndex:1}),a.DOM.appendChild(this.imageEl,this.containerEl),a.DOM.appendChild(this.containerEl,this.el),a.Animation.resetTranslate(this.containerEl),a.Animation.resetTranslate(this.imageEl),this.transformEl=this.containerEl):(a.DOM.appendChild(this.imageEl,this.el),this.transformEl=this.imageEl)},setStartingTranslateFromCurrentTransform:function(){var b=
a.coalesce(this.transformEl.style.webkitTransform,this.transformEl.style.MozTransform,this.transformEl.style.transform);if(!a.isNothing(b)&&(b=b.match(/translate\((.*?)\)/),!a.isNothing(b)))b=b[1].split(", "),this.transformSettings.startingTranslateX=e.parseInt(b[0],10),this.transformSettings.startingTranslateY=e.parseInt(b[1],10)},getScale:function(a){a*=this.transformSettings.startingScale;if(this.settings.minUserZoom!==0&&a<this.settings.minUserZoom)a=this.settings.minUserZoom;else if(this.settings.maxUserZoom!==
0&&a>this.settings.maxUserZoom)a=this.settings.maxUserZoom;return a},setStartingScaleAndRotation:function(a,b){this.transformSettings.startingScale=this.getScale(a);this.transformSettings.startingRotation=(this.transformSettings.startingRotation+b)%360},zoomRotate:function(a,b){this.transformSettings.scale=this.getScale(a);this.transformSettings.rotation=this.transformSettings.startingRotation+b;this.applyTransform()},panStart:function(a){this.setStartingTranslateFromCurrentTransform();this.panStartingPoint=
{x:a.x,y:a.y}},pan:function(a){var b=(a.y-this.panStartingPoint.y)/this.transformSettings.scale;this.transformSettings.translateX=this.transformSettings.startingTranslateX+(a.x-this.panStartingPoint.x)/this.transformSettings.scale;this.transformSettings.translateY=this.transformSettings.startingTranslateY+b;this.applyTransform()},zoomAndPanToPoint:function(b,c){if(this.settings.target===e){this.panStart({x:a.DOM.windowWidth()/2,y:a.DOM.windowHeight()/2});var g=(c.y-this.panStartingPoint.y)/this.transformSettings.scale;
@@ -137,10 +137,10 @@ b){g=c;break}return g}})(window,window.Code.Util);
uiLayerTouchHandler:null,carouselSlideByEndHandler:null,carouselSlideshowStartHandler:null,carouselSlideshowStopHandler:null,toolbarTapHandler:null,toolbarBeforeShowHandler:null,toolbarShowHandler:null,toolbarBeforeHideHandler:null,toolbarHideHandler:null,mouseWheelHandler:null,zoomPanRotateTransformHandler:null,_isResettingPosition:null,_uiWebViewResetPositionTimeout:null,dispose:function(){var b;a.Events.remove(this,i.EventTypes.onBeforeShow);a.Events.remove(this,i.EventTypes.onShow);a.Events.remove(this,
i.EventTypes.onBeforeHide);a.Events.remove(this,i.EventTypes.onHide);a.Events.remove(this,i.EventTypes.onDisplayImage);a.Events.remove(this,i.EventTypes.onResetPosition);a.Events.remove(this,i.EventTypes.onSlideshowStart);a.Events.remove(this,i.EventTypes.onSlideshowStop);a.Events.remove(this,i.EventTypes.onTouch);a.Events.remove(this,i.EventTypes.onBeforeCaptionAndToolbarShow);a.Events.remove(this,i.EventTypes.onCaptionAndToolbarShow);a.Events.remove(this,i.EventTypes.onBeforeCaptionAndToolbarHide);
a.Events.remove(this,i.EventTypes.onCaptionAndToolbarHide);a.Events.remove(this,i.EventTypes.onZoomPanRotateTransform);this.removeEventHandlers();a.isNothing(this.documentOverlay)||this.documentOverlay.dispose();a.isNothing(this.carousel)||this.carousel.dispose();a.isNothing(this.uiLayer)||this.uiLayer.dispose();a.isNothing(this.toolbar)||this.toolbar.dispose();this.destroyZoomPanRotate();a.isNothing(this.cache)||this.cache.dispose();for(b in this)a.objectHasProperty(this,b)&&(this[b]=null)},initialize:function(c,
-d,f){this.id=a.isNothing(f)?"PhotoSwipe"+(new Date).getTime().toString():f;this.originalImages=c;if(a.Browser.android&&e.navigator.userAgent.match(/Android (\d+.\d+)/).toString().replace(/^.*\,/,"")>=2.1)this.isBackEventSupported=!0;if(!this.isBackEventSupported)this.isBackEventSupported=a.objectHasProperty(e,"onhashchange");this.settings={fadeInSpeed:250,fadeOutSpeed:250,preventHide:!1,preventSlideshow:!1,zIndex:1E3,backButtonHideEnabled:!0,enableKeyboard:!0,enableMouseWheel:!0,mouseWheelSpeed:350,
-autoStartSlideshow:!1,jQueryMobile:!a.isNothing(e.jQuery)&&!a.isNothing(e.jQuery.mobile),jQueryMobileDialogHash:"&ui-state=dialog",enableUIWebViewRepositionTimeout:!1,uiWebViewResetPositionDelay:500,target:e,preventDefaultTouchEvents:!0,loop:!0,slideSpeed:250,nextPreviousSlideSpeed:0,enableDrag:!0,swipeThreshold:50,swipeTimeThreshold:250,slideTimingFunction:"ease-out",slideshowDelay:3E3,doubleTapSpeed:250,margin:20,imageScaleMethod:"fit",captionAndToolbarHide:!1,captionAndToolbarFlipPosition:!1,captionAndToolbarAutoHideDelay:5E3,
-captionAndToolbarOpacity:0.8,captionAndToolbarShowEmptyCaptions:!0,getToolbar:i.Toolbar.getToolbar,allowUserZoom:!0,allowRotationOnUserZoom:!1,maxUserZoom:5,minUserZoom:0.5,doubleTapZoomLevel:2.5,getImageSource:i.Cache.Functions.getImageSource,getImageCaption:i.Cache.Functions.getImageCaption,getImageMetaData:i.Cache.Functions.getImageMetaData,cacheMode:i.Cache.Mode.normal};a.extend(this.settings,d);this.settings.target!==e&&(d=a.DOM.getStyle(this.settings.target,"position"),(d!=="relative"||d!==
-"absolute")&&a.DOM.setStyle(this.settings.target,"position","relative"));if(this.settings.target!==e)this.isBackEventSupported=!1,this.settings.backButtonHideEnabled=!1;else if(this.settings.preventHide)this.settings.backButtonHideEnabled=!1;this.cache=new b.CacheClass(c,this.settings)},show:function(b){var c,d;this.backButtonClicked=this._isResettingPosition=!1;if(a.isNumber(b))this.currentIndex=b;else{this.currentIndex=-1;c=0;for(d=this.originalImages.length;c<d;c++)if(this.originalImages[c]===
+d,f){this.id=a.isNothing(f)?"PhotoSwipe"+(new Date).getTime().toString():f;this.originalImages=c;if(a.Browser.android&&!a.Browser.firefox&&e.navigator.userAgent.match(/Android (\d+.\d+)/).toString().replace(/^.*\,/,"")>=2.1)this.isBackEventSupported=!0;if(!this.isBackEventSupported)this.isBackEventSupported=a.objectHasProperty(e,"onhashchange");this.settings={fadeInSpeed:250,fadeOutSpeed:250,preventHide:!1,preventSlideshow:!1,zIndex:1E3,backButtonHideEnabled:!0,enableKeyboard:!0,enableMouseWheel:!0,
+mouseWheelSpeed:350,autoStartSlideshow:!1,jQueryMobile:!a.isNothing(e.jQuery)&&!a.isNothing(e.jQuery.mobile),jQueryMobileDialogHash:"&ui-state=dialog",enableUIWebViewRepositionTimeout:!1,uiWebViewResetPositionDelay:500,target:e,preventDefaultTouchEvents:!0,loop:!0,slideSpeed:250,nextPreviousSlideSpeed:0,enableDrag:!0,swipeThreshold:50,swipeTimeThreshold:250,slideTimingFunction:"ease-out",slideshowDelay:3E3,doubleTapSpeed:250,margin:20,imageScaleMethod:"fit",captionAndToolbarHide:!1,captionAndToolbarFlipPosition:!1,
+captionAndToolbarAutoHideDelay:5E3,captionAndToolbarOpacity:0.8,captionAndToolbarShowEmptyCaptions:!0,getToolbar:i.Toolbar.getToolbar,allowUserZoom:!0,allowRotationOnUserZoom:!1,maxUserZoom:5,minUserZoom:0.5,doubleTapZoomLevel:2.5,getImageSource:i.Cache.Functions.getImageSource,getImageCaption:i.Cache.Functions.getImageCaption,getImageMetaData:i.Cache.Functions.getImageMetaData,cacheMode:i.Cache.Mode.normal};a.extend(this.settings,d);this.settings.target!==e&&(d=a.DOM.getStyle(this.settings.target,
+"position"),(d!=="relative"||d!=="absolute")&&a.DOM.setStyle(this.settings.target,"position","relative"));if(this.settings.target!==e)this.isBackEventSupported=!1,this.settings.backButtonHideEnabled=!1;else if(this.settings.preventHide)this.settings.backButtonHideEnabled=!1;this.cache=new b.CacheClass(c,this.settings)},show:function(b){var c,d;this.backButtonClicked=this._isResettingPosition=!1;if(a.isNumber(b))this.currentIndex=b;else{this.currentIndex=-1;c=0;for(d=this.originalImages.length;c<d;c++)if(this.originalImages[c]===
b){this.currentIndex=c;break}}if(this.currentIndex<0||this.currentIndex>this.originalImages.length-1)throw"Code.PhotoSwipe.PhotoSwipeClass.show: Starting index out of range";this.isAlreadyGettingPage=this.getWindowDimensions();i.setActivateInstance(this);this.windowDimensions=this.getWindowDimensions();this.settings.target===e?a.DOM.addClass(e.document.body,i.CssClasses.buildingBody):a.DOM.addClass(this.settings.target,i.CssClasses.buildingBody);this.createComponents();a.Events.fire(this,{type:i.EventTypes.onBeforeShow,
target:this});this.documentOverlay.fadeIn(this.settings.fadeInSpeed,this.onDocumentOverlayFadeIn.bind(this))},getWindowDimensions:function(){return{width:a.DOM.windowWidth(),height:a.DOM.windowHeight()}},createComponents:function(){this.documentOverlay=new d.DocumentOverlayClass(this.settings);this.carousel=new f.CarouselClass(this.cache,this.settings);this.uiLayer=new h.UILayerClass(this.settings);if(!this.settings.captionAndToolbarHide)this.toolbar=new g.ToolbarClass(this.cache,this.settings)},
resetPosition:function(){if(!this._isResettingPosition){var b=this.getWindowDimensions();if(a.isNothing(this.windowDimensions)||!(b.width===this.windowDimensions.width&&b.height===this.windowDimensions.height))this._isResettingPosition=!0,this.windowDimensions=b,this.destroyZoomPanRotate(),this.documentOverlay.resetPosition(),this.carousel.resetPosition(),a.isNothing(this.toolbar)||this.toolbar.resetPosition(),this.uiLayer.resetPosition(),this._isResettingPosition=!1,a.Events.fire(this,{type:i.EventTypes.onResetPosition,
diff --git a/themes/smartpocket/js/jquery.mobile.min.js b/themes/smartpocket/js/jquery.mobile.min.js
index 5dd280e2e..a4d5775f5 100644
--- a/themes/smartpocket/js/jquery.mobile.min.js
+++ b/themes/smartpocket/js/jquery.mobile.min.js
@@ -1,177 +1,7 @@
-/*! jQuery Mobile v1.0.1 jquerymobile.com | jquery.org/license */
-(function(a,e){if(a.cleanData){var b=a.cleanData;a.cleanData=function(f){for(var c=0,d;(d=f[c])!=null;c++)a(d).triggerHandler("remove");b(f)}}else{var d=a.fn.remove;a.fn.remove=function(b,c){return this.each(function(){c||(!b||a.filter(b,[this]).length)&&a("*",this).add([this]).each(function(){a(this).triggerHandler("remove")});return d.call(a(this),b,c)})}}a.widget=function(b,c,d){var e=b.split(".")[0],i,b=b.split(".")[1];i=e+"-"+b;if(!d)d=c,c=a.Widget;a.expr[":"][i]=function(c){return!!a.data(c,
-b)};a[e]=a[e]||{};a[e][b]=function(a,b){arguments.length&&this._createWidget(a,b)};c=new c;c.options=a.extend(true,{},c.options);a[e][b].prototype=a.extend(true,c,{namespace:e,widgetName:b,widgetEventPrefix:a[e][b].prototype.widgetEventPrefix||b,widgetBaseClass:i},d);a.widget.bridge(b,a[e][b])};a.widget.bridge=function(b,c){a.fn[b]=function(d){var g=typeof d==="string",i=Array.prototype.slice.call(arguments,1),l=this,d=!g&&i.length?a.extend.apply(null,[true,d].concat(i)):d;if(g&&d.charAt(0)==="_")return l;
-g?this.each(function(){var c=a.data(this,b);if(!c)throw"cannot call methods on "+b+" prior to initialization; attempted to call method '"+d+"'";if(!a.isFunction(c[d]))throw"no such method '"+d+"' for "+b+" widget instance";var g=c[d].apply(c,i);if(g!==c&&g!==e)return l=g,false}):this.each(function(){var e=a.data(this,b);e?e.option(d||{})._init():a.data(this,b,new c(d,this))});return l}};a.Widget=function(a,b){arguments.length&&this._createWidget(a,b)};a.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",
-options:{disabled:false},_createWidget:function(b,c){a.data(c,this.widgetName,this);this.element=a(c);this.options=a.extend(true,{},this.options,this._getCreateOptions(),b);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){var b={};a.metadata&&(b=a.metadata.get(element)[this.widgetName]);return b},_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(b,c){var d=b;if(arguments.length===0)return a.extend({},this.options);if(typeof b==="string"){if(c===e)return this.options[b];d={};d[b]=c}this._setOptions(d);return this},_setOptions:function(b){var c=this;a.each(b,function(a,b){c._setOption(a,b)});return this},_setOption:function(a,b){this.options[a]=b;a==="disabled"&&
-this.widget()[b?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",b);return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(b,c,d){var e=this.options[b],c=a.Event(c);c.type=(b===this.widgetEventPrefix?b:this.widgetEventPrefix+b).toLowerCase();d=d||{};if(c.originalEvent)for(var b=a.event.props.length,i;b;)i=a.event.props[--b],c[i]=c.originalEvent[i];this.element.trigger(c,
-d);return!(a.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery);
-(function(a,e){a.widget("mobile.widget",{_createWidget:function(){a.Widget.prototype._createWidget.apply(this,arguments);this._trigger("init")},_getCreateOptions:function(){var b=this.element,d={};a.each(this.options,function(a){var c=b.jqmData(a.replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()}));c!==e&&(d[a]=c)});return d},enhanceWithin:function(b){var d=a.mobile.closestPageData(a(b)),d=d&&d.keepNativeSelector()||"";a(this.options.initSelector,b).not(d)[this.widgetName]()}})})(jQuery);
-(function(a){a(window);var e=a("html");a.mobile.media=function(){var b={},d=a("<div id='jquery-mediatest'>"),f=a("<body>").append(d);return function(a){if(!(a in b)){var h=document.createElement("style"),g="@media "+a+" { #jquery-mediatest { position:absolute; } }";h.type="text/css";h.styleSheet?h.styleSheet.cssText=g:h.appendChild(document.createTextNode(g));e.prepend(f).prepend(h);b[a]=d.css("position")==="absolute";f.add(h).remove()}return b[a]}}()})(jQuery);
-(function(a,e){function b(a){var b=a.charAt(0).toUpperCase()+a.substr(1),a=(a+" "+c.join(b+" ")+b).split(" "),d;for(d in a)if(f[a[d]]!==e)return true}var d=a("<body>").prependTo("html"),f=d[0].style,c=["Webkit","Moz","O"],h="palmGetResource"in window,g=window.operamini&&{}.toString.call(window.operamini)==="[object OperaMini]",i=window.blackberry;a.mobile.browser={};a.mobile.browser.ie=function(){for(var a=3,b=document.createElement("div"),c=b.all||[];b.innerHTML="<\!--[if gt IE "+ ++a+"]><br><![endif]--\>",
-c[0];);return a>4?a:!a}();a.extend(a.support,{orientation:"orientation"in window&&"onorientationchange"in window,touch:"ontouchend"in document,cssTransitions:"WebKitTransitionEvent"in window,pushState:"pushState"in history&&"replaceState"in history,mediaquery:a.mobile.media("only all"),cssPseudoElement:!!b("content"),touchOverflow:!!b("overflowScrolling"),boxShadow:!!b("boxShadow")&&!i,scrollTop:("pageXOffset"in window||"scrollTop"in document.documentElement||"scrollTop"in d[0])&&!h&&!g,dynamicBaseTag:function(){var b=
-location.protocol+"//"+location.host+location.pathname+"ui-dir/",c=a("head base"),f=null,e="",h;c.length?e=c.attr("href"):c=f=a("<base>",{href:b}).appendTo("head");h=a("<a href='testurl' />").prependTo(d)[0].href;c[0].href=e||location.pathname;f&&f.remove();return h.indexOf(b)===0}()});d.remove();h=function(){var a=window.navigator.userAgent;return a.indexOf("Nokia")>-1&&(a.indexOf("Symbian/3")>-1||a.indexOf("Series60/5")>-1)&&a.indexOf("AppleWebKit")>-1&&a.match(/(BrowserNG|NokiaBrowser)\/7\.[0-3]/)}();
-a.mobile.ajaxBlacklist=window.blackberry&&!window.WebKitPoint||g||h;h&&a(function(){a("head link[rel='stylesheet']").attr("rel","alternate stylesheet").attr("rel","stylesheet")});a.support.boxShadow||a("html").addClass("ui-mobile-nosupport-boxshadow")})(jQuery);
-(function(a,e,b,d){function f(a){for(;a&&typeof a.originalEvent!=="undefined";)a=a.originalEvent;return a}function c(b){for(var c={},f,d;b;){f=a.data(b,m);for(d in f)if(f[d])c[d]=c.hasVirtualBinding=true;b=b.parentNode}return c}function h(){w&&(clearTimeout(w),w=0);w=setTimeout(function(){D=w=0;u.length=0;C=false;y=true},a.vmouse.resetTimerDuration)}function g(b,c,r){var e,h;if(!(h=r&&r[b])){if(r=!r)a:{for(r=c.target;r;){if((h=a.data(r,m))&&(!b||h[b]))break a;r=r.parentNode}r=null}h=r}if(h){e=c;var r=
-e.type,g,i;e=a.Event(e);e.type=b;h=e.originalEvent;g=a.event.props;if(h)for(i=g.length;i;)b=g[--i],e[b]=h[b];if(r.search(/mouse(down|up)|click/)>-1&&!e.which)e.which=1;if(r.search(/^touch/)!==-1&&(b=f(h),r=b.touches,b=b.changedTouches,r=r&&r.length?r[0]:b&&b.length?b[0]:d))for(h=0,len=z.length;h<len;h++)b=z[h],e[b]=r[b];a(c.target).trigger(e)}return e}function i(b){var c=a.data(b.target,A);if(!C&&(!D||D!==c))if(c=g("v"+b.type,b))c.isDefaultPrevented()&&b.preventDefault(),c.isPropagationStopped()&&
-b.stopPropagation(),c.isImmediatePropagationStopped()&&b.stopImmediatePropagation()}function l(b){var d=f(b).touches,e;if(d&&d.length===1&&(e=b.target,d=c(e),d.hasVirtualBinding))D=r++,a.data(e,A,D),w&&(clearTimeout(w),w=0),x=y=false,e=f(b).touches[0],v=e.pageX,s=e.pageY,g("vmouseover",b,d),g("vmousedown",b,d)}function k(a){y||(x||g("vmousecancel",a,c(a.target)),x=true,h())}function o(b){if(!y){var d=f(b).touches[0],r=x,e=a.vmouse.moveDistanceThreshold;x=x||Math.abs(d.pageX-v)>e||Math.abs(d.pageY-
-s)>e;flags=c(b.target);x&&!r&&g("vmousecancel",b,flags);g("vmousemove",b,flags);h()}}function n(a){if(!y){y=true;var b=c(a.target),d;g("vmouseup",a,b);if(!x&&(d=g("vclick",a,b))&&d.isDefaultPrevented())d=f(a).changedTouches[0],u.push({touchID:D,x:d.clientX,y:d.clientY}),C=true;g("vmouseout",a,b);x=false;h()}}function q(b){var b=a.data(b,m),c;if(b)for(c in b)if(b[c])return true;return false}function j(){}function p(b){var c=b.substr(1);return{setup:function(){q(this)||a.data(this,m,{});a.data(this,
-m)[b]=true;t[b]=(t[b]||0)+1;t[b]===1&&B.bind(c,i);a(this).bind(c,j);if(E)t.touchstart=(t.touchstart||0)+1,t.touchstart===1&&B.bind("touchstart",l).bind("touchend",n).bind("touchmove",o).bind("scroll",k)},teardown:function(){--t[b];t[b]||B.unbind(c,i);E&&(--t.touchstart,t.touchstart||B.unbind("touchstart",l).unbind("touchmove",o).unbind("touchend",n).unbind("scroll",k));var d=a(this),f=a.data(this,m);f&&(f[b]=false);d.unbind(c,j);q(this)||d.removeData(m)}}}var m="virtualMouseBindings",A="virtualTouchID",
-e="vmouseover vmousedown vmousemove vmouseup vclick vmouseout vmousecancel".split(" "),z="clientX clientY pageX pageY screenX screenY".split(" "),t={},w=0,v=0,s=0,x=false,u=[],C=false,y=false,E="addEventListener"in b,B=a(b),r=1,D=0;a.vmouse={moveDistanceThreshold:10,clickDistanceThreshold:10,resetTimerDuration:1500};for(var F=0;F<e.length;F++)a.event.special[e[F]]=p(e[F]);E&&b.addEventListener("click",function(b){var c=u.length,d=b.target,f,r,e,h,g;if(c){f=b.clientX;r=b.clientY;threshold=a.vmouse.clickDistanceThreshold;
-for(e=d;e;){for(h=0;h<c;h++)if(g=u[h],e===d&&Math.abs(g.x-f)<threshold&&Math.abs(g.y-r)<threshold||a.data(e,A)===g.touchID){b.preventDefault();b.stopPropagation();return}e=e.parentNode}}},true)})(jQuery,window,document);
-(function(a,e,b){function d(b,c,d){var f=d.type;d.type=c;a.event.handle.call(b,d);d.type=f}a.each("touchstart touchmove touchend orientationchange throttledresize tap taphold swipe swipeleft swiperight scrollstart scrollstop".split(" "),function(b,c){a.fn[c]=function(a){return a?this.bind(c,a):this.trigger(c)};a.attrFn[c]=true});var f=a.support.touch,c=f?"touchstart":"mousedown",h=f?"touchend":"mouseup",g=f?"touchmove":"mousemove";a.event.special.scrollstart={enabled:true,setup:function(){function b(a,
-e){f=e;d(c,f?"scrollstart":"scrollstop",a)}var c=this,f,e;a(c).bind("touchmove scroll",function(c){a.event.special.scrollstart.enabled&&(f||b(c,true),clearTimeout(e),e=setTimeout(function(){b(c,false)},50))})}};a.event.special.tap={setup:function(){var b=this,c=a(b);c.bind("vmousedown",function(f){function e(){clearTimeout(p)}function h(){e();c.unbind("vclick",g).unbind("vmouseup",e).unbind("vmousecancel",h)}function g(a){h();j==a.target&&d(b,"tap",a)}if(f.which&&f.which!==1)return false;var j=f.target,
-p;c.bind("vmousecancel",h).bind("vmouseup",e).bind("vclick",g);p=setTimeout(function(){d(b,"taphold",a.Event("taphold"))},750)})}};a.event.special.swipe={scrollSupressionThreshold:10,durationThreshold:1E3,horizontalDistanceThreshold:30,verticalDistanceThreshold:75,setup:function(){var d=a(this);d.bind(c,function(c){function f(b){if(n){var c=b.originalEvent.touches?b.originalEvent.touches[0]:b;q={time:(new Date).getTime(),coords:[c.pageX,c.pageY]};Math.abs(n.coords[0]-q.coords[0])>a.event.special.swipe.scrollSupressionThreshold&&
-b.preventDefault()}}var e=c.originalEvent.touches?c.originalEvent.touches[0]:c,n={time:(new Date).getTime(),coords:[e.pageX,e.pageY],origin:a(c.target)},q;d.bind(g,f).one(h,function(){d.unbind(g,f);n&&q&&q.time-n.time<a.event.special.swipe.durationThreshold&&Math.abs(n.coords[0]-q.coords[0])>a.event.special.swipe.horizontalDistanceThreshold&&Math.abs(n.coords[1]-q.coords[1])<a.event.special.swipe.verticalDistanceThreshold&&n.origin.trigger("swipe").trigger(n.coords[0]>q.coords[0]?"swipeleft":"swiperight");
-n=q=b})})}};(function(a,b){function c(){var a=f();a!==e&&(e=a,d.trigger("orientationchange"))}var d=a(b),f,e,h,g,m={0:true,180:true};if(a.support.orientation&&(h=a.mobile.media("all and (orientation: landscape)"),g=m[b.orientation],h&&g||!h&&!g))m={"-90":true,90:true};a.event.special.orientationchange={setup:function(){if(a.support.orientation&&a.mobile.orientationChangeEnabled)return false;e=f();d.bind("throttledresize",c)},teardown:function(){if(a.support.orientation&&a.mobile.orientationChangeEnabled)return false;
-d.unbind("throttledresize",c)},add:function(a){var b=a.handler;a.handler=function(a){a.orientation=f();return b.apply(this,arguments)}}};a.event.special.orientationchange.orientation=f=function(){var c=true,c=document.documentElement;return(c=a.support.orientation?m[b.orientation]:c&&c.clientWidth/c.clientHeight<1.1)?"portrait":"landscape"}})(jQuery,e);(function(){a.event.special.throttledresize={setup:function(){a(this).bind("resize",b)},teardown:function(){a(this).unbind("resize",b)}};var b=function(){f=
-(new Date).getTime();e=f-c;e>=250?(c=f,a(this).trigger("throttledresize")):(d&&clearTimeout(d),d=setTimeout(b,250-e))},c=0,d,f,e})();a.each({scrollstop:"scrollstart",taphold:"tap",swipeleft:"swipe",swiperight:"swipe"},function(b,c){a.event.special[b]={setup:function(){a(this).bind(c,a.noop)}}})})(jQuery,this);
-(function(a,e,b){function d(a){a=a||location.href;return"#"+a.replace(/^[^#]*#?(.*)$/,"$1")}var f="hashchange",c=document,h,g=a.event.special,i=c.documentMode,l="on"+f in e&&(i===b||i>7);a.fn[f]=function(a){return a?this.bind(f,a):this.trigger(f)};a.fn[f].delay=50;g[f]=a.extend(g[f],{setup:function(){if(l)return false;a(h.start)},teardown:function(){if(l)return false;a(h.stop)}});h=function(){function h(){var b=d(),c=m(q);if(b!==q)p(q=b,c),a(e).trigger(f);else if(c!==q)location.href=location.href.replace(/#.*/,
-"")+c;i=setTimeout(h,a.fn[f].delay)}var g={},i,q=d(),j=function(a){return a},p=j,m=j;g.start=function(){i||h()};g.stop=function(){i&&clearTimeout(i);i=b};a.browser.msie&&!l&&function(){var b,e;g.start=function(){if(!b)e=(e=a.fn[f].src)&&e+d(),b=a('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){e||p(d());h()}).attr("src",e||"javascript:0").insertAfter("body")[0].contentWindow,c.onpropertychange=function(){try{if(event.propertyName==="title")b.document.title=c.title}catch(a){}}};
-g.stop=j;m=function(){return d(b.location.href)};p=function(d,e){var h=b.document,g=a.fn[f].domain;if(d!==e)h.title=c.title,h.open(),g&&h.write('<script>document.domain="'+g+'"<\/script>'),h.close(),b.location.hash=d}}();return g}()})(jQuery,this);
-(function(a){a.widget("mobile.page",a.mobile.widget,{options:{theme:"c",domCache:false,keepNativeDefault:":jqmData(role='none'), :jqmData(role='nojs')"},_create:function(){this._trigger("beforecreate");this.element.attr("tabindex","0").addClass("ui-page ui-body-"+this.options.theme)},keepNativeSelector:function(){var e=this.options;return e.keepNative&&a.trim(e.keepNative)&&e.keepNative!==e.keepNativeDefault?[e.keepNative,e.keepNativeDefault].join(", "):e.keepNativeDefault}})})(jQuery);
-(function(a,e){var b={};a.extend(a.mobile,{ns:"",subPageUrlKey:"ui-page",activePageClass:"ui-page-active",activeBtnClass:"ui-btn-active",ajaxEnabled:true,hashListeningEnabled:true,linkBindingEnabled:true,defaultPageTransition:"slide",minScrollBack:250,defaultDialogTransition:"pop",loadingMessage:"loading",pageLoadErrorMessage:"Error Loading Page",autoInitializePage:true,pushStateEnabled:true,orientationChangeEnabled:true,gradeA:function(){return a.support.mediaquery||a.mobile.browser.ie&&a.mobile.browser.ie>=
-7},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},silentScroll:function(b){if(a.type(b)!=="number")b=a.mobile.defaultHomeScroll;a.event.special.scrollstart.enabled=false;
-setTimeout(function(){e.scrollTo(0,b);a(document).trigger("silentscroll",{x:0,y:b})},20);setTimeout(function(){a.event.special.scrollstart.enabled=true},150)},nsNormalizeDict:b,nsNormalize:function(c){return!c?void 0:b[c]||(b[c]=a.camelCase(a.mobile.ns+c))},getInheritedTheme:function(a,b){for(var d=a[0],f="",e=/ui-(bar|body)-([a-z])\b/,k,o;d;){k=d.className||"";if((o=e.exec(k))&&(f=o[2]))break;d=d.parentNode}return f||b||"a"},closestPageData:function(a){return a.closest(':jqmData(role="page"), :jqmData(role="dialog")').data("page")}});
-a.fn.jqmData=function(b,d){var f;typeof b!="undefined"&&(f=this.data(b?a.mobile.nsNormalize(b):b,d));return f};a.jqmData=function(b,d,f){var e;typeof d!="undefined"&&(e=a.data(b,d?a.mobile.nsNormalize(d):d,f));return e};a.fn.jqmRemoveData=function(b){return this.removeData(a.mobile.nsNormalize(b))};a.jqmRemoveData=function(b,d){return a.removeData(b,a.mobile.nsNormalize(d))};a.fn.removeWithDependents=function(){a.removeWithDependents(this)};a.removeWithDependents=function(b){b=a(b);(b.jqmData("dependents")||
-a()).remove();b.remove()};a.fn.addDependents=function(b){a.addDependents(a(this),b)};a.addDependents=function(b,d){var f=a(b).jqmData("dependents")||a();a(b).jqmData("dependents",a.merge(f,d))};a.fn.getEncodedText=function(){return a("<div/>").text(a(this).text()).html()};var d=a.find,f=/:jqmData\(([^)]*)\)/g;a.find=function(b,e,g,i){b=b.replace(f,"[data-"+(a.mobile.ns||"")+"$1]");return d.call(this,b,e,g,i)};a.extend(a.find,d);a.find.matches=function(b,d){return a.find(b,null,null,d)};a.find.matchesSelector=
-function(b,d){return a.find(d,null,null,[b]).length>0}})(jQuery,this);
-(function(a,e){function b(a){var b=a.find(".ui-title:eq(0)");b.length?b.focus():a.focus()}function d(b){p&&(!p.closest(".ui-page-active").length||b)&&p.removeClass(a.mobile.activeBtnClass);p=null}function f(){z=false;A.length>0&&a.mobile.changePage.apply(null,A.pop())}function c(c,d,f,e){var g=a.mobile.urlHistory.getActive(),j=a.support.touchOverflow&&a.mobile.touchOverflowEnabled,i=g.lastScroll||(j?0:a.mobile.defaultHomeScroll),g=h();window.scrollTo(0,a.mobile.defaultHomeScroll);d&&d.data("page")._trigger("beforehide",
-null,{nextPage:c});j||c.height(g+i);c.data("page")._trigger("beforeshow",null,{prevPage:d||a("")});a.mobile.hidePageLoadingMsg();j&&i&&(c.addClass("ui-mobile-pre-transition"),b(c),c.is(".ui-native-fixed")?c.find(".ui-content").scrollTop(i):c.scrollTop(i));f=(a.mobile.transitionHandlers[f||"none"]||a.mobile.defaultTransitionHandler)(f,e,c,d);f.done(function(){j||(c.height(""),b(c));j||a.mobile.silentScroll(i);d&&(j||d.height(""),d.data("page")._trigger("hide",null,{nextPage:c}));c.data("page")._trigger("show",
-null,{prevPage:d||a("")})});return f}function h(){var b=a.event.special.orientationchange.orientation()==="portrait",c=b?screen.availHeight:screen.availWidth,b=Math.max(b?480:320,a(window).height());return Math.min(c,b)}function g(){(!a.support.touchOverflow||!a.mobile.touchOverflowEnabled)&&a("."+a.mobile.activePageClass).css("min-height",h())}function i(b,c){c&&b.attr("data-"+a.mobile.ns+"role",c);b.page()}function l(a){for(;a;){if(typeof a.nodeName==="string"&&a.nodeName.toLowerCase()=="a")break;
-a=a.parentNode}return a}function k(b){var b=a(b).closest(".ui-page").jqmData("url"),c=s.hrefNoHash;if(!b||!j.isPath(b))b=c;return j.makeUrlAbsolute(b,c)}var o=a(window),n=a("html"),q=a("head"),j={urlParseRE:/^(((([^:\/#\?]+:)?(?:(\/\/)((?:(([^:@\/#\?]+)(?:\:([^:@\/#\?]+))?)@)?(([^:\/#\?\]\[]+|\[[^\/\]@#?]+\])(?:\:([0-9]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)(#.*)?/,parseUrl:function(b){if(a.type(b)==="object")return b;b=j.urlParseRE.exec(b||"")||[];return{href:b[0]||"",hrefNoHash:b[1]||
-"",hrefNoSearch:b[2]||"",domain:b[3]||"",protocol:b[4]||"",doubleSlash:b[5]||"",authority:b[6]||"",username:b[8]||"",password:b[9]||"",host:b[10]||"",hostname:b[11]||"",port:b[12]||"",pathname:b[13]||"",directory:b[14]||"",filename:b[15]||"",search:b[16]||"",hash:b[17]||""}},makePathAbsolute:function(a,b){if(a&&a.charAt(0)==="/")return a;for(var a=a||"",c=(b=b?b.replace(/^\/|(\/[^\/]*|[^\/]+)$/g,""):"")?b.split("/"):[],d=a.split("/"),f=0;f<d.length;f++){var e=d[f];switch(e){case ".":break;case "..":c.length&&
-c.pop();break;default:c.push(e)}}return"/"+c.join("/")},isSameDomain:function(a,b){return j.parseUrl(a).domain===j.parseUrl(b).domain},isRelativeUrl:function(a){return j.parseUrl(a).protocol===""},isAbsoluteUrl:function(a){return j.parseUrl(a).protocol!==""},makeUrlAbsolute:function(a,b){if(!j.isRelativeUrl(a))return a;var c=j.parseUrl(a),d=j.parseUrl(b),f=c.protocol||d.protocol,e=c.protocol?c.doubleSlash:c.doubleSlash||d.doubleSlash,h=c.authority||d.authority,g=c.pathname!=="",i=j.makePathAbsolute(c.pathname||
-d.filename,d.pathname);return f+e+h+i+(c.search||!g&&d.search||"")+c.hash},addSearchParams:function(b,c){var d=j.parseUrl(b),f=typeof c==="object"?a.param(c):c,e=d.search||"?";return d.hrefNoSearch+e+(e.charAt(e.length-1)!=="?"?"&":"")+f+(d.hash||"")},convertUrlToDataUrl:function(a){var b=j.parseUrl(a);if(j.isEmbeddedPage(b))return b.hash.split(t)[0].replace(/^#/,"");else if(j.isSameDomain(b,s))return b.hrefNoHash.replace(s.domain,"");return a},get:function(a){if(a===e)a=location.hash;return j.stripHash(a).replace(/[^\/]*\.[^\/*]+$/,
-"")},getFilePath:function(b){var c="&"+a.mobile.subPageUrlKey;return b&&b.split(c)[0].split(t)[0]},set:function(a){location.hash=a},isPath:function(a){return/\//.test(a)},clean:function(a){return a.replace(s.domain,"")},stripHash:function(a){return a.replace(/^#/,"")},cleanHash:function(a){return j.stripHash(a.replace(/\?.*$/,"").replace(t,""))},isExternal:function(a){a=j.parseUrl(a);return a.protocol&&a.domain!==v.domain?true:false},hasProtocol:function(a){return/^(:?\w+:)/.test(a)},isFirstPageUrl:function(b){var b=
-j.parseUrl(j.makeUrlAbsolute(b,s)),c=a.mobile.firstPage,c=c&&c[0]?c[0].id:e;return(b.hrefNoHash===v.hrefNoHash||x&&b.hrefNoHash===s.hrefNoHash)&&(!b.hash||b.hash==="#"||c&&b.hash.replace(/^#/,"")===c)},isEmbeddedPage:function(a){a=j.parseUrl(a);return a.protocol!==""?a.hash&&(a.hrefNoHash===v.hrefNoHash||x&&a.hrefNoHash===s.hrefNoHash):/^#/.test(a.href)},isPermittedCrossDomainRequest:function(b,c){return a.mobile.allowCrossDomainPages&&b.protocol==="file:"&&c.search(/^https?:/)!=-1}},p=null,m={stack:[],
-activeIndex:0,getActive:function(){return m.stack[m.activeIndex]},getPrev:function(){return m.stack[m.activeIndex-1]},getNext:function(){return m.stack[m.activeIndex+1]},addNew:function(a,b,c,d,f){m.getNext()&&m.clearForward();m.stack.push({url:a,transition:b,title:c,pageUrl:d,role:f});m.activeIndex=m.stack.length-1},clearForward:function(){m.stack=m.stack.slice(0,m.activeIndex+1)},directHashChange:function(b){var c,d,f;this.getActive();a.each(m.stack,function(a,e){b.currentUrl===e.url&&(c=a<m.activeIndex,
-d=!c,f=a)});this.activeIndex=f!==e?f:this.activeIndex;c?(b.either||b.isBack)(true):d&&(b.either||b.isForward)(false)},ignoreNextHashChange:false},A=[],z=false,t="&ui-state=dialog",w=q.children("base"),v=j.parseUrl(location.href),s=w.length?j.parseUrl(j.makeUrlAbsolute(w.attr("href"),v.href)):v,x=v.hrefNoHash!==s.hrefNoHash,u=a.support.dynamicBaseTag?{element:w.length?w:a("<base>",{href:s.hrefNoHash}).prependTo(q),set:function(a){u.element.attr("href",j.makeUrlAbsolute(a,s))},reset:function(){u.element.attr("href",
-s.hrefNoHash)}}:e,C=true,y,E,B;y=function(){var b=o;a.support.touchOverflow&&a.mobile.touchOverflowEnabled&&(b=a(".ui-page-active"),b=b.is(".ui-native-fixed")?b.find(".ui-content"):b);return b};E=function(b){if(C){var c=a.mobile.urlHistory.getActive();if(c)b=b&&b.scrollTop(),c.lastScroll=b<a.mobile.minScrollBack?a.mobile.defaultHomeScroll:b}};B=function(){setTimeout(E,100,a(this))};o.bind(a.support.pushState?"popstate":"hashchange",function(){C=false});o.one(a.support.pushState?"popstate":"hashchange",
-function(){C=true});o.one("pagecontainercreate",function(){a.mobile.pageContainer.bind("pagechange",function(){var a=y();C=true;a.unbind("scrollstop",B);a.bind("scrollstop",B)})});y().bind("scrollstop",B);a.mobile.getScreenHeight=h;a.fn.animationComplete=function(b){return a.support.cssTransitions?a(this).one("webkitAnimationEnd",b):(setTimeout(b,0),a(this))};a.mobile.path=j;a.mobile.base=u;a.mobile.urlHistory=m;a.mobile.dialogHashKey=t;a.mobile.noneTransitionHandler=function(b,c,d,f){f&&f.removeClass(a.mobile.activePageClass);
-d.addClass(a.mobile.activePageClass);return a.Deferred().resolve(b,c,d,f).promise()};a.mobile.defaultTransitionHandler=a.mobile.noneTransitionHandler;a.mobile.transitionHandlers={none:a.mobile.defaultTransitionHandler};a.mobile.allowCrossDomainPages=false;a.mobile.getDocumentUrl=function(b){return b?a.extend({},v):v.href};a.mobile.getDocumentBase=function(b){return b?a.extend({},s):s.href};a.mobile._bindPageRemove=function(){var b=a(this);!b.data("page").options.domCache&&b.is(":jqmData(external-page='true')")&&
-b.bind("pagehide.remove",function(){var b=a(this),c=new a.Event("pageremove");b.trigger(c);c.isDefaultPrevented()||b.removeWithDependents()})};a.mobile.loadPage=function(b,c){var d=a.Deferred(),f=a.extend({},a.mobile.loadPage.defaults,c),h=null,g=null,n=j.makeUrlAbsolute(b,a.mobile.activePage&&k(a.mobile.activePage)||s.hrefNoHash);if(f.data&&f.type==="get")n=j.addSearchParams(n,f.data),f.data=e;if(f.data&&f.type==="post")f.reloadPage=true;var t=j.getFilePath(n),m=j.convertUrlToDataUrl(n);f.pageContainer=
-f.pageContainer||a.mobile.pageContainer;h=f.pageContainer.children(":jqmData(url='"+m+"')");h.length===0&&m&&!j.isPath(m)&&(h=f.pageContainer.children("#"+m).attr("data-"+a.mobile.ns+"url",m));if(h.length===0)if(a.mobile.firstPage&&j.isFirstPageUrl(t))a.mobile.firstPage.parent().length&&(h=a(a.mobile.firstPage));else if(j.isEmbeddedPage(t))return d.reject(n,c),d.promise();u&&u.reset();if(h.length){if(!f.reloadPage)return i(h,f.role),d.resolve(n,c,h),d.promise();g=h}var q=f.pageContainer,l=new a.Event("pagebeforeload"),
-p={url:b,absUrl:n,dataUrl:m,deferred:d,options:f};q.trigger(l,p);if(l.isDefaultPrevented())return d.promise();if(f.showLoadMsg)var w=setTimeout(function(){a.mobile.showPageLoadingMsg()},f.loadMsgDelay);!a.mobile.allowCrossDomainPages&&!j.isSameDomain(v,n)?d.reject(n,c):a.ajax({url:t,type:f.type,data:f.data,dataType:"html",success:function(e,q,k){var l=a("<div></div>"),o=e.match(/<title[^>]*>([^<]*)/)&&RegExp.$1,s=RegExp("\\bdata-"+a.mobile.ns+"url=[\"']?([^\"'>]*)[\"']?");RegExp("(<[^>]+\\bdata-"+
-a.mobile.ns+"role=[\"']?page[\"']?[^>]*>)").test(e)&&RegExp.$1&&s.test(RegExp.$1)&&RegExp.$1&&(b=t=j.getFilePath(RegExp.$1));u&&u.set(t);l.get(0).innerHTML=e;h=l.find(":jqmData(role='page'), :jqmData(role='dialog')").first();h.length||(h=a("<div data-"+a.mobile.ns+"role='page'>"+e.split(/<\/?body[^>]*>/gmi)[1]+"</div>"));o&&!h.jqmData("title")&&(~o.indexOf("&")&&(o=a("<div>"+o+"</div>").text()),h.jqmData("title",o));if(!a.support.dynamicBaseTag){var v=j.get(t);h.find("[src], link[href], a[rel='external'], :jqmData(ajax='false'), a[target]").each(function(){var b=
-a(this).is("[href]")?"href":a(this).is("[src]")?"src":"action",c=a(this).attr(b),c=c.replace(location.protocol+"//"+location.host+location.pathname,"");/^(\w+:|#|\/)/.test(c)||a(this).attr(b,v+c)})}h.attr("data-"+a.mobile.ns+"url",j.convertUrlToDataUrl(t)).attr("data-"+a.mobile.ns+"external-page",true).appendTo(f.pageContainer);h.one("pagecreate",a.mobile._bindPageRemove);i(h,f.role);n.indexOf("&"+a.mobile.subPageUrlKey)>-1&&(h=f.pageContainer.children(":jqmData(url='"+m+"')"));f.showLoadMsg&&(clearTimeout(w),
-a.mobile.hidePageLoadingMsg());p.xhr=k;p.textStatus=q;p.page=h;f.pageContainer.trigger("pageload",p);d.resolve(n,c,h,g)},error:function(b,e,h){u&&u.set(j.get());p.xhr=b;p.textStatus=e;p.errorThrown=h;b=new a.Event("pageloadfailed");f.pageContainer.trigger(b,p);b.isDefaultPrevented()||(f.showLoadMsg&&(clearTimeout(w),a.mobile.hidePageLoadingMsg(),a("<div class='ui-loader ui-overlay-shadow ui-body-e ui-corner-all'><h1>"+a.mobile.pageLoadErrorMessage+"</h1></div>").css({display:"block",opacity:0.96,
-top:o.scrollTop()+100}).appendTo(f.pageContainer).delay(800).fadeOut(400,function(){a(this).remove()})),d.reject(n,c))}});return d.promise()};a.mobile.loadPage.defaults={type:"get",data:e,reloadPage:false,role:e,showLoadMsg:false,pageContainer:e,loadMsgDelay:50};a.mobile.changePage=function(b,h){if(z)A.unshift(arguments);else{var g=a.extend({},a.mobile.changePage.defaults,h);g.pageContainer=g.pageContainer||a.mobile.pageContainer;g.fromPage=g.fromPage||a.mobile.activePage;var q=g.pageContainer,l=
-new a.Event("pagebeforechange"),k={toPage:b,options:g};q.trigger(l,k);if(!l.isDefaultPrevented())if(b=k.toPage,z=true,typeof b=="string")a.mobile.loadPage(b,g).done(function(b,c,d,f){z=false;c.duplicateCachedPage=f;a.mobile.changePage(d,c)}).fail(function(){z=false;d(true);f();g.pageContainer.trigger("pagechangefailed",k)});else{if(b[0]===a.mobile.firstPage[0]&&!g.dataUrl)g.dataUrl=v.hrefNoHash;var l=g.fromPage,p=g.dataUrl&&j.convertUrlToDataUrl(g.dataUrl)||b.jqmData("url"),o=p;j.getFilePath(p);var s=
-m.getActive(),w=m.activeIndex===0,x=0,u=document.title,y=g.role==="dialog"||b.jqmData("role")==="dialog";if(l&&l[0]===b[0]&&!g.allowSamePageTransition)z=false,q.trigger("pagechange",k);else{i(b,g.role);g.fromHashChange&&m.directHashChange({currentUrl:p,isBack:function(){x=-1},isForward:function(){x=1}});try{document.activeElement&&document.activeElement.nodeName.toLowerCase()!="body"?a(document.activeElement).blur():a("input:focus, textarea:focus, select:focus").blur()}catch(C){}y&&s&&(p=(s.url||
-"")+t);if(g.changeHash!==false&&p)m.ignoreNextHashChange=true,j.set(p);var B=!s?u:b.jqmData("title")||b.children(":jqmData(role='header')").find(".ui-title").getEncodedText();B&&u==document.title&&(u=B);b.jqmData("title")||b.jqmData("title",u);g.transition=g.transition||(x&&!w?s.transition:e)||(y?a.mobile.defaultDialogTransition:a.mobile.defaultPageTransition);x||m.addNew(p,g.transition,u,o,g.role);document.title=m.getActive().title;a.mobile.activePage=b;g.reverse=g.reverse||x<0;c(b,l,g.transition,
-g.reverse).done(function(){d();g.duplicateCachedPage&&g.duplicateCachedPage.remove();n.removeClass("ui-mobile-rendering");f();q.trigger("pagechange",k)})}}}};a.mobile.changePage.defaults={transition:e,reverse:false,changeHash:true,fromHashChange:false,role:e,duplicateCachedPage:e,pageContainer:e,showLoadMsg:true,dataUrl:e,fromPage:e,allowSamePageTransition:false};a.mobile._registerInternalEvents=function(){a(document).delegate("form","submit",function(b){var c=a(this);if(a.mobile.ajaxEnabled&&!c.is(":jqmData(ajax='false')")){var d=
-c.attr("method"),f=c.attr("target"),e=c.attr("action");if(!e&&(e=k(c),e===s.hrefNoHash))e=v.hrefNoSearch;e=j.makeUrlAbsolute(e,k(c));j.isExternal(e)&&!j.isPermittedCrossDomainRequest(v,e)||f||(a.mobile.changePage(e,{type:d&&d.length&&d.toLowerCase()||"get",data:c.serialize(),transition:c.jqmData("transition"),direction:c.jqmData("direction"),reloadPage:true}),b.preventDefault())}});a(document).bind("vclick",function(b){if(!(b.which>1)&&a.mobile.linkBindingEnabled&&(b=l(b.target))&&j.parseUrl(b.getAttribute("href")||
-"#").hash!=="#")d(true),p=a(b).closest(".ui-btn").not(".ui-disabled"),p.addClass(a.mobile.activeBtnClass),a("."+a.mobile.activePageClass+" .ui-btn").not(b).blur()});a(document).bind("click",function(b){if(a.mobile.linkBindingEnabled){var c=l(b.target);if(c&&!(b.which>1)){var f=a(c),h=function(){window.setTimeout(function(){d(true)},200)};if(f.is(":jqmData(rel='back')"))return window.history.back(),false;var g=k(f),c=j.makeUrlAbsolute(f.attr("href")||"#",g);if(!a.mobile.ajaxEnabled&&!j.isEmbeddedPage(c))h();
-else{if(c.search("#")!=-1)if(c=c.replace(/[^#]*#/,""))c=j.isPath(c)?j.makeUrlAbsolute(c,g):j.makeUrlAbsolute("#"+c,v.hrefNoHash);else{b.preventDefault();return}f.is("[rel='external']")||f.is(":jqmData(ajax='false')")||f.is("[target]")||j.isExternal(c)&&!j.isPermittedCrossDomainRequest(v,c)?h():(h=f.jqmData("transition"),g=(g=f.jqmData("direction"))&&g==="reverse"||f.jqmData("back"),f=f.attr("data-"+a.mobile.ns+"rel")||e,a.mobile.changePage(c,{transition:h,reverse:g,role:f}),b.preventDefault())}}}});
-a(document).delegate(".ui-page","pageshow.prefetch",function(){var b=[];a(this).find("a:jqmData(prefetch)").each(function(){var c=a(this),f=c.attr("href");f&&a.inArray(f,b)===-1&&(b.push(f),a.mobile.loadPage(f,{role:c.attr("data-"+a.mobile.ns+"rel")}))})});a.mobile._handleHashChange=function(b){var c=j.stripHash(b),f={transition:a.mobile.urlHistory.stack.length===0?"none":e,changeHash:false,fromHashChange:true};if(!a.mobile.hashListeningEnabled||m.ignoreNextHashChange)m.ignoreNextHashChange=false;
-else{if(m.stack.length>1&&c.indexOf(t)>-1)if(a.mobile.activePage.is(".ui-dialog"))m.directHashChange({currentUrl:c,either:function(b){var d=a.mobile.urlHistory.getActive();c=d.pageUrl;a.extend(f,{role:d.role,transition:d.transition,reverse:b})}});else{m.directHashChange({currentUrl:c,isBack:function(){window.history.back()},isForward:function(){window.history.forward()}});return}c?(c=typeof c==="string"&&!j.isPath(c)?j.makeUrlAbsolute("#"+c,s):c,a.mobile.changePage(c,f)):a.mobile.changePage(a.mobile.firstPage,
-f)}};o.bind("hashchange",function(){a.mobile._handleHashChange(location.hash)});a(document).bind("pageshow",g);a(window).bind("throttledresize",g)}})(jQuery);
-(function(a,e){var b={},d=a(e),f=a.mobile.path.parseUrl(location.href);a.extend(b,{initialFilePath:f.pathname+f.search,initialHref:f.hrefNoHash,hashchangeFired:false,state:function(){return{hash:location.hash||"#"+b.initialFilePath,title:document.title,initialHref:b.initialHref}},resetUIKeys:function(b){var f="&"+a.mobile.subPageUrlKey,d=b.indexOf(a.mobile.dialogHashKey);d>-1?b=b.slice(0,d)+"#"+b.slice(d):b.indexOf(f)>-1&&(b=b.split(f).join("#"+f));return b},nextHashChangePrevented:function(c){a.mobile.urlHistory.ignoreNextHashChange=
-c;b.onHashChangeDisabled=c},onHashChange:function(){if(!b.onHashChangeDisabled){var c,f;c=location.hash;var d=a.mobile.path.isPath(c),e=d?location.href:a.mobile.getDocumentUrl();c=d?c.replace("#",""):c;f=b.state();c=a.mobile.path.makeUrlAbsolute(c,e);d&&(c=b.resetUIKeys(c));history.replaceState(f,document.title,c)}},onPopState:function(c){var f=c.originalEvent.state;f&&(b.nextHashChangePrevented(true),setTimeout(function(){b.nextHashChangePrevented(false);a.mobile._handleHashChange(f.hash)},100))},
-init:function(){d.bind("hashchange",b.onHashChange);d.bind("popstate",b.onPopState);location.hash===""&&history.replaceState(b.state(),document.title,location.href)}});a(function(){a.mobile.pushStateEnabled&&a.support.pushState&&b.init()})})(jQuery,this);
-(function(a){function e(b,d,f,c){var e=new a.Deferred,g=d?" reverse":"",i="ui-mobile-viewport-transitioning viewport-"+b;f.animationComplete(function(){f.add(c).removeClass("out in reverse "+b);c&&c[0]!==f[0]&&c.removeClass(a.mobile.activePageClass);f.parent().removeClass(i);e.resolve(b,d,f,c)});f.parent().addClass(i);c&&c.addClass(b+" out"+g);f.addClass(a.mobile.activePageClass+" "+b+" in"+g);return e.promise()}a.mobile.css3TransitionHandler=e;if(a.mobile.defaultTransitionHandler===a.mobile.noneTransitionHandler)a.mobile.defaultTransitionHandler=
-e})(jQuery,this);
-(function(a){a.mobile.page.prototype.options.degradeInputs={color:false,date:false,datetime:false,"datetime-local":false,email:false,month:false,number:false,range:"number",search:"text",tel:false,time:false,url:false,week:false};a(document).bind("pagecreate create",function(e){var b=a.mobile.closestPageData(a(e.target));if(b)options=b.options,a(e.target).find("input").not(b.keepNativeSelector()).each(function(){var b=a(this),f=this.getAttribute("type"),c=options.degradeInputs[f]||"text";if(options.degradeInputs[f]){var e=
-a("<div>").html(b.clone()).html(),g=e.indexOf(" type=")>-1;b.replaceWith(e.replace(g?/\s+type=["']?\w+['"]?/:/\/?>/,' type="'+c+'" data-'+a.mobile.ns+'type="'+f+'"'+(g?"":">")))}})})})(jQuery);
-(function(a,e){a.widget("mobile.dialog",a.mobile.widget,{options:{closeBtnText:"Close",overlayTheme:"a",initSelector:":jqmData(role='dialog')"},_create:function(){var b=this,d=this.element,f=a("<a href='#' data-"+a.mobile.ns+"icon='delete' data-"+a.mobile.ns+"iconpos='notext'>"+this.options.closeBtnText+"</a>");d.addClass("ui-overlay-"+this.options.overlayTheme);d.attr("role","dialog").addClass("ui-dialog").find(":jqmData(role='header')").addClass("ui-corner-top ui-overlay-shadow").prepend(f).end().find(":jqmData(role='content'),:jqmData(role='footer')").addClass("ui-overlay-shadow").last().addClass("ui-corner-bottom");
-f.bind("click",function(){b.close()});d.bind("vclick submit",function(b){var b=a(b.target).closest(b.type==="vclick"?"a":"form"),f;b.length&&!b.jqmData("transition")&&(f=a.mobile.urlHistory.getActive()||{},b.attr("data-"+a.mobile.ns+"transition",f.transition||a.mobile.defaultDialogTransition).attr("data-"+a.mobile.ns+"direction","reverse"))}).bind("pagehide",function(){a(this).find("."+a.mobile.activeBtnClass).removeClass(a.mobile.activeBtnClass)})},close:function(){e.history.back()}});a(document).delegate(a.mobile.dialog.prototype.options.initSelector,
-"pagecreate",function(){a(this).dialog()})})(jQuery,this);
-(function(a){a.mobile.page.prototype.options.backBtnText="Back";a.mobile.page.prototype.options.addBackBtn=false;a.mobile.page.prototype.options.backBtnTheme=null;a.mobile.page.prototype.options.headerTheme="a";a.mobile.page.prototype.options.footerTheme="a";a.mobile.page.prototype.options.contentTheme=null;a(document).delegate(":jqmData(role='page'), :jqmData(role='dialog')","pagecreate",function(){var e=a(this),b=e.data("page").options,d=e.jqmData("role"),f=b.theme;a(":jqmData(role='header'), :jqmData(role='footer'), :jqmData(role='content')",
-this).each(function(){var c=a(this),e=c.jqmData("role"),g=c.jqmData("theme"),i=g||b.contentTheme||d==="dialog"&&f,l;c.addClass("ui-"+e);if(e==="header"||e==="footer"){var k=g||(e==="header"?b.headerTheme:b.footerTheme)||f;c.addClass("ui-bar-"+k).attr("role",e==="header"?"banner":"contentinfo");g=c.children("a");i=g.hasClass("ui-btn-left");l=g.hasClass("ui-btn-right");i=i||g.eq(0).not(".ui-btn-right").addClass("ui-btn-left").length;l||g.eq(1).addClass("ui-btn-right");b.addBackBtn&&e==="header"&&a(".ui-page").length>
-1&&c.jqmData("url")!==a.mobile.path.stripHash(location.hash)&&!i&&a("<a href='#' class='ui-btn-left' data-"+a.mobile.ns+"rel='back' data-"+a.mobile.ns+"icon='arrow-l'>"+b.backBtnText+"</a>").attr("data-"+a.mobile.ns+"theme",b.backBtnTheme||k).prependTo(c);c.children("h1, h2, h3, h4, h5, h6").addClass("ui-title").attr({tabindex:"0",role:"heading","aria-level":"1"})}else e==="content"&&(i&&c.addClass("ui-body-"+i),c.attr("role","main"))})})})(jQuery);
-(function(a){a.widget("mobile.collapsible",a.mobile.widget,{options:{expandCueText:" click to expand contents",collapseCueText:" click to collapse contents",collapsed:true,heading:"h1,h2,h3,h4,h5,h6,legend",theme:null,contentTheme:null,iconTheme:"d",initSelector:":jqmData(role='collapsible')"},_create:function(){var e=this.element,b=this.options,d=e.addClass("ui-collapsible"),f=e.children(b.heading).first(),c=d.wrapInner("<div class='ui-collapsible-content'></div>").find(".ui-collapsible-content"),
-h=e.closest(":jqmData(role='collapsible-set')").addClass("ui-collapsible-set");f.is("legend")&&(f=a("<div role='heading'>"+f.html()+"</div>").insertBefore(f),f.next().remove());if(h.length){if(!b.theme)b.theme=h.jqmData("theme");if(!b.contentTheme)b.contentTheme=h.jqmData("content-theme")}c.addClass(b.contentTheme?"ui-body-"+b.contentTheme:"");f.insertBefore(c).addClass("ui-collapsible-heading").append("<span class='ui-collapsible-heading-status'></span>").wrapInner("<a href='#' class='ui-collapsible-heading-toggle'></a>").find("a").first().buttonMarkup({shadow:false,
-corners:false,iconPos:"left",icon:"plus",theme:b.theme}).add(".ui-btn-inner").addClass("ui-corner-top ui-corner-bottom");d.bind("expand collapse",function(e){if(!e.isDefaultPrevented()){e.preventDefault();var i=a(this),e=e.type==="collapse",l=b.contentTheme;f.toggleClass("ui-collapsible-heading-collapsed",e).find(".ui-collapsible-heading-status").text(e?b.expandCueText:b.collapseCueText).end().find(".ui-icon").toggleClass("ui-icon-minus",!e).toggleClass("ui-icon-plus",e);i.toggleClass("ui-collapsible-collapsed",
-e);c.toggleClass("ui-collapsible-content-collapsed",e).attr("aria-hidden",e);if(l&&(!h.length||d.jqmData("collapsible-last")))f.find("a").first().add(f.find(".ui-btn-inner")).toggleClass("ui-corner-bottom",e),c.toggleClass("ui-corner-bottom",!e);c.trigger("updatelayout")}}).trigger(b.collapsed?"collapse":"expand");f.bind("click",function(a){var b=f.is(".ui-collapsible-heading-collapsed")?"expand":"collapse";d.trigger(b);a.preventDefault()})}});a(document).bind("pagecreate create",function(e){a(a.mobile.collapsible.prototype.options.initSelector,
-e.target).collapsible()})})(jQuery);
-(function(a){a.widget("mobile.collapsibleset",a.mobile.widget,{options:{initSelector:":jqmData(role='collapsible-set')"},_create:function(){var e=this.element.addClass("ui-collapsible-set"),b=this.options,d=e.children(":jqmData(role='collapsible')");if(!b.theme)b.theme=e.jqmData("theme");if(!b.contentTheme)b.contentTheme=e.jqmData("content-theme");e.jqmData("collapsiblebound")||(e.jqmData("collapsiblebound",true).bind("expand collapse",function(b){var c=b.type==="collapse",b=a(b.target).closest(".ui-collapsible"),
-d=b.data("collapsible");d.options.contentTheme&&b.jqmData("collapsible-last")&&(b.find(d.options.heading).first().find("a").first().add(".ui-btn-inner").toggleClass("ui-corner-bottom",c),b.find(".ui-collapsible-content").toggleClass("ui-corner-bottom",!c))}).bind("expand",function(b){a(b.target).closest(".ui-collapsible").siblings(".ui-collapsible").trigger("collapse")}),d.each(function(){a(this).find(a.mobile.collapsible.prototype.options.heading).find("a").first().add(".ui-btn-inner").removeClass("ui-corner-top ui-corner-bottom")}),
-d.first().find("a").first().addClass("ui-corner-top").find(".ui-btn-inner").addClass("ui-corner-top"),d.last().jqmData("collapsible-last",true).find("a").first().addClass("ui-corner-bottom").find(".ui-btn-inner").addClass("ui-corner-bottom"))}});a(document).bind("pagecreate create",function(e){a(a.mobile.collapsibleset.prototype.options.initSelector,e.target).collapsibleset()})})(jQuery);
-(function(a){a.fn.fieldcontain=function(){return this.addClass("ui-field-contain ui-body ui-br")};a(document).bind("pagecreate create",function(e){a(":jqmData(role='fieldcontain')",e.target).fieldcontain()})})(jQuery);
-(function(a){a.fn.grid=function(e){return this.each(function(){var b=a(this),d=a.extend({grid:null},e),f=b.children(),c={solo:1,a:2,b:3,c:4,d:5},d=d.grid;if(!d)if(f.length<=5)for(var h in c)c[h]===f.length&&(d=h);else d="a";c=c[d];b.addClass("ui-grid-"+d);f.filter(":nth-child("+c+"n+1)").addClass("ui-block-a");c>1&&f.filter(":nth-child("+c+"n+2)").addClass("ui-block-b");c>2&&f.filter(":nth-child(3n+3)").addClass("ui-block-c");c>3&&f.filter(":nth-child(4n+4)").addClass("ui-block-d");c>4&&f.filter(":nth-child(5n+5)").addClass("ui-block-e")})}})(jQuery);
-(function(a,e){a.widget("mobile.navbar",a.mobile.widget,{options:{iconpos:"top",grid:null,initSelector:":jqmData(role='navbar')"},_create:function(){var b=this.element,d=b.find("a"),f=d.filter(":jqmData(icon)").length?this.options.iconpos:e;b.addClass("ui-navbar").attr("role","navigation").find("ul").grid({grid:this.options.grid});f||b.addClass("ui-navbar-noicons");d.buttonMarkup({corners:false,shadow:false,iconpos:f});b.delegate("a","vclick",function(b){a(b.target).hasClass("ui-disabled")||(d.not(".ui-state-persist").removeClass(a.mobile.activeBtnClass),
-a(this).addClass(a.mobile.activeBtnClass))})}});a(document).bind("pagecreate create",function(b){a(a.mobile.navbar.prototype.options.initSelector,b.target).navbar()})})(jQuery);
-(function(a){var e={};a.widget("mobile.listview",a.mobile.widget,{options:{theme:null,countTheme:"c",headerTheme:"b",dividerTheme:"b",splitIcon:"arrow-r",splitTheme:"b",inset:false,initSelector:":jqmData(role='listview')"},_create:function(){var a=this;a.element.addClass(function(d,f){return f+" ui-listview "+(a.options.inset?" ui-listview-inset ui-corner-all ui-shadow ":"")});a.refresh(true)},_removeCorners:function(a,d){a=a.add(a.find(".ui-btn-inner, .ui-li-link-alt, .ui-li-thumb"));d==="top"?a.removeClass("ui-corner-top ui-corner-tr ui-corner-tl"):
-d==="bottom"?a.removeClass("ui-corner-bottom ui-corner-br ui-corner-bl"):a.removeClass("ui-corner-top ui-corner-tr ui-corner-tl ui-corner-bottom ui-corner-br ui-corner-bl")},_refreshCorners:function(a){var d,f;this.options.inset&&(d=this.element.children("li"),f=a?d.not(".ui-screen-hidden"):d.filter(":visible"),this._removeCorners(d),d=f.first().addClass("ui-corner-top"),d.add(d.find(".ui-btn-inner").not(".ui-li-link-alt span:first-child")).addClass("ui-corner-top").end().find(".ui-li-link-alt, .ui-li-link-alt span:first-child").addClass("ui-corner-tr").end().find(".ui-li-thumb").not(".ui-li-icon").addClass("ui-corner-tl"),
-f=f.last().addClass("ui-corner-bottom"),f.add(f.find(".ui-btn-inner")).find(".ui-li-link-alt").addClass("ui-corner-br").end().find(".ui-li-thumb").not(".ui-li-icon").addClass("ui-corner-bl"));a||this.element.trigger("updatelayout")},_findFirstElementByTagName:function(a,d,f,c){var e={};for(e[f]=e[c]=true;a;){if(e[a.nodeName])return a;a=a[d]}return null},_getChildrenByTagName:function(b,d,f){var c=[],e={};e[d]=e[f]=true;for(b=b.firstChild;b;)e[b.nodeName]&&c.push(b),b=b.nextSibling;return a(c)},_addThumbClasses:function(b){var d,
-f,c=b.length;for(d=0;d<c;d++)f=a(this._findFirstElementByTagName(b[d].firstChild,"nextSibling","img","IMG")),f.length&&(f.addClass("ui-li-thumb"),a(this._findFirstElementByTagName(f[0].parentNode,"parentNode","li","LI")).addClass(f.is(".ui-li-icon")?"ui-li-has-icon":"ui-li-has-thumb"))},refresh:function(b){this.parentPage=this.element.closest(".ui-page");this._createSubPages();var d=this.options,f=this.element,c=f.jqmData("dividertheme")||d.dividerTheme,e=f.jqmData("splittheme"),g=f.jqmData("spliticon"),
-i=this._getChildrenByTagName(f[0],"li","LI"),l=a.support.cssPseudoElement||!a.nodeName(f[0],"ol")?0:1,k={},o,n,q,j,p;l&&f.find(".ui-li-dec").remove();if(!d.theme)d.theme=a.mobile.getInheritedTheme(this.element,"c");for(var m=0,A=i.length;m<A;m++){o=i.eq(m);n="ui-li";if(b||!o.hasClass("ui-li"))q=o.jqmData("theme")||d.theme,j=this._getChildrenByTagName(o[0],"a","A"),j.length?(p=o.jqmData("icon"),o.buttonMarkup({wrapperEls:"div",shadow:false,corners:false,iconpos:"right",icon:j.length>1||p===false?false:
-p||"arrow-r",theme:q}),p!=false&&j.length==1&&o.addClass("ui-li-has-arrow"),j.first().addClass("ui-link-inherit"),j.length>1&&(n+=" ui-li-has-alt",j=j.last(),p=e||j.jqmData("theme")||d.splitTheme,j.appendTo(o).attr("title",j.getEncodedText()).addClass("ui-li-link-alt").empty().buttonMarkup({shadow:false,corners:false,theme:q,icon:false,iconpos:false}).find(".ui-btn-inner").append(a(document.createElement("span")).buttonMarkup({shadow:true,corners:true,theme:p,iconpos:"notext",icon:g||j.jqmData("icon")||
-d.splitIcon})))):o.jqmData("role")==="list-divider"?(n+=" ui-li-divider ui-btn ui-bar-"+c,o.attr("role","heading"),l&&(l=1)):n+=" ui-li-static ui-body-"+q;l&&n.indexOf("ui-li-divider")<0&&(q=o.is(".ui-li-static:first")?o:o.find(".ui-link-inherit"),q.addClass("ui-li-jsnumbering").prepend("<span class='ui-li-dec'>"+l++ +". </span>"));k[n]||(k[n]=[]);k[n].push(o[0])}for(n in k)a(k[n]).addClass(n).children(".ui-btn-inner").addClass(n);f.find("h1, h2, h3, h4, h5, h6").addClass("ui-li-heading").end().find("p, dl").addClass("ui-li-desc").end().find(".ui-li-aside").each(function(){var b=
-a(this);b.prependTo(b.parent())}).end().find(".ui-li-count").each(function(){a(this).closest("li").addClass("ui-li-has-count")}).addClass("ui-btn-up-"+(f.jqmData("counttheme")||this.options.countTheme)+" ui-btn-corner-all");this._addThumbClasses(i);this._addThumbClasses(f.find(".ui-link-inherit"));this._refreshCorners(b)},_idStringEscape:function(a){return a.replace(/[^a-zA-Z0-9]/g,"-")},_createSubPages:function(){var b=this.element,d=b.closest(".ui-page"),f=d.jqmData("url"),c=f||d[0][a.expando],
-h=b.attr("id"),g=this.options,i="data-"+a.mobile.ns,l=this,k=d.find(":jqmData(role='footer')").jqmData("id"),o;typeof e[c]==="undefined"&&(e[c]=-1);h=h||++e[c];a(b.find("li>ul, li>ol").toArray().reverse()).each(function(c){var d=a(this),e=d.attr("id")||h+"-"+c,c=d.parent(),l=a(d.prevAll().toArray().reverse()),l=l.length?l:a("<span>"+a.trim(c.contents()[0].nodeValue)+"</span>"),m=l.first().getEncodedText(),e=(f||"")+"&"+a.mobile.subPageUrlKey+"="+e,A=d.jqmData("theme")||g.theme,z=d.jqmData("counttheme")||
-b.jqmData("counttheme")||g.countTheme;o=true;d.detach().wrap("<div "+i+"role='page' "+i+"url='"+e+"' "+i+"theme='"+A+"' "+i+"count-theme='"+z+"'><div "+i+"role='content'></div></div>").parent().before("<div "+i+"role='header' "+i+"theme='"+g.headerTheme+"'><div class='ui-title'>"+m+"</div></div>").after(k?a("<div "+i+"role='footer' "+i+"id='"+k+"'>"):"").parent().appendTo(a.mobile.pageContainer).page();d=c.find("a:first");d.length||(d=a("<a/>").html(l||m).prependTo(c.empty()));d.attr("href","#"+e)}).listview();
-o&&d.is(":jqmData(external-page='true')")&&d.data("page").options.domCache===false&&d.unbind("pagehide.remove").bind("pagehide.remove",function(b,c){var e=c.nextPage;c.nextPage&&(e=e.jqmData("url"),e.indexOf(f+"&"+a.mobile.subPageUrlKey)!==0&&(l.childPages().remove(),d.remove()))})},childPages:function(){var b=this.parentPage.jqmData("url");return a(":jqmData(url^='"+b+"&"+a.mobile.subPageUrlKey+"')")}});a(document).bind("pagecreate create",function(b){a(a.mobile.listview.prototype.options.initSelector,
-b.target).listview()})})(jQuery);
-(function(a){a.mobile.listview.prototype.options.filter=false;a.mobile.listview.prototype.options.filterPlaceholder="Filter items...";a.mobile.listview.prototype.options.filterTheme="c";a.mobile.listview.prototype.options.filterCallback=function(a,b){return a.toLowerCase().indexOf(b)===-1};a(document).delegate(":jqmData(role='listview')","listviewcreate",function(){var e=a(this),b=e.data("listview");if(b.options.filter){var d=a("<form>",{"class":"ui-listview-filter ui-bar-"+b.options.filterTheme,
-role:"search"});a("<input>",{placeholder:b.options.filterPlaceholder}).attr("data-"+a.mobile.ns+"type","search").jqmData("lastval","").bind("keyup change",function(){var d=a(this),c=this.value.toLowerCase(),h=null,h=d.jqmData("lastval")+"",g=false,i="";d.jqmData("lastval",c);h=c.length<h.length||c.indexOf(h)!==0?e.children():e.children(":not(.ui-screen-hidden)");if(c){for(var l=h.length-1;l>=0;l--)d=a(h[l]),i=d.jqmData("filtertext")||d.text(),d.is("li:jqmData(role=list-divider)")?(d.toggleClass("ui-filter-hidequeue",
-!g),g=false):b.options.filterCallback(i,c)?d.toggleClass("ui-filter-hidequeue",true):g=true;h.filter(":not(.ui-filter-hidequeue)").toggleClass("ui-screen-hidden",false);h.filter(".ui-filter-hidequeue").toggleClass("ui-screen-hidden",true).toggleClass("ui-filter-hidequeue",false)}else h.toggleClass("ui-screen-hidden",false);b._refreshCorners()}).appendTo(d).textinput();a(this).jqmData("inset")&&d.addClass("ui-listview-filter-inset");d.bind("submit",function(){return false}).insertBefore(e)}})})(jQuery);
-(function(a){a(document).bind("pagecreate create",function(e){a(":jqmData(role='nojs')",e.target).addClass("ui-nojs")})})(jQuery);
-(function(a,e){a.widget("mobile.checkboxradio",a.mobile.widget,{options:{theme:null,initSelector:"input[type='checkbox'],input[type='radio']"},_create:function(){var b=this,d=this.element,f=d.closest("form,fieldset,:jqmData(role='page')").find("label").filter("[for='"+d[0].id+"']"),c=d.attr("type"),h=c+"-on",g=c+"-off",i=d.parents(":jqmData(type='horizontal')").length?e:g;if(!(c!=="checkbox"&&c!=="radio")){a.extend(this,{label:f,inputtype:c,checkedClass:"ui-"+h+(i?"":" "+a.mobile.activeBtnClass),
-uncheckedClass:"ui-"+g,checkedicon:"ui-icon-"+h,uncheckedicon:"ui-icon-"+g});if(!this.options.theme)this.options.theme=this.element.jqmData("theme");f.buttonMarkup({theme:this.options.theme,icon:i,shadow:false});d.add(f).wrapAll("<div class='ui-"+c+"'></div>");f.bind({vmouseover:function(b){a(this).parent().is(".ui-disabled")&&b.stopPropagation()},vclick:function(a){if(d.is(":disabled"))a.preventDefault();else return b._cacheVals(),d.prop("checked",c==="radio"&&true||!d.prop("checked")),d.triggerHandler("click"),
-b._getInputSet().not(d).prop("checked",false),b._updateAll(),false}});d.bind({vmousedown:function(){b._cacheVals()},vclick:function(){var c=a(this);c.is(":checked")?(c.prop("checked",true),b._getInputSet().not(c).prop("checked",false)):c.prop("checked",false);b._updateAll()},focus:function(){f.addClass("ui-focus")},blur:function(){f.removeClass("ui-focus")}});this.refresh()}},_cacheVals:function(){this._getInputSet().each(function(){var b=a(this);b.jqmData("cacheVal",b.is(":checked"))})},_getInputSet:function(){return this.inputtype==
-"checkbox"?this.element:this.element.closest("form,fieldset,:jqmData(role='page')").find("input[name='"+this.element.attr("name")+"'][type='"+this.inputtype+"']")},_updateAll:function(){var b=this;this._getInputSet().each(function(){var d=a(this);(d.is(":checked")||b.inputtype==="checkbox")&&d.trigger("change")}).checkboxradio("refresh")},refresh:function(){var b=this.element,d=this.label,f=d.find(".ui-icon");a(b[0]).prop("checked")?(d.addClass(this.checkedClass).removeClass(this.uncheckedClass),
-f.addClass(this.checkedicon).removeClass(this.uncheckedicon)):(d.removeClass(this.checkedClass).addClass(this.uncheckedClass),f.removeClass(this.checkedicon).addClass(this.uncheckedicon));b.is(":disabled")?this.disable():this.enable()},disable:function(){this.element.prop("disabled",true).parent().addClass("ui-disabled")},enable:function(){this.element.prop("disabled",false).parent().removeClass("ui-disabled")}});a(document).bind("pagecreate create",function(b){a.mobile.checkboxradio.prototype.enhanceWithin(b.target)})})(jQuery);
-(function(a,e){a.widget("mobile.button",a.mobile.widget,{options:{theme:null,icon:null,iconpos:null,inline:null,corners:true,shadow:true,iconshadow:true,initSelector:"button, [type='button'], [type='submit'], [type='reset'], [type='image']"},_create:function(){var b=this.element,d=this.options,f,c;b[0].tagName==="A"?b.hasClass("ui-btn")||b.buttonMarkup():(this.button=a("<div></div>").text(b.text()||b.val()).insertBefore(b).buttonMarkup({theme:d.theme,icon:d.icon,iconpos:d.iconpos,inline:d.inline,
-corners:d.corners,shadow:d.shadow,iconshadow:d.iconshadow}).append(b.addClass("ui-btn-hidden")),d=b.attr("type"),f=b.attr("name"),d!=="button"&&d!=="reset"&&f&&b.bind("vclick",function(){c===e&&(c=a("<input>",{type:"hidden",name:b.attr("name"),value:b.attr("value")}).insertBefore(b),a(document).one("submit",function(){c.remove();c=e}))}),this.refresh())},enable:function(){this.element.attr("disabled",false);this.button.removeClass("ui-disabled").attr("aria-disabled",false);return this._setOption("disabled",
-false)},disable:function(){this.element.attr("disabled",true);this.button.addClass("ui-disabled").attr("aria-disabled",true);return this._setOption("disabled",true)},refresh:function(){var a=this.element;a.prop("disabled")?this.disable():this.enable();this.button.data("textWrapper").text(a.text()||a.val())}});a(document).bind("pagecreate create",function(b){a.mobile.button.prototype.enhanceWithin(b.target)})})(jQuery);
-(function(a,e){a.widget("mobile.slider",a.mobile.widget,{options:{theme:null,trackTheme:null,disabled:false,initSelector:"input[type='range'], :jqmData(type='range'), :jqmData(role='slider')"},_create:function(){var b=this,d=this.element,f=a.mobile.getInheritedTheme(d,"c"),c=this.options.theme||f,h=this.options.trackTheme||f,g=d[0].nodeName.toLowerCase(),f=g=="select"?"ui-slider-switch":"",i=d.attr("id"),l=i+"-label",i=a("[for='"+i+"']").attr("id",l),k=function(){return g=="input"?parseFloat(d.val()):
-d[0].selectedIndex},o=g=="input"?parseFloat(d.attr("min")):0,n=g=="input"?parseFloat(d.attr("max")):d.find("option").length-1,q=window.parseFloat(d.attr("step")||1),j=a("<div class='ui-slider "+f+" ui-btn-down-"+h+" ui-btn-corner-all' role='application'></div>"),p=a("<a href='#' class='ui-slider-handle'></a>").appendTo(j).buttonMarkup({corners:true,theme:c,shadow:true}).attr({role:"slider","aria-valuemin":o,"aria-valuemax":n,"aria-valuenow":k(),"aria-valuetext":k(),title:k(),"aria-labelledby":l});
-a.extend(this,{slider:j,handle:p,dragging:false,beforeStart:null,userModified:false,mouseMoved:false});g=="select"&&(j.wrapInner("<div class='ui-slider-inneroffset'></div>"),p.addClass("ui-slider-handle-snapping"),d.find("option"),d.find("option").each(function(b){var c=!b?"b":"a",d=!b?"right":"left",b=!b?" ui-btn-down-"+h:" "+a.mobile.activeBtnClass;a("<div class='ui-slider-labelbg ui-slider-labelbg-"+c+b+" ui-btn-corner-"+d+"'></div>").prependTo(j);a("<span class='ui-slider-label ui-slider-label-"+
-c+b+" ui-btn-corner-"+d+"' role='img'>"+a(this).getEncodedText()+"</span>").prependTo(p)}));i.addClass("ui-slider");d.addClass(g==="input"?"ui-slider-input":"ui-slider-switch").change(function(){b.mouseMoved||b.refresh(k(),true)}).keyup(function(){b.refresh(k(),true,true)}).blur(function(){b.refresh(k(),true)});a(document).bind("vmousemove",function(a){if(b.dragging)return b.mouseMoved=true,g==="select"&&p.removeClass("ui-slider-handle-snapping"),b.refresh(a),b.userModified=b.beforeStart!==d[0].selectedIndex,
-false});j.bind("vmousedown",function(a){b.dragging=true;b.userModified=false;b.mouseMoved=false;if(g==="select")b.beforeStart=d[0].selectedIndex;b.refresh(a);return false});j.add(document).bind("vmouseup",function(){if(b.dragging)return b.dragging=false,g==="select"&&(p.addClass("ui-slider-handle-snapping"),b.mouseMoved?b.userModified?b.refresh(b.beforeStart==0?1:0):b.refresh(b.beforeStart):b.refresh(b.beforeStart==0?1:0)),b.mouseMoved=false});j.insertAfter(d);this.handle.bind("vmousedown",function(){a(this).focus()}).bind("vclick",
-false);this.handle.bind("keydown",function(c){var d=k();if(!b.options.disabled){switch(c.keyCode){case a.mobile.keyCode.HOME:case a.mobile.keyCode.END:case a.mobile.keyCode.PAGE_UP:case a.mobile.keyCode.PAGE_DOWN:case a.mobile.keyCode.UP:case a.mobile.keyCode.RIGHT:case a.mobile.keyCode.DOWN:case a.mobile.keyCode.LEFT:if(c.preventDefault(),!b._keySliding)b._keySliding=true,a(this).addClass("ui-state-active")}switch(c.keyCode){case a.mobile.keyCode.HOME:b.refresh(o);break;case a.mobile.keyCode.END:b.refresh(n);
-break;case a.mobile.keyCode.PAGE_UP:case a.mobile.keyCode.UP:case a.mobile.keyCode.RIGHT:b.refresh(d+q);break;case a.mobile.keyCode.PAGE_DOWN:case a.mobile.keyCode.DOWN:case a.mobile.keyCode.LEFT:b.refresh(d-q)}}}).keyup(function(){if(b._keySliding)b._keySliding=false,a(this).removeClass("ui-state-active")});this.refresh(e,e,true)},refresh:function(a,d,f){(this.options.disabled||this.element.attr("disabled"))&&this.disable();var c=this.element,e=c[0].nodeName.toLowerCase(),g=e==="input"?parseFloat(c.attr("min")):
-0,i=e==="input"?parseFloat(c.attr("max")):c.find("option").length-1,l=e==="input"&&parseFloat(c.attr("step"))>0?parseFloat(c.attr("step")):1;if(typeof a==="object"){if(!this.dragging||a.pageX<this.slider.offset().left-8||a.pageX>this.slider.offset().left+this.slider.width()+8)return;a=Math.round((a.pageX-this.slider.offset().left)/this.slider.width()*100)}else a==null&&(a=e==="input"?parseFloat(c.val()||0):c[0].selectedIndex),a=(parseFloat(a)-g)/(i-g)*100;if(!isNaN(a)){a<0&&(a=0);a>100&&(a=100);var k=
-a/100*(i-g)+g,o=(k-g)%l;k-=o;Math.abs(o)*2>=l&&(k+=o>0?l:-l);k=parseFloat(k.toFixed(5));k<g&&(k=g);k>i&&(k=i);this.handle.css("left",a+"%");this.handle.attr({"aria-valuenow":e==="input"?k:c.find("option").eq(k).attr("value"),"aria-valuetext":e==="input"?k:c.find("option").eq(k).getEncodedText(),title:e==="input"?k:c.find("option").eq(k).getEncodedText()});e==="select"&&(k===0?this.slider.addClass("ui-slider-switch-a").removeClass("ui-slider-switch-b"):this.slider.addClass("ui-slider-switch-b").removeClass("ui-slider-switch-a"));
-if(!f)f=false,e==="input"?(f=c.val()!==k,c.val(k)):(f=c[0].selectedIndex!==k,c[0].selectedIndex=k),!d&&f&&c.trigger("change")}},enable:function(){this.element.attr("disabled",false);this.slider.removeClass("ui-disabled").attr("aria-disabled",false);return this._setOption("disabled",false)},disable:function(){this.element.attr("disabled",true);this.slider.addClass("ui-disabled").attr("aria-disabled",true);return this._setOption("disabled",true)}});a(document).bind("pagecreate create",function(b){a.mobile.slider.prototype.enhanceWithin(b.target)})})(jQuery);
-(function(a){a.widget("mobile.textinput",a.mobile.widget,{options:{theme:null,initSelector:"input[type='text'], input[type='search'], :jqmData(type='search'), input[type='number'], :jqmData(type='number'), input[type='password'], input[type='email'], input[type='url'], input[type='tel'], textarea, input[type='time'], input[type='date'], input[type='month'], input[type='week'], input[type='datetime'], input[type='datetime-local'], input[type='color'], input:not([type])"},_create:function(){var e=this.element,
-b=this.options.theme||a.mobile.getInheritedTheme(this.element,"c"),d=" ui-body-"+b,f,c;a("label[for='"+e.attr("id")+"']").addClass("ui-input-text");f=e.addClass("ui-input-text ui-body-"+b);typeof e[0].autocorrect!=="undefined"&&!a.support.touchOverflow&&(e[0].setAttribute("autocorrect","off"),e[0].setAttribute("autocomplete","off"));e.is("[type='search'],:jqmData(type='search')")?(f=e.wrap("<div class='ui-input-search ui-shadow-inset ui-btn-corner-all ui-btn-shadow ui-icon-searchfield"+d+"'></div>").parent(),
-c=a("<a href='#' class='ui-input-clear' title='clear text'>clear text</a>").tap(function(a){e.val("").focus();e.trigger("change");c.addClass("ui-input-clear-hidden");a.preventDefault()}).appendTo(f).buttonMarkup({icon:"delete",iconpos:"notext",corners:true,shadow:true}),b=function(){setTimeout(function(){c.toggleClass("ui-input-clear-hidden",!e.val())},0)},b(),e.bind("paste cut keyup focus change blur",b)):e.addClass("ui-corner-all ui-shadow-inset"+d);e.focus(function(){f.addClass("ui-focus")}).blur(function(){f.removeClass("ui-focus")});
-if(e.is("textarea")){var h=function(){var a=e[0].scrollHeight;e[0].clientHeight<a&&e.height(a+15)},g;e.keyup(function(){clearTimeout(g);g=setTimeout(h,100)});a(document).one("pagechange",h);a.trim(e.val())&&a(window).load(h)}},disable:function(){(this.element.attr("disabled",true).is("[type='search'],:jqmData(type='search')")?this.element.parent():this.element).addClass("ui-disabled")},enable:function(){(this.element.attr("disabled",false).is("[type='search'],:jqmData(type='search')")?this.element.parent():
-this.element).removeClass("ui-disabled")}});a(document).bind("pagecreate create",function(e){a.mobile.textinput.prototype.enhanceWithin(e.target)})})(jQuery);
-(function(a){var e=function(b){var d=b.selectID,f=b.label,c=b.select.closest(".ui-page"),e=a("<div>",{"class":"ui-selectmenu-screen ui-screen-hidden"}).appendTo(c),g=b._selectOptions(),i=b.isMultiple=b.select[0].multiple,l=d+"-button",k=d+"-menu",o=a("<div data-"+a.mobile.ns+"role='dialog' data-"+a.mobile.ns+"theme='"+b.options.theme+"' data-"+a.mobile.ns+"overlay-theme='"+b.options.overlayTheme+"'><div data-"+a.mobile.ns+"role='header'><div class='ui-title'>"+f.getEncodedText()+"</div></div><div data-"+
-a.mobile.ns+"role='content'></div></div>").appendTo(a.mobile.pageContainer).page(),n=a("<div>",{"class":"ui-selectmenu ui-selectmenu-hidden ui-overlay-shadow ui-corner-all ui-body-"+b.options.overlayTheme+" "+a.mobile.defaultDialogTransition}).insertAfter(e),q=a("<ul>",{"class":"ui-selectmenu-list",id:k,role:"listbox","aria-labelledby":l}).attr("data-"+a.mobile.ns+"theme",b.options.theme).appendTo(n),j=a("<div>",{"class":"ui-header ui-bar-"+b.options.theme}).prependTo(n),p=a("<h1>",{"class":"ui-title"}).appendTo(j),
-m=a("<a>",{text:b.options.closeText,href:"#","class":"ui-btn-left"}).attr("data-"+a.mobile.ns+"iconpos","notext").attr("data-"+a.mobile.ns+"icon","delete").appendTo(j).buttonMarkup(),A=o.find(".ui-content"),z=o.find(".ui-header a");a.extend(b,{select:b.select,selectID:d,buttonId:l,menuId:k,thisPage:c,menuPage:o,label:f,screen:e,selectOptions:g,isMultiple:i,theme:b.options.theme,listbox:n,list:q,header:j,headerTitle:p,headerClose:m,menuPageContent:A,menuPageClose:z,placeholder:"",build:function(){var b=
-this;b.refresh();b.select.attr("tabindex","-1").focus(function(){a(this).blur();b.button.focus()});b.button.bind("vclick keydown",function(c){if(c.type=="vclick"||c.keyCode&&(c.keyCode===a.mobile.keyCode.ENTER||c.keyCode===a.mobile.keyCode.SPACE))b.open(),c.preventDefault()});b.list.attr("role","listbox").delegate(".ui-li>a","focusin",function(){a(this).attr("tabindex","0")}).delegate(".ui-li>a","focusout",function(){a(this).attr("tabindex","-1")}).delegate("li:not(.ui-disabled, .ui-li-divider)",
-"click",function(c){var d=b.select[0].selectedIndex,f=b.list.find("li:not(.ui-li-divider)").index(this),e=b._selectOptions().eq(f)[0];e.selected=b.isMultiple?!e.selected:true;b.isMultiple&&a(this).find(".ui-icon").toggleClass("ui-icon-checkbox-on",e.selected).toggleClass("ui-icon-checkbox-off",!e.selected);(b.isMultiple||d!==f)&&b.select.trigger("change");b.isMultiple||b.close();c.preventDefault()}).keydown(function(b){var c=a(b.target),d=c.closest("li");switch(b.keyCode){case 38:return b=d.prev(),
-b.length&&(c.blur().attr("tabindex","-1"),b.find("a").first().focus()),false;case 40:return b=d.next(),b.length&&(c.blur().attr("tabindex","-1"),b.find("a").first().focus()),false;case 13:case 32:return c.trigger("click"),false}});b.menuPage.bind("pagehide",function(){b.list.appendTo(b.listbox);b._focusButton();a.mobile._bindPageRemove.call(b.thisPage)});b.screen.bind("vclick",function(){b.close()});b.headerClose.click(function(){if(b.menuType=="overlay")return b.close(),false});b.thisPage.addDependents(this.menuPage)},
-_isRebuildRequired:function(){var a=this.list.find("li");return this._selectOptions().text()!==a.text()},refresh:function(b){var c=this;this._selectOptions();this.selected();var d=this.selectedIndices();(b||this._isRebuildRequired())&&c._buildList();c.setButtonText();c.setButtonCount();c.list.find("li:not(.ui-li-divider)").removeClass(a.mobile.activeBtnClass).attr("aria-selected",false).each(function(b){a.inArray(b,d)>-1&&(b=a(this),b.attr("aria-selected",true),c.isMultiple?b.find(".ui-icon").removeClass("ui-icon-checkbox-off").addClass("ui-icon-checkbox-on"):
-b.addClass(a.mobile.activeBtnClass))})},close:function(){if(!this.options.disabled&&this.isOpen)this.menuType=="page"?window.history.back():(this.screen.addClass("ui-screen-hidden"),this.listbox.addClass("ui-selectmenu-hidden").removeAttr("style").removeClass("in"),this.list.appendTo(this.listbox),this._focusButton()),this.isOpen=false},open:function(){if(!this.options.disabled){var b=this,c=b.list.parent().outerHeight(),d=b.list.parent().outerWidth(),f=a(".ui-page-active"),e=a.support.touchOverflow&&
-a.mobile.touchOverflowEnabled,f=f.is(".ui-native-fixed")?f.find(".ui-content"):f,g=e?f.scrollTop():a(window).scrollTop(),h=b.button.offset().top,j=a(window).height(),e=a(window).width();b.button.addClass(a.mobile.activeBtnClass);setTimeout(function(){b.button.removeClass(a.mobile.activeBtnClass)},300);if(c>j-80||!a.support.scrollTop){b.thisPage.unbind("pagehide.remove");if(g==0&&h>j)b.thisPage.one("pagehide",function(){a(this).jqmData("lastScroll",h)});b.menuPage.one("pageshow",function(){a(window).one("silentscroll",
-function(){b.list.find(a.mobile.activeBtnClass).focus()});b.isOpen=true});b.menuType="page";b.menuPageContent.append(b.list);b.menuPage.find("div .ui-title").text(b.label.text());a.mobile.changePage(b.menuPage,{transition:a.mobile.defaultDialogTransition})}else{b.menuType="overlay";b.screen.height(a(document).height()).removeClass("ui-screen-hidden");var i=h-g,n=g+j-h,m=c/2,f=parseFloat(b.list.parent().css("max-width")),c=i>c/2&&n>c/2?h+b.button.outerHeight()/2-m:i>n?g+j-c-30:g+30;d<f?f=(e-d)/2:(f=
-b.button.offset().left+b.button.outerWidth()/2-d/2,f<30?f=30:f+d>e&&(f=e-d-30));b.listbox.append(b.list).removeClass("ui-selectmenu-hidden").css({top:c,left:f}).addClass("in");b.list.find(a.mobile.activeBtnClass).focus();b.isOpen=true}}},_buildList:function(){var b=this,c=this.options,d=this.placeholder,f=[],e=[],g=b.isMultiple?"checkbox-off":"false";b.list.empty().filter(".ui-listview").listview("destroy");b.select.find("option").each(function(h){var j=a(this),i=j.parent(),n=j.getEncodedText(),m=
-"<a href='#'>"+n+"</a>",k=[],l=[];i.is("optgroup")&&(i=i.attr("label"),a.inArray(i,f)===-1&&(e.push("<li data-"+a.mobile.ns+"role='list-divider'>"+i+"</li>"),f.push(i)));if(!this.getAttribute("value")||n.length==0||j.jqmData("placeholder"))c.hidePlaceholderMenuItems&&k.push("ui-selectmenu-placeholder"),d=b.placeholder=n;this.disabled&&(k.push("ui-disabled"),l.push("aria-disabled='true'"));e.push("<li data-"+a.mobile.ns+"option-index='"+h+"' data-"+a.mobile.ns+"icon='"+g+"' class='"+k.join(" ")+"' "+
-l.join(" ")+">"+m+"</li>")});b.list.html(e.join(" "));b.list.find("li").attr({role:"option",tabindex:"-1"}).first().attr("tabindex","0");this.isMultiple||this.headerClose.hide();!this.isMultiple&&!d.length?this.header.hide():this.headerTitle.text(this.placeholder);b.list.listview()},_button:function(){return a("<a>",{href:"#",role:"button",id:this.buttonId,"aria-haspopup":"true","aria-owns":this.menuId})}})};a(document).delegate("select","selectmenubeforecreate",function(){var b=a(this).data("selectmenu");
-b.options.nativeMenu||e(b)})})(jQuery);
-(function(a){a.widget("mobile.selectmenu",a.mobile.widget,{options:{theme:null,disabled:false,icon:"arrow-d",iconpos:"right",inline:null,corners:true,shadow:true,iconshadow:true,menuPageTheme:"b",overlayTheme:"a",hidePlaceholderMenuItems:true,closeText:"Close",nativeMenu:true,initSelector:"select:not(:jqmData(role='slider'))"},_button:function(){return a("<div/>")},_setDisabled:function(a){this.element.attr("disabled",a);this.button.attr("aria-disabled",a);return this._setOption("disabled",a)},_focusButton:function(){var a=
-this;setTimeout(function(){a.button.focus()},40)},_selectOptions:function(){return this.select.find("option")},_preExtension:function(){this.select=this.element.wrap("<div class='ui-select'>");this.selectID=this.select.attr("id");this.label=a("label[for='"+this.selectID+"']").addClass("ui-select");this.isMultiple=this.select[0].multiple;if(!this.options.theme)this.options.theme=a.mobile.getInheritedTheme(this.select,"c")},_create:function(){this._preExtension();this._trigger("beforeCreate");this.button=
-this._button();var e=this,b=this.options,d=this.button.text(a(this.select[0].options.item(this.select[0].selectedIndex==-1?0:this.select[0].selectedIndex)).text()).insertBefore(this.select).buttonMarkup({theme:b.theme,icon:b.icon,iconpos:b.iconpos,inline:b.inline,corners:b.corners,shadow:b.shadow,iconshadow:b.iconshadow});b.nativeMenu&&window.opera&&window.opera.version&&this.select.addClass("ui-select-nativeonly");if(this.isMultiple)this.buttonCount=a("<span>").addClass("ui-li-count ui-btn-up-c ui-btn-corner-all").hide().appendTo(d.addClass("ui-li-has-count"));
-(b.disabled||this.element.attr("disabled"))&&this.disable();this.select.change(function(){e.refresh()});this.build()},build:function(){var e=this;this.select.appendTo(e.button).bind("vmousedown",function(){e.button.addClass(a.mobile.activeBtnClass)}).bind("focus vmouseover",function(){e.button.trigger("vmouseover")}).bind("vmousemove",function(){e.button.removeClass(a.mobile.activeBtnClass)}).bind("change blur vmouseout",function(){e.button.trigger("vmouseout").removeClass(a.mobile.activeBtnClass)}).bind("change blur",
-function(){e.button.removeClass("ui-btn-down-"+e.options.theme)})},selected:function(){return this._selectOptions().filter(":selected")},selectedIndices:function(){var a=this;return this.selected().map(function(){return a._selectOptions().index(this)}).get()},setButtonText:function(){var e=this,b=this.selected();this.button.find(".ui-btn-text").text(function(){return!e.isMultiple?b.text():b.length?b.map(function(){return a(this).text()}).get().join(", "):e.placeholder})},setButtonCount:function(){var a=
-this.selected();this.isMultiple&&this.buttonCount[a.length>1?"show":"hide"]().text(a.length)},refresh:function(){this.setButtonText();this.setButtonCount()},open:a.noop,close:a.noop,disable:function(){this._setDisabled(true);this.button.addClass("ui-disabled")},enable:function(){this._setDisabled(false);this.button.removeClass("ui-disabled")}});a(document).bind("pagecreate create",function(e){a.mobile.selectmenu.prototype.enhanceWithin(e.target)})})(jQuery);
-(function(a,e){function b(a){for(var b;a;){if((b=typeof a.className==="string"&&a.className+" ")&&b.indexOf("ui-btn ")>-1&&b.indexOf("ui-disabled ")<0)break;a=a.parentNode}return a}a.fn.buttonMarkup=function(b){for(var b=b||{},c=0;c<this.length;c++){var h=this.eq(c),g=h[0],i=a.extend({},a.fn.buttonMarkup.defaults,{icon:b.icon!==e?b.icon:h.jqmData("icon"),iconpos:b.iconpos!==e?b.iconpos:h.jqmData("iconpos"),theme:b.theme!==e?b.theme:h.jqmData("theme"),inline:b.inline!==e?b.inline:h.jqmData("inline"),
-shadow:b.shadow!==e?b.shadow:h.jqmData("shadow"),corners:b.corners!==e?b.corners:h.jqmData("corners"),iconshadow:b.iconshadow!==e?b.iconshadow:h.jqmData("iconshadow")},b),l="ui-btn-inner",k,o,n=document.createElement(i.wrapperEls),q=document.createElement(i.wrapperEls),j=i.icon?document.createElement("span"):null;if(!(g.tagName==="INPUT"&&h.jqmData("role")==="button"))if(g.tagName==="BUTTON")a(g.parentNode).hasClass("ui-btn")||a(g).button();else{d&&d();if(!i.theme)i.theme=a.mobile.getInheritedTheme(h,
-"c");k="ui-btn ui-btn-up-"+i.theme;i.inline&&(k+=" ui-btn-inline");if(i.icon)i.icon="ui-icon-"+i.icon,i.iconpos=i.iconpos||"left",o="ui-icon "+i.icon,i.iconshadow&&(o+=" ui-icon-shadow");i.iconpos&&(k+=" ui-btn-icon-"+i.iconpos,i.iconpos=="notext"&&!h.attr("title")&&h.attr("title",h.getEncodedText()));i.corners&&(k+=" ui-btn-corner-all",l+=" ui-btn-corner-all");i.shadow&&(k+=" ui-shadow");g.setAttribute("data-"+a.mobile.ns+"theme",i.theme);h.addClass(k);n.className=l;q.className="ui-btn-text";n.appendChild(q);
-if(j)j.className=o,n.appendChild(j);for(;g.firstChild;)q.appendChild(g.firstChild);g.appendChild(n);a.data(g,"textWrapper",a(q))}}return this};a.fn.buttonMarkup.defaults={corners:true,shadow:true,iconshadow:true,inline:false,wrapperEls:"span"};var d=function(){a(document).bind({vmousedown:function(d){var d=b(d.target),c;d&&(d=a(d),c=d.attr("data-"+a.mobile.ns+"theme"),d.removeClass("ui-btn-up-"+c).addClass("ui-btn-down-"+c))},"vmousecancel vmouseup":function(d){var d=b(d.target),c;d&&(d=a(d),c=d.attr("data-"+
-a.mobile.ns+"theme"),d.removeClass("ui-btn-down-"+c).addClass("ui-btn-up-"+c))},"vmouseover focus":function(d){var d=b(d.target),c;d&&(d=a(d),c=d.attr("data-"+a.mobile.ns+"theme"),d.removeClass("ui-btn-up-"+c).addClass("ui-btn-hover-"+c))},"vmouseout blur":function(d){var d=b(d.target),c;d&&(d=a(d),c=d.attr("data-"+a.mobile.ns+"theme"),d.removeClass("ui-btn-hover-"+c+" ui-btn-down-"+c).addClass("ui-btn-up-"+c))}});d=null};a(document).bind("pagecreate create",function(b){a(":jqmData(role='button'), .ui-bar > a, .ui-header > a, .ui-footer > a, .ui-bar > :jqmData(role='controlgroup') > a",
-b.target).not(".ui-btn, :jqmData(role='none'), :jqmData(role='nojs')").buttonMarkup()})})(jQuery);
-(function(a){a.fn.controlgroup=function(e){return this.each(function(){function b(a){a.removeClass("ui-btn-corner-all ui-shadow").eq(0).addClass(h[0]).end().last().addClass(h[1]).addClass("ui-controlgroup-last")}var d=a(this),f=a.extend({direction:d.jqmData("type")||"vertical",shadow:false,excludeInvisible:true},e),c=d.children("legend"),h=f.direction=="horizontal"?["ui-corner-left","ui-corner-right"]:["ui-corner-top","ui-corner-bottom"];d.find("input").first().attr("type");c.length&&(d.wrapInner("<div class='ui-controlgroup-controls'></div>"),
-a("<div role='heading' class='ui-controlgroup-label'>"+c.html()+"</div>").insertBefore(d.children(0)),c.remove());d.addClass("ui-corner-all ui-controlgroup ui-controlgroup-"+f.direction);b(d.find(".ui-btn"+(f.excludeInvisible?":visible":"")));b(d.find(".ui-btn-inner"));f.shadow&&d.addClass("ui-shadow")})};a(document).bind("pagecreate create",function(e){a(":jqmData(role='controlgroup')",e.target).controlgroup({excludeInvisible:false})})})(jQuery);
-(function(a){a(document).bind("pagecreate create",function(e){a(e.target).find("a").not(".ui-btn, .ui-link-inherit, :jqmData(role='none'), :jqmData(role='nojs')").addClass("ui-link")})})(jQuery);
-(function(a,e){a.fn.fixHeaderFooter=function(){return!a.support.scrollTop||a.support.touchOverflow&&a.mobile.touchOverflowEnabled?this:this.each(function(){var b=a(this);b.jqmData("fullscreen")&&b.addClass("ui-page-fullscreen");b.find(".ui-header:jqmData(position='fixed')").addClass("ui-header-fixed ui-fixed-inline fade");b.find(".ui-footer:jqmData(position='fixed')").addClass("ui-footer-fixed ui-fixed-inline fade")})};a.mobile.fixedToolbars=function(){function b(){!i&&g==="overlay"&&(h||a.mobile.fixedToolbars.hide(true),
-a.mobile.fixedToolbars.startShowTimer())}function d(a){var b=0,c,d;if(a){d=document.body;c=a.offsetParent;for(b=a.offsetTop;a&&a!=d;){b+=a.scrollTop||0;if(a==c)b+=c.offsetTop,c=a.offsetParent;a=a.parentNode}}return b}function f(b){var c=a(window).scrollTop(),e=d(b[0]),f=b.css("top")=="auto"?0:parseFloat(b.css("top")),g=window.innerHeight,h=b.outerHeight(),i=b.parents(".ui-page:not(.ui-page-fullscreen)").length;return b.is(".ui-header-fixed")?(f=c-e+f,f<e&&(f=0),b.css("top",i?f:c)):b.css("top",i?c+
-g-h-(e-f):c+g-h)}if(a.support.scrollTop&&(!a.support.touchOverflow||!a.mobile.touchOverflowEnabled)){var c,h,g="inline",i=false,l=null,k=false,o=true;a(function(){var c=a(document),d=a(window);c.bind("vmousedown",function(){o&&(l=g)}).bind("vclick",function(b){o&&!a(b.target).closest("a,input,textarea,select,button,label,.ui-header-fixed,.ui-footer-fixed").length&&!k&&(a.mobile.fixedToolbars.toggle(l),l=null)}).bind("silentscroll",b);(c.scrollTop()===0?d:c).bind("scrollstart",function(){k=true;l===
-null&&(l=g);var b=l=="overlay";if(i=b||!!h)a.mobile.fixedToolbars.clearShowTimer(),b&&a.mobile.fixedToolbars.hide(true)}).bind("scrollstop",function(b){a(b.target).closest("a,input,textarea,select,button,label,.ui-header-fixed,.ui-footer-fixed").length||(k=false,i&&(a.mobile.fixedToolbars.startShowTimer(),i=false),l=null)});d.bind("resize updatelayout",b)});a(document).delegate(".ui-page","pagebeforeshow",function(b,d){var e=a(b.target).find(":jqmData(role='footer')"),g=e.data("id"),h=d.prevPage,
-h=h&&h.find(":jqmData(role='footer')"),h=h.length&&h.jqmData("id")===g;g&&h&&(c=e,f(c.removeClass("fade in out").appendTo(a.mobile.pageContainer)))}).delegate(".ui-page","pageshow",function(){var b=a(this);c&&c.length&&setTimeout(function(){f(c.appendTo(b).addClass("fade"));c=null},500);a.mobile.fixedToolbars.show(true,this)});a(document).delegate(".ui-collapsible-contain","collapse expand",b);return{show:function(b,c){a.mobile.fixedToolbars.clearShowTimer();g="overlay";return(c?a(c):a.mobile.activePage?
-a.mobile.activePage:a(".ui-page-active")).children(".ui-header-fixed:first, .ui-footer-fixed:not(.ui-footer-duplicate):last").each(function(){var c=a(this),e=a(window).scrollTop(),g=d(c[0]),h=window.innerHeight,i=c.outerHeight(),e=c.is(".ui-header-fixed")&&e<=g+i||c.is(".ui-footer-fixed")&&g<=e+h;c.addClass("ui-fixed-overlay").removeClass("ui-fixed-inline");!e&&!b&&c.animationComplete(function(){c.removeClass("in")}).addClass("in");f(c)})},hide:function(b){g="inline";return(a.mobile.activePage?a.mobile.activePage:
-a(".ui-page-active")).children(".ui-header-fixed:first, .ui-footer-fixed:not(.ui-footer-duplicate):last").each(function(){var c=a(this),d=c.css("top"),d=d=="auto"?0:parseFloat(d);c.addClass("ui-fixed-inline").removeClass("ui-fixed-overlay");if(d<0||c.is(".ui-header-fixed")&&d!==0)b?c.css("top",0):c.css("top")!=="auto"&&parseFloat(c.css("top"))!==0&&c.animationComplete(function(){c.removeClass("out reverse").css("top",0)}).addClass("out reverse")})},startShowTimer:function(){a.mobile.fixedToolbars.clearShowTimer();
-var b=[].slice.call(arguments);h=setTimeout(function(){h=e;a.mobile.fixedToolbars.show.apply(null,b)},100)},clearShowTimer:function(){h&&clearTimeout(h);h=e},toggle:function(b){b&&(g=b);return g==="overlay"?a.mobile.fixedToolbars.hide():a.mobile.fixedToolbars.show()},setTouchToggleEnabled:function(a){o=a}}}}();a(document).bind("pagecreate create",function(b){a(":jqmData(position='fixed')",b.target).length&&a(b.target).each(function(){if(!a.support.scrollTop||a.support.touchOverflow&&a.mobile.touchOverflowEnabled)return this;
-var b=a(this);b.jqmData("fullscreen")&&b.addClass("ui-page-fullscreen");b.find(".ui-header:jqmData(position='fixed')").addClass("ui-header-fixed ui-fixed-inline fade");b.find(".ui-footer:jqmData(position='fixed')").addClass("ui-footer-fixed ui-fixed-inline fade")})})})(jQuery);
-(function(a){a.mobile.touchOverflowEnabled=false;a.mobile.touchOverflowZoomEnabled=false;a(document).bind("pagecreate",function(e){a.support.touchOverflow&&a.mobile.touchOverflowEnabled&&(e=a(e.target),e.is(":jqmData(role='page')")&&e.each(function(){var b=a(this),d=b.find(":jqmData(role='header'), :jqmData(role='footer')").filter(":jqmData(position='fixed')"),e=b.jqmData("fullscreen"),c=d.length?b.find(".ui-content"):b;b.addClass("ui-mobile-touch-overflow");c.bind("scrollstop",function(){c.scrollTop()>
-0&&window.scrollTo(0,a.mobile.defaultHomeScroll)});d.length&&(b.addClass("ui-native-fixed"),e&&(b.addClass("ui-native-fullscreen"),d.addClass("fade in"),a(document).bind("vclick",function(){d.removeClass("ui-native-bars-hidden").toggleClass("in out").animationComplete(function(){a(this).not(".in").addClass("ui-native-bars-hidden")})})))}))})})(jQuery);
-(function(a,e){function b(){var b=a("meta[name='viewport']");b.length?b.attr("content",b.attr("content")+", user-scalable=no"):a("head").prepend("<meta>",{name:"viewport",content:"user-scalable=no"})}var d=a("html");a("head");var f=a(e);a(e.document).trigger("mobileinit");if(a.mobile.gradeA()){if(a.mobile.ajaxBlacklist)a.mobile.ajaxEnabled=false;d.addClass("ui-mobile ui-mobile-rendering");var c=a("<div class='ui-loader ui-body-a ui-corner-all'><span class='ui-icon ui-icon-loading spin'></span><h1></h1></div>");
-a.extend(a.mobile,{showPageLoadingMsg:function(){if(a.mobile.loadingMessage){var b=a("."+a.mobile.activeBtnClass).first();c.find("h1").text(a.mobile.loadingMessage).end().appendTo(a.mobile.pageContainer).css({top:a.support.scrollTop&&f.scrollTop()+f.height()/2||b.length&&b.offset().top||100})}d.addClass("ui-loading")},hidePageLoadingMsg:function(){d.removeClass("ui-loading")},initializePage:function(){var b,c=a(":jqmData(role='page')");c.length||(b=a(":jqmData(role='dialog')"),b.length?(b.first().attr("data-"+
-a.mobile.ns+"role","page"),c=c.add(b.get().shift())):c=a("body").wrapInner("<div data-"+a.mobile.ns+"role='page'></div>").children(0));c.add(":jqmData(role='dialog')").each(function(){var b=a(this);b.jqmData("url")||b.attr("data-"+a.mobile.ns+"url",b.attr("id")||location.pathname+location.search)});a.mobile.firstPage=c.first();a.mobile.pageContainer=c.first().parent().addClass("ui-mobile-viewport");f.trigger("pagecontainercreate");a.mobile.showPageLoadingMsg();!a.mobile.hashListeningEnabled||!a.mobile.path.stripHash(location.hash)?
-a.mobile.changePage(a.mobile.firstPage,{transition:"none",reverse:true,changeHash:false,fromHashChange:true}):f.trigger("hashchange",[true])}});a.support.touchOverflow&&a.mobile.touchOverflowEnabled&&!a.mobile.touchOverflowZoomEnabled&&b();a.mobile._registerInternalEvents();a(function(){e.scrollTo(0,1);a.mobile.defaultHomeScroll=!a.support.scrollTop||a(e).scrollTop()===1?0:1;a.mobile.autoInitializePage&&a.mobile.initializePage();f.load(a.mobile.silentScroll)})}})(jQuery,this);
+/*! jQuery Mobile 1.3.1 | Git HEAD hash: 74b4bec <> 2013-04-08T19:41:28Z | (c) 2010, 2013 jQuery Foundation, Inc. | jquery.org/license */
+(function(e,t,i){"function"==typeof define&&define.amd?define(["jquery"],function(n){return i(n,e,t),n.mobile}):i(e.jQuery,e,t)})(this,document,function(e,t,i,n){(function(e){e.mobile={}})(e),function(e,t,n){var a={};e.mobile=e.extend(e.mobile,{version:"1.3.1",ns:"",subPageUrlKey:"ui-page",activePageClass:"ui-page-active",activeBtnClass:"ui-btn-active",focusClass:"ui-focus",ajaxEnabled:!0,hashListeningEnabled:!0,linkBindingEnabled:!0,defaultPageTransition:"fade",maxTransitionWidth:!1,minScrollBack:250,touchOverflowEnabled:!1,defaultDialogTransition:"pop",pageLoadErrorMessage:"Error Loading Page",pageLoadErrorMessageTheme:"e",phonegapNavigationEnabled:!1,autoInitializePage:!0,pushStateEnabled:!0,ignoreContentEnabled:!1,orientationChangeEnabled:!0,buttonMarkup:{hoverDelay:200},window:e(t),document:e(i),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},behaviors:{},silentScroll:function(i){"number"!==e.type(i)&&(i=e.mobile.defaultHomeScroll),e.event.special.scrollstart.enabled=!1,setTimeout(function(){t.scrollTo(0,i),e.mobile.document.trigger("silentscroll",{x:0,y:i})},20),setTimeout(function(){e.event.special.scrollstart.enabled=!0},150)},nsNormalizeDict:a,nsNormalize:function(t){return t?a[t]||(a[t]=e.camelCase(e.mobile.ns+t)):n},getInheritedTheme:function(e,t){for(var i,n,a=e[0],o="",s=/ui-(bar|body|overlay)-([a-z])\b/;a&&(i=a.className||"",!(i&&(n=s.exec(i))&&(o=n[2])));)a=a.parentNode;return o||t||"a"},closestPageData:function(e){return e.closest(':jqmData(role="page"), :jqmData(role="dialog")').data("mobile-page")},enhanceable:function(e){return this.haveParents(e,"enhance")},hijackable:function(e){return this.haveParents(e,"ajax")},haveParents:function(t,i){if(!e.mobile.ignoreContentEnabled)return t;for(var n,a,o,s=t.length,r=e(),l=0;s>l;l++){for(a=t.eq(l),o=!1,n=t[l];n;){var d=n.getAttribute?n.getAttribute("data-"+e.mobile.ns+i):"";if("false"===d){o=!0;break}n=n.parentNode}o||(r=r.add(a))}return r},getScreenHeight:function(){return t.innerHeight||e.mobile.window.height()}},e.mobile),e.fn.jqmData=function(t,i){var a;return t!==n&&(t&&(t=e.mobile.nsNormalize(t)),a=2>arguments.length||i===n?this.data(t):this.data(t,i)),a},e.jqmData=function(t,i,a){var o;return i!==n&&(o=e.data(t,i?e.mobile.nsNormalize(i):i,a)),o},e.fn.jqmRemoveData=function(t){return this.removeData(e.mobile.nsNormalize(t))},e.jqmRemoveData=function(t,i){return e.removeData(t,e.mobile.nsNormalize(i))},e.fn.removeWithDependents=function(){e.removeWithDependents(this)},e.removeWithDependents=function(t){var i=e(t);(i.jqmData("dependents")||e()).remove(),i.remove()},e.fn.addDependents=function(t){e.addDependents(e(this),t)},e.addDependents=function(t,i){var n=e(t).jqmData("dependents")||e();e(t).jqmData("dependents",e.merge(n,i))},e.fn.getEncodedText=function(){return e("<div/>").text(e(this).text()).html()},e.fn.jqmEnhanceable=function(){return e.mobile.enhanceable(this)},e.fn.jqmHijackable=function(){return e.mobile.hijackable(this)};var o=e.find,s=/:jqmData\(([^)]*)\)/g;e.find=function(t,i,n,a){return t=t.replace(s,"[data-"+(e.mobile.ns||"")+"$1]"),o.call(this,t,i,n,a)},e.extend(e.find,o),e.find.matches=function(t,i){return e.find(t,null,null,i)},e.find.matchesSelector=function(t,i){return e.find(i,null,null,[t]).length>0}}(e,this),function(e,t){var i=0,n=Array.prototype.slice,a=e.cleanData;e.cleanData=function(t){for(var i,n=0;null!=(i=t[n]);n++)try{e(i).triggerHandler("remove")}catch(o){}a(t)},e.widget=function(i,n,a){var o,s,r,l,d=i.split(".")[0];i=i.split(".")[1],o=d+"-"+i,a||(a=n,n=e.Widget),e.expr[":"][o.toLowerCase()]=function(t){return!!e.data(t,o)},e[d]=e[d]||{},s=e[d][i],r=e[d][i]=function(e,i){return this._createWidget?(arguments.length&&this._createWidget(e,i),t):new r(e,i)},e.extend(r,s,{version:a.version,_proto:e.extend({},a),_childConstructors:[]}),l=new n,l.options=e.widget.extend({},l.options),e.each(a,function(t,i){e.isFunction(i)&&(a[t]=function(){var e=function(){return n.prototype[t].apply(this,arguments)},a=function(e){return n.prototype[t].apply(this,e)};return function(){var t,n=this._super,o=this._superApply;return this._super=e,this._superApply=a,t=i.apply(this,arguments),this._super=n,this._superApply=o,t}}())}),r.prototype=e.widget.extend(l,{widgetEventPrefix:s?l.widgetEventPrefix:i},a,{constructor:r,namespace:d,widgetName:i,widgetFullName:o}),s?(e.each(s._childConstructors,function(t,i){var n=i.prototype;e.widget(n.namespace+"."+n.widgetName,r,i._proto)}),delete s._childConstructors):n._childConstructors.push(r),e.widget.bridge(i,r)},e.widget.extend=function(i){for(var a,o,s=n.call(arguments,1),r=0,l=s.length;l>r;r++)for(a in s[r])o=s[r][a],s[r].hasOwnProperty(a)&&o!==t&&(i[a]=e.isPlainObject(o)?e.isPlainObject(i[a])?e.widget.extend({},i[a],o):e.widget.extend({},o):o);return i},e.widget.bridge=function(i,a){var o=a.prototype.widgetFullName||i;e.fn[i]=function(s){var r="string"==typeof s,l=n.call(arguments,1),d=this;return s=!r&&l.length?e.widget.extend.apply(null,[s].concat(l)):s,r?this.each(function(){var n,a=e.data(this,o);return a?e.isFunction(a[s])&&"_"!==s.charAt(0)?(n=a[s].apply(a,l),n!==a&&n!==t?(d=n&&n.jquery?d.pushStack(n.get()):n,!1):t):e.error("no such method '"+s+"' for "+i+" widget instance"):e.error("cannot call methods on "+i+" prior to initialization; "+"attempted to call method '"+s+"'")}):this.each(function(){var t=e.data(this,o);t?t.option(s||{})._init():e.data(this,o,new a(s,this))}),d}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(t,n){n=e(n||this.defaultElement||this)[0],this.element=e(n),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this.bindings=e(),this.hoverable=e(),this.focusable=e(),n!==this&&(e.data(n,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===n&&this.destroy()}}),this.document=e(n.style?n.ownerDocument:n.document||n),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(i,n){var a,o,s,r=i;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof i)if(r={},a=i.split("."),i=a.shift(),a.length){for(o=r[i]=e.widget.extend({},this.options[i]),s=0;a.length-1>s;s++)o[a[s]]=o[a[s]]||{},o=o[a[s]];if(i=a.pop(),n===t)return o[i]===t?null:o[i];o[i]=n}else{if(n===t)return this.options[i]===t?null:this.options[i];r[i]=n}return this._setOptions(r),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled ui-state-disabled",!!t).attr("aria-disabled",t),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")),this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_on:function(i,n,a){var o,s=this;"boolean"!=typeof i&&(a=n,n=i,i=!1),a?(n=o=e(n),this.bindings=this.bindings.add(n)):(a=n,n=this.element,o=this.widget()),e.each(a,function(a,r){function l(){return i||s.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof r?s[r]:r).apply(s,arguments):t}"string"!=typeof r&&(l.guid=r.guid=r.guid||l.guid||e.guid++);var d=a.match(/^(\w+)\s*(.*)$/),c=d[1]+s.eventNamespace,h=d[2];h?o.delegate(h,c,l):n.bind(c,l)})},_off:function(e,t){t=(t||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.unbind(t).undelegate(t)},_delay:function(e,t){function i(){return("string"==typeof e?n[e]:e).apply(n,arguments)}var n=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,n){var a,o,s=this.options[t];if(n=n||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(a in o)a in i||(i[a]=o[a]);return this.element.trigger(i,n),!(e.isFunction(s)&&s.apply(this.element[0],[i].concat(n))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(n,a,o){"string"==typeof a&&(a={effect:a});var s,r=a?a===!0||"number"==typeof a?i:a.effect||i:t;a=a||{},"number"==typeof a&&(a={duration:a}),s=!e.isEmptyObject(a),a.complete=o,a.delay&&n.delay(a.delay),s&&e.effects&&e.effects.effect[r]?n[t](a):r!==t&&n[r]?n[r](a.duration,a.easing,o):n.queue(function(i){e(this)[t](),o&&o.call(n[0]),i()})}})}(e),function(e,t){e.widget("mobile.widget",{_createWidget:function(){e.Widget.prototype._createWidget.apply(this,arguments),this._trigger("init")},_getCreateOptions:function(){var i=this.element,n={};return e.each(this.options,function(e){var a=i.jqmData(e.replace(/[A-Z]/g,function(e){return"-"+e.toLowerCase()}));a!==t&&(n[e]=a)}),n},enhanceWithin:function(t,i){this.enhance(e(this.options.initSelector,e(t)),i)},enhance:function(t,i){var n,a,o=e(t);o=e.mobile.enhanceable(o),i&&o.length&&(n=e.mobile.closestPageData(o),a=n&&n.keepNativeSelector()||"",o=o.not(a)),o[this.widgetName]()},raise:function(e){throw"Widget ["+this.widgetName+"]: "+e}})}(e),function(e){e.extend(e.mobile,{loadingMessageTextVisible:n,loadingMessageTheme:n,loadingMessage:n,showPageLoadingMsg:function(t,i,n){e.mobile.loading("show",t,i,n)},hidePageLoadingMsg:function(){e.mobile.loading("hide")},loading:function(){this.loaderWidget.loader.apply(this.loaderWidget,arguments)}});var t="ui-loader",i=e("html"),a=e.mobile.window;e.widget("mobile.loader",{options:{theme:"a",textVisible:!1,html:"",text:"loading"},defaultHtml:"<div class='"+t+"'>"+"<span class='ui-icon ui-icon-loading'></span>"+"<h1></h1>"+"</div>",fakeFixLoader:function(){var t=e("."+e.mobile.activeBtnClass).first();this.element.css({top:e.support.scrollTop&&a.scrollTop()+a.height()/2||t.length&&t.offset().top||100})},checkLoaderPosition:function(){var t=this.element.offset(),i=a.scrollTop(),n=e.mobile.getScreenHeight();(i>t.top||t.top-i>n)&&(this.element.addClass("ui-loader-fakefix"),this.fakeFixLoader(),a.unbind("scroll",this.checkLoaderPosition).bind("scroll",e.proxy(this.fakeFixLoader,this)))},resetHtml:function(){this.element.html(e(this.defaultHtml).html())},show:function(o,s,r){var l,d,c;this.resetHtml(),"object"===e.type(o)?(c=e.extend({},this.options,o),o=c.theme||e.mobile.loadingMessageTheme):(c=this.options,o=o||e.mobile.loadingMessageTheme||c.theme),d=s||e.mobile.loadingMessage||c.text,i.addClass("ui-loading"),(e.mobile.loadingMessage!==!1||c.html)&&(l=e.mobile.loadingMessageTextVisible!==n?e.mobile.loadingMessageTextVisible:c.textVisible,this.element.attr("class",t+" ui-corner-all ui-body-"+o+" ui-loader-"+(l||s||o.text?"verbose":"default")+(c.textonly||r?" ui-loader-textonly":"")),c.html?this.element.html(c.html):this.element.find("h1").text(d),this.element.appendTo(e.mobile.pageContainer),this.checkLoaderPosition(),a.bind("scroll",e.proxy(this.checkLoaderPosition,this)))},hide:function(){i.removeClass("ui-loading"),e.mobile.loadingMessage&&this.element.removeClass("ui-loader-fakefix"),e.mobile.window.unbind("scroll",this.fakeFixLoader),e.mobile.window.unbind("scroll",this.checkLoaderPosition)}}),a.bind("pagecontainercreate",function(){e.mobile.loaderWidget=e.mobile.loaderWidget||e(e.mobile.loader.prototype.defaultHtml).loader()})}(e,this),function(e,t,n){function a(e){return e=e||location.href,"#"+e.replace(/^[^#]*#?(.*)$/,"$1")}var o,s="hashchange",r=i,l=e.event.special,d=r.documentMode,c="on"+s in t&&(d===n||d>7);e.fn[s]=function(e){return e?this.bind(s,e):this.trigger(s)},e.fn[s].delay=50,l[s]=e.extend(l[s],{setup:function(){return c?!1:(e(o.start),n)},teardown:function(){return c?!1:(e(o.stop),n)}}),o=function(){function i(){var n=a(),r=p(d);n!==d?(u(d=n,r),e(t).trigger(s)):r!==d&&(location.href=location.href.replace(/#.*/,"")+r),o=setTimeout(i,e.fn[s].delay)}var o,l={},d=a(),h=function(e){return e},u=h,p=h;return l.start=function(){o||i()},l.stop=function(){o&&clearTimeout(o),o=n},t.attachEvent&&!t.addEventListener&&!c&&function(){var t,n;l.start=function(){t||(n=e.fn[s].src,n=n&&n+a(),t=e('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){n||u(a()),i()}).attr("src",n||"javascript:0").insertAfter("body")[0].contentWindow,r.onpropertychange=function(){try{"title"===event.propertyName&&(t.document.title=r.title)}catch(e){}})},l.stop=h,p=function(){return a(t.location.href)},u=function(i,n){var a=t.document,o=e.fn[s].domain;i!==n&&(a.title=r.title,a.open(),o&&a.write('<script>document.domain="'+o+'"</script>'),a.close(),t.location.hash=i)}}(),l}()}(e,this),function(e){t.matchMedia=t.matchMedia||function(e){var t,i=e.documentElement,n=i.firstElementChild||i.firstChild,a=e.createElement("body"),o=e.createElement("div");return o.id="mq-test-1",o.style.cssText="position:absolute;top:-100em",a.style.background="none",a.appendChild(o),function(e){return o.innerHTML='&shy;<style media="'+e+'"> #mq-test-1 { width: 42px; }</style>',i.insertBefore(a,n),t=42===o.offsetWidth,i.removeChild(a),{matches:t,media:e}}}(i),e.mobile.media=function(e){return t.matchMedia(e).matches}}(e),function(e){var t={touch:"ontouchend"in i};e.mobile.support=e.mobile.support||{},e.extend(e.support,t),e.extend(e.mobile.support,t)}(e),function(e){e.extend(e.support,{orientation:"orientation"in t&&"onorientationchange"in t})}(e),function(e,n){function a(e){var t=e.charAt(0).toUpperCase()+e.substr(1),i=(e+" "+p.join(t+" ")+t).split(" ");for(var a in i)if(u[i[a]]!==n)return!0}function o(e,t,n){for(var a,o=i.createElement("div"),s=function(e){return e.charAt(0).toUpperCase()+e.substr(1)},r=function(e){return""===e?"":"-"+e.charAt(0).toLowerCase()+e.substr(1)+"-"},l=function(i){var n=r(i)+e+": "+t+";",l=s(i),d=l+(""===l?e:s(e));o.setAttribute("style",n),o.style[d]&&(a=!0)},d=n?n:p,c=0;d.length>c;c++)l(d[c]);return!!a}function s(){var a="transform-3d",o=e.mobile.media("(-"+p.join("-"+a+"),(-")+"-"+a+"),("+a+")");if(o)return!!o;var s=i.createElement("div"),r={MozTransform:"-moz-transform",transform:"transform"};h.append(s);for(var l in r)s.style[l]!==n&&(s.style[l]="translate3d( 100px, 1px, 1px )",o=t.getComputedStyle(s).getPropertyValue(r[l]));return!!o&&"none"!==o}function r(){var t,i,n=location.protocol+"//"+location.host+location.pathname+"ui-dir/",a=e("head base"),o=null,s="";return a.length?s=a.attr("href"):a=o=e("<base>",{href:n}).appendTo("head"),t=e("<a href='testurl' />").prependTo(h),i=t[0].href,a[0].href=s||location.pathname,o&&o.remove(),0===i.indexOf(n)}function l(){var e,n=i.createElement("x"),a=i.documentElement,o=t.getComputedStyle;return"pointerEvents"in n.style?(n.style.pointerEvents="auto",n.style.pointerEvents="x",a.appendChild(n),e=o&&"auto"===o(n,"").pointerEvents,a.removeChild(n),!!e):!1}function d(){var e=i.createElement("div");return e.getBoundingClientRect!==n}function c(){var e=t,i=navigator.userAgent,n=navigator.platform,a=i.match(/AppleWebKit\/([0-9]+)/),o=!!a&&a[1],s=i.match(/Fennec\/([0-9]+)/),r=!!s&&s[1],l=i.match(/Opera Mobi\/([0-9]+)/),d=!!l&&l[1];return(n.indexOf("iPhone")>-1||n.indexOf("iPad")>-1||n.indexOf("iPod")>-1)&&o&&534>o||e.operamini&&"[object OperaMini]"==={}.toString.call(e.operamini)||l&&7458>d||i.indexOf("Android")>-1&&o&&533>o||r&&6>r||"palmGetResource"in t&&o&&534>o||i.indexOf("MeeGo")>-1&&i.indexOf("NokiaBrowser/8.5.0")>-1?!1:!0}var h=e("<body>").prependTo("html"),u=h[0].style,p=["Webkit","Moz","O"],m="palmGetResource"in t,f=t.opera,g=t.operamini&&"[object OperaMini]"==={}.toString.call(t.operamini),b=t.blackberry&&!a("-webkit-transform");e.extend(e.mobile,{browser:{}}),e.mobile.browser.oldIE=function(){var e=3,t=i.createElement("div"),n=t.all||[];do t.innerHTML="<!--[if gt IE "+ ++e+"]><br><![endif]-->";while(n[0]);return e>4?e:!e}(),e.extend(e.support,{cssTransitions:"WebKitTransitionEvent"in t||o("transition","height 100ms linear",["Webkit","Moz",""])&&!e.mobile.browser.oldIE&&!f,pushState:"pushState"in history&&"replaceState"in history&&!(t.navigator.userAgent.indexOf("Firefox")>=0&&t.top!==t)&&-1===t.navigator.userAgent.search(/CriOS/),mediaquery:e.mobile.media("only all"),cssPseudoElement:!!a("content"),touchOverflow:!!a("overflowScrolling"),cssTransform3d:s(),boxShadow:!!a("boxShadow")&&!b,fixedPosition:c(),scrollTop:("pageXOffset"in t||"scrollTop"in i.documentElement||"scrollTop"in h[0])&&!m&&!g,dynamicBaseTag:r(),cssPointerEvents:l(),boundingRect:d()}),h.remove();var v=function(){var e=t.navigator.userAgent;return e.indexOf("Nokia")>-1&&(e.indexOf("Symbian/3")>-1||e.indexOf("Series60/5")>-1)&&e.indexOf("AppleWebKit")>-1&&e.match(/(BrowserNG|NokiaBrowser)\/7\.[0-3]/)}();e.mobile.gradeA=function(){return(e.support.mediaquery||e.mobile.browser.oldIE&&e.mobile.browser.oldIE>=7)&&(e.support.boundingRect||null!==e.fn.jquery.match(/1\.[0-7+]\.[0-9+]?/))},e.mobile.ajaxBlacklist=t.blackberry&&!t.WebKitPoint||g||v,v&&e(function(){e("head link[rel='stylesheet']").attr("rel","alternate stylesheet").attr("rel","stylesheet")}),e.support.boxShadow||e("html").addClass("ui-mobile-nosupport-boxshadow")}(e),function(e,t){var i,n=e.mobile.window;e.event.special.navigate=i={bound:!1,pushStateEnabled:!0,originalEventName:t,isPushStateEnabled:function(){return e.support.pushState&&e.mobile.pushStateEnabled===!0&&this.isHashChangeEnabled()},isHashChangeEnabled:function(){return e.mobile.hashListeningEnabled===!0},popstate:function(t){var i=new e.Event("navigate"),a=new e.Event("beforenavigate"),o=t.originalEvent.state||{};location.href,n.trigger(a),a.isDefaultPrevented()||(t.historyState&&e.extend(o,t.historyState),i.originalEvent=t,setTimeout(function(){n.trigger(i,{state:o})},0))},hashchange:function(t){var i=new e.Event("navigate"),a=new e.Event("beforenavigate");n.trigger(a),a.isDefaultPrevented()||(i.originalEvent=t,n.trigger(i,{state:t.hashchangeState||{}}))},setup:function(){i.bound||(i.bound=!0,i.isPushStateEnabled()?(i.originalEventName="popstate",n.bind("popstate.navigate",i.popstate)):i.isHashChangeEnabled()&&(i.originalEventName="hashchange",n.bind("hashchange.navigate",i.hashchange)))}}}(e),function(e,i){var n,a,o="&ui-state=dialog";e.mobile.path=n={uiStateKey:"&ui-state",urlParseRE:/^\s*(((([^:\/#\?]+:)?(?:(\/\/)((?:(([^:@\/#\?]+)(?:\:([^:@\/#\?]+))?)@)?(([^:\/#\?\]\[]+|\[[^\/\]@#?]+\])(?:\:([0-9]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)(#.*)?/,getLocation:function(e){var t=e?this.parseUrl(e):location,i=this.parseUrl(e||location.href).hash;return i="#"===i?"":i,t.protocol+"//"+t.host+t.pathname+t.search+i},parseLocation:function(){return this.parseUrl(this.getLocation())},parseUrl:function(t){if("object"===e.type(t))return t;var i=n.urlParseRE.exec(t||"")||[];return{href:i[0]||"",hrefNoHash:i[1]||"",hrefNoSearch:i[2]||"",domain:i[3]||"",protocol:i[4]||"",doubleSlash:i[5]||"",authority:i[6]||"",username:i[8]||"",password:i[9]||"",host:i[10]||"",hostname:i[11]||"",port:i[12]||"",pathname:i[13]||"",directory:i[14]||"",filename:i[15]||"",search:i[16]||"",hash:i[17]||""}},makePathAbsolute:function(e,t){if(e&&"/"===e.charAt(0))return e;e=e||"",t=t?t.replace(/^\/|(\/[^\/]*|[^\/]+)$/g,""):"";for(var i=t?t.split("/"):[],n=e.split("/"),a=0;n.length>a;a++){var o=n[a];switch(o){case".":break;case"..":i.length&&i.pop();break;default:i.push(o)}}return"/"+i.join("/")},isSameDomain:function(e,t){return n.parseUrl(e).domain===n.parseUrl(t).domain},isRelativeUrl:function(e){return""===n.parseUrl(e).protocol},isAbsoluteUrl:function(e){return""!==n.parseUrl(e).protocol},makeUrlAbsolute:function(e,t){if(!n.isRelativeUrl(e))return e;t===i&&(t=this.documentBase);var a=n.parseUrl(e),o=n.parseUrl(t),s=a.protocol||o.protocol,r=a.protocol?a.doubleSlash:a.doubleSlash||o.doubleSlash,l=a.authority||o.authority,d=""!==a.pathname,c=n.makePathAbsolute(a.pathname||o.filename,o.pathname),h=a.search||!d&&o.search||"",u=a.hash;return s+r+l+c+h+u},addSearchParams:function(t,i){var a=n.parseUrl(t),o="object"==typeof i?e.param(i):i,s=a.search||"?";return a.hrefNoSearch+s+("?"!==s.charAt(s.length-1)?"&":"")+o+(a.hash||"")},convertUrlToDataUrl:function(e){var i=n.parseUrl(e);return n.isEmbeddedPage(i)?i.hash.split(o)[0].replace(/^#/,"").replace(/\?.*$/,""):n.isSameDomain(i,this.documentBase)?i.hrefNoHash.replace(this.documentBase.domain,"").split(o)[0]:t.decodeURIComponent(e)},get:function(e){return e===i&&(e=n.parseLocation().hash),n.stripHash(e).replace(/[^\/]*\.[^\/*]+$/,"")},set:function(e){location.hash=e},isPath:function(e){return/\//.test(e)},clean:function(e){return e.replace(this.documentBase.domain,"")},stripHash:function(e){return e.replace(/^#/,"")},stripQueryParams:function(e){return e.replace(/\?.*$/,"")},cleanHash:function(e){return n.stripHash(e.replace(/\?.*$/,"").replace(o,""))},isHashValid:function(e){return/^#[^#]+$/.test(e)},isExternal:function(e){var t=n.parseUrl(e);return t.protocol&&t.domain!==this.documentUrl.domain?!0:!1},hasProtocol:function(e){return/^(:?\w+:)/.test(e)},isEmbeddedPage:function(e){var t=n.parseUrl(e);return""!==t.protocol?!this.isPath(t.hash)&&t.hash&&(t.hrefNoHash===this.documentUrl.hrefNoHash||this.documentBaseDiffers&&t.hrefNoHash===this.documentBase.hrefNoHash):/^#/.test(t.href)},squash:function(e,t){var i,a,o,s,r=this.isPath(e),l=this.parseUrl(e),d=l.hash,c="";return t=t||(n.isPath(e)?n.getLocation():n.getDocumentUrl()),a=r?n.stripHash(e):e,a=n.isPath(l.hash)?n.stripHash(l.hash):a,s=a.indexOf(this.uiStateKey),s>-1&&(c=a.slice(s),a=a.slice(0,s)),i=n.makeUrlAbsolute(a,t),o=this.parseUrl(i).search,r?((n.isPath(d)||0===d.replace("#","").indexOf(this.uiStateKey))&&(d=""),c&&-1===d.indexOf(this.uiStateKey)&&(d+=c),-1===d.indexOf("#")&&""!==d&&(d="#"+d),i=n.parseUrl(i),i=i.protocol+"//"+i.host+i.pathname+o+d):i+=i.indexOf("#")>-1?c:"#"+c,i},isPreservableHash:function(e){return 0===e.replace("#","").indexOf(this.uiStateKey)}},n.documentUrl=n.parseLocation(),a=e("head").find("base"),n.documentBase=a.length?n.parseUrl(n.makeUrlAbsolute(a.attr("href"),n.documentUrl.href)):n.documentUrl,n.documentBaseDiffers=n.documentUrl.hrefNoHash!==n.documentBase.hrefNoHash,n.getDocumentUrl=function(t){return t?e.extend({},n.documentUrl):n.documentUrl.href},n.getDocumentBase=function(t){return t?e.extend({},n.documentBase):n.documentBase.href}}(e),function(e,t){e.mobile.path,e.mobile.History=function(e,t){this.stack=e||[],this.activeIndex=t||0},e.extend(e.mobile.History.prototype,{getActive:function(){return this.stack[this.activeIndex]},getLast:function(){return this.stack[this.previousIndex]},getNext:function(){return this.stack[this.activeIndex+1]},getPrev:function(){return this.stack[this.activeIndex-1]},add:function(e,t){t=t||{},this.getNext()&&this.clearForward(),t.hash&&-1===t.hash.indexOf("#")&&(t.hash="#"+t.hash),t.url=e,this.stack.push(t),this.activeIndex=this.stack.length-1},clearForward:function(){this.stack=this.stack.slice(0,this.activeIndex+1)},find:function(e,t,i){t=t||this.stack;var n,a,o,s=t.length;for(a=0;s>a;a++)if(n=t[a],(decodeURIComponent(e)===decodeURIComponent(n.url)||decodeURIComponent(e)===decodeURIComponent(n.hash))&&(o=a,i))return o;return o},closest:function(e){var i,n=this.activeIndex;return i=this.find(e,this.stack.slice(0,n)),i===t&&(i=this.find(e,this.stack.slice(n),!0),i=i===t?i:i+n),i},direct:function(i){var n=this.closest(i.url),a=this.activeIndex;n!==t&&(this.activeIndex=n,this.previousIndex=a),a>n?(i.present||i.back||e.noop)(this.getActive(),"back"):n>a?(i.present||i.forward||e.noop)(this.getActive(),"forward"):n===t&&i.missing&&i.missing(this.getActive())}})}(e),function(e){var a=e.mobile.path,o=location.href;e.mobile.Navigator=function(t){this.history=t,this.ignoreInitialHashChange=!0,e.mobile.window.bind({"popstate.history":e.proxy(this.popstate,this),"hashchange.history":e.proxy(this.hashchange,this)})},e.extend(e.mobile.Navigator.prototype,{squash:function(n,o){var s,r,l=a.isPath(n)?a.stripHash(n):n;return r=a.squash(n),s=e.extend({hash:l,url:r},o),t.history.replaceState(s,s.title||i.title,r),s},hash:function(e,t){var i,n,o;if(i=a.parseUrl(e),n=a.parseLocation(),n.pathname+n.search===i.pathname+i.search)o=i.hash?i.hash:i.pathname+i.search;else if(a.isPath(e)){var s=a.parseUrl(t);o=s.pathname+s.search+(a.isPreservableHash(s.hash)?s.hash.replace("#",""):"")}else o=e;return o},go:function(n,o,s){var r,l,d,c,h=e.event.special.navigate.isPushStateEnabled();l=a.squash(n),d=this.hash(n,l),s&&d!==a.stripHash(a.parseLocation().hash)&&(this.preventNextHashChange=s),this.preventHashAssignPopState=!0,t.location.hash=d,this.preventHashAssignPopState=!1,r=e.extend({url:l,hash:d,title:i.title},o),h&&(c=new e.Event("popstate"),c.originalEvent={type:"popstate",state:null},this.squash(n,r),s||(this.ignorePopState=!0,e.mobile.window.trigger(c))),this.history.add(r.url,r)},popstate:function(t){var i,s;if(e.event.special.navigate.isPushStateEnabled())return this.preventHashAssignPopState?(this.preventHashAssignPopState=!1,t.stopImmediatePropagation(),n):this.ignorePopState?(this.ignorePopState=!1,n):!t.originalEvent.state&&1===this.history.stack.length&&this.ignoreInitialHashChange&&(this.ignoreInitialHashChange=!1,location.href===o)?(t.preventDefault(),n):(i=a.parseLocation().hash,!t.originalEvent.state&&i?(s=this.squash(i),this.history.add(s.url,s),t.historyState=s,n):(this.history.direct({url:(t.originalEvent.state||{}).url||i,present:function(i,n){t.historyState=e.extend({},i),t.historyState.direction=n}}),n))},hashchange:function(t){var o,s;if(e.event.special.navigate.isHashChangeEnabled()&&!e.event.special.navigate.isPushStateEnabled()){if(this.preventNextHashChange)return this.preventNextHashChange=!1,t.stopImmediatePropagation(),n;o=this.history,s=a.parseLocation().hash,this.history.direct({url:s,present:function(i,n){t.hashchangeState=e.extend({},i),t.hashchangeState.direction=n},missing:function(){o.add(s,{hash:s,title:i.title})}})}}})}(e),function(e){e.mobile.navigate=function(t,i,n){e.mobile.navigate.navigator.go(t,i,n)},e.mobile.navigate.history=new e.mobile.History,e.mobile.navigate.navigator=new e.mobile.Navigator(e.mobile.navigate.history);var t=e.mobile.path.parseLocation();e.mobile.navigate.history.add(t.href,{hash:t.hash})}(e),function(e,t,i,n){function a(e){for(;e&&e.originalEvent!==n;)e=e.originalEvent;return e}function o(t,i){var o,s,r,l,d,c,h,u,p,m=t.type;if(t=e.Event(t),t.type=i,o=t.originalEvent,s=e.event.props,m.search(/^(mouse|click)/)>-1&&(s=q),o)for(h=s.length,l;h;)l=s[--h],t[l]=o[l];if(m.search(/mouse(down|up)|click/)>-1&&!t.which&&(t.which=1),-1!==m.search(/^touch/)&&(r=a(o),m=r.touches,d=r.changedTouches,c=m&&m.length?m[0]:d&&d.length?d[0]:n))for(u=0,p=k.length;p>u;u++)l=k[u],t[l]=c[l];return t}function s(t){for(var i,n,a={};t;){i=e.data(t,T);for(n in i)i[n]&&(a[n]=a.hasVirtualBinding=!0);t=t.parentNode}return a}function r(t,i){for(var n;t;){if(n=e.data(t,T),n&&(!i||n[i]))return t;t=t.parentNode}return null}function l(){M=!1}function d(){M=!0}function c(){U=0,O.length=0,H=!1,d()}function h(){l()}function u(){p(),S=setTimeout(function(){S=0,c()},e.vmouse.resetTimerDuration)}function p(){S&&(clearTimeout(S),S=0)}function m(t,i,n){var a;return(n&&n[t]||!n&&r(i.target,t))&&(a=o(i,t),e(i.target).trigger(a)),a}function f(t){var i=e.data(t.target,D);if(!(H||U&&U===i)){var n=m("v"+t.type,t);n&&(n.isDefaultPrevented()&&t.preventDefault(),n.isPropagationStopped()&&t.stopPropagation(),n.isImmediatePropagationStopped()&&t.stopImmediatePropagation())}}function g(t){var i,n,o=a(t).touches;if(o&&1===o.length&&(i=t.target,n=s(i),n.hasVirtualBinding)){U=L++,e.data(i,D,U),p(),h(),I=!1;var r=a(t).touches[0];A=r.pageX,N=r.pageY,m("vmouseover",t,n),m("vmousedown",t,n)}}function b(e){M||(I||m("vmousecancel",e,s(e.target)),I=!0,u())}function v(t){if(!M){var i=a(t).touches[0],n=I,o=e.vmouse.moveDistanceThreshold,r=s(t.target);I=I||Math.abs(i.pageX-A)>o||Math.abs(i.pageY-N)>o,I&&!n&&m("vmousecancel",t,r),m("vmousemove",t,r),u()}}function _(e){if(!M){d();var t,i=s(e.target);if(m("vmouseup",e,i),!I){var n=m("vclick",e,i);n&&n.isDefaultPrevented()&&(t=a(e).changedTouches[0],O.push({touchID:U,x:t.clientX,y:t.clientY}),H=!0)}m("vmouseout",e,i),I=!1,u()}}function C(t){var i,n=e.data(t,T);if(n)for(i in n)if(n[i])return!0;return!1}function x(){}function y(t){var i=t.substr(1);return{setup:function(){C(this)||e.data(this,T,{});var n=e.data(this,T);n[t]=!0,j[t]=(j[t]||0)+1,1===j[t]&&B.bind(i,f),e(this).bind(i,x),F&&(j.touchstart=(j.touchstart||0)+1,1===j.touchstart&&B.bind("touchstart",g).bind("touchend",_).bind("touchmove",v).bind("scroll",b))},teardown:function(){--j[t],j[t]||B.unbind(i,f),F&&(--j.touchstart,j.touchstart||B.unbind("touchstart",g).unbind("touchmove",v).unbind("touchend",_).unbind("scroll",b));var n=e(this),a=e.data(this,T);a&&(a[t]=!1),n.unbind(i,x),C(this)||n.removeData(T)}}}var w,T="virtualMouseBindings",D="virtualTouchID",P="vmouseover vmousedown vmousemove vmouseup vclick vmouseout vmousecancel".split(" "),k="clientX clientY pageX pageY screenX screenY".split(" "),E=e.event.mouseHooks?e.event.mouseHooks.props:[],q=e.event.props.concat(E),j={},S=0,A=0,N=0,I=!1,O=[],H=!1,M=!1,F="addEventListener"in i,B=e(i),L=1,U=0;e.vmouse={moveDistanceThreshold:10,clickDistanceThreshold:10,resetTimerDuration:1500};for(var z=0;P.length>z;z++)e.event.special[P[z]]=y(P[z]);F&&i.addEventListener("click",function(t){var i,a,o,s,r,l,d=O.length,c=t.target;if(d)for(i=t.clientX,a=t.clientY,w=e.vmouse.clickDistanceThreshold,o=c;o;){for(s=0;d>s;s++)if(r=O[s],l=0,o===c&&w>Math.abs(r.x-i)&&w>Math.abs(r.y-a)||e.data(o,D)===r.touchID)return t.preventDefault(),t.stopPropagation(),n;o=o.parentNode}},!0)}(e,t,i),function(e,t,n){function a(t,i,n){var a=n.type;n.type=i,e.event.dispatch.call(t,n),n.type=a}var o=e(i);e.each("touchstart touchmove touchend tap taphold swipe swipeleft swiperight scrollstart scrollstop".split(" "),function(t,i){e.fn[i]=function(e){return e?this.bind(i,e):this.trigger(i)},e.attrFn&&(e.attrFn[i]=!0)});var s=e.mobile.support.touch,r="touchmove scroll",l=s?"touchstart":"mousedown",d=s?"touchend":"mouseup",c=s?"touchmove":"mousemove";e.event.special.scrollstart={enabled:!0,setup:function(){function t(e,t){i=t,a(o,i?"scrollstart":"scrollstop",e)}var i,n,o=this,s=e(o);s.bind(r,function(a){e.event.special.scrollstart.enabled&&(i||t(a,!0),clearTimeout(n),n=setTimeout(function(){t(a,!1)},50))})}},e.event.special.tap={tapholdThreshold:750,setup:function(){var t=this,i=e(t);i.bind("vmousedown",function(n){function s(){clearTimeout(d)}function r(){s(),i.unbind("vclick",l).unbind("vmouseup",s),o.unbind("vmousecancel",r)}function l(e){r(),c===e.target&&a(t,"tap",e)}if(n.which&&1!==n.which)return!1;var d,c=n.target;n.originalEvent,i.bind("vmouseup",s).bind("vclick",l),o.bind("vmousecancel",r),d=setTimeout(function(){a(t,"taphold",e.Event("taphold",{target:c}))
+},e.event.special.tap.tapholdThreshold)})}},e.event.special.swipe={scrollSupressionThreshold:30,durationThreshold:1e3,horizontalDistanceThreshold:30,verticalDistanceThreshold:75,start:function(t){var i=t.originalEvent.touches?t.originalEvent.touches[0]:t;return{time:(new Date).getTime(),coords:[i.pageX,i.pageY],origin:e(t.target)}},stop:function(e){var t=e.originalEvent.touches?e.originalEvent.touches[0]:e;return{time:(new Date).getTime(),coords:[t.pageX,t.pageY]}},handleSwipe:function(t,i){i.time-t.time<e.event.special.swipe.durationThreshold&&Math.abs(t.coords[0]-i.coords[0])>e.event.special.swipe.horizontalDistanceThreshold&&Math.abs(t.coords[1]-i.coords[1])<e.event.special.swipe.verticalDistanceThreshold&&t.origin.trigger("swipe").trigger(t.coords[0]>i.coords[0]?"swipeleft":"swiperight")},setup:function(){var t=this,i=e(t);i.bind(l,function(t){function a(t){s&&(o=e.event.special.swipe.stop(t),Math.abs(s.coords[0]-o.coords[0])>e.event.special.swipe.scrollSupressionThreshold&&t.preventDefault())}var o,s=e.event.special.swipe.start(t);i.bind(c,a).one(d,function(){i.unbind(c,a),s&&o&&e.event.special.swipe.handleSwipe(s,o),s=o=n})})}},e.each({scrollstop:"scrollstart",taphold:"tap",swipeleft:"swipe",swiperight:"swipe"},function(t,i){e.event.special[t]={setup:function(){e(this).bind(i,e.noop)}}})}(e,this),function(e){e.event.special.throttledresize={setup:function(){e(this).bind("resize",o)},teardown:function(){e(this).unbind("resize",o)}};var t,i,n,a=250,o=function(){i=(new Date).getTime(),n=i-s,n>=a?(s=i,e(this).trigger("throttledresize")):(t&&clearTimeout(t),t=setTimeout(o,a-n))},s=0}(e),function(e,t){function a(){var e=o();e!==s&&(s=e,d.trigger(c))}var o,s,r,l,d=e(t),c="orientationchange",h={0:!0,180:!0};if(e.support.orientation){var u=t.innerWidth||d.width(),p=t.innerHeight||d.height(),m=50;r=u>p&&u-p>m,l=h[t.orientation],(r&&l||!r&&!l)&&(h={"-90":!0,90:!0})}e.event.special.orientationchange=e.extend({},e.event.special.orientationchange,{setup:function(){return e.support.orientation&&!e.event.special.orientationchange.disabled?!1:(s=o(),d.bind("throttledresize",a),n)},teardown:function(){return e.support.orientation&&!e.event.special.orientationchange.disabled?!1:(d.unbind("throttledresize",a),n)},add:function(e){var t=e.handler;e.handler=function(e){return e.orientation=o(),t.apply(this,arguments)}}}),e.event.special.orientationchange.orientation=o=function(){var n=!0,a=i.documentElement;return n=e.support.orientation?h[t.orientation]:a&&1.1>a.clientWidth/a.clientHeight,n?"portrait":"landscape"},e.fn[c]=function(e){return e?this.bind(c,e):this.trigger(c)},e.attrFn&&(e.attrFn[c]=!0)}(e,this),function(e){e.widget("mobile.page",e.mobile.widget,{options:{theme:"c",domCache:!1,keepNativeDefault:":jqmData(role='none'), :jqmData(role='nojs')"},_create:function(){return this._trigger("beforecreate")===!1?!1:(this.element.attr("tabindex","0").addClass("ui-page ui-body-"+this.options.theme),this._on(this.element,{pagebeforehide:"removeContainerBackground",pagebeforeshow:"_handlePageBeforeShow"}),n)},_handlePageBeforeShow:function(){this.setContainerBackground()},removeContainerBackground:function(){e.mobile.pageContainer.removeClass("ui-overlay-"+e.mobile.getInheritedTheme(this.element.parent()))},setContainerBackground:function(t){this.options.theme&&e.mobile.pageContainer.addClass("ui-overlay-"+(t||this.options.theme))},keepNativeSelector:function(){var t=this.options,i=t.keepNative&&e.trim(t.keepNative);return i&&t.keepNative!==t.keepNativeDefault?[t.keepNative,t.keepNativeDefault].join(", "):t.keepNativeDefault}})}(e),function(e,t,i){var n=function(n){return n===i&&(n=!0),function(i,a,o,s){var r=new e.Deferred,l=a?" reverse":"",d=e.mobile.urlHistory.getActive(),c=d.lastScroll||e.mobile.defaultHomeScroll,h=e.mobile.getScreenHeight(),u=e.mobile.maxTransitionWidth!==!1&&e.mobile.window.width()>e.mobile.maxTransitionWidth,p=!e.support.cssTransitions||u||!i||"none"===i||Math.max(e.mobile.window.scrollTop(),c)>e.mobile.getMaxScrollForTransition(),m=" ui-page-pre-in",f=function(){e.mobile.pageContainer.toggleClass("ui-mobile-viewport-transitioning viewport-"+i)},g=function(){e.event.special.scrollstart.enabled=!1,t.scrollTo(0,c),setTimeout(function(){e.event.special.scrollstart.enabled=!0},150)},b=function(){s.removeClass(e.mobile.activePageClass+" out in reverse "+i).height("")},v=function(){n?s.animationComplete(_):_(),s.height(h+e.mobile.window.scrollTop()).addClass(i+" out"+l)},_=function(){s&&n&&b(),C()},C=function(){o.css("z-index",-10),o.addClass(e.mobile.activePageClass+m),e.mobile.focusPage(o),o.height(h+c),g(),o.css("z-index",""),p||o.animationComplete(x),o.removeClass(m).addClass(i+" in"+l),p&&x()},x=function(){n||s&&b(),o.removeClass("out in reverse "+i).height(""),f(),e.mobile.window.scrollTop()!==c&&g(),r.resolve(i,a,o,s,!0)};return f(),s&&!p?v():_(),r.promise()}},a=n(),o=n(!1),s=function(){return 3*e.mobile.getScreenHeight()};e.mobile.defaultTransitionHandler=a,e.mobile.transitionHandlers={"default":e.mobile.defaultTransitionHandler,sequential:a,simultaneous:o},e.mobile.transitionFallbacks={},e.mobile._maybeDegradeTransition=function(t){return t&&!e.support.cssTransform3d&&e.mobile.transitionFallbacks[t]&&(t=e.mobile.transitionFallbacks[t]),t},e.mobile.getMaxScrollForTransition=e.mobile.getMaxScrollForTransition||s}(e,this),function(e,n){function a(t){!f||f.closest("."+e.mobile.activePageClass).length&&!t||f.removeClass(e.mobile.activeBtnClass),f=null}function o(){_=!1,v.length>0&&e.mobile.changePage.apply(null,v.pop())}function s(t,i,n,a){i&&i.data("mobile-page")._trigger("beforehide",null,{nextPage:t}),t.data("mobile-page")._trigger("beforeshow",null,{prevPage:i||e("")}),e.mobile.hidePageLoadingMsg(),n=e.mobile._maybeDegradeTransition(n);var o=e.mobile.transitionHandlers[n||"default"]||e.mobile.defaultTransitionHandler,s=o(n,a,t,i);return s.done(function(){i&&i.data("mobile-page")._trigger("hide",null,{nextPage:t}),t.data("mobile-page")._trigger("show",null,{prevPage:i||e("")})}),s}function r(t,i){i&&t.attr("data-"+e.mobile.ns+"role",i),t.page()}function l(){var t=e.mobile.activePage&&c(e.mobile.activePage);return t||w.hrefNoHash}function d(e){for(;e&&("string"!=typeof e.nodeName||"a"!==e.nodeName.toLowerCase());)e=e.parentNode;return e}function c(t){var i=e(t).closest(".ui-page").jqmData("url"),n=w.hrefNoHash;return i&&p.isPath(i)||(i=n),p.makeUrlAbsolute(i,n)}var h=e.mobile.window,u=(e("html"),e("head")),p=e.extend(e.mobile.path,{getFilePath:function(t){var i="&"+e.mobile.subPageUrlKey;return t&&t.split(i)[0].split(C)[0]},isFirstPageUrl:function(t){var i=p.parseUrl(p.makeUrlAbsolute(t,this.documentBase)),a=i.hrefNoHash===this.documentUrl.hrefNoHash||this.documentBaseDiffers&&i.hrefNoHash===this.documentBase.hrefNoHash,o=e.mobile.firstPage,s=o&&o[0]?o[0].id:n;return a&&(!i.hash||"#"===i.hash||s&&i.hash.replace(/^#/,"")===s)},isPermittedCrossDomainRequest:function(t,i){return e.mobile.allowCrossDomainPages&&"file:"===t.protocol&&-1!==i.search(/^https?:/)}}),m=null,f=null,g=e.Deferred(),b=e.mobile.navigate.history,v=[],_=!1,C="&ui-state=dialog",x=u.children("base"),y=p.documentUrl,w=p.documentBase,T=(p.documentBaseDiffers,e.mobile.getScreenHeight),D=e.support.dynamicBaseTag?{element:x.length?x:e("<base>",{href:w.hrefNoHash}).prependTo(u),set:function(e){e=p.parseUrl(e).hrefNoHash,D.element.attr("href",p.makeUrlAbsolute(e,w))},reset:function(){D.element.attr("href",w.hrefNoSearch)}}:n;e.mobile.getDocumentUrl=p.getDocumentUrl,e.mobile.getDocumentBase=p.getDocumentBase,e.mobile.back=function(){var e=t.navigator;this.phonegapNavigationEnabled&&e&&e.app&&e.app.backHistory?e.app.backHistory():t.history.back()},e.mobile.focusPage=function(e){var t=e.find("[autofocus]"),i=e.find(".ui-title:eq(0)");return t.length?(t.focus(),n):(i.length?i.focus():e.focus(),n)};var P,k,E=!0;P=function(){if(E){var t=e.mobile.urlHistory.getActive();if(t){var i=h.scrollTop();t.lastScroll=e.mobile.minScrollBack>i?e.mobile.defaultHomeScroll:i}}},k=function(){setTimeout(P,100)},h.bind(e.support.pushState?"popstate":"hashchange",function(){E=!1}),h.one(e.support.pushState?"popstate":"hashchange",function(){E=!0}),h.one("pagecontainercreate",function(){e.mobile.pageContainer.bind("pagechange",function(){E=!0,h.unbind("scrollstop",k),h.bind("scrollstop",k)})}),h.bind("scrollstop",k),e.mobile._maybeDegradeTransition=e.mobile._maybeDegradeTransition||function(e){return e},e.mobile.resetActivePageHeight=function(t){var i=e("."+e.mobile.activePageClass),n=parseFloat(i.css("padding-top")),a=parseFloat(i.css("padding-bottom")),o=parseFloat(i.css("border-top-width")),s=parseFloat(i.css("border-bottom-width"));t="number"==typeof t?t:T(),i.css("min-height",t-n-a-o-s)},e.fn.animationComplete=function(t){return e.support.cssTransitions?e(this).one("webkitAnimationEnd animationend",t):(setTimeout(t,0),e(this))},e.mobile.path=p,e.mobile.base=D,e.mobile.urlHistory=b,e.mobile.dialogHashKey=C,e.mobile.allowCrossDomainPages=!1,e.mobile._bindPageRemove=function(){var t=e(this);!t.data("mobile-page").options.domCache&&t.is(":jqmData(external-page='true')")&&t.bind("pagehide.remove",function(){var t=e(this),i=new e.Event("pageremove");t.trigger(i),i.isDefaultPrevented()||t.removeWithDependents()})},e.mobile.loadPage=function(t,i){var a=e.Deferred(),o=e.extend({},e.mobile.loadPage.defaults,i),s=null,d=null,c=p.makeUrlAbsolute(t,l());o.data&&"get"===o.type&&(c=p.addSearchParams(c,o.data),o.data=n),o.data&&"post"===o.type&&(o.reloadPage=!0);var h=p.getFilePath(c),u=p.convertUrlToDataUrl(c);if(o.pageContainer=o.pageContainer||e.mobile.pageContainer,s=o.pageContainer.children("[data-"+e.mobile.ns+"url='"+u+"']"),0===s.length&&u&&!p.isPath(u)&&(s=o.pageContainer.children("#"+u).attr("data-"+e.mobile.ns+"url",u).jqmData("url",u)),0===s.length)if(e.mobile.firstPage&&p.isFirstPageUrl(h))e.mobile.firstPage.parent().length&&(s=e(e.mobile.firstPage));else if(p.isEmbeddedPage(h))return a.reject(c,i),a.promise();if(s.length){if(!o.reloadPage)return r(s,o.role),a.resolve(c,i,s),D&&!i.prefetch&&D.set(t),a.promise();d=s}var m=o.pageContainer,f=new e.Event("pagebeforeload"),g={url:t,absUrl:c,dataUrl:u,deferred:a,options:o};if(m.trigger(f,g),f.isDefaultPrevented())return a.promise();if(o.showLoadMsg)var b=setTimeout(function(){e.mobile.showPageLoadingMsg()},o.loadMsgDelay),v=function(){clearTimeout(b),e.mobile.hidePageLoadingMsg()};return D&&i.prefetch===n&&D.reset(),e.mobile.allowCrossDomainPages||p.isSameDomain(y,c)?e.ajax({url:h,type:o.type,data:o.data,contentType:o.contentType,dataType:"html",success:function(l,m,f){var b=e("<div></div>"),_=l.match(/<title[^>]*>([^<]*)/)&&RegExp.$1,C=RegExp("(<[^>]+\\bdata-"+e.mobile.ns+"role=[\"']?page[\"']?[^>]*>)"),x=RegExp("\\bdata-"+e.mobile.ns+"url=[\"']?([^\"'>]*)[\"']?");if(C.test(l)&&RegExp.$1&&x.test(RegExp.$1)&&RegExp.$1&&(t=h=p.getFilePath(e("<div>"+RegExp.$1+"</div>").text())),D&&i.prefetch===n&&D.set(h),b.get(0).innerHTML=l,s=b.find(":jqmData(role='page'), :jqmData(role='dialog')").first(),s.length||(s=e("<div data-"+e.mobile.ns+"role='page'>"+(l.split(/<\/?body[^>]*>/gim)[1]||"")+"</div>")),_&&!s.jqmData("title")&&(~_.indexOf("&")&&(_=e("<div>"+_+"</div>").text()),s.jqmData("title",_)),!e.support.dynamicBaseTag){var y=p.get(h);s.find("[src], link[href], a[rel='external'], :jqmData(ajax='false'), a[target]").each(function(){var t=e(this).is("[href]")?"href":e(this).is("[src]")?"src":"action",i=e(this).attr(t);i=i.replace(location.protocol+"//"+location.host+location.pathname,""),/^(\w+:|#|\/)/.test(i)||e(this).attr(t,y+i)})}s.attr("data-"+e.mobile.ns+"url",p.convertUrlToDataUrl(h)).attr("data-"+e.mobile.ns+"external-page",!0).appendTo(o.pageContainer),s.one("pagecreate",e.mobile._bindPageRemove),r(s,o.role),c.indexOf("&"+e.mobile.subPageUrlKey)>-1&&(s=o.pageContainer.children("[data-"+e.mobile.ns+"url='"+u+"']")),o.showLoadMsg&&v(),g.xhr=f,g.textStatus=m,g.page=s,o.pageContainer.trigger("pageload",g),a.resolve(c,i,s,d)},error:function(t,n,s){D&&D.set(p.get()),g.xhr=t,g.textStatus=n,g.errorThrown=s;var r=new e.Event("pageloadfailed");o.pageContainer.trigger(r,g),r.isDefaultPrevented()||(o.showLoadMsg&&(v(),e.mobile.showPageLoadingMsg(e.mobile.pageLoadErrorMessageTheme,e.mobile.pageLoadErrorMessage,!0),setTimeout(e.mobile.hidePageLoadingMsg,1500)),a.reject(c,i))}}):a.reject(c,i),a.promise()},e.mobile.loadPage.defaults={type:"get",data:n,reloadPage:!1,role:n,showLoadMsg:!1,pageContainer:n,loadMsgDelay:50},e.mobile.changePage=function(t,d){if(_)return v.unshift(arguments),n;var c,h=e.extend({},e.mobile.changePage.defaults,d);h.pageContainer=h.pageContainer||e.mobile.pageContainer,h.fromPage=h.fromPage||e.mobile.activePage,c="string"==typeof t;var u=h.pageContainer,m=new e.Event("pagebeforechange"),f={toPage:t,options:h};if(f.absUrl=c?p.makeUrlAbsolute(t,l()):t.data("absUrl"),u.trigger(m,f),!m.isDefaultPrevented()){if(t=f.toPage,c="string"==typeof t,_=!0,c)return h.target=t,e.mobile.loadPage(t,h).done(function(t,i,n,a){_=!1,i.duplicateCachedPage=a,n.data("absUrl",f.absUrl),e.mobile.changePage(n,i)}).fail(function(){a(!0),o(),h.pageContainer.trigger("pagechangefailed",f)}),n;t[0]!==e.mobile.firstPage[0]||h.dataUrl||(h.dataUrl=y.hrefNoHash);var g=h.fromPage,x=h.dataUrl&&p.convertUrlToDataUrl(h.dataUrl)||t.jqmData("url"),w=x,T=(p.getFilePath(x),b.getActive()),D=0===b.activeIndex,P=0,k=i.title,E="dialog"===h.role||"dialog"===t.jqmData("role");if(g&&g[0]===t[0]&&!h.allowSamePageTransition)return _=!1,u.trigger("pagechange",f),h.fromHashChange&&b.direct({url:x}),n;r(t,h.role),h.fromHashChange&&(P="back"===d.direction?-1:1);try{i.activeElement&&"body"!==i.activeElement.nodeName.toLowerCase()?e(i.activeElement).blur():e("input:focus, textarea:focus, select:focus").blur()}catch(q){}var j=!1;E&&T&&(T.url&&T.url.indexOf(C)>-1&&e.mobile.activePage&&!e.mobile.activePage.is(".ui-dialog")&&b.activeIndex>0&&(h.changeHash=!1,j=!0),x=T.url||"",x+=!j&&x.indexOf("#")>-1?C:"#"+C,0===b.activeIndex&&x===b.initialDst&&(x+=C));var S=T?t.jqmData("title")||t.children(":jqmData(role='header')").find(".ui-title").text():k;if(S&&k===i.title&&(k=S),t.jqmData("title")||t.jqmData("title",k),h.transition=h.transition||(P&&!D?T.transition:n)||(E?e.mobile.defaultDialogTransition:e.mobile.defaultPageTransition),!P&&j&&(b.getActive().pageUrl=w),x&&!h.fromHashChange){var A;!p.isPath(x)&&0>x.indexOf("#")&&(x="#"+x),A={transition:h.transition,title:k,pageUrl:w,role:h.role},h.changeHash!==!1&&e.mobile.hashListeningEnabled?e.mobile.navigate(x,A,!0):t[0]!==e.mobile.firstPage[0]&&e.mobile.navigate.history.add(x,A)}i.title=k,e.mobile.activePage=t,h.reverse=h.reverse||0>P,s(t,g,h.transition,h.reverse).done(function(i,n,s,r,l){a(),h.duplicateCachedPage&&h.duplicateCachedPage.remove(),l||e.mobile.focusPage(t),o(),u.trigger("pagechange",f)})}},e.mobile.changePage.defaults={transition:n,reverse:!1,changeHash:!0,fromHashChange:!1,role:n,duplicateCachedPage:n,pageContainer:n,showLoadMsg:!0,dataUrl:n,fromPage:n,allowSamePageTransition:!1},e.mobile.navreadyDeferred=e.Deferred(),e.mobile._registerInternalEvents=function(){var i=function(t,i){var a,o,s,r,l=!0;return!e.mobile.ajaxEnabled||t.is(":jqmData(ajax='false')")||!t.jqmHijackable().length||t.attr("target")?!1:(a=t.attr("action"),r=(t.attr("method")||"get").toLowerCase(),a||(a=c(t),"get"===r&&(a=p.parseUrl(a).hrefNoSearch),a===w.hrefNoHash&&(a=y.hrefNoSearch)),a=p.makeUrlAbsolute(a,c(t)),p.isExternal(a)&&!p.isPermittedCrossDomainRequest(y,a)?!1:(i||(o=t.serializeArray(),m&&m[0].form===t[0]&&(s=m.attr("name"),s&&(e.each(o,function(e,t){return t.name===s?(s="",!1):n}),s&&o.push({name:s,value:m.attr("value")}))),l={url:a,options:{type:r,data:e.param(o),transition:t.jqmData("transition"),reverse:"reverse"===t.jqmData("direction"),reloadPage:!0}}),l))};e.mobile.document.delegate("form","submit",function(t){var n=i(e(this));n&&(e.mobile.changePage(n.url,n.options),t.preventDefault())}),e.mobile.document.bind("vclick",function(t){var n,o,s=t.target,r=!1;if(!(t.which>1)&&e.mobile.linkBindingEnabled){if(m=e(s),e.data(s,"mobile-button")){if(!i(e(s).closest("form"),!0))return;s.parentNode&&(s=s.parentNode)}else{if(s=d(s),!s||"#"===p.parseUrl(s.getAttribute("href")||"#").hash)return;if(!e(s).jqmHijackable().length)return}~s.className.indexOf("ui-link-inherit")?s.parentNode&&(o=e.data(s.parentNode,"buttonElements")):o=e.data(s,"buttonElements"),o?s=o.outer:r=!0,n=e(s),r&&(n=n.closest(".ui-btn")),n.length>0&&!n.hasClass("ui-disabled")&&(a(!0),f=n,f.addClass(e.mobile.activeBtnClass))}}),e.mobile.document.bind("click",function(i){if(e.mobile.linkBindingEnabled&&!i.isDefaultPrevented()){var o,s=d(i.target),r=e(s);if(s&&!(i.which>1)&&r.jqmHijackable().length){if(o=function(){t.setTimeout(function(){a(!0)},200)},r.is(":jqmData(rel='back')"))return e.mobile.back(),!1;var l=c(r),h=p.makeUrlAbsolute(r.attr("href")||"#",l);if(!e.mobile.ajaxEnabled&&!p.isEmbeddedPage(h))return o(),n;if(-1!==h.search("#")){if(h=h.replace(/[^#]*#/,""),!h)return i.preventDefault(),n;h=p.isPath(h)?p.makeUrlAbsolute(h,l):p.makeUrlAbsolute("#"+h,y.hrefNoHash)}var u=r.is("[rel='external']")||r.is(":jqmData(ajax='false')")||r.is("[target]"),m=u||p.isExternal(h)&&!p.isPermittedCrossDomainRequest(y,h);if(m)return o(),n;var f=r.jqmData("transition"),g="reverse"===r.jqmData("direction")||r.jqmData("back"),b=r.attr("data-"+e.mobile.ns+"rel")||n;e.mobile.changePage(h,{transition:f,reverse:g,role:b,link:r}),i.preventDefault()}}}),e.mobile.document.delegate(".ui-page","pageshow.prefetch",function(){var t=[];e(this).find("a:jqmData(prefetch)").each(function(){var i=e(this),n=i.attr("href");n&&-1===e.inArray(n,t)&&(t.push(n),e.mobile.loadPage(n,{role:i.attr("data-"+e.mobile.ns+"rel"),prefetch:!0}))})}),e.mobile._handleHashChange=function(i,a){var o=p.stripHash(i),s=0===e.mobile.urlHistory.stack.length?"none":n,r={changeHash:!1,fromHashChange:!0,reverse:"back"===a.direction};if(e.extend(r,a,{transition:(b.getLast()||{}).transition||s}),b.activeIndex>0&&o.indexOf(C)>-1&&b.initialDst!==o){if(e.mobile.activePage&&!e.mobile.activePage.is(".ui-dialog"))return"back"===a.direction?e.mobile.back():t.history.forward(),n;o=a.pageUrl;var l=e.mobile.urlHistory.getActive();e.extend(r,{role:l.role,transition:l.transition,reverse:"back"===a.direction})}o?(o=p.isPath(o)?o:p.makeUrlAbsolute("#"+o,w),o===p.makeUrlAbsolute("#"+b.initialDst,w)&&b.stack.length&&b.stack[0].url!==b.initialDst.replace(C,"")&&(o=e.mobile.firstPage),e.mobile.changePage(o,r)):e.mobile.changePage(e.mobile.firstPage,r)},h.bind("navigate",function(t,i){var n;t.originalEvent&&t.originalEvent.isDefaultPrevented()||(n=e.event.special.navigate.originalEventName.indexOf("hashchange")>-1?i.state.hash:i.state.url,n||(n=e.mobile.path.parseLocation().hash),n&&"#"!==n&&0!==n.indexOf("#"+e.mobile.path.uiStateKey)||(n=location.href),e.mobile._handleHashChange(n,i.state))}),e.mobile.document.bind("pageshow",e.mobile.resetActivePageHeight),e.mobile.window.bind("throttledresize",e.mobile.resetActivePageHeight)},e(function(){g.resolve()}),e.when(g,e.mobile.navreadyDeferred).done(function(){e.mobile._registerInternalEvents()})}(e),function(e){e.mobile.transitionFallbacks.flip="fade"}(e,this),function(e){e.mobile.transitionFallbacks.flow="fade"}(e,this),function(e){e.mobile.transitionFallbacks.pop="fade"}(e,this),function(e){e.mobile.transitionHandlers.slide=e.mobile.transitionHandlers.simultaneous,e.mobile.transitionFallbacks.slide="fade"}(e,this),function(e){e.mobile.transitionFallbacks.slidedown="fade"}(e,this),function(e){e.mobile.transitionFallbacks.slidefade="fade"}(e,this),function(e){e.mobile.transitionFallbacks.slideup="fade"}(e,this),function(e){e.mobile.transitionFallbacks.turn="fade"}(e,this),function(e){e.mobile.page.prototype.options.degradeInputs={color:!1,date:!1,datetime:!1,"datetime-local":!1,email:!1,month:!1,number:!1,range:"number",search:"text",tel:!1,time:!1,url:!1,week:!1},e.mobile.document.bind("pagecreate create",function(t){var i,n=e.mobile.closestPageData(e(t.target));n&&(i=n.options,e(t.target).find("input").not(n.keepNativeSelector()).each(function(){var t=e(this),n=this.getAttribute("type"),a=i.degradeInputs[n]||"text";if(i.degradeInputs[n]){var o=e("<div>").html(t.clone()).html(),s=o.indexOf(" type=")>-1,r=s?/\s+type=["']?\w+['"]?/:/\/?>/,l=' type="'+a+'" data-'+e.mobile.ns+'type="'+n+'"'+(s?"":">");t.replaceWith(o.replace(r,l))}}))})}(e),function(e){e.widget("mobile.dialog",e.mobile.widget,{options:{closeBtn:"left",closeBtnText:"Close",overlayTheme:"a",corners:!0,initSelector:":jqmData(role='dialog')"},_handlePageBeforeShow:function(){this._isCloseable=!0,this.options.overlayTheme&&this.element.page("removeContainerBackground").page("setContainerBackground",this.options.overlayTheme)},_create:function(){var t=this.element,i=this.options.corners?" ui-corner-all":"",n=e("<div/>",{role:"dialog","class":"ui-dialog-contain ui-overlay-shadow"+i});t.addClass("ui-dialog ui-overlay-"+this.options.overlayTheme),t.wrapInner(n),t.bind("vclick submit",function(t){var i,n=e(t.target).closest("vclick"===t.type?"a":"form");n.length&&!n.jqmData("transition")&&(i=e.mobile.urlHistory.getActive()||{},n.attr("data-"+e.mobile.ns+"transition",i.transition||e.mobile.defaultDialogTransition).attr("data-"+e.mobile.ns+"direction","reverse"))}),this._on(t,{pagebeforeshow:"_handlePageBeforeShow"}),e.extend(this,{_createComplete:!1}),this._setCloseBtn(this.options.closeBtn)},_setCloseBtn:function(t){var i,n,a=this;this._headerCloseButton&&(this._headerCloseButton.remove(),this._headerCloseButton=null),"none"!==t&&(n="left"===t?"left":"right",i=e("<a href='#' class='ui-btn-"+n+"' data-"+e.mobile.ns+"icon='delete' data-"+e.mobile.ns+"iconpos='notext'>"+this.options.closeBtnText+"</a>"),this.element.children().find(":jqmData(role='header')").first().prepend(i),this._createComplete&&e.fn.buttonMarkup&&i.buttonMarkup(),this._createComplete=!0,i.bind("click",function(){a.close()}),this._headerCloseButton=i)},_setOption:function(e,t){"closeBtn"===e&&this._setCloseBtn(t),this._super(e,t)},close:function(){var t,i,n=e.mobile.navigate.history;this._isCloseable&&(this._isCloseable=!1,e.mobile.hashListeningEnabled&&n.activeIndex>0?e.mobile.back():(t=Math.max(0,n.activeIndex-1),i=n.stack[t].pageUrl||n.stack[t].url,n.previousIndex=n.activeIndex,n.activeIndex=t,e.mobile.path.isPath(i)||(i=e.mobile.path.makeUrlAbsolute("#"+i)),e.mobile.changePage(i,{direction:"back",changeHash:!1,fromHashChange:!0})))}}),e.mobile.document.delegate(e.mobile.dialog.prototype.options.initSelector,"pagecreate",function(){e.mobile.dialog.prototype.enhance(this)})}(e,this),function(e){e.mobile.page.prototype.options.backBtnText="Back",e.mobile.page.prototype.options.addBackBtn=!1,e.mobile.page.prototype.options.backBtnTheme=null,e.mobile.page.prototype.options.headerTheme="a",e.mobile.page.prototype.options.footerTheme="a",e.mobile.page.prototype.options.contentTheme=null,e.mobile.document.bind("pagecreate",function(t){var i=e(t.target),n=i.data("mobile-page").options,a=i.jqmData("role"),o=n.theme;e(":jqmData(role='header'), :jqmData(role='footer'), :jqmData(role='content')",i).jqmEnhanceable().each(function(){var t,s,r,l,d=e(this),c=d.jqmData("role"),h=d.jqmData("theme"),u=h||n.contentTheme||"dialog"===a&&o;if(d.addClass("ui-"+c),"header"===c||"footer"===c){var p=h||("header"===c?n.headerTheme:n.footerTheme)||o;d.addClass("ui-bar-"+p).attr("role","header"===c?"banner":"contentinfo"),"header"===c&&(t=d.children("a, button"),s=t.hasClass("ui-btn-left"),r=t.hasClass("ui-btn-right"),s=s||t.eq(0).not(".ui-btn-right").addClass("ui-btn-left").length,r=r||t.eq(1).addClass("ui-btn-right").length),n.addBackBtn&&"header"===c&&e(".ui-page").length>1&&i.jqmData("url")!==e.mobile.path.stripHash(location.hash)&&!s&&(l=e("<a href='javascript:void(0);' class='ui-btn-left' data-"+e.mobile.ns+"rel='back' data-"+e.mobile.ns+"icon='arrow-l'>"+n.backBtnText+"</a>").attr("data-"+e.mobile.ns+"theme",n.backBtnTheme||p).prependTo(d)),d.children("h1, h2, h3, h4, h5, h6").addClass("ui-title").attr({role:"heading","aria-level":"1"})}else"content"===c&&(u&&d.addClass("ui-body-"+u),d.attr("role","main"))})})}(e),function(e,t){function n(e){for(var t;e&&(t="string"==typeof e.className&&e.className+" ",!(t&&t.indexOf("ui-btn ")>-1&&0>t.indexOf("ui-disabled ")));)e=e.parentNode;return e}function a(n,a,o,s,r){var l=e.data(n[0],"buttonElements");n.removeClass(a).addClass(o),l&&(l.bcls=e(i.createElement("div")).addClass(l.bcls+" "+o).removeClass(a).attr("class"),s!==t&&(l.hover=s),l.state=r)}var o=function(e,i){var n=e.getAttribute(i);return"true"===n?!0:"false"===n?!1:null===n?t:n};e.fn.buttonMarkup=function(n){var a,r=this,l="data-"+e.mobile.ns;n=n&&"object"===e.type(n)?n:{};for(var d=0;r.length>d;d++){var c,h,u,p,m,f,g=r.eq(d),b=g[0],v=e.extend({},e.fn.buttonMarkup.defaults,{icon:n.icon!==t?n.icon:o(b,l+"icon"),iconpos:n.iconpos!==t?n.iconpos:o(b,l+"iconpos"),theme:n.theme!==t?n.theme:o(b,l+"theme")||e.mobile.getInheritedTheme(g,"c"),inline:n.inline!==t?n.inline:o(b,l+"inline"),shadow:n.shadow!==t?n.shadow:o(b,l+"shadow"),corners:n.corners!==t?n.corners:o(b,l+"corners"),iconshadow:n.iconshadow!==t?n.iconshadow:o(b,l+"iconshadow"),mini:n.mini!==t?n.mini:o(b,l+"mini")},n),_="ui-btn-inner",C="ui-btn-text",x=!1,y="up";for(a in v)v[a]===t||null===v[a]?g.removeAttr(l+a):b.setAttribute(l+a,v[a]);for("popup"===o(b,l+"rel")&&g.attr("href")&&(b.setAttribute("aria-haspopup",!0),b.setAttribute("aria-owns",g.attr("href"))),f=e.data("INPUT"===b.tagName||"BUTTON"===b.tagName?b.parentNode:b,"buttonElements"),f?(b=f.outer,g=e(b),u=f.inner,p=f.text,e(f.icon).remove(),f.icon=null,x=f.hover,y=f.state):(u=i.createElement(v.wrapperEls),p=i.createElement(v.wrapperEls)),m=v.icon?i.createElement("span"):null,s&&!f&&s(),v.theme||(v.theme=e.mobile.getInheritedTheme(g,"c")),c="ui-btn ",c+=x?"ui-btn-hover-"+v.theme:"",c+=y?" ui-btn-"+y+"-"+v.theme:"",c+=v.shadow?" ui-shadow":"",c+=v.corners?" ui-btn-corner-all":"",v.mini!==t&&(c+=v.mini===!0?" ui-mini":" ui-fullsize"),v.inline!==t&&(c+=v.inline===!0?" ui-btn-inline":" ui-btn-block"),v.icon&&(v.icon="ui-icon-"+v.icon,v.iconpos=v.iconpos||"left",h="ui-icon "+v.icon,v.iconshadow&&(h+=" ui-icon-shadow")),v.iconpos&&(c+=" ui-btn-icon-"+v.iconpos,"notext"!==v.iconpos||g.attr("title")||g.attr("title",g.getEncodedText())),f&&g.removeClass(f.bcls||""),g.removeClass("ui-link").addClass(c),u.className=_,p.className=C,f||u.appendChild(p),m&&(m.className=h,f&&f.icon||(m.innerHTML="&#160;",u.appendChild(m)));b.firstChild&&!f;)p.appendChild(b.firstChild);f||b.appendChild(u),f={hover:x,state:y,bcls:c,outer:b,inner:u,text:p,icon:m},e.data(b,"buttonElements",f),e.data(u,"buttonElements",f),e.data(p,"buttonElements",f),m&&e.data(m,"buttonElements",f)}return this},e.fn.buttonMarkup.defaults={corners:!0,shadow:!0,iconshadow:!0,wrapperEls:"span"};var s=function(){var i,o,r=e.mobile.buttonMarkup.hoverDelay;e.mobile.document.bind({"vmousedown vmousecancel vmouseup vmouseover vmouseout focus blur scrollstart":function(s){var l,d=e(n(s.target)),c=s.originalEvent&&/^touch/.test(s.originalEvent.type),h=s.type;d.length&&(l=d.attr("data-"+e.mobile.ns+"theme"),"vmousedown"===h?c?i=setTimeout(function(){a(d,"ui-btn-up-"+l,"ui-btn-down-"+l,t,"down")},r):a(d,"ui-btn-up-"+l,"ui-btn-down-"+l,t,"down"):"vmousecancel"===h||"vmouseup"===h?a(d,"ui-btn-down-"+l,"ui-btn-up-"+l,t,"up"):"vmouseover"===h||"focus"===h?c?o=setTimeout(function(){a(d,"ui-btn-up-"+l,"ui-btn-hover-"+l,!0,"")},r):a(d,"ui-btn-up-"+l,"ui-btn-hover-"+l,!0,""):("vmouseout"===h||"blur"===h||"scrollstart"===h)&&(a(d,"ui-btn-hover-"+l+" ui-btn-down-"+l,"ui-btn-up-"+l,!1,"up"),i&&clearTimeout(i),o&&clearTimeout(o)))},"focusin focus":function(t){e(n(t.target)).addClass(e.mobile.focusClass)},"focusout blur":function(t){e(n(t.target)).removeClass(e.mobile.focusClass)}}),s=null};e.mobile.document.bind("pagecreate create",function(t){e(":jqmData(role='button'), .ui-bar > a, .ui-header > a, .ui-footer > a, .ui-bar > :jqmData(role='controlgroup') > a",t.target).jqmEnhanceable().not("button, input, .ui-btn, :jqmData(role='none'), :jqmData(role='nojs')").buttonMarkup()})}(e),function(e,t){e.widget("mobile.collapsible",e.mobile.widget,{options:{expandCueText:" click to expand contents",collapseCueText:" click to collapse contents",collapsed:!0,heading:"h1,h2,h3,h4,h5,h6,legend",collapsedIcon:"plus",expandedIcon:"minus",iconpos:"left",theme:null,contentTheme:null,inset:!0,corners:!0,mini:!1,initSelector:":jqmData(role='collapsible')"},_create:function(){var i=this.element,n=this.options,a=i.addClass("ui-collapsible"),o=i.children(n.heading).first(),s=a.wrapInner("<div class='ui-collapsible-content'></div>").children(".ui-collapsible-content"),r=i.closest(":jqmData(role='collapsible-set')").addClass("ui-collapsible-set"),l="";o.is("legend")&&(o=e("<div role='heading'>"+o.html()+"</div>").insertBefore(o),o.next().remove()),r.length?(n.theme||(n.theme=r.jqmData("theme")||e.mobile.getInheritedTheme(r,"c")),n.contentTheme||(n.contentTheme=r.jqmData("content-theme")),n.collapsedIcon=i.jqmData("collapsed-icon")||r.jqmData("collapsed-icon")||n.collapsedIcon,n.expandedIcon=i.jqmData("expanded-icon")||r.jqmData("expanded-icon")||n.expandedIcon,n.iconpos=i.jqmData("iconpos")||r.jqmData("iconpos")||n.iconpos,n.inset=r.jqmData("inset")!==t?r.jqmData("inset"):!0,n.corners=!1,n.mini||(n.mini=r.jqmData("mini"))):n.theme||(n.theme=e.mobile.getInheritedTheme(i,"c")),n.inset&&(l+=" ui-collapsible-inset",n.corners&&(l+=" ui-corner-all")),n.contentTheme&&(l+=" ui-collapsible-themed-content",s.addClass("ui-body-"+n.contentTheme)),""!==l&&a.addClass(l),o.insertBefore(s).addClass("ui-collapsible-heading").append("<span class='ui-collapsible-heading-status'></span>").wrapInner("<a href='#' class='ui-collapsible-heading-toggle'></a>").find("a").first().buttonMarkup({shadow:!1,corners:!1,iconpos:n.iconpos,icon:n.collapsedIcon,mini:n.mini,theme:n.theme}),a.bind("expand collapse",function(t){if(!t.isDefaultPrevented()){var i=e(this),a="collapse"===t.type;t.preventDefault(),o.toggleClass("ui-collapsible-heading-collapsed",a).find(".ui-collapsible-heading-status").text(a?n.expandCueText:n.collapseCueText).end().find(".ui-icon").toggleClass("ui-icon-"+n.expandedIcon,!a).toggleClass("ui-icon-"+n.collapsedIcon,a||n.expandedIcon===n.collapsedIcon).end().find("a").first().removeClass(e.mobile.activeBtnClass),i.toggleClass("ui-collapsible-collapsed",a),s.toggleClass("ui-collapsible-content-collapsed",a).attr("aria-hidden",a),s.trigger("updatelayout")}}).trigger(n.collapsed?"collapse":"expand"),o.bind("tap",function(){o.find("a").first().addClass(e.mobile.activeBtnClass)}).bind("click",function(e){var t=o.is(".ui-collapsible-heading-collapsed")?"expand":"collapse";a.trigger(t),e.preventDefault(),e.stopPropagation()})}}),e.mobile.document.bind("pagecreate create",function(t){e.mobile.collapsible.prototype.enhanceWithin(t.target)})}(e),function(e){e.mobile.behaviors.addFirstLastClasses={_getVisibles:function(e,t){var i;return t?i=e.not(".ui-screen-hidden"):(i=e.filter(":visible"),0===i.length&&(i=e.not(".ui-screen-hidden"))),i},_addFirstLastClasses:function(e,t,i){e.removeClass("ui-first-child ui-last-child"),t.eq(0).addClass("ui-first-child").end().last().addClass("ui-last-child"),i||this.element.trigger("updatelayout")}}}(e),function(e,t){e.widget("mobile.collapsibleset",e.mobile.widget,e.extend({options:{initSelector:":jqmData(role='collapsible-set')"},_create:function(){var i=this.element.addClass("ui-collapsible-set"),n=this.options;n.theme||(n.theme=e.mobile.getInheritedTheme(i,"c")),n.contentTheme||(n.contentTheme=i.jqmData("content-theme")),n.corners||(n.corners=i.jqmData("corners")),i.jqmData("inset")!==t&&(n.inset=i.jqmData("inset")),n.inset=n.inset!==t?n.inset:!0,n.corners=n.corners!==t?n.corners:!0,n.corners&&n.inset&&i.addClass("ui-corner-all"),i.jqmData("collapsiblebound")||i.jqmData("collapsiblebound",!0).bind("expand",function(t){var i=e(t.target).closest(".ui-collapsible");i.parent().is(":jqmData(role='collapsible-set')")&&i.siblings(".ui-collapsible").trigger("collapse")})},_init:function(){var e=this.element,t=e.children(":jqmData(role='collapsible')"),i=t.filter(":jqmData(collapsed='false')");
+this._refresh("true"),i.trigger("expand")},_refresh:function(t){var i=this.element.children(":jqmData(role='collapsible')");e.mobile.collapsible.prototype.enhance(i.not(".ui-collapsible")),this._addFirstLastClasses(i,this._getVisibles(i,t),t)},refresh:function(){this._refresh(!1)}},e.mobile.behaviors.addFirstLastClasses)),e.mobile.document.bind("pagecreate create",function(t){e.mobile.collapsibleset.prototype.enhanceWithin(t.target)})}(e),function(e){e.fn.fieldcontain=function(){return this.addClass("ui-field-contain ui-body ui-br").contents().filter(function(){return 3===this.nodeType&&!/\S/.test(this.nodeValue)}).remove()},e(i).bind("pagecreate create",function(t){e(":jqmData(role='fieldcontain')",t.target).jqmEnhanceable().fieldcontain()})}(e),function(e){e.fn.grid=function(t){return this.each(function(){var i,n=e(this),a=e.extend({grid:null},t),o=n.children(),s={solo:1,a:2,b:3,c:4,d:5},r=a.grid;if(!r)if(5>=o.length)for(var l in s)s[l]===o.length&&(r=l);else r="a",n.addClass("ui-grid-duo");i=s[r],n.addClass("ui-grid-"+r),o.filter(":nth-child("+i+"n+1)").addClass("ui-block-a"),i>1&&o.filter(":nth-child("+i+"n+2)").addClass("ui-block-b"),i>2&&o.filter(":nth-child("+i+"n+3)").addClass("ui-block-c"),i>3&&o.filter(":nth-child("+i+"n+4)").addClass("ui-block-d"),i>4&&o.filter(":nth-child("+i+"n+5)").addClass("ui-block-e")})}}(e),function(e,t){e.widget("mobile.navbar",e.mobile.widget,{options:{iconpos:"top",grid:null,initSelector:":jqmData(role='navbar')"},_create:function(){var n=this.element,a=n.find("a"),o=a.filter(":jqmData(icon)").length?this.options.iconpos:t;n.addClass("ui-navbar ui-mini").attr("role","navigation").find("ul").jqmEnhanceable().grid({grid:this.options.grid}),a.buttonMarkup({corners:!1,shadow:!1,inline:!0,iconpos:o}),n.delegate("a","vclick",function(t){var n=e(t.target).is("a")?e(this):e(this).parent("a");if(!n.is(".ui-disabled, .ui-btn-active")){a.removeClass(e.mobile.activeBtnClass),e(this).addClass(e.mobile.activeBtnClass);var o=e(this);e(i).one("pagehide",function(){o.removeClass(e.mobile.activeBtnClass)})}}),n.closest(".ui-page").bind("pagebeforeshow",function(){a.filter(".ui-state-persist").addClass(e.mobile.activeBtnClass)})}}),e.mobile.document.bind("pagecreate create",function(t){e.mobile.navbar.prototype.enhanceWithin(t.target)})}(e),function(e){var t={};e.widget("mobile.listview",e.mobile.widget,e.extend({options:{theme:null,countTheme:"c",headerTheme:"b",dividerTheme:"b",icon:"arrow-r",splitIcon:"arrow-r",splitTheme:"b",corners:!0,shadow:!0,inset:!1,initSelector:":jqmData(role='listview')"},_create:function(){var e=this,t="";t+=e.options.inset?" ui-listview-inset":"",e.options.inset&&(t+=e.options.corners?" ui-corner-all":"",t+=e.options.shadow?" ui-shadow":""),e.element.addClass(function(e,i){return i+" ui-listview"+t}),e.refresh(!0)},_findFirstElementByTagName:function(e,t,i,n){var a={};for(a[i]=a[n]=!0;e;){if(a[e.nodeName])return e;e=e[t]}return null},_getChildrenByTagName:function(t,i,n){var a=[],o={};for(o[i]=o[n]=!0,t=t.firstChild;t;)o[t.nodeName]&&a.push(t),t=t.nextSibling;return e(a)},_addThumbClasses:function(t){var i,n,a=t.length;for(i=0;a>i;i++)n=e(this._findFirstElementByTagName(t[i].firstChild,"nextSibling","img","IMG")),n.length&&(n.addClass("ui-li-thumb"),e(this._findFirstElementByTagName(n[0].parentNode,"parentNode","li","LI")).addClass(n.is(".ui-li-icon")?"ui-li-has-icon":"ui-li-has-thumb"))},refresh:function(t){this.parentPage=this.element.closest(".ui-page"),this._createSubPages();var n,a,o,s,r,l,d,c,h,u,p,m,f=this.options,g=this.element,b=g.jqmData("dividertheme")||f.dividerTheme,v=g.jqmData("splittheme"),_=g.jqmData("spliticon"),C=g.jqmData("icon"),x=this._getChildrenByTagName(g[0],"li","LI"),y=!!e.nodeName(g[0],"ol"),w=!e.support.cssPseudoElement,T=g.attr("start"),D={};y&&w&&g.find(".ui-li-dec").remove(),y&&(T||0===T?w?d=parseInt(T,10):(c=parseInt(T,10)-1,g.css("counter-reset","listnumbering "+c)):w&&(d=1)),f.theme||(f.theme=e.mobile.getInheritedTheme(this.element,"c"));for(var P=0,k=x.length;k>P;P++){if(n=x.eq(P),a="ui-li",t||!n.hasClass("ui-li")){o=n.jqmData("theme")||f.theme,s=this._getChildrenByTagName(n[0],"a","A");var E="list-divider"===n.jqmData("role");s.length&&!E?(p=n.jqmData("icon"),n.buttonMarkup({wrapperEls:"div",shadow:!1,corners:!1,iconpos:"right",icon:s.length>1||p===!1?!1:p||C||f.icon,theme:o}),p!==!1&&1===s.length&&n.addClass("ui-li-has-arrow"),s.first().removeClass("ui-link").addClass("ui-link-inherit"),s.length>1&&(a+=" ui-li-has-alt",r=s.last(),l=v||r.jqmData("theme")||f.splitTheme,m=r.jqmData("icon"),r.appendTo(n).attr("title",e.trim(r.getEncodedText())).addClass("ui-li-link-alt").empty().buttonMarkup({shadow:!1,corners:!1,theme:o,icon:!1,iconpos:"notext"}).find(".ui-btn-inner").append(e(i.createElement("span")).buttonMarkup({shadow:!0,corners:!0,theme:l,iconpos:"notext",icon:m||p||_||f.splitIcon})))):E?(a+=" ui-li-divider ui-bar-"+(n.jqmData("theme")||b),n.attr("role","heading"),y&&(T||0===T?w?d=parseInt(T,10):(h=parseInt(T,10)-1,n.css("counter-reset","listnumbering "+h)):w&&(d=1))):a+=" ui-li-static ui-btn-up-"+o}y&&w&&0>a.indexOf("ui-li-divider")&&(u=a.indexOf("ui-li-static")>0?n:n.find(".ui-link-inherit"),u.addClass("ui-li-jsnumbering").prepend("<span class='ui-li-dec'>"+d++ +". </span>")),D[a]||(D[a]=[]),D[a].push(n[0])}for(a in D)e(D[a]).addClass(a).children(".ui-btn-inner").addClass(a);g.find("h1, h2, h3, h4, h5, h6").addClass("ui-li-heading").end().find("p, dl").addClass("ui-li-desc").end().find(".ui-li-aside").each(function(){var t=e(this);t.prependTo(t.parent())}).end().find(".ui-li-count").each(function(){e(this).closest("li").addClass("ui-li-has-count")}).addClass("ui-btn-up-"+(g.jqmData("counttheme")||this.options.countTheme)+" ui-btn-corner-all"),this._addThumbClasses(x),this._addThumbClasses(g.find(".ui-link-inherit")),this._addFirstLastClasses(x,this._getVisibles(x,t),t),this._trigger("afterrefresh")},_idStringEscape:function(e){return e.replace(/[^a-zA-Z0-9]/g,"-")},_createSubPages:function(){var i,a=this.element,o=a.closest(".ui-page"),s=o.jqmData("url"),r=s||o[0][e.expando],l=a.attr("id"),d=this.options,c="data-"+e.mobile.ns,h=this,u=o.find(":jqmData(role='footer')").jqmData("id");if(t[r]===n&&(t[r]=-1),l=l||++t[r],e(a.find("li>ul, li>ol").toArray().reverse()).each(function(t){var n,o,r=e(this),h=r.attr("id")||l+"-"+t,p=r.parent(),m=e(r.prevAll().toArray().reverse()),f=m.length?m:e("<span>"+e.trim(p.contents()[0].nodeValue)+"</span>"),g=f.first().getEncodedText(),b=(s||"")+"&"+e.mobile.subPageUrlKey+"="+h,v=r.jqmData("theme")||d.theme,_=r.jqmData("counttheme")||a.jqmData("counttheme")||d.countTheme;i=!0,n=r.detach().wrap("<div "+c+"role='page' "+c+"url='"+b+"' "+c+"theme='"+v+"' "+c+"count-theme='"+_+"'><div "+c+"role='content'></div></div>").parent().before("<div "+c+"role='header' "+c+"theme='"+d.headerTheme+"'><div class='ui-title'>"+g+"</div></div>").after(u?e("<div "+c+"role='footer' "+c+"id='"+u+"'>"):"").parent().appendTo(e.mobile.pageContainer),n.page(),o=p.find("a:first"),o.length||(o=e("<a/>").html(f||g).prependTo(p.empty())),o.attr("href","#"+b)}).listview(),i&&o.is(":jqmData(external-page='true')")&&o.data("mobile-page").options.domCache===!1){var p=function(t,i){var n,a=i.nextPage,r=new e.Event("pageremove");i.nextPage&&(n=a.jqmData("url"),0!==n.indexOf(s+"&"+e.mobile.subPageUrlKey)&&(h.childPages().remove(),o.trigger(r),r.isDefaultPrevented()||o.removeWithDependents()))};o.unbind("pagehide.remove").bind("pagehide.remove",p)}},childPages:function(){var t=this.parentPage.jqmData("url");return e(":jqmData(url^='"+t+"&"+e.mobile.subPageUrlKey+"')")}},e.mobile.behaviors.addFirstLastClasses)),e.mobile.document.bind("pagecreate create",function(t){e.mobile.listview.prototype.enhanceWithin(t.target)})}(e),function(e){var t=e("meta[name=viewport]"),i=t.attr("content"),n=i+",maximum-scale=1, user-scalable=no",a=i+",maximum-scale=10, user-scalable=yes",o=/(user-scalable[\s]*=[\s]*no)|(maximum-scale[\s]*=[\s]*1)[$,\s]/.test(i);e.mobile.zoom=e.extend({},{enabled:!o,locked:!1,disable:function(i){o||e.mobile.zoom.locked||(t.attr("content",n),e.mobile.zoom.enabled=!1,e.mobile.zoom.locked=i||!1)},enable:function(i){o||e.mobile.zoom.locked&&i!==!0||(t.attr("content",a),e.mobile.zoom.enabled=!0,e.mobile.zoom.locked=!1)},restore:function(){o||(t.attr("content",i),e.mobile.zoom.enabled=!0)}})}(e),function(e){e.widget("mobile.textinput",e.mobile.widget,{options:{theme:null,mini:!1,preventFocusZoom:/iPhone|iPad|iPod/.test(navigator.platform)&&navigator.userAgent.indexOf("AppleWebKit")>-1,initSelector:"input[type='text'], input[type='search'], :jqmData(type='search'), input[type='number'], :jqmData(type='number'), input[type='password'], input[type='email'], input[type='url'], input[type='tel'], textarea, input[type='time'], input[type='date'], input[type='month'], input[type='week'], input[type='datetime'], input[type='datetime-local'], input[type='color'], input:not([type]), input[type='file']",clearBtn:!1,clearSearchButtonText:null,clearBtnText:"clear text",disabled:!1},_create:function(){function t(){setTimeout(function(){a.toggleClass("ui-input-clear-hidden",!s.val())},0)}var i,a,o=this,s=this.element,r=this.options,l=r.theme||e.mobile.getInheritedTheme(this.element,"c"),d=" ui-body-"+l,c=r.mini?" ui-mini":"",h=s.is("[type='search'], :jqmData(type='search')"),u=r.clearSearchButtonText||r.clearBtnText,p=s.is("textarea, :jqmData(type='range')"),m=!!r.clearBtn&&!p,f=s.is("input")&&!s.is(":jqmData(type='range')");if(e("label[for='"+s.attr("id")+"']").addClass("ui-input-text"),i=s.addClass("ui-input-text ui-body-"+l),s[0].autocorrect===n||e.support.touchOverflow||(s[0].setAttribute("autocorrect","off"),s[0].setAttribute("autocomplete","off")),h?i=s.wrap("<div class='ui-input-search ui-shadow-inset ui-btn-corner-all ui-btn-shadow ui-icon-searchfield"+d+c+"'></div>").parent():f&&(i=s.wrap("<div class='ui-input-text ui-shadow-inset ui-corner-all ui-btn-shadow"+d+c+"'></div>").parent()),m||h?(a=e("<a href='#' class='ui-input-clear' title='"+u+"'>"+u+"</a>").bind("click",function(e){s.val("").focus().trigger("change"),a.addClass("ui-input-clear-hidden"),e.preventDefault()}).appendTo(i).buttonMarkup({icon:"delete",iconpos:"notext",corners:!0,shadow:!0,mini:r.mini}),h||i.addClass("ui-input-has-clear"),t(),s.bind("paste cut keyup input focus change blur",t)):f||h||s.addClass("ui-corner-all ui-shadow-inset"+d+c),s.focus(function(){r.preventFocusZoom&&e.mobile.zoom.disable(!0),i.addClass(e.mobile.focusClass)}).blur(function(){i.removeClass(e.mobile.focusClass),r.preventFocusZoom&&e.mobile.zoom.enable(!0)}),s.is("textarea")){var g,b=15,v=100;this._keyup=function(){var e=s[0].scrollHeight,t=s[0].clientHeight;if(e>t){var i=parseFloat(s.css("padding-top")),n=parseFloat(s.css("padding-bottom")),a=i+n;s.height(e-a+b)}},s.on("keyup change input paste",function(){clearTimeout(g),g=setTimeout(o._keyup,v)}),this._on(!0,e.mobile.document,{pagechange:"_keyup"}),e.trim(s.val())&&this._on(!0,e.mobile.window,{load:"_keyup"})}s.attr("disabled")&&this.disable()},disable:function(){var e,t=this.element.is("[type='search'], :jqmData(type='search')"),i=this.element.is("input")&&!this.element.is(":jqmData(type='range')"),n=this.element.attr("disabled",!0)&&(i||t);return e=n?this.element.parent():this.element,e.addClass("ui-disabled"),this._setOption("disabled",!0)},enable:function(){var e,t=this.element.is("[type='search'], :jqmData(type='search')"),i=this.element.is("input")&&!this.element.is(":jqmData(type='range')"),n=this.element.attr("disabled",!1)&&(i||t);return e=n?this.element.parent():this.element,e.removeClass("ui-disabled"),this._setOption("disabled",!1)}}),e.mobile.document.bind("pagecreate create",function(t){e.mobile.textinput.prototype.enhanceWithin(t.target,!0)})}(e),function(e){e.mobile.listview.prototype.options.filter=!1,e.mobile.listview.prototype.options.filterPlaceholder="Filter items...",e.mobile.listview.prototype.options.filterTheme="c",e.mobile.listview.prototype.options.filterReveal=!1;var t=function(e,t){return-1===(""+e).toLowerCase().indexOf(t)};e.mobile.listview.prototype.options.filterCallback=t,e.mobile.document.delegate("ul, ol","listviewcreate",function(){var i=e(this),n=i.data("mobile-listview");if(n&&n.options.filter){n.options.filterReveal&&i.children().addClass("ui-screen-hidden");var a=e("<form>",{"class":"ui-listview-filter ui-bar-"+n.options.filterTheme,role:"search"}).submit(function(e){e.preventDefault(),s.blur()}),o=function(){var a,o=e(this),s=this.value.toLowerCase(),r=null,l=i.children(),d=o.jqmData("lastval")+"",c=!1,h="",u=n.options.filterCallback!==t;if(!d||d!==s){if(n._trigger("beforefilter","beforefilter",{input:this}),o.jqmData("lastval",s),u||s.length<d.length||0!==s.indexOf(d)?r=i.children():(r=i.children(":not(.ui-screen-hidden)"),!r.length&&n.options.filterReveal&&(r=i.children(".ui-screen-hidden"))),s){for(var p=r.length-1;p>=0;p--)a=e(r[p]),h=a.jqmData("filtertext")||a.text(),a.is("li:jqmData(role=list-divider)")?(a.toggleClass("ui-filter-hidequeue",!c),c=!1):n.options.filterCallback(h,s,a)?a.toggleClass("ui-filter-hidequeue",!0):c=!0;r.filter(":not(.ui-filter-hidequeue)").toggleClass("ui-screen-hidden",!1),r.filter(".ui-filter-hidequeue").toggleClass("ui-screen-hidden",!0).toggleClass("ui-filter-hidequeue",!1)}else r.toggleClass("ui-screen-hidden",!!n.options.filterReveal);n._addFirstLastClasses(l,n._getVisibles(l,!1),!1)}},s=e("<input>",{placeholder:n.options.filterPlaceholder}).attr("data-"+e.mobile.ns+"type","search").jqmData("lastval","").bind("keyup change input",o).appendTo(a).textinput();n.options.inset&&a.addClass("ui-listview-filter-inset"),a.bind("submit",function(){return!1}).insertBefore(i)}})}(e),function(e){e.mobile.listview.prototype.options.autodividers=!1,e.mobile.listview.prototype.options.autodividersSelector=function(t){var i=e.trim(t.text())||null;return i?i=i.slice(0,1).toUpperCase():null},e.mobile.document.delegate("ul,ol","listviewcreate",function(){var t=e(this),n=t.data("mobile-listview");if(n&&n.options.autodividers){var a=function(){t.find("li:jqmData(role='list-divider')").remove();for(var a,o,s=t.find("li"),r=null,l=0;s.length>l;l++){if(a=s[l],o=n.options.autodividersSelector(e(a)),o&&r!==o){var d=i.createElement("li");d.appendChild(i.createTextNode(o)),d.setAttribute("data-"+e.mobile.ns+"role","list-divider"),a.parentNode.insertBefore(d,a)}r=o}},o=function(){t.unbind("listviewafterrefresh",o),a(),n.refresh(),t.bind("listviewafterrefresh",o)};o()}})}(e),function(e){e(i).bind("pagecreate create",function(t){e(":jqmData(role='nojs')",t.target).addClass("ui-nojs")})}(e),function(e){e.mobile.behaviors.formReset={_handleFormReset:function(){this._on(this.element.closest("form"),{reset:function(){this._delay("_reset")}})}}}(e),function(e){e.widget("mobile.checkboxradio",e.mobile.widget,e.extend({options:{theme:null,mini:!1,initSelector:"input[type='checkbox'],input[type='radio']"},_create:function(){var t=this,a=this.element,o=this.options,s=function(e,t){return e.jqmData(t)||e.closest("form, fieldset").jqmData(t)},r=e(a).closest("label"),l=r.length?r:e(a).closest("form, fieldset, :jqmData(role='page'), :jqmData(role='dialog')").find("label").filter("[for='"+a[0].id+"']").first(),d=a[0].type,c=s(a,"mini")||o.mini,h=d+"-on",u=d+"-off",p=s(a,"iconpos"),m="ui-"+h,f="ui-"+u;if("checkbox"===d||"radio"===d){e.extend(this,{label:l,inputtype:d,checkedClass:m,uncheckedClass:f,checkedicon:h,uncheckedicon:u}),o.theme||(o.theme=e.mobile.getInheritedTheme(this.element,"c")),l.buttonMarkup({theme:o.theme,icon:u,shadow:!1,mini:c,iconpos:p});var g=i.createElement("div");g.className="ui-"+d,a.add(l).wrapAll(g),l.bind({vmouseover:function(t){e(this).parent().is(".ui-disabled")&&t.stopPropagation()},vclick:function(e){return a.is(":disabled")?(e.preventDefault(),n):(t._cacheVals(),a.prop("checked","radio"===d&&!0||!a.prop("checked")),a.triggerHandler("click"),t._getInputSet().not(a).prop("checked",!1),t._updateAll(),!1)}}),a.bind({vmousedown:function(){t._cacheVals()},vclick:function(){var i=e(this);i.is(":checked")?(i.prop("checked",!0),t._getInputSet().not(i).prop("checked",!1)):i.prop("checked",!1),t._updateAll()},focus:function(){l.addClass(e.mobile.focusClass)},blur:function(){l.removeClass(e.mobile.focusClass)}}),this._handleFormReset(),this.refresh()}},_cacheVals:function(){this._getInputSet().each(function(){e(this).jqmData("cacheVal",this.checked)})},_getInputSet:function(){return"checkbox"===this.inputtype?this.element:this.element.closest("form, :jqmData(role='page'), :jqmData(role='dialog')").find("input[name='"+this.element[0].name+"'][type='"+this.inputtype+"']")},_updateAll:function(){var t=this;this._getInputSet().each(function(){var i=e(this);(this.checked||"checkbox"===t.inputtype)&&i.trigger("change")}).checkboxradio("refresh")},_reset:function(){this.refresh()},refresh:function(){var t=this.element[0],i=" "+e.mobile.activeBtnClass,n=this.checkedClass+(this.element.parents(".ui-controlgroup-horizontal").length?i:""),a=this.label;t.checked?a.removeClass(this.uncheckedClass+i).addClass(n).buttonMarkup({icon:this.checkedicon}):a.removeClass(n).addClass(this.uncheckedClass).buttonMarkup({icon:this.uncheckedicon}),t.disabled?this.disable():this.enable()},disable:function(){this.element.prop("disabled",!0).parent().addClass("ui-disabled")},enable:function(){this.element.prop("disabled",!1).parent().removeClass("ui-disabled")}},e.mobile.behaviors.formReset)),e.mobile.document.bind("pagecreate create",function(t){e.mobile.checkboxradio.prototype.enhanceWithin(t.target,!0)})}(e),function(e){e.widget("mobile.button",e.mobile.widget,{options:{theme:null,icon:null,iconpos:null,corners:!0,shadow:!0,iconshadow:!0,inline:null,mini:null,initSelector:"button, [type='button'], [type='submit'], [type='reset']"},_create:function(){var t,i=this.element,a=function(e){var t,i={};for(t in e)null!==e[t]&&"initSelector"!==t&&(i[t]=e[t]);return i}(this.options),o="";return"A"===i[0].tagName?(i.hasClass("ui-btn")||i.buttonMarkup(),n):(this.options.theme||(this.options.theme=e.mobile.getInheritedTheme(this.element,"c")),~i[0].className.indexOf("ui-btn-left")&&(o="ui-btn-left"),~i[0].className.indexOf("ui-btn-right")&&(o="ui-btn-right"),("submit"===i.attr("type")||"reset"===i.attr("type"))&&(o?o+=" ui-submit":o="ui-submit"),e("label[for='"+i.attr("id")+"']").addClass("ui-submit"),this.button=e("<div></div>")[i.html()?"html":"text"](i.html()||i.val()).insertBefore(i).buttonMarkup(a).addClass(o).append(i.addClass("ui-btn-hidden")),t=this.button,i.bind({focus:function(){t.addClass(e.mobile.focusClass)},blur:function(){t.removeClass(e.mobile.focusClass)}}),this.refresh(),n)},_setOption:function(t,i){var n={};n[t]=i,"initSelector"!==t&&(this.button.buttonMarkup(n),this.element.attr("data-"+(e.mobile.ns||"")+t.replace(/([A-Z])/,"-$1").toLowerCase(),i)),this._super("_setOption",t,i)},enable:function(){return this.element.attr("disabled",!1),this.button.removeClass("ui-disabled").attr("aria-disabled",!1),this._setOption("disabled",!1)},disable:function(){return this.element.attr("disabled",!0),this.button.addClass("ui-disabled").attr("aria-disabled",!0),this._setOption("disabled",!0)},refresh:function(){var t=this.element;t.prop("disabled")?this.disable():this.enable(),e(this.button.data("buttonElements").text)[t.html()?"html":"text"](t.html()||t.val())}}),e.mobile.document.bind("pagecreate create",function(t){e.mobile.button.prototype.enhanceWithin(t.target,!0)})}(e),function(e,n){e.widget("mobile.slider",e.mobile.widget,e.extend({widgetEventPrefix:"slide",options:{theme:null,trackTheme:null,disabled:!1,initSelector:"input[type='range'], :jqmData(type='range'), :jqmData(role='slider')",mini:!1,highlight:!1},_create:function(){var a,o,s=this,r=this.element,l=e.mobile.getInheritedTheme(r,"c"),d=this.options.theme||l,c=this.options.trackTheme||l,h=r[0].nodeName.toLowerCase(),u=(this.isToggleSwitch="select"===h,r.parent().is(":jqmData(role='rangeslider')")),p=this.isToggleSwitch?"ui-slider-switch":"",m=r.attr("id"),f=e("[for='"+m+"']"),g=f.attr("id")||m+"-label",b=f.attr("id",g),v=this.isToggleSwitch?0:parseFloat(r.attr("min")),_=this.isToggleSwitch?r.find("option").length-1:parseFloat(r.attr("max")),C=t.parseFloat(r.attr("step")||1),x=this.options.mini||r.jqmData("mini")?" ui-mini":"",y=i.createElement("a"),w=e(y),T=i.createElement("div"),D=e(T),P=this.options.highlight&&!this.isToggleSwitch?function(){var t=i.createElement("div");return t.className="ui-slider-bg "+e.mobile.activeBtnClass+" ui-btn-corner-all",e(t).prependTo(D)}():!1;if(y.setAttribute("href","#"),T.setAttribute("role","application"),T.className=[this.isToggleSwitch?"ui-slider ":"ui-slider-track ",p," ui-btn-down-",c," ui-btn-corner-all",x].join(""),y.className="ui-slider-handle",T.appendChild(y),w.buttonMarkup({corners:!0,theme:d,shadow:!0}).attr({role:"slider","aria-valuemin":v,"aria-valuemax":_,"aria-valuenow":this._value(),"aria-valuetext":this._value(),title:this._value(),"aria-labelledby":g}),e.extend(this,{slider:D,handle:w,type:h,step:C,max:_,min:v,valuebg:P,isRangeslider:u,dragging:!1,beforeStart:null,userModified:!1,mouseMoved:!1}),this.isToggleSwitch){o=i.createElement("div"),o.className="ui-slider-inneroffset";for(var k=0,E=T.childNodes.length;E>k;k++)o.appendChild(T.childNodes[k]);T.appendChild(o),w.addClass("ui-slider-handle-snapping"),a=r.find("option");for(var q=0,j=a.length;j>q;q++){var S=q?"a":"b",A=q?" "+e.mobile.activeBtnClass:" ui-btn-down-"+c,N=(i.createElement("div"),i.createElement("span"));N.className=["ui-slider-label ui-slider-label-",S,A," ui-btn-corner-all"].join(""),N.setAttribute("role","img"),N.appendChild(i.createTextNode(a[q].innerHTML)),e(N).prependTo(D)}s._labels=e(".ui-slider-label",D)}b.addClass("ui-slider"),r.addClass(this.isToggleSwitch?"ui-slider-switch":"ui-slider-input"),this._on(r,{change:"_controlChange",keyup:"_controlKeyup",blur:"_controlBlur",vmouseup:"_controlVMouseUp"}),D.bind("vmousedown",e.proxy(this._sliderVMouseDown,this)).bind("vclick",!1),this._on(i,{vmousemove:"_preventDocumentDrag"}),this._on(D.add(i),{vmouseup:"_sliderVMouseUp"}),D.insertAfter(r),this.isToggleSwitch||u||(o=this.options.mini?"<div class='ui-slider ui-mini'>":"<div class='ui-slider'>",r.add(D).wrapAll(o)),this.isToggleSwitch&&this.handle.bind({focus:function(){D.addClass(e.mobile.focusClass)},blur:function(){D.removeClass(e.mobile.focusClass)}}),this._on(this.handle,{vmousedown:"_handleVMouseDown",keydown:"_handleKeydown",keyup:"_handleKeyup"}),this.handle.bind("vclick",!1),this._handleFormReset(),this.refresh(n,n,!0)},_controlChange:function(e){return this._trigger("controlchange",e)===!1?!1:(this.mouseMoved||this.refresh(this._value(),!0),n)},_controlKeyup:function(){this.refresh(this._value(),!0,!0)},_controlBlur:function(){this.refresh(this._value(),!0)},_controlVMouseUp:function(){this._checkedRefresh()},_handleVMouseDown:function(){this.handle.focus()},_handleKeydown:function(t){var i=this._value();if(!this.options.disabled){switch(t.keyCode){case e.mobile.keyCode.HOME:case e.mobile.keyCode.END:case e.mobile.keyCode.PAGE_UP:case e.mobile.keyCode.PAGE_DOWN:case e.mobile.keyCode.UP:case e.mobile.keyCode.RIGHT:case e.mobile.keyCode.DOWN:case e.mobile.keyCode.LEFT:t.preventDefault(),this._keySliding||(this._keySliding=!0,this.handle.addClass("ui-state-active"))}switch(t.keyCode){case e.mobile.keyCode.HOME:this.refresh(this.min);break;case e.mobile.keyCode.END:this.refresh(this.max);break;case e.mobile.keyCode.PAGE_UP:case e.mobile.keyCode.UP:case e.mobile.keyCode.RIGHT:this.refresh(i+this.step);break;case e.mobile.keyCode.PAGE_DOWN:case e.mobile.keyCode.DOWN:case e.mobile.keyCode.LEFT:this.refresh(i-this.step)}}},_handleKeyup:function(){this._keySliding&&(this._keySliding=!1,this.handle.removeClass("ui-state-active"))},_sliderVMouseDown:function(e){return this.options.disabled||1!==e.which&&0!==e.which?!1:this._trigger("beforestart",e)===!1?!1:(this.dragging=!0,this.userModified=!1,this.mouseMoved=!1,this.isToggleSwitch&&(this.beforeStart=this.element[0].selectedIndex),this.refresh(e),this._trigger("start"),!1)},_sliderVMouseUp:function(){return this.dragging?(this.dragging=!1,this.isToggleSwitch&&(this.handle.addClass("ui-slider-handle-snapping"),this.mouseMoved?this.userModified?this.refresh(0===this.beforeStart?1:0):this.refresh(this.beforeStart):this.refresh(0===this.beforeStart?1:0)),this.mouseMoved=!1,this._trigger("stop"),!1):n},_preventDocumentDrag:function(e){return this._trigger("drag",e)===!1?!1:this.dragging&&!this.options.disabled?(this.mouseMoved=!0,this.isToggleSwitch&&this.handle.removeClass("ui-slider-handle-snapping"),this.refresh(e),this.userModified=this.beforeStart!==this.element[0].selectedIndex,!1):n},_checkedRefresh:function(){this.value!==this._value()&&this.refresh(this._value())},_value:function(){return this.isToggleSwitch?this.element[0].selectedIndex:parseFloat(this.element.val())},_reset:function(){this.refresh(n,!1,!0)},refresh:function(t,a,o){var s,r,l,d,c=this,h=e.mobile.getInheritedTheme(this.element,"c"),u=this.options.theme||h,p=this.options.trackTheme||h;c.slider[0].className=[this.isToggleSwitch?"ui-slider ui-slider-switch":"ui-slider-track"," ui-btn-down-"+p," ui-btn-corner-all",this.options.mini?" ui-mini":""].join(""),(this.options.disabled||this.element.attr("disabled"))&&this.disable(),this.value=this._value(),this.options.highlight&&!this.isToggleSwitch&&0===this.slider.find(".ui-slider-bg").length&&(this.valuebg=function(){var t=i.createElement("div");return t.className="ui-slider-bg "+e.mobile.activeBtnClass+" ui-btn-corner-all",e(t).prependTo(c.slider)}()),this.handle.buttonMarkup({corners:!0,theme:u,shadow:!0});var m,f,g=this.element,b=!this.isToggleSwitch,v=b?[]:g.find("option"),_=b?parseFloat(g.attr("min")):0,C=b?parseFloat(g.attr("max")):v.length-1,x=b&&parseFloat(g.attr("step"))>0?parseFloat(g.attr("step")):1;if("object"==typeof t){if(l=t,d=8,s=this.slider.offset().left,r=this.slider.width(),m=r/((C-_)/x),!this.dragging||s-d>l.pageX||l.pageX>s+r+d)return;f=m>1?100*((l.pageX-s)/r):Math.round(100*((l.pageX-s)/r))}else null==t&&(t=b?parseFloat(g.val()||0):g[0].selectedIndex),f=100*((parseFloat(t)-_)/(C-_));if(!isNaN(f)){var y=f/100*(C-_)+_,w=(y-_)%x,T=y-w;2*Math.abs(w)>=x&&(T+=w>0?x:-x);var D=100/((C-_)/x);if(y=parseFloat(T.toFixed(5)),m===n&&(m=r/((C-_)/x)),m>1&&b&&(f=(y-_)*D*(1/x)),0>f&&(f=0),f>100&&(f=100),_>y&&(y=_),y>C&&(y=C),this.handle.css("left",f+"%"),this.handle[0].setAttribute("aria-valuenow",b?y:v.eq(y).attr("value")),this.handle[0].setAttribute("aria-valuetext",b?y:v.eq(y).getEncodedText()),this.handle[0].setAttribute("title",b?y:v.eq(y).getEncodedText()),this.valuebg&&this.valuebg.css("width",f+"%"),this._labels){var P=100*(this.handle.width()/this.slider.width()),k=f&&P+(100-P)*f/100,E=100===f?0:Math.min(P+100-k,100);this._labels.each(function(){var t=e(this).is(".ui-slider-label-a");e(this).width((t?k:E)+"%")})}if(!o){var q=!1;if(b?(q=g.val()!==y,g.val(y)):(q=g[0].selectedIndex!==y,g[0].selectedIndex=y),this._trigger("beforechange",t)===!1)return!1;!a&&q&&g.trigger("change")}}},enable:function(){return this.element.attr("disabled",!1),this.slider.removeClass("ui-disabled").attr("aria-disabled",!1),this._setOption("disabled",!1)},disable:function(){return this.element.attr("disabled",!0),this.slider.addClass("ui-disabled").attr("aria-disabled",!0),this._setOption("disabled",!0)}},e.mobile.behaviors.formReset)),e.mobile.document.bind("pagecreate create",function(t){e.mobile.slider.prototype.enhanceWithin(t.target,!0)})}(e),function(e){e.widget("mobile.rangeslider",e.mobile.widget,{options:{theme:null,trackTheme:null,disabled:!1,initSelector:":jqmData(role='rangeslider')",mini:!1,highlight:!0},_create:function(){var t,i=this.element,n=this.options.mini?"ui-rangeslider ui-mini":"ui-rangeslider",a=i.find("input").first(),o=i.find("input").last(),s=i.find("label").first(),r=e.data(a.get(0),"mobileSlider").slider,l=e.data(o.get(0),"mobileSlider").slider,d=e.data(a.get(0),"mobileSlider").handle,c=e('<div class="ui-rangeslider-sliders" />').appendTo(i);i.find("label").length>1&&(t=i.find("label").last().hide()),a.addClass("ui-rangeslider-first"),o.addClass("ui-rangeslider-last"),i.addClass(n),r.appendTo(c),l.appendTo(c),s.prependTo(i),d.prependTo(l),e.extend(this,{_inputFirst:a,_inputLast:o,_sliderFirst:r,_sliderLast:l,_targetVal:null,_sliderTarget:!1,_sliders:c,_proxy:!1}),this.refresh(),this._on(this.element.find("input.ui-slider-input"),{slidebeforestart:"_slidebeforestart",slidestop:"_slidestop",slidedrag:"_slidedrag",slidebeforechange:"_change",blur:"_change",keyup:"_change"}),this._on({mousedown:"_change"}),this._on(this.element.closest("form"),{reset:"_handleReset"}),this._on(d,{vmousedown:"_dragFirstHandle"})},_handleReset:function(){var e=this;setTimeout(function(){e._updateHighlight()},0)},_dragFirstHandle:function(t){return e.data(this._inputFirst.get(0),"mobileSlider").dragging=!0,e.data(this._inputFirst.get(0),"mobileSlider").refresh(t),!1},_slidedrag:function(t){var i=e(t.target).is(this._inputFirst),a=i?this._inputLast:this._inputFirst;return this._sliderTarget=!1,"first"===this._proxy&&i||"last"===this._proxy&&!i?(e.data(a.get(0),"mobileSlider").dragging=!0,e.data(a.get(0),"mobileSlider").refresh(t),!1):n},_slidestop:function(t){var i=e(t.target).is(this._inputFirst);this._proxy=!1,this.element.find("input").trigger("vmouseup"),this._sliderFirst.css("z-index",i?1:"")},_slidebeforestart:function(t){this._sliderTarget=!1,e(t.originalEvent.target).hasClass("ui-slider-track")&&(this._sliderTarget=!0,this._targetVal=e(t.target).val())},_setOption:function(e){this._superApply(e),this.refresh()},refresh:function(){var e=this.element,t=this.options;e.find("input").slider({theme:t.theme,trackTheme:t.trackTheme,disabled:t.disabled,mini:t.mini,highlight:t.highlight}).slider("refresh"),this._updateHighlight()},_change:function(t){if("keyup"===t.type)return this._updateHighlight(),!1;var i=this,a=parseFloat(this._inputFirst.val(),10),o=parseFloat(this._inputLast.val(),10),s=e(t.target).hasClass("ui-rangeslider-first"),r=s?this._inputFirst:this._inputLast,l=s?this._inputLast:this._inputFirst;if(this._inputFirst.val()>this._inputLast.val()&&"mousedown"===t.type&&!e(t.target).hasClass("ui-slider-handle"))r.blur();else if("mousedown"===t.type)return;return a>o&&!this._sliderTarget?(r.val(s?o:a).slider("refresh"),this._trigger("normalize")):a>o&&(r.val(this._targetVal).slider("refresh"),setTimeout(function(){l.val(s?a:o).slider("refresh"),e.data(l.get(0),"mobileSlider").handle.focus(),i._sliderFirst.css("z-index",s?"":1),i._trigger("normalize")},0),this._proxy=s?"first":"last"),a===o?(e.data(r.get(0),"mobileSlider").handle.css("z-index",1),e.data(l.get(0),"mobileSlider").handle.css("z-index",0)):(e.data(l.get(0),"mobileSlider").handle.css("z-index",""),e.data(r.get(0),"mobileSlider").handle.css("z-index","")),this._updateHighlight(),a>=o?!1:n},_updateHighlight:function(){var t=parseInt(e.data(this._inputFirst.get(0),"mobileSlider").handle.get(0).style.left,10),i=parseInt(e.data(this._inputLast.get(0),"mobileSlider").handle.get(0).style.left,10),n=i-t;this.element.find(".ui-slider-bg").css({"margin-left":t+"%",width:n+"%"})},_destroy:function(){this.element.removeClass("ui-rangeslider ui-mini").find("label").show(),this._inputFirst.after(this._sliderFirst),this._inputLast.after(this._sliderLast),this._sliders.remove(),this.element.find("input").removeClass("ui-rangeslider-first ui-rangeslider-last").slider("destroy")}}),e.widget("mobile.rangeslider",e.mobile.rangeslider,e.mobile.behaviors.formReset),e(i).bind("pagecreate create",function(t){e.mobile.rangeslider.prototype.enhanceWithin(t.target,!0)})}(e),function(e){e.widget("mobile.selectmenu",e.mobile.widget,e.extend({options:{theme:null,disabled:!1,icon:"arrow-d",iconpos:"right",inline:!1,corners:!0,shadow:!0,iconshadow:!0,overlayTheme:"a",dividerTheme:"b",hidePlaceholderMenuItems:!0,closeText:"Close",nativeMenu:!0,preventFocusZoom:/iPhone|iPad|iPod/.test(navigator.platform)&&navigator.userAgent.indexOf("AppleWebKit")>-1,initSelector:"select:not( :jqmData(role='slider') )",mini:!1},_button:function(){return e("<div/>")
+},_setDisabled:function(e){return this.element.attr("disabled",e),this.button.attr("aria-disabled",e),this._setOption("disabled",e)},_focusButton:function(){var e=this;setTimeout(function(){e.button.focus()},40)},_selectOptions:function(){return this.select.find("option")},_preExtension:function(){var t="";~this.element[0].className.indexOf("ui-btn-left")&&(t=" ui-btn-left"),~this.element[0].className.indexOf("ui-btn-right")&&(t=" ui-btn-right"),this.select=this.element.removeClass("ui-btn-left ui-btn-right").wrap("<div class='ui-select"+t+"'>"),this.selectID=this.select.attr("id"),this.label=e("label[for='"+this.selectID+"']").addClass("ui-select"),this.isMultiple=this.select[0].multiple,this.options.theme||(this.options.theme=e.mobile.getInheritedTheme(this.select,"c"))},_destroy:function(){var e=this.element.parents(".ui-select");e.length>0&&(e.is(".ui-btn-left, .ui-btn-right")&&this.element.addClass(e.is(".ui-btn-left")?"ui-btn-left":"ui-btn-right"),this.element.insertAfter(e),e.remove())},_create:function(){this._preExtension(),this._trigger("beforeCreate"),this.button=this._button();var i=this,n=this.options,a=n.inline||this.select.jqmData("inline"),o=n.mini||this.select.jqmData("mini"),s=n.icon?n.iconpos||this.select.jqmData("iconpos"):!1,r=(-1===this.select[0].selectedIndex?0:this.select[0].selectedIndex,this.button.insertBefore(this.select).buttonMarkup({theme:n.theme,icon:n.icon,iconpos:s,inline:a,corners:n.corners,shadow:n.shadow,iconshadow:n.iconshadow,mini:o}));this.setButtonText(),n.nativeMenu&&t.opera&&t.opera.version&&r.addClass("ui-select-nativeonly"),this.isMultiple&&(this.buttonCount=e("<span>").addClass("ui-li-count ui-btn-up-c ui-btn-corner-all").hide().appendTo(r.addClass("ui-li-has-count"))),(n.disabled||this.element.attr("disabled"))&&this.disable(),this.select.change(function(){i.refresh(),n.nativeMenu&&this.blur()}),this._handleFormReset(),this.build()},build:function(){var t=this;this.select.appendTo(t.button).bind("vmousedown",function(){t.button.addClass(e.mobile.activeBtnClass)}).bind("focus",function(){t.button.addClass(e.mobile.focusClass)}).bind("blur",function(){t.button.removeClass(e.mobile.focusClass)}).bind("focus vmouseover",function(){t.button.trigger("vmouseover")}).bind("vmousemove",function(){t.button.removeClass(e.mobile.activeBtnClass)}).bind("change blur vmouseout",function(){t.button.trigger("vmouseout").removeClass(e.mobile.activeBtnClass)}).bind("change blur",function(){t.button.removeClass("ui-btn-down-"+t.options.theme)}),t.button.bind("vmousedown",function(){t.options.preventFocusZoom&&e.mobile.zoom.disable(!0)}),t.label.bind("click focus",function(){t.options.preventFocusZoom&&e.mobile.zoom.disable(!0)}),t.select.bind("focus",function(){t.options.preventFocusZoom&&e.mobile.zoom.disable(!0)}),t.button.bind("mouseup",function(){t.options.preventFocusZoom&&setTimeout(function(){e.mobile.zoom.enable(!0)},0)}),t.select.bind("blur",function(){t.options.preventFocusZoom&&e.mobile.zoom.enable(!0)})},selected:function(){return this._selectOptions().filter(":selected")},selectedIndices:function(){var e=this;return this.selected().map(function(){return e._selectOptions().index(this)}).get()},setButtonText:function(){var t=this,n=this.selected(),a=this.placeholder,o=e(i.createElement("span"));this.button.find(".ui-btn-text").html(function(){return a=n.length?n.map(function(){return e(this).text()}).get().join(", "):t.placeholder,o.text(a).addClass(t.select.attr("class")).addClass(n.attr("class"))})},setButtonCount:function(){var e=this.selected();this.isMultiple&&this.buttonCount[e.length>1?"show":"hide"]().text(e.length)},_reset:function(){this.refresh()},refresh:function(){this.setButtonText(),this.setButtonCount()},open:e.noop,close:e.noop,disable:function(){this._setDisabled(!0),this.button.addClass("ui-disabled")},enable:function(){this._setDisabled(!1),this.button.removeClass("ui-disabled")}},e.mobile.behaviors.formReset)),e.mobile.document.bind("pagecreate create",function(t){e.mobile.selectmenu.prototype.enhanceWithin(t.target,!0)})}(e),function(e,n){function a(e,t,i,n){var a=n;return a=t>e?i+(e-t)/2:Math.min(Math.max(i,n-t/2),i+e-t)}function o(){var i=e.mobile.window;return{x:i.scrollLeft(),y:i.scrollTop(),cx:t.innerWidth||i.width(),cy:t.innerHeight||i.height()}}e.widget("mobile.popup",e.mobile.widget,{options:{theme:null,overlayTheme:null,shadow:!0,corners:!0,transition:"none",positionTo:"origin",tolerance:null,initSelector:":jqmData(role='popup')",closeLinkSelector:"a:jqmData(rel='back')",closeLinkEvents:"click.popup",navigateEvents:"navigate.popup",closeEvents:"navigate.popup pagebeforechange.popup",dismissible:!0,history:!e.mobile.browser.oldIE},_eatEventAndClose:function(e){return e.preventDefault(),e.stopImmediatePropagation(),this.options.dismissible&&this.close(),!1},_resizeScreen:function(){var e=this._ui.container.outerHeight(!0);this._ui.screen.removeAttr("style"),e>this._ui.screen.height()&&this._ui.screen.height(e)},_handleWindowKeyUp:function(t){return this._isOpen&&t.keyCode===e.mobile.keyCode.ESCAPE?this._eatEventAndClose(t):n},_expectResizeEvent:function(){var t=o();if(this._resizeData){if(t.x===this._resizeData.winCoords.x&&t.y===this._resizeData.winCoords.y&&t.cx===this._resizeData.winCoords.cx&&t.cy===this._resizeData.winCoords.cy)return!1;clearTimeout(this._resizeData.timeoutId)}return this._resizeData={timeoutId:setTimeout(e.proxy(this,"_resizeTimeout"),200),winCoords:t},!0},_resizeTimeout:function(){this._isOpen?this._expectResizeEvent()||(this._ui.container.hasClass("ui-popup-hidden")&&(this._ui.container.removeClass("ui-popup-hidden"),this.reposition({positionTo:"window"}),this._ignoreResizeEvents()),this._resizeScreen(),this._resizeData=null,this._orientationchangeInProgress=!1):(this._resizeData=null,this._orientationchangeInProgress=!1)},_ignoreResizeEvents:function(){var e=this;this._ignoreResizeTo&&clearTimeout(this._ignoreResizeTo),this._ignoreResizeTo=setTimeout(function(){e._ignoreResizeTo=0},1e3)},_handleWindowResize:function(){this._isOpen&&0===this._ignoreResizeTo&&(!this._expectResizeEvent()&&!this._orientationchangeInProgress||this._ui.container.hasClass("ui-popup-hidden")||this._ui.container.addClass("ui-popup-hidden").removeAttr("style"))},_handleWindowOrientationchange:function(){!this._orientationchangeInProgress&&this._isOpen&&0===this._ignoreResizeTo&&(this._expectResizeEvent(),this._orientationchangeInProgress=!0)},_handleDocumentFocusIn:function(t){var n,a=t.target,o=this._ui;if(this._isOpen){if(a!==o.container[0]){if(n=e(t.target),0===n.parents().filter(o.container[0]).length)return e(i.activeElement).one("focus",function(){n.blur()}),o.focusElement.focus(),t.preventDefault(),t.stopImmediatePropagation(),!1;o.focusElement[0]===o.container[0]&&(o.focusElement=n)}this._ignoreResizeEvents()}},_create:function(){var t={screen:e("<div class='ui-screen-hidden ui-popup-screen'></div>"),placeholder:e("<div style='display: none;'><!-- placeholder --></div>"),container:e("<div class='ui-popup-container ui-popup-hidden'></div>")},i=this.element.closest(".ui-page"),a=this.element.attr("id"),o=this;this.options.history=this.options.history&&e.mobile.ajaxEnabled&&e.mobile.hashListeningEnabled,0===i.length&&(i=e("body")),this.options.container=this.options.container||e.mobile.pageContainer,i.append(t.screen),t.container.insertAfter(t.screen),t.placeholder.insertAfter(this.element),a&&(t.screen.attr("id",a+"-screen"),t.container.attr("id",a+"-popup"),t.placeholder.html("<!-- placeholder for "+a+" -->")),t.container.append(this.element),t.focusElement=t.container,this.element.addClass("ui-popup"),e.extend(this,{_scrollTop:0,_page:i,_ui:t,_fallbackTransition:"",_currentTransition:!1,_prereqs:null,_isOpen:!1,_tolerance:null,_resizeData:null,_ignoreResizeTo:0,_orientationchangeInProgress:!1}),e.each(this.options,function(e,t){o.options[e]=n,o._setOption(e,t,!0)}),t.screen.bind("vclick",e.proxy(this,"_eatEventAndClose")),this._on(e.mobile.window,{orientationchange:e.proxy(this,"_handleWindowOrientationchange"),resize:e.proxy(this,"_handleWindowResize"),keyup:e.proxy(this,"_handleWindowKeyUp")}),this._on(e.mobile.document,{focusin:e.proxy(this,"_handleDocumentFocusIn")})},_applyTheme:function(e,t,i){for(var n,a=(e.attr("class")||"").split(" "),o=null,s=t+"";a.length>0;){if(o=a.pop(),n=RegExp("^ui-"+i+"-([a-z])$").exec(o),n&&n.length>1){o=n[1];break}o=null}t!==o&&(e.removeClass("ui-"+i+"-"+o),null!==t&&"none"!==t&&e.addClass("ui-"+i+"-"+s))},_setTheme:function(e){this._applyTheme(this.element,e,"body")},_setOverlayTheme:function(e){this._applyTheme(this._ui.screen,e,"overlay"),this._isOpen&&this._ui.screen.addClass("in")},_setShadow:function(e){this.element.toggleClass("ui-overlay-shadow",e)},_setCorners:function(e){this.element.toggleClass("ui-corner-all",e)},_applyTransition:function(t){this._ui.container.removeClass(this._fallbackTransition),t&&"none"!==t&&(this._fallbackTransition=e.mobile._maybeDegradeTransition(t),"none"===this._fallbackTransition&&(this._fallbackTransition=""),this._ui.container.addClass(this._fallbackTransition))},_setTransition:function(e){this._currentTransition||this._applyTransition(e)},_setTolerance:function(t){var i={t:30,r:15,b:30,l:15};if(t!==n){var a=(t+"").split(",");switch(e.each(a,function(e,t){a[e]=parseInt(t,10)}),a.length){case 1:isNaN(a[0])||(i.t=i.r=i.b=i.l=a[0]);break;case 2:isNaN(a[0])||(i.t=i.b=a[0]),isNaN(a[1])||(i.l=i.r=a[1]);break;case 4:isNaN(a[0])||(i.t=a[0]),isNaN(a[1])||(i.r=a[1]),isNaN(a[2])||(i.b=a[2]),isNaN(a[3])||(i.l=a[3]);break;default:}}this._tolerance=i},_setOption:function(t,i){var a,o="_set"+t.charAt(0).toUpperCase()+t.slice(1);this[o]!==n&&this[o](i),a=["initSelector","closeLinkSelector","closeLinkEvents","navigateEvents","closeEvents","history","container"],e.mobile.widget.prototype._setOption.apply(this,arguments),-1===e.inArray(t,a)&&this.element.attr("data-"+(e.mobile.ns||"")+t.replace(/([A-Z])/,"-$1").toLowerCase(),i)},_placementCoords:function(e){var t,n,s=o(),r={x:this._tolerance.l,y:s.y+this._tolerance.t,cx:s.cx-this._tolerance.l-this._tolerance.r,cy:s.cy-this._tolerance.t-this._tolerance.b};this._ui.container.css("max-width",r.cx),t={cx:this._ui.container.outerWidth(!0),cy:this._ui.container.outerHeight(!0)},n={x:a(r.cx,t.cx,r.x,e.x),y:a(r.cy,t.cy,r.y,e.y)},n.y=Math.max(0,n.y);var l=i.documentElement,d=i.body,c=Math.max(l.clientHeight,d.scrollHeight,d.offsetHeight,l.scrollHeight,l.offsetHeight);return n.y-=Math.min(n.y,Math.max(0,n.y+t.cy-c)),{left:n.x,top:n.y}},_createPrereqs:function(t,i,n){var a,o=this;a={screen:e.Deferred(),container:e.Deferred()},a.screen.then(function(){a===o._prereqs&&t()}),a.container.then(function(){a===o._prereqs&&i()}),e.when(a.screen,a.container).done(function(){a===o._prereqs&&(o._prereqs=null,n())}),o._prereqs=a},_animate:function(t){return this._ui.screen.removeClass(t.classToRemove).addClass(t.screenClassToAdd),t.prereqs.screen.resolve(),t.transition&&"none"!==t.transition&&(t.applyTransition&&this._applyTransition(t.transition),this._fallbackTransition)?(this._ui.container.animationComplete(e.proxy(t.prereqs.container,"resolve")).addClass(t.containerClassToAdd).removeClass(t.classToRemove),n):(this._ui.container.removeClass(t.classToRemove),t.prereqs.container.resolve(),n)},_desiredCoords:function(t){var i,n=null,a=o(),s=t.x,r=t.y,l=t.positionTo;if(l&&"origin"!==l)if("window"===l)s=a.cx/2+a.x,r=a.cy/2+a.y;else{try{n=e(l)}catch(d){n=null}n&&(n.filter(":visible"),0===n.length&&(n=null))}return n&&(i=n.offset(),s=i.left+n.outerWidth()/2,r=i.top+n.outerHeight()/2),("number"!==e.type(s)||isNaN(s))&&(s=a.cx/2+a.x),("number"!==e.type(r)||isNaN(r))&&(r=a.cy/2+a.y),{x:s,y:r}},_reposition:function(e){e={x:e.x,y:e.y,positionTo:e.positionTo},this._trigger("beforeposition",e),this._ui.container.offset(this._placementCoords(this._desiredCoords(e)))},reposition:function(e){this._isOpen&&this._reposition(e)},_openPrereqsComplete:function(){this._ui.container.addClass("ui-popup-active"),this._isOpen=!0,this._resizeScreen(),this._ui.container.attr("tabindex","0").focus(),this._ignoreResizeEvents(),this._trigger("afteropen")},_open:function(t){var i=e.extend({},this.options,t),n=function(){var e=navigator.userAgent,t=e.match(/AppleWebKit\/([0-9\.]+)/),i=!!t&&t[1],n=e.match(/Android (\d+(?:\.\d+))/),a=!!n&&n[1],o=e.indexOf("Chrome")>-1;return null!==n&&"4.0"===a&&i&&i>534.13&&!o?!0:!1}();this._createPrereqs(e.noop,e.noop,e.proxy(this,"_openPrereqsComplete")),this._currentTransition=i.transition,this._applyTransition(i.transition),this.options.theme||this._setTheme(this._page.jqmData("theme")||e.mobile.getInheritedTheme(this._page,"c")),this._ui.screen.removeClass("ui-screen-hidden"),this._ui.container.removeClass("ui-popup-hidden"),this._reposition(i),this.options.overlayTheme&&n&&this.element.closest(".ui-page").addClass("ui-popup-open"),this._animate({additionalCondition:!0,transition:i.transition,classToRemove:"",screenClassToAdd:"in",containerClassToAdd:"in",applyTransition:!1,prereqs:this._prereqs})},_closePrereqScreen:function(){this._ui.screen.removeClass("out").addClass("ui-screen-hidden")},_closePrereqContainer:function(){this._ui.container.removeClass("reverse out").addClass("ui-popup-hidden").removeAttr("style")},_closePrereqsDone:function(){this.options,this._ui.container.removeAttr("tabindex"),e.mobile.popup.active=n,this._trigger("afterclose")},_close:function(t){this._ui.container.removeClass("ui-popup-active"),this._page.removeClass("ui-popup-open"),this._isOpen=!1,this._createPrereqs(e.proxy(this,"_closePrereqScreen"),e.proxy(this,"_closePrereqContainer"),e.proxy(this,"_closePrereqsDone")),this._animate({additionalCondition:this._ui.screen.hasClass("in"),transition:t?"none":this._currentTransition,classToRemove:"in",screenClassToAdd:"out",containerClassToAdd:"reverse out",applyTransition:!0,prereqs:this._prereqs})},_unenhance:function(){this._setTheme("none"),this.element.detach().insertAfter(this._ui.placeholder).removeClass("ui-popup ui-overlay-shadow ui-corner-all"),this._ui.screen.remove(),this._ui.container.remove(),this._ui.placeholder.remove()},_destroy:function(){e.mobile.popup.active===this?(this.element.one("popupafterclose",e.proxy(this,"_unenhance")),this.close()):this._unenhance()},_closePopup:function(i,n){var a,o,s=this.options,r=!1;t.scrollTo(0,this._scrollTop),i&&"pagebeforechange"===i.type&&n&&(a="string"==typeof n.toPage?n.toPage:n.toPage.jqmData("url"),a=e.mobile.path.parseUrl(a),o=a.pathname+a.search+a.hash,this._myUrl!==e.mobile.path.makeUrlAbsolute(o)?r=!0:i.preventDefault()),s.container.unbind(s.closeEvents),this.element.undelegate(s.closeLinkSelector,s.closeLinkEvents),this._close(r)},_bindContainerClose:function(){this.options.container.one(this.options.closeEvents,e.proxy(this,"_closePopup"))},open:function(i){var a,o,s,r,l,d,c=this,h=this.options;if(!e.mobile.popup.active){if(e.mobile.popup.active=this,this._scrollTop=e.mobile.window.scrollTop(),!h.history)return c._open(i),c._bindContainerClose(),c.element.delegate(h.closeLinkSelector,h.closeLinkEvents,function(e){c.close(),e.preventDefault()}),n;if(d=e.mobile.urlHistory,o=e.mobile.dialogHashKey,s=e.mobile.activePage,r=s.is(".ui-dialog"),this._myUrl=a=d.getActive().url,l=a.indexOf(o)>-1&&!r&&d.activeIndex>0)return c._open(i),c._bindContainerClose(),n;-1!==a.indexOf(o)||r?a=e.mobile.path.parseLocation().hash+o:a+=a.indexOf("#")>-1?o:"#"+o,0===d.activeIndex&&a===d.initialDst&&(a+=o),e(t).one("beforenavigate",function(e){e.preventDefault(),c._open(i),c._bindContainerClose()}),this.urlAltered=!0,e.mobile.navigate(a,{role:"dialog"})}},close:function(){e.mobile.popup.active===this&&(this._scrollTop=e.mobile.window.scrollTop(),this.options.history&&this.urlAltered?(e.mobile.back(),this.urlAltered=!1):this._closePopup())}}),e.mobile.popup.handleLink=function(t){var i,n=t.closest(":jqmData(role='page')"),a=0===n.length?e("body"):n,o=e(e.mobile.path.parseUrl(t.attr("href")).hash,a[0]);o.data("mobile-popup")&&(i=t.offset(),o.popup("open",{x:i.left+t.outerWidth()/2,y:i.top+t.outerHeight()/2,transition:t.jqmData("transition"),positionTo:t.jqmData("position-to")})),setTimeout(function(){var i=t.parent().parent();i.hasClass("ui-li")&&(t=i.parent()),t.removeClass(e.mobile.activeBtnClass)},300)},e.mobile.document.bind("pagebeforechange",function(t,i){"popup"===i.options.role&&(e.mobile.popup.handleLink(i.options.link),t.preventDefault())}),e.mobile.document.bind("pagecreate create",function(t){e.mobile.popup.prototype.enhanceWithin(t.target,!0)})}(e),function(e,t){var n=function(n){var a,o,s,r=(n.select,n._destroy),l=n.selectID,d=l?l:(e.mobile.ns||"")+"uuid-"+n.uuid,c=d+"-listbox",h=d+"-dialog",u=n.label,p=n.select.closest(".ui-page"),m=n._selectOptions(),f=n.isMultiple=n.select[0].multiple,g=l+"-button",b=l+"-menu",v=e("<div data-"+e.mobile.ns+"role='dialog' id='"+h+"' data-"+e.mobile.ns+"theme='"+n.options.theme+"' data-"+e.mobile.ns+"overlay-theme='"+n.options.overlayTheme+"'>"+"<div data-"+e.mobile.ns+"role='header'>"+"<div class='ui-title'>"+u.getEncodedText()+"</div>"+"</div>"+"<div data-"+e.mobile.ns+"role='content'></div>"+"</div>"),_=e("<div id='"+c+"' class='ui-selectmenu'>").insertAfter(n.select).popup({theme:n.options.overlayTheme}),C=e("<ul>",{"class":"ui-selectmenu-list",id:b,role:"listbox","aria-labelledby":g}).attr("data-"+e.mobile.ns+"theme",n.options.theme).attr("data-"+e.mobile.ns+"divider-theme",n.options.dividerTheme).appendTo(_),x=e("<div>",{"class":"ui-header ui-bar-"+n.options.theme}).prependTo(_),y=e("<h1>",{"class":"ui-title"}).appendTo(x);n.isMultiple&&(s=e("<a>",{text:n.options.closeText,href:"#","class":"ui-btn-left"}).attr("data-"+e.mobile.ns+"iconpos","notext").attr("data-"+e.mobile.ns+"icon","delete").appendTo(x).buttonMarkup()),e.extend(n,{select:n.select,selectID:l,buttonId:g,menuId:b,popupID:c,dialogID:h,thisPage:p,menuPage:v,label:u,selectOptions:m,isMultiple:f,theme:n.options.theme,listbox:_,list:C,header:x,headerTitle:y,headerClose:s,menuPageContent:a,menuPageClose:o,placeholder:"",build:function(){var i=this;i.refresh(),i._origTabIndex===t&&(i._origTabIndex=null===i.select[0].getAttribute("tabindex")?!1:i.select.attr("tabindex")),i.select.attr("tabindex","-1").focus(function(){e(this).blur(),i.button.focus()}),i.button.bind("vclick keydown",function(t){i.options.disabled||i.isOpen||("vclick"===t.type||t.keyCode&&(t.keyCode===e.mobile.keyCode.ENTER||t.keyCode===e.mobile.keyCode.SPACE))&&(i._decideFormat(),"overlay"===i.menuType?i.button.attr("href","#"+i.popupID).attr("data-"+(e.mobile.ns||"")+"rel","popup"):i.button.attr("href","#"+i.dialogID).attr("data-"+(e.mobile.ns||"")+"rel","dialog"),i.isOpen=!0)}),i.list.attr("role","listbox").bind("focusin",function(t){e(t.target).attr("tabindex","0").trigger("vmouseover")}).bind("focusout",function(t){e(t.target).attr("tabindex","-1").trigger("vmouseout")}).delegate("li:not(.ui-disabled, .ui-li-divider)","click",function(t){var a=i.select[0].selectedIndex,o=i.list.find("li:not(.ui-li-divider)").index(this),s=i._selectOptions().eq(o)[0];s.selected=i.isMultiple?!s.selected:!0,i.isMultiple&&e(this).find(".ui-icon").toggleClass("ui-icon-checkbox-on",s.selected).toggleClass("ui-icon-checkbox-off",!s.selected),(i.isMultiple||a!==o)&&i.select.trigger("change"),i.isMultiple?i.list.find("li:not(.ui-li-divider)").eq(o).addClass("ui-btn-down-"+n.options.theme).find("a").first().focus():i.close(),t.preventDefault()}).keydown(function(t){var i,a,o=e(t.target),s=o.closest("li");switch(t.keyCode){case 38:return i=s.prev().not(".ui-selectmenu-placeholder"),i.is(".ui-li-divider")&&(i=i.prev()),i.length&&(o.blur().attr("tabindex","-1"),i.addClass("ui-btn-down-"+n.options.theme).find("a").first().focus()),!1;case 40:return a=s.next(),a.is(".ui-li-divider")&&(a=a.next()),a.length&&(o.blur().attr("tabindex","-1"),a.addClass("ui-btn-down-"+n.options.theme).find("a").first().focus()),!1;case 13:case 32:return o.trigger("click"),!1}}),i.menuPage.bind("pagehide",function(){e.mobile._bindPageRemove.call(i.thisPage)}),i.listbox.bind("popupafterclose",function(){i.close()}),i.isMultiple&&i.headerClose.click(function(){return"overlay"===i.menuType?(i.close(),!1):t}),i.thisPage.addDependents(this.menuPage)},_isRebuildRequired:function(){var e=this.list.find("li"),t=this._selectOptions();return t.text()!==e.text()},selected:function(){return this._selectOptions().filter(":selected:not( :jqmData(placeholder='true') )")},refresh:function(t){var i,n=this;this.element,this.isMultiple,(t||this._isRebuildRequired())&&n._buildList(),i=this.selectedIndices(),n.setButtonText(),n.setButtonCount(),n.list.find("li:not(.ui-li-divider)").removeClass(e.mobile.activeBtnClass).attr("aria-selected",!1).each(function(t){if(e.inArray(t,i)>-1){var a=e(this);a.attr("aria-selected",!0),n.isMultiple?a.find(".ui-icon").removeClass("ui-icon-checkbox-off").addClass("ui-icon-checkbox-on"):a.is(".ui-selectmenu-placeholder")?a.next().addClass(e.mobile.activeBtnClass):a.addClass(e.mobile.activeBtnClass)}})},close:function(){if(!this.options.disabled&&this.isOpen){var e=this;"page"===e.menuType?(e.menuPage.dialog("close"),e.list.appendTo(e.listbox)):e.listbox.popup("close"),e._focusButton(),e.isOpen=!1}},open:function(){this.button.click()},_decideFormat:function(){function t(){var t=i.list.find("."+e.mobile.activeBtnClass+" a");0===t.length&&(t=i.list.find("li.ui-btn:not( :jqmData(placeholder='true') ) a")),t.first().focus().closest("li").addClass("ui-btn-down-"+n.options.theme)}var i=this,a=e.mobile.window,o=i.list.parent(),s=o.outerHeight(),r=(o.outerWidth(),e("."+e.mobile.activePageClass),a.scrollTop()),l=i.button.offset().top,d=a.height();a.width(),s>d-80||!e.support.scrollTop?(i.menuPage.appendTo(e.mobile.pageContainer).page(),i.menuPageContent=v.find(".ui-content"),i.menuPageClose=v.find(".ui-header a"),i.thisPage.unbind("pagehide.remove"),0===r&&l>d&&i.thisPage.one("pagehide",function(){e(this).jqmData("lastScroll",l)}),i.menuPage.one("pageshow",function(){t()}).one("pagehide",function(){i.close()}),i.menuType="page",i.menuPageContent.append(i.list),i.menuPage.find("div .ui-title").text(i.label.text())):(i.menuType="overlay",i.listbox.one("popupafteropen",t))},_buildList:function(){var t=this,n=this.options,a=this.placeholder,o=!0,s=t.isMultiple?"checkbox-off":"false";t.list.empty().filter(".ui-listview").listview("destroy");for(var r,l=t.select.find("option"),d=l.length,c=this.select[0],h="data-"+e.mobile.ns,u=h+"option-index",p=h+"icon",m=h+"role",f=h+"placeholder",g=i.createDocumentFragment(),b=!1,v=0;d>v;v++,b=!1){var _=l[v],C=e(_),x=_.parentNode,y=C.text(),w=i.createElement("a"),T=[];if(w.setAttribute("href","#"),w.appendChild(i.createTextNode(y)),x!==c&&"optgroup"===x.nodeName.toLowerCase()){var D=x.getAttribute("label");if(D!==r){var P=i.createElement("li");P.setAttribute(m,"list-divider"),P.setAttribute("role","option"),P.setAttribute("tabindex","-1"),P.appendChild(i.createTextNode(D)),g.appendChild(P),r=D}}!o||_.getAttribute("value")&&0!==y.length&&!C.jqmData("placeholder")||(o=!1,b=!0,null===_.getAttribute(f)&&(this._removePlaceholderAttr=!0),_.setAttribute(f,!0),n.hidePlaceholderMenuItems&&T.push("ui-selectmenu-placeholder"),a!==y&&(a=t.placeholder=y));var k=i.createElement("li");_.disabled&&(T.push("ui-disabled"),k.setAttribute("aria-disabled",!0)),k.setAttribute(u,v),k.setAttribute(p,s),b&&k.setAttribute(f,!0),k.className=T.join(" "),k.setAttribute("role","option"),w.setAttribute("tabindex","-1"),k.appendChild(w),g.appendChild(k)}t.list[0].appendChild(g),this.isMultiple||a.length?this.headerTitle.text(this.placeholder):this.header.hide(),t.list.listview()},_button:function(){return e("<a>",{href:"#",role:"button",id:this.buttonId,"aria-haspopup":"true","aria-owns":this.menuId})},_destroy:function(){this.close(),this._origTabIndex!==t&&(this._origTabIndex!==!1?this.select.attr("tabindex",this._origTabIndex):this.select.removeAttr("tabindex")),this._removePlaceholderAttr&&this._selectOptions().removeAttr("data-"+e.mobile.ns+"placeholder"),this.listbox.remove(),r.apply(this,arguments)}})};e.mobile.document.bind("selectmenubeforecreate",function(t){var i=e(t.target).data("mobile-selectmenu");i.options.nativeMenu||0!==i.element.parents(":jqmData(role='popup')").length||n(i)})}(e),function(e,t){e.widget("mobile.controlgroup",e.mobile.widget,e.extend({options:{shadow:!1,corners:!0,excludeInvisible:!0,type:"vertical",mini:!1,initSelector:":jqmData(role='controlgroup')"},_create:function(){var i=this.element,n={inner:e("<div class='ui-controlgroup-controls'></div>"),legend:e("<div role='heading' class='ui-controlgroup-label'></div>")},a=i.children("legend"),o=this;i.wrapInner(n.inner),a.length&&n.legend.append(a).insertBefore(i.children(0)),i.addClass("ui-corner-all ui-controlgroup"),e.extend(this,{_initialRefresh:!0}),e.each(this.options,function(e,i){o.options[e]=t,o._setOption(e,i,!0)})},_init:function(){this.refresh()},_setOption:function(i,n){var a="_set"+i.charAt(0).toUpperCase()+i.slice(1);this[a]!==t&&this[a](n),this._super(i,n),this.element.attr("data-"+(e.mobile.ns||"")+i.replace(/([A-Z])/,"-$1").toLowerCase(),n)},_setType:function(e){this.element.removeClass("ui-controlgroup-horizontal ui-controlgroup-vertical").addClass("ui-controlgroup-"+e),this.refresh()},_setCorners:function(e){this.element.toggleClass("ui-corner-all",e)},_setShadow:function(e){this.element.toggleClass("ui-shadow",e)},_setMini:function(e){this.element.toggleClass("ui-mini",e)},container:function(){return this.element.children(".ui-controlgroup-controls")},refresh:function(){var t=this.element.find(".ui-btn").not(".ui-slider-handle"),i=this._initialRefresh;e.mobile.checkboxradio&&this.element.find(":mobile-checkboxradio").checkboxradio("refresh"),this._addFirstLastClasses(t,this.options.excludeInvisible?this._getVisibles(t,i):t,i),this._initialRefresh=!1}},e.mobile.behaviors.addFirstLastClasses)),e(function(){e.mobile.document.bind("pagecreate create",function(t){e.mobile.controlgroup.prototype.enhanceWithin(t.target,!0)})})}(e),function(e){e(i).bind("pagecreate create",function(t){e(t.target).find("a").jqmEnhanceable().not(".ui-btn, .ui-link-inherit, :jqmData(role='none'), :jqmData(role='nojs')").addClass("ui-link")})}(e),function(e,t){e.widget("mobile.fixedtoolbar",e.mobile.widget,{options:{visibleOnPageShow:!0,disablePageZoom:!0,transition:"slide",fullscreen:!1,tapToggle:!0,tapToggleBlacklist:"a, button, input, select, textarea, .ui-header-fixed, .ui-footer-fixed, .ui-popup, .ui-panel, .ui-panel-dismiss-open",hideDuringFocus:"input, textarea, select",updatePagePadding:!0,trackPersistentToolbars:!0,supportBlacklist:function(){return!e.support.fixedPosition},initSelector:":jqmData(position='fixed')"},_create:function(){var i=this,n=i.options,a=i.element,o=a.is(":jqmData(role='header')")?"header":"footer",s=a.closest(".ui-page");return n.supportBlacklist()?(i.destroy(),t):(a.addClass("ui-"+o+"-fixed"),n.fullscreen?(a.addClass("ui-"+o+"-fullscreen"),s.addClass("ui-page-"+o+"-fullscreen")):s.addClass("ui-page-"+o+"-fixed"),e.extend(this,{_thisPage:null}),i._addTransitionClass(),i._bindPageEvents(),i._bindToggleHandlers(),t)},_addTransitionClass:function(){var e=this.options.transition;e&&"none"!==e&&("slide"===e&&(e=this.element.is(".ui-header")?"slidedown":"slideup"),this.element.addClass(e))},_bindPageEvents:function(){this._thisPage=this.element.closest(".ui-page"),this._on(this._thisPage,{pagebeforeshow:"_handlePageBeforeShow",webkitAnimationStart:"_handleAnimationStart",animationstart:"_handleAnimationStart",updatelayout:"_handleAnimationStart",pageshow:"_handlePageShow",pagebeforehide:"_handlePageBeforeHide"})},_handlePageBeforeShow:function(){var t=this.options;t.disablePageZoom&&e.mobile.zoom.disable(!0),t.visibleOnPageShow||this.hide(!0)},_handleAnimationStart:function(){this.options.updatePagePadding&&this.updatePagePadding(this._thisPage)},_handlePageShow:function(){this.updatePagePadding(this._thisPage),this.options.updatePagePadding&&this._on(e.mobile.window,{throttledresize:"updatePagePadding"})},_handlePageBeforeHide:function(t,i){var n=this.options;if(n.disablePageZoom&&e.mobile.zoom.enable(!0),n.updatePagePadding&&this._off(e.mobile.window,"throttledresize"),n.trackPersistentToolbars){var a=e(".ui-footer-fixed:jqmData(id)",this._thisPage),o=e(".ui-header-fixed:jqmData(id)",this._thisPage),s=a.length&&i.nextPage&&e(".ui-footer-fixed:jqmData(id='"+a.jqmData("id")+"')",i.nextPage)||e(),r=o.length&&i.nextPage&&e(".ui-header-fixed:jqmData(id='"+o.jqmData("id")+"')",i.nextPage)||e();(s.length||r.length)&&(s.add(r).appendTo(e.mobile.pageContainer),i.nextPage.one("pageshow",function(){r.prependTo(this),s.appendTo(this)}))}},_visible:!0,updatePagePadding:function(i){var n=this.element,a=n.is(".ui-header"),o=parseFloat(n.css(a?"top":"bottom"));this.options.fullscreen||(i=i&&i.type===t&&i||this._thisPage||n.closest(".ui-page"),e(i).css("padding-"+(a?"top":"bottom"),n.outerHeight()+o))},_useTransition:function(t){var i=e.mobile.window,n=this.element,a=i.scrollTop(),o=n.height(),s=n.closest(".ui-page").height(),r=e.mobile.getScreenHeight(),l=n.is(":jqmData(role='header')")?"header":"footer";return!t&&(this.options.transition&&"none"!==this.options.transition&&("header"===l&&!this.options.fullscreen&&a>o||"footer"===l&&!this.options.fullscreen&&s-o>a+r)||this.options.fullscreen)},show:function(e){var t="ui-fixed-hidden",i=this.element;this._useTransition(e)?i.removeClass("out "+t).addClass("in").animationComplete(function(){i.removeClass("in")}):i.removeClass(t),this._visible=!0},hide:function(e){var t="ui-fixed-hidden",i=this.element,n="out"+("slide"===this.options.transition?" reverse":"");this._useTransition(e)?i.addClass(n).removeClass("in").animationComplete(function(){i.addClass(t).removeClass(n)}):i.addClass(t).removeClass(n),this._visible=!1},toggle:function(){this[this._visible?"hide":"show"]()},_bindToggleHandlers:function(){var t,i,n=this,a=n.options,o=n.element,s=!0;o.closest(".ui-page").bind("vclick",function(t){a.tapToggle&&!e(t.target).closest(a.tapToggleBlacklist).length&&n.toggle()}).bind("focusin focusout",function(o){1025>screen.width&&e(o.target).is(a.hideDuringFocus)&&!e(o.target).closest(".ui-header-fixed, .ui-footer-fixed").length&&("focusout"!==o.type||s?"focusin"===o.type&&s&&(clearTimeout(t),s=!1,i=setTimeout(function(){n.hide()},0)):(s=!0,clearTimeout(i),t=setTimeout(function(){n.show()},0)))})},_destroy:function(){var e=this.element,t=e.is(".ui-header");e.closest(".ui-page").css("padding-"+(t?"top":"bottom"),""),e.removeClass("ui-header-fixed ui-footer-fixed ui-header-fullscreen ui-footer-fullscreen in out fade slidedown slideup ui-fixed-hidden"),e.closest(".ui-page").removeClass("ui-page-header-fixed ui-page-footer-fixed ui-page-header-fullscreen ui-page-footer-fullscreen")}}),e.mobile.document.bind("pagecreate create",function(t){e(t.target).jqmData("fullscreen")&&e(e.mobile.fixedtoolbar.prototype.options.initSelector,t.target).not(":jqmData(fullscreen)").jqmData("fullscreen",!0),e.mobile.fixedtoolbar.prototype.enhanceWithin(t.target)})}(e),function(e){e.widget("mobile.fixedtoolbar",e.mobile.fixedtoolbar,{_create:function(){this._super(),this._workarounds()},_workarounds:function(){var e=navigator.userAgent,t=navigator.platform,i=e.match(/AppleWebKit\/([0-9]+)/),n=!!i&&i[1],a=null,o=this;if(t.indexOf("iPhone")>-1||t.indexOf("iPad")>-1||t.indexOf("iPod")>-1)a="ios";else{if(!(e.indexOf("Android")>-1))return;a="android"}if("ios"===a)o._bindScrollWorkaround();else{if(!("android"===a&&n&&534>n))return;o._bindScrollWorkaround(),o._bindListThumbWorkaround()}},_viewportOffset:function(){var t=this.element,i=t.is(".ui-header"),n=Math.abs(t.offset().top-e.mobile.window.scrollTop());return i||(n=Math.round(n-e.mobile.window.height()+t.outerHeight())-60),n},_bindScrollWorkaround:function(){var t=this;this._on(e.mobile.window,{scrollstop:function(){var e=t._viewportOffset();e>2&&t._visible&&t._triggerRedraw()}})},_bindListThumbWorkaround:function(){this.element.closest(".ui-page").addClass("ui-android-2x-fixed")},_triggerRedraw:function(){var t=parseFloat(e(".ui-page-active").css("padding-bottom"));
+e(".ui-page-active").css("padding-bottom",t+1+"px"),setTimeout(function(){e(".ui-page-active").css("padding-bottom",t+"px")},0)},destroy:function(){this._super(),this.element.closest(".ui-page-active").removeClass("ui-android-2x-fix")}})}(e),function(e,n){e.widget("mobile.panel",e.mobile.widget,{options:{classes:{panel:"ui-panel",panelOpen:"ui-panel-open",panelClosed:"ui-panel-closed",panelFixed:"ui-panel-fixed",panelInner:"ui-panel-inner",modal:"ui-panel-dismiss",modalOpen:"ui-panel-dismiss-open",pagePanel:"ui-page-panel",pagePanelOpen:"ui-page-panel-open",contentWrap:"ui-panel-content-wrap",contentWrapOpen:"ui-panel-content-wrap-open",contentWrapClosed:"ui-panel-content-wrap-closed",contentFixedToolbar:"ui-panel-content-fixed-toolbar",contentFixedToolbarOpen:"ui-panel-content-fixed-toolbar-open",contentFixedToolbarClosed:"ui-panel-content-fixed-toolbar-closed",animate:"ui-panel-animate"},animate:!0,theme:"c",position:"left",dismissible:!0,display:"reveal",initSelector:":jqmData(role='panel')",swipeClose:!0,positionFixed:!1},_panelID:null,_closeLink:null,_page:null,_modal:null,_panelInner:null,_wrapper:null,_fixedToolbar:null,_create:function(){var t=this,i=t.element,n=i.closest(":jqmData(role='page')"),a=function(){var t=e.data(n[0],"mobilePage").options.theme,i="ui-body-"+t;return i},o=function(){var e=i.find("."+t.options.classes.panelInner);return 0===e.length&&(e=i.children().wrapAll('<div class="'+t.options.classes.panelInner+'" />').parent()),e},s=function(){var i=n.find("."+t.options.classes.contentWrap);return 0===i.length&&(i=n.children(".ui-header:not(:jqmData(position='fixed')), .ui-content:not(:jqmData(role='popup')), .ui-footer:not(:jqmData(position='fixed'))").wrapAll('<div class="'+t.options.classes.contentWrap+" "+a()+'" />').parent(),e.support.cssTransform3d&&t.options.animate&&i.addClass(t.options.classes.animate)),i},r=function(){var i=n.find("."+t.options.classes.contentFixedToolbar);return 0===i.length&&(i=n.find(".ui-header:jqmData(position='fixed'), .ui-footer:jqmData(position='fixed')").addClass(t.options.classes.contentFixedToolbar),e.support.cssTransform3d&&t.options.animate&&i.addClass(t.options.classes.animate)),i};e.extend(this,{_panelID:i.attr("id"),_closeLink:i.find(":jqmData(rel='close')"),_page:i.closest(":jqmData(role='page')"),_pageTheme:a(),_panelInner:o(),_wrapper:s(),_fixedToolbar:r()}),t._addPanelClasses(),t._wrapper.addClass(this.options.classes.contentWrapClosed),t._fixedToolbar.addClass(this.options.classes.contentFixedToolbarClosed),t._page.addClass(t.options.classes.pagePanel),e.support.cssTransform3d&&t.options.animate&&this.element.addClass(t.options.classes.animate),t._bindUpdateLayout(),t._bindCloseEvents(),t._bindLinkListeners(),t._bindPageEvents(),t.options.dismissible&&t._createModal(),t._bindSwipeEvents()},_createModal:function(){var t=this;t._modal=e("<div class='"+t.options.classes.modal+"' data-panelid='"+t._panelID+"'></div>").on("mousedown",function(){t.close()}).appendTo(this._page)},_getPosDisplayClasses:function(e){return e+"-position-"+this.options.position+" "+e+"-display-"+this.options.display},_getPanelClasses:function(){var e=this.options.classes.panel+" "+this._getPosDisplayClasses(this.options.classes.panel)+" "+this.options.classes.panelClosed;return this.options.theme&&(e+=" ui-body-"+this.options.theme),this.options.positionFixed&&(e+=" "+this.options.classes.panelFixed),e},_addPanelClasses:function(){this.element.addClass(this._getPanelClasses())},_bindCloseEvents:function(){var e=this;e._closeLink.on("click.panel",function(t){return t.preventDefault(),e.close(),!1}),e.element.on("click.panel","a:jqmData(ajax='false')",function(){e.close()})},_positionPanel:function(){var t=this,i=t._panelInner.outerHeight(),n=i>e.mobile.getScreenHeight();n||!t.options.positionFixed?(n&&(t._unfixPanel(),e.mobile.resetActivePageHeight(i)),t._scrollIntoView(i)):t._fixPanel()},_scrollIntoView:function(i){e(t).scrollTop()>i&&t.scrollTo(0,0)},_bindFixListener:function(){this._on(e(t),{throttledresize:"_positionPanel"})},_unbindFixListener:function(){this._off(e(t),"throttledresize")},_unfixPanel:function(){this.options.positionFixed&&e.support.fixedPosition&&this.element.removeClass(this.options.classes.panelFixed)},_fixPanel:function(){this.options.positionFixed&&e.support.fixedPosition&&this.element.addClass(this.options.classes.panelFixed)},_bindUpdateLayout:function(){var e=this;e.element.on("updatelayout",function(){e._open&&e._positionPanel()})},_bindLinkListeners:function(){var t=this;t._page.on("click.panel","a",function(i){if(this.href.split("#")[1]===t._panelID&&t._panelID!==n){i.preventDefault();var a=e(this);return a.hasClass("ui-link")||(a.addClass(e.mobile.activeBtnClass),t.element.one("panelopen panelclose",function(){a.removeClass(e.mobile.activeBtnClass)})),t.toggle(),!1}})},_bindSwipeEvents:function(){var e=this,t=e._modal?e.element.add(e._modal):e.element;e.options.swipeClose&&("left"===e.options.position?t.on("swipeleft.panel",function(){e.close()}):t.on("swiperight.panel",function(){e.close()}))},_bindPageEvents:function(){var e=this;e._page.on("panelbeforeopen",function(t){e._open&&t.target!==e.element[0]&&e.close()}).on("pagehide",function(){e._open&&e.close(!0)}).on("keyup.panel",function(t){27===t.keyCode&&e._open&&e.close()})},_open:!1,_contentWrapOpenClasses:null,_fixedToolbarOpenClasses:null,_modalOpenClasses:null,open:function(t){if(!this._open){var i=this,n=i.options,a=function(){i._page.off("panelclose"),i._page.jqmData("panel","open"),!t&&e.support.cssTransform3d&&n.animate?i.element.add(i._wrapper).on(i._transitionEndEvents,o):setTimeout(o,0),i.options.theme&&"overlay"!==i.options.display&&i._page.removeClass(i._pageTheme).addClass("ui-body-"+i.options.theme),i.element.removeClass(n.classes.panelClosed).addClass(n.classes.panelOpen),i._positionPanel(),i.options.theme&&"overlay"!==i.options.display&&i._wrapper.css("min-height",i._page.css("min-height")),i._contentWrapOpenClasses=i._getPosDisplayClasses(n.classes.contentWrap),i._wrapper.removeClass(n.classes.contentWrapClosed).addClass(i._contentWrapOpenClasses+" "+n.classes.contentWrapOpen),i._fixedToolbarOpenClasses=i._getPosDisplayClasses(n.classes.contentFixedToolbar),i._fixedToolbar.removeClass(n.classes.contentFixedToolbarClosed).addClass(i._fixedToolbarOpenClasses+" "+n.classes.contentFixedToolbarOpen),i._modalOpenClasses=i._getPosDisplayClasses(n.classes.modal)+" "+n.classes.modalOpen,i._modal&&i._modal.addClass(i._modalOpenClasses)},o=function(){i.element.add(i._wrapper).off(i._transitionEndEvents,o),i._page.addClass(n.classes.pagePanelOpen),i._bindFixListener(),i._trigger("open")};0>this.element.closest(".ui-page-active").length&&(t=!0),i._trigger("beforeopen"),"open"===i._page.jqmData("panel")?i._page.on("panelclose",function(){a()}):a(),i._open=!0}},close:function(t){if(this._open){var i=this.options,n=this,a=function(){!t&&e.support.cssTransform3d&&i.animate?n.element.add(n._wrapper).on(n._transitionEndEvents,o):setTimeout(o,0),n._page.removeClass(i.classes.pagePanelOpen),n.element.removeClass(i.classes.panelOpen),n._wrapper.removeClass(i.classes.contentWrapOpen),n._fixedToolbar.removeClass(i.classes.contentFixedToolbarOpen),n._modal&&n._modal.removeClass(n._modalOpenClasses)},o=function(){n.options.theme&&"overlay"!==n.options.display&&(n._page.removeClass("ui-body-"+n.options.theme).addClass(n._pageTheme),n._wrapper.css("min-height","")),n.element.add(n._wrapper).off(n._transitionEndEvents,o),n.element.addClass(i.classes.panelClosed),n._wrapper.removeClass(n._contentWrapOpenClasses).addClass(i.classes.contentWrapClosed),n._fixedToolbar.removeClass(n._fixedToolbarOpenClasses).addClass(i.classes.contentFixedToolbarClosed),n._fixPanel(),n._unbindFixListener(),e.mobile.resetActivePageHeight(),n._page.jqmRemoveData("panel"),n._trigger("close")};0>this.element.closest(".ui-page-active").length&&(t=!0),n._trigger("beforeclose"),a(),n._open=!1}},toggle:function(){this[this._open?"close":"open"]()},_transitionEndEvents:"webkitTransitionEnd oTransitionEnd otransitionend transitionend msTransitionEnd",_destroy:function(){var t=this.options.classes,i=this.options.theme,n=this.element.siblings("."+t.panel).length;n?this._open&&(this._wrapper.removeClass(t.contentWrapOpen),this._fixedToolbar.removeClass(t.contentFixedToolbarOpen),this._page.jqmRemoveData("panel"),this._page.removeClass(t.pagePanelOpen),i&&this._page.removeClass("ui-body-"+i).addClass(this._pageTheme)):(this._wrapper.children().unwrap(),this._page.find("a").unbind("panelopen panelclose"),this._page.removeClass(t.pagePanel),this._open&&(this._page.jqmRemoveData("panel"),this._page.removeClass(t.pagePanelOpen),i&&this._page.removeClass("ui-body-"+i).addClass(this._pageTheme),e.mobile.resetActivePageHeight())),this._panelInner.children().unwrap(),this.element.removeClass([this._getPanelClasses(),t.panelAnimate].join(" ")).off("swipeleft.panel swiperight.panel").off("panelbeforeopen").off("panelhide").off("keyup.panel").off("updatelayout"),this._closeLink.off("click.panel"),this._modal&&this._modal.remove(),this.element.off(this._transitionEndEvents).removeClass([t.panelUnfixed,t.panelClosed,t.panelOpen].join(" "))}}),e(i).bind("pagecreate create",function(t){e.mobile.panel.prototype.enhanceWithin(t.target)})}(e),function(e,t){e.widget("mobile.table",e.mobile.widget,{options:{classes:{table:"ui-table"},initSelector:":jqmData(role='table')"},_create:function(){var e=this;e.refresh(!0)},refresh:function(i){var n=this,a=this.element.find("thead tr");i&&this.element.addClass(this.options.classes.table),n.headers=this.element.find("tr:eq(0)").children(),n.allHeaders=n.headers.add(a.children()),a.each(function(){var o=0;e(this).children().each(function(){var s=parseInt(e(this).attr("colspan"),10),r=":nth-child("+(o+1)+")";if(e(this).jqmData("colstart",o+1),s)for(var l=0;s-1>l;l++)o++,r+=", :nth-child("+(o+1)+")";i===t&&e(this).jqmData("cells",""),e(this).jqmData("cells",n.element.find("tr").not(a.eq(0)).not(this).children(r)),o++})}),i===t&&this.element.trigger("refresh")}}),e.mobile.document.bind("pagecreate create",function(t){e.mobile.table.prototype.enhanceWithin(t.target)})}(e),function(e,t){e.mobile.table.prototype.options.mode="columntoggle",e.mobile.table.prototype.options.columnBtnTheme=null,e.mobile.table.prototype.options.columnPopupTheme=null,e.mobile.table.prototype.options.columnBtnText="Columns...",e.mobile.table.prototype.options.classes=e.extend(e.mobile.table.prototype.options.classes,{popup:"ui-table-columntoggle-popup",columnBtn:"ui-table-columntoggle-btn",priorityPrefix:"ui-table-priority-",columnToggleTable:"ui-table-columntoggle"}),e.mobile.document.delegate(":jqmData(role='table')","tablecreate refresh",function(i){var n,a,o,s,r=e(this),l=r.data("mobile-table"),d=i.type,c=l.options,h=e.mobile.ns,u=(r.attr("id")||c.classes.popup)+"-popup";"columntoggle"===c.mode&&("refresh"!==d&&(l.element.addClass(c.classes.columnToggleTable),n=e("<a href='#"+u+"' class='"+c.classes.columnBtn+"' data-"+h+"rel='popup' data-"+h+"mini='true'>"+c.columnBtnText+"</a>"),a=e("<div data-"+h+"role='popup' data-"+h+"role='fieldcontain' class='"+c.classes.popup+"' id='"+u+"'></div>"),o=e("<fieldset data-"+h+"role='controlgroup'></fieldset>")),l.headers.not("td").each(function(t){var i=e(this).jqmData("priority"),n=e(this).add(e(this).jqmData("cells"));i&&(n.addClass(c.classes.priorityPrefix+i),"refresh"!==d?e("<label><input type='checkbox' checked />"+e(this).text()+"</label>").appendTo(o).children(0).jqmData("cells",n).checkboxradio({theme:c.columnPopupTheme}):e("#"+u+" fieldset div:eq("+t+")").find("input").jqmData("cells",n))}),"refresh"!==d&&o.appendTo(a),s=o===t?e("#"+u+" fieldset"):o,"refresh"!==d&&(s.on("change","input",function(){this.checked?e(this).jqmData("cells").removeClass("ui-table-cell-hidden").addClass("ui-table-cell-visible"):e(this).jqmData("cells").removeClass("ui-table-cell-visible").addClass("ui-table-cell-hidden")}),n.insertBefore(r).buttonMarkup({theme:c.columnBtnTheme}),a.insertBefore(r).popup()),l.update=function(){s.find("input").each(function(){this.checked?(this.checked="table-cell"===e(this).jqmData("cells").eq(0).css("display"),"refresh"===d&&e(this).jqmData("cells").addClass("ui-table-cell-visible")):e(this).jqmData("cells").addClass("ui-table-cell-hidden"),e(this).checkboxradio("refresh")})},e.mobile.window.on("throttledresize",l.update),l.update())})}(e),function(e){e.mobile.table.prototype.options.mode="reflow",e.mobile.table.prototype.options.classes=e.extend(e.mobile.table.prototype.options.classes,{reflowTable:"ui-table-reflow",cellLabels:"ui-table-cell-label"}),e.mobile.document.delegate(":jqmData(role='table')","tablecreate refresh",function(t){var i=e(this),n=t.type,a=i.data("mobile-table"),o=a.options;if("reflow"===o.mode){"refresh"!==n&&a.element.addClass(o.classes.reflowTable);var s=e(a.allHeaders.get().reverse());s.each(function(){var t=e(this).jqmData("cells"),i=e(this).jqmData("colstart"),n=t.not(this).filter("thead th").length&&" ui-table-cell-label-top",a=e(this).text();if(""!==a)if(n){var s=parseInt(e(this).attr("colspan"),10),r="";s&&(r="td:nth-child("+s+"n + "+i+")"),t.filter(r).prepend("<b class='"+o.classes.cellLabels+n+"'>"+a+"</b>")}else t.prepend("<b class='"+o.classes.cellLabels+"'>"+a+"</b>")})}})}(e),function(e,t){function i(e){o=e.originalEvent,d=o.accelerationIncludingGravity,s=Math.abs(d.x),r=Math.abs(d.y),l=Math.abs(d.z),!t.orientation&&(s>7||(l>6&&8>r||8>l&&r>6)&&s>5)?c.enabled&&c.disable():c.enabled||c.enable()}e.mobile.iosorientationfixEnabled=!0;var a=navigator.userAgent;if(!(/iPhone|iPad|iPod/.test(navigator.platform)&&/OS [1-5]_[0-9_]* like Mac OS X/i.test(a)&&a.indexOf("AppleWebKit")>-1))return e.mobile.iosorientationfixEnabled=!1,n;var o,s,r,l,d,c=e.mobile.zoom;e.mobile.document.on("mobileinit",function(){e.mobile.iosorientationfixEnabled&&e.mobile.window.bind("orientationchange.iosorientationfix",c.enable).bind("devicemotion.iosorientationfix",i)})}(e,this),function(e,t){function n(){a.removeClass("ui-mobile-rendering")}var a=e("html"),o=(e("head"),e.mobile.window);e(t.document).trigger("mobileinit"),e.mobile.gradeA()&&(e.mobile.ajaxBlacklist&&(e.mobile.ajaxEnabled=!1),a.addClass("ui-mobile ui-mobile-rendering"),setTimeout(n,5e3),e.extend(e.mobile,{initializePage:function(){var t=e.mobile.path,a=e(":jqmData(role='page'), :jqmData(role='dialog')"),s=t.stripHash(t.stripQueryParams(t.parseLocation().hash)),r=i.getElementById(s);a.length||(a=e("body").wrapInner("<div data-"+e.mobile.ns+"role='page'></div>").children(0)),a.each(function(){var t=e(this);t.jqmData("url")||t.attr("data-"+e.mobile.ns+"url",t.attr("id")||location.pathname+location.search)}),e.mobile.firstPage=a.first(),e.mobile.pageContainer=e.mobile.firstPage.parent().addClass("ui-mobile-viewport"),o.trigger("pagecontainercreate"),e.mobile.showPageLoadingMsg(),n(),e.mobile.hashListeningEnabled&&e.mobile.path.isHashValid(location.hash)&&(e(r).is(':jqmData(role="page")')||e.mobile.path.isPath(s)||s===e.mobile.dialogHashKey)?e.event.special.navigate.isPushStateEnabled()?(e.mobile.navigate.history.stack=[],e.mobile.navigate(e.mobile.path.isPath(location.hash)?location.hash:location.href)):o.trigger("hashchange",[!0]):(e.mobile.path.isHashValid(location.hash)&&(e.mobile.urlHistory.initialDst=s.replace("#","")),e.event.special.navigate.isPushStateEnabled()&&e.mobile.navigate.navigator.squash(t.parseLocation().href),e.mobile.changePage(e.mobile.firstPage,{transition:"none",reverse:!0,changeHash:!1,fromHashChange:!0}))}}),e.mobile.navreadyDeferred.resolve(),e(function(){t.scrollTo(0,1),e.mobile.defaultHomeScroll=e.support.scrollTop&&1!==e.mobile.window.scrollTop()?1:0,e.mobile.autoInitializePage&&e.mobile.initializePage(),o.load(e.mobile.silentScroll),e.support.cssPointerEvents||e.mobile.document.delegate(".ui-disabled","vclick",function(e){e.preventDefault(),e.stopImmediatePropagation()})}))}(e,this)});
+//@ sourceMappingURL=jquery.mobile-1.3.1.min.map \ No newline at end of file
diff --git a/themes/smartpocket/js/smartpocket.js b/themes/smartpocket/js/smartpocket.js
index ab7874453..fffb993fd 100644
--- a/themes/smartpocket/js/smartpocket.js
+++ b/themes/smartpocket/js/smartpocket.js
@@ -1,17 +1,33 @@
(function(window, $, PhotoSwipe){
$(document).ready(function(){
+ var more_link
var options = {
jQueryMobile: true,
- imageScaleMethod: "fitNoUpscale"
+ loop: var_loop,
+ captionAndToolbarAutoHideDelay: var_autohide,
+ imageScaleMethod: "fitNoUpscale",
+ getToolbar: function(){
+return '<div class="ps-toolbar-close"><div class="ps-toolbar-content"></div></div><div class="ps-toolbar-play"><div class="ps-toolbar-content"></div></div><div id="more_link">'+var_trad+'</div><div class="ps-toolbar-previous"><div class="ps-toolbar-content"></div></div><div class="ps-toolbar-next"><div class="ps-toolbar-content"></div></div>';},
+ getImageMetaData:function(el){
+ return {
+ picture_url: $(el).attr('data-picture-url')
+ };}
};
- $(".thumbnails a").photoSwipe(options);
- $(document).bind('orientationchange', set_thumbnails_width);
- set_thumbnails_width();
+ var myPhotoSwipe = $(".thumbnails a").photoSwipe(options);
+ // onShow - store a reference to our "more_link" button
+ myPhotoSwipe.addEventHandler(PhotoSwipe.EventTypes.onShow, function(e){
+ more_link = window.document.querySelectorAll('#more_link')[0];
+ });
+ // onToolbarTap - listen out for when the toolbar is tapped
+ myPhotoSwipe.addEventHandler(PhotoSwipe.EventTypes.onToolbarTap, function(e){
+ if (e.toolbarAction === PhotoSwipe.Toolbar.ToolbarAction.none){
+ if (e.tapTarget === more_link || Util.DOM.isChildOf(e.tapTarget, more_link)){
+ var currentImage = myPhotoSwipe.getCurrentImage();
+ window.location=currentImage.metaData.picture_url;
+ }
+ }
+ });
+ var spThumbs = new SPThumbs(SPThumbsOpts);
});
}(window, window.jQuery, window.Code.PhotoSwipe));
-function set_thumbnails_width() {
- nb_thumbs = Math.max(3, Math.ceil($('.thumbnails').width() / 130));
- width = Math.floor(1000000 / nb_thumbs) / 10000;
- $('.thumbnails li').css('width', width+'%');
-} \ No newline at end of file
diff --git a/themes/smartpocket/js/thumb.arrange.js b/themes/smartpocket/js/thumb.arrange.js
new file mode 100644
index 000000000..f43c5d824
--- /dev/null
+++ b/themes/smartpocket/js/thumb.arrange.js
@@ -0,0 +1,170 @@
+
+function SPTLine(margin, rowHeight) {
+ this.elements = new Array;
+ this.margin = margin;
+ this.rowHeight = rowHeight;
+ this.maxHeight = 0;
+}
+
+SPTLine.prototype = {
+ width: 0,
+ elementsWidth: 0,
+ firstThumbIndex: 0,
+
+ add: function($elt, absIndex) {
+ if (this.elements.length === 0)
+ this.firstThumbIndex = absIndex;
+ if (!$elt.data("w"))
+ {
+ var w=$elt.width(), h=$elt.height();
+ if (h > this.rowHeight) {
+ w = Math.round(w * this.rowHeight/h);
+ h = this.rowHeight;
+ }
+ $elt.data("w", w)
+ .data("h", h);
+ }
+
+ var eltObj = {
+ $elt: $elt,
+ w: $elt.data("w"),
+ h: $elt.data("h")
+ };
+ this.elements.push(eltObj);
+
+ if (eltObj.h > this.maxHeight)
+ this.maxHeight = eltObj.h;
+
+ this.width += this.margin + eltObj.w;
+ this.elementsWidth += eltObj.w;
+ },
+
+ clear: function() {
+ if (!this.elements.length) return;
+ this.width = this.elementsWidth = 0;
+ this.maxHeight = 0;
+ this.elements.length = 0;
+ }
+}
+
+
+function SPThumbs(options) {
+ this.opts = options;
+
+ this.$thumbs = $('.thumbnails');
+ if (this.$thumbs.length==0) return;
+ this.$thumbs.css('text-align', 'left');
+
+ this.opts.extraRowHeight = 0;
+ if (window.devicePixelRatio > 1) {
+ var dpr = window.devicePixelRatio;
+ this.opts.extraRowHeight = 6; /*loose sharpness but only for small screens when we could "almost" fit with full sharpness*/
+ this.opts.rowHeight = Math.round(this.opts.rowHeight / dpr ) + this.opts.extraRowHeight;
+ }
+ this.process();
+
+ var that = this;
+ $(window).on('resize', function() {
+ if (Math.abs(that.$thumbs.width() - that.prevContainerWidth)>1)
+ that.process();
+ })
+ .on('RVTS_loaded', function(evt, down) {
+ that.process( down && that.$thumbs.width() == that.prevContainerWidth ? that.prevLastLineFirstThumbIndex : 0);
+ } );
+}
+
+SPThumbs.prototype = {
+ prevContainerWidth:0,
+ prevLastLineFirstThumbIndex: 0,
+
+ process: function(startIndex) {
+ startIndex = startIndex ? startIndex : 0;
+ var containerWidth = this.$thumbs.width()
+ , maxExtraMarginPerThumb = 1;
+ this.prevContainerWidth = containerWidth;
+
+ var $elts = $('li.liVisible>a>img', this.$thumbs)
+ , line = new SPTLine(this.opts.hMargin, this.opts.rowHeight);
+
+ for (var i=startIndex; i<$elts.length; i++) {
+ var $elt = $( $elts[i] );
+
+ line.add($elt, i);
+ if (line.width >= containerWidth - maxExtraMarginPerThumb * line.elements.length) {
+ this.processLine(line, containerWidth);
+ line.clear();
+ }
+ };
+
+ if(line.elements.length)
+ this.processLine(line, containerWidth, true);
+ this.prevLastLineFirstThumbIndex = line.firstThumbIndex;
+ },
+
+ processLine: function(line, containerWidth, lastLine) {
+ var toRecover, eltW, eltH
+ , rowHeight = line.maxHeight ? line.maxHeight : line.elements[0].h;
+
+ if (line.width / containerWidth > 1.01) {
+ var ratio = line.elementsWidth / (line.elementsWidth + containerWidth - line.width);
+ var adjustedRowHeight = rowHeight / (1 + (ratio-1) * 0.95 );
+ adjustedRowHeight = 6 * Math.round( adjustedRowHeight/6 );
+ if (adjustedRowHeight < rowHeight / ratio ) {
+ adjustedRowHeight = Math.ceil( rowHeight / ratio );
+ var missing = this.opts.rowHeight - this.opts.extraRowHeight - adjustedRowHeight;
+ if (missing>0 && missing<6)
+ adjustedRowHeight += missing;
+ }
+ if (adjustedRowHeight < rowHeight)
+ rowHeight = adjustedRowHeight;
+ }
+ else if (lastLine)
+ rowHeight = Math.min( rowHeight, this.opts.rowHeight - this.opts.extraRowHeight);
+
+ toRecover = line.width - containerWidth;
+ if (lastLine)
+ toRecover = 0;
+
+ for(var i=0; i<line.elements.length; i++) {
+ var eltObj = line.elements[i]
+ , eltW=eltObj.w
+ , eltH=eltObj.h
+ , eltToRecover;
+
+ if (i==line.elements.length-1)
+ eltToRecover = toRecover;
+ else
+ eltToRecover = Math.round(toRecover * eltW / line.elementsWidth);
+
+ toRecover -= eltToRecover;
+ line.elementsWidth -= eltW;
+
+ if (eltH > rowHeight ) {
+ eltW = Math.round( eltW * rowHeight/eltObj.h );
+ eltH = rowHeight;
+ eltToRecover -= eltObj.w - eltW;
+ if (lastLine)
+ eltToRecover = 0;
+ }
+
+ this.reposition(eltObj.$elt, eltW, eltH, eltW-eltToRecover, rowHeight);
+ }
+ },
+
+ reposition: function($img, imgW, imgH, liW, liH) {
+ $img.attr("width", imgW)
+ .attr("height", imgH);
+
+ $img.closest("li").css( {
+ width: liW+"px",
+ height: liH+"px"
+ });
+
+ $img.parent("a").css( {
+ left: Math.round((liW-imgW)/2)+"px",
+ top: Math.round((liH-imgH)/2)+"px"
+ });
+ }
+
+}
+
diff --git a/themes/smartpocket/language/bg_BG/index.php b/themes/smartpocket/language/bg_BG/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/themes/smartpocket/language/bg_BG/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/smartpocket/language/bg_BG/theme.lang.php b/themes/smartpocket/language/bg_BG/theme.lang.php
new file mode 100755
index 000000000..170aebdcd
--- /dev/null
+++ b/themes/smartpocket/language/bg_BG/theme.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Loop the slideshow'] = 'Рамка на Ñлайдшоу';
+$lang['Autohide the bar of the slideshow'] = 'Ðвтаматично Ñкрива меню в Ñлайдшоу';
+$lang['Smartpocket, Configuration Page'] = 'Smartpocket, Страница Ñ Ð½Ð°Ñтройки';
+$lang['Slideshow Options'] = 'Опции за Ñлайдшоу';
+$lang['More Information'] = 'Повече информациÑ';
+?> \ No newline at end of file
diff --git a/themes/smartpocket/language/cs_CZ/index.php b/themes/smartpocket/language/cs_CZ/index.php
new file mode 100644
index 000000000..e3365959c
--- /dev/null
+++ b/themes/smartpocket/language/cs_CZ/index.php
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/smartpocket/language/cs_CZ/theme.lang.php b/themes/smartpocket/language/cs_CZ/theme.lang.php
new file mode 100644
index 000000000..58f46876a
--- /dev/null
+++ b/themes/smartpocket/language/cs_CZ/theme.lang.php
@@ -0,0 +1,7 @@
+<?php
+$lang['Smartpocket, Configuration Page'] = 'Smartpocket, Stránka s nastavením';
+$lang['Slideshow Options'] = 'Slideshow nastavení';
+$lang['Loop the slideshow'] = 'Opakovat slideshow ve smyÄce';
+$lang['Autohide the bar of the slideshow'] = 'Automatické skrytí panelu ve slideshow';
+$lang['More Information'] = 'Další Informace';
+?> \ No newline at end of file
diff --git a/themes/smartpocket/language/da_DK/index.php b/themes/smartpocket/language/da_DK/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/themes/smartpocket/language/da_DK/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/smartpocket/language/da_DK/theme.lang.php b/themes/smartpocket/language/da_DK/theme.lang.php
new file mode 100755
index 000000000..82e5ab7da
--- /dev/null
+++ b/themes/smartpocket/language/da_DK/theme.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Autohide the bar of the slideshow'] = 'Autoskjul slideshowbjælken';
+$lang['Loop the slideshow'] = 'Kør slideshowet i en løkke';
+$lang['More Information'] = 'Flere oplysninger';
+$lang['Slideshow Options'] = 'Slideshow-indstillinger';
+$lang['Smartpocket, Configuration Page'] = 'Smartpocket, opsætningsside';
+?> \ No newline at end of file
diff --git a/themes/smartpocket/language/de_DE/index.php b/themes/smartpocket/language/de_DE/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/themes/smartpocket/language/de_DE/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/smartpocket/language/de_DE/theme.lang.php b/themes/smartpocket/language/de_DE/theme.lang.php
new file mode 100755
index 000000000..44ec4a239
--- /dev/null
+++ b/themes/smartpocket/language/de_DE/theme.lang.php
@@ -0,0 +1,27 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Autohide the bar of the slideshow'] = 'Diashow Menüleiste autom. verstecken';
+$lang['Loop the slideshow'] = 'Diashow in Endlosschleife';
+$lang['More Information'] = 'Mehr Informationen';
+$lang['Slideshow Options'] = 'Diashowoptionen';
+?> \ No newline at end of file
diff --git a/themes/smartpocket/language/el_GR/index.php b/themes/smartpocket/language/el_GR/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/themes/smartpocket/language/el_GR/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/smartpocket/language/el_GR/theme.lang.php b/themes/smartpocket/language/el_GR/theme.lang.php
new file mode 100755
index 000000000..b20174897
--- /dev/null
+++ b/themes/smartpocket/language/el_GR/theme.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Smartpocket, Configuration Page'] = 'Smartpocket, ΔιαμόÏφωση σελίδας';
+$lang['Slideshow Options'] = 'Επιλογές slideshow';
+$lang['More Information'] = 'ΠεÏισσότεÏες πληÏοφοÏίες';
+$lang['Loop the slideshow'] = 'Επανάληψη του slideshow';
+$lang['Autohide the bar of the slideshow'] = 'Αυτόματη απόκÏυψη της γÏαμμής του slideshow';
+?> \ No newline at end of file
diff --git a/themes/smartpocket/language/en_UK/index.php b/themes/smartpocket/language/en_UK/index.php
new file mode 100644
index 000000000..e3365959c
--- /dev/null
+++ b/themes/smartpocket/language/en_UK/index.php
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/smartpocket/language/en_UK/theme.lang.php b/themes/smartpocket/language/en_UK/theme.lang.php
new file mode 100644
index 000000000..51aabe3fd
--- /dev/null
+++ b/themes/smartpocket/language/en_UK/theme.lang.php
@@ -0,0 +1,7 @@
+<?php
+$lang['Smartpocket, Configuration Page'] = 'Smartpocket, Configuration Page';
+$lang['Slideshow Options'] = 'Slideshow Options';
+$lang['Loop the slideshow'] = 'Loop the slideshow';
+$lang['Autohide the bar of the slideshow'] = 'Autohide the bar of the slideshow';
+$lang['More Information'] = 'More Information';
+?> \ No newline at end of file
diff --git a/themes/smartpocket/language/eo_EO/index.php b/themes/smartpocket/language/eo_EO/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/themes/smartpocket/language/eo_EO/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/smartpocket/language/eo_EO/theme.lang.php b/themes/smartpocket/language/eo_EO/theme.lang.php
new file mode 100755
index 000000000..c2204af48
--- /dev/null
+++ b/themes/smartpocket/language/eo_EO/theme.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Autohide the bar of the slideshow'] = 'AÅ­tomate kaÅi la breton dum bildoserio';
+$lang['Loop the slideshow'] = 'Iteraci la bildoserion';
+$lang['More Information'] = 'Pli da informo';
+$lang['Slideshow Options'] = 'Bildoseriaj opcioj';
+$lang['Smartpocket, Configuration Page'] = 'Smartpocket, agorda paÄo';
+?> \ No newline at end of file
diff --git a/themes/smartpocket/language/es_ES/index.php b/themes/smartpocket/language/es_ES/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/themes/smartpocket/language/es_ES/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/smartpocket/language/es_ES/theme.lang.php b/themes/smartpocket/language/es_ES/theme.lang.php
new file mode 100755
index 000000000..f6f79cbc4
--- /dev/null
+++ b/themes/smartpocket/language/es_ES/theme.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Autohide the bar of the slideshow'] = 'Ocultar automáticamente la barra de la presentación de diapositivas';
+$lang['Loop the slideshow'] = 'Poner en bucle la presentación de diapositivas';
+$lang['More Information'] = 'Mas información';
+$lang['Slideshow Options'] = 'Opciones de la presentación';
+$lang['Smartpocket, Configuration Page'] = 'Pagina de configración para smartpocket';
+?> \ No newline at end of file
diff --git a/themes/smartpocket/language/et_EE/index.php b/themes/smartpocket/language/et_EE/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/themes/smartpocket/language/et_EE/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/smartpocket/language/et_EE/theme.lang.php b/themes/smartpocket/language/et_EE/theme.lang.php
new file mode 100755
index 000000000..8643ee394
--- /dev/null
+++ b/themes/smartpocket/language/et_EE/theme.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Autohide the bar of the slideshow'] = 'Automaatselt peida slaidikava riba';
+$lang['Loop the slideshow'] = 'Katkematu slaidikava';
+$lang['More Information'] = 'Lisainfo';
+$lang['Slideshow Options'] = 'Slaidikava valikud';
+$lang['Smartpocket, Configuration Page'] = 'Smartpocket\' seaded';
+?> \ No newline at end of file
diff --git a/themes/smartpocket/language/fa_IR/index.php b/themes/smartpocket/language/fa_IR/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/themes/smartpocket/language/fa_IR/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/smartpocket/language/fa_IR/theme.lang.php b/themes/smartpocket/language/fa_IR/theme.lang.php
new file mode 100755
index 000000000..afd0f7f25
--- /dev/null
+++ b/themes/smartpocket/language/fa_IR/theme.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Loop the slideshow'] = 'حلقه تصاویر به صورت خودکار';
+$lang['Slideshow Options'] = 'گزینه نمایش به صورت اسلاید';
+$lang['Autohide the bar of the slideshow'] = 'مخÙÛŒ شونده خودکار نوار از تصاویر به صورت خودکار';
+$lang['More Information'] = 'اطلاعات بیشتر';
+$lang['Smartpocket, Configuration Page'] = 'SmartpocketØŒ پیکربندی صÙحه';
+?> \ No newline at end of file
diff --git a/themes/smartpocket/language/fi_FI/index.php b/themes/smartpocket/language/fi_FI/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/themes/smartpocket/language/fi_FI/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/smartpocket/language/fi_FI/theme.lang.php b/themes/smartpocket/language/fi_FI/theme.lang.php
new file mode 100755
index 000000000..2207bcbd8
--- /dev/null
+++ b/themes/smartpocket/language/fi_FI/theme.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Autohide the bar of the slideshow'] = 'Piilota palkki diaesityksestä automaattisesti';
+$lang['Loop the slideshow'] = 'Toista diaesitys automaattisesti uudelleen';
+$lang['More Information'] = 'Lisätietoja';
+$lang['Slideshow Options'] = 'Diaesityksen valinnat';
+$lang['Smartpocket, Configuration Page'] = 'Smartpocket, valintasivu';
+?> \ No newline at end of file
diff --git a/themes/smartpocket/language/fr_CA/index.php b/themes/smartpocket/language/fr_CA/index.php
new file mode 100644
index 000000000..e3365959c
--- /dev/null
+++ b/themes/smartpocket/language/fr_CA/index.php
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/smartpocket/language/fr_CA/theme.lang.php b/themes/smartpocket/language/fr_CA/theme.lang.php
new file mode 100644
index 000000000..322ac7714
--- /dev/null
+++ b/themes/smartpocket/language/fr_CA/theme.lang.php
@@ -0,0 +1,7 @@
+<?php
+$lang['Smartpocket, Configuration Page'] = 'Smartpocket, Page de configuration';
+$lang['Slideshow Options'] = 'Options du diaporama';
+$lang['Loop the slideshow'] = 'Boucler le diaporama';
+$lang['Autohide the bar of the slideshow'] = 'Cacher automatiquement la barre du diaporama';
+$lang['More Information'] = 'Plus d\'informations';
+?> \ No newline at end of file
diff --git a/themes/smartpocket/language/fr_FR/index.php b/themes/smartpocket/language/fr_FR/index.php
new file mode 100644
index 000000000..e3365959c
--- /dev/null
+++ b/themes/smartpocket/language/fr_FR/index.php
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/smartpocket/language/fr_FR/theme.lang.php b/themes/smartpocket/language/fr_FR/theme.lang.php
new file mode 100644
index 000000000..322ac7714
--- /dev/null
+++ b/themes/smartpocket/language/fr_FR/theme.lang.php
@@ -0,0 +1,7 @@
+<?php
+$lang['Smartpocket, Configuration Page'] = 'Smartpocket, Page de configuration';
+$lang['Slideshow Options'] = 'Options du diaporama';
+$lang['Loop the slideshow'] = 'Boucler le diaporama';
+$lang['Autohide the bar of the slideshow'] = 'Cacher automatiquement la barre du diaporama';
+$lang['More Information'] = 'Plus d\'informations';
+?> \ No newline at end of file
diff --git a/themes/smartpocket/language/it_IT/index.php b/themes/smartpocket/language/it_IT/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/themes/smartpocket/language/it_IT/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/smartpocket/language/it_IT/theme.lang.php b/themes/smartpocket/language/it_IT/theme.lang.php
new file mode 100755
index 000000000..a369eff15
--- /dev/null
+++ b/themes/smartpocket/language/it_IT/theme.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Autohide the bar of the slideshow'] = 'Nascondi automaticamente barra slideshow';
+$lang['Loop the slideshow'] = 'Ciclica lo slideshow';
+$lang['Slideshow Options'] = 'Opzioni slideshow';
+$lang['Smartpocket, Configuration Page'] = 'Smartpocket, Pagina Configurazione';
+$lang['More Information'] = 'Ulteriori informazioni';
+?> \ No newline at end of file
diff --git a/themes/smartpocket/language/lv_LV/index.php b/themes/smartpocket/language/lv_LV/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/themes/smartpocket/language/lv_LV/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/smartpocket/language/lv_LV/theme.lang.php b/themes/smartpocket/language/lv_LV/theme.lang.php
new file mode 100755
index 000000000..76d5838aa
--- /dev/null
+++ b/themes/smartpocket/language/lv_LV/theme.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Smartpocket, Configuration Page'] = 'Smartpocket, KonfigurÄcijas lapa';
+$lang['Autohide the bar of the slideshow'] = 'AutomÄtiski paslÄ“pt slaidrÄdes izvÄ“lni';
+$lang['Slideshow Options'] = 'SlaidrÄdes opcijas';
+$lang['More Information'] = 'VairÄk informÄcijas';
+$lang['Loop the slideshow'] = 'IeciklÄ“t slaidrÄdi';
+?> \ No newline at end of file
diff --git a/themes/smartpocket/language/mn_MN/index.php b/themes/smartpocket/language/mn_MN/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/themes/smartpocket/language/mn_MN/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/smartpocket/language/mn_MN/theme.lang.php b/themes/smartpocket/language/mn_MN/theme.lang.php
new file mode 100755
index 000000000..ab18ad31e
--- /dev/null
+++ b/themes/smartpocket/language/mn_MN/theme.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Autohide the bar of the slideshow'] = 'Слайдшоу-ний цÑÑийг автоматаар нуух';
+$lang['Loop the slideshow'] = 'Слайдшоуг давтах';
+$lang['More Information'] = 'ДÑлгÑÑ€Ñнгүй';
+$lang['Slideshow Options'] = 'Слайдшоу-ний тохиргоо';
+$lang['Smartpocket, Configuration Page'] = 'Smartpocket Тохиргооны хуудаÑ';
+?> \ No newline at end of file
diff --git a/themes/smartpocket/language/nb_NO/index.php b/themes/smartpocket/language/nb_NO/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/themes/smartpocket/language/nb_NO/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/smartpocket/language/nb_NO/theme.lang.php b/themes/smartpocket/language/nb_NO/theme.lang.php
new file mode 100755
index 000000000..c392e9744
--- /dev/null
+++ b/themes/smartpocket/language/nb_NO/theme.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Autohide the bar of the slideshow'] = 'Automatisk skjul linjen på lysbildefremvisningen';
+$lang['Loop the slideshow'] = 'Repeter lysbildefremvisningen';
+$lang['More Information'] = 'Mer informasjon';
+$lang['Slideshow Options'] = 'Innstillinger på lysbildefremvisning';
+$lang['Smartpocket, Configuration Page'] = 'Smartpocket, innstillinger';
+?> \ No newline at end of file
diff --git a/themes/smartpocket/language/nl_NL/index.php b/themes/smartpocket/language/nl_NL/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/themes/smartpocket/language/nl_NL/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/smartpocket/language/nl_NL/theme.lang.php b/themes/smartpocket/language/nl_NL/theme.lang.php
new file mode 100755
index 000000000..2e960f8de
--- /dev/null
+++ b/themes/smartpocket/language/nl_NL/theme.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Loop the slideshow'] = 'Continu herhalen diashow';
+$lang['Slideshow Options'] = 'Diashow-opties';
+$lang['Autohide the bar of the slideshow'] = 'Verberg automatisch de diashow-balk';
+$lang['More Information'] = 'Meer informatie';
+$lang['Smartpocket, Configuration Page'] = 'Smartpocket, instellingenpagina';
+?> \ No newline at end of file
diff --git a/themes/smartpocket/language/pt_BR/index.php b/themes/smartpocket/language/pt_BR/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/themes/smartpocket/language/pt_BR/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/smartpocket/language/pt_BR/theme.lang.php b/themes/smartpocket/language/pt_BR/theme.lang.php
new file mode 100755
index 000000000..e010e6c37
--- /dev/null
+++ b/themes/smartpocket/language/pt_BR/theme.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Autohide the bar of the slideshow'] = 'Auto ocultar a barra do show de slides';
+$lang['Loop the slideshow'] = 'Passe o show de slides';
+$lang['More Information'] = 'Mais Informações';
+$lang['Slideshow Options'] = 'Opções do show de slide';
+$lang['Smartpocket, Configuration Page'] = 'Bolso inteligente, Página de configuração';
+?> \ No newline at end of file
diff --git a/themes/smartpocket/language/pt_PT/index.php b/themes/smartpocket/language/pt_PT/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/themes/smartpocket/language/pt_PT/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/smartpocket/language/pt_PT/theme.lang.php b/themes/smartpocket/language/pt_PT/theme.lang.php
new file mode 100755
index 000000000..32ff04e01
--- /dev/null
+++ b/themes/smartpocket/language/pt_PT/theme.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Autohide the bar of the slideshow'] = 'Auto esconder a barra do slide show';
+$lang['Loop the slideshow'] = 'Passar o slide show';
+$lang['More Information'] = 'Mais informação';
+$lang['Slideshow Options'] = 'Opções de slide show';
+$lang['Smartpocket, Configuration Page'] = 'Smartpocket - Página de configuração';
+?> \ No newline at end of file
diff --git a/themes/smartpocket/language/ru_RU/index.php b/themes/smartpocket/language/ru_RU/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/themes/smartpocket/language/ru_RU/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/smartpocket/language/ru_RU/theme.lang.php b/themes/smartpocket/language/ru_RU/theme.lang.php
new file mode 100755
index 000000000..41c4b84ce
--- /dev/null
+++ b/themes/smartpocket/language/ru_RU/theme.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Autohide the bar of the slideshow'] = 'ÐвтоматичеÑки Ñкрывать панель Ñлайд-шоу';
+$lang['Loop the slideshow'] = 'Цикличное повторение Ñлайд-шоу';
+$lang['More Information'] = 'Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ';
+$lang['Slideshow Options'] = 'Функции Ñлайд-щоу';
+$lang['Smartpocket, Configuration Page'] = 'Страница конфигурации Smartpocket';
+?> \ No newline at end of file
diff --git a/themes/smartpocket/language/sk_SK/index.php b/themes/smartpocket/language/sk_SK/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/themes/smartpocket/language/sk_SK/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/smartpocket/language/sk_SK/theme.lang.php b/themes/smartpocket/language/sk_SK/theme.lang.php
new file mode 100755
index 000000000..2c6fa595f
--- /dev/null
+++ b/themes/smartpocket/language/sk_SK/theme.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Autohide the bar of the slideshow'] = 'Automatické skrývanie panela prezentácie';
+$lang['Loop the slideshow'] = 'Opakovať prezentácie';
+$lang['Slideshow Options'] = 'Možnosti prezentácie';
+$lang['Smartpocket, Configuration Page'] = 'Smartpocket, stránka konfigurácie';
+$lang['More Information'] = 'Viac informácií';
+?> \ No newline at end of file
diff --git a/themes/smartpocket/language/ta_IN/index.php b/themes/smartpocket/language/ta_IN/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/themes/smartpocket/language/ta_IN/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/smartpocket/language/ta_IN/theme.lang.php b/themes/smartpocket/language/ta_IN/theme.lang.php
new file mode 100755
index 000000000..4dd0452ce
--- /dev/null
+++ b/themes/smartpocket/language/ta_IN/theme.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Smartpocket, Configuration Page'] = 'ஸà¯à®®à®¾à®°à¯à®Ÿà¯ பாகà¯à®•à¯†à®Ÿà¯,கடà¯à®Ÿà®®à¯ˆà®ªà¯à®ªà¯ பகà¯à®•à®®à¯';
+$lang['Slideshow Options'] = 'படவிலà¯à®²à¯ˆ விரà¯à®ªà¯à®ªà®™à¯à®•à®³à¯';
+$lang['More Information'] = 'மேலà¯à®®à¯ தகவலà¯à®•à¯à®•à¯';
+$lang['Loop the slideshow'] = 'வளைய படவிலà¯à®²à¯ˆ';
+$lang['Autohide the bar of the slideshow'] = 'படவிலà¯à®²à¯ˆ படà¯à®Ÿà®¿à®¯à®¿à®²à¯ தானாக மறை';
+?> \ No newline at end of file
diff --git a/themes/smartpocket/language/tr_TR/index.php b/themes/smartpocket/language/tr_TR/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/themes/smartpocket/language/tr_TR/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/smartpocket/language/tr_TR/theme.lang.php b/themes/smartpocket/language/tr_TR/theme.lang.php
new file mode 100755
index 000000000..176097554
--- /dev/null
+++ b/themes/smartpocket/language/tr_TR/theme.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Autohide the bar of the slideshow'] = 'Slayt gösterisi çubuğunu otomatik gizle';
+$lang['Loop the slideshow'] = 'Slayt gösterisini sürekli döndür';
+$lang['More Information'] = 'Daha fazla bilgi';
+$lang['Slideshow Options'] = 'Slayt gösterisi Seçenekleri';
+$lang['Smartpocket, Configuration Page'] = 'Smartpocket, Yapılandırma Sayfası';
+?> \ No newline at end of file
diff --git a/themes/smartpocket/language/vi_VN/index.php b/themes/smartpocket/language/vi_VN/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/themes/smartpocket/language/vi_VN/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/smartpocket/language/vi_VN/theme.lang.php b/themes/smartpocket/language/vi_VN/theme.lang.php
new file mode 100755
index 000000000..c7517ff2b
--- /dev/null
+++ b/themes/smartpocket/language/vi_VN/theme.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Autohide the bar of the slideshow'] = 'Tự động ẩn thanh công cụ khi trình chiếu';
+$lang['Loop the slideshow'] = 'Lặp lại trình chiếu';
+$lang['More Information'] = 'Thêm thông tin';
+$lang['Slideshow Options'] = 'Các tùy chá»n trình chiếu';
+$lang['Smartpocket, Configuration Page'] = 'Ví thông minh, Trang cấu hình';
+?> \ No newline at end of file
diff --git a/themes/smartpocket/language/zh_HK/index.php b/themes/smartpocket/language/zh_HK/index.php
new file mode 100644
index 000000000..ec6605317
--- /dev/null
+++ b/themes/smartpocket/language/zh_HK/index.php
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
diff --git a/themes/smartpocket/language/zh_HK/theme.lang.php b/themes/smartpocket/language/zh_HK/theme.lang.php
new file mode 100755
index 000000000..954457adf
--- /dev/null
+++ b/themes/smartpocket/language/zh_HK/theme.lang.php
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | 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 |
+// | |
+// | This program is distributed in the hope that it will be useful, but |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+// | General Public License for more details. |
+// | |
+// | You should have received a copy of the GNU General Public License |
+// | along with this program; if not, write to the Free Software |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA. |
+// +-----------------------------------------------------------------------+
+$lang['Autohide the bar of the slideshow'] = '自動隱è—幻燈片欄';
+$lang['Loop the slideshow'] = '幻燈片循環播放';
+$lang['More Information'] = '更多信æ¯';
+$lang['Slideshow Options'] = '幻燈片é¸é …';
+$lang['Smartpocket, Configuration Page'] = 'Smartpocket,é…ç½®é ';
+?> \ No newline at end of file
diff --git a/themes/smartpocket/template/about.tpl b/themes/smartpocket/template/about.tpl
new file mode 100644
index 000000000..847330d0f
--- /dev/null
+++ b/themes/smartpocket/template/about.tpl
@@ -0,0 +1,15 @@
+{include file='infos_errors.tpl'}
+<div data-role="content">
+ <ul data-role="listview" data-inset="true">
+ <li data-role="list-divider">{'About'|@translate}</li>
+ <li>{$ABOUT_MESSAGE}</li>
+ {if isset($THEME_ABOUT) }
+ <li>{$THEME_ABOUT}</li>
+ {/if}
+ {if not empty($about_msgs)}
+ {foreach from=$about_msgs item=elt}
+ <li>{$elt}</li>
+ {/foreach}
+ {/if}
+ </ul>
+</div>
diff --git a/themes/smartpocket/template/add_menu_on_public_pages.tpl b/themes/smartpocket/template/add_menu_on_public_pages.tpl
new file mode 100644
index 000000000..7a44575d2
--- /dev/null
+++ b/themes/smartpocket/template/add_menu_on_public_pages.tpl
@@ -0,0 +1,3 @@
+<div data-role="panel" id="menubar" data-position="right" data-display="overlay">
+ {$MENUBAR}
+</div>{assign var='MENUBAR' value=''} \ No newline at end of file
diff --git a/themes/smartpocket/template/comment_list.tpl b/themes/smartpocket/template/comment_list.tpl
new file mode 100644
index 000000000..1434939bf
--- /dev/null
+++ b/themes/smartpocket/template/comment_list.tpl
@@ -0,0 +1,12 @@
+<ul data-role="listview" data-inset="true">
+ <li data-role="list-divider">{'User comments'|@translate}</li>
+{foreach from=$comments item=comment name=comment_loop}
+ <li>
+ {if !isset($from) or $from!="picture"}<a href="{$comment.U_PICTURE}">
+ <img src="{$pwg->derivative_url($thumbnail_derivative_params, $comment.src_image)}">{/if}
+ <h3>{$comment.AUTHOR}</h3>
+ <p>{$comment.CONTENT}</p>
+ {if !isset($from) or $from!="comment"}</a>{/if}
+ </li>
+{/foreach}
+</ul>
diff --git a/themes/smartpocket/template/comments.tpl b/themes/smartpocket/template/comments.tpl
new file mode 100644
index 000000000..87328d5ac
--- /dev/null
+++ b/themes/smartpocket/template/comments.tpl
@@ -0,0 +1,9 @@
+{include file='infos_errors.tpl'}
+<div data-role="content">
+
+{if isset($comments)}
+ {include file='comment_list.tpl' comment_derivative_params=$derivative_params}
+{/if}
+
+</div> <!-- content -->
+
diff --git a/themes/smartpocket/template/footer.tpl b/themes/smartpocket/template/footer.tpl
index 27f3190c1..2ceefecf9 100644
--- a/themes/smartpocket/template/footer.tpl
+++ b/themes/smartpocket/template/footer.tpl
@@ -1,7 +1,9 @@
{if !empty($thumb_navbar)}
{include file='navigation_bar.tpl'|@get_extent:'navbar' navbar=$thumb_navbar}
+{elseif !empty($navbar) and !isset($ELEMENT_CONTENT)}
+{include file='navigation_bar.tpl'|@get_extent:'navbar'}
{else}
-<div class="pwg_footer ui-bar-a">
+<div data-role="footer" class="pwg_footer">
<h6>
{'Powered by'|@translate} <a href="{$PHPWG_URL}" class="Piwigo">Piwigo</a>
{$VERSION}
diff --git a/themes/smartpocket/template/header.tpl b/themes/smartpocket/template/header.tpl
index 2723ad29e..8df97c3b3 100644
--- a/themes/smartpocket/template/header.tpl
+++ b/themes/smartpocket/template/header.tpl
@@ -38,7 +38,6 @@
{get_combined_scripts load='header'}
-{combine_script id='jquery' path='themes/smartpocket/js/jquery-1.6.4.min.js'}
{combine_script id='config' path='themes/smartpocket/js/config.js' require='jquery'}
{combine_script id='jquery.mobile' path='themes/smartpocket/js/jquery.mobile.min.js' require='jquery,config'}
@@ -46,12 +45,14 @@
<body>
<div data-role="page" data-theme="a">
-
+{if isset($MENUBAR)}<div data-role="panel" id="menubar" data-position="right" data-display="overlay">
+ {$MENUBAR}
+</div>{/if}
<div data-role="header">
<div class="title">
<a href="{$U_HOME}" class="home_button" data-icon="home" data-iconpos="notext" data-role="button"></a>
{$GALLERY_TITLE}
- <span class="menubar">{$MENUBAR}</span>
+ <a href="#menubar" data-icon="grid" data-iconpos="notext" data-role="button" style="float: right" >Menu</a>
</div>
</div>
diff --git a/themes/smartpocket/template/index.tpl b/themes/smartpocket/template/index.tpl
index 6793bc493..4e3159396 100644
--- a/themes/smartpocket/template/index.tpl
+++ b/themes/smartpocket/template/index.tpl
@@ -1,5 +1,11 @@
-<div data-role="content" data-theme="a">
+<div data-role="content">
{if !empty($CATEGORIES)}{$CATEGORIES}{/if}
{if !empty($THUMBNAILS)}{$THUMBNAILS}{/if}
+{if !empty($CONTENT_DESCRIPTION)}
+<div class="additional_info">
+ {$CONTENT_DESCRIPTION}
+</div>
+{/if}
+{if !empty($CONTENT)}{$CONTENT}{/if}
</div>
diff --git a/themes/smartpocket/template/menubar.tpl b/themes/smartpocket/template/menubar.tpl
index 734ede2da..dded4611f 100644
--- a/themes/smartpocket/template/menubar.tpl
+++ b/themes/smartpocket/template/menubar.tpl
@@ -1,33 +1,22 @@
-<select name="identification" id="identification" data-icon="grid" data-iconpos="notext" data-native-menu="false">
-
- <option></option>
- <optgroup label="{'Identification'|@translate}">
-
- {if isset($U_REGISTER)}
- <option value="{$U_REGISTER}">{'Register'|@translate}</option>
- {/if}
- {if isset($U_LOGIN)}
- <option value="{$U_LOGIN}">{'Login'|@translate}</option>
- {/if}
- {if isset($U_LOGOUT)}
- <option value="{$U_LOGOUT}">{'Logout'|@translate}</option>
- {/if}
- {if isset($U_PROFILE)}
- <option value="{$U_PROFILE}">{'Customize'|@translate}</option>
- {/if}
- {if isset($U_ADMIN)}
- <option value="{$U_ADMIN}">{'Administration'|@translate}</option>
- {/if}
-
- </optgroup>
-
-</select>
-
-{footer_script}{literal}
-$(document).ready(function() {
- $('#identification').change(function() {
- $(this).selectmenu('close');
- window.location = this.value;
- });
-});
-{/literal}{/footer_script}
+<ul data-role="listview">
+ <li data-icon="delete"><a href="#menubar" data-rel="close">{'Close'|@translate}</a></li>
+</ul>
+{if !empty($blocks) }
+<div data-role="collapsible-set" data-inset="false">
+ {foreach from=$blocks key=id item=block}
+ <div data-role="collapsible" data-inset="false" data-icon="false">
+ {if not empty($block->template)}
+ {include file=$block->template assign=the_block|@get_extent:$id}
+ {$the_block|replace:'dt':'h3'|replace:'<dd>':''|replace:'</dd>':''}
+ {else}
+ {$block->raw_content|replace:'dt':'h3'|replace:'<dd>':''|replace:'</dd>':''}
+ {/if}
+ </div>
+ {/foreach}
+</div>
+{/if}
+<br>
+<ul data-role="listview">
+ <li data-role="list-divider">{'View in'|@translate}</li>
+ <li><a href="{$TOGGLE_MOBILE_THEME_URL}">{'Desktop'|@translate}</a></li>
+</ul>
diff --git a/themes/smartpocket/template/menubar_categories.tpl b/themes/smartpocket/template/menubar_categories.tpl
new file mode 100644
index 000000000..1fc4332f6
--- /dev/null
+++ b/themes/smartpocket/template/menubar_categories.tpl
@@ -0,0 +1,8 @@
+<h3>{'Albums'|@translate}</h3>
+<ul data-role="listview">
+{foreach from=$block->data.MENU_CATEGORIES item=cat}
+ <li><a href="{$cat.URL}" {if $cat.IS_UPPERCAT}rel="up"{/if} title="{$cat.TITLE}">{$cat.NAME}</a>
+ {if $cat.count_images > 0}<span class="ui-li-count">{$cat.count_images}</span>{/if}
+ </li>
+{/foreach}
+</ul>
diff --git a/themes/smartpocket/template/menubar_identification.tpl b/themes/smartpocket/template/menubar_identification.tpl
new file mode 100644
index 000000000..256aa77fc
--- /dev/null
+++ b/themes/smartpocket/template/menubar_identification.tpl
@@ -0,0 +1,8 @@
+<h3>{'Identification'|@translate}</h3>
+<ul data-role="listview">
+ {if isset($U_REGISTER)}<li><a href="{$U_REGISTER}">{'Register'|@translate}</a></li>{/if}
+ {if isset($U_LOGIN)}<li><a href="{$U_LOGIN}">{'Login'|@translate}</a></li>{/if}
+ {if isset($U_LOGOUT)}<li><a href="{$U_LOGOUT}">{'Logout'|@translate}</a></li>{/if}
+ {if isset($U_PROFILE)}<li><a href="{$U_PROFILE}">{'Customize'|@translate}</a></li>{/if}
+ {if isset($U_ADMIN)}<li><a href="{$U_ADMIN}">{'Administration'|@translate}</a></li>{/if}
+</ul>
diff --git a/themes/smartpocket/template/menubar_links.tpl b/themes/smartpocket/template/menubar_links.tpl
new file mode 100644
index 000000000..6bd110032
--- /dev/null
+++ b/themes/smartpocket/template/menubar_links.tpl
@@ -0,0 +1,11 @@
+<h3>{'Links'|@translate}</h3>
+<ul data-role="listview">{strip}
+ {foreach from=$block->data item=link}
+ <li>
+ <a href="{$link.URL}" class="external"{if isset($link.new_window)} onclick="window.open(this.href, '{$link.new_window.NAME}','{$link.new_window.FEATURES}'); return false;"{/if}>
+ {$link.LABEL}
+ </a>
+ </li>
+ {/foreach}
+ {/strip}
+</ul>
diff --git a/themes/smartpocket/template/menubar_menu.tpl b/themes/smartpocket/template/menubar_menu.tpl
new file mode 100644
index 000000000..a45c5e0c0
--- /dev/null
+++ b/themes/smartpocket/template/menubar_menu.tpl
@@ -0,0 +1,8 @@
+<h3>{'Menu'|@translate}</h3>
+<ul data-role="listview">
+ {foreach from=$block->data item=link}
+ {if is_array($link)}
+ <li><a href="{$link.URL}" title="{$link.TITLE}"{if isset($link.REL)} {$link.REL}{/if}>{$link.NAME}</a>{if isset($link.COUNTER)}<span class="ui-li-count">{$link.COUNTER}</span>{/if}</li>
+ {/if}
+ {/foreach}
+</ul> \ No newline at end of file
diff --git a/themes/smartpocket/template/menubar_specials.tpl b/themes/smartpocket/template/menubar_specials.tpl
new file mode 100644
index 000000000..21bf18a7b
--- /dev/null
+++ b/themes/smartpocket/template/menubar_specials.tpl
@@ -0,0 +1,8 @@
+<h3>{'Specials'|@translate}</h3>
+<ul data-role="listview">
+ {foreach $block->data as $key=>$link}
+ {if in_array($key, array("favorites","most_visited","best_rated","recent_pics","recent_cats","random")) }
+ <li><a href="{$link.URL}" title="{$link.TITLE}"{if isset($link.REL)} {$link.REL}{/if}>{$link.NAME}</a></li>
+ {/if}
+ {/foreach}
+</ul>
diff --git a/themes/smartpocket/template/menubar_tags.tpl b/themes/smartpocket/template/menubar_tags.tpl
new file mode 100644
index 000000000..3f9680054
--- /dev/null
+++ b/themes/smartpocket/template/menubar_tags.tpl
@@ -0,0 +1,12 @@
+<h3>{'Related tags'|@translate}</h3>
+<ul data-role="listview">
+ {foreach from=$block->data item=tag}
+ <li><a class="tagLevel{$tag.level}" href=
+ {if isset($tag.U_ADD)}
+ "{$tag.U_ADD}" title="{$tag.counter|@translate_dec:'%d photo is also linked to current tags':'%d photos are also linked to current tags'}" rel="nofollow">+
+ {else}
+ "{$tag.URL}" title="{'display photos linked to this tag'|@translate}">
+ {/if}
+ {$tag.name}</a></li>
+ {/foreach}
+</ul>
diff --git a/themes/smartpocket/template/navigation_bar.tpl b/themes/smartpocket/template/navigation_bar.tpl
index 2dfbbe950..5347f6847 100644
--- a/themes/smartpocket/template/navigation_bar.tpl
+++ b/themes/smartpocket/template/navigation_bar.tpl
@@ -1,5 +1,5 @@
{capture}{$navbar.pages|@end}{/capture}
-<div class="ui-bar ui-bar-a" style="text-align:center;">
+<div data-role="footer" class="ui-bar ui-bar-a" style="text-align:center;">
<div data-role="controlgroup" data-type="horizontal">
{strip}
{if isset($navbar.URL_PREV)}
diff --git a/themes/smartpocket/template/notification.tpl b/themes/smartpocket/template/notification.tpl
new file mode 100644
index 000000000..b38aac8e6
--- /dev/null
+++ b/themes/smartpocket/template/notification.tpl
@@ -0,0 +1,13 @@
+{html_head}
+<link rel="alternate" type="application/rss+xml" title="{'Photos only RSS feed'|@translate}" href="{$U_FEED_IMAGE_ONLY}">
+<link rel="alternate" type="application/rss+xml" title="{'Complete RSS feed (photos, comments)'|@translate}" href="{$U_FEED}">
+{/html_head}
+{include file='infos_errors.tpl'}
+<div data-role="content">
+ <ul data-role="listview" data-inset="true">
+ <li data-role="list-divider">{'Notification'|@translate}</li>
+ <li>{'The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'|@translate}</li>
+ <li><a href="{$U_FEED_IMAGE_ONLY}">{'Photos only RSS feed'|@translate}</a></li>
+ <li><a href="{$U_FEED}">{'Complete RSS feed (photos, comments)'|@translate}</a></li>
+ </ul>
+</div>
diff --git a/themes/smartpocket/template/picture.tpl b/themes/smartpocket/template/picture.tpl
new file mode 100644
index 000000000..164aae15e
--- /dev/null
+++ b/themes/smartpocket/template/picture.tpl
@@ -0,0 +1,175 @@
+{if isset($errors) or not empty($infos)}
+{include file='infos_errors.tpl'}
+{/if}
+<div data-role="content" id="picture_page">
+<ul data-role="listview" data-inset="true">
+ <li data-role="list-divider">{$SECTION_TITLE}<span class="browsePathSeparator">{$LEVEL_SEPARATOR}</span>{$current.TITLE}</li>
+</ul>
+{$ELEMENT_CONTENT}
+
+{include file='picture_nav_buttons.tpl'|@get_extent:'picture_nav_buttons'}
+
+{if isset($COMMENT_IMG)}
+<p class="imageComment">{$COMMENT_IMG}</p>
+{/if}
+
+<ul data-role="listview" data-inset="true" id="PictureInfo">
+{strip}
+ {if $display_info.author and isset($INFO_AUTHOR)}
+ <li id="Author" class="imageInfo">
+ <dt>{'Author'|@translate}</dt>
+ <dd>{$INFO_AUTHOR}</dd>
+ </li>
+ {/if}
+ {if $display_info.created_on and isset($INFO_CREATION_DATE)}
+ <li id="datecreate" class="imageInfo">
+ <dt>{'Created on'|@translate}</dt>
+ <dd>{$INFO_CREATION_DATE}</dd>
+ </li>
+ {/if}
+ {if $display_info.posted_on}
+ <li id="datepost" class="imageInfo">
+ <dt>{'Posted on'|@translate}</dt>
+ <dd>{$INFO_POSTED_DATE}</dd>
+ </li>
+ {/if}
+ {if $display_info.dimensions and isset($INFO_DIMENSIONS)}
+ <li id="Dimensions" class="imageInfo">
+ <dt>{'Dimensions'|@translate}</dt>
+ <dd>{$INFO_DIMENSIONS}</dd>
+ </li>
+ {/if}
+ {if $display_info.file}
+ <li id="File" class="imageInfo">
+ <dt>{'File'|@translate}</dt>
+ <dd>{$INFO_FILE}</dd>
+ </li>
+ {/if}
+ {if $display_info.filesize and isset($INFO_FILESIZE)}
+ <li id="Filesize" class="imageInfo">
+ <dt>{'Filesize'|@translate}</dt>
+ <dd>{$INFO_FILESIZE}</dd>
+ </li>
+ {/if}
+ {if $display_info.tags and isset($related_tags)}
+ <li id="Tags" class="imageInfo">
+ <dt>{'Tags'|@translate}</dt>
+ <dd>
+ {foreach from=$related_tags item=tag name=tag_loop}{if !$smarty.foreach.tag_loop.first}, {/if}<a href="{$tag.URL}">{$tag.name}</a>{/foreach}
+ </dd>
+ </li>
+ {/if}
+ {if $display_info.categories and isset($related_categories)}
+ <li id="Categories" class="imageInfo">
+ <dt>{'Albums'|@translate}</dt>
+ <dd>
+ <ul>
+ {foreach from=$related_categories item=cat}
+ <li>{$cat}</li>
+ {/foreach}
+ </ul>
+ </dd>
+ </li>
+ {/if}
+ {if $display_info.visits}
+ <li id="Visits" class="imageInfo">
+ <dt>{'Visits'|@translate}</dt>
+ <dd>{$INFO_VISITS}</dd>
+ </li>
+ {/if}
+
+{if $display_info.rating_score and isset($rate_summary)}
+ <li id="Average" class="imageInfo">
+ <dt>{'Rating score'|@translate}</dt>
+ <dd>
+ {if $rate_summary.count}
+ <span id="ratingScore">{$rate_summary.score}</span> <span id="ratingCount">({$rate_summary.count|@translate_dec:'%d rate':'%d rates'})</span>
+ {else}
+ <span id="ratingScore">{'no rate'|@translate}</span> <span id="ratingCount"></span>
+ {/if}
+ </dd>
+ </li>
+{/if}
+
+{if isset($rating)}
+ <li id="rating" class="imageInfo">
+ <dt>
+ <span id="updateRate">{if isset($rating.USER_RATE)}{'Update your rating'|@translate}{else}{'Rate this photo'|@translate}{/if}</span>
+ </dt>
+ <form action="{$rating.F_ACTION}" method="post" id="rateForm" style="margin:0;">
+ <div data-role="controlgroup" data-type="horizontal" align="center">
+ {foreach from=$rating.marks item=mark name=rate_loop}
+ {if isset($rating.USER_RATE) && $mark==$rating.USER_RATE}
+ <input type="button" name="rate" value="{$mark}" class="rateButtonSelected" title="{$mark}">
+ {else}
+ <input type="submit" name="rate" value="{$mark}" class="rateButton" title="{$mark}">
+ {/if}
+ {/foreach}
+ </div>
+ </form>
+ </li>
+{/if}
+</ul>
+
+{if isset($metadata)}
+<ul data-role="listview" data-inset="true">
+{foreach from=$metadata item=meta}
+ <li><h3>{$meta.TITLE}</h3>
+ {foreach from=$meta.lines item=value key=label}
+ <div class="imageInfo">
+ <dt>{$label}</dt>
+ <dd>{$value}</dd>
+ </div>
+ {/foreach}</li>
+{/foreach}
+</dl>
+{/if}
+</ul>
+
+{if isset($COMMENT_COUNT)}
+<ul data-role="listview" data-inset="true">
+ <h3>{$COMMENT_COUNT|@translate_dec:'%d comment':'%d comments'}</h3>
+
+ <div id="pictureComments">
+ {if isset($comment_add)}
+ <div data-role="collapsible">
+ <h3>{'Add a comment'|@translate}</h3>
+ <form method="post" action="{$comment_add.F_ACTION}" id="addComment">
+ {if $comment_add.SHOW_AUTHOR}
+ <p><label for="author">{'Author'|@translate}{if $comment_add.AUTHOR_MANDATORY} ({'mandatory'|@translate}){/if} :</label></p>
+ <p><input type="text" name="author" id="author" value="{$comment_add.AUTHOR}"></p>
+ {/if}
+ {if $comment_add.SHOW_EMAIL}
+ <p><label for="email">{'Email address'|@translate}{if $comment_add.EMAIL_MANDATORY} ({'mandatory'|@translate}){/if} :</label></p>
+ <p><input type="text" name="email" id="email" value="{$comment_add.EMAIL}"></p>
+ {/if}
+ <p><label for="website_url">{'Website'|@translate} :</label></p>
+ <p><input type="text" name="website_url" id="website_url" value="{$comment_add.WEBSITE_URL}"></p>
+ <p><label for="contentid">{'Comment'|@translate} ({'mandatory'|@translate}) :</label></p>
+ <p><textarea name="content" id="contentid" rows="5" cols="50">{$comment_add.CONTENT}</textarea></p>
+ <p><input type="hidden" name="key" value="{$comment_add.KEY}">
+ <input type="submit" value="{'Submit'|@translate}"></p>
+ </form>
+ </div>
+ {/if}
+ {if isset($comments)}
+ <ul data-role="listview" data-inset="true">
+ {if (($COMMENT_COUNT > 2) || !empty($navbar))}
+ <div id="pictureCommentNavBar">
+ {if $COMMENT_COUNT > 2}
+ <a href="{$COMMENTS_ORDER_URL}#comments" rel="nofollow" class="commentsOrder">{$COMMENTS_ORDER_TITLE}</a>
+ {/if}
+ {if !empty($navbar) }{include file='navigation_bar.tpl'|@get_extent:'navbar'}{/if}
+ </div>
+ {/if}
+ {include file='comment_list.tpl' from="picture"}
+ </ul>
+ {/if}
+ </div>
+
+</ul>
+{/if}{*comments*}
+
+{include file='picture_nav_buttons.tpl'|@get_extent:'picture_nav_buttons'}
+
+</div>
diff --git a/themes/smartpocket/template/picture_content.tpl b/themes/smartpocket/template/picture_content.tpl
new file mode 100644
index 000000000..b8dc2277d
--- /dev/null
+++ b/themes/smartpocket/template/picture_content.tpl
@@ -0,0 +1,2 @@
+<img src="{$current.selected_derivative->get_url()}" style="max-width:100%" alt="{$ALT_IMG}" id="theMainImage" title="{if isset($COMMENT_IMG)}{$COMMENT_IMG|@strip_tags:false|@replace:'"':' '}{else}{$current.TITLE|@replace:'"':' '} - {$ALT_IMG}{/if}">
+
diff --git a/themes/smartpocket/template/picture_nav_buttons.tpl b/themes/smartpocket/template/picture_nav_buttons.tpl
new file mode 100644
index 000000000..c18427f26
--- /dev/null
+++ b/themes/smartpocket/template/picture_nav_buttons.tpl
@@ -0,0 +1,13 @@
+<div data-role="controlgroup" data-type="horizontal" align="center">
+{strip}
+{if isset($previous)}
+ <a href="{$previous.U_IMG}" rel="prev" data-role="button" data-icon="arrow-l" data-iconpos="notext" data-inline="true">{'Previous'|@translate}</a>
+{/if}
+{if isset($U_UP) and !isset($slideshow)}
+ <a href="{$U_UP}" rel="prev" data-role="button" data-icon="arrow-u" data-iconpos="notext" data-inline="true">data-iconpos="notext"</a>
+{/if}
+{if isset($next)}
+ <a href="{$next.U_IMG}" rel="next" data-role="button" data-icon="arrow-r" data-iconpos="notext" data-iconpos="right" data-inline="true">{'Next'|@translate}</a>
+{/if}
+{/strip}
+</div>
diff --git a/themes/smartpocket/template/register.tpl b/themes/smartpocket/template/register.tpl
index 69fd6bc78..ee395f2d4 100644
--- a/themes/smartpocket/template/register.tpl
+++ b/themes/smartpocket/template/register.tpl
@@ -4,8 +4,8 @@
<form method="post" action="{$F_ACTION}" class="properties" name="register_form">
<div data-role="fieldcontain">
- <label for="username">* {'Username'|@translate}</label>
- <input type="text" name="username" id="username" value="{$F_LOGIN}">
+ <label for="login">* {'Username'|@translate}</label>
+ <input type="text" name="login" id="login" value="{$F_LOGIN}">
</div>
<div data-role="fieldcontain">
diff --git a/themes/smartpocket/template/search.tpl b/themes/smartpocket/template/search.tpl
new file mode 100644
index 000000000..7c648ab1a
--- /dev/null
+++ b/themes/smartpocket/template/search.tpl
@@ -0,0 +1,65 @@
+{include file='infos_errors.tpl'}
+<div data-role="content">
+ <ul data-role="listview" data-inset="true">
+ <li data-role="list-divider">{'Search'|@translate}</li>
+ </ul>
+
+
+<form class="filter" method="post" name="search" action="{$F_SEARCH_ACTION}">
+<fieldset data-role="controlgroup">
+ <legend>{'Filter'|@translate}</legend>
+ <div data-role="fieldcontain">
+ <label for="search_allwords">{'Search for words'|@translate}</label>
+ <input type="text" id="search_allwords" style="width: 300px" name="search_allwords" size="30">
+ </div>
+
+ <input type="radio" name="mode" id="mode_and" value="AND" checked="checked">
+ <label for="mode_and">{'Search for all terms'|@translate}</label>
+ <input type="radio" name="mode" id="mode_or" value="OR">
+ <label for="mode_or">{'Search for any term'|@translate}</label>
+ <div data-role="fieldcontain">
+ <label for="search_author">{'Search for Author'|@translate}</label>
+ <input type="text" style="width: 300px" name="search_author" id="search_author" size="30">
+ </div>
+</fieldset>
+
+{if isset($TAG_SELECTION)}
+<fieldset data-role="controlgroup">
+ <legend>{'Search tags'|@translate}</legend>
+ {$TAG_SELECTION}
+</fieldset>
+
+<fieldset data-role="controlgroup">
+ <input type="radio" name="tag_mode" id="tag_mode_and" value="AND" checked="checked">
+ <label for="tag_mode_and">{'All tags'|@translate}</label>
+ <input type="radio" name="tag_mode" id="tag_mode_or" value="OR">
+ <label for="tag_mode_or">{'Any tag'|@translate}</label>
+</fieldset>
+{/if}
+
+<div data-role="fieldcontain">
+ <legend>{'Search in albums'|@translate}</legend>
+ <label for="categoryList">{'Albums'|@translate}
+ <select class="categoryList" id="categoryList" name="cat[]" multiple="multiple" data-native-menu="false">
+ {html_options options=$category_options selected=$category_options_selected}
+ </select>
+ </label>
+ <fieldset data-role="controlgroup">
+ <legend>{'Search in sub-albums'|@translate}</legend>
+ <input type="radio" name="subcats-included" value="1" id="subcats-included-yes" checked="checked">
+ <label for="subcats-included-yes">{'Yes'|@translate}</label>
+ <input type="radio" name="subcats-included" id="subcats-included-no" value="0">
+ <label for="subcats-included-no">{'No'|@translate}</label>
+ </fieldset>
+</div>
+<p>
+ <input class="submit" type="submit" name="submit" value="{'Submit'|@translate}">
+ <input class="submit" type="reset" value="{'Reset'|@translate}">
+</p>
+</form>
+
+<script type="text/javascript"><!--
+document.search.search_allwords.focus();
+//--></script>
+
+</div> <!-- content -->
diff --git a/themes/smartpocket/template/tags.tpl b/themes/smartpocket/template/tags.tpl
new file mode 100644
index 000000000..c0c9f6e5a
--- /dev/null
+++ b/themes/smartpocket/template/tags.tpl
@@ -0,0 +1,15 @@
+{include file='infos_errors.tpl'}
+<div data-role="content">{if isset($tags)}
+<ul data-role="listview" data-inset="true" data-filter="true">
+ <li data-role="list-divider">{'Tags'|@translate}</li>
+ {foreach from=$tags item=tag}
+ <li><a href="{$tag.URL}" title="{$tag.counter|@translate_dec:'%d photo':'%d photos'}">{$tag.name}</a><span class="ui-li-count">{$tag.counter|@translate_dec:'%d photo':'%d photos'}</span></li>
+ {/foreach}
+</ul>
+{elseif isset($letters)}
+<ul data-role="listview" data-inset="true">
+ {foreach from=$letters item=letter}{foreach from=$letter.tags item=tag}
+ <li><a href="{$tag.URL}" title="{$tag.counter|@translate_dec:'%d photo':'%d photos'}">{$tag.name}</a><span class="ui-li-count">{$tag.counter|@translate_dec:'%d photo':'%d photos'}</span></li>
+ {/foreach}{/foreach}
+</ul>{/if}
+</div>
diff --git a/themes/smartpocket/template/thumbnails.tpl b/themes/smartpocket/template/thumbnails.tpl
index ed2737d8b..72a55f497 100644
--- a/themes/smartpocket/template/thumbnails.tpl
+++ b/themes/smartpocket/template/thumbnails.tpl
@@ -1,24 +1,39 @@
{if !empty($thumbnails)}
+{$row_height=216}
+{$hmargin=4}
+{$vmargin=5}
+{$container_margin=-10}
+
{combine_script id='klass' path='themes/smartpocket/js/klass.min.js'}
{combine_script id='photoswipe' path='themes/smartpocket/js/code.photoswipe.jquery.min.js' require='klass,jquery.mobile'}
{combine_script id='smartpocket' path='themes/smartpocket/js/smartpocket.js' require='photoswipe'}
-{combine_script id='jquery.ajaxmanager' path='themes/default/js/plugins/jquery.ajaxmanager.js' load='footer'}
-{combine_script id='thumbnails.loader' path='themes/default/js/thumbnails.loader.js' require='jquery.ajaxmanager' load='footer'}
-
+{combine_script id='sp.thumb.arrange' path='themes/smartpocket/js/thumb.arrange.js' require='jquery' load='footer'}
+{footer_script}
+var var_loop = {if $smartpocket.loop}true{else}false{/if}, var_autohide = {$smartpocket.autohide}, var_trad = "{'More Information'|@translate}";
+var SPThumbsOpts ={ hMargin:{$hmargin},rowHeight:{$row_height}};
+{/footer_script}
+{$thumb_picker->init($row_height)}
+{html_style}
+.thumbnails .liEmpty{ display:none}
+.thumbnails LI{ margin-left:{$hmargin}px; margin-bottom:{$vmargin}px}
+.thumbnails { margin:0 {$container_margin}px 0 {$container_margin-$hmargin}px}
+{/html_style}
<ul class="thumbnails">
{foreach from=$thumbnails item=thumbnail}{strip}
-{assign var=derivative value=$pwg->derivative($thumbnail_derivative_params, $thumbnail.src_image)}
+{$derivative=$thumb_picker->pick($thumbnail.src_image)}
{if isset($page_selection[$thumbnail.id])}
- <li>
- <a href="{$pwg->derivative_url($picture_derivative_params, $thumbnail.src_image)}" rel="external">
- <img {if !$derivative->is_cached()}data-{/if}src="{$derivative->get_url()}" alt="{$thumbnail.TN_ALT}">
- </a>
- </li>
+ <li class="liVisible">
+{if !isset($thumbnail.representative_ext)}
+ <a href="{$pwg->derivative_url($picture_derivative_params, $thumbnail.src_image)}" data-picture-url="{$thumbnail.URL}" rel="external">
+{else}
+ <a href="{$thumbnail.URL}" target="_blank" onClick="window.location='{$thumbnail.URL}'">
+{/if}
+ <img src="{$derivative->get_url()}" {$derivative->get_size_htm()} alt="{$thumbnail.TN_ALT}">
{else}
- <li style="display:none;">
- <a href="{$pwg->derivative_url($picture_derivative_params, $thumbnail.src_image)}" rel="external"></a>
- </li>
+ <li class="liEmpty">
+ <a href="{$pwg->derivative_url($picture_derivative_params, $thumbnail.src_image)}" rel="external">
{/if}
+ </a></li>
{/strip}{/foreach}
</ul>
{/if}
diff --git a/themes/smartpocket/theme.css b/themes/smartpocket/theme.css
index d18d94709..8ef740fd9 100644
--- a/themes/smartpocket/theme.css
+++ b/themes/smartpocket/theme.css
@@ -3,7 +3,7 @@
.title { margin: 10px; text-align: center; }
.title .ui-btn { margin-top: -5px; }
-.menubar { float: right; }
+. { float: right; }
.home_button { float: left; }
.pwg_footer h6 { margin: 8px; text-align:right;}
@@ -16,8 +16,46 @@
.ui-content { overflow: hidden; }
.ui-field-contain, .ui-br { padding: 5px; border: 0 !important; }
-.thumbnails { list-style: none; padding: 0; margin: 0; }
+.thumbnails { list-style: none; padding: 0}
.thumbnails:after { clear: both; content: "."; display: block; height: 0; visibility: hidden; }
-.thumbnails li { float: left; }
-.thumbnails li a { display: block; margin: 5px; }
-.thumbnails li img { display: block; width: 100%; height: auto; }
+.thumbnails li {
+ float: left;
+ position: relative;
+ overflow: hidden;
+ display: inline;
+}
+.thumbnails li a {
+ position: absolute;
+}
+
+#more_link {
+ color: #FFFFFF;
+ display: table-cell;
+ font-size: 1.1em;
+ text-decoration: none;
+ vertical-align: middle;
+ cursor: pointer;
+}
+.ui-panel-inner > .ui-listview {
+ margin: -15px -15px 0;
+}
+#menubar .ui-collapsible-heading-toggle.ui-btn-up-a {
+ background:linear-gradient(#6FACD5, #497BAE) repeat scroll 0 0 #5E87B0;
+}
+
+.ui-li-desc {
+ text-overflow: clip;
+ white-space: normal;
+}
+#PictureInfo {
+ font-size: 0.8em;
+}
+#PictureInfo * {
+ font-size: 1em;
+}
+#addComment textarea.ui-input-text {
+ min-height: 100px;
+}
+#picture_page {
+ text-align: center;
+} \ No newline at end of file
diff --git a/themes/smartpocket/themeconf.inc.php b/themes/smartpocket/themeconf.inc.php
index 7a13d9698..a23a3764f 100644
--- a/themes/smartpocket/themeconf.inc.php
+++ b/themes/smartpocket/themeconf.inc.php
@@ -1,7 +1,7 @@
<?php
/*
Theme Name: Smart Pocket
-Version: 2.5.0
+Version: 2.6.0
Description: Mobile theme.
Theme URI: http://piwigo.org/ext/extension_view.php?eid=599
Author: P@t
@@ -12,9 +12,60 @@ $themeconf = array(
'mobile' => true,
);
+// Need upgrade?
+global $conf;
+include(PHPWG_THEMES_PATH.'smartpocket/admin/upgrade.inc.php');
+
+load_language('theme.lang', PHPWG_THEMES_PATH.'smartpocket/');
+
+
// Redirect if page is not compatible with mobile theme
-if (!in_array(script_basename(), array('index', 'register', 'profile', 'identification', 'ws', 'admin')))
+/*if (!in_array(script_basename(), array('index', 'register', 'profile', 'identification', 'ws', 'admin')))
redirect(duplicate_index_url());
+*/
+
+
+class SPThumbPicker
+{
+ var $candidates;
+ var $default;
+ var $height;
+
+ function init($height)
+ {
+ $this->candidates = array();
+ foreach( ImageStdParams::get_defined_type_map() as $params)
+ {
+ if ($params->max_height() < $height || $params->sizing->max_crop)
+ continue;
+ if ($params->max_height() > 3*$height)
+ break;
+ $this->candidates[] = $params;
+ }
+ $this->default = ImageStdParams::get_custom($height*3, $height, 1, 0, $height );
+ $this->height = $height;
+ }
+
+ function pick($src_image)
+ {
+ $ok = false;
+ foreach($this->candidates as $candidate)
+ {
+ $deriv = new DerivativeImage($candidate, $src_image);
+ $size = $deriv->get_size();
+ if ($size[1]>=$row_height-2)
+ {
+ $ok = true;
+ break;
+ }
+ }
+ if (!$ok)
+ {
+ $deriv = new DerivativeImage($this->default, $src_image);
+ }
+ return $deriv;
+ }
+}
//Retrive all pictures on thumbnails page
add_event_handler('loc_index_thumbnails_selection', 'sp_select_all_thumbnails');
@@ -24,7 +75,7 @@ function sp_select_all_thumbnails($selection)
global $page, $template;
$template->assign('page_selection', array_flip($selection));
-
+ $template->assign('thumb_picker', new SPThumbPicker() );
return $page['items'];
}
@@ -38,22 +89,56 @@ function sp_select_all_categories($selection)
}
// Get better derive parameters for screen size
+$type = IMG_LARGE;
if (!empty($_COOKIE['screen_size']))
{
$screen_size = explode('x', $_COOKIE['screen_size']);
- $derivative_params = new ImageStdParams;
- $derivative_params->load_from_db();
- $type = IMG_LARGE;
-
- foreach ($derivative_params->get_all_type_map() as $type => $map)
+ foreach (ImageStdParams::get_all_type_map() as $type => $map)
{
if (max($map->sizing->ideal_size) >= max($screen_size) and min($map->sizing->ideal_size) >= min($screen_size))
break;
}
- pwg_set_session_var('sp_picture_deriv', $type);
}
-$this->assign('picture_derivative_params', ImageStdParams::get_by_type(pwg_get_session_var('sp_picture_deriv', IMG_LARGE)));
+$this->assign('picture_derivative_params', ImageStdParams::get_by_type($type));
$this->assign('thumbnail_derivative_params', ImageStdParams::get_by_type(IMG_SQUARE));
+//------------------------------------------------------------- mobile version & theme config
+add_event_handler('init', 'mobile_link');
+
+function mobile_link()
+{
+ global $template, $conf;
+ $config = unserialize( $conf['smartpocket'] );
+ $template->assign( 'smartpocket', $config );
+ if ( !empty($conf['mobile_theme']) && (get_device() != 'desktop' || mobile_theme()))
+ {
+ $template->assign(array(
+ 'TOGGLE_MOBILE_THEME_URL' => add_url_params(duplicate_index_url(),array('mobile' => mobile_theme() ? 'false' : 'true')),
+ ));
+ }
+}
+
+
+if ( !function_exists( 'add_menu_on_public_pages' ) ) {
+ if ( defined('IN_ADMIN') and IN_ADMIN ) return false;
+ add_event_handler('loc_after_page_header', 'add_menu_on_public_pages', 20);
+
+ function add_menu_on_public_pages() {
+ if ( function_exists( 'initialize_menu') ) return false; # The current page has already the menu
+ global $template, $page, $conf;
+ if ( isset($page['body_id']) and $page['body_id']=="thePicturePage" )
+ {
+ $template->set_filenames(array(
+ 'add_menu_on_public_pages' => dirname(__FILE__) . '/template/add_menu_on_public_pages.tpl',
+ ));
+ include_once(PHPWG_ROOT_PATH.'include/menubar.inc.php');
+ $template->parse('add_menu_on_public_pages');
+ }
+
+
+ }
+}
+
+
?>
diff --git a/tools/config.inc.php b/tools/config.inc.php
deleted file mode 100644
index 6e74538fb..000000000
--- a/tools/config.inc.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-// this file is provided as an example. It does not modify the configuration
-// as long as it remains in "tools" directory. Move it to "include"
-// directory if you want to modify default configuration.
-
-$conf['prefix_thumbnail'] = 'thumb_';
-$conf['show_gt'] = true;
-?> \ No newline at end of file
diff --git a/tools/convert_language_to_2.1.pl b/tools/convert_language_to_2.1.pl
deleted file mode 100644
index b78547a33..000000000
--- a/tools/convert_language_to_2.1.pl
+++ /dev/null
@@ -1,184 +0,0 @@
-#!/usr/bin/perl
-
-# Here is the way I finally used this script:
-#
-# for language in ar_SA cz_CZ da_DK de_DE es_AR es_ES hr_HR hu_HU it_IT ja_JP nl_NL pl_PL pt_BR pt_PT ru_RU sr_RS vi_VN zh_CN
-# do
-# export PWG_LANG=$language
-# rm -rf language/$PWG_LANG
-# cp -r ../branches/2.0/language/$PWG_LANG language/
-# perl tools/convert_language_to_2.1.pl language/$PWG_LANG
-# done
-
-use strict;
-use warnings;
-
-my $language_dir = $ARGV[0];
-
-my @file_codes = qw/upgrade install admin common/;
-
-my %ignore_keys = (
- 'user_status_admin' => '',
- 'user_status_generic' => '',
- 'user_status_guest' => '',
- 'user_status_normal' => '',
- 'user_status_webmaster' => '',
- 'Level 0' => '',
- 'Level 1' => '',
- 'Level 2' => '',
- 'Level 4' => '',
- 'Level 8' => '',
- 'ACCESS_0' => '',
- 'ACCESS_1' => '',
- 'ACCESS_2' => '',
- 'ACCESS_3' => '',
- 'ACCESS_4' => '',
- 'ACCESS_5' => '',
- 'month' => '',
- 'day' => '',
- 'chronology_monthly_calendar' => '',
- 'chronology_monthly_list' => '',
- 'chronology_weekly_list' => '',
-);
-
-my %remove_keys = (
- common => {
- "You can\\'t upload pictures in this category" => '',
- 'display pictures added on' => '',
- 'Email address is missing' => '',
- 'Delete: %s' => '',
- 'All tags must match' => '',
- 'Validate: %s' => '',
- 'Upgrade from %s to %s' => '',
- },
- admin => {
- 'nbm_content_goto_2' => '',
- 'nbm_content_hello_2' => '',
- 'nbm_redirect_msg' => '',
-
- 'username' => '',
- 'No tag defined. Use Administration>Pictures>Tags' => '',
- 'Remote site url must start by http or https and must only contain characters among "/", "a-zA-Z0-9", "-" or "_"' => '',
- 'path' => '',
- 'Unable to retrieve server informations since allow_url_fopen is disabled.' => '',
- 'The following tag were deleted' => '',
- 'Remote site' => '',
- 'Piwigo home' => '',
- 'Move up' => '',
- 'Instructions' => '',
- 'Hits' => '',
- 'General' => '',
- 'Gallery description' => '',
- 'Extensions' => '',
- 'Demo' => '',
- 'Categories ascending alphanumerically ordered' => '',
- 'Categories descending alphanumerically ordered' => '',
- 'Categories sorted in ascending order ⇓' => '',
- 'Categories sorted in ascending order &dArr;' => '',
- 'Categories sorted in descending order ⇑' => '',
- 'Categories sorted in descending order &uArr;' => '',
- 'Bugs' => '',
- 'Automatic installation' => '',
- 'Upgrade from version %s to %s' => '',
- 'Upgrade from %s to %s' => '',
- 'Upload Form' => '',
- },
- upgrade => {
- 'Are you sure?' => '',
- 'In <i>%s</i>, before <b>?></b>, insert:' => '',
- },
- install => {
- 'Parameters are correct' => '',
- 'Installation finished' => '',
- 'The next step of the installation is now possible' => '',
- 'next step' => '',
- }
-);
-
-my %to_copy = ();
-
-# load the replacements
-my %replace_by = ();
-foreach my $file_code (@file_codes) {
- open(my $ifh_rep, '<language/templates/'.$file_code.'.lang.php');
- while (<$ifh_rep>) {
- if (m/^\$lang\['(.*)'\] \s* = \s* (['"])(.*)\2;/x) {
- if ($1 ne $3 and length($1) > 0) {
- $replace_by{$1} = $3;
- }
- }
- }
-}
-# use Data::Dumper; print Dumper(\%replace_by); exit();
-
-my $append_to_common = '';
-
-foreach my $file_code (@file_codes) {
- my $filename = $language_dir.'/'.$file_code.'.lang.php';
- print $filename;
- if (not -f $filename) {
- print ' is missing', "\n";
- next;
- }
- print ' is under process', "\n";
-
- if ($file_code eq 'admin') {
- %to_copy = (
- 'Are you sure?' => '',
- 'Email address is missing. Please specify an email address.' => '',
- 'delete this comment' => '',
- 'validate this comment' => '',
- );
- }
- else {
- %to_copy = ();
- }
-
- my $file_content = '';
- my $copy_content = '';
-
- open(my $ifh, '<'.$language_dir.'/'.$file_code.'.lang.php');
- while (my $line = <$ifh>) {
- if ($line =~ m/^\$lang\['(.*)'\] \s* =/x) {
- if (defined $remove_keys{$file_code}{$1}) {
- next;
- }
- elsif (defined $ignore_keys{$1}) {
- $file_content.= $line;
- }
- elsif (defined $to_copy{$1}) {
- $append_to_common.= $line;
- }
- elsif (defined $replace_by{$1}) {
- my $search = quotemeta($1);
- my $replace = $replace_by{$1};
-
- $line =~ s{$search}{$replace};
-
- if (defined $to_copy{$replace}) {
- $append_to_common.= $line;
- }
- else {
- $file_content.= $line;
- }
- }
- else {
- $file_content.= $line;
- }
- }
- elsif ($line =~ m/^?>/) {
- if ('common' eq $file_code) {
- $file_content.= $append_to_common;
- }
- $file_content.= $line;
- }
- else {
- $file_content.= $line;
- }
- }
- close($ifh);
-
- open(my $ofh, '>'.$language_dir.'/'.$file_code.'.lang.php');
- print {$ofh} $file_content;
- close($ofh);
-}
diff --git a/tools/convert_template_to_2.1.pl b/tools/convert_template_to_2.1.pl
deleted file mode 100644
index a838e8f8b..000000000
--- a/tools/convert_template_to_2.1.pl
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/usr/bin/perl
-
-# perl tools/convert_template_to_2.1.pl /path/to/tpl/files/directory
-
-use strict;
-use warnings;
-
-use File::Find;
-
-my $base_dir = $ARGV[0];
-
-# load the replacements
-my @file_codes = qw/upgrade install admin common/;
-my %replace_by = ();
-foreach my $file_code (@file_codes) {
- open(my $ifh_rep, '<language/templates/'.$file_code.'.lang.php');
- while (<$ifh_rep>) {
- if (m/^\$lang\['(.*)'\] \s* = \s* (['"])(.*)\2;/x) {
- if ($1 ne $3 and length($1) > 0) {
- $replace_by{$1} = $3;
- }
- }
- }
-}
-# use Data::Dumper; print Dumper(\%replace_by); exit();
-
-find(\&replace_keys, $base_dir);
-
-sub replace_keys {
- if ($File::Find::name !~ m/tpl$/) {
- return 0;
- }
-
- my $file_content = '';
- open(my $fhi, '<', $File::Find::name);
- while (<$fhi>) {
- foreach my $from (keys %replace_by) {
- my $to = $replace_by{$from};
- s/{'$from'\|\@translate/{'$to'|\@translate/g;
- }
- $file_content.= $_;
- }
- close($fhi);
-
- open(my $fho, '>', $File::Find::name);
- print {$fho} $file_content;
- close($fho);
-}
diff --git a/tools/index.php b/tools/index.php
index 41732f2fd..c8de97f60 100644
--- a/tools/index.php
+++ b/tools/index.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/tools/key2value.php b/tools/key2value.php
deleted file mode 100755
index cda02d9bc..000000000
--- a/tools/key2value.php
+++ /dev/null
@@ -1,126 +0,0 @@
-#!/usr/bin/php -qn
-<?php
-if (isset($_SERVER['argc']) && $_SERVER['argc']<=1)
-{
- help();
-}
-
-$language = trim($_SERVER['argv'][1]);
-if (!is_dir("language/$language"))
-{
- help();
-}
-
-$Files = array('common', 'admin', 'install', 'upgrade');
-$exclude_keys = array('user_status_admin', 'user_status_generic',
- 'user_status_guest', 'user_status_normal',
- 'user_status_webmaster', 'Level 0',
- 'Level 1', 'Level 2', 'Level 4', 'Level 8',
- 'chronology_monthly_calendar', 'chronology_monthly_list',
- 'chronology_weekly_list');
-
-foreach ($Files as $file)
-{
- $lang_file = sprintf('language/%s/%s.lang.php', $language, $file);
- $en_file = sprintf('language/en_UK/%s.lang.php', $file);
- include $lang_file;
- $source_lang = $lang;
- unset($lang);
- include $en_file;
-
- try
- {
- $fh = fopen($lang_file, 'w+');
-
- fwrite($fh, copyright());
-
- if ($file == 'common')
- {
- foreach ($lang_info as $key => $value)
- {
- fwrite($fh, sprintf("\$lang_info['%s'] = \"%s\";\n",
- $key,
- $value
- )
- );
- }
- }
- fwrite($fh, "\n\n");
-
- foreach ($lang as $key => $value)
- {
- if (is_array($value))
- {
- foreach ($value as $k => $v)
- {
- fwrite($fh, sprintf("\$lang['%s'][%s] = \"%s\";\n",
- str_replace("'", "\'", trim($key)),
- trim($k),
- str_replace('"', '\"', trim($source_lang[$key][$k]))
- )
- );
- }
- }
- elseif (in_array($key, $exclude_keys))
- {
- fwrite($fh, sprintf("\$lang['%s'] = \"%s\";\n",
- str_replace("'", "\'", trim($key)),
- str_replace('"', '\"', trim($source_lang[$key]))
- )
- );
- }
- else
- {
- fwrite($fh, sprintf("\$lang['%s'] = \"%s\";\n",
- str_replace("'", "\'", trim($value)),
- str_replace('"', '\"', trim($source_lang[$key]))
- )
- );
- }
- }
- fwrite($fh, '?>');
- fclose($fh);
- }
- catch (Exception $e)
- {
- print $e->getMessage();
- }
-}
-
-function help()
-{
- echo "\n";
- echo 'usage : ', basename($_SERVER['argv'][0]), " <LANGUAGE CODE>\n";
- echo "\n";
- exit(1);
-}
-
-function copyright()
-{
- return
-'<?php
-// +-----------------------------------------------------------------------+
-// | Piwigo - a PHP based photo gallery |
-// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
-// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
-// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
-// +-----------------------------------------------------------------------+
-// | 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 |
-// | |
-// | This program is distributed in the hope that it will be useful, but |
-// | WITHOUT ANY WARRANTY; without even the implied warranty of |
-// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
-// | General Public License for more details. |
-// | |
-// | You should have received a copy of the GNU General Public License |
-// | along with this program; if not, write to the Free Software |
-// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
-// | USA. |
-// +-----------------------------------------------------------------------+
-
-';
-}
-?> \ No newline at end of file
diff --git a/tools/metadata.php b/tools/metadata.php
index 16e2a2bb7..c0b390f43 100644
--- a/tools/metadata.php
+++ b/tools/metadata.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/tools/release_creation.readme b/tools/release_creation.readme
deleted file mode 100644
index a8b4f6f52..000000000
--- a/tools/release_creation.readme
+++ /dev/null
@@ -1,50 +0,0 @@
-=====================================
- Piwigo release creation guide
-=====================================
-
-Technical creation
-==================
-
-I take release 1.7.0 as an example. In URLs "plg" is my personnal Gna!
-username, so use yours.
-
-- tag creation tags/release-1_7_0 :
-
-$ svn copy \
- -r 1999 \
- -m "Create release 1.7.0 from branch 1.7 r1999" \
- svn+ssh://plg@svn.gna.org/svn/phpwebgallery/branch/branch-1_7 \
- svn+ssh://plg@svn.gna.org/svn/phpwebgallery/tags/release-1_7_0
-
-- checkout new Subversion release 1.7.0
-
-$ svn co svn+ssh://plg@svn.gna.org/svn/phpwebgallery/tags/release-1_7_0 1.7.0
-$ cd 1.7.0
-
-- in include/config_default.inc.php, change the following parameters:
- - $conf['check_upgrade_feed'] = false;
- - $conf['show_version'] = false;
- - $conf['show_gt'] = false;
- - $conf['die_on_sql_error'] = false;
-
-- in include/constants.php, change the PHPWG_VERSION to 1.7.0
-
-- commit your changes to tags/release-1_7_0, with the following comment:
-
-> New version 1.7.0 hard coded.
->
-> Stable release required modifications: don't show version and generation
-> time in footer, don't check the upgrade feed, don't die on sql errors.
-
-$ svn commit
-
-- create the release (pwg_rel_create.sh is in tools directory)
-
-$ mkdir /tmp/1.7.0
-$ cd /tmp/1.7.0
-$ pwg_rel_create.sh release-1_7_0 1.7.0
-$ md5sum p* > MD5SUMS
-
-- upload the release to Gna! download area
-
-$ scp -r /tmp/1.7.0 plg@download.gna.org:/upload/phpwebgallery/release/1.7/
diff --git a/tools/replace.php b/tools/replace.php
deleted file mode 100755
index 0596ca064..000000000
--- a/tools/replace.php
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/usr/bin/php -qn
-<?php
-if (isset($_SERVER['argc']) && $_SERVER['argc']<=1)
-{
- echo "\n";
- echo 'usage : ', basename($_SERVER['argv'][0]), " <filename>\n";
- echo "\n";
- exit(1);
-}
-
-$filename = trim($_SERVER['argv'][1]);
-$lines = file($filename);
-$content = file_get_contents($filename);
-
-$n = 0;
-$nbLines = count($lines);
-
-$pattern = "`(.*{')(.*)('\|@translate}.*)`Um";
-$replace = "'{\''.keyReplace('\\1').'\'|@translate}'";
-
-include "language/templates/common.lang.php";
-include "language/templates/admin.lang.php";
-include "language/templates/upgrade.lang.php";
-include "language/templates/install.lang.php";
-
-while ($n < $nbLines) {
- preg_match_all($pattern, $lines[$n], $matches);
- echo str_replace($matches[2], keyReplace($matches[2]), $lines[$n]);
- $n++;
-}
-
-function keyReplace($key) {
- global $lang;
-
- if (is_array($key)) {
- $translation = array();
- foreach ($key as $i => $k) {
- if (isset($lang[$k])) {
- $translation = addslashes($lang[$k]);
- } else {
- $translation = "$k";
- }
- }
- } else {
- if (isset($lang[$key])) {
- $translation = addslashes($lang[$key]);
- } else {
- $translation = "$key";
- }
- }
- return $translation;
-}
-?> \ No newline at end of file
diff --git a/tools/replace_language_keys.pl b/tools/replace_language_keys.pl
deleted file mode 100644
index 822b3e1cc..000000000
--- a/tools/replace_language_keys.pl
+++ /dev/null
@@ -1,60 +0,0 @@
-#!/usr/bin/perl
-
-use strict;
-use warnings;
-
-my $replacement_file = $ARGV[0];
-my $language_dir = $ARGV[1];
-
-# load the replacements
-my %replace_by = ();
-open(my $ifh_rep, '<'.$replacement_file);
-while (<$ifh_rep>) {
- if (m/^\$lang\['(.*)'\] \s* = \s* (['"])(.*)\2;/x) {
- if ($1 ne $3 and length($1) > 0) {
- $replace_by{$1} = $3;
- }
- }
-}
-# use Data::Dumper; print Dumper(\%replace_by); exit();
-
-my $append_to_common = '';
-
-foreach my $file_code (qw/upgrade install admin common plugin/) {
- my $filename = $language_dir.'/'.$file_code.'.lang.php';
- # print $filename;
- if (not -f $filename) {
- # print ' is missing', "\n";
- next;
- }
- print $filename.' is under process', "\n";
-
- my $file_content = '';
-
- open(my $ifh, '<'.$filename);
- while (my $line = <$ifh>) {
- if ($line =~ m/^\$lang\['(.*)'\] \s* =/x) {
- if (defined $replace_by{$1}) {
- my $search = quotemeta($1);
- my $replace = $replace_by{$1};
-
- $line =~ s{$search}{$replace};
- $file_content.= $line;
- }
- else {
- $file_content.= $line;
- }
- }
- elsif ($line =~ m/^?>/) {
- $file_content.= $line;
- }
- else {
- $file_content.= $line;
- }
- }
- close($ifh);
-
- open(my $ofh, '>'.$filename);
- print {$ofh} $file_content;
- close($ofh);
-}
diff --git a/tools/replace_language_values.pl b/tools/replace_language_values.pl
deleted file mode 100644
index f901e1140..000000000
--- a/tools/replace_language_values.pl
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/usr/bin/perl
-
-use strict;
-use warnings;
-
-my $replacement_file = $ARGV[0];
-my $language_dir = $ARGV[1];
-
-# load the new values for given keys
-my %new_value_of = ();
-open(my $ifh_rep, '<'.$replacement_file);
-while (<$ifh_rep>) {
- if (m/^\$lang\['(.*)'\] \s* = \s* (.*);/x) {
- $new_value_of{$1} = $2;
- }
-}
-# use Data::Dumper; print Dumper(\%new_value_of); exit();
-
-my %replacement_performed_for = ();
-
-foreach my $file_code (qw/upgrade install admin common plugin/) {
- my $filename = $language_dir.'/'.$file_code.'.lang.php';
- # print $filename;
- if (not -f $filename) {
- # print ' is missing', "\n";
- next;
- }
- print $filename.' is under process', "\n";
-
- my $file_content = '';
-
- open(my $ifh, '<'.$filename);
- while (my $line = <$ifh>) {
- if ($line =~ m/^\$lang\['(.*)'\] \s* =/x) {
- if (defined $new_value_of{$1}) {
- $file_content.= '$lang[\''.$1.'\'] = '.$new_value_of{$1}.';'."\n";
- $replacement_performed_for{$1}++;
- }
- else {
- $file_content.= $line;
- }
- }
- elsif ($line =~ m/^?>/) {
- $file_content.= $line;
- }
- else {
- $file_content.= $line;
- }
- }
- close($ifh);
-
- open(my $ofh, '>'.$filename);
- print {$ofh} $file_content;
- close($ofh);
-}
-
-foreach my $new_value (keys %new_value_of) {
- if (not defined $replacement_performed_for{$new_value}) {
- print 'no replacement performed on: ', $new_value, "\n";
- }
-}
diff --git a/tools/translation_analysis.php b/tools/translation_analysis.php
index 40fc51caa..3fb120d2c 100644
--- a/tools/translation_analysis.php
+++ b/tools/translation_analysis.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2009 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/tools/triggers_list.php b/tools/triggers_list.php
index ab54ebcc7..d327da72d 100644
--- a/tools/triggers_list.php
+++ b/tools/triggers_list.php
@@ -41,7 +41,7 @@ array(
array(
'name' => 'combined_css',
'type' => 'trigger_event',
- 'vars' => array('string', 'href', 'int', 'file_ver0', 'int', 'file_ver1'),
+ 'vars' => array('string', 'href', 'Combinable', '$combinable'),
'files' => array('include\template.class.php (Template::flush)'),
),
array(
@@ -232,6 +232,13 @@ array(
'infos' => 'New in 2.4',
),
array(
+ 'name' => 'get_webmaster_mail_address',
+ 'type' => 'trigger_event',
+ 'vars' => array('string', 'email'),
+ 'files' => array('include\functions.inc.php (get_webmaster_mail_address)'),
+ 'infos' => 'New in 2.6',
+),
+array(
'name' => 'init',
'type' => 'trigger_action',
'vars' => array(),
@@ -245,6 +252,13 @@ array(
'files' => array('admin\include\functions.inc.php (invalidate_user_cache)'),
),
array(
+ 'name' => 'load_conf',
+ 'type' => 'trigger_action',
+ 'vars' => array('string', 'condition'),
+ 'files' => array('include\functions.inc.php (load_conf_from_db)'),
+ 'infos' => 'New in 2.6. <b>Warning:</b> you can\'t trigger the first call done une common.inc.php. Use <i>init</i> instead.',
+),
+array(
'name' => 'list_check_integrity',
'type' => 'trigger_action',
'vars' => array('object', 'this'),
@@ -554,12 +568,6 @@ array(
'files' => array('include\functions_user.inc.php (auto_login, try_log_user)'),
),
array(
- 'name' => 'mail_group_assign_vars',
- 'type' => 'trigger_event',
- 'vars' => array('array', 'assign_vars'),
- 'files' => array('include\functions_mail.inc.php (pwg_mail_group)'),
-),
-array(
'name' => 'nbm_event_handler_added',
'type' => 'trigger_action',
'vars' => array(),
@@ -658,8 +666,8 @@ array(
array(
'name' => 'render_element_description',
'type' => 'trigger_event',
- 'vars' => array('string', 'element_secription'),
- 'files' => array('picture.php'),
+ 'vars' => array('string', 'element_description', 'string', 'action'),
+ 'files' => array('picture.php', 'include\functions_html.inc.php (render_element_description)'),
),
array(
'name' => 'render_lost_password_mail_content',
@@ -676,14 +684,14 @@ array(
array(
'name' => 'render_tag_name',
'type' => 'trigger_event',
- 'vars' => array('string', 'tag_name'),
- 'files' => array('admin\include\functions.php (get_taglist)', 'admin\tags.php', 'include\functions_tag.inc.php (get_available_tags, get_all_tags, get_common_tags)', 'index.php'),
+ 'vars' => array('string', 'tag_name', 'array', 'tag'),
+ 'files' => array('admin\include\functions.php (get_taglist)', 'admin\tags.php', 'admin\history.php', 'include\functions_tag.inc.php (get_available_tags, get_all_tags, get_common_tags)', 'include\functions_html.inc.php (get_tags_content_title)', 'include\functions_search.inc.php (get_qsearch_tags)'),
),
array(
'name' => 'render_tag_url',
'type' => 'trigger_event',
'vars' => array('string', 'tag_name'),
- 'files' => array('include\functions.php (tag_id_from_tag_name, create_tag)', 'admin\tags.php'),
+ 'files' => array('admin\include\functions.php (tag_id_from_tag_name, create_tag)', 'admin\tags.php'),
),
array(
'name' => 'save_profile_from_post',
@@ -692,33 +700,15 @@ array(
'files' => array('profile.php (save_profile_from_post)'),
),
array(
- 'name' => 'send_mail',
- 'type' => 'trigger_event',
- 'vars' => array('bool', 'result', 'string', 'mail_to', 'string', 'mail_subject', 'string', 'mail_content', 'array', 'mail_headers'),
- 'files' => array('include\functions_mail.inc.php (pwg_mail)'),
-),
-array(
- 'name' => 'send_mail_content',
- 'type' => 'trigger_event',
- 'vars' => array('string', 'content'),
- 'files' => array('include\functions_mail.inc.php (pwg_mail)'),
-),
-array(
- 'name' => 'send_mail_headers',
+ 'name' => 'before_send_mail',
'type' => 'trigger_event',
- 'vars' => array('array', 'headers'),
+ 'vars' => array('bool', 'result', 'mixed', 'to', 'array', 'arguments', 'PHPMailer', 'mail'),
'files' => array('include\functions_mail.inc.php (pwg_mail)'),
),
array(
- 'name' => 'send_mail_subject',
- 'type' => 'trigger_event',
- 'vars' => array('string', 'cvt_subject'),
- 'files' => array('include\functions_mail.inc.php (pwg_mail)'),
-),
-array(
- 'name' => 'send_mail_to',
- 'type' => 'trigger_event',
- 'vars' => array('string', 'to'),
+ 'name' => 'before_parse_mail_template',
+ 'type' => 'trigger_action',
+ 'vars' => array('string', 'cache_key', 'string', 'content_type'),
'files' => array('include\functions_mail.inc.php (pwg_mail)'),
),
array(
@@ -796,19 +786,42 @@ array(
'type' => 'trigger_action',
'vars' => array('int', 'user_id'),
'files' => array('include\functions_user.inc.php (logout_user)'),
+ 'infos' => 'New in 2.5',
),
array(
'name' => 'user_login',
'type' => 'trigger_action',
'vars' => array('int', 'user_id'),
'files' => array('include\functions_user.inc.php (log_user)'),
+ 'infos' => 'New in 2.5',
),
array(
'name' => 'try_log_user',
'type' => 'trigger_event',
'vars' => array('boolean', 'success', 'string', 'username', 'string', 'password', 'bool', 'remember_me'),
'files' => array('include\functions_user.inc.php (try_log_user)'),
- 'infos' => 'Used by identification form to check user credentials and log user. If success is true, another login method already succeed. Return true if your method succeed.',
+ 'infos' => 'New in 2.5. Used by identification form to check user credentials and log user. If <i>success</i> is <i>true</i>, another login method already succeed. Return <i>true</i> if your method succeed.',
+),
+array(
+ 'name' => 'combinable_preparse',
+ 'type' => 'trigger_action',
+ 'vars' => array('Template', 'template', 'Combinable', '$combinable', 'FileCombiner', '$combiner'),
+ 'files' => array('include\template.class.php (FileCombiner::process_combinable)'),
+ 'infos' => 'New in 2.6.',
+),
+array(
+ 'name' => 'user_list_columns',
+ 'type' => 'trigger_event',
+ 'vars' => array('string[]', 'aColumns'),
+ 'files' => array('admin\user_list_backend.php'),
+ 'infos' => 'New in 2.6.',
+),
+array(
+ 'name' => 'after_render_user_list',
+ 'type' => 'trigger_event',
+ 'vars' => array('array', 'output'),
+ 'files' => array('admin\user_list_backend.php'),
+ 'infos' => 'New in 2.6.',
),
);
?>
@@ -820,8 +833,6 @@ array(
<link rel="stylesheet" type="text/css" href="http://code.jquery.com/ui/1.9.2/themes/base/jquery-ui.css">
<link rel="stylesheet" type="text/css" href="http://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.4/css/jquery.dataTables_themeroller.css">
- <script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
- <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.4/jquery.dataTables.min.js"></script>
<style type="text/css">
/* BEGIN CSS RESET
@@ -843,13 +854,10 @@ array(
html {font-family:"Corbel","Lucida Grande","Verdana",sans-serif;color:#222;font-size:13px;}
a {color:#247EBF;text-decoration:none;}
- a:hover {color:#EB9C39;border-bottom-width:1px;border-style:dotted;
- text-shadow:1px 1px 0 #ddd;-moz-text-shadow:1px 1px 0 #ddd;-webkit-text-shadow:1px 1px 0 #ddd;
- }
+ a:hover {color:#EB9C39;border-bottom-width:1px;border-style:dotted;text-shadow:1px 1px 0 #ddd;}
- h1 {color:#fff;font-size:26px;padding:10px 15px;
- text-shadow:1px 1px 0 #999;-moz-text-shadow:1px 1px 0 #999;-webkit-text-shadow:1px 1px 0 #999;
- background:#45484d;background:-moz-linear-gradient(top, #45484d 0%, #333333 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0%,#45484d), color-stop(100%,#333333));background:-webkit-linear-gradient(top, #45484d 0%,#333333 100%);background:-o-linear-gradient(top, #45484d 0%,#333333 100%);background:-ms-linear-gradient(top, #45484d 0%,#333333 100%);background:linear-gradient(to bottom, #45484d 0%,#333333 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#45484d', endColorstr='#333333',GradientType=0 );
+ h1 {color:#fff;font-size:26px;padding:10px 15px;text-shadow:1px 1px 0 #999;
+ background:#45484d;background:linear-gradient(to bottom, #45484d 0%,#333333 100%);
}
#the_header {border-bottom:1px solid #cdcdcd;margin-bottom:1px;}
@@ -934,6 +942,9 @@ array(
Copyright &copy; 2002-2013 <a href="http://piwigo.org">Piwigo Team</a>
</div> <!-- the_footer -->
+
+<script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
+<script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.4/jquery.dataTables.min.js"></script>
<script type="text/javascript">
var oTable = $('#list').dataTable({
diff --git a/tools/ws.htm b/tools/ws.htm
index f77d9ba59..1c55b59cb 100644
--- a/tools/ws.htm
+++ b/tools/ws.htm
@@ -1,20 +1,18 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" dir="ltr">
+<html lang="en" dir="ltr">
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <meta charset="utf-8">
<title>Piwigo web API (web-services) explorer</title>
-
- <link rel="stylesheet" type="text/css" href="http://cdn.jsdelivr.net/tiptip/1.3/tipTip.css">
- <script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
- <script type="text/javascript" src="https://cdn.jsdelivr.net/tiptip/1.3/jquery.tipTip.minified.js"></script>
-
- <style type="text/css">
+
+ <link rel="stylesheet" href="http://cdn.jsdelivr.net/tiptip/1.3/tipTip.css">
+
+ <style>
/* BEGIN CSS RESET
http://meyerweb.com/eric/tools/css/reset
v2.0 | 20110126 | License: none (public domain) */
html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li,
- fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed,
+ fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video
{margin:0;padding:0;border:0;font-size:100%;vertical-align:baseline;}
@@ -28,29 +26,25 @@
html {font-family:"Corbel","Lucida Grande","Verdana",sans-serif;color:#222;font-size:13px;}
a {color:#247EBF;text-decoration:none;}
- a:hover {color:#EB9C39;border-bottom-width:1px;border-style:dotted;
- text-shadow:1px 1px 0 #ddd;-moz-text-shadow:1px 1px 0 #ddd;-webkit-text-shadow:1px 1px 0 #ddd;
- }
+ a:hover {color:#EB9C39;border-bottom-width:1px;border-style:dotted;text-shadow:1px 1px 0 #ddd;}
+
blockquote {border:1px solid #cdcdcd;background:#F9F9F9;padding:8px;}
hr {margin:10px 30px;color:#fff;}
ul {margin-left:25px;}
p {margin:8px 0;}
- h1 {color:#fff;font-size:26px;padding:10px 15px;
- text-shadow:1px 1px 0 #999;-moz-text-shadow:1px 1px 0 #999;-webkit-text-shadow:1px 1px 0 #999;
- background:#45484d;background:-moz-linear-gradient(top, #45484d 0%, #333333 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0%,#45484d), color-stop(100%,#333333));background:-webkit-linear-gradient(top, #45484d 0%,#333333 100%);background:-o-linear-gradient(top, #45484d 0%,#333333 100%);background:-ms-linear-gradient(top, #45484d 0%,#333333 100%);background:linear-gradient(to bottom, #45484d 0%,#333333 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#45484d', endColorstr='#333333',GradientType=0 );
+ h1 {color:#fff;font-size:26px;padding:10px 15px;text-shadow:1px 1px 0 #999;
+ background:#45484d;background:linear-gradient(to bottom, #45484d 0%,#333333 100%);
}
- h2 {color:#fff;font-size:20px;padding:5px 10px;
- text-shadow:1px 1px 0 #555;-moz-text-shadow:1px 1px 0 #555;-webkit-text-shadow:1px 1px 0 #555;
- background:#f2a841;background:-moz-linear-gradient(top, #f2a841 0%, #ef6b13 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0%,#f2a841), color-stop(100%,#ef6b13));background:-webkit-linear-gradient(top, #f2a841 0%,#ef6b13 100%);background:-o-linear-gradient(top, #f2a841 0%,#ef6b13 100%);background:-ms-linear-gradient(top, #f2a841 0%,#ef6b13 100%);background:linear-gradient(to bottom, #f2a841 0%,#ef6b13 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#f2a841', endColorstr='#ef6b13',GradientType=0 );
+ h2 {color:#fff;font-size:20px;padding:5px 10px;text-shadow:1px 1px 0 #555;
+ background:#f2a841;background:linear-gradient(to bottom, #f2a841 0%,#ef6b13 100%);
}
h2#errorWrapper {color:#F42C00;font-weight:normal;
- background:#eaeaea;background:-moz-linear-gradient(top, #eaeaea 0%, #afafaf 100%);background:-webkit-gradient(linear, lefttop, leftbottom, color-stop(0%,#eaeaea), color-stop(100%,#afafaf));background:-webkit-linear-gradient(top, #eaeaea 0%, #afafaf 100%);background:-o-linear-gradient(top, #eaeaea 0%, #afafaf 100%);background:-ms-linear-gradient(top, #eaeaea 0%, #afafaf 100%);background:linear-gradient(tobottom, #eaeaea 0%, #afafaf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eaeaea', endColorstr='#afafaf', GradientType=0);
+ background:#eaeaea;background:linear-gradient(to bottom, #eaeaea 0%, #afafaf 100%);
}
h3 {display:inline-block;padding:5px 10px;color:#555;font-weight:bold;text-align:center;
- border-radius:8px 8px 0 0;-moz-border-radius:8px 8px 0 0;-webkit-border-radius:8px 8px 0 0;
- text-shadow:1px 1px 0 #bbb;-moz-text-shadow:1px 1px 0 #bbb;-webkit-text-shadow:1px 1px 0 #bbb;
- background:#f2f2f2;background:-moz-linear-gradient(top, #f2f2f2 0%, #cecece 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0%,#f2f2f2), color-stop(100%,#cecece));background:-webkit-linear-gradient(top, #f2f2f2 0%,#cecece 100%);background:-o-linear-gradient(top, #f2f2f2 0%,#cecece 100%);background:-ms-linear-gradient(top, #f2f2f2 0%,#cecece 100%);background:linear-gradient(to bottom, #f2f2f2 0%,#cecece 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#f2f2f2', endColorstr='#cecece',GradientType=0 );
+ border-radius:8px 8px 0 0;text-shadow:1px 1px 0 #bbb;
+ background:#f2f2f2;background:linear-gradient(to bottom, #f2f2f2 0%,#cecece 100%);
}
#the_header {border-bottom:1px solid #cdcdcd;margin-bottom:1px;}
@@ -59,14 +53,14 @@
#the_methods {width:250px;float:left;border-style:solid;border-color:#cdcdcd;border-width:1px 1px 0 0;
background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAADCAIAAADZSiLoAAAAH0lEQVQImSXHMQEAMAwCMOrfK0jIjuVL2gLBzyHJtgd7wBdU3Vt/7AAAAABJRU5ErkJggg==);
}
- #the_methods ul {font-size:1.1em;margin:5px 0 10px 10px;list-style:none;}
- #the_methods li:before {content:"\203A\00A0";font-weight:bold;color:#EB9C39;font-size:1.1em;}
- #the_methods li:hover:before {content:"\00A0\203A";}
+ #methodsList {font-size:1.1em;margin:5px 0 10px 10px;list-style:none;}
+ #methodsList li:before {content:"\203A\00A0";font-weight:bold;color:#EB9C39;font-size:1.1em;}
+ #methodsList li:hover:before {content:"\00A0\203A";}
#the_page {margin-left:252px;border-style:solid;border-color:#cdcdcd;border-width:1px 0 0 1px;}
#the_content {padding:10px;}
- #methodParams {display:inline-block;}
+ #methodParams {margin-right:230px;}
#methodParams thead td {background:#DEE3E9;font-weight:bold;padding:2px 5px;}
#methodParams td {padding:2px;border:1px solid #cdcdcd;vertical-align:middle;}
#methodParams tbody tr:nth-child(even) {background:#f7f7f7;}
@@ -74,36 +68,39 @@
#methodParams td.mini {width:0px;text-align:center;}
#methodParams tfoot {font-size:0.95em;}
#methodParams td.input {text-align:center;}
- #methodParams td.input input[type="text"] {width:97%;font-size:0.9em;background:#f7f7f7;border:1px solid #ccc;
- border-radius:2px;-moz-border-radius:2px;-webkit-border-radius:2px;
- }
+ #methodParams td.input input[type="text"] {width:97%;font-size:0.9em;background:#f7f7f7;border:1px solid #ccc;border-radius:2px;}
#methodParams td.input input[type="text"]:hover, #methodParams td.input input[type="text"]:focus {border-color:#C7E2F1;border-top-color:#96BCD7;background:#fff;}
+ #methodParams .type {display:inline-block;width:16px;height:16px;font-size:12px;line-height:16px;background:#ddd;border-radius:8px;font-weight:bold;text-align:center;color:#222;}
+ #methodParams .subtype {vertical-align:super;}
- #testForm {display:inline-block;margin-left:15px;}
+ #testForm {float:right;}
#testForm td {padding:2px 0;}
#testForm tr:last-child td {padding:8px 0 5px 0;}
#testForm blockquote {width:200px;}
-
+
#introMessage {font-size:1.1em;}
#urlForm {margin-bottom:10px;}
a.button {color:#fff;padding:3px 8px;border:1px solid #91bb5c;font-size:0.9em;margin-right:3px;display:inline-block;
- border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;
- text-shadow:1px 1px 0 #666;-moz-text-shadow:1px 1px 0 #666;-webkit-text-shadow:1px 1px 0 #666;
- background:#84bb3c;background:-moz-linear-gradient(top, #84bb3c 0%, #3f5a1d 100%);background:-webkit-gradient(linear, lefttop, leftbottom, color-stop(0%,#84bb3c), color-stop(100%,#3f5a1d));background:-webkit-linear-gradient(top, #84bb3c 0%, #3f5a1d 100%);background:-o-linear-gradient(top, #84bb3c 0%, #3f5a1d 100%);background:-ms-linear-gradient(top, #84bb3c 0%, #3f5a1d 100%);background:linear-gradient(tobottom, #84bb3c 0%, #3f5a1d 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#84bb3c', endColorstr='#3f5a1d', GradientType=0);
+ border-radius:5px;text-shadow:1px 1px 0 #666;
+ background:#84bb3c;background:linear-gradient(to bottom, #84bb3c 0%, #3f5a1d 100%);
}
a.button:hover {color:#E5FF00;}
-
+
.methodInfo {float:right;display:inline-block;width:16px;height:16px;font-size:12px;line-height:16px;background:#555;border-radius:8px;font-family:"Times New Roman",sans-serif;font-style:italic;font-weight:bold;text-align:center;color:#fff;}
.methodInfo:hover {border:none;text-shadow:none;background:#888;cursor:pointer;color:#fff;}
-
+ #tiptip_content { font-size:12px; }
+
#iframeWrapper {width:100%;height:300px;padding:3px 3px 20px 3px;background:#F9F9F9;border:1px solid #cdcdcd;overflow:hidden;position:relative;}
iframe {width:100%;height:100%;background:#fff;}
+
+ div.onlys {background:#faa;color:#fff;border:1px solid #f22;padding:.25em .5em;display:table;border-radius:4px;margin-bottom:0.5em;}
</style>
-
+
</head>
<body>
+<a name="top"></a>
<div id="the_header">
<h1>Piwigo web API (web-services) explorer</h1>
@@ -111,7 +108,7 @@
<div id="the_methods">
<h2>Available methods</h2>
-
+
<ul id="methodsList">
</ul>
</div> <!-- the_methods -->
@@ -119,13 +116,13 @@
<div id="the_page">
<h2 id="methodName" style="display:none;"></h2>
<h2 id="errorWrapper" style="display:none;"></h2>
-
+
<div id="the_content">
<form id="urlForm" style="display:none;">
<input type="text" name="ws_url" size="60">
<input type="submit" value="Go!">
</form>
-
+
<blockquote id="introMessage">
<p>
<b>API = Application Programming Interface.</b><br>
@@ -156,30 +153,7 @@
</blockquote>
<br>
</div> <!-- methodDescription -->
-
- <div id="methodParams">
- <h3>Method parameters</h3>
- <table>
- <thead>
- <tr>
- <td style="width:150px;">Name</td>
- <td class="mini">Extra</td>
- <td style="width:300px;">Value</td>
- <td class="mini">Send</td>
- </tr>
- </thead>
-
- <tbody>
- </tbody>
-
- <tfoot>
- <tr>
- <td colspan="4"><b>*</b>: required parameter, <b>?</b>: optional parameter, <b>[]</b>: parameter can be an array (use a pipe | to split values)</td>
- </tr>
- </tfoot>
- </table>
- </div> <!-- methodParams -->
-
+
<div id="testForm">
<h3>Test</h3>
<blockquote>
@@ -188,7 +162,7 @@
<td>Request format :</td>
<td>
<select id="requestFormat">
- <option value="get" selected="selected">GET</option>
+ <option value="get" selected>GET</option>
<option value="post">POST</option>
</select>
</td>
@@ -197,7 +171,7 @@
<td>Response format :</td>
<td>
<select id="responseFormat">
- <option value="rest" selected="selected">REST (xml)</option>
+ <option value="rest" selected>REST (xml)</option>
<option value="json">JSON</option>
<option value="php">PHP serial</option>
<option value="xmlrpc">XML RPC</option>
@@ -213,20 +187,48 @@
</table>
</blockquote>
</div> <!-- testForm -->
-
+
+ <div id="methodParams">
+ <h3>Method parameters</h3>
+ <table>
+ <thead>
+ <tr>
+ <td style="width:150px;">Name</td>
+ <td class="mini">Extra</td>
+ <td class="mini">Type</td>
+ <td style="width:300px;">Value</td>
+ <td class="mini">Send</td>
+ </tr>
+ </thead>
+
+ <tbody>
+ </tbody>
+
+ <tfoot>
+ <tr>
+ <td colspan="5">
+ <b>*</b>: required, <b>?</b>: optional, <b>[]</b>: can be an array (use a pipe | to split values)<br>
+ <b>B</b>: boolean, <b>I</b>: integer, <b>F</b>: float, <b>+</b>: positive, <b>&oslash;</b>: not null
+ </td>
+ </tr>
+ </tfoot>
+ </table>
+ </div> <!-- methodParams -->
+
<br><br>
-
+
<h3>Result</h3>
<div id="iframeWrapper">
<iframe src="" id="invokeFrame" name="invokeFrame"></iframe>
- <a href="#bottom" id="increaseIframe"><b>&darr;</b> increase height</a> &#8226; <a href="#bottom" id="decreaseIframe"><b>&uarr;</b> decrease height</a>
- <a name="bottom"></a>
+ <a href="#iframe-bottom" id="increaseIframe"><b>&darr;</b> increase height</a> &#8226;
+ <a href="#iframe-bottom" id="decreaseIframe"><b>&uarr;</b> decrease height</a>
+ <a name="iframe-bottom"></a>
</div>
</form> <!-- iframeWrapper -->
-
+
<!-- hidden form for POST submition -->
<form method="post" action="" target="" id="invokeForm" style="display:none;"></form>
-
+
</div> <!-- the_content -->
</div> <!-- the_page -->
@@ -235,8 +237,10 @@
Copyright &copy; 2002-2013 <a href="http://piwigo.org">Piwigo Team</a>
</div> <!-- the_footer -->
+<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
+<script src="https://cdn.jsdelivr.net/tiptip/1.3/jquery.tipTip.minified.js"></script>
-<script type="text/javascript">
+<script>
// global vars
var cachedMethods = new Array;
var ws_url = "http://";
@@ -286,6 +290,7 @@ function resetDisplay() {
$("#methodWrapper").hide();
$("#methodName").hide();
$("#urlForm").hide();
+ $("#methodDescription blockquote").empty();
$("#methodDescription").hide();
$("#invokeFrame").attr('src','');
}
@@ -295,10 +300,10 @@ function adaptHeight()
{
$("#the_page").css('height', 'auto');
$("#the_methods").css('height', 'auto');
-
+
min_h = $(window).height()-$("#the_header").outerHeight()-$("#the_footer").outerHeight()-3;
h = Math.max(min_h, Math.max($("#the_methods").height(), $("#the_page").height()));
-
+
$("#the_page").css('height', h);
$("#the_methods").css('height', h);
}
@@ -312,11 +317,11 @@ function displayError(error) {
// display ws_url form
function askForUrl() {
+ displayError("can't contact web-services, please give absolute url to 'ws.php'");
if ($("#urlForm input[name='ws_url']").val() == "") {
$("#urlForm input[name='ws_url']").val(ws_url);
}
$("#urlForm").show();
- displayError("can't contact web-services, please give absolute url to 'ws.php'");
}
// parse Piwigo JSON
@@ -331,37 +336,36 @@ function parsePwgJSON(json) {
displayError("unable to parse JSON string");
resp = {"stat": "ko", "result": "null"};
}
-
+
return resp.result;
}
// fetch methods list
function getMethodList() {
resetDisplay();
-
+
$.ajax({
type: "GET",
url: ws_url,
data: { format: "json", method: "reflection.getMethodList" }
}).done(function(result) {
result = parsePwgJSON(result);
-
+
if (result!=null) {
methods = result.methods;
-
+
var ml = '';
for (var i=0; i<methods.length; i++)
{
- ml += '<li><a href="#">'+ methods[i]+'</a></li>';
+ ml += '<li><a href="#top">'+ methods[i]+'</a></li>';
}
$("#methodsList").html(ml).show();
-
+
adaptHeight();
-
+
// trigger method selection
$("#methodsList li a").click(function() {
selectMethod($(this).html());
- return false;
});
}
}).error(function(jqXHR, textStatus, errorThrown) {
@@ -372,7 +376,8 @@ function getMethodList() {
// select method
function selectMethod(methodName) {
$("#introMessage").hide();
-
+ $("#tiptip_holder").fadeOut(200);
+
if (cachedMethods[ methodName ]) {
fillNewMethod(methodName);
}
@@ -381,10 +386,22 @@ function selectMethod(methodName) {
type: "GET",
url: ws_url,
data: { format: "json", method: "reflection.getMethodDetails", methodName: methodName }
- }).done(function(result) {
+ }).done(function(result) {
result = parsePwgJSON(result);
-
+
if (result!=null) {
+ if (result.options.post_only || result.options.admin_only) {
+ var onlys = '<div class="onlys">';
+ if (result.options.post_only) {
+ onlys+= 'POST only. ';
+ }
+ if (result.options.admin_only) {
+ onlys+= 'Admin only. ';
+ }
+ onlys+= '</div>';
+
+ result.description = onlys + result.description;
+ }
cachedMethods[ methodName ] = result;
fillNewMethod(methodName);
}
@@ -397,32 +414,43 @@ function selectMethod(methodName) {
// display method details
function fillNewMethod(methodName) {
resetDisplay();
-
+
method = cachedMethods[ methodName ];
-
+
$("#methodName").html(method.name).show();
-
+
if (method.description != "") {
$("#methodDescription blockquote").html(method.description);
$("#methodDescription").show();
}
-
+
+ $("#requestFormat").val(method.options.post_only ? 'post' : 'get');
+
var methodParams = '';
if (method.params && method.params.length>0) {
for (var i=0; i<method.params.length; i++) {
- var isOptional = method.params[i].optional;
- var acceptArray = method.params[i].acceptArray;
- var defaultValue = method.params[i].defaultValue == null ? '' : method.params[i].defaultValue;
- var info = method.params[i].info == null ? '' : '<a class="methodInfo" title="'+ method.params[i].info + '">i</a>';
-
+ var param = method.params[i],
+ isOptional = param.optional,
+ acceptArray = param.acceptArray,
+ defaultValue = param.defaultValue == null ? '' : param.defaultValue,
+ info = param.info == null ? '' : '<a class="methodInfo" title="'+ param.info.replace(/"/g, '&quot;') + '">i</a>',
+ type = '';
+
+ if (param.type.match(/bool/)) type+= '<span class=type>B</span>';
+ if (param.type.match(/int/)) type+= '<span class=type>I</span>';
+ if (param.type.match(/float/)) type+= '<span class=type>F</span>';
+ if (param.type.match(/positive/)) type+= '<span class=subtype>+</span>';
+ if (param.type.match(/notnull/)) type+= '<span class=subtype>&oslash;</span>';
+
// if an array is direclty printed, the delimiter is a comma where we use a pipe
if (typeof defaultValue == 'object') {
defaultValue = defaultValue.join('|');
}
methodParams+= '<tr>'+
- '<td>'+ method.params[i].name + info +'</td>'+
+ '<td>'+ param.name + info +'</td>'+
'<td class="mini">'+ (isOptional ? '?':'*') + (acceptArray ? ' []':'') +'</td>'+
+ '<td class="mini">'+ type +'</td>'+
'<td class="input"><input type="text" class="methodParameterValue" data-id="'+ i +'" value="'+ defaultValue +'"></td>'+
'<td class="mini"><input type="checkbox" class="methodParameterSend" data-id="'+ i +'" '+ (isOptional ? '':'checked="checked"') +'></td>'+
'</tr>';
@@ -431,20 +459,19 @@ function fillNewMethod(methodName) {
else {
methodParams = '<tr><td colspan="4">This method takes no parameters</td></tr>';
}
-
+
$("#methodParams tbody").html(methodParams);
- $("#methodWrapper").show();
-
+ $("#methodWrapper").show();
+
adaptHeight();
-
+
// trigger field modification
$("input.methodParameterValue").change(function() {
$("input.methodParameterSend[data-id='"+ $(this).data('id') +"']").attr('checked', 'checked');
});
-
+
// tiptip
$(".methodInfo").tipTip({
- activation:"click",
maxWidth:"300px",
defaultPosition:"right",
delay:0
@@ -456,18 +483,18 @@ function invokeMethod(methodName, newWindow) {
var method = cachedMethods[ methodName ];
var reqUrl = ws_url +"?format="+ $("#responseFormat").val();
-
+
// GET
if ($("#requestFormat").val() == 'get') {
reqUrl+= "&method="+ methodName;
-
+
for (var i=0; i<method.params.length; i++) {
if (! $("input.methodParameterSend[data-id='"+ i +"']").is(":checked")) {
continue;
}
var paramValue = $("input.methodParameterValue[data-id='"+ i +"']").val();
-
+
var paramSplitted = paramValue.split('|');
if (method.params[i].acceptArray && paramSplitted.length > 1) {
$.each(paramSplitted, function(v) {
@@ -478,7 +505,7 @@ function invokeMethod(methodName, newWindow) {
reqUrl+= '&'+ method.params[i].name +'='+ paramValue;
}
}
-
+
if (newWindow) {
window.open(reqUrl);
}
@@ -490,9 +517,9 @@ function invokeMethod(methodName, newWindow) {
else {
var form = $("#invokeForm");
form.attr('action', reqUrl);
-
+
var t = '<input type="hidden" name="method" value="'+ methodName +'">';
-
+
for (var i=0; i<method.params.length; i++) {
if (! $("input.methodParameterSend[data-id='"+ i +"']").is(":checked")) {
continue;
@@ -510,15 +537,15 @@ function invokeMethod(methodName, newWindow) {
t+= '<input type="hidden" name="'+ method.params[i].name +'" value="'+ paramValue +'">';
}
}
-
+
form.html(t);
form.attr('target', newWindow ? "_blank" : "invokeFrame");
form.submit();
}
-
+
return false;
}
</script>
</body>
-</html>
+</html> \ No newline at end of file
diff --git a/upgrade.php b/upgrade.php
index 14a73ac8b..7c707bd7c 100644
--- a/upgrade.php
+++ b/upgrade.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -73,7 +73,7 @@ SHOW TABLES
{
if (preg_match('/^'.PREFIX_TABLE.'/', $row[0]))
{
- array_push($tables, $row[0]);
+ $tables[] = $row[0];
}
}
@@ -100,7 +100,7 @@ DESC '.$table.'
while ($row = pwg_db_fetch_row($result))
{
- array_push($columns_of[$table], $row[0]);
+ $columns_of[$table][] = $row[0];
}
}
@@ -195,6 +195,9 @@ else if ('tr_TR' == $language) {
else if ('da_DK' == $language) {
define('PHPWG_DOMAIN', 'da.piwigo.org');
}
+else if ('pt_BR' == $language) {
+ define('PHPWG_DOMAIN', 'br.piwigo.org');
+}
else {
define('PHPWG_DOMAIN', 'piwigo.org');
}
@@ -231,7 +234,7 @@ $template = new Template(PHPWG_ROOT_PATH.'admin/themes', 'clear');
$template->set_filenames(array('upgrade'=>'upgrade.tpl'));
$template->assign(array(
'RELEASE' => PHPWG_VERSION,
- 'L_UPGRADE_HELP' => sprintf(l10n('Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'), PHPWG_URL.'/forum'),
+ 'L_UPGRADE_HELP' => l10n('Need help ? Ask your question on <a href="%s">Piwigo message board</a>.', PHPWG_URL.'/forum'),
)
);
@@ -332,6 +335,10 @@ else if (!in_array('rotation', $columns_of[PREFIX_TABLE.'images']))
{
$current_release = '2.3.0';
}
+else if (!in_array('website_url', $columns_of[PREFIX_TABLE.'comments']))
+{
+ $current_release = '2.4.0';
+}
else
{
// retrieve already applied upgrades
@@ -341,15 +348,16 @@ SELECT id
;';
$applied_upgrades = array_from_query($query, 'id');
- if (!in_array(134, $applied_upgrades))
+ if (!in_array(139, $applied_upgrades))
{
- $current_release = '2.4.0';
+ $current_release = '2.5.0';
}
else
{
// confirm that the database is in the same version as source code files
conf_update_param('piwigo_db_version', get_branch_from_version(PHPWG_VERSION));
-
+
+ header('Content-Type: text/html; charset='.get_pwg_charset());
echo 'No upgrade required, the database structure is up to date';
echo '<br><a href="index.php">↠back to gallery</a>';
exit();
@@ -386,15 +394,12 @@ if ((isset($_POST['submit']) or isset($_GET['now']))
if (!@file_put_contents($config_file, $config_file_contents))
{
- array_push(
- $page['infos'],
- sprintf(
- l10n('In <i>%s</i>, before <b>?></b>, insert:'),
- PWG_LOCAL_DIR.'config/database.inc.php'
- )
- .'<p><textarea rows="4" cols="40">'
- .implode("\r\n" , $mysql_changes).'</textarea></p>'
- );
+ $page['infos'][] = l10n(
+ 'In <i>%s</i>, before <b>?></b>, insert:',
+ PWG_LOCAL_DIR.'config/database.inc.php'
+ )
+ .'<p><textarea rows="4" cols="40">'
+ .implode("\r\n" , $mysql_changes).'</textarea></p>';
}
}
@@ -427,9 +432,7 @@ if ((isset($_POST['submit']) or isset($_GET['now']))
)
);
- array_push($page['infos'],
- l10n('Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.')
- );
+ $page['infos'][] = l10n('Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.');
// Save $page['infos'] in order to restore after maintenance actions
$page['infos_sav'] = $page['infos'];
diff --git a/upgrade_feed.php b/upgrade_feed.php
index 87507c8d9..77e2aea8a 100644
--- a/upgrade_feed.php
+++ b/upgrade_feed.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
diff --git a/ws.php b/ws.php
index 82da5aa03..5551c87df 100644
--- a/ws.php
+++ b/ws.php
@@ -2,7 +2,7 @@
// +-----------------------------------------------------------------------+
// | Piwigo - a PHP based photo gallery |
// +-----------------------------------------------------------------------+
-// | Copyright(C) 2008-2013 Piwigo Team http://piwigo.org |
+// | Copyright(C) 2008-2014 Piwigo Team http://piwigo.org |
// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net |
// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick |
// +-----------------------------------------------------------------------+
@@ -25,15 +25,15 @@ define ('PHPWG_ROOT_PATH', './');
include_once(PHPWG_ROOT_PATH.'include/common.inc.php');
check_status(ACCESS_FREE);
-include_once(PHPWG_ROOT_PATH.'include/ws_core.inc.php');
if ( !$conf['allow_web_services'] )
{
page_forbidden('Web services are disabled');
}
-add_event_handler('ws_add_methods', 'ws_addDefaultMethods');
+include_once(PHPWG_ROOT_PATH.'include/ws_core.inc.php');
+add_event_handler('ws_add_methods', 'ws_addDefaultMethods');
add_event_handler('ws_invoke_allowed', 'ws_isInvokeAllowed', EVENT_HANDLER_PRIORITY_NEUTRAL, 3);
$requestFormat = 'rest';
@@ -102,250 +102,306 @@ function ws_addDefaultMethods( $arr )
$service = &$arr[0];
include_once(PHPWG_ROOT_PATH.'include/ws_functions.inc.php');
+ $ws_functions_root = PHPWG_ROOT_PATH.'include/ws_functions/';
+
+ $f_params = array(
+ 'f_min_rate' => array('default'=>null,
+ 'type'=>WS_TYPE_FLOAT),
+ 'f_max_rate' => array('default'=>null,
+ 'type'=>WS_TYPE_FLOAT),
+ 'f_min_hit' => array('default'=>null,
+ 'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
+ 'f_max_hit' => array('default'=>null,
+ 'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
+ 'f_min_ratio' => array('default'=>null,
+ 'type'=>WS_TYPE_FLOAT|WS_TYPE_POSITIVE),
+ 'f_max_ratio' => array('default'=>null,
+ 'type'=>WS_TYPE_FLOAT|WS_TYPE_POSITIVE),
+ 'f_max_level' => array('default'=>null,
+ 'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
+ 'f_min_date_available' => array('default'=>null),
+ 'f_max_date_available' => array('default'=>null),
+ 'f_min_date_created' => array('default'=>null),
+ 'f_max_date_created' => array('default'=>null),
+ );
$service->addMethod(
'pwg.getVersion',
'ws_getVersion',
null,
- 'retrieves the PWG version'
+ 'Returns the Piwigo version.',
+ $ws_functions_root . 'pwg.php'
);
$service->addMethod(
'pwg.getInfos',
'ws_getInfos',
null,
- 'retrieves general informations'
+ 'Returns general informations.',
+ $ws_functions_root . 'pwg.php',
+ array('admin_only'=>true)
);
$service->addMethod(
'pwg.caddie.add',
'ws_caddie_add',
array(
- 'image_id'=> array('flags'=>WS_PARAM_FORCE_ARRAY),
+ 'image_id'=> array('flags'=>WS_PARAM_FORCE_ARRAY,
+ 'type'=>WS_TYPE_ID),
),
- 'adds the elements to the caddie'
+ 'Adds elements to the caddie. Returns the number of elements added.',
+ $ws_functions_root . 'pwg.php',
+ array('admin_only'=>true)
);
$service->addMethod(
'pwg.categories.getImages',
'ws_categories_getImages',
- array(
- 'cat_id' => array('default'=>0,
- 'flags'=>WS_PARAM_FORCE_ARRAY),
- 'recursive' => array('default'=>false ),
- 'per_page' => array('default'=>100,
- 'maxValue'=>$conf['ws_max_images_per_page']),
- 'page' => array('default'=>0),
- 'order' => array('default'=>null),
- 'f_min_rate' => array('default'=>null),
- 'f_max_rate' => array('default'=>null),
- 'f_min_hit' => array('default'=>null),
- 'f_max_hit' => array('default'=>null),
- 'f_min_date_available' => array('default'=>null),
- 'f_max_date_available' => array('default'=>null),
- 'f_min_date_created' => array('default'=>null),
- 'f_max_date_created' => array('default'=>null),
- 'f_min_ratio' => array('default'=>null),
- 'f_max_ratio' => array('default'=>null),
- 'f_max_level' => array('default'=>null),
- ),
+ array_merge(array(
+ 'cat_id' => array('default'=>null,
+ 'flags'=>WS_PARAM_FORCE_ARRAY,
+ 'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
+ 'recursive' => array('default'=>false,
+ 'type'=>WS_TYPE_BOOL),
+ 'per_page' => array('default'=>100,
+ 'maxValue'=>$conf['ws_max_images_per_page'],
+ 'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
+ 'page' => array('default'=>0,
+ 'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
+ 'order' => array('default'=>null,
+ 'info'=>'id, file, name, hit, rating_score, date_creation, date_available, random'),
+ ), $f_params),
'Returns elements for the corresponding categories.
-<br><b>cat_id</b> can be empty if <b>recursive</b> is true. Can be sent as an array.
-<br><b>order</b> comma separated fields for sorting (file,id, rating_score,...)'
+<br><b>cat_id</b> can be empty if <b>recursive</b> is true.
+<br><b>order</b> comma separated fields for sorting',
+ $ws_functions_root . 'pwg.categories.php'
);
$service->addMethod(
'pwg.categories.getList',
'ws_categories_getList',
array(
- 'cat_id' => array('default'=>0),
- 'recursive' => array('default'=>false),
- 'public' => array('default'=>false),
- 'tree_output' => array('default'=>false),
- 'fullname' => array('default'=>false),
+ 'cat_id' => array('default'=>null,
+ 'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE,
+ 'info'=>'Parent category. "0" or empty for root.'),
+ 'recursive' => array('default'=>false,
+ 'type'=>WS_TYPE_BOOL),
+ 'public' => array('default'=>false,
+ 'type'=>WS_TYPE_BOOL),
+ 'tree_output' => array('default'=>false,
+ 'type'=>WS_TYPE_BOOL),
+ 'fullname' => array('default'=>false,
+ 'type'=>WS_TYPE_BOOL),
),
- 'retrieves a list of categories (tree_output option only compatible with json/php output format'
+ 'Returns a list of categories.',
+ $ws_functions_root . 'pwg.categories.php'
);
$service->addMethod(
'pwg.getMissingDerivatives',
'ws_getMissingDerivatives',
- array(
- 'types' => array('default'=>array(),
- 'flags'=>WS_PARAM_FORCE_ARRAY),
- 'ids' => array('default'=>array(),
- 'flags'=>WS_PARAM_FORCE_ARRAY),
- 'max_urls' => array('default'=>200),
- 'prev_page' => array('default'=>null),
- 'f_min_rate' => array('default'=>null),
- 'f_max_rate' => array('default'=>null),
- 'f_min_hit' => array('default'=>null),
- 'f_max_hit' => array('default'=>null),
- 'f_min_date_available' => array('default'=>null),
- 'f_max_date_available' => array('default'=>null),
- 'f_min_date_created' => array('default'=>null),
- 'f_max_date_created' => array('default'=>null),
- 'f_min_ratio' => array('default'=>null),
- 'f_max_ratio' => array('default'=>null),
- 'f_max_level' => array('default'=>null),
- ),
- 'retrieves a list of derivatives to build'
+ array_merge(array(
+ 'types' => array('default'=>null,
+ 'flags'=>WS_PARAM_FORCE_ARRAY,
+ 'info'=>'square, thumb, 2small, xsmall, small, medium, large, xlarge, xxlarge'),
+ 'ids' => array('default'=>null,
+ 'flags'=>WS_PARAM_FORCE_ARRAY,
+ 'type'=>WS_TYPE_ID),
+ 'max_urls' => array('default'=>200,
+ 'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
+ 'prev_page' => array('default'=>null,
+ 'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
+ ), $f_params),
+ 'Returns a list of derivatives to build.',
+ $ws_functions_root . 'pwg.php',
+ array('admin_only'=>true)
);
$service->addMethod(
'pwg.images.addComment',
'ws_images_addComment',
array(
- 'image_id' => array(),
+ 'image_id' => array('type'=>WS_TYPE_ID),
'author' => array('default'=>is_a_guest()?'guest':$user['username']),
'content' => array(),
'key' => array(),
),
- 'add a comment to an image'
+ 'Adds a comment to an image.',
+ $ws_functions_root . 'pwg.images.php',
+ array('post_only'=>true)
);
$service->addMethod(
'pwg.images.getInfo',
'ws_images_getInfo',
array(
- 'image_id' => array(),
- 'comments_page' => array('default'=>0 ),
- 'comments_per_page' => array('default' => $conf['nb_comment_page'],
- 'maxValue' => 2*$conf['nb_comment_page']),
+ 'image_id' => array('type'=>WS_TYPE_ID),
+ 'comments_page' => array('default'=>0,
+ 'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
+ 'comments_per_page' => array('default'=>$conf['nb_comment_page'],
+ 'maxValue'=>2*$conf['nb_comment_page'],
+ 'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
),
- 'retrieves information about the given photo'
+ 'Returns information about an image.',
+ $ws_functions_root . 'pwg.images.php'
);
$service->addMethod(
'pwg.images.rate',
'ws_images_rate',
- array('image_id', 'rate'),
- 'rate the image'
+ array(
+ 'image_id' => array('type'=>WS_TYPE_ID),
+ 'rate' => array('type'=>WS_TYPE_FLOAT),
+ ),
+ 'Rates an image.',
+ $ws_functions_root . 'pwg.images.php'
);
$service->addMethod(
'pwg.images.search',
'ws_images_search',
- array(
- 'query' => array(),
- 'per_page' => array('default'=>100,
- 'maxValue'=>$conf['ws_max_images_per_page']),
- 'page' => array('default'=>0),
- 'order' => array('default'=>null),
- 'f_min_rate' => array('default'=>null),
- 'f_max_rate' => array('default'=>null),
- 'f_min_hit' => array('default'=>null),
- 'f_max_hit' => array('default'=>null),
- 'f_min_date_available' => array('default'=>null),
- 'f_max_date_available' => array('default'=>null),
- 'f_min_date_created' => array('default'=>null),
- 'f_max_date_created' => array('default'=>null),
- 'f_min_ratio' => array('default'=>null),
- 'f_max_ratio' => array('default'=>null),
- 'f_max_level' => array('default'=>null),
- ),
- 'Returns elements for the corresponding query search.'
+ array_merge(array(
+ 'query' => array(),
+ 'per_page' => array('default'=>100,
+ 'maxValue'=>$conf['ws_max_images_per_page'],
+ 'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
+ 'page' => array('default'=>0,
+ 'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
+ 'order' => array('default'=>null,
+ 'info'=>'id, file, name, hit, rating_score, date_creation, date_available, random'),
+ ), $f_params),
+ 'Returns elements for the corresponding query search.',
+ $ws_functions_root . 'pwg.images.php'
);
$service->addMethod(
'pwg.images.setPrivacyLevel',
'ws_images_setPrivacyLevel',
array(
- 'image_id' => array('flags'=>WS_PARAM_FORCE_ARRAY),
- 'level' => array('maxValue'=>$conf['available_permission_levels']),
+ 'image_id' => array('flags'=>WS_PARAM_FORCE_ARRAY,
+ 'type'=>WS_TYPE_ID),
+ 'level' => array('maxValue'=>max($conf['available_permission_levels']),
+ 'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
),
- 'sets the privacy levels for the images (POST method only)'
+ 'Sets the privacy levels for the images.',
+ $ws_functions_root . 'pwg.images.php',
+ array('admin_only'=>true, 'post_only'=>true)
);
$service->addMethod(
'pwg.images.setRank',
'ws_images_setRank',
- array('image_id', 'category_id', 'rank'),
- 'sets the rank of a photo for a given album (POST method only, for admins)'
+ array(
+ 'image_id' => array('type'=>WS_TYPE_ID),
+ 'category_id' => array('type'=>WS_TYPE_ID),
+ 'rank' => array('type'=>WS_TYPE_INT|WS_TYPE_POSITIVE|WS_TYPE_NOTNULL)
+ ),
+ 'Sets the rank of a photo for a given album.',
+ $ws_functions_root . 'pwg.images.php',
+ array('admin_only'=>true, 'post_only'=>true)
);
$service->addMethod(
'pwg.rates.delete',
'ws_rates_delete',
array(
- 'user_id' => array(),
+ 'user_id' => array('type'=>WS_TYPE_ID),
'anonymous_id' => array('default'=>null),
),
- 'deletes all rates for a user (POST method only, admins only)'
+ 'Deletes all rates for a user.',
+ $ws_functions_root . 'pwg.php',
+ array('admin_only'=>true, 'post_only'=>true)
);
$service->addMethod(
'pwg.session.getStatus',
'ws_session_getStatus',
null,
- null
+ 'Gets information about the current session. Also provides a token useable with admin methods.',
+ $ws_functions_root . 'pwg.php'
);
$service->addMethod(
'pwg.session.login',
'ws_session_login',
array('username', 'password'),
- 'POST method only'
+ 'Tries to login the user.',
+ $ws_functions_root . 'pwg.php',
+ array('post_only'=>true)
);
$service->addMethod(
'pwg.session.logout',
'ws_session_logout',
null,
- null
+ 'Ends the current session.',
+ $ws_functions_root . 'pwg.php'
);
$service->addMethod(
'pwg.tags.getList',
'ws_tags_getList',
array(
- 'sort_by_counter' => array('default' =>false),
+ 'sort_by_counter' => array('default'=>false,
+ 'type'=>WS_TYPE_BOOL),
),
- 'retrieves a list of available tags'
+ 'Retrieves a list of available tags.',
+ $ws_functions_root . 'pwg.tags.php'
);
$service->addMethod(
'pwg.tags.getImages',
'ws_tags_getImages',
- array(
+ array_merge(array(
'tag_id' => array('default'=>null,
- 'flags'=>WS_PARAM_FORCE_ARRAY),
+ 'flags'=>WS_PARAM_FORCE_ARRAY,
+ 'type'=>WS_TYPE_ID),
'tag_url_name' => array('default'=>null,
'flags'=>WS_PARAM_FORCE_ARRAY),
'tag_name' => array('default'=>null,
'flags'=>WS_PARAM_FORCE_ARRAY),
- 'tag_mode_and' => array('default'=>false),
+ 'tag_mode_and' => array('default'=>false,
+ 'type'=>WS_TYPE_BOOL),
'per_page' => array('default'=>100,
- 'maxValue'=>$conf['ws_max_images_per_page']),
- 'page' => array('default'=>0),
- 'order' => array('default'=>null),
- 'f_min_rate' => array('default'=>null),
- 'f_max_rate' => array('default'=>null),
- 'f_min_hit' => array('default'=>null),
- 'f_max_hit' => array('default'=>null),
- 'f_min_date_available' => array('default'=>null),
- 'f_max_date_available' => array('default'=>null),
- 'f_min_date_created' => array('default'=>null),
- 'f_max_date_created' => array('default'=>null),
- 'f_min_ratio' => array('default'=>null),
- 'f_max_ratio' => array('default'=>null),
- 'f_max_level' => array('default'=>null),
- ),
- 'Returns elements for the corresponding tags. Note that tag_id, tag_url_name, tag_name an be arrays. Fill at least one of them. '
+ 'maxValue'=>$conf['ws_max_images_per_page'],
+ 'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
+ 'page' => array('default'=>0,
+ 'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
+ 'order' => array('default'=>null,
+ 'info'=>'id, file, name, hit, rating_score, date_creation, date_available, random'),
+ ), $f_params),
+ 'Returns elements for the corresponding tags. Fill at least tag_id, tag_url_name or tag_name.',
+ $ws_functions_root . 'pwg.tags.php'
);
$service->addMethod(
'pwg.images.addChunk',
'ws_images_add_chunk',
- array('data', 'original_sum', 'type', 'position'),
- 'POST method only. For admin only.'
+ array(
+ 'data' => array(),
+ 'original_sum' => array(),
+ 'type' => array('default'=>'file',
+ 'info'=>'Must be "file", for backward compatiblity "high" and "thumb" are allowed.'),
+ 'position' => array()
+ ),
+ 'Add a chunk of a file.',
+ $ws_functions_root . 'pwg.images.php',
+ array('admin_only'=>true, 'post_only'=>true)
);
$service->addMethod(
'pwg.images.addFile',
'ws_images_addFile',
- array('image_id', 'type', 'sum'),
- 'Add or update a file for an existing photo. pwg.images.addChunk must have been called before (maybe several times)'
+ array(
+ 'image_id' => array('type'=>WS_TYPE_ID),
+ 'type' => array('default'=>'file',
+ 'info'=>'Must be "file", for backward compatiblity "high" and "thumb" are allowed.'),
+ 'sum' => array(),
+ ),
+ 'Add or update a file for an existing photo.
+<br>pwg.images.addChunk must have been called before (maybe several times).',
+ $ws_functions_root . 'pwg.images.php',
+ array('admin_only'=>true)
);
@@ -353,61 +409,79 @@ function ws_addDefaultMethods( $arr )
'pwg.images.add',
'ws_images_add',
array(
- 'file_sum' => array(),
'thumbnail_sum' => array('default'=>null),
'high_sum' => array('default'=>null),
'original_sum' => array(),
- 'original_filename' => array('default'=>null),
+ 'original_filename' => array('default'=>null,
+ 'Provide it if "check_uniqueness" is true and $conf["uniqueness_mode"] is "filename".'),
'name' => array('default'=>null),
'author' => array('default'=>null),
'date_creation' => array('default'=>null),
'comment' => array('default'=>null),
- 'categories' => array('default'=>null),
- 'tag_ids' => array('default'=>null),
+ 'categories' => array('default'=>null,
+ 'info'=>'String list "category_id[,rank];category_id[,rank]".<br>The rank is optional and is equivalent to "auto" if not given.'),
+ 'tag_ids' => array('default'=>null,
+ 'info'=>'Comma separated ids'),
'level' => array('default'=>0,
- 'maxValue'=>$conf['available_permission_levels']),
- 'check_uniqueness' => array('default'=>true),
- 'image_id' => array('default'=>null),
+ 'maxValue'=>max($conf['available_permission_levels']),
+ 'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
+ 'check_uniqueness' => array('default'=>true,
+ 'type'=>WS_TYPE_BOOL),
+ 'image_id' => array('default'=>null,
+ 'type'=>WS_TYPE_ID),
),
- 'POST method only.
-<br><b>categories</b> is a string list "category_id[,rank];category_id[,rank]"
-The rank is optional and is equivalent to "auto" if not given.'
+ 'Add an image.
+<br>pwg.images.addChunk must have been called before (maybe several times).
+<br>Don\'t use "thumbnail_sum" and "high_sum", these parameters are here for backward compatibility.',
+ $ws_functions_root . 'pwg.images.php',
+ array('admin_only'=>true)
);
$service->addMethod(
'pwg.images.addSimple',
'ws_images_addSimple',
array(
- 'category' => array('default'=>null),
+ 'category' => array('default'=>null,
+ 'flags'=>WS_PARAM_FORCE_ARRAY,
+ 'type'=>WS_TYPE_ID),
'name' => array('default'=>null),
'author' => array('default'=>null),
'comment' => array('default'=>null),
'level' => array('default'=>0,
- 'maxValue'=>$conf['available_permission_levels']),
+ 'maxValue'=>max($conf['available_permission_levels']),
+ 'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
'tags' => array('default'=>null,
'flags'=>WS_PARAM_ACCEPT_ARRAY),
- 'image_id' => array('default'=>null),
+ 'image_id' => array('default'=>null,
+ 'type'=>WS_TYPE_ID),
),
- 'POST method only.<br>Use the <b>image</b> field for uploading file.
-<br>Set the form encoding to "form-data"<br><b>category</b> is the numeric identifier of the destination category.
-<br>You can update an existing photo if you define an existing image_id.'
+ 'Add an image.
+<br>Use the <b>$_FILES[image]</b> field for uploading file.
+<br>Set the form encoding to "form-data".
+<br>You can update an existing photo if you define an existing image_id.',
+ $ws_functions_root . 'pwg.images.php',
+ array('admin_only'=>true, 'post_only'=>true)
);
$service->addMethod(
'pwg.images.delete',
'ws_images_delete',
array(
- 'image_id' => array('default'=>0),
+ 'image_id' => array('flags'=>WS_PARAM_ACCEPT_ARRAY),
'pwg_token' => array(),
),
- 'Delete photos. You can give several image_ids, comma separated'
+ 'Deletes image(s).',
+ $ws_functions_root . 'pwg.images.php',
+ array('admin_only'=>true, 'post_only'=>true)
);
$service->addMethod(
'pwg.categories.getAdminList',
'ws_categories_getAdminList',
null,
- 'administration method only'
+ 'Get albums list as displayed on admin page.',
+ $ws_functions_root . 'pwg.categories.php',
+ array('admin_only'=>true)
);
$service->addMethod(
@@ -415,61 +489,78 @@ The rank is optional and is equivalent to "auto" if not given.'
'ws_categories_add',
array(
'name' => array(),
- 'parent' => array('default'=>null),
+ 'parent' => array('default'=>null,
+ 'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
'comment' => array('default'=>null),
- 'visible' => array('default'=>null),
- 'status' => array('default'=>null),
- 'commentable' => array('default'=>'true'),
+ 'visible' => array('default'=>true,
+ 'type'=>WS_TYPE_BOOL),
+ 'status' => array('default'=>null,
+ 'info'=>'public, private'),
+ 'commentable' => array('default'=>true,
+ 'type'=>WS_TYPE_BOOL),
),
- 'administration method only'
+ 'Adds an album.',
+ $ws_functions_root . 'pwg.categories.php',
+ array('admin_only'=>true)
);
$service->addMethod(
'pwg.categories.delete',
'ws_categories_delete',
array(
- 'category_id'=> array('default'=>0),
- 'pwg_token' => array(),
+ 'category_id'=> array('flags'=>WS_PARAM_ACCEPT_ARRAY),
'photo_deletion_mode' => array('default'=>'delete_orphans'),
+ 'pwg_token' => array(),
),
- 'Delete categories. You can give several category_ids, comma separated.
+ 'Deletes album(s).
<br><b>photo_deletion_mode</b> can be "no_delete" (may create orphan photos), "delete_orphans"
-(default mode, only deletes photos linked to no other album) or "force_delete" (delete all photos, even those linked to other albums)'
+(default mode, only deletes photos linked to no other album) or "force_delete" (delete all photos, even those linked to other albums)',
+ $ws_functions_root . 'pwg.categories.php',
+ array('admin_only'=>true, 'post_only'=>true)
);
$service->addMethod(
'pwg.categories.move',
'ws_categories_move',
array(
- 'category_id' => array('default'=>0),
- 'parent' => array('default'=>0),
+ 'category_id' => array('flags'=>WS_PARAM_ACCEPT_ARRAY),
+ 'parent' => array('type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
'pwg_token' => array(),
),
- 'Move categories. You can give several category_ids, comma separated. Set parent as 0 to move to gallery root. Only virtual categories can be moved.'
+ 'Move album(s).
+<br>Set parent as 0 to move to gallery root. Only virtual categories can be moved.',
+ $ws_functions_root . 'pwg.categories.php',
+ array('admin_only'=>true, 'post_only'=>true)
);
$service->addMethod(
'pwg.categories.setRepresentative',
'ws_categories_setRepresentative',
array(
- 'category_id' => array('default'=>0),
- 'image_id' => array('default'=>0),
+ 'category_id' => array('type'=>WS_TYPE_ID),
+ 'image_id' => array('type'=>WS_TYPE_ID),
),
- 'Set the representative photo for an album. The photo doesn\'t have to belong to the album. POST method only. Administration method only.'
+ 'Sets the representative photo for an album. The photo doesn\'t have to belong to the album.',
+ $ws_functions_root . 'pwg.categories.php',
+ array('admin_only'=>true, 'post_only'=>true)
);
$service->addMethod(
'pwg.tags.getAdminList',
'ws_tags_getAdminList',
null,
- 'administration method only'
+ '<b>Admin only.</b>',
+ $ws_functions_root . 'pwg.tags.php',
+ array('admin_only'=>true)
);
- $service->addMethod(
+ $service->addMethod( // TODO: create multiple tags
'pwg.tags.add',
'ws_tags_add',
array('name'),
- 'administration method only'
+ 'Adds a new tag.',
+ $ws_functions_root . 'pwg.tags.php',
+ array('admin_only'=>true)
);
$service->addMethod(
@@ -479,114 +570,392 @@ The rank is optional and is equivalent to "auto" if not given.'
'md5sum_list' => array('default'=>null),
'filename_list' => array('default'=>null),
),
- 'check existence of a photo list'
+ 'Checks existence of images.
+<br>Give <b>md5sum_list</b> if $conf[uniqueness_mode]==md5sum. Give <b>filename_list</b> if $conf[uniqueness_mode]==filename.',
+ $ws_functions_root . 'pwg.images.php',
+ array('admin_only'=>true)
);
$service->addMethod(
'pwg.images.checkFiles',
'ws_images_checkFiles',
array(
- 'image_id' => array(),
- 'thumbnail_sum' => array('default'=>null),
+ 'image_id' => array('type'=>WS_TYPE_ID),
'file_sum' => array('default'=>null),
+ 'thumbnail_sum' => array('default'=>null),
'high_sum' => array('default'=>null),
),
- 'check if you have updated version of your files for a given photo, for each requested file type, the answer can be "missing", "equals" or "differs"'
+ 'Checks if you have updated version of your files for a given photo, the answer can be "missing", "equals" or "differs".
+<br>Don\'t use "thumbnail_sum" and "high_sum", these parameters are here for backward compatibility.',
+ $ws_functions_root . 'pwg.images.php',
+ array('admin_only'=>true)
);
$service->addMethod(
'pwg.images.checkUpload',
'ws_images_checkUpload',
null,
- 'check if Piwigo is ready for upload'
+ 'Checks if Piwigo is ready for upload.',
+ $ws_functions_root . 'pwg.images.php',
+ array('admin_only'=>true)
);
$service->addMethod(
'pwg.images.setInfo',
'ws_images_setInfo',
array(
- 'image_id' => array(),
+ 'image_id' => array('type'=>WS_TYPE_ID),
'file' => array('default'=>null),
'name' => array('default'=>null),
'author' => array('default'=>null),
'date_creation' => array('default'=>null),
'comment' => array('default'=>null),
- 'categories' => array('default'=>null),
- 'tag_ids' => array('default'=>null),
+ 'categories' => array('default'=>null,
+ 'info'=>'String list "category_id[,rank];category_id[,rank]".<br>The rank is optional and is equivalent to "auto" if not given.'),
+ 'tag_ids' => array('default'=>null,
+ 'info'=>'Comma separated ids'),
'level' => array('default'=>null,
- 'maxValue'=>$conf['available_permission_levels']),
+ 'maxValue'=>max($conf['available_permission_levels']),
+ 'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
'single_value_mode' => array('default'=>'fill_if_empty'),
'multiple_value_mode' => array('default'=>'append'),
),
- 'POST method only. Admin only
-<br><b>categories</b> is a string list "category_id[,rank];category_id[,rank]" The rank is optional and is equivalent to "auto" if not given.
+ 'Changes properties of an image.
<br><b>single_value_mode</b> can be "fill_if_empty" (only use the input value if the corresponding values is currently empty) or "replace"
-(overwrite any existing value) and applies to single values properties like name/author/date_creation/comment
-<br><b>multiple_value_mode</b> can be "append" (no change on existing values, add the new values) or "replace" and applies to multiple values properties like tag_ids/categories'
+(overwrite any existing value) and applies to single values properties like name/author/date_creation/comment.
+<br><b>multiple_value_mode</b> can be "append" (no change on existing values, add the new values) or "replace" and applies to multiple values properties like tag_ids/categories.',
+ $ws_functions_root . 'pwg.images.php',
+ array('admin_only'=>true, 'post_only'=>true)
);
$service->addMethod(
'pwg.categories.setInfo',
'ws_categories_setInfo',
array(
- 'category_id' => array(),
+ 'category_id' => array('type'=>WS_TYPE_ID),
'name' => array('default'=>null),
'comment' => array('default'=>null),
),
- 'POST method only.'
+ 'Changes properties of an album.',
+ $ws_functions_root . 'pwg.categories.php',
+ array('admin_only'=>true, 'post_only'=>true)
);
$service->addMethod(
'pwg.plugins.getList',
'ws_plugins_getList',
null,
- 'Admin only
-<br>get the list of plugin with id, name, version, state and description'
+ 'Gets the list of plugins with id, name, version, state and description.',
+ $ws_functions_root . 'pwg.extensions.php',
+ array('admin_only'=>true)
);
$service->addMethod(
'pwg.plugins.performAction',
'ws_plugins_performAction',
- array('action', 'plugin', 'pwg_token'),
- 'Admin only
-<br>install/activate/deactivate/uninstall/delete a plugin'
+ array(
+ 'action' => array('info'=>'install, activate, deactivate, uninstall, delete'),
+ 'plugin' => array(),
+ 'pwg_token' => array(),
+ ),
+ null,
+ $ws_functions_root . 'pwg.extensions.php',
+ array('admin_only'=>true)
);
$service->addMethod(
'pwg.themes.performAction',
'ws_themes_performAction',
- array('action', 'theme', 'pwg_token'),
- 'activate/deactivate/delete/set_default a theme<br>administration status required'
+ array(
+ 'action' => array('info'=>'activate, deactivate, delete, set_default'),
+ 'theme' => array(),
+ 'pwg_token' => array(),
+ ),
+ null,
+ $ws_functions_root . 'pwg.extensions.php',
+ array('admin_only'=>true)
);
$service->addMethod(
'pwg.extensions.update',
'ws_extensions_update',
- array('type', 'id', 'revision', 'pwg_token'),
- 'Update an extension. Webmaster only.
-<br>Parameter type must be "plugins", "languages" or "themes".'
- );
+ array(
+ 'type' => array('info'=>'plugins, languages, themes'),
+ 'id' => array(),
+ 'revision' => array(),
+ 'pwg_token' => array(),
+ ),
+ '<b>Webmaster only.</b>',
+ $ws_functions_root . 'pwg.extensions.php',
+ array('admin_only'=>true)
+ );
$service->addMethod(
'pwg.extensions.ignoreUpdate',
'ws_extensions_ignoreupdate',
array(
- 'type' => array('default'=>null),
+ 'type' => array('default'=>null,
+ 'info'=>'plugins, languages, themes'),
'id' => array('default'=>null),
- 'reset' => array('default'=>null),
+ 'reset' => array('default'=>false,
+ 'type'=>WS_TYPE_BOOL,
+ 'info'=>'If true, all ignored extensions will be reinitilized.'),
'pwg_token' => array(),
),
- 'Ignore an extension if it need update.
-<br>Parameter type must be "plugins", "languages" or "themes".
-<br>If reset parameter is true, all ignored extensions will be reinitilized.'
- );
+ '<b>Webmaster only.</b> Ignores an extension if it needs update.',
+ $ws_functions_root . 'pwg.extensions.php',
+ array('admin_only'=>true)
+ );
$service->addMethod(
'pwg.extensions.checkUpdates',
'ws_extensions_checkupdates',
null,
- 'Check if piwigo or extensions are up to date.'
- );
+ 'Checks if piwigo or extensions are up to date.',
+ $ws_functions_root . 'pwg.extensions.php',
+ array('admin_only'=>true)
+ );
+
+ $service->addMethod(
+ 'pwg.groups.getList',
+ 'ws_groups_getList',
+ array(
+ 'group_id' => array('flags'=>WS_PARAM_OPTIONAL|WS_PARAM_FORCE_ARRAY,
+ 'type'=>WS_TYPE_ID),
+ 'name' => array('flags'=>WS_PARAM_OPTIONAL,
+ 'info'=>'Use "%" as wildcard.'),
+ 'per_page' => array('default'=>100,
+ 'maxValue'=>$conf['ws_max_users_per_page'],
+ 'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
+ 'page' => array('default'=>0,
+ 'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
+ 'order' => array('default'=>'name',
+ 'info'=>'id, name, nb_users, is_default'),
+ ),
+ 'Retrieves a list of all groups. The list can be filtered.',
+ $ws_functions_root . 'pwg.groups.php',
+ array('admin_only'=>true)
+ );
+
+ $service->addMethod(
+ 'pwg.groups.add',
+ 'ws_groups_add',
+ array(
+ 'name' => array(),
+ 'is_default' => array('default'=>false,
+ 'type'=>WS_TYPE_BOOL),
+ ),
+ 'Creates a group and returns the new group record.',
+ $ws_functions_root . 'pwg.groups.php',
+ array('admin_only'=>true, 'post_only'=>true)
+ );
+
+ $service->addMethod(
+ 'pwg.groups.delete',
+ 'ws_groups_delete',
+ array(
+ 'group_id' => array('flags'=>WS_PARAM_FORCE_ARRAY,
+ 'type'=>WS_TYPE_ID),
+ 'pwg_token' => array(),
+ ),
+ 'Deletes a or more groups. Users and photos are not deleted.',
+ $ws_functions_root . 'pwg.groups.php',
+ array('admin_only'=>true, 'post_only'=>true)
+ );
+
+ $service->addMethod(
+ 'pwg.groups.setInfo',
+ 'ws_groups_setInfo',
+ array(
+ 'group_id' => array('type'=>WS_TYPE_ID),
+ 'name' => array('flags'=>WS_PARAM_OPTIONAL),
+ 'is_default' => array('flags'=>WS_PARAM_OPTIONAL,
+ 'type'=>WS_TYPE_BOOL),
+ ),
+ 'Updates a group. Leave a field blank to keep the current value.',
+ $ws_functions_root . 'pwg.groups.php',
+ array('admin_only'=>true, 'post_only'=>true)
+ );
+
+ $service->addMethod(
+ 'pwg.groups.addUser',
+ 'ws_groups_addUser',
+ array(
+ 'group_id' => array('type'=>WS_TYPE_ID),
+ 'user_id' => array('flags'=>WS_PARAM_FORCE_ARRAY,
+ 'type'=>WS_TYPE_ID),
+ ),
+ 'Adds one or more users to a group.',
+ $ws_functions_root . 'pwg.groups.php',
+ array('admin_only'=>true, 'post_only'=>true)
+ );
+
+ $service->addMethod(
+ 'pwg.groups.deleteUser',
+ 'ws_groups_deleteUser',
+ array(
+ 'group_id' => array('type'=>WS_TYPE_ID),
+ 'user_id' => array('flags'=>WS_PARAM_FORCE_ARRAY,
+ 'type'=>WS_TYPE_ID),
+ ),
+ 'Removes one or more users from a group.',
+ $ws_functions_root . 'pwg.groups.php',
+ array('admin_only'=>true, 'post_only'=>true)
+ );
+
+ $service->addMethod(
+ 'pwg.users.getList',
+ 'ws_users_getList',
+ array(
+ 'user_id' => array('flags'=>WS_PARAM_OPTIONAL|WS_PARAM_FORCE_ARRAY,
+ 'type'=>WS_TYPE_ID),
+ 'username' => array('flags'=>WS_PARAM_OPTIONAL,
+ 'info'=>'Use "%" as wildcard.'),
+ 'status' => array('flags'=>WS_PARAM_OPTIONAL|WS_PARAM_FORCE_ARRAY,
+ 'info'=>'guest,generic,normal,admin,webmaster'),
+ 'min_level' => array('default'=>0,
+ 'maxValue'=>max($conf['available_permission_levels']),
+ 'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
+ 'group_id' => array('flags'=>WS_PARAM_OPTIONAL|WS_PARAM_FORCE_ARRAY,
+ 'type'=>WS_TYPE_ID),
+ 'per_page' => array('default'=>100,
+ 'maxValue'=>$conf['ws_max_users_per_page'],
+ 'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
+ 'page' => array('default'=>0,
+ 'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
+ 'order' => array('default'=>'id',
+ 'info'=>'id, username, level, email'),
+ 'display' => array('default'=>'basics',
+ 'info'=>'Comma saparated list (see method description)'),
+ ),
+ 'Retrieves a list of all the users.<br>
+<br>
+<b>display</b> controls which data are returned, possible values are:<br>
+all, basics, none,<br>
+username, email, status, level, groups,<br>
+language, theme, nb_image_page, recent_period, expand, show_nb_comments, show_nb_hits,<br>
+enabled_high, registration_date, registration_date_string, registration_date_since, last_visit, last_visit_string, last_visit_since<br>
+<b>basics</b> stands for "username,email,status,level,groups"',
+ $ws_functions_root . 'pwg.users.php',
+ array('admin_only'=>true)
+ );
+
+ $service->addMethod(
+ 'pwg.users.add',
+ 'ws_users_add',
+ array(
+ 'username' => array(),
+ 'password' => array('default'=>null),
+ 'password_confirm' => array('flags'=>WS_PARAM_OPTIONAL),
+ 'email' => array('default'=>null),
+ 'send_password_by_mail' => array('default'=>false, 'type'=>WS_TYPE_BOOL),
+ ),
+ 'Registers a new user.',
+ $ws_functions_root . 'pwg.users.php',
+ array('admin_only'=>true, 'post_only'=>true)
+ );
+
+ $service->addMethod(
+ 'pwg.users.delete',
+ 'ws_users_delete',
+ array(
+ 'user_id' => array('flags'=>WS_PARAM_FORCE_ARRAY,
+ 'type'=>WS_TYPE_ID),
+ 'pwg_token' => array(),
+ ),
+ 'Deletes on or more users. Photos owned by this user are not deleted.',
+ $ws_functions_root . 'pwg.users.php',
+ array('admin_only'=>true, 'post_only'=>true)
+ );
+
+ $service->addMethod(
+ 'pwg.users.setInfo',
+ 'ws_users_setInfo',
+ array(
+ 'user_id' => array('flags'=>WS_PARAM_FORCE_ARRAY,
+ 'type'=>WS_TYPE_ID),
+ 'username' => array('flags'=>WS_PARAM_OPTIONAL),
+ 'password' => array('flags'=>WS_PARAM_OPTIONAL),
+ 'email' => array('flags'=>WS_PARAM_OPTIONAL),
+ 'status' => array('flags'=>WS_PARAM_OPTIONAL,
+ 'info'=>'guest,generic,normal,admin,webmaster'),
+ 'level'=> array('flags'=>WS_PARAM_OPTIONAL,
+ 'maxValue'=>max($conf['available_permission_levels']),
+ 'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
+ 'language' => array('flags'=>WS_PARAM_OPTIONAL),
+ 'theme' => array('flags'=>WS_PARAM_OPTIONAL),
+ 'group_id' => array('flags'=>WS_PARAM_OPTIONAL|WS_PARAM_FORCE_ARRAY, 'type'=>WS_TYPE_INT),
+ // bellow are parameters removed in a future version
+ 'nb_image_page' => array('flags'=>WS_PARAM_OPTIONAL,
+ 'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE|WS_TYPE_NOTNULL),
+ 'recent_period' => array('flags'=>WS_PARAM_OPTIONAL,
+ 'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
+ 'expand' => array('flags'=>WS_PARAM_OPTIONAL,
+ 'type'=>WS_TYPE_BOOL),
+ 'show_nb_comments' => array('flags'=>WS_PARAM_OPTIONAL,
+ 'type'=>WS_TYPE_BOOL),
+ 'show_nb_hits' => array('flags'=>WS_PARAM_OPTIONAL,
+ 'type'=>WS_TYPE_BOOL),
+ 'enabled_high' => array('flags'=>WS_PARAM_OPTIONAL,
+ 'type'=>WS_TYPE_BOOL),
+ ),
+ 'Updates a user. Leave a field blank to keep the current value.
+<br>"username", "password" and "email" are ignored if "user_id" is an array.
+<br>set "group_id" to -1 if you want to dissociate users from all groups',
+ $ws_functions_root . 'pwg.users.php',
+ array('admin_only'=>true, 'post_only'=>true)
+ );
+
+ $service->addMethod(
+ 'pwg.permissions.getList',
+ 'ws_permissions_getList',
+ array(
+ 'cat_id' => array('flags'=>WS_PARAM_FORCE_ARRAY|WS_PARAM_OPTIONAL,
+ 'type'=>WS_TYPE_ID),
+ 'group_id' => array('flags'=>WS_PARAM_FORCE_ARRAY|WS_PARAM_OPTIONAL,
+ 'type'=>WS_TYPE_ID),
+ 'user_id' => array('flags'=>WS_PARAM_FORCE_ARRAY|WS_PARAM_OPTIONAL,
+ 'type'=>WS_TYPE_ID),
+ ),
+ 'Returns permissions: user ids and group ids having access to each album ; this list can be filtered.
+<br>Provide only one parameter!',
+ $ws_functions_root . 'pwg.permissions.php',
+ array('admin_only'=>true)
+ );
+
+ $service->addMethod(
+ 'pwg.permissions.add',
+ 'ws_permissions_add',
+ array(
+ 'cat_id' => array('flags'=>WS_PARAM_FORCE_ARRAY,
+ 'type'=>WS_TYPE_ID),
+ 'group_id' => array('flags'=>WS_PARAM_FORCE_ARRAY|WS_PARAM_OPTIONAL,
+ 'type'=>WS_TYPE_ID),
+ 'user_id' => array('flags'=>WS_PARAM_FORCE_ARRAY|WS_PARAM_OPTIONAL,
+ 'type'=>WS_TYPE_ID),
+ 'recursive' => array('default'=>false,
+ 'type'=>WS_TYPE_BOOL),
+ ),
+ 'Adds permissions to an album.',
+ $ws_functions_root . 'pwg.permissions.php',
+ array('admin_only'=>true, 'post_only'=>true)
+ );
+
+ $service->addMethod(
+ 'pwg.permissions.remove',
+ 'ws_permissions_remove',
+ array(
+ 'cat_id' => array('flags'=>WS_PARAM_FORCE_ARRAY,
+ 'type'=>WS_TYPE_ID),
+ 'group_id' => array('flags'=>WS_PARAM_FORCE_ARRAY|WS_PARAM_OPTIONAL,
+ 'type'=>WS_TYPE_ID),
+ 'user_id' => array('flags'=>WS_PARAM_FORCE_ARRAY|WS_PARAM_OPTIONAL,
+ 'type'=>WS_TYPE_ID),
+ ),
+ 'Removes permissions from an album.',
+ $ws_functions_root . 'pwg.permissions.php',
+ array('admin_only'=>true, 'post_only'=>true)
+ );
}
-?>
+?> \ No newline at end of file