Index: /extensions/LCAS/trunk/admin/LCAS_admin.php
===================================================================
--- /extensions/LCAS/trunk/admin/LCAS_admin.php	(revision 8141)
+++ /extensions/LCAS/trunk/admin/LCAS_admin.php	(revision 8141)
@@ -0,0 +1,298 @@
+<?php
+
+global $user, $lang, $conf, $errors;
+
+if (!defined('PHPWG_ROOT_PATH')) die('Hacking attempt!');
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_ADMINISTRATOR);
+
+if (!defined('LCAS_PATH')) define('LCAS_PATH' , PHPWG_PLUGINS_PATH.basename(dirname(__FILE__)).'/');
+
+//ini_set('error_reporting', E_ALL);
+//ini_set('display_errors', true);
+
+include_once(PHPWG_ROOT_PATH.'admin/include/tabsheet.class.php');
+include_once (PHPWG_ROOT_PATH.'/include/constants.php');
+$my_base_url = get_admin_plugin_menu_link(__FILE__);
+
+load_language('plugin.lang', LCAS_PATH);
+load_language('help/plugin.lang', LCAS_PATH);
+
+$page['global'] = array();
+$error = array();
+$pattern = '/;/';
+$replacement = '.';
+
+$LCAS_Password_Test_Score = 0;
+$LCAS_Exclusionlist_Error = false;
+
+// +-----------------------------------------------------------------------+
+// |                            Tabssheet                                  |
+// +-----------------------------------------------------------------------+
+if (!isset($_GET['tab']))
+	$page['tab'] = 'global';
+else
+  $page['tab'] = $_GET['tab'];
+
+$tabsheet = new tabsheet();
+$tabsheet->add('global',
+               l10n('Tab_Global'),
+               $my_base_url.'&amp;tab=global');
+  $tabsheet->add('userlist',
+                 l10n('Tab_UserList'),
+                 $my_base_url.'&amp;tab=userlist');
+$tabsheet->select($page['tab']);
+$tabsheet->assign();
+
+
+// +-----------------------------------------------------------------------+
+// |                      Getting plugin version                           |
+// +-----------------------------------------------------------------------+
+$plugin =  LCAS_PluginInfos(LCAS_PATH);
+$version = $plugin['version'];
+
+
+// +----------------------------------------------------------+
+// |            FCK Editor for email text fields              |
+// +----------------------------------------------------------+
+
+/* Available only for ConfirmMail return page customization */
+$toolbar = 'Basic';
+$width = '750px';
+$height = '300px';
+$areas = array();
+array_push( $areas,'LCAS_ConfirmMail_Custom_Txt1','LCAS_ConfirmMail_Custom_Txt2');
+
+if (function_exists('set_fckeditor_instance'))
+{
+  $fcke_config = unserialize($conf['FCKEditor']);
+  foreach($areas as $area)
+  {
+    if (!isset($fcke_config[$area]))
+    {
+      $fcke_config[$area] = false;
+    }
+  }
+  $conf['FCKEditor'] = serialize($fcke_config);
+
+  set_fckeditor_instance($areas, $toolbar, $width, $height);
+}
+
+
+// +-----------------------------------------------------------------------+
+// |                            Tabssheet select                           |
+// +-----------------------------------------------------------------------+
+
+switch ($page['tab'])
+{
+// *************************************************************************
+// +-----------------------------------------------------------------------+
+// |                           Global Config                               |
+// +-----------------------------------------------------------------------+
+// *************************************************************************
+  case 'global':
+
+	if (isset($_POST['submit']) and !is_adviser() and isset($_POST['LCAS_Mail_Info']) and isset($_POST['LCAS_Confirm_Mail']) )
+  {
+
+/* General configuration settings */
+
+/* Check if CR-LF exist at begining and end of mail exclusion list - If yes, removes them */
+		$newconf_LCAS= array(
+      $_POST['LCAS_Mail_Info'],
+      $_POST['LCAS_Confirm_Mail']);
+
+    $conf['LoginCaseAccentsSensitivity'] = serialize($newconf_LCAS);
+
+		$query = '
+	  	UPDATE '.CONFIG_TABLE.'
+	  	SET value="'.addslashes($conf['LoginCaseAccentsSensitivity']).'"
+	  	WHERE param="LoginCaseAccentsSensitivity"
+	  	LIMIT 1
+	  	;';
+		
+		pwg_query($query);
+
+		array_push($page['infos'], l10n('LCAS_save_config'));
+  }
+
+
+  $conf_LCAS= unserialize($conf['LoginCaseAccentsSensitivity']);
+
+
+/* Save last opened paragraph in configuration tab */
+  $nb_para=(isset($_POST["nb_para"])) ? $_POST["nb_para"]:"";
+  $nb_para2=(isset($_POST["nb_para2"])) ? $_POST["nb_para2"]:"";
+
+  $template->assign(
+    array(
+    'nb_para'                        => $nb_para,
+    'nb_para2'                       => $nb_para2,
+    'LCAS_VERSION'                    => $version,
+    'LCAS_PATH'                       => LCAS_PATH,
+		'LCAS_MAIL_INFO_TRUE'             => $conf_LCAS[0]=='true' ?  'checked="checked"' : '' ,
+		'LCAS_MAIL_INFO_FALSE'            => $conf_LCAS[0]=='false' ?  'checked="checked"' : '' ,
+		'LCAS_CONFIRM_MAIL_TRUE'          => $conf_LCAS[1]=='true' ?  'checked="checked"' : '' ,
+		'LCAS_CONFIRM_MAIL_FALSE'         => $conf_LCAS[1]=='false' ?  'checked="checked"' : '' ,
+    )
+  );
+
+
+// +-----------------------------------------------------------------------+
+// |                             errors display                            |
+// +-----------------------------------------------------------------------+
+  if (isset ($errors) and count($errors) != 0)
+  {
+	  $template->assign('errors',array());
+	  foreach ($errors as $error)
+	  {
+		  array_push($page['errors'], $error);
+		}
+	}  
+
+// +-----------------------------------------------------------------------+
+// |                           templates display                           |
+// +-----------------------------------------------------------------------+
+  $template->set_filename('plugin_admin_content', dirname(__FILE__) . '/template/global.tpl');
+  $template->assign_var_from_handle('ADMIN_CONTENT', 'plugin_admin_content');
+
+  break;
+
+
+// *************************************************************************
+// +-----------------------------------------------------------------------+
+// |                           Users list page                             |
+// +-----------------------------------------------------------------------+
+// *************************************************************************
+  case 'userlist':
+  
+  $conf_LCAS= unserialize($conf['LoginCaseAccentsSensitivity']);
+  
+  if ((isset($conf_LCAS[0]) and $conf_LCAS[0]=='true') || (isset($conf_LCAS[1]) and $conf_LCAS[1]=='true'))
+  {
+// +-----------------------------------------------------------------------+
+// |                           initialization                              |
+// +-----------------------------------------------------------------------+
+
+		if (!defined('PHPWG_ROOT_PATH'))
+    {
+    	die('Hacking attempt!');
+    }
+          
+    include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+		check_status(ACCESS_ADMINISTRATOR);
+
+
+// +-----------------------------------------------------------------------+
+// |                               user list                               |
+// +-----------------------------------------------------------------------+
+
+		$page['all_users'] = LCAS_get_user_list();
+
+// +-----------------------------------------------------------------------+
+// |                           Template Init                               |
+// +-----------------------------------------------------------------------+
+		/*$base_url = PHPWG_ROOT_PATH.'admin.php?page=user_list';
+
+    if (isset($_GET['start']) and is_numeric($_GET['start']))
+    {
+      $start = $_GET['start'];
+    }
+    else
+    {
+      $start = 0;
+    }*/
+
+// +-----------------------------------------------------------------------+
+// |                            navigation bar                             |
+// +-----------------------------------------------------------------------+
+
+/*$url = PHPWG_ROOT_PATH.'admin.php'.get_query_string_diff(array('start'));
+
+$navbar = create_navigation_bar(
+  $url,
+  count($page['filtered_users']),
+  $start,
+  $conf['users_page']
+  );
+
+$template->assign('navbar', $navbar);*/
+
+// +-----------------------------------------------------------------------+
+// |                               user list                               |
+// +-----------------------------------------------------------------------+
+
+    $visible_user_list = array();
+    foreach ($page['all_users'] as $num => $local_user)
+    {
+// simulate LIMIT $start, $conf['users_page']
+			/*if ($num < $start)
+      {
+        continue;
+      }
+      if ($num >= $start + $conf['users_page'])
+      {
+        break;
+      }*/
+
+      $visible_user_list[] = $local_user;
+		}
+
+		foreach ($visible_user_list as $local_user)
+    {
+      $lcas_SendEmail  = l10n('Send_Email'); 
+      $lcas_UpdateUser = l10n('Update_User'); 
+      $display = 'green';
+			$display = '';
+
+   		$template->append(
+     		'users',
+       	array(
+       		'ID'          => $local_user['id'],
+         	'USERNAME'    => stripslashes($local_user['username'].' | '.LCAS_change_case($local_user['username'], 1).' | '.LCAS_change_case($local_user['username'], 2).' | '.LCAS_change_case($local_user['username'], 3)),
+					'EMAIL'       => get_email_address_as_display_text($local_user['email']),
+          'LASTVISIT'   => $lcas_UpdateUser,
+          'DAYS'        => $lcas_SendEmail,
+          'DISPLAY'     => $display,
+				)
+			);
+		}
+    /* Plugin version inserted */
+    $template->assign(
+      array(
+        'LCAS_VERSION'  => $version,
+        'LCAS_PATH'     => LCAS_PATH,
+      )
+    );    
+// +-----------------------------------------------------------------------+
+// |                             errors display                            |
+// +-----------------------------------------------------------------------+
+		if ( isset ($errors) and count($errors) != 0)
+		{
+	  	$template->assign('errors',array());
+			foreach ($errors as $error)
+	  	{
+				array_push($page['errors'], $error);
+	  	}
+ 		}  
+
+// +-----------------------------------------------------------------------+
+// |                           templates display                           |
+// +-----------------------------------------------------------------------+
+		$template->set_filename('plugin_admin_content', dirname(__FILE__) . '/template/userlist.tpl');
+    $template->assign_var_from_handle('ADMIN_CONTENT', 'plugin_admin_content');		
+  }
+  else
+  {
+		array_push($page['errors'], l10n('Err_Userlist_Settings'));
+  }
+  break;
+
+}
+?>
Index: /extensions/LCAS/trunk/admin/index.php
===================================================================
--- /extensions/LCAS/trunk/admin/index.php	(revision 8141)
+++ /extensions/LCAS/trunk/admin/index.php	(revision 8141)
@@ -0,0 +1,33 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | PhpWebGallery - a PHP based picture gallery                           |
+// | Copyright (C) 2002-2003 Pierrick LE GALL - pierrick@phpwebgallery.net |
+// | Copyright (C) 2003-2007 PhpWebGallery Team - http://phpwebgallery.net |
+// +-----------------------------------------------------------------------+
+// | file          : $Id: index.php 1912 2007-03-16 06:30:07Z rub $
+// | last update   : $Date: 2007-03-16 07:30:07 +0100 (ven, 16 mar 2007) $
+// | last modifier : $Author: rub $
+// | revision      : $Revision: 1912 $
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: /extensions/LCAS/trunk/admin/template/global.tpl
===================================================================
--- /extensions/LCAS/trunk/admin/template/global.tpl	(revision 8141)
+++ /extensions/LCAS/trunk/admin/template/global.tpl	(revision 8141)
@@ -0,0 +1,114 @@
+{known_script id="jquery" src=$ROOT_URL|@cat:"themes/default/js/jquery.packed.js"}
+{known_script id="jquery.cluetip" src=$ROOT_URL|@cat:"themes/default/js/plugins/jquery.cluetip.packed.js"}
+
+{html_head}<link rel="stylesheet" type="text/css" href="{$LCAS_PATH}admin/template/lcas.css">{/html_head}
+
+<script type="text/javascript">
+jQuery().ready(function()
+{ldelim}
+  jQuery('.cluetip').cluetip(
+  {ldelim}
+    width: 550,
+    splitTitle: '|'
+  {rdelim});
+{rdelim});
+
+function blockToggleDisplay(headerId, contentId)
+{ldelim}
+  var revHeader = document.getElementById(headerId);
+  var revContent = document.getElementById(contentId);
+
+  if (revContent.style.display == 'none')
+  {ldelim}
+    revContent.style.display = 'block';
+    revHeader.className = 'instructionBlockHeaderExpanded';
+  {rdelim}
+  else
+  {ldelim}
+    revContent.style.display = 'none';
+    revHeader.className = 'instructionBlockHeaderCollapsed';
+  {rdelim}
+{rdelim}
+
+function LCAS_blockToggleDisplay( headerId, contentId )
+{ldelim}
+  if (typeof(headerId)=='string')
+  {ldelim}
+   if ( headerId.length>  1)
+       blockToggleDisplay(headerId, contentId) ;
+      document.getElementById("nb_para").value =headerId ;
+      document.getElementById("nb_para2").value =contentId;
+  {rdelim}
+{rdelim}
+</script>
+
+<div class="titrePage">
+  <h2>{'Title_Tab'|@translate} {$LCAS_VERSION}<br>{'SubTitle1'|@translate}</h2>
+</div>
+
+<form method="post" action="" class="general">
+
+  <p>
+    <input class="submit" type="submit" value="{'submit'|@translate}" name="submit" {$TAG_INPUT_ENABLED}>
+  </p>
+
+  <input name="nb_para" id="nb_para" type="text" value="{$nb_para}" style="display:none"> 
+  <input name="nb_para2" id="nb_para2" type="text" value="{$nb_para2}" style="display:none"> 
+
+
+  <div id="instructionConfig2" class="instructionBlock" >
+
+    <div id="config2_header" class="instructionBlockHeader">
+      <span class="cluetip" title="{'LCAS_confirmTitle'|translate}|{'LCAS_confirmTitle_d'|translate}">
+        {'LCAS_Title2'|@translate}
+      </span>
+    </div>
+  
+    <div id="Config2" class="instructionBlockContent" style="display:block">
+      <fieldset>
+        <ul>
+          <li>
+            <label class="cluetip" title="{'LCAS_infomailTitle'|translate}|{'LCAS_infomailTitle_d'|translate}">
+              {'LCAS_Mail_Info'|@translate}
+            </label>
+          <br><br>
+            <input type="radio" value="false" {$LCAS_MAIL_INFO_FALSE} name="LCAS_Mail_Info">
+              {'LCAS_Mail_Info_false'|@translate}<br>
+            <input type="radio" value="true" {$LCAS_MAIL_INFO_TRUE} name="LCAS_Mail_Info">
+              {'LCAS_Mail_Info_true'|@translate}
+            <br><br>
+          </li>
+
+        	<li>
+            <label class="cluetip" title="{'LCAS_confirmmailTitle'|translate}|{'LCAS_confirmmailTitle_d'|translate}">
+              {'LCAS_Confirm_Mail'|@translate}
+            </label>
+         <br><br>
+            <input type="radio" value="false" {$LCAS_CONFIRM_MAIL_FALSE} name="LCAS_Confirm_Mail">
+              {'LCAS_Confirm_Mail_false'|@translate}<br>
+            <input type="radio" value="true" {$LCAS_CONFIRM_MAIL_TRUE} name="LCAS_Confirm_Mail">
+              {'LCAS_Confirm_Mail_true'|@translate}<br>
+            <br><br>
+        	</li>
+
+        </ul>
+      </fieldset>
+    </div>
+  </div>
+
+
+  <p>
+    <input class="submit" type="submit" value="{'submit'|@translate}" name="submit" {$TAG_INPUT_ENABLED} >
+  </p>
+</form>
+
+
+<fieldset>
+  {'LCAS_Support_txt'|@translate}
+</fieldset>
+
+<script type="text/javascript">
+  var n1=document.getElementById("nb_para").value;
+  var n2=document.getElementById("nb_para2").value;
+   LCAS_blockToggleDisplay(n1,n2);
+</script>
Index: /extensions/LCAS/trunk/admin/template/icon/index.php
===================================================================
--- /extensions/LCAS/trunk/admin/template/icon/index.php	(revision 8141)
+++ /extensions/LCAS/trunk/admin/template/icon/index.php	(revision 8141)
@@ -0,0 +1,33 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | PhpWebGallery - a PHP based picture gallery                           |
+// | Copyright (C) 2002-2003 Pierrick LE GALL - pierrick@phpwebgallery.net |
+// | Copyright (C) 2003-2007 PhpWebGallery Team - http://phpwebgallery.net |
+// +-----------------------------------------------------------------------+
+// | file          : $Id: index.php 1912 2007-03-16 06:30:07Z rub $
+// | last update   : $Date: 2007-03-16 07:30:07 +0100 (ven, 16 mar 2007) $
+// | last modifier : $Author: rub $
+// | revision      : $Revision: 1912 $
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: /extensions/LCAS/trunk/admin/template/index.php
===================================================================
--- /extensions/LCAS/trunk/admin/template/index.php	(revision 8141)
+++ /extensions/LCAS/trunk/admin/template/index.php	(revision 8141)
@@ -0,0 +1,33 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | PhpWebGallery - a PHP based picture gallery                           |
+// | Copyright (C) 2002-2003 Pierrick LE GALL - pierrick@phpwebgallery.net |
+// | Copyright (C) 2003-2007 PhpWebGallery Team - http://phpwebgallery.net |
+// +-----------------------------------------------------------------------+
+// | file          : $Id: index.php 1912 2007-03-16 06:30:07Z rub $
+// | last update   : $Date: 2007-03-16 07:30:07 +0100 (ven, 16 mar 2007) $
+// | last modifier : $Author: rub $
+// | revision      : $Revision: 1912 $
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: /extensions/LCAS/trunk/admin/template/js/jquery-latest.js
===================================================================
--- /extensions/LCAS/trunk/admin/template/js/jquery-latest.js	(revision 8141)
+++ /extensions/LCAS/trunk/admin/template/js/jquery-latest.js	(revision 8141)
@@ -0,0 +1,32 @@
+/*
+ * jQuery 1.2.3 - New Wave Javascript
+ *
+ * Copyright (c) 2008 John Resig (jquery.com)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * $Date: 2008-02-06 00:21:25 -0500 (Wed, 06 Feb 2008) $
+ * $Rev: 4663 $
+ */
+(function(){if(window.jQuery)var _jQuery=window.jQuery;var jQuery=window.jQuery=function(selector,context){return new jQuery.prototype.init(selector,context);};if(window.$)var _$=window.$;window.$=jQuery;var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/;var isSimple=/^.[^:#\[\.]*$/;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}else if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem)if(elem.id!=match[3])return jQuery().find(selector);else{this[0]=elem;this.length=1;return this;}else
+selector=[];}}else
+return new jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return new jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(selector.constructor==Array&&selector||(selector.jquery||selector.length&&selector!=window&&!selector.nodeType&&selector[0]!=undefined&&selector[0].nodeType)&&jQuery.makeArray(selector)||[selector]);},jquery:"1.2.3",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;this.each(function(i){if(this==elem)ret=i;});return ret;},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value==undefined)return this.length&&jQuery[type||"attr"](this[0],name)||undefined;else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else
+return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else
+selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return!selector?this:this.pushStack(jQuery.merge(this.get(),selector.constructor==String?jQuery(selector).get():selector.length!=undefined&&(!selector.nodeName||jQuery.nodeName(selector,"form"))?selector:[selector]));},is:function(selector){return selector?jQuery.multiFilter(selector,this).length>0:false;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery.browser.msie&&!option.attributes.value.specified?option.text:option.value;if(one)return value;values.push(value);}}return values;}else
+return(this[0].value||"").replace(/\r/g,"");}return undefined;}return this.each(function(){if(this.nodeType!=1)return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=value.constructor==Array?value:[value];jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else
+this.value=value;});},html:function(value){return value==undefined?(this.length?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value==null){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data==undefined&&this.length)data=jQuery.data(this[0],key);return data==null&&parts[1]?this.data(parts[0]):data;}else
+return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script")){scripts=scripts.add(elem);}else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.prototype.init.prototype=jQuery.prototype;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
+jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==1){target=this;i=0;}for(;i<length;i++)if((options=arguments[i])!=null)for(var name in options){if(target===options[name])continue;if(deep&&options[name]&&typeof options[name]=="object"&&target[name]&&!options[name].nodeType)target[name]=jQuery.extend(target[name],options[name]);else if(options[name]!=undefined)target[name]=options[name];}return target;};var expando="jQuery"+(new Date()).getTime(),uuid=0,windowData={};var exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i;jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/function/i.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.browser.msie)script.text=data;else
+script.appendChild(document.createTextNode(data));head.appendChild(script);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!=undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(object,callback,args){if(args){if(object.length==undefined){for(var name in object)if(callback.apply(object[name],args)===false)break;}else
+for(var i=0,length=object.length;i<length;i++)if(callback.apply(object[i],args)===false)break;}else{if(object.length==undefined){for(var name in object)if(callback.call(object[name],name,object[name])===false)break;}else
+for(var i=0,length=object.length,value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)elem.className=classNames!=undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else
+jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret;function color(elem){if(!jQuery.browser.safari)return false;var ret=document.defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(elem.style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=elem.style.outline;elem.style.outline="0 solid black";elem.style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&elem.style&&elem.style[name])ret=elem.style[name];else if(document.defaultView&&document.defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var getComputedStyle=document.defaultView.getComputedStyle(elem,null);if(getComputedStyle&&!color(elem))ret=getComputedStyle.getPropertyValue(name);else{var swap=[],stack=[];for(var a=elem;a&&color(a);a=a.parentNode)stack.unshift(a);for(var i=0;i<stack.length;i++)if(color(stack[i])){swap[i]=stack[i].style.display;stack[i].style.display="block";}ret=name=="display"&&swap[stack.length-1]!=null?"none":(getComputedStyle&&getComputedStyle.getPropertyValue(name))||"";for(var i=0;i<swap.length;i++)if(swap[i]!=null)stack[i].style.display=swap[i];}if(name=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var style=elem.style.left,runtimeStyle=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;elem.style.left=ret||0;ret=elem.style.pixelLeft+"px";elem.style.left=style;elem.runtimeStyle.left=runtimeStyle;}}return ret;},clean:function(elems,context){var ret=[];context=context||document;if(typeof context.createElement=='undefined')context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;jQuery.each(elems,function(i,elem){if(!elem)return;if(elem.constructor==Number)elem=elem.toString();if(typeof elem=="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf("<table")&&tags.indexOf("<tbody")<0?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&tags.indexOf("<tbody")<0?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else
+ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var fix=jQuery.isXMLDoc(elem)?{}:jQuery.props;if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(fix[name]){if(value!=undefined)elem[fix[name]]=value;return elem[fix[name]];}else if(jQuery.browser.msie&&name=="style")return jQuery.attr(elem.style,"cssText",value);else if(value==undefined&&jQuery.browser.msie&&jQuery.nodeName(elem,"form")&&(name=="action"||name=="method"))return elem.getAttributeNode(name).nodeValue;else if(elem.tagName){if(value!=undefined){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem.setAttribute(name,""+value);}if(jQuery.browser.msie&&/href|src/.test(name)&&!jQuery.isXMLDoc(elem))return elem.getAttribute(name,2);return elem.getAttribute(name);}else{if(name=="opacity"&&jQuery.browser.msie){if(value!=undefined){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseFloat(value).toString()=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100).toString():"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(value!=undefined)elem[name]=value;return elem[name];}},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(typeof array!="array")for(var i=0,length=array.length;i<length;i++)ret.push(array[i]);else
+ret=array.slice(0);return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)if(array[i]==elem)return i;return-1;},merge:function(first,second){if(jQuery.browser.msie){for(var i=0;second[i];i++)if(second[i].nodeType!=8)first.push(second[i]);}else
+for(var i=0;second[i];i++)first.push(second[i]);return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv&&callback(elems[i],i)||inv&&!callback(elems[i],i))ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!==null&&value!=undefined){if(value.constructor!=Array)value=[value];ret=ret.concat(value);}}return ret;}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,innerHTML:"innerHTML",className:"className",value:"value",disabled:"disabled",checked:"checked",readonly:"readOnly",selected:"selected",maxlength:"maxLength",selectedIndex:"selectedIndex",defaultValue:"defaultValue",tagName:"tagName",nodeName:"nodeName"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false;var re=quickChild;var m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==0){if(node.nodeIndex==last)add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[];var cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&(!elem||n!=elem))r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval!=undefined)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=function(){return fn.apply(this,arguments);};handler.data=data;handler.guid=fn.guid;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){var val;if(typeof jQuery=="undefined"||jQuery.event.triggered)return val;val=jQuery.event.handle.apply(arguments.callee.elem,arguments);return val;});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else
+for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data||[]);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event)data.unshift(this.fix({type:type,target:elem}));data[0].type=type;if(exclusive)data[0].exclusive=true;if(jQuery.isFunction(jQuery.data(elem,"handle")))val=jQuery.data(elem,"handle").apply(elem,data);if(!fn&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val;event=jQuery.event.fix(event||window.event||{});var parts=event.type.split(".");event.type=parts[0];var handlers=jQuery.data(this,"events")&&jQuery.data(this,"events")[event.type],args=Array.prototype.slice.call(arguments,1);args.unshift(event);for(var j in handlers){var handler=handlers[j];args[0].handler=handler;args[0].data=handler.data;if(!parts[1]&&!event.exclusive||handler.type==parts[1]){var ret=handler.apply(this,args);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}if(jQuery.browser.msie)event.target=event.preventDefault=event.stopPropagation=event.handler=event.data=null;return val;},fix:function(event){var originalEvent=event;event=jQuery.extend({},originalEvent);event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=originalEvent.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;arguments[0].type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;arguments[0].type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){return this.each(function(){jQuery.event.add(this,type,function(event){jQuery(this).unbind(event);return(fn||data).apply(this,arguments);},fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){if(this[0])return jQuery.event.trigger(type,data,this[0],false,fn);return undefined;},toggle:function(){var args=arguments;return this.click(function(event){this.lastToggle=0==this.lastToggle?1:0;event.preventDefault();return args[this.lastToggle].apply(this,arguments)||false;});},hover:function(fnOver,fnOut){return this.bind('mouseenter',fnOver).bind('mouseleave',fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)fn.call(document,jQuery);else
+jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.apply(document);});jQuery.readyList=null;}jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);if(jQuery.browser.msie&&window==top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}jQuery.ready();})();if(jQuery.browser.opera)document.addEventListener("DOMContentLoaded",function(){if(jQuery.isReady)return;for(var i=0;i<document.styleSheets.length;i++)if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return;}jQuery.ready();},false);if(jQuery.browser.safari){var numStyles;(function(){if(jQuery.isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return;}if(numStyles===undefined)numStyles=jQuery("style, link[rel=stylesheet]").length;if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return;}jQuery.ready();})();}jQuery.event.add(window,"load",jQuery.ready);}jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});var withinElement=function(event,elem){var parent=event.relatedTarget;while(parent&&parent!=elem)try{parent=parent.parentNode;}catch(error){parent=elem;}return parent==elem;};jQuery(window).bind("unload",function(){jQuery("*").add(document).unbind();});jQuery.fn.extend({load:function(url,params,callback){if(jQuery.isFunction(url))return this.bind("load",url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=(new Date).getTime();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){var jsonp,jsre=/=\?(&|$)/g,status,data;s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(s.type.toLowerCase()=="get"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&s.type.toLowerCase()=="get"){var ts=(new Date()).getTime();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&s.type.toLowerCase()=="get"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");if((!s.url.indexOf("http")||!s.url.indexOf("//"))&&s.dataType=="script"&&s.type.toLowerCase()=="get"){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xml=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();xml.open(s.type,s.url,s.async,s.username,s.password);try{if(s.data)xml.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xml.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xml.setRequestHeader("X-Requested-With","XMLHttpRequest");xml.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend)s.beforeSend(xml);if(s.global)jQuery.event.trigger("ajaxSend",[xml,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xml&&(xml.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xml)&&"error"||s.ifModified&&jQuery.httpNotModified(xml,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xml,s.dataType);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xml.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
+jQuery.handleError(s,xml,status);complete();if(s.async)xml=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xml){xml.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xml.send(s.data);}catch(e){jQuery.handleError(s,xml,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xml,s]);}function complete(){if(s.complete)s.complete(xml,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xml,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xml;},handleError:function(s,xml,status,e){if(s.error)s.error(xml,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xml,s,e]);},active:0,httpSuccess:function(r){try{return!r.status&&location.protocol=="file:"||(r.status>=200&&r.status<300)||r.status==304||r.status==1223||jQuery.browser.safari&&r.status==undefined;}catch(e){}return false;},httpNotModified:function(xml,url){try{var xmlRes=xml.getResponseHeader("Last-Modified");return xml.status==304||xmlRes==jQuery.lastModified[url]||jQuery.browser.safari&&xml.status==undefined;}catch(e){}return false;},httpData:function(r,type){var ct=r.getResponseHeader("content-type");var xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0;var data=xml?r.responseXML:r.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
+for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
+s.push(encodeURIComponent(j)+"="+encodeURIComponent(a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle(fn,fn2):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall);var hidden=jQuery(this).is(":hidden"),self=this;for(var p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return jQuery.isFunction(opt.complete)&&opt.complete.apply(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
+e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.apply(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(!elem)return undefined;type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",array?jQuery.makeArray(array):[]);return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].apply(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:{slow:600,fast:200}[opt.duration])||400;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.apply(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.apply(this.elem,[this.now,this]);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=(new Date()).getTime();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length){clearInterval(jQuery.timerId);jQuery.timerId=null;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=(new Date()).getTime();if(gotoEnd||t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done&&jQuery.isFunction(this.options.complete))this.options.complete.apply(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.fx.step={scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}};jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),fixed=jQuery.css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&jQuery.css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(jQuery.css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&jQuery.css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||jQuery.css(offsetChild,"position")=="absolute"))||(mozilla&&jQuery.css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l)||0;top+=parseInt(t)||0;}return results;};})();
Index: /extensions/LCAS/trunk/admin/template/js/jquery.metadata.js
===================================================================
--- /extensions/LCAS/trunk/admin/template/js/jquery.metadata.js	(revision 8141)
+++ /extensions/LCAS/trunk/admin/template/js/jquery.metadata.js	(revision 8141)
@@ -0,0 +1,122 @@
+/*
+ * Metadata - jQuery plugin for parsing metadata from elements
+ *
+ * Copyright (c) 2006 John Resig, Yehuda Katz, J�örn Zaefferer, Paul McLanahan
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *   http://www.gnu.org/licenses/gpl.html
+ *
+ * Revision: $Id$
+ *
+ */
+
+/**
+ * Sets the type of metadata to use. Metadata is encoded in JSON, and each property
+ * in the JSON will become a property of the element itself.
+ *
+ * There are three supported types of metadata storage:
+ *
+ *   attr:  Inside an attribute. The name parameter indicates *which* attribute.
+ *          
+ *   class: Inside the class attribute, wrapped in curly braces: { }
+ *   
+ *   elem:  Inside a child element (e.g. a script tag). The
+ *          name parameter indicates *which* element.
+ *          
+ * The metadata for an element is loaded the first time the element is accessed via jQuery.
+ *
+ * As a result, you can define the metadata type, use $(expr) to load the metadata into the elements
+ * matched by expr, then redefine the metadata type and run another $(expr) for other elements.
+ * 
+ * @name $.metadata.setType
+ *
+ * @example <p id="one" class="some_class {item_id: 1, item_label: 'Label'}">This is a p</p>
+ * @before $.metadata.setType("class")
+ * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label"
+ * @desc Reads metadata from the class attribute
+ * 
+ * @example <p id="one" class="some_class" data="{item_id: 1, item_label: 'Label'}">This is a p</p>
+ * @before $.metadata.setType("attr", "data")
+ * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label"
+ * @desc Reads metadata from a "data" attribute
+ * 
+ * @example <p id="one" class="some_class"><script>{item_id: 1, item_label: 'Label'}</script>This is a p</p>
+ * @before $.metadata.setType("elem", "script")
+ * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label"
+ * @desc Reads metadata from a nested script element
+ * 
+ * @param String type The encoding type
+ * @param String name The name of the attribute to be used to get metadata (optional)
+ * @cat Plugins/Metadata
+ * @descr Sets the type of encoding to be used when loading metadata for the first time
+ * @type undefined
+ * @see metadata()
+ */
+
+(function($) {
+
+$.extend({
+	metadata : {
+		defaults : {
+			type: 'class',
+			name: 'metadata',
+			cre: /({.*})/,
+			single: 'metadata'
+		},
+		setType: function( type, name ){
+			this.defaults.type = type;
+			this.defaults.name = name;
+		},
+		get: function( elem, opts ){
+			var settings = $.extend({},this.defaults,opts);
+			// check for empty string in single property
+			if ( !settings.single.length ) settings.single = 'metadata';
+			
+			var data = $.data(elem, settings.single);
+			// returned cached data if it already exists
+			if ( data ) return data;
+			
+			data = "{}";
+			
+			if ( settings.type == "class" ) {
+				var m = settings.cre.exec( elem.className );
+				if ( m )
+					data = m[1];
+			} else if ( settings.type == "elem" ) {
+				if( !elem.getElementsByTagName )
+					return undefined;
+				var e = elem.getElementsByTagName(settings.name);
+				if ( e.length )
+					data = $.trim(e[0].innerHTML);
+			} else if ( elem.getAttribute != undefined ) {
+				var attr = elem.getAttribute( settings.name );
+				if ( attr )
+					data = attr;
+			}
+			
+			if ( data.indexOf( '{' ) <0 )
+			data = "{" + data + "}";
+			
+			data = eval("(" + data + ")");
+			
+			$.data( elem, settings.single, data );
+			return data;
+		}
+	}
+});
+
+/**
+ * Returns the metadata object for the first member of the jQuery object.
+ *
+ * @name metadata
+ * @descr Returns element's metadata object
+ * @param Object opts An object contianing settings to override the defaults
+ * @type jQuery
+ * @cat Plugins/Metadata
+ */
+$.fn.metadata = function( opts ){
+	return $.metadata.get( this[0], opts );
+};
+
+})(jQuery);
Index: /extensions/LCAS/trunk/admin/template/js/jquery.tablesorter.js
===================================================================
--- /extensions/LCAS/trunk/admin/template/js/jquery.tablesorter.js	(revision 8141)
+++ /extensions/LCAS/trunk/admin/template/js/jquery.tablesorter.js	(revision 8141)
@@ -0,0 +1,852 @@
+/*
+ * 
+ * TableSorter 2.0 - Client-side table sorting with ease!
+ * Version 2.0.3
+ * @requires jQuery v1.2.3
+ * 
+ * Copyright (c) 2007 Christian Bach
+ * Examples and docs at: http://tablesorter.com
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ * 
+ */
+/**
+ *
+ * @description Create a sortable table with multi-column sorting capabilitys
+ * 
+ * @example $('table').tablesorter();
+ * @desc Create a simple tablesorter interface.
+ *
+ * @example $('table').tablesorter({ sortList:[[0,0],[1,0]] });
+ * @desc Create a tablesorter interface and sort on the first and secound column in ascending order.
+ * 
+ * @example $('table').tablesorter({ headers: { 0: { sorter: false}, 1: {sorter: false} } });
+ * @desc Create a tablesorter interface and disableing the first and secound column headers.
+ * 
+ * @example $('table').tablesorter({ 0: {sorter:"integer"}, 1: {sorter:"currency"} });
+ * @desc Create a tablesorter interface and set a column parser for the first and secound column.
+ * 
+ * 
+ * @param Object settings An object literal containing key/value pairs to provide optional settings.
+ * 
+ * @option String cssHeader (optional) 			A string of the class name to be appended to sortable tr elements in the thead of the table. 
+ * 												Default value: "header"
+ * 
+ * @option String cssAsc (optional) 			A string of the class name to be appended to sortable tr elements in the thead on a ascending sort. 
+ * 												Default value: "headerSortUp"
+ * 
+ * @option String cssDesc (optional) 			A string of the class name to be appended to sortable tr elements in the thead on a descending sort. 
+ * 												Default value: "headerSortDown"
+ * 
+ * @option String sortInitialOrder (optional) 	A string of the inital sorting order can be asc or desc. 
+ * 												Default value: "asc"
+ * 
+ * @option String sortMultisortKey (optional) 	A string of the multi-column sort key. 
+ * 												Default value: "shiftKey"
+ * 
+ * @option String textExtraction (optional) 	A string of the text-extraction method to use. 
+ * 												For complex html structures inside td cell set this option to "complex", 
+ * 												on large tables the complex option can be slow. 
+ * 												Default value: "simple"
+ * 
+ * @option Object headers (optional) 			An array containing the forces sorting rules. 
+ * 												This option let's you specify a default sorting rule. 
+ * 												Default value: null
+ * 
+ * @option Array sortList (optional) 			An array containing the forces sorting rules. 
+ * 												This option let's you specify a default sorting rule. 
+ * 												Default value: null
+ * 
+ * @option Array sortForce (optional) 			An array containing forced sorting rules. 
+ * 												This option let's you specify a default sorting rule, which is prepended to user-selected rules.
+ * 												Default value: null
+ *  
+  * @option Array sortAppend (optional) 			An array containing forced sorting rules. 
+ * 												This option let's you specify a default sorting rule, which is appended to user-selected rules.
+ * 												Default value: null
+ * 
+ * @option Boolean widthFixed (optional) 		Boolean flag indicating if tablesorter should apply fixed widths to the table columns.
+ * 												This is usefull when using the pager companion plugin.
+ * 												This options requires the dimension jquery plugin.
+ * 												Default value: false
+ *
+ * @option Boolean cancelSelection (optional) 	Boolean flag indicating if tablesorter should cancel selection of the table headers text.
+ * 												Default value: true
+ *
+ * @option Boolean debug (optional) 			Boolean flag indicating if tablesorter should display debuging information usefull for development.
+ *
+ * @type jQuery
+ *
+ * @name tablesorter
+ * 
+ * @cat Plugins/Tablesorter
+ * 
+ * @author Christian Bach/christian.bach@polyester.se
+ */
+
+(function($) {
+	$.extend({
+		tablesorter: new function() {
+			
+			var parsers = [], widgets = [];
+			
+			this.defaults = {
+				cssHeader: "header",
+				cssAsc: "headerSortUp",
+				cssDesc: "headerSortDown",
+				sortInitialOrder: "asc",
+				sortMultiSortKey: "shiftKey",
+				sortForce: null,
+				sortAppend: null,
+				textExtraction: "simple",
+				parsers: {}, 
+				widgets: [],		
+				widgetZebra: {css: ["even","odd"]},
+				headers: {},
+				widthFixed: false,
+				cancelSelection: true,
+				sortList: [],
+				headerList: [],
+				dateFormat: "us",
+				decimal: '.',
+				debug: false
+			};
+			
+			/* debuging utils */
+			function benchmark(s,d) {
+				log(s + "," + (new Date().getTime() - d.getTime()) + "ms");
+			}
+			
+			this.benchmark = benchmark;
+			
+			function log(s) {
+				if (typeof console != "undefined" && typeof console.debug != "undefined") {
+					console.log(s);
+				} else {
+					alert(s);
+				}
+			}
+						
+			/* parsers utils */
+			function buildParserCache(table,$headers) {
+				
+				if(table.config.debug) { var parsersDebug = ""; }
+				
+				var rows = table.tBodies[0].rows;
+				
+				if(table.tBodies[0].rows[0]) {
+
+					var list = [], cells = rows[0].cells, l = cells.length;
+					
+					for (var i=0;i < l; i++) {
+						var p = false;
+						
+						if($.metadata && ($($headers[i]).metadata() && $($headers[i]).metadata().sorter)  ) {
+						
+							p = getParserById($($headers[i]).metadata().sorter);	
+						
+						} else if((table.config.headers[i] && table.config.headers[i].sorter)) {
+	
+							p = getParserById(table.config.headers[i].sorter);
+						}
+						if(!p) {
+							p = detectParserForColumn(table,cells[i]);
+						}
+	
+						if(table.config.debug) { parsersDebug += "column:" + i + " parser:" +p.id + "\n"; }
+	
+						list.push(p);
+					}
+				}
+				
+				if(table.config.debug) { log(parsersDebug); }
+
+				return list;
+			};
+			
+			function detectParserForColumn(table,node) {
+				var l = parsers.length;
+				for(var i=1; i < l; i++) {
+					if(parsers[i].is($.trim(getElementText(table.config,node)),table,node)) {
+						return parsers[i];
+					}
+				}
+				// 0 is always the generic parser (text)
+				return parsers[0];
+			}
+			
+			function getParserById(name) {
+				var l = parsers.length;
+				for(var i=0; i < l; i++) {
+					if(parsers[i].id.toLowerCase() == name.toLowerCase()) {	
+						return parsers[i];
+					}
+				}
+				return false;
+			}
+			
+			/* utils */
+			function buildCache(table) {
+				
+				if(table.config.debug) { var cacheTime = new Date(); }
+				
+				
+				var totalRows = (table.tBodies[0] && table.tBodies[0].rows.length) || 0,
+					totalCells = (table.tBodies[0].rows[0] && table.tBodies[0].rows[0].cells.length) || 0,
+					parsers = table.config.parsers, 
+					cache = {row: [], normalized: []};
+				
+					for (var i=0;i < totalRows; ++i) {
+					
+						/** Add the table data to main data array */
+						var c = table.tBodies[0].rows[i], cols = [];
+					
+						cache.row.push($(c));
+						
+						for(var j=0; j < totalCells; ++j) {
+							cols.push(parsers[j].format(getElementText(table.config,c.cells[j]),table,c.cells[j]));	
+						}
+												
+						cols.push(i); // add position for rowCache
+						cache.normalized.push(cols);
+						cols = null;
+					};
+				
+				if(table.config.debug) { benchmark("Building cache for " + totalRows + " rows:", cacheTime); }
+				
+				return cache;
+			};
+			
+			function getElementText(config,node) {
+				
+				if(!node) return "";
+								
+				var t = "";
+				
+				if(config.textExtraction == "simple") {
+					if(node.childNodes[0] && node.childNodes[0].hasChildNodes()) {
+						t = node.childNodes[0].innerHTML;
+					} else {
+						t = node.innerHTML;
+					}
+				} else {
+					if(typeof(config.textExtraction) == "function") {
+						t = config.textExtraction(node);
+					} else { 
+						t = $(node).text();
+					}	
+				}
+				return t;
+			}
+			
+			function appendToTable(table,cache) {
+				
+				if(table.config.debug) {var appendTime = new Date()}
+				
+				var c = cache, 
+					r = c.row, 
+					n= c.normalized, 
+					totalRows = n.length, 
+					checkCell = (n[0].length-1), 
+					tableBody = $(table.tBodies[0]),
+					rows = [];
+				
+				for (var i=0;i < totalRows; i++) {
+					rows.push(r[n[i][checkCell]]);	
+					if(!table.config.appender) {
+						
+						var o = r[n[i][checkCell]];
+						var l = o.length;
+						for(var j=0; j < l; j++) {
+							
+							tableBody[0].appendChild(o[j]);
+						
+						}
+						
+						//tableBody.append(r[n[i][checkCell]]);
+					}
+				}	
+				
+				if(table.config.appender) {
+				
+					table.config.appender(table,rows);	
+				}
+				
+				rows = null;
+				
+				if(table.config.debug) { benchmark("Rebuilt table:", appendTime); }
+								
+				//apply table widgets
+				applyWidget(table);
+				
+				// trigger sortend
+				setTimeout(function() {
+					$(table).trigger("sortEnd");	
+				},0);
+				
+			};
+			
+			function buildHeaders(table) {
+				
+				if(table.config.debug) { var time = new Date(); }
+				
+				var meta = ($.metadata) ? true : false, tableHeadersRows = [];
+			
+				for(var i = 0; i < table.tHead.rows.length; i++) { tableHeadersRows[i]=0; };
+				
+				$tableHeaders = $("thead th",table);
+		
+				$tableHeaders.each(function(index) {
+							
+					this.count = 0;
+					this.column = index;
+					this.order = formatSortingOrder(table.config.sortInitialOrder);
+					
+					if(checkHeaderMetadata(this) || checkHeaderOptions(table,index)) this.sortDisabled = true;
+					
+					if(!this.sortDisabled) {
+						$(this).addClass(table.config.cssHeader);
+					}
+					
+					// add cell to headerList
+					table.config.headerList[index]= this;
+				});
+				
+				if(table.config.debug) { benchmark("Built headers:", time); log($tableHeaders); }
+				
+				return $tableHeaders;
+				
+			};
+						
+		   	function checkCellColSpan(table, rows, row) {
+                var arr = [], r = table.tHead.rows, c = r[row].cells;
+				
+				for(var i=0; i < c.length; i++) {
+					var cell = c[i];
+					
+					if ( cell.colSpan > 1) { 
+						arr = arr.concat(checkCellColSpan(table, headerArr,row++));
+					} else  {
+						if(table.tHead.length == 1 || (cell.rowSpan > 1 || !r[row+1])) {
+							arr.push(cell);
+						}
+						//headerArr[row] = (i+row);
+					}
+				}
+				return arr;
+			};
+			
+			function checkHeaderMetadata(cell) {
+				if(($.metadata) && ($(cell).metadata().sorter === false)) { return true; };
+				return false;
+			}
+			
+			function checkHeaderOptions(table,i) {	
+				if((table.config.headers[i]) && (table.config.headers[i].sorter === false)) { return true; };
+				return false;
+			}
+			
+			function applyWidget(table) {
+				var c = table.config.widgets;
+				var l = c.length;
+				for(var i=0; i < l; i++) {
+					
+					getWidgetById(c[i]).format(table);
+				}
+				
+			}
+			
+			function getWidgetById(name) {
+				var l = widgets.length;
+				for(var i=0; i < l; i++) {
+					if(widgets[i].id.toLowerCase() == name.toLowerCase() ) {
+						return widgets[i]; 
+					}
+				}
+			};
+			
+			function formatSortingOrder(v) {
+				
+				if(typeof(v) != "Number") {
+					i = (v.toLowerCase() == "desc") ? 1 : 0;
+				} else {
+					i = (v == (0 || 1)) ? v : 0;
+				}
+				return i;
+			}
+			
+			function isValueInArray(v, a) {
+				var l = a.length;
+				for(var i=0; i < l; i++) {
+					if(a[i][0] == v) {
+						return true;	
+					}
+				}
+				return false;
+			}
+				
+			function setHeadersCss(table,$headers, list, css) {
+				// remove all header information
+				$headers.removeClass(css[0]).removeClass(css[1]);
+				
+				var h = [];
+				$headers.each(function(offset) {
+						if(!this.sortDisabled) {
+							h[this.column] = $(this);					
+						}
+				});
+				
+				var l = list.length; 
+				for(var i=0; i < l; i++) {
+					h[list[i][0]].addClass(css[list[i][1]]);
+				}
+			}
+			
+			function fixColumnWidth(table,$headers) {
+				var c = table.config;
+				if(c.widthFixed) {
+					var colgroup = $('<colgroup>');
+					$("tr:first td",table.tBodies[0]).each(function() {
+						colgroup.append($('<col>').css('width',$(this).width()));
+					});
+					$(table).prepend(colgroup);
+				};
+			}
+			
+			function updateHeaderSortCount(table,sortList) {
+				var c = table.config, l = sortList.length;
+				for(var i=0; i < l; i++) {
+					var s = sortList[i], o = c.headerList[s[0]];
+					o.count = s[1];
+					o.count++;
+				}
+			}
+			
+			/* sorting methods */
+			function multisort(table,sortList,cache) {
+				
+				if(table.config.debug) { var sortTime = new Date(); }
+				
+				var dynamicExp = "var sortWrapper = function(a,b) {", l = sortList.length;
+					
+				for(var i=0; i < l; i++) {
+					
+					var c = sortList[i][0];
+					var order = sortList[i][1];
+					var s = (getCachedSortType(table.config.parsers,c) == "text") ? ((order == 0) ? "sortText" : "sortTextDesc") : ((order == 0) ? "sortNumeric" : "sortNumericDesc");
+					
+					var e = "e" + i;
+					
+					dynamicExp += "var " + e + " = " + s + "(a[" + c + "],b[" + c + "]); ";
+					dynamicExp += "if(" + e + ") { return " + e + "; } ";
+					dynamicExp += "else { ";
+				}
+				
+				// if value is the same keep orignal order	
+				var orgOrderCol = cache.normalized[0].length - 1;
+				dynamicExp += "return a[" + orgOrderCol + "]-b[" + orgOrderCol + "];";
+						
+				for(var i=0; i < l; i++) {
+					dynamicExp += "}; ";
+				}
+				
+				dynamicExp += "return 0; ";	
+				dynamicExp += "}; ";	
+				
+				eval(dynamicExp);
+				
+				cache.normalized.sort(sortWrapper);
+				
+				if(table.config.debug) { benchmark("Sorting on " + sortList.toString() + " and dir " + order+ " time:", sortTime); }
+				
+				return cache;
+			};
+			
+			function sortText(a,b) {
+				return ((a < b) ? -1 : ((a > b) ? 1 : 0));
+			};
+			
+			function sortTextDesc(a,b) {
+				return ((b < a) ? -1 : ((b > a) ? 1 : 0));
+			};	
+			
+	 		function sortNumeric(a,b) {
+				return a-b;
+			};
+			
+			function sortNumericDesc(a,b) {
+				return b-a;
+			};
+			
+			function getCachedSortType(parsers,i) {
+				return parsers[i].type;
+			};
+			
+			/* public methods */
+			this.construct = function(settings) {
+
+				return this.each(function() {
+					
+					if(!this.tHead || !this.tBodies) return;
+					
+					var $this, $document,$headers, cache, config, shiftDown = 0, sortOrder;
+					
+					this.config = {};
+					
+					config = $.extend(this.config, $.tablesorter.defaults, settings);
+					
+					// store common expression for speed					
+					$this = $(this);
+					
+					// build headers
+					$headers = buildHeaders(this);
+					
+					// try to auto detect column type, and store in tables config
+					this.config.parsers = buildParserCache(this,$headers);
+					
+					
+					// build the cache for the tbody cells
+					cache = buildCache(this);
+					
+					// get the css class names, could be done else where.
+					var sortCSS = [config.cssDesc,config.cssAsc];
+					
+					// fixate columns if the users supplies the fixedWidth option
+					fixColumnWidth(this);
+					
+					// apply event handling to headers
+					// this is to big, perhaps break it out?
+					$headers.click(function(e) {
+						
+						$this.trigger("sortStart");
+						
+						var totalRows = ($this[0].tBodies[0] && $this[0].tBodies[0].rows.length) || 0;
+						
+						if(!this.sortDisabled && totalRows > 0) {
+							
+							
+							// store exp, for speed
+							var $cell = $(this);
+	
+							// get current column index
+							var i = this.column;
+							
+							// get current column sort order
+							this.order = this.count++ % 2;
+							
+							// user only whants to sort on one column
+							if(!e[config.sortMultiSortKey]) {
+								
+								// flush the sort list
+								config.sortList = [];
+								
+								if(config.sortForce != null) {
+									var a = config.sortForce; 
+									for(var j=0; j < a.length; j++) {
+										if(a[j][0] != i) {
+											config.sortList.push(a[j]);
+										}
+									}
+								}
+								
+								// add column to sort list
+								config.sortList.push([i,this.order]);
+							
+							// multi column sorting
+							} else {
+								// the user has clicked on an all ready sortet column.
+								if(isValueInArray(i,config.sortList)) {	 
+									
+									// revers the sorting direction for all tables.
+									for(var j=0; j < config.sortList.length; j++) {
+										var s = config.sortList[j], o = config.headerList[s[0]];
+										if(s[0] == i) {
+											o.count = s[1];
+											o.count++;
+											s[1] = o.count % 2;
+										}
+									}	
+								} else {
+									// add column to sort list array
+									config.sortList.push([i,this.order]);
+								}
+							};
+							setTimeout(function() {
+								//set css for headers
+								setHeadersCss($this[0],$headers,config.sortList,sortCSS);
+								appendToTable($this[0],multisort($this[0],config.sortList,cache));
+							},1);
+							// stop normal event by returning false
+							return false;
+						}
+					// cancel selection	
+					}).mousedown(function() {
+						if(config.cancelSelection) {
+							this.onselectstart = function() {return false};
+							return false;
+						}
+					});
+					
+					// apply easy methods that trigger binded events
+					$this.bind("update",function() {
+						
+						// rebuild parsers.
+						this.config.parsers = buildParserCache(this,$headers);
+						
+						// rebuild the cache map
+						cache = buildCache(this);
+						
+					}).bind("sorton",function(e,list) {
+						
+						$(this).trigger("sortStart");
+						
+						config.sortList = list;
+						
+						// update and store the sortlist
+						var sortList = config.sortList;
+						
+						// update header count index
+						updateHeaderSortCount(this,sortList);
+						
+						//set css for headers
+						setHeadersCss(this,$headers,sortList,sortCSS);
+						
+						
+						// sort the table and append it to the dom
+						appendToTable(this,multisort(this,sortList,cache));
+
+					}).bind("appendCache",function() {
+						
+						appendToTable(this,cache);
+					
+					}).bind("applyWidgetId",function(e,id) {
+						
+						getWidgetById(id).format(this);
+						
+					}).bind("applyWidgets",function() {
+						// apply widgets
+						applyWidget(this);
+					});
+					
+					if($.metadata && ($(this).metadata() && $(this).metadata().sortlist)) {
+						config.sortList = $(this).metadata().sortlist;
+					}
+					// if user has supplied a sort list to constructor.
+					if(config.sortList.length > 0) {
+						$this.trigger("sorton",[config.sortList]);	
+					}
+					
+					// apply widgets
+					applyWidget(this);
+				});
+			};
+			
+			this.addParser = function(parser) {
+				var l = parsers.length, a = true;
+				for(var i=0; i < l; i++) {
+					if(parsers[i].id.toLowerCase() == parser.id.toLowerCase()) {
+						a = false;
+					}
+				}
+				if(a) { parsers.push(parser); };
+			};
+			
+			this.addWidget = function(widget) {
+				widgets.push(widget);
+			};
+			
+			this.formatFloat = function(s) {
+				var i = parseFloat(s);
+				return (isNaN(i)) ? 0 : i;
+			};
+			this.formatInt = function(s) {
+				var i = parseInt(s);
+				return (isNaN(i)) ? 0 : i;
+			};
+			
+			this.isDigit = function(s,config) {
+				var DECIMAL = '\\' + config.decimal;
+				var exp = '/(^[+]?0(' + DECIMAL +'0+)?$)|(^([-+]?[1-9][0-9]*)$)|(^([-+]?((0?|[1-9][0-9]*)' + DECIMAL +'(0*[1-9][0-9]*)))$)|(^[-+]?[1-9]+[0-9]*' + DECIMAL +'0+$)/';
+				return RegExp(exp).test($.trim(s));
+			};
+			
+			this.clearTableBody = function(table) {
+				if($.browser.msie) {
+					function empty() {
+						while ( this.firstChild ) this.removeChild( this.firstChild );
+					}
+					empty.apply(table.tBodies[0]);
+				} else {
+					table.tBodies[0].innerHTML = "";
+				}
+			};
+		}
+	});
+	
+	// extend plugin scope
+	$.fn.extend({
+        tablesorter: $.tablesorter.construct
+	});
+	
+	var ts = $.tablesorter;
+	
+	// add default parsers
+	ts.addParser({
+		id: "text",
+		is: function(s) {
+			return true;
+		},
+		format: function(s) {
+			return $.trim(s.toLowerCase());
+		},
+		type: "text"
+	});
+	
+	ts.addParser({
+		id: "digit",
+		is: function(s,table) {
+			var c = table.config;
+			return $.tablesorter.isDigit(s,c);
+		},
+		format: function(s) {
+			return $.tablesorter.formatFloat(s);
+		},
+		type: "numeric"
+	});
+	
+	ts.addParser({
+		id: "currency",
+		is: function(s) {
+			return /^[£$€?.]/.test(s);
+		},
+		format: function(s) {
+			return $.tablesorter.formatFloat(s.replace(new RegExp(/[^0-9.]/g),""));
+		},
+		type: "numeric"
+	});
+	
+	ts.addParser({
+		id: "ipAddress",
+		is: function(s) {
+			return /^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s);
+		},
+		format: function(s) {
+			var a = s.split("."), r = "", l = a.length;
+			for(var i = 0; i < l; i++) {
+				var item = a[i];
+			   	if(item.length == 2) {
+					r += "0" + item;
+			   	} else {
+					r += item;
+			   	}
+			}
+			return $.tablesorter.formatFloat(r);
+		},
+		type: "numeric"
+	});
+	
+	ts.addParser({
+		id: "url",
+		is: function(s) {
+			return /^(https?|ftp|file):\/\/$/.test(s);
+		},
+		format: function(s) {
+			return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//),''));
+		},
+		type: "text"
+	});
+	
+	ts.addParser({
+		id: "isoDate",
+		is: function(s) {
+			return /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s);
+		},
+		format: function(s) {
+			return $.tablesorter.formatFloat((s != "") ? new Date(s.replace(new RegExp(/-/g),"/")).getTime() : "0");
+		},
+		type: "numeric"
+	});
+		
+	ts.addParser({
+		id: "percent",
+		is: function(s) { 
+			return /\%$/.test($.trim(s));
+		},
+		format: function(s) {
+			return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g),""));
+		},
+		type: "numeric"
+	});
+
+	ts.addParser({
+		id: "usLongDate",
+		is: function(s) {
+			return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/));
+		},
+		format: function(s) {
+			return $.tablesorter.formatFloat(new Date(s).getTime());
+		},
+		type: "numeric"
+	});
+
+	ts.addParser({
+		id: "shortDate",
+		is: function(s) {
+			return /\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s);
+		},
+		format: function(s,table) {
+			var c = table.config;
+			s = s.replace(/\-/g,"/");
+			if(c.dateFormat == "us") {
+				// reformat the string in ISO format
+				s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$1/$2");
+			} else if(c.dateFormat == "uk") {
+				//reformat the string in ISO format
+				s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$2/$1");
+			} else if(c.dateFormat == "dd/mm/yy" || c.dateFormat == "dd-mm-yy") {
+				s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/, "$1/$2/$3");	
+			}
+			return $.tablesorter.formatFloat(new Date(s).getTime());
+		},
+		type: "numeric"
+	});
+
+	ts.addParser({
+	    id: "time",
+	    is: function(s) {
+	        return /^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s);
+	    },
+	    format: function(s) {
+	        return $.tablesorter.formatFloat(new Date("2000/01/01 " + s).getTime());
+	    },
+	  type: "numeric"
+	});
+	
+	
+	ts.addParser({
+	    id: "metadata",
+	    is: function(s) {
+	        return false;
+	    },
+	    format: function(s,table,cell) {
+			var c = table.config, p = (!c.parserMetadataName) ? 'sortValue' : c.parserMetadataName;
+	        return $(cell).metadata()[p];
+	    },
+	  type: "numeric"
+	});
+	
+	// add default widgets
+	ts.addWidget({
+		id: "zebra",
+		format: function(table) {
+			if(table.config.debug) { var time = new Date(); }
+			$("tr:visible",table.tBodies[0])
+	        .filter(':even')
+	        .removeClass(table.config.widgetZebra.css[1]).addClass(table.config.widgetZebra.css[0])
+	        .end().filter(':odd')
+	        .removeClass(table.config.widgetZebra.css[0]).addClass(table.config.widgetZebra.css[1]);
+			if(table.config.debug) { $.tablesorter.benchmark("Applying Zebra widget", time); }
+		}
+	});	
+})(jQuery);
Index: /extensions/LCAS/trunk/admin/template/js/jquery.tablesorter.min.js
===================================================================
--- /extensions/LCAS/trunk/admin/template/js/jquery.tablesorter.min.js	(revision 8141)
+++ /extensions/LCAS/trunk/admin/template/js/jquery.tablesorter.min.js	(revision 8141)
@@ -0,0 +1,2 @@
+
+(function($){$.extend({tablesorter:new function(){var parsers=[],widgets=[];this.defaults={cssHeader:"header",cssAsc:"headerSortUp",cssDesc:"headerSortDown",sortInitialOrder:"asc",sortMultiSortKey:"shiftKey",sortForce:null,sortAppend:null,textExtraction:"simple",parsers:{},widgets:[],widgetZebra:{css:["even","odd"]},headers:{},widthFixed:false,cancelSelection:true,sortList:[],headerList:[],dateFormat:"us",decimal:'.',debug:false};function benchmark(s,d){log(s+","+(new Date().getTime()-d.getTime())+"ms");}this.benchmark=benchmark;function log(s){if(typeof console!="undefined"&&typeof console.debug!="undefined"){console.log(s);}else{alert(s);}}function buildParserCache(table,$headers){if(table.config.debug){var parsersDebug="";}var rows=table.tBodies[0].rows;if(table.tBodies[0].rows[0]){var list=[],cells=rows[0].cells,l=cells.length;for(var i=0;i<l;i++){var p=false;if($.metadata&&($($headers[i]).metadata()&&$($headers[i]).metadata().sorter)){p=getParserById($($headers[i]).metadata().sorter);}else if((table.config.headers[i]&&table.config.headers[i].sorter)){p=getParserById(table.config.headers[i].sorter);}if(!p){p=detectParserForColumn(table,cells[i]);}if(table.config.debug){parsersDebug+="column:"+i+" parser:"+p.id+"\n";}list.push(p);}}if(table.config.debug){log(parsersDebug);}return list;};function detectParserForColumn(table,node){var l=parsers.length;for(var i=1;i<l;i++){if(parsers[i].is($.trim(getElementText(table.config,node)),table,node)){return parsers[i];}}return parsers[0];}function getParserById(name){var l=parsers.length;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==name.toLowerCase()){return parsers[i];}}return false;}function buildCache(table){if(table.config.debug){var cacheTime=new Date();}var totalRows=(table.tBodies[0]&&table.tBodies[0].rows.length)||0,totalCells=(table.tBodies[0].rows[0]&&table.tBodies[0].rows[0].cells.length)||0,parsers=table.config.parsers,cache={row:[],normalized:[]};for(var i=0;i<totalRows;++i){var c=table.tBodies[0].rows[i],cols=[];cache.row.push($(c));for(var j=0;j<totalCells;++j){cols.push(parsers[j].format(getElementText(table.config,c.cells[j]),table,c.cells[j]));}cols.push(i);cache.normalized.push(cols);cols=null;};if(table.config.debug){benchmark("Building cache for "+totalRows+" rows:",cacheTime);}return cache;};function getElementText(config,node){if(!node)return"";var t="";if(config.textExtraction=="simple"){if(node.childNodes[0]&&node.childNodes[0].hasChildNodes()){t=node.childNodes[0].innerHTML;}else{t=node.innerHTML;}}else{if(typeof(config.textExtraction)=="function"){t=config.textExtraction(node);}else{t=$(node).text();}}return t;}function appendToTable(table,cache){if(table.config.debug){var appendTime=new Date()}var c=cache,r=c.row,n=c.normalized,totalRows=n.length,checkCell=(n[0].length-1),tableBody=$(table.tBodies[0]),rows=[];for(var i=0;i<totalRows;i++){rows.push(r[n[i][checkCell]]);if(!table.config.appender){var o=r[n[i][checkCell]];var l=o.length;for(var j=0;j<l;j++){tableBody[0].appendChild(o[j]);}}}if(table.config.appender){table.config.appender(table,rows);}rows=null;if(table.config.debug){benchmark("Rebuilt table:",appendTime);}applyWidget(table);setTimeout(function(){$(table).trigger("sortEnd");},0);};function buildHeaders(table){if(table.config.debug){var time=new Date();}var meta=($.metadata)?true:false,tableHeadersRows=[];for(var i=0;i<table.tHead.rows.length;i++){tableHeadersRows[i]=0;};$tableHeaders=$("thead th",table);$tableHeaders.each(function(index){this.count=0;this.column=index;this.order=formatSortingOrder(table.config.sortInitialOrder);if(checkHeaderMetadata(this)||checkHeaderOptions(table,index))this.sortDisabled=true;if(!this.sortDisabled){$(this).addClass(table.config.cssHeader);}table.config.headerList[index]=this;});if(table.config.debug){benchmark("Built headers:",time);log($tableHeaders);}return $tableHeaders;};function checkCellColSpan(table,rows,row){var arr=[],r=table.tHead.rows,c=r[row].cells;for(var i=0;i<c.length;i++){var cell=c[i];if(cell.colSpan>1){arr=arr.concat(checkCellColSpan(table,headerArr,row++));}else{if(table.tHead.length==1||(cell.rowSpan>1||!r[row+1])){arr.push(cell);}}}return arr;};function checkHeaderMetadata(cell){if(($.metadata)&&($(cell).metadata().sorter===false)){return true;};return false;}function checkHeaderOptions(table,i){if((table.config.headers[i])&&(table.config.headers[i].sorter===false)){return true;};return false;}function applyWidget(table){var c=table.config.widgets;var l=c.length;for(var i=0;i<l;i++){getWidgetById(c[i]).format(table);}}function getWidgetById(name){var l=widgets.length;for(var i=0;i<l;i++){if(widgets[i].id.toLowerCase()==name.toLowerCase()){return widgets[i];}}};function formatSortingOrder(v){if(typeof(v)!="Number"){i=(v.toLowerCase()=="desc")?1:0;}else{i=(v==(0||1))?v:0;}return i;}function isValueInArray(v,a){var l=a.length;for(var i=0;i<l;i++){if(a[i][0]==v){return true;}}return false;}function setHeadersCss(table,$headers,list,css){$headers.removeClass(css[0]).removeClass(css[1]);var h=[];$headers.each(function(offset){if(!this.sortDisabled){h[this.column]=$(this);}});var l=list.length;for(var i=0;i<l;i++){h[list[i][0]].addClass(css[list[i][1]]);}}function fixColumnWidth(table,$headers){var c=table.config;if(c.widthFixed){var colgroup=$('<colgroup>');$("tr:first td",table.tBodies[0]).each(function(){colgroup.append($('<col>').css('width',$(this).width()));});$(table).prepend(colgroup);};}function updateHeaderSortCount(table,sortList){var c=table.config,l=sortList.length;for(var i=0;i<l;i++){var s=sortList[i],o=c.headerList[s[0]];o.count=s[1];o.count++;}}function multisort(table,sortList,cache){if(table.config.debug){var sortTime=new Date();}var dynamicExp="var sortWrapper = function(a,b) {",l=sortList.length;for(var i=0;i<l;i++){var c=sortList[i][0];var order=sortList[i][1];var s=(getCachedSortType(table.config.parsers,c)=="text")?((order==0)?"sortText":"sortTextDesc"):((order==0)?"sortNumeric":"sortNumericDesc");var e="e"+i;dynamicExp+="var "+e+" = "+s+"(a["+c+"],b["+c+"]); ";dynamicExp+="if("+e+") { return "+e+"; } ";dynamicExp+="else { ";}var orgOrderCol=cache.normalized[0].length-1;dynamicExp+="return a["+orgOrderCol+"]-b["+orgOrderCol+"];";for(var i=0;i<l;i++){dynamicExp+="}; ";}dynamicExp+="return 0; ";dynamicExp+="}; ";eval(dynamicExp);cache.normalized.sort(sortWrapper);if(table.config.debug){benchmark("Sorting on "+sortList.toString()+" and dir "+order+" time:",sortTime);}return cache;};function sortText(a,b){return((a<b)?-1:((a>b)?1:0));};function sortTextDesc(a,b){return((b<a)?-1:((b>a)?1:0));};function sortNumeric(a,b){return a-b;};function sortNumericDesc(a,b){return b-a;};function getCachedSortType(parsers,i){return parsers[i].type;};this.construct=function(settings){return this.each(function(){if(!this.tHead||!this.tBodies)return;var $this,$document,$headers,cache,config,shiftDown=0,sortOrder;this.config={};config=$.extend(this.config,$.tablesorter.defaults,settings);$this=$(this);$headers=buildHeaders(this);this.config.parsers=buildParserCache(this,$headers);cache=buildCache(this);var sortCSS=[config.cssDesc,config.cssAsc];fixColumnWidth(this);$headers.click(function(e){$this.trigger("sortStart");var totalRows=($this[0].tBodies[0]&&$this[0].tBodies[0].rows.length)||0;if(!this.sortDisabled&&totalRows>0){var $cell=$(this);var i=this.column;this.order=this.count++%2;if(!e[config.sortMultiSortKey]){config.sortList=[];if(config.sortForce!=null){var a=config.sortForce;for(var j=0;j<a.length;j++){if(a[j][0]!=i){config.sortList.push(a[j]);}}}config.sortList.push([i,this.order]);}else{if(isValueInArray(i,config.sortList)){for(var j=0;j<config.sortList.length;j++){var s=config.sortList[j],o=config.headerList[s[0]];if(s[0]==i){o.count=s[1];o.count++;s[1]=o.count%2;}}}else{config.sortList.push([i,this.order]);}};setTimeout(function(){setHeadersCss($this[0],$headers,config.sortList,sortCSS);appendToTable($this[0],multisort($this[0],config.sortList,cache));},1);return false;}}).mousedown(function(){if(config.cancelSelection){this.onselectstart=function(){return false};return false;}});$this.bind("update",function(){this.config.parsers=buildParserCache(this,$headers);cache=buildCache(this);}).bind("sorton",function(e,list){$(this).trigger("sortStart");config.sortList=list;var sortList=config.sortList;updateHeaderSortCount(this,sortList);setHeadersCss(this,$headers,sortList,sortCSS);appendToTable(this,multisort(this,sortList,cache));}).bind("appendCache",function(){appendToTable(this,cache);}).bind("applyWidgetId",function(e,id){getWidgetById(id).format(this);}).bind("applyWidgets",function(){applyWidget(this);});if($.metadata&&($(this).metadata()&&$(this).metadata().sortlist)){config.sortList=$(this).metadata().sortlist;}if(config.sortList.length>0){$this.trigger("sorton",[config.sortList]);}applyWidget(this);});};this.addParser=function(parser){var l=parsers.length,a=true;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==parser.id.toLowerCase()){a=false;}}if(a){parsers.push(parser);};};this.addWidget=function(widget){widgets.push(widget);};this.formatFloat=function(s){var i=parseFloat(s);return(isNaN(i))?0:i;};this.formatInt=function(s){var i=parseInt(s);return(isNaN(i))?0:i;};this.isDigit=function(s,config){var DECIMAL='\\'+config.decimal;var exp='/(^[+]?0('+DECIMAL+'0+)?$)|(^([-+]?[1-9][0-9]*)$)|(^([-+]?((0?|[1-9][0-9]*)'+DECIMAL+'(0*[1-9][0-9]*)))$)|(^[-+]?[1-9]+[0-9]*'+DECIMAL+'0+$)/';return RegExp(exp).test($.trim(s));};this.clearTableBody=function(table){if($.browser.msie){function empty(){while(this.firstChild)this.removeChild(this.firstChild);}empty.apply(table.tBodies[0]);}else{table.tBodies[0].innerHTML="";}};}});$.fn.extend({tablesorter:$.tablesorter.construct});var ts=$.tablesorter;ts.addParser({id:"text",is:function(s){return true;},format:function(s){return $.trim(s.toLowerCase());},type:"text"});ts.addParser({id:"digit",is:function(s,table){var c=table.config;return $.tablesorter.isDigit(s,c);},format:function(s){return $.tablesorter.formatFloat(s);},type:"numeric"});ts.addParser({id:"currency",is:function(s){return/^[£$€?.]/.test(s);},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/[^0-9.]/g),""));},type:"numeric"});ts.addParser({id:"ipAddress",is:function(s){return/^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s);},format:function(s){var a=s.split("."),r="",l=a.length;for(var i=0;i<l;i++){var item=a[i];if(item.length==2){r+="0"+item;}else{r+=item;}}return $.tablesorter.formatFloat(r);},type:"numeric"});ts.addParser({id:"url",is:function(s){return/^(https?|ftp|file):\/\/$/.test(s);},format:function(s){return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//),''));},type:"text"});ts.addParser({id:"isoDate",is:function(s){return/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s);},format:function(s){return $.tablesorter.formatFloat((s!="")?new Date(s.replace(new RegExp(/-/g),"/")).getTime():"0");},type:"numeric"});ts.addParser({id:"percent",is:function(s){return/\%$/.test($.trim(s));},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g),""));},type:"numeric"});ts.addParser({id:"usLongDate",is:function(s){return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/));},format:function(s){return $.tablesorter.formatFloat(new Date(s).getTime());},type:"numeric"});ts.addParser({id:"shortDate",is:function(s){return/\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s);},format:function(s,table){var c=table.config;s=s.replace(/\-/g,"/");if(c.dateFormat=="us"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$1/$2");}else if(c.dateFormat=="uk"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$2/$1");}else if(c.dateFormat=="dd/mm/yy"||c.dateFormat=="dd-mm-yy"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/,"$1/$2/$3");}return $.tablesorter.formatFloat(new Date(s).getTime());},type:"numeric"});ts.addParser({id:"time",is:function(s){return/^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s);},format:function(s){return $.tablesorter.formatFloat(new Date("2000/01/01 "+s).getTime());},type:"numeric"});ts.addParser({id:"metadata",is:function(s){return false;},format:function(s,table,cell){var c=table.config,p=(!c.parserMetadataName)?'sortValue':c.parserMetadataName;return $(cell).metadata()[p];},type:"numeric"});ts.addWidget({id:"zebra",format:function(table){if(table.config.debug){var time=new Date();}$("tr:visible",table.tBodies[0]).filter(':even').removeClass(table.config.widgetZebra.css[1]).addClass(table.config.widgetZebra.css[0]).end().filter(':odd').removeClass(table.config.widgetZebra.css[0]).addClass(table.config.widgetZebra.css[1]);if(table.config.debug){$.tablesorter.benchmark("Applying Zebra widget",time);}}});})(jQuery);
Index: /extensions/LCAS/trunk/admin/template/js/jquery.tablesorter.pager.js
===================================================================
--- /extensions/LCAS/trunk/admin/template/js/jquery.tablesorter.pager.js	(revision 8141)
+++ /extensions/LCAS/trunk/admin/template/js/jquery.tablesorter.pager.js	(revision 8141)
@@ -0,0 +1,184 @@
+(function($) {
+	$.extend({
+		tablesorterPager: new function() {
+			
+			function updatePageDisplay(c) {
+				var s = $(c.cssPageDisplay,c.container).val((c.page+1) + c.seperator + c.totalPages);	
+			}
+			
+			function setPageSize(table,size) {
+				var c = table.config;
+				c.size = size;
+				c.totalPages = Math.ceil(c.totalRows / c.size);
+				c.pagerPositionSet = false;
+				moveToPage(table);
+				fixPosition(table);
+			}
+			
+			function fixPosition(table) {
+				var c = table.config;
+				if(!c.pagerPositionSet && c.positionFixed) {
+					var c = table.config, o = $(table);
+					if(o.offset) {
+						c.container.css({
+							top: o.offset().top + o.height() + 'px',
+							position: 'absolute'
+						});
+					}
+					c.pagerPositionSet = true;
+				}
+			}
+			
+			function moveToFirstPage(table) {
+				var c = table.config;
+				c.page = 0;
+				moveToPage(table);
+			}
+			
+			function moveToLastPage(table) {
+				var c = table.config;
+				c.page = (c.totalPages-1);
+				moveToPage(table);
+			}
+			
+			function moveToNextPage(table) {
+				var c = table.config;
+				c.page++;
+				if(c.page >= (c.totalPages-1)) {
+					c.page = (c.totalPages-1);
+				}
+				moveToPage(table);
+			}
+			
+			function moveToPrevPage(table) {
+				var c = table.config;
+				c.page--;
+				if(c.page <= 0) {
+					c.page = 0;
+				}
+				moveToPage(table);
+			}
+						
+			
+			function moveToPage(table) {
+				var c = table.config;
+				if(c.page < 0 || c.page > (c.totalPages-1)) {
+					c.page = 0;
+				}
+				
+				renderTable(table,c.rowsCopy);
+			}
+			
+			function renderTable(table,rows) {
+				
+				var c = table.config;
+				var l = rows.length;
+				var s = (c.page * c.size);
+				var e = (s + c.size);
+				if(e > rows.length ) {
+					e = rows.length;
+				}
+				
+				
+				var tableBody = $(table.tBodies[0]);
+				
+				// clear the table body
+				
+				$.tablesorter.clearTableBody(table);
+				
+				for(var i = s; i < e; i++) {
+					
+					//tableBody.append(rows[i]);
+					
+					var o = rows[i];
+					var l = o.length;
+					for(var j=0; j < l; j++) {
+						
+						tableBody[0].appendChild(o[j]);
+
+					}
+				}
+				
+				fixPosition(table,tableBody);
+				
+				$(table).trigger("applyWidgets");
+				
+				if( c.page >= c.totalPages ) {
+        			moveToLastPage(table);
+				}
+				
+				updatePageDisplay(c);
+			}
+			
+			this.appender = function(table,rows) {
+				
+				var c = table.config;
+				
+				c.rowsCopy = rows;
+				c.totalRows = rows.length;
+				c.totalPages = Math.ceil(c.totalRows / c.size);
+				
+				renderTable(table,rows);
+			};
+			
+			this.defaults = {
+				size: 10,
+				offset: 0,
+				page: 0,
+				totalRows: 0,
+				totalPages: 0,
+				container: null,
+				cssNext: '.next',
+				cssPrev: '.prev',
+				cssFirst: '.first',
+				cssLast: '.last',
+				cssPageDisplay: '.pagedisplay',
+				cssPageSize: '.pagesize',
+				seperator: "/",
+				positionFixed: true,
+				appender: this.appender
+			};
+			
+			this.construct = function(settings) {
+				
+				return this.each(function() {	
+					
+					config = $.extend(this.config, $.tablesorterPager.defaults, settings);
+					
+					var table = this, pager = config.container;
+				
+					$(this).trigger("appendCache");
+					
+					config.size = parseInt($(".pagesize",pager).val());
+					
+					$(config.cssFirst,pager).click(function() {
+						moveToFirstPage(table);
+						return false;
+					});
+					$(config.cssNext,pager).click(function() {
+						moveToNextPage(table);
+						return false;
+					});
+					$(config.cssPrev,pager).click(function() {
+						moveToPrevPage(table);
+						return false;
+					});
+					$(config.cssLast,pager).click(function() {
+						moveToLastPage(table);
+						return false;
+					});
+					$(config.cssPageSize,pager).change(function() {
+						setPageSize(table,parseInt($(this).val()));
+						return false;
+					});
+				});
+			};
+			
+		}
+	});
+	// extend plugin scope
+	$.fn.extend({
+        tablesorterPager: $.tablesorterPager.construct
+	});
+	
+})(jQuery);				
Index: /extensions/LCAS/trunk/admin/template/lcas.css
===================================================================
--- /extensions/LCAS/trunk/admin/template/lcas.css	(revision 8141)
+++ /extensions/LCAS/trunk/admin/template/lcas.css	(revision 8141)
@@ -0,0 +1,93 @@
+/* LCASinstructions */
+#LCAS_leftmargin
+{
+  margin-left: 2em
+}
+
+#LCAS_notice
+{
+  text-align:center;
+  text-decoration: underline;
+  font-weight:bold;
+}
+
+input.LCAS_textfields
+{
+    text-align: center;
+    width: 98%;
+}
+
+/* jQuery cluetip instructions */
+label.cluetip
+{
+  font-weight:bold;
+}
+
+legend.cluetip
+{
+  font-weight:bold;
+}
+
+.instructionBlock
+{
+  border: 1px solid #666;
+  margin: 5px;
+  overflow: hidden;
+}
+
+/* Bloc expand-collapse instructions */
+.instructionBlockHeader
+{
+  background-color:#111;
+  background-position:15px center;
+  background-repeat:no-repeat;
+  color:#ff3363;
+  cursor:pointer;
+  font-size:110%;
+  overflow:hidden;
+  padding:8px 41px;
+  text-align: left;
+}
+
+.instructionBlockHeader span
+{
+  border-bottom: none;
+}
+ 
+.instructionBlockContent
+{
+  padding:0 15px 15px;
+}
+
+/* jQuery tablesorter instructions */
+tr.throw
+{
+cursor:pointer;
+text-align:center;
+}
+
+th.header
+{
+background-image:url("./icon/bg.png");
+background-position:right center;
+background-repeat:no-repeat;
+cursor:pointer;
+}
+
+th.headerSortDown
+{
+background-image:url("./icon/desc.png");
+}
+
+th.headerSortUp
+{
+background-image:url("./icon/asc.png");
+}
+
+.pager{
+  text-align:center;
+}
+
+#pager img {
+  margin-bottom: -3px;
+}
Index: /extensions/LCAS/trunk/admin/template/navigation_bar.tpl
===================================================================
--- /extensions/LCAS/trunk/admin/template/navigation_bar.tpl	(revision 8141)
+++ /extensions/LCAS/trunk/admin/template/navigation_bar.tpl	(revision 8141)
@@ -0,0 +1,28 @@
+<div class="navigationBar">
+  {if isset($navbar.URL_FIRST)}
+  <a href="{$navbar.URL_FIRST}" rel="first">{'First'|@translate}</a> |
+  <a href="{$navbar.URL_PREV}" rel="prev">{'Previous'|@translate}</a> |
+  {else}
+  {'First'|@translate} |
+  {'Previous'|@translate} |
+  {/if}
+
+  {assign var='prev_page' value=0}
+  {foreach from=$navbar.pages key=page item=url}
+    {if $page > $prev_page+1}...{/if}
+    {if $page == $navbar.CURRENT_PAGE}
+    <span class="pageNumberSelected">{$page}</span>
+    {else}
+    <a href="{$url}">{$page}</a>
+    {/if}
+    {assign var='prev_page' value=$page}
+  {/foreach}
+
+  {if isset($navbar.URL_NEXT)}
+  | <a href="{$navbar.URL_NEXT}" rel="next">{'Next'|@translate}</a>
+  | <a href="{$navbar.URL_LAST}" rel="last">{'Last'|@translate}</a>
+  {else}
+  | {'Next'|@translate}
+  | {'Last'|@translate}
+  {/if}
+</div>
Index: /extensions/LCAS/trunk/admin/template/userlist.tpl
===================================================================
--- /extensions/LCAS/trunk/admin/template/userlist.tpl	(revision 8141)
+++ /extensions/LCAS/trunk/admin/template/userlist.tpl	(revision 8141)
@@ -0,0 +1,87 @@
+﻿{known_script id="jquery" src=$ROOT_URL|@cat:"themes/default/js/jquery.packed.js"}
+{known_script id="jquery.cluetip" src=$ROOT_URL|@cat:"themes/default/js/plugins/jquery.cluetip.packed.js"}
+{known_script id="jquery.tablesorter" src=$LCAS_PATH|@cat:"admin/template/js/jquery.tablesorter.js"}
+{known_script id="jquery.tablesorter.pager" src=$LCAS_PATH|@cat:"admin/template/js/jquery.tablesorter.pager.js"}
+
+
+{html_head}<link rel="stylesheet" type="text/css" href="{$LCAS_PATH}admin/template/lcas.css">{/html_head}
+
+<script type="text/javascript">
+jQuery().ready(function()
+{ldelim}
+  jQuery('.cluetip').cluetip(
+  {ldelim}
+    width: 600,
+    splitTitle: '|'
+  {rdelim});
+{rdelim});
+
+$(document).ready(function() 
+    {ldelim}
+      $("#sorting")
+      .tablesorter({ldelim}sortList:[[3,1]]{rdelim})
+      .tablesorterPager({ldelim}container: $("#pager"), positionFixed: false, size: 20, totalPages: 0{rdelim});
+    {rdelim} 
+);
+</script>
+
+
+<div class="titrePage">
+  <h2>{'Title_Tab'|@translate} {$LCAS_VERSION}<br>{'SubTitle5'|@translate}</h2>
+</div>
+
+<form method="post" action="" class="general">
+  <fieldset>
+  	<legend class="cluetip" title="{'LCAS_userlistTitle'|translate}|{'LCAS_userlistTitle_d'|translate}">{'UserList_Title'|@translate}</legend>
+
+      <table id="sorting" class="table2" width="97%" summary="">
+  			<thead>
+    			<tr class="throw">
+      			<th>{'Username'|@translate}</th>
+            <th>{'Profile'|@translate}</th>
+      			<th>{'Email address'|@translate}</th>
+            <th>{'LastVisit_Date'|@translate}</th>
+            <th>{'Nb_Days'|@translate}</th>
+    			</tr>
+  			</thead>
+        <tbody>
+        {foreach from=$users item=user name=users_loop}
+          <tr class="{if $smarty.foreach.users_loop.index is odd}row1{else}row2{/if}">
+            <td><label for="selection-{$user.ID}"><input class="LCAS_textfields" type="text" name="pwg_cumulus_width" value="{$user.USERNAME}" /></label></td>
+            <td style="text-align:center;"><a href="./admin.php?page=profile&amp;user_id={$user.ID}" title="{'Profile'|@translate}" onclick="window.open(this.href); return false;"><img src="{$LCAS_PATH}admin/template/icon/edit_s.png"></a></td>
+            <td>{$user.EMAIL}</td>
+            <td style="text-align:center;">{$user.LASTVISIT}</td>
+{if $user.DISPLAY == 'green'}
+            <td style="color:lime;text-align:center;">{$user.DAYS}</td>
+{elseif $user.DISPLAY == 'orange'}
+            <td style="color:orange;text-align:center;">{$user.DAYS}</td>
+{elseif $user.DISPLAY == 'red'}
+            <td style="color:red;text-align:center;">{$user.DAYS}</td>
+{else}
+            <td style="text-align:center;">{$user.DAYS}</td>
+{/if}
+            {foreach from=$user.plugin_columns item=data}
+              <td>{$data}</td>
+            {/foreach}    			
+          </tr>
+        {/foreach}
+        </tbody>
+      </table>
+<div id="pager" class="pager">
+	<form>
+		<img src="{$LCAS_PATH}admin/template/icon/first.png" class="first">
+		<img src="{$LCAS_PATH}admin/template/icon/prev.png" class="prev">
+		<input type="text" class="pagedisplay">
+		<img src="{$LCAS_PATH}admin/template/icon/next.png" class="next">
+		<img src="{$LCAS_PATH}admin/template/icon/last.png" class="last">
+		<select class="pagesize">
+			<option  value="10">10</option>
+			<option selected="selected" value="20">20</option>
+			<option value="30">30</option>
+			<option value="40">40</option>
+		</select>
+	</form>
+</div>
+    	<br>
+  </fieldset>
+</form>
Index: /extensions/LCAS/trunk/changelog.txt.php
===================================================================
--- /extensions/LCAS/trunk/changelog.txt.php	(revision 8141)
+++ /extensions/LCAS/trunk/changelog.txt.php	(revision 8141)
@@ -0,0 +1,11 @@
+<?php
+/*
+Plugin Name: LoginCaseAccentsSensitivity
+** Change log **
+***************************************
+************ Plugin history ***********
+***************************************
+
+-- 0.0.1-dev : Initial current development
+*/
+?>
Index: /extensions/LCAS/trunk/include/constants.php
===================================================================
--- /extensions/LCAS/trunk/include/constants.php	(revision 8141)
+++ /extensions/LCAS/trunk/include/constants.php	(revision 8141)
@@ -0,0 +1,3 @@
+<?php
+global $prefixeTable;
+?>
Index: /extensions/LCAS/trunk/include/functions.inc.php
===================================================================
--- /extensions/LCAS/trunk/include/functions.inc.php	(revision 8141)
+++ /extensions/LCAS/trunk/include/functions.inc.php	(revision 8141)
@@ -0,0 +1,863 @@
+<?php
+          // Keeps file coded in UTF-8 without BOM : é
+include_once (LCAS_PATH.'include/constants.php');
+load_language('plugin.lang', LCAS_PATH);
+
+
+/*
+ * Splits a multi-byte string in a array of each of its characters.
+ * Many thanks to adjwilli in
+ * http://www.php.net/manual/fr/function.mb-split.php#80046
+ *
+ * @param string s: string to split
+ *
+ * @return : array of each character of s
+*/
+function LCAS_mbStringToArray($s) {
+  $l = mb_strlen($s); $a = array();
+  while ($l) {
+    $a[] = mb_substr($s, 0, 1, 'UTF-8');
+    $s = mb_substr($s, 1, $l, 'UTF-8');
+    $l = mb_strlen($s);
+  }
+  return $a;
+}
+
+
+
+/*
+ * Changes the characters of the given string as stated by values of
+ * $conf['insensitive_case_logon'] and $LCAS_lang['char_replacement_set'].
+ *
+ * @param mix s: string, or array of strings, to evaluate
+ *
+ * @return : string, or array of strings, modified as stated
+*/
+function LCAS_change_case($Username, $Conf)
+{
+  $LCAS_lang                         = array();
+  $LCAS_lang['char_replacement_set'] = array();
+
+
+
+  // 0 : case sensitive, accents sensitive
+  $LCAS_lang['char_replacement_set'][1] = array(
+  // 1 : case insensitive, accents sensitive
+    
+  // Latin
+    
+    'a'  => 'A',
+    'à'  => 'À',
+    'â'  => 'Â',
+    'á'  => 'Á',
+    'ã'  => 'Ã',
+    'ä'  => 'Ä',
+    'å'  => 'Å',
+    'ā'  => 'Ā',
+    'ă'  => 'Ă',
+    'ą'  => 'Ą',
+    'ǻ'  => 'Ǻ',
+    'ạ'  => 'Ạ',
+    'ả'  => 'Ả',
+    'ấ'  => 'Ấ',
+    'ầ'  => 'Ầ',
+    'ẩ'  => 'Ẩ',
+    'ẫ'  => 'Ẫ',
+    'ậ'  => 'Ậ',
+    'ắ'  => 'Ắ',
+    'ằ'  => 'Ằ',
+    'ẳ'  => 'Ẳ',
+    'ẵ'  => 'Ẵ',
+    'ặ'  => 'Ặ',
+    
+    'b'  => 'B',
+    
+    'c'  => 'C',
+    'ç'  => 'Ç',
+    'ć'  => 'Ć',
+    'ĉ'  => 'Ĉ',
+    'ċ'  => 'Ċ',
+    'č'  => 'Č',
+
+    'd'  => 'D',
+    'ď'  => 'Ď',
+    'đ'  => 'Đ',
+    
+    'e'  => 'E',
+    'è'  => 'È',
+    'é'  => 'É',
+    'ê'  => 'Ê',
+    'ë'  => 'Ë',
+    'ē'  => 'Ē',
+    'ĕ'  => 'Ĕ',
+    'ė'  => 'Ė',
+    'ę'  => 'Ę',
+    'ě'  => 'Ě',
+    'ẹ'  => 'Ẹ',
+    'ẻ'  => 'Ẻ',
+    'ẽ'  => 'Ẽ',
+    'ế'  => 'Ế',
+    'ề'  => 'Ề',
+    'ể'  => 'Ể',
+    'ễ'  => 'Ễ',
+    'ệ'  => 'Ệ',
+    
+    'f'  => 'F ƒ',
+    
+    'g'  => 'G',
+    'ĝ'  => 'Ĝ',
+    'ğ'  => 'Ğ',
+    'ġ'  => 'Ġ',
+    'ģ'  => 'Ģ',
+    
+    'h'  => 'H',
+    'ĥ'  => 'Ĥ',
+    'ħ'  => 'Ħ',
+    
+    'i'  => 'I ı İ',
+    'ì'  => 'Ì',
+    'í'  => 'Í',
+    'î'  => 'Î',
+    'ï'  => 'Ï',
+    'ĩ'  => 'Ĩ',
+    'ī'  => 'Ī',
+    'ĭ'  => 'Ĭ',
+    'į'  => 'Į',
+    'ǐ'  => 'Ǐ',
+    'ỉ'  => 'Ỉ',
+    'ị'  => 'Ị',
+    
+    'j'  => 'J',
+    'ĵ'  => 'Ĵ',
+    
+    'k'  => 'K',
+    'ķ'  => 'Ķ',
+    
+    'l'  => 'L',
+    'ĺ'  => 'Ĺ',
+    'ļ'  => 'Ļ',
+    'ľ'  => 'Ľ',
+    'ŀ'  => 'Ŀ',
+    'ł'  => 'Ł',
+    
+    'm'  => 'M',
+    
+    'n'  => 'N',
+    'ñ'  => 'Ñ',
+    'ń'  => 'Ń',
+    'ņ'  => 'Ņ',
+    'ň'  => 'Ň',
+    
+    'o'  => 'O',
+    'ò'  => 'Ò',
+    'ó'  => 'Ó',
+    'ô'  => 'Ô',
+    'õ'  => 'Õ',
+    'ö'  => 'Ö',
+    'ø'  => 'Ø',
+    'ō'  => 'Ō',
+    'ŏ'  => 'Ŏ',
+    'ő'  => 'Ő',
+    'ơ'  => 'Ơ',
+    'ǒ'  => 'Ǒ',
+    'ǿ'  => 'Ǿ',
+    'ọ'  => 'Ọ',
+    'ỏ'  => 'Ỏ',
+    'ố'  => 'Ố',
+    'ồ'  => 'Ồ',
+    'ổ'  => 'Ổ',
+    'ỗ'  => 'Ỗ',
+    'ộ'  => 'Ộ',
+    'ớ'  => 'Ớ',
+    'ờ'  => 'Ờ',
+    'ở'  => 'Ở',
+    'ỡ'  => 'Ỡ',
+    'ợ'  => 'Ợ',
+    
+    'p'  => 'P',
+    
+    'q'  => 'Q ĸ',
+    
+    'r'  => 'R',
+    'ŕ'  => 'Ŕ',
+    'ŗ'  => 'Ŗ',
+    'ř'  => 'Ř',
+    
+    's'  => 'S',
+    'ś'  => 'Ś',
+    'ŝ'  => 'Ŝ',
+    'ş'  => 'Ş',
+    'š'  => 'Š',
+    's'  => 'ſ',
+    'ss' => 'ß',
+    
+    't'  => 'T',
+    'ţ'  => 'Ţ',
+    'ť'  => 'Ť',
+    'ŧ'  => 'Ŧ',
+    
+    'u'  => 'U',
+    'ù'  => 'Ù',
+    'ú'  => 'Ú',
+    'û'  => 'Û',
+    'ü'  => 'Ü',
+    'ũ'  => 'Ũ',
+    'ū'  => 'Ū',
+    'ŭ'  => 'Ŭ',
+    'ů'  => 'Ů',
+    'ű'  => 'Ű',
+    'ų'  => 'Ų',
+    'ǔ'  => 'Ǔ',
+    'ǖ'  => 'Ǖ',
+    'ǘ'  => 'Ǘ',
+    'ǚ'  => 'Ǚ',
+    'ǜ'  => 'Ǜ',
+    'ư'  => 'Ư',
+    'ụ'  => 'Ụ',
+    'ủ'  => 'Ủ',
+    'ứ'  => 'Ứ',
+    'ừ'  => 'Ừ',
+    'ử'  => 'Ử',
+    'ữ'  => 'Ữ',
+    'ự'  => 'Ự',
+    
+    'v'  => 'V',
+    
+    'w'  => 'W',
+    'ŵ'  => 'Ŵ',
+    'ẁ'  => 'Ẁ',
+    'ẃ'  => 'Ẃ',
+    'ẅ'  => 'Ẅ',
+    
+    'x'  => 'X',
+    
+    'y'  => 'Y',
+    'ý'  => 'Ý',
+    'ÿ'  => 'Ÿ',
+    'ỳ'  => 'Ỳ',
+    'ỵ'  => 'Ỵ',
+    'ỷ'  => 'Ỷ',
+    'ỹ'  => 'Ỹ',
+    'ŷ'  => 'Ŷ',
+    
+    'z'  => 'Z',
+    'ź'  => 'Ź',
+    'ż'  => 'Ż',
+    'ž'  => 'Ž',
+    
+    'ae' => 'æ Æ',
+    'aé' => 'ǽ Ǽ',
+    'ð'  => 'Ð',
+    'ə'  => 'Ə',
+    'ij' => 'ĳ Ĳ',
+    'ŋ'  => 'Ŋ',
+    'oe' => 'œ Œ',
+    'þ'  => 'Þ',
+    
+  // Greek
+    
+    'α'  => 'Α',
+    'ά'  => 'Ά',
+    'β'  => 'Β',
+    'γ'  => 'Γ',
+    'δ'  => 'Δ',
+    'ε'  => 'Ε',
+    'έ'  => 'Έ',
+    'ζ'  => 'Ζ',
+    'η'  => 'Η',
+    'ή'  => 'Ή',
+    'θ'  => 'Θ',
+    'ι'  => 'Ι',
+    'ί'  => 'Ί',
+    'ϊ'  => 'Ϊ',
+    'κ'  => 'Κ',
+    'λ'  => 'Λ',
+    'μ'  => 'Μ µ',
+    'ν'  => 'Ν',
+    'ξ'  => 'Ξ',
+    'ο'  => 'Ο',
+    'ό'  => 'Ό',
+    'π'  => 'Π',
+    'ρ'  => 'Ρ',
+    'σ'  => 'Σ ς',
+    'τ'  => 'Τ',
+    'υ'  => 'Υ',
+    'ύ'  => 'Ύ',
+    'ϋ'  => 'Ϋ',
+    'φ'  => 'Φ',
+    'χ'  => 'Χ',
+    'ψ'  => 'Ψ',
+    'ω'  => 'Ω',
+    'ώ'  => 'Ώ',
+    
+  // Cyrillic
+    
+    'а'  => 'А',
+    'б'  => 'Б',
+    'в'  => 'В',
+    'г'  => 'Г',
+    'ґ'  => 'Ґ',
+    'ғ'  => 'Ғ',
+    'д'  => 'Д',
+    'е'  => 'Е',
+    'ж'  => 'Ж',
+    'җ'  => 'Җ',
+    'з'  => 'З',
+    'и'  => 'И',
+    'й'  => 'Й',
+    'к'  => 'К',
+    'қ'  => 'Қ',
+    'ҝ'  => 'Ҝ',
+    'л'  => 'Л',
+    'м'  => 'М',
+    'н'  => 'Н',
+    'ң'  => 'Ң',
+    'о'  => 'О',
+    'п'  => 'П',
+    'р'  => 'Р',
+    'с'  => 'С',
+    'т'  => 'Т',
+    'у'  => 'У',
+    'ү'  => 'Ү',
+    'ұ'  => 'Ұ',
+    'ф'  => 'Ф',
+    'х'  => 'Х',
+    'ҳ'  => 'Ҳ',
+    'ц'  => 'Ц',
+    'ч'  => 'Ч',
+    'ҹ'  => 'Ҹ',
+    'ш'  => 'Ш',
+    'щ'  => 'Щ',
+    'ъ'  => 'Ъ',
+    'ы'  => 'Ы',
+    'ь'  => 'Ь',
+    'э'  => 'Э',
+    'ю'  => 'Ю',
+    'я'  => 'Я',
+    'ё'  => 'Ё',
+    'ђ'  => 'Ђ',
+    'ѓ'  => 'Ѓ',
+    'є'  => 'Є',
+    'ѕ'  => 'Ѕ',
+    'і'  => 'І',
+    'ї'  => 'Ї',
+    'ј'  => 'Ј',
+    'љ'  => 'Љ',
+    'њ'  => 'Њ',
+    'ћ'  => 'Ћ',
+    'ќ'  => 'Ќ',
+    'ў'  => 'Ў',
+    'џ'  => 'Џ',
+    'һ'  => 'Һ',
+    'ә'  => 'Ә',
+    'ө'  => 'Ө',
+    
+  );
+
+  $LCAS_lang['char_replacement_set'][2] = array(
+  // 2 : case insensitive, accents insensitive
+    
+  // Latin
+    
+    'a'  => 'A à À â Â á Á ã Ã ä Ä å Å ā Ā ă Ă ą Ą ǻ Ǻ ạ Ạ ả Ả ấ Ấ ầ Ầ ẩ Ẩ ẫ Ẫ ậ Ậ ắ Ắ ằ Ằ ẳ Ẳ ẵ Ẵ ặ Ặ @',
+    'b'  => 'B',
+    'c'  => 'C ç Ç ć Ć ĉ Ĉ ċ Ċ č Č',
+    'd'  => 'D ď Ď đ Đ',
+    'e'  => 'E è È é É ê Ê ë Ë ē Ē ĕ Ĕ ė Ė ę Ę ě Ě ẹ Ẹ ẻ Ẻ ẽ Ẽ ế Ế ề Ề ể Ể ễ Ễ ệ Ệ',
+    'f'  => 'F ƒ',
+    'g'  => 'G ĝ Ĝ ğ Ğ ġ Ġ ģ Ģ',
+    'h'  => 'H ĥ Ĥ ħ Ħ',
+    'i'  => 'I ı İ ì Ì í Í î Î ï Ï ĩ Ĩ ī Ī ĭ Ĭ į Į ǐ Ǐ ỉ Ỉ ị Ị',
+    'j'  => 'J ĵ Ĵ',
+    'k'  => 'K ķ Ķ',
+    'l'  => 'L ĺ Ĺ ļ Ļ ľ Ľ ŀ Ŀ ł Ł',
+    'm'  => 'M',
+    'n'  => 'N ŉ ñ Ñ ń Ń ņ Ņ ň Ň',
+    'o'  => 'O ò Ò ó Ó ô Ô õ Õ ö Ö ø Ø ō Ō ŏ Ŏ ő Ő ơ Ơ ǒ Ǒ ǿ Ǿ ọ Ọ ỏ Ỏ ố Ố ồ Ồ ổ Ổ ỗ Ỗ ộ Ộ ớ Ớ ờ Ờ ở Ở ỡ Ỡ ợ Ợ',
+    'p'  => 'P',
+    'q'  => 'Q ĸ',
+    'r'  => 'R ŕ Ŕ ŗ Ŗ ř Ř',
+    's'  => 'S ś Ś ŝ Ŝ ş Ş š Š s ſ',
+    'ss' => 'ß',
+    't'  => 'T ţ Ţ ť Ť ŧ Ŧ',
+    'u'  => 'U ù Ù ú Ú û Û ü Ü ũ Ũ ū Ū ŭ Ŭ ů Ů ű Ű ų Ų ǔ Ǔ ǖ Ǖ ǘ Ǘ ǚ Ǚ ǜ Ǜ ư Ư ụ Ụ ủ Ủ ứ Ứ ừ Ừ ử Ử ữ Ữ ự Ự',
+    'v'  => 'V',
+    'w'  => 'W ŵ Ŵ ẁ Ẁ ẃ Ẃ ẅ Ẅ',
+    'x'  => 'X',
+    'y'  => 'Y ý Ý ÿ Ÿ ỳ Ỳ ỵ Ỵ ỷ Ỷ ỹ Ỹ ŷ Ŷ',
+    'z'  => 'Z ź Ź ż Ż ž Ž',
+    'ae' => 'æ Æ Ǽ ǽ',
+    'ð'  => 'Ð',
+    'ə'  => 'Ə',
+    'ij' => 'ĳ Ĳ',
+    'ŋ'  => 'Ŋ',
+    'oe' => 'œ Œ',
+    'þ'  => 'Þ',
+    
+  // Greek
+    
+    'α'  => 'Α ά Ά',
+    'β'  => 'Β',
+    'γ'  => 'Γ',
+    'δ'  => 'Δ',
+    'ε'  => 'Ε έ Έ',
+    'ζ'  => 'Ζ',
+    'η'  => 'Η ή Ή',
+    'θ'  => 'Θ',
+    'ι'  => 'Ι ί Ί ϊ Ϊ ΐ',
+    'κ'  => 'Κ',
+    'λ'  => 'Λ',
+    'μ'  => 'Μ µ',
+    'ν'  => 'Ν',
+    'ξ'  => 'Ξ',
+    'ο'  => 'Ο ό Ό',
+    'π'  => 'Π',
+    'ρ'  => 'Ρ',
+    'σ'  => 'Σ ς',
+    'τ'  => 'Τ',
+    'υ'  => 'Υ ύ Ύ ϋ Ϋ ΰ',
+    'φ'  => 'Φ',
+    'χ'  => 'Χ',
+    'ψ'  => 'Ψ',
+    'ω'  => 'Ω ώ Ώ',
+    
+  // Cyrillic
+    
+    'а'  => 'А',
+    'б'  => 'Б',
+    'в'  => 'В',
+    'г'  => 'Г ґ Ґ ғ Ғ',
+    'д'  => 'Д',
+    'е'  => 'Е',
+    'ж'  => 'Ж җ Җ',
+    'з'  => 'З',
+    'и'  => 'И',
+    'й'  => 'Й',
+    'к'  => 'К қ Қ ҝ Ҝ',
+    'л'  => 'Л',
+    'м'  => 'М',
+    'н'  => 'Н ң Ң',
+    'о'  => 'О',
+    'п'  => 'П',
+    'р'  => 'Р',
+    'с'  => 'С',
+    'т'  => 'Т',
+    'у'  => 'У',
+    'ү'  => 'Ү',
+    'ұ'  => 'Ұ',
+    'ф'  => 'Ф',
+    'х'  => 'Х ҳ Ҳ',
+    'ц'  => 'Ц',
+    'ч'  => 'Ч ҹ Ҹ',
+    'ш'  => 'Ш',
+    'щ'  => 'Щ',
+    'ъ'  => 'Ъ',
+    'ы'  => 'Ы',
+    'ь'  => 'Ь',
+    'э'  => 'Э',
+    'ю'  => 'Ю',
+    'я'  => 'Я',
+    'ё'  => 'Ё',
+    'ђ'  => 'Ђ',
+    'ѓ'  => 'Ѓ',
+    'є'  => 'Є',
+    'ѕ'  => 'Ѕ',
+    'і'  => 'І',
+    'ї'  => 'Ї',
+    'ј'  => 'Ј',
+    'љ'  => 'Љ',
+    'њ'  => 'Њ',
+    'ћ'  => 'Ћ',
+    'ќ'  => 'Ќ',
+    'ў'  => 'Ў',
+    'џ'  => 'Џ',
+    'һ'  => 'Һ',
+    'ә'  => 'Ә',
+    'ө'  => 'Ө',
+    
+  );
+
+  $LCAS_lang['char_replacement_set'][3] = array(
+  // 3 : case sensitive, accents insensitive
+    
+  // Latin
+    
+    'a'  => 'à â á ã ä å ā ă ą ǻ ạ ả ấ ầ ẩ ẫ ậ ắ ằ ẳ ẵ ặ @',
+    'A'  => 'À Â Á Ã Ä Å Ā Ă Ą Ǻ Ạ Ả Ấ Ầ Ẩ Ẫ Ậ Ắ Ằ Ẳ Ẵ Ặ',
+    'c'  => 'ç ć ĉ ċ č',
+    'C'  => 'Ç Ć Ĉ Ċ Č',
+    'd'  => 'ď đ',
+    'D'  => 'Ď Đ',
+    'e'  => 'è é ê ë ē ĕ ė ę ě ẹ ẻ ẽ ế ề ể ễ ệ',
+    'E'  => 'È É Ê Ë Ē Ĕ Ė Ę Ě Ẹ Ẻ Ẽ Ế Ề Ể Ễ Ệ',
+    'f'  => 'ƒ',
+    'g'  => 'ĝ ğ ġ ģ',
+    'G'  => 'Ĝ Ğ Ġ Ģ',
+    'h'  => 'ĥ ħ',
+    'H'  => 'Ĥ Ħ',
+    'i'  => 'ì í î ï ĩ ī ĭ į ǐ ỉ ị ı',
+    'I'  => 'Ì Í Î Ï Ĩ Ī Ĭ Į Ǐ Ỉ Ị İ',
+    'j'  => 'ĵ',
+    'J'  => 'Ĵ',
+    'k'  => 'ķ',
+    'K'  => 'Ķ',
+    'l'  => 'ĺ ļ ľ ŀ ł',
+    'L'  => 'Ĺ Ļ Ľ Ŀ Ł',
+    'n'  => 'ñ ń ņ ň ŉ',
+    'N'  => 'Ñ Ń Ņ Ň',
+    'o'  => 'ò ó ô õ ö ø ō ŏ ő ơ ǒ ǿ ọ ỏ ố ồ ổ ỗ ộ ớ ờ ở ỡ ợ',
+    'O'  => 'Ò Ó Ô Õ Ö Ø Ō Ŏ Ő Ơ Ǒ Ǿ Ọ Ỏ Ố Ồ Ổ Ỗ Ộ Ớ Ờ Ở Ỡ Ợ',
+    'q'  => 'ĸ',
+    'r'  => 'ŕ ŗ ř',
+    'R'  => 'Ŕ Ŗ Ř',
+    's'  => 'ś ŝ ş š ſ',
+    'S'  => 'Ś Ŝ Ş Š',
+    'ss' => 'ß',
+    't'  => 'ţ ť ŧ',
+    'T'  => 'Ţ Ť Ŧ',
+    'u'  => 'ù ú û ü ũ ū ŭ ů ű ų ǔ ǖ ǘ ǚ ǜ ư ụ ủ ứ ừ ử ữ ự',
+    'U'  => 'Ù Ú Û Ü Ũ Ū Ŭ Ů Ű Ų Ǔ Ǖ Ǘ Ǚ Ǜ Ư Ụ Ủ Ứ Ừ Ử Ữ Ự',
+    'w'  => 'ŵ ẁ ẃ ẅ',
+    'W'  => 'Ŵ Ẁ Ẃ Ẅ',
+    'y'  => 'ý ÿ ỳ ỵ ỷ ỹ ŷ',
+    'Y'  => 'Ý Ÿ Ỳ Ỵ Ỷ Ỹ Ŷ',
+    'z'  => 'ź ż ž',
+    'Z'  => 'Ź Ż Ž',
+    'ae' => 'ǽ',
+    'AE' => 'Ǽ',
+    'ij' => 'ĳ',
+    'IJ' => 'Ĳ',
+    'oe' => 'œ',
+    'OE' => 'Œ',
+    
+  // Greek
+    
+    'α'  => 'ά',
+    'Α'  => 'Ά',
+    'ε'  => 'έ',
+    'Ε'  => 'Έ',
+    'μ'  => 'µ',
+    'η'  => 'ή',
+    'Η'  => 'Ή',
+    'ι'  => 'ί ϊ ΐ',
+    'Ι'  => 'Ί Ϊ',
+    'ο'  => 'ό',
+    'Ο'  => 'Ό',
+    'σ'  => 'ς',
+    'υ'  => 'ύ ϋ ΰ',
+    'Υ'  => 'Ύ Ϋ',
+    'ω'  => 'ώ',
+    'Ω'  => 'Ώ',
+    
+  // Cyrillic
+    
+    'г'  => 'ґ ғ',
+    'Г'  => 'Ґ Ғ',
+    'ж'  => 'җ',
+    'Ж'  => 'Җ',
+    'к'  => 'қ ҝ',
+    'К'  => 'Қ Ҝ',
+    'н'  => 'ң',
+    'Н'  => 'Ң',
+    'х'  => 'ҳ',
+    'Х'  => 'Ҳ',
+    'ч'  => 'ҹ',
+    'Ч'  => 'Ҹ',
+    
+  );
+  // Exits immediately without changing the parameter, if the configuration
+  // is set on "case sensitive and accent sensitive".
+  if (!isset($Conf) or
+    $Conf != 1 and
+    $Conf != 2 and
+    $Conf != 3
+  ) return $Username;
+  
+  // $v remembers if the given parameter was an array or not
+  $s2 = ($v = (is_array($Username))) ? $Username : array(0 => $Username);
+  
+  // Builds an array of characters that must be replaced
+  // $rep_char is the replacement character ; $char_rep_arr is an array of 
+  // characters which have to be replaced. ie :
+  // if
+  // $LCAS_lang['char_replacement_set'][$conf['insensitive_case_logon']]['e'] ='é è'
+  // then
+  // $char_rep_arr['é'] = 'e' ; $char_rep_arr['è'] = 'e'.
+  $char_rep_arr = array();
+  foreach (
+   $LCAS_lang['char_replacement_set'][$Conf]
+   as $rep_char => $char_rep_list
+  ) {
+    $t = explode(' ', $char_rep_list);
+    foreach ($t as $c) $char_rep_arr[$c] = $rep_char;
+  }
+  
+  // Replacement in each string of $s2 of the characters
+  // that needs to be replaced
+  $r = array();
+  foreach ($s2 as $s) {
+    $t = LCAS_mbStringToArray($s); $t2 ='';
+    foreach ($t as $c) {
+      if (array_key_exists($c, $char_rep_arr))
+       $t2.= $char_rep_arr[$c];
+      else
+       $t2.= $c;
+    }
+    $r[] = $t2;
+  }
+  
+  // Return of the result
+  if ($v) return $r;
+  else return $r[0];
+}
+
+
+
+
+
+
+
+
+
+
+
+
+/* Function called from main.inc.php to send validation email */
+function LCAS_SendMail2User($typemail, $id, $username, $password, $email, $confirm)
+{
+  global $conf;
+
+  $conf_LCAS= unserialize($conf['LoginCaseAccentsSensitivity']);
+  
+	include_once(PHPWG_ROOT_PATH.'include/functions_mail.inc.php');
+  
+	$infos1_perso = "";
+  $infos2_perso = "";
+
+/* We have to get the user's language in database */
+  $query ='
+SELECT user_id, language
+FROM '.USER_INFOS_TABLE.'
+WHERE user_id = '.$id.'
+;';
+  $data = pwg_db_fetch_assoc(pwg_query($query));
+
+/* Check if user is already registered (profile changing) - If not (new registration), language is set to current gallery language */
+  if (empty($data))
+  {
+/* And switch gallery to this language before using personalized and multilangual contents */
+    $language = pwg_get_session_var( 'lang_switch', $user['language'] );
+    switch_lang_to($language);
+  }
+  else
+  {
+/* And switch gallery to this language before using personalized and multilangual contents */
+    $language = $data['language']; /* Usefull for debugging */
+    switch_lang_to($data['language']);
+    load_language('plugin.lang', LCAS_PATH);
+  }
+
+  switch($typemail)
+  {
+    case 1:
+      $subject = '['.$conf['gallery_title'].'] '.l10n_args(get_l10n_args('Add of %s', stripslashes($username)));
+      $password = $password <> '' ? $password : l10n('LCAS_empty_pwd');
+      
+      if (isset($conf_LCAS[9]) and $conf_LCAS[9] <> '')
+      {
+        if (function_exists('get_user_language_desc'))
+        {
+          $infos1_perso = get_user_language_desc($conf_LCAS[9])."\n\n";
+        }
+        else $infos1_perso = l10n($conf_LCAS[9])."\n\n"; 
+      }
+      
+      break;
+      
+    case 2:
+      $subject = '['.$conf['gallery_title'].'] '.l10n_args(get_l10n_args('Update of %s', stripslashes($username)));
+      $password = $password <> '' ? $password : l10n('LCAS_empty_pwd');
+
+      break;
+        
+    case 3:
+      $subject = '['.$conf['gallery_title'].'] '.l10n_args(get_l10n_args('Update of %s', stripslashes($username)));
+      $password = $password <> '' ? $password : l10n('LCAS_no_update_pwd');
+
+      break;
+  }
+
+  if (isset($conf_LCAS[0]) and $conf_LCAS[0] == 'true')
+  {
+    $infos1 = array(
+      get_l10n_args('infos_mail %s', stripslashes($username)),
+      get_l10n_args('User: %s', stripslashes($username)),
+      get_l10n_args('Password: %s', $password),
+      get_l10n_args('Email: %s', $email),
+      get_l10n_args('', ''),
+    );
+  }
+
+
+  if ( isset($conf_LCAS[1]) and $conf_LCAS[1] == 'true' and $confirm)
+  {
+    $infos2 = array
+    (
+      get_l10n_args('Link: %s', AddConfirmMail($id, $email)),
+      get_l10n_args('', ''),
+    );
+
+    if (isset($conf_LCAS[10]) and $conf_LCAS[10] <> '')
+    {
+      if (function_exists('get_user_language_desc'))
+      {
+        $infos2_perso = get_user_language_desc($conf_LCAS[10])."\n\n";
+      }
+      else $infos2_perso = l10n($conf_LCAS[10])."\n\n";
+    }
+  }
+
+/* ******************************************************** */
+/* **** Pending code since to find how to make it work **** */
+/* ******************************************************** */
+// Testing if FCK Editor is used. Then decoding htmlchars to avoid problems with pwg_mail()
+/*$areas = array();
+array_push( $areas,'LCAS_MailInfo_Text','LCAS_ConfirmMail_Text');
+
+if (function_exists('set_fckeditor_instance'))
+{
+  $fcke_config = unserialize($conf['FCKEditor']);
+  foreach($areas as $area)
+  {
+    if (isset($fcke_config['LCAS_MailInfo_Text']) and $fcke_config['LCAS_MailInfo_Text'] = true)
+    {
+      $infos1_perso = html_entity_decode($infos1_perso,ENT_QUOTES,UTF-8);
+    }
+    
+    if (isset($fcke_config['LCAS_ConfirmMail_Text']) and $fcke_config['LCAS_ConfirmMail_Text'] = true)
+    {
+      $infos2_perso = html_entity_decode($infos2_perso,ENT_QUOTES,UTF-8);
+    }
+  }
+}*/
+
+/* Sending the email with subject and contents */
+  pwg_mail($email, array(
+    'subject' => $subject,
+    'content' => (isset($infos1) ? $infos1_perso.l10n_args($infos1)."\n\n" : "").(isset($infos2) ? $infos2_perso.l10n_args($infos2)."\n\n" : "").get_absolute_root_url(),
+  ));
+
+/* ********************** */
+/* Email sending debugger */
+/* This is only to trace  */
+/* the send of emails for */
+/* debugging              */
+/* ********************** */
+//$content = (isset($infos1) ? $infos1_perso.l10n_args($infos1)."\n\n" : "").(isset($infos2) ? $infos2_perso.l10n_args($infos2)."\n\n" : "").get_absolute_root_url();   
+//MailLog($email,$subject,$content,$language);
+/* ********************** */
+
+/* Switching back to default language */
+switch_lang_back();
+}
+
+/* Function called from LCAS_admin.php and main.inc.php to get the plugin version and name */
+function LCAS_PluginInfos($dir)
+{
+  $path = $dir;
+
+  $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);
+
+  return $plugin ;
+}
+
+/* Function called from UserAdvManager.php - Get all users to display the number of days since their last visit */
+function LCAS_get_user_list()
+{
+	global $conf, $page;
+  
+  $users = array();
+
+	/* search users depending expiration date */
+  $query = '
+SELECT DISTINCT u.'.$conf['user_fields']['id'].' AS id,
+                u.'.$conf['user_fields']['username'].' AS username,
+                u.'.$conf['user_fields']['email'].' AS email
+FROM '.USERS_TABLE.' AS u
+WHERE u.'.$conf['user_fields']['id'].' >= 3
+;';
+
+	$result = pwg_query($query);
+      
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+  	$user = $row;
+    $user['groups'] = array();
+
+    array_push($users, $user);
+	}
+
+	/* add group lists */
+  $user_ids = array();
+  foreach ($users as $i => $user)
+  {
+  	$user_ids[$i] = $user['id'];
+	}
+
+	return $users;
+}
+
+function LCAS_clean_obsolete_files()
+{
+  if (file_exists(LCAS_PATH.'obsolete.list')
+    and $old_files = file(LCAS_PATH.'obsolete.list', FILE_IGNORE_NEW_LINES)
+    and !empty($old_files))
+  {
+    array_push($old_files, 'obsolete.list');
+    foreach($old_files as $old_file)
+    {
+      $path = LCAS_PATH.$old_file;
+      if (is_file($path))
+      {
+        @unlink($path);
+      }
+    }
+  }
+}
+
+?>
Index: /extensions/LCAS/trunk/include/index.php
===================================================================
--- /extensions/LCAS/trunk/include/index.php	(revision 8141)
+++ /extensions/LCAS/trunk/include/index.php	(revision 8141)
@@ -0,0 +1,33 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | PhpWebGallery - a PHP based picture gallery                           |
+// | Copyright (C) 2002-2003 Pierrick LE GALL - pierrick@phpwebgallery.net |
+// | Copyright (C) 2003-2007 PhpWebGallery Team - http://phpwebgallery.net |
+// +-----------------------------------------------------------------------+
+// | file          : $Id: index.php 1912 2007-03-16 06:30:07Z rub $
+// | last update   : $Date: 2007-03-16 07:30:07 +0100 (ven, 16 mar 2007) $
+// | last modifier : $Author: rub $
+// | revision      : $Revision: 1912 $
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: /extensions/LCAS/trunk/include/upgradedb.inc.php
===================================================================
--- /extensions/LCAS/trunk/include/upgradedb.inc.php	(revision 8141)
+++ /extensions/LCAS/trunk/include/upgradedb.inc.php	(revision 8141)
@@ -0,0 +1,23 @@
+<?php
+/**
+ * @author Eric@piwigo.org
+ * @copyright 2011
+ * 
+ * Upgrade processes for old plugin version
+ * Called from maintain.inc.php on plugin activation
+ * 
+ */
+
+if(!defined('LCAS_PATH'))
+{
+  define('LCAS_PATH' , PHPWG_PLUGINS_PATH.basename(dirname(__FILE__)).'/');
+}
+if (!defined('LCAS_ROOT'))
+{
+  define('LCAS_ROOT', dirname(__FILE__).'/');
+}
+
+include_once (LCAS_PATH.'include/constants.php');
+include_once (LCAS_PATH.'include/functions.inc.php');
+
+?>
Index: /extensions/LCAS/trunk/index.php
===================================================================
--- /extensions/LCAS/trunk/index.php	(revision 8141)
+++ /extensions/LCAS/trunk/index.php	(revision 8141)
@@ -0,0 +1,33 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | PhpWebGallery - a PHP based picture gallery                           |
+// | Copyright (C) 2002-2003 Pierrick LE GALL - pierrick@phpwebgallery.net |
+// | Copyright (C) 2003-2007 PhpWebGallery Team - http://phpwebgallery.net |
+// +-----------------------------------------------------------------------+
+// | file          : $Id: index.php 1912 2007-03-16 06:30:07Z rub $
+// | last update   : $Date: 2007-03-16 07:30:07 +0100 (ven, 16 mar 2007) $
+// | last modifier : $Author: rub $
+// | revision      : $Revision: 1912 $
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: /extensions/LCAS/trunk/language/en_UK/description.txt
===================================================================
--- /extensions/LCAS/trunk/language/en_UK/description.txt	(revision 8141)
+++ /extensions/LCAS/trunk/language/en_UK/description.txt	(revision 8141)
@@ -0,0 +1,1 @@
+Allow to specify if user login/registration is case/accents sensitive
Index: /extensions/LCAS/trunk/language/en_UK/help/index.php
===================================================================
--- /extensions/LCAS/trunk/language/en_UK/help/index.php	(revision 8141)
+++ /extensions/LCAS/trunk/language/en_UK/help/index.php	(revision 8141)
@@ -0,0 +1,33 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | PhpWebGallery - a PHP based picture gallery                           |
+// | Copyright (C) 2002-2003 Pierrick LE GALL - pierrick@phpwebgallery.net |
+// | Copyright (C) 2003-2007 PhpWebGallery Team - http://phpwebgallery.net |
+// +-----------------------------------------------------------------------+
+// | file          : $Id: index.php 1912 2007-03-16 06:30:07Z rub $
+// | last update   : $Date: 2007-03-16 07:30:07 +0100 (ven, 16 mar 2007) $
+// | last modifier : $Author: rub $
+// | revision      : $Revision: 1912 $
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: /extensions/LCAS/trunk/language/en_UK/help/plugin.lang.php
===================================================================
--- /extensions/LCAS/trunk/language/en_UK/help/plugin.lang.php	(revision 8141)
+++ /extensions/LCAS/trunk/language/en_UK/help/plugin.lang.php	(revision 8141)
@@ -0,0 +1,190 @@
+<?php
+global $lang;
+
+$lang['LCAS_restricTitle'] = 'Restrictions for registrations';
+$lang['LCAS_confirmTitle'] = 'Confirmations and validations of registration';
+$lang['LCAS_confirmTitle_d'] = '
+- Information email generation<br>
+- Register validation email generation<br>
+- Groups or status auto joining<br>
+- Deadline for registration validation<br>
+- Reminder email generation<br>
+...
+';
+$lang['LCAS_miscTitle'] = 'Registration followed and other options';
+$lang['LCAS_miscTitle_d'] = '
+- Ghost users management<br>
+- Followed registered users<br>
+- Nickname mandatory for guests comments<br>
+...
+';
+$lang['LCAS_casenTitle'] = 'Usernames: Case sensitivity';
+$lang['LCAS_carexcTitle'] = 'Usernames: Exclusion of characters';
+$lang['LCAS_carexcTitle_d'] = 'It may be interesting to prohibit certain characters in usernames (example: refuse logins containing &quot;@&quot;). This option allows to exclude characters or sequence of characters, events.<br>
+NB: The option can also exclude whole words.
+<br><br>
+<b style=&quot;color: red;&quot;>Warning: This option has no effect on the user names created prior to its activation.</b>';
+$lang['LCAS_passwTitle'] = 'Strengthening the security level of passwords';
+$lang['LCAS_passwTitle_d'] = 'Enabling this option makes mandatory the seizure of a password upon registration, and requires the password chosen by the visitor to meet a minimum level of complexity. If the threshold is not reached, the score achieved and the minimum score to be achieved are displayed, along with recommendations to increase the value of this score.<br><br>
+There is field test to measure the complexity of a password, and can afford to get an idea of the score to define complex custom.<br><br>
+Note: The score of a password is calculated based on several parameters: length, type of characters used (letters, digits, uppercase, lowercase, special characters). A score below 100 is considered low, from 100 to 500, the complexity is average; beyond 500, the security is excellent.';
+$lang['LCAS_passwtestTitle'] = 'Testing the complexity of a password';
+$lang['LCAS_passwtestTitle_d'] = 'Enter the password to test and then click on &quot;Score calculation&quot; to see the result.';
+$lang['LCAS_passwadmTitle'] = 'Applying to administrators';
+$lang['LCAS_passwadmTitle_d'] = 'An administrator can create a user account with or without application of the rule of computing complexity.<br><br>
+Note: If the user account created wants to change password and strengthening passwords for users is active, it will be subject to the rule set.';
+$lang['LCAS_mailexcTitle'] = 'Exclusion of mail domains';
+$lang['LCAS_infomailTitle'] = 'Information email to user';
+$lang['LCAS_infomailTitle_d'] = 'This option allows to automate sending an information email to a user when registering or when changes his password or email address in their profile.<br><br>
+The content of the message sent is composed of a customizable part to introduce a little welcome note and a fixed part indicating the login, password and email address of the user.';
+$lang['LCAS_infotxtTitle'] = 'Customizing the information email';
+$lang['LCAS_infotxtTitle_d'] = 'Enter the introductory text that you want to appear in the information email.<br><br>
+To use multiple languages, you can use the Extended description plugin\'s tags if it is active.<br><br>
+<b style=&quot;color: red;&quot;>Text modifying is available only if the &quot;Information email&quot; is enabled.</b>';
+$lang['LCAS_confirmtxtTitle'] = 'Customizing the confirmation email';
+$lang['LCAS_confirmtxtTitle_d'] = 'Enter the introductory text that you want to appear in the email confirmation of registration.<br><br>
+To use multiple languages, you can use the Extended description plugin\'s tags if it is active.<br><br>
+<b style=&quot;color: red;&quot;>The text modifiying is available only if the &quot;Confirmation of registration&quot; is enabled.</b>';
+$lang['LCAS_confirmgrpTitle'] = 'Validation Groups';
+$lang['LCAS_confirmgrpTitle_d'] = '<b style=&quot;color: red;&quot;>WARNING : Using validation groups requires that you have created at least one users group and is defined &quot;by default&quot; in Piwigo\'s user groups management.</b><br><br>
+The groups are validated for use in conjunction with the &quot;Confirmation of registration&quot;';
+$lang['LCAS_confirmstatTitle'] = 'Validation Statutes';
+$lang['LCAS_confirmstatTitle_d'] = '<b style=&quot;color: red;&quot;>WARNING : The use of status validation requires that you have kept the &quot;Guest&quot; user with default setting (as user template) for new registered. Note you can set any other user as a template for new registered. Please refer to the Piwigo\'s documentation for more details.</b><br><br>
+The Statutes are validated for use in conjunction with the &quot;Confirmation of registration&quot;';
+$lang['LCAS_validationlimitTitle'] = 'Deadline for registration validation limited';
+$lang['LCAS_validationlimitTitle_d'] = 'This option allows to limit the validity of key validation email sent to new registrants. Visitors who register will have x days of time to validate their registration. After this period the validation link will expire.<br><br>
+This option is used in conjunction with the &quot;Confirmation of registration&quot;';
+$lang['LCAS_remailTitle'] = 'Remind unvalidated users';
+$lang['LCAS_remailTitle_d'] = 'This option allows you to send a reminder email to users registered but have not validated their registration on time. It therefore works in conjunction with the &quot;Confirmation of registration&quot;<br><br>
+2 types of emails can be sent: With or without regeneration of the validation key. As appropriate, the content of emails can be customized.<br><br>
+Refer to the &quot;Tracking validations&quot; tab.';
+$lang['LCAS_remailtxt1Title'] = 'Reminder email with new key generated';
+$lang['LCAS_remailtxt1Title_d'] = 'Enter the introductory text that you want to appear in the reminder email, in addition to the validation key regenerated.<br><br>
+If left blank, the mail reminder will include only the validation link. It is therefore strongly advised to take a little explanatory text. (NB: The text pre-filled with the installation of the plugin is provided as an example)<br><br>
+To use multiple languages, you can use the Extended description plugin\'s tags if it is active.<br><br>
+<b style=&quot;color: red;&quot;>The text modifiying is available only if &quot;Remind unvalidated users&quot; is enabled.</b>';
+$lang['LCAS_remailtxt2Title'] = 'Reminder email without new key generated';
+$lang['LCAS_remailtxt2Title_d'] = 'Enter the introductory text that you want to appear in the reminder email without a validation key regenerated.<br><br>
+If left blank, the mail reminder will be empty. It is therefore strongly advised to take a little explanatory text. (NB: The text pre-filled with the installation of the plugin is provided as an example)<br><br>
+To use multiple languages, you can use the Extended description plugin\'s tags if it is active.<br><br>
+<b style=&quot;color: red;&quot;>The text modifiying is available only if &quot;Remind unvalidated users&quot; is enabled.</b>';
+$lang['LCAS_ghosttrackerTitle'] = 'Ghost visitors management';
+$lang['LCAS_ghosttrackerTitle_d'] = 'Also called &quot;Ghost Tracker&quot;, when this function is activated, you can manage your visitors depending on the frequency of their visits. When the time between 2 visits is reaches, the visitor in question appears in the &quot;Ghost Tracker&quot; table where you will be able to remind visitors via email.<br><br>
+<b style=&quot;color: red;&quot;>If you enable this feature for the first time or you have reactivated after a long period off during which new visitors are registered, you must initialize or reset the Ghost Tracker.</b>';
+$lang['LCAS_gttextTitle'] = 'Ghost Tracker\'s reminder message';
+$lang['LCAS_gttextTitle_d'] = 'Enter the text you want to appear in the email reminder to prompt the user to return to visit your gallery (NB: The text pre-filled with the installation of the plugin is provided as an example).<br><br>
+To use multiple languages, you can use the Extended description plugin\'s tags if it is active.<br><br>
+<b style=&quot;color: red;&quot;>The text modifiying is available only if &quot;Ghost visitors management&quot; is enabled.</b>';
+$lang['LCAS_lastvisitTitle'] = 'Tracking registered users';
+$lang['LCAS_lastvisitTitle_d'] = 'This activates a table in the &quot;Tracking users&quot; tab which are registered users listed on the gallery and the date of their last visit and time spent (in days) since their last visit. Monitoring is purely informative for the administrator of the gallery.';
+$lang['LCAS_commentTitle'] = 'Nickname mandatory for guests comments';
+$lang['LCAS_commentTitle_d'] = 'If &quot;Comments for All&quot; is active (authority to unregistered visitors to post comments), this option allows to force the non-registered visitor to enter a nickname that the comment is accepted.';
+$lang['LCAS_tipsTitle'] = 'Tips and Examples';
+$lang['LCAS_tipsTitle_d'] = 'Tips and various examples of use';
+$lang['LCAS_userlistTitle'] = 'Tracking users';
+$lang['LCAS_usermanTitle'] = 'Tracking validations';
+$lang['LCAS_gtTitle'] = 'Ghost visitors management';
+
+
+// --------- Starting below: New or revised $lang ---- from version 2.14.0
+$lang['LCAS_adminconfmailTitle'] = 'Confirmation of registration for admins';
+$lang['LCAS_adminconfmailTitle_d'] = 'You can disable this validation only for user accounts created by the administrator via Piwigo\'s users management interface.<br><br>
+By activating this option, email validation for registration will be sent to each user created by admin.<br><br>
+By disabling this option (default), only the email information is sent (if &quot;Information email to user&quot; is enabled).';
+// --------- End: New or revised $lang ---- from version 2.14.0
+
+
+// --------- Starting below: New or revised $lang ---- from version 2.15.0
+$lang['LCAS_confirmmail_custom1'] = 'Text of the confirmation page - Confirmation accepted';
+$lang['LCAS_confirmmail_custom1_d'] = 'When the option &quot;Confirmation of registration&quot; is active, this field allows you to customize the <b><u>acceptance text</u></b> on the registration confirmation page displayed when user clicks the confirmation link that was received by email.<br>
+After installing the plugin, a standard text is set as an example.<br>
+This field is compatible with the FCK Editor and, for multi-languages, you can use the tags [lang] of the plugin Extended description if it\'s active.<br>
+<b style=&quot;color:red;&quot;>Changing the text is possible ONLY if &quot;Confirmation of registration&quot; is activated.</b>';
+$lang['LCAS_confirmmail_custom2'] = 'Text of the confirmation page - Confirmation rejected';
+$lang['LCAS_confirmmail_custom2_d'] = 'When the option &quot;Confirmation of registration&quot; is active, this field allows you to customize the <b><u>rejectance text</u></b> on the registration confirmation page displayed when user clicks the confirmation link that was received by email.<br>
+After installing the plugin, a standard text is set as an example.<br>
+This field is compatible with the FCK Editor and, for multi-languages, you can use the tags [lang] of the plugin Extended description if it\'s active.<br>
+<b style=&quot;color:red;&quot;>Changing the text is possible ONLY if &quot;Confirmation of registration&quot; is activated.</b>';
+// --------- End: New or revised $lang ---- from version 2.15.0
+
+
+// --------- Starting below: New or revised $lang ---- from version 2.15.2
+$lang['LCAS_casenTitle_d'] = 'By default, Piwigo is case sensitive: Uppercase and lowercase letters are considered different letters in the names chosen by users at registration. Thus, &quot;Foo&quot;, &quot;foo&quot; and &quot;FOO&quot; may be 3 different users.<br><br>
+Enabling this option allows to consider all options in case of &quot;foo&quot; as one user. If &quot;foo&quot; already exists, creating a new user &quot;Foo&quot; will be refused.<br><br>
+<b style=&quot;color: red;&quot;>Warning: This option has no effect on the user names created prior to its activation.</b>';
+// --------- End: New or revised $lang ---- from version 2.15.2
+
+// --------- Starting below: New or revised $lang ---- from version 2.15.4
+$lang['LCAS_restricTitle_d'] = '
+- Characters exclusion<br>
+- Password enforcement<br>
+- Email domains exclusion<br>
+...
+';
+$lang['LCAS_userlistTitle_d'] = 'This page is for information to the administrator. It displays a list of all users registered on the gallery showing the date and number of days since their last visit. The list is sorted in ascending order of number of days.
+<br><br>
+<b><u>Only when the Ghost Tracker is active</u></b>, the number of days without a visit appears as the following color code, according to the maximum set in the Ghost Tracker options:
+<br>
+- <b style=&quot;color: lime;&quot;>Green</b> : When the user has visited the gallery <b style=&quot;color: lime;&quot;><u>less than 50%</u></b> of the maximum indicated in the Ghost Tracker.<br>
+- <b style=&quot;color: orange;&quot;>Orange</b> : When the user has visited the gallery <b style=&quot;color: orange;&quot;><u> between 50% and 99% </u></b> of the maximum indicated in the Ghost Tracker.<br>
+- <b style=&quot;color: red;&quot;>Red</b> : When the user has visited the gallery <b style=&quot;color: red;&quot;><u>for more than 100%</u></b> of the maximum indicated in the Ghost Tracker. <b><u>In this case, the user must also appear in the Ghost Tracker table.</u></b><br>
+<br>
+Example :
+<br>
+The maximum period of Ghost Tracker is configured to 100 days.
+<br>
+A user will appear in green if he visited the gallery for less than 50 days, in orange if his last visit took place between 50 and 99 days and red for 100 days and above.
+<br><br>
+<b>NOTE</b>: The list does not display who have not validated their registration (if the option of validating the registration is activated). These users are then managed in a special way in the &quot;Tracking validations&quot; tab.
+<br><br>
+<b>Table Sorting Function</b>: You can sort the data displayed by clicking on the column headers. Hold the SHIFT key to sort up to 4 simultaneous columns.';
+$lang['LCAS_usermanTitle_d'] = 'When limiting the deadline for registration is enabled, you will find below the list of users whose validation registration is expected, <b style=&quot;text-decoration: underline;&quot;>whether or not</b> they are in time to validate.<br><br>
+The registration date is displayed in green when the user concerned is below the time limit to validate his registration. In this case, the validation key is still valid and we can send an email with or without a new validation key.<br><br>
+When the registration date appears in red, the validation period has expired. In this case, you must send an email with regeneration of validation key if you want to enable the user to validate their registration.<br><br>
+In all cases, it is possible to manually force the validation.<br><br>
+In this view, you can:
+<br><br>
+- Manually delete accounts <b>(manual drain)</b>
+<br>
+- Generate email reminder <b>without</b> generating a new key. Warning: Send an email reminder to targeted visitors. This function does not reset the date of registration of targeted visitors and the timeout is still valid.
+<br>
+- Generate email reminder <b>with</b> generating a new key. Warning : Send an email reminder to targeted visitors. This function also resets the date of registration of targeted visitors which equates to extend the deadline for validation.
+<br>
+- Submit a registration awaiting validation manually even if the expiry date has passed <b>(forcing validation)</b>.
+<br><br>
+<b>Table Sorting Function</b>: You can sort the data displayed by clicking on the column headers. Hold the SHIFT key to sort up to 4 simultaneous columns.';
+$lang['LCAS_gtTitle_d'] = 'When Ghost Tracker is enabled and initialized, you will find below the list of registered visitors who have not returned since x days. &quot;x&quot; is the number of days configured in the General Setup tab. In addition, you will find a column indicating whether an email reminder has been sent to targeted visitors. So, you can see at a glance and treat visitors who have not taken account of the reminder.<br><br>In this view, you can:
+<br><br>
+- Manually delete accounts <b>(manual drain)</b>
+<br>
+- Generate email reminder <b>with resetting the last visit date</b>. This allows to give a wildcard to targeted visitors. If the visitor has already received a reminder, nothing prevents to resent a new mail which will reset again, in fact, the last visit date.
+<br><br>
+<b>Table Sorting Function</b>: You can sort the data displayed by clicking on the column headers. Hold the SHIFT key to sort up to 4 simultaneous columns.';
+$lang['LCAS_confirmmailTitle'] = 'Confirmation of registration';
+$lang['LCAS_confirmmailTitle_d'] = 'This option allows a user to either confirm registration by clicking on a link received in an email sent upon registration or the administrator to manually activate the registration.<br><br>
+In first case, the e-mail is composed of a customizable part to introduce a little welcome note and a fixed part containing the activation link that is generated from a random key that can possibly regenerate through the &quot;Tracking validations&quot; tab.<br><br>
+Dans le premier cas, le message envoyé comprend une partie fixe, avec le lien d\'activation généré à partir d\'une clef aléatoire (cette clé peut éventuellement être régénérée via l\'onglet &quot;Suivi des validations&quot;), et une partie personnalisable par un texte d\'accueil.
+<br><br>
+In second case, <b><u>there is no validation key send by email!</u></b>. Visitors have to wait until an administrator validate them himself in &quot;Validation tracking&quot; tab. It\s recommanded to activate the Piwigo\'s option &quot;Email admins when a new user registers&quot; (see in Piwigo\'s configuration options) and to use the &quot;Information email to user&quot; to warn new registers to wait on their account activation.
+<br>
+<b style=&quot;color: red;&quot;>NB: Options &quot;Deadline for registration validation limited&quot; and &quot;Remind unvalidated users  &quot; have to be set to off when admin\'s manual validation is enabled.</b>
+<br><br>
+This option is generally used with the automatic assignment of group and/or statutes. For example, a user who has not validated their registration will be set in a specific group of users (with or without restrictions on the gallery) while a user who validated his registration shall be set in a &quot;normal&quot; group.';
+$lang['LCAS_RedirTitle'] = 'Redirect to &quot;Customization&quot; page';
+// --------- End: New or revised $lang ---- from version 2.15.4
+
+
+// --------- Starting below: New or revised $lang ---- from version 2.15.6
+$lang['LCAS_RedirTitle_d'] = 'This option automatically redirect a registered user to his customization page only at his first connection to the gallery.<br><br>
+Please note: This feature does not apply to all registered users. Those with &quot;admin&quot;, &quot;webmaster&quot; or &quot;generic&quot; status are excluded.';
+// --------- End: New or revised $lang ---- from version 2.15.6
+
+// --------- Starting below: New or revised $lang ---- from version 2.15.7
+$lang['LCAS_mailexcTitle_d'] = 'By default, Piwigo accepts all email addresses in the format xxx@yyy.zz. Enabling this option allows you to exclude certain domains in the format: @ [domain_name].[domain_extension].<br><br>
+Examples :<br>
+@hotmail.com -> excluding addresses *@hotmail.com<br>
+@hotmail -> excluding all addresses *@hotmail*
+<br><br>
+<b style=&quot;color: red;&quot;>The seizure is only possible after registration of the option in the activated position.</b>';
+// --------- End: New or revised $lang ---- from version 2.15.7
+?>
Index: /extensions/LCAS/trunk/language/en_UK/index.php
===================================================================
--- /extensions/LCAS/trunk/language/en_UK/index.php	(revision 8141)
+++ /extensions/LCAS/trunk/language/en_UK/index.php	(revision 8141)
@@ -0,0 +1,33 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | PhpWebGallery - a PHP based picture gallery                           |
+// | Copyright (C) 2002-2003 Pierrick LE GALL - pierrick@phpwebgallery.net |
+// | Copyright (C) 2003-2007 PhpWebGallery Team - http://phpwebgallery.net |
+// +-----------------------------------------------------------------------+
+// | file          : $Id: index.php 1912 2007-03-16 06:30:07Z rub $
+// | last update   : $Date: 2007-03-16 07:30:07 +0100 (ven, 16 mar 2007) $
+// | last modifier : $Author: rub $
+// | revision      : $Revision: 1912 $
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: /extensions/LCAS/trunk/language/en_UK/plugin.lang.php
===================================================================
--- /extensions/LCAS/trunk/language/en_UK/plugin.lang.php	(revision 8141)
+++ /extensions/LCAS/trunk/language/en_UK/plugin.lang.php	(revision 8141)
@@ -0,0 +1,271 @@
+<?php
+
+global $lang,$conf;
+
+$conf_LCAS= unserialize($conf['LoginCaseAccentsSensitivity']);
+
+
+/* UserManager Tab */
+$lang['Registration_Date'] = 'Registration date';
+
+
+/* Mailing */
+$lang['infos_mail %s'] = '%s, please find here your information to login the gallery :';
+$lang['User: %s'] = 'User : %s';
+$lang['Password: %s'] = 'Password: %s';
+$lang['Link: %s'] = 'Please, click on this link to confirm your registration : %s';
+
+
+/* Email confirmation page */
+$lang['title_confirm_mail'] = 'Validate your registration';
+$lang['confirm_mail_page_title'] = 'Validate your registration';
+
+
+/* Errors and Warnings */
+$lang['LCAS_audit_ok'] = 'Audit OK';
+$lang['Err_audit_no_casse'] = '<b>These accounts are identical to the case closely :</b> ';
+$lang['Err_audit_username_char'] = '<b>This account uses one or more forbidden characters :</b> ';
+$lang['Err_audit_email_forbidden'] = '<b>This account uses a forbidden email provider :</b> ';
+$lang['Err_audit_advise'] = '<b>you have to perform corrections to comply with new rules that you have activated.<br>Use a database management utility to correct user accounts directly in the table ###_USERS';
+$lang['LCAS_Empty Author'] = 'The author field have to be filled to send a comment.';
+$lang['reg_err_login5'] = 'Username already exist, WARNING name is case insensitive (Shift = Tiny).';
+$lang['reg_err_login6'] = 'Username does not have to match the following characters: ';
+$lang['reg_err_login7'] = 'Your email provider is banned for registration. Banned email providers are: ';
+$lang['LCAS_empty_pwd'] = '[empty password]';
+$lang['LCAS_no_update_pwd'] = '[profile updated without password changed]';
+$lang['invalid_pwd'] = 'Invalid username or password !';
+$lang['No_validation_for_Guest'] = 'The "Guest" account is not subject to validation';
+$lang['No_validation_for_default_user'] = 'The default account is not subject to validation';
+$lang['No_validation_for_Webmaster'] = 'The "Webmaster" account is not subject to validation';
+$lang['No_validation_for_your_account'] = 'Your personnal admin account is not subject to validation';
+$lang['Database_Error'] = '<b><u>Warning! Critical integrity error in your database.</u></b><br><br>Please check the integrity of the #_user_confirm_mail table.';
+
+
+/* Processing messages */
+$lang['%d_Mail_With_Key'] = '%d message with key renewal was sent';
+$lang['%d_Mails_With_Key'] = '%d messages with key renewal were sent';
+$lang['%d_Reminder_Sent'] = '%d reminder message was sent';
+$lang['%d_Reminders_Sent'] = '%d reminder messages were sent';
+$lang['%d_Validated_User'] = '%d User validated manually';
+$lang['%d_Validated_Users'] = '%d Users validated manually';
+
+
+/* Action button names */
+$lang['Delete_selected'] = 'Delete';
+$lang['Mail_without_key'] = 'Reminder without key';
+$lang['Mail_with_key'] = 'Reminder with key';
+
+
+
+
+// --------- Starting below: New or revised $lang ---- from version 2.12.0 and 2.12.1
+/* Global Configuration Tab */
+$lang['PasswordTest'] = 'Score calculation';
+/* Ghost Tracker Tab */
+$lang['Tab_GhostTracker'] = 'Ghost Tracker';
+$lang['Reminder'] = 'Email reminder';
+$lang['Reminder_Sent_OK'] = 'YES';
+$lang['Reminder_Sent_NOK'] = 'NO';
+/* Errors and Warnings */
+$lang['LCAS_save_config'] ='Configuration saved.';
+$lang['reg_err_login3'] = 'Security : Password is mandatory !';
+$lang['reg_err_login4_%s'] = 'Security : A control system calculates a score on the chosen passwords complexity. The complexity of your password is too low (score = %s). Please, choose a new password more secure by following these rules:<br>
+- Use letters and numbers<br>
+- Use lowercase and uppercase<br>
+- Increase its length (number of characters)<br>
+The minimum passwords score required by the administrator is: ';
+$lang['No_reminder_for_Guest'] = 'The "Guest" account is not subject to receive reminders from GhostTracker';
+$lang['No_reminder_for_default_user'] = 'The default account is not subject to receive reminders from GhostTracker';
+$lang['No_reminder_for_Webmaster'] = 'The "Webmaster" account is not subject to receive reminders from GhostTracker';
+$lang['No_reminder_for_your_account'] = 'You personnal admin account is not subject to receive reminders from GhostTracker';
+/* Action button names */
+$lang['audit'] = 'Audit settings';
+$lang['submit'] = 'Save settings';
+// --------- End: New or revised $lang ---- from version 2.12.0 and 2.12.1
+
+
+// --------- Starting below: New or revised $lang ---- from version 2.12.2
+/* Errors and Warnings */
+$lang['GhostTracker_Init_OK'] = 'Ghost Tracker reset done !';
+/* Action button names */
+$lang['GT_Reset'] = 'Reset Ghost Tracker';
+// --------- End: New or revised $lang ---- from version 2.12.2
+
+
+// --------- Starting below: New or revised $lang ---- from version 2.12.8
+/* Errors and Warnings */
+$lang['mail_exclusionlist_error'] = 'Warning! You have entered a new line (CR-LF) at the begining of email exclusion list (shown in red below). Although this new line is not visible, it is still present and may cause malfunction of the plugin. Please re-type in your exclusion list in a manner that does not begin with a newline.';
+// --------- End: New or revised $lang ---- from version 2.12.8
+
+
+// --------- Starting below: New or revised $lang ---- from version 2.13.0
+/* UserList Tab */
+$lang['UserList_Title'] = 'Monitoring registered users';
+// --------- End: New or revised $lang ---- from version 2.13.0
+
+
+// --------- Starting below: New or revised $lang ---- from version 2.13.4
+$lang['LCAS_no_unlink'] = '\'unlink\' function is not available';
+$lang['LCAS_unlink_errors'] = 'Errors occurred when deleting files';
+/* Global Configuration Tab */
+$lang['Title_Tab'] = 'LoginCaseAccentsSensitivity - Version : ';
+$lang['SubTitle1'] = 'Plugin configuration';
+$lang['Tab_Global'] = 'Configuration';
+$lang['LCAS_Title1'] = 'Setting restrictions for registrations';
+$lang['LCAS_Title2'] = 'Setting confirmations and validations of registration';
+$lang['LCAS_Title3'] = 'Setting the followed registrations and other options';
+$lang['LCAS_Title4'] = 'Tips and examples of use';
+$lang['LCAS_No_Casse'] = 'Usernames: Case sensitivity';
+$lang['LCAS_No_Casse_true'] = ' Enable';
+$lang['LCAS_No_Casse_false'] = ' Disable (default)';
+$lang['LCAS_Username_Char'] = 'Usernames: Exclusion of characters';
+$lang['LCAS_Username_Char_true'] = ' Banning characters:<br>(Use a comma to separate each character)<br><br>';
+$lang['LCAS_Username_Char_false'] = ' Permit all (default)';
+$lang['LCAS_Password_Enforced'] = 'Strengthening the security level of passwords';
+$lang['LCAS_Password_Enforced_true'] = ' Enable. Minimum Score: ';
+$lang['LCAS_Password_Enforced_false'] = ' Disable (default)';
+$lang['LCAS_AdminPassword_Enforced'] = 'Applying to administrators';
+$lang['LCAS_AdminPassword_Enforced_true'] = ' Enable';
+$lang['LCAS_AdminPassword_Enforced_false'] = ' Disable (default)';
+$lang['LCAS_PasswordTest'] = 'Password test: ';
+$lang['LCAS_ScoreTest'] = 'Result: ';
+$lang['LCAS_MailExclusion'] = 'Email domains exclusion';
+$lang['LCAS_MailExclusion_true'] = ' Exclude the following domains:<br>(Use a comma to separate each domain)';
+$lang['LCAS_MailExclusion_false'] = ' Disable (default)';
+
+$lang['LCAS_Mail_Info'] = 'Information email to user:';
+$lang['LCAS_Mail_Info_true'] = ' Enable';
+$lang['LCAS_Mail_Info_false'] = ' Disable (default)';
+$lang['LCAS_MailInfo_Text'] = ' Customizing the information email:';
+$lang['LCAS_Confirm_Mail'] = 'Confirmation of registration:';
+$lang['LCAS_Confirm_Mail_false'] = ' Disable (default)';
+$lang['LCAS_ConfirmMail_Text'] = ' Customizing the confirmation email:';
+$lang['LCAS_Confirm_grpstat_notice'] = 'Caution: It is advisable to use either the group or the validation statutes and not both simultaneously.';
+$lang['LCAS_Confirm_Group'] = 'Validation Groups<br>(leave ------- to not affect group)';
+$lang['LCAS_Confirm_Status'] = 'Validation Statutes<br>(leave ------- to keep the Piwigo\'s default)';
+$lang['LCAS_No_Confirm_Group'] = 'Group for users who have not validated their registration<br>';
+$lang['LCAS_Validated_Group'] = 'Group for users who have validated their registration<br>';
+$lang['LCAS_No_Confirm_Status'] = 'Status for users who have not validated their registration<br>';
+$lang['LCAS_Validated_Status'] = 'Status for users who have validated their registration<br>';
+$lang['LCAS_ValidationLimit_Info'] = 'Deadline for registration validation limited';
+$lang['LCAS_ConfirmMail_TimeOut_true'] = ' Enable. Number of days until expiration: ';
+$lang['LCAS_ConfirmMail_TimeOut_false'] = ' Disable (default)';
+$lang['LCAS_ConfirmMail_Remail'] = 'Remind unvalidated users';
+$lang['LCAS_ConfirmMail_Remail_true'] = ' Enable';
+$lang['LCAS_ConfirmMail_Remail_false'] = ' Disable (default)';
+$lang['LCAS_ConfirmMail_ReMail_Txt1'] = 'Customizing the reminder message <b><u>with</u></b> new regeneration of key validation.';
+$lang['LCAS_ConfirmMail_ReMail_Txt2'] = 'Customizing the reminder message <b><u>without</u></b> regeneration of key validation.';
+
+$lang['LCAS_GhostTracker'] = 'Ghost visitors management (Ghost Tracker)';
+$lang['LCAS_GhostTracker_true'] = ' Enable. Maximum period in days between two visits: ';
+$lang['LCAS_GhostTracker_false'] = ' Disable (default)';
+$lang['LCAS_GhostTracker_ReminderText'] = 'Customizing Ghost Tracker\'s reminder message';
+$lang['LCAS_LastVisit'] = ' Tracking registered users';
+$lang['LCAS_LastVisit_true'] = ' Enable';
+$lang['LCAS_LastVisit_false'] = ' Disable (default)';
+$lang['LCAS_No_Comment_Anonymous'] = 'Nickname mandatory for guests comments';
+$lang['LCAS_No_Comment_Anonymous_true'] = ' Enable';
+$lang['LCAS_No_Comment_Anonymous_false'] = ' Disable (default)';
+
+$lang['LCAS_Tips1'] = 'Registrations with email validation and warning message on the Piwigo\'s homepage';
+
+$lang['Tab_UserManager'] = 'Tracking validations';
+
+/* UserManager Tab */
+$lang['SubTitle3'] = 'Tracking validations';
+$lang['UserManager_Title'] = 'Tracking validations';
+/* Ghost Tracker Tab */
+$lang['SubTitle4'] = 'Ghost Tracker';
+$lang['GT_Init'] = 'Initializing Ghost Tracker';
+$lang['GhostTracker_Title'] = 'Ghost visitors management';
+$lang['LCAS_GhostTracker_Init'] = 'If you enable this feature for the first time or you have reactivated after a long period off during which new visitors are registered, you must initialize or reset the Ghost Tracker. This action is done only after activation or reactivation of the option. Please click <u>once</u> the reset button below.';
+/* UserList Tab */
+$lang['SubTitle5'] = 'Tracking users';
+$lang['Tab_UserList'] = 'Tracking users';
+/* Mailing */
+$lang['Add of %s'] = 'Profile created for %s';
+$lang['Update of %s'] = 'Profile %s updated';
+
+/* Mailing */
+$lang['Ghost_reminder_of_%s'] = '%s, this is a reminder email';
+$lang['Reminder_with_key_of_%s'] = '%s, your validation key has been renewed';
+$lang['Reminder_without_key_of_%s'] = '%s, your validation key will expire';
+/* Errors and Warnings */
+$lang['Err_GhostTracker_Settings'] = 'This page is available only if "Ghost Tracker" is active in "Setting the registrations followed and other options".';
+$lang['Err_Userlist_Settings'] = 'This page is available only if "Monitoring registered users" is active in the "Setting the registrations followed and other options".';
+// --------- End: New or revised $lang ---- from version 2.13.4
+
+
+// --------- Starting below: New or revised $lang ---- from version 2.14.0
+$lang['LCAS_AdminConfMail'] = 'Confirmation of registration for admins';
+$lang['LCAS_Admin_ConfMail_true'] = ' Enable';
+$lang['LCAS_Admin_ConfMail_false'] = ' Disable (default)';
+$lang['LCAS_Tips1_txt'] = '
+          <ul>
+            <li>
+            Goals:<br>
+            - On his arrival at the gallery: To inform the visitor that he has to register to access private photos<br>
+            - At registration: Generate an email validation with direct link, inform the new user of its non-validation and integrate him to the group "Waiting"<br>
+            - At validation: Switch automatically group "Waiting" to group "Validated", which provides access to private categories<br><br>
+            <b>Recall: In standard operation, the "Guest" only sees the public categories, without information message.</b>
+            </li><br><br>
+            <li>
+Prerequisite:<br>
+- A gallery with all or some private categories, visible only by registered users<br>
+- At least 2 following Piwigo\'s users groups: "Waiting," without permission on private categories, and "Validated" with all the permissions on the private categories<br>
+- LCASplugin<br>
+- PWG Stuffs plugin, for adding a module type "Personal Block"<br>
+- Optionally, the plugin Extended Description to support multi-languages<br>
+            </li><br><br>
+            <li>
+Stages:<br><br>
+A. In plugin LCAS:
+              <ol>
+                <li>Enable registration confirmation</li>
+                <li>Enter text for additional explanation which will be attached to mail registration confirmation. If the plugin Extended Description is activated, the language tags can be used</li>
+                <li>Select the "Waiting" group under "For users who have not validated their registration"</li>
+                <li>Select the "Validated" group under "For users who have validated their registration"</li>
+                <li>Save the plugin configuration</li>
+              </ol>
+<br>
+B. In plugin PWG Stuffs :
+              <ol>
+                <li>Add a new module type "Personal block: Shows a block staff (eg an editorial)"</li>
+                <li>Configure the module, indicating the title (eg "Registration pending validation") and its description, and only check "Waiting" in the list of groups allowed</li>
+                <li>Complete content of the module with the message information to be displayed to users not validated. As LCAS, languages markup may be used if the plugin is enabled Extended Description</li>
+                <li>Check "Display the module on the homepage of the site"</li>
+                <li>Validate the configuration of the module</li>
+              </ol>
+            </li>
+          </ul>';
+// --------- End: New or revised $lang ---- from version 2.14.0
+
+
+// --------- Starting below: New or revised $lang ---- from version 2.15.0
+$lang['LCAS_confirmmail_custom_Txt1'] = 'Text of the confirmation page - Confirmation accepted';
+$lang['LCAS_confirmmail_custom_Txt2'] = 'Text of the confirmation page - Confirmation rejected';
+$lang['LastVisit_Date'] = 'Last visit';
+$lang['Nb_Days'] = 'Difference in days';
+$lang['Err_UserManager_Settings'] = 'This page is available only if "Confirmation of registration" is active and if a group of visitors not validated is configured in "Setting confirmations and validations of registration".';
+// --------- End: New or revised $lang ---- from version 2.15.0
+
+
+// --------- Starting below: New or revised $lang ---- from version 2.15.1
+$lang['reg_err_mail_address_dbl'] = 'This email address is already used.';
+$lang['LCAS_Support_txt'] = 'The official support on this plugin is only on these Piwigo forum topic:<br>
+<a href="http://fr.piwigo.org/forum/viewtopic.php?id=12775" onclick="window.open(this.href);return false;">French forum - http://fr.piwigo.org/forum/viewtopic.php?id=12775</a>
+<br>or<br>
+<a href="http://piwigo.org/forum/viewtopic.php?id=15015" onclick="window.open(this.href);return false;">English forum - http://piwigo.org/forum/viewtopic.php?id=15015</a><br><br>
+Also available, the project\'s bugtracker: <a href="http://piwigo.org/bugs/" onclick="window.open(this.href);return false;">http://piwigo.org/bugs/</a>';
+// --------- End: New or revised $lang ---- from version 2.15.1
+
+
+// --------- Starting below: New or revised $lang ---- from version 2.15.4
+$lang['Force_Validation'] = 'Manual validation';
+$lang['LCAS_Confirm_Mail_true'] = ' Enable - Validation by user';
+$lang['LCAS_Confirm_Mail_local'] = ' Enable - Validation by admin (no validation key sent)';
+$lang['LCAS_RedirToProfile'] = 'Redirect to "Customization" page';
+$lang['LCAS_RedirToProfile_false'] = ' Disable (default)';
+$lang['LCAS_RedirToProfile_true'] = ' Enable';
+// --------- End: New or revised $lang ---- from version 2.15.4
+?>
Index: /extensions/LCAS/trunk/language/fr_FR/description.txt
===================================================================
--- /extensions/LCAS/trunk/language/fr_FR/description.txt	(revision 8141)
+++ /extensions/LCAS/trunk/language/fr_FR/description.txt	(revision 8141)
@@ -0,0 +1,1 @@
+﻿Permet de spécifier si les connexions et/ou les enregistrements doivent être sensibles à la casse et/ou accents
Index: /extensions/LCAS/trunk/language/fr_FR/help/index.php
===================================================================
--- /extensions/LCAS/trunk/language/fr_FR/help/index.php	(revision 8141)
+++ /extensions/LCAS/trunk/language/fr_FR/help/index.php	(revision 8141)
@@ -0,0 +1,33 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | PhpWebGallery - a PHP based picture gallery                           |
+// | Copyright (C) 2002-2003 Pierrick LE GALL - pierrick@phpwebgallery.net |
+// | Copyright (C) 2003-2007 PhpWebGallery Team - http://phpwebgallery.net |
+// +-----------------------------------------------------------------------+
+// | file          : $Id: index.php 1912 2007-03-16 06:30:07Z rub $
+// | last update   : $Date: 2007-03-16 07:30:07 +0100 (ven, 16 mar 2007) $
+// | last modifier : $Author: rub $
+// | revision      : $Revision: 1912 $
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: /extensions/LCAS/trunk/language/fr_FR/help/plugin.lang.php
===================================================================
--- /extensions/LCAS/trunk/language/fr_FR/help/plugin.lang.php	(revision 8141)
+++ /extensions/LCAS/trunk/language/fr_FR/help/plugin.lang.php	(revision 8141)
@@ -0,0 +1,170 @@
+<?php
+global $lang;
+
+$lang['LCAS_confirmTitle'] = 'Sensibilité à l\'enregistrement et la connexion';
+$lang['LCAS_confirmTitle_d'] = '
+- Noms d\'utilisateur sensible ou non à la casse<br>
+- Noms d\'utilisateur ensible ou non aux accents<br>
+';
+$lang['LCAS_infomailTitle'] = 'La casse';
+$lang['LCAS_infomailTitle_d'] = 'Cette option permet de s\'authentifier sans tenir compte des majuscules et minuscules dans le nom de l\'utilisateur.<br/>
+<b style=&quot;color: red;&quot;>NB: Le mot de passe reste sensible à la casse !</b><br/>
+';
+$lang['LCAS_confirmmailTitle'] = 'Les accents';
+$lang['LCAS_confirmmailTitle_d'] = 'Cette option permet de s\'authentifier sans tenir compte des accents dans le nom de l\'utilisateur.<br/>
+<b style=&quot;color: red;&quot;>NB: Le mot de passe reste sensible à tous les caractères !</b><br/>
+C\'est Béatrice qui va être contente !<br/>
+';
+$lang['LCAS_userlistTitle'] = 'Vérification des utilisateurs';
+$lang['LCAS_userlistTitle_d'] = 'Cette page affiche les utilisateurs qui doivent être modififés afin d\'activer cette option.<br/><br/>
+Si deux utilisateurs sont déjà enregistrés, par exemple, <em>Test</em> et <em>test</em>, et que l\'option pour l\'insensibilité à la casse est cochée, ils ne pourront plus se connecter correctement.<br/>
+Vous devez modifier l\'un des deux utilisateurs et éventuellement le prévenir avec le lien pour envoyer un email.';
+
+
+
+
+
+$lang['LCAS_restricTitle'] = 'Restriction des inscriptions';
+$lang['LCAS_miscTitle'] = 'Suivi des inscrits et fonctions diverses';
+$lang['LCAS_miscTitle_d'] = '
+- Gestion des visiteurs fantômes<br>
+- Suivi des visiteurs inscrits<br>
+- Pseudo obligatoire sur commentaire pour les visiteurs<br>
+...
+';
+$lang['LCAS_casenTitle'] = 'Noms d\'utilisateurs : Sensibilité à la casse';
+$lang['LCAS_carexcTitle'] = 'Noms d\'utilisateurs : Exclusion de certains caractères';
+$lang['LCAS_carexcTitle_d'] = 'Il peut être intéressant d\'interdire certains caractères dans les noms d\'utilisateurs (exemple : refuser les logins contenant un &quot;@&quot;). Cette option permet d\'exclure les caractères, ou suite de caractères, indésirables.<br>NB: l\'option permet également d\'exclure des mots complets.
+<br><br>
+<b style=&quot;color: red;&quot;>Attention : Cette option est sans effet sur les noms d\'utilisateurs créés préalablement à son activation.</b>';
+$lang['LCAS_passwTitle'] = 'Renforcement de la sécurité des mots de passe';
+$lang['LCAS_passwTitle_d'] = 'L\'activation de cette option rend obligatoire la saisie d\'un mot de passe  à l\'inscription, et oblige le mot de passe choisi par le visiteur à répondre à un niveau minimum de complexité. Si ce seuil n\'est pas atteint, le score réalisé et le score minimum à atteindre sont affichés, ainsi que des recommandations pour augmenter la valeur de ce score.<br><br>
+Un champ de test permet de mesurer la complexité d\'un mot de passe, et peut permettre de se faire une idée du score à définir pour une complexité personnalisée.<br><br>
+NB: Le score d\'un mot de passe est calculé en fonction de plusieurs paramètres : longueur, types de caractères utilisés (lettres, chiffres, majuscules, minuscules, caractères spéciaux). Un score inférieur à 100 est considéré comme faible; de 100 à 500, la complexité est dans la moyenne; au-delà de 500, la sécurité est excellente.';
+$lang['LCAS_passwtestTitle'] = 'Tester la complexité d\'un mot de passe';
+$lang['LCAS_passwtestTitle_d'] = 'Saisir le mot de passe à tester puis cliquer sur le bouton &quot;Calcul du score&quot; pour afficher le résultat.';
+$lang['LCAS_passwadmTitle'] = 'Renforcement des mots de passe pour les admins';
+$lang['LCAS_passwadmTitle_d'] = 'Un administrateur peut créer un compte d\'utilisateur avec ou sans application de la règle de calcul de complexité.<br><br>
+A noter : Si l\'utilisateur du compte ainsi créé désire changer de mot de passe et que le renforcement des mots de passe pour les utilisateurs est actif, il sera soumis à la règle configurée.';
+$lang['LCAS_mailexcTitle'] = 'Exclusion des domaines de messagerie';
+$lang['LCAS_infotxtTitle'] = 'Personnalisation de l\'email d\'information';
+$lang['LCAS_infotxtTitle_d'] = 'Saisissez ici le texte d\'introduction personnalisé qui apparaîtra dans l\'email d\'information.<br><br>
+Pour une utilisation multi-langues, vous pouvez utiliser les balises [lang] du plugin Extended Description si celui-ci est actif.<br><br>
+<b style=&quot;color: red;&quot;>La modification du texte n\'est possible QUE si l\'option &quot;Email d\'information&quot; est activée.</b>';
+$lang['LCAS_confirmtxtTitle'] = 'Personnalisation de l\'email de confirmation';
+$lang['LCAS_confirmtxtTitle_d'] = 'Saisissez ici le texte d\'introduction qui apparaîtra dans l\'email de confirmation d\'inscription.<br><br>
+Pour une utilisation multi-langues, vous pouvez utiliser les balises [lang] du plugin Extended Description si celui-ci est actif.<br><br>
+<b style=&quot;color: red;&quot;>La modification du texte n\'est possible QUE si l\'option &quot;Confirmation d\'inscription&quot; est activée.</b>';
+$lang['LCAS_confirmgrpTitle'] = 'Groupes de validation';
+$lang['LCAS_confirmgrpTitle_d'] = '<b style=&quot;color: red;&quot;>ATTENTION : L\'utilisation des groupes de validation nécessite que vous ayez créé au moins un groupe d\'utilisateurs et qu\'il soit défini &quot;par défaut&quot; dans la gestion des groupes d\'utilisateurs de Piwigo.</b><br><br>
+Les groupes de validation sont à utiliser conjointement avec l\'option &quot;Confirmation d\'inscription&quot;';
+$lang['LCAS_confirmstatTitle'] = 'Statuts de validation';
+$lang['LCAS_confirmstatTitle_d'] = '<b style=&quot;color: red;&quot;>ATTENTION : L\'utilisation des statuts de validation nécessite que vous ayez conservé l\'utilisateur &quot;Guest&quot; pour le paramétrage par défaut (modèle) pour les nouveaux inscrits. A noter : Vous pouvez définir n\'importe quel autre utilisateur comme modèle pour les nouveaux inscrits. Reportez-vous à la documentation de Piwigo pour plus de détails.</b><br><br>
+Les statuts de validation sont à utiliser conjointement avec l\'option &quot;Confirmation d\'inscription&quot;';
+$lang['LCAS_validationlimitTitle'] = 'Limitation du délai de validation d\'inscription';
+$lang['LCAS_validationlimitTitle_d'] = 'Cette option permet de limiter le nombre de jours pendant lequel un nouvel utilisateur peut valider son inscription. Une fois ce délai expiré, le lien de validation sera invalide, et ne pourra plus être employé.
+<br><br>
+Cette option n\'est utilisable qu\'une fois l\'option &quot;Confirmation d\'inscription&quot; activée';
+$lang['LCAS_remailTitle'] = 'Mail de rappel aux inscrits non validés';
+$lang['LCAS_remailTitle_d'] = 'Cette option permet d\'envoyer un email de rappel aux utilisateurs n\'ayant pas validé leur inscription dans les temps. Elle n\'a d\'effet qu\'une fois l\'option &quot;Confirmation d\'inscription&quot; activée.<br><br>
+2 types d\'email peuvent être envoyés : Avec ou sans régénération de la clef de validation. En fonction du cas, le contenu  des emails peut être personnalisé.<br><br>
+Reportez-vous à l\'onglet &quot;Suivi des validations&quot;.';
+$lang['LCAS_remailtxt1Title'] = 'Message de rappel avec regénération de clé';
+$lang['LCAS_remailtxt1Title_d'] = 'Saisissez ici le texte d\'introduction qui apparaîtra dans l\'email de rappel, accompagné d\'une nouvelle clef de validation.<br><br>
+Il est vivement conseillé de saisir un texte explicatif; à défaut, le mail de rappel ne comportera que le lien de validation. (NB : Le texte pré-renseigné à l\'installation du plugin n\'est donné qu\'à titre d\'exemple)<br><br>
+Pour une utilisation multi-langues, vous pouvez utiliser les balises [lang] du plugin Extended Description si celui-ci est actif.<br><br>
+<b style=&quot;color: red;&quot;>La modification du texte n\'est possible QUE si l\'option &quot;Mail de rappel aux inscrits non validés&quot; est activée.</b>';
+$lang['LCAS_remailtxt2Title'] = 'Message de rappel sans regénération de clé';
+$lang['LCAS_remailtxt2Title_d'] = 'Saisissez ici le texte d\'introduction qui apparaîtra dans l\'email de rappel, sans nouvelle clef de validation .<br><br>
+Il est vivement conseillé de saisir un texte explicatif, afin que l\'email ne soit pas vide. (NB : Le texte pré-renseigné à l\'installation du plugin n\'est donné qu\'à titre d\'exemple)<br><br>
+Pour une utilisation multi-langues, vous pouvez utiliser les balises [lang] du plugin Extended Description si celui-ci est actif.<br><br>
+<b style=&quot;color: red;&quot;>La modification du texte n\'est possible QUE si l\'option &quot;Mail de rappel aux inscrits non validés&quot; est activée.</b>';
+$lang['LCAS_ghosttrackerTitle'] = 'Gestion des visiteurs fantômes (aussi appelée Ghost Tracker)';
+$lang['LCAS_ghosttrackerTitle_d'] = 'L\'activation de cette fonction permet la gestion des visiteurs inscrits en fonction de la fréquence de leurs visites. Une fois atteint le délai entre 2 visites successives, le visiteur apparaît dans le tableau de l\'onglet &quot;Ghost Tracker&quot; d\'où il est possible de le relancer par email.<br><br>
+<b style=&quot;color: red;&quot;>IMPORTANT : A première activation de cette fonction, ou à sa réactivation après une longue période pendant laquelle de nouveaux visiteurs se sont inscrits, il convient d\'initialiser le Ghost Tracker (voir les instructions correspondantes sur l\'onglet &quot;Ghost Tracker&quot;).</b>';
+$lang['LCAS_gttextTitle'] = 'Message de rappel Ghost Tracker';
+$lang['LCAS_gttextTitle_d'] = 'Saisissez ici le texte qui apparaîtra dans l\'email de rappel pour inciter l\'utilisateur à revenir visiter votre galerie (NB: Le texte pré-renseigné à l\'installation du plugin est donné à titre d\'exemple).<br><br>
+Pour une utilisation multi-langues, vous pouvez utiliser les balises [lang] du plugin Extended Description si celui-ci est actif.<br><br>
+<b style=&quot;color: red;&quot;>La modification du texte n\'est possible QUE si l\'option &quot;Gestion des visiteurs fantômes&quot; est activée.</b>';
+$lang['LCAS_commentTitle'] = 'Commentaires : pseudo obligatoire pour les non-inscrits.';
+$lang['LCAS_commentTitle_d'] = 'Lorsque les visiteurs non inscrits sont autorisés à poster des commentaires (&quot;Commentaires pour tous&quot; actif), cette option oblige le visiteur non inscrit à saisir un pseudo pour que le commentaire soit accepté.';
+$lang['LCAS_tipsTitle'] = 'Astuces et exemples';
+$lang['LCAS_tipsTitle_d'] = 'Astuces et exemples divers d\'utilisation';
+$lang['LCAS_usermanTitle'] = 'Suivi des validations';
+$lang['LCAS_gtTitle'] = 'Gestion des visiteurs fantômes';
+
+
+// --------- Starting below: New or revised $lang ---- from version 2.14.0
+$lang['LCAS_adminconfmailTitle'] = 'Validation d\'inscription pour les admins';
+$lang['LCAS_adminconfmailTitle_d'] = 'On peut ici désactiver la validation des inscriptions uniquement pour les comptes d\'utilisateurs créés par l\'administrateur via l\'interface de gestion des utilisateurs de Piwigo.<br><br>
+En activant cette option, l\'email de validation d\'inscription sera envoyé à chaque utilisateur créé par l\'admin.<br><br>
+En désactivant cette option (mode par défaut), seul l\'email d\'information est envoyé (si la fonction &quot;Email d\'information &agrave; l\'utilisateur&quot; est activée).';
+// --------- End: New or revised $lang ---- from version 2.14.0
+
+
+// --------- Starting below: New or revised $lang ---- from version 2.15.0
+$lang['LCAS_confirmmail_custom1'] = 'Texte de la page de confirmation - Confirmation acceptée';
+$lang['LCAS_confirmmail_custom1_d'] = 'Lorsque l\'option &quot;Confirmation d\'inscription&quot; est active, ce champ permet de personnaliser <b><u>le texte d\'acceptation</u></b> de la confirmation d\'inscription sur la page affichée lorsqu\'un utilisateur clique sur le lien de confirmation qu\'il a reçu par email.<br><br>
+A l\'installation du plugin, un texte standard est donnée en exemple.<br><br>
+Ce champ est compatible avec l\'extension FCK Editor et, pour une utilisation multi-langues, vous pouvez utiliser les balises [lang] du plugin Extended Description si celui-ci est actif.<br><br>
+<b style=&quot;color: red;&quot;>La modification du texte n\'est possible QUE si l\'option &quot;Confirmation d\'inscription&quot; est activée.</b>';
+$lang['LCAS_confirmmail_custom2'] = 'Texte de la page de confirmation - Confirmation rejetée';
+$lang['LCAS_confirmmail_custom2_d'] = 'Lorsque l\'option &quot;Confirmation d\'inscription&quot; est active, ce champ permet de personnaliser <b><u>le texte de rejet</u></b> de la confirmation d\'inscription sur la page affichée lorsqu\'un utilisateur clique sur le lien de confirmation qu\'il a reçu par email.<br><br>
+A l\'installation du plugin, un texte standard est donnée en exemple.<br><br>
+Ce champ est compatible avec l\'extension FCK Editor et, pour une utilisation multi-langues, vous pouvez utiliser les balises [lang] du plugin Extended Description si celui-ci est actif.<br><br>
+<b style=&quot;color: red;&quot;>La modification du texte n\'est possible QUE si l\'option &quot;Confirmation d\'inscription&quot; est activée.</b>';
+// --------- End: New or revised $lang ---- from version 2.15.0
+
+
+// --------- Starting below: New or revised $lang ---- from version 2.15.2
+$lang['LCAS_casenTitle_d'] = 'Par défaut, Piwigo est sensible à la casse : majuscules et minuscules sont considérées comme des lettres différentes dans les noms choisis par les utilisateurs à l\'inscription. Ainsi, &quot;Toto&quot;,  &quot;toto&quot; et &quot;TOTO&quot; peuvent être 3 utilisateurs différents.<br><br>
+L\'activation de cette option permet de considérer toutes les versions de casse de &quot;toto&quot; comme un seul utilisateur. Si &quot;toto&quot; existe déjà, la création d\'un nouvel utilisateur &quot;ToTo&quot; sera refusée.<br><br>
+<b style=&quot;color: red;&quot;>Attention : Cette option est sans effet sur les noms d\'utilisateurs créés préalablement à son activation.</b>';
+// --------- End: New or revised $lang ---- from version 2.15.2
+
+
+// --------- Starting below: New or revised $lang ---- from version 2.15.4
+$lang['LCAS_restricTitle_d'] = '
+- Exclusion de caractères dans les noms d\'utilisateurs<br>
+- Renforcement des mots de passe<br>
+- Exclusion des domaines de messagerie<br>
+...
+';
+$lang['LCAS_usermanTitle_d'] = 'Lorsque la limitation du délai d\'inscription est activée, vous trouverez ci-dessous la liste des utilisateurs en attente de validation d\'inscription <b style=&quot;text-decoration: underline;&quot;>qu\'ils soient ou pas</b> dans les délais pour la valider.<br><br>La date d\'enregistrement s\'affiche en vert lorsque l\'utilisateur concerné est en dessous du temps limite pour valider son inscription. Dans ce cas, la clé de validation est toujours valide et on pourra envoyer un email avec ou sans régénération de clé.<br><br>Lorsque la date d\'enregistrement s\'affiche en rouge, le délai de validation est expiré. Dans ce cas, on enverra obligatoirement un email avec régénération de clé si on veut permettre à cet utilisateur de pouvoir valider son inscription.<br><br>Dans tous les cas, il est possible de forcer manuellement la validation.<br><br>Dans cette vue, vous pouvez :
+<br><br>
+- Supprimer manuellement les comptes <b>(purge manuelle)</b>
+<br>
+- Générer l\'email de rappel <b>sans génération</b> d\'une nouvelle clef. Rappel : Cette fonction ne réinitialise pas la date d\'inscription du visiteur ciblé et le délai d\'expiration est toujours d\'actualité.
+<br>
+- Générer l\'email de rappel <b>avec génération</b> d\'une nouvelle clef. Rappel : Cette fonction réinitialise également la date d\'inscription du visiteur ciblé ce qui équivaut à prolonger le délai de validation.
+<br>
+- Valider manuellement une inscription en attente de validation même si la date d\'expiration est révolue <b>(forçage de la validation)</b>.
+<br><br>
+<b>Fonction de tri du tableau</b>: Vous pouvez trier les données affichées en cliquant sur les entêtes de colonnes. L\'utilisation de la touche MAJ ou SHIFT permet de trier sur 1 à 4 colonnes simultanées maximum.';
+$lang['LCAS_gtTitle_d'] = 'Lorsque la gestion des visiteurs fantômes est activée et initialisée, vous trouverez ci-dessous la liste des visiteurs inscrits sur votre galerie et qui ne sont pas revenus depuis x jours. &quot;x&quot; étant le nombre de jours paramétrés dans l\'onglet de configuration générale. De plus, vous trouverez une colonne précisant si un mail de rappel a déjà été envoyé aux visiteurs ciblés, vous permettant de visualiser d\'un coup d\'oeil et traiter les visiteurs qui n\'auraient pas tenu compte du rappel.<br><br>Dans cette vue, vous pouvez :
+<br><br>
+- Supprimer manuellement les comptes <b>(purge manuelle)</b>
+<br>
+- Générer l\'email de rappel <b>avec réinitialisation de la date de dernière visite</b>. Ce qui permet de donner un &quot;joker&quot; au visiteur ciblé. Si le visiteur a déjà bénéficié d\'un mail de rappel, rien n\'empêche de renvoyer un nouveau mail qui réinitialisera, de fait, la date de dernière visite.
+<br><br>
+<b>Fonction de tri du tableau</b>: Vous pouvez trier les données affichées en cliquant sur les entêtes de colonnes. L\'utilisation de la touche MAJ ou SHIFT permet de trier sur 1 à 4 colonnes simultanées maximum.';
+$lang['LCAS_RedirTitle'] = 'Redirection vers la page &quot;Personnalisation&quot;';
+$lang['LCAS_RedirTitle_d'] = 'Cette option permet de rediriger automatiquement un utilisateur inscrit vers sa page de personnalisation uniquement lors de sa première connexion à la galerie.<br><br>
+A savoir: Cette fonction s\'applique également à tous les utilisateurs déjà inscrits, y compris ceux disposant du status &quot;admin&quot;, &quot;webmaster&quot; ou &quot;generique&quot;.';
+// --------- End: New or revised $lang ---- from version 2.15.4
+
+
+// --------- Starting below: New or revised $lang ---- from version 2.15.6
+$lang['LCAS_RedirTitle_d'] = 'Cette option permet de rediriger automatiquement un utilisateur inscrit vers sa page de personnalisation uniquement lors de sa première connexion à la galerie.<br><br>
+A savoir: Cette fonction ne s\'applique pas à tous les utilisateurs déjà inscrits. Ceux disposant du status &quot;admin&quot;, &quot;webmaster&quot; ou &quot;generique&quot; sont exclus de la règle.';
+// --------- End: New or revised $lang ---- from version 2.15.6
+
+// --------- Starting below: New or revised $lang ---- from version 2.15.7
+$lang['LCAS_mailexcTitle_d'] = 'Par défaut, Piwigo accepte toutes les adresses de messagerie au format xxx@yyy.zz. L\'activation de cette option permet d\'exclure certains domaines selon le format : @[nom_du_domaine].[extension_du_domaine].<br><br>
+Exemples :<br>
+@hotmail.com -> exclusion des adresses *@hotmail.com<br>
+@hotmail -> exclusion de toutes les adresses *@hotmail*
+<br><br>
+<b style=&quot;color: red;&quot;>La saisie n\'est possible qu\'après enregistrement de l\'option en position activée.</b>';
+// --------- End: New or revised $lang ---- from version 2.15.7
+?>
Index: /extensions/LCAS/trunk/language/fr_FR/index.php
===================================================================
--- /extensions/LCAS/trunk/language/fr_FR/index.php	(revision 8141)
+++ /extensions/LCAS/trunk/language/fr_FR/index.php	(revision 8141)
@@ -0,0 +1,33 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | PhpWebGallery - a PHP based picture gallery                           |
+// | Copyright (C) 2002-2003 Pierrick LE GALL - pierrick@phpwebgallery.net |
+// | Copyright (C) 2003-2007 PhpWebGallery Team - http://phpwebgallery.net |
+// +-----------------------------------------------------------------------+
+// | file          : $Id: index.php 1912 2007-03-16 06:30:07Z rub $
+// | last update   : $Date: 2007-03-16 07:30:07 +0100 (ven, 16 mar 2007) $
+// | last modifier : $Author: rub $
+// | revision      : $Revision: 1912 $
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: /extensions/LCAS/trunk/language/fr_FR/plugin.lang.php
===================================================================
--- /extensions/LCAS/trunk/language/fr_FR/plugin.lang.php	(revision 8141)
+++ /extensions/LCAS/trunk/language/fr_FR/plugin.lang.php	(revision 8141)
@@ -0,0 +1,279 @@
+<?php
+
+global $lang,$conf;
+
+$conf_LCAS= unserialize($conf['LoginCaseAccentsSensitivity']);
+
+$lang['SubTitle1'] = 'Configuration du plugin';
+$lang['Tab_Global'] = 'Configuration';
+
+$lang['LCAS_Title2'] = 'Paramétrage de la sensibilité';
+
+$lang['LCAS_Mail_Info'] = 'Sensibilité à la casse :';
+$lang['LCAS_Mail_Info_true'] = ' Activer';
+$lang['LCAS_Mail_Info_false'] = ' Désactiver (valeur par défaut)';
+
+$lang['LCAS_Confirm_Mail'] = 'Sensibilité aux accents :';
+$lang['LCAS_Confirm_Mail_false'] = ' Désactiver (valeur par défaut)';
+$lang['LCAS_Confirm_Mail_true'] = ' Activer';
+
+
+$lang['UserList_Title'] = 'Utilisateurs nécessitant des modifications';
+$lang['Tab_UserList'] = 'Validation des utilisateurs';
+$lang['SubTitle5'] = 'Vérification des utilisateurs';
+
+$lang['Err_Userlist_Settings'] = 'Cette page n\'est accessible que si un paramétrage pour au moins une des sensibilités est activé.';
+
+$lang['LastVisit_Date'] = 'Modifier';
+$lang['Nb_Days'] = 'Notifier';
+
+$lang['Send_Email'] = 'Envoyer email';
+$lang['Update_User'] = 'Mettre &agrave; jour';
+
+$lang['LCAS_Support_txt'] = 'Le support officiel sur ce plugin se fait exclusivement sur ces fils du forum Piwigo:<br>
+<a href="http://fr.piwigo.org/forum/viewtopic.php?pid=158565" onclick="window.open(this.href);return false;">Forum français - http://fr.piwigo.org/forum/viewtopic.php?id=ToDefine</a>
+<br>ou<br>
+<a href="http://fr.piwigo.org/forum/viewtopic.php?pid=158565" onclick="window.open(this.href);return false;">Forum anglais - http://piwigo.org/forum/viewtopic.php?id=ToDefine</a><br><br>
+Egalement disponible, le bugtracker du projet: <a href="http://piwigo.org/bugs/" onclick="window.open(this.href);return false;">http://piwigo.org/bugs/</a>';
+
+
+
+
+
+
+/* UserManager Tab */
+$lang['Registration_Date'] = 'Date d\'enregistrement';
+
+
+/* Mailing */
+$lang['infos_mail %s'] = '%s, voici vos informations pour vous identifier sur la galerie :';
+$lang['User: %s'] = 'Utilisateur : %s';
+$lang['Password: %s'] = 'Mot de passe: %s';
+$lang['Link: %s'] = 'Cliquez sur le lien suivant pour confirmer votre inscription : %s';
+
+
+/* Email confirmation page */
+$lang['title_confirm_mail'] = 'Confirmation de votre inscription';
+$lang['confirm_mail_page_title'] = 'Confirmation d\'inscription';
+
+
+/* Errors and Warnings */
+$lang['LCAS_audit_ok'] = 'Audit OK';
+$lang['Err_audit_no_casse'] = '<b>Ces comptes sont identiques à la casse près :</b> ';
+$lang['Err_audit_username_char'] = '<b>Ce compte contient un ou des caractères interdits :</b> ';
+$lang['Err_audit_email_forbidden'] = '<b>Ce compte contient des domaines de messagerie interdit :</b> ';
+$lang['Err_audit_advise'] = '<b>Vous avez des corrections a faire pour respecter les nouvelles règles que vous avez activées.<br>Utilisez un utilitaire de gestion de base de données pour corriger les comptes utilisateurs directement dans la table ###_USERS si nécessaire.</b><br><br>';
+$lang['LCAS_Empty Author'] = 'Le champs auteur doit être rempli pour enregistrer un commentaire.';
+$lang['reg_err_login5'] = 'ce nom utilisateur est déjà pris, ATTENTION le nom est insensible à la casse (Majuscule = Minuscule).';
+$lang['reg_err_login6'] = 'le nom utilisateur ne doit pas contenir les caractère suivants : ';
+$lang['reg_err_login7'] = 'L\'adresse email est issue d\'un prestataire interdit. Les prestataires d\'adresses email interdits à l\'inscription sont : ';
+$lang['LCAS_empty_pwd'] = '[mot de passe vide]';
+$lang['LCAS_no_update_pwd'] = '[mise à jour du profil sans changement du mot de passe]';
+$lang['invalid_pwd'] = 'Nom utilisateur ou Mot de passe invalide !';
+$lang['No_validation_for_Guest'] = 'Le compte Guest n\'est pas soumis à validation';
+$lang['No_validation_for_default_user'] = 'Le compte par défaut n\'est pas soumis à validation';
+$lang['No_validation_for_Webmaster'] = 'Le compte du Webmaster n\'est pas soumis à validation';
+$lang['No_validation_for_your_account'] = 'Votre compte d\'admin n\'est pas soumis à validation';
+$lang['Database_Error'] = '<b><u>Attention ! Erreur critique d\'intégrité dans votre base de données.</u></b><br><br>Veuillez contrôler l\'intégrité de la table #_user_confirm_mail.';
+
+
+/* Processing messages */
+$lang['%d_Mail_With_Key'] = '%d message avec renouvellement de clé a été envoyé';
+$lang['%d_Mails_With_Key'] = '%d messages avec renouvellement de clé ont été envoyés';
+$lang['%d_Reminder_Sent'] = '%d message de rappel a été envoyé';
+$lang['%d_Reminders_Sent'] = '%d messages de rappel ont été envoyés';
+$lang['%d_Validated_User'] = '%d Utilisateur validé manuellement';
+$lang['%d_Validated_Users'] = '%d Utilisateurs validés manuellement';
+
+
+/* Action button names */
+$lang['Delete_selected'] = 'Supprimer';
+$lang['Mail_without_key'] = 'Rappel sans clé';
+$lang['Mail_with_key'] = 'Rappel avec clé';
+
+
+
+
+// --------- Starting below: New or revised $lang ---- from version 2.12.0 and 2.12.1
+/* Global Configuration Tab */
+$lang['PasswordTest'] = 'Calcul du score';
+/* Ghost Tracker Tab */
+$lang['Tab_GhostTracker'] = 'Ghost Tracker';
+$lang['Reminder'] = 'Email de rappel';
+$lang['Reminder_Sent_OK'] = 'OUI';
+$lang['Reminder_Sent_NOK'] = 'NON';
+/* Errors and Warnings */
+$lang['LCAS_save_config'] ='Configuration enregistrée.';
+$lang['reg_err_login3'] = 'Sécurité : Le mot de passe est obligatoire !';
+$lang['reg_err_login4_%s'] = 'Sécurité : Un système de contrôle calcule un score de complexité sur les mots de passe choisis. La complexité de votre mot de passe est trop faible (score = %s). Veuillez choisir un nouveau mot de passe plus sûre en respectant les règles suivantes :<br>
+- Utiliser des lettres et des chiffres<br>
+- Utiliser des minuscules et des majuscules<br>
+- Augmenter sa longueur (nombre de caractères)<br>
+Le score minimal des mots de passe imposé par l\'administrateur est de : ';
+$lang['No_reminder_for_Guest'] = 'Le compte Guest n\'est pas soumis à recevoir des rappels du GhostTracker';
+$lang['No_reminder_for_default_user'] = 'Le compte par défaut n\'est pas soumis à recevoir des rappels du GhostTracker';
+$lang['No_reminder_for_Webmaster'] = 'Le compte du Webmaster n\'est pas soumis à recevoir des rappels du GhostTracker';
+$lang['No_reminder_for_your_account'] = 'Votre compte d\'admin n\'est pas soumis à recevoir des rappels du GhostTracker';
+/* Action button names */
+$lang['audit'] = 'Auditer les paramètres';
+$lang['submit'] = 'Sauvegarder les paramètres';
+// --------- End: New or revised $lang ---- from version 2.12.0 and 2.12.1
+
+
+// --------- Starting below: New or revised $lang ---- from version 2.12.2
+/* Errors and Warnings */
+$lang['GhostTracker_Init_OK'] = 'Initialisation Ghost Tracker effectuée !';
+/* Action button names */
+$lang['GT_Reset'] = 'Initialisation Ghost Tracker';
+// --------- End: New or revised $lang ---- from version 2.12.2
+
+
+// --------- Starting below: New or revised $lang ---- from version 2.12.8
+/* Errors and Warnings */
+$lang['mail_exclusionlist_error'] = 'Attention ! Vous avez saisi un retour à la ligne en début de liste d\'exclusion des domaines de messagerie (affichée en rouge ci-dessous). Bien que ce retour à la ligne ne soit pas visible, il est tout de même présent et est susceptible de provoquer des dysfonctionnements du plugin. Veuillez resaisir votre liste d\'exclusion en veillant à ne pas commencer par un retour à la ligne.';
+// --------- End: New or revised $lang ---- from version 2.12.8
+
+
+// --------- Starting below: New or revised $lang ---- from version 2.13.0
+/* UserList Tab */
+// --------- End: New or revised $lang ---- from version 2.13.0
+
+
+// --------- Starting below: New or revised $lang ---- from version 2.13.4
+$lang['LCAS_no_unlink'] = 'La fonction \'unlink\' n\'est pas disponible';
+$lang['LCAS_unlink_errors'] = 'Des erreurs ont eu lieu lors de la suppression des fichiers';
+/* Global Configuration Tab */
+$lang['Title_Tab'] = 'LoginCaseAccentsSensitivity - Version: ';
+$lang['LCAS_No_Casse'] = 'Noms d\'utilisateurs : Sensibilité à la casse';
+$lang['LCAS_No_Casse_true'] = ' Activer';
+$lang['LCAS_No_Casse_false'] = ' Désactiver (valeur par défaut)';
+$lang['LCAS_Username_Char'] = 'Noms d\'utilisateurs : Exclusion de certains caractères';
+$lang['LCAS_Username_Char_true'] = ' Interdire les caractères:<br>(utiliser une virgule pour séparer chaque caractère du suivant)<br><br>';
+$lang['LCAS_Username_Char_false'] = ' Tout autoriser (valeur par défaut)';
+$lang['LCAS_Password_Enforced'] = 'Renforcement de la sécurité des mots de passe';
+$lang['LCAS_Password_Enforced_true'] = ' Activer. Score minimum: ';
+$lang['LCAS_Password_Enforced_false'] = ' Désactiver (valeur par défaut)';
+$lang['LCAS_AdminPassword_Enforced'] = 'Application aux administrateurs';
+$lang['LCAS_AdminPassword_Enforced_true'] = ' Activer';
+$lang['LCAS_AdminPassword_Enforced_false'] = ' Désactiver (valeur par défaut)';
+$lang['LCAS_PasswordTest'] = 'Mot de passe test: ';
+$lang['LCAS_ScoreTest'] = 'Résultat: ';
+$lang['LCAS_MailExclusion'] = 'Exclusion des domaines de messagerie';
+$lang['LCAS_MailExclusion_true'] = ' Exclure les domaines suivants:<br>(utiliser une virgule pour séparer chaque domaine du suivant)';
+$lang['LCAS_MailExclusion_false'] = ' Désactiver (valeur par défaut)';
+
+$lang['LCAS_Confirm_grpstat_notice'] = 'Attention : Il est conseillé d\'utiliser soit les groupes, soit les statuts de validation et pas les deux simultanément.';
+$lang['LCAS_No_Confirm_Group'] = 'Pour les utilisateurs n\'ayant pas validé leur inscription<br>';
+$lang['LCAS_Validated_Group'] = 'Pour les utilisateurs ayant validé leur inscription<br>';
+$lang['LCAS_No_Confirm_Status'] = 'Pour les utilisateurs n\'ayant pas validé leur inscription<br>';
+$lang['LCAS_Validated_Status'] = 'Pour les utilisateurs ayant validé leur inscription.<br>';
+$lang['LCAS_ValidationLimit_Info'] = 'Limitation du délai de validation d\'inscription';
+$lang['LCAS_ConfirmMail_TimeOut_true'] = ' Activer. Nombre de jours de délai: ';
+$lang['LCAS_ConfirmMail_TimeOut_false'] = ' Désactiver (valeur par défaut)';
+$lang['LCAS_ConfirmMail_Remail'] = 'Mail de rappel aux inscrits non validés';
+$lang['LCAS_ConfirmMail_Remail_true'] = ' Activer';
+$lang['LCAS_ConfirmMail_Remail_false'] = ' Désactiver (valeur par défaut)';
+$lang['LCAS_ConfirmMail_ReMail_Txt1'] = 'Texte du message de rappel <b><u>avec</u></b> génération d\'une nouvelle clé de validation.';
+$lang['LCAS_ConfirmMail_ReMail_Txt2'] = 'Texte du message de rappel <b><u>sans</u></b> génération d\'une nouvelle clé de validation.';
+
+$lang['LCAS_GhostTracker'] = 'Gestion des visiteurs fantômes (Ghost Tracker)';
+$lang['LCAS_GhostTracker_true'] = ' Activer. Nombre de jours maximum entre deux visites: ';
+$lang['LCAS_GhostTracker_false'] = ' Désactiver (valeur par défaut)';
+$lang['LCAS_GhostTracker_ReminderText'] = 'Texte de rappel personnalisé';
+$lang['LCAS_LastVisit'] = ' Suivi des utilisateurs inscrits';
+$lang['LCAS_LastVisit_true'] = ' Activer';
+$lang['LCAS_LastVisit_false'] = ' Désactiver (valeur par défaut)';
+$lang['LCAS_No_Comment_Anonymous'] = 'Commentaires : pseudo obligatoire pour les non-inscrits';
+$lang['LCAS_No_Comment_Anonymous_true'] = ' Activer';
+$lang['LCAS_No_Comment_Anonymous_false'] = ' Désactiver (valeur par défaut)';
+
+$lang['LCAS_Tips1'] = 'Inscriptions avec validation par email et message d\'avertissement sur la page d\'accueil de Piwigo';
+
+$lang['Tab_UserManager'] = 'Suivi des validations';
+
+/* UserManager Tab */
+$lang['SubTitle3'] = 'Suivi des validations';
+$lang['UserManager_Title'] = 'Suivi des validations';
+/* Ghost Tracker Tab */
+$lang['SubTitle4'] = 'Ghost Tracker';
+$lang['GT_Init'] = 'Initialisation du Ghost Tracker';
+$lang['GhostTracker_Title'] = 'Gestion des visiteurs fantômes';
+$lang['LCAS_GhostTracker_Init'] = 'A première activation de cette fonction, ou à sa réactivation après une longue période pendant laquelle de nouveaux visiteurs se sont inscrits, il convient d\'initialiser ou de réinitialiser le Ghost Tracker. Cette action n\'est à faire qu\'une seule fois après activation ou réactivation de l\'option; à cet effet, cliquez <u>une seule fois</u> sur le bouton d\'initialisation ci-dessous.</b>';
+/* UserList Tab */
+/* Mailing */
+$lang['Add of %s'] = 'Profil créé pour %s';
+$lang['Update of %s'] = 'Mise à jour du profil de %s';
+/* Mailing */
+$lang['Ghost_reminder_of_%s'] = '%s, ceci est un email de rappel.';
+$lang['Reminder_with_key_of_%s'] = '%s, votre clef de validation a expiré';
+$lang['Reminder_without_key_of_%s'] = '%s, votre clef de validation va expirer';
+/* Errors and Warnings */
+$lang['Err_GhostTracker_Settings'] = 'Cette page n\'est accessible que si "Gestion des visiteurs fantômes" est actif dans "Paramétrage des suivis des inscrits et autres options".';
+// --------- End: New or revised $lang ---- from version 2.13.4
+
+
+// --------- Starting below: New or revised $lang ---- from version 2.14.0
+$lang['LCAS_AdminConfMail'] = 'Validation d\'inscription pour les admins';
+$lang['LCAS_Admin_ConfMail_true'] = ' Activer';
+$lang['LCAS_Admin_ConfMail_false'] = ' Désactiver (valeur par défaut)';
+$lang['LCAS_Tips1_txt'] = '
+          <ul>
+            <li>
+            Objectifs:<br>
+            - A son arrivée sur la galerie : Informer le visiteur qu\'il peut s\'inscrire pour accéder aux photos privées<br>
+            - A l\'inscription : Générer un email avec lien direct de validation, informer le nouvel utilisateur de sa non-validation et le rattacher au groupe "Attente"<br>
+            - A la validation : Le passer automatiquement du groupe "Attente" au groupe "Validés", qui lui permet d\'accéder normalement aux catégories privées<br><br>
+            <b>Rappel: En fonctionnement standard, le "Guest" ne voit que les catégories publiques, sans message d\'information.</b>
+            </li><br><br>
+            <li>
+Pré-requis:<br>
+- Une galerie avec tout ou partie des catégories privées, visibles par les seuls utilisateurs inscrits<br>
+- Au moins les 2 groupes d\'utilisateurs Piwigo suivants : "Attente", sans aucune permission sur les catégories privées, et "Validés", avec toutes les permissions sur les catégories privées<br>
+- Le plugin LCAS<br>
+- Le plugin PWG Stuffs, pour l\'ajout d\'un module de type "Bloc personnel"<br>
+- En option, le plugin Extended Description, pour le support multi-langues<br>
+            </li><br><br>
+            <li>
+Réalisation:<br><br>
+A. Dans le plugin LCAS:<br>
+              <ol>
+                <li>Activer la confirmation d\'inscription</li>
+                <li>Saisir un "texte d\'accueil personnalisé" qui sera joint au mail de confirmation d\'inscription. Si le plugin Extended Description est activé, les balises de langues peuvent être utilisées</li>
+                <li>Sélectionner le groupe "Attente" à la rubrique "Pour les utilisateurs n\'ayant pas validé leur inscription"</li>
+                <li>Sélectionner le groupe "Validés" à la rubrique "Pour les utilisateurs ayant validé leur inscription"</li>
+                <li>Enregistrer la configuration du plugin</li>
+              </ol>
+<br>
+B. Dans le plugin PWG Stuffs:<br>
+              <ol>
+                <li>Ajouter un nouveau module de type "Bloc personnel : Affiche un bloc personnel (un édito par exemple)"</li>
+                <li>Configurer le module, en indiquant son titre (ex : "Inscription en attente de validation") et sa description, et cocher uniquement "Attente" dans la liste des groupes autorisés</li>
+                <li>Compléter le contenu du module avec le texte du message d\'information qui sera affiché aux utilisateurs non validés. Comme dans LCAS, les balises de langues peuvent être utilisées si le plugin Extended Description est activé</li>
+                <li>Cocher "Afficher le module sur la page d\'accueil du site"</li>
+                <li>Valider la configuration du module</li>
+              </ol>
+            </li>
+          </ul>';
+// --------- End: New or revised $lang ---- from version 2.14.0
+
+
+// --------- Starting below: New or revised $lang ---- from version 2.15.0
+$lang['LCAS_confirmmail_custom_Txt1'] = 'Texte de la page de confirmation - Confirmation acceptée';
+$lang['LCAS_confirmmail_custom_Txt2'] = 'Texte de la page de confirmation - Confirmation rejetée';
+$lang['Err_UserManager_Settings'] = 'Cette page n\'est accessible que si "Confirmation d\'inscription" est actif et si un groupe de visiteurs non validés est configuré dans le "Paramétrage des confirmations et validations d\'inscriptions".';
+// --------- End: New or revised $lang ---- from version 2.15.0
+
+
+// --------- Starting below: New or revised $lang ---- from version 2.15.1
+$lang['reg_err_mail_address_dbl'] = 'Cette adresse email est déjà utilisée.';
+// --------- End: New or revised $lang ---- from version 2.15.1
+
+
+// --------- Starting below: New or revised $lang ---- from version 2.15.4
+$lang['Force_Validation'] = 'Validation manuelle';
+$lang['LCAS_Confirm_Mail_local'] = ' Activer - Validation par l\'administrateur (pas d\'envoi de clé de validation)';
+$lang['LCAS_RedirToProfile'] = 'Redirection vers la page "Personnalisation"';
+$lang['LCAS_RedirToProfile_false'] = ' Désactiver (valeur par défaut)';
+$lang['LCAS_RedirToProfile_true'] = ' Activer';
+// --------- End: New or revised $lang ---- from version 2.15.4
+?>
Index: /extensions/LCAS/trunk/language/index.php
===================================================================
--- /extensions/LCAS/trunk/language/index.php	(revision 8141)
+++ /extensions/LCAS/trunk/language/index.php	(revision 8141)
@@ -0,0 +1,33 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | PhpWebGallery - a PHP based picture gallery                           |
+// | Copyright (C) 2002-2003 Pierrick LE GALL - pierrick@phpwebgallery.net |
+// | Copyright (C) 2003-2007 PhpWebGallery Team - http://phpwebgallery.net |
+// +-----------------------------------------------------------------------+
+// | file          : $Id: index.php 1912 2007-03-16 06:30:07Z rub $
+// | last update   : $Date: 2007-03-16 07:30:07 +0100 (ven, 16 mar 2007) $
+// | last modifier : $Author: rub $
+// | revision      : $Revision: 1912 $
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: /extensions/LCAS/trunk/main.inc.php
===================================================================
--- /extensions/LCAS/trunk/main.inc.php	(revision 8141)
+++ /extensions/LCAS/trunk/main.inc.php	(revision 8141)
@@ -0,0 +1,142 @@
+<?php
+/*
+Plugin Name: LCAS
+Version: 0.0.1
+Description: Allow to disable login/register name to be sensible to the case/accents
+Plugin URI: http://fr.piwigo.org/forum/viewtopic.php?pid=158563
+Author: Nicco, Eric, LucMorizur, Whiler
+Author URI: http://gallery-nicco.no-ip.org, http://www.infernoweb.net, http://blogs.wittwer.fr/whiler/
+*/
+
+/* History:  LCAS_PATH.'Changelog.txt.php' */
+
+/*
+ ***** TODO List *****
+See project bugtracker: http://piwigo.org/bugs/my_view_page.php
+*/
+
+if (!defined('PHPWG_ROOT_PATH')) die('Hacking attempt!');
+if (!defined('LCAS_DIR')) define('LCAS_DIR' , basename(dirname(__FILE__)));
+if (!defined('LCAS_PATH')) define('LCAS_PATH' , PHPWG_PLUGINS_PATH.basename(dirname(__FILE__)).'/');
+
+include_once (LCAS_PATH.'include/constants.php');
+include_once (LCAS_PATH.'include/functions.inc.php');
+
+load_language('plugin.lang', LCAS_PATH);
+
+
+/* Plugin admin */
+add_event_handler('get_admin_plugin_menu_links', 'LCAS_admin_menu');
+
+function LCAS_admin_menu($menu)
+{
+// +-----------------------------------------------------------------------+
+// |                      Getting plugin name                              |
+// +-----------------------------------------------------------------------+
+  $plugin =  LCAS_PluginInfos(LCAS_PATH);
+  $name = $plugin['name'];
+  
+  array_push($menu,
+    array(
+      'NAME' => $name,
+      'URL'  => get_admin_plugin_menu_link(LCAS_PATH.'/admin/LCAS_admin.php')
+    )
+  );
+
+  return $menu;
+}
+
+/* User creation */
+add_event_handler('register_user', 'LCAS_Adduser');
+
+function LCAS_Adduser($register_user)
+{
+  global $conf;
+
+  $conf_LCAS= unserialize($conf['LoginCaseAccentsSensitivity']);
+
+}
+
+
+/* User deletion */
+add_event_handler('delete_user', 'LCAS_Deluser');
+
+function LCAS_Deluser($user_id)
+{
+
+}
+
+
+// Check users registration
+add_event_handler('register_user_check', 'LCAS_RegistrationCheck', EVENT_HANDLER_PRIORITY_NEUTRAL, 2);
+
+function LCAS_RegistrationCheck($errors, $user)
+{
+  global $conf;
+
+}
+
+
+if (script_basename() == 'profile')
+{
+  add_event_handler('loc_begin_profile', 'LCAS_Profile_Init');
+
+  function LCAS_Profile_Init()
+  {
+
+  }
+}
+
+
+// RedirectToProfile - Thx to LucMorizur
+// redirects a visitor (except for admins, webmasters and generic statuses) to his
+// profile.php page
+//
+// no variable, no return
+add_event_handler('login_success', 'LCAS_RedirectToProfile');
+
+function LCAS_RedirectToProfile()
+{
+  global $conf, $user;
+  
+  $conf_LCAS= unserialize($conf['LoginCaseAccentsSensitivity']);
+  
+  $query ='
+SELECT user_id, status
+FROM '.USER_INFOS_TABLE.'
+WHERE user_id = '.$user['id'].'
+;';
+  $data = pwg_db_fetch_assoc(pwg_query($query));
+  
+  if ($data['status'] <> "admin" and $data['status'] <> "webmaster" and $data['status'] <> "generic")
+  {
+    if ((isset($conf_LCAS[21]) and $conf_LCAS[21] == 'true'))
+    {
+      $user_idsOK = array();
+      if (!check_consult($user['id'], $user_idsOK))
+        redirect(PHPWG_ROOT_PATH.'profile.php');
+    }
+  }
+}
+
+
+add_event_handler('init', 'LCAS_InitPage');
+/* *** Important ! This is necessary to make email exclusion work in admin's users management panel *** */
+function LCAS_InitPage()
+{
+  load_language('plugin.lang', LCAS_PATH);
+  global $conf, $template, $page, $lang, $errors;
+
+  $conf_LCAS= unserialize($conf['LoginCaseAccentsSensitivity']);
+
+/* Admin user management */
+  if (script_basename() == 'admin' and isset($_GET['page']) and $_GET['page'] == 'user_list')
+  {
+    if (isset($_POST['submit_add']))
+    {
+
+    }
+  }
+}
+
+?>
Index: /extensions/LCAS/trunk/maintain.inc.php
===================================================================
--- /extensions/LCAS/trunk/maintain.inc.php	(revision 8141)
+++ /extensions/LCAS/trunk/maintain.inc.php	(revision 8141)
@@ -0,0 +1,70 @@
+<?php
+
+if(!defined('LCAS_PATH'))
+{
+  define('LCAS_PATH' , PHPWG_PLUGINS_PATH.basename(dirname(__FILE__)).'/');
+}
+if (!defined('LCAS_ROOT'))
+{
+  define('LCAS_ROOT', dirname(__FILE__).'/');
+}
+
+include_once (LCAS_PATH.'include/constants.php');
+include_once (LCAS_PATH.'include/functions.inc.php');
+
+
+function plugin_install()
+{
+	global $conf;
+	
+  $default1 = array('false','false');
+
+  $q = '
+INSERT INTO '.CONFIG_TABLE.' (param, value, comment)
+VALUES ("LoginCaseAccentsSensitivity","'.addslashes(serialize($default1)).'","LCAS parameters")
+  ;';
+  pwg_query($q);
+
+}
+
+
+function plugin_activate()
+{
+  global $conf;
+
+/* Cleaning obsolete files */
+/* *********************** */
+  LCAS_clean_obsolete_files();
+  
+  include_once (LCAS_PATH.'include/upgradedb.inc.php');
+
+	$query = '
+SELECT param
+  FROM '.CONFIG_TABLE.'
+WHERE param = "LoginCaseAccentsSensitivity"
+;';
+  $count1 = pwg_db_num_rows(pwg_query($query));
+  
+  if ($count1 == 1)
+  {
+		load_conf_from_db('param like \'LoginCaseAccentsSensitivity\'');
+  }
+}
+
+
+function plugin_uninstall()
+{
+  global $conf;
+
+  if (isset($conf['LoginCaseAccentsSensitivity']))
+  {
+    $q = '
+DELETE FROM '.CONFIG_TABLE.'
+WHERE param="LoginCaseAccentsSensitivity"
+;';
+
+    pwg_query($q);
+  }
+
+}
+?>
Index: /extensions/LCAS/trunk/template/ConfirmMail.tpl
===================================================================
--- /extensions/LCAS/trunk/template/ConfirmMail.tpl	(revision 8141)
+++ /extensions/LCAS/trunk/template/ConfirmMail.tpl	(revision 8141)
@@ -0,0 +1,27 @@
+{html_head}<link rel="stylesheet" type="text/css" href="template/confmail.css">{/html_head}
+
+<div id="content" class="content">
+  <div class="titrePage">
+    <ul class="categoryActions">
+      <li>
+    {if $REDIRECT}
+        <a href="{$ROOT_URL}identification.php" title="{'return to homepage'|@translate}">
+          <img src="{$ROOT_URL}{$themeconf.icon_dir}/home.png" class="button" alt="{'home'|@translate}">
+        </a>
+    {else}
+        <a href="{$GALLERY_URL}" title="{'return to homepage'|@translate}">
+          <img src="{$ROOT_URL}{$themeconf.icon_dir}/home.png" class="button" alt="{'home'|@translate}">
+        </a>
+    {/if}
+      </li>
+    </ul>
+    <h2 class="confmail">{'title_confirm_mail'|@translate}</h2>
+  </div>
+  <ul>
+  {if $STATUS == true}
+    <div class="infos">{$CONFIRM_MAIL_MESSAGE}</div>
+  {elseif $STATUS == false}
+    <div class="errors">{$CONFIRM_MAIL_MESSAGE}</div>
+  {/if}
+  </ul>
+</div>
Index: /extensions/LCAS/trunk/template/confmail.css
===================================================================
--- /extensions/LCAS/trunk/template/confmail.css	(revision 8141)
+++ /extensions/LCAS/trunk/template/confmail.css	(revision 8141)
@@ -0,0 +1,31 @@
+H2.confmail
+{
+  text-align: center;
+  font-size: large;
+  color: orange;
+}
+
+/**
+ * Informations box
+ */
+.errors, .infos{
+  margin: 5px;
+  padding: 50px 50px 10px 10px;
+  font-weight:bold;
+  background-repeat: no-repeat;
+  background-position: 5px 5px;
+  padding:15px 60px 0pt 60px;
+  min-height: 54px;
+}
+
+.errors {
+  color: #f22;
+  background-color: #ffd5dc;
+  background-image: url(icon/errors.png);
+}
+
+.infos {
+  color: #0a0;
+  background-color:#c2f5c2;
+  background-image: url(icon/infos.png);
+}
Index: /extensions/LCAS/trunk/template/icon/index.php
===================================================================
--- /extensions/LCAS/trunk/template/icon/index.php	(revision 8141)
+++ /extensions/LCAS/trunk/template/icon/index.php	(revision 8141)
@@ -0,0 +1,33 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | PhpWebGallery - a PHP based picture gallery                           |
+// | Copyright (C) 2002-2003 Pierrick LE GALL - pierrick@phpwebgallery.net |
+// | Copyright (C) 2003-2007 PhpWebGallery Team - http://phpwebgallery.net |
+// +-----------------------------------------------------------------------+
+// | file          : $Id: index.php 1912 2007-03-16 06:30:07Z rub $
+// | last update   : $Date: 2007-03-16 07:30:07 +0100 (ven, 16 mar 2007) $
+// | last modifier : $Author: rub $
+// | revision      : $Revision: 1912 $
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: /extensions/LCAS/trunk/template/index.php
===================================================================
--- /extensions/LCAS/trunk/template/index.php	(revision 8141)
+++ /extensions/LCAS/trunk/template/index.php	(revision 8141)
@@ -0,0 +1,33 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | PhpWebGallery - a PHP based picture gallery                           |
+// | Copyright (C) 2002-2003 Pierrick LE GALL - pierrick@phpwebgallery.net |
+// | Copyright (C) 2003-2007 PhpWebGallery Team - http://phpwebgallery.net |
+// +-----------------------------------------------------------------------+
+// | file          : $Id: index.php 1912 2007-03-16 06:30:07Z rub $
+// | last update   : $Date: 2007-03-16 07:30:07 +0100 (ven, 16 mar 2007) $
+// | last modifier : $Author: rub $
+// | revision      : $Revision: 1912 $
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
