diff options
author | plegall <plg@piwigo.org> | 2012-02-10 10:52:07 +0000 |
---|---|---|
committer | plegall <plg@piwigo.org> | 2012-02-10 10:52:07 +0000 |
commit | bea45c89b62c779dd56383e82b0fbb9bd76696df (patch) | |
tree | 9fd2a99b54f475273eda65ca2890acaf73ce3b82 | |
parent | 62bfdd3f97eee2ad6136f98a9c322c3660541b9e (diff) |
feature 2564: redesign on photo administration screen.
* one screen with several tabs (for now: properties + coi)
* double select boxes for album associations and representation have been
converted to simple multiple select boxes with jQuery Chosen
* more details about the photo in an introduction text
git-svn-id: http://piwigo.org/svn/trunk@13077 68402e56-0260-453c-a942-63ccdbb3a9ee
-rw-r--r-- | admin.php | 13 | ||||
-rw-r--r-- | admin/batch_manager_global.php | 19 | ||||
-rw-r--r-- | admin/batch_manager_unit.php | 7 | ||||
-rw-r--r-- | admin/cat_modify.php | 3 | ||||
-rw-r--r-- | admin/comments.php | 4 | ||||
-rw-r--r-- | admin/include/functions.php | 32 | ||||
-rw-r--r-- | admin/include/photos_add_direct_process.inc.php | 5 | ||||
-rw-r--r-- | admin/photo.php | 86 | ||||
-rw-r--r-- | admin/picture_coi.php | 2 | ||||
-rw-r--r-- | admin/picture_modify.php | 213 | ||||
-rw-r--r-- | admin/rating.php | 3 | ||||
-rw-r--r-- | admin/themes/default/template/picture_coi.tpl | 5 | ||||
-rw-r--r-- | admin/themes/default/template/picture_modify.tpl | 244 | ||||
-rw-r--r-- | picture.php | 6 | ||||
-rw-r--r-- | themes/default/js/plugins/chosen-sprite.png | bin | 0 -> 1560 bytes | |||
-rw-r--r-- | themes/default/js/plugins/chosen.css | 389 | ||||
-rw-r--r-- | themes/default/js/plugins/chosen.jquery.min.js | 10 |
17 files changed, 741 insertions, 300 deletions
@@ -132,6 +132,18 @@ if (isset($_GET['page']) and preg_match('/^album-(\d+)(?:-(.*))?$/', $_GET['page } } +// ?page=photo-1234-properties is an clean alias of +// ?page=photo&image_id=1234&tab=properties +if (isset($_GET['page']) and preg_match('/^photo-(\d+)(?:-(.*))?$/', $_GET['page'], $matches)) +{ + $_GET['page'] = 'photo'; + $_GET['image_id'] = $matches[1]; + if (isset($matches[2])) + { + $_GET['tab'] = $matches[2]; + } +} + if (isset($_GET['page']) and preg_match('/^[a-z_]*$/', $_GET['page']) and is_file(PHPWG_ROOT_PATH.'admin/'.$_GET['page'].'.php')) @@ -236,6 +248,7 @@ if ( 'album', // delete cat; public/private; lock/unlock, permissions 'cat_move', // ?only POST 'cat_options', // ?only POST; public/private; lock/unlock + 'photo', 'picture_modify', // ?only POST; associate/dissociate 'user_perm', 'group_perm', diff --git a/admin/batch_manager_global.php b/admin/batch_manager_global.php index a568cff96..a7c1a3284 100644 --- a/admin/batch_manager_global.php +++ b/admin/batch_manager_global.php @@ -179,20 +179,7 @@ DELETE if ('move' == $action) { - // let's first break links with all albums but their "storage album" - $query = ' -DELETE '.IMAGE_CATEGORY_TABLE.'.* - FROM '.IMAGE_CATEGORY_TABLE.' - JOIN '.IMAGES_TABLE.' ON image_id=id - WHERE id IN ('.implode(',', $collection).') - AND (storage_category_id IS NULL OR storage_category_id != category_id) -;'; - pwg_query($query); - - associate_images_to_categories( - $collection, - array($_POST['move']) - ); + move_images_to_categories($collection, array($_POST['move'])); $_SESSION['page_infos'] = array( l10n('Information data registered in database') @@ -786,9 +773,7 @@ SELECT id,path,representative_ext,file,filesize,level,name 'TITLE' => $title, 'LEVEL' => $row['level'], 'FILE_SRC' => $row['path'], - 'U_EDIT' => - PHPWG_ROOT_PATH.'admin.php?page=picture_modify'. - '&image_id='.$row['id'], + 'U_EDIT' => get_root_url().'admin.php?page=photo-'.$row['id'], ) ); } diff --git a/admin/batch_manager_unit.php b/admin/batch_manager_unit.php index 02e1d487c..24ef9a47c 100644 --- a/admin/batch_manager_unit.php +++ b/admin/batch_manager_unit.php @@ -265,11 +265,8 @@ SELECT 'ID' => $row['id'], 'TN_SRC' => $src, 'FILE_SRC' => $row['path'], - 'LEGEND' => !empty($row['name']) ? - $row['name'] : get_name_from_file($row['file']), - 'U_EDIT' => - PHPWG_ROOT_PATH.'admin.php?page=picture_modify'. - '&image_id='.$row['id'], + 'LEGEND' => render_element_name($row), + 'U_EDIT' => get_root_url().'admin.php?page=photo-'.$row['id'], 'NAME' => !empty($row['name'])?$row['name']:'', 'AUTHOR' => !empty($row['author'])?htmlspecialchars($row['author']):'', 'LEVEL' => !empty($row['level'])?$row['level']:'0', diff --git a/admin/cat_modify.php b/admin/cat_modify.php index a6399b4ee..08be98381 100644 --- a/admin/cat_modify.php +++ b/admin/cat_modify.php @@ -343,8 +343,7 @@ SELECT id,representative_ext,path ;'; $row = pwg_db_fetch_assoc(pwg_query($query)); $src = DerivativeImage::thumb_url($row); - $url = get_root_url().'admin.php?page=picture_modify'; - $url.= '&image_id='.$category['representative_picture_id']; + $url = get_root_url().'admin.php?page=photo-'.$category['representative_picture_id']; $tpl_representant['picture'] = array( diff --git a/admin/comments.php b/admin/comments.php index 1c355331c..002ed9565 100644 --- a/admin/comments.php +++ b/admin/comments.php @@ -129,9 +129,7 @@ while ($row = pwg_db_fetch_assoc($result)) $template->append( 'comments', array( - 'U_PICTURE' => - PHPWG_ROOT_PATH.'admin.php?page=picture_modify'. - '&image_id='.$row['image_id'], + 'U_PICTURE' => get_root_url().'admin.php?page=photo-'.$row['image_id'], 'ID' => $row['id'], 'TN_SRC' => $thumb, 'AUTHOR' => trigger_event('render_comment_author', $author_name), diff --git a/admin/include/functions.php b/admin/include/functions.php index 9e6901f27..3afb705d0 100644 --- a/admin/include/functions.php +++ b/admin/include/functions.php @@ -1531,6 +1531,37 @@ DELETE } /** + * Disssociate images from all categories except their storage category and + * associate to new categories. + * + * @param array images + * @param array categories + * @return void + */ +function move_images_to_categories($images, $categories) +{ + if (count($images) == 0) + { + return false; + } + + // let's first break links with all albums but their "storage album" + $query = ' +DELETE '.IMAGE_CATEGORY_TABLE.'.* + FROM '.IMAGE_CATEGORY_TABLE.' + JOIN '.IMAGES_TABLE.' ON image_id=id + WHERE id IN ('.implode(',', $images).') + AND (storage_category_id IS NULL OR storage_category_id != category_id) +;'; + pwg_query($query); + + if (is_array($categories) and count($categories) > 0) + { + associate_images_to_categories($images, $categories); + } +} + +/** * Associate images associated to a list of source categories to a list of * destination categories. * @@ -1987,6 +2018,7 @@ function get_active_menu($menu_page) switch ($menu_page) { + case 'photo': case 'photos_add': case 'rating': case 'tags': diff --git a/admin/include/photos_add_direct_process.inc.php b/admin/include/photos_add_direct_process.inc.php index 59e37e891..100b61032 100644 --- a/admin/include/photos_add_direct_process.inc.php +++ b/admin/include/photos_add_direct_process.inc.php @@ -215,10 +215,7 @@ SELECT // function get_image_name($name, $file) would be better $thumbnail['title'] = get_name_from_file($image_infos['file']); - $thumbnail['link'] = PHPWG_ROOT_PATH.'admin.php?page=picture_modify' - .'&image_id='.$image_id - .'&cat_id='.$category_id - ; + $thumbnail['link'] = get_root_url().'admin.php?page=photo-'.$image_id.'&cat_id='.$category_id; array_push($page['thumbnails'], $thumbnail); } diff --git a/admin/photo.php b/admin/photo.php new file mode 100644 index 000000000..30d86624c --- /dev/null +++ b/admin/photo.php @@ -0,0 +1,86 @@ +<?php +// +-----------------------------------------------------------------------+ +// | Piwigo - a PHP based photo gallery | +// +-----------------------------------------------------------------------+ +// | Copyright(C) 2008-2012 Piwigo Team 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!"); +} + +// +-----------------------------------------------------------------------+ +// | Basic checks | +// +-----------------------------------------------------------------------+ + +check_status(ACCESS_ADMINISTRATOR); + +check_input_parameter('cat_id', $_GET, false, PATTERN_ID); +check_input_parameter('image_id', $_GET, false, PATTERN_ID); + +$admin_photo_base_url = get_root_url().'admin.php?page=photo-'.$_GET['image_id']; + +if (isset($_GET['cat_id'])) +{ + $query = ' +SELECT * + FROM '.CATEGORIES_TABLE.' + WHERE id = '.$_GET['cat_id'].' +;'; + $category = pwg_db_fetch_assoc(pwg_query($query)); +} + +// +-----------------------------------------------------------------------+ +// | Tabs | +// +-----------------------------------------------------------------------+ + +include_once(PHPWG_ROOT_PATH.'admin/include/tabsheet.class.php'); + +$page['tab'] = 'properties'; + +if (isset($_GET['tab'])) +{ + $page['tab'] = $_GET['tab']; +} + +$tabsheet = new tabsheet(); +$tabsheet->add('properties', l10n('Properties'), $admin_photo_base_url.'-properties'); +$tabsheet->add('coi', l10n('Center of interest'), $admin_photo_base_url.'-coi'); + +$tabsheet->select($page['tab']); +$tabsheet->assign(); + +// +-----------------------------------------------------------------------+ +// | Load the tab | +// +-----------------------------------------------------------------------+ + +if ('properties' == $page['tab']) +{ + include(PHPWG_ROOT_PATH.'admin/picture_modify.php'); +} +elseif ('coi' == $page['tab']) +{ + include(PHPWG_ROOT_PATH.'admin/picture_coi.php'); +} +else +{ + include(PHPWG_ROOT_PATH.'admin/photo_'.$page['tab'].'.php'); +} +?>
\ No newline at end of file diff --git a/admin/picture_coi.php b/admin/picture_coi.php index 9725d5294..9389a81d4 100644 --- a/admin/picture_coi.php +++ b/admin/picture_coi.php @@ -78,9 +78,9 @@ else } $tpl_var = array( + 'TITLE' => render_element_name($row), 'ALT' => $row['file'], 'U_IMG' => DerivativeImage::url(IMG_LARGE, $row), - 'U_EDIT' => get_root_url().'admin.php?page=picture_modify&image_id='.$_GET['image_id'], ); if (!empty($row['coi'])) diff --git a/admin/picture_modify.php b/admin/picture_modify.php index 38b607cc7..cfd119bf4 100644 --- a/admin/picture_modify.php +++ b/admin/picture_modify.php @@ -36,6 +36,14 @@ check_status(ACCESS_ADMINISTRATOR); check_input_parameter('image_id', $_GET, false, PATTERN_ID); check_input_parameter('cat_id', $_GET, false, PATTERN_ID); +// represent +$query = ' +SELECT id + FROM '.CATEGORIES_TABLE.' + WHERE representative_picture_id = '.$_GET['image_id'].' +;'; +$represent_options_selected = array_from_query($query, 'id'); + // +-----------------------------------------------------------------------+ // | delete photo | // +-----------------------------------------------------------------------+ @@ -132,18 +140,16 @@ if (isset($_POST['submit']) and count($page['errors']) == 0) $data{'comment'} = strip_tags(@$_POST['description']); } - if (isset($_POST['date_creation_action'])) + if (!empty($_POST['date_creation_year'])) { - if ('set' == $_POST['date_creation_action']) - { - $data{'date_creation'} = $_POST['date_creation_year'] - .'-'.$_POST['date_creation_month'] - .'-'.$_POST['date_creation_day']; - } - else if ('unset' == $_POST['date_creation_action']) - { - $data{'date_creation'} = ''; - } + $data{'date_creation'} = + $_POST['date_creation_year'] + .'-'.$_POST['date_creation_month'] + .'-'.$_POST['date_creation_day']; + } + else + { + $data{'date_creation'} = null; } mass_updates( @@ -163,58 +169,35 @@ if (isset($_POST['submit']) and count($page['errors']) == 0) } set_tags($tag_ids, $_GET['image_id']); - array_push($page['infos'], l10n('Photo informations updated')); -} -// associate the element to other categories than its storage category -if (isset($_POST['associate']) - and isset($_POST['cat_dissociated']) - and count($_POST['cat_dissociated']) > 0 - ) -{ - associate_images_to_categories( - array($_GET['image_id']), - $_POST['cat_dissociated'] - ); -} -// dissociate the element from categories (but not from its storage category) -if (isset($_POST['dissociate']) - and isset($_POST['cat_associated']) - and count($_POST['cat_associated']) > 0 - ) -{ - $query = ' -DELETE FROM '.IMAGE_CATEGORY_TABLE.' - WHERE image_id = '.$_GET['image_id'].' - AND category_id IN ('.implode(',', $_POST['cat_associated']).') -'; - pwg_query($query); + // association to albums + move_images_to_categories(array($_GET['image_id']), $_POST['associate']); - update_category($_POST['cat_associated']); -} -// elect the element to represent the given categories -if (isset($_POST['elect']) - and isset($_POST['cat_dismissed']) - and count($_POST['cat_dismissed']) > 0 - ) -{ - $datas = array(); - foreach ($_POST['cat_dismissed'] as $category_id) + // thumbnail for albums + if (!isset($_POST['represent'])) { - array_push($datas, - array('id' => $category_id, - 'representative_picture_id' => $_GET['image_id'])); + $_POST['represent'] = array(); } - $fields = array('primary' => array('id'), - 'update' => array('representative_picture_id')); - mass_updates(CATEGORIES_TABLE, $fields, $datas); -} -// dismiss the element as representant of the given categories -if (isset($_POST['dismiss']) - and isset($_POST['cat_elected']) - and count($_POST['cat_elected']) > 0 - ) -{ - set_random_representant($_POST['cat_elected']); + + $no_longer_thumbnail_for = array_diff($represent_options_selected, $_POST['represent']); + if (count($no_longer_thumbnail_for) > 0) + { + set_random_representant($no_longer_thumbnail_for); + } + + $new_thumbnail_for = array_diff($_POST['represent'], $represent_options_selected); + if (count($new_thumbnail_for) > 0) + { + $query = ' +UPDATE '.CATEGORIES_TABLE.' + SET representative_picture_id = '.$_GET['image_id'].' + WHERE id IN ('.implode(',', $new_thumbnail_for).') +;'; + pwg_query($query); + } + + $represent_options_selected = $_POST['represent']; + + array_push($page['infos'], l10n('Photo informations updated')); } // tags @@ -262,8 +245,7 @@ $template->set_filenames( ) ); -$admin_url_start = get_root_url().'admin.php?page=picture_modify'; -$admin_url_start.= '&image_id='.$_GET['image_id']; +$admin_url_start = $admin_photo_base_url.'-properties'; $admin_url_start.= isset($_GET['cat_id']) ? '&cat_id='.$_GET['cat_id'] : ''; $template->assign( @@ -281,6 +263,8 @@ $template->assign( isset($_POST['name']) ? stripslashes($_POST['name']) : @$row['name'], + 'TITLE' => render_element_name($row), + 'DIMENSIONS' => @$row['width'].' * '.@$row['height'], 'FILESIZE' => @$row['filesize'].' KB', @@ -303,6 +287,67 @@ $template->assign( ) ); +$added_by = 'N/A'; +$query = ' +SELECT '.$conf['user_fields']['username'].' AS username + FROM '.USERS_TABLE.' + WHERE '.$conf['user_fields']['id'].' = '.$row['added_by'].' +;'; +$result = pwg_query($query); +while ($user_row = pwg_db_fetch_assoc($result)) +{ + $added_by = $user_row['username']; +} + +$intro = sprintf( + l10n('This photo was posted on %s by %s.'), + format_date($row['date_available']), + $added_by + ); + +$intro.= ' '; + +$intro.= sprintf( + l10n('Original file is %s, %ux%u pixels, %.2fMB.'), + $row['file'], + $row['width'], + $row['height'], + $row['filesize']/1024 + ); + +$intro.= ' '; + +$intro.= sprintf( + l10n('%u visits'), + $row['hit'] + ); + +if ($conf['rate'] and !empty($row['rating_score'])) +{ + $query = ' +SELECT + COUNT(*) + FROM '.RATE_TABLE.' + WHERE element_id = '.$_GET['image_id'].' +;'; + list($nb_rates) = pwg_db_fetch_row(pwg_query($query)); + + $intro.= sprintf( + l10n(', %u rates, rating score %s'), + $nb_rates, + $row['rating_score'] + ); +} + +$intro.= '. '; + +$intro.= sprintf( + l10n('Numeric identifier is %u.'), + $row['id'] + ); + +$template->assign('INTRO', $intro); + if (in_array(get_extension($row['path']),$conf['picture_ext'])) { $template->assign('U_COI', get_root_url().'admin.php?page=picture_coi&image_id='.$_GET['image_id']); @@ -432,53 +477,21 @@ if (isset($url_img)) $template->assign( 'U_JUMPTO', $url_img ); } -// associate to another category ? +// associate to albums $query = ' -SELECT id,name,uppercats,global_rank +SELECT id FROM '.CATEGORIES_TABLE.' INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON id = category_id - WHERE image_id = '.$_GET['image_id']; -if (isset($storage_category_id)) -{ - $query.= ' - AND id != '.$storage_category_id; -} -$query.= ' -;'; -display_select_cat_wrapper($query, array(), 'associated_options'); - -$result = pwg_query($query); -$associateds = array(-1); -if (isset($storage_category_id)) -{ - array_push($associateds, $storage_category_id); -} -while ($row = pwg_db_fetch_assoc($result)) -{ - array_push($associateds, $row['id']); -} -$query = ' -SELECT id,name,uppercats,global_rank - FROM '.CATEGORIES_TABLE.' - WHERE id NOT IN ('.implode(',', $associateds).') -;'; -display_select_cat_wrapper($query, array(), 'dissociated_options'); - -// representing -$query = ' -SELECT id,name,uppercats,global_rank - FROM '.CATEGORIES_TABLE.' - WHERE representative_picture_id = '.$_GET['image_id'].' + WHERE image_id = '.$_GET['image_id'].' ;'; -display_select_cat_wrapper($query, array(), 'elected_options'); +$associate_options_selected = array_from_query($query, 'id'); $query = ' SELECT id,name,uppercats,global_rank FROM '.CATEGORIES_TABLE.' - WHERE representative_picture_id != '.$_GET['image_id'].' - OR representative_picture_id IS NULL ;'; -display_select_cat_wrapper($query, array(), 'dismissed_options'); +display_select_cat_wrapper($query, $associate_options_selected, 'associate_options'); +display_select_cat_wrapper($query, $represent_options_selected, 'represent_options'); //----------------------------------------------------------- sending html code diff --git a/admin/rating.php b/admin/rating.php index 66dea07d8..2073ca64c 100644 --- a/admin/rating.php +++ b/admin/rating.php @@ -203,8 +203,7 @@ foreach ($images as $image) { $thumbnail_src = DerivativeImage::thumb_url($image); - $image_url = PHPWG_ROOT_PATH.'admin.php?page=picture_modify'. - '&image_id='.$image['id']; + $image_url = get_root_url().'admin.php?page=photo-'.$image['id']; $query = 'SELECT * FROM '.RATE_TABLE.' AS r diff --git a/admin/themes/default/template/picture_coi.tpl b/admin/themes/default/template/picture_coi.tpl index 8465a5765..76d8ecc11 100644 --- a/admin/themes/default/template/picture_coi.tpl +++ b/admin/themes/default/template/picture_coi.tpl @@ -3,10 +3,7 @@ {/html_head} {combine_script id='jquery.jcrop' load='footer' require='jquery' path='themes/default/js/plugins/jquery.Jcrop.min.js'} -<h2>{'Center of interest'|@translate}</h2> -<div> -<a href="{$U_EDIT}">{'Edit photo information'|@translate}</a> -</div> +<h2>{$TITLE} › {'Edit photo'|@translate} {$TABSHEET_TITLE}</h2> <form method="post"> diff --git a/admin/themes/default/template/picture_modify.tpl b/admin/themes/default/template/picture_modify.tpl index 28e6bfc76..11a0fcdb2 100644 --- a/admin/themes/default/template/picture_modify.tpl +++ b/admin/themes/default/template/picture_modify.tpl @@ -2,6 +2,15 @@ {include file='include/dbselect.inc.tpl'} {include file='include/datepicker.inc.tpl'} +{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"} + +{footer_script}{literal} +jQuery(document).ready(function() { + jQuery(".chzn-select").chosen(); +}); +{/literal}{/footer_script} + {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} @@ -24,22 +33,9 @@ jQuery(document).ready(function() {ldelim} pwg_initialization_datepicker("#date_creation_day", "#date_creation_month", "#date_creation_year", "#date_creation_linked_date", "#date_creation_action_set"); {/footer_script} -<h2>{'Edit photo information'|@translate}</h2> +<h2>{$TITLE} › {'Edit photo'|@translate} {$TABSHEET_TITLE}</h2> -<img src="{$TN_SRC}" alt="{'Thumbnail'|@translate}" class="Thumbnail"> - -<ul class="categoryActions"> - {if isset($U_JUMPTO) } - <li><a href="{$U_JUMPTO}" title="{'jump to photo'|@translate}"><img src="{$themeconf.admin_icon_dir}/category_jump-to.png" alt="{'jump to photo'|@translate}"></a></li> - {/if} - {if !url_is_remote($PATH)} - <li><a href="{$U_SYNC}" title="{'Synchronize'|@translate}"><img src="{$themeconf.admin_icon_dir}/sync_metadata.png" alt="{'Synchronize'|@translate}"></a></li> - - <li><a href="{$U_DELETE}" title="{'delete photo'|@translate}"><img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/category_delete.png" alt="{'delete photo'|@translate}" onclick="return confirm('{'Are you sure?'|@translate|@escape:javascript}');"></a></li> - {/if} -</ul> - -<form action="{$F_ACTION}" method="post" id="properties"> +<form action="{$F_ACTION}" method="post" id="catModify"> <fieldset> <legend>{'Informations'|@translate}</legend> @@ -47,48 +43,27 @@ pwg_initialization_datepicker("#date_creation_day", "#date_creation_month", "#da <table> <tr> - <td><strong>{'Path'|@translate}</strong></td> - <td>{$PATH}</td> - </tr> + <td id="albumThumbnail"> +<img src="{$TN_SRC}" alt="{'Thumbnail'|@translate}" class="Thumbnail"> + </td> - <tr> - <td><strong>{'Post date'|@translate}</strong></td> - <td>{$REGISTRATION_DATE}</td> - </tr> + <td id="albumLinks"> +<p style="text-align:left">{$INTRO}</p> - <tr> - <td><strong>{'Dimensions'|@translate}</strong></td> - <td>{$DIMENSIONS}</td> - </tr> +<ul style="padding-left:15px;"> +{if isset($U_JUMPTO) } + <li><a href="{$U_JUMPTO}">{'jump to photo'|@translate} →</a></li> +{/if} - <tr> - <td><strong>{'Filesize'|@translate}</strong></td> - <td>{$FILESIZE}</td> - </tr> +{if !url_is_remote($PATH)} + <li><a href="{$U_SYNC}">{'Synchronize metadata'|@translate}</a></li> - <tr> - <td><strong>{'Storage album'|@translate}</strong></td> - <td>{$STORAGE_CATEGORY}</td> - </tr> + <li><a href="{$U_DELETE}" onclick="return confirm('{'Are you sure?'|@translate|@escape:javascript}');">{'delete photo'|@translate}</a></li> + {/if} - {if isset($related_categories) } - <tr> - <td><strong>{'Linked albums'|@translate}</strong></td> - <td> - <ul> - {foreach from=$related_categories item=name} - <li>{$name}</li> - {/foreach} - </ul> +</ul> </td> </tr> - {/if} -{if isset($U_COI)} - <tr> - <td></td> - <td><a href="{$U_COI}">{'Not cropped correctly?'|@translate}</a></td> - </tr> -{/if} </table> </fieldset> @@ -96,129 +71,80 @@ pwg_initialization_datepicker("#date_creation_day", "#date_creation_month", "#da <fieldset> <legend>{'Properties'|@translate}</legend> - <table> + <p> + <strong>{'Title'|@translate}</strong> + <br> + <input type="text" class="large" name="name" value="{$NAME}"> + </p> - <tr> - <td><strong>{'Name'|@translate}</strong></td> - <td><input type="text" class="large" name="name" value="{$NAME}"></td> - </tr> + <p> + <strong>{'Author'|@translate}</strong> + <br> + <input type="text" class="large" name="author" value="{$AUTHOR}"> + </p> - <tr> - <td><strong>{'Author'|@translate}</strong></td> - <td><input type="text" class="large" name="author" value="{$AUTHOR}"></td> - </tr> + <p> + <strong>{'Creation date'|@translate}</strong> + <br> + <select id="date_creation_day" name="date_creation_day"> + <option value="0">--</option> +{section name=day start=1 loop=32} + <option value="{$smarty.section.day.index}" {if $smarty.section.day.index==$DATE_CREATION_DAY_VALUE}selected="selected"{/if}>{$smarty.section.day.index}</option> +{/section} + </select> - <tr> - <td><strong>{'Creation date'|@translate}</strong></td> - <td> - <label><input type="radio" name="date_creation_action" value="unset"> {'unset'|@translate}</label> - <input type="radio" name="date_creation_action" value="set" id="date_creation_action_set"> {'set to'|@translate} - <select id="date_creation_day" name="date_creation_day"> - <option value="0">--</option> - {section name=day start=1 loop=32} - <option value="{$smarty.section.day.index}" {if $smarty.section.day.index==$DATE_CREATION_DAY_VALUE}selected="selected"{/if}>{$smarty.section.day.index}</option> - {/section} - </select> - <select id="date_creation_month" name="date_creation_month"> - {html_options options=$month_list selected=$DATE_CREATION_MONTH_VALUE} - </select> - <input id="date_creation_year" - name="date_creation_year" - type="text" - size="4" - maxlength="4" - value="{$DATE_CREATION_YEAR_VALUE}"> - <input id="date_creation_linked_date" name="date_creation_linked_date" type="hidden" size="10" disabled="disabled"> - </td> - </tr> + <select id="date_creation_month" name="date_creation_month"> + {html_options options=$month_list selected=$DATE_CREATION_MONTH_VALUE} + </select> - <tr> - <td><strong>{'Tags'|@translate}</strong></td> - <td> + <input id="date_creation_year" name="date_creation_year" type="text" size="4" maxlength="4" value="{$DATE_CREATION_YEAR_VALUE}"> + <input id="date_creation_linked_date" name="date_creation_linked_date" type="hidden" size="10" disabled="disabled"> + <a href="#" id="unset_date_creation" style="display:none">unset</a> + </p> + + <p> + <strong>{'Linked albums'|@translate}</strong> + <br> + <select data-placeholder="Select albums..." class="chzn-select" multiple style="width:700px;" name="associate[]"> + {html_options options=$associate_options selected=$associate_options_selected} + </select> + </p> + + <p> + <strong>{'Representation of albums'|@translate}</strong> + <br> + <select data-placeholder="Select albums..." class="chzn-select" multiple style="width:700px;" name="represent[]"> + {html_options options=$represent_options selected=$represent_options_selected} + </select> + </p> + + <p> + <strong>{'Tags'|@translate}</strong> + <br> <select id="tags" name="tags"> {foreach from=$tag_selection item=tag} <option value="{$tag.id}" class="selected">{$tag.name}</option> {/foreach} </select> - </td> - </tr> - + </p> - <tr> - <td><strong>{'Description'|@translate}</strong></td> - <td><textarea name="description" id="description" class="description">{$DESCRIPTION}</textarea></td> - </tr> + <p> + <strong>{'Description'|@translate}</strong> + <br> + <textarea name="description" id="description" class="description">{$DESCRIPTION}</textarea> + </p> - <tr> - <td><strong>{'Who can see this photo?'|@translate}</strong></td> - <td> + <p> + <strong>{'Who can see this photo?'|@translate}</strong> + <br> <select name="level" size="1"> {html_options options=$level_options selected=$level_options_selected} </select> - </td> - </tr> - - </table> - - <p style="text-align:center;"> - <input class="submit" type="submit" value="{'Submit'|@translate}" name="submit"> - <input class="submit" type="reset" value="{'Reset'|@translate}" name="reset"> - </p> - - </fieldset> - -</form> + </p> -<form id="associations" method="post" action="{$F_ACTION}#associations"> - <fieldset> - <legend>{'Linked albums'|@translate}</legend> - - <table class="doubleSelect"> - <tr> - <td> - <h3>{'Associated'|@translate}</h3> - <select class="categoryList" name="cat_associated[]" multiple="multiple" size="30"> - {html_options options=$associated_options} - </select> - <p><input class="submit" type="submit" value="»" name="dissociate" style="font-size:15px;"></p> - </td> - - <td> - <h3>{'Dissociated'|@translate}</h3> - <select class="categoryList" name="cat_dissociated[]" multiple="multiple" size="30"> - {html_options options=$dissociated_options} - </select> - <p><input class="submit" type="submit" value="«" name="associate" style="font-size:15px;"></p> - </td> - </tr> - </table> - - </fieldset> -</form> + <p style="margin:40px 0 0 0"> + <input class="submit" type="submit" value="{'Save Settings'|@translate}" name="submit"> + </p> +</fieldset> -<form id="representation" method="post" action="{$F_ACTION}#representation"> - <fieldset> - <legend>{'Representation of albums'|@translate}</legend> - - <table class="doubleSelect"> - <tr> - <td> - <h3>{'Represents'|@translate}</h3> - <select class="categoryList" name="cat_elected[]" multiple="multiple" size="30"> - {html_options options=$elected_options} - </select> - <p><input class="submit" type="submit" value="»" name="dismiss" style="font-size:15px;"></p> - </td> - - <td> - <h3>{'Does not represent'|@translate}</h3> - <select class="categoryList" name="cat_dismissed[]" multiple="multiple" size="30"> - {html_options options=$dismissed_options} - </select> - <p><input class="submit" type="submit" value="«" name="elect" style="font-size:15px;"></p> - </td> - </tr> - </table> - - </fieldset> </form> diff --git a/picture.php b/picture.php index f78c6d085..a31a3d94f 100644 --- a/picture.php +++ b/picture.php @@ -751,9 +751,9 @@ if (is_admin()) } $url_admin = - get_root_url().'admin.php?page=picture_modify' - .'&cat_id='.(isset($page['category']) ? $page['category']['id'] : '') - .'&image_id='.$page['image_id']; + get_root_url().'admin.php?page=photo-'.$page['image_id'] + .(isset($page['category']) ? '&cat_id='.$page['category']['id'] : '') + ; $template->assign( array( diff --git a/themes/default/js/plugins/chosen-sprite.png b/themes/default/js/plugins/chosen-sprite.png Binary files differnew file mode 100644 index 000000000..231fe9055 --- /dev/null +++ b/themes/default/js/plugins/chosen-sprite.png diff --git a/themes/default/js/plugins/chosen.css b/themes/default/js/plugins/chosen.css new file mode 100644 index 000000000..a90506fd6 --- /dev/null +++ b/themes/default/js/plugins/chosen.css @@ -0,0 +1,389 @@ +/* @group Base */ +.chzn-container { + font-size: 13px; + position: relative; + display: inline-block; + zoom: 1; + *display: inline; +} +.chzn-container .chzn-drop { + background: #fff; + border: 1px solid #aaa; + border-top: 0; + position: absolute; + top: 29px; + left: 0; + -webkit-box-shadow: 0 4px 5px rgba(0,0,0,.15); + -moz-box-shadow : 0 4px 5px rgba(0,0,0,.15); + -o-box-shadow : 0 4px 5px rgba(0,0,0,.15); + box-shadow : 0 4px 5px rgba(0,0,0,.15); + z-index: 999; +} +/* @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: -ms-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); + background-image: linear-gradient(top, #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); + display: block; + overflow: hidden; + white-space: nowrap; + position: relative; + height: 23px; + line-height: 24px; + padding: 0 0 0 8px; + color: #444444; + text-decoration: none; +} +.chzn-container-single .chzn-single span { + margin-right: 26px; + display: block; + overflow: hidden; + white-space: nowrap; + -o-text-overflow: ellipsis; + -ms-text-overflow: ellipsis; + text-overflow: ellipsis; +} +.chzn-container-single .chzn-single abbr { + display: block; + position: absolute; + right: 26px; + top: 6px; + width: 12px; + height: 13px; + font-size: 1px; + background: url(chosen-sprite.png) right top no-repeat; +} +.chzn-container-single .chzn-single abbr:hover { + background-position: right -11px; +} +.chzn-container-single .chzn-single div { + position: absolute; + right: 0; + top: 0; + display: block; + height: 100%; + width: 18px; +} +.chzn-container-single .chzn-single div b { + background: url('chosen-sprite.png') no-repeat 0 0; + display: block; + width: 100%; + height: 100%; +} +.chzn-container-single .chzn-search { + padding: 3px 4px; + position: relative; + margin: 0; + white-space: nowrap; + z-index: 1010; +} +.chzn-container-single .chzn-search input { + background: #fff url('chosen-sprite.png') no-repeat 100% -22px; + background: url('chosen-sprite.png') no-repeat 100% -22px, -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff)); + background: url('chosen-sprite.png') no-repeat 100% -22px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background: url('chosen-sprite.png') no-repeat 100% -22px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background: url('chosen-sprite.png') no-repeat 100% -22px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background: url('chosen-sprite.png') no-repeat 100% -22px, -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background: url('chosen-sprite.png') no-repeat 100% -22px, linear-gradient(top, #eeeeee 1%, #ffffff 15%); + margin: 1px 0; + padding: 4px 20px 4px 5px; + outline: 0; + border: 1px solid #aaa; + font-family: sans-serif; + font-size: 1em; +} +.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; +} +/* @end */ + +.chzn-container-single-nosearch .chzn-search input { + position: absolute; + left: -9000px; +} + +/* @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: -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background-image: linear-gradient(top, #eeeeee 1%, #ffffff 15%); + border: 1px solid #aaa; + margin: 0; + padding: 0; + cursor: text; + overflow: hidden; + height: auto !important; + height: 1%; + position: relative; +} +.chzn-container-multi .chzn-choices li { + float: left; + list-style: none; +} +.chzn-container-multi .chzn-choices .search-field { + white-space: nowrap; + margin: 0; + padding: 0; +} +.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; + margin: 1px 0; + outline: 0; + -webkit-box-shadow: none; + -moz-box-shadow : none; + -o-box-shadow : none; + box-shadow : none; +} +.chzn-container-multi .chzn-choices .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; + 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%); + -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); + 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-focus { + background: #d4d4d4; +} +.chzn-container-multi .chzn-choices .search-choice .search-choice-close { + display: block; + position: absolute; + right: 3px; + top: 4px; + width: 12px; + height: 13px; + font-size: 1px; + background: url(chosen-sprite.png) right top no-repeat; +} +.chzn-container-multi .chzn-choices .search-choice .search-choice-close:hover { + background-position: right -11px; +} +.chzn-container-multi .chzn-choices .search-choice-focus .search-choice-close { + background-position: right -11px; +} +/* @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; +} +.chzn-container-multi .chzn-results { + margin: -1px 0 0; + padding: 0; +} +.chzn-container .chzn-results li { + display: none; + line-height: 15px; + padding: 5px 6px; + 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: -ms-linear-gradient(top, #3875d7 20%, #2a62bc 90%); + background-image: linear-gradient(top, #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; +} +.chzn-container .chzn-results .no-results { + background: #f4f4f4; + display: list-item; +} +.chzn-container .chzn-results .group-result { + 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 */ + +/* @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); + -o-box-shadow : 0 0 5px rgba(0,0,0,.3); + box-shadow : 0 0 5px rgba(0,0,0,.3); + border: 1px solid #5897fb; +} +.chzn-container-active .chzn-single-with-drop { + border: 1px solid #aaa; + -webkit-box-shadow: 0 1px 0 #fff inset; + -moz-box-shadow : 0 1px 0 #fff inset; + -o-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: -ms-linear-gradient(top, #eeeeee 20%, #ffffff 80%); + background-image: linear-gradient(top, #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; +} +.chzn-container-active .chzn-single-with-drop div { + background: transparent; + border-left: none; +} +.chzn-container-active .chzn-single-with-drop div b { + background-position: -18px 1px; +} +.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); + -o-box-shadow : 0 0 5px rgba(0,0,0,.3); + box-shadow : 0 0 5px rgba(0,0,0,.3); + border: 1px solid #5897fb; +} +.chzn-container-active .chzn-choices .search-field input { + color: #111 !important; +} +/* @end */ + +/* @group Disabled Support */ +.chzn-disabled { + cursor: default; + opacity:0.5 !important; +} +.chzn-disabled .chzn-single { + cursor: default; +} +.chzn-disabled .chzn-choices .search-choice .search-choice-close { + cursor: default; +} + +/* @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 { + left: 26px; + right: auto; +} +.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; background-position: right top;} +.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 -38px -22px; + background: url('chosen-sprite.png') no-repeat -38px -22px, -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff)); + background: url('chosen-sprite.png') no-repeat -38px -22px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background: url('chosen-sprite.png') no-repeat -38px -22px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background: url('chosen-sprite.png') no-repeat -38px -22px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background: url('chosen-sprite.png') no-repeat -38px -22px, -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background: url('chosen-sprite.png') no-repeat -38px -22px, linear-gradient(top, #eeeeee 1%, #ffffff 15%); + padding: 4px 5px 4px 20px; + direction: rtl; +} +/* @end */ diff --git a/themes/default/js/plugins/chosen.jquery.min.js b/themes/default/js/plugins/chosen.jquery.min.js new file mode 100644 index 000000000..930fb9a50 --- /dev/null +++ b/themes/default/js/plugins/chosen.jquery.min.js @@ -0,0 +1,10 @@ +// Chosen, a Select Box Enhancer for jQuery and Protoype +// by Patrick Filler for Harvest, http://getharvest.com +// +// Version 0.9.7 +// 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 a;a=function(){function a(){this.options_index=0,this.parsed=[]}return a.prototype.add_node=function(a){return a.nodeName==="OPTGROUP"?this.add_group(a):this.add_option(a)},a.prototype.add_group=function(a){var b,c,d,e,f,g;b=this.parsed.length,this.parsed.push({array_index:b,group:!0,label:a.label,children:0,disabled:a.disabled}),f=a.childNodes,g=[];for(d=0,e=f.length;d<e;d++)c=f[d],g.push(this.add_option(c,b,a.disabled));return g},a.prototype.add_option=function(a,b,c){if(a.nodeName==="OPTION")return a.text!==""?(b!=null&&(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},a}(),a.select_to_array=function(b){var c,d,e,f,g;d=new a,g=b.childNodes;for(e=0,f=g.length;e<f;e++)c=g[e],d.add_node(c);return d.parsed},this.SelectParser=a})).call(this),function(){var a,b;b=this,a=function(){function a(a,b){this.form_field=a,this.options=b!=null?b:{},this.set_default_values(),this.is_multiple=this.form_field.multiple,this.default_text_default=this.is_multiple?"Select Some Options":"Select an Option",this.setup(),this.set_up_html(),this.register_observers(),this.finish_setup()}return a.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=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.choices=0,this.results_none_found=this.options.no_results_text||"No results match"},a.prototype.mouse_enter=function(){return this.mouse_on_container=!0},a.prototype.mouse_leave=function(){return this.mouse_on_container=!1},a.prototype.input_focus=function(a){var b=this;if(!this.active_field)return setTimeout(function(){return b.container_mousedown()},50)},a.prototype.input_blur=function(a){var b=this;if(!this.mouse_on_container)return this.active_field=!1,setTimeout(function(){return b.blur_test()},100)},a.prototype.result_add_option=function(a){var b,c;return a.disabled?"":(a.dom_id=this.container_id+"_o_"+a.array_index,b=a.selected&&this.is_multiple?[]:["active-result"],a.selected&&b.push("result-selected"),a.group_array_index!=null&&b.push("group-option"),a.classes!==""&&b.push(a.classes),c=a.style.cssText!==""?' style="'+a.style+'"':"",'<li id="'+a.dom_id+'" class="'+b.join(" ")+'"'+c+">"+a.html+"</li>")},a.prototype.results_update_field=function(){return this.result_clear_highlight(),this.result_single_selected=null,this.results_build()},a.prototype.results_toggle=function(){return this.results_showing?this.results_hide():this.results_show()},a.prototype.results_search=function(a){return this.results_showing?this.winnow_results():this.results_show()},a.prototype.keyup_checker=function(a){var b,c;b=(c=a.which)!=null?c:a.keyCode,this.search_field_scale();switch(b){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:a.preventDefault();if(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()}},a.prototype.generate_field_id=function(){var a;return a=this.generate_random_id(),this.form_field.id=a,a},a.prototype.generate_random_char=function(){var a,b,c;return a="0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ",c=Math.floor(Math.random()*a.length),b=a.substring(c,c+1)},a}(),b.AbstractChosen=a}.call(this),function(){var a,b,c,d,e=Object.prototype.hasOwnProperty,f=function(a,b){function d(){this.constructor=a}for(var c in b)e.call(b,c)&&(a[c]=b[c]);return d.prototype=b.prototype,a.prototype=new d,a.__super__=b.prototype,a};d=this,a=jQuery,a.fn.extend({chosen:function(c){return!a.browser.msie||a.browser.version!=="6.0"&&a.browser.version!=="7.0"?a(this).each(function(d){if(!a(this).hasClass("chzn-done"))return new b(this,c)}):this}}),b=function(b){function e(){e.__super__.constructor.apply(this,arguments)}return f(e,b),e.prototype.setup=function(){return this.form_field_jq=a(this.form_field),this.is_rtl=this.form_field_jq.hasClass("chzn-rtl")},e.prototype.finish_setup=function(){return this.form_field_jq.addClass("chzn-done")},e.prototype.set_up_html=function(){var b,d,e,f;return this.container_id=this.form_field.id.length?this.form_field.id.replace(/(:|\.)/g,"_"):this.generate_field_id(),this.container_id+="_chzn",this.f_width=this.form_field_jq.outerWidth(),this.default_text=this.form_field_jq.data("placeholder")?this.form_field_jq.data("placeholder"):this.default_text_default,b=a("<div />",{id:this.container_id,"class":"chzn-container"+(this.is_rtl?" chzn-rtl":""),style:"width: "+this.f_width+"px;"}),this.is_multiple?b.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>'):b.html('<a href="javascript:void(0)" class="chzn-single"><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(b),this.container=a("#"+this.container_id),this.container.addClass("chzn-container-"+(this.is_multiple?"multi":"single")),this.dropdown=this.container.find("div.chzn-drop").first(),d=this.container.height(),e=this.f_width-c(this.dropdown),this.dropdown.css({width:e+"px",top:d+"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(),f=e-c(this.search_container)-c(this.search_field),this.search_field.css({width:f+"px"})),this.results_build(),this.set_tab_index(),this.form_field_jq.trigger("liszt:ready",{chosen:this})},e.prototype.register_observers=function(){var a=this;return this.container.mousedown(function(b){return a.container_mousedown(b)}),this.container.mouseup(function(b){return a.container_mouseup(b)}),this.container.mouseenter(function(b){return a.mouse_enter(b)}),this.container.mouseleave(function(b){return a.mouse_leave(b)}),this.search_results.mouseup(function(b){return a.search_results_mouseup(b)}),this.search_results.mouseover(function(b){return a.search_results_mouseover(b)}),this.search_results.mouseout(function(b){return a.search_results_mouseout(b)}),this.form_field_jq.bind("liszt:updated",function(b){return a.results_update_field(b)}),this.search_field.blur(function(b){return a.input_blur(b)}),this.search_field.keyup(function(b){return a.keyup_checker(b)}),this.search_field.keydown(function(b){return a.keydown_checker(b)}),this.is_multiple?(this.search_choices.click(function(b){return a.choices_click(b)}),this.search_field.focus(function(b){return a.input_focus(b)})):this.container.click(function(a){return a.preventDefault()})},e.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)},e.prototype.container_mousedown=function(b){var c;if(!this.is_disabled)return c=b!=null?a(b.target).hasClass("search-choice-close"):!1,b&&b.type==="mousedown"&&b.stopPropagation(),!this.pending_destroy_click&&!c?(this.active_field?!this.is_multiple&&b&&(a(b.target)[0]===this.selected_item[0]||a(b.target).parents("a.chzn-single").length)&&(b.preventDefault(),this.results_toggle()):(this.is_multiple&&this.search_field.val(""),a(document).click(this.click_test_action),this.results_show()),this.activate_field()):this.pending_destroy_click=!1},e.prototype.container_mouseup=function(a){if(a.target.nodeName==="ABBR")return this.results_reset(a)},e.prototype.blur_test=function(a){if(!this.active_field&&this.container.hasClass("chzn-container-active"))return this.close_field()},e.prototype.close_field=function(){return a(document).unbind("click",this.click_test_action),this.is_multiple||(this.selected_item.attr("tabindex",this.search_field.attr("tabindex")),this.search_field.attr("tabindex",-1)),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()},e.prototype.activate_field=function(){return!this.is_multiple&&!this.active_field&&(this.search_field.attr("tabindex",this.selected_item.attr("tabindex")),this.selected_item.attr("tabindex",-1)),this.container.addClass("chzn-container-active"),this.active_field=!0,this.search_field.val(this.search_field.val()),this.search_field.focus()},e.prototype.test_active_click=function(b){return a(b.target).parents("#"+this.container_id).length?this.active_field=!0:this.close_field()},e.prototype.results_build=function(){var a,b,c,e,f;this.parsing=!0,this.results_data=d.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.find("span").text(this.default_text),this.form_field.options.length<=this.disable_search_threshold?this.container.addClass("chzn-container-single-nosearch"):this.container.removeClass("chzn-container-single-nosearch")),a="",f=this.results_data;for(c=0,e=f.length;c<e;c++)b=f[c],b.group?a+=this.result_add_group(b):b.empty||(a+=this.result_add_option(b),b.selected&&this.is_multiple?this.choice_build(b):b.selected&&!this.is_multiple&&(this.selected_item.find("span").text(b.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(a),this.parsing=!1},e.prototype.result_add_group=function(b){return b.disabled?"":(b.dom_id=this.container_id+"_g_"+b.array_index,'<li id="'+b.dom_id+'" class="group-result">'+a("<div />").text(b.label).html()+"</li>")},e.prototype.result_do_highlight=function(a){var b,c,d,e,f;if(a.length){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();if(b>=e)return this.search_results.scrollTop(b-d>0?b-d:0);if(c<f)return this.search_results.scrollTop(c)}},e.prototype.result_clear_highlight=function(){return this.result_highlight&&this.result_highlight.removeClass("highlighted"),this.result_highlight=null},e.prototype.results_show=function(){var a;return this.is_multiple||(this.selected_item.addClass("chzn-single-with-drop"),this.result_single_selected&&this.result_do_highlight(this.result_single_selected)),a=this.is_multiple?this.container.height():this.container.height()-1,this.dropdown.css({top:a+"px",left:0}),this.results_showing=!0,this.search_field.focus(),this.search_field.val(this.search_field.val()),this.winnow_results()},e.prototype.results_hide=function(){return this.is_multiple||this.selected_item.removeClass("chzn-single-with-drop"),this.result_clear_highlight(),this.dropdown.css({left:"-9000px"}),this.results_showing=!1},e.prototype.set_tab_index=function(a){var b;if(this.form_field_jq.attr("tabindex"))return b=this.form_field_jq.attr("tabindex"),this.form_field_jq.attr("tabindex",-1),this.is_multiple?this.search_field.attr("tabindex",b):(this.selected_item.attr("tabindex",b),this.search_field.attr("tabindex",-1))},e.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"))},e.prototype.search_results_mouseup=function(b){var c;c=a(b.target).hasClass("active-result")?a(b.target):a(b.target).parents(".active-result").first();if(c.length)return this.result_highlight=c,this.result_select(b)},e.prototype.search_results_mouseover=function(b){var c;c=a(b.target).hasClass("active-result")?a(b.target):a(b.target).parents(".active-result").first();if(c)return this.result_do_highlight(c)},e.prototype.search_results_mouseout=function(b){if(a(b.target).hasClass("active-result"))return this.result_clear_highlight()},e.prototype.choices_click=function(b){b.preventDefault();if(this.active_field&&!a(b.target).hasClass("search-choice")&&!this.results_showing)return this.results_show()},e.prototype.choice_build=function(b){var c,d,e=this;return c=this.container_id+"_c_"+b.array_index,this.choices+=1,this.search_container.before('<li class="search-choice" id="'+c+'"><span>'+b.html+'</span><a href="javascript:void(0)" class="search-choice-close" rel="'+b.array_index+'"></a></li>'),d=a("#"+c).find("a").first(),d.click(function(a){return e.choice_destroy_link_click(a)})},e.prototype.choice_destroy_link_click=function(b){return b.preventDefault(),this.is_disabled?b.stopPropagation:(this.pending_destroy_click=!0,this.choice_destroy(a(b.target)))},e.prototype.choice_destroy=function(a){return this.choices-=1,this.show_search_field_default(),this.is_multiple&&this.choices>0&&this.search_field.val().length<1&&this.results_hide(),this.result_deselect(a.attr("rel")),a.parents("li").first().remove()},e.prototype.results_reset=function(b){this.form_field.options[0].selected=!0,this.selected_item.find("span").text(this.default_text),this.show_search_field_default(),a(b.target).remove(),this.form_field_jq.trigger("change");if(this.active_field)return this.results_hide()},e.prototype.result_select=function(a){var b,c,d,e;if(this.result_highlight)return b=this.result_highlight,c=b.attr("id"),this.result_clear_highlight(),this.is_multiple?this.result_deactivate(b):(this.search_results.find(".result-selected").removeClass("result-selected"),this.result_single_selected=b),b.addClass("result-selected"),e=c.substr(c.lastIndexOf("_")+1),d=this.results_data[e],d.selected=!0,this.form_field.options[d.options_index].selected=!0,this.is_multiple?this.choice_build(d):(this.selected_item.find("span").first().text(d.text),this.allow_single_deselect&&this.single_deselect_control_build()),(!a.metaKey||!this.is_multiple)&&this.results_hide(),this.search_field.val(""),this.form_field_jq.trigger("change"),this.search_field_scale()},e.prototype.result_activate=function(a){return a.addClass("active-result")},e.prototype.result_deactivate=function(a){return a.removeClass("active-result")},e.prototype.result_deselect=function(b){var c,d;return d=this.results_data[b],d.selected=!1,this.form_field.options[d.options_index].selected=!1,c=a("#"+this.container_id+"_o_"+b),c.removeClass("result-selected").addClass("active-result").show(),this.result_clear_highlight(),this.winnow_results(),this.form_field_jq.trigger("change"),this.search_field_scale()},e.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>')},e.prototype.winnow_results=function(){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;this.no_results_clear(),i=0,j=this.search_field.val()===this.default_text?"":a("<div/>").text(a.trim(this.search_field.val())).html(),f=new RegExp("^"+j.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),m=new RegExp(j.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),r=this.results_data;for(n=0,p=r.length;n<p;n++){c=r[n];if(!c.disabled&&!c.empty)if(c.group)a("#"+c.dom_id).css("display","none");else if(!this.is_multiple||!c.selected){b=!1,h=c.dom_id,g=a("#"+h);if(f.test(c.html))b=!0,i+=1;else if(c.html.indexOf(" ")>=0||c.html.indexOf("[")===0){e=c.html.replace(/\[|\]/g,"").split(" ");if(e.length)for(o=0,q=e.length;o<q;o++)d=e[o],f.test(d)&&(b=!0,i+=1)}b?(j.length?(k=c.html.search(m),l=c.html.substr(0,k+j.length)+"</em>"+c.html.substr(k+j.length),l=l.substr(0,k)+"<em>"+l.substr(k)):l=c.html,g.html(l),this.result_activate(g),c.group_array_index!=null&&a("#"+this.results_data[c.group_array_index].dom_id).css("display","list-item")):(this.result_highlight&&h===this.result_highlight.attr("id")&&this.result_clear_highlight(),this.result_deactivate(g))}}return i<1&&j.length?this.no_results(j):this.winnow_results_set_highlight()},e.prototype.winnow_results_clear=function(){var b,c,d,e,f;this.search_field.val(""),c=this.search_results.find("li"),f=[];for(d=0,e=c.length;d<e;d++)b=c[d],b=a(b),b.hasClass("group-result")?f.push(b.css("display","auto")):!this.is_multiple||!b.hasClass("result-selected")?f.push(this.result_activate(b)):f.push(void 0);return f},e.prototype.winnow_results_set_highlight=function(){var a,b;if(!this.result_highlight){b=this.is_multiple?[]:this.search_results.find(".result-selected.active-result"),a=b.length?b.first():this.search_results.find(".active-result").first();if(a!=null)return this.result_do_highlight(a)}},e.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)},e.prototype.no_results_clear=function(){return this.search_results.find(".no-results").remove()},e.prototype.keydown_arrow=function(){var b,c;this.result_highlight?this.results_showing&&(c=this.result_highlight.nextAll("li.active-result").first(),c&&this.result_do_highlight(c)):(b=this.search_results.find("li.active-result").first(),b&&this.result_do_highlight(a(b)));if(!this.results_showing)return this.results_show()},e.prototype.keyup_arrow=function(){var a;if(!this.results_showing&&!this.is_multiple)return this.results_show();if(this.result_highlight)return a=this.result_highlight.prevAll("li.active-result"),a.length?this.result_do_highlight(a.first()):(this.choices>0&&this.results_hide(),this.result_clear_highlight())},e.prototype.keydown_backstroke=function(){return this.pending_backstroke?(this.choice_destroy(this.pending_backstroke.find("a").first()),this.clear_backstroke()):(this.pending_backstroke=this.search_container.siblings("li.search-choice").last(),this.pending_backstroke.addClass("search-choice-focus"))},e.prototype.clear_backstroke=function(){return this.pending_backstroke&&this.pending_backstroke.removeClass("search-choice-focus"),this.pending_backstroke=null},e.prototype.keydown_checker=function(a){var b,c;b=(c=a.which)!=null?c:a.keyCode,this.search_field_scale(),b!==8&&this.pending_backstroke&&this.clear_backstroke();switch(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:this.keydown_arrow()}},e.prototype.search_field_scale=function(){var b,c,d,e,f,g,h,i,j;if(this.is_multiple){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"];for(i=0,j=g.length;i<j;i++)e=g[i],f+=e+":"+this.search_field.css(e)+";";return c=a("<div />",{style:f}),c.text(this.search_field.val()),a("body").append(c),h=c.width()+25,c.remove(),h>this.f_width-10&&(h=this.f_width-10),this.search_field.css({width:h+"px"}),b=this.container.height(),this.dropdown.css({top:b+"px"})}},e.prototype.generate_random_id=function(){var b;b="sel"+this.generate_random_char()+this.generate_random_char()+this.generate_random_char();while(a("#"+b).length>0)b+=this.generate_random_char();return b},e}(AbstractChosen),c=function(a){var b;return b=a.outerWidth()-a.width()},d.get_side_border_padding=c}.call(this)
\ No newline at end of file |