Initial commit

This commit is contained in:
Phyks 2013-07-28 14:56:18 +02:00
commit 9528de870d
27 changed files with 2695 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
*~

68
Bouffe_Ulm.sql Normal file
View File

@ -0,0 +1,68 @@
-- phpMyAdmin SQL Dump
-- version 3.5.4
-- http://www.phpmyadmin.net
--
-- Client: localhost
-- Généré le: Sam 15 Décembre 2012 à 20:45
-- Version du serveur: 5.5.28a-MariaDB-log
-- Version de PHP: 5.4.9
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
--
-- Base de données: `Bouffe@Ulm`
--
-- --------------------------------------------------------
--
-- Structure de la table `copains`
--
CREATE TABLE IF NOT EXISTS `copains` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nom` varchar(255) NOT NULL,
`password` char(40) NOT NULL,
`admin` tinyint(4) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;
-- --------------------------------------------------------
--
-- Structure de la table `depenses`
--
CREATE TABLE IF NOT EXISTS `depenses` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`menu` text NOT NULL,
`date` int(11) NOT NULL,
`de` int(11) NOT NULL,
`copains` varchar(255) NOT NULL,
`montant` float NOT NULL,
`invites` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
-- --------------------------------------------------------
--
-- Structure de la table `paiements`
--
CREATE TABLE IF NOT EXISTS `paiements` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`de` int(11) NOT NULL,
`a` int(11) NOT NULL,
`id_depense` int(11) NOT NULL,
`date` int(11) NOT NULL,
`montant` float NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

1
README Normal file
View File

@ -0,0 +1 @@
- Don't forget to change $CONFIG vars in include.php to match your own domain !

2
TODO Normal file
View File

@ -0,0 +1,2 @@
Problème avec tri dans tableau d'accueil (cf afficher toutes les dépenses)
Trier par prénom et non pas user_id lors du tri par "de"

105
connexion.php Normal file
View File

@ -0,0 +1,105 @@
<?php
require('include.php');
init(false, false); //No need to authenticate to see this page, the authentications are made below
if(!empty($_COOKIE['id']) AND !empty($_COOKIE['connexion_auto']) AND empty($_GET['deco']))
{
$req = $bdd->prepare('SELECT nom, password, admin FROM copains WHERE id=:id');
$req->bindValue(':id', $_COOKIE['id']);
$req->execute();
$donnees = $req->fetch();
$navigateur = (!empty($_SERVER['HTTP_USER_AGENT'])) ? $_SERVER['HTTP_USER_AGENT'] : '';
$hash_cookie = '8531fd8c7a18b10700b9e7bf040b349009f7c711'.sha1($donnees['nom']).'9ff80fa675712e6cfa5482b96a4a5e488b68cabe'.sha1($donnees['password']).'cb9013648bed4362d3d98b553f1afc62c4381058'.sha1($navigateur).'17c0cf0afe131e12886bea1757dba73801b6c7d1'.sha1($_SERVER['REMOTE_ADDR']).'bf63c72e9a6ecad6c0d85d8eb972fceed8a14da2';
if($hash_cookie == $_COOKIE['connexion_auto'])
{
$_SESSION['id'] = (int) $_COOKIE['id'];
$_SESSION['nom'] = htmlspecialchars($donnees['nom']);
$_SESSION['admin'] = (int) $donnees['admin'];
header('location: index.php');
exit();
}
}
if(!empty($_SESSION['nom']) && empty($_GET['deco'])) //If we don't want to disconnect
{
header('location: index.php'); //No need to see this page
exit();
}
if(!empty($_POST['nom']) && !empty($_POST['password'])) //If we want to connect
{
$req = $bdd->prepare('SELECT id, password, admin FROM copains WHERE nom=:nom'); //Get the pass in bdd
$req->bindValue(':nom', $_POST['nom']);
$req->execute();
$donnees = $req->fetch();
$password = sha1($_POST['password'] . $CONFIG['salt']);
if($donnees['password'] == $password) //Salt
{
$_SESSION['id'] = (int) $donnees['id'];
$_SESSION['nom'] = htmlspecialchars($_POST['nom']);
$_SESSION['admin'] = (int) $donnees['admin'];
if(!empty($_POST['auto_connect']))
{
$navigateur = (!empty($_SERVER['HTTP_USER_AGENT'])) ? $_SERVER['HTTP_USER_AGENT'] : '';
$hash_cookie = '8531fd8c7a18b10700b9e7bf040b349009f7c711'.sha1($_SESSION['nom']).'9ff80fa675712e6cfa5482b96a4a5e488b68cabe'.sha1($password).'cb9013648bed4362d3d98b553f1afc62c4381058'.sha1($navigateur).'17c0cf0afe131e12886bea1757dba73801b6c7d1'.sha1($_SERVER['REMOTE_ADDR']).'bf63c72e9a6ecad6c0d85d8eb972fceed8a14da2';
setcookie( 'id', $_SESSION['id'], time()+31536000, '/', $CONFIG['domain'], true, true);
setcookie('connexion_auto', $hash_cookie, time()+31536000, '/', $CONFIG['domain'], true, true);
}
header('location: index.php');
exit();
}
else
{
header('location:message.php?id=8'); //Error message
exit();
}
}
if(!empty($_GET['deco'])) //If we want to disconnect
{
session_destroy();
if(!empty($_COOKIE['id']))
setcookie( 'id', '', time()-31536000, '/', $CONFIG['domain'], true, true);
if(!empty($_COOKIE['connexion_auto']))
setcookie( 'connexion_auto', '', time()-31536000, '/', $CONFIG['domain'], true, true);
header('location: connexion.php');
exit();
}
//Display a log form
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Bouffe@Ulm</title>
<link rel="stylesheet" media="screen" type="text/css" href="misc/design.css" />
<link rel="icon" href="favicon.ico" />
</head>
<body>
<h1>Bouffe@Ulm - Connexion</h1>
<form method="post" action="connexion.php">
<p>
<label for="nom">Nom : </label><input type="text" size="50" name="nom" id="nom"/>
</p>
<p>
<label for="password">Mot de passe : </label><input type="password" size="50" name="password" id="password"/>
</p>
<p>
<label class="inline" for="1">Connexion automatique ? </label><input type="checkbox" name="auto_connect" value="1" id="1">
</p>
<p><input type="submit" value="Connexion"/></p>
</form>
</body>
</html>

133
copains.php Normal file
View File

@ -0,0 +1,133 @@
<?php
require('include.php');
init(true, true);
if(isset($_GET['del']) && !empty($_GET['token']) && $_GET['token'] == $_SESSION['token_buddy'] && $_SESSION['token_buddy_time'] > time() - (15*60) AND strpos($_SERVER['HTTP_REFERER'], 'http://'.$CONFIG['base_url'].'/index.php') == 0) //If we want to delete a buddy
{
$id = (int) $_GET['del'];
$bdd->query('DELETE FROM copains WHERE id='.$id);
header('location: message.php?id=4');
exit();
}
if(isset($_POST['id']) && isset($_POST['nom']) && !empty($_POST['token']) && $_POST['token'] == $_SESSION['token_buddy'] && $_SESSION['token_buddy_time'] > time() - (15*60) AND strpos($_SERVER['HTTP_REFERER'], 'http://'.$CONFIG['base_url'].'/index.php') == 0) //If we want to add or delete a buddy
{
if(!empty($_POST['id']))
{
$req = $bdd->prepare('UPDATE copains SET nom=:nom, admin=:admin WHERE id='.(int) $_POST['id']);
if(!empty($_POST['password']))
{
$req2 = $bdd->prepare('UPDATE copains SET password=:password WHERE id='.(int) $_POST['id']);
$req2->bindValue(':password', sha1($_POST['password'] . $CONFIG['salt']));
$req2->execute();
}
$message = 5;
}
else
{
$req = $bdd->prepare('INSERT INTO copains (id, nom, password, admin) VALUES ("", :nom, :password, :admin)');
$req->bindValue(':password', sha1($_POST['password'] . $CONFIG['salt']));
$message = 6;
}
$req->bindValue(':nom', $_POST['nom']);
$req->bindValue(':admin', intval($_POST['admin']));
$req->execute();
header('location: message.php?id='.$message);
}
$_SESSION['token_buddy'] = sha1(uniqid(rand(), true)); //We generate a token and store it in a session variable
$_SESSION['token_buddy_time'] = time(); //We also store the time at which the token has been generated
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Bouffe@Ulm</title>
<link rel="stylesheet" media="screen" type="text/css" href="misc/design.css" />
<link rel="icon" href="favicon.ico" />
</head>
<body>
<h1>Bouffe@Ulm</h1>
<?php
if(!isset($_GET['modif']))
{
?>
<h2>Liste des copains</h2>
<p><a href="index.php">Retour à l'accueil</a></p>
<table><!-- Form -->
<tr>
<th> <a class='text-deco-none' href='?tri=id&amp;sens=asc' title='/\'><img src="misc/asc.png" alt="/\"/></a> <a class='text-deco-none' href='?tri=id&amp;sens=desc' title='\/'><img src="misc/desc.png" alt="/\"/></a></th>
<th>Nom <a class='text-deco-none' href='?tri=nom&amp;sens=asc' title='/\'><img src="misc/asc.png" alt="/\"/></a> <a class='text-deco-none' href='?tri=nom&amp;sens=desc' title='\/'><img src="misc/desc.png" alt="/\"/></a></th>
<th>Admin ? <a class='text-deco-none' href='?tri=admin&amp;sens=asc' title='/\'><img src="misc/asc.png" alt="/\"/></a> <a class='text-deco-none' href='?tri=admin&amp;sens=desc' title='\/'><img src="misc/desc.png" alt="/\"/></a></th>
<th>Modifier</th>
<th>Supprimer</th>
</tr>
<?php
if(isset($_GET['tri']) && isset($_GET['sens']) && ($_GET['tri'] == 'id' || $_GET['tri'] == 'nom') && ($_GET['sens'] == 'asc' || $_GET['sens'] == 'desc'))
{
$req = $bdd->query('SELECT id, nom, admin FROM copains ORDER BY '.$_GET['tri'].' '.$_GET['sens']);
}
else
{
$req = $bdd->query('SELECT id, nom, admin FROM copains ORDER BY nom ASC');
}
while($donnees = $req->fetch())
{
$id = (int) $donnees['id'];
if($donnees['admin'] == 1)
{
$admin = 'Oui';
}
else
{
$admin = 'Non';
}
echo '<tr>
<td>'.$id.'</td>
<td>'.htmlspecialchars($donnees["nom"]).'</td>
<td>'.$admin.'</td>
<td><a href="?modif='.$id.'">Modifier</a></td>
<td><a href="?del='.$id.'&amp;token='.$_SESSION['token_buddy'].'">Supprimer</a></td>
</tr>';
}
$req->closeCursor();
?>
</table>
<h2>Ajouter un copain</h2>
<?php
}
else
{
$modif = (int) $_GET['modif'];
$req = $bdd->query('SELECT nom, admin FROM copains WHERE id='.$modif);
$donnees = $req->fetch();
$req->closeCursor();
?>
<h2>Modifier un copain</h2>
<?php
}
?>
<form method="post" action="copains.php">
<p><label for="nom">Nom : </label><input type="text" name="nom" id="nom" size="50" value="<?php if(isset($modif)) echo htmlspecialchars($donnees['nom']);?>"/></p>
<p><label for="password">Mot de passe (laisser vide pour ne pas modifier) : </label><input type="password" name="password" id="password" size="50"/></p>
<p>
<label for="admin">Admin ? </label>
<select name="admin" id = "admin">
<option value="0" <?php if($donnees['admin'] != 1) echo 'selected="selected"';?>>Non</option>
<option value="1" <?php if($donnees['admin'] == 1) echo 'selected="selected"';?>>Oui</option>
</select>
</p>
<p>
<input type="submit" value="<?php if(isset($modif)) { echo 'Modifier'; } else { echo 'Ajouter';}?>"/><input type="hidden" name="id" value="<?php if(isset($modif)) { echo $modif;}?>"/>
<input type="hidden" name="token" value="<?php echo $_SESSION['token_buddy'];?>"/>
</p>
</form>
</body>
</html>

BIN
favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

36
include.php Normal file
View File

@ -0,0 +1,36 @@
<?php
//Init file
function init($protect, $admin)
{
global $bdd;
global $CONFIG;
//Connect to the BDD
$bdd = new PDO('mysql:host=localhost;dbname=Bouffe@Ulm', 'Bouffe@Ulm', 'aR4ndnabwE5RyEEx');
$bdd->query("SET NAMES 'utf8'");
session_start();
date_default_timezone_set('Europe/Paris'); //Definition of the clock
if($protect) //If user must be logged in
{
if(empty($_SESSION['nom']))
{
header('location:connexion.php');
exit();
}
}
if($admin) //If he must be an admin
{
if(empty($_SESSION['admin']))
{
header('location: message.php?id=7');
exit();
}
}
$CONFIG['base_url'] = 'localhost/Bouffe@Ulm/';
$CONFIG['domain'] = '';
$CONFIG['salt'] = '62407efbf5e8508baf096e1e23f497991e12a3bd';
}

425
index.php Normal file
View File

@ -0,0 +1,425 @@
<?php
require('include.php');
init(true, false);
//Return an array with date of the start of the month and of the end of the month
function bornes_mois($num_mois,$annee)
{
$debut_mois = mktime(0, 0, 0,$num_mois, 1, $annee);
$dernier_jour = array(
1=>31,
2=>28+date('L'),
3=>31,
4=>30,
5=>31,
6=>30,
7=>31,
8=>31,
9=>30,
10=>31,
11=>30,
12=>31);
$fin_mois = mktime(23, 59, 59, $num_mois, $dernier_jour[$num_mois], $annee);
$bornes = array($debut_mois, $fin_mois);
return $bornes;
}
//Return what A must pay to B
function dettes($A, $B, $debut_mois, $fin_mois)
{
global $bdd;
//When A paid and B was here
$reqA_B = $bdd->prepare('SELECT id, date, montant, copains, invites FROM depenses WHERE date>'.$debut_mois.' AND date<'.$fin_mois.' AND de=:param1 AND (copains LIKE "%,'.(int) $B.',%" OR copains LIKE "%,'.(int)$B.'" OR copains LIKE "'.(int) $B.',%" OR copains LIKE "'.(int) $B.'")');
$reqA_B->bindvalue(':param1',$A);
$reqA_B->execute();
//When B paid and A was here
$reqB_A = $bdd->prepare('SELECT id, date, montant, copains, invites FROM depenses WHERE date>'.$debut_mois.' AND date<'.$fin_mois.' AND de=:param1 AND (copains LIKE "%,'.(int) $A.',%" OR copains LIKE "%,'.(int)$A.'" OR copains LIKE "'.(int) $A.',%" OR copains LIKE "'.(int) $A.'")');
$reqB_A->bindvalue(':param1',$B);
$reqB_A->execute();
//What A already paid to B for the current month
$reqPaiementsA_B = $bdd -> prepare('SELECT paiements.montant AS montant FROM paiements LEFT JOIN depenses ON paiements.id_depense=depenses.id WHERE depenses.date >'.$debut_mois.' AND depenses.date<'.$fin_mois.' AND paiements.de=:de AND paiements.a=:a');
$reqPaiementsA_B->bindvalue(':de',$A);
$reqPaiementsA_B->bindvalue(':a',$B);
$reqPaiementsA_B->execute();
//Same thing for B to A
$reqPaiementsB_A = $bdd -> prepare('SELECT paiements.montant AS montant FROM paiements LEFT JOIN depenses ON paiements.id_depense=depenses.id WHERE depenses.date >'.$debut_mois.' AND depenses.date<'.$fin_mois.' AND paiements.de=:de AND paiements.a=:a');
$reqPaiementsB_A->bindvalue(':de',$B);
$reqPaiementsB_A->bindvalue(':a',$A);
$reqPaiementsB_A->execute();
//$deltaAB : What A must pay to B
$deltaAB = 0;
while($donneesA_B = $reqA_B->fetch())
{
//We get the price of the meal, divided by the number of people who ate
//nbre de virgule + 1
$deltaAB -= $donneesA_B['montant']/(substr_count($donneesA_B['copains'], ',') + 1 + $donneesA_B['invites']);
}
while($donneesB_A = $reqB_A->fetch()) //idem
{
$deltaAB += $donneesB_A['montant']/(substr_count($donneesB_A['copains'], ',') + 1 + $donneesB_A['invites']);
}
while($donneesPaiementsA_B = $reqPaiementsA_B->fetch()) //idem
{
$deltaAB -= $donneesPaiementsA_B['montant'];
}
while($donneesPaiementsB_A = $reqPaiementsB_A->fetch()) //idem
{
$deltaAB += $donneesPaiementsB_A['montant'];
}
return $deltaAB;
}
if(isset($_GET['del'])) //If we want to delete an expenditure
{
if(empty($_GET['valide']) OR empty($_GET['token']) OR $_GET['token'] != $_SESSION['token_del_depense'] OR $_SESSION['token_del_depense_time'] < time() - (15*60) OR strpos($_SERVER['HTTP_REFERER'], 'http://'.$CONFIG['base_url'].'/index.php') > 0 OR strpos($_SERVER['HTTP_REFERER'], 'https://'.$CONFIG['base_url'].'/index.php') > 0) //If we didn't click the link to validate the deletion and the token is not valid (not present or older than 15 minutes) or if the referer is not ok
{
$_SESSION['token_del_depense'] = sha1(uniqid(rand(), true)); //We generate a token and store it in a session variable
$_SESSION['token_del_depense_time'] = time(); //We also store the time at which the token has been generated
$lien = 'index.php?del='.$_GET['del'] .'&amp;valide=1&amp;token='.$_SESSION['token_del_depense'];
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Bouffe@Ulm</title>
<link rel="stylesheet" media="screen" type="text/css" href="misc/design.css" />
<link rel="icon" href="favicon.ico" />
</head>
<body>
<h1>Validation de la suppression du repas</h1>
<p><a href="<?php echo $lien;?>">Confirmer la suppression</a> ou <a href="index.php">Retour</a></p>
</body>
</html>
<?php
exit();
}
//else, we can delete the expenditure
$id = (int) $_GET['del'];
$bdd->query('DELETE FROM depenses WHERE id='.$id);
$bdd->query('DELETE FROM paiements WHERE id_depense='.$id);
header('location: message.php?id=1');
exit();
}
//This get all the friends' name (we need it next)
$req2 = $bdd->query('SELECT id, nom FROM copains ORDER BY nom ASC');
while($copain = $req2->fetch())
{
$copains[$copain['id']] = $copain['nom']; //And put it in an array
}
$req_jeu = $bdd->prepare('SELECT COUNT(*) AS nbre_jeu FROM depenses WHERE de=:de');
$req_jeu->bindValue(':de', $_SESSION['id']);
$req_jeu->execute();
$donnees_jeu = $req_jeu->fetch(); //To define wether we display the game or not
//SESSION token for the update of what people must pay to us (modif.php)
$_SESSION['token_validate_single'] = sha1(uniqid(rand(), true)); //We generate a token and store it in a session variable
$_SESSION['token_validate_single_time'] = time(); //We also store the time at which the token has been generated
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Bouffe@Ulm</title>
<link rel="stylesheet" media="screen" type="text/css" href="misc/design.css" />
<link rel="icon" href="favicon.ico" />
<?php
if($donnees_jeu['nbre_jeu'] >= 1 || $_SESSION['admin'] == 1)
{
?>
<link href="misc/background.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="misc/jquery.min.js"></script>
<script type="text/javascript" src="misc/background.js"></script>
<?php
}
?>
</head>
<body>
<h1>Bouffe@Ulm</h1>
<?php
if(is_file("annonce"))
{
?>
<p style="font-weight: bold; color: red; text-align: center; border: 1px solid red; padding-top: 10px; padding-bottom: 10px; font-size: 1.5em;"><?php echo nl2br(file_get_contents('annonce'));?></p>
<?php
}
if(isset($_SESSION['nom']) && $_SESSION['nom'] == 'Grégoire') //Special thing for our friend Gregoire !
{
if(empty($_GET['aClique']) OR $_GET['aClique'] != 42) //If 10 seconds timeout ok
{
echo '
<a href="?aClique=42"><pre>
xxxxx
xXXXXXXXXXx
XXXXXXXXXXXXX
xXXXXXXXX XXXx
XXXXXXXXX 0XXXX\\\\\\
xXXXXXXXXXxxXXXX\\\\\\\
XXXXXXXXXXXXXXXX////// \
XXXXXXXXXXXXXXXXX
XXXXX|\XXX/|XXXXX
XXXXX| \-/ |XXXXX
xXXXXX| [ ] |XXXXXx
xXXXX | /-\ | XXXXx
xXXXXX |/ \| XXXXXx
xXXXXXX XXXXXXx
xXXXXXXX XXXXXXXx
xXXXXXXXX XXXXXXXXx
xXXXXXXXXX XXXXXXXXXx
xXXXXXXXXXX XXXXXXXXXXx
xXXXXXXXXXXX XXXXXXXXXXXx
xXXXXXXXX XXX XXX XXXXXXXXx
XXXXXXXX XXX XXX XXXXXXXX
xXXXXXXX XXX XXX XXXXXXXx
XXXXXX XXX XXX XXXXXX
XXXX XXX XXX XXXX
XX XXX XXX XX
XXX XXX
XXX XXX
XXX XXX
XXX XXX
XXXx xXXX
XXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXX XXXXXXX
____XXXXXX XXXXXX____
/________/ \________\</pre></a></body></html>';
exit();
}
else
{
$_SESSION['aClique_time'] = time();
}
}
?>
<p>
<a href="modif.php">Ajouter une dépense</a> | <a href="modif_password.php">Modifier le mot de passe</a> | <a href="rbmt.php">Consulter les remboursements</a> |
<?php if(!empty($_SESSION['admin']))
{
?>
<a href="rbmt_admin.php">Gérer les remboursements</a> |
<a href="copains.php">Modifier les copains</a> |
<a href="modif_annonce.php">Modifier l'annonce d'accueil</a> |
<?php
}
?>
<a href="connexion.php?deco=1">Déconnexion</a>
</p>
<h2>Qui doit quoi ?</h2>
<p>Lire "ligne" doit "case" à "colonne". Les liens permettent de confirmer le paiement des dettes.</p> <!-- Read "line" must pay "case" to "column" -->
<table>
<tr>
<th class="centre">Doit\À</th>
<?php
//Construct the header of the table and display it for the previous months
foreach($copains as $copain)
{
if($_SESSION['nom'] == $copain)
$copain = '<strong>'.$copain.'</strong>';
echo '<th class="centre">'.$copain.'</th>';
}
?>
</tr>
<?php
$mois = date('n');
$annee = date('Y');
$bornes = bornes_mois($mois, $annee);
$debut_mois = 0;
$fin_mois = $bornes[1];
foreach($copains as $keyA=>$copainA)
{
if($_SESSION['nom'] == $copainA)
$copainA = '<strong>'.$copainA.'</strong>';
echo '<tr><th class="centre">'.$copainA.'</th>';
foreach($copains as $keyB=>$copainB)
{
$deltaAB = dettes($keyA,$keyB, $debut_mois, $fin_mois);
if(round($deltaAB,2) <= 0) echo '<td class="centre">-</td>';
else
{
echo '<td class="centre"><a href="valider_paiements.php?de=' . $keyA . '&amp;a=' . $keyB . '&amp;date=all">' . round($deltaAB, 2) . '€</a></td>';
$lien_valider_tous[$keyB] = 1;
}
}
echo '</tr>';
}
echo '<tr><th>Validation</th>';
foreach($copains as $key=>$copain)
{
if(($_SESSION['nom'] == $copain OR $_SESSION['admin'] == 1) && !empty($lien_valider_tous[$key]))
echo '<td><a href="valider_paiements.php?all=1&amp;a='.$key.'&amp;date=prev">Confirmer paiements</a></td>';
else
echo '<td></td>';
}
echo '</tr>';
?>
</table>
<?php
if(empty($_GET['all'])) echo '<h2>Dépenses détaillées du mois actuel</h2>';
else echo '<h2>Dépenses détaillées</h2>';
//Then we display all the expenditures
?>
<table>
<tr>
<th class="centre">Date <a class='text-deco-none' href='?tri=date&amp;sens=asc' title='/\'><img src="misc/asc.png" alt="/\"/></a> <a class='text-deco-none' href='?tri=date&amp;sens=desc' title='\/'><img src="misc/desc.png" alt="/\"/></a></th>
<th class="centre">Payé par <a class='text-deco-none' href='?tri=de&amp;sens=asc' title='/\'><img src="misc/asc.png" alt="/\"/></a> <a class='text-deco-none' href='?tri=de&amp;sens=desc' title='\/'><img src="misc/desc.png" alt="/\"/></a></th>
<th class="centre">Copains <a class='text-deco-none' href='?tri=copains&amp;sens=asc' title='/\'><img src="misc/asc.png" alt="/\"/></a> <a class='text-deco-none' href='?tri=copains&amp;sens=desc' title='\/'><img src="misc/desc.png" alt="/\"/></a></th>
<th class="centre">Montant <a class='text-deco-none' href='?tri=depense&amp;sens=asc' title='/\'><img src="misc/asc.png" alt="/\"/></a> <a class='text-deco-none' href='?tri=depense&amp;sens=desc' title='\/'><img src="misc/desc.png" alt="/\"/></a></th>
<th class="centre">Menu <a class='text-deco-none' href='?tri=menu&amp;sens=asc' title='/\'><img src="misc/asc.png" alt="/\"/></a> <a class='text-deco-none' href='?tri=menu&amp;sens=desc' title='\/'><img src="misc/desc.png" alt="/\"/></a></th>
<th class="centre">Modifier</th>
<th class="centre">Supprimer</th>
</tr>
<?php
//Limites :
$bornes = bornes_mois(date('n'), date('y'));
$debut_mois = $bornes[0];
$fin_mois = $bornes[1];
if(!empty($_GET['all'])) $debut_mois = 0;
//First, we get the expenditures we want
if(isset($_GET['tri']) && isset($_GET['sens']) && in_array($_GET['tri'], array('id', 'menu', 'date', 'de', 'copains', 'montant')) && ($_GET['sens'] == 'asc' || $_GET['sens'] == 'desc'))
{
$req = $bdd->query('SELECT id, menu, date, de, copains, montant, invites FROM depenses WHERE date>'.$debut_mois.' AND date<'.$fin_mois.' ORDER BY '.$_GET['tri'].' '.$_GET['sens'].', date DESC');
}
else
{
$req = $bdd->query('SELECT id, menu, date, de, copains, montant, invites FROM depenses WHERE date>'.$debut_mois.' AND date<'.$fin_mois.' ORDER BY date DESC');
}
while($donnees = $req->fetch())
{
//Date (AM/PM)
$AM_PM = array('AM'=>'le midi', 'PM'=>'le soir');
$date = date('j/m', $donnees['date']).' '.$AM_PM[date('A', $donnees['date'])];
$id = (int) $donnees['id'];
$copains_in_array_id = explode(',', $donnees['copains']); //List of friends who ate (array)
$copains_in = '';
$nombre_participants = count($copains_in_array_id);
$req_paiements = $bdd->query('SELECT de, montant FROM paiements WHERE id_depense='.$id); //List of who paid yet
$paiements = array();
$montants = array();
while($paiement = $req_paiements->fetch())
{
// We use an array to store the list of friends who paid and so to
// avoir a useless 2D array search
$paiements[$paiement['de']] = $paiement['de'];
// If we already defined $montant[]
if (isset($montants[$paiement['de']]))
$montants[$paiement['de']] += $paiement['montant'];
else
$montants[$paiement['de']] = $paiement['montant'];
}
// Friend number 0 is none
$copains[0] = "Tout seul";
$copains_in_array_name = array();
//Prepare an array with buddy names to sort it
foreach($copains_in_array_id as $key=>$id_copain) {
$copains_in_array_name[$key] = $copains[(int) $id_copain];
}
asort($copains_in_array_name);
$i = 0;
// What to write in the friends cell
foreach($copains_in_array_name as $key=>$copain)
{
$copains_in .= $copain;
$id_copain = $copains_in_array_id[$key];
$keys = array_keys($paiements, $id_copain);
if($id_copain != $donnees['de'])
{
$montant_du = (float) $donnees['montant']/(substr_count($donnees['copains'], ',') + 1 + $donnees['invites']);
if(!empty($keys))
{
if(round($montants[$keys[0]],2) == round($montant_du,2))
$copains_in .= ' (payé)';
else
$copains_in .= ' (<a href="modif.php?de='.$id_copain.'&amp;id_depense='.$id.'&amp;a='.$donnees['de'].'&amp;token='.$_SESSION['token_validate_single'].'">reste '.round($montant_du - $montants[$keys[0]],2).'€</a>)';
}
else
$copains_in .= ' (<a href="modif.php?de='.$id_copain.'&amp;id_depense='.$id.'&amp;a='.$donnees['de'].'&amp;token='.$_SESSION['token_validate_single'].'">reste '.round($montant_du,2).'€</a>)';
}
if($i != $nombre_participants-1)
$copains_in .= '<br/>';
$i++;
}
$invites = '';
if($donnees['invites'] == 1)
$invites = '<br/>'. (int) $donnees['invites'].' invité';
if($donnees['invites'] > 1)
$invites = '<br/>'. (int) $donnees['invites'].' invités';
//Only the admin and the one who paid the meal can edit it
if((int) $donnees['de'] == $_SESSION['id'] || $_SESSION['admin'] == 1) {
$modif_link = '<a href="modif.php?id='.$id.'">Modifier</a>';
$suppr_link = '<a href="?del='.$id.'">Supprimer</a>';
}
else
{
$modif_link = '';
$suppr_link = '';
}
echo '<tr>
<td>'.$date.'</td>
<td>'.$copains[(int) $donnees["de"]].'</td>
<td>'.$copains_in.$invites.'</td>
<td>'.(float) $donnees['montant'].'</td>
<td>'.nl2br(htmlspecialchars($donnees["menu"])).'</td>
<td>'.$modif_link.'</td>
<td>'.$suppr_link.'</td>
</tr>';
}
$req->closeCursor();
?>
</table>
<p>
<?php
if(!empty($_GET['all']))
{
echo '<a href="index.php">N\'afficher que les dépenses du dernier mois.</a>';
}
else
{
echo '<a href="index.php?all=1">Afficher toutes les dépenses</a>';
}
?>
</p>
<?php
if($donnees_jeu['nbre_jeu'] >= 1 || $_SESSION['admin'] == 1 || $_SESSION['nom'] == 'Alexandre') //Bonus : display a "My little Poney" game
{
?>
<div id="fake"></div>
<div class="section" id="empty"></div>
<div id="background">
<div class="level">
<div class="mario-sprite" style="left: 256.3720261632001px; bottom: 112px; "><img src="misc/mariosprite.png"></div>
</div>
<?php
}
?>
</body>
</html>

49
message.php Normal file
View File

@ -0,0 +1,49 @@
<?php
if(empty($_GET['id']))
{
header('location: index.php');
}
else
{
$id = (int) $_GET['id'];
$message = array(
1=>array("message"=>"Dépense supprimée avec succès.", "url"=>"index.php"),
2=>array("message"=>"Dépense modifiée avec succès.", "url"=>"index.php"),
3=>array("message"=>"Dépense ajoutée avec succès.", "url"=>"index.php"),
4=>array("message"=>"Copain supprimé avec succès.", "url"=>"copains.php"),
5=>array("message"=>"Copain modifié avec succès.", "url"=>"copains.php"),
6=>array("message"=>"Copain ajouté avec succès.", "url"=>"copains.php"),
7=>array("message"=>"Page à accès restreint, se connecter en administrateur.", "url"=>"index.php"),
8=>array("message"=>"Erreur à la connexion. Vérifiez vos identifiants.", "url"=>"connexion.php"),
9=>array("message"=>"Vous n'avez pas le droit d'exécuter cette action.", "url"=>"index.php"),
10=>array("message"=>"Paiement validé.", "url"=>"index.php"),
11=>array("message"=>"Paiements validés.", "url"=>"index.php"),
12=>array("message"=>"Erreur lors de la modification du mot de passe.", "url"=>"modif_password.php"),
13=>array("message"=>"Mot de passe modifié avec succès.", "url"=>"index.php"),
14=>array("message"=>"Remboursement ajouté avec succès.", "url"=>"rbmt_admin.php"),
15=>array("message"=>"Remboursement supprimé avec succès.", "url"=>"rbmt_admin.php"),
16=>array("message"=>"Erreur lors de la suppression du remboursement.", "url"=>"rbmt_admin.php")
);
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Bouffe@Ulm</title>
<link rel="stylesheet" media="screen" type="text/css" href="misc/design.css" />
<link rel="icon" href="favicon.ico" />
<?php
echo '<meta http-equiv="refresh" content="1;URL='.$message[$id]['url'].'">';
?>
</head>
<body>
<h1>Bouffe@Ulm</h1>
<?php
echo '<p>'.$message[$id]['message'].' Redirection automatique dans 1 seconde. <a href="'.$message[$id]['url'].'">Ne pas attendre</a></p>';
?>
</body>
</html>
<?php
}
?>

BIN
misc/asc.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 B

61
misc/background.css Normal file
View File

@ -0,0 +1,61 @@
#background {
width : 100%;
height : 100%;
position : fixed;
top : 0px;
left : 0px;
overflow : hidden;
z-index : -1;
opacity : 0.5;
}
#fake
{
height: 248px;
}
#background .level {
height : 248px;
width : 3392px;
position : absolute;
bottom : -16px;
left : 0px;
background-image : url(mariobackground.png);
/* overflow-x : hidden;*/
}
#background .overlay {
width : 3392px;
height : 100%;
position : absolute;
top : 0px;
left : 0px;
background-color : rgba(50,40,20,0.5);
}
#background .mario-sprite {
width : 40px;
height : 40px;
overflow : hidden;
position : absolute;
left : -999px;
}
#background .text-1 {
position : absolute;
left : 1650px;
top : -120px;
}
#background .text-2 {
position : absolute;
left : 3100px;
top : -180px;
}
#fake
{
height: 248px;
}

301
misc/background.js Normal file
View File

@ -0,0 +1,301 @@
//Original code from http://blog.nihilogic.dk/
$(document).ready(function() {
var $background = $("#background");
var collisionMap = [
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,1,1,1,1,0,0,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,0,0,1,1,1,1,1,0,0,1,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
];
var $mario = $("#background .level .mario-sprite");
var marioImg = new Image();
marioImg.src = "divers/mariosprite.png";
$mario.append(marioImg);
var pos = [8,13 - $(window).height()/40];
var vel = [0,0];
var velMax = [0.4,0.8];
var velMin = [-0.4,-0.85];
var marioDir = 0;
var onGround = false;
var marioFaceDir = 1;
var scrollPos = 0;
var scrolling = false;
var scrollSpeed = 0;
var idleTime = 60000;
var lastActionTime;
function checkIdle() {
var now = new Date().getTime();
if (now - lastActionTime > idleTime) {
if (onGround)
vel[1] = velMin[1];
lastActionTime = now;
}
}
function initMario() {
$background.scrollLeft(0);
setSprite(spriteStates.JUMPRIGHT);
setInterval(doMarioStuff, 1000/15);
lastActionTime = new Date().getTime();
setInterval(checkIdle, 1000);
}
function setSprite(idx) {
$mario.scrollLeft(idx*40);
}
var spriteStates = {
JUMPLEFT : 0,
RUNLEFT1 : 1,
RUNLEFT2 : 2,
RUNLEFT3 : 3,
STANDLEFT : 5,
STANDRIGHT : 6,
RUNRIGHT1 : 7,
RUNRIGHT2 : 8,
RUNRIGHT3 : 9,
JUMPRIGHT : 11
}
function doMarioStuff() {
var velIncX = 0.05;
if (marioDir) {
marioFaceDir = marioDir;
vel[0] += velIncX * marioDir;
} else {
vel[0] *= 0.8;
if (Math.abs(vel[0]) < 0.05) vel[0] = 0;
}
vel[1] += 0.08;
if (vel[0] > velMax[0]) vel[0] = velMax[0];
if (vel[0] < velMin[0]) vel[0] = velMin[0];
if (vel[1] > velMax[1]) vel[1] = velMax[1];
if (vel[1] < velMin[1]) vel[1] = velMin[1];
var newPos = [
pos[0] + vel[0],
pos[1] + vel[1]
];
if (onGround) {
if (vel[0] == 0) {
walkCycle = 0;
setSprite(marioFaceDir < 0 ? spriteStates.STANDLEFT : spriteStates.STANDRIGHT);
} else {
walkCycle += 0.5;
if (walkCycle >= 3) walkCycle = 0;
setSprite(
(vel[0] < 0 ? spriteStates.RUNLEFT1 : spriteStates.RUNRIGHT1)
+ (walkCycle>>0)
);
}
} else {
walkCycle = 0;
setSprite(marioFaceDir < 0 ? spriteStates.JUMPLEFT : spriteStates.JUMPRIGHT);
}
pos = collide(pos, newPos);
if (pos[0] != newPos[0]) vel[0] = 0;
if (pos[1] != newPos[1]) vel[1] = 0;
if (pos[1] > 13) pos[1] = 13 - $(window).height()/16;
if (pos[0] > $(window).width()/16 - 16 + scrollPos/16)
initScroll(1);
else if (pos[0] < 16 + scrollPos/16)
initScroll(-1);
$mario
.css("left", pos[0]*16)
.css("bottom", 13*16 - pos[1]*16)
;
}
function initScroll(dir) {
scrollSpeed = dir;
if (scrolling) return;
scrolling = true;
scroll();
}
function scroll() {
$background.scrollLeft(scrollPos + 32 * scrollSpeed);
scrollSpeed *= 0.92;
scrollPos = $background.scrollLeft();
if (Math.abs(scrollSpeed) > 0.1)
setTimeout(scroll, 1000 / 15);
else
scrolling = false;
}
function collide(pos1, pos2) {
var oldX = pos1[0];
var oldY = pos1[1];
var newX = pos2[0];
var newY = pos2[1];
var collision, xAdjust = 0;
var space = 1/40;
onGround = false;
if (oldY != newY) { // moving vertically
if (newY > oldY) { // moving down
// lower left collision
collision = isBlocking(newX + space, newY + 1);
if (collision && !isBlocking(newX + space, newY)) {
newY -= collision[1];
onGround = true;
}
// lower right collision
collision = isBlocking(newX + 1-space, newY + 1);
if (collision && !isBlocking(newX + 1-space, newY)) {
newY -= collision[1];
onGround = true;
}
// moving up
} else {
// upper left collision
collision = isBlocking(newX + space, newY);
if (collision && !isBlocking(newX + space, newY + 1)) {
newY += (1 - collision[1]);
}
// upper right collision
collision = isBlocking(newX + 1 - space, newY);
if (collision && !isBlocking(newX + 1 - space, newY + 1)) {
newY += (1 - collision[1]);
xAdjust = 1;
}
}
}
// moving horizontally
if (oldX != newX) {
// moving right
if (newX > oldX) {
// lower right collision
collision = isBlocking(newX + 1, newY + 1-space);
if (collision) {
newX -= collision[0];
}
// upper right collision
collision = isBlocking(newX + 1, newY);
if (collision) {
newX -= collision[0];
}
// moving left
} else {
// lower left collision
collision = isBlocking(newX, newY + 1-space);
if (collision) {
newX += (1 - collision[0]);
}
// upper left collision
collision = isBlocking(newX, newY);
if (collision) {
newX += (1 - collision[0]);
}
}
}
return [newX,newY,xAdjust];
}
// check if a tile is blocking
function isBlocking(x, y) {
var tx = x>>0;
var ty = y>>0;
if (collisionMap[ty] && collisionMap[ty][tx]) {
return [x - tx, y - ty];
}
if (collisionMap[ty] && typeof collisionMap[ty][tx] == "undefined")
return [x - tx, y - ty];
}
$(document).keydown(function(e) {
var now = new Date().getTime();
switch (e.which) {
case 68: // d
lastActionTime = now;
marioDir = 1;
break;
case 81: // q
lastActionTime = now;
marioDir = -1;
break;
case 90: // z
lastActionTime = now;
if (onGround)
vel[1] = velMin[1];
break;
}
//console.log(e.which)
});
$(document).keyup(function(e) {
var now = new Date().getTime();
switch (e.which) {
case 68: // d
lastActionTime = now;
if (marioDir == 1)
marioDir = 0;
break;
case 81: // q
lastActionTime = now;
if (marioDir == -1)
marioDir = 0;
break;
}
//console.log(e.which)
});
$(window).bind("resize", function() {
$background.scrollLeft(scrollPos);
});
initMario();
});

BIN
misc/bg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
misc/desc.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 B

141
misc/design.css Normal file
View File

@ -0,0 +1,141 @@
/* --- STYLES DE BASE --- */
/* Page */
html {
font-size: 100%; /* Évite un bug d'IE 6-7. (1) */
}
body {
margin: 0;
padding: 1em; /* Remettre à zéro si nécessaire. */
font-family: Arial, Helvetica, "Liberation Sans", FreeSans, sans-serif;
font-size: .8em;
line-height: 1.4; /* À adapter au design. (4) */
color: black;
background-color: grey;
background-image: url('bg.png');
}
pre
{
font-size: 10px;
font-style: normal;
line-height: 11px;
font-weight: normal;
font-family: "Courier New", Courier, mono;
text-align: left;
margin-left: 40%;
}
/* Titres */
h1, h2, h3, h4, h5, h6 {
margin: 1em 0 .5em 0; /* Rapproche le titre du texte.*/
line-height: 1.2;
font-weight: bold; /* Valeur par défaut.*/
font-style: normal;
}
h1 {
font-size: 1.75em;
}
h2 {
font-size: 1.5em;
}
h3 {
font-size: 1.25em;
}
h4 {
font-size: 1em;
}
/* Listes */
ul, ol {
margin: .75em 0 .75em 32px;
padding: 0;
}
/* Paragraphes */
p {
margin: .75em 0; /* Marges plus faibles que par défaut.*/
}
address {
margin: .75em 0;
font-style: normal;
}
/* Liens */
a {
text-decoration: underline;
}
a:link {
color : #0000cd;
}
a:visited {
color : #4b0082;
}
a:hover, a:focus, a:active {
color : #dc143c;
}
a img {
border: none;
}
/* Divers éléments de type en-ligne*/
em {
font-style: italic;
}
strong {
font-weight: bold;
}
/* Formulaires */
form, fieldset {
margin: 0;
padding: 0;
}
form
{
border: none;
}
/* Mise en forme simple pour les tableaux */
table {
margin: 0;
border: 1px solid gray; /* Pas de bordure = "none". */
border-collapse: collapse; /* Valeur par défaut: "separate". */
border-spacing: 0;
margin: auto;
}
table td, table th {
padding: 4px; /* Pas de retrait autour du texte = "0". */
border: 1px solid #ccc; /* Pas de bordure = "none". */
vertical-align: top; /* Valeur par défaut: "middle" */
text-align: left;
}
body
{
text-align: center;
}
label /* On affiche les labels sous forme de blocs et mise en page = formulaires alignés */
{
display: block;
}
th
{
background-color: rgba(255,10,255,0.2);
}
td
{
background-color: rgba(255,200,255,0.1);
}
.inline
{
display: inline;
}
.centre
{
text-align:center;
}

154
misc/jquery.min.js vendored Normal file
View File

@ -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);

BIN
misc/mariobackground.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

BIN
misc/mariosprite.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

25
misc/modif.js Normal file
View File

@ -0,0 +1,25 @@
function invites()
{
var invites_input = document.getElementById('invites');
var invites_label = document.getElementById('invites_label');
invites_input.onkeyup = function ()
{
if(invites_input.value > 1)
{
invites_label.innerHTML = 'invités';
}
if(invites_input.value <= 1)
{
invites_label.innerHTML = 'invité';
}
};
}
if(document.getElementById && document.createTextNode)
{
window.onload = function()
{
invites();
};
}

232
modif.php Normal file
View File

@ -0,0 +1,232 @@
<?php
require('include.php');
init(true, false);
//If we want to validate something someone paid us
if(isset($_GET['de']) && isset($_GET['a']) && isset($_GET['id_depense']) && !empty($_GET['token']) && $_GET['token'] == $_SESSION['token_validate_single'] && $_SESSION['token_validate_single_time'] > time() - (15*60) AND strpos($_SERVER['HTTP_REFERER'], 'http://'.$CONFIG['base_url'].'/index.php') == 0)
{
//Check wether we are the person who receive the money or the admin
if($_SESSION['id'] == $_GET['a'] || $_SESSION['admin'] == 1)
{
//And check that we didn't validate it before
$req_count = $bdd->prepare('SELECT COUNT(*) AS nbre_paiements FROM paiements WHERE de=:de AND a=:a AND id_depense=:id_depense');
$req_count->bindValue(':de', $_GET['de']);
$req_count->bindValue(':a', $_GET['a']);
$req_count->bindValue(':id_depense', $_GET['id_depense']);
$req_count->execute();
$count = $req_count->fetch();
if($count['nbre_paiements'] == 0) //If everything is ok -> validation
{
$req = $bdd->prepare('INSERT INTO paiements(id, de, a, id_depense, date, montant) VALUES("", :de, :a, :id_depense, :date, :montant)');
$req->bindValue(':de', $_GET['de']);
$req->bindValue(':a', $_GET['a']);
$req->bindValue(':id_depense', $_GET['id_depense']);
$req->bindValue(':date', time());
$req_montant = $bdd->prepare('SELECT montant, copains, invites FROM depenses WHERE id=:id_depense');
$req_montant->bindValue(':id_depense', $_GET['id_depense']);
$req_montant->execute();
$donnees_montant = $req_montant->fetch();
$montant = $donnees_montant['montant']/(substr_count($donnees_montant['copains'], ',') + 1 + $donnees_montant['invites']);
$req->bindValue(':montant', $montant);
$req->execute();
}
else //If entry already exist -> we update it because the cost of the meal may have been changed
{
$req_montant = $bdd->prepare('SELECT montant, copains, invites FROM depenses WHERE id=:id_depense');
$req_montant->bindValue(':id_depense', $_GET['id_depense']);
$req_montant->execute();
$donnees_montant = $req_montant->fetch();
$montant = $donnees_montant['montant']/(substr_count($donnees_montant['copains'], ',') + 1 + $donnees_montant['invites']);
$req = $bdd->prepare('UPDATE paiements SET montant=:montant, date=:date WHERE de=:de AND a=:a AND id_depense=:id_depense');
$req->bindValue(':de', $_GET['de']);
$req->bindValue(':a', $_GET['a']);
$req->bindValue(':id_depense', $_GET['id_depense']);
$req->bindValue(':date', time());
$req->bindValue(':montant', $montant);
$req->execute();
}
header('location: message.php?id=10');
exit();
}
else
{
header('location: message.php?id=9');
exit();
}
}
//If we want to add a new meal (or edit it)
if(isset($_POST['menu']) && isset($_POST['jour']) && isset($_POST['mois']) && isset($_POST['annee']) && isset($_POST['AM_PM']) && isset($_POST['montant']) && isset($_POST['invites']) && !empty($_POST['token']) && $_POST['token'] == $_SESSION['token_modif'] && $_SESSION['token_modif_time'] > time() - (15*60) AND strpos($_SERVER['HTTP_REFERER'], 'http://'.$CONFIG['base_url'].'/index.php') == 0)
{
if(!empty($_POST['id']))
{
$req = $bdd->query('SELECT de FROM depenses WHERE id='.(int) $_POST['id']);
$donnees = $req->fetch();
if($donnees['de'] != $_SESSION['id'] && $_SESSION['admin'] != 1)
{
header('location: message.php?id=9');
exit();
}
$req = $bdd->prepare('UPDATE depenses SET menu=:menu, date=:date, montant=:montant, copains=:copains, invites=:invites WHERE id='.(int) $_POST['id']);
$message = 2;
}
else
{
$req = $bdd->prepare('INSERT INTO depenses (id, menu, date, de, copains, montant, invites) VALUES ("", :menu, :date, '.$_SESSION['id'].', :copains, :montant, :invites)');
$message = 3;
}
//Here, we treat $_POST['copain_...']
$copains_req = $bdd->query('SELECT id FROM copains ORDER BY id ASC');
$i = 0;
$copains_insert = '';
while($copain_base = $copains_req->fetch())
{
if(!empty($_POST['copain_'.$copain_base['id']]))
{
if($i != 0)
{
$copains_insert .= ',';
}
$copains_insert .= $copain_base['id'];
$i = 1;
}
}
$req->bindValue(':menu', $_POST['menu']);
$req->bindValue(':date', mktime($_POST['AM_PM'], 0, 0, $_POST['mois'], $_POST['jour'], $_POST['annee']));
$req->bindValue(':copains', $copains_insert);
$req->bindValue(':montant', (float) strtr($_POST['montant'], ',', '.'));
$req->bindValue(':invites', (int) $_POST['invites']);
$req->execute();
header('location: message.php?id='.$message);
exit();
}
else //Else, we just display the form
{
if(isset($_GET['id'])) //And get the data to prefill if we edit a meal
{
$modif = (int) $_GET['id'];
$req = $bdd->query('SELECT menu, de, date, copains, montant, invites FROM depenses WHERE id='.$modif);
$donnees = $req->fetch();
if($donnees['de'] != $_SESSION['id'] && $_SESSION['admin'] != 1)
{
header('location: message.php?id=9');
exit();
}
$copains_modif = explode(',', $donnees['copains']);
}
$_SESSION['token_modif'] = sha1(uniqid(rand(), true)); //We generate a token and store it in a session variable
$_SESSION['token_modif_time'] = time(); //We also store the time at which the token has been generated
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Bouffe@Ulm</title>
<link rel="stylesheet" media="screen" type="text/css" href="misc/design.css" />
<script type="text/javascript" src="misc/modif.js"></script>
<link rel="icon" href="favicon.ico" />
</head>
<body>
<h1>Bouffe@Ulm</h1>
<?php
if(isset($modif)) echo '<h2>Modifier une dépense</h2>'; else echo '<h2>Ajouter une dépense</h2>';
?>
<form method="post" action="modif.php">
<p><label for="menu">Menu : </label><textarea name="menu" value="menu" cols="40" rows="5"><?php if(isset($modif)) { echo nl2br(htmlspecialchars($donnees['menu']));}?></textarea></p>
<p><label for="jour">Date : </label>
<select name="jour" id="jour">
<?php
for($i=1; $i<32; $i++)
{
if((date('j') == $i && !isset($modif)) || (isset($modif) && date('j', $donnees['date']) == $i))
{
echo "<option value='".$i."' selected='selected'>".$i."</option>";
}
else
{
echo "<option value='".$i."'>".$i."</option>";
}
}
?>
</select>
<select name="mois" id="mois">
<?php
for($i=1; $i<13; $i++)
{
if((date('m') == $i && !isset($modif)) || (isset($modif) && date('m', $donnees['date']) == $i))
{
echo "<option value='".$i."' selected='selected'>".$i."</option>";
}
else
{
echo "<option value='".$i."'>".$i."</option>";
}
}
?>
</select>
<select name="AM_PM">
<option value='11' <?php if((date('A') == "AM" && !isset($modif)) || (isset($modif) && date('A', $donnees['date']) == "AM")) { echo 'selected="selected"';}?>>Midi</option>
<option value='22' <?php if((date('A') == "PM" && !isset($modif)) || (isset($modif) && date('A', $donnees['date']) == "PM")) { echo 'selected="selected"';}?>>Soir</option>
</select>
<select name="annee" id="annee">
<?php
for($i=date('Y')-1; $i<date('Y')+2; $i++)
{
if((date('Y') == $i && !isset($modif)) || (isset($modif) && date('Y', $donnees['date']) == $i))
{
echo "<option value='".$i."' selected='selected'>".$i."</option>";
}
else
{
echo "<option value='".$i."'>".$i."</option>";
}
}
?>
</select>
</p>
<p><label for="montant">Montant : </label><input type="text" size="5" maxlength="6" name="montant" id="montant" <?php if(isset($modif)) echo 'value="'.$donnees['montant'].'"';?>/>€</p>
<p style="text-align: left; display: inline-block;">Copains : <br/>
<?php
$req2 = $bdd->query('SELECT id, nom FROM copains ORDER BY nom ASC');
while($donnees2 = $req2->fetch())
{
if((isset($copains_modif) && in_array($donnees2['id'], $copains_modif)) || ($_SESSION['id'] == $donnees2['id']))
{
echo "<input type='checkbox' name='copain_".htmlspecialchars($donnees2['id'])."' id='copain_".htmlspecialchars($donnees2['id'])."' checked='checked'/><label for='copain_".htmlspecialchars($donnees2['id'])."' class='inline'>".htmlspecialchars($donnees2['nom'])."</label><br/>";
}
else
{
echo "<input type='checkbox' name='copain_".htmlspecialchars($donnees2['id'])."' id='copain_".htmlspecialchars($donnees2['id'])."'/><label for='copain_".htmlspecialchars($donnees2['id'])."' class='inline'>".htmlspecialchars($donnees2['nom'])."</label><br/>";
}
}
?>
<input type="number" name="invites" id="invites" size="2" maxlength="2" value="<?php if(isset($donnees['invites'])) echo (int) $donnees['invites']; else echo "0";?>"/>
<label for="invites" class="inline" id="invites_label">
<?php if(isset($donnees['invites']) && $donnees['invites'] > 1) echo 'invités'; else echo 'invité';?>
</label>
</p>
<p>
<input type="submit" value="<?php if(isset($modif)) { echo 'Modifier'; } else { echo 'Ajouter';}?>"/> ou <a href="index.php">retour à l'accueil</a><input type="hidden" name="id" value="<?php if(isset($modif)) { echo $modif;}?>"/>
<input type="hidden" name="token" value="<?php echo $_SESSION['token_modif'];?>"/>
</p>
</form>
</body>
</html>
<?php
}
?>

35
modif_annonce.php Normal file
View File

@ -0,0 +1,35 @@
<?php
require('include.php');
init(true, true);
if(isset($_POST['annonce']))
{
if(!empty($_POST['annonce']))
file_put_contents("annonce", htmlspecialchars($_POST['annonce']));
else if(is_file("annonce"))
unlink("annonce");
header('location: index.php');
exit();
}
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Bouffe@Ulm</title>
<link rel="stylesheet" media="screen" type="text/css" href="misc/design.css" />
<link rel="icon" href="favicon.ico" />
</head>
<body>
<h1>Bouffe@Ulm</h1>
<form method="post" action="modif_annonce.php">
<p>
<label for="annonce">Annonce : </label>
</p>
<textarea style="width: 60%; min-height: 100px;" id="annonce" name="annonce"><$
<p><input type="submit" value="Envoyer"/></p>
</form>
</body>
</html>

51
modif_password.php Normal file
View File

@ -0,0 +1,51 @@
<?php
require('include.php');
init(true, false);
if(isset($_POST['password_old']) && isset($_POST['password_new1']) && isset($_POST['password_new2']) && !empty($_POST['token']) && $_POST['token'] == $_SESSION['token_password'] && $_SESSION['token_password_time'] > time() - (15*60) AND strpos($_SERVER['HTTP_REFERER'], 'http://'.$CONFIG['base_url'].'/index.php') == 0) //If we update the password and token is correct
{
$req_pass = $bdd->query('SELECT password FROM copains WHERE id='.(int) $_SESSION['id']);
$password_bdd = $req_pass->fetch();
if($_POST['password_new1'] == $_POST['password_new2'] && $password_bdd['password'] == sha1($_POST['password_old'] . $CONFIG['salt']))
{
$req = $bdd->prepare('UPDATE copains SET password=:password WHERE id='.(int) $_SESSION['id']);
$req->bindValue(':password', sha1($_POST['password_new1'] . $CONFIG['salt']));
$req->execute();
header('location: message.php?id=13');
exit();
}
else
{
header('location: message.php?id=12');
exit();
}
}
$_SESSION['token_password'] = sha1(uniqid(rand(), true)); //We generate a token and store it in a session variable
$_SESSION['token_password_time'] = time(); //We also store the time at which the token has been generated
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Bouffe@Ulm</title>
<link rel="stylesheet" media="screen" type="text/css" href="misc/design.css" />
<link rel="icon" href="favicon.ico" />
</head>
<body>
<h1>Bouffe@Ulm</h1>
<h2>Modifier le mot de passe</h2>
<p><a href="index.php">Retour à l'accueil</a></p>
<form method="post" action="modif_password.php">
<p><label for="password_old">Ancien mot de passe : </label><input type="password" name="password_old" id="password_old" size="50"/></p>
<p><label for="password_new1">Nouveau mot de passe : </label><input type="password" name="password_new1" id="password_new1" size="50"/></p>
<p><label for="password_new2">Nouveau mot de passe (confirmation) : </label><input type="password" name="password_new2" id="password_new2" size="50"/></p>
<p>
<input type="submit" value="Modifier"/>
<input type="hidden" name="token" value="<?php echo $_SESSION['token_password'];?>"/>
</p>
</form>
</body>
</html>

210
rbmt.php Normal file
View File

@ -0,0 +1,210 @@
<?php
require('include.php');
init(true, false);
//Return an array with date of the start of the month and of the end of the month
function bornes_mois($num_mois,$annee)
{
$debut_mois = mktime(0, 0, 0,$num_mois, 1, $annee);
$dernier_jour = array(
1=>31,
2=>28+date('L'),
3=>31,
4=>30,
5=>31,
6=>30,
7=>31,
8=>31,
9=>30,
10=>31,
11=>30,
12=>31);
$fin_mois = mktime(23, 59, 59, $num_mois, $dernier_jour[$num_mois], $annee);
$bornes = array($debut_mois, $fin_mois);
return $bornes;
}
//Return what A must pay to B
function dettes($A, $B, $debut_mois, $fin_mois)
{
global $bdd;
//When A paid and B was here
$reqA_B = $bdd->prepare('SELECT id, date, montant, copains, invites FROM depenses WHERE date>'.$debut_mois.' AND date<'.$fin_mois.' AND de=:param1 AND (copains LIKE "%,'.(int) $B.',%" OR copains LIKE "%,'.(int)$B.'" OR copains LIKE "'.(int) $B.',%" OR copains LIKE "'.(int) $B.'")');
$reqA_B->bindvalue(':param1',$A);
$reqA_B->execute();
//When B paid and A was here
$reqB_A = $bdd->prepare('SELECT id, date, montant, copains, invites FROM depenses WHERE date>'.$debut_mois.' AND date<'.$fin_mois.' AND de=:param1 AND (copains LIKE "%,'.(int) $A.',%" OR copains LIKE "%,'.(int)$A.'" OR copains LIKE "'.(int) $A.',%" OR copains LIKE "'.(int) $A.'")');
$reqB_A->bindvalue(':param1',$B);
$reqB_A->execute();
//What A already paid to B for the current month
$reqPaiementsA_B = $bdd -> prepare('SELECT paiements.montant AS montant FROM paiements LEFT JOIN depenses ON paiements.id_depense=depenses.id WHERE depenses.date >'.$debut_mois.' AND depenses.date<'.$fin_mois.' AND paiements.de=:de AND paiements.a=:a');
$reqPaiementsA_B->bindvalue(':de',$A);
$reqPaiementsA_B->bindvalue(':a',$B);
$reqPaiementsA_B->execute();
//Same thing for B to A
$reqPaiementsB_A = $bdd -> prepare('SELECT paiements.montant AS montant FROM paiements LEFT JOIN depenses ON paiements.id_depense=depenses.id WHERE depenses.date >'.$debut_mois.' AND depenses.date<'.$fin_mois.' AND paiements.de=:de AND paiements.a=:a');
$reqPaiementsB_A->bindvalue(':de',$B);
$reqPaiementsB_A->bindvalue(':a',$A);
$reqPaiementsB_A->execute();
//$deltaAB : What A must pay to B
$deltaAB = 0;
while($donneesA_B = $reqA_B->fetch())
{
//We get the price of the meal, divided by the number of people who ate
//nbre de virgule + 1
$deltaAB -= $donneesA_B['montant']/(substr_count($donneesA_B['copains'], ',') + 1 + $donneesA_B['invites']);
}
while($donneesB_A = $reqB_A->fetch()) //idem
{
$deltaAB += $donneesB_A['montant']/(substr_count($donneesB_A['copains'], ',') + 1 + $donneesB_A['invites']);
}
while($donneesPaiementsA_B = $reqPaiementsA_B->fetch()) //idem
{
$deltaAB -= $donneesPaiementsA_B['montant'];
}
while($donneesPaiementsB_A = $reqPaiementsB_A->fetch()) //idem
{
$deltaAB += $donneesPaiementsB_A['montant'];
}
return $deltaAB;
}
// When we've "de", "a" and "rbmt", we have to remove the matrix block
// corresponding to it in "rbmt"
if(isset($_GET['de']) && isset($_GET['a']) && isset($_GET['rbmt']))
{
// If your are not the one to receive, or not admin, you've no right
if($_GET['a'] == $_SESSION['id'] || !empty($_SESSION['admin']))
{
// If we have to insert a paiment, we get the matrix and replace the
// paiment with 0, then put it back in the database
if(isset($_POST['confirm']))
{
$req = $bdd->query('SELECT matrix FROM remboursements WHERE id='.$_GET['rbmt']);
$retour = $req->fetch();
$matrix = unserialize($retour["matrix"]);
$matrix[$_GET['de']][$_GET['a']] = 0;
$req = $bdd->prepare('UPDATE remboursements SET matrix=:matrix WHERE id=:id');
$req->bindValue(':matrix', serialize($matrix));
$req->bindValue(':id', $_GET['rbmt']);
$req->execute();
header('location: message.php?id=10');
}
// We prompt to confirm the operation
else
{
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Bouffe@Ulm : remboursements</title>
<link rel="stylesheet" media="screen" type="text/css" href="misc/design.css" />
<link rel="icon" href="favicon.ico" />
</head>
<body>
<h1>Remboursements simplifiés</h1>
<form method="post" action="rbmt.php?<?php echo $_SERVER['QUERY_STRING'];?>">
<p>
<input type="hidden" name="confirm" value="1"/>
<input type="submit" value="Confirmer le remboursement" /> ou <a href="rbmt.php">retour aux remboursements</a><br/>
<em>Attention, cette opération n'est pas réversible. Une fois le paiement confirmé, il est impossible de revenir en arrière.</em>
</p>
</form>
<?php
}
}
else
header('location: message.php?id=9');
}
// We print the list of elements in remboursements
else
{
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Bouffe@Ulm : remboursements</title>
<link rel="stylesheet" media="screen" type="text/css" href="misc/design.css" />
<link rel="icon" href="favicon.ico" />
</head>
<body>
<h1>Remboursements simplifiés</h1>
<?php
echo '<h2>Remboursements précédents</h2>';
$req = $bdd->prepare('SELECT * FROM remboursements');
$req->execute();
// We create a table string and a links string. The first will contain a
// matrix if we want to see one particular rbmt. Links will provide links
// to the other rbmt.
$table = '';
$links = '';
while($data = $req->fetch())
{
// Reset the list of friend to ''
$liste = '';
// Extract info from $data
// First the date
$date = date('j/m', $data['date']);
// List of friend
$copains = unserialize($data['copains']);
foreach($copains as $nom)
$liste .= ', ' . $nom;
// If we clicked on one particular rbmt
if (isset($_GET['id']) && $_GET['id'] == $data['id'] && isset($_GET['action']) && $_GET['action'] == "show")
{
$table .= "<li>Le {$date}{$liste}";
$matrix = unserialize($data['matrix']);
$table.='
<table>
<tr>
<th class="centre">Doit\À</th>';
//Construct the header of the table
foreach($copains as $key => $copain)
{
if($_SESSION['nom'] == $copain)
$copain = '<strong>'.$copain.'</strong>';
$table .= '<th class="centre">'.$copain.'</th>';
}
$table .= '</tr>';
//For each peer of buddy, print the block in the array
foreach($copains as $keyA=>$copainA)
{
if($_SESSION['nom'] == $copainA)
$copainA = '<strong>'.$copainA.'</strong>';
$table .= '<tr><th class="centre">'.$copainA.'</th>';
foreach($copains as $keyB=>$copainB)
{
if($matrix[$keyA][$keyB] <= 0)
$table .= '<td class="centre">-</td>';
else
{
if ($keyB == $_SESSION['id'] || !empty($_SESSION['admin']))
$table .= '<td class="centre"><a href="rbmt.php?rbmt='.$data['id'].'&amp;de='.$keyA.'&amp;a='.$keyB.'">'.$matrix[$keyA][$keyB].'</a></td>';
else
$table .= '<td class="centre">'.$matrix[$keyA][$keyB].'</td>';
}
}
$table .= '</tr>';
}
$table .= '</table></li>';
}
// Else, we print a link
else
$links .= "<li><a href='?id={$data['id']}&amp;action=show'>Le {$date}{$liste}</a></li>";
}
echo '<p><ul>';
if (isset($table)) echo $table;
if (isset($links)) echo $links;
echo '</ul></p>';
echo '<p>';
echo '<a href="index.php">Retour à l\'accueil</a>';
echo '</p>';
echo '</body></html>';
}
?>

488
rbmt_admin.php Normal file
View File

@ -0,0 +1,488 @@
<?php
require('include.php');
init(true, true);
//Return an array with date of the start of the month and of the end of the month
function bornes_mois($num_mois,$annee)
{
$debut_mois = mktime(0, 0, 0,$num_mois, 1, $annee);
$dernier_jour = array(
1=>31,
2=>28+date('L'),
3=>31,
4=>30,
5=>31,
6=>30,
7=>31,
8=>31,
9=>30,
10=>31,
11=>30,
12=>31);
$fin_mois = mktime(23, 59, 59, $num_mois, $dernier_jour[$num_mois], $annee);
$bornes = array($debut_mois, $fin_mois);
return $bornes;
}
//Return what A must pay to B
function dettes($A, $B, $debut_mois, $fin_mois)
{
global $bdd;
//When A paid and B was here
$reqA_B = $bdd->prepare('SELECT id, date, montant, copains, invites FROM depenses WHERE date>'.$debut_mois.' AND date<'.$fin_mois.' AND de=:param1 AND (copains LIKE "%,'.(int) $B.',%" OR copains LIKE "%,'.(int)$B.'" OR copains LIKE "'.(int) $B.',%" OR copains LIKE "'.(int) $B.'")');
$reqA_B->bindvalue(':param1',$A);
$reqA_B->execute();
//When B paid and A was here
$reqB_A = $bdd->prepare('SELECT id, date, montant, copains, invites FROM depenses WHERE date>'.$debut_mois.' AND date<'.$fin_mois.' AND de=:param1 AND (copains LIKE "%,'.(int) $A.',%" OR copains LIKE "%,'.(int)$A.'" OR copains LIKE "'.(int) $A.',%" OR copains LIKE "'.(int) $A.'")');
$reqB_A->bindvalue(':param1',$B);
$reqB_A->execute();
//What A already paid to B
$reqPaiementsA_B = $bdd -> prepare('SELECT paiements.montant AS montant FROM paiements LEFT JOIN depenses ON paiements.id_depense=depenses.id WHERE depenses.date >'.$debut_mois.' AND depenses.date<'.$fin_mois.' AND paiements.de=:de AND paiements.a=:a');
$reqPaiementsA_B->bindvalue(':de',$A);
$reqPaiementsA_B->bindvalue(':a',$B);
$reqPaiementsA_B->execute();
//Same thing for B to A
$reqPaiementsB_A = $bdd -> prepare('SELECT paiements.montant AS montant FROM paiements LEFT JOIN depenses ON paiements.id_depense=depenses.id WHERE depenses.date >'.$debut_mois.' AND depenses.date<'.$fin_mois.' AND paiements.de=:de AND paiements.a=:a');
$reqPaiementsB_A->bindvalue(':de',$B);
$reqPaiementsB_A->bindvalue(':a',$A);
$reqPaiementsB_A->execute();
//$deltaAB : What A must pay to B
$deltaAB = 0;
while($donneesA_B = $reqA_B->fetch())
{
//We get the price of the meal, divided by the number of people who ate
//nb of comma + 1
$deltaAB -= $donneesA_B['montant']/(substr_count($donneesA_B['copains'], ',') + 1 + $donneesA_B['invites']);
}
while($donneesB_A = $reqB_A->fetch()) //idem
{
$deltaAB += $donneesB_A['montant']/(substr_count($donneesB_A['copains'], ',') + 1 + $donneesB_A['invites']);
}
while($donneesPaiementsA_B = $reqPaiementsA_B->fetch()) //what has been already paid
{
$deltaAB -= $donneesPaiementsA_B['montant'];
}
while($donneesPaiementsB_A = $reqPaiementsB_A->fetch()) //idem
{
$deltaAB += $donneesPaiementsB_A['montant'];
}
return $deltaAB;
}
// Reduces the matrix in n steps
function simplify ($copains){
// We work directly with $debts
global $debts;
global $matrix;
$max = maximum($debts);
// On cherche le plus proche en valeur absolue du maximum
$near = nearest($debts, $max);
// On en déduit l'écart entre leurs valeurs absolues
$delta = $max["val"] + $near["val"];
// Case :
//A : max 100
//B :near -90
// delta 10
// m[A][B] -90
// m[B][A] 90
if ($delta > 0){
$matrix[$max["id"]][$near["id"]] = -$debts[$near["id"]];
$matrix[$near["id"]][$max["id"]] = $debts[$near["id"]];
$debts[$max["id"]] = $delta;
$debts[$near["id"]] = 0;
}
else {
$matrix[$max["id"]][$near["id"]] = $debts[$max["id"]];
$matrix[$near["id"]][$max["id"]] = -$debts[$max["id"]];
$debts[$max["id"]] = 0;
$debts[$near["id"]] = $delta;
}
return $matrix;
}
// Return the nearest value
function nearest($debts, $max)
{
// Initialize with the maximum distance
$d_min = max($debts) - min($debts);
// Initialize the default id to one key in the array
$debts_keys = array_keys($debts);
$id_min = $debts_keys[1];
foreach($debts as $id => $val)
{
// Computes the absolute distance
$d = abs($max["val"] + $val);
// If it's a new minimum AND the value isn't positive
if ($d <= $d_min && $val < 0)
{
$id_min = $id;
$d_min = $d;
}
}
return array("id"=>$id_min, "val"=>$debts[$id_min]);
}
function maximum($tableau)
{
$max["id"] = 0;
$max["val"] = 0;
foreach($tableau as $id=>$val)
{
if($val >= $max["val"])
{
$max["val"] = $val;
$max["id"] = $id;
}
}
return $max;
}
// Function to insert a regulation between A and B for the simplification
// system only.
function inserer_paiement_rbmt($donnees_depense, $de_paiement, $a_paiement, $rbmt)
{
if ($de_paiement == $a_paiement) return 1;
global $bdd;
// We get all the payments between a and de (we just filter thanks to the
// id which is linked to the a field)
$paiement_existe_req = $bdd->prepare('SELECT montant, COUNT(*) AS nbre_paiement FROM paiements WHERE id_depense=:id_depense AND de=:de');
$paiement_existe_req->bindValue(':id_depense', $donnees_depense['id']);
$paiement_existe_req->bindValue(':de', $de_paiement);
$paiement_existe_req->execute();
$deja_paye = 0;
while ($donnees = $paiement_existe_req->fetch())
{
$deja_paye += $donnees['montant'];
}
$montant = $donnees_depense['montant']/(substr_count($donnees_depense['copains'], ',') + 1 + $donnees_depense['invites']) - $deja_paye;
$req = $bdd->prepare('INSERT INTO paiements(id, de, a, id_depense, date, montant, rbmt) VALUES("", :de, :a, :id_depense, :date, :montant, :rbmt)');
$req->bindValue(':de', $de_paiement);
$req->bindValue(':a', $a_paiement);
$req->bindValue(':id_depense', $donnees_depense['id']);
$req->bindValue(':date', time());
$req->bindValue(':rbmt', $rbmt);
$req->bindValue(':montant', $montant);
$req->execute();
return 1;
}
if(!(isset($_GET['confirm']) && isset($_POST['matrix']) && isset($_POST['copains']) && isset($_POST['date'])))
{
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Bouffe@Ulm : remboursements</title>
<link rel="stylesheet" media="screen" type="text/css" href="misc/design.css" />
<link rel="icon" href="favicon.ico" />
</head>
<body>
<h1>Remboursements simplifiés</h1>
<?php
}
// Creation Step 1
// show a form to get more info
if(isset($_GET["action"]) && $_GET["action"] == "new")
{
$req = $bdd->query('SELECT id, nom FROM copains ORDER BY nom ASC');
while($copain = $req->fetch())
{
$copains[$copain['id']] = $copain['nom']; //And put it in an array
}
?>
<form method="post" action="rbmt_admin.php?">
<p><label for="jour">Date : </label>
<select name="jour" id="jour">
<?php
for($i=1; $i<32; $i++)
{
if((date('j') == $i && !isset($modif)) || (isset($modif) && date('j', $donnees['date']) == $i))
echo "<option value='".$i."' selected='selected'>".$i."</option>";
else
echo "<option value='".$i."'>".$i."</option>";
}
?>
</select>
<select name="mois" id="mois">
<?php
for($i=1; $i<13; $i++)
{
if((date('m') == $i && !isset($modif)) || (isset($modif) && date('m', $donnees['date']) == $i))
echo "<option value='".$i."' selected='selected'>".$i."</option>";
else
echo "<option value='".$i."'>".$i."</option>";
}
?>
</select>
<select name="AM_PM">
<option value='11' <?php if((date('A') == "AM" && !isset($modif)) || (isset($modif) && date('A', $donnees['date']) == "AM")) { echo 'selected="selected"';}?>>Midi</option>
<option value='22' <?php if((date('A') == "PM" && !isset($modif)) || (isset($modif) && date('A', $donnees['date']) == "PM")) { echo 'selected="selected"';}?>>Soir</option>
</select>
<select name="annee" id="annee">
<?php
for($i=date('Y')-1; $i<date('Y')+2; $i++)
{
if((date('Y') == $i && !isset($modif)) || (isset($modif) && date('Y', $donnees['date']) == $i))
echo "<option value='".$i."' selected='selected'>".$i."</option>";
else
echo "<option value='".$i."'>".$i."</option>";
}
?>
</select>
</p>
<p style="text-align: left; display: inline-block;">Copains : <br/>
<?php
$req2 = $bdd->query('SELECT id, nom FROM copains ORDER BY nom ASC');
while($donnees2 = $req2->fetch())
{
echo "<input type='checkbox' name='copain_".htmlspecialchars($donnees2['id'])."' id='copain_".htmlspecialchars($donnees2['id'])."' checked='checked'/><label for='copain_".htmlspecialchars($donnees2['id'])."' class='inline'>".htmlspecialchars($donnees2['nom'])."</label><br/>";
}
?>
</p>
<p>
<input type="submit" value="<?php if(isset($modif)) { echo 'Modifier'; } else { echo 'Ajouter';}?>"/> ou <a href="index.php">retour à l'accueil</a><input type="hidden" name="id" value="<?php if(isset($modif)) { echo $modif;}?>"/>
<input type="hidden" name="token" value="<?php echo $_SESSION['token_modif'];?>"/>
</p>
</form>
<?php
}
// Creation Step 2
// check there's everything, create the new simplified matrix and prompt
// for confirmation
else if (isset($_POST['jour']) && isset($_POST['mois']) && isset($_POST['annee']) && isset($_POST['AM_PM']))
{
$req = $bdd->prepare('SELECT nom, id FROM copains ORDER BY nom ASC');
$req->execute();
// Fill an array only with friends who are participating
while($copain = $req->fetch())
{
// If the friend was selected
if(isset($_POST['copain_'.$copain['id']]))
$copains[$copain['id']] = $copain['nom'];
}
$n = count($copains); // Usefull for the size of the array
// Create the temporal bounds for the requests
$debut_mois = 0;
$fin_mois = mktime($_POST['AM_PM'], 0, 0, $_POST['mois'], $_POST['jour'], $_POST['annee']);
// We create an array containing the total debts and a matrix
foreach($copains as $idA=>$nameA)
{
$debts[$idA] = 0;
foreach($copains as $idB=>$nameB)
{
$matrix[$idA][$idB] = 0;
}
}
// We initialize the debts array
foreach($copains as $keyA=>$copainA)
{
foreach($copains as $keyB=>$copainB)
{
$dette = dettes($keyA,$keyB, $debut_mois, $fin_mois);
$deltaAB = $dette;
$debts[$keyA] += $deltaAB;
}
}
// To avoid an infinite while loop, we have to round the value
foreach($debts as &$val)
$val = round($val, 2);
// Should be zero, but with float error, it may be non null
$error = array_sum($debts);
// Do it in n steps
for ($i=0; $i<$n; $i++)
$matrix = simplify($copains);
echo "<h2>Récapitulatif</h2><p>";
// Output the matrix
foreach($copains as $keyA=>$copainA)
{
foreach($copains as $keyB=>$copainB)
{
if (isset($matrix[$keyA][$keyB]) && $matrix[$keyA][$keyB] > 0)
echo '<b>' . $copains[$keyA] . '</b> doit '. round($matrix[$keyA][$keyB], 2) . ' à <b>' . $copains[$keyB] .'</b><br/>';
}
}
// Show a forme to confirm
?>
</p>
<form method="post" action="rbmt_admin.php?confirm=1">
<p>
<input type="hidden" name="date" value='<?php echo $fin_mois;?>' />
<input type="hidden" name="matrix" value='<?php echo serialize($matrix); ?>'/>
<input type="hidden" name="copains" value='<?php echo serialize($copains); ?>'/>
<input type="submit" value="Confirmer"/> ou <a href="index.php">Retour à l'accueil</a><br/>
<em>Attention, cette opération est irréversible et annulera tous les paiements jusqu'à la date choisie.</em>
</p>
</form>
<?php
}
// Creation Step 3
// let's include some stuff
else if (isset($_GET['confirm']) && isset($_POST['matrix']) && isset($_POST['copains']) && isset($_POST['date']))
{
$req = $bdd->prepare('INSERT INTO remboursements(date, matrix, id, copains) VALUES(:date, :matrix, "", :copains)');
$req->bindValue(':date', $_POST['date']);
$req->bindValue(':matrix', $_POST['matrix']);
$req->bindValue(':copains', $_POST['copains']);
// We insert the new matrix in the table
if (!$req->execute())
echo "Une erreur est survenue";
else
{
// We get the biggest id (here, the one we just created)
$req = $bdd->query('SELECT MAX(id) FROM remboursements');
$retour = $req->fetch();
$id = $retour["MAX(id)"];
// Now we can simplify the matrix by inserting as many regulation as
// necessary
$copains = unserialize($_POST['copains']);
foreach($copains as $a=>$nomA)
{
foreach($copains as $de=>$nomB)
{
$req = $bdd->prepare('SELECT id, de, copains, montant, invites FROM depenses WHERE (copains LIKE "%,'.$de.',%" OR copains LIKE "%,'.$de.'" OR copains LIKE "'.$de.',%" OR copains LIKE "'.$de.'") AND de=:a AND date>:debut_mois AND date<:fin_mois');
$req->bindValue(':a', $a);
// Bounds are 0 and the date given in the previous form
$req->bindValue(':debut_mois', 0);
$req->bindValue(':fin_mois', $_POST['date']);
$req->execute();
// We've got a bunch of exchange to insert (with a flag to specify we
// added it here)
while($donnees = $req->fetch())
{
if(!empty($de))
{
inserer_paiement_rbmt($donnees, $de, $a, $id);
}
else
{
//For all the people who participate...
$participants = explode(',', $donnees['copains']);
foreach($participants as $participant)
{
// If we've got someone which participates to the
// simplification
if (in_array($participant, array_keys($copains)))
inserer_paiement_rbmt($donnees, $participant, $a, $id);
}
}
}
}
}
// Everything went right
header('location: message.php?id=14');
}
}
// If we want to delete one and have the id
else if(isset($_GET['id']) && isset($_GET['action']) && $_GET['action'] == "del")
{
// If already confirmed
if(isset($_POST['confirm']))
{
// We delete the simplification AND the regulation it created
if($bdd->query('DELETE FROM remboursements WHERE id='.$_GET['id']) &&
$bdd->query('DELETE FROM paiements WHERE rbmt='.$_GET['id']))
header('location: message.php?id=15');
else
header('location: message.php?id=16');
}
else
{
$req = $bdd->prepare('SELECT * FROM remboursements WHERE id='.$_GET['id']);
?>
<form method="post" action="rbmt_admin.php?<?php echo $_SERVER['QUERY_STRING'];?>">
<p>
<input type="submit" value="Confirmer" /> ou <a href="index.php">Retour à l'accueil</a>
<input type="hidden" name="confirm" value="1"/>
</p>
</form>
<?php
}
}
// Else, we print the list
else
{
echo '<a href="?action=new">Nouveau remboursement</a> | <a href="index.php">Retour à l\'accueil</a>';
echo '<h2>Remboursements précédents</h2>';
$req = $bdd->prepare('SELECT * FROM remboursements ');
$req->execute();
$table = '';
$links = '';
while($data = $req->fetch())
{
// Reset the list of friend to ''
$liste = '';
// Extract info from $data
// First the date
$date = date('j/m', $data['date']);
// List of friend
$copains = unserialize($data['copains']);
foreach($copains as $nom)
$liste .= ', ' . $nom;
// If we clicked on one particular remboursement
if (isset($_GET['id']) && $_GET['id'] == $data['id'] && isset($_GET['action']) && $_GET['action'] == "show")
{
$table .= "<li>Le {$date}{$liste} - <a href='?id={$data['id']}&amp;action=del'>Supprimer</a>";
$matrix = unserialize($data['matrix']);
// We build an array containing the data we want to print
// and a list containing the other remboursement
$table.='
<table>
<tr>
<th class="centre">Doit\À</th>';
//Construct the header of the table and display it for the previous months
foreach($copains as $key => $copain)
{
if($_SESSION['nom'] == $copain)
$copain = '<strong>'.$copain.'</strong>';
$table .= '<th class="centre">'.$copain.'</th>';
}
$table .= '</tr>';
foreach($copains as $keyA=>$copainA)
{
if($_SESSION['nom'] == $copainA)
$copainA = '<strong>'.$copains[$keyA].'</strong>';
$table .= '<tr><th class="centre">'.$copainA.'</th>';
foreach($copains as $keyB=>$copainB)
{
if($matrix[$keyA][$keyB] <= 0)
$table .= '<td class="centre">-</td>';
else
$table .= '<td class="centre">'.$matrix[$keyA][$keyB].'</td>';
}
$table .= '</tr>';
}
$table .= '</table></li>';
}
// Else, we print a link
else
$links .= "<li><a href='?id={$data['id']}&amp;action=show'>Le {$date}{$liste}</a> - <a href='?id={$data['id']}&amp;action=del'>Supprimer</a></li>";
}
}
echo '<p><ul>';
if (isset($table)) echo $table;
if (isset($links)) echo $links;
echo '</ul></p>';
echo '<p>';
echo '<a href="index.php">Retour à l\'accueil</a>';
echo '</p>';
echo '</body></html>';
?>

2
robots.txt Normal file
View File

@ -0,0 +1,2 @@
User-agent: *
Disallow: /

175
valider_paiements.php Normal file
View File

@ -0,0 +1,175 @@
<?php
require('include.php');
init(true, false);
if((empty($_GET['de']) OR empty($_GET['a'])) AND empty($_GET['all'])) //If we didn't get the right arguments
{
header('location: index.php');
exit();
}
$a = (int) $_GET['a'];
if($a != $_SESSION['id'] AND $_SESSION['admin'] != 1) //We can only validate what other people owe to us !
{
header('location: message.php?id=9');
exit();
}
if(empty($_GET['valide'])) //Validation page to be sure the user didn't click by mistake
{
$_SESSION['token_validation'] = sha1(uniqid(rand(), true)); //We generate a token and store it in a session variable
$_SESSION['token_validation_time'] = time(); //We also store the time at which the token has been generated
$lien = 'valider_paiements.php?valide=1&amp;date='.$_GET['date'].'&amp;a='.$a.'&amp;token='.$_SESSION['token_validation'];
if(!empty($_GET['all']))
$lien .= '&amp;all=1';
if(!empty($_GET['de']))
$lien .= '&amp;de='.(int)$_GET['de'];
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Bouffe@Ulm</title>
<link rel="stylesheet" media="screen" type="text/css" href="design.css" />
<link rel="icon" href="favicon.ico" />
</head>
<body>
<h1>Validation du remboursement des dettes</h1>
<p><a href="<?php echo $lien;?>">Confirmer le remboursement</a> ou <a href="index.php">Retour</a></p>
</body>
</html>
<?php
exit();
}
function inserer_paiement($donnees_depense, $de_paiement, $a_paiement) //Function to insert a regulation between A and B
{
if ($de_paiement == $a_paiement) return 1;
global $bdd;
// We count the number of payment not created during a simplification turn
// (created by this page, not rbmt_admin.php
$paiement_existe_req = $bdd->prepare('SELECT *,COUNT(*) AS nbre_paiement FROM paiements WHERE id_depense=:id_depense AND de=:de');
$paiement_existe_req->bindValue(':id_depense', $donnees_depense['id']);
$paiement_existe_req->bindValue(':de', $de_paiement);
$paiement_existe_req->execute();
$deja_paye = 0;
while($paiement_existe = $paiement_existe_req->fetch())
{
$deja_paye += $paiement_existe['montant'];
}
$montant = $donnees_depense['montant']/(substr_count($donnees_depense['copains'], ',') + 1 + $donnees_depense['invites']) - $deja_paye;
if($paiement_existe['nbre_paiement'] == 0)
$req = $bdd->prepare('INSERT INTO paiements(id, de, a, id_depense, date, montant) VALUES("", :de, :a, :id_depense, :date, :montant)');
else
$req = $bdd->prepare('UPDATE paiements SET montant=:montant, date=:date WHERE de=:de AND a=:a AND id_depense=:id_depense AND rbmt=0');
$req->bindValue(':de', $de_paiement);
$req->bindValue(':a', $a_paiement);
$req->bindValue(':id_depense', $donnees_depense['id']);
$req->bindValue(':date', time());
$req->bindValue(':montant', $montant);
$req->execute();
return 1;
}
function bornes_mois($num_mois,$annee) //Function to get the limit of dates to make the queries
{
$debut_mois = mktime(0, 0, 0,$num_mois, 1, $annee);
$dernier_jour = array(
1=>31,
2=>28+date('L'),
3=>31,
4=>30,
5=>31,
6=>30,
7=>31,
8=>31,
9=>30,
10=>31,
11=>30,
12=>31);
$fin_mois = mktime(23, 59, 59, $num_mois, $dernier_jour[$num_mois], $annee);
$bornes = array($debut_mois, $fin_mois);
return $bornes;
}
if(!empty($_GET['token']) && $_GET['token'] == $_SESSION['token_validation'] && $_SESSION['token_validation_time'] > time() - (15*60) AND strpos($_SERVER['HTTP_REFERER'], 'http://'.$CONFIG['base_url'].'/index.php') == 0) // Check wether the token is valid or not
{
if(!empty($_GET['all']))
{
//Validate everything for a
$req = $bdd->prepare('SELECT id, de, copains, montant, invites FROM depenses WHERE de=:a AND date>:debut_mois AND date<:fin_mois');
$req->bindValue(':a', $a);
}
else
{
$de = (int) $_GET['de'];
//Validate everything between a and de
$req = $bdd->prepare('SELECT id, de, copains, montant, invites FROM depenses WHERE (copains LIKE "%,'.$de.',%" OR copains LIKE "%,'.$de.'" OR copains LIKE "'.$de.',%" OR copains LIKE "'.$de.'") AND de=:a AND date>:debut_mois AND date<:fin_mois');
$req->bindValue(':a', $a);
}
if($_GET['date'] == 'now') //Bind date bounds
{
$bornes = bornes_mois(date('n'),date('Y'));
$req->bindValue(':debut_mois', $bornes[0]);
$req->bindValue(':fin_mois', $bornes[1]);
}
elseif($_GET['date'] == 'all')
{
$bornes = bornes_mois(date('n'),date('Y'));
$bornes[0] = 0;
$req->bindValue(':debut_mois', $bornes[0]);
$req->bindValue(':fin_mois', $bornes[1]);
}
else
{
header('location: index.php');
exit();
}
$req->execute();
while($donnees = $req->fetch())
{
if(!empty($de) && $de != $a)
{
inserer_paiement($donnees, $de, $a);
}
else
{
//For all the people who participate...
$participants = explode(',', $donnees['copains']);
foreach($participants as $participant)
{
echo $participant . ',' .$a . '<br/>';
if ($participant != $a) inserer_paiement($donnees, $participant, $a);
}
}
}
//And don't forget to validate everything I owe to others
$req_me = $bdd->prepare('SELECT id, copains, de, montant, invites FROM depenses WHERE de=:de AND (copains LIKE "%,'.$a.',%" OR copains LIKE "%,'.$a.'" OR copains LIKE "'.$a.',%" OR copains LIKE "'.$a.'") AND date>:debut_mois AND date<:fin_mois');
$req_me->bindValue(':de', $de);
$req_me->bindValue(':debut_mois', $bornes[0]);
$req_me->bindValue(':fin_mois', $bornes[1]);
$req_me->execute();
while($donnees_me = $req_me->fetch())
{
inserer_paiement($donnees_me, $a, $donnees_me['de']);
}
header('location: message.php?id=11');
exit();
}
else //If not valid, go back to index.php
{
header('location: index.php');
exit();
}
?>