diff --git a/sources/about.php b/sources/about.php index e4f04bf..9f6318d 100644 --- a/sources/about.php +++ b/sources/about.php @@ -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'); diff --git a/sources/admin.php b/sources/admin.php index cf36ce5..213f33b 100644 --- a/sources/admin.php +++ b/sources/admin.php @@ -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(); diff --git a/sources/admin/album_notification.php b/sources/admin/album_notification.php index d565b6c..cafaad1 100644 --- a/sources/admin/album_notification.php +++ b/sources/admin/album_notification.php @@ -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'] ) )), diff --git a/sources/admin/batch_manager.php b/sources/admin/batch_manager.php index 2cb76f7..257b11b 100644 --- a/sources/admin/batch_manager.php +++ b/sources/admin/batch_manager.php @@ -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 | diff --git a/sources/admin/batch_manager_global.php b/sources/admin/batch_manager_global.php index 2828d8b..4179ed2 100644 --- a/sources/admin/batch_manager_global.php +++ b/sources/admin/batch_manager_global.php @@ -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'); diff --git a/sources/admin/batch_manager_unit.php b/sources/admin/batch_manager_unit.php index ddf4206..bed0cdc 100644 --- a/sources/admin/batch_manager_unit.php +++ b/sources/admin/batch_manager_unit.php @@ -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 | diff --git a/sources/admin/cat_list.php b/sources/admin/cat_list.php index 729fe84..54cb445 100644 --- a/sources/admin/cat_list.php +++ b/sources/admin/cat_list.php @@ -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 → Z'), + 'name DESC' => l10n('Album name, Z → A'), + 'date_creation DESC' => l10n('Date created, new → old'), + 'date_creation ASC' => l10n('Date created, old → new'), + 'date_available DESC' => l10n('Date posted, new → old'), + 'date_available ASC' => l10n('Date posted, old → 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.= '&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 | diff --git a/sources/admin/cat_modify.php b/sources/admin/cat_modify.php index 4eeeffe..3cf8239 100644 --- a/sources/admin/cat_modify.php +++ b/sources/admin/cat_modify.php @@ -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.= '
'.l10n('Numeric identifier : %d', $category['id']); -$template->assign('INTRO', $intro); - -$template->assign( - 'U_MANAGE_RANKS', - $base_url.'element_set_ranks&cat_id='.$category['id'] - ); +$template->assign(array( + 'INTRO' => $intro, + 'U_MANAGE_RANKS' => $base_url.'element_set_ranks&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'); diff --git a/sources/admin/cat_perm.php b/sources/admin/cat_perm.php index 71653d9..c42b3ea 100644 --- a/sources/admin/cat_perm.php +++ b/sources/admin/cat_perm.php @@ -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'); ?> diff --git a/sources/admin/comments.php b/sources/admin/comments.php index 2740d77..0f09faf 100644 --- a/sources/admin/comments.php +++ b/sources/admin/comments.php @@ -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'], ) ); diff --git a/sources/admin/configuration.php b/sources/admin/configuration.php index f1b943c..e7e6033 100644 --- a/sources/admin/configuration.php +++ b/sources/admin/configuration.php @@ -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]) { diff --git a/sources/admin/element_set_ranks.php b/sources/admin/element_set_ranks.php index 289cc2a..8b68ce6 100644 --- a/sources/admin/element_set_ranks.php +++ b/sources/admin/element_set_ranks.php @@ -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'; } diff --git a/sources/admin/help.php b/sources/admin/help.php index 97d8d05..0625ea6 100644 --- a/sources/admin/help.php +++ b/sources/admin/help.php @@ -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( diff --git a/sources/admin/history.php b/sources/admin/history.php index 7d52f80..26855bb 100644 --- a/sources/admin/history.php +++ b/sources/admin/history.php @@ -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'] ] = ''.trigger_event("render_tag_name", $row['name'], $row).''; + $name_of_tag[ $row['id'] ] = ''.trigger_change("render_tag_name", $row['name'], $row).''; } } @@ -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'); -?> \ No newline at end of file +?> diff --git a/sources/admin/include/add_core_tabs.inc.php b/sources/admin/include/add_core_tabs.inc.php index efc9cd0..28cf1ce 100644 --- a/sources/admin/include/add_core_tabs.inc.php +++ b/sources/admin/include/add_core_tabs.inc.php @@ -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' => ''.l10n('Permissions'), 'url' => $admin_album_base_url.'-permissions'); $sheets['notification'] = array('caption' => ''.l10n('Notification'), 'url' => $admin_album_base_url.'-notification'); break; - + case 'albums': global $my_base_url; $sheets['list'] = array('caption' => ''.l10n('List'), 'url' => $my_base_url.'cat_list'); $sheets['move'] = array('caption' => ''.l10n('Move'), 'url' => $my_base_url.'cat_move'); $sheets['permalinks'] = array('caption' => ''.l10n('Permalinks'), 'url' => $my_base_url.'permalinks'); 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' => ''.l10n('Public / Private'), 'url' => $link_start.'cat_options&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&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' => ' '.l10n('User list'), 'url' => ''); + global $my_base_url; + $sheets[''] = array('caption' => ' '.l10n('User list'), 'url' => $my_base_url.'user_list'); break; case 'groups': - $sheets[''] = array('caption' => ' '.l10n('Groups'), 'url' => ''); + global $my_base_url; + $sheets[''] = array('caption' => ' '.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' => ''.l10n('Statistics'), 'url' => $link_start.'stats'); $sheets['history'] = array('caption' => ''.l10n('Search'), 'url' => $link_start.'history'); break; - + case 'languages': global $my_base_url; $sheets['installed'] = array('caption' => ''.l10n('Installed Languages'), 'url' => $my_base_url.'&tab=installed'); $sheets['update'] = array('caption' => ''.l10n('Check for updates'), 'url' => $my_base_url.'&tab=update'); $sheets['new'] = array('caption' => ''.l10n('Add New Language'), 'url' => $my_base_url.'&tab=new'); break; - + case 'nbm': global $base_url; $sheets['param'] = array('caption' => l10n('Parameter'), 'url' => $base_url.'?page=notification_by_mail&mode=param'); $sheets['subscribe'] = array('caption' => l10n('Subscribe'), 'url' => $base_url.'?page=notification_by_mail&mode=subscribe'); $sheets['send'] = array('caption' => l10n('Send'), 'url' => $base_url.'?page=notification_by_mail&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' => ''.l10n('Center of interest'), 'url' => $admin_photo_base_url.'-coi'); break; - + case 'photos_add': global $conf; $sheets['direct'] = array('caption' => ''.l10n('Web Form'), 'url' => PHOTOS_ADD_BASE_URL.'&section=direct'); @@ -122,33 +125,33 @@ function add_core_tabs($sheets, $tab_id) if ($conf['enable_synchronization']) $sheets['ftp'] = array('caption' => ''.l10n('FTP + Synchronization'), 'url' => PHOTOS_ADD_BASE_URL.'&section=ftp'); break; - + case 'plugins': global $my_base_url; $sheets['installed'] = array('caption' => ''.l10n('Plugin list'), 'url' => $my_base_url.'&tab=installed'); $sheets['update'] = array('caption' => ''.l10n('Check for updates'), 'url' => $my_base_url.'&tab=update'); $sheets['new'] = array('caption' => ''.l10n('Other plugins'), 'url' => $my_base_url.'&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' => ''.l10n('Installed Themes'), 'url' => $my_base_url.'&tab=installed'); $sheets['update'] = array('caption' => ''.l10n('Check for updates'), 'url' => $my_base_url.'&tab=update'); $sheets['new'] = array('caption' => ''.l10n('Add New Theme'), 'url' => $my_base_url.'&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.'&tab=ext'); break; } - + return $sheets; } diff --git a/sources/admin/include/check_integrity.class.php b/sources/admin/include/check_integrity.class.php index da549d7..66ff1db 100644 --- a/sources/admin/include/check_integrity.class.php +++ b/sources/admin/include/check_integrity.class.php @@ -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) diff --git a/sources/admin/include/configuration_sizes_process.inc.php b/sources/admin/include/configuration_sizes_process.inc.php index 47cfaf3..a731aa5 100644 --- a/sources/admin/include/configuration_sizes_process.inc.php +++ b/sources/admin/include/configuration_sizes_process.inc.php @@ -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'])) diff --git a/sources/admin/include/functions.php b/sources/admin/include/functions.php index ac59d2d..7d29f57 100644 --- a/sources/admin/include/functions.php +++ b/sources/admin/include/functions.php @@ -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) } } -?> \ No newline at end of file +/** + * 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; +} \ No newline at end of file diff --git a/sources/admin/include/functions_history.inc.php b/sources/admin/include/functions_history.inc.php index 61d6765..e2bcc4d 100644 --- a/sources/admin/include/functions_history.inc.php +++ b/sources/admin/include/functions_history.inc.php @@ -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 '
'; print_r($search); echo '
'; - + $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'); ?> \ No newline at end of file diff --git a/sources/admin/include/functions_install.inc.php b/sources/admin/include/functions_install.inc.php index 9e479f5..a978355 100644 --- a/sources/admin/include/functions_install.inc.php +++ b/sources/admin/include/functions_install.inc.php @@ -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()); } } + ?> \ No newline at end of file diff --git a/sources/admin/include/functions_metadata.php b/sources/admin/include/functions_metadata.php index 5bcbb12..d969d06 100644 --- a/sources/admin/include/functions_metadata.php +++ b/sources/admin/include/functions_metadata.php @@ -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'); } + ?> \ No newline at end of file diff --git a/sources/admin/include/functions_upgrade.php b/sources/admin/include/functions_upgrade.php index 4bd639f..b7a8763 100644 --- a/sources/admin/include/functions_upgrade.php +++ b/sources/admin/include/functions_upgrade.php @@ -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' ); diff --git a/sources/admin/include/functions_upload.inc.php b/sources/admin/include/functions_upload.inc.php index 40a53ad..d0ef6e6 100644 --- a/sources/admin/include/functions_upload.inc.php +++ b/sources/admin/include/functions_upload.inc.php @@ -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) diff --git a/sources/admin/include/image.class.php b/sources/admin/include/image.class.php index 1013099..e776997 100644 --- a/sources/admin/include/image.class.php +++ b/sources/admin/include/image.class.php @@ -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; diff --git a/sources/admin/include/languages.class.php b/sources/admin/include/languages.class.php index c4caa2d..351e36d 100644 --- a/sources/admin/include/languages.class.php +++ b/sources/admin/include/languages.class.php @@ -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; diff --git a/sources/admin/include/photos_add_direct_prepare.inc.php b/sources/admin/include/photos_add_direct_prepare.inc.php index 117abb8..34b025f 100644 --- a/sources/admin/include/photos_add_direct_prepare.inc.php +++ b/sources/admin/include/photos_add_direct_prepare.inc.php @@ -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.'&upload_mode='.$upload_mode.'&processed=1', - 'switch_url' => PHOTOS_ADD_BASE_URL.'&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.'&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.'&upload_mode='.$upload_mode.'&hide_warnings=1' + 'hide_warnings_link' => PHOTOS_ADD_BASE_URL.'&hide_warnings=1' ) ); } diff --git a/sources/admin/include/photos_add_direct_process.inc.php b/sources/admin/include/photos_add_direct_process.inc.php deleted file mode 100644 index e0a6cba..0000000 --- a/sources/admin/include/photos_add_direct_process.inc.php +++ /dev/null @@ -1,242 +0,0 @@ -POST'."\n"; print_r($_POST); echo ''; -// echo '
FILES'."\n"; print_r($_FILES); echo '
'; -// echo '
SESSION'."\n"; print_r($_SESSION); echo '
'; -// 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.'&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', - ''.$category_name.'', - $count - ); - - $page['batch_link'] = PHOTOS_ADD_BASE_URL.'&batch='.implode(',', $image_ids); - } -} - -?> \ No newline at end of file diff --git a/sources/admin/include/plugins.class.php b/sources/admin/include/plugins.class.php index 9862bcc..71093a6 100644 --- a/sources/admin/include/plugins.class.php +++ b/sources/admin/include/plugins.class.php @@ -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)) diff --git a/sources/admin/include/tabsheet.class.php b/sources/admin/include/tabsheet.class.php index 9dc441a..c7681b6 100644 --- a/sources/admin/include/tabsheet.class.php +++ b/sources/admin/include/tabsheet.class.php @@ -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); diff --git a/sources/admin/include/themes.class.php b/sources/admin/include/themes.class.php index 824ccf4..df0e29e 100644 --- a/sources/admin/include/themes.class.php +++ b/sources/admin/include/themes.class.php @@ -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]); } diff --git a/sources/admin/include/updates.class.php b/sources/admin/include/updates.class.php index 12f5c22..17a3b25 100644 --- a/sources/admin/include/updates.class.php +++ b/sources/admin/include/updates.class.php @@ -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) { diff --git a/sources/admin/include/uploadify/cancel.png b/sources/admin/include/uploadify/cancel.png deleted file mode 100644 index 1c7d627..0000000 Binary files a/sources/admin/include/uploadify/cancel.png and /dev/null differ diff --git a/sources/admin/include/uploadify/jquery.uploadify.v3.0.0.min.js b/sources/admin/include/uploadify/jquery.uploadify.v3.0.0.min.js deleted file mode 100644 index e85d864..0000000 --- a/sources/admin/include/uploadify/jquery.uploadify.v3.0.0.min.js +++ /dev/null @@ -1,38 +0,0 @@ -/* -SWFUpload: http://www.swfupload.org, http://swfupload.googlecode.com - -mmSWFUpload 1.0: Flash upload dialog - http://profandesign.se/swfupload/, http://www.vinterwebb.se/ - -SWFUpload is (c) 2006-2007 Lars Huring, Olov Nilzén and Mammon Media and is released under the MIT License: -http://www.opensource.org/licenses/mit-license.php - -SWFUpload 2 is (c) 2007-2008 Jake Roberts and is released under the MIT License: -http://www.opensource.org/licenses/mit-license.php -*/ - -var SWFUpload;if(SWFUpload==undefined){SWFUpload=function(a){this.initSWFUpload(a)}}SWFUpload.prototype.initSWFUpload=function(b){try{this.customSettings={};this.settings=b;this.eventQueue=[];this.movieName="SWFUpload_"+SWFUpload.movieCount++;this.movieElement=null;SWFUpload.instances[this.movieName]=this;this.initSettings();this.loadFlash();this.displayDebugInfo()}catch(a){delete SWFUpload.instances[this.movieName];throw a}};SWFUpload.instances={};SWFUpload.movieCount=0;SWFUpload.version="2.2.0 2009-03-25";SWFUpload.QUEUE_ERROR={QUEUE_LIMIT_EXCEEDED:-100,FILE_EXCEEDS_SIZE_LIMIT:-110,ZERO_BYTE_FILE:-120,INVALID_FILETYPE:-130};SWFUpload.UPLOAD_ERROR={HTTP_ERROR:-200,MISSING_UPLOAD_URL:-210,IO_ERROR:-220,SECURITY_ERROR:-230,UPLOAD_LIMIT_EXCEEDED:-240,UPLOAD_FAILED:-250,SPECIFIED_FILE_ID_NOT_FOUND:-260,FILE_VALIDATION_FAILED:-270,FILE_CANCELLED:-280,UPLOAD_STOPPED:-290};SWFUpload.FILE_STATUS={QUEUED:-1,IN_PROGRESS:-2,ERROR:-3,COMPLETE:-4,CANCELLED:-5};SWFUpload.BUTTON_ACTION={SELECT_FILE:-100,SELECT_FILES:-110,START_UPLOAD:-120};SWFUpload.CURSOR={ARROW:-1,HAND:-2};SWFUpload.WINDOW_MODE={WINDOW:"window",TRANSPARENT:"transparent",OPAQUE:"opaque"};SWFUpload.completeURL=function(a){if(typeof(a)!=="string"||a.match(/^https?:\/\//i)||a.match(/^\//)){return a}var c=window.location.protocol+"//"+window.location.hostname+(window.location.port?":"+window.location.port:"");var b=window.location.pathname.lastIndexOf("/");if(b<=0){path="/"}else{path=window.location.pathname.substr(0,b)+"/"}return path+a};SWFUpload.prototype.initSettings=function(){this.ensureDefault=function(b,a){this.settings[b]=(this.settings[b]==undefined)?a:this.settings[b]};this.ensureDefault("upload_url","");this.ensureDefault("preserve_relative_urls",false);this.ensureDefault("file_post_name","Filedata");this.ensureDefault("post_params",{});this.ensureDefault("use_query_string",false);this.ensureDefault("requeue_on_error",false);this.ensureDefault("http_success",[]);this.ensureDefault("assume_success_timeout",0);this.ensureDefault("file_types","*.*");this.ensureDefault("file_types_description","All Files");this.ensureDefault("file_size_limit",0);this.ensureDefault("file_upload_limit",0);this.ensureDefault("file_queue_limit",0);this.ensureDefault("flash_url","swfupload.swf");this.ensureDefault("prevent_swf_caching",true);this.ensureDefault("button_image_url","");this.ensureDefault("button_width",1);this.ensureDefault("button_height",1);this.ensureDefault("button_text","");this.ensureDefault("button_text_style","color: #000000; font-size: 16pt;");this.ensureDefault("button_text_top_padding",0);this.ensureDefault("button_text_left_padding",0);this.ensureDefault("button_action",SWFUpload.BUTTON_ACTION.SELECT_FILES);this.ensureDefault("button_disabled",false);this.ensureDefault("button_placeholder_id","");this.ensureDefault("button_placeholder",null);this.ensureDefault("button_cursor",SWFUpload.CURSOR.ARROW);this.ensureDefault("button_window_mode",SWFUpload.WINDOW_MODE.WINDOW);this.ensureDefault("debug",false);this.settings.debug_enabled=this.settings.debug;this.settings.return_upload_start_handler=this.returnUploadStart;this.ensureDefault("swfupload_loaded_handler",null);this.ensureDefault("file_dialog_start_handler",null);this.ensureDefault("file_queued_handler",null);this.ensureDefault("file_queue_error_handler",null);this.ensureDefault("file_dialog_complete_handler",null);this.ensureDefault("upload_start_handler",null);this.ensureDefault("upload_progress_handler",null);this.ensureDefault("upload_error_handler",null);this.ensureDefault("upload_success_handler",null);this.ensureDefault("upload_complete_handler",null);this.ensureDefault("debug_handler",this.debugMessage);this.ensureDefault("custom_settings",{});this.customSettings=this.settings.custom_settings;if(!!this.settings.prevent_swf_caching){this.settings.flash_url=this.settings.flash_url+(this.settings.flash_url.indexOf("?")<0?"?":"&")+"preventswfcaching="+new Date().getTime()}if(!this.settings.preserve_relative_urls){this.settings.upload_url=SWFUpload.completeURL(this.settings.upload_url);this.settings.button_image_url=SWFUpload.completeURL(this.settings.button_image_url)}delete this.ensureDefault};SWFUpload.prototype.loadFlash=function(){var a,b;if(document.getElementById(this.movieName)!==null){throw"ID "+this.movieName+" is already in use. The Flash Object could not be added"}a=document.getElementById(this.settings.button_placeholder_id)||this.settings.button_placeholder;if(a==undefined){throw"Could not find the placeholder element: "+this.settings.button_placeholder_id}b=document.createElement("div");b.innerHTML=this.getFlashHTML();a.parentNode.replaceChild(b.firstChild,a);if(window[this.movieName]==undefined){window[this.movieName]=this.getMovieElement()}};SWFUpload.prototype.getFlashHTML=function(){return['','','','','','','',""].join("")};SWFUpload.prototype.getFlashVars=function(){var b=this.buildParamString();var a=this.settings.http_success.join(",");return["movieName=",encodeURIComponent(this.movieName),"&uploadURL=",encodeURIComponent(this.settings.upload_url),"&useQueryString=",encodeURIComponent(this.settings.use_query_string),"&requeueOnError=",encodeURIComponent(this.settings.requeue_on_error),"&httpSuccess=",encodeURIComponent(a),"&assumeSuccessTimeout=",encodeURIComponent(this.settings.assume_success_timeout),"&params=",encodeURIComponent(b),"&filePostName=",encodeURIComponent(this.settings.file_post_name),"&fileTypes=",encodeURIComponent(this.settings.file_types),"&fileTypesDescription=",encodeURIComponent(this.settings.file_types_description),"&fileSizeLimit=",encodeURIComponent(this.settings.file_size_limit),"&fileUploadLimit=",encodeURIComponent(this.settings.file_upload_limit),"&fileQueueLimit=",encodeURIComponent(this.settings.file_queue_limit),"&debugEnabled=",encodeURIComponent(this.settings.debug_enabled),"&buttonImageURL=",encodeURIComponent(this.settings.button_image_url),"&buttonWidth=",encodeURIComponent(this.settings.button_width),"&buttonHeight=",encodeURIComponent(this.settings.button_height),"&buttonText=",encodeURIComponent(this.settings.button_text),"&buttonTextTopPadding=",encodeURIComponent(this.settings.button_text_top_padding),"&buttonTextLeftPadding=",encodeURIComponent(this.settings.button_text_left_padding),"&buttonTextStyle=",encodeURIComponent(this.settings.button_text_style),"&buttonAction=",encodeURIComponent(this.settings.button_action),"&buttonDisabled=",encodeURIComponent(this.settings.button_disabled),"&buttonCursor=",encodeURIComponent(this.settings.button_cursor)].join("")};SWFUpload.prototype.getMovieElement=function(){if(this.movieElement==undefined){this.movieElement=document.getElementById(this.movieName)}if(this.movieElement===null){throw"Could not find Flash element"}return this.movieElement};SWFUpload.prototype.buildParamString=function(){var c=this.settings.post_params;var b=[];if(typeof(c)==="object"){for(var a in c){if(c.hasOwnProperty(a)){b.push(encodeURIComponent(a.toString())+"="+encodeURIComponent(c[a].toString()))}}}return b.join("&")};SWFUpload.prototype.destroy=function(){try{this.cancelUpload(null,false);var a=null;a=this.getMovieElement();if(a&&typeof(a.CallFunction)==="unknown"){for(var c in a){try{if(typeof(a[c])==="function"){a[c]=null}}catch(e){}}try{a.parentNode.removeChild(a)}catch(b){}}window[this.movieName]=null;SWFUpload.instances[this.movieName]=null;delete SWFUpload.instances[this.movieName];this.movieElement=null;this.settings=null;this.customSettings=null;this.eventQueue=null;this.movieName=null;return true}catch(d){return false}};SWFUpload.prototype.displayDebugInfo=function(){this.debug(["---SWFUpload Instance Info---\n","Version: ",SWFUpload.version,"\n","Movie Name: ",this.movieName,"\n","Settings:\n","\t","upload_url: ",this.settings.upload_url,"\n","\t","flash_url: ",this.settings.flash_url,"\n","\t","use_query_string: ",this.settings.use_query_string.toString(),"\n","\t","requeue_on_error: ",this.settings.requeue_on_error.toString(),"\n","\t","http_success: ",this.settings.http_success.join(", "),"\n","\t","assume_success_timeout: ",this.settings.assume_success_timeout,"\n","\t","file_post_name: ",this.settings.file_post_name,"\n","\t","post_params: ",this.settings.post_params.toString(),"\n","\t","file_types: ",this.settings.file_types,"\n","\t","file_types_description: ",this.settings.file_types_description,"\n","\t","file_size_limit: ",this.settings.file_size_limit,"\n","\t","file_upload_limit: ",this.settings.file_upload_limit,"\n","\t","file_queue_limit: ",this.settings.file_queue_limit,"\n","\t","debug: ",this.settings.debug.toString(),"\n","\t","prevent_swf_caching: ",this.settings.prevent_swf_caching.toString(),"\n","\t","button_placeholder_id: ",this.settings.button_placeholder_id.toString(),"\n","\t","button_placeholder: ",(this.settings.button_placeholder?"Set":"Not Set"),"\n","\t","button_image_url: ",this.settings.button_image_url.toString(),"\n","\t","button_width: ",this.settings.button_width.toString(),"\n","\t","button_height: ",this.settings.button_height.toString(),"\n","\t","button_text: ",this.settings.button_text.toString(),"\n","\t","button_text_style: ",this.settings.button_text_style.toString(),"\n","\t","button_text_top_padding: ",this.settings.button_text_top_padding.toString(),"\n","\t","button_text_left_padding: ",this.settings.button_text_left_padding.toString(),"\n","\t","button_action: ",this.settings.button_action.toString(),"\n","\t","button_disabled: ",this.settings.button_disabled.toString(),"\n","\t","custom_settings: ",this.settings.custom_settings.toString(),"\n","Event Handlers:\n","\t","swfupload_loaded_handler assigned: ",(typeof this.settings.swfupload_loaded_handler==="function").toString(),"\n","\t","file_dialog_start_handler assigned: ",(typeof this.settings.file_dialog_start_handler==="function").toString(),"\n","\t","file_queued_handler assigned: ",(typeof this.settings.file_queued_handler==="function").toString(),"\n","\t","file_queue_error_handler assigned: ",(typeof this.settings.file_queue_error_handler==="function").toString(),"\n","\t","upload_start_handler assigned: ",(typeof this.settings.upload_start_handler==="function").toString(),"\n","\t","upload_progress_handler assigned: ",(typeof this.settings.upload_progress_handler==="function").toString(),"\n","\t","upload_error_handler assigned: ",(typeof this.settings.upload_error_handler==="function").toString(),"\n","\t","upload_success_handler assigned: ",(typeof this.settings.upload_success_handler==="function").toString(),"\n","\t","upload_complete_handler assigned: ",(typeof this.settings.upload_complete_handler==="function").toString(),"\n","\t","debug_handler assigned: ",(typeof this.settings.debug_handler==="function").toString(),"\n"].join(""))};SWFUpload.prototype.addSetting=function(b,c,a){if(c==undefined){return(this.settings[b]=a)}else{return(this.settings[b]=c)}};SWFUpload.prototype.getSetting=function(a){if(this.settings[a]!=undefined){return this.settings[a]}return""};SWFUpload.prototype.callFlash=function(functionName,argumentArray){argumentArray=argumentArray||[];var movieElement=this.getMovieElement();var returnValue,returnString;try{returnString=movieElement.CallFunction(''+__flash__argumentsToXML(argumentArray,0)+"");returnValue=eval(returnString)}catch(ex){throw"Call to "+functionName+" failed"}if(returnValue!=undefined&&typeof returnValue.post==="object"){returnValue=this.unescapeFilePostParams(returnValue)}return returnValue};SWFUpload.prototype.selectFile=function(){this.callFlash("SelectFile")};SWFUpload.prototype.selectFiles=function(){this.callFlash("SelectFiles")};SWFUpload.prototype.startUpload=function(a){this.callFlash("StartUpload",[a])};SWFUpload.prototype.cancelUpload=function(a,b){if(b!==false){b=true}this.callFlash("CancelUpload",[a,b])};SWFUpload.prototype.stopUpload=function(){this.callFlash("StopUpload")};SWFUpload.prototype.getStats=function(){return this.callFlash("GetStats")};SWFUpload.prototype.setStats=function(a){this.callFlash("SetStats",[a])};SWFUpload.prototype.getFile=function(a){if(typeof(a)==="number"){return this.callFlash("GetFileByIndex",[a])}else{return this.callFlash("GetFile",[a])}};SWFUpload.prototype.addFileParam=function(a,b,c){return this.callFlash("AddFileParam",[a,b,c])};SWFUpload.prototype.removeFileParam=function(a,b){this.callFlash("RemoveFileParam",[a,b])};SWFUpload.prototype.setUploadURL=function(a){this.settings.upload_url=a.toString();this.callFlash("SetUploadURL",[a])};SWFUpload.prototype.setPostParams=function(a){this.settings.post_params=a;this.callFlash("SetPostParams",[a])};SWFUpload.prototype.addPostParam=function(a,b){this.settings.post_params[a]=b;this.callFlash("SetPostParams",[this.settings.post_params])};SWFUpload.prototype.removePostParam=function(a){delete this.settings.post_params[a];this.callFlash("SetPostParams",[this.settings.post_params])};SWFUpload.prototype.setFileTypes=function(a,b){this.settings.file_types=a;this.settings.file_types_description=b;this.callFlash("SetFileTypes",[a,b])};SWFUpload.prototype.setFileSizeLimit=function(a){this.settings.file_size_limit=a;this.callFlash("SetFileSizeLimit",[a])};SWFUpload.prototype.setFileUploadLimit=function(a){this.settings.file_upload_limit=a;this.callFlash("SetFileUploadLimit",[a])};SWFUpload.prototype.setFileQueueLimit=function(a){this.settings.file_queue_limit=a;this.callFlash("SetFileQueueLimit",[a])};SWFUpload.prototype.setFilePostName=function(a){this.settings.file_post_name=a;this.callFlash("SetFilePostName",[a])};SWFUpload.prototype.setUseQueryString=function(a){this.settings.use_query_string=a;this.callFlash("SetUseQueryString",[a])};SWFUpload.prototype.setRequeueOnError=function(a){this.settings.requeue_on_error=a;this.callFlash("SetRequeueOnError",[a])};SWFUpload.prototype.setHTTPSuccess=function(a){if(typeof a==="string"){a=a.replace(" ","").split(",")}this.settings.http_success=a;this.callFlash("SetHTTPSuccess",[a])};SWFUpload.prototype.setAssumeSuccessTimeout=function(a){this.settings.assume_success_timeout=a;this.callFlash("SetAssumeSuccessTimeout",[a])};SWFUpload.prototype.setDebugEnabled=function(a){this.settings.debug_enabled=a;this.callFlash("SetDebugEnabled",[a])};SWFUpload.prototype.setButtonImageURL=function(a){if(a==undefined){a=""}this.settings.button_image_url=a;this.callFlash("SetButtonImageURL",[a])};SWFUpload.prototype.setButtonDimensions=function(c,a){this.settings.button_width=c;this.settings.button_height=a;var b=this.getMovieElement();if(b!=undefined){b.style.width=c+"px";b.style.height=a+"px"}this.callFlash("SetButtonDimensions",[c,a])};SWFUpload.prototype.setButtonText=function(a){this.settings.button_text=a;this.callFlash("SetButtonText",[a])};SWFUpload.prototype.setButtonTextPadding=function(b,a){this.settings.button_text_top_padding=a;this.settings.button_text_left_padding=b;this.callFlash("SetButtonTextPadding",[b,a])};SWFUpload.prototype.setButtonTextStyle=function(a){this.settings.button_text_style=a;this.callFlash("SetButtonTextStyle",[a])};SWFUpload.prototype.setButtonDisabled=function(a){this.settings.button_disabled=a;this.callFlash("SetButtonDisabled",[a])};SWFUpload.prototype.setButtonAction=function(a){this.settings.button_action=a;this.callFlash("SetButtonAction",[a])};SWFUpload.prototype.setButtonCursor=function(a){this.settings.button_cursor=a;this.callFlash("SetButtonCursor",[a])};SWFUpload.prototype.queueEvent=function(b,c){if(c==undefined){c=[]}else{if(!(c instanceof Array)){c=[c]}}var a=this;if(typeof this.settings[b]==="function"){this.eventQueue.push(function(){this.settings[b].apply(this,c)});setTimeout(function(){a.executeNextEvent()},0)}else{if(this.settings[b]!==null){throw"Event handler "+b+" is unknown or is not a function"}}};SWFUpload.prototype.executeNextEvent=function(){var a=this.eventQueue?this.eventQueue.shift():null;if(typeof(a)==="function"){a.apply(this)}};SWFUpload.prototype.unescapeFilePostParams=function(c){var e=/[$]([0-9a-f]{4})/i;var f={};var d;if(c!=undefined){for(var a in c.post){if(c.post.hasOwnProperty(a)){d=a;var b;while((b=e.exec(d))!==null){d=d.replace(b[0],String.fromCharCode(parseInt("0x"+b[1],16)))}f[d]=c.post[a]}}c.post=f}return c};SWFUpload.prototype.testExternalInterface=function(){try{return this.callFlash("TestExternalInterface")}catch(a){return false}};SWFUpload.prototype.flashReady=function(){var a=this.getMovieElement();if(!a){this.debug("Flash called back ready but the flash movie can't be found.");return}this.cleanUp(a);this.queueEvent("swfupload_loaded_handler")};SWFUpload.prototype.cleanUp=function(a){try{if(this.movieElement&&typeof(a.CallFunction)==="unknown"){this.debug("Removing Flash functions hooks (this should only run in IE and should prevent memory leaks)");for(var c in a){try{if(typeof(a[c])==="function"){a[c]=null}}catch(b){}}}}catch(d){}window.__flash__removeCallback=function(e,f){try{if(e){e[f]=null}}catch(g){}}};SWFUpload.prototype.fileDialogStart=function(){this.queueEvent("file_dialog_start_handler")};SWFUpload.prototype.fileQueued=function(a){a=this.unescapeFilePostParams(a);this.queueEvent("file_queued_handler",a)};SWFUpload.prototype.fileQueueError=function(a,c,b){a=this.unescapeFilePostParams(a);this.queueEvent("file_queue_error_handler",[a,c,b])};SWFUpload.prototype.fileDialogComplete=function(b,c,a){this.queueEvent("file_dialog_complete_handler",[b,c,a])};SWFUpload.prototype.uploadStart=function(a){a=this.unescapeFilePostParams(a);this.queueEvent("return_upload_start_handler",a)};SWFUpload.prototype.returnUploadStart=function(a){var b;if(typeof this.settings.upload_start_handler==="function"){a=this.unescapeFilePostParams(a);b=this.settings.upload_start_handler.call(this,a)}else{if(this.settings.upload_start_handler!=undefined){throw"upload_start_handler must be a function"}}if(b===undefined){b=true}b=!!b;this.callFlash("ReturnUploadStart",[b])};SWFUpload.prototype.uploadProgress=function(a,c,b){a=this.unescapeFilePostParams(a);this.queueEvent("upload_progress_handler",[a,c,b])};SWFUpload.prototype.uploadError=function(a,c,b){a=this.unescapeFilePostParams(a);this.queueEvent("upload_error_handler",[a,c,b])};SWFUpload.prototype.uploadSuccess=function(b,a,c){b=this.unescapeFilePostParams(b);this.queueEvent("upload_success_handler",[b,a,c])};SWFUpload.prototype.uploadComplete=function(a){a=this.unescapeFilePostParams(a);this.queueEvent("upload_complete_handler",a)};SWFUpload.prototype.debug=function(a){this.queueEvent("debug_handler",a)};SWFUpload.prototype.debugMessage=function(c){if(this.settings.debug){var a,d=[];if(typeof c==="object"&&typeof c.name==="string"&&typeof c.message==="string"){for(var b in c){if(c.hasOwnProperty(b)){d.push(b+": "+c[b])}}a=d.join("\n")||"";d=a.split("\n");a="EXCEPTION: "+d.join("\nEXCEPTION: ");SWFUpload.Console.writeLine(a)}else{SWFUpload.Console.writeLine(c)}}};SWFUpload.Console={};SWFUpload.Console.writeLine=function(d){var b,a;try{b=document.getElementById("SWFUpload_Console");if(!b){a=document.createElement("form");document.getElementsByTagName("body")[0].appendChild(a);b=document.createElement("textarea");b.id="SWFUpload_Console";b.style.fontFamily="monospace";b.setAttribute("wrap","off");b.wrap="off";b.style.overflow="auto";b.style.width="700px";b.style.height="350px";b.style.margin="5px";a.appendChild(b)}b.value+=d+"\n";b.scrollTop=b.scrollHeight-b.clientHeight}catch(c){alert("Exception: "+c.name+" Message: "+c.message)}}; - -/* -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. -*/ - -if(jQuery)(function(a){a.extend(a.fn,{uploadify:function(b,c){a(this).each(function(){function t(b,c,d){g.queue.queueBytesUploaded+=b.size;a("#"+b.id).find(".data").html(" - "+uploadifyLang["uploadComplete"]);if(g.settings.onUploadSuccess)g.settings.onUploadSuccess(b,c,d)}function s(b){var c=new Date;g.timer=c.getTime();g.bytesLoaded=0;if(g.queue.uploadQueue.length==0){g.queue.uploadSize=b.size}if(g.settings.checkExisting!==false){a.ajax({type:"POST",async:false,url:g.settings.checkExisting,data:{filename:b.name},success:function(c){if(c==1){var d=confirm(uploadifyLang["existsMsg1"]+' "'+b.name+'" '+uploadifyLang["existsMsg2"]+".\n"+uploadifyLang["existsMsg3"]);if(!d){g.cancelUpload(b.id);a("#"+b.id).remove();if(g.queue.uploadQueue.length>0&&g.queue.queueLength>0){if(g.queue.uploadQueue[0]=="*"){g.startUpload()}else{g.startUpload(g.queue.uploadQueue.shift())}}}}}})}if(g.settings.onUploadStart)g.settings.onUploadStart(b)}function r(b,c,d){var e=new Date;var f=e.getTime();var h=f-g.timer;g.timer=f;var i=c-g.bytesLoaded;g.bytesLoaded=c;var j=g.queue.queueBytesUploaded+c;var k=Math.round(c/d*100);var l=0;var m=i/1024/(h/1e3);m=Math.floor(m*10)/10;if(g.queue.averageSpeed>0){g.queue.averageSpeed=(g.queue.averageSpeed+m)/2}else{g.queue.averageSpeed=m}if(m>1e3){l=m*.001;g.queue.averageSpeed=l}var n="KB/s";if(l>0){n="MB/s"}if(a.inArray("onUploadProgress",g.settings.skipDefault)<0){if(g.settings.progressData=="percentage"){a("#"+b.id).find(".data").html(" - "+k+"%")}else if(g.settings.progressData=="speed"){a("#"+b.id).find(".data").html(" - "+g.queue.averageSpeed.toFixed(2)+" "+n)}else if(g.settings.progressData=="all"){a("#"+b.id).find(".data").html(" - "+k+"% - "+g.queue.averageSpeed.toFixed(2)+" "+n)}a("#"+b.id).find(".uploadifyProgressBar").css("width",k+"%")}if(g.settings.onUploadProgress)g.settings.onUploadProgress(b,c,d,j,g.queue.uploadSize)}function q(b,c,d){var e=uploadifyLang["errorString1"];if(c!=SWFUpload.UPLOAD_ERROR.FILE_CANCELLED&&c!=SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED){a("#"+b.id).addClass("uploadifyError")}a("#"+b.id).find(".uploadifyProgressBar").css("width","1px");switch(c){case SWFUpload.UPLOAD_ERROR.HTTP_ERROR:e=uploadifyLang["errorString2"]+" ("+d+")";break;case SWFUpload.UPLOAD_ERROR.MISSING_UPLOAD_URL:e=uploadifyLang["errorString3"];break;case SWFUpload.UPLOAD_ERROR.IO_ERROR:e=uploadifyLang["errorString4"];break;case SWFUpload.UPLOAD_ERROR.SECURITY_ERROR:e=uploadifyLang["errorString5"];break;case SWFUpload.UPLOAD_ERROR.UPLOAD_LIMIT_EXCEEDED:alert(uploadifyLang["errorString6"]+" ("+d+").");e=uploadifyLang["errorString7"];break;case SWFUpload.UPLOAD_ERROR.UPLOAD_FAILED:e=uploadifyLang["errorString8"];break;case SWFUpload.UPLOAD_ERROR.SPECIFIED_FILE_ID_NOT_FOUND:e=uploadifyLang["errorString9"];break;case SWFUpload.UPLOAD_ERROR.FILE_VALIDATION_FAILED:e=uploadifyLang["errorString10"];break;case SWFUpload.UPLOAD_ERROR.FILE_CANCELLED:e=uploadifyLang["errorString11"];g.queue.queueSize-=b.size;if(b.status==SWFUpload.FILE_STATUS.IN_PROGRESS||a.inArray(b.id,g.queue.uploadQueue)>=0){g.queue.uploadSize-=b.size}delete g.queue.files[b.id];break;case SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED:e=uploadifyLang["errorString12"];break}if(c!=SWFUpload.UPLOAD_ERROR.SPECIFIED_FILE_ID_NOT_FOUND&&b.status!=SWFUpload.FILE_STATUS.COMPLETE){a("#"+b.id).find(".data").html(" - "+e)}if(g.settings.onUploadError)g.settings.onUploadError(b,c,d,e,g.queue)}function p(b){var c=g.getStats();g.queue.queueLength=c.files_queued;if(g.queue.uploadQueue[0]=="*"){if(g.queue.queueLength>0){g.startUpload()}else{g.queue.uploadQueue=[];if(g.settings.onQueueComplete)g.settings.onQueueComplete(c)}}else{if(g.settings.onUploadComplete)g.settings.onUploadComplete(b,g.queue);if(g.queue.queueLength>0){g.startUpload(g.queue.uploadQueue.shift())}else{g.queue.uploadQueue=[];if(g.settings.onQueueComplete)g.settings.onQueueComplete(c)}}if(a.inArray("onUploadComplete",g.settings.skipDefault)<0){if(g.settings.removeCompleted){switch(b.filestatus){case SWFUpload.FILE_STATUS.COMPLETE:setTimeout(function(){if(a("#"+b.id)){g.queue.queueSize-=b.size;delete g.queue.files[b.id];a("#"+b.id).fadeOut(500,function(){a(this).remove()})}},g.settings.removeTimeout*1e3);break;case SWFUpload.FILE_STATUS.ERROR:if(!g.settings.requeueErrors){setTimeout(function(){if(a("#"+b.id)){g.queue.queueSize-=b.size;delete g.queue.files[b.id];a("#"+b.id).fadeOut(500,function(){a(this).remove()})}},g.settings.removeTimeout*1e3)}break}}}}function o(){var a=g.getStats();if(g.settings.onQueueComplete)g.settings.onQueueComplete(a)}function n(b,c,d){if(a.inArray("onSelectError",g.settings.skipDefault)<0){switch(c){case SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED:if(g.settings.queueSizeLimit>d){g.queue.errorMsg+="\n"+uploadifyLang["errorMsg2"]+" ("+d+")."}else{g.queue.errorMsg+="\n"+uploadifyLang["errorMsg3"]+" ("+g.settings.queueSizeLimit+")."}break;case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:g.queue.errorMsg+="\n"+uploadifyLang["errorMsg4"]+' "'+b.name+'" '+uploadifyLang["errorMsg5"]+" ("+g.settings.fileSizeLimit+").";break;case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:g.queue.errorMsg+="\n"+uploadifyLang["errorMsg4"]+' "'+b.name+'" '+uploadifyLang["errorMsg6"]+".";break;case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:g.queue.errorMsg+="\n"+uploadifyLang["errorMsg4"]+' "'+b.name+'" '+uploadifyLang["errorMsg7"]+" ("+g.settings.fileTypeDesc+").";break}}if(c!=SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED){delete g.queue.files[b.id]}if(g.settings.onSelectError)g.settings.onSelectError(b,c,d)}function m(b){if(a.inArray("onSelect",g.settings.skipDefault)<0){var c={};for(var d in g.queue.files){c=g.queue.files[d];if(c.name==b.name){var e=confirm(uploadifyLang["replaceMsg1"]+' "'+b.name+'" '+uploadifyLang["replaceMsg2"]+".\n"+uploadifyLang["replaceMsg3"]);if(!e){g.cancelUpload(b.id);g.queue.filesCancelled++;return false}else{a("#"+c.id).remove();g.cancelUpload(c.id);g.queue.filesReplaced++}}}var f=Math.round(b.size/1024);var h="KB";if(f>1e3){f=Math.round(f/1e3);h="MB"}var i=f.toString().split(".");f=i[0];if(i.length>1){f+="."+i[1].substr(0,2)}f+=h;var j=b.name;if(j.length>18){j=j.substr(0,15)+"..."}a("#"+g.settings.queueID).append('
\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t'+j+" ("+f+')\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
');g.queue.queueSize+=b.size}g.queue.files[b.id]=b;if(g.settings.onSelect)g.settings.onSelect(b)}function l(){g.queue.errorMsg=uploadifyLang["errorMsg1"];g.queue.filesReplaced=0;g.queue.filesCancelled=0;if(g.settings.onDialogOpen)g.settings.onDialogOpen()}function k(b,c,d){var e=g.getStats();g.queue.filesErrored=b-c;g.queue.filesSelected=b;g.queue.filesQueued=c-g.queue.filesCancelled;g.queue.queueLength=d;if(a.inArray("onDialogClose",g.settings.skipDefault)<0){if(g.queue.filesErrored>0){alert(g.queue.errorMsg)}}if(g.settings.onDialogClose)g.settings.onDialogClose(g.queue);if(g.settings.auto)a("#"+g.settings.id).uploadifyUpload("*")}var d=a(this).clone();var e=a.extend({id:a(this).attr("id"),langFile:"uploadifyLang_en.js",swf:"uploadify.swf",uploader:"uploadify.php",auto:false,buttonCursor:"pointer",buttonText:"",cancelImage:"uploadify-cancel.png",checkExisting:"uploadify-check-existing.php",debug:false,fileObjName:"Filedata",fileSizeLimit:0,fileTypeDesc:"",fileTypeExts:"*.*",height:30,method:"post",multi:false,queueID:false,queueSizeLimit:999,removeCompleted:true,removeTimeout:3,requeueErrors:true,postData:{},preventCaching:true,progressData:"all",successTimeout:30,transparent:true,uploadLimit:999,width:120,skipDefault:[],onDialogClose:function(){},onDialogOpen:function(){},onSelect:function(){},onSelectError:function(){},onQueueComplete:function(){},onUploadComplete:function(){},onUploadError:function(){},onUploadProgress:function(){},onUploadStart:function(){},onUploadSuccess:function(){}},b);var f={assume_success_timeout:e.successTimeout,button_placeholder_id:e.id,button_width:e.width,button_height:e.height,button_text:null,button_text_style:null,button_text_top_padding:0,button_text_left_padding:0,button_action:e.multi?SWFUpload.BUTTON_ACTION.SELECT_FILES:SWFUpload.BUTTON_ACTION.SELECT_FILE,button_disabled:false,button_cursor:e.buttonCursor=="arrow"?SWFUpload.CURSOR.ARROW:SWFUpload.CURSOR.HAND,button_window_mode:e.transparent?SWFUpload.WINDOW_MODE.TRANSPARENT:SWFUpload.WINDOW_MODE.OPAQUE,debug:e.debug,requeue_on_error:e.requeueErrors,file_post_name:e.fileObjName,file_size_limit:e.fileSizeLimit,file_types:e.fileTypeExts,file_types_description:e.fileTypeDesc,file_queue_limit:e.queueSizeLimit,file_upload_limit:e.uploadLimit,flash_url:e.swf,prevent_swf_caching:e.preventCaching,post_params:e.postData,upload_url:e.uploader,use_query_string:e.method=="get",file_dialog_complete_handler:k,file_dialog_start_handler:l,file_queued_handler:m,file_queue_error_handler:n,upload_complete_handler:p,upload_error_handler:q,upload_progress_handler:r,upload_start_handler:s,upload_success_handler:t};if(c){f=a.extend(f,c)}f=a.extend(f,e);a.ajaxSetup({async:false});a.getScript(e.langFile);a.ajaxSetup({async:true});if(e.buttonText=="")e.buttonText=uploadifyLang["buttonText"];if(e.fileTypeDesc=="")e.fileTypeDesc=uploadifyLang["fileTypeDesc"];window["uploadify_"+e.id]=new SWFUpload(f);var g=window["uploadify_"+e.id];g.original=d;var h=a("
",{id:e.id,"class":"uploadify",css:{height:e.height+"px",position:"relative",width:e.width+"px"}});a("#"+g.movieName).wrap(h);if(!e.queueID){var i=a("
",{id:e.id+"_queue","class":"uploadifyQueue"});a("#"+e.id).after(i);g.settings.queueID=e.queueID=e.id+"_queue"}g.queue={files:{},filesSelected:0,filesQueued:0,filesReplaced:0,filesCancelled:0,filesErrored:0,averageSpeed:0,queueLength:0,queueSize:0,uploadSize:0,queueBytesUploaded:0,uploadQueue:[],errorMsg:uploadifyLang["errorMsg1"]};var j=a("
",{id:e.id+"_button","class":"uploadifyButton",html:''+e.buttonText+""});a("#"+e.id).append(j);a("#"+g.movieName).css({position:"absolute","z-index":1,left:"0px"})})},uploadifyCancel:function(b){var c=a(this).selector.replace("#","");var d=window["uploadify_"+c];var e=-1;if(arguments[0]){if(arguments[0]=="*"){a("#"+d.settings.queueID).find(".uploadifyQueueItem").each(function(){e++;d.cancelUpload(a(this).attr("id"));a(this).delay(100*e).fadeOut(500,function(){a(this).remove()})});d.queue.queueSize=0}else{for(var f=0;f $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); -?> \ No newline at end of file diff --git a/sources/admin/include/uploadify/uploadify.swf b/sources/admin/include/uploadify/uploadify.swf deleted file mode 100644 index e3f7670..0000000 Binary files a/sources/admin/include/uploadify/uploadify.swf and /dev/null differ diff --git a/sources/admin/include/uploadify/uploadifyLang_en.js b/sources/admin/include/uploadify/uploadifyLang_en.js deleted file mode 100644 index 3be8afa..0000000 --- a/sources/admin/include/uploadify/uploadifyLang_en.js +++ /dev/null @@ -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'; \ No newline at end of file diff --git a/sources/admin/maintenance.php b/sources/admin/maintenance.php index 0b3e142..5c93346 100644 --- a/sources/admin/maintenance.php +++ b/sources/admin/maintenance.php @@ -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 ); diff --git a/sources/admin/notification_by_mail.php b/sources/admin/notification_by_mail.php index 51b2846..38cadff 100644 --- a/sources/admin/notification_by_mail.php +++ b/sources/admin/notification_by_mail.php @@ -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'); // +-----------------------------------------------------------------------+ diff --git a/sources/admin/photos_add_direct.php b/sources/admin/photos_add_direct.php index 10f71e0..9f3e888 100644 --- a/sources/admin/photos_add_direct.php +++ b/sources/admin/photos_add_direct.php @@ -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'); ?> diff --git a/sources/admin/picture_modify.php b/sources/admin/picture_modify.php index 23b28b7..bf0e458 100644 --- a/sources/admin/picture_modify.php +++ b/sources/admin/picture_modify.php @@ -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']) ? '&cat_id='.$_GET['cat_id'] : ''; +$src_image = new SrcImage($row); + $template->assign( array( 'tag_selection' => $tag_selection, - 'tags' => $tags, 'U_SYNC' => $admin_url_start.'&sync_metadata=1', 'U_DELETE' => $admin_url_start.'&delete=1&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'].'×'.$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 diff --git a/sources/admin/plugin.php b/sources/admin/plugin.php index b636608..2acc2b7 100644 --- a/sources/admin/plugin.php +++ b/sources/admin/plugin.php @@ -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); } -?> \ No newline at end of file +?> diff --git a/sources/admin/plugins_installed.php b/sources/admin/plugins_installed.php index d23e51c..a804e21 100644 --- a/sources/admin/plugins_installed.php +++ b/sources/admin/plugins_installed.php @@ -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); } diff --git a/sources/admin/plugins_new.php b/sources/admin/plugins_new.php index 3790774..a8df935 100644 --- a/sources/admin/plugins_new.php +++ b/sources/admin/plugins_new.php @@ -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' + . '&plugin=' . $_GET['plugin_id'] + . '&pwg_token=' . get_pwg_token() + . '&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'][] = '' . l10n('Activate it now') . ''; break; case 'temp_path_error': diff --git a/sources/admin/popuphelp.php b/sources/admin/popuphelp.php index dc7290b..7d0a0cf 100644 --- a/sources/admin/popuphelp.php +++ b/sources/admin/popuphelp.php @@ -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 { diff --git a/sources/admin/rating_user.php b/sources/admin/rating_user.php index 7465386..e6eea9e 100644 --- a/sources/admin/rating_user.php +++ b/sources/admin/rating_user.php @@ -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; $iassign( 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'); diff --git a/sources/admin/site_manager.php b/sources/admin/site_manager.php index 2d75fea..21fdebd 100644 --- a/sources/admin/site_manager.php +++ b/sources/admin/site_manager.php @@ -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; diff --git a/sources/admin/tags.php b/sources/admin/tags.php index a7c58f7..c643391 100644 --- a/sources/admin/tags.php +++ b/sources/admin/tags.php @@ -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&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)) { diff --git a/sources/admin/themes/clear/icon/datepicker.png b/sources/admin/themes/clear/icon/datepicker.png deleted file mode 100644 index 68c5256..0000000 Binary files a/sources/admin/themes/clear/icon/datepicker.png and /dev/null differ diff --git a/sources/admin/themes/clear/theme.css b/sources/admin/themes/clear/theme.css index c481771..eff0072 100644 --- a/sources/admin/themes/clear/theme.css +++ b/sources/admin/themes/clear/theme.css @@ -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; } diff --git a/sources/admin/themes/clear/themeconf.inc.php b/sources/admin/themes/clear/themeconf.inc.php index a73ebbc..4b6ccff 100644 --- a/sources/admin/themes/clear/themeconf.inc.php +++ b/sources/admin/themes/clear/themeconf.inc.php @@ -3,5 +3,6 @@ $themeconf = array( 'name' => 'clear', 'parent' => 'default', 'admin_icon_dir' => 'admin/themes/clear/icon', + 'colorscheme' => 'clear', ); ?> diff --git a/sources/admin/themes/default/fix-ie5-ie6.css b/sources/admin/themes/default/fix-ie5-ie6.css deleted file mode 100644 index e11b2f7..0000000 --- a/sources/admin/themes/default/fix-ie5-ie6.css +++ /dev/null @@ -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 */ -} diff --git a/sources/admin/themes/default/fix-ie7.css b/sources/admin/themes/default/fix-ie7.css deleted file mode 100644 index d61e029..0000000 --- a/sources/admin/themes/default/fix-ie7.css +++ /dev/null @@ -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; -} \ No newline at end of file diff --git a/sources/admin/themes/default/fontello/LICENSE.txt b/sources/admin/themes/default/fontello/LICENSE.txt index 8d0e89f..6e09529 100644 --- a/sources/admin/themes/default/fontello/LICENSE.txt +++ b/sources/admin/themes/default/fontello/LICENSE.txt @@ -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 + + diff --git a/sources/admin/themes/default/fontello/config.json b/sources/admin/themes/default/fontello/config.json index 1387aa0..16b7c60 100644 --- a/sources/admin/themes/default/fontello/config.json +++ b/sources/admin/themes/default/fontello/config.json @@ -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", diff --git a/sources/admin/themes/default/fontello/css/fontello-codes.css b/sources/admin/themes/default/fontello/css/fontello-codes.css index 25bfdd8..b569e79 100644 --- a/sources/admin/themes/default/fontello/css/fontello-codes.css +++ b/sources/admin/themes/default/fontello/css/fontello-codes.css @@ -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' */ \ No newline at end of file +.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' */ \ No newline at end of file diff --git a/sources/admin/themes/default/fontello/css/fontello-embedded.css b/sources/admin/themes/default/fontello/css/fontello-embedded.css index 75b9ada..c30c9f7 100644 --- a/sources/admin/themes/default/fontello/css/fontello-embedded.css +++ b/sources/admin/themes/default/fontello/css/fontello-embedded.css @@ -2,16 +2,16 @@ @font-face { font-family: 'fontello'; - src: url('../font/fontello.eot?13698858'); - src: url('../font/fontello.eot?13698858#iefix') format('embedded-opentype'), - url('../font/fontello.svg?13698858#fontello') format('svg'); + src: url('../font/fontello.eot?76878460'); + src: url('../font/fontello.eot?76878460#iefix') format('embedded-opentype'), + url('../font/fontello.svg?76878460#fontello') format('svg'); font-weight: normal; font-style: normal; } @font-face { font-family: 'fontello'; - src: url('data:application/octet-stream;base64,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') format('woff'), - url('data:application/octet-stream;base64,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') format('truetype'); + src: url('data:application/octet-stream;base64,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') format('woff'), + url('data:application/octet-stream;base64,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IzixKwEUKy2wQSyxCAQlQrAAFrAEJbAEJSAuRyNHI2EgsAQjQrAJQysgsGBQWCCwQFFYswIgAyAbswImAxpZQkIjIEewBEOwAmIgsABQWLBAYFlmsAFjYCCwASsgiophILACQ2BkI7ADQ2FkUFiwAkNhG7ADQ2BZsAMlsAJiILAAUFiwQGBZZrABY2GwAiVGYTgjIDwjOBshICBGI0ewASsjYTghWbErARQrLbBCLLA1Ky6xKwEUKy2wQyywNishIyAgPLAEI0IjOLErARQrsARDLrArKy2wRCywABUgR7AAI0KyAAEBFRQTLrAxKi2wRSywABUgR7AAI0KyAAEBFRQTLrAxKi2wRiyxAAEUE7AyKi2wRyywNCotsEgssAAWRSMgLiBGiiNhOLErARQrLbBJLLAII0KwSCstsEossgAAQSstsEsssgABQSstsEwssgEAQSstsE0ssgEBQSstsE4ssgAAQistsE8ssgABQistsFAssgEAQistsFEssgEBQistsFIssgAAPistsFMssgABPistsFQssgEAPistsFUssgEBPistsFYssgAAQCstsFcssgABQCstsFgssgEAQCstsFkssgEBQCstsFossgAAQystsFsssgABQystsFwssgEAQystsF0ssgEBQystsF4ssgAAPystsF8ssgABPystsGAssgEAPystsGEssgEBPystsGIssDcrLrErARQrLbBjLLA3K7A7Ky2wZCywNyuwPCstsGUssAAWsDcrsD0rLbBmLLA4Ky6xKwEUKy2wZyywOCuwOystsGgssDgrsDwrLbBpLLA4K7A9Ky2waiywOSsusSsBFCstsGsssDkrsDsrLbBsLLA5K7A8Ky2wbSywOSuwPSstsG4ssDorLrErARQrLbBvLLA6K7A7Ky2wcCywOiuwPCstsHEssDorsD0rLbByLLMJBAIDRVghGyMhWUIrsAhlsAMkUHiwARUwLQBLuADIUlixAQGOWbABuQgACABjcLEABUKxAAAqsQAFQrEACCqxAAVCsQAIKrEABUK5AAAACSqxAAVCuQAAAAkqsQMARLEkAYhRWLBAiFixA2REsSYBiFFYugiAAAEEQIhjVFixAwBEWVlZWbEADCq4Af+FsASNsQIARAA=') format('truetype'); } /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ @@ -19,7 +19,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'fontello'; - src: url('../font/fontello.svg?13698858#fontello') format('svg'); + src: url('../font/fontello.svg?76878460#fontello') format('svg'); } } */ @@ -54,62 +54,69 @@ /* Uncomment for 3D effect */ /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ } -.icon-spin6:before { content: '\e81d'; } /* '' */ -.icon-asl:before { content: '\e0ad'; } /* '' */ -.icon-mail-alt:before { content: '\f0e0'; } /* '' */ .icon-star:before { content: '\2605'; } /* '★' */ .icon-star-empty:before { content: '\2606'; } /* '☆' */ -.icon-user:before { content: '👤'; } /* '\1f464' */ -.icon-picture:before { content: '🌄'; } /* '\1f304' */ -.icon-cancel-circled:before { content: '\e821'; } /* '' */ -.icon-plus-circled:before { content: '\2795'; } /* '➕' */ -.icon-link:before { content: '🔗'; } /* '\1f517' */ -.icon-lock:before { content: '🔒'; } /* '\1f512' */ -.icon-eye:before { content: '\e70a'; } /* '' */ -.icon-tags:before { content: '\e70d'; } /* '' */ -.icon-code:before { content: '\e80a'; } /* '' */ -.icon-pencil:before { content: '\270e'; } /* '✎' */ -.icon-chat:before { content: '\e720'; } /* '' */ -.icon-trash:before { content: '\e729'; } /* '' */ -.icon-folder-open:before { content: '\e806'; } /* '' */ -.icon-menu:before { content: '\e809'; } /* '' */ .icon-cog:before { content: '\2699'; } /* '⚙' */ .icon-cog-alt:before { content: '\26ef'; } /* '⛯' */ -.icon-wrench:before { content: '🔧'; } /* '\1f527' */ -.icon-basket:before { content: '\e73d'; } /* '' */ -.icon-logout:before { content: '\e81b'; } /* '' */ -.icon-clock:before { content: '🕔'; } /* '\1f554' */ -.icon-block:before { content: '🚫'; } /* '\1f6ab' */ -.icon-move:before { content: '\e812'; } /* '' */ -.icon-cw:before { content: '\e80c'; } /* '' */ -.icon-arrows-cw:before { content: '\e804'; } /* '' */ .icon-mail:before { content: '\2709'; } /* '✉' */ -.icon-exchange:before { content: '\e805'; } /* '' */ +.icon-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' */ \ No newline at end of file +.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' */ \ No newline at end of file diff --git a/sources/admin/themes/default/fontello/css/fontello-ie7-codes.css b/sources/admin/themes/default/fontello/css/fontello-ie7-codes.css index 26478aa..49cd553 100644 --- a/sources/admin/themes/default/fontello/css/fontello-ie7-codes.css +++ b/sources/admin/themes/default/fontello/css/fontello-ie7-codes.css @@ -1,60 +1,67 @@ -.icon-spin6 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-asl { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-mail-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-star { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '★ '); } .icon-star-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '☆ '); } -.icon-user { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '👤 '); } -.icon-picture { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '🌄 '); } -.icon-cancel-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-plus-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '➕ '); } -.icon-link { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '🔗 '); } -.icon-lock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '🔒 '); } -.icon-eye { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-tags { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-code { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-pencil { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '✎ '); } -.icon-chat { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-trash { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-folder-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-menu { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-cog { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '⚙ '); } .icon-cog-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '⛯ '); } -.icon-wrench { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '🔧 '); } -.icon-basket { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-logout { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-clock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '🕔 '); } -.icon-block { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '🚫 '); } -.icon-move { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-cw { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-arrows-cw { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-mail { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '✉ '); } -.icon-exchange { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-pencil { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '✎ '); } +.icon-plus-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '➕ '); } +.icon-asl { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-eye { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-tags { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-chat { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-trash { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-basket { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-puzzle { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-language { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-signal { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-crop { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-check { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-check-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-tasks { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-filter { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-sitemap { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-search { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-users { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-tools { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-arrows-cw { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-exchange { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-folder-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-brush { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-flow-branch { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-menu { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-code { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-user-add { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-help-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-info-circled-1 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-cw { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-group { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-home { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-flag { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-equalizer { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-mail-1 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-search { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-move { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-upload { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-upload-cloud { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-tools { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-hourglass { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-network { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-brush { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-language { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-key { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-flow-branch { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-puzzle { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-mail-1 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-equalizer { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-users { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-group { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-shuffle { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '🔀 '); } \ No newline at end of file +.icon-network { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-info-circled-1 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-calendar { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-ok { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-help-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-logout { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-flag { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-spin6 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-hourglass { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-check { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-check-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-cancel-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-plus { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-ok-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-zoom-in { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-zoom-out { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-tasks { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-filter { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-mail-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-sitemap { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-crop { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-picture { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '🌄 '); } +.icon-user { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '👤 '); } +.icon-shuffle { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '🔀 '); } +.icon-lock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '🔒 '); } +.icon-link { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '🔗 '); } +.icon-wrench { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '🔧 '); } +.icon-clock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '🕔 '); } +.icon-block { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '🚫 '); } \ No newline at end of file diff --git a/sources/admin/themes/default/fontello/css/fontello-ie7.css b/sources/admin/themes/default/fontello/css/fontello-ie7.css index 376909e..9eec9e6 100644 --- a/sources/admin/themes/default/fontello/css/fontello-ie7.css +++ b/sources/admin/themes/default/fontello/css/fontello-ie7.css @@ -10,62 +10,69 @@ /* font-size: 120%; */ } -.icon-spin6 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-asl { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-mail-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-star { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '★ '); } .icon-star-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '☆ '); } -.icon-user { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '👤 '); } -.icon-picture { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '🌄 '); } -.icon-cancel-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-plus-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '➕ '); } -.icon-link { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '🔗 '); } -.icon-lock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '🔒 '); } -.icon-eye { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-tags { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-code { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-pencil { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '✎ '); } -.icon-chat { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-trash { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-folder-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-menu { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-cog { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '⚙ '); } .icon-cog-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '⛯ '); } -.icon-wrench { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '🔧 '); } -.icon-basket { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-logout { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-clock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '🕔 '); } -.icon-block { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '🚫 '); } -.icon-move { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-cw { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-arrows-cw { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-mail { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '✉ '); } -.icon-exchange { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-pencil { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '✎ '); } +.icon-plus-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '➕ '); } +.icon-asl { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-eye { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-tags { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-chat { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-trash { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-basket { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-puzzle { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-language { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-signal { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-crop { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-check { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-check-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-tasks { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-filter { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-sitemap { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-search { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-users { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-tools { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-arrows-cw { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-exchange { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-folder-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-brush { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-flow-branch { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-menu { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-code { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-user-add { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-help-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-info-circled-1 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-cw { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-group { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-home { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-flag { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-equalizer { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-mail-1 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-search { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-move { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-upload { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-upload-cloud { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-tools { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-hourglass { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-network { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-brush { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-language { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-key { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-flow-branch { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-puzzle { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-mail-1 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-equalizer { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-users { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-group { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-shuffle { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '🔀 '); } \ No newline at end of file +.icon-network { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-info-circled-1 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-calendar { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-ok { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-help-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-logout { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-flag { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-spin6 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-hourglass { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-check { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-check-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-cancel-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-plus { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-ok-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-zoom-in { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-zoom-out { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-tasks { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-filter { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-mail-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-sitemap { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-crop { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-picture { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '🌄 '); } +.icon-user { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '👤 '); } +.icon-shuffle { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '🔀 '); } +.icon-lock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '🔒 '); } +.icon-link { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '🔗 '); } +.icon-wrench { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '🔧 '); } +.icon-clock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '🕔 '); } +.icon-block { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '🚫 '); } \ No newline at end of file diff --git a/sources/admin/themes/default/fontello/css/fontello.css b/sources/admin/themes/default/fontello/css/fontello.css index f1b6f84..9b3319d 100644 --- a/sources/admin/themes/default/fontello/css/fontello.css +++ b/sources/admin/themes/default/fontello/css/fontello.css @@ -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' */ \ No newline at end of file +.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' */ \ No newline at end of file diff --git a/sources/admin/themes/default/fontello/demo.html b/sources/admin/themes/default/fontello/demo.html index 52cc3cc..eeb1903 100644 --- a/sources/admin/themes/default/fontello/demo.html +++ b/sources/admin/themes/default/fontello/demo.html @@ -1,10 +1,7 @@ - - - - - + -{/literal} - -{if not $ENABLE_SYNCHRONIZATION} -{literal} - -{/literal} -{/if} + \ No newline at end of file diff --git a/sources/admin/themes/default/template/header.tpl b/sources/admin/themes/default/template/header.tpl index c95b759..289a050 100644 --- a/sources/admin/themes/default/template/header.tpl +++ b/sources/admin/themes/default/template/header.tpl @@ -1,42 +1,39 @@ {* - Warning : This is the admin pages header only don't confuse with the public page header - *} - - + {$GALLERY_TITLE} :: {$PAGE_TITLE} -{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"} - - -{get_combined_scripts load='header'} - {combine_script id='jquery' path='themes/default/js/jquery.min.js'} +{/strip} - + +{get_combined_css} + +{get_combined_scripts load='header'} + {if not empty($head_elements)} {foreach from=$head_elements item=elt} -{$elt} + {$elt} {/foreach} {/if} - @@ -53,18 +50,18 @@ @@ -78,4 +75,4 @@
{/if} -
\ No newline at end of file +
diff --git a/sources/admin/themes/default/template/help.tpl b/sources/admin/themes/default/template/help.tpl index 399c746..5ad531f 100644 --- a/sources/admin/themes/default/template/help.tpl +++ b/sources/admin/themes/default/template/help.tpl @@ -1,3 +1,9 @@ +{if not $ENABLE_SYNCHRONIZATION} +{html_style}{literal} +#helpSynchro {display:none;} +{/literal}{/html_style} +{/if} +

{'Help'|@translate} » {$HELP_SECTION_TITLE}

diff --git a/sources/admin/themes/default/template/history.tpl b/sources/admin/themes/default/template/history.tpl index 3fe4e73..fcdc67d 100644 --- a/sources/admin/themes/default/template/history.tpl +++ b/sources/admin/themes/default/template/history.tpl @@ -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(){ {* *} + jQuery('[data-datepicker]').pwgDatepicker(); +}); +{/footer_script}

{'History'|@translate} {$TABSHEET_TITLE}

@@ -14,33 +15,25 @@
  • - - - - + + +
    + {'unset'|translate}
  • - - - - + + +
    + {'unset'|translate}
diff --git a/sources/admin/themes/default/template/include/add_album.inc.tpl b/sources/admin/themes/default/template/include/add_album.inc.tpl index 08ada07..ebda5d2 100644 --- a/sources/admin/themes/default/template/include/add_album.inc.tpl +++ b/sources/admin/themes/default/template/include/add_album.inc.tpl @@ -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('') - .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("