Index: /extensions/User_Info_Tracking/admin/config.php
===================================================================
--- /extensions/User_Info_Tracking/admin/config.php	(revision 19701)
+++ /extensions/User_Info_Tracking/admin/config.php	(revision 19701)
@@ -0,0 +1,44 @@
+<?php
+defined('USER_INFO_TRACKING_PATH') or die('Hacking attempt!');
+
+// +-----------------------------------------------------------------------+
+// | Configuration tab                                                     |
+// +-----------------------------------------------------------------------+
+
+// save config
+if (isset($_POST['save_config']))
+{
+  $conf['user_info_tracking'] = array(
+    'uiPerPage' => intval($_POST['uiPerPage']),
+    'uiDefaultSortColumn' => $_POST['uiDefaultSortColumn'],
+    'uiDefaultSortOrder' => $_POST['uiDefaultSortOrder'],
+    'uiDateFormat' => '%c',
+
+    );
+      
+  conf_update_param('user_info_tracking', serialize($conf['user_info_tracking']));
+  array_push($page['infos'], l10n('Information data registered in database'));
+}
+
+
+// send config to template
+$template->assign(array(
+  'user_info_tracking' => $conf['user_info_tracking'],
+
+  ));
+
+// Config Listings
+$template->assign(array(
+  'uiPerPageList' => array('10', '25', '50', '100', '150', '200', '250'),
+  'uiDefaultSortOrderList' => array('ASC', 'DES'),
+  'uiDefaultSortOrderList2' => array('Ascending', 'Descending'),
+  'uiDefaultSortColumnList' => array('id', 'userId', 'userName', 'ipAddress', 'timeStamp', 'action'),
+  'uiDefaultSortColumnList2' => array('ID', 'User ID', 'User Name', 'IP Address', 'Time Stamp', 'Action'),
+  ));
+
+
+
+// define template file
+$template->set_filename('user_info_tracking_content', realpath(USER_INFO_TRACKING_PATH . 'admin/template/config.tpl'));
+
+?>
Index: /extensions/User_Info_Tracking/admin/home.php
===================================================================
--- /extensions/User_Info_Tracking/admin/home.php	(revision 19701)
+++ /extensions/User_Info_Tracking/admin/home.php	(revision 19701)
@@ -0,0 +1,76 @@
+<?php
+defined('USER_INFO_TRACKING_PATH') or die('Hacking attempt!');
+
+// +-----------------------------------------------------------------------+
+// | Home tab                                                              |
+// +-----------------------------------------------------------------------+
+
+// send variables to template
+//$template->assign(array(
+//  'user_info_tracking' => $conf['user_info_tracking'],
+//  'INTRO_CONTENT' => load_language('intro.html', USER_INFO_TRACKING_PATH, array('return'=>true)),
+//  ));
+
+
+$profile_url = get_root_url().'admin.php?page=profile&amp;user_id=';
+$perm_url = get_root_url().'admin.php?page=user_perm&amp;user_id=';
+
+
+$ip_geolocalisation1 = '<a href="http://www.geoiptool.com/en/?IP=';
+$ip_geolocalisation2 = '" title="Geo IP localisation" target="_blank"><img src="'.USER_INFO_TRACKING_PATH.'images/geoip.ico" class="button" alt="'.l10n('IP_geolocalisation').'"></a>';
+
+$ip_ripe1 = '<a href="http://www.ripe.net/whois?form_type=simple&amp;full_query_string=&amp;searchtext=';
+$ip_ripe2 = '+&amp;do_search=Search" title="Ripe Whois" target="_blank">';
+$ip_ripe3 = '</a>';
+
+
+	$query = '
+        SELECT
+          *
+        FROM
+          [UserinfoMap]
+        WHERE
+          [UserinfoMap::itemId] = ?
+        ';
+
+
+
+$messages = pwg_query("SELECT * FROM `". USER_INFO_TRACKING_TABLE2 ."` 
+  ORDER BY timeStamp DESC;");
+  
+if (pwg_db_num_rows($messages)) {
+  while ($message = pwg_db_fetch_assoc($messages)) {
+    $item = array(
+      'id' => $message['id'],
+      'userId' => $message['userId'],
+      'userId2' => $profile_url.$message['userId'],
+      'userId3' => $perm_url.$message['userId'],
+      'userName' => $message['userName'],
+      'ipAddress' => $message['ipAddress'],
+      'timeStamp' => $message['timeStamp'],
+      'action' => $message['action'],
+      'testIpAddress' => $ip_geolocalisation1.$message['ipAddress'].$ip_geolocalisation2.' '.$ip_ripe1.$message['ipAddress'].$ip_ripe2.$message['ipAddress'].$ip_ripe3,
+    );
+//    if (is_admin() OR $message['author'] = $user['username']) {
+//      $item['U_DELETE'] = AM_ADMIN . '&amp;delete_message=' . $message['id'];
+//      $item['U_EDIT'] = AM_ADMIN . '&amp;tab=edit&amp;message_id=' . $message['id'];
+//    }  
+    
+    $template->append('messages', $item);
+  }
+  
+}
+
+
+
+
+
+
+
+
+
+// define template file
+$template->set_filename('user_info_tracking_content', realpath(USER_INFO_TRACKING_PATH . 'admin/template/home.tpl'));
+
+
+?>
Index: /extensions/User_Info_Tracking/admin/index.php
===================================================================
--- /extensions/User_Info_Tracking/admin/index.php	(revision 19701)
+++ /extensions/User_Info_Tracking/admin/index.php	(revision 19701)
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: /extensions/User_Info_Tracking/admin/template/config.tpl
===================================================================
--- /extensions/User_Info_Tracking/admin/template/config.tpl	(revision 19701)
+++ /extensions/User_Info_Tracking/admin/template/config.tpl	(revision 19701)
@@ -0,0 +1,84 @@
+{combine_css path=$USER_INFO_TRACKING_PATH|@cat:"admin/template/style.css"}
+
+<div class="titrePage">
+	<h2>User Info Tracking Configuration</h2>
+</div>
+
+<form method="post" action="" class="properties">
+<fieldset>
+  <legend>{'Configuration'|@translate}</legend>
+
+
+<div class="gbBlock">
+<table border="1">
+<!--
+<tr>
+	<td align="center" colspan="2"><b><font size="4">Test</font></b></td>
+</tr>
+-->
+
+<tr>
+	<td>{'# records Per Page:'|@translate}</td>
+	<td>
+
+		<select name="uiPerPage">
+		{html_options values=$uiPerPageList
+		selected=$user_info_tracking.uiPerPage output=$uiPerPageList}
+	    </select>
+
+	</td>
+</tr>
+
+<tr>
+	<td>{'Default Sort Column:'|@translate}</td>
+	<td>
+		<select name="uiDefaultSortColumn">
+		{html_options values=$uiDefaultSortColumnList
+		selected=$user_info_tracking.uiDefaultSortColumn output=$uiDefaultSortColumnList2}
+	    </select>
+	</td>
+</tr>
+
+<tr>
+	<td>{'Default Sort Order:'|@translate}</td>
+	<td>
+		<select name="uiDefaultSortOrder">
+		{html_options values=$uiDefaultSortOrderList
+		selected=$user_info_tracking.uiDefaultSortOrder output=$uiDefaultSortOrderList2}
+	    </select>
+	</td>
+</tr>
+
+<!--
+<tr>
+	<td>
+		<a href="http://php.net/strftime" target="_blank">{'Date/Time Format'|@translate}</a>
+	</td>
+	<td>
+		<input type="text" size="12" name="" value="{$user_info_tracking.uiDateFormat}"/>
+	</td>
+</tr>
+-->
+
+</table>
+</div>
+
+
+
+</fieldset>
+
+
+<p style="text-align:left;"><input type="submit" name="save_config" value="{'Save Settings'|@translate}"> <input type="submit" name="reset_config" value="{'Reset'|@translate}"></p>
+
+</form>
+
+
+
+
+
+
+
+
+
+
+
Index: /extensions/User_Info_Tracking/admin/template/home.tpl
===================================================================
--- /extensions/User_Info_Tracking/admin/template/home.tpl	(revision 19701)
+++ /extensions/User_Info_Tracking/admin/template/home.tpl	(revision 19701)
@@ -0,0 +1,117 @@
+{combine_css path=$USER_INFO_TRACKING_PATH|@cat:"admin/template/style.css"}
+
+<div class="titrePage">
+	<h2>User Information Tracking</h2>
+</div>
+
+<form method="post" action="" class="properties">
+<fieldset>
+  <legend>{'User Info Tracking'|@translate}</legend>
+  
+<div class="gbBlock">
+  <p class="giDescription">
+    {'This will display information about users when they Login, Logout, and Failed Login Attempts.'|@translate}
+  </p>
+</div>
+
+<br>
+
+<table border="1">
+
+
+<tr>
+	{if !isset($messages)}
+	<td align="center" colspan="7">{'Number of Records: 0'|@translate}</td>
+
+	{else}
+	<td align="center" colspan="7">{'Number of Records:'|@translate} {$messages|@count}</td>
+
+	{/if}
+</tr>
+
+
+
+<tr>
+	<th>ID
+		<a href="{'#'|@translate}"><img src="{$USER_INFO_TRACKING_PATH}/images/down.gif" style="border:none" alt="{'Permissions Down'|@translate}" title="{'Permissions Down'|@translate}"></a>
+		<a href="{'#'|@translate}"><img src="{$USER_INFO_TRACKING_PATH}/images/up.gif" style="border:none" alt="{'Permissions Up'|@translate}" title="{'Permissions Up'|@translate}"></a>
+	</th>
+	<th>User ID
+		<a href="{'#'|@translate}"><img src="{$USER_INFO_TRACKING_PATH}/images/down.gif" style="border:none" alt="{'Permissions Down'|@translate}" title="{'Permissions Down'|@translate}"></a>
+		<a href="{'#'|@translate}"><img src="{$USER_INFO_TRACKING_PATH}/images/up.gif" style="border:none" alt="{'Permissions Up'|@translate}" title="{'Permissions Up'|@translate}"></a>
+	</th>
+	<th>User Name
+		<a href="{'#'|@translate}"><img src="{$USER_INFO_TRACKING_PATH}/images/down.gif" style="border:none" alt="{'Permissions Down'|@translate}" title="{'Permissions Down'|@translate}"></a>
+		<a href="{'#'|@translate}"><img src="{$USER_INFO_TRACKING_PATH}/images/up.gif" style="border:none" alt="{'Permissions Up'|@translate}" title="{'Permissions Up'|@translate}"></a>
+	</th>
+	<th>Admin Actions
+	</th>
+	<th>IP Address
+		<a href="{'#'|@translate}"><img src="{$USER_INFO_TRACKING_PATH}/images/down.gif" style="border:none" alt="{'Permissions Down'|@translate}" title="{'Permissions Down'|@translate}"></a>
+		<a href="{'#'|@translate}"><img src="{$USER_INFO_TRACKING_PATH}/images/up.gif" style="border:none" alt="{'Permissions Up'|@translate}" title="{'Permissions Up'|@translate}"></a>
+	</th>
+	<th>Time Stamp
+		<a href="{'#'|@translate}"><img src="{$USER_INFO_TRACKING_PATH}/images/down.gif" style="border:none" alt="{'Permissions Down'|@translate}" title="{'Permissions Down'|@translate}"></a>
+		<a href="{'#'|@translate}"><img src="{$USER_INFO_TRACKING_PATH}/images/up.gif" style="border:none" alt="{'Permissions Up'|@translate}" title="{'Permissions Up'|@translate}"></a>
+	</th>
+	<th>Action
+		<a href="{'#'|@translate}"><img src="{$USER_INFO_TRACKING_PATH}/images/down.gif" style="border:none" alt="{'Permissions Down'|@translate}" title="{'Permissions Down'|@translate}"></a>
+		<a href="{'#'|@translate}"><img src="{$USER_INFO_TRACKING_PATH}/images/up.gif" style="border:none" alt="{'Permissions Up'|@translate}" title="{'Permissions Up'|@translate}"></a>
+	</th>
+</tr>
+
+
+
+
+{foreach from=$messages item=message}
+<tr>
+	<td>{$message.id}</td>
+	<td>{$message.userId}</td>
+	<td>
+		{if ($message.userId) > 0}
+			<a href="{$message.userId2}">{$message.userName}</a>
+		{else}
+			{$message.userName}
+		{/if}
+	</td>
+	<td>
+		{if ($message.userId > 0)}
+			<a href="{$message.userId3}"><img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/permissions.png" style="border:none" alt="{'Permissions'|@translate}" title="{'Permissions'|@translate}"></a>
+			<a href="{$message.userId2}"><img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/edit_s.png" style="border:none" alt="{'Profile'|@translate}" title="{'Profile'|@translate}"></a>
+		{else}
+
+		{/if}
+	
+	</td>
+	<td>{$message.testIpAddress}</td>
+	<td>
+		{$message.timeStamp|date_format:"%A, %B %e, %Y %I:%M %p"}
+	</td>
+	<td>
+		{if ($message.action == "Successful Login")}
+			<span class="successfulLogin">{$message.action}</span>
+		{else}
+			{if ($message.action == "Failed Login")}
+				<span class="failedLogin">{$message.action}</span>
+			{else}
+				{if ($message.action == "Logout")}
+					<span class="logout">{$message.action}</span>
+				{else}
+					{$message.action}
+				{/if}			
+			{/if}
+		{/if}
+	</td>
+</tr>
+{foreachelse}
+<tr>
+	<td colspan="7"><center><b>{'No records in Database'|@translate}</b></center></td>
+</tr>
+{/foreach}
+
+</table>
+
+
+
+</fieldset>
+</form>
Index: /extensions/User_Info_Tracking/admin/template/index.php
===================================================================
--- /extensions/User_Info_Tracking/admin/template/index.php	(revision 19701)
+++ /extensions/User_Info_Tracking/admin/template/index.php	(revision 19701)
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: /extensions/User_Info_Tracking/admin/template/style.css
===================================================================
--- /extensions/User_Info_Tracking/admin/template/style.css	(revision 19701)
+++ /extensions/User_Info_Tracking/admin/template/style.css	(revision 19701)
@@ -0,0 +1,40 @@
+.showInfo {
+  position:static;
+  display:inline-block;
+  padding:1px 6px;
+  width:4px;
+  height:14px;
+  line-height:14px;
+  font-size:0.8em;
+}
+
+.square-list {
+  list-style:square !important;
+  margin-left:35px !important;
+}
+  .square-list li {
+    margin-bottom:0 !important;
+  }
+
+.successfulLogin {
+	font-weight: bold;
+	color: #5c0;
+}
+
+.failedLogin {
+	font-weight: bold;
+	color: #a44
+}
+
+
+
+
+
+
+.giSuccess, .giWarning, .giError  {
+    font-weight: bold;
+}
+	
+.giSuccess { color: #5c0; }
+.giWarning { color: #c50; }
+.giError { color: #a44; }
Index: /extensions/User_Info_Tracking/include/admin_events.inc.php
===================================================================
--- /extensions/User_Info_Tracking/include/admin_events.inc.php	(revision 19701)
+++ /extensions/User_Info_Tracking/include/admin_events.inc.php	(revision 19701)
@@ -0,0 +1,97 @@
+<?php
+defined('USER_INFO_TRACKING_PATH') or die('Hacking attempt!');
+
+/**
+ * admin plugins menu link
+ */
+function user_info_tracking_admin_plugin_menu_links($menu) 
+{
+  array_push($menu, array(
+    'NAME' => l10n('User Info Tracking'),
+    'URL' => USER_INFO_TRACKING_ADMIN,
+  ));
+  return $menu;
+}
+
+/**
+ * add a tab on photo properties page
+ */
+function user_info_tracking_tabsheet_before_select($sheets, $id)
+{
+  if ($id == 'photo')
+  {
+    $sheets['user_info_tracking'] = array(
+      'caption' => l10n('User Info Tracking'),
+      'url' => USER_INFO_TRACKING_ADMIN.'-photo&amp;image_id='.$_GET['image_id'],
+      );
+  }
+  
+  return $sheets;
+}
+
+/**
+ * add a prefilter to the Batch Downloader
+ */
+function user_info_tracking_add_batch_manager_prefilters($prefilters)
+{
+	array_push($prefilters, array(
+    'ID' => 'user_info_tracking',
+    'NAME' => l10n('User Info Tracking'),
+  ));
+	return $prefilters;
+}
+
+/**
+ * perform added prefilter
+ */
+function user_info_tracking_perform_batch_manager_prefilters($filter_sets, $prefilter)
+{
+  if ($prefilter == 'user_info_tracking')
+  {
+    $query = '
+SELECT id
+  FROM '.IMAGES_TABLE.'
+  ORDER BY RAND()
+  LIMIT 20
+;';
+    $filter_sets[] = array_from_query($query, 'id');
+  }
+  
+	return $filter_sets;
+}
+
+/**
+ * add an action to the Batch Manager
+ */
+function user_info_tracking_loc_end_element_set_global()
+{
+	global $template;
+  
+	$template->append('element_set_global_plugins_actions', array(
+    'ID' => 'user_info_tracking', 
+    'NAME' => l10n('User Info Tracking'), 
+    'CONTENT' => '<label><input type="checkbox" name="check_user_info_tracking"> '.l10n('Check me!').'</label>', // this is optional
+    ));
+}
+
+/**
+ * perform added action
+ */
+function user_info_tracking_element_set_global_action($action, $collection)
+{
+	if ($action == 'user_info_tracking')
+  {
+    global $page;
+    
+    if (empty($_POST['check_user_info_tracking']))
+    {
+      array_push($page['warnings'], l10n('Nothing appened, but you didn\'t check the box!'));
+    }
+    else
+    {
+      array_push($page['infos'], l10n('Nothing appened, but you checked the box!'));
+    }
+  }
+}
+
+?>
Index: /extensions/User_Info_Tracking/include/functions.inc.php
===================================================================
--- /extensions/User_Info_Tracking/include/functions.inc.php	(revision 19701)
+++ /extensions/User_Info_Tracking/include/functions.inc.php	(revision 19701)
@@ -0,0 +1,126 @@
+<?php
+defined('USER_INFO_TRACKING_PATH') or die('Hacking attempt!');
+
+
+/**
+ * Triggered on login_success
+ * 
+ */
+function ui_successfulLogin()
+{
+  global $conf, $user;
+  
+  include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+  $myIpAddress = $_SERVER['REMOTE_ADDR'];
+
+
+      pwg_query("INSERT INTO `". USER_INFO_TRACKING_TABLE2 ."`(
+          userID,
+          userName,
+          ipAddress,
+          timeStamp,
+          action
+        )
+        VALUES(
+          '". $user['id'] ."',
+          '". $_POST['username'] ."',
+          '". $myIpAddress ."',
+          '". time() ."',
+          'Successful Login'
+        );");
+
+}
+
+/**
+ * Triggered on login_failure
+ * 
+ */
+function ui_failedLogin()
+{
+
+  global $conf;
+
+	$myIpAddress = $_SERVER['REMOTE_ADDR'];
+	$login = $_POST['username'];
+
+
+    $query = "
+SELECT ".$conf['user_fields']['id']." AS id
+FROM ".USERS_TABLE."
+WHERE LOWER(".stripslashes($conf['user_fields']['username']).") = '".strtolower($login)."'
+;";
+
+	$userNameLookup = mysql_fetch_row(pwg_query($query));
+    $count = pwg_db_num_rows(pwg_query($query));
+
+    if ($count > 0)
+    {
+
+      pwg_query("INSERT INTO `". USER_INFO_TRACKING_TABLE2 ."`(
+          userID,
+          userName,
+          ipAddress,
+          timeStamp,
+          action
+        )
+        VALUES(
+          '". $userNameLookup[0] ."',
+          '". $_POST['username'] ."',
+          '". $myIpAddress ."',
+          '". time() ."',
+          'Failed Login'
+        );");
+
+    } else {
+
+      pwg_query("INSERT INTO `". USER_INFO_TRACKING_TABLE2 ."`(
+          userName,
+          ipAddress,
+          timeStamp,
+          action
+        )
+        VALUES(
+          '". $_POST['username'] ."',
+          '". $myIpAddress ."',
+          '". time() ."',
+          'Failed Login'
+        );");
+
+    }
+
+}
+
+
+/**
+ * Triggered on logout
+ * 
+ */
+function ui_logout()
+{
+  global $conf, $user;
+  
+  include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+  $myIpAddress = $_SERVER['REMOTE_ADDR'];
+
+
+      pwg_query("INSERT INTO `". USER_INFO_TRACKING_TABLE2 ."`(
+          userID,
+          userName,
+          ipAddress,
+          timeStamp,
+          action
+        )
+        VALUES(
+          '". $user['id'] ."',
+          '". $user['username'] ."',
+          '". $myIpAddress ."',
+          '". time() ."',
+          'Logout'
+        );");
+
+}
+
+
+
+
+?>
Index: /extensions/User_Info_Tracking/include/index.php
===================================================================
--- /extensions/User_Info_Tracking/include/index.php	(revision 19701)
+++ /extensions/User_Info_Tracking/include/index.php	(revision 19701)
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: /extensions/User_Info_Tracking/include/install.inc.php
===================================================================
--- /extensions/User_Info_Tracking/include/install.inc.php	(revision 19701)
+++ /extensions/User_Info_Tracking/include/install.inc.php	(revision 19701)
@@ -0,0 +1,68 @@
+<?php
+defined('PHPWG_ROOT_PATH') or die('Hacking attempt!');
+
+/**
+ * The installation function is called by main.inc.php and maintain.inc.php
+ * in order to install and/or update the plugin.
+ *
+ * That's why all operations must be conditionned :
+ *    - use "if empty" for configuration vars
+ *    - use "IF NOT EXISTS" for table creation
+ *
+ * Unlike the functions in maintain.inc.php, the name of this function must be unique
+ * and not enter in conflict with other plugins.
+ */
+
+function user_info_tracking_install() 
+{
+  global $conf, $prefixeTable;
+  
+  // add config parameter
+  if (empty($conf['user_info_tracking']))
+  {
+    $user_info_tracking_default_config = serialize(array(
+      'rowId' => 10,
+      'uiPerPage' => 25,
+      'uiDefaultSortColumn' => timeStamp,
+      'uiDefaultSortOrder' => ASC,
+      'uiDateFormat' => '%c',
+      ));
+  
+    conf_update_param('user_info_tracking', $user_info_tracking_default_config);
+    $conf['user_info_tracking'] = $user_info_tracking_default_config;
+  }
+  else
+  {
+    // if you need to test the "old" configuration you must check if not yet unserialized
+    $old_conf = is_string($conf['user_info_tracking']) ? unserialize($conf['user_info_tracking']) : $conf['user_info_tracking'];
+  }
+  
+  // add a new table
+	pwg_query('
+CREATE TABLE IF NOT EXISTS `'. $prefixeTable .'user_info_tracking` (
+  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `userId` int(11) DEFAULT NULL,
+  `userName` mediumtext DEFAULT NULL,
+  `ipAddress` mediumtext DEFAULT NULL,
+  `timeStamp` mediumtext DEFAULT NULL,
+  `action` mediumtext DEFAULT NULL,
+  PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8
+;');
+
+  // add a new column to existing table
+//  $result = pwg_query('SHOW COLUMNS FROM `'.IMAGES_TABLE.'` LIKE "skeleton";');
+//  if (!pwg_db_num_rows($result))
+//  {      
+//    pwg_query('ALTER TABLE `' . IMAGES_TABLE . '` ADD `skeleton` TINYINT(1) NOT NULL DEFAULT 0;');
+//  }
+
+  // create a local directory
+  if ( file_exists(PWG_LOCAL_DIR) and !file_exists(PWG_LOCAL_DIR . 'user_info_tracking/') ) 
+  {
+    mkdir(PWG_LOCAL_DIR . 'user_info_tracking/', 0755);
+  }
+
+}
+
+?>
Index: /extensions/User_Info_Tracking/language/en_UK/description.txt
===================================================================
--- /extensions/User_Info_Tracking/language/en_UK/description.txt	(revision 19701)
+++ /extensions/User_Info_Tracking/language/en_UK/description.txt	(revision 19701)
@@ -0,0 +1,1 @@
+This is not a plugin. It's a skeleton for future plugins.
Index: /extensions/User_Info_Tracking/language/en_UK/index.php
===================================================================
--- /extensions/User_Info_Tracking/language/en_UK/index.php	(revision 19701)
+++ /extensions/User_Info_Tracking/language/en_UK/index.php	(revision 19701)
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: /extensions/User_Info_Tracking/language/en_UK/intro.html
===================================================================
--- /extensions/User_Info_Tracking/language/en_UK/intro.html	(revision 19701)
+++ /extensions/User_Info_Tracking/language/en_UK/intro.html	(revision 19701)
@@ -0,0 +1,30 @@
+<p>
+  <h4>You are a common user?</h4>
+  If so, this plugin is totally useless and you should delete it!
+</p>
+
+<p>
+  <h4>You want to develop a Piwigo plugin?</h4>
+  This plugin is an example of a simple plugin structure, but with cool options:
+  <ul class="square-list">
+    <li>Multilingual plugin</li>
+    <li>Installation and upgrade process</li>
+    <li>Administration page</li>
+    <li>Public page</li>
+    <li>Add tabs to core admin pages</li>
+    <li>Add filters and actions to the Batch Manager</li>
+    <li>Simple template prefilter (on picture.php page)</li>
+    <li>Add new method to the API</li>
+  </ul>
+</p>
+
+<p>
+  <h4>Important note</h4>
+  This skeleton reflects the way I (Mistic, member of the Piwigo.or team) develop, it's absolutely not a perfect and unique solution.<br>
+  You should not use the Skeleton files for your own plugin, it includes features useless for most plugins but making Piwigo slower and heavier. You should see how it works and try to implement these features whith your habits of coding and your knowledges.
+</p>
+
+<p>
+  <h4>Licensing</h4>
+  This work is in the public domain, without any license, you can entirely re-use it and say it's your own work :-)
+</p>
Index: /extensions/User_Info_Tracking/language/en_UK/plugin.lang.php
===================================================================
--- /extensions/User_Info_Tracking/language/en_UK/plugin.lang.php	(revision 19701)
+++ /extensions/User_Info_Tracking/language/en_UK/plugin.lang.php	(revision 19701)
@@ -0,0 +1,16 @@
+<?php
+
+/*
+ * as much as possible prefer using comprehensive keys (such as "Check here") instead of
+ * formatted keys (eg "skeleton_check_button"), it would make your code more readable and help
+ * the translation team as well
+ */
+
+$lang['Skeleton'] = 'Skeleton';
+$lang['What Skeleton can do for me?'] = 'What Skeleton can do for me?';
+$lang['Check me!'] = 'Check me!';
+$lang['Nothing appened, but you didn\'t check the box!'] = 'Nothing appened, but you didn\'t check the box!';
+$lang['Nothing appened, but you checked the box!'] = 'Nothing appened, but you checked the box!';
+$lang['Common configuration'] = 'Common configuration';
+
+?>
Index: /extensions/User_Info_Tracking/language/fr_FR/description.txt
===================================================================
--- /extensions/User_Info_Tracking/language/fr_FR/description.txt	(revision 19701)
+++ /extensions/User_Info_Tracking/language/fr_FR/description.txt	(revision 19701)
@@ -0,0 +1,1 @@
+Ceci n'est pas un plugin. C'est un canevas pour de futurs plugins.
Index: /extensions/User_Info_Tracking/language/fr_FR/index.php
===================================================================
--- /extensions/User_Info_Tracking/language/fr_FR/index.php	(revision 19701)
+++ /extensions/User_Info_Tracking/language/fr_FR/index.php	(revision 19701)
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: /extensions/User_Info_Tracking/language/fr_FR/intro.html
===================================================================
--- /extensions/User_Info_Tracking/language/fr_FR/intro.html	(revision 19701)
+++ /extensions/User_Info_Tracking/language/fr_FR/intro.html	(revision 19701)
@@ -0,0 +1,30 @@
+<p>
+  <h4>Vous êtes utilisateur ?</h4>
+  Dans ce cas: rien, et vous feriez mieux de supprimer ce plugin !
+</p>
+
+<p>
+  <h4>Vous souhaitez développer un plugin pour Piwigo ?</h4>
+  Ce plugin est un exemple de structure basique de plugin, mais avec des fonctionnalités cool :
+  <ul class="square-list">
+    <li>Plugin multilingue</li>
+    <li>Procédure d'installation et mise à jour automatique</li>
+    <li>Page d'administration</li>
+    <li>Page publique</li>
+    <li>Ajout d'onglet sur les pages d'administration existantes</li>
+    <li>Ajout des filtres et actions au gestionnaire de lots</li>
+    <li>Préfiltre de template simple (sur page picture.php)</li>
+    <li>Ajout d'une méthode à l'API</li>
+  </ul>
+</p>
+
+<p>
+  <h4>Note importante</h4>
+  Skeleton reflète la façon dont je (Mistic, membre de l'équipe Piwigo.org) développe, ce n'est certainement pas un solution parfaite et unique.<br>
+  Vous ne devriez pas directement developper vos plugins à partir du code de Skeleton, il inclut des fonctionnalités inutiles pour la plupart des plugins mais qui rendent Piwigo plus lourd et plus lent. Préférez comprendre comment ça fonctionne et implémenter les fonctionnalités à votre façon.
+</p>
+
+<p>
+  <h4>License</h4>
+  Ce plugin est dans le domaine publique, aucune license ne s'y applique, vous pouvez sans problème vous approprier le code sans contrepartie ou mention :-)
+</p>
Index: /extensions/User_Info_Tracking/language/fr_FR/plugin.lang.php
===================================================================
--- /extensions/User_Info_Tracking/language/fr_FR/plugin.lang.php	(revision 19701)
+++ /extensions/User_Info_Tracking/language/fr_FR/plugin.lang.php	(revision 19701)
@@ -0,0 +1,16 @@
+<?php
+
+/*
+ * as much as possible prefer using comprehensive keys (such as "Check here") instead of
+ * formatted keys (eg "skeleton_check_button"), it would make your code more readable and help
+ * the translation team as well
+ */
+
+$lang['Skeleton'] = 'Skeleton';
+$lang['What Skeleton can do for me?'] = 'Qu\'est-ce que Skeleton peut faire pour moi ?';
+$lang['Check me!'] = 'Cliquez-moi !';
+$lang['Nothing appened, but you didn\'t check the box!'] = 'Rien ne s\'est passé, mais vous n\'avez pas coché la case !';
+$lang['Nothing appened, but you checked the box!'] = 'Rien ne s\'est passé, mais vous avez coché la case !';
+$lang['Common configuration'] = 'Configuration commune';
+
+?>
Index: /extensions/User_Info_Tracking/language/index.php
===================================================================
--- /extensions/User_Info_Tracking/language/index.php	(revision 19701)
+++ /extensions/User_Info_Tracking/language/index.php	(revision 19701)
@@ -0,0 +1,7 @@
+<?php
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
