Index: /extensions/LCAS/tags/0.0.0RC1/admin/LCAS_admin.php
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/admin/LCAS_admin.php	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/admin/LCAS_admin.php	(revision 9646)
@@ -0,0 +1,219 @@
+<?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__)).'/');
+if (!defined('LCAS_PATH_ABS')) define('LCAS_PATH_ABS' ,  dirname(__FILE__).'/');
+
+//ini_set('error_reporting', E_ALL);
+//ini_set('display_errors', true);
+
+include_once(PHPWG_ROOT_PATH.'include/constants.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+$my_base_url = get_admin_plugin_menu_link(__FILE__);
+
+load_language('plugin.lang', LCAS_PATH);
+load_language('help/plugin.lang', LCAS_PATH);
+
+$error = array();
+
+/* Not useful */
+  /*$t = pwg_db_fetch_row(pwg_query('
+  SELECT `value`
+  FROM `'.CONFIG_TABLE.'`
+  WHERE `param` = "LoginCaseAccentsSensitivity"
+  LIMIT 1;
+'));
+
+$conf['LoginCaseAccentsSensitivity'] = $t[0];*/
+
+// +-----------------------------------------------------------------------+
+// |                      Getting plugin version                           |
+// +-----------------------------------------------------------------------+
+$plugin =  LCAS_PluginInfos(LCAS_PATH);
+$version = $plugin['version'];
+
+	if (isset($_POST['submit']) and isset($_POST['LCAS_Option']) and isset($_POST['LCAS_Mail']))
+  {
+
+/* General configuration settings */
+		$_POST['LCAS_MailText'] = str_replace('\"', '"', str_replace("\'", "'", str_replace("\\\\", "\\", $_POST['LCAS_MailText'])));
+    
+    $newconf_LCAS= array(
+      $_POST['LCAS_Option'],
+      $_POST['LCAS_Mail'],
+      $_POST['LCAS_MailText']);
+
+    $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']);
+  
+  if (isset($conf_LCAS[0]))
+  {
+    $case_ins = ($conf_LCAS[0] == '1' or $conf_LCAS[0] == '3');
+    $acc_ins = ($conf_LCAS[0] == '2' or $conf_LCAS[0] == '3');
+
+    if ($case_ins or $acc_ins)
+    {
+
+// +-----------------------------------------------------------------------+
+// |                               user list                               |
+// +-----------------------------------------------------------------------+
+
+      $page['all_users'] = LCAS_get_user_list($conf_LCAS[0]);
+
+// +-----------------------------------------------------------------------+
+// |                           initialization                              |
+// +-----------------------------------------------------------------------+
+
+      $lcas_UserToUpdate = -1;
+      if ((isset($_POST['UserToUpdate'])) && ($_POST['UserToUpdate'] != -1)) {
+        $lcas_UserToUpdate = $_POST['UserToUpdate'];
+        
+        if ((isset($_POST['user-'.$lcas_UserToUpdate])) && ($_POST['user-'.$lcas_UserToUpdate] != '')) {
+
+          // Check if username already exists
+        	$lcas_previous_compare_user = LCAS_change_case($_POST['user-'.$lcas_UserToUpdate], $conf_LCAS[0]);
+
+          $LCAS_users = array();
+
+          // This is a dirty request - Works fine for small number of users but could be unoptimized for large number of users
+          $query = '
+            SELECT '.$conf['user_fields']['username'].' AS username
+            FROM '.USERS_TABLE.';';
+          
+          while ($r = pwg_db_fetch_assoc(pwg_query($query)))
+          {
+            $LCAS_users[$r['username']] = LCAS_change_case($r['username'], $conf_LCAS[0]);
+          }
+            
+          $users_found = array_keys($LCAS_users, $lcas_previous_compare_user);
+
+          if (count($users_found) < 1)
+          {
+            // Get old username before update - Usefull for user notification if is set
+            $query ='
+              SELECT username
+              FROM '.USERS_TABLE.'
+              WHERE id = '.$lcas_UserToUpdate.'
+            ;';
+
+            $data = pwg_db_fetch_assoc(pwg_query($query));
+  
+            // Username update
+            $query = '
+              UPDATE '.USERS_TABLE.'
+              SET username="'.addslashes($_POST['user-'.$lcas_UserToUpdate]).'"
+              WHERE id='.$lcas_UserToUpdate.'
+              LIMIT 1
+              ;';
+
+            pwg_query($query);
+
+            if (isset($conf_LCAS[1]) and $conf_LCAS[1] == 'true')
+            {
+              LCAS_SendMail($lcas_UserToUpdate, $data['username'], $_POST['user-'.$lcas_UserToUpdate]);
+            }
+
+            // Reloading conflict table content
+            $page['all_users'] = LCAS_get_user_list($conf_LCAS[0]);
+            array_push($page['infos'], l10n('LCAS_Info_userlist_username_renamed'));
+          }
+          else
+          {
+            // Username already exists
+            array_push($page['errors'], l10n('LCAS_Err_Userlist_New_Username_Exists').'<br>"'.$lcas_previous_compare_user.'"');
+          }
+        }
+        else {
+          // Username is empty
+          array_push($page['errors'], l10n('LCAS_Err_Userlist_Empty_New_Username'));
+        }
+      }
+
+// +-----------------------------------------------------------------------+
+// |                               user list                               |
+// +-----------------------------------------------------------------------+
+
+      $lcas_previous_compare_user = '';
+      $visible_user_list          = array();
+      foreach ($page['all_users'] as $local_user)
+      {
+        if ($lcas_previous_compare_user != $local_user['transformed']) {
+          $display = 'orange';
+          $lcas_previous_compare_user = $local_user['transformed'];
+        }
+        else {
+          $display = '';
+        }
+
+        $template->append(
+          'users',
+          array(
+            'ID'          => $local_user['id'],
+            'USERNAME'    => stripslashes($local_user['username']),
+            'COMPARE'     => stripslashes($local_user['transformed']),
+            'EMAIL'       => get_email_address_as_display_text($local_user['email']),
+            'DISPLAY'     => $display,
+          )
+        );
+      }
+      
+    }
+  }
+
+
+// +-----------------------------------------------------------------------+
+// |                           templates init                              |
+// +-----------------------------------------------------------------------+
+  $template->assign(
+    array(
+    'LCAS_VERSION'                  => $version,
+    'LCAS_PATH'                     => LCAS_PATH,
+    'PHPWG_VERSION'                 => PHPWG_VERSION,
+    'LCAS_PATH_ABS'                 => LCAS_PATH_ABS,
+		'LCAS_Option'                   => $conf_LCAS[0],
+		'LCAS_MAIL_TRUE'                => $conf_LCAS[1] == 'true'  ? 'checked = "checked"' : '' ,
+		'LCAS_MAIL_FALSE'               => $conf_LCAS[1] == 'false' ? 'checked = "checked"' : '' ,
+    'LCAS_MAILTEXT'                 => $conf_LCAS[2]
+    )
+  );
+
+
+// +-----------------------------------------------------------------------+
+// |                             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');
+
+?>
Index: /extensions/LCAS/tags/0.0.0RC1/admin/index.php
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/admin/index.php	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/admin/index.php	(revision 9646)
@@ -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/tags/0.0.0RC1/admin/template/global.tpl
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/admin/template/global.tpl	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/admin/template/global.tpl	(revision 9646)
@@ -0,0 +1,218 @@
+{html_head}
+{if PHPWG_VERSION < 2.2 }
+  {include file= $LCAS_PATH_ABS|@cat:'template/header21.tpl'}
+{else}
+  {include file= $LCAS_PATH_ABS|@cat:'template/header22.tpl'}
+{/if}
+
+<link rel="stylesheet" type="text/css" href="{$LCAS_PATH}admin/template/lcas.css">
+{/html_head}
+
+<script type="text/javascript">
+var Personalized_not_allowed = {if $Personalized_not_allowed}true{else}false{/if};
+{literal}
+jQuery().ready(function(){
+  jQuery('.cluetip').cluetip(
+  {
+    width: 550,
+    splitTitle: '|'
+  });
+});
+
+function LCAS_blockToggleDisplay( headerId, contentId )
+{
+  if (typeof(headerId)=='string')
+  {
+   if ( headerId.length>  1)
+       blockToggleDisplay(headerId, contentId) ;
+      document.getElementById("nb_para").value =headerId ;
+      document.getElementById("nb_para2").value =contentId;
+  }
+}
+jQuery(document).ready(function() 
+    {
+      jQuery("#sorting")
+      .tablesorter({sortList:[[3,0]], headers: { 1: { sorter: false }, 4: { sorter: false }, 5: { sorter: false } } })
+      .tablesorterPager({container: jQuery("#pager"), positionFixed: false, size: 20, totalPages: 0});
+      if (Personalized_not_allowed) {
+        jQuery('#LCAS_id_Option0').attr('disabled', 'disabled');
+        jQuery('#LCAS_id_Opt0').attr("title", "{/literal}{'Personalized not allowed tooltip'|@translate}{literal}");
+      }
+    } 
+);
+function UpdateAUser(UserId) {
+	document.UserList.UserToUpdate.value=UserId;document.UserList.submit();
+}
+{/literal}
+</script>
+
+<div class="titrePage">
+  <h2>{'LCAS_Title_Tab'|@translate} {$LCAS_VERSION}<br>{'LCAS_SubTitle_Global'|@translate}</h2>
+</div>
+
+<form method="post" action="" class="general">
+
+  <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_sensitiveTitle'|translate}|{'LCAS_sensitiveTitle_d'|translate}">
+        {'LCAS_Title_Global'|@translate}
+      </span>
+    </div>
+  
+    <div id="Config2" class="instructionBlockContent" style="display:block">
+      <fieldset>
+        <ul>
+          <li>
+            <label class="cluetip" title="{'LCAS_caseSensitiveTitle'|translate}|{'LCAS_caseSensitiveTitle_d'|translate}">
+              {'LCAS option'|@translate}
+            </label>
+            <br><br>
+            <label for = "LCAS_id_Option0" id ="LCAS_id_Opt0">
+              <input type="radio" value="0" {if $LCAS_Option == '0'}checked="checked"{/if} id="LCAS_id_Option0" name="LCAS_Option">
+              {'LCAS_Option0'|@translate}<br>
+            </label>
+            <label for = "LCAS_id_Option1" id ="LCAS_id_Opt1">
+              <input type="radio" value="1" {if $LCAS_Option == '1'}checked="checked"{/if} id="LCAS_id_Option1" name="LCAS_Option">
+              {'LCAS_Option1'|@translate}<br>
+            </label>
+            <label for = "LCAS_id_Option2" id ="LCAS_id_Opt2">
+              <input type="radio" value="2" {if $LCAS_Option == '2'}checked="checked"{/if} id="LCAS_id_Option2" name="LCAS_Option">
+              {'LCAS_Option2'|@translate}<br>
+            </label>
+            <label for = "LCAS_id_Option3" id ="LCAS_id_Opt3">
+              <input type="radio" value="3" {if $LCAS_Option == '3'}checked="checked"{/if} id="LCAS_id_Option3" name="LCAS_Option">
+              {'LCAS_Option3'|@translate}<br>
+            </label>
+            {* <!-- Shall be implemented later
+            <label for = "LCAS_id_Option4" id ="LCAS_id_Opt4">
+              <input type="radio" value="4" {if $LCAS_Option == '4'}checked="checked"{/if} id="LCAS_id_Option4" name="LCAS_Option">
+              {'LCAS_Option4'|@translate}<br>{if $Personalized_not_allowed}{'Personalized not allowed explanation'|@translate}{/if}<br>
+            </label>
+            --> *}
+            <br><br>
+          </li>
+
+          <li>
+            <label class="cluetip" title="{'LCAS_MailTitle'|translate}|{'LCAS_MailTitle_d'|translate}">
+              {'LCAS_Mail'|@translate}
+            </label>
+            <br><br>
+              <input type="radio" value="false" {$LCAS_MAIL_FALSE} name="LCAS_Mail">
+                {'LCAS_DisableOption'|@translate}<br>
+              <input type="radio" value="true" {$LCAS_MAIL_TRUE} name="LCAS_Mail">
+                {'LCAS_EnableOption'|@translate}<br>
+              <br><br>
+
+              <ul>
+                <li>
+                  <label class="cluetip" title="{'LCAS_Email_Customization'|translate}|{'LCAS_Email_Customization_d'|translate}">
+                    {'LCAS_MailText'|@translate}
+                  </label>
+                <br><br>
+                  <textarea class="LCAS_Mailtextfields" name="LCAS_MailText" id="LCAS_MailText" rows="10" {$TAG_INPUT_ENABLED}>{$LCAS_MAILTEXT}</textarea>
+                <br><br>
+                </li>
+              </ul>
+          </li>
+        </ul>
+      </fieldset>
+	    <div style="text-align: center;"><input class="submit" type="submit" value="{'submit'|@translate}" name="submit" {$TAG_INPUT_ENABLED}></div>
+    </div>
+  </div>
+
+</form>
+
+<br><br>
+
+<div id="usersToBeUpdated" class="instructionBlock" >
+
+  <div id="usersToBeUpdated_header" class="instructionBlockHeader">
+    <span class="cluetip" title="{'LCAS_userlistTitle'|translate}|{'LCAS_userlistTitle_d'|translate}">
+      {'LCAS_UserList_Title'|@translate}
+    </span>
+  </div>
+  <div id="Config2" class="instructionBlockContent" style="display:block">
+		<fieldset>
+		  <form method="post" name="UserList" id="UserList" action="" class="general">
+			<input type="hidden" id="UserToUpdate" name="UserToUpdate" value="-1">
+		{if count($users) > 0}
+		      <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>{'LCAS_Compare_value_h'|@translate}</th>
+		            <th>{'LCAS_Update_h'|@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><input class="LCAS_textfields" type="text" name="user-{$user.ID}" id="user-{$user.ID}" value="{$user.USERNAME}"></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>
+		{if $user.DISPLAY == 'orange'}
+		            <td style="color:orange;text-align:center;">{$user.COMPARE}</td>
+		{else}
+		            <td style="text-align:center;">{$user.COMPARE}</td>
+		{/if}
+		            <td style="text-align:center;"><a href="javascript:UpdateAUser({$user.ID});">{'LCAS_Update_User'|@translate}</a></td>
+		            {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>
+		{else}
+		<div>
+			{'LCAS_No_User'|@translate}
+		</div>
+		{/if}
+		</form>
+		</fieldset>
+
+  </div>
+</div>
+
+<br><br>
+
+<div id="PluginSupport" class="instructionBlock" >
+  <div id="PluginSupport_header" class="instructionBlockHeader">
+    <span>
+      {'LCAS_PluginSupport'|@translate}
+    </span>
+  </div>
+  <div id="Config2" class="instructionBlockContent" style="display:block">
+    <fieldset>
+      {'LCAS_Support_txt'|@translate}
+    </fieldset>
+  </div>
+</div>
+
+<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/tags/0.0.0RC1/admin/template/header21.tpl
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/admin/template/header21.tpl	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/admin/template/header21.tpl	(revision 9646)
@@ -0,0 +1,4 @@
+{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"}
Index: /extensions/LCAS/tags/0.0.0RC1/admin/template/header22.tpl
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/admin/template/header22.tpl	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/admin/template/header22.tpl	(revision 9646)
@@ -0,0 +1,4 @@
+{combine_script id='jquery' path='themes/default/js/jquery.min.js'}
+{combine_script id='jquery.cluetip' require='jquery' path='themes/default/js/plugins/jquery.cluetip.packed.js'}
+{combine_script id='jquery.tablesorter' require='jquery' path=$LCAS_PATH|@cat:'admin/template/js/jquery.tablesorter.min.js'}
+{combine_script id='jquery.tablesorter.pager' require='jquery' path=$LCAS_PATH|@cat:'admin/template/js/jquery.tablesorter.pager.js'}
Index: /extensions/LCAS/tags/0.0.0RC1/admin/template/icon/index.php
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/admin/template/icon/index.php	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/admin/template/icon/index.php	(revision 9646)
@@ -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/tags/0.0.0RC1/admin/template/index.php
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/admin/template/index.php	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/admin/template/index.php	(revision 9646)
@@ -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/tags/0.0.0RC1/admin/template/js/jquery-latest.js
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/admin/template/js/jquery-latest.js	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/admin/template/js/jquery-latest.js	(revision 9646)
@@ -0,0 +1,154 @@
+/*!
+ * jQuery JavaScript Library v1.4.2
+ * http://jquery.com/
+ *
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2010, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Sat Feb 13 22:33:48 2010 -0500
+ */
+(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
+e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=
+j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
+"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
+true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
+Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
+(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
+a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
+"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
+function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
+c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
+L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
+"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
+a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
+d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
+a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
+!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
+true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML="   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
+parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
+false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
+s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
+applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
+else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,
+a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===
+w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
+cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",
+i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",
+" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=
+this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=
+e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=
+c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
+a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
+function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");
+k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
+C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=
+null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=
+e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
+f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;
+if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
+d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,
+"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=
+a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,
+isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=
+{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};
+if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",
+e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
+"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
+d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&
+!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},
+toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,
+u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),
+function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];
+if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
+t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
+g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];
+for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-
+1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
+CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
+relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=
+l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];
+h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
+CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,
+g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
+text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
+setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=
+h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=
+m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
+"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,
+h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||
+!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=
+h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&
+q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";
+if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
+(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
+function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,
+gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
+c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
+{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===
+"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
+d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
+a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
+1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?
+a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
+c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
+wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
+prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
+this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
+return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
+""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
+this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||
+u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===
+1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
+return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",
+""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=
+c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?
+c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=
+function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=
+Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,
+"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=
+a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=
+a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==
+"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},
+serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),
+function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,
+global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&
+e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?
+"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===
+false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=
+false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",
+c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||
+d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);
+g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===
+1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===
+"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;
+if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");
+this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],
+"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},
+animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=
+j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);
+this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===
+"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||
+c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;
+this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=
+this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,
+e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||
+c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?
+function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=
+this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;
+k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&
+f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
+a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);
+c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,
+d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-
+f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":
+"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in
+e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
Index: /extensions/LCAS/tags/0.0.0RC1/admin/template/js/jquery.metadata.js
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/admin/template/js/jquery.metadata.js	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/admin/template/js/jquery.metadata.js	(revision 9646)
@@ -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/tags/0.0.0RC1/admin/template/js/jquery.tablesorter.js
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/admin/template/js/jquery.tablesorter.js	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/admin/template/js/jquery.tablesorter.js	(revision 9646)
@@ -0,0 +1,1031 @@
+/*
+ * 
+ * TableSorter 2.0 - Client-side table sorting with ease!
+ * Version 2.0.5b
+ * @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 column headers.
+ * 
+ * @example $('table').tablesorter({ headers: { 0: { sorter: false}, 1: {sorter: false} } });
+ *          
+ * @desc Create a tablesorter interface and disableing the first and second  column headers.
+ *      
+ * 
+ * @example $('table').tablesorter({ headers: { 0: {sorter:"integer"}, 1: {sorter:"currency"} } });
+ * 
+ * @desc Create a tablesorter interface and set a column parser for the first
+ *       and second 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 Boolean sortLocaleCompare (optional) Boolean flag indicating whatever
+ *         to use String.localeCampare method or not. Default set to true.
+ * 
+ * 
+ * @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",
+                cssChildRow: "expand-child",
+                sortInitialOrder: "asc",
+                sortMultiSortKey: "shiftKey",
+                sortForce: null,
+                sortAppend: null,
+                sortLocaleCompare: true,
+                textExtraction: "simple",
+                parsers: {}, widgets: [],
+                widgetZebra: {
+                    css: ["even", "odd"]
+                }, headers: {}, widthFixed: false,
+                cancelSelection: true,
+                sortList: [],
+                headerList: [],
+                dateFormat: "us",
+                decimal: '/\.|\,/g',
+                onRenderHeader: null,
+                selectorHeaders: 'thead th',
+                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 = "";
+                }
+
+                if (table.tBodies.length == 0) return; // In the case of empty tables
+                var rows = table.tBodies[0].rows;
+
+                if (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, rows, -1, 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, rows, rowIndex, cellIndex) {
+                var l = parsers.length,
+                    node = false,
+                    nodeValue = false,
+                    keepLooking = true;
+                while (nodeValue == '' && keepLooking) {
+                    rowIndex++;
+                    if (rows[rowIndex]) {
+                        node = getNodeFromRowAndCellIndex(rows, rowIndex, cellIndex);
+                        nodeValue = trimAndGetNodeText(table.config, node);
+                        if (table.config.debug) {
+                            log('Checking if value was empty on row:' + rowIndex);
+                        }
+                    } else {
+                        keepLooking = false;
+                    }
+                }
+                for (var i = 1; i < l; i++) {
+                    if (parsers[i].is(nodeValue, table, node)) {
+                        return parsers[i];
+                    }
+                }
+                // 0 is always the generic parser (text)
+                return parsers[0];
+            }
+
+            function getNodeFromRowAndCellIndex(rows, rowIndex, cellIndex) {
+                return rows[rowIndex].cells[cellIndex];
+            }
+
+            function trimAndGetNodeText(config, node) {
+                return $.trim(getElementText(config, node));
+            }
+
+            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 = [];
+
+                    // if this is a child row, add it to the last row's children and
+                    // continue to the next row
+                    if (c.hasClass(table.config.cssChildRow)) {
+                        cache.row[cache.row.length - 1] = cache.row[cache.row.length - 1].add(c);
+                        // go to the next for loop
+                        continue;
+                    }
+
+                    cache.row.push(c);
+
+                    for (var j = 0; j < totalCells; ++j) {
+                        cols.push(parsers[j].format(getElementText(table.config, c[0].cells[j]), table, c[0].cells[j]));
+                    }
+
+                    cols.push(cache.normalized.length); // 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) {
+
+                var text = "";
+
+                if (!node) return "";
+
+                if (!config.supportsTextContent) config.supportsTextContent = node.textContent || false;
+
+                if (config.textExtraction == "simple") {
+                    if (config.supportsTextContent) {
+                        text = node.textContent;
+                    } else {
+                        if (node.childNodes[0] && node.childNodes[0].hasChildNodes()) {
+                            text = node.childNodes[0].innerHTML;
+                        } else {
+                            text = node.innerHTML;
+                        }
+                    }
+                } else {
+                    if (typeof(config.textExtraction) == "function") {
+                        text = config.textExtraction(node);
+                    } else {
+                        text = $(node).text();
+                    }
+                }
+                return text;
+            }
+
+            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++) {
+                    var pos = n[i][checkCell];
+
+                    rows.push(r[pos]);
+
+                    if (!table.config.appender) {
+
+                        //var o = ;
+                        var l = r[pos].length;
+                        for (var j = 0; j < l; j++) {
+                            tableBody[0].appendChild(r[pos][j]);
+                        }
+
+                        // 
+                    }
+                }
+
+
+
+                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;
+                
+                var header_index = computeTableHeaderCellIndexes(table);
+
+                $tableHeaders = $(table.config.selectorHeaders, table).each(function (index) {
+
+                    this.column = header_index[this.parentNode.rowIndex + "-" + this.cellIndex];
+                    // this.column = index;
+                    this.order = formatSortingOrder(table.config.sortInitialOrder);
+                    
+					
+					this.count = this.order;
+
+                    if (checkHeaderMetadata(this) || checkHeaderOptions(table, index)) this.sortDisabled = true;
+					if (checkHeaderOptionsSortingLocked(table, index)) this.order = this.lockedOrder = checkHeaderOptionsSortingLocked(table, index);
+
+                    if (!this.sortDisabled) {
+                        var $th = $(this).addClass(table.config.cssHeader);
+                        if (table.config.onRenderHeader) table.config.onRenderHeader.apply($th);
+                    }
+
+                    // add cell to headerList
+                    table.config.headerList[index] = this;
+                });
+
+                if (table.config.debug) {
+                    benchmark("Built headers:", time);
+                    log($tableHeaders);
+                }
+
+                return $tableHeaders;
+
+            };
+
+            // from:
+            // http://www.javascripttoolbox.com/lib/table/examples.php
+            // http://www.javascripttoolbox.com/temp/table_cellindex.html
+
+
+            function computeTableHeaderCellIndexes(t) {
+                var matrix = [];
+                var lookup = {};
+                var thead = t.getElementsByTagName('THEAD')[0];
+                var trs = thead.getElementsByTagName('TR');
+
+                for (var i = 0; i < trs.length; i++) {
+                    var cells = trs[i].cells;
+                    for (var j = 0; j < cells.length; j++) {
+                        var c = cells[j];
+
+                        var rowIndex = c.parentNode.rowIndex;
+                        var cellId = rowIndex + "-" + c.cellIndex;
+                        var rowSpan = c.rowSpan || 1;
+                        var colSpan = c.colSpan || 1
+                        var firstAvailCol;
+                        if (typeof(matrix[rowIndex]) == "undefined") {
+                            matrix[rowIndex] = [];
+                        }
+                        // Find first available column in the first row
+                        for (var k = 0; k < matrix[rowIndex].length + 1; k++) {
+                            if (typeof(matrix[rowIndex][k]) == "undefined") {
+                                firstAvailCol = k;
+                                break;
+                            }
+                        }
+                        lookup[cellId] = firstAvailCol;
+                        for (var k = rowIndex; k < rowIndex + rowSpan; k++) {
+                            if (typeof(matrix[k]) == "undefined") {
+                                matrix[k] = [];
+                            }
+                            var matrixrow = matrix[k];
+                            for (var l = firstAvailCol; l < firstAvailCol + colSpan; l++) {
+                                matrixrow[l] = "x";
+                            }
+                        }
+                    }
+                }
+                return lookup;
+            }
+
+            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 checkHeaderOptionsSortingLocked(table, i) {
+                if ((table.config.headers[i]) && (table.config.headers[i].lockedOrder)) return table.config.headers[i].lockedOrder;
+                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") {
+                    return (v.toLowerCase() == "desc") ? 1 : 0;
+                } else {
+                    return (v == 1) ? 1 : 0;
+                }
+            }
+
+            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;
+
+                // TODO: inline functions.
+                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 s = (table.config.parsers[c].type == "text") ? ((order == 0)
+                    // ? makeSortText(c) : makeSortTextDesc(c)) : ((order == 0) ?
+                    // makeSortNumeric(c) : makeSortNumericDesc(c));
+                    var s = (table.config.parsers[c].type == "text") ? ((order == 0) ? makeSortFunction("text", "asc", c) : makeSortFunction("text", "desc", c)) : ((order == 0) ? makeSortFunction("numeric", "asc", c) : makeSortFunction("numeric", "desc", c));
+                    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 += "}; ";
+
+                if (table.config.debug) {
+                    benchmark("Evaling expression:" + dynamicExp, new Date());
+                }
+
+                eval(dynamicExp);
+
+                cache.normalized.sort(sortWrapper);
+
+                if (table.config.debug) {
+                    benchmark("Sorting on " + sortList.toString() + " and dir " + order + " time:", sortTime);
+                }
+
+                return cache;
+            };
+
+            function makeSortFunction(type, direction, index) {
+                var a = "a[" + index + "]",
+                    b = "b[" + index + "]";
+                if (type == 'text' && direction == 'asc') {
+                    return "(" + a + " == " + b + " ? 0 : (" + a + " === null ? Number.POSITIVE_INFINITY : (" + b + " === null ? Number.NEGATIVE_INFINITY : (" + a + " < " + b + ") ? -1 : 1 )));";
+                } else if (type == 'text' && direction == 'desc') {
+                    return "(" + a + " == " + b + " ? 0 : (" + a + " === null ? Number.POSITIVE_INFINITY : (" + b + " === null ? Number.NEGATIVE_INFINITY : (" + b + " < " + a + ") ? -1 : 1 )));";
+                } else if (type == 'numeric' && direction == 'asc') {
+                    return "(" + a + " === null && " + b + " === null) ? 0 :(" + a + " === null ? Number.POSITIVE_INFINITY : (" + b + " === null ? Number.NEGATIVE_INFINITY : " + a + " - " + b + "));";
+                } else if (type == 'numeric' && direction == 'desc') {
+                    return "(" + a + " === null && " + b + " === null) ? 0 :(" + a + " === null ? Number.POSITIVE_INFINITY : (" + b + " === null ? Number.NEGATIVE_INFINITY : " + b + " - " + a + "));";
+                }
+            };
+
+            function makeSortText(i) {
+                return "((a[" + i + "] < b[" + i + "]) ? -1 : ((a[" + i + "] > b[" + i + "]) ? 1 : 0));";
+            };
+
+            function makeSortTextDesc(i) {
+                return "((b[" + i + "] < a[" + i + "]) ? -1 : ((b[" + i + "] > a[" + i + "]) ? 1 : 0));";
+            };
+
+            function makeSortNumeric(i) {
+                return "a[" + i + "]-b[" + i + "];";
+            };
+
+            function makeSortNumericDesc(i) {
+                return "b[" + i + "]-a[" + i + "];";
+            };
+
+            function sortText(a, b) {
+                if (table.config.sortLocaleCompare) return a.localeCompare(b);
+                return ((a < b) ? -1 : ((a > b) ? 1 : 0));
+            };
+
+            function sortTextDesc(a, b) {
+                if (table.config.sortLocaleCompare) return b.localeCompare(a);
+                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 no thead or tbody quit.
+                    if (!this.tHead || !this.tBodies) return;
+                    // declare
+                    var $this, $document, $headers, cache, config, shiftDown = 0,
+                        sortOrder;
+                    // new blank config object
+                    this.config = {};
+                    // merge and extend.
+                    config = $.extend(this.config, $.tablesorter.defaults, settings);
+                    // store common expression for speed
+                    $this = $(this);
+                    // save the settings where they read
+                    $.data(this, "tablesorter", config);
+                    // 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) {
+                        var totalRows = ($this[0].tBodies[0] && $this[0].tBodies[0].rows.length) || 0;
+                        if (!this.sortDisabled && totalRows > 0) {
+                            // Only call sortStart if sorting is
+                            // enabled.
+                            $this.trigger("sortStart");
+                            // 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;
+							// always sort on the locked order.
+							if(this.lockedOrder) this.order = this.lockedOrder;
+							
+							// 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 () {
+                        var me = this;
+                        setTimeout(function () {
+                            // rebuild parsers.
+                            me.config.parsers = buildParserCache(
+                            me, $headers);
+                            // rebuild the cache map
+                            cache = buildCache(me);
+                        }, 1);
+                    }).bind("updateCell", function (e, cell) {
+                        var config = this.config;
+                        // get position from the dom.
+                        var pos = [(cell.parentNode.rowIndex - 1), cell.cellIndex];
+                        // update cache
+                        cache.normalized[pos[0]][pos[1]] = config.parsers[pos[1]].format(
+                        getElementText(config, cell), cell);
+                    }).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) {
+                // replace all an wanted chars and match.
+                return /^[-+]?\d*$/.test($.trim(s.replace(/[,.']/g, '')));
+            };
+            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
+    });
+
+    // make shortcut
+    var ts = $.tablesorter;
+
+    // add default parsers
+    ts.addParser({
+        id: "text",
+        is: function (s) {
+            return true;
+        }, format: function (s) {
+            return $.trim(s.toLocaleLowerCase());
+        }, 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(/[£$€]/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();
+            }
+            var $tr, row = -1,
+                odd;
+            // loop through the visible rows
+            $("tr:visible", table.tBodies[0]).each(function (i) {
+                $tr = $(this);
+                // style children rows the same way the parent
+                // row was styled
+                if (!$tr.hasClass(table.config.cssChildRow)) row++;
+                odd = (row % 2 == 0);
+                $tr.removeClass(
+                table.config.widgetZebra.css[odd ? 0 : 1]).addClass(
+                table.config.widgetZebra.css[odd ? 1 : 0])
+            });
+            if (table.config.debug) {
+                $.tablesorter.benchmark("Applying Zebra widget", time);
+            }
+        }
+    });
+})(jQuery);
Index: /extensions/LCAS/tags/0.0.0RC1/admin/template/js/jquery.tablesorter.min.js
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/admin/template/js/jquery.tablesorter.min.js	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/admin/template/js/jquery.tablesorter.min.js	(revision 9646)
@@ -0,0 +1,4 @@
+
+(function($){$.extend({tablesorter:new
+function(){var parsers=[],widgets=[];this.defaults={cssHeader:"header",cssAsc:"headerSortUp",cssDesc:"headerSortDown",cssChildRow:"expand-child",sortInitialOrder:"asc",sortMultiSortKey:"shiftKey",sortForce:null,sortAppend:null,sortLocaleCompare:true,textExtraction:"simple",parsers:{},widgets:[],widgetZebra:{css:["even","odd"]},headers:{},widthFixed:false,cancelSelection:true,sortList:[],headerList:[],dateFormat:"us",decimal:'/\.|\,/g',onRenderHeader:null,selectorHeaders:'thead th',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="";}if(table.tBodies.length==0)return;var rows=table.tBodies[0].rows;if(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,rows,-1,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,rows,rowIndex,cellIndex){var l=parsers.length,node=false,nodeValue=false,keepLooking=true;while(nodeValue==''&&keepLooking){rowIndex++;if(rows[rowIndex]){node=getNodeFromRowAndCellIndex(rows,rowIndex,cellIndex);nodeValue=trimAndGetNodeText(table.config,node);if(table.config.debug){log('Checking if value was empty on row:'+rowIndex);}}else{keepLooking=false;}}for(var i=1;i<l;i++){if(parsers[i].is(nodeValue,table,node)){return parsers[i];}}return parsers[0];}function getNodeFromRowAndCellIndex(rows,rowIndex,cellIndex){return rows[rowIndex].cells[cellIndex];}function trimAndGetNodeText(config,node){return $.trim(getElementText(config,node));}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=[];if(c.hasClass(table.config.cssChildRow)){cache.row[cache.row.length-1]=cache.row[cache.row.length-1].add(c);continue;}cache.row.push(c);for(var j=0;j<totalCells;++j){cols.push(parsers[j].format(getElementText(table.config,c[0].cells[j]),table,c[0].cells[j]));}cols.push(cache.normalized.length);cache.normalized.push(cols);cols=null;};if(table.config.debug){benchmark("Building cache for "+totalRows+" rows:",cacheTime);}return cache;};function getElementText(config,node){var text="";if(!node)return"";if(!config.supportsTextContent)config.supportsTextContent=node.textContent||false;if(config.textExtraction=="simple"){if(config.supportsTextContent){text=node.textContent;}else{if(node.childNodes[0]&&node.childNodes[0].hasChildNodes()){text=node.childNodes[0].innerHTML;}else{text=node.innerHTML;}}}else{if(typeof(config.textExtraction)=="function"){text=config.textExtraction(node);}else{text=$(node).text();}}return text;}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++){var pos=n[i][checkCell];rows.push(r[pos]);if(!table.config.appender){var l=r[pos].length;for(var j=0;j<l;j++){tableBody[0].appendChild(r[pos][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;var header_index=computeTableHeaderCellIndexes(table);$tableHeaders=$(table.config.selectorHeaders,table).each(function(index){this.column=header_index[this.parentNode.rowIndex+"-"+this.cellIndex];this.order=formatSortingOrder(table.config.sortInitialOrder);this.count=this.order;if(checkHeaderMetadata(this)||checkHeaderOptions(table,index))this.sortDisabled=true;if(checkHeaderOptionsSortingLocked(table,index))this.order=this.lockedOrder=checkHeaderOptionsSortingLocked(table,index);if(!this.sortDisabled){var $th=$(this).addClass(table.config.cssHeader);if(table.config.onRenderHeader)table.config.onRenderHeader.apply($th);}table.config.headerList[index]=this;});if(table.config.debug){benchmark("Built headers:",time);log($tableHeaders);}return $tableHeaders;};function computeTableHeaderCellIndexes(t){var matrix=[];var lookup={};var thead=t.getElementsByTagName('THEAD')[0];var trs=thead.getElementsByTagName('TR');for(var i=0;i<trs.length;i++){var cells=trs[i].cells;for(var j=0;j<cells.length;j++){var c=cells[j];var rowIndex=c.parentNode.rowIndex;var cellId=rowIndex+"-"+c.cellIndex;var rowSpan=c.rowSpan||1;var colSpan=c.colSpan||1
+var firstAvailCol;if(typeof(matrix[rowIndex])=="undefined"){matrix[rowIndex]=[];}for(var k=0;k<matrix[rowIndex].length+1;k++){if(typeof(matrix[rowIndex][k])=="undefined"){firstAvailCol=k;break;}}lookup[cellId]=firstAvailCol;for(var k=rowIndex;k<rowIndex+rowSpan;k++){if(typeof(matrix[k])=="undefined"){matrix[k]=[];}var matrixrow=matrix[k];for(var l=firstAvailCol;l<firstAvailCol+colSpan;l++){matrixrow[l]="x";}}}}return lookup;}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 checkHeaderOptionsSortingLocked(table,i){if((table.config.headers[i])&&(table.config.headers[i].lockedOrder))return table.config.headers[i].lockedOrder;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"){return(v.toLowerCase()=="desc")?1:0;}else{return(v==1)?1:0;}}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=(table.config.parsers[c].type=="text")?((order==0)?makeSortFunction("text","asc",c):makeSortFunction("text","desc",c)):((order==0)?makeSortFunction("numeric","asc",c):makeSortFunction("numeric","desc",c));var e="e"+i;dynamicExp+="var "+e+" = "+s;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+="}; ";if(table.config.debug){benchmark("Evaling expression:"+dynamicExp,new Date());}eval(dynamicExp);cache.normalized.sort(sortWrapper);if(table.config.debug){benchmark("Sorting on "+sortList.toString()+" and dir "+order+" time:",sortTime);}return cache;};function makeSortFunction(type,direction,index){var a="a["+index+"]",b="b["+index+"]";if(type=='text'&&direction=='asc'){return"("+a+" == "+b+" ? 0 : ("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : ("+a+" < "+b+") ? -1 : 1 )));";}else if(type=='text'&&direction=='desc'){return"("+a+" == "+b+" ? 0 : ("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : ("+b+" < "+a+") ? -1 : 1 )));";}else if(type=='numeric'&&direction=='asc'){return"("+a+" === null && "+b+" === null) ? 0 :("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : "+a+" - "+b+"));";}else if(type=='numeric'&&direction=='desc'){return"("+a+" === null && "+b+" === null) ? 0 :("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : "+b+" - "+a+"));";}};function makeSortText(i){return"((a["+i+"] < b["+i+"]) ? -1 : ((a["+i+"] > b["+i+"]) ? 1 : 0));";};function makeSortTextDesc(i){return"((b["+i+"] < a["+i+"]) ? -1 : ((b["+i+"] > a["+i+"]) ? 1 : 0));";};function makeSortNumeric(i){return"a["+i+"]-b["+i+"];";};function makeSortNumericDesc(i){return"b["+i+"]-a["+i+"];";};function sortText(a,b){if(table.config.sortLocaleCompare)return a.localeCompare(b);return((a<b)?-1:((a>b)?1:0));};function sortTextDesc(a,b){if(table.config.sortLocaleCompare)return b.localeCompare(a);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);$.data(this,"tablesorter",config);$headers=buildHeaders(this);this.config.parsers=buildParserCache(this,$headers);cache=buildCache(this);var sortCSS=[config.cssDesc,config.cssAsc];fixColumnWidth(this);$headers.click(function(e){var totalRows=($this[0].tBodies[0]&&$this[0].tBodies[0].rows.length)||0;if(!this.sortDisabled&&totalRows>0){$this.trigger("sortStart");var $cell=$(this);var i=this.column;this.order=this.count++%2;if(this.lockedOrder)this.order=this.lockedOrder;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(){var me=this;setTimeout(function(){me.config.parsers=buildParserCache(me,$headers);cache=buildCache(me);},1);}).bind("updateCell",function(e,cell){var config=this.config;var pos=[(cell.parentNode.rowIndex-1),cell.cellIndex];cache.normalized[pos[0]][pos[1]]=config.parsers[pos[1]].format(getElementText(config,cell),cell);}).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){return/^[-+]?\d*$/.test($.trim(s.replace(/[,.']/g,'')));};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.toLocaleLowerCase());},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(/[£$€]/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();}var $tr,row=-1,odd;$("tr:visible",table.tBodies[0]).each(function(i){$tr=$(this);if(!$tr.hasClass(table.config.cssChildRow))row++;odd=(row%2==0);$tr.removeClass(table.config.widgetZebra.css[odd?0:1]).addClass(table.config.widgetZebra.css[odd?1:0])});if(table.config.debug){$.tablesorter.benchmark("Applying Zebra widget",time);}}});})(jQuery);
Index: /extensions/LCAS/tags/0.0.0RC1/admin/template/js/jquery.tablesorter.pager.js
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/admin/template/js/jquery.tablesorter.pager.js	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/admin/template/js/jquery.tablesorter.pager.js	(revision 9646)
@@ -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/tags/0.0.0RC1/admin/template/lcas.css
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/admin/template/lcas.css	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/admin/template/lcas.css	(revision 9646)
@@ -0,0 +1,98 @@
+/* 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%;
+}
+
+textarea.LCAS_Mailtextfields
+{
+  width: 70%;
+}
+
+/* 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/tags/0.0.0RC1/changelog.txt.php
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/changelog.txt.php	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/changelog.txt.php	(revision 9646)
@@ -0,0 +1,11 @@
+<?php
+/*
+Plugin Name: LoginCaseAccentsSensitivity
+** Change log **
+***************************************
+************ Plugin history ***********
+***************************************
+
+-- 0.0.1-dev : Initial current development
+*/
+?>
Index: /extensions/LCAS/tags/0.0.0RC1/include/LCAS_replacement_set.inc.php
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/include/LCAS_replacement_set.inc.php	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/include/LCAS_replacement_set.inc.php	(revision 9646)
@@ -0,0 +1,598 @@
+<?php
+
+// This file sets the replacement characters which must be used with plugin
+// LCAS (Logon Case and Accents Sensitivity).
+// For each case (case insensitivity, accents insensitivity, or both case and
+// accents insensitivity), the table associates one replacement character (or
+// one combination of replacement characters, but only one), to one or more
+// characters that are equivalent within the considered case.
+//
+// That is: (examples given for characters y, c, æ and œ)
+// +------------------+-----------------+----------------------------------+
+// |       If         |   character(s)  |     ... must be used in          |
+// |       ...        |       ...       |   replacement of character(s)    |
+// |                  | (only one entry |             ...                  |
+// |                  |  is possible)   |   (several entries possible)     |
+// +==================+=================+==================================+
+// |     case is      |             'y' => 'Y'                             |
+// |   insensitive    |             'ý' |  'Ý'                             |
+// |                  |             'ÿ' |  'Ÿ'                             |
+// |                  |             'ỳ' |  'Ỳ'                             |
+// |                  |             'ỵ' |  'Ỵ'                             |
+// |                  |             'ỷ' |  'Ỷ'                             |
+// |                  |             'ỹ' |  'Ỹ'                             |
+// |                  |             'ŷ' |  'Ŷ'                             |
+// |                  |             'c' |  'C'                             |
+// |                  |             'ç' |  'Ç'                             |
+// |                  |             'ć' |  'Ć'                             |
+// |                  |             'ĉ' |  'Ĉ'                             |
+// |                  |             'ċ' |  'Ċ'                             |
+// |                  |             'č' |  'Č'                             |
+// |                  |            'ae' |  'æ Æ'                           |
+// |                  |            'aé' |  'ǽ Ǽ'                           |
+// |                  |            'oe' |  'œ Œ'                           |
+// +------------------+-----------------+----------------------------------+
+// |   accents are    |             'y' => 'ý ÿ ỳ ỵ ỷ ỹ ŷ'                 |
+// |   insensitive    |             'Y' |  'Ý Ÿ Ỳ Ỵ Ỷ Ỹ Ŷ'                 |
+// |                  |             'c' |  'ç ć ĉ ċ č'                     |
+// |                  |             'C' |  'Ç Ć Ĉ Ċ Č'                     |
+// |                  |            'ae' |  'ǽ'                             |
+// |                  |            'AE' |  'Ǽ'                             |
+// |                  |            'ae' |  'æ'                             |
+// |                  |            'AE' |  'Æ'                             |
+// |                  |            'oe' |  'œ'                             |
+// |                  |            'OE' |  'Œ'                             |
+// +------------------+-----------------+----------------------------------+
+// | case AND accents |             'y' => 'Y ý Ý ÿ Ÿ ỳ Ỳ ỵ Ỵ ỷ Ỷ ỹ Ỹ ŷ Ŷ' |
+// | are insensitive  |             'c' |  'C ç Ç ć Ć ĉ Ĉ ċ Ċ č Č'         |
+// |                  |            'ae' |  'æ Æ Ǽ ǽ'                       |
+// |                  |            'oe' |  'œ Œ'                           |
+// +------------------+-----------------+----------------------------------+
+//
+// You can create your own character replacement set, by defining in
+// ./local/config/config.inc.php :
+//
+// $conf['LCAS_replacement_set'][0] = array(
+//   '§§' => '1 2 3 4',
+// );
+//
+// As seen in the example table, in the code above, "§§" should be replaced by
+// the replacement character(s). It can be more than one character, but it
+// must represent only ONE entry. In "1 2 3 4", each figure should be replaced
+// by a character that needs to be considered equivalent to the
+// character(s) replacing "§§". But each character replacing a figure of
+// "1 2 3 4" MUST be a UNIQUE character. Characters here are separated by a
+// space.
+
+  if (!isset($conf['LCAS_replacement_set']))
+   $conf['LCAS_replacement_set'] = array();
+  
+  // 0 : personalized
+  
+  $conf['LCAS_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 ſ',
+    'ś'  => 'Ś',
+    'ŝ'  => 'Ŝ',
+    'ş'  => 'Ş',
+    'š'  => 'Š',
+    'ss' => 'ß',
+    
+    't'  => 'T',
+    'ţ'  => 'Ţ',
+    'ť'  => 'Ť',
+    'ŧ'  => 'Ŧ',
+    
+    'u'  => 'U',
+    'ù'  => 'Ù',
+    'ú'  => 'Ú',
+    'û'  => 'Û',
+    'ü'  => 'Ü',
+    'ũ'  => 'Ũ',
+    'ū'  => 'Ū',
+    'ŭ'  => 'Ŭ',
+    'ů'  => 'Ů',
+    'ű'  => 'Ű',
+    'ų'  => 'Ų',
+    'ǔ'  => 'Ǔ',
+    'ǖ'  => 'Ǖ',
+    'ǘ'  => 'Ǘ',
+    'ǚ'  => 'Ǚ',
+    'ǜ'  => 'Ǜ',
+    'ư'  => 'Ư',
+    'ụ'  => 'Ụ',
+    'ủ'  => 'Ủ',
+    'ứ'  => 'Ứ',
+    'ừ'  => 'Ừ',
+    'ử'  => 'Ử',
+    'ữ'  => 'Ữ',
+    'ự'  => 'Ự',
+    
+    'v'  => 'V',
+    
+    'w'  => 'W',
+    'ŵ'  => 'Ŵ',
+    'ẁ'  => 'Ẁ',
+    'ẃ'  => 'Ẃ',
+    'ẅ'  => 'Ẅ',
+    
+    'x'  => 'X',
+    
+    'y'  => 'Y',
+    'ý'  => 'Ý',
+    'ÿ'  => 'Ÿ',
+    'ỳ'  => 'Ỳ',
+    'ỵ'  => 'Ỵ',
+    'ỷ'  => 'Ỷ',
+    'ỹ'  => 'Ỹ',
+    'ŷ'  => 'Ŷ',
+    
+    'z'  => 'Z',
+    'ź'  => 'Ź',
+    'ż'  => 'Ż',
+    'ž'  => 'Ž',
+    
+    'ae' => 'æ Æ',
+    'aé' => 'ǽ Ǽ',
+    'ð'  => 'Ð',
+    'ə'  => 'Ə',
+    'ij' => 'ĳ Ĳ',
+    'ŋ'  => 'Ŋ',
+    'oe' => 'œ Œ',
+    'þ'  => 'Þ',
+    
+  // Greek
+    
+    'α'  => 'Α',
+    'ά'  => 'Ά',
+    'β'  => 'Β',
+    'γ'  => 'Γ',
+    'δ'  => 'Δ',
+    'ε'  => 'Ε',
+    'έ'  => 'Έ',
+    'ζ'  => 'Ζ',
+    'η'  => 'Η',
+    'ή'  => 'Ή',
+    'θ'  => 'Θ',
+    'ι'  => 'Ι',
+    'ί'  => 'Ί',
+    'ϊ'  => 'Ϊ',
+    'κ'  => 'Κ',
+    'λ'  => 'Λ',
+    'μ'  => 'Μ µ',
+    'ν'  => 'Ν',
+    'ξ'  => 'Ξ',
+    'ο'  => 'Ο',
+    'ό'  => 'Ό',
+    'π'  => 'Π',
+    'ρ'  => 'Ρ',
+    'σ'  => 'Σ ς',
+    'τ'  => 'Τ',
+    'υ'  => 'Υ',
+    'ύ'  => 'Ύ',
+    'ϋ'  => 'Ϋ',
+    'φ'  => 'Φ',
+    'χ'  => 'Χ',
+    'ψ'  => 'Ψ',
+    'ω'  => 'Ω',
+    'ώ'  => 'Ώ',
+    
+  // Cyrillic
+    
+    'а'  => 'А',
+    'б'  => 'Б',
+    'в'  => 'В',
+    'г'  => 'Г',
+    'ґ'  => 'Ґ',
+    'ғ'  => 'Ғ',
+    'д'  => 'Д',
+    'е'  => 'Е',
+    'ж'  => 'Ж',
+    'җ'  => 'Җ',
+    'з'  => 'З',
+    'и'  => 'И',
+    'й'  => 'Й',
+    'к'  => 'К',
+    'қ'  => 'Қ',
+    'ҝ'  => 'Ҝ',
+    'л'  => 'Л',
+    'м'  => 'М',
+    'н'  => 'Н',
+    'ң'  => 'Ң',
+    'о'  => 'О',
+    'п'  => 'П',
+    'р'  => 'Р',
+    'с'  => 'С',
+    'т'  => 'Т',
+    'у'  => 'У',
+    'ү'  => 'Ү',
+    'ұ'  => 'Ұ',
+    'ф'  => 'Ф',
+    'х'  => 'Х',
+    'ҳ'  => 'Ҳ',
+    'ц'  => 'Ц',
+    'ч'  => 'Ч',
+    'ҹ'  => 'Ҹ',
+    'ш'  => 'Ш',
+    'щ'  => 'Щ',
+    'ъ'  => 'Ъ',
+    'ы'  => 'Ы',
+    'ь'  => 'Ь',
+    'э'  => 'Э',
+    'ю'  => 'Ю',
+    'я'  => 'Я',
+    'ё'  => 'Ё',
+    'ђ'  => 'Ђ',
+    'ѓ'  => 'Ѓ',
+    'є'  => 'Є',
+    'ѕ'  => 'Ѕ',
+    'і'  => 'І',
+    'ї'  => 'Ї',
+    'ј'  => 'Ј',
+    'љ'  => 'Љ',
+    'њ'  => 'Њ',
+    'ћ'  => 'Ћ',
+    'ќ'  => 'Ќ',
+    'ў'  => 'Ў',
+    'џ'  => 'Џ',
+    'һ'  => 'Һ',
+    'ә'  => 'Ә',
+    'ө'  => 'Ө',
+    
+  );
+
+  $conf['LCAS_replacement_set'][2] = array(
+  // 2 : 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' => 'Ǽ',
+    'ae' => 'æ',
+    'AE' => 'Æ',
+    'ij' => 'ĳ',
+    'IJ' => 'Ĳ',
+    'oe' => 'œ',
+    'OE' => 'Œ',
+    
+  // Greek
+    
+    'α'  => 'ά',
+    'Α'  => 'Ά',
+    'ε'  => 'έ',
+    'Ε'  => 'Έ',
+    'μ'  => 'µ',
+    'η'  => 'ή',
+    'Η'  => 'Ή',
+    'ι'  => 'ί ϊ ΐ',
+    'Ι'  => 'Ί Ϊ',
+    'ο'  => 'ό',
+    'Ο'  => 'Ό',
+    'σ'  => 'ς',
+    'υ'  => 'ύ ϋ ΰ',
+    'Υ'  => 'Ύ Ϋ',
+    'ω'  => 'ώ',
+    'Ω'  => 'Ώ',
+    
+  // Cyrillic
+    
+    'г'  => 'ґ ғ',
+    'Г'  => 'Ґ Ғ',
+    'ж'  => 'җ',
+    'Ж'  => 'Җ',
+    'к'  => 'қ ҝ',
+    'К'  => 'Қ Ҝ',
+    'н'  => 'ң',
+    'Н'  => 'Ң',
+    'х'  => 'ҳ',
+    'Х'  => 'Ҳ',
+    'ч'  => 'ҹ',
+    'Ч'  => 'Ҹ',
+    
+  );
+
+  $conf['LCAS_replacement_set'][3] = array(
+  // 3 : 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
+    
+    'а'  => 'А',
+    'б'  => 'Б',
+    'в'  => 'В',
+    'г'  => 'Г ґ Ґ ғ Ғ',
+    'д'  => 'Д',
+    'е'  => 'Е',
+    'ж'  => 'Ж җ Җ',
+    'з'  => 'З',
+    'и'  => 'И',
+    'й'  => 'Й',
+    'к'  => 'К қ Қ ҝ Ҝ',
+    'л'  => 'Л',
+    'м'  => 'М',
+    'н'  => 'Н ң Ң',
+    'о'  => 'О',
+    'п'  => 'П',
+    'р'  => 'Р',
+    'с'  => 'С',
+    'т'  => 'Т',
+    'у'  => 'У',
+    'ү'  => 'Ү',
+    'ұ'  => 'Ұ',
+    'ф'  => 'Ф',
+    'х'  => 'Х ҳ Ҳ',
+    'ц'  => 'Ц',
+    'ч'  => 'Ч ҹ Ҹ',
+    'ш'  => 'Ш',
+    'щ'  => 'Щ',
+    'ъ'  => 'Ъ',
+    'ы'  => 'Ы',
+    'ь'  => 'Ь',
+    'э'  => 'Э',
+    'ю'  => 'Ю',
+    'я'  => 'Я',
+    'ё'  => 'Ё',
+    'ђ'  => 'Ђ',
+    'ѓ'  => 'Ѓ',
+    'є'  => 'Є',
+    'ѕ'  => 'Ѕ',
+    'і'  => 'І',
+    'ї'  => 'Ї',
+    'ј'  => 'Ј',
+    'љ'  => 'Љ',
+    'њ'  => 'Њ',
+    'ћ'  => 'Ћ',
+    'ќ'  => 'Ќ',
+    'ў'  => 'Ў',
+    'џ'  => 'Џ',
+    'һ'  => 'Һ',
+    'ә'  => 'Ә',
+    'ө'  => 'Ө',
+    
+  );
+
+?>
Index: /extensions/LCAS/tags/0.0.0RC1/include/constants.php
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/include/constants.php	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/include/constants.php	(revision 9646)
@@ -0,0 +1,3 @@
+<?php
+global $prefixeTable;
+?>
Index: /extensions/LCAS/tags/0.0.0RC1/include/functions.inc.php
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/include/functions.inc.php	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/include/functions.inc.php	(revision 9646)
@@ -0,0 +1,365 @@
+<?php
+          // Keeps file coded in UTF-8 without BOM : é
+include_once (LCAS_PATH.'include/constants.php');
+load_language('plugin.lang', LCAS_PATH);
+
+
+/**
+ * Split a multi-byte string in a array of each of its characters.
+ * Many thanks to Whiler ;-) in
+ * http://fr.piwigo.org/forum/viewtopic.php?pid=162907#p162907
+ *
+ * @param string s: string to split
+ *
+ * @return : array of each character of s
+*/
+function LCAS_mbStringToArray($s) {
+  return preg_split('//u', $s, -1, PREG_SPLIT_NO_EMPTY);
+}
+
+
+/**
+ * Changes the characters of the given string as stated by values of
+ * $conf['insensitive_case_logon'] and $conf['LCAS_replacement_set'].
+ *
+ * @param mix s: string
+ *
+ * @return : string modified as stated
+*/
+function LCAS_change_case($Username, $Opt)
+{
+  global $conf;
+  
+  if ($Opt == '0' and !isset($conf['LCAS_replacement_set'][0]))
+   return $Username;
+  if ($Opt == '0') return $Username; // to be removed once rule 0 is done
+  $Option = intval($Opt);
+  if (!isset($Opt) or ($Option < 0) or ($Option > 3)) return $Username;
+  
+  include(LCAS_PATH.'include/LCAS_replacement_set.inc.php');
+
+  // Build 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
+  // $conf['LCAS_replacement_set'][$Option]['e'] ='é è'
+  // then
+  // $char_rep_arr['é'] = 'e' ; $char_rep_arr['è'] = 'e'.
+  $char_rep_arr = array();
+  foreach (
+   $conf['LCAS_replacement_set'][$Option]
+   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 $Username of the characters
+  // that needs to be replaced
+  $t = LCAS_mbStringToArray($Username); $r ='';
+  foreach ($t as $c) {
+    if (array_key_exists($c, $char_rep_arr))
+     $r.= $char_rep_arr[$c];
+    else
+     $r.= $c;
+  }
+  
+  // Return of the result
+  return $r;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+/* Function called from LCAS_admin.php to send notification email */
+function LCAS_SendMail($id, $oldusername, $username)
+{
+  global $conf;
+
+  $conf_LCAS= unserialize($conf['LoginCaseAccentsSensitivity']);
+  
+	include_once(PHPWG_ROOT_PATH.'include/functions_mail.inc.php');
+
+/* 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 */
+    switch_lang_to($data['language']);
+    load_language('plugin.lang', LCAS_PATH);
+  }
+
+  $subject = '['.$conf['gallery_title'].'] '.l10n_args(get_l10n_args('Username_updated_for_%s', stripslashes($oldusername)));
+
+  if (isset($conf_LCAS[2]) and $conf_LCAS[2] <> '')
+  {
+    if (function_exists('get_user_language_desc'))
+    {
+      $customtxt = get_user_language_desc($conf_LCAS[2])."\n\n";
+    }
+    else $customtxt = l10n($conf_LCAS[2])."\n\n"; 
+  }
+
+/* Get user's email address */
+  $query ='
+SELECT mail_address
+FROM '.USERS_TABLE.'
+WHERE id = '.$id.'
+;';
+
+  $data = pwg_db_fetch_assoc(pwg_query($query));
+
+/* User standard information */
+  $info = array(
+      get_l10n_args('LCAS_NewUsername: %s', stripslashes($username)),
+      get_l10n_args('LCAS_NewUser_Email: %s',$data['mail_address']),
+      get_l10n_args('', ''),
+    );
+
+/* Send the email with subject and contents */
+  pwg_mail($data['mail_address'], array(
+    'subject' => $subject,
+    'content' => ($customtxt."\n\n").(l10n_args($info)),
+  ));
+
+/* 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 ;
+}
+
+
+// Tri les doublons
+function CompareTransformedUser($a, $b)
+{
+	return strcmp($a['transformed'], $b['transformed']);
+}
+
+
+// Fonctionnel mais optimisable
+function LCAS_GetDuplicates($source) {
+	$users      = array();
+	$duplicates = array();
+	
+	// Liste des utilisateurs uniques
+	foreach($source as $user) {
+		if (isset($users[$user['transformed']])) {
+			$users[$user['transformed']] += 1;
+		}
+		else {
+			$users[$user['transformed']] = 1;
+		}
+	}
+	
+	// On récupère les doublons
+	foreach($source as $user) {
+		if ($users[$user['transformed']] > 1) {
+			array_push($duplicates, $user);
+		}
+	}
+	
+	// Trier le tableau
+	usort($duplicates, 'CompareTransformedUser');
+	
+	return $duplicates;
+}
+
+
+/**
+ * Retrieve duplicate users according of case and or accent sensitivity
+ * 
+ * @param : $rule for LCAS_change_case())
+ * 
+ * @return : List of duplicate $username 
+ * 
+ */
+function LCAS_get_user_list($rule)
+{
+	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
+;';
+
+	$result = pwg_query($query);
+      
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+  	$user = $row;
+  	$user['transformed'] = LCAS_change_case($user['username'], $rule); 
+    array_push($users, $user);
+	}
+
+	return LCAS_GetDuplicates($users);
+}
+
+
+// Cleaning obsolete files at plugin upgrade
+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);
+      }
+    }
+  }
+}
+
+
+/**
+ * Function called from main.inc.php - For test on username case sensitivity
+ * Have to be deleted before first release build
+ * 
+ * @param : $username typed in by user for identification
+ * 
+ * @return : $username found in database 
+ * 
+ */
+function LCAS_SearchCaseUsername($username, $rule)
+{
+  global $conf;
+
+  $username_c = LCAS_change_case($username, $rule);
+
+  if (isset($username))
+  {    
+    $LCAS_users = array();
+    
+    $q = pwg_query("
+      SELECT ".$conf['user_fields']['username']." AS username
+      FROM `".USERS_TABLE."`;
+    ");
+    while ($r = pwg_db_fetch_assoc($q))
+     $LCAS_users[$r['username']] =
+      LCAS_change_case($r['username'], $rule);
+     // $LCAS_users is now an associative table where the key is the account
+     // as registered in the DB, and the value is this same account,
+     // transformed as stated by $rule.
+
+    $users_found = array_keys($LCAS_users, $username_c);
+    // $users_found is now a table of which the values are all the accounts
+    // which can be written as stated by $rule the same way as $username can
+    if (count($users_found) != 1) // If ambiguous, don't allow transformed
+     return $username;            // writing but normal writing will work
+    else
+     return $users_found[0];
+  }
+}
+
+
+/*
+ * str_from_var3($var)
+ * returns a string easing array var informations displaying in Piwigo :
+ *   _ the string return value starts with"<p style = "text-align:left;">" ;
+ *   _ all "TAB" characters (chr(10)) are replaced by "<br>" ;
+ *   _ all spaces are replaced by "&nbsp;".
+ *
+ * @param
+ *   $var : variable to display
+ * @return
+ *   string easy to display in Piwigo
+ */
+function str_from_var3($var) {
+  return
+   '<p style = "text-align:left;">'.
+   str_replace(
+    chr(10),'<br>',
+    str_replace(' ','&nbsp;', print_r /* var_dump */ ($var,true))
+   ).
+   '</p>';
+}
+
+
+// DebugLog function
+function DebugLog($var1, $var2, $var3, $var4, $var5)
+{
+   $fo=fopen (LCAS_PATH.'admin/debuglog.txt','a') ;
+   fwrite($fo,"======================\n") ;
+   fwrite($fo,'le ' . date('D, d M Y H:i:s') . "\r\n");
+   fwrite($fo, "\n" . $var1 . "\r\n") ;
+   fwrite($fo, "\n" . $var2 . "\r\n") ;
+   fwrite($fo, "\n" . $var3 . "\r\n") ;
+   fwrite($fo, "\n" . $var4 . "\r\n") ;
+   fwrite($fo, "\n" . $var5 . "\r\n") ;
+   fclose($fo) ;
+}
+?>
Index: /extensions/LCAS/tags/0.0.0RC1/include/index.php
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/include/index.php	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/include/index.php	(revision 9646)
@@ -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/tags/0.0.0RC1/include/upgradedb.inc.php
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/include/upgradedb.inc.php	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/include/upgradedb.inc.php	(revision 9646)
@@ -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/tags/0.0.0RC1/index.php
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/index.php	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/index.php	(revision 9646)
@@ -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/tags/0.0.0RC1/language/en_UK/description.txt
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/language/en_UK/description.txt	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/language/en_UK/description.txt	(revision 9646)
@@ -0,0 +1,1 @@
+Allow to specify if user login/registration is case/accents sensitive
Index: /extensions/LCAS/tags/0.0.0RC1/language/en_UK/help/index.php
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/language/en_UK/help/index.php	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/language/en_UK/help/index.php	(revision 9646)
@@ -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/tags/0.0.0RC1/language/en_UK/help/plugin.lang.php
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/language/en_UK/help/plugin.lang.php	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/language/en_UK/help/plugin.lang.php	(revision 9646)
@@ -0,0 +1,32 @@
+<?php
+
+// to do: to translate
+
+global $lang;
+
+/*TODO*/$lang['LCAS_sensitiveTitle'] = 'Sensibilités à l\'enregistrement et l\'identification';
+/*TODO*/$lang['LCAS_sensitiveTitle_d'] = '
+Piwigo permet de rendre insensible à la casse mais ne gère pas l\'insensibilité aux accents, et ceci uniquement à l\'inscription des nouveaux utilisateurs. LCAS apporte une gestion plus approfondie des insensibilités à l\'inscription et l\'identification des utilisateurs. Les options suivantes sont proposées:<br><br>
+- Noms d\'utilisateur sensible ou non à la casse<br>
+- Noms d\'utilisateur sensible ou non aux accents<br>
+- Personnalisation du texte de l\'email de notification<br>
+';
+
+/*TODO*/$lang['LCAS_caseSensitiveTitle'] = 'Les options';
+/*TODO*/$lang['LCAS_caseSensitiveTitle_d'] = 'Ces options permettent que les utilisateurs soient identifiés soit sans tenir compte de la casse (majusules et minuscules) de leur identifiant, soit sans tenir compte des accents, soit sans tenir compte d\'aucun des deux.<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>
+';
+
+
+/*TODO*/$lang['LCAS_userlistTitle'] = 'Vérification des utilisateurs';
+/*TODO*/$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.';
+
+/*TODO*/$lang['LCAS_Email_Customization'] = 'Personnalisation de la notification par email';
+/*TODO*/$lang['LCAS_Email_Customization_d'] = 'Vous pouvez personnaliser le texte à envoyer lors de la notification. Utilisez les balises [lang] pour une personnalisation multi-langues si le plugin Extended Description est actif.';
+
+/*TODO*/$lang['LCAS_MailTitle'] = 'Notification par email';
+/*TODO*/$lang['LCAS_MailTitle_d'] = 'Choisissez ici si un email de notification doit être envoyé automatiquement aux utilisateurs dont le login dû être modifié pour correspondre aux nouvelles règles de sensibilité.';
+?>
Index: /extensions/LCAS/tags/0.0.0RC1/language/en_UK/index.php
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/language/en_UK/index.php	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/language/en_UK/index.php	(revision 9646)
@@ -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/tags/0.0.0RC1/language/en_UK/messages.lang.php
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/language/en_UK/messages.lang.php	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/language/en_UK/messages.lang.php	(revision 9646)
@@ -0,0 +1,48 @@
+<?php
+
+global $lang;
+
+// This file sets the messages that are displayed to the users:
+// error message when a user tries to create an account which already exists,
+// and tooltip messages displayed when the mouse hovers above username and
+// password fields.
+
+// You can create your own message for your personal table, having index 0:
+// $lang['LCAS_error'][0] = 'Your text here';
+// Remove comment identifier ("//"), and replace the text "Your text here" by
+// the text you want. Don't forget to write the apostrophe (') with a
+// preceding "\": 'This ain\'t a good text without it!'
+
+
+// New account creation error messages
+$lang['LCAS_error'][1] = 'This username is already used.<br>Username is case insensitive (uppercase/lowercase; E = e ≠ É = é).';
+
+$lang['LCAS_error'][2] = 'This username is already used.<br>Username is accents insensitive (e = é ≠ E = É).';
+
+$lang['LCAS_error'][3] = 'This username is already used.<br>Username is case (uppercase/lowercase) and accents insensitive (E = e = É = é).';
+
+
+// Tooltips in index page
+$lang['LCAS_tooltip_username_index'][0] = 'The username is case (uppercase/lowercase) and accents sensitive (E ≠ e ≠ É ≠ é)';
+
+$lang['LCAS_tooltip_username_index'][1] = 'The username is case insensitive (uppercase/lowercase; E = e ≠ É = é)';
+
+$lang['LCAS_tooltip_username_index'][2] = 'The username is accents insensitive (e = é ≠ E = É)';
+
+$lang['LCAS_tooltip_username_index'][3] = 'The username is case (uppercase/lowercase) and accents insensitive (E = e = É = é)';
+
+$lang['LCAS_tooltip_password_index'] = 'The password is always case (uppercase/lowercase) and accents sensitive (E ≠ e ≠ É ≠ é)';
+
+
+// Tooltips in register page
+$lang['LCAS_tooltip_username_register'][0] = 'The username is case (uppercase/lowercase) and accents sensitive (E ≠ e ≠ É ≠ é)';
+
+$lang['LCAS_tooltip_username_register'][1] = 'The username is case insensitive (uppercase/lowercase; E = e ≠ É = é)';
+
+$lang['LCAS_tooltip_username_register'][2] = 'The username is accents insensitive (e = é ≠ E = É)';
+
+$lang['LCAS_tooltip_username_register'][3] = 'The username is case (uppercase/lowercase) and accents insensitive (E = e = É = é)';
+
+$lang['LCAS_tooltip_password_register'] = 'The password is always case (uppercase/lowercase) and accents sensitive (E ≠ e ≠ É ≠ é)';
+
+?>
Index: /extensions/LCAS/tags/0.0.0RC1/language/en_UK/plugin.lang.php
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/language/en_UK/plugin.lang.php	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/language/en_UK/plugin.lang.php	(revision 9646)
@@ -0,0 +1,54 @@
+<?php
+
+global $lang;
+
+$lang['LCAS_Title_Tab'] = 'Login Case Accents Sensitivity';
+$lang['LCAS_SubTitle_Global'] = 'Plugin configuration';
+
+$lang['LCAS_Title_Global'] = 'Setting the sensitivity';
+
+$lang['LCAS option'] = 'LCAS option:';
+$lang['LCAS_Option0'] = 'No insensitivity (Piwigo\'s standard function)';
+$lang['LCAS_Option1'] = 'Case insensitivity';
+$lang['LCAS_Option2'] = 'Accent insensitivity';
+$lang['LCAS_Option3'] = 'Casse and accent insensitivity';
+$lang['LCAS_Option4'] = 'Personal table of contents';
+$lang['Personalized not allowed explanation'] = ' (you must define an array $conf[\'LCAS_replacement_set\'][0] . See <a title = "To be defined">Standard arrays</a>)';
+$lang['Personalized not allowed tooltip'] = 'No array $conf[\'LCAS_replacement_set\'][0] is defined';
+
+$lang['LCAS_Support_txt'] = 'The official support on this plugin is only on these Piwigo\'s forum topics:<br>
+<a href="http://fr.piwigo.org/forum/viewtopic.php?pid=158565" onclick="window.open(this.href);return false;">French forum - 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;">English forum - http://piwigo.org/forum/viewtopic.php?id=ToDefine</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>';
+
+$lang['LCAS_UserList_Title'] = 'Users requiring changes';
+
+$lang['LCAS_Info_userlist_username_renamed'] = 'The user name has been updated.';
+$lang['LCAS_Err_Userlist_Empty_New_Username'] = 'The user name can\'t be blank.';
+$lang['LCAS_Err_Userlist_New_Username_Exists'] = 'The user name already exists.';
+
+$lang['LCAS_Compare_value_h'] = 'Comparison';
+$lang['LCAS_Update_h'] = 'Change';
+
+$lang['LCAS_Update_User'] = 'Update';
+
+$lang['LCAS_No_User'] = 'No problems found for current users';
+
+$lang['LCAS_save_config'] = 'Settings saved<br>Please check any duplicate users in the following table.';
+
+$lang['submit'] = 'Save settings';
+
+$lang['LCAS_Mail'] = 'Notification par email';
+$lang['LCAS_MailText'] = 'Customizing email notification';
+
+$lang['LCAS_PluginSupport'] = 'Official plugin support';
+
+$lang['LCAS_DisableOption'] = ' Disable (default value)';
+$lang['LCAS_EnableOption'] = ' Enable';
+
+/* Email subject */
+$lang['Username_updated_for_%s'] = 'Username update for %s';
+$lang['LCAS_NewUsername: %s'] = 'Your new username : %s';
+$lang['LCAS_NewUser_Email: %s'] = 'Related to this email address : %s';
+?>
Index: /extensions/LCAS/tags/0.0.0RC1/language/fr_FR/description.txt
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/language/fr_FR/description.txt	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/language/fr_FR/description.txt	(revision 9646)
@@ -0,0 +1,1 @@
+Permet de spécifier si les connexions et/ou les enregistrements doivent être sensibles à la casse et/ou aux accents
Index: /extensions/LCAS/tags/0.0.0RC1/language/fr_FR/help/index.php
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/language/fr_FR/help/index.php	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/language/fr_FR/help/index.php	(revision 9646)
@@ -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/tags/0.0.0RC1/language/fr_FR/help/plugin.lang.php
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/language/fr_FR/help/plugin.lang.php	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/language/fr_FR/help/plugin.lang.php	(revision 9646)
@@ -0,0 +1,28 @@
+<?php
+global $lang;
+
+$lang['LCAS_sensitiveTitle'] = 'Sensibilités à l\'enregistrement et l\'identification';
+$lang['LCAS_sensitiveTitle_d'] = '
+Piwigo permet de rendre insensible à la casse mais ne gère pas l\'insensibilité aux accents, et ceci uniquement à l\'inscription des nouveaux utilisateurs. LCAS apporte une gestion plus approfondie des insensibilités à l\'inscription et l\'identification des utilisateurs. Les options suivantes sont proposées:<br><br>
+- Noms d\'utilisateur sensible ou non à la casse<br>
+- Noms d\'utilisateur sensible ou non aux accents<br>
+- Personnalisation du texte de l\'email de notification
+';
+
+$lang['LCAS_caseSensitiveTitle'] = 'Les options';
+$lang['LCAS_caseSensitiveTitle_d'] = 'Ces options permettent que les utilisateurs soient identifiés soit sans tenir compte de la casse (majusules et minuscules) de leur identifiant, soit sans tenir compte des accents, soit sans tenir compte d\'aucun des deux.<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_Email_Customization'] = 'Personnalisation de la notification par email';
+$lang['LCAS_Email_Customization_d'] = 'Vous pouvez personnaliser le texte à envoyer lors de la notification. Utilisez les balises [lang] pour une personnalisation multi-langues si le plugin Extended Description est actif.';
+
+$lang['LCAS_MailTitle'] = 'Notification par email';
+$lang['LCAS_MailTitle_d'] = 'Choisissez ici si un email de notification doit être envoyé automatiquement aux utilisateurs dont le login dû être modifié pour correspondre aux nouvelles règles de sensibilité.';
+?>
Index: /extensions/LCAS/tags/0.0.0RC1/language/fr_FR/index.php
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/language/fr_FR/index.php	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/language/fr_FR/index.php	(revision 9646)
@@ -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/tags/0.0.0RC1/language/fr_FR/messages.lang.php
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/language/fr_FR/messages.lang.php	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/language/fr_FR/messages.lang.php	(revision 9646)
@@ -0,0 +1,67 @@
+<?php
+
+global $lang;
+
+// English explanation:
+// This file sets the messages that are displayed to the users:
+// error message when a user tries to create an account which already exists,
+// and tooltip messages displayed when the mouse hovers above username and
+// password fields
+
+// You can create your own message for your personal table, having index 0:
+// $lang['LCAS_error'][0] = 'Your text here';
+// Remove comment identifier ("//"), and replace the text "Your text here" by
+// the text you want. Don't forget to write the apostrophe (') with a
+// preceding "\": 'This ain\'t a good text without it!'
+
+
+// Explications françaises :
+// Ce fichier définit les messages affichés aux utilisateurs :
+// message d'erreur lors de la création d'un compte, si ce compte existe déjà,
+// et infos-bulles affichées lorsque la souris survole les champs "nom
+// d'utilisateur" et "mot de passe"
+
+// Vous pouvez vous céer vos propres messages pour votre tableau personnel,
+// d'index 0 :
+// $lang['LCAS_error'][0] = 'Votre texte ici';
+// Retirez les identifiants de commentaire ("//"), et remplacez le texte
+// "Votre texte ici" par le texte dont vous avez besoin. N'oubliez
+// pas d'écrire l'apostrophe en le précédant d'un "\" :
+// 'Sinon ça l\'fera pas !'
+
+
+// New account creation error messages
+// Messages d'erreur lors de la création d'un nouveau compte
+$lang['LCAS_error'][1] = 'Ce nom d\'utilisateur est déjà pris.<br>Le nom d\'utilisateur est insensible à la casse (majuscules/minuscules&nbsp;; E = e ≠ É = é).';
+
+$lang['LCAS_error'][2] = 'Ce nom d\'utilisateur est déjà pris.<br>Le nom d\'utilisateur est insensible aux accents (e = é ≠ E = É).';
+
+$lang['LCAS_error'][3] = 'Ce nom d\'utilisateur est déjà pris.<br>Le nom d\'utilisateur est insensible à la casse (majuscules/minuscules) et aux accents (E = e = É = é).';
+
+
+// Tooltips in index page
+// Info-bulles sur la page index
+$lang['LCAS_tooltip_username_index'][0] = 'Le nom d\'utilisateur est sensible à la casse (majuscules/minuscules) et aux accents (E ≠ e ≠ É ≠ é)';
+
+$lang['LCAS_tooltip_username_index'][1] = 'Le nom d\'utilisateur est insensible à la casse (majuscules/minuscules&nbsp;; E = e ≠ É = é)';
+
+$lang['LCAS_tooltip_username_index'][2] = 'Le nom d\'utilisateur est insensible aux accents (e = é ≠ E = É)';
+
+$lang['LCAS_tooltip_username_index'][3] = 'Le nom d\'utilisateur est insensible à la casse (majuscules/minuscules) et aux accents (E = e = É = é)';
+
+$lang['LCAS_tooltip_password_index'] = 'Le mot de passe est toujours sensible à la casse (majuscules/minuscules) et aux accents (E ≠ e ≠ É ≠ é)';
+
+
+// Tooltips in register page
+// Info-bulles sur la page register
+$lang['LCAS_tooltip_username_register'][0] = 'Le nom d\'utilisateur est sensible à la casse (majuscules/minuscules) et aux accents (E ≠ e ≠ É ≠ é)';
+
+$lang['LCAS_tooltip_username_register'][1] = 'Le nom d\'utilisateur est insensible à la casse (majuscules/minuscules&nbsp;; E = e ≠ É = é)';
+
+$lang['LCAS_tooltip_username_register'][2] = 'Le nom d\'utilisateur est insensible aux accents (e = é ≠ E = É)';
+
+$lang['LCAS_tooltip_username_register'][3] = 'Le nom d\'utilisateur est insensible à la casse (majuscules/minuscules) et aux accents (E = e = É = é)';
+
+$lang['LCAS_tooltip_password_register'] = 'Le mot de passe est toujours sensible à la casse (majuscules/minuscules) et aux accents (E ≠ e ≠ É ≠ é)';
+
+?>
Index: /extensions/LCAS/tags/0.0.0RC1/language/fr_FR/plugin.lang.php
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/language/fr_FR/plugin.lang.php	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/language/fr_FR/plugin.lang.php	(revision 9646)
@@ -0,0 +1,54 @@
+<?php
+
+global $lang;
+
+$lang['LCAS_Title_Tab'] = 'Login Case Accents Sensitivity';
+$lang['LCAS_SubTitle_Global'] = 'Configuration du plugin';
+
+$lang['LCAS_Title_Global'] = 'Paramétrage de la sensibilité';
+
+$lang['LCAS option'] = 'Option LCAS :';
+$lang['LCAS_Option0'] = 'Pas d\'insensibilité (fonctionnement normal de Piwigo)';
+$lang['LCAS_Option1'] = 'Insensibilité à la casse';
+$lang['LCAS_Option2'] = 'Insensibilité aux accents';
+$lang['LCAS_Option3'] = 'Insensibilité à la casse et aux accents';
+$lang['LCAS_Option4'] = 'Tableau personnel';
+$lang['Personalized not allowed explanation'] = ' (vous devez définir un tableau $conf[\'LCAS_replacement_set\'][0] . Voir <a title = "To be defined">les tableaux d\'origine</a>)';
+$lang['Personalized not allowed tooltip'] = 'Pas de tableau $conf[\'LCAS_replacement_set\'][0] de défini';
+
+$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>';
+
+$lang['LCAS_UserList_Title'] = 'Utilisateurs nécessitant des modifications';
+
+$lang['LCAS_Info_userlist_username_renamed'] = 'Le nom de l\'utilisateur a été mis à jour.';
+$lang['LCAS_Err_Userlist_Empty_New_Username'] = 'Le nom de l\'utilisateur ne peut être vide.';
+$lang['LCAS_Err_Userlist_New_Username_Exists'] = 'Le nom de l\'utilisateur existe déjà.';
+
+$lang['LCAS_Compare_value_h'] = 'Comparaison';
+$lang['LCAS_Update_h'] = 'Modifier';
+
+$lang['LCAS_Update_User'] = 'Mettre &agrave; jour';
+
+$lang['LCAS_No_User'] = 'Aucun problème détecté pour les utilisateurs actuels';
+
+$lang['LCAS_save_config'] = 'Paramètres enregistrés<br>Veuillez vérifier les éventuels utilisateurs problématiques dans le tableau ci-dessous';
+
+$lang['submit'] = 'Sauvegarder les paramètres';
+
+$lang['LCAS_Mail'] = 'Notification par email';
+$lang['LCAS_MailText'] = 'Personnalisation de la notification par email';
+
+$lang['LCAS_PluginSupport'] = 'Support officiel du plugin';
+
+$lang['LCAS_DisableOption'] = ' Désactiver (valeur par défaut)';
+$lang['LCAS_EnableOption'] = ' Activer';
+
+/* Emailing */
+$lang['Username_updated_for_%s'] = 'Nom d\'utilisateur mis à jour pour %s';
+$lang['LCAS_NewUsername: %s'] = 'Votre nouveau nom d\'utilisateur : %s';
+$lang['LCAS_NewUser_Email: %s'] = 'Correspondant à l\'adresse email : %s';
+?>
Index: /extensions/LCAS/tags/0.0.0RC1/language/index.php
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/language/index.php	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/language/index.php	(revision 9646)
@@ -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/tags/0.0.0RC1/language/it_IT/description.txt
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/language/it_IT/description.txt	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/language/it_IT/description.txt	(revision 9646)
@@ -0,0 +1,1 @@
+﻿Permette di specificare se le connessioni e/o registrazioni devono essere case-sensitive e/o accettare gli accenti
Index: /extensions/LCAS/tags/0.0.0RC1/language/it_IT/index.php
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/language/it_IT/index.php	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/language/it_IT/index.php	(revision 9646)
@@ -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/tags/0.0.0RC1/main.inc.php
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/main.inc.php	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/main.inc.php	(revision 9646)
@@ -0,0 +1,170 @@
+<?php
+/*
+Plugin Name: LCAS
+Version: 0.0.0RC1
+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: Eric, LucMorizur, Whiler
+Author URI: 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);
+load_language('messages.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'];
+  
+ 		                                                                                // to be removed in final version : 
+ 		                                                                                global $template; 
+ 		                                                                                $template->delete_compiled_templates(); 
+  
+  array_push($menu,
+    array(
+      'NAME' => $name,
+      'URL'  => get_admin_plugin_menu_link(LCAS_PATH.'/admin/LCAS_admin.php')
+    )
+  );
+
+  return $menu;
+}
+
+function LCAS_add_tooltips_prefilter_register($content, &$smarty) {
+  $search = 'for="login"';
+  $replacement = 'for="login" title="{$LCAS_username_tooltip}"';
+  $content = str_replace($search, $replacement, $content);
+  $search = 'name="login"';
+  $replacement = 'name="login" title="{$LCAS_username_tooltip}"';
+  $content = str_replace($search, $replacement, $content);
+  $search = 'for="password"';
+  $replacement = 'for="password" title="{$LCAS_password_tooltip}"';
+  $content = str_replace($search, $replacement, $content);
+  $search = 'name="password"';
+  $replacement = 'name="password" title="{$LCAS_password_tooltip}"';
+  $content = str_replace($search, $replacement, $content);
+  $search = 'for="password_conf"';
+  $replacement = 'for="password_conf" title="{$LCAS_password_tooltip}"';
+  $content = str_replace($search, $replacement, $content);
+  $search = 'name="password_conf"';
+  $replacement = 'name="password_conf" title="{$LCAS_password_tooltip}"';
+  $content = str_replace($search, $replacement, $content);
+  return $content;
+}
+
+// Check users identification
+add_event_handler('init', 'LCAS_InitPage');
+ 
+function LCAS_InitPage()
+{
+  global $template, $conf, $lang;
+
+  $conf_LCAS= unserialize($conf['LoginCaseAccentsSensitivity']);
+  
+  // Set $conf['insensitive_case_logon'] to false, as LCAS takes completely
+  // in charge everything around the case and the accents
+  if ($conf_LCAS[0] != '0')
+   $conf['insensitive_case_logon'] = false;
+ 
+/* User identification */
+  if (script_basename() == 'identification')
+  {
+    if (isset($_POST['username']) and isset($conf_LCAS[0]))
+    {
+      $new_username = LCAS_SearchCaseUsername($_POST['username'],$conf_LCAS[0]);
+      $_POST['username'] = $new_username == '' ? $_POST['username'] : $new_username;
+    }
+  }
+  
+  // Add tooltips on register page
+  if (script_basename() == 'register') {
+    $template->assign(array(
+      'LCAS_username_tooltip' => $lang['LCAS_tooltip_username_register'][intval($conf_LCAS[0])],
+      'LCAS_password_tooltip' => $lang['LCAS_tooltip_password_register'],
+    ));
+    $template->set_prefilter('register', 'LCAS_add_tooltips_prefilter_register');
+  }
+}
+
+// Check users registration
+// Returns error
+add_event_handler('register_user_check', 'LCAS_RegistrationCheck');
+
+function LCAS_RegistrationCheck($errors)
+{
+  global $conf, $lang;
+  
+  $conf_LCAS= unserialize($conf['LoginCaseAccentsSensitivity']);
+  
+  load_language('plugin.lang', LCAS_PATH);
+
+  if (isset($conf_LCAS[0]))
+   $NewPostLogin = LCAS_SearchCaseUsername($_POST['login'], $conf_LCAS[0]);
+  
+  if (isset($NewPostLogin) and get_userid($NewPostLogin))
+   $errors[] = $lang['LCAS_error'][intval($conf_LCAS[0])];
+  
+  return $errors;
+}
+
+/**
+ *
+ * LCAS_add_tooltips()
+ * add tooltips on username and password fields
+ *
+ * @param no parameter
+ * @return no return value
+ */
+
+add_event_handler('blockmanager_apply', 'LCAS_add_tooltips_index');
+
+function LCAS_add_tooltips_prefilter_index($content, &$smarty) {
+  $search = 'for="username"';
+  $replacement = 'for="username" title="{$LCAS_username_tooltip}"';
+  $content = str_replace($search, $replacement, $content);
+  $search = 'name="username"';
+  $replacement = 'name="username" title="{$LCAS_username_tooltip}"';
+  $content = str_replace($search, $replacement, $content);
+  $search = 'for="password"';
+  $replacement = 'for="password" title="{$LCAS_password_tooltip}"';
+  $content = str_replace($search, $replacement, $content);
+  $search = 'name="password"';
+  $replacement = 'name="password" title="{$LCAS_password_tooltip}"';
+  $content = str_replace($search, $replacement, $content);
+  return $content;
+}
+
+function LCAS_add_tooltips_index() {
+  global $template, $conf, $lang;
+  
+  $conf_LCAS= unserialize($conf['LoginCaseAccentsSensitivity']);
+  
+  $template->assign(array(
+    'LCAS_username_tooltip' => $lang['LCAS_tooltip_username_index'][intval($conf_LCAS[0])],
+    'LCAS_password_tooltip' => $lang['LCAS_tooltip_password_index'],
+  ));
+  $template->set_prefilter('menubar', 'LCAS_add_tooltips_prefilter_index');
+}
+
+?>
Index: /extensions/LCAS/tags/0.0.0RC1/maintain.inc.php
===================================================================
--- /extensions/LCAS/tags/0.0.0RC1/maintain.inc.php	(revision 9646)
+++ /extensions/LCAS/tags/0.0.0RC1/maintain.inc.php	(revision 9646)
@@ -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;
+	
+  $default = array('0','false','Example customized content of the notification email');
+
+  $q = '
+INSERT INTO '.CONFIG_TABLE.' (param, value, comment)
+VALUES ("LoginCaseAccentsSensitivity","'.addslashes(serialize($default)).'","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);
+  }
+
+}
+?>
