Initial commit
This commit is contained in:
commit
9528de870d
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
*~
|
68
Bouffe_Ulm.sql
Normal file
68
Bouffe_Ulm.sql
Normal 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
1
README
Normal file
@ -0,0 +1 @@
|
|||||||
|
- Don't forget to change $CONFIG vars in include.php to match your own domain !
|
2
TODO
Normal file
2
TODO
Normal 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
105
connexion.php
Normal 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
133
copains.php
Normal 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>N° <a class='text-deco-none' href='?tri=id&sens=asc' title='/\'><img src="misc/asc.png" alt="/\"/></a> <a class='text-deco-none' href='?tri=id&sens=desc' title='\/'><img src="misc/desc.png" alt="/\"/></a></th>
|
||||||
|
<th>Nom <a class='text-deco-none' href='?tri=nom&sens=asc' title='/\'><img src="misc/asc.png" alt="/\"/></a> <a class='text-deco-none' href='?tri=nom&sens=desc' title='\/'><img src="misc/desc.png" alt="/\"/></a></th>
|
||||||
|
<th>Admin ? <a class='text-deco-none' href='?tri=admin&sens=asc' title='/\'><img src="misc/asc.png" alt="/\"/></a> <a class='text-deco-none' href='?tri=admin&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.'&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
BIN
favicon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.6 KiB |
36
include.php
Normal file
36
include.php
Normal 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
425
index.php
Normal 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'] .'&valide=1&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 . '&a=' . $keyB . '&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&a='.$key.'&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&sens=asc' title='/\'><img src="misc/asc.png" alt="/\"/></a> <a class='text-deco-none' href='?tri=date&sens=desc' title='\/'><img src="misc/desc.png" alt="/\"/></a></th>
|
||||||
|
<th class="centre">Payé par <a class='text-deco-none' href='?tri=de&sens=asc' title='/\'><img src="misc/asc.png" alt="/\"/></a> <a class='text-deco-none' href='?tri=de&sens=desc' title='\/'><img src="misc/desc.png" alt="/\"/></a></th>
|
||||||
|
<th class="centre">Copains <a class='text-deco-none' href='?tri=copains&sens=asc' title='/\'><img src="misc/asc.png" alt="/\"/></a> <a class='text-deco-none' href='?tri=copains&sens=desc' title='\/'><img src="misc/desc.png" alt="/\"/></a></th>
|
||||||
|
<th class="centre">Montant <a class='text-deco-none' href='?tri=depense&sens=asc' title='/\'><img src="misc/asc.png" alt="/\"/></a> <a class='text-deco-none' href='?tri=depense&sens=desc' title='\/'><img src="misc/desc.png" alt="/\"/></a></th>
|
||||||
|
<th class="centre">Menu <a class='text-deco-none' href='?tri=menu&sens=asc' title='/\'><img src="misc/asc.png" alt="/\"/></a> <a class='text-deco-none' href='?tri=menu&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.'&id_depense='.$id.'&a='.$donnees['de'].'&token='.$_SESSION['token_validate_single'].'">reste '.round($montant_du - $montants[$keys[0]],2).'€</a>)';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
$copains_in .= ' (<a href="modif.php?de='.$id_copain.'&id_depense='.$id.'&a='.$donnees['de'].'&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
49
message.php
Normal 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
BIN
misc/asc.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 151 B |
61
misc/background.css
Normal file
61
misc/background.css
Normal 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
301
misc/background.js
Normal 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
BIN
misc/bg.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 40 KiB |
BIN
misc/desc.png
Normal file
BIN
misc/desc.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 152 B |
141
misc/design.css
Normal file
141
misc/design.css
Normal 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
154
misc/jquery.min.js
vendored
Normal 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
BIN
misc/mariobackground.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.6 KiB |
BIN
misc/mariosprite.png
Normal file
BIN
misc/mariosprite.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 22 KiB |
25
misc/modif.js
Normal file
25
misc/modif.js
Normal 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
232
modif.php
Normal 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
35
modif_annonce.php
Normal 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
51
modif_password.php
Normal 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
210
rbmt.php
Normal 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'].'&de='.$keyA.'&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']}&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
488
rbmt_admin.php
Normal 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']}&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']}&action=show'>Le {$date}{$liste}</a> - <a href='?id={$data['id']}&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
2
robots.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
User-agent: *
|
||||||
|
Disallow: /
|
175
valider_paiements.php
Normal file
175
valider_paiements.php
Normal 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&date='.$_GET['date'].'&a='.$a.'&token='.$_SESSION['token_validation'];
|
||||||
|
if(!empty($_GET['all']))
|
||||||
|
$lien .= '&all=1';
|
||||||
|
if(!empty($_GET['de']))
|
||||||
|
$lien .= '&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();
|
||||||
|
}
|
||||||
|
?>
|
Loading…
Reference in New Issue
Block a user