1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/piwigo_ynh.git synced 2024-09-03 20:06:03 +02:00

mis a jour piwigo 2.7.4

This commit is contained in:
monsieur-a 2015-07-05 19:03:18 +02:00
parent d056dca453
commit f09a35287d
685 changed files with 15782 additions and 18179 deletions

View file

@ -37,7 +37,7 @@ check_status(ACCESS_GUEST);
$title= l10n('About Piwigo');
$page['body_id'] = 'theAboutPage';
trigger_action('loc_begin_about');
trigger_notify('loc_begin_about');
$template->set_filename('about', 'about.tpl');

View file

@ -33,7 +33,7 @@ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
include_once(PHPWG_ROOT_PATH.'admin/include/functions_plugins.inc.php');
include_once(PHPWG_ROOT_PATH.'admin/include/add_core_tabs.inc.php');
trigger_action('loc_begin_admin');
trigger_notify('loc_begin_admin');
// +-----------------------------------------------------------------------+
// | Check Access and exit when user status is not ok |
@ -244,7 +244,7 @@ if ($nb_photos_in_caddie > 0)
// | Plugin menu |
// +-----------------------------------------------------------------------+
$plugin_menu_links = trigger_event('get_admin_plugin_menu_links', array() );
$plugin_menu_links = trigger_change('get_admin_plugin_menu_links', array() );
function UC_name_compare($a, $b)
{
@ -270,7 +270,6 @@ if (
'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',
)
@ -285,7 +284,7 @@ if (
// | Include specific page |
// +-----------------------------------------------------------------------+
trigger_action('loc_begin_admin_page');
trigger_notify('loc_begin_admin_page');
include(PHPWG_ROOT_PATH.'admin/'.$page['page'].'.php');
$template->assign('ACTIVE_MENU', get_active_menu($page['page']));
@ -299,7 +298,7 @@ $template->assign( 'pwgmenu', pwg_URL() );
include(PHPWG_ROOT_PATH.'include/page_header.php');
trigger_action('loc_end_admin');
trigger_notify('loc_end_admin');
flush_page_messages();

View file

@ -83,7 +83,7 @@ SELECT id, file, path, representative_ext
pwg_mail_group(
$_POST['group'],
array(
'subject' => l10n('[%s] Visit album %s', $conf['gallery_title'], trigger_event('render_category_name', $category['name'], 'admin_cat_list')),
'subject' => l10n('[%s] Visit album %s', $conf['gallery_title'], trigger_change('render_category_name', $category['name'], 'admin_cat_list')),
// TODO : change this language variable to 'Visit album %s'
// TODO : 'language_selected' => ....
),
@ -91,11 +91,11 @@ SELECT id, file, path, representative_ext
'filename' => 'cat_group_info',
'assign' => array(
'IMG_URL' => $img_url,
'CAT_NAME' => trigger_event('render_category_name', $category['name'], 'admin_cat_list'),
'CAT_NAME' => trigger_change('render_category_name', $category['name'], 'admin_cat_list'),
'LINK' => make_index_url(array(
'category' => array(
'id' => $category['id'],
'name' => trigger_event('render_category_name', $category['name'], 'admin_cat_list'),
'name' => trigger_change('render_category_name', $category['name'], 'admin_cat_list'),
'permalink' => $category['permalink']
)
)),

View file

@ -43,6 +43,27 @@ check_status(ACCESS_ADMINISTRATOR);
check_input_parameter('selection', $_POST, true, PATTERN_ID);
// +-----------------------------------------------------------------------+
// | specific actions |
// +-----------------------------------------------------------------------+
if (isset($_GET['action']))
{
if ('empty_caddie' == $_GET['action'])
{
$query = '
DELETE FROM '.CADDIE_TABLE.'
WHERE user_id = '.$user['id'].'
;';
pwg_query($query);
$_SESSION['page_infos'] = array(
l10n('Information data registered in database')
);
redirect(get_root_url().'admin.php?page='.$_GET['page']);
}
}
// +-----------------------------------------------------------------------+
// | initialize current set |
@ -58,6 +79,19 @@ if (isset($_POST['submitFilter']))
if (isset($_POST['filter_prefilter_use']))
{
$_SESSION['bulk_manager_filter']['prefilter'] = $_POST['filter_prefilter'];
if ('duplicates' == $_POST['filter_prefilter'])
{
if (isset($_POST['filter_duplicates_date']))
{
$_SESSION['bulk_manager_filter']['duplicates_date'] = true;
}
if (isset($_POST['filter_duplicates_dimensions']))
{
$_SESSION['bulk_manager_filter']['duplicates_dimensions'] = true;
}
}
}
if (isset($_POST['filter_category_use']))
@ -82,62 +116,82 @@ if (isset($_POST['submitFilter']))
if (isset($_POST['filter_level_use']))
{
check_input_parameter('filter_level', $_POST, false, '/^\d+$/');
if (in_array($_POST['filter_level'], $conf['available_permission_levels']))
{
$_SESSION['bulk_manager_filter']['level'] = $_POST['filter_level'];
if (isset($_POST['filter_level_include_lower']))
{
$_SESSION['bulk_manager_filter']['level_include_lower'] = true;
}
}
}
if (isset($_POST['filter_dimension_use']))
{
foreach (array('min_width','max_width','min_height','max_height') as $type)
{
if ( preg_match('#^[0-9]+$#', $_POST['filter_dimension_'. $type ]) )
if (filter_var($_POST['filter_dimension_'.$type], FILTER_VALIDATE_INT) !== false)
{
$_SESSION['bulk_manager_filter']['dimension'][$type] = $_POST['filter_dimension_'. $type ];
}
}
foreach (array('min_ratio','max_ratio') as $type)
{
if ( preg_match('#^[0-9\.]+$#', $_POST['filter_dimension_'. $type ]) )
if (filter_var($_POST['filter_dimension_'.$type], FILTER_VALIDATE_FLOAT) !== false)
{
$_SESSION['bulk_manager_filter']['dimension'][$type] = $_POST['filter_dimension_'. $type ];
}
}
}
if (isset($_POST['filter_filesize_use']))
{
foreach (array('min','max') as $type)
{
if (filter_var($_POST['filter_filesize_'.$type], FILTER_VALIDATE_FLOAT) !== false)
{
$_SESSION['bulk_manager_filter']['filesize'][$type] = $_POST['filter_filesize_'. $type ];
}
}
}
if (isset($_POST['filter_search_use']))
{
$_SESSION['bulk_manager_filter']['search']['q'] = $_POST['q'];
}
$_SESSION['bulk_manager_filter'] = trigger_change('batch_manager_register_filters', $_SESSION['bulk_manager_filter']);
}
// filters from url
else if (isset($_GET['filter']))
elseif (isset($_GET['filter']))
{
if (!is_array($_GET['filter']))
{
$_GET['filter'] = explode(',', $_GET['filter']);
}
$_SESSION['bulk_manager_filter'] = array();
foreach ($_GET['filter'] as $filter)
{
list($type, $value) = explode('-', $filter);
list($type, $value) = explode('-', $filter, 2);
switch ($type)
{
case 'prefilter':
$_SESSION['bulk_manager_filter']['prefilter'] = $value;
break;
case 'album':
case 'album': case 'category': case 'cat':
if (is_numeric($value))
{
$_SESSION['bulk_manager_filter']['category'] = $value;
}
break;
case 'tag':
if (is_numeric($value))
{
@ -145,13 +199,44 @@ else if (isset($_GET['filter']))
$_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;
case 'search':
$_SESSION['bulk_manager_filter']['search']['q'] = $value;
break;
case 'dimension':
$dim_map = array('w'=>'width','h'=>'height','r'=>'ratio');
foreach (explode('-', $value) as $part)
{
$values = explode('..', substr($part, 1));
if (isset($dim_map[$part[0]]))
{
$type = $dim_map[$part[0]];
list(
$_SESSION['bulk_manager_filter']['dimension']['min_'.$type],
$_SESSION['bulk_manager_filter']['dimension']['max_'.$type]
) = $values;
}
}
break;
case 'filesize':
list(
$_SESSION['bulk_manager_filter']['filesize']['min'],
$_SESSION['bulk_manager_filter']['filesize']['max']
) = explode('..', $value);
break;
default:
$_SESSION['bulk_manager_filter'] = trigger_change('batch_manager_url_filter', $_SESSION['bulk_manager_filter'], $filter);
break;
}
}
}
@ -177,8 +262,8 @@ SELECT element_id
FROM '.CADDIE_TABLE.'
WHERE user_id = '.$user['id'].'
;';
$filter_sets[] = array_from_query($query, 'element_id');
$filter_sets[] = query2array($query, null, 'element_id');
break;
case 'favorites':
@ -187,8 +272,8 @@ SELECT image_id
FROM '.FAVORITES_TABLE.'
WHERE user_id = '.$user['id'].'
;';
$filter_sets[] = array_from_query($query, 'image_id');
$filter_sets[] = query2array($query, null, 'image_id');
break;
case 'last_import':
@ -204,9 +289,9 @@ SELECT id
FROM '.IMAGES_TABLE.'
WHERE date_available BETWEEN '.pwg_db_get_recent_period_expression(1, $row['date']).' AND \''.$row['date'].'\'
;';
$filter_sets[] = array_from_query($query, 'id');
$filter_sets[] = query2array($query, null, 'id');
}
break;
case 'no_virtual_album':
@ -215,14 +300,14 @@ SELECT id
SELECT id
FROM '.IMAGES_TABLE.'
;';
$all_elements = array_from_query($query, 'id');
$all_elements = query2array($query, null, 'id');
$query = '
SELECT id
FROM '.CATEGORIES_TABLE.'
WHERE dir IS NULL
;';
$virtual_categories = array_from_query($query, 'id');
$virtual_categories = query2array($query, null, 'id');
if (!empty($virtual_categories))
{
$query = '
@ -230,11 +315,11 @@ SELECT id
FROM '.IMAGE_CATEGORY_TABLE.'
WHERE category_id IN ('.implode(',', $virtual_categories).')
;';
$linked_to_virtual = array_from_query($query, 'image_id');
$linked_to_virtual = query2array($query, null, 'image_id');
}
$filter_sets[] = array_diff($all_elements, $linked_to_virtual);
break;
case 'no_album':
@ -245,8 +330,8 @@ SELECT
LEFT JOIN '.IMAGE_CATEGORY_TABLE.' ON id = image_id
WHERE category_id is null
;';
$filter_sets[] = array_from_query($query, 'id');
$filter_sets[] = query2array($query, null, 'id');
break;
case 'no_tag':
@ -257,44 +342,61 @@ SELECT
LEFT JOIN '.IMAGE_TAG_TABLE.' ON id = image_id
WHERE tag_id is null
;';
$filter_sets[] = array_from_query($query, 'id');
$filter_sets[] = query2array($query, null, 'id');
break;
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.
$duplicates_on_fields = array('file');
if (isset($_SESSION['bulk_manager_filter']['duplicates_date']))
{
$duplicates_on_fields[] = 'date_creation';
}
if (isset($_SESSION['bulk_manager_filter']['duplicates_dimensions']))
{
$duplicates_on_fields[] = 'width';
$duplicates_on_fields[] = 'height';
}
$query = '
SELECT file
SELECT
GROUP_CONCAT(id) AS ids
FROM '.IMAGES_TABLE.'
GROUP BY file
GROUP BY '.implode(',', $duplicates_on_fields).'
HAVING COUNT(*) > 1
;';
$duplicate_files = array_from_query($query, 'file');
$array_of_ids_string = query2array($query, null, 'ids');
$query = '
SELECT id
FROM '.IMAGES_TABLE.'
WHERE file IN (\''.implode("','", array_map('pwg_db_real_escape_string', $duplicate_files)).'\')
;';
$filter_sets[] = array_from_query($query, 'id');
$ids = array();
foreach ($array_of_ids_string as $ids_string)
{
$ids = array_merge($ids, explode(',', $ids_string));
}
$filter_sets[] = $ids;
break;
case 'all_photos':
$query = '
if ( count($_SESSION['bulk_manager_filter']) == 1 )
{// make the query only if this is the only filter
$query = '
SELECT id
FROM '.IMAGES_TABLE.'
'.$conf['order_by'];
$filter_sets[] = array_from_query($query, 'id');
$filter_sets[] = query2array($query, null, 'id');
}
break;
default:
$filter_sets = trigger_change('perform_batch_manager_prefilters', $filter_sets, $_SESSION['bulk_manager_filter']['prefilter']);
break;
}
$filter_sets = trigger_event('perform_batch_manager_prefilters', $filter_sets, $_SESSION['bulk_manager_filter']['prefilter']);
}
if (isset($_SESSION['bulk_manager_filter']['category']))
@ -315,7 +417,7 @@ if (isset($_SESSION['bulk_manager_filter']['category']))
FROM '.IMAGE_CATEGORY_TABLE.'
WHERE category_id IN ('.implode(',', $categories).')
;';
$filter_sets[] = array_from_query($query, 'image_id');
$filter_sets[] = query2array($query, null, 'image_id');
}
if (isset($_SESSION['bulk_manager_filter']['level']))
@ -325,14 +427,14 @@ if (isset($_SESSION['bulk_manager_filter']['level']))
{
$operator = '<=';
}
$query = '
SELECT id
FROM '.IMAGES_TABLE.'
WHERE level '.$operator.' '.$_SESSION['bulk_manager_filter']['level'].'
'.$conf['order_by'];
$filter_sets[] = array_from_query($query, 'id');
$filter_sets[] = query2array($query, null, 'id');
}
if (!empty($_SESSION['bulk_manager_filter']['tags']))
@ -374,16 +476,53 @@ if (isset($_SESSION['bulk_manager_filter']['dimension']))
// max_ratio is a floor value, so must be a bit increased
$where_clause[] = 'width/height < '.($_SESSION['bulk_manager_filter']['dimension']['max_ratio']+0.01);
}
$query = '
SELECT id
FROM '.IMAGES_TABLE.'
WHERE '.implode(' AND ',$where_clause).'
'.$conf['order_by'];
$filter_sets[] = array_from_query($query, 'id');
$filter_sets[] = query2array($query, null, 'id');
}
if (isset($_SESSION['bulk_manager_filter']['filesize']))
{
$where_clauses = array();
if (isset($_SESSION['bulk_manager_filter']['filesize']['min']))
{
$where_clause[] = 'filesize >= '.$_SESSION['bulk_manager_filter']['filesize']['min']*1024;
}
if (isset($_SESSION['bulk_manager_filter']['filesize']['max']))
{
$where_clause[] = 'filesize <= '.$_SESSION['bulk_manager_filter']['filesize']['max']*1024;
}
$query = '
SELECT id
FROM '.IMAGES_TABLE.'
WHERE '.implode(' AND ',$where_clause).'
'.$conf['order_by'];
$filter_sets[] = query2array($query, null, 'id');
}
if (isset($_SESSION['bulk_manager_filter']['search']) &&
strlen($_SESSION['bulk_manager_filter']['search']['q']))
{
include_once( PHPWG_ROOT_PATH .'include/functions_search.inc.php' );
$res = get_quick_search_results_no_cache($_SESSION['bulk_manager_filter']['search']['q'], array('permissions'=>false));
if (!empty($res['items']) && !empty($res['qs']['unmatched_terms']))
{
$template->assign('no_search_results', array_map('htmlspecialchars', $res['qs']['unmatched_terms']) );
}
$filter_sets[] = $res['items'];
}
$filter_sets = trigger_change('batch_manager_perform_filters', $filter_sets, $_SESSION['bulk_manager_filter']);
$current_set = array_shift($filter_sets);
foreach ($filter_sets as $set)
{
@ -433,17 +572,6 @@ $tabsheet->select($page['tab']);
$tabsheet->assign();
// +-----------------------------------------------------------------------+
// | tags |
// +-----------------------------------------------------------------------+
$query = '
SELECT id, name
FROM '.TAGS_TABLE.'
;';
$template->assign('tags', get_taglist($query, false));
// +-----------------------------------------------------------------------+
// | dimensions |
// +-----------------------------------------------------------------------+
@ -451,6 +579,7 @@ $template->assign('tags', get_taglist($query, false));
$widths = array();
$heights = array();
$ratios = array();
$dimensions = array();
// get all width, height and ratios
$query = '
@ -481,28 +610,20 @@ if (empty($widths))
$ratios = array(1.25, 1.52, 1.78);
}
$widths = array_unique($widths);
sort($widths);
$heights = array_unique($heights);
sort($heights);
$ratios = array_unique($ratios);
sort($ratios);
$dimensions['widths'] = implode(',', $widths);
$dimensions['heights'] = implode(',', $heights);
$dimensions['ratios'] = implode(',', $ratios);
foreach (array('widths','heights','ratios') as $type)
{
${$type} = array_unique(${$type});
sort(${$type});
$dimensions[$type] = implode(',', ${$type});
}
$dimensions['bounds'] = array(
'min_width' => $widths[0],
'max_width' => $widths[count($widths)-1],
'max_width' => end($widths),
'min_height' => $heights[0],
'max_height' => $heights[count($heights)-1],
'max_height' => end($heights),
'min_ratio' => $ratios[0],
'max_ratio' => $ratios[count($ratios)-1],
'max_ratio' => end($ratios),
);
// find ratio categories
@ -533,13 +654,13 @@ foreach ($ratios as $ratio)
}
}
foreach (array_keys($ratio_categories) as $ratio_category)
foreach (array_keys($ratio_categories) as $type)
{
if (count($ratio_categories[$ratio_category]) > 0)
if (count($ratio_categories[$type]) > 0)
{
$dimensions['ratio_'.$ratio_category] = array(
'min' => $ratio_categories[$ratio_category][0],
'max' => array_pop($ratio_categories[$ratio_category]),
$dimensions['ratio_'.$type] = array(
'min' => $ratio_categories[$type][0],
'max' => end($ratio_categories[$type]),
);
}
}
@ -555,6 +676,56 @@ foreach (array_keys($dimensions['bounds']) as $type)
$template->assign('dimensions', $dimensions);
// +-----------------------------------------------------------------------+
// | filesize |
// +-----------------------------------------------------------------------+
$filesizes = array();
$filesize = array();
$query = '
SELECT
filesize
FROM '.IMAGES_TABLE.'
WHERE filesize IS NOT NULL
GROUP BY filesize
;';
$result = pwg_query($query);
while ($row = pwg_db_fetch_assoc($result))
{
$filesizes[] = sprintf('%.1f', $row['filesize']/1024);
}
if (empty($filesizes))
{ // arbitrary values, only used when no photos on the gallery
$filesizes = array(0, 1, 2, 5, 8, 15);
}
$filesizes = array_unique($filesizes);
sort($filesizes);
// add 0.1MB to the last value, to make sure the heavier photo will be in
// the result
$filesizes[count($filesizes)-1]+= 0.1;
$filesize['list'] = implode(',', $filesizes);
$filesize['bounds'] = array(
'min' => $filesizes[0],
'max' => end($filesizes),
);
// selected=bound if nothing selected
foreach (array_keys($filesize['bounds']) as $type)
{
$filesize['selected'][$type] = isset($_SESSION['bulk_manager_filter']['filesize'][$type])
? $_SESSION['bulk_manager_filter']['filesize'][$type]
: $filesize['bounds'][$type]
;
}
$template->assign('filesize', $filesize);
// +-----------------------------------------------------------------------+
// | open specific mode |

View file

@ -40,7 +40,7 @@ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
check_status(ACCESS_ADMINISTRATOR);
trigger_action('loc_begin_element_set_global');
trigger_notify('loc_begin_element_set_global');
check_input_parameter('del_tags', $_POST, true, PATTERN_ID);
check_input_parameter('associate', $_POST, false, PATTERN_ID);
@ -86,7 +86,8 @@ if (isset($_POST['submit']))
}
$action = $_POST['selectAction'];
$redirect = false;
if ('remove_from_caddie' == $action)
{
$query = '
@ -98,10 +99,10 @@ DELETE
pwg_query($query);
// remove from caddie action available only in caddie so reload content
redirect($redirect_url);
$redirect = true;
}
if ('add_tags' == $action)
else if ('add_tags' == $action)
{
if (empty($_POST['add_tags']))
{
@ -114,27 +115,33 @@ DELETE
if ('no_tag' == $page['prefilter'])
{
redirect($redirect_url);
$redirect = true;
}
}
}
if ('del_tags' == $action)
else if ('del_tags' == $action)
{
if (isset($_POST['del_tags']) and count($_POST['del_tags']) > 0)
{
$query = '
if (isset($_POST['del_tags']) and count($_POST['del_tags']) > 0)
{
$query = '
DELETE
FROM '.IMAGE_TAG_TABLE.'
WHERE image_id IN ('.implode(',', $collection).')
AND tag_id IN ('.implode(',', $_POST['del_tags']).')
;';
pwg_query($query);
pwg_query($query);
if (isset($_SESSION['bulk_manager_filter']['tags']) &&
count(array_intersect($_SESSION['bulk_manager_filter']['tags'], $_POST['del_tags'])))
{
$redirect = true;
}
}
else
{
else
{
$page['errors'][] = l10n('Select at least one tag');
}
}
}
if ('associate' == $action)
@ -147,54 +154,54 @@ DELETE
$_SESSION['page_infos'] = array(
l10n('Information data registered in database')
);
// let's refresh the page because we the current set might be modified
if ('no_album' == $page['prefilter'])
{
redirect($redirect_url);
$redirect = true;
}
if ('no_virtual_album' == $page['prefilter'])
else if ('no_virtual_album' == $page['prefilter'])
{
$category_info = get_cat_info($_POST['associate']);
if (empty($category_info['dir']))
{
redirect($redirect_url);
$redirect = true;
}
}
}
if ('move' == $action)
else if ('move' == $action)
{
move_images_to_categories($collection, array($_POST['move']));
$_SESSION['page_infos'] = array(
l10n('Information data registered in database')
);
// let's refresh the page because we the current set might be modified
if ('no_album' == $page['prefilter'])
{
redirect($redirect_url);
$redirect = true;
}
if ('no_virtual_album' == $page['prefilter'])
else if ('no_virtual_album' == $page['prefilter'])
{
$category_info = get_cat_info($_POST['move']);
if (empty($category_info['dir']))
{
redirect($redirect_url);
$redirect = true;
}
}
if (isset($_SESSION['bulk_manager_filter']['category'])
else if (isset($_SESSION['bulk_manager_filter']['category'])
and $_POST['move'] != $_SESSION['bulk_manager_filter']['category'])
{
redirect($redirect_url);
$redirect = true;
}
}
if ('dissociate' == $action)
else if ('dissociate' == $action)
{
// physical links must not be broken, so we must first retrieve image_id
// which create virtual links with the category to "dissociate from".
@ -224,20 +231,20 @@ DELETE
$_SESSION['page_infos'] = array(
l10n('Information data registered in database')
);
// let's refresh the page because the current set might be modified
redirect($redirect_url);
$redirect = true;
}
}
// author
if ('author' == $action)
else if ('author' == $action)
{
if (isset($_POST['remove_author']))
{
$_POST['author'] = null;
}
$datas = array();
foreach ($collection as $image_id)
{
@ -255,13 +262,13 @@ DELETE
}
// title
if ('title' == $action)
else if ('title' == $action)
{
if (isset($_POST['remove_title']))
{
$_POST['title'] = null;
}
$datas = array();
foreach ($collection as $image_id)
{
@ -277,21 +284,18 @@ DELETE
$datas
);
}
// date_creation
if ('date_creation' == $action)
{
$date_creation = sprintf(
'%u-%u-%u',
$_POST['date_creation_year'],
$_POST['date_creation_month'],
$_POST['date_creation_day']
);
if (isset($_POST['remove_date_creation']))
// date_creation
else if ('date_creation' == $action)
{
if (isset($_POST['remove_date_creation']) || empty($_POST['date_creation']))
{
$date_creation = null;
}
else
{
$date_creation = $_POST['date_creation'];
}
$datas = array();
foreach ($collection as $image_id)
@ -308,9 +312,9 @@ DELETE
$datas
);
}
// privacy_level
if ('level' == $action)
else if ('level' == $action)
{
$datas = array();
foreach ($collection as $image_id)
@ -331,19 +335,19 @@ DELETE
{
if ($_POST['level'] < $_SESSION['bulk_manager_filter']['level'])
{
redirect($redirect_url);
$redirect = true;
}
}
}
// add_to_caddie
if ('add_to_caddie' == $action)
else if ('add_to_caddie' == $action)
{
fill_caddie($collection);
}
// delete
if ('delete' == $action)
else if ('delete' == $action)
{
if (isset($_POST['confirm_deletion']) and 1 == $_POST['confirm_deletion'])
{
@ -356,7 +360,7 @@ DELETE
);
$redirect_url = get_root_url().'admin.php?page='.$_GET['page'];
redirect($redirect_url);
$redirect = true;
}
else
{
@ -370,13 +374,13 @@ DELETE
}
// synchronize metadata
if ('metadata' == $action)
else if ('metadata' == $action)
{
sync_metadata($collection);
$page['infos'][] = l10n('Metadata synchronized from file');
}
if ('delete_derivatives' == $action)
else if ('delete_derivatives' == $action && !empty($_POST['del_derivatives_type']))
{
$query='SELECT path,representative_ext FROM '.IMAGES_TABLE.'
WHERE id IN ('.implode(',', $collection).')';
@ -390,7 +394,7 @@ DELETE
}
}
if ('generate_derivatives' == $action)
else if ('generate_derivatives' == $action)
{
if ($_POST['regenerateSuccess'] != '0')
{
@ -402,7 +406,17 @@ DELETE
}
}
trigger_action('element_set_global_action', $action, $collection);
if (!in_array($action, array('remove_from_caddie','add_to_caddie','delete_derivatives','generate_derivatives')))
{
invalidate_user_cache();
}
trigger_notify('element_set_global_action', $action, $collection);
if ($redirect)
{
redirect($redirect_url);
}
}
// +-----------------------------------------------------------------------+
@ -427,7 +441,7 @@ if ($conf['enable_synchronization'])
$prefilters[] = array('ID' => 'no_virtual_album', 'NAME' => l10n('With no virtual album'));
}
$prefilters = trigger_event('get_batch_manager_prefilters', $prefilters);
$prefilters = trigger_change('get_batch_manager_prefilters', $prefilters);
usort($prefilters, 'UC_name_compare');
$template->assign(
@ -472,6 +486,8 @@ $template->assign(
);
// tags
$filter_tags = array();
if (!empty($_SESSION['bulk_manager_filter']['tags']))
{
$query = '
@ -481,19 +497,11 @@ SELECT
FROM '.TAGS_TABLE.'
WHERE id IN ('.implode(',', $_SESSION['bulk_manager_filter']['tags']).')
;';
$template->assign('filter_tags', get_taglist($query));
$filter_tags = get_taglist($query);
}
// Virtualy associate a picture to a category
$query = '
SELECT id,name,uppercats,global_rank
FROM '.CATEGORIES_TABLE.'
;';
$categories = array_from_query($query);
usort($categories, 'global_rank_compare');
display_select_categories($categories, array(), 'category_full_name_options', true);
display_select_cat_wrapper($query, array(), 'category_parent_options');
$template->assign('filter_tags', $filter_tags);
// in the filter box, which category to select by default
$selected_category = array();
@ -506,24 +514,20 @@ else
{
// we need to know the category in which the last photo was added
$query = '
SELECT
category_id,
id_uppercat
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
SELECT category_id
FROM '.IMAGE_CATEGORY_TABLE.'
ORDER BY image_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']);
$selected_category[] = $row['category_id'];
}
}
$template->assign( 'filter_category_selected', $selected_category);
$template->assign('filter_category_selected', $selected_category);
// Dissociate from a category : categories listed for dissociation can only
// represent virtual links. We can't create orphans. Links to physical
@ -532,12 +536,8 @@ if (count($page['cat_elements_id']) > 0)
{
$query = '
SELECT
DISTINCT(category_id) AS id,
c.name,
c.uppercats,
c.global_rank
DISTINCT(category_id) AS id
FROM '.IMAGE_CATEGORY_TABLE.' AS ic
JOIN '.CATEGORIES_TABLE.' AS c ON c.id = ic.category_id
JOIN '.IMAGES_TABLE.' AS i ON i.id = ic.image_id
WHERE ic.image_id IN ('.implode(',', $page['cat_elements_id']).')
AND (
@ -545,40 +545,19 @@ SELECT
OR i.storage_category_id IS NULL
)
;';
display_select_cat_wrapper($query, array(), 'dissociate_options', true);
$template->assign('associated_categories', query2array($query, 'id', 'id'));
}
if (count($page['cat_elements_id']) > 0)
{
// remove tags
$tags = get_common_tags($page['cat_elements_id'], -1);
$template->assign(
array(
'DEL_TAG_SELECTION' => get_html_tag_selection($tags, 'del_tags'),
)
);
$template->assign('associated_tags', get_common_tags($page['cat_elements_id'], -1));
}
// creation date
$day =
empty($_POST['date_creation_day']) ? date('j') : $_POST['date_creation_day'];
$month =
empty($_POST['date_creation_month']) ? date('n') : $_POST['date_creation_month'];
$year =
empty($_POST['date_creation_year']) ? date('Y') : $_POST['date_creation_year'];
$month_list = $lang['month'];
$month_list[0]='------------';
ksort($month_list);
$template->assign( array(
'month_list' => $month_list,
'DATE_CREATION_DAY' => (int)$day,
'DATE_CREATION_MONTH'=> (int)$month,
'DATE_CREATION_YEAR' => (int)$year,
)
$template->assign('DATE_CREATION',
empty($_POST['date_creation']) ? date('Y-m-d').' 00:00:00' : $_POST['date_creation']
);
// image level options
@ -664,11 +643,11 @@ if (count($page['cat_elements_id']) > 0)
$query = '
SELECT id,path,representative_ext,file,filesize,level,name,width,height,rotation
FROM '.IMAGES_TABLE;
if ($is_category)
{
$category_info = get_cat_info($_SESSION['bulk_manager_filter']['category']);
$conf['order_by'] = $conf['order_by_inside_category'];
if (!empty($category_info['image_order']))
{
@ -720,14 +699,13 @@ SELECT id,path,representative_ext,file,filesize,level,name,width,height,rotation
$template->assign('thumb_params', $thumb_params);
}
$template->assign(
array(
'nb_thumbs_page' => $nb_thumbs_page,
'nb_thumbs_set' => count($page['cat_elements_id']),
)
);
$template->assign(array(
'nb_thumbs_page' => $nb_thumbs_page,
'nb_thumbs_set' => count($page['cat_elements_id']),
'CACHE_KEYS' => get_admin_client_cache_keys(array('tags', 'categories')),
));
trigger_action('loc_end_element_set_global');
trigger_notify('loc_end_element_set_global');
//----------------------------------------------------------- sending html code
$template->assign_var_from_handle('ADMIN_CONTENT', 'batch_manager_global');

View file

@ -39,7 +39,7 @@ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
// +-----------------------------------------------------------------------+
check_status(ACCESS_ADMINISTRATOR);
trigger_action('loc_begin_element_set_unit');
trigger_notify('loc_begin_element_set_unit');
// +-----------------------------------------------------------------------+
// | unit mode form submission |
@ -76,23 +76,13 @@ SELECT id, date_creation
$data['comment'] = strip_tags(@$_POST['description-'.$row['id']]);
}
if (isset($_POST['date_creation_action-'.$row['id']]))
if (!empty($_POST['date_creation-'.$row['id']]))
{
if ('set' == $_POST['date_creation_action-'.$row['id']])
{
$data['date_creation'] =
$_POST['date_creation_year-'.$row['id']]
.'-'.$_POST['date_creation_month-'.$row['id']]
.'-'.$_POST['date_creation_day-'.$row['id']];
}
else if ('unset' == $_POST['date_creation_action-'.$row['id']])
{
$data['date_creation'] = '';
}
$data['date_creation'] = $_POST['date_creation-'.$row['id']];
}
else
{
$data['date_creation'] = $row['date_creation'];
$data['date_creation'] = null;
}
$datas[] = $data;
@ -116,6 +106,7 @@ SELECT id, date_creation
);
$page['infos'][] = l10n('Photo informations updated');
invalidate_user_cache();
}
// +-----------------------------------------------------------------------+
@ -127,15 +118,10 @@ $template->set_filenames(
$base_url = PHPWG_ROOT_PATH.'admin.php';
$month_list = $lang['month'];
$month_list[0]='------------';
ksort($month_list);
$template->assign(
array(
'U_ELEMENTS_PAGE' => $base_url.get_query_string_diff(array('display','start')),
'F_ACTION'=>$base_url.get_query_string_diff(array()),
'month_list' => $month_list,
'F_ACTION' => $base_url.get_query_string_diff(array()),
'level_options' => get_privacy_level_options(),
)
);
@ -147,14 +133,7 @@ $template->assign(
// how many items to display on this page
if (!empty($_GET['display']))
{
if ('all' == $_GET['display'])
{
$page['nb_images'] = count($page['cat_elements_id']);
}
else
{
$page['nb_images'] = intval($_GET['display']);
}
$page['nb_images'] = intval($_GET['display']);
}
else
{
@ -192,11 +171,11 @@ if (count($page['cat_elements_id']) > 0)
$query = '
SELECT *
FROM '.IMAGES_TABLE;
if ($is_category)
{
$category_info = get_cat_info($_SESSION['bulk_manager_filter']['category']);
$conf['order_by'] = $conf['order_by_inside_category'];
if (!empty($category_info['image_order']))
{
@ -228,16 +207,6 @@ SELECT *
$src_image = new SrcImage($row);
// creation date
if (!empty($row['date_creation']))
{
list($year,$month,$day) = explode('-', $row['date_creation']);
}
else
{
list($year,$month,$day) = array('',0,0);
}
$query = '
SELECT
id,
@ -266,18 +235,19 @@ SELECT
'AUTHOR' => htmlspecialchars(@$row['author']),
'LEVEL' => !empty($row['level'])?$row['level']:'0',
'DESCRIPTION' => htmlspecialchars(@$row['comment']),
'DATE_CREATION_YEAR' => $year,
'DATE_CREATION_MONTH' => (int)$month,
'DATE_CREATION_DAY' => (int)$day,
'DATE_CREATION' => $row['date_creation'],
'TAGS' => $tag_selection,
)
));
}
$template->assign('ELEMENT_IDS', implode(',', $element_ids));
$template->assign(array(
'ELEMENT_IDS' => implode(',', $element_ids),
'CACHE_KEYS' => get_admin_client_cache_keys(array('tags')),
));
}
trigger_action('loc_end_element_set_unit');
trigger_notify('loc_end_element_set_unit');
// +-----------------------------------------------------------------------+
// | sending html code |

View file

@ -33,13 +33,22 @@ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
// +-----------------------------------------------------------------------+
check_status(ACCESS_ADMINISTRATOR);
trigger_action('loc_begin_cat_list');
trigger_notify('loc_begin_cat_list');
if (!empty($_POST) or isset($_GET['delete']))
{
check_pwg_token();
}
$sort_orders = array(
'name ASC' => l10n('Album name, A &rarr; Z'),
'name DESC' => l10n('Album name, Z &rarr; A'),
'date_creation DESC' => l10n('Date created, new &rarr; old'),
'date_creation ASC' => l10n('Date created, old &rarr; new'),
'date_available DESC' => l10n('Date posted, new &rarr; old'),
'date_available ASC' => l10n('Date posted, old &rarr; new'),
);
// +-----------------------------------------------------------------------+
// | functions |
// +-----------------------------------------------------------------------+
@ -86,6 +95,77 @@ function save_categories_order($categories)
update_global_rank();
}
function get_categories_ref_date($ids, $field='date_available', $minmax='max')
{
// we need to work on the whole tree under each category, even if we don't
// want to sort sub categories
$category_ids = get_subcat_ids($ids);
// search for the reference date of each album
$query = '
SELECT
category_id,
'.$minmax.'('.$field.') as ref_date
FROM '.IMAGE_CATEGORY_TABLE.'
JOIN '.IMAGES_TABLE.' ON image_id = id
WHERE category_id IN ('.implode(',', $category_ids).')
GROUP BY category_id
;';
$ref_dates = query2array($query, 'category_id', 'ref_date');
// the iterate on all albums (having a ref_date or not) to find the
// reference_date, with a search on sub-albums
$query = '
SELECT
id,
uppercats
FROM '.CATEGORIES_TABLE.'
WHERE id IN ('.implode(',', $category_ids).')
;';
$uppercats_of = query2array($query, 'id', 'uppercats');
foreach (array_keys($uppercats_of) as $cat_id)
{
// find the subcats
$subcat_ids = array();
foreach ($uppercats_of as $id => $uppercats)
{
if (preg_match('/(^|,)'.$cat_id.'(,|$)/', $uppercats))
{
$subcat_ids[] = $id;
}
}
$to_compare = array();
foreach ($subcat_ids as $id)
{
if (isset($ref_dates[$id]))
{
$to_compare[] = $ref_dates[$id];
}
}
if (count($to_compare) > 0)
{
$ref_dates[$cat_id] = 'max' == $minmax ? max($to_compare) : min($to_compare);
}
else
{
$ref_dates[$cat_id] = null;
}
}
// only return the list of $ids, not the sub-categories
$return = array();
foreach ($ids as $id)
{
$return[$id] = $ref_dates[$id];
}
return $return;
}
// +-----------------------------------------------------------------------+
// | initialization |
// +-----------------------------------------------------------------------+
@ -152,6 +232,11 @@ elseif (isset($_POST['submitManualOrder']))
}
elseif (isset($_POST['submitAutoOrder']))
{
if (!isset($sort_orders[ $_POST['order_by'] ]))
{
die('Invalid sort order');
}
$query = '
SELECT id
FROM '.CATEGORIES_TABLE.'
@ -166,9 +251,22 @@ SELECT id
}
$categories = array();
$names = array();
$id_uppercats = array();
$sort = array();
list($order_by_field, $order_by_asc) = explode(' ', $_POST['order_by']);
$order_by_date = false;
if (strpos($order_by_field, 'date_') === 0)
{
$order_by_date = true;
$ref_dates = get_categories_ref_date(
$category_ids,
$order_by_field,
'ASC' == $order_by_asc ? 'min' : 'max'
);
}
$query = '
SELECT id, name, id_uppercat
FROM '.CATEGORIES_TABLE.'
@ -177,19 +275,28 @@ SELECT id, name, id_uppercat
$result = pwg_query($query);
while ($row = pwg_db_fetch_assoc($result))
{
if ($order_by_date)
{
$sort[] = $ref_dates[ $row['id'] ];
}
else
{
$sort[] = $row['name'];
}
$categories[] = array(
'id' => $row['id'],
'id_uppercat' => $row['id_uppercat'],
);
$names[] = $row['name'];
}
array_multisort(
$names,
$sort,
SORT_REGULAR,
'asc' == $_POST['ascdesc'] ? SORT_ASC : SORT_DESC,
'ASC' == $order_by_asc ? SORT_ASC : SORT_DESC,
$categories
);
save_categories_order($categories);
$page['infos'][] = l10n('Albums automatically sorted');
@ -218,11 +325,14 @@ if (isset($_GET['parent_id']))
{
$form_action.= '&amp;parent_id='.$_GET['parent_id'];
}
$sort_orders_checked = array_keys($sort_orders);
$template->assign(array(
'CATEGORIES_NAV'=>$navigation,
'F_ACTION'=>$form_action,
'PWG_TOKEN' => get_pwg_token(),
'sort_orders' => $sort_orders,
'sort_order_checked' => array_shift($sort_orders_checked),
));
// +-----------------------------------------------------------------------+
@ -324,7 +434,7 @@ foreach ($categories as $category)
$tpl_cat =
array(
'NAME' =>
trigger_event(
trigger_change(
'render_category_name',
$category['name'],
'admin_cat_list'
@ -363,7 +473,7 @@ foreach ($categories as $category)
$template->append('categories', $tpl_cat);
}
trigger_action('loc_end_cat_list');
trigger_notify('loc_end_cat_list');
// +-----------------------------------------------------------------------+
// | sending html code |

View file

@ -103,7 +103,7 @@ SELECT galleries_url
// +-----------------------------------------------------------------------+
check_status(ACCESS_ADMINISTRATOR);
trigger_action('loc_begin_cat_modify');
trigger_notify('loc_begin_cat_modify');
//---------------------------------------------------------------- verification
if ( !isset( $_GET['cat_id'] ) || !is_numeric( $_GET['cat_id'] ) )
@ -132,11 +132,25 @@ if (isset($_POST['submit']))
$data,
array('id' => $data['id'])
);
if (isset($_POST['apply_commentable_on_sub']))
{
$subcats = get_subcat_ids(array('id' => $data['id']));
$query = '
UPDATE '.CATEGORIES_TABLE.'
SET commentable = \''.$data['commentable'].'\'
WHERE id IN ('.implode(',', $subcats).')
;';
pwg_query($query);
}
// retrieve cat infos before continuing (following updates are expensive)
$cat_info = get_cat_info($_GET['cat_id']);
if ($cat_info['visible'] != get_boolean( $_POST['visible'] ) )
if ($_POST['visible']=='true_sub')
{
set_cat_visible(array($_GET['cat_id']), true, true);
}
elseif ($cat_info['visible'] != get_boolean( $_POST['visible'] ) )
{
set_cat_visible(array($_GET['cat_id']), $_POST['visible']);
}
@ -288,12 +302,11 @@ else
$intro.= '<br>'.l10n('Numeric identifier : %d', $category['id']);
$template->assign('INTRO', $intro);
$template->assign(
'U_MANAGE_RANKS',
$base_url.'element_set_ranks&amp;cat_id='.$category['id']
);
$template->assign(array(
'INTRO' => $intro,
'U_MANAGE_RANKS' => $base_url.'element_set_ranks&amp;cat_id='.$category['id'],
'CACHE_KEYS' => get_admin_client_cache_keys(array('categories')),
));
if ($category['is_virtual'])
{
@ -366,24 +379,10 @@ SELECT id,representative_ext,path
if ($category['is_virtual'])
{
// the category can be moved in any category but in itself, in any
// sub-category
$unmovables = get_subcat_ids(array($category['id']));
$query = '
SELECT id,name,uppercats,global_rank
FROM '.CATEGORIES_TABLE.'
WHERE id NOT IN ('.implode(',', $unmovables).')
;';
display_select_cat_wrapper(
$query,
empty($category['id_uppercat']) ? array() : array($category['id_uppercat']),
'move_cat_options'
);
$template->assign('parent_category', empty($category['id_uppercat']) ? array() : array($category['id_uppercat']));
}
trigger_action('loc_end_cat_modify');
trigger_notify('loc_end_cat_modify');
//----------------------------------------------------------- sending html code
$template->assign_var_from_handle('ADMIN_CONTENT', 'album_properties');

View file

@ -298,7 +298,11 @@ SELECT user_id, group_id
// +-----------------------------------------------------------------------+
// | sending html code |
// +-----------------------------------------------------------------------+
$template->assign(array('PWG_TOKEN' => get_pwg_token(), 'INHERIT' => $conf['inheritance_by_default']));
$template->assign(array(
'PWG_TOKEN' => get_pwg_token(),
'INHERIT' => $conf['inheritance_by_default'],
'CACHE_KEYS' => get_admin_client_cache_keys(array('groups', 'users')),
));
$template->assign_var_from_handle('ADMIN_CONTENT', 'cat_perm');
?>

View file

@ -57,7 +57,7 @@ if (!empty($_POST))
{
include_once( PHPWG_ROOT_PATH .'include/functions_comment.inc.php' );
check_input_parameter('comments', $_POST, true, PATTERN_ID);
if (isset($_POST['validate']))
{
validate_user_comment($_POST['comments']);
@ -98,6 +98,8 @@ $template->assign(
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('comments');
$tabsheet->select('');
@ -167,7 +169,8 @@ SELECT
c.content,
i.path,
i.representative_ext,
validated
validated,
c.anonymous_id
FROM '.COMMENTS_TABLE.' AS c
INNER JOIN '.IMAGES_TABLE.' AS i
ON i.id = c.image_id
@ -186,7 +189,7 @@ while ($row = pwg_db_fetch_assoc($result))
'path'=>$row['path'],
)
);
if (empty($row['author_id']))
if (empty($row['author_id']))
{
$author_name = $row['author'];
}
@ -200,10 +203,11 @@ while ($row = pwg_db_fetch_assoc($result))
'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),
'DATE' => format_date($row['date'], true),
'CONTENT' => trigger_event('render_comment_content',$row['content']),
'AUTHOR' => trigger_change('render_comment_author', $author_name),
'DATE' => format_date($row['date'], array('day_name','day','month','year','time')),
'CONTENT' => trigger_change('render_comment_content',$row['content']),
'IS_PENDING' => ('false' == $row['validated']),
'IP' => $row['anonymous_id'],
)
);

View file

@ -76,6 +76,7 @@ $comments_checkboxes = array(
'email_admin_on_comment_deletion',
'comments_author_mandatory',
'comments_email_mandatory',
'comments_enable_website',
);
$display_checkboxes = array(
@ -298,7 +299,7 @@ if ('sizes' == $page['section'] and isset($_GET['action']) and 'restore_settings
}
//----------------------------------------------------- template initialization
$template->set_filename('config', 'configuration.tpl');
$template->set_filename('config', 'configuration_' . $page['section'] . '.tpl');
// TabSheet
$tabsheet = new tabsheet();
@ -418,7 +419,8 @@ switch ($page['section'])
load_profile_in_template(
$action,
'',
$edit_user
$edit_user,
'GUEST_'
);
$template->assign('default', array());
break;
@ -487,7 +489,7 @@ switch ($page['section'])
$tpl_var = array();
$tpl_var['must_square'] = ($type==IMG_SQUARE ? true : false);
$tpl_var['must_enable'] = ($type==IMG_SQUARE || $type==IMG_THUMB)? true : false;
$tpl_var['must_enable'] = ($type==IMG_SQUARE || $type==IMG_THUMB || $type==$conf['derivative_default_size'])? true : false;
if ($params = @$enabled[$type])
{

View file

@ -156,7 +156,7 @@ SELECT *
;';
$category = pwg_db_fetch_assoc(pwg_query($query));
if ($category['image_order']=='rank')
if ($category['image_order']=='rank ASC')
{
$image_order_choice = 'rank';
}

View file

@ -46,6 +46,8 @@ $tabsheet->set_id('help');
$tabsheet->select($selected);
$tabsheet->assign();
trigger_notify('loc_end_help');
$template->set_filenames(array('help' => 'help.tpl'));
$template->assign(

View file

@ -73,24 +73,16 @@ $search = array();
if (isset($_POST['submit']))
{
// dates
if (!empty($_POST['start_year']))
if (!empty($_POST['start']))
{
$search['fields']['date-after'] = sprintf(
'%d-%02d-%02d',
$_POST['start_year'],
$_POST['start_month'],
$_POST['start_day']
);
check_input_parameter('start', $_POST, false, '/^\d{4}-\d{2}-\d{2}$/');
$search['fields']['date-after'] = $_POST['start'];
}
if (!empty($_POST['end_year']))
if (!empty($_POST['end']))
{
$search['fields']['date-before'] = sprintf(
'%d-%02d-%02d',
$_POST['end_year'],
$_POST['end_month'],
$_POST['end_day']
);
check_input_parameter('end', $_POST, false, '/^\d{4}-\d{2}-\d{2}$/');
$search['fields']['date-before'] = $_POST['end'];
}
if (empty($_POST['types']))
@ -99,10 +91,11 @@ if (isset($_POST['submit']))
}
else
{
check_input_parameter('types', $_POST, true, '/^('.implode('|', $types).')$/');
$search['fields']['types'] = $_POST['types'];
}
$search['fields']['user'] = $_POST['user'];
$search['fields']['user'] = intval($_POST['user']);
if (!empty($_POST['image_id']))
{
@ -127,6 +120,8 @@ if (isset($_POST['submit']))
);
}
check_input_parameter('display_thumbnail', $_POST, false, '/^('.implode('|', array_keys($display_thumbnails)).')$/');
$search['fields']['display_thumbnail'] = $_POST['display_thumbnail'];
// Display choise are also save to one cookie
if (!empty($_POST['display_thumbnail'])
@ -152,8 +147,9 @@ if (isset($_POST['submit']))
INSERT INTO '.SEARCH_TABLE.'
(rules)
VALUES
(\''.serialize($search).'\')
(\''.pwg_db_real_escape_string(serialize($search)).'\')
;';
pwg_query($query);
$search_id = pwg_db_insert_id(SEARCH_TABLE);
@ -225,7 +221,8 @@ INSERT INTO '.SEARCH_TABLE.'
);
}
$data = trigger_event('get_history', array(), $page['search'], $types);
/*TODO - no need to get a huge number of rows from db (should take only what needed for display + SQL_CALC_FOUND_ROWS*/
$data = trigger_change('get_history', array(), $page['search'], $types);
usort($data, 'history_compare');
$page['nb_lines'] = count($data);
@ -284,7 +281,7 @@ SELECT id, uppercats
FROM '.CATEGORIES_TABLE.'
WHERE id IN ('.implode(',', array_keys($category_ids)).')
;';
$uppercats_of = simple_hash_from_query($query, 'id', 'uppercats');
$uppercats_of = query2array($query, 'id', 'uppercats');
$name_of_category = array();
@ -309,27 +306,7 @@ SELECT
FROM '.IMAGES_TABLE.'
WHERE id IN ('.implode(',', array_keys($image_ids)).')
;';
// $label_of_image = simple_hash_from_query($query, 'id', 'label');
$label_of_image = array();
$filesize_of_image = array();
$file_of_image = array();
$path_of_image = array();
$representative_ext_of_image = array();
$result = pwg_query($query);
while ($row = pwg_db_fetch_assoc($result))
{
$label_of_image[ $row['id'] ] = trigger_event('render_element_description', $row['label']);
if (isset($row['filesize']))
{
$filesize_of_image[ $row['id'] ] = $row['filesize'];
}
$file_of_image[ $row['id'] ] = $row['file'];
$path_of_image[ $row['id'] ] = $row['path'];
$representative_ext_of_image[ $row['id'] ] = $row['representative_ext'];
}
$image_infos = query2array($query, 'id');
}
if ($has_tags > 0)
@ -345,7 +322,7 @@ SELECT
$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>';
$name_of_tag[ $row['id'] ] = '<a href="'.make_index_url( array('tags'=>array($row))).'">'.trigger_change("render_tag_name", $row['name'], $row).'</a>';
}
}
@ -360,10 +337,7 @@ SELECT
{
if (isset($line['image_type']) and $line['image_type'] == 'high')
{
if (isset($filesize_of_image[$line['image_id']]))
{
$summary['total_filesize'] += $filesize_of_image[$line['image_id']];
}
$summary['total_filesize'] += @intval($image_infos[$line['image_id']]['filesize']);
}
if ($line['user_id'] == $conf['guest_id'])
@ -421,13 +395,13 @@ SELECT
)
);
if (isset($file_of_image[$line['image_id']]))
if (isset($image_infos[$line['image_id']]))
{
$element = array(
'id' => $line['image_id'],
'file' => $file_of_image[$line['image_id']],
'path' => $path_of_image[$line['image_id']],
'representative_ext' => $representative_ext_of_image[$line['image_id']],
'file' => $image_infos[$line['image_id']]['file'],
'path' => $image_infos[$line['image_id']]['path'],
'representative_ext' => $image_infos[$line['image_id']]['representative_ext'],
);
$thumbnail_display = $page['search']['fields']['display_thumbnail'];
}
@ -438,9 +412,9 @@ SELECT
$image_title = '('.$line['image_id'].')';
if (isset($label_of_image[$line['image_id']]))
if (isset($image_infos[$line['image_id']]['label']))
{
$image_title.= ' '.$label_of_image[$line['image_id']];
$image_title.= ' '.trigger_change('render_element_description', $image_infos[$line['image_id']]['label']);
}
else
{
@ -573,20 +547,12 @@ if (isset($page['search']))
{
if (isset($page['search']['fields']['date-after']))
{
$tokens = explode('-', $page['search']['fields']['date-after']);
$form['start_year'] = (int)$tokens[0];
$form['start_month'] = (int)$tokens[1];
$form['start_day'] = (int)$tokens[2];
$form['start'] = $page['search']['fields']['date-after'];
}
if (isset($page['search']['fields']['date-before']))
{
$tokens = explode('-', $page['search']['fields']['date-before']);
$form['end_year'] = (int)$tokens[0];
$form['end_month'] = (int)$tokens[1];
$form['end_day'] = (int)$tokens[2];
$form['end'] = $page['search']['fields']['date-before'];
}
$form['types'] = $page['search']['fields']['types'];
@ -610,9 +576,7 @@ else
{
// by default, at page load, we want the selected date to be the current
// date
$form['start_year'] = $form['end_year'] = date('Y');
$form['start_month'] = $form['end_month'] = date('n');
$form['start_day'] = $form['end_day'] = date('j');
$form['start'] = $form['end'] = date('Y-m-d');
$form['types'] = $types;
// Hoverbox by default
$form['display_thumbnail'] =
@ -620,25 +584,13 @@ else
}
$month_list = $lang['month'];
$month_list[0]='------------';
ksort($month_list);
$template->assign(
array(
'IMAGE_ID' => @$form['image_id'],
'FILENAME' => @$form['filename'],
'IP' => @$form['ip'],
'month_list' => $month_list,
'START_DAY_SELECTED' => @$form['start_day'],
'START_MONTH_SELECTED' => @$form['start_month'],
'START_YEAR' => @$form['start_year'],
'END_DAY_SELECTED' => @$form['end_day'],
'END_MONTH_SELECTED' => @$form['end_month'],
'END_YEAR' => @$form['end_year'],
'START' => @$form['start'],
'END' => @$form['end'],
)
);
@ -659,7 +611,7 @@ SELECT
;';
$template->assign(
array(
'user_options' => simple_hash_from_query($query, 'id','username'),
'user_options' => query2array($query, 'id','username'),
'user_options_selected' => array(@$form['user'])
)
);
@ -672,4 +624,4 @@ $template->assign('display_thumbnail_selected', $form['display_thumbnail']);
// +-----------------------------------------------------------------------+
$template->assign_var_from_handle('ADMIN_CONTENT', 'history');
?>
?>

View file

@ -21,7 +21,7 @@
// | USA. |
// +-----------------------------------------------------------------------+
add_event_handler('tabsheet_before_select', 'add_core_tabs', 0, 2);
add_event_handler('tabsheet_before_select', 'add_core_tabs', 0);
function add_core_tabs($sheets, $tab_id)
{
@ -34,20 +34,20 @@ function add_core_tabs($sheets, $tab_id)
$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' => '<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':
global $manager_link;
$sheets['global'] = array('caption' => l10n('global mode'), 'url' => $manager_link.'global');
$sheets['unit'] = array('caption' => l10n('unit mode'), 'url' => $manager_link.'unit');
break;
case 'cat_options':
global $link_start, $conf;
$sheets['status'] = array('caption' => '<span class="icon-lock"></span>'.l10n('Public / Private'), 'url' => $link_start.'cat_options&amp;section=status');
@ -57,17 +57,20 @@ function add_core_tabs($sheets, $tab_id)
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'), 'url' => '');
global $my_base_url;
$sheets[''] = array('caption' => l10n('User comments'), 'url' => $my_base_url.'comments');
break;
case 'users':
$sheets[''] = array('caption' => '<span class="icon-users"> </span>'.l10n('User list'), 'url' => '');
global $my_base_url;
$sheets[''] = array('caption' => '<span class="icon-users"> </span>'.l10n('User list'), 'url' => $my_base_url.'user_list');
break;
case 'groups':
$sheets[''] = array('caption' => '<span class="icon-group"> </span>'.l10n('Groups'), 'url' => '');
global $my_base_url;
$sheets[''] = array('caption' => '<span class="icon-group"> </span>'.l10n('Groups'), 'url' => $my_base_url.'group_list');
break;
case 'configuration':
@ -79,7 +82,7 @@ function add_core_tabs($sheets, $tab_id)
$sheets['comments'] = array('caption' => l10n('Comments'), 'url' => $conf_link.'comments');
$sheets['default'] = array('caption' => l10n('Guest Settings'), 'url' => $conf_link.'default');
break;
case 'help':
global $help_link;
$sheets['add_photos'] = array('caption' => l10n('Add Photos'), 'url' => $help_link.'add_photos');
@ -88,33 +91,33 @@ function add_core_tabs($sheets, $tab_id)
$sheets['virtual_links'] = array('caption' => l10n('Virtual Links'), 'url' => $help_link.'virtual_links');
$sheets['misc'] = array('caption' => l10n('Miscellaneous'), 'url' => $help_link.'misc');
break;
case 'history':
global $link_start;
$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' => '<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':
global $base_url;
$sheets['param'] = array('caption' => l10n('Parameter'), 'url' => $base_url.'?page=notification_by_mail&amp;mode=param');
$sheets['subscribe'] = array('caption' => l10n('Subscribe'), 'url' => $base_url.'?page=notification_by_mail&amp;mode=subscribe');
$sheets['send'] = array('caption' => l10n('Send'), 'url' => $base_url.'?page=notification_by_mail&amp;mode=send');
break;
case 'photo':
global $admin_photo_base_url;
$sheets['properties'] = array('caption' => l10n('Properties'), 'url' => $admin_photo_base_url.'-properties');
$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' => '<span class="icon-upload"></span>'.l10n('Web Form'), 'url' => PHOTOS_ADD_BASE_URL.'&amp;section=direct');
@ -122,33 +125,33 @@ function add_core_tabs($sheets, $tab_id)
if ($conf['enable_synchronization'])
$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' => '<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':
$sheets['rating'] = array('caption' => l10n('Photos'), 'url' => get_root_url().'admin.php?page=rating');
$sheets['rating_user'] = array('caption' => l10n('Users'), 'url' => get_root_url().'admin.php?page=rating_user');
break;
case 'themes':
global $my_base_url;
$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':
global $my_base_url;
$sheets['pwg'] = array('caption' => l10n('Piwigo Update'), 'url' => $my_base_url);
$sheets['ext'] = array('caption' => l10n('Extensions Update'), 'url' => $my_base_url.'&amp;tab=ext');
break;
}
return $sheets;
}

View file

@ -66,7 +66,7 @@ class check_integrity
$this->retrieve_list = array();
$this->build_ignore_list = array();
trigger_action('list_check_integrity', $this);
trigger_notify('list_check_integrity', $this);
// Information
if (count($this->retrieve_list) > 0)

View file

@ -62,7 +62,7 @@ foreach ($pderivatives as $type => &$pderivative)
$pderivative['minh'] = $pderivative['minw'] = $pderivative['w'];
$pderivative['crop'] = 100;
}
$pderivative['must_enable'] = ($type==IMG_SQUARE || $type==IMG_THUMB)? true : false;
$pderivative['must_enable'] = ($type==IMG_SQUARE || $type==IMG_THUMB || $type==$conf['derivative_default_size'])? true : false;
$pderivative['enabled'] = isset($pderivative['enabled']) || $pderivative['must_enable'] ? true : false;
if (isset($pderivative['crop']))

View file

@ -41,7 +41,7 @@ SELECT id
FROM '.CATEGORIES_TABLE.'
WHERE site_id = '.$id.'
;';
$category_ids = array_from_query($query, 'id');
$category_ids = query2array($query, null, 'id');
delete_categories($category_ids);
// destruction of the site
@ -83,7 +83,7 @@ SELECT id
WHERE storage_category_id IN (
'.wordwrap(implode(', ', $ids), 80, "\n").')
;';
$element_ids = array_from_query($query, 'id');
$element_ids = query2array($query, null, 'id');
delete_elements($element_ids);
// now, should we delete photos that are virtually linked to the category?
@ -95,7 +95,7 @@ SELECT
FROM '.IMAGE_CATEGORY_TABLE.'
WHERE category_id IN ('.implode(',', $ids).')
;';
$image_ids_linked = array_from_query($query, 'image_id');
$image_ids_linked = query2array($query, null, 'image_id');
if (count($image_ids_linked) > 0)
{
@ -108,7 +108,7 @@ SELECT
WHERE image_id IN ('.implode(',', $image_ids_linked).')
AND category_id NOT IN ('.implode(',', $ids).')
;';
$image_ids_not_orphans = array_from_query($query, 'image_id');
$image_ids_not_orphans = query2array($query, null, 'image_id');
$image_ids_to_delete = array_diff($image_ids_linked, $image_ids_not_orphans);
}
@ -162,7 +162,7 @@ DELETE FROM '.USER_CACHE_CATEGORIES_TABLE.'
WHERE cat_id IN ('.implode(',',$ids).')';
pwg_query($query);
trigger_action('delete_categories', $ids);
trigger_notify('delete_categories', $ids);
}
/**
@ -250,7 +250,7 @@ function delete_elements($ids, $physical_deletion=false)
{
return 0;
}
trigger_action('begin_delete_elements', $ids);
trigger_notify('begin_delete_elements', $ids);
if ($physical_deletion)
{
@ -260,7 +260,7 @@ function delete_elements($ids, $physical_deletion=false)
return 0;
}
}
$ids_str = wordwrap(implode(', ', $ids), 80, "\n");
// destruction of the comments on the image
@ -319,13 +319,13 @@ SELECT
FROM '.CATEGORIES_TABLE.'
WHERE representative_picture_id IN ('. $ids_str .')
;';
$category_ids = array_from_query($query, 'id');
$category_ids = query2array($query, null, 'id');
if (count($category_ids) > 0)
{
update_category($category_ids);
}
trigger_action('delete_elements', $ids);
trigger_notify('delete_elements', $ids);
return count($ids);
}
@ -383,7 +383,7 @@ DELETE FROM '.USERS_TABLE.'
;';
pwg_query($query);
trigger_action('delete_user', $user_id);
trigger_notify('delete_user', $user_id);
}
/**
@ -401,12 +401,7 @@ function delete_orphan_tags()
$orphan_tag_ids[] = $tag['id'];
}
$query = '
DELETE
FROM '.TAGS_TABLE.'
WHERE id IN ('.implode(',', $orphan_tag_ids).')
;';
pwg_query($query);
delete_tags($orphan_tag_ids);
}
}
@ -423,7 +418,7 @@ SELECT
LEFT JOIN '.IMAGE_TAG_TABLE.' ON id = tag_id
WHERE tag_id IS NULL
;';
return array_from_query($query);
return query2array($query);
}
/**
@ -463,7 +458,7 @@ SELECT DISTINCT c.id
AND '.sprintf($where_cats, 'c.id').'
AND i.id IS NULL
;';
$wrong_representant = array_from_query($query, 'id');
$wrong_representant = query2array($query, null, 'id');
if (count($wrong_representant) > 0)
{
@ -488,7 +483,7 @@ SELECT DISTINCT id
WHERE representative_picture_id IS NULL
AND '.sprintf($where_cats, 'category_id').'
;';
$to_rand = array_from_query($query, 'id');
$to_rand = query2array($query, null, 'id');
if (count($to_rand) > 0)
{
set_random_representant($to_rand);
@ -510,7 +505,7 @@ SELECT
WHERE id IS NULL
;';
$result = pwg_query($query);
$orphan_image_ids = array_from_query($query, 'image_id');
$orphan_image_ids = query2array($query, null, 'image_id');
if (count($orphan_image_ids) > 0)
{
@ -534,22 +529,28 @@ DELETE
*/
function get_fs_directories($path, $recursive = true)
{
global $conf;
$dirs = array();
$path = rtrim($path, '/');
$exclude_folders = array_merge(
$conf['sync_exclude_folders'],
array(
'.', '..', '.svn',
'thumbnail', 'pwg_high',
'pwg_representative',
)
);
$exclude_folders = array_flip($exclude_folders);
if (is_dir($path))
{
if ($contents = opendir($path))
{
while (($node = readdir($contents)) !== false)
{
if ($node != '.'
and $node != '..'
and $node != '.svn'
and $node != 'thumbnail'
and $node != 'pwg_high'
and $node != 'pwg_representative'
and is_dir($path.'/'.$node))
if (is_dir($path.'/'.$node) and !isset($exclude_folders[$node]))
{
$dirs[] = $path.'/'.$node;
if ($recursive)
@ -613,9 +614,7 @@ SELECT id, id_uppercat, uppercats, rank, global_rank
str_replace(',', '.', $cat['uppercats'] )
);
if ( $cat['rank_changed']
or $new_global_rank!=$cat['global_rank']
)
if ($cat['rank_changed'] or $new_global_rank !== $cat['global_rank'])
{
$datas[] = array(
'id' => $id,
@ -643,8 +642,9 @@ SELECT id, id_uppercat, uppercats, rank, global_rank
*
* @param int[] $categories
* @param boolean|string $value
* @param boolean $unlock_child optional default false
*/
function set_cat_visible($categories, $value)
function set_cat_visible($categories, $value, $unlock_child = false)
{
if ( ($value = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)) === null )
{
@ -655,11 +655,14 @@ function set_cat_visible($categories, $value)
// unlocking a category => all its parent categories become unlocked
if ($value)
{
$uppercats = get_uppercat_ids($categories);
$cats = get_uppercat_ids($categories);
if ($unlock_child) {
$cats = array_merge($cats, get_subcat_ids($categories));
}
$query = '
UPDATE '.CATEGORIES_TABLE.'
SET visible = \'true\'
WHERE id IN ('.implode(',', $uppercats).')';
WHERE id IN ('.implode(',', $cats).')';
pwg_query($query);
}
// locking a category => all its child categories become locked
@ -699,12 +702,12 @@ UPDATE '.CATEGORIES_TABLE.'
;';
pwg_query($query);
}
// make a category private => all its child categories become private
if ($value == 'private')
{
$subcats = get_subcat_ids($categories);
$query = '
UPDATE '.CATEGORIES_TABLE.'
SET status = \'private\'
@ -738,16 +741,15 @@ UPDATE '.CATEGORIES_TABLE.'
// A5 permission removed to U2
// A6 permission removed to U4
// A7 no permission removed
//
//
// 1) we must extract "top albums": A2, A5 and A6
// 2) for each top album, decide which album is the reference for permissions
// 3) remove all inconsistant permissions from sub-albums of each top-album
// step 1, search top albums
$all_categories = array();
$top_categories = array();
$parent_ids = array();
$query = '
SELECT
id,
@ -758,18 +760,13 @@ SELECT
FROM '.CATEGORIES_TABLE.'
WHERE id IN ('.implode(',', $categories).')
;';
$result = pwg_query($query);
while ($row = pwg_db_fetch_assoc($result))
{
$all_categories[] = $row;
}
$all_categories = query2array($query);
usort($all_categories, 'global_rank_compare');
foreach ($all_categories as $cat)
{
$is_top = true;
if (!empty($cat['id_uppercat']))
{
foreach (explode(',', $cat['uppercats']) as $id_uppercat)
@ -794,7 +791,7 @@ SELECT
}
// step 2, search the reference album for permissions
//
//
// to find the reference of each top album, we will need the parent albums
$parent_cats = array();
@ -807,11 +804,7 @@ SELECT
FROM '.CATEGORIES_TABLE.'
WHERE id IN ('.implode(',', $parent_ids).')
;';
$result = pwg_query($query);
while ($row = pwg_db_fetch_assoc($result))
{
$parent_cats[$row['id']] = $row;
}
$parent_cats= query2array($query, 'id');
}
$tables = array(
@ -842,7 +835,7 @@ SELECT '.$field.'
FROM '.$table.'
WHERE cat_id = '.$ref_cat_id.'
;';
$ref_access = array_from_query($query, $field);
$ref_access = query2array($query, null, $field);
if (count($ref_access) == 0)
{
@ -948,14 +941,14 @@ SELECT id, dir
FROM '.CATEGORIES_TABLE.'
WHERE dir IS NOT NULL
;';
$cat_dirs = simple_hash_from_query($query, 'id', 'dir');
$cat_dirs = query2array($query, 'id', 'dir');
// caching galleries_url
$query = '
SELECT id, galleries_url
FROM '.SITES_TABLE.'
;';
$galleries_url = simple_hash_from_query($query, 'id', 'galleries_url');
$galleries_url = query2array($query, 'id', 'galleries_url');
// categories : id, site_id, uppercats
$query = '
@ -965,7 +958,7 @@ SELECT id, uppercats, site_id
AND id IN (
'.wordwrap(implode(', ', $cat_ids), 80, "\n").')
;';
$categories = array_from_query($query);
$categories = query2array($query);
// filling $cat_fulldirs
$cat_dirs_callback = create_function('$m', 'global $cat_dirs; return $cat_dirs[$m[1]];');
@ -1025,14 +1018,13 @@ function get_fs($path, $recursive = true)
{
$extension = get_extension($node);
// if (in_array($extension, $conf['picture_ext']))
if (isset($conf['flip_picture_ext'][$extension]))
{
if (basename($path) == 'thumbnail')
{
$fs['thumbnails'][] = $path.'/'.$node;
}
else if (basename($path) == 'pwg_representative')
elseif (basename($path) == 'pwg_representative')
{
$fs['representatives'][] = $path.'/'.$node;
}
@ -1041,13 +1033,12 @@ function get_fs($path, $recursive = true)
$fs['elements'][] = $path.'/'.$node;
}
}
// else if (in_array($extension, $conf['file_ext']))
else if (isset($conf['flip_file_ext'][$extension]))
elseif (isset($conf['flip_file_ext'][$extension]))
{
$fs['elements'][] = $path.'/'.$node;
}
}
else if (is_dir($path.'/'.$node) and $node != 'pwg_high' and $recursive)
elseif (is_dir($path.'/'.$node) and $node != 'pwg_high' and $recursive)
{
$subdirs[] = $node;
}
@ -1088,13 +1079,13 @@ function sync_users()
SELECT '.$conf['user_fields']['id'].' AS id
FROM '.USERS_TABLE.'
;';
$base_users = array_from_query($query, 'id');
$base_users = query2array($query, null, 'id');
$query = '
SELECT user_id
FROM '.USER_INFOS_TABLE.'
;';
$infos_users = array_from_query($query, 'user_id');
$infos_users = query2array($query, null, 'user_id');
// users present in $base_users and not in $infos_users must be added
$to_create = array_diff($base_users, $infos_users);
@ -1123,7 +1114,7 @@ SELECT DISTINCT user_id
FROM '.$table.'
;';
$to_delete = array_diff(
array_from_query($query, 'user_id'),
query2array($query, null, 'user_id'),
$base_users
);
@ -1148,7 +1139,7 @@ function update_uppercats()
SELECT id, id_uppercat, uppercats
FROM '.CATEGORIES_TABLE.'
;';
$cat_map = hash_from_query($query, 'id');
$cat_map = query2array($query, 'id');
$datas = array();
foreach ($cat_map as $id => $cat)
@ -1185,7 +1176,7 @@ SELECT DISTINCT(storage_category_id)
FROM '.IMAGES_TABLE.'
WHERE storage_category_id IS NOT NULL
;';
$cat_ids = array_from_query($query, 'storage_category_id');
$cat_ids = query2array($query, null, 'storage_category_id');
$fulldirs = get_fulldirs($cat_ids);
foreach ($cat_ids as $cat_id)
@ -1422,7 +1413,7 @@ SELECT id, uppercats, global_rank, visible, status
FROM '.GROUP_ACCESS_TABLE.'
WHERE cat_id = '.$insert['id_uppercat'].'
;';
$granted_grps = array_from_query($query, 'group_id');
$granted_grps = query2array($query, null, 'group_id');
$inserts = array();
foreach ($granted_grps as $granted_grp)
{
@ -1438,10 +1429,10 @@ SELECT id, uppercats, global_rank, visible, status
FROM '.USER_ACCESS_TABLE.'
WHERE cat_id = '.$insert['id_uppercat'].'
;';
$granted_users = array_from_query($query, 'user_id');
$granted_users = query2array($query, null, 'user_id');
add_permission_on_category($inserted_id, array_unique(array_merge(get_admins(), array($user['id']), $granted_users)));
}
else if ('private' == $insert['status'])
elseif ('private' == $insert['status'])
{
add_permission_on_category($inserted_id, array_unique(array_merge(get_admins(), array($user['id']))));
}
@ -1562,25 +1553,31 @@ SELECT id
FROM '.TAGS_TABLE.'
WHERE name = \''.$tag_name.'\'
;';
if (count($existing_tags = array_from_query($query, 'id')) == 0)
if (count($existing_tags = query2array($query, null, 'id')) == 0)
{
// search existing by case insensitive name
$url_name = trigger_change('render_tag_url', $tag_name);
// search existing by url name
$query = '
SELECT id
FROM '.TAGS_TABLE.'
WHERE CONVERT(name, CHAR) = \''.$tag_name.'\'
;';
if (count($existing_tags = array_from_query($query, 'id')) == 0)
{
$url_name = trigger_event('render_tag_url', $tag_name);
// search existing by url name
$query = '
SELECT id
FROM '.TAGS_TABLE.'
WHERE url_name = \''.$url_name.'\'
;';
if (count($existing_tags = array_from_query($query, 'id')) == 0)
if (count($existing_tags = query2array($query, null, 'id')) == 0)
{
// search by extended description (plugin sub name)
$sub_name_where = trigger_change('get_tag_name_like_where', array(), $tag_name);
if (count($sub_name_where))
{
$query = '
SELECT id
FROM '.TAGS_TABLE.'
WHERE '.implode(' OR ', $sub_name_where).'
;';
$existing_tags = query2array($query, null, 'id');
}
if (count($existing_tags) == 0)
{// finally create the tag
mass_inserts(
TAGS_TABLE,
array('name', 'url_name'),
@ -1690,7 +1687,7 @@ SELECT
GROUP BY category_id
;';
$current_rank_of = simple_hash_from_query(
$current_rank_of = query2array(
$query,
'category_id',
'max_rank'
@ -1796,7 +1793,7 @@ SELECT image_id
FROM '.IMAGE_CATEGORY_TABLE.'
WHERE category_id IN ('.implode(',', $sources).')
;';
$images = array_from_query($query, 'image_id');
$images = query2array($query, null, 'image_id');
associate_images_to_categories($images, $destinations);
}
@ -1840,7 +1837,7 @@ UPDATE '.USER_CACHE_TABLE.'
SET need_update = \'true\';';
pwg_query($query);
}
trigger_action('invalidate_user_cache', $full);
trigger_notify('invalidate_user_cache', $full);
}
/**
@ -1967,7 +1964,7 @@ SELECT id
FROM '.TAGS_TABLE.'
WHERE name = \''.$tag_name.'\'
;';
$existing_tags = array_from_query($query, 'id');
$existing_tags = query2array($query, null, 'id');
if (count($existing_tags) == 0)
{
@ -1975,7 +1972,7 @@ SELECT id
TAGS_TABLE,
array(
'name' => $tag_name,
'url_name' => trigger_event('render_tag_url', $tag_name),
'url_name' => trigger_change('render_tag_url', $tag_name),
)
);
@ -2059,7 +2056,8 @@ function fetchRemote($src, &$dest, $get_data=array(), $post_data=array(), $user_
is_resource($dest) or $dest = '';
// Try curl to read remote file
if (function_exists('curl_init'))
// TODO : remove all these @
if (function_exists('curl_init') && function_exists('curl_exec'))
{
$ch = @curl_init();
@curl_setopt($ch, CURLOPT_URL, $src);
@ -2324,7 +2322,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, $row);
$name = trigger_change('render_tag_name', $raw_name, $row);
$taglist[] = array(
'name' => $name,
@ -2333,7 +2331,7 @@ function get_taglist($query, $only_user_language=true)
if (!$only_user_language)
{
$alt_names = trigger_event('get_tag_alt_names', array(), $raw_name);
$alt_names = trigger_change('get_tag_alt_names', array(), $raw_name);
foreach( array_diff( array_unique($alt_names), array($name) ) as $alt)
{
@ -2448,13 +2446,13 @@ SELECT id
WHERE id IN ('.implode(',', $cat_ids).')
AND status = \'private\'
;';
$private_cats = array_from_query($query, 'id');
$private_cats = query2array($query, null, 'id');
if (count($private_cats) == 0)
{
return;
}
$inserts = array();
foreach ($private_cats as $cat_id)
{
@ -2466,7 +2464,7 @@ SELECT id
);
}
}
mass_inserts(
USER_ACCESS_TABLE,
array('user_id','cat_id'),
@ -2497,7 +2495,7 @@ SELECT
WHERE status in (\''.implode("','", $status_list).'\')
;';
return array_from_query($query, 'user_id');
return query2array($query, null, 'user_id');
}
/**
@ -2700,7 +2698,7 @@ function deltree($path, $trash_path=null)
}
}
closedir($fh);
if (@rmdir($path))
{
return true;
@ -2727,4 +2725,54 @@ function deltree($path, $trash_path=null)
}
}
?>
/**
* Returns keys to identify the state of main tables. A key consists of the
* last modification timestamp and the total of items (separated by a _).
* Additionally returns the hash of root path.
* Used to invalidate LocalStorage cache on admin pages.
*
* @param string|string[] list of keys to retrieve (categories,groups,images,tags,users)
* @return string[]
*/
function get_admin_client_cache_keys($requested=array())
{
$tables = array(
'categories' => CATEGORIES_TABLE,
'groups' => GROUPS_TABLE,
'images' => IMAGES_TABLE,
'tags' => TAGS_TABLE,
'users' => USER_INFOS_TABLE
);
if (!is_array($requested))
{
$requested = array($requested);
}
if (empty($requested))
{
$requested = array_keys($tables);
}
else
{
$requested = array_intersect($requested, array_keys($tables));
}
$keys = array(
'_hash' => md5(get_absolute_root_url()),
);
foreach ($requested as $item)
{
$query = '
SELECT CONCAT(
UNIX_TIMESTAMP(MAX(lastmodified)),
"_",
COUNT(*)
)
FROM '. $tables[$item] .'
;';
list($keys[$item]) = pwg_db_fetch_row(pwg_query($query));
}
return $keys;
}

View file

@ -21,8 +21,17 @@
// | USA. |
// +-----------------------------------------------------------------------+
/**
* @package functions\admin\history
*/
include_once(PHPWG_ROOT_PATH.'admin/include/tabsheet.class.php');
/**
* Init tabsheet for history pages
* @ignore
*/
function history_tabsheet()
{
global $page, $link_start;
@ -34,11 +43,22 @@ function history_tabsheet()
$tabsheet->assign();
}
/**
* Callback used to sort history entries
*/
function history_compare($a, $b)
{
return strcmp($a['date'].$a['time'], $b['date'].$b['time']);
}
/**
* Perform history search.
*
* @param array $data - used in trigger_change
* @param array $search
* @param string[] $types
* @param array
*/
function get_history($data, $search, $types)
{
if (isset($search['fields']['filename']))
@ -51,9 +71,9 @@ SELECT
;';
$search['image_ids'] = array_from_query($query, 'id');
}
// echo '<pre>'; print_r($search); echo '</pre>';
$clauses = array();
if (isset($search['fields']['date-after']))
@ -69,7 +89,7 @@ SELECT
if (isset($search['fields']['types']))
{
$local_clauses = array();
foreach ($types as $type) {
if (in_array($type, $search['fields']['types'])) {
$clause = 'image_type ';
@ -81,11 +101,11 @@ SELECT
{
$clause.= "= '".$type."'";
}
$local_clauses[] = $clause;
}
}
if (count($local_clauses) > 0)
{
$clauses[] = implode(' OR ', $local_clauses);
@ -102,7 +122,7 @@ SELECT
{
$clauses[] = 'image_id = '.$search['fields']['image_id'];
}
if (isset($search['fields']['filename']))
{
if (count($search['image_ids']) == 0)
@ -120,7 +140,7 @@ SELECT
{
$clauses[] = 'IP LIKE "'.$search['fields']['ip'].'"';
}
$clauses = prepend_append_array_items($clauses, '(', ')');
$where_separator =
@ -128,7 +148,7 @@ SELECT
"\n AND ",
$clauses
);
$query = '
SELECT
date,
@ -156,7 +176,7 @@ SELECT
return $data;
}
add_event_handler('get_history', 'get_history', EVENT_HANDLER_PRIORITY_NEUTRAL, 3);
trigger_action('functions_history_included');
add_event_handler('get_history', 'get_history');
trigger_notify('functions_history_included');
?>

View file

@ -22,16 +22,19 @@
// +-----------------------------------------------------------------------+
/**
* loads an sql file and executes all queries
*
* @package functions\admin\install
*/
/**
* Loads a SQL file and executes all queries.
* Before executing a query, $replaced is... replaced by $replacing. This is
* useful when the SQL file contains generic words. Drop table queries are
* not executed.
*
* @param string filepath
* @param string replaced
* @param string replacing
* @return void
* @param string $filepath
* @param string $replaced
* @param string $replacing
*/
function execute_sqlfile($filepath, $replaced, $replacing, $dblayer)
{
@ -70,8 +73,6 @@ function execute_sqlfile($filepath, $replaced, $replacing, $dblayer)
/**
* Automatically activate all core themes in the "themes" directory.
*
* @return void
*/
function activate_core_themes()
{
@ -86,6 +87,30 @@ function activate_core_themes()
}
}
/**
* Automatically activate some core plugins
*/
function activate_core_plugins()
{
include_once(PHPWG_ROOT_PATH.'admin/include/plugins.class.php');
$plugins = new plugins();
foreach($plugins->fs_plugins as $plugin_id => $fs_plugin)
{
if (in_array($plugin_id, array('TakeATour')))
{
$plugins->perform_action('activate', $plugin_id);
}
}
}
/**
* Connect to database during installation. Uses $_POST.
*
* @param array &$infos - populated with infos
* @param array &$errors - populated with errors
*/
function install_db_connect(&$infos, &$errors)
{
try
@ -99,4 +124,5 @@ function install_db_connect(&$infos, &$errors)
$errors[] = l10n($e->getMessage());
}
}
?>

View file

@ -21,9 +21,21 @@
// | USA. |
// +-----------------------------------------------------------------------+
/**
* @package functions\admin\metadata
*/
include_once(PHPWG_ROOT_PATH.'/include/functions_metadata.inc.php');
/**
* Returns IPTC metadata to sync from a file, depending on IPTC mapping.
* @toto : clean code (factorize foreach)
*
* @param string $file
* @return array
*/
function get_sync_iptc_data($file)
{
global $conf;
@ -80,6 +92,12 @@ function get_sync_iptc_data($file)
return $iptc;
}
/**
* Returns EXIF metadata to sync from a file, depending on EXIF mapping.
*
* @param string $file
* @return array
*/
function get_sync_exif_data($file)
{
global $conf;
@ -110,7 +128,11 @@ function get_sync_exif_data($file)
return $exif;
}
/**
* Get all potential file metadata fields, including IPTC and EXIF.
*
* @return string[]
*/
function get_sync_metadata_attributes()
{
global $conf;
@ -139,6 +161,12 @@ function get_sync_metadata_attributes()
return array_unique($update_fields);
}
/**
* Get all metadata of a file.
*
* @param array $infos - (path[, representative_ext])
* @return array - includes data provided in $infos
*/
function get_sync_metadata($infos)
{
global $conf;
@ -178,7 +206,12 @@ function get_sync_metadata($infos)
return $infos;
}
/**
* Sync all metadata of a list of images.
* Metadata are fetched from original files and saved in database.
*
* @param int[] $ids
*/
function sync_metadata($ids)
{
global $conf;
@ -255,13 +288,13 @@ SELECT id, path, representative_ext
}
/**
* returns an array associating element id (images.id) with its complete
* Returns an array associating element id (images.id) with its complete
* path in the filesystem
*
* @param int id_uppercat
* @param int site_id
* @param boolean recursive ?
* @param boolean only newly added files ?
* @param int $category_id
* @param int $site_id
* @param boolean $recursive
* @param boolean $only_new
* @return array
*/
function get_filelist($category_id = '', $site_id=1, $recursive = false,
@ -317,4 +350,5 @@ SELECT id, path, representative_ext
;';
return hash_from_query($query, 'id');
}
?>

View file

@ -75,9 +75,8 @@ function deactivate_non_standard_plugins()
global $page;
$standard_plugins = array(
'admin_multi_view',
'c13y_upgrade',
'event_tracer',
'AdminTools',
'TakeATour',
'language_switch',
'LocalFilesEditor'
);

View file

@ -25,8 +25,8 @@ include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
include_once(PHPWG_ROOT_PATH.'admin/include/image.class.php');
// add default event handler for image and thumbnail resize
add_event_handler('upload_image_resize', 'pwg_image_resize', EVENT_HANDLER_PRIORITY_NEUTRAL, 7);
add_event_handler('upload_thumbnail_resize', 'pwg_image_resize', EVENT_HANDLER_PRIORITY_NEUTRAL, 9);
add_event_handler('upload_image_resize', 'pwg_image_resize');
add_event_handler('upload_thumbnail_resize', 'pwg_image_resize');
function get_upload_form_config()
{
@ -126,7 +126,7 @@ function save_upload_form_config($data, &$errors=array(), &$form_errors=array())
$upload_form_config[$field]['error_message'],
$min, $max
);
$form_errors[$field] = '['.$min.' .. '.$max.']';
}
}
@ -219,6 +219,7 @@ SELECT
$file_path = $upload_dir.'/'.$filename_wo_ext.'.';
list($width, $height, $type) = getimagesize($source_filepath);
if (IMAGETYPE_PNG == $type)
{
$file_path.= 'png';
@ -232,10 +233,27 @@ SELECT
$is_tiff = true;
$file_path.= 'tif';
}
else
elseif (IMAGETYPE_JPEG == $type)
{
$file_path.= 'jpg';
}
elseif (isset($conf['upload_form_all_types']) and $conf['upload_form_all_types'])
{
$original_extension = strtolower(get_extension($original_filename));
if (in_array($original_extension, $conf['file_ext']))
{
$file_path.= $original_extension;
}
else
{
die('unexpected file type');
}
}
else
{
die('forbidden file type');
}
prepare_directory($upload_dir);
}
@ -260,19 +278,19 @@ SELECT
$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);
@ -286,7 +304,7 @@ SELECT
'-0.'.$representative_ext,
$representative_file_abspath
);
if (file_exists($first_file_abspath))
{
rename($first_file_abspath, $representative_file_abspath);
@ -294,6 +312,62 @@ SELECT
}
}
//
// generate pwg_representative in case of video
//
$ffmpeg_video_exts = array( // extensions tested with FFmpeg
'wmv','mov','mkv','mp4','mpg','flv','asf','xvid','divx','mpeg',
'avi','rm',
);
if (isset($original_extension) and in_array($original_extension, $ffmpeg_video_exts))
{
$representative_file_path = dirname($file_path).'/pwg_representative/';
$representative_file_path.= get_filename_wo_extension(basename($file_path)).'.';
$representative_ext = 'jpg';
$representative_file_path.= $representative_ext;
prepare_directory(dirname($representative_file_path));
$second = 1;
$ffmpeg = $conf['ffmpeg_dir'].'ffmpeg';
$ffmpeg.= ' -i "'.$file_path.'"';
$ffmpeg.= ' -an -ss '.$second;
$ffmpeg.= ' -t 1 -r 1 -y -vcodec mjpeg -f mjpeg';
$ffmpeg.= ' "'.$representative_file_path.'"';
// file_put_contents('/tmp/ffmpeg.log', "\n==== ".date('c')."\n".__FUNCTION__.' : '.$ffmpeg."\n", FILE_APPEND);
@exec($ffmpeg);
if (!file_exists($representative_file_path))
{
$representative_ext = null;
}
}
if (isset($original_extension) and 'pdf' == $original_extension and pwg_image::get_library() == 'ext_imagick')
{
$representative_file_path = dirname($file_path).'/pwg_representative/';
$representative_file_path.= get_filename_wo_extension(basename($file_path)).'.';
$representative_ext = 'jpg';
$representative_file_path.= $representative_ext;
prepare_directory(dirname($representative_file_path));
$exec = $conf['ext_imagick_dir'].'convert';
$exec.= ' -quality 98';
$exec.= ' "'.realpath($file_path).'"[0]';
$dest = pathinfo($representative_file_path);
$exec.= ' "'.realpath($dest['dirname']).'/'.$dest['basename'].'"';
$exec.= ' 2>&1';
@exec($exec, $returnarray);
}
if (pwg_image::get_library() != 'gd')
{
if ($conf['original_resize'])
@ -322,7 +396,7 @@ SELECT
// width/height of "multisizes"
$rotation_angle = pwg_image::get_rotation_angle($file_path);
$rotation = pwg_image::get_rotation_code_from_angle($rotation_angle);
$file_infos = pwg_image_infos($file_path);
if (isset($image_id))
@ -411,9 +485,9 @@ SELECT
// in case we are on uploadify.php, we have to replace the false path
$thumb_url = preg_replace('#admin/include/i#', 'i', DerivativeImage::thumb_url($image_infos));
unset_make_full_url();
fetchRemote($thumb_url, $dest);
return $image_id;
}
@ -476,7 +550,18 @@ function pwg_image_infos($path)
function is_valid_image_extension($extension)
{
return in_array(strtolower($extension), array('jpg', 'jpeg', 'png', 'gif'));
global $conf;
if (isset($conf['upload_form_all_types']) and $conf['upload_form_all_types'])
{
$extensions = $conf['file_ext'];
}
else
{
$extensions = $conf['picture_ext'];
}
return array_unique(array_map('strtolower', $extensions));
}
function file_upload_error_message($error_code)

View file

@ -64,7 +64,7 @@ class pwg_image
{
$this->source_filepath = $source_filepath;
trigger_action('load_image_library', array(&$this) );
trigger_notify('load_image_library', array(&$this) );
if (is_object($this->image))
{
@ -241,7 +241,7 @@ class pwg_image
$rotation = 0;
$exif = exif_read_data($source_filepath);
$exif = @exif_read_data($source_filepath);
if (isset($exif['Orientation']) and preg_match('/^\s*(\d)/', $exif['Orientation'], $matches))
{
@ -547,6 +547,9 @@ class image_ext_imagick implements imageInterface
function crop($width, $height, $x, $y)
{
$this->width = $width;
$this->height = $height;
$this->add_command('crop', $width.'x'.$height.'+'.$x.'+'.$y);
return true;
}
@ -583,6 +586,9 @@ class image_ext_imagick implements imageInterface
function resize($width, $height)
{
$this->width = $width;
$this->height = $height;
$this->add_command('filter', 'Lanczos');
$this->add_command('resize', $width.'x'.$height.'!');
return true;

View file

@ -158,24 +158,24 @@ UPDATE '.USER_INFOS_TABLE.'
);
$plg_data = implode( '', file($path.'/common.lang.php') );
if ( preg_match("|Language Name: (.*)|", $plg_data, $val) )
if (preg_match("|Language Name:\\s*(.+)|", $plg_data, $val))
{
$language['name'] = trim( $val[1] );
$language['name'] = convert_charset($language['name'], 'utf-8', $target_charset);
}
if (preg_match("|Version: (.*)|", $plg_data, $val))
if (preg_match("|Version:\\s*([\\w.-]+)|", $plg_data, $val))
{
$language['version'] = trim($val[1]);
}
if ( preg_match("|Language URI: (.*)|", $plg_data, $val) )
if (preg_match("|Language URI:\\s*(https?:\\/\\/.+)|", $plg_data, $val))
{
$language['uri'] = trim($val[1]);
}
if ( preg_match("|Author: (.*)|", $plg_data, $val) )
if (preg_match("|Author:\\s*(.+)|", $plg_data, $val))
{
$language['author'] = trim($val[1]);
}
if ( preg_match("|Author URI: (.*)|", $plg_data, $val) )
if (preg_match("|Author URI:\\s*(https?:\\/\\/.+)|", $plg_data, $val))
{
$language['author uri'] = trim($val[1]);
}
@ -184,6 +184,7 @@ UPDATE '.USER_INFOS_TABLE.'
list( , $extension) = explode('extension_view.php?eid=', $language['uri']);
if (is_numeric($extension)) $language['extension'] = $extension;
}
// IMPORTANT SECURITY !
$language = array_map('htmlspecialchars', $language);
$this->fs_languages[$file] = $language;

View file

@ -21,40 +21,10 @@
// | USA. |
// +-----------------------------------------------------------------------+
// +-----------------------------------------------------------------------+
// | Uploaded photos |
// +-----------------------------------------------------------------------+
if (isset($page['thumbnails']))
{
$template->assign(
array(
'thumbnails' => $page['thumbnails'],
)
);
// only display the batch link if we have more than 1 photo
if (count($page['thumbnails']) > 1)
{
$template->assign(
array(
'batch_link' => $page['batch_link'],
'batch_label' => sprintf(
l10n('Manage this set of %d photos'),
count($page['thumbnails'])
),
)
);
}
}
// +-----------------------------------------------------------------------+
// | Photo selection |
// +-----------------------------------------------------------------------+
$uploadify_path = PHPWG_ROOT_PATH.'admin/include/uploadify';
$upload_max_filesize = min(
get_ini_size('upload_max_filesize'),
get_ini_size('post_max_size')
@ -72,7 +42,6 @@ else
$template->assign(
array(
'F_ADD_ACTION'=> PHOTOS_ADD_BASE_URL,
'uploadify_path' => $uploadify_path,
'upload_max_filesize' => $upload_max_filesize,
'upload_max_filesize_shorthand' => $upload_max_filesize_shorthand,
)
@ -117,47 +86,24 @@ if ($conf['original_resize'])
}
$upload_modes = array('html', 'multiple');
$upload_mode = isset($conf['upload_mode']) ? $conf['upload_mode'] : 'multiple';
if (isset($_GET['upload_mode']) and $upload_mode != $_GET['upload_mode'] and in_array($_GET['upload_mode'], $upload_modes))
{
$upload_mode = $_GET['upload_mode'];
conf_update_param('upload_mode', $upload_mode);
}
// what is the upload switch mode
$index_of_upload_mode = array_flip($upload_modes);
$upload_mode_index = $index_of_upload_mode[$upload_mode];
$upload_switch = $upload_modes[ ($upload_mode_index + 1) % 2 ];
$template->assign(
array(
'upload_mode' => $upload_mode,
'form_action' => PHOTOS_ADD_BASE_URL.'&amp;upload_mode='.$upload_mode.'&amp;processed=1',
'switch_url' => PHOTOS_ADD_BASE_URL.'&amp;upload_mode='.$upload_switch,
'upload_id' => md5(rand()),
'session_id' => session_id(),
'form_action' => PHOTOS_ADD_BASE_URL,
'pwg_token' => get_pwg_token(),
'another_upload_link' => PHOTOS_ADD_BASE_URL.'&amp;upload_mode='.$upload_mode,
)
);
$upload_file_types = 'jpeg, png, gif';
$unique_exts = array_unique(
array_map(
'strtolower',
$conf['upload_form_all_types'] ? $conf['file_ext'] : $conf['picture_ext']
)
);
if (pwg_image::get_library() == 'ext_imagick')
{
$upload_file_types.= ', tiff';
$template->assign('tif_enabled', true);
}
if ('html' == $upload_mode)
{
$upload_file_types.= ', zip';
}
$template->assign(
array(
'upload_file_types' => $upload_file_types,
'upload_file_types' => implode(', ', $unique_exts),
'file_exts' => implode(',', $unique_exts),
)
);
@ -217,16 +163,7 @@ SELECT category_id
}
// existing album
$query = '
SELECT id,name,uppercats,global_rank
FROM '.CATEGORIES_TABLE.'
;';
display_select_cat_wrapper(
$query,
$selected_category,
'category_options'
);
$template->assign('selected_category', $selected_category);
// image level options
@ -256,11 +193,10 @@ if (!function_exists('gd_info'))
$setup_errors[] = l10n('GD library is missing');
}
$template->assign(
array(
'setup_errors'=> $setup_errors,
)
);
$template->assign(array(
'setup_errors'=> $setup_errors,
'CACHE_KEYS' => get_admin_client_cache_keys(array('categories')),
));
// Warnings
if (isset($_GET['hide_warnings']))
@ -288,7 +224,7 @@ if (!isset($_SESSION['upload_hide_warnings']))
$template->assign(
array(
'setup_warnings' => $setup_warnings,
'hide_warnings_link' => PHOTOS_ADD_BASE_URL.'&amp;upload_mode='.$upload_mode.'&amp;hide_warnings=1'
'hide_warnings_link' => PHOTOS_ADD_BASE_URL.'&amp;hide_warnings=1'
)
);
}

View file

@ -1,242 +0,0 @@
<?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 (isset($_GET['processed']))
{
// echo '<pre>POST'."\n"; print_r($_POST); echo '</pre>';
// echo '<pre>FILES'."\n"; print_r($_FILES); echo '</pre>';
// echo '<pre>SESSION'."\n"; print_r($_SESSION); echo '</pre>';
// exit();
// sometimes, you have submitted the form but you have nothing in $_POST
// and $_FILES. This may happen when you have an HTML upload and you
// exceeded the post_max_size (but not the upload_max_size)
if (!isset($_POST['submit_upload']))
{
$page['errors'][] = l10n(
'The uploaded files exceed the post_max_size directive in php.ini: %sB',
ini_get('post_max_size')
);
}
else
{
$category_id = $_POST['category'];
}
if (isset($_POST['onUploadError']) and is_array($_POST['onUploadError']) and count($_POST['onUploadError']) > 0)
{
foreach ($_POST['onUploadError'] as $error)
{
$page['errors'][] = $error;
}
}
$image_ids = array();
if (isset($_FILES) and !empty($_FILES['image_upload']))
{
$starttime = get_moment();
foreach ($_FILES['image_upload']['error'] as $idx => $error)
{
if (UPLOAD_ERR_OK == $error)
{
$images_to_add = array();
$extension = pathinfo($_FILES['image_upload']['name'][$idx], PATHINFO_EXTENSION);
if ('zip' == strtolower($extension))
{
$upload_dir = $conf['upload_dir'].'/buffer';
prepare_directory($upload_dir);
$temporary_archive_name = date('YmdHis').'-'.generate_key(10);
$archive_path = $upload_dir.'/'.$temporary_archive_name.'.zip';
move_uploaded_file(
$_FILES['image_upload']['tmp_name'][$idx],
$archive_path
);
define('PCLZIP_TEMPORARY_DIR', $upload_dir.'/');
include_once(PHPWG_ROOT_PATH.'admin/include/pclzip.lib.php');
$zip = new PclZip($archive_path);
if ($list = $zip->listContent())
{
$indexes_to_extract = array();
foreach ($list as $node)
{
if (1 == $node['folder'])
{
continue;
}
if (is_valid_image_extension(pathinfo($node['filename'], PATHINFO_EXTENSION)))
{
$indexes_to_extract[] = $node['index'];
$images_to_add[] = array(
'source_filepath' => $upload_dir.'/'.$temporary_archive_name.'/'.$node['filename'],
'original_filename' => basename($node['filename']),
);
}
}
if (count($indexes_to_extract) > 0)
{
$zip->extract(
PCLZIP_OPT_PATH, $upload_dir.'/'.$temporary_archive_name,
PCLZIP_OPT_BY_INDEX, $indexes_to_extract,
PCLZIP_OPT_ADD_TEMP_FILE_ON
);
}
}
}
elseif (is_valid_image_extension($extension))
{
$images_to_add[] = array(
'source_filepath' => $_FILES['image_upload']['tmp_name'][$idx],
'original_filename' => $_FILES['image_upload']['name'][$idx],
);
}
foreach ($images_to_add as $image_to_add)
{
$image_id = add_uploaded_file(
$image_to_add['source_filepath'],
$image_to_add['original_filename'],
array($category_id),
$_POST['level']
);
$image_ids[] = $image_id;
// TODO: if $image_id is not an integer, something went wrong
}
}
else
{
$error_message = file_upload_error_message($error);
$page['errors'][] = l10n(
'Error on file "%s" : %s',
$_FILES['image_upload']['name'][$idx],
$error_message
);
}
}
$endtime = get_moment();
$elapsed = ($endtime - $starttime) * 1000;
// printf('%.2f ms', $elapsed);
} // if (!empty($_FILES))
if (isset($_POST['upload_id']))
{
// we're on a multiple upload, with uploadify and so on
if (isset($_SESSION['uploads_error'][ $_POST['upload_id'] ]))
{
foreach ($_SESSION['uploads_error'][ $_POST['upload_id'] ] as $error)
{
$page['errors'][] = $error;
}
}
if (isset($_SESSION['uploads'][ $_POST['upload_id'] ]))
{
$image_ids = $_SESSION['uploads'][ $_POST['upload_id'] ];
}
}
$page['thumbnails'] = array();
foreach ($image_ids as $image_id)
{
// we could return the list of properties from the add_uploaded_file
// function, but I like the "double check". And it costs nothing
// compared to the upload process.
$thumbnail = array();
$query = '
SELECT
id,
file,
path
FROM '.IMAGES_TABLE.'
WHERE id = '.$image_id.'
;';
$image_infos = pwg_db_fetch_assoc(pwg_query($query));
$thumbnail['file'] = $image_infos['file'];
$thumbnail['src'] = DerivativeImage::thumb_url($image_infos);
// TODO: when implementing this plugin in Piwigo core, we should have
// a function get_image_name($name, $file) (if name is null, then
// compute a temporary name from filename) that would be also used in
// picture.php. UPDATE: in fact, "get_name_from_file($file)" already
// exists and is used twice (batch_manager_unit + comments, but not in
// picture.php I don't know why) with the same pattern if
// (empty($name)) {$name = get_name_from_file($file)}, a clean
// function get_image_name($name, $file) would be better
$thumbnail['title'] = get_name_from_file($image_infos['file']);
$thumbnail['link'] = get_root_url().'admin.php?page=photo-'.$image_id.'&amp;cat_id='.$category_id;
$page['thumbnails'][] = $thumbnail;
}
if (!empty($page['thumbnails']))
{
$page['infos'][] = l10n('%d photos uploaded', count($page['thumbnails']));
if (0 != $_POST['level'])
{
$page['infos'][] = l10n(
'Privacy level set to "%s"',
l10n(sprintf('Level %d', $_POST['level']))
);
}
$query = '
SELECT
COUNT(*)
FROM '.IMAGE_CATEGORY_TABLE.'
WHERE category_id = '.$category_id.'
;';
list($count) = pwg_db_fetch_row(pwg_query($query));
$category_name = get_cat_display_name_from_id($category_id, 'admin.php?page=album-');
// information
$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);
}
}
?>

View file

@ -55,6 +55,7 @@ class DummyPlugin_maintain extends PluginMaintain
return plugin_uninstall($this->plugin_id);
}
}
function update($old_version, $new_version, &$errors=array()) {}
}
@ -63,7 +64,7 @@ class plugins
var $fs_plugins = array();
var $db_plugins_by_id = array();
var $server_plugins = array();
var $default_plugins = array('LocalFilesEditor', 'language_switch', 'c13y_upgrade', 'admin_multi_view');
var $default_plugins = array('LocalFilesEditor', 'language_switch', 'TakeATour', 'AdminTools');
/**
* Initialize $fs_plugins and $db_plugins_by_id
@ -85,28 +86,28 @@ class plugins
*/
private static function build_maintain_class($plugin_id)
{
$file_to_include = PHPWG_PLUGINS_PATH . $plugin_id . '/maintain.inc.php';
$file_to_include = PHPWG_PLUGINS_PATH . $plugin_id . '/maintain';
$classname = $plugin_id.'_maintain';
if (file_exists($file_to_include))
// 2.7 pattern (OO only)
if (file_exists($file_to_include.'.class.php'))
{
include_once($file_to_include);
include_once($file_to_include.'.class.php');
return new $classname($plugin_id);
}
// before 2.7 pattern (OO or procedural)
if (file_exists($file_to_include.'.inc.php'))
{
include_once($file_to_include.'.inc.php');
if (class_exists($classname))
{
$plugin_maintain = new $classname($plugin_id);
return new $classname($plugin_id);
}
else
{
$plugin_maintain = new DummyPlugin_maintain($plugin_id);
}
}
else
{
$plugin_maintain = new DummyPlugin_maintain($plugin_id);
}
return $plugin_maintain;
return new DummyPlugin_maintain($plugin_id);
}
/**
@ -115,14 +116,17 @@ class plugins
* @param string - plugin id
* @param array - errors
*/
function perform_action($action, $plugin_id)
function perform_action($action, $plugin_id, $options=array())
{
if (isset($this->db_plugins_by_id[$plugin_id]))
{
$crt_db_plugin = $this->db_plugins_by_id[$plugin_id];
}
$plugin_maintain = self::build_maintain_class($plugin_id);
if ($action !== 'update')
{ // wait for files to be updated
$plugin_maintain = self::build_maintain_class($plugin_id);
}
$errors = array();
@ -146,6 +150,31 @@ INSERT INTO '. PLUGINS_TABLE .' (id,version)
}
break;
case 'update':
$previous_version = $this->fs_plugins[$plugin_id]['version'];
$errors[0] = $this->extract_plugin_files('upgrade', $options['revision'], $plugin_id);
if ($errors[0] === 'ok')
{
$this->get_fs_plugin($plugin_id); // refresh plugins list
$new_version = $this->fs_plugins[$plugin_id]['version'];
$plugin_maintain = self::build_maintain_class($plugin_id);
$plugin_maintain->update($previous_version, $new_version, $errors);
if ($new_version != 'auto')
{
$query = '
UPDATE '. PLUGINS_TABLE .'
SET version=\''. $new_version .'\'
WHERE id=\''. $plugin_id .'\'
;';
pwg_query($query);
}
}
break;
case 'activate':
if (!isset($crt_db_plugin))
{
@ -167,8 +196,7 @@ INSERT INTO '. PLUGINS_TABLE .' (id,version)
{
$query = '
UPDATE '. PLUGINS_TABLE .'
SET state=\'active\',
version=\''. $this->fs_plugins[$plugin_id]['version'] .'\'
SET state=\'active\'
WHERE id=\''. $plugin_id .'\'
;';
pwg_query($query);
@ -187,7 +215,7 @@ UPDATE '. PLUGINS_TABLE .'
WHERE id=\''. $plugin_id .'\'
;';
pwg_query($query);
$plugin_maintain->deactivate();
break;
@ -206,7 +234,7 @@ DELETE FROM '. PLUGINS_TABLE .'
WHERE id=\''. $plugin_id .'\'
;';
pwg_query($query);
$plugin_maintain->uninstall();
break;
@ -235,7 +263,7 @@ DELETE FROM '. PLUGINS_TABLE .'
/**
* Get plugins defined in the plugin directory
*/
*/
function get_fs_plugins()
{
$dir = opendir(PHPWG_PLUGINS_PATH);
@ -243,63 +271,82 @@ DELETE FROM '. PLUGINS_TABLE .'
{
if ($file!='.' and $file!='..')
{
$path = PHPWG_PLUGINS_PATH.$file;
if (is_dir($path) and !is_link($path)
and preg_match('/^[a-zA-Z0-9-_]+$/', $file )
and file_exists($path.'/main.inc.php')
)
if (preg_match('/^[a-zA-Z0-9-_]+$/', $file))
{
$plugin = array(
'name'=>$file,
'version'=>'0',
'uri'=>'',
'description'=>'',
'author'=>'',
);
$plg_data = implode( '', file($path.'/main.inc.php') );
if ( preg_match("|Plugin Name: (.*)|", $plg_data, $val) )
{
$plugin['name'] = trim( $val[1] );
}
if (preg_match("|Version: (.*)|", $plg_data, $val))
{
$plugin['version'] = trim($val[1]);
}
if ( preg_match("|Plugin URI: (.*)|", $plg_data, $val) )
{
$plugin['uri'] = trim($val[1]);
}
if ($desc = load_language('description.txt', $path.'/', array('return' => true)))
{
$plugin['description'] = trim($desc);
}
elseif ( preg_match("|Description: (.*)|", $plg_data, $val) )
{
$plugin['description'] = trim($val[1]);
}
if ( preg_match("|Author: (.*)|", $plg_data, $val) )
{
$plugin['author'] = trim($val[1]);
}
if ( preg_match("|Author URI: (.*)|", $plg_data, $val) )
{
$plugin['author uri'] = trim($val[1]);
}
if (!empty($plugin['uri']) and strpos($plugin['uri'] , 'extension_view.php?eid='))
{
list( , $extension) = explode('extension_view.php?eid=', $plugin['uri']);
if (is_numeric($extension)) $plugin['extension'] = $extension;
}
// IMPORTANT SECURITY !
$plugin = array_map('htmlspecialchars', $plugin);
$this->fs_plugins[$file] = $plugin;
$this->get_fs_plugin($file);
}
}
}
closedir($dir);
}
/**
* Load metadata of a plugin in `fs_plugins` array
* @from 2.7
* @param $plugin_id
* @return false|array
*/
function get_fs_plugin($plugin_id)
{
$path = PHPWG_PLUGINS_PATH.$plugin_id;
if (is_dir($path) and !is_link($path)
and file_exists($path.'/main.inc.php')
)
{
$plugin = array(
'name'=>$plugin_id,
'version'=>'0',
'uri'=>'',
'description'=>'',
'author'=>'',
);
$plg_data = file_get_contents($path.'/main.inc.php', null, null, 0, 2048);
if (preg_match("|Plugin Name:\\s*(.+)|", $plg_data, $val))
{
$plugin['name'] = trim( $val[1] );
}
if (preg_match("|Version:\\s*([\\w.-]+)|", $plg_data, $val))
{
$plugin['version'] = trim($val[1]);
}
if (preg_match("|Plugin URI:\\s*(https?:\\/\\/.+)|", $plg_data, $val))
{
$plugin['uri'] = trim($val[1]);
}
if ($desc = load_language('description.txt', $path.'/', array('return' => true)))
{
$plugin['description'] = trim($desc);
}
elseif (preg_match("|Description:\\s*(.+)|", $plg_data, $val))
{
$plugin['description'] = trim($val[1]);
}
if (preg_match("|Author:\\s*(.+)|", $plg_data, $val))
{
$plugin['author'] = trim($val[1]);
}
if (preg_match("|Author URI:\\s*(https?:\\/\\/.+)|", $plg_data, $val))
{
$plugin['author uri'] = trim($val[1]);
}
if (!empty($plugin['uri']) and strpos($plugin['uri'] , 'extension_view.php?eid='))
{
list( , $extension) = explode('extension_view.php?eid=', $plugin['uri']);
if (is_numeric($extension)) $plugin['extension'] = $extension;
}
// IMPORTANT SECURITY !
$plugin = array_map('htmlspecialchars', $plugin);
$this->fs_plugins[$plugin_id] = $plugin;
return $plugin;
}
return false;
}
/**
* Sort fs_plugins
*/
@ -326,7 +373,7 @@ DELETE FROM '. PLUGINS_TABLE .'
function get_versions_to_check($version=PHPWG_VERSION)
{
global $conf;
$versions_to_check = array();
$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))
@ -423,7 +470,7 @@ DELETE FROM '. PLUGINS_TABLE .'
{
return false;
}
global $conf;
// Plugins to check
@ -477,7 +524,7 @@ DELETE FROM '. PLUGINS_TABLE .'
}
return false;
}
/**
* Sort $server_plugins
*/
@ -509,7 +556,7 @@ DELETE FROM '. PLUGINS_TABLE .'
* @param string - archive URL
* @param string - plugin id or extension id
*/
function extract_plugin_files($action, $revision, $dest)
function extract_plugin_files($action, $revision, $dest, &$plugin_id=null)
{
if ($archive = tempnam( PHPWG_PLUGINS_PATH, 'zip'))
{
@ -541,13 +588,14 @@ DELETE FROM '. PLUGINS_TABLE .'
$root = dirname($main_filepath); // main.inc.php path in archive
if ($action == 'upgrade')
{
$extract_path = PHPWG_PLUGINS_PATH . $dest;
$plugin_id = $dest;
}
else
{
$extract_path = PHPWG_PLUGINS_PATH
. ($root == '.' ? 'extension_' . $dest : basename($root));
$plugin_id = ($root == '.' ? 'extension_' . $dest : basename($root));
}
$extract_path = PHPWG_PLUGINS_PATH . $plugin_id;
if($result = $zip->extract(PCLZIP_OPT_PATH, $extract_path,
PCLZIP_OPT_REMOVE_PATH, $root,
PCLZIP_OPT_REPLACE_NEWER))

View file

@ -88,7 +88,7 @@ class tabsheet
*/
function select($name)
{
$this->sheets = trigger_event('tabsheet_before_select', $this->sheets, $this->uniqid);
$this->sheets = trigger_change('tabsheet_before_select', $this->sheets, $this->uniqid);
if (!array_key_exists($name, $this->sheets))
{
$keys = array_keys($this->sheets);

View file

@ -86,19 +86,11 @@ class themes
if (class_exists($classname))
{
$theme_maintain = new $classname($theme_id);
}
else
{
$theme_maintain = new DummyTheme_maintain($theme_id);
return new $classname($theme_id);
}
}
else
{
$theme_maintain = new DummyTheme_maintain($theme_id);
}
return $theme_maintain;
return new DummyTheme_maintain($theme_id);
}
/**
@ -383,17 +375,17 @@ SELECT
'author' => '',
'mobile' => false,
);
$theme_data = implode( '', file($path.'/themeconf.inc.php') );
$theme_data = implode('', file($path.'/themeconf.inc.php'));
if ( preg_match("|Theme Name: (.*)|", $theme_data, $val) )
if (preg_match("|Theme Name:\\s*(.+)|", $theme_data, $val))
{
$theme['name'] = trim( $val[1] );
}
if (preg_match("|Version: (.*)|", $theme_data, $val))
if (preg_match("|Version:\\s*([\\w.-]+)|", $theme_data, $val))
{
$theme['version'] = trim($val[1]);
}
if ( preg_match("|Theme URI: (.*)|", $theme_data, $val) )
if (preg_match("|Theme URI:\\s*(https?:\\/\\/.+)|", $theme_data, $val))
{
$theme['uri'] = trim($val[1]);
}
@ -401,15 +393,15 @@ SELECT
{
$theme['description'] = trim($desc);
}
elseif ( preg_match("|Description: (.*)|", $theme_data, $val) )
elseif (preg_match("|Description:\\s*(.+)|", $theme_data, $val))
{
$theme['description'] = trim($val[1]);
}
if ( preg_match("|Author: (.*)|", $theme_data, $val) )
if (preg_match("|Author:\\s*(.+)|", $theme_data, $val))
{
$theme['author'] = trim($val[1]);
}
if ( preg_match("|Author URI: (.*)|", $theme_data, $val) )
if (preg_match("|Author URI:\\s*(https?:\\/\\/.+)|", $theme_data, $val))
{
$theme['author uri'] = trim($val[1]);
}

View file

@ -44,8 +44,8 @@ class updates
{
$this->types = array($page);
}
$this->default_themes = array('clear', 'dark', 'Sylvia', 'elegant');
$this->default_plugins = array('admin_multi_view', 'c13y_upgrade', 'language_switch', 'LocalFilesEditor');
$this->default_themes = array('clear', 'dark', 'Sylvia', 'elegant', 'smartpocket');
$this->default_plugins = array('AdminTools', 'TakeATour', 'language_switch', 'LocalFilesEditor');
foreach ($this->types as $type)
{

Binary file not shown.

Before

Width:  |  Height:  |  Size: 778 B

File diff suppressed because one or more lines are too long

View file

@ -1,119 +0,0 @@
/*
Uploadify v3.0.0
Copyright (c) 2010 Ronnie Garcia
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
.uploadify {margin:0 auto 10px auto}
.uploadifyButton {
display: block;
cursor: pointer;
font-size: 11px;
font-weight: bold;
color: #eeeeee;
padding: 8px 0;
text-align: center;
height: 14px;
width: 100%;
background-color: #464646;
-webkit-border-radius:5px;
-moz-border-radius:5px;
border-radius:5px;
letter-spacing:2px;
}
.uploadify:hover .uploadifyButton {
color:#fff;
background-color: #333;
cursor:pointer;
}
.uploadifyQueueItem {
background-color: #F5F5F5;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
font: 11px Verdana, Geneva, sans-serif;
margin-top: 5px;
max-width: 350px;
padding: 10px;
}
.uploadifyQueueItem .cancel {
float: right;
}
.uploadifyQueueItem .fileName, .uploadifyQueueItem .data {
float: left;
}
.uploadifyQueue .completed {
background-color: #E5E5E5;
}
.uploadifyProgress {
background-color: #E5E5E5;
margin-top: 25px;
height: 3px;
width: 100%;
position: relative;
}
.uploadifyProgressBar {
background-color: #0099FF;
height: 3px;
width: 1px;
position: absolute;
left: 0px;
}
.uploadifyError {
background-color: #FDE5DD !important;
}
/* Piwigo specific */
#fileQueue {
width: 420px;
max-height: 300px;
overflow: auto;
margin: 0 auto 10px auto;
padding: 5px 0 10px 0;
}
.uploadifyQueueItem {
border: 1px solid #666;
background-color: #444;
color:#999;
margin: 5px auto 0 auto;
padding: 10px;
width: 350px;
}
.uploadifyError {
border: 2px solid #FBCBBC !important;
background-color: #FDE5DD !important;
}
.uploadifyQueueItem .cancel {
float: right;
}
.uploadifyProgress {
background-color: #333;
border: 1px solid #666;
width: 100%;
}
.uploadifyProgressBar {
background-color: #FF3363;
width: 1px;
height: 3px;
}

View file

@ -1,100 +0,0 @@
<?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);
$_COOKIE['pwg_id'] = $_POST['session_id'];
include_once(PHPWG_ROOT_PATH.'include/common.inc.php');
include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php');
check_pwg_token();
ob_start();
echo '$_FILES'."\n";
print_r($_FILES);
echo '$_POST'."\n";
print_r($_POST);
echo '$user'."\n";
print_r($user);
$tmp = ob_get_contents();
ob_end_clean();
// error_log($tmp, 3, "/tmp/php-".date('YmdHis').'-'.sprintf('%020u', rand()).".log");
if ($_FILES['Filedata']['error'] !== UPLOAD_ERR_OK)
{
$error_message = file_upload_error_message($_FILES['Filedata']['error']);
add_upload_error(
$_POST['upload_id'],
sprintf(
l10n('Error on file "%s" : %s'),
$_FILES['Filedata']['name'],
$error_message
)
);
echo "File Size Error";
exit();
}
ob_start();
$image_id = add_uploaded_file(
$_FILES['Filedata']['tmp_name'],
$_FILES['Filedata']['name'],
array($_POST['category_id']),
$_POST['level']
);
$_SESSION['uploads'][ $_POST['upload_id'] ][] = $image_id;
$query = '
SELECT
id,
path
FROM '.IMAGES_TABLE.'
WHERE id = '.$image_id.'
;';
$image_infos = pwg_db_fetch_assoc(pwg_query($query));
$thumbnail_url = preg_replace('#^'.PHPWG_ROOT_PATH.'#', './', DerivativeImage::thumb_url($image_infos));
$return = array(
'image_id' => $image_id,
'category_id' => $_POST['category_id'],
'thumbnail_url' => $thumbnail_url,
);
$output = ob_get_contents();
ob_end_clean();
if (!empty($output))
{
add_upload_error($_POST['upload_id'], $output);
$return['error_message'] = $output;
}
echo json_encode($return);
?>

View file

@ -1,32 +0,0 @@
// this file must be in UTF-8 format
var uploadifyLang = new Array();
uploadifyLang['buttonText'] = 'SELECT FILES';
uploadifyLang['fileTypeDesc'] = 'All Files (*.*)';
uploadifyLang['replaceMsg1'] = 'The file named';
uploadifyLang['replaceMsg2'] = 'is already in the queue';
uploadifyLang['replaceMsg3'] = 'Do you want to replace the existing item in the queue?';
uploadifyLang['existsMsg1'] = 'A file with the name';
uploadifyLang['existsMsg2'] = 'already exists on the server';
uploadifyLang['existsMsg3'] = 'Would you like to replace the existing file?';
uploadifyLang['errorMsg1'] = 'Some files were not added to the queue:';
uploadifyLang['errorMsg2'] = 'The number of files selected exceeds the remaining upload limit';
uploadifyLang['errorMsg3'] = 'The number of files selected exceeds the queue size limit';
uploadifyLang['errorMsg4'] = 'The file';
uploadifyLang['errorMsg5'] = 'exceeds the size limit';
uploadifyLang['errorMsg6'] = 'is empty';
uploadifyLang['errorMsg7'] = 'is not an accepted file type';
uploadifyLang['errorString1'] = 'Error';
uploadifyLang['errorString2'] = 'HTTP Error';
uploadifyLang['errorString3'] = 'Missing Upload URL';
uploadifyLang['errorString4'] = 'IO Error';
uploadifyLang['errorString5'] = 'Security Error';
uploadifyLang['errorString6'] = 'The upload limit has been reached';
uploadifyLang['errorString7'] = 'Exceeds Upload Limit';
uploadifyLang['errorString8'] = 'Failed';
uploadifyLang['errorString9'] = 'File ID Not Found';
uploadifyLang['errorString10'] = 'Validation Error';
uploadifyLang['errorString11'] = 'Cancelled';
uploadifyLang['errorString12'] = 'Stopped';
uploadifyLang['uploadComplete'] = 'Complete';

View file

@ -146,6 +146,7 @@ DELETE
{
$template->delete_compiled_templates();
FileCombiner::clear_combined_files();
$persistent_cache->purge(true);
break;
}
case 'derivatives':
@ -219,7 +220,7 @@ else
$advanced_features = array();
//$advanced_features is array of array composed of CAPTION & URL
$advanced_features = trigger_event(
$advanced_features = trigger_change(
'get_admin_advanced_features_links',
$advanced_features
);

View file

@ -253,7 +253,7 @@ function do_action_send_mail_notification($action = 'list_to_send', $check_key_l
}
$customize_mail_content =
trigger_event('nbm_render_global_customize_mail_content', $customize_mail_content);
trigger_change('nbm_render_global_customize_mail_content', $customize_mail_content);
// Prepare message after change language
@ -340,7 +340,7 @@ function do_action_send_mail_notification($action = 'list_to_send', $check_key_l
}
$nbm_user_customize_mail_content =
trigger_event('nbm_render_user_customize_mail_content',
trigger_change('nbm_render_user_customize_mail_content',
$customize_mail_content, $nbm_user);
if (!empty($nbm_user_customize_mail_content))
{
@ -482,7 +482,7 @@ check_status(get_tab_status($page['mode']));
// | Add event handler |
// +-----------------------------------------------------------------------+
add_event_handler('nbm_render_global_customize_mail_content', 'render_global_customize_mail_content');
trigger_action('nbm_event_handler_added');
trigger_notify('nbm_event_handler_added');
// +-----------------------------------------------------------------------+

View file

@ -57,12 +57,6 @@ DELETE FROM '.CADDIE_TABLE.'
redirect(get_root_url().'admin.php?page=batch_manager&filter=prefilter-caddie');
}
// +-----------------------------------------------------------------------+
// | process form |
// +-----------------------------------------------------------------------+
include_once(PHPWG_ROOT_PATH.'admin/include/photos_add_direct_process.inc.php');
// +-----------------------------------------------------------------------+
// | prepare form |
// +-----------------------------------------------------------------------+
@ -72,6 +66,7 @@ include_once(PHPWG_ROOT_PATH.'admin/include/photos_add_direct_prepare.inc.php');
// +-----------------------------------------------------------------------+
// | sending html code |
// +-----------------------------------------------------------------------+
trigger_notify('loc_end_photo_add_direct');
$template->assign_var_from_handle('ADMIN_CONTENT', 'photos_add');
?>

View file

@ -42,7 +42,7 @@ SELECT id
FROM '.CATEGORIES_TABLE.'
WHERE representative_picture_id = '.$_GET['image_id'].'
;';
$represent_options_selected = array_from_query($query, 'id');
$represented_albums = query2array($query, null, 'id');
// +-----------------------------------------------------------------------+
// | delete photo |
@ -108,50 +108,30 @@ if (isset($_GET['sync_metadata']))
}
//--------------------------------------------------------- update informations
// first, we verify whether there is a mistake on the given creation date
if (isset($_POST['date_creation_action'])
and 'set' == $_POST['date_creation_action'])
{
if (!is_numeric($_POST['date_creation_year'])
or !checkdate(
$_POST['date_creation_month'],
$_POST['date_creation_day'],
$_POST['date_creation_year'])
)
{
$page['errors'][] = l10n('wrong date');
}
}
if (isset($_POST['submit']) and count($page['errors']) == 0)
if (isset($_POST['submit']))
{
$data = array();
$data{'id'} = $_GET['image_id'];
$data{'name'} = $_POST['name'];
$data{'author'} = $_POST['author'];
$data['id'] = $_GET['image_id'];
$data['name'] = $_POST['name'];
$data['author'] = $_POST['author'];
$data['level'] = $_POST['level'];
if ($conf['allow_html_descriptions'])
{
$data{'comment'} = @$_POST['description'];
$data['comment'] = @$_POST['description'];
}
else
{
$data{'comment'} = strip_tags(@$_POST['description']);
$data['comment'] = strip_tags(@$_POST['description']);
}
if (!empty($_POST['date_creation_year']))
if (!empty($_POST['date_creation']))
{
$data{'date_creation'} =
$_POST['date_creation_year']
.'-'.$_POST['date_creation_month']
.'-'.$_POST['date_creation_day']
.' '.$_POST['date_creation_time'];
$data['date_creation'] = $_POST['date_creation'];
}
else
{
$data{'date_creation'} = null;
$data['date_creation'] = null;
}
$data = trigger_change('picture_modify_before_update', $data);
@ -175,6 +155,7 @@ if (isset($_POST['submit']) and count($page['errors']) == 0)
{
$_POST['associate'] = array();
}
check_input_parameter('associate', $_POST, true, PATTERN_ID);
move_images_to_categories(array($_GET['image_id']), $_POST['associate']);
invalidate_user_cache();
@ -184,14 +165,15 @@ if (isset($_POST['submit']) and count($page['errors']) == 0)
{
$_POST['represent'] = array();
}
check_input_parameter('represent', $_POST, true, PATTERN_ID);
$no_longer_thumbnail_for = array_diff($represent_options_selected, $_POST['represent']);
$no_longer_thumbnail_for = array_diff($represented_albums, $_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);
$new_thumbnail_for = array_diff($_POST['represent'], $represented_albums);
if (count($new_thumbnail_for) > 0)
{
$query = '
@ -202,7 +184,7 @@ UPDATE '.CATEGORIES_TABLE.'
pwg_query($query);
}
$represent_options_selected = $_POST['represent'];
$represented_albums = $_POST['represent'];
$page['infos'][] = l10n('Photo informations updated');
}
@ -218,14 +200,6 @@ SELECT
;';
$tag_selection = get_taglist($query);
$query = '
SELECT
id,
name
FROM '.TAGS_TABLE.'
;';
$tags = get_taglist($query, false);
// retrieving direct information about picture
$query = '
SELECT *
@ -255,16 +229,18 @@ $template->set_filenames(
$admin_url_start = $admin_photo_base_url.'-properties';
$admin_url_start.= isset($_GET['cat_id']) ? '&amp;cat_id='.$_GET['cat_id'] : '';
$src_image = new SrcImage($row);
$template->assign(
array(
'tag_selection' => $tag_selection,
'tags' => $tags,
'U_SYNC' => $admin_url_start.'&amp;sync_metadata=1',
'U_DELETE' => $admin_url_start.'&amp;delete=1&amp;pwg_token='.get_pwg_token(),
'PATH'=>$row['path'],
'TN_SRC' => DerivativeImage::thumb_url($row),
'TN_SRC' => DerivativeImage::url(IMG_THUMB, $src_image),
'FILE_SRC' => DerivativeImage::url(IMG_LARGE, $src_image),
'NAME' =>
isset($_POST['name']) ?
@ -284,6 +260,8 @@ $template->assign(
: @$row['author']
),
'DATE_CREATION' => $row['date_creation'],
'DESCRIPTION' =>
htmlspecialchars( isset($_POST['description']) ?
stripslashes($_POST['description']) : @$row['comment'] ),
@ -308,7 +286,7 @@ while ($user_row = pwg_db_fetch_assoc($result))
$intro_vars = array(
'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)),
'add_date' => l10n('Posted %s on %s', time_since($row['date_available'], 'year'), format_date($row['date_available'], array('day', 'month', 'year'))),
'added_by' => l10n('Added by %s', $row['added_by']),
'size' => $row['width'].'&times;'.$row['height'].' pixels, '.sprintf('%.2f', $row['filesize']/1024).'MB',
'stats' => l10n('Visited %d times', $row['hit']),
@ -345,43 +323,7 @@ $template->assign(
)
);
// creation date
unset($day, $month, $year);
if (isset($_POST['date_creation_action'])
and 'set' == $_POST['date_creation_action'])
{
foreach (array('day', 'month', 'year', 'time') as $varname)
{
$$varname = $_POST['date_creation_'.$varname];
}
}
else if (isset($row['date_creation']) and !empty($row['date_creation']))
{
list($year, $month, $day) = explode('-', substr($row['date_creation'],0,10));
$time = substr($row['date_creation'],11);
}
else
{
list($year, $month, $day) = array('', 0, 0);
$time = '00:00:00';
}
$month_list = $lang['month'];
$month_list[0]='------------';
ksort($month_list);
$template->assign(
array(
'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,
)
);
// categories
$query = '
SELECT category_id, uppercats
FROM '.IMAGE_CATEGORY_TABLE.' AS ic
@ -469,14 +411,16 @@ SELECT id
INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON id = category_id
WHERE image_id = '.$_GET['image_id'].'
;';
$associate_options_selected = array_from_query($query, 'id');
$associated_albums = query2array($query, null, 'id');
$query = '
SELECT id,name,uppercats,global_rank
FROM '.CATEGORIES_TABLE.'
;';
display_select_cat_wrapper($query, $associate_options_selected, 'associate_options');
display_select_cat_wrapper($query, $represent_options_selected, 'represent_options');
$template->assign(array(
'associated_albums' => $associated_albums,
'represented_albums' => $represented_albums,
'STORAGE_ALBUM' => $storage_category_id,
'CACHE_KEYS' => get_admin_client_cache_keys(array('tags', 'categories')),
));
trigger_notify('loc_end_picture_modify');
//----------------------------------------------------------- sending html code

View file

@ -45,6 +45,12 @@ if (count($sections)<2)
}
$plugin_id = $sections[0];
if (!preg_match('/^[\w-]+$/', $plugin_id))
{
die('Invalid plugin identifier');
}
if ( !isset($pwg_loaded_plugins[$plugin_id]) )
{
die('Invalid URL - plugin '.$plugin_id.' not active');
@ -59,4 +65,4 @@ else
{
die('Missing file '.$filename);
}
?>
?>

View file

@ -77,6 +77,7 @@ if (isset($_GET['action']) and isset($_GET['plugin']))
if ($_GET['action'] == 'activate' or $_GET['action'] == 'deactivate')
{
$template->delete_compiled_templates();
$persistent_cache->purge(true);
}
redirect($base_url);
}

View file

@ -45,9 +45,9 @@ if (isset($_GET['revision']) and isset($_GET['extension']))
{
check_pwg_token();
$install_status = $plugins->extract_plugin_files('install', $_GET['revision'], $_GET['extension']);
$install_status = $plugins->extract_plugin_files('install', $_GET['revision'], $_GET['extension'], $plugin_id);
redirect($base_url.'&installstatus='.$install_status);
redirect($base_url.'&installstatus='.$install_status.'&plugin_id='.$plugin_id);
}
}
@ -57,8 +57,13 @@ if (isset($_GET['installstatus']))
switch ($_GET['installstatus'])
{
case 'ok':
$activate_url = get_root_url().'admin.php?page=plugins'
. '&amp;plugin=' . $_GET['plugin_id']
. '&amp;pwg_token=' . get_pwg_token()
. '&amp;action=activate';
$page['infos'][] = l10n('Plugin has been successfully copied');
$page['infos'][] = l10n('You might go to plugin list to install and activate it.');
$page['infos'][] = '<a href="'. $activate_url . '">' . l10n('Activate it now') . '</a>';
break;
case 'temp_path_error':

View file

@ -47,16 +47,21 @@ if
and preg_match('/^[a-z_]*$/', $_GET['page'])
)
{
$help_content =
load_language('help/'.$_GET['page'].'.html', '', array('return'=>true) );
$help_content = load_language(
'help/'.$_GET['page'].'.html',
'',
array(
'force_fallback' => 'en_UK',
'return' => true,
)
);
if ($help_content == false)
{
$help_content = '';
}
$help_content = trigger_event(
'get_popup_help_content', $help_content, $_GET['page']);
$help_content = trigger_change('get_popup_help_content', $help_content, $_GET['page']);
}
else
{

View file

@ -93,8 +93,11 @@ while ($row = pwg_db_fetch_assoc($result))
$rating = $by_user_rating_model;
$rating['uid'] = (int)$row['user_id'];
$rating['aid'] = $usr['anon'] ? $row['anonymous_id'] : '';
$rating['last_date'] = $row['date'];
$rating['last_date'] = $rating['first_date'] = $row['date'];
}
else
$rating['first_date'] = $row['date'];
$rating['rates'][$row['rate']][] = array(
'id' => $row['element_id'],
'date' => $row['date'],
@ -107,14 +110,15 @@ while ($row = pwg_db_fetch_assoc($result))
$image_urls = array();
if (count($image_ids) > 0 )
{
$query = 'SELECT id, name, file, path, representative_ext
$query = 'SELECT id, name, file, path, representative_ext, level
FROM '.IMAGES_TABLE.'
WHERE id IN ('.implode(',', array_keys($image_ids)).')';
$result = pwg_query($query);
$params = ImageStdParams::get_by_type(IMG_SQUARE);
while ($row = pwg_db_fetch_assoc($result))
{
$image_urls[ $row['id'] ] = array(
'tn' => DerivativeImage::thumb_url($row),
'tn' => DerivativeImage::url($params, $row),
'page' => make_picture_url( array('image_id'=>$row['id'], 'image_file'=>$row['file']) ),
);
}
@ -171,7 +175,7 @@ foreach($by_user_ratings as $id => &$rating)
'avg' => $s/$c,
'cv' => $s==0 ? -1 : sqrt($var)/($s/$c), // http://en.wikipedia.org/wiki/Coefficient_of_variation
'cd' => $consensus_dev,
'cdtop' => $consensus_dev_top_count ? $consensus_dev_top : ''
'cdtop' => $consensus_dev_top_count ? $consensus_dev_top : '',
);
}
unset($rating);
@ -210,7 +214,12 @@ function consensus_dev_compare($a, $b)
return ($d==0) ? 0 : ($d<0 ? -1 : 1);
}
$order_by_index=3;
function last_rate_compare($a, $b)
{
return -strcmp( $a['last_date'], $b['last_date']);
}
$order_by_index=4;
if (isset($_GET['order_by']) and is_numeric($_GET['order_by']))
{
$order_by_index = $_GET['order_by'];
@ -221,6 +230,7 @@ $available_order_by= array(
array(l10n('Number of rates'), 'count_compare'),
array(l10n('Variation'), 'cv_compare'),
array(l10n('Consensus deviation'), 'consensus_dev_compare'),
array(l10n('Last'), 'last_rate_compare'),
);
for ($i=0; $i<count($available_order_by); $i++)
@ -241,7 +251,7 @@ $template->assign( array(
'available_rates' => $conf['rate_items'],
'ratings' => $by_user_ratings,
'image_urls' => $image_urls,
'TN_WIDTH' => 28+2*ImageStdParams::get_by_type(IMG_THUMB)->sizing->ideal_size[0],
'TN_WIDTH' => ImageStdParams::get_by_type(IMG_SQUARE)->sizing->ideal_size[0],
) );
$template->set_filename('rating', 'rating_user.tpl');
$template->assign_var_from_handle('ADMIN_CONTENT', 'rating');

View file

@ -176,7 +176,7 @@ while ($row = pwg_db_fetch_assoc($result))
$plugin_links = array();
//$plugin_links is array of array composed of U_HREF, U_HINT & U_CAPTION
$plugin_links =
trigger_event('get_admins_site_links',
trigger_change('get_admins_site_links',
$plugin_links, $row['id'], $is_remote);
$tpl_var['plugin_links'] = $plugin_links;

View file

@ -76,7 +76,7 @@ SELECT id, name
$updates[] = array(
'id' => $tag_id,
'name' => addslashes($tag_name),
'url_name' => trigger_event('render_tag_url', $tag_name),
'url_name' => trigger_change('render_tag_url', $tag_name),
);
}
}
@ -133,7 +133,7 @@ SELECT id, name
TAGS_TABLE,
array(
'name' => $tag_name,
'url_name' => trigger_event('render_tag_url', $tag_name),
'url_name' => trigger_change('render_tag_url', $tag_name),
)
);
@ -218,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'], $row);
$name_of_tag[ $row['id'] ] = trigger_change('render_tag_name', $row['name'], $row);
}
$tag_ids_to_delete = array_diff(
@ -358,7 +358,7 @@ $orphan_tags = get_orphan_tags();
$orphan_tag_names = array();
foreach ($orphan_tags as $tag)
{
$orphan_tag_names[] = trigger_event('render_tag_name', $tag['name'], $tag);
$orphan_tag_names[] = trigger_change('render_tag_name', $tag['name'], $tag);
}
if (count($orphan_tag_names) > 0)
@ -393,12 +393,12 @@ $all_tags = array();
while ($tag = pwg_db_fetch_assoc($result))
{
$raw_name = $tag['name'];
$tag['name'] = trigger_event('render_tag_name', $raw_name, $tag);
$tag['name'] = trigger_change('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;filter=tag-'.$tag['id'];
$alt_names = trigger_event('get_tag_alt_names', array(), $raw_name);
$alt_names = trigger_change('get_tag_alt_names', array(), $raw_name);
$alt_names = array_diff( array_unique($alt_names), array($tag['name']) );
if (count($alt_names))
{

Binary file not shown.

Before

Width:  |  Height:  |  Size: 912 B

View file

@ -160,27 +160,23 @@ margin-top:4px; padding-bottom:3px; padding-top:3px; top: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 */
#menubar {
padding:0; width:207px; z-index:99; text-align: left;margin-top:7px;
margin-left:0;
}
#menubar ul.scroll { overflow-y:auto; max-height:500px;
/* Only IE family supports colored scrollbar */
scrollbar-face-color: #ddd; scrollbar-shadow-color: #bbb; scrollbar-highlight-color: #fff;
scrollbar-3dlight-color: #d6d6d6; scrollbar-darkshadow-color: #ccc; scrollbar-track-color: #eee;
scrollbar-arrow-color: #0cccc; }
#menubar dd { margin: 0; padding: 0;}
#menubar dl { width: 200px; border:0; margin: 0; padding: 0; display: block; min-height:35px; border:1px solid #ddd; background-color:#f1f1f1; border-left:none; border-right:1px solid #ddd;}
#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 ul.scroll { overflow-y:auto; max-height:500px; }
#menubar dl { width: 200px; min-height:35px; border:0; margin: 0; padding: 0; display: block; border:1px solid #ddd; background-color:#f1f1f1; border-left:none; }
#menubar dd { margin: 0; padding: 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;
cursor:pointer;
}
#menubar dl:first-of-type, #menubar dl:first-of-type dt { border-radius:0 6px 0 0; }
#menubar dl:last-of-type { border-radius:0 0 6px 0; }
#menubar li { margin: 0; padding-left:10px; }
#menubar li A { display:block; }
#menubar li A:hover {color:black; text-decoration:none}
@ -298,7 +294,7 @@ UL.thumbnails li.rank-of-image {background-color: #ddd;}
#batchManagerGlobal .thumbSelected {background-color:#C2F5C2 !important}
#batchManagerGlobal #selectedMessage {background-color:#C2F5C2;}
#filter_dimension_width_info, #filter_dimension_height_info, #filter_dimension_ratio_info {color:#ff7700;font-weight:bold;}
.slider-info {color:#ff7700;font-weight:bold;}
.selectedComment {background-color:#C2F5C2;}
@ -309,7 +305,7 @@ UL.thumbnails li.rank-of-image {background-color: #ddd;}
font-weight:bold;
letter-spacing:1px;
border:none;
background-color:#666666;
background-color:#666;
color:#fff;
padding:2px 5px;
-moz-border-radius:5px;
@ -325,6 +321,12 @@ UL.thumbnails li.rank-of-image {background-color: #ddd;}
text-decoration: none;
}
.buttonLike:disabled, input[type="submit"]:disabled, input[type="button"]:disabled, input[type="reset"]:disabled {
background-color:#999;
color:#eee;
cursor:not-allowed;
}
p.albumTitle img {margin-bottom:-3px;}
.groups label>p {
@ -365,3 +367,18 @@ table.dataTable thead th {
.userPropertiesContainer {border-color:#ddd;}
.userPrefs {border-color:#ddd;}
.big-progressbar {
background:#fff;
border:1px solid #aaa;
border-radius:5px;
}
.big-progressbar .progressbar {
background:#FF8A23;
background:#FF8A23 linear-gradient(135deg, rgba(255,255,255,0) 44%,rgba(255,255,255,0.2) 44%,rgba(255,255,255,0.2) 57%,rgba(255,255,255,0) 57%);
background-size:33px 25px;
box-shadow:inset 0px 1px 3px 0px rgba(255,255,255,0.4);
}
.font-checkbox [class*=icon-check]:before { color:#444; }

View file

@ -3,5 +3,6 @@ $themeconf = array(
'name' => 'clear',
'parent' => 'default',
'admin_icon_dir' => 'admin/themes/clear/icon',
'colorscheme' => 'clear',
);
?>

View file

@ -1,35 +0,0 @@
/* Issues in IE from 5 to 6 only not to be used with IE7 */
/* to avoid vanishing objects in IE6 */
H1, #theHeader {
width: 100%; /* <- useless but seems to make IE6 happy */
}
.content {
height: 1em; /* for IE6 it's like min-height */
}
/* fix quickconnect layout */
FORM#quickconnect FIELDSET {
width: 99%; /* correct an ugly 1 or 2 px misalignement with IE */
}
/* fix IE with another layout for thumbnails */
UL.thumbnails SPAN.wrap2 {
display: block;
position: relative;
text-align: left;
}
UL.thumbnails IMG.thumbnail {
position: relative;
top: -50%; /* Is this following hacking technic required ? */
/*\*//*/
margin-top: -40%;
/**/
}
UL.thumbnails INPUT {
position: absolute;
left: 2px;
top: 2px; /* same as other browsers but not so pretty */
}

View file

@ -1,11 +0,0 @@
/* fix IE7 footer */
#the_page { min-height:100%; position:relative; padding:0; margin:0; }
#menubar { margin: 0; }
#footer { left: 0; }
UL.thumbnails li.rank-of-image {
text-align:left;
}
.groups li {
display: inline;
}

View file

@ -1,24 +1,6 @@
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
@ -28,13 +10,13 @@ Font license info
Homepage: http://fortawesome.github.com/Font-Awesome/
## Entypo
## Elusive
Copyright (C) 2012 by Daniel Bruce
Copyright (C) 2013 by Aristeides Stathopoulos
Author: Daniel Bruce
License: CC BY-SA (http://creativecommons.org/licenses/by-sa/2.0/)
Homepage: http://www.entypo.com
Author: Aristeides Stathopoulos
License: SIL (http://scripts.sil.org/OFL)
Homepage: http://aristeides.com/
## Typicons
@ -42,17 +24,17 @@ Font license info
(c) Stephen Hutchings 2012
Author: Stephen Hutchings
License: CC BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/)
License: SIL (http://scripts.sil.org/OFL)
Homepage: http://typicons.com/
## Iconic
## Entypo
Copyright (C) 2012 by P.J. Onori
Copyright (C) 2012 by Daniel Bruce
Author: P.J. Onori
Author: Daniel Bruce
License: SIL (http://scripts.sil.org/OFL)
Homepage: http://somerandomdude.com/work/iconic/
Homepage: http://www.entypo.com
## MFG Labs
@ -64,3 +46,21 @@ Font license info
Homepage: http://www.mfglabs.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/
## Fontelico
Copyright (C) 2012 by Fontello project
Author: Crowdsourced, for Fontello project
License: SIL (http://scripts.sil.org/OFL)
Homepage: http://fontello.com

View file

@ -48,12 +48,36 @@
"code": 127748,
"src": "fontawesome"
},
{
"uid": "12f4ece88e46abd864e40b35e05b11cd",
"css": "ok",
"code": 59417,
"src": "fontawesome"
},
{
"uid": "43ab845088317bd348dee1d975700c48",
"css": "ok-circled",
"code": 59428,
"src": "fontawesome"
},
{
"uid": "5211af474d3a9848f67f945e2ccaf143",
"css": "cancel",
"code": 59426,
"src": "fontawesome"
},
{
"uid": "0f4cae16f34ae243a6144c18a003f2d8",
"css": "cancel-circled",
"code": 59425,
"src": "fontawesome"
},
{
"uid": "44e04715aecbca7f266a17d5a7863c68",
"css": "plus",
"code": 59427,
"src": "fontawesome"
},
{
"uid": "4ba33d2607902cf690dd45df09774cb0",
"css": "plus-circled",
@ -144,6 +168,12 @@
"code": 59197,
"src": "fontawesome"
},
{
"uid": "531bc468eecbb8867d822f1c11f1e039",
"css": "calendar",
"code": 59416,
"src": "fontawesome"
},
{
"uid": "0d20938846444af8deb1920dc85a29fb",
"css": "logout",
@ -168,6 +198,18 @@
"code": 59410,
"src": "fontawesome"
},
{
"uid": "0b2b66e526028a6972d51a6f10281b4b",
"css": "zoom-in",
"code": 59431,
"src": "fontawesome"
},
{
"uid": "d25d10efa900f529ad1d275657cfd30e",
"css": "zoom-out",
"code": 59432,
"src": "fontawesome"
},
{
"uid": "bc71f4c6e53394d5ba46b063040014f1",
"css": "cw",

View file

@ -1,62 +1,69 @@
@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-pencil:before { content: '\270e'; } /* '✎' */
.icon-plus-circled:before { content: '\2795'; } /* '' */
.icon-asl:before { content: '\e0ad'; } /* '' */
.icon-eye:before { content: '\e70a'; } /* '' */
.icon-tags:before { content: '\e70d'; } /* '' */
.icon-chat:before { content: '\e720'; } /* '' */
.icon-trash:before { content: '\e729'; } /* '' */
.icon-basket:before { content: '\e73d'; } /* '' */
.icon-puzzle:before { content: '\e7b6'; } /* '' */
.icon-language:before { content: '\e800'; } /* '' */
.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-users:before { content: '\e802'; } /* '' */
.icon-tools:before { content: '\e803'; } /* '' */
.icon-arrows-cw:before { content: '\e804'; } /* '' */
.icon-exchange:before { content: '\e805'; } /* '' */
.icon-folder-open:before { content: '\e806'; } /* '' */
.icon-brush:before { content: '\e807'; } /* '' */
.icon-flow-branch:before { content: '\e808'; } /* '' */
.icon-menu:before { content: '\e809'; } /* '' */
.icon-code:before { content: '\e80a'; } /* '' */
.icon-user-add:before { content: '\e80b'; } /* '' */
.icon-help-circled:before { content: '\e81a'; } /* '' */
.icon-info-circled-1:before { content: '\e817'; } /* '' */
.icon-cw:before { content: '\e80c'; } /* '' */
.icon-group:before { content: '\e80d'; } /* '' */
.icon-home:before { content: '\e80e'; } /* '' */
.icon-flag:before { content: '\e81c'; } /* '' */
.icon-equalizer:before { content: '\e80f'; } /* '' */
.icon-mail-1:before { content: '\e810'; } /* '' */
.icon-search:before { content: '\e811'; } /* '' */
.icon-move:before { content: '\e812'; } /* '' */
.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' */
.icon-network:before { content: '\e816'; } /* '' */
.icon-info-circled-1:before { content: '\e817'; } /* '' */
.icon-calendar:before { content: '\e818'; } /* '' */
.icon-ok:before { content: '\e819'; } /* '' */
.icon-help-circled:before { content: '\e81a'; } /* '' */
.icon-logout:before { content: '\e81b'; } /* '' */
.icon-flag:before { content: '\e81c'; } /* '' */
.icon-spin6:before { content: '\e81d'; } /* '' */
.icon-hourglass:before { content: '\e81e'; } /* '' */
.icon-check:before { content: '\e81f'; } /* '' */
.icon-check-empty:before { content: '\e820'; } /* '' */
.icon-cancel-circled:before { content: '\e821'; } /* '' */
.icon-cancel:before { content: '\e822'; } /* '' */
.icon-plus:before { content: '\e823'; } /* '' */
.icon-ok-circled:before { content: '\e824'; } /* '' */
.icon-zoom-in:before { content: '\e827'; } /* '' */
.icon-zoom-out:before { content: '\e828'; } /* '' */
.icon-tasks:before { content: '\f0ae'; } /* '' */
.icon-filter:before { content: '\f0b0'; } /* '' */
.icon-mail-alt:before { content: '\f0e0'; } /* '' */
.icon-sitemap:before { content: '\f0e8'; } /* '' */
.icon-crop:before { content: '\f125'; } /* '' */
.icon-picture:before { content: '🌄'; } /* '\1f304' */
.icon-user:before { content: '👤'; } /* '\1f464' */
.icon-shuffle:before { content: '🔀'; } /* '\1f500' */
.icon-lock:before { content: '🔒'; } /* '\1f512' */
.icon-link:before { content: '🔗'; } /* '\1f517' */
.icon-wrench:before { content: '🔧'; } /* '\1f527' */
.icon-clock:before { content: '🕔'; } /* '\1f554' */
.icon-block:before { content: '🚫'; } /* '\1f6ab' */

File diff suppressed because one or more lines are too long

View file

@ -1,60 +1,67 @@
.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-pencil { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x270e;&nbsp;'); }
.icon-plus-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x2795;&nbsp;'); }
.icon-asl { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe0ad;&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-chat { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe720;&nbsp;'); }
.icon-trash { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe729;&nbsp;'); }
.icon-basket { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe73d;&nbsp;'); }
.icon-puzzle { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe7b6;&nbsp;'); }
.icon-language { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe800;&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-users { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe802;&nbsp;'); }
.icon-tools { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe803;&nbsp;'); }
.icon-arrows-cw { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe804;&nbsp;'); }
.icon-exchange { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe805;&nbsp;'); }
.icon-folder-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe806;&nbsp;'); }
.icon-brush { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe807;&nbsp;'); }
.icon-flow-branch { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe808;&nbsp;'); }
.icon-menu { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe809;&nbsp;'); }
.icon-code { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80a;&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-cw { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80c;&nbsp;'); }
.icon-group { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80d;&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-equalizer { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80f;&nbsp;'); }
.icon-mail-1 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe810;&nbsp;'); }
.icon-search { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe811;&nbsp;'); }
.icon-move { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe812;&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;'); }
.icon-network { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe816;&nbsp;'); }
.icon-info-circled-1 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe817;&nbsp;'); }
.icon-calendar { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe818;&nbsp;'); }
.icon-ok { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe819;&nbsp;'); }
.icon-help-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81a;&nbsp;'); }
.icon-logout { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81b;&nbsp;'); }
.icon-flag { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81c;&nbsp;'); }
.icon-spin6 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81d;&nbsp;'); }
.icon-hourglass { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81e;&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-cancel-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe821;&nbsp;'); }
.icon-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe822;&nbsp;'); }
.icon-plus { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe823;&nbsp;'); }
.icon-ok-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe824;&nbsp;'); }
.icon-zoom-in { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe827;&nbsp;'); }
.icon-zoom-out { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe828;&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-mail-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e0;&nbsp;'); }
.icon-sitemap { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e8;&nbsp;'); }
.icon-crop { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf125;&nbsp;'); }
.icon-picture { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x1f304;&nbsp;'); }
.icon-user { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x1f464;&nbsp;'); }
.icon-shuffle { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x1f500;&nbsp;'); }
.icon-lock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x1f512;&nbsp;'); }
.icon-link { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x1f517;&nbsp;'); }
.icon-wrench { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x1f527;&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;'); }

View file

@ -10,62 +10,69 @@
/* 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-pencil { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x270e;&nbsp;'); }
.icon-plus-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x2795;&nbsp;'); }
.icon-asl { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe0ad;&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-chat { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe720;&nbsp;'); }
.icon-trash { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe729;&nbsp;'); }
.icon-basket { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe73d;&nbsp;'); }
.icon-puzzle { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe7b6;&nbsp;'); }
.icon-language { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe800;&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-users { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe802;&nbsp;'); }
.icon-tools { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe803;&nbsp;'); }
.icon-arrows-cw { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe804;&nbsp;'); }
.icon-exchange { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe805;&nbsp;'); }
.icon-folder-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe806;&nbsp;'); }
.icon-brush { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe807;&nbsp;'); }
.icon-flow-branch { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe808;&nbsp;'); }
.icon-menu { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe809;&nbsp;'); }
.icon-code { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80a;&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-cw { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80c;&nbsp;'); }
.icon-group { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80d;&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-equalizer { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80f;&nbsp;'); }
.icon-mail-1 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe810;&nbsp;'); }
.icon-search { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe811;&nbsp;'); }
.icon-move { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe812;&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;'); }
.icon-network { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe816;&nbsp;'); }
.icon-info-circled-1 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe817;&nbsp;'); }
.icon-calendar { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe818;&nbsp;'); }
.icon-ok { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe819;&nbsp;'); }
.icon-help-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81a;&nbsp;'); }
.icon-logout { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81b;&nbsp;'); }
.icon-flag { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81c;&nbsp;'); }
.icon-spin6 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81d;&nbsp;'); }
.icon-hourglass { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81e;&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-cancel-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe821;&nbsp;'); }
.icon-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe822;&nbsp;'); }
.icon-plus { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe823;&nbsp;'); }
.icon-ok-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe824;&nbsp;'); }
.icon-zoom-in { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe827;&nbsp;'); }
.icon-zoom-out { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe828;&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-mail-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e0;&nbsp;'); }
.icon-sitemap { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e8;&nbsp;'); }
.icon-crop { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf125;&nbsp;'); }
.icon-picture { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x1f304;&nbsp;'); }
.icon-user { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x1f464;&nbsp;'); }
.icon-shuffle { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x1f500;&nbsp;'); }
.icon-lock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x1f512;&nbsp;'); }
.icon-link { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x1f517;&nbsp;'); }
.icon-wrench { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x1f527;&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;'); }

View file

@ -2,11 +2,11 @@
@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');
src: url('../font/fontello.eot?80487531');
src: url('../font/fontello.eot?80487531#iefix') format('embedded-opentype'),
url('../font/fontello.woff?80487531') format('woff'),
url('../font/fontello.ttf?80487531') format('truetype'),
url('../font/fontello.svg?80487531#fontello') format('svg');
font-weight: normal;
font-style: normal;
}
@ -16,7 +16,7 @@
@media screen and (-webkit-min-device-pixel-ratio:0) {
@font-face {
font-family: 'fontello';
src: url('../font/fontello.svg?27476867#fontello') format('svg');
src: url('../font/fontello.svg?80487531#fontello') format('svg');
}
}
*/
@ -52,62 +52,69 @@
/* 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-pencil:before { content: '\270e'; } /* '✎' */
.icon-plus-circled:before { content: '\2795'; } /* '' */
.icon-asl:before { content: '\e0ad'; } /* '' */
.icon-eye:before { content: '\e70a'; } /* '' */
.icon-tags:before { content: '\e70d'; } /* '' */
.icon-chat:before { content: '\e720'; } /* '' */
.icon-trash:before { content: '\e729'; } /* '' */
.icon-basket:before { content: '\e73d'; } /* '' */
.icon-puzzle:before { content: '\e7b6'; } /* '' */
.icon-language:before { content: '\e800'; } /* '' */
.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-users:before { content: '\e802'; } /* '' */
.icon-tools:before { content: '\e803'; } /* '' */
.icon-arrows-cw:before { content: '\e804'; } /* '' */
.icon-exchange:before { content: '\e805'; } /* '' */
.icon-folder-open:before { content: '\e806'; } /* '' */
.icon-brush:before { content: '\e807'; } /* '' */
.icon-flow-branch:before { content: '\e808'; } /* '' */
.icon-menu:before { content: '\e809'; } /* '' */
.icon-code:before { content: '\e80a'; } /* '' */
.icon-user-add:before { content: '\e80b'; } /* '' */
.icon-help-circled:before { content: '\e81a'; } /* '' */
.icon-info-circled-1:before { content: '\e817'; } /* '' */
.icon-cw:before { content: '\e80c'; } /* '' */
.icon-group:before { content: '\e80d'; } /* '' */
.icon-home:before { content: '\e80e'; } /* '' */
.icon-flag:before { content: '\e81c'; } /* '' */
.icon-equalizer:before { content: '\e80f'; } /* '' */
.icon-mail-1:before { content: '\e810'; } /* '' */
.icon-search:before { content: '\e811'; } /* '' */
.icon-move:before { content: '\e812'; } /* '' */
.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' */
.icon-network:before { content: '\e816'; } /* '' */
.icon-info-circled-1:before { content: '\e817'; } /* '' */
.icon-calendar:before { content: '\e818'; } /* '' */
.icon-ok:before { content: '\e819'; } /* '' */
.icon-help-circled:before { content: '\e81a'; } /* '' */
.icon-logout:before { content: '\e81b'; } /* '' */
.icon-flag:before { content: '\e81c'; } /* '' */
.icon-spin6:before { content: '\e81d'; } /* '' */
.icon-hourglass:before { content: '\e81e'; } /* '' */
.icon-check:before { content: '\e81f'; } /* '' */
.icon-check-empty:before { content: '\e820'; } /* '' */
.icon-cancel-circled:before { content: '\e821'; } /* '' */
.icon-cancel:before { content: '\e822'; } /* '' */
.icon-plus:before { content: '\e823'; } /* '' */
.icon-ok-circled:before { content: '\e824'; } /* '' */
.icon-zoom-in:before { content: '\e827'; } /* '' */
.icon-zoom-out:before { content: '\e828'; } /* '' */
.icon-tasks:before { content: '\f0ae'; } /* '' */
.icon-filter:before { content: '\f0b0'; } /* '' */
.icon-mail-alt:before { content: '\f0e0'; } /* '' */
.icon-sitemap:before { content: '\f0e8'; } /* '' */
.icon-crop:before { content: '\f125'; } /* '' */
.icon-picture:before { content: '🌄'; } /* '\1f304' */
.icon-user:before { content: '👤'; } /* '\1f464' */
.icon-shuffle:before { content: '🔀'; } /* '\1f500' */
.icon-lock:before { content: '🔒'; } /* '\1f512' */
.icon-link:before { content: '🔗'; } /* '\1f517' */
.icon-wrench:before { content: '🔧'; } /* '\1f527' */
.icon-clock:before { content: '🕔'; } /* '\1f554' */
.icon-block:before { content: '🚫'; } /* '\1f6ab' */

View file

@ -1,10 +1,7 @@
<!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">/*
<head><!--[if lt IE 9]><script language="javascript" type="text/javascript" src="//html5shim.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
<meta charset="UTF-8"><style>/*
* Bootstrap v2.2.1
*
* Copyright 2012 Twitter, Inc
@ -232,10 +229,7 @@ body {
}
</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]-->
<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');
@ -261,93 +255,104 @@ body {
</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 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: 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 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>
<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: 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: 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: 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: 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>
<div class="row">
<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 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: 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 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>
<div class="row">
<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: 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: 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: 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: 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: 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: 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: 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>
<div class="row">
<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: 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: 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: 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>
<div class="row">
<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: 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 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 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>
<div class="row">
<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: 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 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: 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>
<div class="row">
<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: 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: 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: 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: 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: 0xe818" class="the-icons span3"><i class="icon-calendar"></i> <span class="i-name">icon-calendar</span><span class="i-code">0xe818</span></div>
<div title="Code: 0xe819" class="the-icons span3"><i class="icon-ok"></i> <span class="i-name">icon-ok</span><span class="i-code">0xe819</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: 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 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 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>
<div class="row">
<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 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: 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: 0xe822" class="the-icons span3"><i class="icon-cancel"></i> <span class="i-name">icon-cancel</span><span class="i-code">0xe822</span></div>
<div title="Code: 0xe823" class="the-icons span3"><i class="icon-plus"></i> <span class="i-name">icon-plus</span><span class="i-code">0xe823</span></div>
<div title="Code: 0xe824" class="the-icons span3"><i class="icon-ok-circled"></i> <span class="i-name">icon-ok-circled</span><span class="i-code">0xe824</span></div>
<div title="Code: 0xe827" class="the-icons span3"><i class="icon-zoom-in"></i> <span class="i-name">icon-zoom-in</span><span class="i-code">0xe827</span></div>
</div>
<div class="row">
<div title="Code: 0xe828" class="the-icons span3"><i class="icon-zoom-out"></i> <span class="i-name">icon-zoom-out</span><span class="i-code">0xe828</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 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: 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>
<div class="row">
<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: 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: 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: 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>
<div class="row">
<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 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: 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: 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>

View file

@ -1,70 +1,77 @@
<?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>
<metadata>Copyright (C) 2014 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" />
<glyph glyph-name="star" unicode="&#x2605;" d="m0 489q0 21 31 26l280 40 126 254q11 23 27 23t28-23l125-254 280-40q32-5 32-26 0-12-15-27l-203-197 48-279q1-4 1-12 0-11-6-19t-17-9q-10 0-22 7l-251 132-250-132q-13-7-23-7-11 0-17 9t-6 19q0 4 1 12l48 279-203 197q-14 15-14 27z" horiz-adv-x="928.6" />
<glyph glyph-name="star-empty" unicode="&#x2606;" d="m0 489q0 21 31 26l280 40 126 254q11 23 27 23t28-23l125-254 280-40q32-5 32-26 0-12-15-27l-203-197 48-279q1-4 1-12 0-28-23-28-10 0-22 7l-251 132-250-132q-13-7-23-7-11 0-17 9t-6 19q0 4 1 12l48 279-203 197q-14 15-14 27z m123-34l171-165-41-235 211 111 211-111-41 235 171 165-235 35-106 213-105-213z" horiz-adv-x="928.6" />
<glyph glyph-name="cog" unicode="&#x2699;" d="m0 289v124q0 7 5 13t10 7l104 16q8 25 22 51-23 32-60 77-6 7-6 14 0 5 5 12 15 20 55 60t53 40q7 0 15-5l77-60q24 13 50 21 9 76 17 104 3 15 20 15h124q7 0 13-4t7-12l15-103q28-9 50-21l80 60q5 5 13 5 7 0 14-5 72-67 92-95 4-5 4-13 0-6-4-12-9-12-29-38t-30-39q14-28 23-55l102-15q7-1 12-7t4-13v-124q0-7-4-13t-11-7l-104-16q-10-30-21-51 19-28 59-77 6-6 6-14t-5-12q-15-21-55-61t-53-39q-7 0-14 5l-77 60q-25-13-51-21-9-76-16-104-4-16-20-16h-124q-8 0-14 5t-6 12l-16 103q-27 9-50 20l-79-59q-6-5-14-5-8 0-14 6-70 63-92 94-4 5-4 12 0 7 5 13 8 12 28 37t30 40q-15 28-23 55l-102 15q-7 1-11 7t-5 13z m286 61q0-59 42-101t101-42 101 42 41 101-41 101-101 42-101-42-42-101z" horiz-adv-x="857.1" />
<glyph glyph-name="cog-alt" unicode="&#x26ef;" d="m0 299v103q0 6 4 11t9 6l86 14q7 19 18 42-19 27-50 64-4 6-4 11 0 7 4 12 12 16 46 49t44 33q6 0 12-4l64-50q19 10 43 18 6 60 13 86 3 13 16 13h104q6 0 11-4t6-10l13-85q19-6 41-17l66 49q5 4 11 4 7 0 12-4 81-75 81-90 0-5-4-10-7-9-24-30t-25-34q13-27 19-46l85-12q5-2 9-6t4-11v-103q0-6-4-11t-9-6l-86-14q-6-19-18-42 19-27 50-64 4-6 4-11 0-7-4-11-13-17-46-50t-44-33q-6 0-11 4l-64 50q-21-11-43-17-6-60-13-87-4-13-17-13h-104q-6 0-11 4t-5 10l-13 85q-19 6-42 18l-66-50q-4-4-11-4-6 0-12 4-80 75-80 90 0 5 4 10 5 8 23 30t26 34q-13 24-20 46l-85 13q-5 1-9 5t-4 11z m214 51q0-59 42-101t101-42 101 42 42 101-42 101-101 42-101-42-42-101z m429-325v78q0 9 83 18 7 16 17 29-29 63-29 77 0 2 3 4 2 1 19 11t33 19 17 9q4 0 25-26t29-38q12 1 17 1t17-1q28 40 51 63l4 1q2 0 69-39 2-2 2-4 0-14-28-77 9-13 16-29 83-9 83-18v-78q0-9-83-17-6-15-16-29 28-63 28-77 0-2-2-4-68-40-69-40-5 0-26 27t-29 37q-11-1-17-1t-17 1q-7-11-29-37t-25-27q-1 0-69 40-3 2-3 4 0 14 29 77-10 14-17 29-83 8-83 17z m0 572v78q0 9 83 17 7 16 17 29-29 63-29 77 0 2 3 4 2 1 19 11t33 19 17 9q4 0 25-26t29-38q12 2 17 2t17-2q28 40 51 63l4 1q2 0 69-39 2-2 2-4 0-14-28-77 9-13 16-29 83-8 83-17v-78q0-9-83-18-6-15-16-29 28-63 28-77 0-2-2-4-68-39-69-39-5 0-26 26t-29 38q-11-1-17-1t-17 1q-7-12-29-38t-25-26q-1 0-69 39-3 2-3 4 0 14 29 77-10 14-17 29-83 9-83 18z m143-533q0-29 21-50t50-21 51 21 21 50q0 29-22 51t-50 21-50-21-21-51z m0 572q0-30 21-51t50-21 51 21 21 51q0 29-22 50t-50 21-50-21-21-50z" horiz-adv-x="1071.4" />
<glyph glyph-name="mail" unicode="&#x2709;" d="m0 11v607q0 37 26 63t63 26h822q37 0 63-26t26-63v-607q0-37-26-63t-63-27h-822q-36 0-63 27t-26 63z m71 0q0-8 6-13t12-5h822q7 0 12 5t6 13v428q-18-20-39-37-149-114-238-188-28-24-46-38t-48-27-57-13h-2q-26 0-57 13t-48 27-46 38q-88 74-238 188-21 17-39 37v-428z m0 607q0-94 82-159 108-84 224-176 4-3 20-17t25-21 25-17 28-16 24-5h2q11 0 24 5t28 16 25 17 25 21 20 17q116 92 224 176 30 24 56 65t26 73v14t-1 7-1 7-3 5-5 4-8 2h-822q-7 0-12-6t-6-12z" horiz-adv-x="1000" />
<glyph glyph-name="pencil" unicode="&#x270e;" d="m0-79v233l464 464 232-232-464-465h-232z m71 143h72v-71h60l50 51-131 131-51-51v-60z m95 143q0-12 13-12 5 0 9 4l303 302q3 4 3 10 0 12-12 12-5 0-9-4l-303-302q-4-4-4-10z m334 447l93 92q20 21 50 21 29 0 51-21l131-131q20-22 20-51 0-29-20-50l-93-93z" horiz-adv-x="857.1" />
<glyph glyph-name="plus-circled" unicode="&#x2795;" d="m0 350q0 117 58 215t155 156 216 58 215-58 156-156 57-215-57-215-156-156-215-58-216 58-155 156-58 215z m179-36q0-14 10-25t25-10h143v-143q0-15 11-25t25-11h71q15 0 25 11t11 25v143h143q14 0 25 10t11 25v72q0 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-72z" horiz-adv-x="857.1" />
<glyph glyph-name="asl" unicode="&#xe0ad;" d="m1 700q-4 37 15 53t45 5 35-38l53-184q-15-29-14-64 6-30 36-204 7-52 32-82t65-29q47 0 74 37 34-39 83-37t74 41q27-37 71-41t73 27q12 16 20 32t11 37 5 33 1 40l0 38q26-10 61 24 49 45 109 78t98 8q33-24 31-59t-35-55q-61-25-104-82t-67-112-58-117-78-93q-21-18-66-18l-350 0q-84 6-105 118z m181-234q-6 45 21 65t56 8 37-48l21-209q4-41-17-63t-46-15-37 45z m155 70q2 41 32 56t62-1 36-49l8-248q0-59-28-76t-57 4-30 62z m175 4q4 43 37 55t62-7 30-52l-6-254q-5-47-34-66t-54 1-29 67z" horiz-adv-x="979" />
<glyph glyph-name="eye" unicode="&#xe70a;" d="m0 314q0 19 11 39 78 128 210 205t279 78 279-78 210-205q11-20 11-39t-11-38q-78-129-210-206t-279-77-279 77-210 206q-11 19-11 38z m71 0q75-114 187-182t242-68 242 68 187 182q-85 132-213 197 34-58 34-125 0-104-73-177t-177-73-177 73-73 177q0 67 34 125-128-65-213-197z m259 72q0-11 8-19t19-8 19 8 8 19q0 48 34 82t82 34q11 0 19 8t8 19-8 19-19 7q-70 0-120-50t-50-119z" horiz-adv-x="1000" />
<glyph glyph-name="tags" unicode="&#xe70d;" d="m0 475v232q0 29 21 50t50 22h233q29 0 65-15t57-36l399-399q20-21 20-50 0-30-20-51l-274-274q-22-21-51-21-30 0-50 21l-399 399q-21 21-36 57t-15 65z m107 125q0-30 21-50t51-21 50 21 21 50-21 51-50 20-51-20-21-51z m286 179h125q29 0 65-15t57-36l399-399q21-21 21-50 0-30-21-51l-274-274q-22-21-51-21-20 0-33 8t-29 25l262 262q21 21 21 51 0 29-21 50l-399 399q-21 21-57 36t-65 15z" horiz-adv-x="1071.4" />
<glyph glyph-name="chat" unicode="&#xe720;" d="m0 421q0 78 53 144t143 104 197 38 197-38 143-104 53-144-53-143-143-104-197-38q-48 0-98 9-70-50-155-72-21-5-48-9h-2q-6 0-12 5t-6 11q-1 2-1 4t1 4 1 3l1 3t2 3 2 3 3 2 2 3q3 3 13 14t15 16 12 17 14 21 11 25q-69 40-108 98t-40 125z m344-354q32-3 49-3 90 0 172 25t148 72q69 52 107 119t37 141q0 43-13 85 72-39 114-99t42-128q0-67-40-126t-108-98q5-14 11-25t14-21 13-16 14-17 13-14q0 0 2-2t3-3 2-3 2-3l1-3t1-3 1-4-1-3q-2-8-7-13t-13-4q-27 4-48 9-85 23-155 72-50-9-98-9-151 0-263 74z" horiz-adv-x="1000" />
<glyph glyph-name="trash" unicode="&#xe729;" d="m0 582v36q0 8 5 13t13 5h172l39 93q9 21 31 35t44 15h178q22 0 44-15t30-35l39-93h173q8 0 13-5t5-13v-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 13z m143-547q0-12 4-22t8-15 6-5h464q2 0 6 5t8 15 4 22v529h-500v-529z m71 83v321q0 8 5 13t13 5h36q8 0 13-5t5-13v-321q0-8-5-13t-13-5h-36q-8 0-13 5t-5 13z m54 518h250l-27 65q-4 5-9 6h-177q-6-1-10-6z m89-518v321q0 8 5 13t13 5h36q8 0 13-5t5-13v-321q0-8-5-13t-13-5h-36q-8 0-13 5t-5 13z m143 0v321q0 8 5 13t13 5h36q7 0 12-5t5-13v-321q0-8-5-13t-12-5h-36q-8 0-13 5t-5 13z" horiz-adv-x="785.7" />
<glyph glyph-name="basket" unicode="&#xe73d;" d="m0 671q0 15 11 26t25 10h143q9 0 16-3t11-9 7-14 4-15 3-16 3-14h670q14 0 25-11t11-25v-286q0-13-9-24t-23-12l-583-68q1-3 3-12t3-14 1-13q0-9-13-35h513q15 0 26-11t10-25-10-25-26-11h-571q-14 0-25 11t-11 25q0 8 6 22t17 33 11 21l-98 460h-114q-15 0-25 10t-11 25z m214-678q0 29 21 50t51 21 50-21 21-50-21-51-50-21-51 21-21 51z m500 0q0 29 21 50t51 21 50-21 21-50-21-51-50-21-51 21-21 51z" horiz-adv-x="928.6" />
<glyph glyph-name="puzzle" unicode="&#xe7b6;" d="m586 402q-37 0-64-34t-27-82 27-84 64-34q22 0 43 13 26 17 37 11t12-24l0-144q0-31-24-54t-55-23l-143 0q-16 0-23 9t2 31q21 25 21 51 0 38-34 64t-83 26-83-26-35-64q0-22 13-44 17-26 12-37t-25-10l-143 0q-33 0-55 23t-23 54l0 144q0 16 9 23t31-3q24-20 51-20 38 0 65 34t27 84-27 82-65 34q-21 0-42-13-26-17-38-12t-11 25l0 91q0 33 23 56t55 23l143 0q19 0 25 10t-11 37q-14 20-14 44 0 38 35 64t83 26 83-26 34-64q0-26-21-51-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="language" unicode="&#xe800;" d="m988 306q30-82-10-176t-134-160q-10 0-12 2t-16 19-16 19q-2 6 2 10 86 60 117 152t-11 148q-16-38-39-76t-59-80-86-65-106-15q-52 6-84 41t-32 93q0 84 60 148 50 50 114 66l-2 100q-140-24-146-24-6-2-10 4 0 2-5 29t-5 31q-2 2 1 4t7 2l156 28q0 110-2 114 0 8 8 8 46 0 52 2 10 0 10-8l0-104q158 22 164 22 8 4 10-6 0-2 4-23t4-25q4-10-4-12l-176-30 0-102 12 0q86 0 148-36t86-100z m-370-160q28-6 62 6l-4 214q-34-12-60-40-44-44-44-108 0-66 46-72z m122 28q28 24 58 68t45 79 7 41q-36 18-96 18-2 0-6-1t-6-1z m-448 382q10-28 53-165t83-261 40-126q0-4-4-4l-86 0q-6 0-6 4l-50 166-176 0q-48-164-50-166 0-4-6-4l-86 0q-4 0-4 4 10 18 176 552 2 8 10 8l96 0q10 0 10-8z m-130-316l144 0-72 264z" horiz-adv-x="1001" />
<glyph glyph-name="signal" unicode="&#xe801;" d="m0-61v107q0 8 5 13t13 5h107q8 0 13-5t5-13v-107q0-8-5-13t-13-5h-107q-8 0-13 5t-5 13z m214 0v179q0 8 5 13t13 5h107q8 0 13-5t5-13v-179q0-8-5-13t-13-5h-107q-8 0-13 5t-5 13z m215 0v322q0 8 5 13t12 5h108q7 0 12-5t5-13v-322q0-8-5-13t-12-5h-108q-7 0-12 5t-5 13z m214 0v536q0 8 5 13t13 5h107q8 0 13-5t5-13v-536q0-8-5-13t-13-5h-107q-8 0-13 5t-5 13z m214 0v822q0 8 5 13t13 5h107q8 0 13-5t5-13v-822q0-8-5-13t-13-5h-107q-8 0-13 5t-5 13z" horiz-adv-x="1000" />
<glyph glyph-name="users" unicode="&#xe802;" d="m0 49q20 7 60 22t69 26 50 22q37 19 57 56t21 76q0 27-31 64-19 21-33 60-45 18-45 76 0 43 14 61-5 39-9 82-5 55 26 108t84 84 110 32q43 0 85-19t73-50 48-72 14-83q-4-55-8-82 14-19 14-61 0-58-45-76-15-41-32-60-32-37-32-64 0-39 20-76t58-56q29-15 92-38t113-43 66-38q18-17 28-47t10-51l1-21h-878v168z m705 299q0 34 12 50-5 32-7 67-4 45 21 89t69 72 90 27 89-27 69-72 22-89q-2-35-8-67 12-16 12-50 0-48-36-62-12-33-27-50-9-10-13-16t-9-16-4-20q0-32 17-62t47-46q17-9 42-19t60-22 50-19v-135h-254q0 4 0 11t-3 26-7 36-15 38-23 33q-23 25-53 44t-79 37q27 34 27 78 0 10-5 20t-8 16-12 16q-14 15-27 49-37 16-37 63z" horiz-adv-x="1201.2" />
<glyph glyph-name="tools" unicode="&#xe803;" d="m155 506q-8-8-11-22t-3-25-2-11q-2-2-17-15t-19-17q-16-14-28 4l-70 76q-11 12 2 24 2 2 18 14t20 16q6 6 27 6t37 14q14 14 18 38t10 30q2 0 9 7t26 22 41 31q134 90 186 96 122 0 148-2 12 0-8-8-120-52-152-76-80-56-36-114 34-46 38-48 8-8-2-14-2-2-38-35t-38-35q-14-8-18-4-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-166-50-88-154-62-56 12-100-32l-82-78-68 78 68 70q24 24 31 53t6 65 5 58q12 56 140 112 12 6 18-3t2-15q-12-12-46-80-14-10-12-35t40-53q58-40 96 22 6 12 26 41t22 33q4 10 13 9t11-17z m-858-684l254 248 76-86-246-242q-20-20-38-4l-46 46q-22 18 0 38z" horiz-adv-x="1000" />
<glyph glyph-name="arrows-cw" unicode="&#xe804;" d="m0-7v250q0 14 11 25t25 11h250q14 0 25-11t10-25-10-25l-77-77q40-37 90-57t105-20q74 0 139 37t104 99q6 10 29 66 5 13 17 13h107q8 0 13-6t5-12q0-3 0-4-36-150-150-243t-267-93q-81 0-157 31t-136 88l-72-72q-11-11-25-11t-25 11-11 25z m10 446v4q36 150 151 243t268 93q81 0 158-31t137-88l72 72q11 11 25 11t26-11 10-25v-250q0-14-10-25t-26-11h-250q-14 0-25 11t-10 25 10 25l77 77q-82 77-194 77-75 0-140-37t-104-99q-6-10-29-66-5-13-17-13h-111q-7 0-13 6t-5 12z" horiz-adv-x="857.1" />
<glyph glyph-name="exchange" unicode="&#xe805;" d="m0 136q0 8 5 13l179 178q5 5 12 5 8 0 13-5t5-13v-107h768q7 0 13-5t5-13v-107q0-7-5-12t-13-6h-768v-107q0-7-5-12t-13-6q-6 0-13 6l-178 178q-5 5-5 13z m0 303v107q0 8 5 13t13 5h768v107q0 8 5 13t13 5q6 0 13-5l178-178q5-5 5-13t-5-13l-179-179q-5-5-12-5-8 0-13 6t-5 12v107h-768q-7 0-13 6t-5 12z" horiz-adv-x="1000" />
<glyph glyph-name="folder-open" unicode="&#xe806;" d="m0 118v536q0 51 37 88t88 37h179q51 0 88-37t37-88v-18h303q51 0 88-37t37-88v-90h-464q-53 0-110-26t-92-67l-188-221-2-3q0 2-1 7t0 7z m41-94q0 17 17 37l188 221q24 28 67 48t80 20h607q19 0 34-7t15-24q0-18-18-37l-187-221q-24-28-67-48t-81-20h-607q-19 0-33 7t-15 24z" horiz-adv-x="1071.4" />
<glyph glyph-name="brush" unicode="&#xe807;" d="m118 170q38 34 85 29t87-45q42-40 48-87t-30-83q-86-84-228-102-84-12-80 14 0 4 6 10 52 60 64 145t48 119z m840 646q26-26-148-248t-292-338q-38-38-124-104-8-6-16 8-18 34-48 64-32 32-66 48-16 6-8 16 64 84 104 122 118 116 344 287t254 145z" horiz-adv-x="962" />
<glyph glyph-name="flow-branch" unicode="&#xe808;" d="m640 650q0-80-74-110-6-58-28-101t-61-69-68-38-75-26q-42-14-63-22t-47-24-38-40-16-60q70-30 70-110 0-50-35-85t-85-35-85 35-35 85q0 78 72 112l0 378q-72 34-72 110 0 50 35 85t85 35 85-35 35-85q0-76-72-110l0-204q40 30 138 60 58 18 84 29t51 41 29 76q-70 32-70 108 0 50 35 85t85 35 85-35 35-85z m-588 0q0-28 20-48t48-20 49 20 21 48q0 30-21 50t-49 20-48-20-20-50z m68-668q28 0 49 20t21 48q0 30-21 50t-49 20-48-20-20-50q0-28 20-48t48-20z m400 600q28 0 49 20t21 48q0 30-21 50t-49 20-48-20-20-50q0-28 20-48t48-20z" horiz-adv-x="640" />
<glyph glyph-name="menu" unicode="&#xe809;" d="m0 29v71q0 15 11 25t25 11h785q15 0 26-11t10-25v-71q0-15-10-26t-26-10h-785q-15 0-25 10t-11 26z m0 285v72q0 14 11 25t25 10h785q15 0 26-10t10-25v-72q0-14-10-25t-26-10h-785q-15 0-25 10t-11 25z m0 286v71q0 15 11 26t25 10h785q15 0 26-10t10-26v-71q0-15-10-25t-26-11h-785q-15 0-25 11t-11 25z" horiz-adv-x="857.1" />
<glyph glyph-name="code" unicode="&#xe80a;" d="m25 314q0 8 6 13l260 260q5 6 13 6t12-6l28-28q6-5 6-13t-6-12l-219-220 219-219q6-6 6-13t-6-13l-28-28q-5-5-12-5t-13 5l-260 260q-6 6-6 13z m372-350l208 720q3 8 9 11t13 2l35-10q7-2 11-9t1-13l-208-721q-2-7-9-11t-13-1l-34 9q-8 3-11 9t-2 14z m325 118q0 7 5 13l219 219-219 220q-5 5-5 12t5 13l28 28q6 6 13 6t13-6l260-260q5-5 5-13t-5-13l-260-260q-6-5-13-5t-13 5l-28 28q-5 6-5 13z" horiz-adv-x="1071.4" />
<glyph glyph-name="user-add" unicode="&#xe80b;" d="m620 128q180-64 180-122l0-106-800 0 0 202q36 14 82 26 94 34 129 69t35 95q0 22-23 48t-31 74q-2 12-23 25t-25 61q0 16 5 26t9 12l4 4q-8 50-12 88-6 54 40 112t160 58 160-58 42-112l-14-88q18-8 18-42-2-28-9-43t-14-17-14-8-9-18q-10-46-33-73t-23-49q0-60 36-95t130-69z m230 272l150 0 0-100-150 0 0-150-100 0 0 150-150 0 0 100 150 0 0 150 100 0 0-150z" horiz-adv-x="1000" />
<glyph glyph-name="cw" unicode="&#xe80c;" d="m0 350q0 87 34 166t92 137 136 92 167 34q82 0 158-31t137-88l72 72q16 18 39 8 22-9 22-33v-250q0-14-10-25t-26-11h-250q-23 0-32 23-10 22 7 38l77 77q-82 77-194 77-58 0-111-23t-91-61-62-91-22-111 22-111 62-91 91-61 111-23q66 0 125 29t100 82q4 6 13 7 8 0 14-5l76-77q5-4 6-11t-5-13q-60-74-147-114t-182-41q-87 0-167 34t-136 92-92 137-34 166z" horiz-adv-x="857.1" />
<glyph glyph-name="group" unicode="&#xe80d;" d="m0 106l0 134q0 26 18 32l171 80q-66 39-68 131 0 56 35 103 37 41 90 43 31 0 63-19-49-125 23-237-12-11-25-19l-114-55q-48-23-52-84l0-143-114 0q-25 0-27 34z m193-59l0 168q0 27 22 37l152 70 57 28q-37 23-60 66t-22 94q0 76 46 130t110 54 109-54 45-130q0-106-78-158l61-30 146-70q24-10 24-37l0-168q-2-37-37-41l-541 0q-14 2-24 14t-10 27z m473 330q68 106 22 231 31 19 66 21 49 0 90-43 35-41 35-103 0-82-65-131l168-80q18-10 18-32l0-134q0-32-27-34l-118 0 0 143q0 57-50 84l-110 53q-15 8-29 25z" horiz-adv-x="1000" />
<glyph glyph-name="home" unicode="&#xe80e;" d="m888 336q16-16 11-27t-27-11l-84 0 0-310q0-14-1-21t-8-13-23-6l-204 0 0 310-204 0 0-310-194 0q-28 0-35 10t-7 30l0 310-84 0q-22 0-27 11t11 27l400 402q16 16 38 16t38-16z" horiz-adv-x="900" />
<glyph glyph-name="equalizer" unicode="&#xe80f;" d="m576 239l0-112-55 0 0-167q0-23-17-40t-39-17-39 17-17 40l0 167-56 0 0 112 56 0 0 503q0 24 17 39t38 16q24 0 41-16t16-39l0-503 55 0z m335 335l0-112-55 0 0-502q0-23-16-40t-41-17q-23 0-39 17t-16 40l0 502-56 0 0 112 56 0 0 168q0 24 16 39t39 16 41-16 16-39l0-168 55 0z m-670-112l0-111-55 0 0-391q0-23-16-40t-40-17q-23 0-39 17t-17 40l0 391-56 0 0 111 56 0 0 280q0 24 16 39t40 16 40-16 16-39l0-280 55 0z" horiz-adv-x="928" />
<glyph glyph-name="mail-1" unicode="&#xe810;" d="m467 366l-449 210 0 109 893 0 0-109z m0-123l444 210 0-437-893 0 0 438z" horiz-adv-x="928" />
<glyph glyph-name="search" unicode="&#xe811;" d="m772 78q30-34 6-62l-46-46q-36-32-68 0l-190 190q-74-42-156-42-128 0-223 95t-95 223 90 219 218 91 224-95 96-223q0-88-46-162z m-678 358q0-88 68-156t156-68 151 63 63 153q0 88-68 155t-156 67-151-63-63-151z" horiz-adv-x="789" />
<glyph glyph-name="move" unicode="&#xe812;" d="m0 350q0 15 11 25l143 143q10 11 25 11t25-11 10-25v-72h215v215h-72q-14 0-25 10t-11 25 11 26l143 142q11 11 25 11t25-11l143-142q11-11 11-26t-11-25-25-10h-72v-215h215v72q0 14 10 25t25 11 26-11l142-143q11-10 11-25t-11-25l-142-143q-11-11-26-11t-25 11-10 25v72h-215v-215h72q14 0 25-10t11-25-11-26l-143-142q-10-11-25-11t-25 11l-143 142q-11 11-11 26t11 25 25 10h72v215h-215v-72q0-14-10-25t-25-11-26 11l-142 143q-11 11-11 25z" horiz-adv-x="1000" />
<glyph glyph-name="upload" unicode="&#xe813;" d="m500 776l260-244-164 0 0-256-190 0 0 256-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 108 98 0-170-130 178 0q8 0 12-8l40-110 300 0 40 110q8 8 12 8l178 0-170 130 98 0z" horiz-adv-x="1000" />
<glyph glyph-name="upload-cloud" unicode="&#xe814;" d="m760 494q100 0 170-68t70-166-70-166-170-68l-190 0 0 190 106 0-176 230-174-230 104 0 0-190-248 0q-74 0-128 52t-54 124q0 74 53 126t129 52q14 0 20-2-2 12-2 38 0 108 78 184t188 76q90 0 160-52t94-134q28 4 40 4z" horiz-adv-x="1000" />
<glyph glyph-name="key" unicode="&#xe815;" d="m774 612q20-116-28-215t-150-117q-66-12-130-2l-118-194-70-12-104-166q-14-28-46-32l-76-14q-12-4-22 4t-12 22l-16 98q-8 30 12 56l258 386q-24 50-38 120-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-20 5-16 13-17 18-15 22-16 23-17q6-4 22-16t23-16 19-12 19-8 17 1 18 8 16 19z" horiz-adv-x="780" />
<glyph glyph-name="network" unicode="&#xe816;" d="m224 504q-22 0-42-10-48 52-92 128 54 74 128 118 92-38 152-82-6-16-6-32 0-6 4-22-62-48-116-104-16 4-28 4z m-98-98q0-34 20-60-60-114-80-232-66 106-66 236 0 110 50 206 38-62 84-112-8-24-8-38z m336 318q-28 0-50-14-58 42-114 70 84 30 162 30 120 0 230-62-76-14-162-50-26 26-66 26z m146-460q-160 24-290 112 4 20 4 30 0 24-14 52 38 44 98 90 26-20 56-20 14 0 38 8 94-108 134-240-16-14-26-32z m128-132q38 14 54 60 58 4 108 18-46-146-166-232 6 48 6 98 0 10-1 28t-1 28z m-150 66q-190-96-304-272-90 36-158 110 12 144 80 274 6-2 20-2 30 0 52 14 142-98 310-124z m184 492q150-136 150-340 0-22-4-66-64-18-130-24-24 56-88 60-48 146-148 264 10 20 10 42l0 10q100 42 210 54z m-136-544q14-10 32-18 2-18 2-52 0-80-14-144-86-42-194-42-58 0-112 12 110 160 286 244z" 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-36-14 0-4 38l42 160q26 96-22 96-30 0-89-29t-115-75l16-26q52 34 74 34 12 0 0-34l-36-152q-26-104 34-104z" horiz-adv-x="920" />
<glyph glyph-name="calendar" unicode="&#xe818;" d="m0-79v715q0 29 21 50t50 21h72v54q0 36 26 63t63 26h36q37 0 63-26t26-63v-54h214v54q0 36 27 63t63 26h35q37 0 63-26t27-63v-54h71q29 0 50-21t22-50v-715q0-29-22-50t-50-21h-786q-29 0-50 21t-21 50z m71 0h161v161h-161v-161z m0 197h161v178h-161v-178z m0 214h161v161h-161v-161z m143 268q0-7 6-13t12-5h36q7 0 12 5t6 13v161q0 7-6 12t-12 6h-36q-7 0-12-6t-6-12v-161z m54-679h178v161h-178v-161z m0 197h178v178h-178v-178z m0 214h178v161h-178v-161z m214-411h179v161h-179v-161z m0 197h179v178h-179v-178z m0 214h179v161h-179v-161z m161 268q0-7 5-13t13-5h35q8 0 13 5t5 13v161q0 7-5 12t-13 6h-35q-8 0-13-6t-5-12v-161z m53-679h161v161h-161v-161z m0 197h161v178h-161v-178z m0 214h161v161h-161v-161z" horiz-adv-x="928.6" />
<glyph glyph-name="ok" unicode="&#xe819;" d="m68 332q0 22 15 38l76 76q16 16 38 16t38-16l164-165 366 367q16 16 38 16t38-16l76-76q15-16 15-38t-15-38l-404-404-76-76q-16-15-38-15t-38 15l-76 76-202 202q-15 16-15 38z" 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 78 0 78-54 116-52 38-134 38-64 0-104-26-68-42-72-146l0-4 110 0 0 4q0 26 16 54 16 24 54 24 40 0 52-20 16-20 16-44 0-18-16-40-8-12-20-20l-6-4q-6-4-16-11t-20-15-21-17-17-17q-14-20-18-78l0-8 108 0 0 4q0 12 4 28 6 20 28 36l28 18q46 34 56 50z" horiz-adv-x="920" />
<glyph glyph-name="logout" unicode="&#xe81b;" d="m0 154v392q0 67 47 114t114 47h178q8 0 13-5t5-13q0-2 1-11t0-15-2-13-5-11-12-3h-178q-37 0-63-27t-27-63v-392q0-37 27-63t63-27h174t6 0 7-2 4-3 4-5 1-8q0-2 1-11t0-14-2-14-5-11-12-3h-178q-67 0-114 47t-47 114z m214 89v214q0 15 11 25t25 11h250v161q0 14 11 25t25 10 25-10l303-304q11-10 11-25t-11-25l-303-304q-11-10-25-10t-25 10-11 25v161h-250q-14 0-25 11t-11 25z" horiz-adv-x="928.6" />
<glyph glyph-name="flag" unicode="&#xe81c;" d="m874 616q14 6 22-1t0-19q-96-138-164-213t-110-90-73-2-60 37-63 40-93-4-139-86l90-352-100 0-184 720 92 34q90 66 152 86t98 3 64-51 62-71 79-62 129-20 198 51z" horiz-adv-x="900" />
<glyph glyph-name="spin6" unicode="&#xe81d;" d="m855 9c-189-190-520-172-705 13-190 190-200 494-28 695 11 13 21 26 35 34 36 23 85 18 117-13 30-31 35-76 16-112-5-9-9-15-16-22-140-151-145-379-8-516 153-153 407-121 542 34 106 122 142 297 77 451-83 198-305 291-510 222l0 1c236 82 492-24 588-252 71-167 37-355-72-493-11-15-23-29-36-42z" horiz-adv-x="1000" />
<glyph glyph-name="hourglass" unicode="&#xe81e;" d="m560 622q0-44-48-96t-97-99-49-77 49-76 97-97 48-97l0-118q0-34-86-73t-194-39-194 39-86 73l0 118q0 46 48 97t97 97 49 76-49 77-97 99-48 96l0 118q0 32 87 71t193 39 193-39 87-71l0-118z m-482 112l-18-14q-4-8 4-14 92-52 216-52 132 0 220 50 14 10-16 30-96 54-202 54-120 0-204-54z m228-384q0 18 4 33t18 33 20 25 31 31 29 28q92 92 92 122l2 50q-100-54-222-54t-222 54l4-50q0-32 90-122 6-6 22-21t23-22l19-19t17-21 11-20 9-23 3-24q0-10-1-19t-6-18-8-16-11-17l-12-15t-15-16-16-15-18-16-17-16q-90-90-90-122l0-66q8 4 66 23t92 43 34 58q0 30 26 30t26-30q0-34 33-58t94-43 67-23l0 66q0 30-92 122-4 4-21 20t-22 21-18 19-18 22-12 20-9 23-2 23z" horiz-adv-x="560" />
<glyph glyph-name="check" unicode="&#xe81f;" d="m0 154v464q0 66 47 113t114 48h464q35 0 65-14 9-4 10-13 2-10-5-16l-27-28q-6-5-13-5-2 0-5 1-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 6 3 0 7-2 11-4 11-16v-177q0-67-47-114t-114-47h-464q-67 0-114 47t-47 114z m143 267q0 19 14 32l61 62q14 13 32 13t32-13l147-147 361 361q13 13 31 13t32-13l62-61q13-14 13-32t-13-32l-455-454q-13-14-31-14t-32 14l-240 240q-14 13-14 31z" horiz-adv-x="928.6" />
<glyph glyph-name="check-empty" unicode="&#xe820;" d="m0 154v464q0 66 47 113t114 48h464q66 0 114-48t47-113v-464q0-67-47-114t-114-47h-464q-67 0-114 47t-47 114z m71 0q0-37 27-63t63-27h464q37 0 63 27t26 63v464q0 37-26 63t-63 26h-464q-37 0-63-26t-27-63v-464z" horiz-adv-x="785.7" />
<glyph glyph-name="cancel-circled" unicode="&#xe821;" d="m0 350q0 117 58 215t155 156 216 58 215-58 156-156 57-215-57-215-156-156-215-58-216 58-155 156-58 215z m216-126q0-15 11-26l50-50q10-11 25-11 15 0 26 11l101 101 101-101q10-11 25-11 15 0 25 11l51 50q10 11 10 26 0 14-10 25l-101 101 101 101q10 11 10 25 0 15-10 26l-51 50q-10 11-25 11-15 0-25-11l-101-101-101 101q-11 11-26 11-15 0-25-11l-50-50q-11-11-11-26 0-14 11-25l101-101-101-101q-11-11-11-25z" horiz-adv-x="857.1" />
<glyph glyph-name="cancel" unicode="&#xe822;" d="m61 112q0 23 16 38l164 164-164 164q-16 16-16 38t16 38l76 76q16 16 38 16t38-16l164-164 164 164q16 16 38 16t38-16l76-76q15-15 15-38t-15-38l-164-164 164-164q15-15 15-38t-15-38l-76-76q-16-15-38-15t-38 15l-164 164-164-164q-16-15-38-15t-38 15l-76 76q-16 16-16 38z" horiz-adv-x="785.7" />
<glyph glyph-name="plus" unicode="&#xe823;" d="m0 332v107q0 23 16 38t38 16h232v232q0 22 15 38t38 16h107q23 0 38-16t16-38v-232h232q22 0 38-16t16-38v-107q0-22-16-38t-38-16h-232v-232q0-22-16-38t-38-15h-107q-22 0-38 15t-15 38v232h-232q-23 0-38 16t-16 38z" horiz-adv-x="785.7" />
<glyph glyph-name="ok-circled" unicode="&#xe824;" d="m0 350q0 117 58 215t155 156 216 58 215-58 156-156 57-215-57-215-156-156-215-58-216 58-155 156-58 215z m141-11q0-15 10-25l202-202q10-10 25-10 15 0 25 10l303 303q11 10 11 25 0 16-11 26l-50 50q-11 11-25 11t-26-11l-227-227-126 126q-11 11-25 11t-26-11l-50-50q-10-10-10-26z" horiz-adv-x="857.1" />
<glyph glyph-name="zoom-in" unicode="&#xe827;" d="m0 386q0 80 31 152t84 126 125 84 153 31 152-31 126-84 84-126 31-152q0-123-69-223l191-191q21-21 21-51t-21-50-51-21q-30 0-50 21l-191 191q-100-69-223-69-80 0-153 31t-125 83-84 126-31 153z m143 0q0-103 73-177t177-73 176 73 74 177-74 176-176 74-177-74-73-176z m71-18v36q0 7 6 12t12 5h125v125q0 8 5 13t13 5h36q7 0 12-5t6-13v-125h125q7 0 12-5t5-12v-36q0-7-5-13t-12-5h-125v-125q0-7-6-13t-12-5h-36q-7 0-13 5t-5 13v125h-125q-7 0-12 5t-6 13z" horiz-adv-x="928.6" />
<glyph glyph-name="zoom-out" unicode="&#xe828;" d="m0 386q0 80 31 152t84 126 125 84 153 31 152-31 126-84 84-126 31-152q0-123-69-223l191-191q21-21 21-51t-21-50-51-21q-30 0-50 21l-191 191q-100-69-223-69-80 0-153 31t-125 83-84 126-31 153z m143 0q0-103 73-177t177-73 176 73 74 177-74 176-176 74-177-74-73-176z m71-18v36q0 7 6 12t12 5h322q7 0 12-5t5-12v-36q0-7-5-13t-12-5h-322q-7 0-12 5t-6 13z" horiz-adv-x="928.6" />
<glyph glyph-name="tasks" unicode="&#xf0ae;" d="m0 29v142q0 15 11 26t25 10h928q15 0 25-10t11-26v-142q0-15-11-26t-25-10h-928q-15 0-25 10t-11 26z m0 285v143q0 15 11 25t25 11h928q15 0 25-11t11-25v-143q0-14-11-25t-25-10h-928q-15 0-25 10t-11 25z m0 286v143q0 14 11 25t25 11h928q15 0 25-11t11-25v-143q0-15-11-25t-25-11h-928q-15 0-25 11t-11 25z m357-250h572v71h-572v-71z m214-286h358v72h-358v-72z m143 572h215v71h-215v-71z" horiz-adv-x="1000" />
<glyph glyph-name="filter" unicode="&#xf0b0;" d="m3 685q9 22 33 22h714q23 0 33-22 9-23-8-39l-275-275v-414q0-23-22-33-7-3-14-3-15 0-25 11l-143 143q-10 10-10 25v271l-275 275q-18 16-8 39z" horiz-adv-x="785.7" />
<glyph glyph-name="mail-alt" unicode="&#xf0e0;" d="m0 11v443q25-28 56-49 202-137 278-192 32-24 51-37t53-27 61-13h2q28 0 61 13t53 27 51 37q95 68 278 192 32 22 56 49v-443q0-37-26-63t-63-27h-822q-36 0-63 27t-26 63z m0 595q0 43 23 72t66 29h822q36 0 62-26t27-63q0-44-27-84t-68-69q-210-146-262-181-5-4-23-17t-30-22-29-18-33-15-27-5h-2q-12 0-27 5t-33 15-29 18-30 22-23 17q-51 35-147 101t-114 80q-35 23-65 64t-31 77z" horiz-adv-x="1000" />
<glyph glyph-name="sitemap" unicode="&#xf0e8;" d="m0-25v179q0 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-38v-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 38z" horiz-adv-x="1000" />
<glyph glyph-name="crop" unicode="&#xf125;" d="m0 511v107q0 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-13v-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 13z m286-350l332 332h-332v-332z m25-25h332v332z" horiz-adv-x="928.6" />
<glyph glyph-name="picture" unicode="&#x1f304;" d="m0 11v678q0 37 26 63t63 27h893q37 0 63-27t26-63v-678q0-37-26-63t-63-27h-893q-36 0-63 27t-26 63z m71 0q0-8 6-13t12-5h893q7 0 13 5t5 13v678q0 8-5 13t-13 5h-893q-7 0-12-5t-6-13v-678z m72 53v107l178 179 90-89 285 285 233-232v-250h-786z m0 465q0 44 31 75t76 32 76-32 31-75-31-76-76-32-76 32-31 76z" horiz-adv-x="1071.4" />
<glyph glyph-name="user" unicode="&#x1f464;" d="m0 66q0 30 2 58t8 61 15 60 24 55 34 45 48 30 62 11q5 0 24-12t41-27 60-27 75-12 74 12 61 27 41 27 24 12q34 0 62-11t48-30 34-45 24-55 15-60 8-61 2-58q0-67-41-106t-108-39h-488q-67 0-108 39t-41 106z m179 498q0 89 62 152t152 63 151-63 63-152-63-151-151-63-152 63-62 151z" horiz-adv-x="785.7" />
<glyph glyph-name="shuffle" unicode="&#x1f500;" d="m0 82v107q0 8 5 13t13 5h125q27 0 48 9t39 25 28 34 26 43q17 35 43 96 16 36 28 62t30 58 36 56 41 46 50 38 59 24 72 9h143v107q0 8 5 13t13 5q6 0 13-5l178-178q5-5 5-13t-5-13l-179-179q-5-5-12-5-8 0-13 6t-5 12v107h-143q-27 0-49-8t-38-25-29-35-25-43q-18-34-43-95-16-37-28-62t-30-59-36-55-41-47-50-38-60-23-71-10h-125q-8 0-13 5t-5 13z m0 500v107q0 8 5 13t13 5h125q139 0 229-125-34-52-77-153-12 25-20 41t-23 35-28 32-36 19-45 8h-125q-8 0-13 5t-5 13z m415-392q33 52 76 152 12-25 20-40t23-36 28-31 35-20 46-8h143v107q0 8 5 13t13 5q6 0 13-5l178-178q5-5 5-13t-5-13l-179-179q-5-5-12-5-8 0-13 6t-5 12v107q-18 0-48 0t-45-1-41 1-39 3-36 6-35 10-32 16-33 22-31 30-31 39z" horiz-adv-x="1000" />
<glyph glyph-name="lock" unicode="&#x1f512;" d="m0 46v322q0 22 16 38t38 15h17v108q0 102 74 176t176 74 177-74 73-176v-108h18q23 0 38-15t16-38v-322q0-22-16-37t-38-16h-535q-23 0-38 16t-16 37z m179 375h285v108q0 59-42 101t-101 41-101-41-41-101v-108z" horiz-adv-x="642.9" />
<glyph glyph-name="link" unicode="&#x1f517;" d="m9 600q0 67 47 113l82 82q47 46 114 46 67 0 114-47l114-116q47-46 47-113 0-69-49-117l49-49q48 49 116 49 67 0 114-47l116-116q47-47 47-114t-48-113l-82-81q-46-47-113-47-68 0-114 48l-115 115q-46 47-46 114 0 68 49 116l-49 49q-48-49-116-49-67 0-114 47l-116 116q-47 47-47 114z m107 0q0-22 16-38l116-116q15-15 38-15 23 0 40 17-2 2-11 11t-12 12-8 10-7 14-2 16q0 22 15 38t38 15q9 0 16-2t14-7 10-8 12-12 11-11q18 17 18 41 0 22-15 38l-115 115q-16 16-38 16-22 0-38-15l-82-82q-16-15-16-37z m392-393q0-23 16-38l115-116q15-15 38-15 22 0 38 15l82 81q15 16 15 37 0 23-15 38l-116 116q-16 16-38 16-24 0-40-18 1-1 10-10t12-12 9-11 7-14 2-15q0-23-16-38t-38-16q-8 0-15 2t-14 7-11 9-12 12-10 10q-19-17-19-40z" horiz-adv-x="928.6" />
<glyph glyph-name="wrench" unicode="&#x1f527;" d="m12-7q0 29 21 51l380 380q22-55 64-97t97-64l-381-381q-21-20-50-20-29 0-51 20l-59 61q-21 20-21 50z m131 36q0-15 10-26t26-10 25 10 10 26-10 25-25 10-26-10-10-25z m286 500q0 103 73 176t177 74q32 0 67-10t60-26q9-6 9-15t-9-16l-163-94v-125l108-60q2 2 44 27t75 45 40 20q8 0 13-5t4-14q0-22-12-60-27-74-92-121t-144-47q-104 0-177 74t-73 176z" horiz-adv-x="928.6" />
<glyph glyph-name="clock" unicode="&#x1f554;" d="m0 350q0 117 58 215t155 156 216 58 215-58 156-156 57-215-57-215-156-156-215-58-216 58-155 156-58 215z m125 0q0-83 41-152t110-111 153-41 152 41 110 111 41 152-41 152-110 111-152 41-153-41-110-111-41-152z m161-54v36q0 8 5 13t13 5h125v196q0 8 5 13t12 5h36q8 0 13-5t5-13v-250q0-7-5-12t-13-5h-178q-8 0-13 5t-5 12z" horiz-adv-x="857.1" />
<glyph glyph-name="block" unicode="&#x1f6ab;" d="m0 352q0 87 34 167t91 137 137 91 167 34 166-34 137-91 91-137 34-167-34-168-91-137-137-92-166-34-167 34-137 92-91 137-34 168z m125 0q0-91 50-167l421 421q-75 50-167 50-83 0-153-40t-110-112-41-152z m138-256q76-50 166-50 62 0 118 25t96 65 65 97 24 119q0 90-48 164z" horiz-adv-x="857.1" />
</font>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 517 B

View file

@ -1,3 +1,21 @@
jQuery.fn.fontCheckbox = function() {
this.find('input[type=checkbox], input[type=radio]').each(function() {
if (!jQuery(this).is(':checked')) {
jQuery(this).prev().toggleClass('icon-check icon-check-empty');
}
});
this.find('input[type=checkbox]').on('change', function() {
jQuery(this).prev().toggleClass('icon-check icon-check-empty');
});
this.find('input[type=radio]').on('change', function() {
jQuery(this).closest('.font-checkbox').find('input[type=radio][name='+ jQuery(this).attr('name') +']')
.prev().toggleClass('icon-check icon-check-empty');
});
};
// init fontChecbox everywhere
jQuery('.font-checkbox').fontCheckbox();
function array_delete(arr, item) {
var i = arr.indexOf(item);
if (i != -1) arr.splice(i, 1);

View file

@ -11,7 +11,7 @@ GeoIp = {
cache = JSON.parse(cache);
for (var key in cache) {
var data = cache[key];
if ( (new Date()).getTime() - data.reqTime > 36 * 3600000)
if ( (new Date()).getTime() - data.reqTime > 96 * 3600000)
delete cache[key];
}
GeoIp.cache = cache;

View file

@ -1,9 +0,0 @@
{if $load_css}
<!--[if lt IE 7]>
<link rel="stylesheet" type="text/css" href="{$ROOT_URL}admin/themes/default/fix-ie5-ie6.css">
<![endif]-->
<!--[if IE 7]>
<link rel="stylesheet" type="text/css" href="{$ROOT_URL}admin/themes/default/fix-ie7.css">
<![endif]-->
{/if}

View file

@ -1,56 +1,74 @@
{combine_script id='jquery.ui.accordion' load='header'}{*we load in the header because the accordion is on every admin page and usually all admin pages use the same header combined script but not the same footer script*}
{footer_script require='jquery.ui.accordion'}
jQuery(document).ready(function(){ldelim}
jQuery('#menubar').accordion({ldelim}
header: "dt.rdion",
event: "click",
heightStyle: "content",
active: {$ACTIVE_MENU}
});
{footer_script}
jQuery.fn.lightAccordion = function(options) {
var settings = $.extend({
header: 'dt',
content: 'dd',
active: 0
}, options);
return this.each(function() {
var self = jQuery(this);
var contents = self.find(settings.content),
headers = self.find(settings.header);
contents.not(contents[settings.active]).hide();
self.on('click', settings.header, function() {
var content = jQuery(this).next(settings.content);
content.slideDown();
contents.not(content).slideUp();
});
});
};
$('#menubar').lightAccordion({
active: {$ACTIVE_MENU}
});
{/footer_script}
<div id="menubar">
<div id="adminHome"><a href="{$U_ADMIN}">{'Administration Home'|@translate}</a></div>
<dl class="first">
<dt class="rdion"><span class="icon-picture"> </span><span>{'Photos'|@translate}&nbsp;</span></dt>
<dl>
<dt><i class="icon-picture"> </i><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>
<li><a href="{$U_ADD_PHOTOS}"><i class="icon-plus-circled"></i>{'Add'|@translate}</a></li>
<li><a href="{$U_RATING}"><i class="icon-star"></i>{'Rating'|@translate}</a></li>
<li><a href="{$U_TAGS}"><i class="icon-tags"></i>{'Tags'|@translate}</a></li>
<li><a href="{$U_RECENT_SET}"><i class="icon-clock"></i>{'Recent photos'|@translate}</a></li>
<li><a href="{$U_BATCH}"><i class="icon-pencil"></i>{'Batch Manager'|@translate}</a></li>
{if $NB_PHOTOS_IN_CADDIE > 0}
<li><a class="icon-flag" href="{$U_CADDIE}">{'Caddie'|@translate}<span class="adminMenubarCounter">{$NB_PHOTOS_IN_CADDIE}</span></a></li>
<li><a href="{$U_CADDIE}"><i class="icon-flag"></i>{'Caddie'|@translate}<span class="adminMenubarCounter">{$NB_PHOTOS_IN_CADDIE}</span></a></li>
{/if}
</ul>
</dd>
</dl>
<dl>
<dt class="rdion"><span class="icon-sitemap"> </span><span>{'Albums'|@translate}&nbsp;</span></dt>
</dl>
<dl>
<dt><i class="icon-sitemap"> </i><span>{'Albums'|@translate}&nbsp;</span></dt>
<dd>
<ul>
<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>
<li><a href="{$U_CATEGORIES}"><i class="icon-folder-open"></i>{'Manage'|@translate}</a></li>
<li><a href="{$U_CAT_OPTIONS}"><i class="icon-pencil"></i>{'Properties'|@translate}</a></li>
</ul>
</dd>
</dl>
<dl>
<dt class="rdion"><span class="icon-users"> </span><span>{'Users'|@translate}&nbsp;</span></dt>
</dl>
<dl>
<dt><i class="icon-users"> </i><span>{'Users'|@translate}&nbsp;</span></dt>
<dd>
<ul>
<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>
<li><a href="{$U_USERS}"><i class="icon-user-add"></i>{'Manage'|@translate}</a></li>
<li><a href="{$U_GROUPS}"><i class="icon-group"></i>{'Groups'|@translate}</a></li>
<li><a href="{$U_NOTIFICATION_BY_MAIL}"><i class="icon-mail-1"></i>{'Notification'|@translate}</a></li>
</ul>
</dd>
</dl>
<dl>
<dt class="rdion"><span class="icon-puzzle"> </span><span>{'Plugins'|@translate}&nbsp;</span></dt>
</dl>
<dl>
<dt><i class="icon-puzzle"> </i><span>{'Plugins'|@translate}&nbsp;</span></dt>
<dd>
<ul>
<li><a class="icon-equalizer" href="{$U_PLUGINS}">{'Manage'|@translate}</a></li>
<li><a href="{$U_PLUGINS}"><i class="icon-equalizer"></i>{'Manage'|@translate}</a></li>
</ul>
<div id="pluginsMenuSeparator"></div>
{if !empty($plugin_menu_items)}
@ -61,33 +79,36 @@ jQuery(document).ready(function(){ldelim}
</ul>
{/if}
</dd>
</dl>
<dl>
<dt class="rdion"><span class="icon-wrench"> </span><span>{'Tools'|@translate}&nbsp;</span></dt>
</dl>
<dl>
<dt><i class="icon-wrench"> </i><span>{'Tools'|@translate}&nbsp;</span></dt>
<dd>
<ul>
{if $ENABLE_SYNCHRONIZATION}
<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>
<li><a href="{$U_CAT_UPDATE}"><i class="icon-exchange"></i>{'Synchronize'|@translate}</a></li>
<li><a href="{$U_SITE_MANAGER}"><i class="icon-flow-branch"></i>{'Site manager'|@translate}</a></li>
{/if}
<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>
<li><a href="{$U_HISTORY_STAT}"><i class="icon-signal"></i>{'History'|@translate}</a></li>
<li><a href="{$U_MAINTENANCE}"><i class="icon-tools"></i>{'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>
<li><a href="{$U_COMMENTS}"><i class="icon-chat"></i>{'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 class="icon-arrows-cw" href="{$U_UPDATES}">{'Updates'|@translate}</a></li>
<li><a href="{$U_UPDATES}"><i class="icon-arrows-cw"></i>{'Updates'|@translate}</a></li>
</ul>
</dd>
</dl>
<dl class="last">
<dt class="rdion"><span class="icon-cog"> </span><span>{'Configuration'|@translate}&nbsp;</span></dt>
</dl>
<dl>
<dt><i class="icon-cog"> </i><span>{'Configuration'|@translate}&nbsp;</span></dt>
<dd>
<ul>
<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>
<li><a href="{$U_CONFIG_GENERAL}"><i class="icon-cog-alt"></i>{'Options'|@translate}</a></li>
<li><a href="{$U_CONFIG_MENUBAR}"><i class="icon-menu"></i>{'Menu Management'|@translate}</a></li>
<li><a href="{$U_CONFIG_EXTENTS}"><i class="icon-code"></i>{'Templates'|@translate}</a></li>
<li><a href="{$U_CONFIG_LANGUAGES}"><i class="icon-language"></i>{'Languages'|@translate}</a></li>
<li><a href="{$U_CONFIG_THEMES}"><i class="icon-brush"></i>{'Themes'|@translate}</a></li>
</ul>
</dd>
</dl>

View file

@ -1,144 +1,81 @@
{include file='include/tag_selection.inc.tpl'}
{include file='include/datepicker.inc.tpl'}
{include file='include/colorbox.inc.tpl'}
{include file='include/add_album.inc.tpl'}
{include file='include/datepicker.inc.tpl' load_mode='async'}
{include file='include/colorbox.inc.tpl' load_mode='async'}
{include file='include/add_album.inc.tpl' load_mode='async'}
{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_script id='jquery.ui.slider' require='jquery.ui' load='async' path='themes/default/js/ui/minified/jquery.ui.slider.min.js'}
{combine_css path="themes/default/js/ui/theme/jquery.ui.slider.css"}
{combine_script id='doubleSlider' load='async' require='jquery.ui.slider' path='admin/themes/default/js/doubleSlider.js'}
{footer_script}{literal}
pwg_initialization_datepicker("#date_creation_day", "#date_creation_month", "#date_creation_year", "#date_creation_linked_date", "#date_creation_action_set");
{/literal}{/footer_script}
{combine_script id='LocalStorageCache' load='footer' path='admin/themes/default/js/LocalStorageCache.js'}
{footer_script}{literal}
/* Shift-click: select all photos between the click and the shift+click */
jQuery(document).ready(function() {
var last_clicked=0;
var last_clickedstatus=true;
jQuery.fn.enableShiftClick = function() {
var inputs = [];
var count=0;
this.find('input[type=checkbox]').each(function() {
var pos=count;
inputs[count++]=this;
$(this).bind("shclick", function (dummy,event) {
if (event.shiftKey) {
var first = last_clicked;
var last = pos;
if (first > last) {
first=pos;
last=last_clicked;
}
{combine_script id='jquery.selectize' load='footer' path='themes/default/js/plugins/selectize.min.js'}
{combine_css id='jquery.selectize' path="themes/default/js/plugins/selectize.{$themeconf.colorscheme}.css"}
for (var i=first; i<=last;i++) {
input = $(inputs[i]);
$(input).prop('checked', last_clickedstatus);
if (last_clickedstatus)
{
$(input).siblings("span.wrap2").addClass("thumbSelected");
}
else
{
$(input).siblings("span.wrap2").removeClass("thumbSelected");
}
}
}
else {
last_clicked = pos;
last_clickedstatus = this.checked;
}
return true;
});
$(this).click(function(event) { $(this).triggerHandler("shclick",event)});
});
}
$('ul.thumbnails').enableShiftClick();
});
{/literal}{/footer_script}
{combine_script id='jquery.progressBar' load='async' path='themes/default/js/plugins/jquery.progressbar.min.js'}
{combine_script id='jquery.ajaxmanager' load='async' path='themes/default/js/plugins/jquery.ajaxmanager.js'}
{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'}
{footer_script require='jquery.tokeninput'}
jQuery(document).ready(function() {ldelim}
jQuery("a.preview-box").colorbox();
var tag_src = [{foreach from=$tags item=tag name=tags}{ldelim}name:"{$tag.name|@escape:'javascript'}",id:"{$tag.id}"{rdelim}{if !$smarty.foreach.tags.last},{/if}{/foreach}];
jQuery("#tags").tokenInput(
tag_src,
{ldelim}
hintText: '{'Type in a search term'|@translate}',
noResultsText: '{'No results'|@translate}',
searchingText: '{'Searching...'|@translate}',
newText: ' ({'new'|@translate})',
animateDropdown: false,
preventDuplicates: true,
allowFreeTagging: true
}
);
jQuery("#tagsFilter").tokenInput(
tag_src,
{ldelim}
hintText: '{'Type in a search term'|@translate}',
noResultsText: '{'No results'|@translate}',
searchingText: '{'Searching...'|@translate}',
animateDropdown: false,
preventDuplicates: true,
allowFreeTagging: false
}
);
});
{/footer_script}
{combine_script id='batchManagerGlobal' load='async' require='jquery,datepicker,jquery.colorbox,addAlbum,doubleSlider' path='admin/themes/default/js/batchManagerGlobal.js'}
{footer_script}
var lang = {
Cancel: '{'Cancel'|translate|escape:'javascript'}',
AreYouSure: "{'Are you sure?'|translate|escape:'javascript'}"
};
jQuery(document).ready(function() {
{* <!-- TAGS --> *}
var tagsCache = new TagsCache({
serverKey: '{$CACHE_KEYS.tags}',
serverId: '{$CACHE_KEYS._hash}',
rootUrl: '{$ROOT_URL}'
});
tagsCache.selectize(jQuery('[data-selectize=tags]'), { lang: {
'Add': '{'Create'|translate}'
}});
{* <!-- CATEGORIES --> *}
window.categoriesCache = new CategoriesCache({
serverKey: '{$CACHE_KEYS.categories}',
serverId: '{$CACHE_KEYS._hash}',
rootUrl: '{$ROOT_URL}'
});
var associated_categories = {$associated_categories|@json_encode};
categoriesCache.selectize(jQuery('[data-selectize=categories]'), {
filter: function(categories, options) {
if (this.name == 'dissociate') {
var filtered = jQuery.grep(categories, function(cat) {
return !!associated_categories[cat.id];
});
if (filtered.length > 0) {
options.default = filtered[0].id;
}
return filtered;
}
else {
return categories;
}
}
});
});
var nb_thumbs_page = {$nb_thumbs_page};
var nb_thumbs_set = {$nb_thumbs_set};
var are_you_sure = "{'Are you sure?'|@translate|@escape:'javascript'}";
var applyOnDetails_pattern = "{'on the %d selected photos'|@translate}";
var all_elements = [{if !empty($all_elements)}{','|@implode:$all_elements}{/if}];
var derivatives = {ldelim}
elements: null,
done: 0,
total: 0,
finished: function() {ldelim}
return derivatives.done == derivatives.total && derivatives.elements && derivatives.elements.length==0;
}
};
var selectedMessage_pattern = "{'%d of %d photos selected'|@translate}";
var selectedMessage_none = "{'No photo selected, %d photos in current set'|@translate}";
var selectedMessage_all = "{'All %d photos are selected'|@translate}";
var width_str = '{'Width'|@translate}';
var height_str = '{'Height'|@translate}';
var max_width_str = '{'Maximum width'|@translate}';
var max_height_str = '{'Maximum height'|@translate}';
{literal}
function progress(success) {
jQuery('#progressBar').progressBar(derivatives.done, {
max: derivatives.total,
textFormat: 'fraction',
boxImage: 'themes/default/images/progressbar.gif',
barImage: 'themes/default/images/progressbg_orange.gif'
});
if (success !== undefined) {
var type = success ? 'regenerateSuccess': 'regenerateError',
s = jQuery('[name="'+type+'"]').val();
jQuery('[name="'+type+'"]').val(++s);
}
if (derivatives.finished()) {
jQuery('#applyAction').click();
}
}
$(document).ready(function() {
function checkPermitAction() {
var nbSelected = 0;
@ -193,25 +130,12 @@ $(document).ready(function() {
}
}
$('.thumbnails img').tipTip({
'delay' : 0,
'fadeIn' : 200,
'fadeOut' : 200
});
$("[id^=action_]").hide();
$("select[name=selectAction]").change(function () {
$("[id^=action_]").hide();
$("#action_"+$(this).prop("value")).show();
/* make sure the #albumSelect is on the right select box so that the */
/* "add new album" popup fills the right select box */
if ("associate" == $(this).prop("value") || "move" == $(this).prop("value")) {
jQuery("#albumSelect").removeAttr("id");
jQuery("#action_"+$(this).prop("value")+" select").attr("id", "albumSelect");
}
if ($(this).val() != -1) {
$("#applyActionBlock").show();
}
@ -229,10 +153,10 @@ $(document).ready(function() {
checkbox.triggerHandler("shclick",event);
if ($(checkbox).is(':checked')) {
$(wrap2).addClass("thumbSelected");
$(wrap2).addClass("thumbSelected");
}
else {
$(wrap2).removeClass('thumbSelected');
$(wrap2).removeClass('thumbSelected');
}
checkPermitAction();
@ -251,7 +175,7 @@ $(document).ready(function() {
var checkbox = $(this).children("input[type=checkbox]");
$(checkbox).prop('checked', true);
$(wrap2).addClass("thumbSelected");
$(wrap2).addClass("thumbSelected");
});
}
@ -263,7 +187,7 @@ $(document).ready(function() {
var checkbox = $(this).children("input[type=checkbox]");
$(checkbox).prop('checked', false);
$(wrap2).removeClass("thumbSelected");
$(wrap2).removeClass("thumbSelected");
});
checkPermitAction();
return false;
@ -279,10 +203,10 @@ $(document).ready(function() {
$(checkbox).prop('checked', !$(checkbox).is(':checked'));
if ($(checkbox).is(':checked')) {
$(wrap2).addClass("thumbSelected");
$(wrap2).addClass("thumbSelected");
}
else {
$(wrap2).removeClass('thumbSelected');
$(wrap2).removeClass('thumbSelected');
}
});
checkPermitAction();
@ -296,75 +220,6 @@ $(document).ready(function() {
return false;
});
$("input[name=remove_author]").click(function () {
if ($(this).is(':checked')) {
$("input[name=author]").hide();
}
else {
$("input[name=author]").show();
}
});
$("input[name=remove_title]").click(function () {
if ($(this).is(':checked')) {
$("input[name=title]").hide();
}
else {
$("input[name=title]").show();
}
});
$("input[name=remove_date_creation]").click(function () {
if ($(this).is(':checked')) {
$("#set_date_creation").hide();
}
else {
$("#set_date_creation").show();
}
});
$(".removeFilter").click(function () {
var filter = $(this).parent('li').attr("id");
filter_disable(filter);
return false;
});
function filter_enable(filter) {
/* show the filter*/
$("#"+filter).show();
/* check the checkbox to declare we use this filter */
$("input[type=checkbox][name="+filter+"_use]").prop("checked", true);
/* forbid to select this filter in the addFilter list */
$("#addFilter").children("option[value="+filter+"]").attr("disabled", "disabled");
}
$("#addFilter").change(function () {
var filter = $(this).prop("value");
filter_enable(filter);
$(this).prop("value", -1);
});
function filter_disable(filter) {
/* hide the filter line */
$("#"+filter).hide();
/* uncheck the checkbox to declare we do not use this filter */
$("input[name="+filter+"_use]").prop("checked", false);
/* give the possibility to show it again */
$("#addFilter").children("option[value="+filter+"]").removeAttr("disabled");
}
$("#removeFilters").click(function() {
$("#filterList li").each(function() {
var filter = $(this).attr("id");
filter_disable(filter);
});
return false;
});
jQuery('#applyAction').click(function() {
var action = jQuery('[name="selectAction"]').val();
@ -372,9 +227,9 @@ $(document).ready(function() {
var d_count = $('#action_delete_derivatives input[type=checkbox]').filter(':checked').length
, e_count = $('input[name="setSelected"]').is(':checked') ? nb_thumbs_set : $('.thumbnails input[type=checkbox]').filter(':checked').length;
if (d_count*e_count > 500)
return confirm(are_you_sure);
return confirm(lang.AreYouSure);
}
if (action != 'generate_derivatives'
|| derivatives.finished() )
{
@ -383,8 +238,8 @@ $(document).ready(function() {
jQuery('.bulkAction').hide();
var queuedManager = jQuery.manageAjax.create('queued', {
queue: true,
var queuedManager = jQuery.manageAjax.create('queued', {
queue: true,
cacheResponse: false,
maxRequests: 1
});
@ -402,174 +257,59 @@ $(document).ready(function() {
jQuery('#applyActionBlock').hide();
jQuery('select[name="selectAction"]').hide();
jQuery('#regenerationMsg').show();
progress();
getDerivativeUrls();
return false;
});
function getDerivativeUrls() {
var ids = derivatives.elements.splice(0, 500);
var params = {max_urls: 100000, ids: ids, types: []};
jQuery("#action_generate_derivatives input").each( function(i, t) {
if ($(t).is(":checked"))
params.types.push( t.value );
} );
jQuery.ajax( {
type: "POST",
url: 'ws.php?format=json&method=pwg.getMissingDerivatives',
data: params,
dataType: "json",
success: function(data) {
if (!data.stat || data.stat != "ok") {
return;
}
derivatives.total += data.result.urls.length;
progress();
for (var i=0; i < data.result.urls.length; i++) {
jQuery.manageAjax.add("queued", {
type: 'GET',
url: data.result.urls[i] + "&ajaxload=true",
dataType: 'json',
success: ( function(data) { derivatives.done++; progress(true) }),
error: ( function(data) { derivatives.done++; progress(false) })
});
}
if (derivatives.elements.length)
setTimeout( getDerivativeUrls, 25 * (derivatives.total-derivatives.done));
}
} );
}
checkPermitAction();
/* dimensions sliders */
/**
* 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;
}
{/literal}
var dimension_values = {ldelim}
'width':[{$dimensions.widths}],
'height':[{$dimensions.heights}],
'ratio':[{$dimensions.ratios}]
};
$("#filter_dimension_width_slider").slider({ldelim}
range: true,
min: 0,
max: dimension_values['width'].length - 1,
values: [
getSliderKeyFromValue({$dimensions.selected.min_width}, dimension_values['width']),
getSliderKeyFromValue({$dimensions.selected.max_width}, dimension_values['width'])
],
slide: function(event, ui) {ldelim}
$("input[name='filter_dimension_min_width']").val(dimension_values['width'][ui.values[0]]);
$("input[name='filter_dimension_max_width']").val(dimension_values['width'][ui.values[1]]);
$("#filter_dimension_width_info").html(sprintf(
"{'between %d and %d pixels'|@translate}",
dimension_values['width'][ui.values[0]],
dimension_values['width'][ui.values[1]]
));
},
change: function(event, ui) {ldelim}
$("input[name='filter_dimension_min_width']").val(dimension_values['width'][ui.values[0]]);
$("input[name='filter_dimension_max_width']").val(dimension_values['width'][ui.values[1]]);
$("#filter_dimension_width_info").html(sprintf(
"{'between %d and %d pixels'|@translate}",
dimension_values['width'][ui.values[0]],
dimension_values['width'][ui.values[1]]
));
}
});
$("#filter_dimension_height_slider").slider({ldelim}
range: true,
min: 0,
max: dimension_values['height'].length - 1,
values: [
getSliderKeyFromValue({$dimensions.selected.min_height}, dimension_values['height']),
getSliderKeyFromValue({$dimensions.selected.max_height}, dimension_values['height'])
],
slide: function(event, ui) {ldelim}
$("input[name='filter_dimension_min_height']").val(dimension_values['height'][ui.values[0]]);
$("input[name='filter_dimension_max_height']").val(dimension_values['height'][ui.values[1]]);
$("#filter_dimension_height_info").html(sprintf(
"{'between %d and %d pixels'|@translate}",
dimension_values['height'][ui.values[0]],
dimension_values['height'][ui.values[1]]
));
},
change: function(event, ui) {ldelim}
$("input[name='filter_dimension_min_height']").val(dimension_values['height'][ui.values[0]]);
$("input[name='filter_dimension_max_height']").val(dimension_values['height'][ui.values[1]]);
$("#filter_dimension_height_info").html(sprintf(
"{'between %d and %d pixels'|@translate}",
dimension_values['height'][ui.values[0]],
dimension_values['height'][ui.values[1]]
));
}
});
$("#filter_dimension_ratio_slider").slider({ldelim}
range: true,
min: 0,
max: dimension_values['ratio'].length - 1,
values: [
getSliderKeyFromValue({$dimensions.selected.min_ratio}, dimension_values['ratio']),
getSliderKeyFromValue({$dimensions.selected.max_ratio}, dimension_values['ratio'])
],
slide: function(event, ui) {ldelim}
$("input[name='filter_dimension_min_ratio']").val(dimension_values['ratio'][ui.values[0]]);
$("input[name='filter_dimension_max_ratio']").val(dimension_values['ratio'][ui.values[1]]);
$("#filter_dimension_ratio_info").html(sprintf(
"{'between %.2f and %.2f'|@translate}",
dimension_values['ratio'][ui.values[0]],
dimension_values['ratio'][ui.values[1]]
));
},
change: function(event, ui) {ldelim}
$("input[name='filter_dimension_min_ratio']").val(dimension_values['ratio'][ui.values[0]]);
$("input[name='filter_dimension_max_ratio']").val(dimension_values['ratio'][ui.values[1]]);
$("#filter_dimension_ratio_info").html(sprintf(
"{'between %.2f and %.2f'|@translate}",
dimension_values['ratio'][ui.values[0]],
dimension_values['ratio'][ui.values[1]]
));
}
});
$("a.dimensions-choice").click(function() {ldelim}
var type = jQuery(this).data("type");
var min = jQuery(this).data("min");
var max = jQuery(this).data("max");
$("#filter_dimension_"+ type +"_slider").slider("values", 0,
getSliderKeyFromValue(min, dimension_values[type])
);
$("#filter_dimension_"+type+"_slider").slider("values", 1,
getSliderKeyFromValue(max, dimension_values[type])
);
jQuery("select[name=filter_prefilter]").change(function() {
jQuery("#empty_caddie").toggle(jQuery(this).val() == "caddie");
jQuery("#duplicates_options").toggle(jQuery(this).val() == "duplicates");
});
});
{*<!-- sliders config -->*}
var sliders = {
widths: {
values: [{$dimensions.widths}],
selected: {
min: {$dimensions.selected.min_width},
max: {$dimensions.selected.max_width},
},
text: '{'between %d and %d pixels'|translate|escape:'javascript'}'
},
heights: {
values: [{$dimensions.heights}],
selected: {
min: {$dimensions.selected.min_height},
max: {$dimensions.selected.max_height},
},
text: '{'between %d and %d pixels'|translate|escape:'javascript'}'
},
ratios: {
values: [{$dimensions.ratios}],
selected: {
min: {$dimensions.selected.min_ratio},
max: {$dimensions.selected.max_ratio},
},
text: '{'between %.2f and %.2f'|translate|escape:'javascript'}'
},
filesizes: {
values: [{$filesize.list}],
selected: {
min: {$filesize.selected.min},
max: {$filesize.selected.max},
},
text: '{'between %s and %s MB'|translate|escape:'javascript'}'
}
};
{/footer_script}
<div id="batchManagerGlobal">
@ -577,7 +317,7 @@ $(document).ready(function() {
<h2>{'Batch Manager'|@translate}</h2>
<form action="{$F_ACTION}" method="post">
<input type="hidden" name="start" value="{$START}">
<input type="hidden" name="start" value="{$START}">
<fieldset>
<legend>{'Filter'|@translate}</legend>
@ -592,31 +332,36 @@ $(document).ready(function() {
<option value="{$prefilter.ID}" {if isset($filter.prefilter) && $filter.prefilter eq $prefilter.ID}selected="selected"{/if}>{$prefilter.NAME}</option>
{/foreach}
</select>
<a id="empty_caddie" href="admin.php?page=batch_manager&amp;action=empty_caddie" style="{if !isset($filter.prefilter) or $filter.prefilter ne 'caddie'}display:none{/if}">{'Empty caddie'|translate}</a>
<span id="duplicates_options" style="{if !isset($filter.prefilter) or $filter.prefilter ne 'duplicates'}display:none{/if}">
{'based on'|translate}
<input type="checkbox" checked="checked" disabled="disabled"> {'file name'|translate}
<label><input type="checkbox" name="filter_duplicates_date" {if isset($filter.duplicates_date) or (isset($filter.prefilter) and $filter.prefilter ne 'duplicates')}checked="checked"{/if}> {'date & time'|translate}</label>
<label><input type="checkbox" name="filter_duplicates_dimensions" {if isset($filter.duplicates_dimensions)}checked="checked"{/if}> {'width & height'|translate}</label>
</span>
</li>
<li id="filter_category" {if !isset($filter.category)}style="display:none"{/if}>
<a href="#" class="removeFilter" title="remove this filter"><span>[x]</span></a>
<input type="checkbox" name="filter_category_use" class="useFilterCheckbox" {if isset($filter.category)}checked="checked"{/if}>
{'Album'|@translate}
<select style="width:400px" name="filter_category" size="1">
{html_options options=$category_full_name_options selected=$filter_category_selected}
</select>
<select data-selectize="categories" data-value="{$filter_category_selected|@json_encode|escape:html}"
data-default="first" name="filter_category" style="width:600px"></select>
<label><input type="checkbox" name="filter_category_recursive" {if isset($filter.category_recursive)}checked="checked"{/if}> {'include child albums'|@translate}</label>
</li>
<li id="filter_tags" {if !isset($filter.tags)}style="display:none"{/if}>
<a href="#" class="removeFilter" title="remove this filter"><span>[x]</span></a>
<input type="checkbox" name="filter_tags_use" class="useFilterCheckbox" {if isset($filter.tags)}checked="checked"{/if}>
{'Tags'|@translate}
<select id="tagsFilter" name="filter_tags">
{if isset($filter_tags)}{foreach from=$filter_tags item=tag}
<option value="{$tag.id}">{$tag.name}</option>
{/foreach}{/if}
</select>
<select data-selectize="tags" data-value="{$filter_tags|@json_encode|escape:html}"
placeholder="{'Type in a search term'|translate}"
name="filter_tags[]" multiple style="width:600px;"></select>
<label><span><input type="radio" name="tag_mode" value="AND" {if !isset($filter.tag_mode) or $filter.tag_mode eq 'AND'}checked="checked"{/if}> {'All tags'|@translate}</span></label>
<label><span><input type="radio" name="tag_mode" value="OR" {if isset($filter.tag_mode) and $filter.tag_mode eq 'OR'}checked="checked"{/if}> {'Any tag'|@translate}</span></label>
</li>
<li id="filter_level" {if !isset($filter.level)}style="display:none"{/if}>
<a href="#" class="removeFilter" title="remove this filter"><span>[x]</span></a>
<input type="checkbox" name="filter_level_use" class="useFilterCheckbox" {if isset($filter.level)}checked="checked"{/if}>
@ -626,44 +371,80 @@ $(document).ready(function() {
</select>
<label><input type="checkbox" name="filter_level_include_lower" {if isset($filter.level_include_lower)}checked="checked"{/if}> {'include photos with lower privacy level'|@translate}</label>
</li>
<li id="filter_dimension" {if !isset($filter.dimension)}style="display:none"{/if}>
<a href="#" class="removeFilter" title="remove this filter"><span>[x]</span></a>
<input type="checkbox" name="filter_dimension_use" class="useFilterCheckbox" {if isset($filter.dimension)}checked="checked"{/if}>
{'Dimensions'|@translate}
{'Dimensions'|translate}
<blockquote>
{'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:$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:$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}
{if isset($dimensions.ratio_square)}
| <a class="dimensions-choice" data-type="ratio" data-min="{$dimensions.ratio_square.min}" data-max="{$dimensions.ratio_square.max}">{'square'|@translate}</a>
{/if}
{if isset($dimensions.ratio_landscape)}
| <a class="dimensions-choice" data-type="ratio" data-min="{$dimensions.ratio_landscape.min}" data-max="{$dimensions.ratio_landscape.max}">{'Landscape'|@translate}</a>
{/if}
{if isset($dimensions.ratio_panorama)}
| <a class="dimensions-choice" data-type="ratio" data-min="{$dimensions.ratio_panorama.min}" data-max="{$dimensions.ratio_panorama.max}">{'Panorama'|@translate}</a>
{/if}
| <a class="dimensions-choice" data-type="ratio" data-min="{$dimensions.bounds.min_ratio}" data-max="{$dimensions.bounds.max_ratio}">{'Reset'|@translate}</a>
<div id="filter_dimension_ratio_slider"></div>
<div data-slider="widths">
{'Width'|translate} <span class="slider-info">{'between %d and %d pixels'|translate:$dimensions.selected.min_width:$dimensions.selected.max_width}</span>
| <a class="slider-choice" data-min="{$dimensions.bounds.min_width}" data-max="{$dimensions.bounds.max_width}">{'Reset'|translate}</a>
<div class="slider-slider"></div>
<input type="hidden" data-input="min" name="filter_dimension_min_width" value="{$dimensions.selected.min_width}">
<input type="hidden" data-input="max" name="filter_dimension_max_width" value="{$dimensions.selected.max_width}">
</div>
<div data-slider="heights">
{'Height'|translate} <span class="slider-info">{'between %d and %d pixels'|translate:$dimensions.selected.min_height:$dimensions.selected.max_height}</span>
| <a class="slider-choice" data-min="{$dimensions.bounds.min_height}" data-max="{$dimensions.bounds.max_height}">{'Reset'|translate}</a>
<div class="slider-slider"></div>
<input type="hidden" data-input="min" name="filter_dimension_min_height" value="{$dimensions.selected.min_height}">
<input type="hidden" data-input="max" name="filter_dimension_max_height" value="{$dimensions.selected.max_height}">
</div>
<div data-slider="ratios">
{'Ratio'|translate} ({'Width'|@translate}/{'Height'|@translate}) <span class="slider-info">{'between %.2f and %.2f'|translate:$dimensions.selected.min_ratio:$dimensions.selected.max_ratio}</span>
{if isset($dimensions.ratio_portrait)}| <a class="slider-choice" data-min="{$dimensions.ratio_portrait.min}" data-max="{$dimensions.ratio_portrait.max}">{'Portrait'|translate}</a>{/if}
{if isset($dimensions.ratio_square)}| <a class="slider-choice" data-min="{$dimensions.ratio_square.min}" data-max="{$dimensions.ratio_square.max}">{'square'|translate}</a>{/if}
{if isset($dimensions.ratio_landscape)}| <a class="slider-choice" data-min="{$dimensions.ratio_landscape.min}" data-max="{$dimensions.ratio_landscape.max}">{'Landscape'|translate}</a>{/if}
{if isset($dimensions.ratio_panorama)}| <a class="slider-choice" data-min="{$dimensions.ratio_panorama.min}" data-max="{$dimensions.ratio_panorama.max}">{'Panorama'|translate}</a>{/if}
| <a class="slider-choice" data-min="{$dimensions.bounds.min_ratio}" data-max="{$dimensions.bounds.max_ratio}">{'Reset'|translate}</a>
<div class="slider-slider"></div>
<input type="hidden" data-input="min" name="filter_dimension_min_ratio" value="{$dimensions.selected.min_ratio}">
<input type="hidden" data-input="max" name="filter_dimension_max_ratio" value="{$dimensions.selected.max_ratio}">
</div>
</blockquote>
</li>
<li id="filter_search"{if !isset($filter.search)} style="display:none"{/if}>
<a href="#" class="removeFilter" title="remove this filter"><span>[x]</span></a>
<input type="checkbox" name="filter_search_use" class="useFilterCheckbox"{if isset($filter.search)} checked="checked"{/if}>
{'Search'|@translate}
<input name="q" size=40 value="{$filter.search.q|stripslashes|htmlspecialchars}">
{combine_script id='core.scripts' load='async' path='themes/default/js/scripts.js'}
<a href="admin/popuphelp.php?page=quick_search" onclick="popuphelp(this.href);return false;" title="{'Help'|@translate}"><span class="icon-help-circled"></span></a>
{if (isset($no_search_results))}
<div>{'No results for'|@translate} :
<em><strong>
{foreach $no_search_results as $res}
{if !$res@first} &mdash; {/if}
{$res}
{/foreach}
</strong></em>
</div>
{/if}
</li>
<li id="filter_filesize" {if !isset($filter.filesize)}style="display:none"{/if}>
<a href="#" class="removeFilter" title="remove this filter"><span>[x]</span></a>
<input type="checkbox" name="filter_filesize_use" class="useFilterCheckbox" {if isset($filter.filesize)}checked="checked"{/if}>
{'Filesize'|translate}
<blockquote>
<div data-slider="filesizes">
<span class="slider-info">{'between %s and %s MB'|translate:$filesize.selected.min:$filesize.selected.max}</span>
| <a class="slider-choice" data-min="{$filesize.bounds.min}" data-max="{$filesize.bounds.max}">{'Reset'|translate}</a>
<div class="slider-slider"></div>
<input type="hidden" data-input="min" name="filter_filesize_min" value="{$filesize.selected.min}">
<input type="hidden" data-input="max" name="filter_filesize_max" value="{$filesize.selected.max}">
</div>
</blockquote>
<input type="hidden" name="filter_dimension_min_width" value="{$dimensions.selected.min_width}">
<input type="hidden" name="filter_dimension_max_width" value="{$dimensions.selected.max_width}">
<input type="hidden" name="filter_dimension_min_height" value="{$dimensions.selected.min_height}">
<input type="hidden" name="filter_dimension_max_height" value="{$dimensions.selected.max_height}">
<input type="hidden" name="filter_dimension_min_ratio" value="{$dimensions.selected.min_ratio}">
<input type="hidden" name="filter_dimension_max_ratio" value="{$dimensions.selected.max_ratio}">
</li>
</ul>
@ -676,8 +457,10 @@ $(document).ready(function() {
<option value="filter_tags" {if isset($filter.tags)}disabled="disabled"{/if}>{'Tags'|@translate}</option>
<option value="filter_level" {if isset($filter.level)}disabled="disabled"{/if}>{'Privacy level'|@translate}</option>
<option value="filter_dimension" {if isset($filter.dimension)}disabled="disabled"{/if}>{'Dimensions'|@translate}</option>
<option value="filter_filesize" {if isset($filter.filesize)}disabled="disabled"{/if}>{'Filesize'|@translate}</option>
<option value="filter_search"{if isset($filter.search)} disabled="disabled"{/if}>{'Search'|@translate}</option>
</select>
<a id="removeFilters" href="">{'Remove all filters'|@translate}</a>
<a id="removeFilters">{'Remove all filters'|@translate}</a>
</p>
<p class="actionButtons" id="applyFilterBlock">
@ -770,11 +553,11 @@ UL.thumbnails SPAN.wrap2 {ldelim}
<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)}
{if !empty($associated_categories)}
<option value="dissociate">{'Dissociate from album'|@translate}</option>
{/if}
<option value="add_tags">{'Add tags'|@translate}</option>
{if !empty($DEL_TAG_SELECTION)}
{if !empty($associated_tags)}
<option value="del_tags">{'remove tags'|@translate}</option>
{/if}
<option value="author">{'Set author'|@translate}</option>
@ -803,38 +586,42 @@ UL.thumbnails SPAN.wrap2 {ldelim}
<!-- associate -->
<div id="action_associate" class="bulkAction">
<select style="width:400px" name="associate" size="1">
{html_options options=$category_full_name_options}
</select>
<br>{'... or '|@translate} <a href="#" class="addAlbumOpen" title="{'create a new album'|@translate}">{'create a new album'|@translate}</a>
<select data-selectize="categories" data-default="first" name="associate" style="width:600px"></select>
<br>{'... or '|@translate}
<a href="#" data-add-album="associate" title="{'create a new album'|@translate}">{'create a new album'|@translate}</a>
</div>
<!-- move -->
<div id="action_move" class="bulkAction">
<select style="width:400px" name="move" size="1">
{html_options options=$category_full_name_options}
</select>
<br>{'... or '|@translate} <a href="#" class="addAlbumOpen" title="{'create a new album'|@translate}">{'create a new album'|@translate}</a>
<select data-selectize="categories" data-default="first" name="move" style="width:600px"></select>
<br>{'... or '|@translate}
<a href="#" data-add-album="move" title="{'create a new album'|@translate}">{'create a new album'|@translate}</a>
</div>
<!-- dissociate -->
<div id="action_dissociate" class="bulkAction">
<select style="width:400px" name="dissociate" size="1">
{if !empty($dissociate_options)}{html_options options=$dissociate_options }{/if}
</select>
<select data-selectize="categories" placeholder="{'Type in a search term'|translate}"
name="dissociate" style="width:600px"></select>
</div>
<!-- add_tags -->
<div id="action_add_tags" class="bulkAction">
<select id="tags" name="add_tags">
</select>
<select data-selectize="tags" data-create="true" placeholder="{'Type in a search term'|translate}"
name="add_tags[]" multiple style="width:400px;"></select>
</div>
<!-- del_tags -->
<div id="action_del_tags" class="bulkAction">
{if !empty($DEL_TAG_SELECTION)}{$DEL_TAG_SELECTION}{/if}
{if !empty($associated_tags)}
<select data-selectize="tags" name="del_tags[]" multiple style="width:400px;"
placeholder="{'Type in a search term'|translate}">
{foreach from=$associated_tags item=tag}
<option value="{$tag.id}">{$tag.name}</option>
{/foreach}
</select>
{/if}
</div>
<!-- author -->
@ -842,7 +629,7 @@ UL.thumbnails SPAN.wrap2 {ldelim}
<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|@escape:javascript}') ? '' : this.value;" onblur="this.value=(this.value=='') ? '{$authorDefaultValue|@escape:javascript}' : this.value;">
</div>
</div>
<!-- title -->
<div id="action_title" class="bulkAction">
@ -855,22 +642,11 @@ UL.thumbnails SPAN.wrap2 {ldelim}
<div id="action_date_creation" class="bulkAction">
<label><input type="checkbox" name="remove_date_creation"> {'remove creation date'|@translate}</label><br>
<div id="set_date_creation">
<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}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}
</select>
<input id="date_creation_year"
name="date_creation_year"
type="text"
size="4"
maxlength="4"
value="{$DATE_CREATION_YEAR}">
<input id="date_creation_linked_date" name="date_creation_linked_date" type="hidden" size="10" disabled="disabled">
<input type="hidden" name="date_creation" value="{$DATE_CREATION}">
<label>
<i class="icon-calendar"></i>
<input type="text" data-datepicker="date_creation" readonly>
</label>
</div>
</div>
@ -893,14 +669,6 @@ UL.thumbnails SPAN.wrap2 {ldelim}
{foreach from=$generate_derivatives_types key=type item=disp}
<label><input type="checkbox" name="generate_derivatives_type[]" value="{$type}"> {$disp}</label>
{/foreach}
{footer_script}
function selectGenerateDerivAll() {ldelim}
$("#action_generate_derivatives input[type=checkbox]").prop("checked", true);
}
function selectGenerateDerivNone() {ldelim}
$("#action_generate_derivatives input[type=checkbox]").prop("checked", false);
}
{/footer_script}
</div>
<!-- delete derivatives -->
@ -911,16 +679,8 @@ UL.thumbnails SPAN.wrap2 {ldelim}
{foreach from=$del_derivatives_types key=type item=disp}
<label><input type="checkbox" name="del_derivatives_type[]" value="{$type}"> {$disp}</label>
{/foreach}
{footer_script}
function selectDelDerivAll() {ldelim}
$("#action_delete_derivatives input[type=checkbox]").prop("checked", true);
}
function selectDelDerivNone() {ldelim}
$("#action_delete_derivatives input[type=checkbox]").prop("checked", false);
}
{/footer_script}
</div>
<!-- progress bar -->
<div id="regenerationMsg" class="bulkAction" style="display:none">
<p id="regenerationText" style="margin-bottom:10px;">{'Generate multiple size images'|@translate}</p>

View file

@ -2,25 +2,35 @@
{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}
jQuery('select[name|="tags"]').tokenInput(
[{foreach from=$tags item=tag name=tags}{ldelim}name:"{$tag.name|@escape:'javascript'}",id:"{$tag.id}"{rdelim}{if !$smarty.foreach.tags.last},{/if}{/foreach}],
{ldelim}
hintText: '{'Type in a search term'|@translate}',
noResultsText: '{'No results'|@translate}',
searchingText: '{'Searching...'|@translate}',
newText: ' ({'new'|@translate})',
animateDropdown: false,
preventDuplicates: true,
allowFreeTagging: true
}
);
{combine_script id='LocalStorageCache' load='footer' path='admin/themes/default/js/LocalStorageCache.js'}
jQuery("a.preview-box").colorbox();
{combine_script id='jquery.selectize' load='footer' path='themes/default/js/plugins/selectize.min.js'}
{combine_css id='jquery.selectize' path="themes/default/js/plugins/selectize.{$themeconf.colorscheme}.css"}
{footer_script}
(function(){
{* <!-- TAGS --> *}
var tagsCache = new TagsCache({
serverKey: '{$CACHE_KEYS.tags}',
serverId: '{$CACHE_KEYS._hash}',
rootUrl: '{$ROOT_URL}'
});
tagsCache.selectize(jQuery('[data-selectize=tags]'), { lang: {
'Add': '{'Create'|translate}'
}});
{* <!-- DATEPICKER --> *}
jQuery(function(){ {* <!-- onLoad needed to wait localization loads --> *}
jQuery('[data-datepicker]').pwgDatepicker({
showTimepicker: true,
cancelButton: '{'Cancel'|translate}'
});
});
{* <!-- THUMBNAILS --> *}
jQuery("a.preview-box").colorbox();
}());
{/footer_script}
<h2>{'Batch Manager'|@translate}</h2>
@ -32,7 +42,6 @@ jQuery(document).ready(function() {ldelim}
<a href="{$U_ELEMENTS_PAGE}&amp;display=5">5</a>
| <a href="{$U_ELEMENTS_PAGE}&amp;display=10">10</a>
| <a href="{$U_ELEMENTS_PAGE}&amp;display=50">50</a>
| <a href="{$U_ELEMENTS_PAGE}&amp;display=all">{'all'|@translate}</a>
</p>
</fieldset>
@ -46,9 +55,8 @@ jQuery(document).ready(function() {ldelim}
<legend>{$element.LEGEND}</legend>
<span class="thumb">
<a href="{$element.FILE_SRC}" class="preview-box" title="{$element.LEGEND|@htmlspecialchars}"><img src="{$element.TN_SRC}" alt=""></a>
<br/>
<a href="{$element.U_EDIT}">{'Edit'|@translate}</a>
<a href="{$element.FILE_SRC}" class="preview-box icon-zoom-in" title="{$element.LEGEND|@htmlspecialchars}"><img src="{$element.TN_SRC}" alt=""></a>
<a href="{$element.U_EDIT}" class="icon-pencil">{'Edit'|@translate}</a>
</span>
<table>
@ -66,28 +74,12 @@ jQuery(document).ready(function() {ldelim}
<tr>
<td><strong>{'Creation date'|@translate}</strong></td>
<td>
<label><input type="radio" name="date_creation_action-{$element.id}" value="unset"> {'unset'|@translate}</label>
<label><input type="radio" name="date_creation_action-{$element.id}" value="set" id="date_creation_action_set-{$element.id}"> {'set to'|@translate}</label>
<select id="date_creation_day-{$element.id}" name="date_creation_day-{$element.id}">
<option value="0">--</option>
{section name=day start=1 loop=32}
<option value="{$smarty.section.day.index}" {if $smarty.section.day.index==$element.DATE_CREATION_DAY}selected="selected"{/if}>{$smarty.section.day.index}</option>
{/section}
</select>
<select id="date_creation_month-{$element.id}" name="date_creation_month-{$element.id}">
{html_options options=$month_list selected=$element.DATE_CREATION_MONTH}
</select>
<input id="date_creation_year-{$element.id}"
name="date_creation_year-{$element.id}"
type="text"
size="4"
maxlength="4"
value="{$element.DATE_CREATION_YEAR}">
<input id="date_creation_linked_date-{$element.id}" name="date_creation_linked_date-{$element.id}" type="hidden" size="10" disabled="disabled">
{footer_script}
pwg_initialization_datepicker("#date_creation_day-{$element.id}", "#date_creation_month-{$element.id}", "#date_creation_year-{$element.id}", "#date_creation_linked_date-{$element.id}", "#date_creation_action_set-{$element.id}");
{/footer_script}
<input type="hidden" name="date_creation-{$element.id}" value="{$element.DATE_CREATION}">
<label>
<i class="icon-calendar"></i>
<input type="text" data-datepicker="date_creation-{$element.id}" data-datepicker-unset="date_creation_unset-{$element.id}" readonly>
</label>
<a href="#" class="icon-cancel-circled" id="date_creation_unset-{$element.id}">{'unset'|translate}</a>
</td>
</tr>
<tr>
@ -102,13 +94,9 @@ jQuery(document).ready(function() {ldelim}
<tr>
<td><strong>{'Tags'|@translate}</strong></td>
<td>
<select name="tags-{$element.id}">
{foreach from=$element.TAGS item=tag}
<option value="{$tag.id}" class="selected">{$tag.name}</option>
{/foreach}
</select>
<select data-selectize="tags" data-value="{$element.TAGS|@json_encode|escape:html}"
placeholder="{'Type in a search term'|translate}"
data-create="true" name="tags-{$element.id}[]" multiple style="width:500px;"></select>
</td>
</tr>
@ -130,16 +118,4 @@ jQuery(document).ready(function() {ldelim}
</p>
{/if}
</form>
{footer_script}
{literal}$(document).ready(function() {
$(".elementEdit img")
.fadeTo("slow", 0.6) // Opacity on page load
.hover(function(){
$(this).fadeTo("slow", 1.0); // Opacity on hover
},function(){
$(this).fadeTo("slow", 0.6); // Opacity on mouseout
});
});{/literal}
{/footer_script}
</form>

View file

@ -85,8 +85,9 @@ jQuery(document).ready(function(){
<input type="hidden" name="pwg_token" value="{$PWG_TOKEN}">
<p><strong>{'Sort order'|@translate}</strong>
<br><label><input type="radio" value="asc" name="ascdesc" checked="checked">{'ascending'|@translate}</label>
<br><label><input type="radio" value="desc" name="ascdesc">{'descending'|@translate}</label>
{foreach from=$sort_orders key=sort_code item=sort_label}
<br><label><input type="radio" value="{$sort_code}" name="order_by" {if $sort_code eq $sort_order_checked}checked="checked"{/if}> {$sort_label}</label>
{/foreach}
</p>
<p>

View file

@ -1,3 +1,36 @@
{combine_script id='LocalStorageCache' load='footer' path='admin/themes/default/js/LocalStorageCache.js'}
{combine_script id='jquery.selectize' load='footer' path='themes/default/js/plugins/selectize.min.js'}
{combine_css id='jquery.selectize' path="themes/default/js/plugins/selectize.{$themeconf.colorscheme}.css"}
{footer_script}
{* <!-- CATEGORIES --> *}
var categoriesCache = new CategoriesCache({
serverKey: '{$CACHE_KEYS.categories}',
serverId: '{$CACHE_KEYS._hash}',
rootUrl: '{$ROOT_URL}'
});
categoriesCache.selectize(jQuery('[data-selectize=categories]'), {
default: 0,
filter: function(categories, options) {
// remove itself and children
var filtered = jQuery.grep(categories, function(cat) {
return !(/\b{$CAT_ID}\b/.test(cat.uppercats));
});
filtered.push({
id: 0,
fullname: '------------',
global_rank: 0
});
return filtered;
}
});
{/footer_script}
<div class="titrePage">
<h2><span style="letter-spacing:0">{$CATEGORIES_NAV}</span> &#8250; {'Edit album'|@translate} {$TABSHEET_TITLE}</h2>
</div>
@ -71,21 +104,19 @@
<textarea cols="50" rows="5" name="comment" id="comment" class="description">{$CAT_COMMENT}</textarea>
</p>
{if isset($move_cat_options) }
{if isset($parent_category) }
<p>
<strong>{'Parent album'|@translate}</strong>
<br>
<select class="categoryDropDown" name="parent">
<option value="0">------------</option>
{html_options options=$move_cat_options selected=$move_cat_options_selected }
</select>
<select data-selectize="categories" data-value="{$parent_category|@json_encode|escape:html}"
name="parent" style="width:600px"></select>
</p>
{/if}
<p>
<strong>{'Lock'|@translate}</strong>
<br>
{html_radios name='visible' values=['true','false'] output=['No'|translate,'Yes'|translate] selected=$CAT_VISIBLE}
{html_radios name='visible' values=['true','true_sub','false'] output=['No'|translate,'No and unlock sub-albums'|translate,'Yes'|translate] selected=$CAT_VISIBLE}
</p>
{if isset($CAT_COMMENTABLE)}
@ -93,6 +124,10 @@
<strong>{'Comments'|@translate}</strong>
<br>
{html_radios name='commentable' values=['false','true'] output=['No'|translate,'Yes'|translate] selected=$CAT_COMMENTABLE}
<label id="applytoSubAction">
<input type="checkbox" name="apply_commentable_on_sub">
{'Apply to sub-albums'|@translate}
</label>
</p>
{/if}

View file

@ -1,39 +1,52 @@
{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='LocalStorageCache' load='footer' path='admin/themes/default/js/LocalStorageCache.js'}
{footer_script}{literal}
jQuery(document).ready(function() {
jQuery(".chzn-select").chosen();
{combine_script id='jquery.selectize' load='footer' path='themes/default/js/plugins/selectize.min.js'}
{combine_css id='jquery.selectize' path="themes/default/js/plugins/selectize.{$themeconf.colorscheme}.css"}
function checkStatusOptions() {
if (jQuery("input[name=status]:checked").val() == "private") {
jQuery("#privateOptions, #applytoSubAction").show();
}
else {
jQuery("#privateOptions, #applytoSubAction").hide();
}
}
checkStatusOptions();
jQuery("#selectStatus").change(function() {
checkStatusOptions();
});
jQuery("#indirectPermissionsDetailsShow").click(function(){
jQuery("#indirectPermissionsDetailsShow").hide();
jQuery("#indirectPermissionsDetailsHide").show();
jQuery("#indirectPermissionsDetails").show();
return false;
});
jQuery("#indirectPermissionsDetailsHide").click(function(){
jQuery("#indirectPermissionsDetailsShow").show();
jQuery("#indirectPermissionsDetailsHide").hide();
jQuery("#indirectPermissionsDetails").hide();
return false;
});
{footer_script}
(function(){
{* <!-- GROUPS --> *}
var groupsCache = new GroupsCache({
serverKey: '{$CACHE_KEYS.groups}',
serverId: '{$CACHE_KEYS._hash}',
rootUrl: '{$ROOT_URL}'
});
{/literal}{/footer_script}
groupsCache.selectize(jQuery('[data-selectize=groups]'));
{* <!-- USERS --> *}
var usersCache = new UsersCache({
serverKey: '{$CACHE_KEYS.users}',
serverId: '{$CACHE_KEYS._hash}',
rootUrl: '{$ROOT_URL}'
});
usersCache.selectize(jQuery('[data-selectize=users]'));
{* <!-- TOGGLES --> *}
function checkStatusOptions() {
if (jQuery("input[name=status]:checked").val() == "private") {
jQuery("#privateOptions, #applytoSubAction").show();
}
else {
jQuery("#privateOptions, #applytoSubAction").hide();
}
}
checkStatusOptions();
jQuery("#selectStatus").change(function() {
checkStatusOptions();
});
{if isset($nb_users_granted_indirect) && $nb_users_granted_indirect>0}
jQuery(".toggle-indirectPermissions").click(function(e){
jQuery(".toggle-indirectPermissions").toggle();
jQuery("#indirectPermissionsDetails").toggle();
e.preventDefault();
});
{/if}
}());
{/footer_script}
<div class="titrePage">
<h2><span style="letter-spacing:0">{$CATEGORIES_NAV}</span> &#8250; {'Edit album'|@translate} {$TABSHEET_TITLE}</h2>
@ -58,9 +71,9 @@ jQuery(document).ready(function() {
{if count($groups) > 0}
<strong>{'Permission granted for groups'|@translate}</strong>
<br>
<select data-placeholder="{'Select groups...'|@translate}" class="chzn-select" multiple style="width:700px;" name="groups[]">
{html_options options=$groups selected=$groups_selected}
</select>
<select data-selectize="groups" data-value="{$groups_selected|@json_encode|escape:html}"
placeholder="{'Type in a search term'|translate}"
name="groups[]" multiple style="width:600px;"></select>
{else}
{'There is no group in this gallery.'|@translate} <a href="admin.php?page=group_list" class="externalLink">{'Group management'|@translate}</a>
{/if}
@ -69,16 +82,16 @@ jQuery(document).ready(function() {
<p>
<strong>{'Permission granted for users'|@translate}</strong>
<br>
<select data-placeholder="{'Select users...'|@translate}" class="chzn-select" multiple style="width:700px;" name="users[]">
{html_options options=$users selected=$users_selected}
</select>
<select data-selectize="users" data-value="{$users_selected|@json_encode|escape:html}"
placeholder="{'Type in a search term'|translate}"
name="users[]" multiple style="width:600px;"></select>
</p>
{if isset($nb_users_granted_indirect)}
{if isset($nb_users_granted_indirect) && $nb_users_granted_indirect>0}
<p>
{'%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>
<a href="#" class="toggle-indirectPermissions" style="display:none">{'hide details'|@translate}</a>
<a href="#" class="toggle-indirectPermissions">{'show details'|@translate}</a>
<ul id="indirectPermissionsDetails" style="display:none">
{foreach from=$user_granted_indirect_groups item=group_details}
@ -150,7 +163,10 @@ 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" {if $INHERIT}checked="checked"{/if}>{'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}">

View file

@ -65,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">{if $comment.IS_PENDING}<span class="pendingFlag">{'Waiting'|@translate}</span> - {/if}<strong>{$comment.AUTHOR}</strong> - <em>{$comment.DATE}</em></p>
<p class="commentHeader">{if $comment.IS_PENDING}<span class="pendingFlag">{'Waiting'|@translate}</span> - {/if}{if !empty($comment.IP)}{$comment.IP} - {/if}<strong>{$comment.AUTHOR}</strong> - <em>{$comment.DATE}</em></p>
<blockquote>{$comment.CONTENT}</blockquote>
</div>
</td>

View file

@ -1,852 +0,0 @@
{footer_script}
(function(){
var targets = {
'input[name="rate"]' : '#rate_anonymous',
'input[name="allow_user_registration"]' : '#email_admin_on_new_user',
'input[name="comments_validation"]' : '#email_admin_on_comment_validation',
'input[name="user_can_edit_comment"]' : '#email_admin_on_comment_edition',
'input[name="user_can_delete_comment"]' : '#email_admin_on_comment_deletion',
};
for (selector in targets) {
var target = targets[selector];
jQuery(target).toggle(jQuery(selector).is(':checked'));
(function(target){
jQuery(selector).on('change', function() {
jQuery(target).toggle($(this).is(':checked'));
});
})(target);
};
}());
{/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 class="mainConf">
<legend>{'Basic settings'|translate}</legend>
<ul>
<li>
<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>
<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>
<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>
</li>
<li>
<label>
<input type="checkbox" name="allow_user_registration" {if ($main.allow_user_registration)}checked="checked"{/if}>
{'Allow user registration'|@translate}
</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>
</li>
<li>
<label>
<input type="checkbox" name="allow_user_customization" {if ($main.allow_user_customization)}checked="checked"{/if}>
{'Allow user customization'|@translate}
</label>
</li>
<li>
<label>
<input type="checkbox" name="obligatory_user_mail_address" {if ($main.obligatory_user_mail_address)}checked="checked"{/if}>
{'Mail address is obligatory for all users'|@translate}
</label>
</li>
</ul>
{footer_script require='jquery'}
jQuery("#activate_comments").change(function(){
if ($(this).is(':checked')) {
jQuery("#comments_param_warp").show();
} else {
jQuery("#comments_param_warp").hide();
}
});
{/footer_script}
</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 class="no-bold">
<input type="checkbox" name="history_guest" {if ($main.history_guest)}checked="checked"{/if}>
{'simple visitors'|@translate}
</label>
<label class="no-bold">
<input type="checkbox" name="log" {if ($main.log)}checked="checked"{/if}>
{'registered users'|@translate}
</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" class="no-border">
<legend></legend>
<ul>
<li>
<label>
<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>
<input type="checkbox" name="comments_forall" {if ($comments.comments_forall)}checked="checked"{/if}>
{'Comments for all'|@translate}
</label>
</li>
<li>
<label>
{'Number of comments per page'|@translate}
<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}
<select name="comments_order">
{html_options options=$comments.comments_order_options selected=$comments.comments_order}
</select>
</label>
</li>
<li>
<label>
<input type="checkbox" name="comments_validation" {if ($comments.comments_validation)}checked="checked"{/if}>
{'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}>
{'Email address is mandatory'|@translate}
</label>
</li>
<li>
<label>
<input type="checkbox" name="user_can_edit_comment" {if ($comments.user_can_edit_comment)}checked="checked"{/if}>
{'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}>
{'Allow users to delete their own comments'|@translate}
</label>
</li>
<li id="notifyAdmin">
<strong>{'Notify administrators when a comment is'|@translate}</strong>
<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 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" 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" 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>
</ul>
</fieldset>
{/if}
{if isset($sizes)}
{footer_script}
(function(){
var labelMaxWidth = "{'Maximum width'|@translate}",
labelWidth = "{'Width'|@translate}",
labelMaxHeight = "{'Maximum height'|@translate}",
labelHeight = "{'Height'|@translate}";
function toggleResizeFields(size) {
var checkbox = jQuery("#original_resize");
var needToggle = jQuery("#sizeEdit-original");
if (jQuery(checkbox).is(':checked')) {
needToggle.show();
}
else {
needToggle.hide();
}
}
toggleResizeFields("original");
jQuery("#original_resize").click(function () {
toggleResizeFields("original");
});
jQuery("a[id^='sizeEditOpen-']").click(function(){
var sizeName = jQuery(this).attr("id").split("-")[1];
jQuery("#sizeEdit-"+sizeName).toggle();
jQuery(this).hide();
return false;
});
jQuery(".cropToggle").click(function() {
var labelBoxWidth = jQuery(this).parents('table.sizeEditForm').find('td.sizeEditWidth');
var labelBoxHeight = jQuery(this).parents('table.sizeEditForm').find('td.sizeEditHeight');
if (jQuery(this).is(':checked')) {
jQuery(labelBoxWidth).html(labelWidth);
jQuery(labelBoxHeight).html(labelHeight);
}
else {
jQuery(labelBoxWidth).html(labelMaxWidth);
jQuery(labelBoxHeight).html(labelMaxHeight);
}
});
jQuery("#showDetails").click(function() {
jQuery(".sizeDetails").show();
jQuery(this).css("visibility", "hidden");
return false;
});
}());
{/footer_script}
{html_style}{literal}
.sizeEnable {width:50px;}
.sizeEditForm {margin:0 0 10px 20px;}
.sizeEdit {display:none;}
#sizesConf table {margin:0;}
.showDetails {padding:0;}
.sizeDetails {display:none;margin-left:10px;}
.sizeEditOpen {margin-left:10px;}
{/literal}{/html_style}
<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}>
{'Resize after upload'|@translate}
</label>
</div>
<table id="sizeEdit-original">
<tr>
<th>{'Maximum width'|@translate}</th>
<td>
<input type="text" name="original_resize_maxwidth" value="{$sizes.original_resize_maxwidth}" size="4" maxlength="4"{if isset($ferrors.original_resize_maxwidth)} class="dError"{/if}> {'pixels'|@translate}
{if isset($ferrors.original_resize_maxwidth)}<span class="dErrorDesc" title="{$ferrors.original_resize_maxwidth}">!</span>{/if}
</td>
</tr>
<tr>
<th>{'Maximum height'|@translate}</th>
<td>
<input type="text" name="original_resize_maxheight" value="{$sizes.original_resize_maxheight}" size="4" maxlength="4"{if isset($ferrors.original_resize_maxheight)} class="dError"{/if}> {'pixels'|@translate}
{if isset($ferrors.original_resize_maxheight)}<span class="dErrorDesc" title="{$ferrors.original_resize_maxheight}">!</span>{/if}
</td>
</tr>
<tr>
<th>{'Image Quality'|@translate}</th>
<td>
<input type="text" name="original_resize_quality" value="{$sizes.original_resize_quality}" size="3" maxlength="3"{if isset($ferrors.original_resize_quality)} class="dError"{/if}> %
{if isset($ferrors.original_resize_quality)}<span class="dErrorDesc" title="{$ferrors.original_resize_quality}">!</span>{/if}
</td>
</tr>
</table>
{/if}
</fieldset>
<fieldset id="multiSizesConf">
<legend>{'Multiple Size'|@translate}</legend>
<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>
<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}
<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}][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>
{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>
{/if}
</fieldset>
{/if}
{if isset($watermark)}
{footer_script}
(function(){
function onWatermarkChange() {
var val = jQuery("#wSelect").val();
if (val.length) {
jQuery("#wImg").attr('src', '{$ROOT_URL}'+val).show();
}
else {
jQuery("#wImg").hide();
}
}
onWatermarkChange();
jQuery("#wSelect").bind("change", onWatermarkChange);
if (jQuery("input[name='w[position]']:checked").val() == 'custom') {
jQuery("#positionCustomDetails").show();
}
jQuery("input[name='w[position]']").change(function(){
if (jQuery(this).val() == 'custom') {
jQuery("#positionCustomDetails").show();
}
else {
jQuery("#positionCustomDetails").hide();
}
});
jQuery(".addWatermarkOpen").click(function(){
jQuery("#addWatermark, #selectWatermark").toggle();
return false;
});
}());
{/footer_script}
<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}
</select>
{'... or '|@translate}<a href="#" class="addWatermarkOpen">{'add a new watermark'|@translate}</a>
<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)
{if isset($ferrors.watermarkImage)}<span class="dErrorDesc" title="{$ferrors.watermarkImage|@htmlspecialchars}">!</span>{/if}
</span>{* #addWatermark *}
</li>
<li>
<label>
{'Apply watermark if width is bigger than'|@translate}
<input size="4" maxlength="4" type="text" name="w[minw]" value="{$watermark.minw}"{if isset($ferrors.watermark.minw)} class="dError"{/if}>
</label>
{'pixels'|@translate}
</li>
<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}>
</label>
{'pixels'|@translate}
</li>
<li>
<label>{'Position'|@translate}</label>
<br>
<div id="watermarkPositionBox">
<label class="right">{'top right corner'|@translate} <input name="w[position]" type="radio" value="topright"{if $watermark.position eq 'topright'} checked="checked"{/if}></label>
<label><input name="w[position]" type="radio" value="topleft"{if $watermark.position eq 'topleft'} checked="checked"{/if}> {'top left corner'|@translate}</label>
<label class="middle"><input name="w[position]" type="radio" value="middle"{if $watermark.position eq 'middle'} checked="checked"{/if}> {'middle'|@translate}</label>
<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}>%
{if isset($ferrors.watermark.xpos)}<span class="dErrorDesc" title="{$ferrors.watermark.xpos}">!</span>{/if}
</label>
<br>
<label>{'Y Position'|@translate}
<input size="3" maxlength="3" type="text" name="w[ypos]" value="{$watermark.ypos}"{if isset($ferrors.watermark.ypos)} class="dError"{/if}>%
{if isset($ferrors.watermark.ypos)}<span class="dErrorDesc" title="{$ferrors.watermark.ypos}">!</span>{/if}
</label>
<br>
<label>{'X Repeat'|@translate}
<input size="3" maxlength="3" type="text" name="w[xrepeat]" value="{$watermark.xrepeat}"{if isset($ferrors.watermark.xrepeat)} class="dError"{/if}>
{if isset($ferrors.watermark.xrepeat)}<span class="dErrorDesc" title="{$ferrors.watermark.xrepeat}">!</span>{/if}
</label>
</div>
</li>
<li>
<label>{'Opacity'|@translate}</label>
<input size="3" maxlength="3" type="text" name="w[opacity]" value="{$watermark.opacity}"{if isset($ferrors.watermark.opacity)} class="dError"{/if}> %
{if isset($ferrors.watermark.opacity)}<span class="dErrorDesc" title="{$ferrors.watermark.opacity}">!</span>{/if}
</li>
</ul>
</fieldset>
{/if} {* end of watermark section *}
{if isset($display)}
<fieldset id="indexDisplayConf">
<legend>{'Main Page'|@translate}</legend>
<ul>
<li>
<label>
<input type="checkbox" name="menubar_filter_icon" {if ($display.menubar_filter_icon)}checked="checked"{/if}>
{'Activate icon "%s"'|@translate:('display only recently posted photos'|@translate|@ucfirst)}
</label>
</li>
<li>
<label>
<input type="checkbox" name="index_new_icon" {if ($display.index_new_icon)}checked="checked"{/if}>
{'Activate icon "new" next to albums and pictures'|@translate}
</label>
</li>
<li>
<label>
<input type="checkbox" name="index_sort_order_input" {if ($display.index_sort_order_input)}checked="checked"{/if}>
{'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}>
{'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}>
{'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}>
{'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}>
{'Activate icon "%s"'|@translate:('slideshow'|@translate|@ucfirst)}
</label>
</li>
<li>
<label>
{'Number of albums per page'|@translate}
<input type="text" size="3" maxlength="4" name="nb_categories_page" id="nb_categories_page" value="{$display.NB_CATEGORIES_PAGE}">
</label>
</li>
</ul>
</fieldset>
<fieldset id="pictureDisplayConf">
<legend>{'Photo Page'|@translate}</legend>
<ul>
<li>
<label>
<input type="checkbox" name="picture_slideshow_icon" {if ($display.picture_slideshow_icon)}checked="checked"{/if}>
{'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}>
{'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}>
{'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}>
{'Activate icon "%s"'|@translate:('add this photo to your favorites'|@translate|@ucfirst)}
</label>
</li>
<li>
<label>
<input type="checkbox" name="picture_navigation_icons" {if ($display.picture_navigation_icons)}checked="checked"{/if}>
{'Activate Navigation Bar'|@translate}
</label>
</li>
<li>
<label>
<input type="checkbox" name="picture_navigation_thumb" {if ($display.picture_navigation_thumb)}checked="checked"{/if}>
{'Activate Navigation Thumbnails'|@translate}
</label>
</li>
<li>
<label>
<input type="checkbox" name="picture_menu" {if ($display.picture_menu)}checked="checked"{/if}>
{'Show menubar'|@translate}
</label>
</li>
</ul>
</fieldset>
<fieldset id="pictureInfoConf">
<legend>{'Photo Properties'|@translate}</legend>
<ul>
<li>
<label>
<input type="checkbox" name="picture_informations[author]" {if ($display.picture_informations.author)}checked="checked"{/if}>
{'Author'|@translate}
</label>
</li>
<li>
<label>
<input type="checkbox" name="picture_informations[created_on]" {if ($display.picture_informations.created_on)}checked="checked"{/if}>
{'Created on'|@translate}
</label>
</li>
<li>
<label>
<input type="checkbox" name="picture_informations[posted_on]" {if ($display.picture_informations.posted_on)}checked="checked"{/if}>
{'Posted on'|@translate}
</label>
</li>
<li>
<label>
<input type="checkbox" name="picture_informations[dimensions]" {if ($display.picture_informations.dimensions)}checked="checked"{/if}>
{'Dimensions'|@translate}
</label>
</li>
<li>
<label>
<input type="checkbox" name="picture_informations[file]" {if ($display.picture_informations.file)}checked="checked"{/if}>
{'File'|@translate}
</label>
</li>
<li>
<label>
<input type="checkbox" name="picture_informations[filesize]" {if ($display.picture_informations.filesize)}checked="checked"{/if}>
{'Filesize'|@translate}
</label>
</li>
<li>
<label>
<input type="checkbox" name="picture_informations[tags]" {if ($display.picture_informations.tags)}checked="checked"{/if}>
{'Tags'|@translate}
</label>
</li>
<li>
<label>
<input type="checkbox" name="picture_informations[categories]" {if ($display.picture_informations.categories)}checked="checked"{/if}>
{'Albums'|@translate}
</label>
</li>
<li>
<label>
<input type="checkbox" name="picture_informations[visits]" {if ($display.picture_informations.visits)}checked="checked"{/if}>
{'Visits'|@translate}
</label>
</li>
<li>
<label>
<input type="checkbox" name="picture_informations[rating_score]" {if ($display.picture_informations.rating_score)}checked="checked"{/if}>
{'Rating score'|@translate}
</label>
</li>
<li>
<label>
<input type="checkbox" name="picture_informations[privacy_level]" {if ($display.picture_informations.privacy_level)}checked="checked"{/if}>
{'Who can see this photo?'|@translate} ({'available for administrators only'|@translate})
</label>
</li>
</ul>
</fieldset>
{/if}
</div> <!-- configContent -->
{if !isset($default)}
<p class="formButtons">
<input type="submit" name="submit" value="{'Save Settings'|@translate}">
</p>
</form>
{/if}
{if isset($default)}
<div id="configContent">
{$PROFILE_CONTENT}
</div>
{/if}

View file

@ -64,7 +64,7 @@ jQuery('.thumbnail').tipTip({
<legend>{'Sort order'|@translate}</legend>
<p class="field">
<input type="radio" name="image_order_choice" id="image_order_default" value="default"{if $image_order_choice=='default'} checked="checked"{/if}>
<label for="image_order_default">{'Use the default photo sort order (defined in the configuration file)'|@translate}</label>
<label for="image_order_default">{'Use the default photo sort order'|@translate}</label>
</p>
<p class="field">
<input type="radio" name="image_order_choice" id="image_order_rank" value="rank"{if $image_order_choice=='rank'} checked="checked"{/if}>

View file

@ -2,82 +2,59 @@
Warning : This is the admin pages footer only
don't be confusing with the public page footer
*}
</div> <!-- pwgMain -->
</div>{* <!-- pwgMain --> *}
{if isset($footer_elements)}
{foreach from=$footer_elements item=v}
{$v}
{foreach from=$footer_elements item=elt}
{$elt}
{/foreach}
{/if}
{if isset($debug.QUERIES_LIST)}
<div id="debug">
{$debug.QUERIES_LIST}
{$debug.QUERIES_LIST}
</div>
{/if}
<div id="footer">
<div id="piwigoInfos">
{* 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 class="externalLink" href="{$PHPWG_URL}" title="{'Visit Piwigo project website'|@translate}">
<span class="Piwigo">Piwigo</span></a>
{'Powered by'|translate}
<a class="externalLink tiptip" href="{$PHPWG_URL}" title="{'Visit Piwigo project website'|translate}"><span class="Piwigo">Piwigo</span></a>
{$VERSION}
| <a class="externalLink" href="{$pwgmenu.WIKI}" title="{'Read Piwigo Documentation'|@translate}">{'Documentation'|@translate}</a>
| <a class="externalLink" href="{$pwgmenu.FORUM}" title="{'Get Support on Piwigo Forum'|@translate}">{'Support'|@translate}</a>
</div> <!-- piwigoInfos -->
| <a class="externalLink tiptip" href="{$pwgmenu.WIKI}" title="{'Read Piwigo Documentation'|translate}">{'Documentation'|translate}</a>
| <a class="externalLink tiptip" href="{$pwgmenu.FORUM}" title="{'Get Support on Piwigo Forum'|translate}">{'Support'|translate}</a>
</div>
<div id="pageInfos">
{if isset($debug.TIME) }
{'Page generated in'|@translate} {$debug.TIME} ({$debug.NB_QUERIES} {'SQL queries in'|@translate} {$debug.SQL_TIME}) -
{/if}
{if isset($debug.TIME) }
{'Page generated in'|translate} {$debug.TIME} ({$debug.NB_QUERIES} {'SQL queries in'|translate} {$debug.SQL_TIME}) -
{/if}
{'Contact'|translate}
<a href="mailto:{$CONTACT_MAIL}?subject={'A comment on your site'|translate|escape:url}">{'Webmaster'|translate}</a>
</div>{* <!-- pageInfos --> *}
</div>{* <!-- footer --> *}
</div>{* <!-- the_page --> *}
{'Contact'|@translate}
<a href="mailto:{$CONTACT_MAIL}?subject={'A comment on your site'|@translate|@escape:url}">{'Webmaster'|@translate}</a>
</div> <!-- pageInfos -->
</div> <!-- footer -->
</div> <!-- the_page -->
{combine_script id='jquery.tipTip' load='async' path='themes/default/js/plugins/jquery.tipTip.minified.js'}
{combine_script id='jquery.tipTip' load='footer' path='themes/default/js/plugins/jquery.tipTip.minified.js'}
{footer_script require='jquery.tipTip'}
jQuery(document).ready(function() {ldelim}
jQuery('#pwgHead A[title], #footer A[title], .themeActions .tiptip, .languageActions .tiptip').tipTip({ldelim}
'delay' : 0,
'fadeIn' : 200,
'fadeOut' : 200
});
jQuery('.tiptip').tipTip({
delay: 0,
fadeIn: 200,
fadeOut: 200
});
jQuery('a.externalLink').click(function() {
window.open(jQuery(this).attr("href"));
return false;
});
{/footer_script}
<!-- BEGIN get_combined_scripts -->
<!-- BEGIN get_combined -->
{get_combined_scripts load='footer'}
<!-- END get_combined_scripts -->
{literal}
<script type='text/javascript'>
jQuery(document).ready(function() {
$("a.externalLink").click(function() {
window.open($(this).attr("href"));
return false;
});
});
</script>
{/literal}
{if not $ENABLE_SYNCHRONIZATION}
{literal}
<script type='text/javascript'>
$(document).ready(function() {
$("#helpSynchro").hide();
});
</script>
{/literal}
{/if}
<!-- END get_combined -->
</body>
</html>

View file

@ -1,42 +1,39 @@
{*
Warning : This is the admin pages header only
don't confuse with the public page header
*}
<!DOCTYPE html>
<html lang="{$lang_info.code}" dir="{$lang_info.direction}">
<head>
<meta http-equiv="Content-Type" content="text/html; charset={$CONTENT_ENCODING}">
<meta name="generator" content="Piwigo (aka PWG), see piwigo.org">
<meta charset="{$CONTENT_ENCODING}">
<title>{$GALLERY_TITLE} :: {$PAGE_TITLE}</title>
<link rel="shortcut icon" type="image/x-icon" href="{$ROOT_URL}{$themeconf.icon_dir}/favicon.ico">
{get_combined_css}
{strip}
{combine_css path="admin/themes/default/fontello/css/fontello.css" order=-10}
{foreach from=$themes item=theme}
{if $theme.load_css}
{combine_css path="admin/themes/`$theme.id`/theme.css" order=-10}
{/if}
{if !empty($theme.local_head)}{include file=$theme.local_head load_css=$theme.load_css}{/if}
{if $theme.load_css}
{combine_css path="admin/themes/`$theme.id`/theme.css" order=-10}
{/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'}
<!-- END get_combined_scripts -->
{combine_script id='jquery' path='themes/default/js/jquery.min.js'}
{/strip}
<!--[if lt IE 7]>
<script type="text/javascript" src="{$ROOT_URL}themes/default/js/pngfix.js"></script>
<![endif]-->
<!-- BEGIN get_combined -->
{get_combined_css}
{get_combined_scripts load='header'}
<!-- END get_combined -->
{if not empty($head_elements)}
{foreach from=$head_elements item=elt}
{$elt}
{$elt}
{/foreach}
{/if}
</head>
<body id="{$BODY_ID}">
@ -53,18 +50,18 @@
<div id="pwgHead">
<h1>
<a href="{$U_RETURN}" title="{'Visit Gallery'|@translate}">
<span class="icon-home" style="font-size:larger"></span>
{$GALLERY_TITLE}
<a href="{$U_RETURN}" title="{'Visit Gallery'|translate}" class="tiptip">
<span class="icon-home" style="font-size:larger"></span>
{$GALLERY_TITLE}
</a>
</h1>
<div id="headActions">
{'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>
{'Hello'|translate} {$USERNAME} |
<a class="icon-eye" href="{$U_RETURN}">{'Visit Gallery'|translate}</a> |
<a class="icon-brush tiptip" href="{$U_CHANGE_THEME}" title="{'Switch to clear or dark colors for administration'|translate}">{'Change Admin Colors'|translate}</a> |
<a class="icon-help-circled tiptip" 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>
@ -78,4 +75,4 @@
</div>
{/if}
<div id="pwgMain">
<div id="pwgMain">

View file

@ -1,3 +1,9 @@
{if not $ENABLE_SYNCHRONIZATION}
{html_style}{literal}
#helpSynchro {display:none;}
{/literal}{/html_style}
{/if}
<h2>{'Help'|@translate} &raquo; {$HELP_SECTION_TITLE}</h2>
<div id="helpContent">

View file

@ -1,10 +1,11 @@
{include file='include/datepicker.inc.tpl'}
{footer_script}{literal}
pwg_initialization_datepicker("#start_day", "#start_month", "#start_year", "#start_linked_date", null, null, "#end_linked_date");
pwg_initialization_datepicker("#end_day", "#end_month", "#end_year", "#end_linked_date", null, "#start_linked_date", null);
{/literal}{/footer_script}
{footer_script}
jQuery(function(){ {* <!-- onLoad needed to wait localization loads --> *}
jQuery('[data-datepicker]').pwgDatepicker();
});
{/footer_script}
<h2>{'History'|@translate} {$TABSHEET_TITLE}</h2>
@ -14,33 +15,25 @@
<ul>
<li><label>{'Date'|@translate}</label></li>
<li>
<select id="start_day" name="start_day">
<option value="0">--</option>
{section name=day start=1 loop=32}
<option value="{$smarty.section.day.index}" {if $smarty.section.day.index==$START_DAY_SELECTED}selected="selected"{/if}>{$smarty.section.day.index}</option>
{/section}
</select>
<select id="start_month" name="start_month">
{html_options options=$month_list selected=$START_MONTH_SELECTED}
</select>
<input id="start_year" name="start_year" value="{$START_YEAR}" type="text" size="4" maxlength="4" >
<input id="start_linked_date" name="start_linked_date" type="hidden" size="10" disabled="disabled">
<input type="hidden" name="start" value="{$START}">
<label>
<i class="icon-calendar"></i>
<input type="text" data-datepicker="start" data-datepicker-end="end" data-datepicker-unset="start_unset" readonly>
</label>
<br>
<a href="#" class="icon-cancel-circled" id="start_unset">{'unset'|translate}</a>
</li>
</ul>
<ul>
<li><label>{'End-Date'|@translate}</label></li>
<li>
<select id="end_day" name="end_day">
<option value="0">--</option>
{section name=day start=1 loop=32}
<option value="{$smarty.section.day.index}" {if $smarty.section.day.index==$END_DAY_SELECTED}selected="selected"{/if}>{$smarty.section.day.index}</option>
{/section}
</select>
<select id="end_month" name="end_month">
{html_options options=$month_list selected=$END_MONTH_SELECTED}
</select>
<input id="end_year" name="end_year" value="{$END_YEAR}" type="text" size="4" maxlength="4" >
<input id="end_linked_date" name="end_linked_date" type="hidden" size="10" disabled="disabled">
<input type="hidden" name="end" value="{$END}">
<label>
<i class="icon-calendar"></i>
<input type="text" data-datepicker="end" data-datepicker-start="start" data-datepicker-unset="end_unset" readonly>
</label>
<br>
<a href="#" class="icon-cancel-circled" id="end_unset">{'unset'|translate}</a>
</li>
</ul>

View file

@ -1,90 +1,21 @@
{footer_script}{literal}
jQuery(document).ready(function(){
jQuery(".addAlbumOpen").colorbox({
inline: true,
href: "#addAlbumForm",
onComplete: function() {
var $albumSelect = jQuery("#albumSelect");
{if empty($load_mode)}{$load_mode='footer'}{/if}
{include file='include/colorbox.inc.tpl' load_mode=$load_mode}
jQuery("input[name=category_name]").focus();
jQuery("#category_parent").html('<option value="0">------------</option>')
.append($albumSelect.html())
.val($albumSelect.val() || 0);
}
});
{combine_script id='jquery.selectize' load='footer' path='themes/default/js/plugins/selectize.min.js'}
{combine_css id='jquery.selectize' path="themes/default/js/plugins/selectize.{$themeconf.colorscheme}.css"}
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",
dataType: 'json',
data: {
format: 'json',
method: 'pwg.categories.add',
parent: parent_id,
name: name
},
beforeSend: function() {
jQuery("#albumCreationLoading").show();
},
success: function(data) {
jQuery("#albumCreationLoading").hide();
jQuery(".addAlbumOpen").colorbox.close();
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);
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) {
jQuery("#albumCreationLoading").hide();
jQuery("#categoryNameError").text(errorThrows).css("color", "red");
}
});
return false;
});
});
{/literal}{/footer_script}
{combine_script id='addAlbum' load=$load_mode path='admin/themes/default/js/addAlbum.js'}
<div style="display:none">
<div id="addAlbumForm" style="text-align:left;padding:1em;">
<div id="addAlbumForm">
<form>
{'Parent album'|@translate}<br>
<select id="category_parent" name="category_parent">
</select>
<select name="category_parent"></select>
<br><br>
{'Album name'|@translate}<br>
<input name="category_name" type="text" maxlength="255"> <span id="categoryNameError"></span>
<input name="category_name" type="text" maxlength="255">
<span id="categoryNameError" style="color:red;">{'The name of an album must not be empty'|translate}</span>
<br><br><br>
<input type="submit" value="{'Create'|@translate}">

View file

@ -1,2 +1,3 @@
{combine_script id='jquery.colorbox' load='footer' require='jquery' path='themes/default/js/plugins/jquery.colorbox.min.js'}
{combine_css path="themes/default/js/plugins/colorbox/style2/colorbox.css"}
{if empty($load_mode)}{$load_mode='footer'}{/if}
{combine_script id='jquery.colorbox' load=$load_mode require='jquery' path='themes/default/js/plugins/jquery.colorbox.min.js'}
{combine_css id='jquery.colorbox' path="themes/default/js/plugins/colorbox/style2/colorbox.css"}

View file

@ -1,18 +1,22 @@
{combine_script id='datepicker.js' load='footer' require='jquery.ui.datepicker' path='themes/default/js/datepicker.js'}
{assign var="datepicker_language" value="themes/default/js/ui/i18n/jquery.ui.datepicker-`$lang_info.code`.js"}
{if empty($load_mode)}{$load_mode='footer'}{/if}
{combine_script id='jquery.ui.timepicker-addon' load=$load_mode require='jquery.ui.datepicker,jquery.ui.slider' path="themes/default/js/ui/jquery.ui.timepicker-addon.js"}
{$require='jquery.ui.timepicker-addon'}
{assign var="datepicker_language" value="themes/default/js/ui/i18n/jquery.ui.datepicker-`$lang_info.jquery_code`.js"}
{if "PHPWG_ROOT_PATH"|@constant|@cat:$datepicker_language|@file_exists}
{combine_script id="jquery.ui.datepicker-$lang_info.code" load='footer' path=$datepicker_language}
{combine_script id="jquery.ui.datepicker-`$lang_info.jquery_code`" load=$load_mode require='jquery.ui.datepicker' path=$datepicker_language}
{$require=$require|cat:",jquery.ui.datepicker-`$lang_info.jquery_code`"}
{/if}
{combine_css path="themes/default/js/ui/theme/jquery.ui.datepicker.css"}
{assign var="timepicker_language" value="themes/default/js/ui/i18n/jquery.ui.timepicker-`$lang_info.jquery_code`.js"}
{if "PHPWG_ROOT_PATH"|@constant|@cat:$datepicker_language|@file_exists}
{combine_script id="jquery.ui.timepicker-`$lang_info.jquery_code`" load=$load_mode require='jquery.ui.timepicker-addon' path=$timepicker_language}
{$require=$require|cat:",jquery.ui.timepicker-`$lang_info.jquery_code`"}
{/if}
{footer_script require='jquery.ui.datepicker,datepicker.js'}
function pwg_initialization_datepicker(day, month, year, linked_date, checked_on_change, min_linked_date, max_linked_date)
{ldelim}
return pwg_common_initialization_datepicker(
"{$ROOT_URL}{$themeconf.admin_icon_dir}/datepicker.png",
day, month, year, linked_date, checked_on_change, min_linked_date, max_linked_date);
};
{/footer_script}
{combine_script id='datepicker' load=$load_mode require=$require path='admin/themes/default/js/datepicker.js'}
{combine_css path="themes/default/js/ui/theme/jquery.ui.theme.css"}
{combine_css path="themes/default/js/ui/theme/jquery.ui.slider.css"}
{combine_css path="themes/default/js/ui/theme/jquery.ui.datepicker.css"}
{combine_css path="themes/default/js/ui/theme/jquery.ui.timepicker-addon.css"}

View file

@ -1,14 +1,14 @@
{footer_script require='jquery'}{literal}
jQuery(document).ready(function(){
jQuery(".tagSelection label").click(function () {
jQuery(".tagSelection").on("click", "label", function () {
var parent = jQuery(this).parent('li');
var checkbox = jQuery(this).children("input[type=checkbox]");
if (jQuery(checkbox).is(':checked')) {
jQuery(parent).addClass("tagSelected");
parent.addClass("tagSelected");
}
else {
jQuery(parent).removeClass('tagSelected');
parent.removeClass('tagSelected');
}
});
});

View file

@ -1,78 +1,58 @@
{if $upload_mode eq 'multiple'}
{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='common' load='footer' path='admin/themes/default/js/common.js'}
{combine_script id='jquery.jgrowl' load='footer' require='jquery' path='themes/default/js/plugins/jquery.jgrowl_minimized.js'}
{combine_script id='jquery.plupload' load='footer' require='jquery' path='themes/default/js/plugins/plupload/plupload.full.min.js'}
{combine_script id='jquery.plupload.queue' load='footer' require='jquery' path='themes/default/js/plugins/plupload/jquery.plupload.queue/jquery.plupload.queue.min.js'}
{combine_script id='jquery.ui.progressbar' load='footer'}
{combine_css path="themes/default/js/plugins/jquery.jgrowl.css"}
{combine_css path="admin/include/uploadify/uploadify.css"}
{combine_css path="themes/default/js/plugins/plupload/jquery.plupload.queue/css/jquery.plupload.queue.css"}
{assign var="plupload_i18n" value="themes/default/js/plugins/plupload/i18n/`$lang_info.plupload_code`.js"}
{if "PHPWG_ROOT_PATH"|@constant|@cat:$plupload_i18n|@file_exists}
{combine_script id="plupload_i18n-`$lang_info.plupload_code`" load="footer" path=$plupload_i18n require="jquery.plupload.queue"}
{/if}
{include file='include/colorbox.inc.tpl'}
{include file='include/add_album.inc.tpl'}
{footer_script}{literal}
{combine_script id='LocalStorageCache' load='footer' path='admin/themes/default/js/LocalStorageCache.js'}
{combine_script id='jquery.selectize' load='footer' path='themes/default/js/plugins/selectize.min.js'}
{combine_css id='jquery.selectize' path="themes/default/js/plugins/selectize.{$themeconf.colorscheme}.css"}
{footer_script}
{* <!-- CATEGORIES --> *}
var categoriesCache = new CategoriesCache({
serverKey: '{$CACHE_KEYS.categories}',
serverId: '{$CACHE_KEYS._hash}',
rootUrl: '{$ROOT_URL}'
});
categoriesCache.selectize(jQuery('[data-selectize=categories]'), {
filter: function(categories, options) {
if (categories.length > 0) {
jQuery("#albumSelection, .selectFiles, .showFieldset").show();
}
return categories;
}
});
jQuery('[data-add-album]').pwgAddAlbum({
afterSelect: function() {
jQuery("#albumSelection, .selectFiles, .showFieldset").show();
}
});
var pwg_token = '{$pwg_token}';
var photosUploaded_label = "{'%d photos uploaded'|translate}";
var batch_Label = "{'Manage this set of %d photos'|translate}";
var albumSummary_label = "{'Album "%s" now contains %d photos'|translate|escape}";
var uploadedPhotos = [];
var uploadCategory = null;
{literal}
jQuery(document).ready(function(){
function checkUploadStart() {
var nbErrors = 0;
jQuery("#formErrors").hide();
jQuery("#formErrors li").hide();
if (jQuery("#albumSelect option:selected").length == 0) {
jQuery("#formErrors #noAlbum").show();
nbErrors++;
}
var nbFiles = 0;
if (jQuery("#uploadBoxes").size() == 1) {
jQuery("input[name^=image_upload]").each(function() {
if (jQuery(this).val() != "") {
nbFiles++;
}
});
}
else {
nbFiles = jQuery(".uploadifyQueueItem").size();
}
if (nbFiles == 0) {
jQuery("#formErrors #noPhoto").show();
nbErrors++;
}
if (nbErrors != 0) {
jQuery("#formErrors").show();
return false;
}
else {
return true;
}
}
function humanReadableFileSize(bytes) {
var byteSize = Math.round(bytes / 1024 * 100) * .01;
var suffix = 'KB';
if (byteSize > 1000) {
byteSize = Math.round(byteSize *.001 * 100) * .01;
suffix = 'MB';
}
var sizeParts = byteSize.toString().split('.');
if (sizeParts.length > 1) {
byteSize = sizeParts[0] + '.' + sizeParts[1].substr(0,2);
}
else {
byteSize = sizeParts[0];
}
return byteSize+suffix;
}
jQuery("#hideErrors").click(function() {
jQuery("#formErrors").hide();
return false;
});
jQuery("#uploadWarningsSummary a.showInfo").click(function() {
jQuery("#uploadWarningsSummary").hide();
jQuery("#uploadWarnings").show();
@ -85,137 +65,145 @@ jQuery(document).ready(function(){
return false;
});
{/literal}
{if $upload_mode eq 'html'}
{literal}
function addUploadBox() {
var uploadBox = '<p class="file"><input type="file" size="60" name="image_upload[]"></p>';
jQuery(uploadBox).appendTo("#uploadBoxes");
}
jQuery("#uploader").pluploadQueue({
// General settings
browse_button : 'addFiles',
container : 'uploadForm',
// runtimes : 'html5,flash,silverlight,html4',
runtimes : 'html5',
addUploadBox();
// url : '../upload.php',
url : 'ws.php?method=pwg.images.upload&format=json',
chunk_size: '500kb',
filters : {
// Maximum file size
max_file_size : '1000mb',
// Specify what files to browse for
mime_types: [
{title : "Image files", extensions : "{/literal}{$file_exts}{literal}"}
]
},
jQuery("#addUploadBox A").click(function () {
addUploadBox();
});
// Rename files by clicking on their titles
// rename: true,
jQuery("#uploadForm").submit(function() {
return checkUploadStart();
});
{/literal}
{elseif $upload_mode eq 'multiple'}
// Enable ability to drag'n'drop files onto the widget (currently only HTML5 supports that)
dragdrop: true,
var uploadify_path = '{$uploadify_path}';
var upload_id = '{$upload_id}';
var session_id = '{$session_id}';
var pwg_token = '{$pwg_token}';
var buttonText = "{'Select files'|@translate}";
var sizeLimit = Math.round({$upload_max_filesize} / 1024); /* in KBytes */
{literal}
jQuery("#uploadify").uploadify({
'uploader' : uploadify_path + '/uploadify.php',
'langFile' : uploadify_path + '/uploadifyLang_en.js',
'swf' : uploadify_path + '/uploadify.swf',
'checkExisting' : false,
buttonCursor : 'pointer',
'buttonText' : buttonText,
'width' : 300,
'cancelImage' : uploadify_path + '/cancel.png',
'queueID' : 'fileQueue',
'auto' : false,
'multi' : true,
'fileTypeDesc' : 'Photo files',
'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,
'onSelect' : function(event,ID,fileObj) {
jQuery("#fileQueue").show();
},
'onQueueComplete' : function(stats) {
jQuery("input[name=submit_upload]").click();
},
onUploadError: function (file,errorCode,errorMsg,errorString,swfuploadifyQueue) {
/* uploadify calls the onUploadError trigger when the user cancels a file! */
/* There no error so we skip it to avoid panic. */
if ("Cancelled" == errorString) {
return false;
preinit: {
Init: function (up, info) {
jQuery('#uploader_container').removeAttr("title"); //remove the "using runtime" text
jQuery('#startUpload').on('click', function(e) {
e.preventDefault();
up.start();
});
jQuery('#cancelUpload').on('click', function(e) {
e.preventDefault();
up.stop();
up.trigger('UploadComplete', up.files);
});
}
var msg = file.name+', '+errorString;
/* Let's put the error message in the form to display once the form is */
/* performed, it makes support easier when user can copy/paste the error */
/* thrown. */
jQuery("#uploadForm").append('<input type="hidden" name="onUploadError[]" value="'+msg+'">');
jQuery.jGrowl(
'<p></p>onUploadError '+msg,
{
theme: 'error',
header: 'ERROR',
life: 4000,
sticky: false
}
);
return false;
},
onUploadSuccess: function (file,data,response) {
var data = jQuery.parseJSON(data);
jQuery("#uploadedPhotos").parent("fieldset").show();
/* Let's display the thumbnail of the uploaded photo, no need to wait the */
/* end of the queue */
jQuery("#uploadedPhotos").prepend('<img src="'+data.thumbnail_url+'" class="thumbnail"> ');
},
onUploadComplete: function(file,swfuploadifyQueue) {
var max = parseInt(jQuery("#progressMax").text());
var next = parseInt(jQuery("#progressCurrent").text())+1;
var addToProgressBar = 2;
if (next <= max) {
jQuery("#progressCurrent").text(next);
}
else {
addToProgressBar = 1;
}
init : {
// update custom button state on queue change
QueueChanged : function(up) {
jQuery('#startUpload').prop('disabled', up.files.length == 0);
},
UploadProgress: function(up, file) {
jQuery('#uploadingActions .progressbar').width(up.total.percent+'%');
},
BeforeUpload: function(up, file) {
//console.log('[BeforeUpload]', file);
// hide buttons
jQuery('#startUpload, #addFiles').hide();
jQuery('#uploadingActions').show();
jQuery("#progressbar").progressbar({
value: jQuery("#progressbar").progressbar("option", "value") + addToProgressBar
});
// warn user if she wants to leave page while upload is running
jQuery(window).bind('beforeunload', function() {
return "{/literal}{'Upload in progress'|translate|escape}{literal}";
});
// no more change on category/level
jQuery("select[name=level]").attr("disabled", "disabled");
// You can override settings before the file is uploaded
up.setOption(
'multipart_params',
{
category : jQuery("select[name=category] option:selected").val(),
level : jQuery("select[name=level] option:selected").val(),
pwg_token : pwg_token
// name : file.name
}
);
},
FileUploaded: function(up, file, info) {
// Called when file has finished uploading
//console.log('[FileUploaded] File:', file, "Info:", info);
// hide item line
jQuery('#'+file.id).hide();
var data = jQuery.parseJSON(info.response);
jQuery("#uploadedPhotos").parent("fieldset").show();
html = '<a href="admin.php?page=photo-'+data.result.image_id+'" target="_blank">';
html += '<img src="'+data.result.src+'" class="thumbnail" title="'+data.result.name+'">';
html += '</a> ';
jQuery("#uploadedPhotos").prepend(html);
// do not remove file, or it will reset the progress bar :-/
// up.removeFile(file);
uploadedPhotos.push(parseInt(data.result.image_id));
uploadCategory = data.result.category;
},
UploadComplete: function(up, files) {
// Called when all files are either uploaded or failed
//console.log('[UploadComplete]');
jQuery(".selectAlbum, .selectFiles, #permissions, .showFieldset").hide();
jQuery(".infos").append('<ul><li>'+sprintf(photosUploaded_label, uploadedPhotos.length)+'</li></ul>');
html = sprintf(
albumSummary_label,
'<a href="admin.php?page=album-'+uploadCategory.id+'">'+uploadCategory.label+'</a>',
parseInt(uploadCategory.nb_photos)
);
jQuery(".infos ul").append('<li>'+html+'</li>');
jQuery(".infos").show();
// TODO: use a new method pwg.caddie.empty +
// pwg.caddie.add(uploadedPhotos) instead of relying on huge GET parameter
// (and remove useless code from admin/photos_add_direct.php)
jQuery(".batchLink").attr("href", "admin.php?page=photos_add&section=direct&batch="+uploadedPhotos.join(","));
jQuery(".batchLink").html(sprintf(batch_Label, uploadedPhotos.length));
jQuery(".afterUploadActions").show();
jQuery('#uploadingActions').hide();
// user can safely leave page without warning
jQuery(window).unbind('beforeunload');
}
}
});
jQuery("input[type=button]").click(function() {
if (!checkUploadStart()) {
return false;
}
jQuery("#uploadify").uploadifySettings(
'postData',
{
'category_id' : jQuery("select[name=category] option:selected").val(),
'level' : jQuery("select[name=level] option:selected").val(),
'upload_id' : upload_id,
'session_id' : session_id,
'pwg_token' : pwg_token
}
);
nb_files = jQuery(".uploadifyQueueItem").size();
jQuery("#progressMax").text(nb_files);
jQuery("#progressbar").progressbar({max: nb_files*2, value:1});
jQuery("#progressCurrent").text(1);
jQuery("#uploadProgress").show();
jQuery("#uploadify").uploadifyUpload();
});
});
{/literal}
{/if}
});
{/footer_script}
@ -225,6 +213,10 @@ var sizeLimit = Math.round({$upload_max_filesize} / 1024); /* in KBytes */
<div id="photosAddContent">
<div class="infos" style="display:none"></div>
<p class="afterUploadActions" style="margin:10px; display:none;"><a class="batchLink"></a> | <a href="">{'Add another set of photos'|@translate}</a></p>
{if count($setup_errors) > 0}
<div class="errors">
<ul>
@ -247,82 +239,18 @@ var sizeLimit = Math.round({$upload_max_filesize} / 1024); /* in KBytes */
{/if}
{if !empty($thumbnails)}
<fieldset>
<legend>{'Uploaded Photos'|@translate}</legend>
<div>
{foreach from=$thumbnails item=thumbnail}
<a href="{$thumbnail.link}" class="externalLink">
<img src="{$thumbnail.src}" alt="{$thumbnail.file}" title="{$thumbnail.title}" class="thumbnail">
</a>
{/foreach}
</div>
<p id="batchLink"><a href="{$batch_link}">{$batch_label}</a></p>
</fieldset>
<p style="margin:10px"><a href="{$another_upload_link}">{'Add another set of photos'|@translate}</a></p>
{else}
<div id="formErrors" class="errors" style="display:none">
<ul>
<li id="noAlbum">{'Select an album'|@translate}</li>
<li id="noPhoto">{'Select at least one photo'|@translate}</li>
</ul>
<div class="hideButton" style="text-align:center"><a href="#" id="hideErrors">{'Hide'|@translate}</a></div>
</div>
<form id="uploadForm" enctype="multipart/form-data" method="post" action="{$form_action}" class="properties">
{if $upload_mode eq 'multiple'}
<input name="upload_id" value="{$upload_id}" type="hidden">
{/if}
<fieldset>
<form id="uploadForm" enctype="multipart/form-data" method="post" action="{$form_action}">
<fieldset class="selectAlbum">
<legend>{'Drop into album'|@translate}</legend>
<span id="albumSelection"{if count($category_options) == 0} style="display:none"{/if}>
<select id="albumSelect" name="category">
{html_options options=$category_options selected=$category_options_selected}
</select>
<br>{'... or '|@translate}</span><a href="#" class="addAlbumOpen" title="{'create a new album'|@translate}">{'create a new album'|@translate}</a>
<span id="albumSelection" style="display:none">
<select data-selectize="categories" data-value="{$selected_category|@json_encode|escape:html}"
data-default="first" name="category" style="width:600px"></select>
<br>{'... or '|@translate}</span>
<a href="#" data-add-album="category" title="{'create a new album'|@translate}">{'create a new album'|@translate}</a>
</fieldset>
<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="icon-info-circled-1 showInfo" title="{'Learn more'|@translate}"></a></p>
<p id="uploadWarnings">
{'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:$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:$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:$switch_url}</p>
{/if}
</fieldset>
<p class="showFieldset"><a id="showPermissions" href="#">{'Manage Permissions'|@translate}</a></p>
<p class="showFieldset" style="display:none"><a id="showPermissions" href="#">{'Manage Permissions'|@translate}</a></p>
<fieldset id="permissions" style="display:none">
<legend>{'Who can see these photos?'|@translate}</legend>
@ -332,30 +260,48 @@ var sizeLimit = Math.round({$upload_max_filesize} / 1024); /* in KBytes */
</select>
</fieldset>
{if $upload_mode eq 'html'}
<p>
<input class="submit" type="submit" name="submit_upload" value="{'Start Upload'|@translate}">
</p>
{elseif $upload_mode eq 'multiple'}
<p style="margin-bottom:1em">
<input class="submit" type="button" value="{'Start Upload'|@translate}">
<input type="submit" name="submit_upload" style="display:none">
</p>
{/if}
</form>
<fieldset class="selectFiles" style="display:none">
<legend>{'Select files'|@translate}</legend>
<button id="addFiles" class="buttonLike icon-plus-circled">{'Add Photos'|translate}</button>
{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}
<div id="uploadProgress" style="display:none">
{'Photo %s of %s'|@translate:'<span id="progressCurrent">1</span>':'<span id="progressMax">10</span>'}
<br>
<div id="progressbar"></div>
</div>
<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:$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:$max_upload_resolution:$max_upload_width:$max_upload_height}
{/if}
</p>
<div id="uploader">
<p>Your browser doesn't have HTML5 support.</p>
</div>
</fieldset>
<div id="uploadingActions" style="display:none">
<button id="cancelUpload" class="buttonLike icon-cancel-circled">{'Cancel'|translate}</button>
<div class="big-progressbar">
<div class="progressbar" style="width:0%"></div>
</div>
</div>
<button id="startUpload" class="buttonLike icon-upload" disabled>{'Start Upload'|translate}</button>
</form>
<fieldset style="display:none">
<legend>{'Uploaded Photos'|@translate}</legend>
<div id="uploadedPhotos"></div>
</fieldset>
{/if} {* empty($thumbnails) *}
{/if} {* $setup_errors *}
</div> <!-- photosAddContent -->

View file

@ -1,37 +1,45 @@
{include file='include/autosize.inc.tpl'}
{include file='include/dbselect.inc.tpl'}
{include file='include/datepicker.inc.tpl'}
{include file='include/colorbox.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"}
{combine_script id='LocalStorageCache' load='footer' path='admin/themes/default/js/LocalStorageCache.js'}
{footer_script}{literal}
jQuery(document).ready(function() {
jQuery(".chzn-select").chosen();
});
{/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}
jQuery("#tags").tokenInput(
[{foreach from=$tags item=tag name=tags}{ldelim}"name":"{$tag.name|@escape:'javascript'}","id":"{$tag.id}"{rdelim}{if !$smarty.foreach.tags.last},{/if}{/foreach}],
{ldelim}
hintText: '{'Type in a search term'|@translate}',
noResultsText: '{'No results'|@translate}',
searchingText: '{'Searching...'|@translate}',
newText: ' ({'new'|@translate})',
animateDropdown: false,
preventDuplicates: true,
allowFreeTagging: true
}
);
});
{/footer_script}
{combine_script id='jquery.selectize' load='footer' path='themes/default/js/plugins/selectize.min.js'}
{combine_css id='jquery.selectize' path="themes/default/js/plugins/selectize.{$themeconf.colorscheme}.css"}
{footer_script}
pwg_initialization_datepicker("#date_creation_day", "#date_creation_month", "#date_creation_year", "#date_creation_linked_date", "#date_creation_action_set");
(function(){
{* <!-- CATEGORIES --> *}
var categoriesCache = new CategoriesCache({
serverKey: '{$CACHE_KEYS.categories}',
serverId: '{$CACHE_KEYS._hash}',
rootUrl: '{$ROOT_URL}'
});
categoriesCache.selectize(jQuery('[data-selectize=categories]'));
{* <!-- TAGS --> *}
var tagsCache = new TagsCache({
serverKey: '{$CACHE_KEYS.tags}',
serverId: '{$CACHE_KEYS._hash}',
rootUrl: '{$ROOT_URL}'
});
tagsCache.selectize(jQuery('[data-selectize=tags]'), { lang: {
'Add': '{'Create'|translate}'
}});
{* <!-- DATEPICKER --> *}
jQuery(function(){ {* <!-- onLoad needed to wait localization loads --> *}
jQuery('[data-datepicker]').pwgDatepicker({
showTimepicker: true,
cancelButton: '{'Cancel'|translate}'
});
});
{* <!-- THUMBNAILS --> *}
jQuery("a.preview-box").colorbox();
}());
{/footer_script}
<h2>{$TITLE} &#8250; {'Edit photo'|@translate} {$TABSHEET_TITLE}</h2>
@ -45,7 +53,7 @@ pwg_initialization_datepicker("#date_creation_day", "#date_creation_month", "#da
<tr>
<td id="albumThumbnail">
<img src="{$TN_SRC}" alt="{'Thumbnail'|@translate}" class="Thumbnail">
<a href="{$FILE_SRC}" class="preview-box icon-zoom-in" title="{$TITLE|htmlspecialchars}"><img src="{$TN_SRC}" alt="{'Thumbnail'|translate}"></a>
</td>
<td id="albumLinks" style="width:400px;vertical-align:top;">
<ul style="padding-left:15px;margin:0;">
@ -92,47 +100,36 @@ pwg_initialization_datepicker("#date_creation_day", "#date_creation_month", "#da
<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>
<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">
<input name="date_creation_time" type="hidden" value="{$DATE_CREATION_TIME_VALUE}">
<a href="#" id="unset_date_creation" style="display:none">unset</a>
<input type="hidden" name="date_creation" value="{$DATE_CREATION}">
<label>
<i class="icon-calendar"></i>
<input type="text" data-datepicker="date_creation" data-datepicker-unset="date_creation_unset" readonly>
</label>
<a href="#" class="icon-cancel-circled" id="date_creation_unset">{'unset'|translate}</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>
<select data-selectize="categories" data-value="{$associated_albums|@json_encode|escape:html}"
placeholder="{'Type in a search term'|translate}"
data-default="{$STORAGE_ALBUM}" name="associate[]" multiple style="width:600px;"></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>
<select data-selectize="categories" data-value="{$represented_albums|@json_encode|escape:html}"
placeholder="{'Type in a search term'|translate}"
name="represent[]" multiple style="width:600px;"></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>
<select data-selectize="tags" data-value="{$tag_selection|@json_encode|escape:html}"
placeholder="{'Type in a search term'|translate}"
data-create="true" name="tags[]" multiple style="width:600px;"></select>
</p>
<p>

View file

@ -31,11 +31,33 @@ jQuery(document).ready(function(){
$('.pluginBox').sortElements(sortPlugins);
$.get("admin.php?plugins_new_order="+sortOrder);
});
jQuery('#filter').keyup(function(){
var filter = $(this).val();
if (filter.length>2) {
$('.pluginBox').hide();
$('#availablePlugins .pluginBox input[name="name"]').each(function(){
if ($(this).val().toUpperCase().indexOf(filter.toUpperCase()) != -1) {
$(this).parents('div').show();
}
});
}
else {
$('.pluginBox').show();
}
});
jQuery("#filter").focus();
jQuery(".titrePage input[name='Clear']").click(function(){
$("#filter").val('');
$(".pluginBox").show();
});
});
{/literal}{/footer_script}
<div class="titrePage">
<span class="sort">
{'Filter'|@translate} : <input type="text" id="filter">
<input type="button" name="Clear" Value="{'Cancel'|@translate}"> |
{'Sort order'|@translate} :
{html_options name="selectOrder" options=$order_options selected=$order_selected}
</span>

View file

@ -1,5 +0,0 @@
<div class="titrePage">
<h2>{'Profile'|@translate}</h2>
</div>
{$PROFILE_CONTENT}

View file

@ -1,93 +0,0 @@
<form method="post" name="profile" action="{$F_ACTION}" id="profile" class="properties">
<fieldset>
<legend>{'Registration'|@translate}</legend>
<input type="hidden" name="redirect" value="{$REDIRECT}">
<ul>
<li>
<span class="property">
<label for="username">{'Username'|@translate}</label>
</span>
{if not $SPECIAL_USER}
<input type="text" name="username" id="username" value="{$USERNAME}">
{else}
{$USERNAME}
{/if}
</li>
{if not $SPECIAL_USER} {* can modify password + email*}
<li>
<span class="property">
<label for="mail_address">{'Email address'|@translate}</label>
</span>
<input type="text" name="mail_address" id="mail_address" value="{$EMAIL}">
</li>
<li>
<span class="property">
<label for="use_new_pwd">{'New password'|@translate}</label>
</span>
<input type="password" name="use_new_pwd" id="use_new_pwd" value="">
</li>
<li>
<span class="property">
<label for="passwordConf">{'Confirm Password'|@translate}</label>
</span>
<input type="password" name="passwordConf" id="passwordConf" value="">
</li>
{/if}
</ul>
</fieldset>
<fieldset>
<legend>{'Preferences'|@translate}</legend>
<ul>
<li>
<span class="property">
<label for="nb_image_page">{'Number of photos per page'|@translate}</label>
</span>
<input type="text" size="4" maxlength="3" name="nb_image_page" id="nb_image_page" value="{$NB_IMAGE_PAGE}">
</li>
{if not $SPECIAL_USER}
<li>
<span class="property">
<label for="template">{'Theme'|@translate}</label>
</span>
{html_options id=template name=theme options=$template_options selected=$template_selection}
</li>
<li>
<span class="property">
<label for="language">{'Language'|@translate}</label>
</span>
{html_options id=language name=language options=$language_options selected=$language_selection}
</li>
{/if}
<li>
<span class="property">
<label for="recent_period">{'Recent period'|@translate}</label>
</span>
<input type="text" size="3" maxlength="2" name="recent_period" id="recent_period" value="{$RECENT_PERIOD}">
</li>
<li>
<span class="property">{'Expand all albums'|@translate}</span>
{html_radios name='expand' options=$radio_options selected=$EXPAND}
</li>
{if $ACTIVATE_COMMENTS}
<li>
<span class="property">{'Show number of comments'|@translate}</span>
{html_radios name='show_nb_comments' options=$radio_options selected=$NB_COMMENTS}
</li>
{/if}
<li>
<span class="property">{'Show number of hits'|@translate}</span>
{html_radios name='show_nb_hits' options=$radio_options selected=$NB_HITS}
</li>
</ul>
</fieldset>
<p class="bottomButtons">
<input type="hidden" name="pwg_token" value="{$PWG_TOKEN}">
<input class="submit" type="submit" name="validate" value="{'Submit'|@translate}">
<input class="submit" type="reset" name="reset" value="{'Reset'|@translate}">
</p>
</form>

View file

@ -12,8 +12,29 @@
.dtBar {
text-align:left;
padding-left: 20px;
padding: 10px 0 10px 20px
}
.dtBar DIV{
display:inline;
padding-right: 5px;
}
.dataTables_paginate A {
padding-left: 3px;
}
.ui-tooltip {
padding: 8px;
position: absolute;
z-index: 9999;
max-width: {3*$TN_WIDTH}px;
-webkit-box-shadow: 0 0 5px #aaa;
box-shadow: 0 0 5px #aaa;
}
body .ui-tooltip {
border-width: 2px;
}
{/html_style}
<h2>{$ratings|@count} {'Users'|@translate}</h2>
@ -42,103 +63,154 @@
</form>
{combine_script id='core.scripts' load='async' path='themes/default/js/scripts.js'}
{combine_script id='jquery.geoip' load='async' path='admin/themes/default/js/jquery.geoip.js'}
{footer_script}
var oTable = jQuery('#rateTable').dataTable({
sDom : '<"dtBar"f>rt',
bPaginate: false,
aaSorting: [[5,'desc']],
sDom : '<"dtBar"filp>rt<"dtBar"ilp>',
iDisplayLength: 100,
aLengthMenu: [ [25, 50, 100, 500, -1], [25, 50, 100, 500, "All"]],
aaSorting: [], //[[1,'desc']],
bAutoWidth: false,
bSortClasses: false,
aoColumnDefs: [
/*{
aTargets: ["dtc_user"]
},*/
{
aTargets: ["dtc_user"],
sType: "string",
sClass: null
},
{
aTargets: ["dtc_date"],
asSorting: ["desc","asc"]
asSorting: ["desc","asc"],
sType: "string",
sClass: null
},
{
aTargets: ["dtc_stat"],
asSorting: ["desc","asc"],
bSearchable: false
bSearchable: false,
sType: "numeric",
sClass: null
},
{
aTargets: ["dtc_rate"],
asSorting: ["desc","asc"],
bSearchable: false
bSearchable: false,
sType: "html",
sClass: null
},
{
aTargets: ["dtc_del"],
bSortable: false,
bSearchable: false
bSearchable: false,
sType: "string",
sClass: null
}
]
});
function del(elt,uid,aid){
if (!confirm('{'Are you sure?'|@translate|@escape:'javascript'}'))
return false;
var tr = elt;
while ( tr.nodeName != "TR") tr = tr.parentNode;
tr = jQuery(tr).fadeTo(1000, 0.4);
(new PwgWS('{$ROOT_URL|@escape:javascript}')).callService(
'pwg.rates.delete', { user_id:uid, anonymous_id:aid},
{
method: 'POST',
onFailure: function(num, text) { tr.stop(); tr.fadeTo(0,1); alert(num + " " + text); },
onSuccess: function(result){
if (result)
oTable.fnDeleteRow(tr[0]);
else
alert(result);
}
}
);
return false;
function uidFromCell(cell){
var tr = cell;
while ( tr.nodeName != "TR") tr = tr.parentNode;
return $(tr).data("usr");
}
{* -----DELETE----- *}
$(document).ready( function(){
$("#rateTable").on( "click", ".del", function(e) {
e.preventDefault();
if (!confirm('{'Are you sure?'|@translate|@escape:'javascript'}'))
return;
var cell = e.target.parentNode,
tr = cell;
while ( tr.nodeName != "TR") tr = tr.parentNode;
tr = jQuery(tr).fadeTo(1000, 0.4);
var data=uidFromCell(cell);
(new PwgWS('{$ROOT_URL|@escape:javascript}')).callService(
'pwg.rates.delete', { user_id:data.uid, anonymous_id:data.aid},
{
method: 'POST',
onFailure: function(num, text) { tr.stop(); tr.fadeTo(0,1); alert(num + " " + text); },
onSuccess: function(result){
if (result)
oTable.fnDeleteRow(tr[0]);
else
alert(result);
}
}
);
});
});
{/footer_script}
<table id="rateTable">
<thead>
<tr class="throw">
<td class="dtc_user">{'Username'|@translate}</td>
<td class="dtc_date">{'Last'|@translate}</td>
<td class="dtc_stat">{'Number of rates'|@translate}</td>
<td class="dtc_stat">{'Average rate'|@translate}</td>
<td class="dtc_stat">{'Variation'|@translate}</td>
<td class="dtc_stat">{'Consensus deviation'|@translate|@replace:' ':'<br>'}</td>
<td class="dtc_stat">{'Consensus deviation'|@translate|@replace:' ':'<br>'} {$CONSENSUS_TOP_NUMBER}</td>
<th class="dtc_user">{'Username'|@translate}</th>
<th class="dtc_date">{'Last'|@translate}</th>
<th class="dtc_stat">{'Number of rates'|@translate}</th>
<th class="dtc_stat">{'Average rate'|@translate}</th>
<th class="dtc_stat">{'Variation'|@translate}</th>
<th class="dtc_stat">{'Consensus deviation'|@translate|@replace:' ':'<br>'}</th>
<th class="dtc_stat">{'Consensus deviation'|@translate|@replace:' ':'<br>'} {$CONSENSUS_TOP_NUMBER}</th>
{foreach from=$available_rates item=rate}
<td class="dtc_rate">{$rate}</td>
<th class="dtc_rate">{$rate}</th>
{/foreach}
<td class="dtc_del"></td>
<th class="dtc_del"></th>
</tr>
</thead>
{foreach from=$ratings item=rating key=user}
<tr>
<td>{$user}</td>
<td>{$rating.last_date}</td>
<td>{$rating.count}</td>
<td>{$rating.avg|@number_format:2}</td>
<td>{$rating.cv|@number_format:3}</td>
<td>{$rating.cd|@number_format:3}</td>
<td>{if !empty($rating.cdtop)}{$rating.cdtop|@number_format:3}{/if}</td>
{foreach from=$rating.rates item=rates key=rate}
<td>{if !empty($rates)}
{capture assign=rate_over}{foreach from=$rates item=rate_arr}<img src="{$image_urls[$rate_arr.id].tn}" alt="thumb-{$rate_arr.id}" title="{$rate_arr.date}"></img>
{/foreach}{/capture}
<a class="cluetip" title="|{$rate_over|@htmlspecialchars}">{$rates|@count}</a>
{/if}</td>
{/foreach}
<td><a onclick="return del(this,{$rating.uid},'{$rating.aid}');" class="icon-trash"></a></td>
<tr data-usr='{ldelim}"uid":{$rating.uid},"aid":"{$rating.aid}"}'>
{strip}
<td class=usr>{$user}</td><td title="First: {$rating.first_date}">{$rating.last_date}</td>
<td>{$rating.count}</td><td>{$rating.avg|@number_format:2}</td>
<td>{$rating.cv|@number_format:3}</td><td>{$rating.cd|@number_format:3}</td><td>{if !empty($rating.cdtop)}{$rating.cdtop|@number_format:3}{/if}</td>
{foreach from=$rating.rates item=rates key=rate}
<td>{if !empty($rates)}
{capture assign=rate_over}{foreach $rates as $rate_arr}{if $rate_arr@index>29}{break}{/if}<img src="{$image_urls[$rate_arr.id].tn}" alt="thumb-{$rate_arr.id}" width="{$TN_WIDTH}" height="{$TN_WIDTH}">{/foreach}{/capture}
<a title="{$rate_over|@htmlspecialchars}">{$rates|@count}</a>
{/if}</td>
{/foreach}
<td><a class="del icon-trash"></a></td>
</tr>
{/strip}
{/foreach}
</table>
{combine_script id='jquery.cluetip' load='footer' require='jquery' path='themes/default/js/plugins/jquery.cluetip.js'}
{footer_script require='jquery.cluetip'}
jQuery(document).ready(function(){ldelim}
jQuery('.cluetip').cluetip({ldelim}
width: {$TN_WIDTH}, showTitle:false, splitTitle: '|'
{combine_script id='jquery.ui.tooltip' load='footer'}
{footer_script require='jquery.ui.tooltip'}
jQuery(document).ready(function(){
jQuery("#rateTable").tooltip({
items: ".usr,[title]",
content: function(callback) {
var t = $(this).attr("title");
if (t)
return t;
var that = $(this),
udata = uidFromCell(this);
if (!udata.aid)
return;
that
.data("isOver", true)
.one("mouseleave", function() {
that.removeData("isOver");
});
GeoIp.get( udata.aid + ".1", function(data) {
if (!data.fullName) return;
var content = data.fullName;
if (data.latitude && data.region_name) {
content += "<br><img width=300 height=220 src=\"http://maps.googleapis.com/maps/api/staticmap?sensor=false&size=300x220&zoom=6"
+ "&markers=size:tiny%7C" + data.latitude + "," + data.longitude
+ "\">";
}
if (that.data("isOver"))
callback(content);
});
}
});
})
{/footer_script}

View file

@ -40,6 +40,7 @@ body {
#content {
min-height:0;
border:none;
margin:1em auto;
}
#theHeader {
@ -103,6 +104,7 @@ input[type="submit"], input[type="button"], a.bigButton {
input[type="submit"]:hover, input[type="button"]:hover, a.bigButton:hover {
background-color:#ff7700;
color:white;
text-decoration:none;
}
input[type="text"], input[type="password"], select {
@ -171,11 +173,11 @@ input[type="text"]:focus, input[type="password"]:focus, select:focus {
<table>
<tr>
<td>{'Username'|@translate}</td>
<td><input type="text" name="username" id="username" size="25" maxlength="40" style="width: 150px;"></td>
<td><input type="text" name="username" id="username" size="20" maxlength="50" style="width: 150px;"></td>
</tr>
<tr>
<td>{'Password'|@translate}</td>
<td><input type="password" name="password" id="password" size="25" maxlength="25" style="width: 150px;"></td>
<td><input type="password" name="password" id="password" style="width: 150px;"></td>
</tr>
</table>
{/if}
@ -214,7 +216,7 @@ input[type="text"]:focus, input[type="password"]:focus, select:focus {
</fieldset>
<p>
<a class="bigButton" href="index.php">{'Home'|@translate}</a>
<a class="bigButton" href="{$button_link}">{$button_label}</a>
</p>
{/if}

View file

@ -3,8 +3,8 @@
{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.selectize' load='footer' path='themes/default/js/plugins/selectize.min.js'}
{combine_css id='jquery.selectize' path="themes/default/js/plugins/selectize.{$themeconf.colorscheme}.css"}
{combine_script id='jquery.underscore' load='footer' path='themes/default/js/plugins/underscore.js'}
@ -33,6 +33,12 @@ var truefalse = {
'true':"{'Yes'|translate}",
'false':"{'No'|translate}",
};
var statusLabels = {
{foreach from=$label_of_status key=status item=label}
'{$status}' : '{$label|escape:javascript}',
{/foreach}
};
{/footer_script}
{footer_script}{literal}
@ -259,11 +265,7 @@ jQuery(document).ready(function() {
user.email = user.email || '';
jQuery("#action select[name=status] option").each(function() {
if (user.status == jQuery(this).val()) {
user.statusLabel = jQuery(this).html();
}
});
user.statusLabel = statusLabels[user.status];
/* Render the underscore template */
_.templateSettings.variable = "user";
@ -274,7 +276,25 @@ jQuery(document).ready(function() {
jQuery("#user"+userId).append(template(user));
jQuery(".chzn-select").chosen();
/* groups select */
jQuery('[data-selectize=groups]').selectize({
valueField: 'value',
labelField: 'label',
searchField: ['label'],
plugins: ['remove_button']
});
var groupSelectize = jQuery('[data-selectize=groups]')[0].selectize;
groupSelectize.load(function(callback) {
callback(user.groupOptions);
});
jQuery.each(jQuery.grep(user.groupOptions, function(group) {
return group.isSelected;
}), function(i, group) {
groupSelectize.addItem(group.value);
});
/* nb_image_page slider */
var nb_image_page_init = getSliderKeyFromValue(jQuery('#user'+userId+' input[name=nb_image_page]').val(), nb_image_page_values);
@ -1086,11 +1106,8 @@ span.infos, span.errors {background-image:none; padding:2px 5px; margin:0;border
<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>
<select data-selectize="groups" placeholder="{'Type in a search term'|translate}"
name="group_id[]" multiple style="width:340px;"></select>
</div>
</div>

View file

@ -574,11 +574,6 @@ img.ui-datepicker-trigger {
text-align:left;
}
#photosAddContent FIELDSET {
width:650px;
margin:0 auto 20px auto;
}
#photosAddContent P {
margin:0;
}
@ -977,8 +972,10 @@ LEGEND {
#batchManagerGlobal #applyFilterBlock {margin-top:20px;}
#batchManagerGlobal .useFilterCheckbox {display:none;}
#batchManagerGlobal #filter_dimension blockquote {margin:5px 0 20px 15px;}
#batchManagerGlobal #filter_dimension .ui-slider-horizontal {width:650px;margin:5px 0 10px 0;}
#batchManagerGlobal blockquote {margin:5px 0 20px 15px;}
#batchManagerGlobal .ui-slider-horizontal {width:650px;margin:5px 0 10px 0;}
#batchManagerGlobal #duplicates_options label {margin-left:10px;}
#order_filters a.addFilter {font-weight:normal;margin-left:20px;}
#order_filters a.removeFilter {font-weight:normal;}
@ -988,6 +985,11 @@ LEGEND {
#order_filters .order_by_is_custom {display:block;font-weight:normal;font-style:italic;margin-left:20px;}
/* Upload Form */
.plupload_header {display:none;}
#uploadForm .plupload_container {padding:0}
#uploadForm .plupload_scroll .plupload_filelist {height:250px;}
#uploadForm li.plupload_droptext {line-height:230px;font-size:2em;}
#uploadBoxes .file {margin-bottom:5px;text-align:left;}
#uploadBoxes {margin-top:20px;}
#addUploadBox {margin-bottom:2em;}
@ -998,11 +1000,49 @@ 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;}
#photosAddContent p.showFieldset {text-align:left;margin: 0 auto 10px auto;width: 650px;}
#photosAddContent p.showFieldset {text-align:left;margin: 1em;}
#uploadProgress {width:650px; margin:10px auto;font-size:90%;}
#progressbar {border:1px solid #ccc; background-color:#eee;}
.ui-progressbar-value { background-image: url(images/pbar-ani.gif); height:10px;margin:-1px;border:1px solid #E78F08;}
#uploadForm .plupload_buttons, #uploadForm .plupload_progress { display:none !important; }
#uploadForm #startUpload { margin:5px 0 15px 15px; padding:5px 10px; font-size:1.1em; }
#uploadForm #startUpload:before { margin-right:0.5em; }
#uploadForm #addFiles { margin-right:10px; float:left; }
#uploadForm #uploadingActions { margin:10px 10px 10px 15px; }
#uploadForm .big-progressbar { vertical-align:middle; display:inline-block; margin-left:10px; }
.big-progressbar {
width:100%;
max-width:600px;
background:#fff;
padding:0;
border-radius:5px;
position:relative;
height:18px;
}
@keyframes animatedBackground {
from { background-position: 0 0; }
to { background-position: 33px 0; }
}
@-webkit-keyframes animatedBackground {
from { background-position: 0 0; }
to { background-position: 33px 0; }
}
.big-progressbar .progressbar {
height:18px;
min-width:5px;
background:#444;
border-radius:5px 0 0 5px;
background-size:33px 25px;
animation: animatedBackground 1s linear infinite;
-webkit-animation: animatedBackground 1s linear infinite;
}
/* Selectize */
.selectize-dropdown [data-selectable], .selectize-dropdown .optgroup-header {
padding: 0px 5px !important;
}
/* Tag Manager */
.warningDeletion {display:none;font-style:italic;}
@ -1043,7 +1083,17 @@ p#uploadModeInfos {text-align:left;margin-top:1em;font-size:90%;color:#999;}
}
/* Album Manager */
#addAlbumForm input[name="category_name"], #formCreateAlbum input[name="virtual_name"] {
#addAlbumForm {
text-align:left;
padding:1em;
}
#addAlbumForm .selectize-dropdown-content {
max-height:170px;
}
#addAlbumForm input[name="category_name"] {
width:600px;
}
#formCreateAlbum input[name="virtual_name"] {
width:300px;
}
@ -1162,6 +1212,8 @@ a.group_perm {
#userList .openUserDetails {visibility:hidden;}
#userList tr:hover .openUserDetails {visibility:visible;}
#userList .icon-cancel-circled {visibility:visible;}
#userList_length {float:none;}
#userList_filter {margin-top:-20px;}
.userProperties {max-width:730px;}
.userPropertiesContainer {border-top:1px solid #ddd;margin-top:1em;}
@ -1171,3 +1223,70 @@ a.group_perm {
.userProperty {width:340px;float:left;margin-bottom:15px;}
.userActions {float:right;text-align:right;}
.preview-box.icon-zoom-in {
display:block;
position:relative;
}
.preview-box.icon-zoom-in:before {
opacity:0;
position:absolute;
margin:-22px 0 0 -22px;
top:50%;
left:50%;
font-size:50px;
line-height:50px;
color:white;
z-index:100;
text-shadow:0 0 20px rgba(0,0,0,0.4);
-webkit-transition:opacity 200ms ease;
transition:opacity 200ms ease;
}
.preview-box.icon-zoom-in:hover:before {
opacity:0.9;
}
.preview-box.icon-zoom-in img {
opacity:1;
-webkit-transition:opacity 200ms ease;
transition:opacity 200ms ease;
}
.preview-box.icon-zoom-in:hover img {
opacity:0.5;
}
/* table in help/quick_search.html */
table.qsearch_help_table {
border-collapse:collapse;
text-align:left;
margin:1em;
}
table.qsearch_help_table q {
font-family: Courier, Fixed;
font-weight: bold;
}
table.qsearch_help_table q:before {
content: '\'';
color: green;
}
table.qsearch_help_table q:after {
content: '\'';
color: green;
}
table.qsearch_help_table td {
border: 1px solid #ccc;
padding:5px;
vertical-align:top;
}
.font-checkbox [class*=icon-check]:before {
font-size:16px;
line-height:16px;
margin-right:0;
margin-left:0;
}
.font-checkbox .icon-check-empty {
position:relative;
left:-1px;
}
.font-checkbox input[type=checkbox], .font-checkbox input[type=radio] {
display:none;
}

View file

@ -4,6 +4,6 @@ $themeconf = array(
'icon_dir' => 'themes/default/icon',
'admin_icon_dir' => 'admin/themes/default/icon',
'mime_icon_dir' => 'themes/default/icon/mimetypes/',
'local_head' => 'local_head.tpl',
'colorscheme' => 'dark',
);
?>

View file

@ -16,7 +16,7 @@
*/
/* text color */
body, h3, dt, .throw, .content, label, LEGEND {
color:#666;
color:#777;
}
INPUT, select, textarea { color:#999; background-color: #444; }
@ -136,6 +136,7 @@ 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; 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;
@ -144,20 +145,20 @@ padding:0; width:207px; z-index:99; text-align: left;
}
#menubar dd {
background: transparent url(images/menubar-detail.png) repeat-y top left;
background: #111 url(images/menubar-detail.png) repeat-y top left;
margin: 0; padding: 0 0 10px 0; }
#menubar dl {
background:transparent url(images/menuBoxTop_new.png) no-repeat scroll left top;
width: 207px; border:0; margin: 0; padding: 0; display: block; min-height:35px; }
#menubar dl.first {
#menubar dl:first-of-type{
background:transparent url(images/menubar-top.png) no-repeat scroll left 1px; }
#menubar dl.last { padding: 0 0 24px 0;}
#menubar dl:last-of-type { 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;
cursor:pointer;
}
#menubar dt span { background-color: #111; }
#menubar dt * { 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); }
@ -238,6 +239,12 @@ INPUT[type="text"].large { width: 317px; }
text-decoration: none;
}
.buttonLike:disabled, input[type="button"]:disabled, input[type="submit"]:disabled, input[type="reset"]:disabled {
color:#666;
border-color:#666;
cursor:not-allowed;
}
.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;}
@ -289,7 +296,15 @@ div.token-input-dropdown {background-color:#eee !important;border-color:#666 !im
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;}
.big-progressbar {
background:#1a1e22;
box-shadow:inset 0px 1px 1px 0px black, 0px 1px 1px 0px #36393F;
}
.big-progressbar .progressbar {
background:#ff3363;
background:#ff3363 linear-gradient(135deg, rgba(0,0,0,0) 44%,rgba(0,0,0,0.2) 44%,rgba(0,0,0,0.2) 57%,rgba(0,0,0,0) 57%);
background-size:33px 25px;
}
/* Album Properties */
#albumThumbnail img, #albumLinks {
@ -338,3 +353,9 @@ table.dataTable thead th {
.userPropertiesContainer {border-color:#333;}
.userPrefs {border-color:#333;}
table.qsearch_help_table td {
border-color: #444;
}
.font-checkbox [class*=icon-check]:before { color:#aaa; }

View file

@ -2,5 +2,6 @@
$themeconf = array(
'name' => 'roma',
'parent' => 'default',
'colorscheme' => 'dark',
);
?>

View file

@ -91,6 +91,7 @@ foreach ($themes->fs_themes as $theme_id => $fs_theme)
if (in_array($theme_id, $db_theme_ids))
{
$tpl_theme['STATE'] = 'active';
$tpl_theme['IS_DEFAULT'] = ($theme_id == $default_theme);
$tpl_theme['DEACTIVABLE'] = true;
if (count($db_theme_ids) <= 1)
@ -98,8 +99,11 @@ foreach ($themes->fs_themes as $theme_id => $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);
if ($tpl_theme['IS_DEFAULT'])
{
$tpl_theme['DEACTIVABLE'] = false;
$tpl_theme['DEACTIVATE_TOOLTIP'] = l10n('Impossible to deactivate the default theme.');
}
}
else
{
@ -172,6 +176,7 @@ $template->assign(
)
);
trigger_notify('loc_end_themes_installed');
$template->set_filenames(array('themes' => 'themes_installed.tpl'));
$template->assign_var_from_handle('ADMIN_CONTENT', 'themes');

View file

@ -86,6 +86,7 @@ $template->assign(
array(
'users' => $users,
'all_users' => join(',', $user_ids),
'ACTIVATE_COMMENTS' => $conf['activate_comments'],
'Double_Password' => $conf['double_password_type_in_admin']
)
);
@ -99,6 +100,18 @@ $protected_users = array(
$conf['webmaster_id'],
);
// an admin can't delete other admin/webmaster
if ('admin' == $user['status'])
{
$query = '
SELECT
user_id
FROM '.USER_INFOS_TABLE.'
WHERE status IN (\'webmaster\', \'admin\')
;';
$protected_users = array_merge($protected_users, query2array($query, null, 'user_id'));
}
$template->assign(
array(
'PWG_TOKEN' => get_pwg_token(),
@ -117,12 +130,19 @@ $template->assign(
// Status options
foreach (get_enums(USER_INFOS_TABLE, 'status') as $status)
{
// Only status <= can be assign
if (is_autorize_status(get_access_type_status($status)))
{
$pref_status_options[$status] = l10n('user_status_'.$status);
}
$label_of_status[$status] = l10n('user_status_'.$status);
}
$pref_status_options = $label_of_status;
// a simple "admin" can set/remove statuses webmaster/admin
if ('admin' == $user['status'])
{
unset($pref_status_options['webmaster']);
unset($pref_status_options['admin']);
}
$template->assign('label_of_status', $label_of_status);
$template->assign('pref_status_options', $pref_status_options);
$template->assign('pref_status_selected', 'normal');

Some files were not shown because too many files have changed in this diff Show more