Subversion Repositories Applications.wikini

Compare Revisions

No changes between revisions

Regard whitespace Rev 56 → Rev 58

/branches/v1.0-pithivier/api.php
New file
0,0 → 1,1748
<?php
/*
$Id: wakka.php 864 2007-11-28 12:44:52Z nepote $
Copyright (c) 2002, Hendrik Mans <hendrik@mans.de>
Copyright 2003 Carlo Zottmann
Copyright 2002, 2003, 2005 David DELON
Copyright 2002, 2003, 2004, 2006 Charles N?POTE
Copyright 2002, 2003 Patrick PAUL
Copyright 2003 Eric DELORD
Copyright 2003 Eric FELDSTEIN
Copyright 2004-2006 Jean-Christophe ANDR?
Copyright 2005-2006 Didier LOISEAU
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
derived from this software without specific prior written permission.
 
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
 
/*
Yes, most of the formatting used in this file is HORRIBLY BAD STYLE. However,
most of the action happens outside of this file, and I really wanted the code
to look as small as what it does. Basically. Oh, I just suck. :)
*/
 
 
 
// do not change this line, you fool. In fact, don't change anything! Ever!
define("WAKKA_VERSION", "0.1.1");
define("WIKINI_VERSION", "0.5.0");
require 'includes/constants.php';
include 'includes/urlutils.inc.php';
 
// start the compute time
list($g_usec, $g_sec) = explode(" ",microtime());
define ("t_start", (float)$g_usec + (float)$g_sec);
$t_SQL=0;
 
 
 
class Wiki
{
var $dblink;
var $page;
var $tag;
var $parameter = array();
var $queryLog = array();
var $interWiki = array();
var $VERSION;
var $CookiePath = '/';
var $inclusions = array();
/**
* an array containing all the actions that are implemented by an object
* @access private
*/
var $actionObjects;
 
// LinkTrackink
var $isTrackingLinks = false;
var $linktable = array();
 
var $pageCache = array();
var $_groupsCache = array();
var $_actionsAclsCache = array();
 
// constructor
function Wiki($config)
{
$this->config = $config;
// some host do not allow mysql_pconnect
$this->dblink = @mysql_connect (
$this->config["mysql_host"],
$this->config["mysql_user"],
$this->config["mysql_password"]);
if ($this->dblink)
{
if (!@mysql_select_db($this->config["mysql_database"], $this->dblink))
{
@mysql_close($this->dblink);
$this->dblink = false;
}
}
$this->VERSION = WAKKA_VERSION;
 
// determine le chemin pour les cookies
$a = parse_url($this->GetConfigValue('base_url'));
$this->CookiePath = dirname($a['path']);
// Fixe la gestion des cookie sous les OS utilisant le \ comme s?parteur de chemin
$this->CookiePath = str_replace("\\","/",$this->CookiePath);
// ajoute un '/' terminal sauf si on est ? la racine web
if ($this->CookiePath != '/') $this->CookiePath .= '/';
}
 
 
 
// DATABASE
function Query($query)
{
if($this->GetConfigValue("debug")) $start = $this->GetMicroTime();
if (!$result = mysql_query($query, $this->dblink))
{
ob_end_clean();
die("Query failed: ".$query." (".mysql_error().")");
}
if($this->GetConfigValue("debug"))
{
$time = $this->GetMicroTime() - $start;
$this->queryLog[] = array(
"query" => $query,
"time" => $time);
}
return $result;
}
function LoadSingle($query) {
if ($data = $this->LoadAll($query)) return $data[0];
return null;
}
function LoadAll($query)
{
$data=array();
if ($r = $this->Query($query))
{
while ($row = mysql_fetch_assoc($r)) $data[] = $row;
mysql_free_result($r);
}
return $data;
}
 
 
 
// MISC
function GetMicroTime()
{
list($usec, $sec) = explode(" ",microtime()); return ((float)$usec + (float)$sec);
}
function IncludeBuffered($filename, $notfoundText = "", $vars = "", $path = "")
{
if ($path) $dirs = explode(":", $path);
else $dirs = array("");
 
foreach($dirs as $dir)
{
if ($dir) $dir .= "/";
$fullfilename = $dir.$filename;
if (file_exists($fullfilename))
{
if (is_array($vars)) extract($vars);
 
ob_start();
include($fullfilename);
$output = ob_get_contents();
ob_end_clean();
return $output;
}
}
if ($notfoundText) return $notfoundText;
else return false;
}
 
 
 
// VARIABLES
function GetPageTag() { return $this->tag; }
function GetPageTime() { return $this->page["time"]; }
function GetMethod() { return $this->method; }
function GetConfigValue($name) { return isset($this->config[$name]) ? trim($this->config[$name]) : ''; }
function GetWakkaName() { return $this->GetConfigValue("wakka_name"); }
function GetWakkaVersion() { return $this->VERSION; }
function GetWikiNiVersion() { return WIKINI_VERSION; }
 
/**
* Retrieves all the triples that match some criteria.
* This allows to search triples by their approximate resource or property names.
* The allowed operators are the sql LIKE and the sql =
* @param string $resource The resource of the triples
* @param string $property The property of the triple to retrieve or null
* @param string $res_op The operator of comparison between the effective resource and $resource (default: 'LIKE')
* @param string $prop_op The operator of comparison between the effective property and $property (default: '=')
* @return array The list of all the triples that match the asked criteria
*/
function GetMatchingTriples($resource, $property = null, $res_op = 'LIKE', $prop_op = '=')
{
static $operators = array('=', 'LIKE'); // we might want to add other operators later
$res_op = strtoupper($res_op);
if (!in_array($res_op, $operators)) $res_op = '=';
$sql = 'SELECT * FROM ' . $this->GetConfigValue('table_prefix') . 'triples '
. 'WHERE resource ' . $res_op . ' "' . addslashes($resource) . '"';
if ($property !== null)
{
$prop_op = strtoupper($prop_op);
if (!in_array($prop_op, $operators)) $prop_op = '=';
$sql .= ' AND property ' . $prop_op . ' "' . addslashes($property) . '"';
}
return $this->LoadAll($sql);
}
 
/**
* Retrieves all the values for a given couple (resource, property)
* @param string $resource The resource of the triples
* @param string $property The property of the triple to retrieve
* @param string $re_prefix The prefix to add to $resource (defaults to THISWIKI_PREFIX)
* @param string $prop_prefix The prefix to add to $property (defaults to WIKINI_VOC_PREFIX)
* @return array An array of the retrieved values, in the form
* array(
* 0 => array(id = 7 , 'value' => $value1),
* 1 => array(id = 34, 'value' => $value2),
* ...
* )
*/
function GetAllTriplesValues($resource, $property, $re_prefix = THISWIKI_PREFIX, $prop_prefix = WIKINI_VOC_PREFIX)
{
$sql = 'SELECT id, value FROM ' . $this->GetConfigValue('table_prefix') . 'triples '
. 'WHERE resource = "' . addslashes($re_prefix . $resource) . '" '
. 'AND property = "' . addslashes($prop_prefix . $property) . '" ';
return $this->LoadAll($sql);
}
 
/**
* Retrieves a single value for a given couple (resource, property)
* @param string $resource The resource of the triples
* @param string $property The property of the triple to retrieve
* @param string $re_prefix The prefix to add to $resource (defaults to <tt>THISWIKI_PREFIX</tt>)
* @param string $prop_prefix The prefix to add to $property (defaults to <tt>WIKINI_VOC_PREFIX</tt>)
* @return string The value corresponding to ($resource, $property) or null if
* there is no such couple in the triples table.
*/
function GetTripleValue($resource, $property, $re_prefix = THISWIKI_PREFIX, $prop_prefix = WIKINI_VOC_PREFIX)
{
$res = $this->GetAllTriplesValues($resource, $property, $re_prefix, $prop_prefix);
if ($res) return $res[0]['value'];
return null;
}
 
/**
* Checks whether a triple exists or not
* @param string $resource The resource of the triple to find
* @param string $property The property of the triple to find
* @param string $value The value of the triple to find
* @param string $re_prefix The prefix to add to $resource (defaults to <tt>THISWIKI_PREFIX</tt>)
* @param string $prop_prefix The prefix to add to $property (defaults to <tt>WIKINI_VOC_PREFIX</tt>)
* @param int The id of the found triple or 0 if there is no such triple.
*/
function TripleExists($resource, $property, $value, $re_prefix = THISWIKI_PREFIX, $prop_prefix = WIKINI_VOC_PREFIX)
{
$sql = 'SELECT id FROM ' . $this->GetConfigValue('table_prefix') . 'triples '
. 'WHERE resource = "' . addslashes($re_prefix . $resource) . '" '
. 'AND property = "' . addslashes($prop_prefix . $property) . '" '
. 'AND value = "' . addslashes($value) . '"';
$res = $this->LoadSingle($sql);
if (!$res) return 0;
return $res['id'];
}
 
/**
* Inserts a new triple ($resource, $property, $value) in the triples' table
* @param string $resource The resource of the triple to insert
* @param string $property The property of the triple to insert
* @param string $value The value of the triple to insert
* @param string $re_prefix The prefix to add to $resource (defaults to <tt>THISWIKI_PREFIX</tt>)
* @param string $prop_prefix The prefix to add to $property (defaults to <tt>WIKINI_VOC_PREFIX</tt>)
* @return int An error code: 0 (success), 1 (failure) or 3 (already exists)
*/
function InsertTriple($resource, $property, $value, $re_prefix = THISWIKI_PREFIX, $prop_prefix = WIKINI_VOC_PREFIX)
{
if ($this->TripleExists($resource, $property, $value, $re_prefix, $prop_prefix))
{
return 3;
}
$sql = 'INSERT INTO ' . $this->GetConfigValue('table_prefix') . 'triples (resource, property, value)'
. 'VALUES ("' . addslashes($re_prefix . $resource) . '", "'
. addslashes($prop_prefix . $property) . '", "'
. addslashes($value) . '")';
return $this->Query($sql) ? 0 : 1;
}
 
/**
* Updates a triple ($resource, $property, $value) in the triples' table
* @param string $resource The resource of the triple to update
* @param string $property The property of the triple to update
* @param string $oldvalue The old value of the triple to update
* @param string $newvalue The new value of the triple to update
* @param string $re_prefix The prefix to add to $resource (defaults to <tt>THISWIKI_PREFIX</tt>)
* @param string $prop_prefix The prefix to add to $property (defaults to <tt>WIKINI_VOC_PREFIX</tt>)
* @return int An error code: 0 (succ?s), 1 (?chec),
* 2 ($resource, $property, $oldvalue does not exist)
* or 3 ($resource, $property, $newvalue already exists)
*/
function UpdateTriple($resource, $property, $oldvalue, $newvalue, $re_prefix = THISWIKI_PREFIX, $prop_prefix = WIKINI_VOC_PREFIX)
{
$id = $this->TripleExists($resource, $property, $oldvalue, $re_prefix, $prop_prefix);
if (!$id) return 2;
if ($this->TripleExists($resource, $property, $newvalue, $re_prefix, $prop_prefix))
{
return 3;
}
$sql = 'UPDATE ' . $this->GetConfigValue('table_prefix') . 'triples '
. 'SET value = "' . addslashes($newvalue) . '" '
. 'WHERE id = ' . $id;
return $this->Query($sql) ? 0 : 1;
}
 
/**
* Deletes a triple ($resource, $property, $value) from the triples' table
* @param string $resource The resource of the triple to delete
* @param string $property The property of the triple to delete
* @param string $value The value of the triple to delete. If set to <tt>null</tt>,
* deletes all the triples corresponding to ($resource, $property). (defaults to <tt>null</tt>)
* @param string $re_prefix The prefix to add to $resource (defaults to <tt>THISWIKI_PREFIX</tt>)
* @param string $prop_prefix The prefix to add to $property (defaults to <tt>WIKINI_VOC_PREFIX</tt>)
*/
function DeleteTriple($resource, $property, $value = null, $re_prefix = THISWIKI_PREFIX, $prop_prefix = WIKINI_VOC_PREFIX)
{
$sql = 'DELETE FROM ' . $this->GetConfigValue('table_prefix') . 'triples '
. 'WHERE resource = "' . addslashes($re_prefix . $resource) . '" '
. 'AND property = "' . addslashes($prop_prefix . $property) . '" ';
if ($value !== null) $sql .= 'AND value = "' . addslashes($value) . '"';
$this->Query($sql);
}
 
// inclusions
/**
* Enr?gistre une nouvelle inclusion dans la pile d'inclusions.
*
* @param string $pageTag Le nom de la page qui va ?tre inclue
* @return int Le nombre d'?l?ments dans la pile
*/
function RegisterInclusion($pageTag)
{
return array_unshift($this->inclusions, strtolower(trim($pageTag)));
}
/**
* Retire le dernier ?l?ment de la pile d'inclusions.
*
* @return string Le nom de la page dont l'inclusion devrait se terminer.
* null s'il n'y a plus d'inclusion dans la pile.
*/
function UnregisterLastInclusion()
{
return array_shift($this->inclusions);
}
/**
* Renvoie le nom de la page en cours d'inclusion.
*
* @example // dans le cas d'une action comme l'ActionEcrivezMoi
* if($inc = $this->CurrentInclusion() && strtolower($this->GetPageTag()) != $inc)
* echo 'Cette action ne peut ?tre appel?e depuis une page inclue';
* @return string Le nom (tag) de la page (en minuscules)
* false si la pile est vide.
*/
function GetCurrentInclusion()
{
return isset($this->inclusions[0]) ? $this->inclusions[0]: false ;
}
/**
* V?rifie si on est ? l'int?rieur d'une inclusion par $pageTag (sans tenir compte de la casse)
*
* @param string $pageTag Le nom de la page ? v?rifier
* @return bool True si on est ? l'int?rieur d'une inclusion par $pageTag (false sinon)
*/
function IsIncludedBy($pageTag)
{
return in_array(strtolower($pageTag), $this->inclusions);
}
/**
*
* @return array La pile d'inclusions
* L'?l?ment 0 sera la derni?re inclusion, l'?l?ment 1 sera son parent et ainsi de suite.
*/
function GetAllInclusions()
{
return $this->inclusions;
}
/**
* Remplace la pile des inclusions par une nouvelle pile (par d?faut une pile vide)
* Permet de formatter une page sans tenir compte des inclusions pr?c?dentes.
*
* @param array $ La nouvelle pile d'inclusions.
* L'?l?ment 0 doit repr?senter la derni?re inclusion, l'?l?ment 1 son parent et ainsi de suite.
* @return array L'ancienne pile d'inclusions, avec les noms des pages en minuscules.
*/
function SetInclusions($pile = array())
{
$temp = $this->inclusions;
$this->inclusions = $pile;
return $temp;
}
 
// PAGES
function LoadPage($tag, $time = "", $cache = 1)
{
// retrieve from cache
if (!$time && $cache && (($cachedPage = $this->GetCachedPage($tag)) !== false))
{
$page = $cachedPage;
}
else // load page
{
$sql = "SELECT * FROM ".$this->config["table_prefix"]."pages"
. " WHERE tag = '".mysql_real_escape_string($tag)."' AND "
. ($time ? "time = '".mysql_real_escape_string($time)."'" : "latest = 'Y'") . " LIMIT 1";
$page = $this->LoadSingle($sql);
// cache result
if (!$time) $this->CachePage($page, $tag);
}
return $page;
}
/**
* Retrieves the cached version of a page.
*
* Notice that this method null or false, use
* $this->GetCachedPage($tag) === false
* to check if a page is not in the cache.
* @return mixed The cached version of a page:
* - the page DB line if the page exists and is in cache
* - null if the cache knows that the page does not exists
* - false is the cache does not know the page
*/
function GetCachedPage($tag) {return (array_key_exists($tag, $this->pageCache) ? $this->pageCache[$tag] : false); }
/**
* Caches a page's DB line.
*
* @param array $page The page (full) DB line or null if the page does not exists
* @param string $pageTag The tag of the page to cache. Defaults to $page['tag'] but is mendatory when $page === null
*/
function CachePage($page, $pageTag = null) {
if ($pageTag === null)
{
$pageTag = $page["tag"];
}
$this->pageCache[$pageTag] = $page;
}
function SetPage($page) { $this->page = $page; if ($this->page["tag"]) $this->tag = $this->page["tag"]; }
function LoadPageById($id) { return $this->LoadSingle("select * from ".$this->config["table_prefix"]."pages where id = '".mysql_real_escape_string($id)."' limit 1"); }
function LoadRevisions($page) { return $this->LoadAll("select * from ".$this->config["table_prefix"]."pages where tag = '".mysql_real_escape_string($page)."' order by time desc"); }
function LoadPagesLinkingTo($tag) { return $this->LoadAll("select from_tag as tag from ".$this->config["table_prefix"]."links where to_tag = '".mysql_real_escape_string($tag)."' order by tag"); }
function LoadRecentlyChanged($limit=50)
{
$limit= (int) $limit;
if ($pages = $this->LoadAll("select id, tag, time, user, owner from ".$this->config["table_prefix"]."pages where latest = 'Y' and comment_on = '' order by time desc limit $limit"))
{
foreach ($pages as $page)
{
$this->CachePage($page);
}
return $pages;
}
}
function LoadAllPages() { return $this->LoadAll("select * from ".$this->config["table_prefix"]."pages where latest = 'Y' order by tag"); }
function FullTextSearch($phrase) { return $this->LoadAll("select * from ".$this->config["table_prefix"]."pages where latest = 'Y' and match(tag, body) against('".mysql_real_escape_string($phrase)."')"); }
function LoadWantedPages() {
$p = $this->config["table_prefix"];
$r = "SELECT ${p}links.to_tag AS tag, COUNT(${p}links.from_tag) AS count "
. "FROM ${p}links LEFT JOIN ${p}pages ON ${p}links.to_tag = ${p}pages.tag "
. "WHERE ${p}pages.tag IS NULL GROUP BY ${p}links.to_tag ORDER BY count DESC, tag ASC";
return $this->LoadAll($r);
}
function LoadOrphanedPages() { return $this->LoadAll("select distinct tag from ".$this->config["table_prefix"]."pages as p left join ".$this->config["table_prefix"]."links as l on p.tag = l.to_tag where l.to_tag is NULL and p.comment_on = '' and p.latest = 'Y' order by tag"); }
function IsOrphanedPage($tag) { return $this->LoadAll("select distinct tag from ".$this->config['table_prefix']."pages as p left join ".$this->config['table_prefix']."links as l on p.tag = l.to_tag where l.to_tag is NULL and p.latest = 'Y' and tag = '".mysql_real_escape_string($tag)."'"); }
function DeleteOrphanedPage($tag) {
$p = $this->config["table_prefix"];
$this->Query("DELETE FROM ${p}pages WHERE tag='".mysql_real_escape_string($tag)."' OR comment_on='".mysql_real_escape_string($tag)."'");
$this->Query("DELETE FROM ${p}links WHERE from_tag='".mysql_real_escape_string($tag)."' ");
$this->Query("DELETE FROM ${p}acls WHERE page_tag='".mysql_real_escape_string($tag)."' ");
$this->Query("DELETE FROM ${p}referrers WHERE page_tag='".mysql_real_escape_string($tag)."' ");
}
 
/**
* SavePage
* Sauvegarde un contenu dans une page donn?e
*
* @param string $body Contenu ? sauvegarder dans la page
* @param string $tag Nom de la page
* @param string $comment_on Indication si c'est un commentaire
* @param boolean $bypass_acls Indication si on bypasse les droits d'?criture
* @return int Code d'erreur : 0 (succ?s), 1 (l'utilisateur n'a pas les droits)
*/
function SavePage($tag, $body, $comment_on = "", $bypass_acls = false)
{
// get current user
$user = $this->GetUserName();
 
// check bypass of rights or write privilege
$rights = $bypass_acls || ($comment_on ? $this->HasAccess("comment", $comment_on) : $this->HasAccess("write", $tag));
if ($rights)
{
// is page new?
if (!$oldPage = $this->LoadPage($tag))
{
// create default write acl. store empty write ACL for comments.
$this->SaveAcl($tag, "write", ($comment_on ? $user : $this->GetConfigValue("default_write_acl")));
 
// create default read acl
$this->SaveAcl($tag, "read", $this->GetConfigValue("default_read_acl"));
 
// create default comment acl.
$this->SaveAcl($tag, "comment", ($comment_on ? "" : $this->GetConfigValue("default_comment_acl")));
 
// current user is owner; if user is logged in! otherwise, no owner.
if ($this->GetUser()) $owner = $user;
else $owner = '';
}
else
{
// aha! page isn't new. keep owner!
$owner = $oldPage["owner"];
 
// ...and comment_on, eventualy?
if ($comment_on == '') $comment_on = $oldPage['comment_on'];
}
 
 
// set all other revisions to old
$this->Query("update ".$this->config["table_prefix"]."pages set latest = 'N' where tag = '".mysql_real_escape_string($tag)."'");
 
// add new revision
$this->Query("insert into ".$this->config["table_prefix"]."pages set ".
"tag = '".mysql_real_escape_string($tag)."', ".
($comment_on ? "comment_on = '".mysql_real_escape_string($comment_on)."', " : "").
"time = now(), ".
"owner = '".mysql_real_escape_string($owner)."', ".
"user = '".mysql_real_escape_string($user)."', ".
"latest = 'Y', ".
"body = '".mysql_real_escape_string(chop($body))."'");
 
unset($this->pageCache[$tag]);
return 0;
}
else return 1;
}
 
/**
* AppendContentToPage
* Ajoute du contenu ? la fin d'une page
*
* @param string $content Contenu ? ajouter ? la page
* @param string $page Nom de la page
* @param boolean $bypass_acls Boul?en pour savoir s'il faut bypasser les ACLs
* @return int Code d'erreur : 0 (succ?s), 1 (pas de contenu sp?cifi?)
*/
function AppendContentToPage($content, $page, $bypass_acls = false)
{
// Si un contenu est sp?cifi?
if (isset($content))
{
// -- D?termine quelle est la page :
// -- pass?e en param?tre (que se passe-t'il si elle n'existe pas ?)
// -- ou la page en cours par d?faut
$page = isset($page) ? $page : $this->GetPageTag();
 
// -- Chargement de la page
$result = $this->LoadPage($page);
$body = $result['body'];
// -- Ajout du contenu ? la fin de la page
$body .= $content;
 
// -- Sauvegarde de la page
// TODO : que se passe-t-il si la page est pleine ou si l'utilisateur n'a pas les droits ?
$this->SavePage($page, $body, "", $bypass_acls);
// now we render it internally so we can write the updated link table.
$this->ClearLinkTable();
$this->StartLinkTracking();
$temp = $this->SetInclusions();
$this->RegisterInclusion($this->GetPageTag()); // on simule totalement un affichage normal
$this->Format($body);
$this->SetInclusions($temp);
if($user = $this->GetUser())
{
$this->TrackLinkTo($user['name']);
}
if($owner = $this->GetPageOwner())
{
$this->TrackLinkTo($owner);
}
$this->StopLinkTracking();
$this->WriteLinkTable();
$this->ClearLinkTable();/**/
 
// Retourne 0 seulement si tout c'est bien pass?
return 0;
}
else return 1;
}
/**
* LogAdministrativeAction($user, $content, $page = "")
*
* @param string $user Utilisateur
* @param string $content Contenu de l'enregistrement
* @param string $page Page de log
*
* @return int Code d'erreur : 0 (succ?s), 1 (pas de contenu sp?cifi?)
*/
function LogAdministrativeAction($user, $content, $page = "")
{
$order = array("\r\n", "\n", "\r");
$replace = '\\n';
$content = str_replace($order, $replace, $content);
$contentToAppend = "\n" . date("Y-m-d H:i:s") . " . . . . " . $user . " . . . . " . $content . "\n";
$page = $page ? $page : "LogDesActionsAdministratives" . date("Ymd");
return $this->AppendContentToPage($contentToAppend, $page, true);
}
 
/**
* Make the purge of page versions that are older than the last version older than 3 "pages_purge_time"
* This method permits to allways keep a version that is older than that period.
*/
function PurgePages() {
if ($days = $this->GetConfigValue("pages_purge_time")) { // is purge active ?
// let's search which pages versions we have to remove
// this is necessary beacause even MySQL does not handel multi-tables deletes before version 4.0
$wnPages = $this->GetConfigValue('table_prefix') . 'pages';
$sql = 'SELECT DISTINCT a.id FROM ' . $wnPages . ' a,' . $wnPages . ' b WHERE a.latest = \'N\' AND a.time < date_sub(now(), INTERVAL \'' . addslashes($days) . '\' DAY) AND a.tag = b.tag AND a.time < b.time AND b.time < date_sub(now(), INTERVAL \'' . addslashes($days) . '\' DAY)';
$ids = $this->LoadAll($sql);
 
if (count($ids)) { // there are some versions to remove from DB
// let's build one big request, that's better...
$sql = 'DELETE FROM ' . $wnPages . ' WHERE id IN (';
foreach($ids as $key => $line){
$sql .= ($key ? ', ':'') . $line['id']; // NB.: id is an int, no need of quotes
}
$sql .= ')';
 
// ... and send it !
$this->Query($sql);
}
}
}
 
 
 
// COOKIES
function SetSessionCookie($name, $value)
{
SetCookie($name, $value, 0, $this->CookiePath);
$_COOKIE[$name] = $value;
}
function SetPersistentCookie($name, $value, $remember = 0)
{
SetCookie($name, $value, time() + ($remember ? 90*24*60*60 : 60 * 60), $this->CookiePath);
$_COOKIE[$name] = $value;
}
function DeleteCookie($name)
{
SetCookie($name, "", 1, $this->CookiePath);
$_COOKIE[$name] = "";
}
function GetCookie($name) { return $_COOKIE[$name]; }
 
 
 
// HTTP/REQUEST/LINK RELATED
function SetMessage($message) { $_SESSION["message"] = $message; }
function GetMessage()
{
if (isset($_SESSION["message"])) $message = $_SESSION["message"];
else $message = "";
$_SESSION["message"] = "";
return $message;
}
function Redirect($url)
{
header("Location: $url");
exit;
}
// returns just PageName[/method].
function MiniHref($method = "", $tag = "")
{
if (!$tag = trim($tag)) $tag = $this->tag;
return $tag.($method ? "/".$method : "");
}
// returns the full url to a page/method.
function Href($method = "", $tag = "", $params = "", $htmlspchars = true)
{
$href = $this->config["base_url"].$this->MiniHref($method, $tag);
if ($params)
{
$href .= ($this->config["rewrite_mode"] ? "?" : ($htmlspchars ? "&amp;" : '&')).$params;
}
return $href;
}
function Link($tag, $method = "", $text = "", $track = 1)
{
$displayText = $text ? $text : $tag;
// is this an interwiki link?
if (preg_match('/^' . WN_INTERWIKI_CAPTURE . '$/', $tag, $matches))
{
if ($tagInterWiki = $this->GetInterWikiUrl($matches[1], $matches[2])) {
return '<a href="'.htmlspecialchars($tagInterWiki).'">'
.htmlspecialchars($displayText).' (interwiki)</a>';
}
else return '<a href="'.htmlspecialchars($tag).'">'
.htmlspecialchars($displayText).' (interwiki inconnu)</a>';
}
// is this a full link? ie, does it contain non alpha-numeric characters?
// Note : [:alnum:] is equivalent [0-9A-Za-z]
// [^[:alnum:]] means : some caracters other than [0-9A-Za-z]
// For example : "www.adress.com", "mailto:adress@domain.com", "http://www.adress.com"
else if (preg_match("/[^[:alnum:]]/", $tag))
{
// check for various modifications to perform on $tag
if (preg_match("/^[\w.-]+\@[\w.-]+$/", $tag))
{ // email addresses
$tag = 'mailto:'.$tag;
}
// Note : in Perl regexp, (?: ... ) is a non-catching cluster
else if (preg_match('/^[[:alnum:]][[:alnum:].-]*(?:\/|$)/', $tag))
{ // protocol-less URLs
$tag = 'http://'.$tag;
}
// Finally, block script schemes (see RFC 3986 about
// schemes) and allow relative link & protocol-full URLs
else if (preg_match('/^[a-z0-9.+-]*script[a-z0-9.+-]*:/i', $tag)
|| !(preg_match('/^\.?\.?\//', $tag)
|| preg_match('/^[a-z0-9.+-]+:\/\//i', $tag)))
{
// If does't fit, we can't qualify $tag as an URL.
// There is a high risk that $tag is just XSS (bad
// javascript: code) or anything nasty. So we must not
// produce any link at all.
return htmlspecialchars($tag.($text ? ' '.$text : ''));
}
// Important: Here, we know that $tag is not something bad
// and that we must produce a link with it
 
// An inline image? (text!=tag and url ends by png,gif,jpeg)
if ($text and preg_match("/\.(gif|jpeg|png|jpg)$/i",$tag))
{
return '<img src="'.htmlspecialchars($tag)
.'" alt="'.htmlspecialchars($displayText).'"/>';
}
else
{
// Even if we know $tag is harmless, we MUST encode it
// in HTML with htmlspecialchars() before echoing it.
// This is not about being paranoiac. This is about
// being compliant to the HTML standard.
return '<a href="'.htmlspecialchars($tag).'">'
.htmlspecialchars($displayText).'</a>';
}
}
else
{
// it's a Wiki link!
if (!empty($track)) $this->TrackLinkTo($tag);
if ($this->LoadPage($tag))
return '<a href="'.htmlspecialchars($this->href($method, $tag)).'">'
.htmlspecialchars($displayText).'</a>';
else
return '<span class="missingpage">'.htmlspecialchars($displayText)
.'</span><a href="'.htmlspecialchars($this->href("edit", $tag)).'">?</a>';
}
}
function ComposeLinkToPage($tag, $method = "", $text = "", $track = 1) {
if (!$text) $text = $tag;
$text = htmlspecialchars($text);
if ($track)
$this->TrackLinkTo($tag);
return '<a href="'.$this->href($method, $tag).'">'.$text.'</a>';
}
function IsWikiName($text) {
return preg_match('/^' . WN_CAMEL_CASE . '$/', $text);
}
 
// LinkTracking management
/**
* Tracks the link to a given page (only if the LinkTracking is activated)
* @param string $tag The tag (name) of the page to track a link to.
*/
function TrackLinkTo($tag) {
if ($this->LinkTracking()) $this->linktable[] = $tag;
}
/**
* @return array The current link tracking table
*/
function GetLinkTable() { return $this->linktable; }
/**
* Clears the link tracking table
*/
function ClearLinkTable() { $this->linktable = array(); }
/**
* Starts the LinkTracking
* @return bool The previous state of the link tracking
*/
function StartLinkTracking() {
return $this->LinkTracking(true);
}
/**
* Stops the LinkTracking
* @return bool The previous state of the link tracking
*/
function StopLinkTracking() {
return $this->LinkTracking(false);
}
/**
* Sets and/or retrieve the state of the LinkTracking
* @param bool $newStatus The new status of the LinkTracking
* (defaults to <tt>null</tt> which lets it unchanged)
* @return bool The previous state of the link tracking
*/
function LinkTracking($newStatus = null)
{
$old = $this->isTrackingLinks;
if ($newStatus !== null) $this->isTrackingLinks = $newStatus;
return $old;
}
function WriteLinkTable() {
// delete old link table
$this->Query("delete from ".$this->config["table_prefix"]."links where from_tag = '".mysql_real_escape_string($this->GetPageTag())."'");
if ($linktable = $this->GetLinkTable())
{
$from_tag = mysql_real_escape_string($this->GetPageTag());
foreach ($linktable as $to_tag)
{
$lower_to_tag = strtolower($to_tag);
if (!isset($written[$lower_to_tag]))
{
$this->Query("insert into ".$this->config["table_prefix"]."links set from_tag = '".$from_tag."', to_tag = '".mysql_real_escape_string($to_tag)."'");
$written[$lower_to_tag] = 1;
}
}
}
}
 
function Header() {
$action = $this->GetConfigValue("header_action");
if (($actionObj = &$this->GetActionObject($action)) && is_object($actionObj))
{
return $actionObj->GenerateHeader();
}
return $this->Action($action, 1);
}
 
function Footer() {
$action = $this->GetConfigValue("footer_action");
if (($actionObj = &$this->GetActionObject($action)) && is_object($actionObj))
{
return $actionObj->GenerateFooter();
}
return $this->Action($action, 1);
}
 
// FORMS
function FormOpen($method = "", $tag = "", $formMethod = "post") {
$result = "<form action=\"".$this->href($method, $tag)."\" method=\"".$formMethod."\">\n";
if (!$this->config["rewrite_mode"]) $result .= "<input type=\"hidden\" name=\"wiki\" value=\"".$this->MiniHref($method, $tag)."\" />\n";
return $result;
}
function FormClose() {
return "</form>\n";
}
 
 
 
// INTERWIKI STUFF
function ReadInterWikiConfig() {
if ($lines = file("interwiki.conf"))
{
foreach ($lines as $line)
{
if ($line = trim($line))
{
list($wikiName, $wikiUrl) = explode(" ", trim($line));
$this->AddInterWiki($wikiName, $wikiUrl);
}
}
}
}
function AddInterWiki($name, $url) {
$this->interWiki[strtolower($name)] = $url;
}
function GetInterWikiUrl($name, $tag)
{
if (isset($this->interWiki[strtolower($name)])) return $this->interWiki[strtolower($name)].$tag;
else return FALSE;
}
 
 
 
// REFERRERS
function LogReferrer($tag = "", $referrer = "") {
// fill values
if (!$tag = trim($tag)) $tag = $this->GetPageTag();
if (!$referrer = trim($referrer) AND isset($_SERVER["HTTP_REFERER"])) $referrer = $_SERVER["HTTP_REFERER"];
 
// check if it's coming from another site
if ($referrer && !preg_match("/^".preg_quote($this->GetConfigValue("base_url"), "/")."/", $referrer))
{
// avoid XSS (with urls like "javascript:alert()" and co)
// by forcing http/https prefix
// NB.: this does NOT exempt to htmlspecialchars() the collected URIs !
if (!preg_match('`^https?://`', $referrer)) return;
 
$this->Query("insert into ".$this->config["table_prefix"]."referrers set ".
"page_tag = '".mysql_real_escape_string($tag)."', ".
"referrer = '".mysql_real_escape_string($referrer)."', ".
"time = now()");
}
}
function LoadReferrers($tag = "") {
return $this->LoadAll("select referrer, count(referrer) as num from ".$this->config["table_prefix"]."referrers ".($tag = trim($tag) ? "where page_tag = '".mysql_real_escape_string($tag)."'" : "")." group by referrer order by num desc");
}
function PurgeReferrers() {
if ($days = $this->GetConfigValue("referrers_purge_time")) {
$this->Query("delete from ".$this->config["table_prefix"]."referrers where time < date_sub(now(), interval '".mysql_real_escape_string($days)."' day)");
}
}
 
 
 
// PLUGINS
/**
* Exacutes an "action" module and returns the generated output
* @param string $action The name of the action and its eventual parameters,
* as it appears in the page between "{{" and "}}"
* @param boolean $forceLinkTracking By default, the link tracking will be disabled
* during the call of an action. Set this value to <code>true</code> to allow it.
* @param array $vars An array of additionnal parameters to give to the action, in the form
* array( 'param' => 'value').
* This allows you to call Action() internally, setting $action to the name of the action
* you want to call and it's parameters in an array, wich is more efficient than
* the pattern-matching algorithm used to extract the parameters from $action.
* @return The output generated by the action.
*/
function Action($action, $forceLinkTracking = 0, $vars = array())
{
$cmd = trim($action);
// extract $action and $vars_temp ("raw" attributes)
if (!preg_match("/^([a-zA-Z-0-9]+)\/?(.*)$/", $cmd, $matches))
{
return '<i>Action invalide &quot;' . htmlspecialchars($cmd) . '&quot;</i>';
}
list(, $action, $vars_temp) = $matches;
$vars[$vars_temp] = $vars_temp; // usefull for {{action/vars_temp}}
 
// now that we have the action's name, we can check if the user satisfies the ACLs
if (!$this->CheckModuleACL($action, 'action'))
{
return 'Erreur: vous n\'avez pas acc&egrave;s &agrave; l\'action ' . $action . '.';
}
 
// match all attributes (key and value)
// prepare an array for extract() to work with (in $this->IncludeBuffered())
if (preg_match_all("/([a-zA-Z0-9]*)=\"(.*)\"/U", $vars_temp, $matches))
{
for ($a = 0; $a < count($matches[1]); $a++)
{
$vars[$matches[1][$a]] = $matches[2][$a];
}
}
 
if (!$forceLinkTracking) $this->StopLinkTracking();
if ($actionObj = &$this->GetActionObject($action))
{
if (is_object($actionObj))
{
$result = $actionObj->PerformAction($vars, $cmd);
}
else // $actionObj is an error message
{
$result = $actionObj;
}
}
else // $actionObj == null (not found, no error message)
{
$this->parameter = &$vars;
$result = $this->IncludeBuffered(strtolower($action).".php", "<i>Action inconnue &quot;$action&quot;</i>", $vars, $this->config["action_path"]);
unset($this->parameter);
}
$this->StartLinkTracking(); // shouldn't we restore the previous status ?
return $result;
}
 
/**
* Finds the object corresponding to an action, if it exists.
* @param string $name The name of an action (should be alphanumeric)
* @return mixed
* - null if the corresponding file was not found or the corresponding class didn't exist after inclusion
* - an error string if the corresponding file was found but an error append while loading it
* - the object corresponding to this action if no problem happend
* To check the result, you should use is_object() on it.
* You should always assign the result of this method by referrence
* to avoid copying the object, which is the default beheviour in PHP4.
* @example
* $var = &$wiki->GetActionObject('actionname');
* if (is_object($var))
* {
* // normal behaviour
* }
* elseif ($var) // $var is not an object but an error string
* {
* // threat error
* }
* else // action was not found
* {
* // rescue from inexising action or sth
* }
*/
function &GetActionObject($name)
{
$name = strtolower($name);
$actionObj = null; // the generated object
if (!preg_match('/^[a-z0-9]+$/', $name)) // paranoiac
{
return $actionObj;
}
 
// already tried to load this object ? (may be null)
if (isset($this->actionObjects[$name]))
{
return $this->actionObjects[$name];
}
 
// object not loaded, try to load it
$filename = $name . '.class.php';
// load parent class for all action objects (only once)
require_once 'includes/action.class.php';
// include the action file, this should return an empty string
$result = $this->IncludeBuffered($filename, null, null, $this->GetConfigValue('action_path'));
if ($result) // the result was not an empty string, certainly an error message
{
$actionObj = $result;
}
elseif ($result !== false) // the result was empty but the file was found
{
$class = 'Action' . ucfirst($name);
if (class_exists($class))
{
$actionObj = new $class($this);
if (!is_a($actionObj, 'WikiniAction'))
{
die("Action invalide '$name': classe incorrecte");
}
}
}
$this->actionObjects[$name] = &$actionObj;
return $actionObj;
}
 
/**
* Retrieves the list of existing actions
* @return array An unordered array of all the available actions.
*/
function GetActionsList()
{
$action_path = $this->GetConfigValue('action_path');
$list = array();
if ($dh = opendir($action_path))
{
while (($file = readdir($dh)) !== false)
{
if (preg_match('/^([a-zA-Z-0-9]+)(.class)?.php$/', $file, $matches))
{
$list[] = $matches[1];
}
}
}
return $list;
}
 
/**
* Retrieves the list of existing handlers
* @return array An unordered array of all the available handlers.
*/
function GetHandlersList()
{
$handler_path = $this->GetConfigValue('handler_path') . '/page/';
$list = array();
if ($dh = opendir($handler_path))
{
while (($file = readdir($dh)) !== false)
{
if (preg_match('/^([a-zA-Z-0-9]+)(.class)?.php$/', $file, $matches))
{
$list[] = $matches[1];
}
}
}
return $list;
}
 
function Method($method) {
if (!$handler = $this->page["handler"]) $handler = "page";
$methodLocation = $handler."/".$method.".php";
return $this->IncludeBuffered($methodLocation, "<i>M&eacute;thode inconnue \"$methodLocation\"</i>", "", $this->config["handler_path"]);
}
function Format($text, $formatter = "wakka") {
return $this->IncludeBuffered("formatters/".$formatter.".php", "<i>Impossible de trouver le formateur \"$formatter\"</i>", compact("text"));
}
 
 
 
// USERS
function LoadUser($name, $password = 0) { return $this->LoadSingle("select * from ".$this->config["table_prefix"]."users where name = '".mysql_real_escape_string($name)."' ".($password === 0 ? "" : "and password = '".mysql_real_escape_string($password)."'")." limit 1"); }
function LoadUsers() { return $this->LoadAll("select * from ".$this->config["table_prefix"]."users order by name"); }
function GetUserName() { if ($user = $this->GetUser()) $name = $user["name"]; else if (!$name = gethostbyaddr($_SERVER["REMOTE_ADDR"])) $name = $_SERVER["REMOTE_ADDR"]; return $name; }
function GetUser() { return (isset($_SESSION["user"]) ? $_SESSION["user"] : '');}
function SetUser($user, $remember=0) { $_SESSION["user"] = $user; $this->SetPersistentCookie("name", $user["name"], $remember); $this->SetPersistentCookie("password", $user["password"], $remember); $this->SetPersistentCookie("remember", $remember, $remember); }
function LogoutUser() { $_SESSION["user"] = ""; $this->DeleteCookie("name"); $this->DeleteCookie("password"); }
function UserWantsComments() { if (!$user = $this->GetUser()) return false; return ($user["show_comments"] == "Y"); }
function GetParameter($parameter, $default = '') { return (isset($this->parameter[$parameter]) ? $this->parameter[$parameter] : $default); }
 
 
// COMMENTS
/**
* Charge les commentaires relatifs ? une page.
*
* @param string $tag Nom de la page. Ex : "PagePrincipale"
* @return array Tableau contenant tous les commentaires et leurs
* propri?t?s correspondantes.
*/
function LoadComments($tag)
{
return $this->LoadAll(
"select * " .
"from ".$this->config["table_prefix"]."pages " .
"where comment_on = '".mysql_real_escape_string($tag)."' " .
"and latest = 'Y' " .
"order by substring(tag, 8) + 0");
}
/**
* Charge les derniers commentaires de toutes les pages.
*
* @param int $limit Nombre de commentaires charg?s.
* 0 par d?faut (ie tous les commentaires).
* @return array Tableau contenant chaque commentaire et ses
* propri?t?s associ?es.
* @todo Ajouter le param?tre $start pour permettre une pagination
* des commentaires : ->LoadRecentComments(10, 10)
*/
function LoadRecentComments($limit = 0)
{
// The part of the query which limit the number of comments
if(is_numeric($limit) && $limit > 0) $lim = " limit ".$limit;
else $lim = "";
 
// Query
return $this->LoadAll(
"select * " .
"from " . $this->config["table_prefix"] . "pages " .
"where comment_on != '' " .
"and latest = 'Y' " .
"order by time desc " .
$lim);
}
function LoadRecentlyCommented($limit = 50)
{
$pages = array();
 
// NOTE: this is really stupid. Maybe my SQL-Fu is too weak, but apparently there is no easier way to simply select
// all comment pages sorted by their first revision's (!) time. ugh!
 
// load ids of the first revisions of latest comments. err, huh?
if ($ids = $this->LoadAll("select min(id) as id from ".$this->config["table_prefix"]."pages where comment_on != '' group by tag order by id desc"))
{
// load complete comments
$num=0;
foreach ($ids as $id)
{
$comment = $this->LoadSingle("select * from ".$this->config["table_prefix"]."pages where id = '".$id["id"]."' limit 1");
if (!isset($comments[$comment["comment_on"]]) && $num < $limit)
{
$comments[$comment["comment_on"]] = $comment;
$num++;
}
}
 
// now load pages
if ($comments)
{
// now using these ids, load the actual pages
foreach ($comments as $comment)
{
$page = $this->LoadPage($comment["comment_on"]);
$page["comment_user"] = $comment["user"];
$page["comment_time"] = $comment["time"];
$page["comment_tag"] = $comment["tag"];
$pages[] = $page;
}
}
}
// load tags of pages
//return $this->LoadAll("select comment_on as tag, max(time) as time, tag as comment_tag, user from ".$this->config["table_prefix"]."pages where comment_on != '' group by comment_on order by time desc");
return $pages;
}
 
 
 
// ACCESS CONTROL
// returns true if logged in user is owner of current page, or page specified in $tag
function UserIsOwner($tag = "") {
// check if user is logged in
if (!$this->GetUser()) return false;
 
// set default tag
if (!$tag = trim($tag)) $tag = $this->GetPageTag();
 
// check if user is owner
if ($this->GetPageOwner($tag) == $this->GetUserName()) return true;
}
 
/**
* @param string $group The name of a group
* @return string the ACL associated with the group $gname
* @see UserIsInGroup to check if a user belongs to some group
*/
function GetGroupACL($group)
{
if (array_key_exists($group, $this->_groupsCache))
{
return $this->_groupsCache[$group];
}
return $this->_groupsCache[$group] = $this->GetTripleValue($group, WIKINI_VOC_ACLS, GROUP_PREFIX);
}
 
/**
* Checks if a new group acl is not defined recursively
* (this method expects that groups that are already defined are not themselves defined recursively...)
* @param string $gname The name of the group
* @param string $acl The new acl for that group
* @return boolean True iff the new acl defines the group recursively
*/
function MakesGroupRecursive($gname, $acl, $origin = null, $checked = array())
{
$gname = strtolower($gname);
if ($origin === null)
{
$origin = $gname;
}
elseif ($gname === $origin)
{
return true;
}
foreach (explode("\n", $acl) as $line)
{
if (!$line) continue;
if ($line[0] == '!')
{
$line = substr($line, 1);
}
if (!$line) continue;
if ($line[0] == '@')
{
$line = substr($line, 1);
if (!in_array($line, $checked))
{
if ($this->MakesGroupRecursive($line, $this->GetGroupACL($line), $origin, $checked))
{
return true;
}
}
}
}
$checked[] = $gname;
return false;
}
 
/**
* Sets a new ACL to a given group
* @param string $gname The name of a group
* @param string $acl The new ACL to associate with the group $gname
* @return int 0 if successful, a triple error code or a specific error code:
* 1000 if the new value would define the group recursively
* 1001 if $gname is not named with alphanumeric chars
* @see GetGroupACL
*/
function SetGroupACL($gname, $acl)
{
if (preg_match('/[^A-Za-z0-9]/', $gname))
{
return 1001;
}
$old = $this->GetGroupACL($gname);
if ($this->MakesGroupRecursive($gname, $acl))
{
return 1000;
}
$this->_groupsCache[$gname] = $acl;
if ($old === null)
{
return $this->InsertTriple($gname, WIKINI_VOC_ACLS, $acl, GROUP_PREFIX);
}
elseif ($old === $acl)
{
return 0; // nothing has changed
}
else
{
return $this->UpdateTriple($gname, WIKINI_VOC_ACLS, $old, $acl, GROUP_PREFIX);
}
}
/**
* @return array The list of all group names
*/
function GetGroupsList()
{
$res = $this->GetMatchingTriples(GROUP_PREFIX . '%', WIKINI_VOC_ACLS_URI);
$prefix_len = strlen(GROUP_PREFIX);
$list = array();
foreach ($res as $line)
{
$list[] = substr($line['resource'], $prefix_len);
}
return $list;
}
 
/**
* @param string $group The name of a group
* @return boolean true iff the user is in the given $group
*/
function UserIsInGroup($group, $user = null, $admincheck = true)
{
return $this->CheckACL($this->GetGroupACL($group), $user, $admincheck);
}
 
/**
* Checks if a given user is andministrator
* @param string $user The name of the user (defaults to the current user if not given)
* @return boolean true iff the user is an administrator
*/
function UserIsAdmin($user = null)
{
return $this->UserIsInGroup(ADMIN_GROUP, $user, false);
}
 
function GetPageOwner($tag = "", $time = "") { if (!$tag = trim($tag)) $tag = $this->GetPageTag(); if ($page = $this->LoadPage($tag, $time)) return $page["owner"]; }
function SetPageOwner($tag, $user) {
// check if user exists
if (!$this->LoadUser($user)) return;
 
// updated latest revision with new owner
$this->Query("update ".$this->config["table_prefix"]."pages set owner = '".mysql_real_escape_string($user)."' where tag = '".mysql_real_escape_string($tag)."' and latest = 'Y' limit 1");
}
function LoadAcl($tag, $privilege, $useDefaults = 1) {
if ((!$acl = $this->LoadSingle("select * from ".$this->config["table_prefix"]."acls where page_tag = '".mysql_real_escape_string($tag)."' and privilege = '".mysql_real_escape_string($privilege)."' limit 1")) && $useDefaults)
{
$acl = array("page_tag" => $tag, "privilege" => $privilege, "list" => $this->GetConfigValue("default_".$privilege."_acl"));
}
return $acl;
}
function SaveAcl($tag, $privilege, $list) {
if ($this->LoadAcl($tag, $privilege, 0)) $this->Query("update ".$this->config["table_prefix"]."acls set list = '".mysql_real_escape_string(trim(str_replace("\r", "", $list)))."' where page_tag = '".mysql_real_escape_string($tag)."' and privilege = '".mysql_real_escape_string($privilege)."' limit 1");
else $this->Query("insert into ".$this->config["table_prefix"]."acls set list = '".mysql_real_escape_string(trim(str_replace("\r", "", $list)))."', page_tag = '".mysql_real_escape_string($tag)."', privilege = '".mysql_real_escape_string($privilege)."'");
}
// returns true if $user (defaults to current user) has access to $privilege on $page_tag (defaults to current page)
function HasAccess($privilege, $tag = "", $user = "") {
// set defaults
if (!$tag = trim($tag)) $tag = $this->GetPageTag();
if (!$user)
{
// if current user is owner, return true. owner can do anything!
if ($this->UserIsOwner($tag)) return true;
$user = $this->GetUserName();
}
 
// TODO: we might want to check if a given $user (other than the current user)
// has access to a given page. If the $user is the owner of that page,
// this method might give a wrong result (because we can't check that)
 
// load acl
$acl = $this->LoadAcl($tag, $privilege);
 
// fine fine... now go through acl
return $this->CheckACL($acl["list"], $user);
}
 
/**
* Checks if some $user satisfies the given $acl
* @param string $acl The acl to check, in the same format than for pages ACL's
* @param string $user The name of the user that must satisfy the ACL. By default
* the current remote user.
* @return bool True if the $user satisfies the $acl, false otherwise
*/
function CheckACL($acl, $user = null, $admincheck = true)
{
if (!$user)
{
$user = $this->GetUserName();
}
 
if ($admincheck && $this->UserIsAdmin($user))
{
return true;
}
 
 
foreach (explode("\n", $acl) as $line)
{
$line = trim($line);
 
// check for inversion character "!"
if (preg_match("/^[!](.*)$/", $line, $matches))
{
$negate = 1;
$line = $matches[1];
}
else
{
$negate = 0;
}
 
// if there's still anything left... lines with just a "!" don't count!
if ($line)
{
switch ($line[0])
{
case "#": // comments
break;
case "*": // everyone
return !$negate;
case "+": // registered users
if (!$this->LoadUser($user))
{
return $negate;
}
else
{
return !$negate;
}
case '@': // groups
$gname = substr($line, 1);
// paranoiac: avoid line = '@'
if ($gname && $this->UserIsInGroup($gname, $user, false /* we have allready checked if user was an admin */))
{
return !$negate;
}
break;
default: // simple user entry
if ($line == $user)
{
return !$negate;
}
}
}
}
 
// tough luck.
return false;
}
 
/**
* Loads the module ACL for a certain module
* @param string $module The name of the module
* @param string $module_type The type of module: 'action' or 'handler'
* @return mixed The ACL for the given module or <tt>null</tt> if no such
* ACL was found (which should probably be interpreted as '*').
*/
function GetModuleACL($module, $module_type)
{
$module = strtolower($module);
switch ($module_type)
{
case 'action':
if (array_key_exists($module, $this->_actionsAclsCache))
{
$acl = $this->_actionsAclsCache[$module];
break;
}
$this->_actionsAclsCache[$module] = $acl = $this->GetTripleValue($module, WIKINI_VOC_ACLS, WIKINI_VOC_ACTIONS_PREFIX);
if ($acl === null)
{
$action = &$this->GetActionObject($module);
if (is_object($action))
{
return $this->_actionsAclsCache[$module] = $action->GetDefaultACL();
}
}
break;
case 'handler':
$acl = $this->GetTripleValue($module, WIKINI_VOC_ACLS, WIKINI_VOC_HANDLERS_PREFIX);
break;
default:
return null; // TODO error msg ?
}
return $acl === null ? '*' : $acl;
}
 
/**
* Sets the $acl for a given $module
* @param string $module The name of the module
* @param string $module_type The type of module ('action' or 'handler')
* @param string $acl The new ACL for that module
* @return 0 on success, > 0 on error (see InsertTriple and UpdateTriple)
*/
function SetModuleACL($module, $module_type, $acl)
{
$module = strtolower($module);
$voc_prefix = $module_type == 'action' ? WIKINI_VOC_ACTIONS_PREFIX : WIKINI_VOC_HANDLERS_PREFIX;
$old = $this->GetTripleValue($module, WIKINI_VOC_ACLS, $voc_prefix);
if ($module_type == 'action')
{
$this->_actionsAclsCache[$module] = $acl;
}
if ($old === null)
{
return $this->InsertTriple($module, WIKINI_VOC_ACLS, $acl, $voc_prefix);
}
elseif ($old === $acl)
{
return 0; // nothing has changed
}
else
{
return $this->UpdateTriple($module, WIKINI_VOC_ACLS, $old, $acl, $voc_prefix);
}
}
 
/**
* Checks if a $user satisfies the ACL to access a certain $module
* @param string $module The name of the module to access
* @param string $module_type The type of the module ('action' or 'handler')
* @param string $user The name of the user. By default
* the current remote user.
* @return bool True if the $user has access to the given $module, false otherwise.
*/
function CheckModuleACL($module, $module_type, $user = null)
{
$acl = $this->GetModuleACL($module, $module_type);
if ($acl === null) return true; // undefined ACL means everybody has access
return $this->CheckACL($acl, $user);
}
 
 
// MAINTENANCE
function Maintenance() {
// purge referrers
$this->PurgeReferrers();
// purge old page revisions
$this->PurgePages();
}
 
 
 
// THE BIG EVIL NASTY ONE!
function Run($tag, $method = "") {
if(!($this->GetMicroTime()%9)) $this->Maintenance();
 
$this->ReadInterWikiConfig();
 
// do our stuff!
if (!$this->method = trim($method)) $this->method = "show";
if (!$this->tag = trim($tag)) $this->Redirect($this->href("", $this->config["root_page"]));
if ((!$this->GetUser() && isset($_COOKIE["name"])) && ($user = $this->LoadUser($_COOKIE["name"], $_COOKIE["password"]))) $this->SetUser($user, $_COOKIE["remember"]);
$this->SetPage($this->LoadPage($tag, (isset($_REQUEST["time"]) ? $_REQUEST["time"] :'')));
$this->LogReferrer();
 
//correction pour un support plus facile de nouveaux handlers
if ($this->CheckModuleACL($this->method, 'handler'))
{
echo $this->Method($this->method);
}
else
{
echo 'Vous ne pouvez pas acc&eacute;der &agrave; cette page par le handler sp&eacute;cifi&eacute;.';
}
 
// action redirect: aucune redirection n'a eu lieu, effacer la liste des redirections pr?c?dentes
if(!empty($_SESSION['redirects'])) session_unregister('redirects');
}
}
 
 
 
// stupid version check
if (!isset($_REQUEST)) die('$_REQUEST[] not found. Wakka requires PHP 4.1.0 or higher!');
 
// workaround for the amazingly annoying magic quotes.
function magicQuotesSuck(&$a)
{
if (is_array($a))
{
foreach ($a as $k => $v)
{
if (is_array($v))
magicQuotesSuck($a[$k]);
else
$a[$k] = stripslashes($v);
}
}
}
 
if (get_magic_quotes_runtime())
{
// Deactivate
set_magic_quotes_runtime(false);
}
 
if (get_magic_quotes_gpc())
{
magicQuotesSuck($_POST);
magicQuotesSuck($_GET);
magicQuotesSuck($_COOKIE);
}
 
 
// default configuration values
$wakkaConfig= array();
$_rewrite_mode = detectRewriteMode();
$wakkaDefaultConfig = array(
'wakka_version' => '',
'wikini_version' => '',
'debug' => 'no',
"mysql_host" => "localhost",
"mysql_database" => "wikini",
"mysql_user" => "wikini",
"mysql_password" => '',
"table_prefix" => "wikini_",
"root_page" => "PagePrincipale",
"wakka_name" => "MonSiteWikiNi",
"base_url" => computeBaseURL($_rewrite_mode),
"rewrite_mode" => $_rewrite_mode,
'meta_keywords' => '',
'meta_description' => '',
"action_path" => "actions",
"handler_path" => "handlers",
"header_action" => "header",
"footer_action" => "footer",
"navigation_links" => "DerniersChangements :: DerniersCommentaires :: ParametresUtilisateur",
"referrers_purge_time" => 24,
"pages_purge_time" => 90,
"default_write_acl" => "*",
"default_read_acl" => "*",
"default_comment_acl" => "*",
"preview_before_save" => 0,
'allow_raw_html' => false);
unset($_rewrite_mode);
 
// load config
if (!$configfile = GetEnv("WAKKA_CONFIG")) $configfile = "wakka.config.php";
if (file_exists($configfile)) include($configfile);
$wakkaConfigLocation = $configfile;
$wakkaConfig = array_merge($wakkaDefaultConfig, $wakkaConfig);
 
// check for locking
if (file_exists("locked")) {
// read password from lockfile
$lines = file("locked");
$lockpw = trim($lines[0]);
 
// is authentification given?
if (isset($_SERVER["PHP_AUTH_USER"])) {
if (!(($_SERVER["PHP_AUTH_USER"] == "admin") && ($_SERVER["PHP_AUTH_PW"] == $lockpw))) {
$ask = 1;
}
} else {
$ask = 1;
}
 
if ($ask) {
header("WWW-Authenticate: Basic realm=\"".$wakkaConfig["wakka_name"]." Install/Upgrade Interface\"");
header("HTTP/1.0 401 Unauthorized");
echo "Ce site est en cours de mise &agrave; jour. Veuillez essayer plus tard." ;
exit;
}
}
 
 
// compare versions, start installer if necessary
if ($wakkaConfig["wakka_version"] && (!$wakkaConfig["wikini_version"])) { $wakkaConfig["wikini_version"]=$wakkaConfig["wakka_version"]; }
if (($wakkaConfig["wakka_version"] != WAKKA_VERSION) || ($wakkaConfig["wikini_version"] != WIKINI_VERSION)) {
// start installer
if (!isset($_REQUEST["installAction"]) OR !$installAction = trim($_REQUEST["installAction"])) $installAction = "default";
include("setup/header.php");
if (file_exists("setup/".$installAction.".php")) include("setup/".$installAction.".php"); else echo "<i>Invalid action</i>" ;
include("setup/footer.php");
exit;
}
 
// Check if the server is configured to automatically compress the output
if (!ini_get('zlib.output_compression') && !ini_get('zlib.output_handler'))
{
// Check if we can use ob_gzhandler (requires the zlib extension)
if (function_exists('ob_gzhandler'))
{
// let ob_gzhandler do the dirty job
// NB.: this must be done BEFORE session_start() when session.use_trans_sid is on
ob_start('ob_gzhandler');
}
// else lets do the dirty job by ourselves...
elseif (!empty($_SERVER['HTTP_ACCEPT_ENCODING']) && strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') && function_exists('gzencode'))
{
ob_start ('gzencode');
// Tell the browser the content is compressed with gzip
header ("Content-Encoding: gzip");
}
}
 
// configuration du cookie de session
// determine le chemin pour les cookies
$a = parse_url($wakkaConfig['base_url']);
$CookiePath = dirname($a['path']);
// Fixe la gestion des cookie sous les OS utilisant le \ comme s?parteur de chemin
$CookiePath = str_replace("\\","/",$CookiePath);
// ajoute un '/' terminal sauf si on est ? la racine web
if ($CookiePath != '/') $CookiePath .= '/';
$a = session_get_cookie_params();
session_set_cookie_params($a['lifetime'],$CookiePath);
unset($a);
unset($CookiePath);
 
// start session
session_start();
 
// create wiki object
$wiki = new Wiki($wakkaConfig);
// check for database access
if (!$wiki->dblink)
{
echo "<p>Pour des raisons ind&eacute;pendantes de notre volont&eacute;, ".
"le contenu de ce Wiki est temporairement inaccessible. Veuillez ".
"r&eacute;essayer ult&eacute;rieurement, merci de votre ".
"compr&eacute;hension.</p>";
// Log error (useful to find the buggy server in a load balancing platform)
trigger_error("WikiNi : DB connection failed");
exit;
}
 
 
// go!
if (!isset($method)) $method='';
 
 
// Security (quick hack) : Check method syntax
if (!(preg_match('#^[A-Za-z0-9_]*$#',$method))) {
$method='';
}
include('tools/prepend.php');//$wiki->Run($page, $method);
?>
/branches/v1.0-pithivier/setup/doc/EditionDesGroupes.txt
New file
0,0 → 1,3
** Retour : ** [[PagePrincipale page principale]] > [[TableauDeBordDeCeWiki Tableau de bord]]
----
{{editgroups}}
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/branches/v1.0-pithivier/setup/doc/PageArchive.txt
New file
0,0 → 1,7
** Retour : ** [[PagePrincipale Page principale]] > [[TableauDeBord Tableau de bord]]
----
====== Les pages archivées de ce Wikini ======
 
Pour archiver une page dans ce wikini, supprimer les liens qui mènent vers elle puis rajouter le tag "PageArchive" dans son contenu.
 
{{TextSearch phrase="PageArchive"}}
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/branches/v1.0-pithivier/setup/doc/PageMenu.txt
New file
0,0 → 1,8
- ""<a href="wakka.php?wiki=""{{configuration param="root_page"}}""" title="Aller sur la page d'accueil">Accueil</a>""
----
- === Pages utiles ===
- ""<a href="wakka.php?wiki=PageMenu/edit">Éditer ce menu</a>""
- [[ReglesDeFormatage Règles de formatage]]
- [[PageArchive Archives de ce wikini]]
- [[PageARetravailler Page à revoir, à completer, à supprimer...]]
- [[BacASable Bac à sable]]
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/branches/v1.0-pithivier/setup/doc/TableauDeBordDeCeWiki.txt
New file
0,0 → 1,21
** Retour : ** [[PagePrincipale page principale ]]
----
====== Tableau de bord ======
Ce tableau de bord regroupe toutes les pages utiles à l'analyse et à l'animation de ce site.
- DerniersChangements et DerniersCommentaires
- PlanDuSite à partir de la racine
- IndexDesPages, IndexDesPagesBis
- PagesOrphelines
- PagesACreer
- PageArchive
- PageARetravailler
- ParametresUtilisateur
- EditionDesGroupes
- GestionDesUtilisateursDeCeWiki
----
==== 8 derniers comptes utilisateurs ====
{{Listusers last="8"}}
==== 8 dernières pages modifiées ====
{{recentchanges max="8"}}
==== 5 dernières pages commentées ====
{{RecentlyCommented max="5"}}
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/branches/v1.0-pithivier/setup/doc/PageMenuHaut.txt
New file
0,0 → 1,0
""<ul class="nav"><li>""{{button nobtn="1" icon="home" link="PagePrincipale"}}""</li><li>""[[AidE Aide]]""</li><li>""[[TableauDeBordDeCeWiki Tableau de bord]]""</li><li class="has-tooltip" title=" Résumé des syntaxes Wikini permettant la mise en forme du texte." data-placement="bottom">""[[ReglesDeFormatage Règles de formatage]]""</li><li>""[[DerniersChangements Derniers changements]]""</li></ul><div class="btn-toolbar pull-right">""{{moteurrecherche class="navbar-search"}} {{login template="dropdown.tpl.html"}}""<a href="wakka.php?wiki=DerniersChangementsRss/xml" class="btn" title="S'abonner au flux RSS des derniers changements"><img src="tools/templates/presentation/images/rss-icon12-black.png" alt="rss" /></a></div>""
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/branches/v1.0-pithivier/setup/doc/GestionDesUtilisateursDeCeWiki.txt
New file
0,0 → 1,3
** Retour : ** [[PagePrincipale page principale]] > [[TableauDeBordDeCeWiki Tableau de bord]]
----
{{usersdeleting}}
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/branches/v1.0-pithivier/setup/doc/PageARetravailler.txt
New file
0,0 → 1,13
** Retour : ** [[PagePrincipale Page principale]] > [[TableauDeBord Tableau de bord]]
----
====== Les pages à revoir et à compléter de ce Wikini ======
 
Nous utilisons cette page pour lister les pages à retravailler. Le développement d'un wiki est si facile et si rapide qu'on peut aisément oublier des pages en friche, demandant à être complétées, réorganisées ou légèrement retravaillées.
Cette page se propose de centraliser toutes les pages nécessitant un travail ultérieur.
 
Pour cela l'éditeur aura soin de mentionner un des termes présent dans la liste ci-dessous dans la page qu'il édite.
Les page à retravailler seront automatiquement recensées par cette page.
 
{{TextSearch phrase="Asupprimer"}}
{{TextSearch phrase="Arevoir"}}
{{TextSearch phrase="Acompleter"}}
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/branches/v1.0-pithivier/tools/galerie/desc.xml
New file
0,0 → 1,6
<?xml version="1.0" encoding="ISO-8859-1"?>
<plugin name="wkgalerie" version="0.1" active="1">
<author>Jean-Pascal MILCENT</author>
<label>Galerie de photos</label>
<desc>Galerie de photos utilisant Jquery et rassemblant le code jQuery lightBox plugin, jQuery SliderViewer Plugin, jQuery Easing v1.3, jQuery Tooltip plugin 1.1</desc>
</plugin>
/branches/v1.0-pithivier/tools/galerie/index.php
New file
0,0 → 1,30
<?php
// Administration
 
 
// Vérification de sécurité
if (!defined("TOOLS_MANAGER"))
{
die ("acc&egrave;s direct interdit");
}
 
 
buffer::str(
'
Ajouter les lignes suivantes dans le fichier wakka.css pour personnaliser
votre menu de navigation :
<br>
<code>
.page_table {margin: 0px; padding: 0px ; border: none; height: 100%;width: 100%;}
<br>
.menu_column {background-color: #FFFFCC; vertical-align: top; width: 150px; border: 1px solid #000000;padding:5px;}
<br>
.body_column {vertical-align: top; border: none;padding:5px;}
<br>
</code>
'
 
 
);
 
?>
/branches/v1.0-pithivier/tools/galerie/actions/galerie.php
New file
0,0 → 1,196
<?php
/*vim: set expandtab tabstop=4 shiftwidth=4: */
// +------------------------------------------------------------------------------------------------------+
// | PHP version 5.1 |
// +------------------------------------------------------------------------------------------------------+
// | Copyright (C) 1999-2006 Tela Botanica (accueil@tela-botanica.org) |
// +------------------------------------------------------------------------------------------------------+
// | This file is part of wikini. |
// | |
// | wikini is free software; you can redistribute it and/or modify |
// | it under the terms of the GNU General Public License as published by |
// | the Free Software Foundation; either version 2 of the License, or |
// | (at your option) any later version. |
// | |
// | wikini is distributed in the hope that it will be useful, |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
// | GNU General Public License for more details. |
// | |
// | You should have received a copy of the GNU General Public License |
// | along with Foobar; if not, write to the Free Software |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
// +------------------------------------------------------------------------------------------------------+
// CVS : $Id$
/**
* wikini - galerie.php
*
* Description :
*
*@package wikini
//Auteur original :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
//Autres auteurs :
*@author Aucun
*@copyright Tela-Botanica 1999-2007
*@version $Revision$ $Date$
// +------------------------------------------------------------------------------------------------------+
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTÊTE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
// Définition de constantes
define('DS', DIRECTORY_SEPARATOR);
/** Constante "dynamique" stockant le chemin absolue de base de l'application.*/
define('GAL_CHEMIN_APPLI', dirname(__FILE__).DS);
 
// Initialisation des variables
$sortie = '';
$GLOBALS['_GALLERIE_']['erreur'] = '';
 
// Inclusion du fichier de config de l'action
require_once GAL_CHEMIN_APPLI.'galerie'.DS.'configuration'.DS.'gal_config.inc.php';
require_once GAL_CHEMIN_APPLI.'galerie'.DS.'bibliotheque'.DS.'metadonnees.fonct.php';
//+----------------------------------------------------------------------------------------------------------------+
// Récupération des paramêtres et gestion des erreurs de paramètrage
if (!$this->GetParameter('dossier')) {
$options['dossier'] = null;
$GLOBALS['_GALERIE_']['erreur'] = "Applette GALERIE : le paramètre 'dossier' est obligatoire !";
} else {
$options['dossier'] = rtrim($this->GetParameter('dossier'), DS);
}
if (!$this->GetParameter('id')) {
$options['id'] = microtime();
//$GLOBALS['_GALERIE_']['erreur'] = "Applette GALERIE : le paramètre 'id' est obligatoire !";
} else {
$options['id'] = $this->GetParameter('id');
}
if (!$this->GetParameter('largeur')) {
$options['largeur'] = 160;
} else {
$options['largeur'] = $this->GetParameter('largeur');
}
if (!$this->GetParameter('hauteur')) {
$options['hauteur'] = 160;
} else {
$options['hauteur'] = $this->GetParameter('hauteur');
}
if (!isset($options['qualite'])) {
$options['qualite'] = 70;
}
if (!$this->GetParameter('imglargeur')) {
$options['img_largeur'] = 800;
} else {
$options['img_largeur'] = $this->GetParameter('imglargeur');
}
if (!$this->GetParameter('imghauteur')) {
$options['img_hauteur'] = 600;
} else {
$options['img_hauteur'] = $this->GetParameter('imghauteur');
}
if (!isset($options['img_qualite'])) {
$options['img_qualite'] = 70;
}
if (!isset($options['squelette'])) {
$options['squelette'] = GAL_SQUELETTE_LISTE;
}
// +------------------------------------------------------------------------------------------------------+
// | CORPS du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
//+----------------------------------------------------------------------------------------------------------------+
// Récupération des données
$noimage = 0;
$GLOBALS['_GALERIE_']['id'] = $options['id'];
$GLOBALS['_GALERIE_']['dossier'] = GAL_CHEMIN_RACINE.$options['dossier'];
if (is_dir($GLOBALS['_GALERIE_']['dossier'])) {
if ($dh = opendir($GLOBALS['_GALERIE_']['dossier'])) {
$images = array();
while (($f = readdir($dh)) !== false) {
if((substr(strtolower($f),-3) == 'jpg') || (substr(strtolower($f),-3) == 'gif') || (substr(strtolower($f),-3) == 'png')) {
$noimage++;
 
// Gestion des métadonnées
$iptc = array();
$exif = array();
$fichier = $GLOBALS['_GALERIE_']['dossier'].DIRECTORY_SEPARATOR.$f;
$iptc = get_iptc_data($fichier, array('keywords' => '2#025', 'date_creation' => '2#055', 'author' => '2#122', 'name' => '2#005', 'comment' => '2#120'));
// Nous demandons des entités HTML pour la convertion des champs EXIF stockés en Unicode
ini_set('exif.encode_unicode', 'HTML-ENTITIES');
$exif = get_exif_data($fichier, array('date_creation' => 'DateTimeOriginal', 'comment' => 'UserComment'));
// Initialisation et prétraitement des commentaires
$commentaire = '';
$exif['comment'] = trim($exif['comment']);
$iptc['comment'] = trim($iptc['comment']);
// Comparaison et ajout des commentaires IPTC et EXIF
if (!empty($iptc['comment']) || !empty($exif['comment'])) {
if (!empty($exif['comment'])) {
// Dans le cas d'un champ de commentaire unicode nous supprimons les caractères NULL
if ($exif['comment_encodage'] == 'UNICODE') {
$exif['comment'] = str_replace(chr(0), '', $exif['comment']);
}
$commentaire .= "\n".trim($exif['comment']);
}
if (!empty($iptc['comment']) && $iptc['comment'] != $exif['comment']) {
$commentaire .= $iptc['comment'];
}
}
// Récupération des infos
$images[] = array('filename' => $f, 'titre' => trim($commentaire));
array_multisort($images, SORT_ASC, SORT_REGULAR);
}
}
closedir($dh);
} else {
$GLOBALS['_GALERIE_']['erreur'] = "Applette GALERIE : le dossier d'images ne peut pas être ouvert : ".$GLOBALS['_GALERIE_']['dossier'];
}
} else {
$GLOBALS['_GALERIE_']['erreur'] = "Applette GALERIE : le dossier d'images est introuvable à : ".$GLOBALS['_GALERIE_']['dossier'];
}
//trigger_error('<pre>'.print_r($images, true).'</pre>', E_USER_WARNING);
if($noimage) {
$GLOBALS['_GALERIE_']['css']['chemin'] = GAL_CHEMIN_STYLES_RELATIF;
$GLOBALS['_GALERIE_']['css']['largeur'] = $options['largeur'];
$GLOBALS['_GALERIE_']['script']['chemin'] = GAL_CHEMIN_SCRIPTS_RELATIF;
$GLOBALS['_GALERIE_']['images'] = array();
foreach($images as $image) {
if ($image['filename'] != '') {
$aso_img['fichier_nom'] = $image['filename'];
$aso_img['title'] = $image['titre'];
$aso_img['url_img'] = 'http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']).DS.GAL_CHEMIN_SCRIPTS_RELATIF.'showthumb.php?img='.urlencode(GAL_CHEMIN_RACINE.$options['dossier'].DS.$image['filename']).'&amp;width='.$options['img_largeur'].'&amp;height='.$options['img_hauteur'].'&amp;quality='.$options['img_qualite'].'&amp;centrage=0';
$aso_img['url_img_mini'] = 'http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']).DS.GAL_CHEMIN_SCRIPTS_RELATIF.'showthumb.php?img='.urlencode(GAL_CHEMIN_RACINE.$options['dossier'].DS.$image['filename']).'&amp;width='.$options['largeur'].'&amp;height='.$options['hauteur'].'&amp;quality='.$options['qualite'].'&amp;centrage=1';
$GLOBALS['_GALERIE_']['images'][] = $aso_img;
}
}
} else {
$GLOBALS['_GALERIE_']['erreur'] = "Applette GALERIE : le dossier d'images ne contient rien : ".$GLOBALS['_GALERIE_']['dossier'];
}
 
//+----------------------------------------------------------------------------------------------------------------+
// Gestion des squelettes
// Extrait les variables et les ajoutes à l'espace de noms local
extract($GLOBALS['_GALERIE_']);
// Démarre le buffer
ob_start();
// Inclusion du fichier
include GAL_CHEMIN_SQUELETTE.$options['squelette'];
// Récupérer le contenu du buffer
$sortie = ob_get_contents();
// Arrête et détruit le buffer
ob_end_clean();
 
//+----------------------------------------------------------------------------------------------------------------+
// Sortie
echo $sortie;
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log$
*
* +-- Fin du code ----------------------------------------------------------------------------------------+
*/
?>
/branches/v1.0-pithivier/tools/galerie/actions/galerie/presentation/squelettes/gal_liste_ss_inclusion.tpl.html
New file
0,0 → 1,42
<!-- GALLERIE - DEBUT -->
<?php if ($erreur) : ?>
 
<p class="pap_erreur"><?=$erreur;?></p>
 
<?php else : ?>
<script type="text/javascript">
// Galerie : SliderViewer
jQuery(function(){
// Nous cachons les images si le javascript est activé!
jQuery("div#<?=$id;?>").removeClass("galerie");
jQuery("div#<?=$id;?>").addClass("svw");
});
$(window).bind("load", function() {
$("div#<?=$id;?>").slideView({
easeFunc: "easeInOutSine",
easeTime: 500,
largeur: <?=$css['largeur'];?>,// nous indiquons la largeur ici pour éviter les bogues de ie7 qui ne reconnait pas la bonne largeur d'img
toolTip: false
});
});
// Galerie : LightBox
$(function() {
$('div#<?=$id;?> a').lightBox();
});
</script>
<div class="galerie_globale">
<div id="<?=$id;?>" class="galerie">
<ul>
<?php foreach ($images as $image) : ?>
<li style="width:<?=$css['largeur'];?>px;">
<a href="<?=$image['url_img'];?>" rel="lightbox" title="<?=$image['title'];?>">
<!-- bien laisser les margin et border à 0 dans style pour résoudre les bugs avec ie6 -->
<img style="width:<?=$css['largeur'];?>px;margin:0;border:none;" src="<?=$image['url_img_mini'];?>" alt="<?=$image['fichier_nom'];?>" title="<?=$image['title'];?>"/>
</a>
</li>
<?php endforeach; ?>
</ul>
</div>
</div>
<?php endif; ?>
<!-- GALLERIE - FIN -->
/branches/v1.0-pithivier/tools/galerie/actions/galerie/presentation/squelettes/gal_liste.tpl.html
New file
0,0 → 1,42
<!-- GALLERIE - DEBUT -->
<?php if ($erreur) : ?>
 
<p class="pap_erreur"><?=$erreur;?></p>
 
<?php else : ?>
<script type="text/javascript">
// Galerie : SliderViewer
jQuery(function(){
// Nous cachons les images si le javascript est activé!
jQuery("div#<?=$id;?>").removeClass("galerie");
jQuery("div#<?=$id;?>").addClass("svw");
});
$(window).bind("load", function() {
$("div#<?=$id;?>").slideView({
easeFunc: "easeInOutSine",
easeTime: 500,
largeur: <?=$css['largeur'];?>,// nous indiquons la largeur ici pour éviter les bogues de ie7 qui ne reconnait pas la bonne largeur d'img
toolTip: false
});
});
// Galerie : LightBox
$(function() {
$('div#<?=$id;?> a').lightBox();
});
</script>
<div class="galerie_globale">
<div id="<?=$id;?>" class="galerie">
<ul>
<?php foreach ($images as $image) : ?>
<li style="width:<?=$css['largeur'];?>px;">
<a href="<?=$image['url_img'];?>" rel="lightbox" title="<?=$image['title'];?>">
<!-- bien laisser les margin et border à 0 dans style pour résoudre les bugs avec ie6 -->
<img style="width:<?=$css['largeur'];?>px;margin:0;border:none;" src="<?=$image['url_img_mini'];?>" alt="<?=$image['fichier_nom'];?>" title="<?=$image['title'];?>"/>
</a>
</li>
<?php endforeach; ?>
</ul>
</div>
</div>
<?php endif; ?>
<!-- GALLERIE - FIN -->
/branches/v1.0-pithivier/tools/galerie/actions/galerie/presentation/styles/jquery.galerie-0.1.css
New file
0,0 → 1,190
/*Gallerie CSS en cas d'abscence de JS*/
.galerie {
background-color:white;
padding:0;
width:355px;
height:255px;
overflow:auto;
white-space:nowrap;}
.galerie ul {
list-style: none;
padding:0;
margin:0;}
.galerie ul li {
display:inline;}
.galerie ul img {
border:5px solid #3e3e3e !important;
margin:5px !important;}
.galerie ul a:hover img {
border:5px solid #fff;
color:#fff;}
 
/* jQuery SlideViewer plugin*/
/*preload classes*/
.svw {
width:50px;
height:20px;
background:#fff;}
.svw ul {
position:relative;
left:-999em;}
/*core classes*/
.stripViewer {
position:relative;
overflow:hidden;
border-style:solid;
border-bottom-color:#333333;
border-right-color:#555555;
border-left-color:#BBBBBB;
border-top-color:#DDDDDD;
border-width:5px;
margin: 0 0 1px 0;}
.stripViewer li a img {
border:none;
margin:0 auto;}
.stripViewer ul {
margin:0;
padding:0;
position:relative;
left:0;
top:0;
width:1%;
list-style-type:none;}
.stripViewer ul li{
float:left;}
/* galerie commentaire */
.galerieCommentaire{
margin:5px 10px;}
/* galerie vignette */
.stripTransmitter {
overflow:auto;
width:1%;
margin:5px 10px;}
.stripTransmitter ul {
margin:0;
padding:0;
position:relative;
list-style-type:none;}
.stripTransmitter ul li{
width:20px;
float:left;
padding:0;
margin:0 1px 1px 0;}
.stripTransmitter a{
font:bold 10px Verdana, Arial;
text-align:center;
line-height:22px;
background:#444;
color:#fff;
text-decoration:none;
display:block;
border:none;}
.stripTransmitter a:hover, a.current{
background:#fff;
color:#444;}
/*tooltips formatting*/
#tooltip {
background:#fff;
color:#000;
opacity:0.85;
border:5px solid #dedede;}
#tooltip h3 {
font:normal 10px Verdana;
margin:0;
padding:6px 2px;
border:0;}
/**
* jQuery lightBox plugin
* This jQuery plugin was inspired and based on Lightbox 2 by Lokesh Dhakar (http://www.huddletogether.com/projects/lightbox2/)
* and adapted to me for use like a plugin from jQuery.
* @name jquery-lightbox-0.4.css
* @author Leandro Vieira Pinho - http://leandrovieira.com
* @version 0.4
* @date November 17, 2007
* @category jQuery plugin
* @copyright (c) 2007 Leandro Vieira Pinho (leandrovieira.com)
* @license CC Attribution-No Derivative Works 2.5 Brazil - http://creativecommons.org/licenses/by-nd/2.5/br/deed.en_US
* @example Visit http://leandrovieira.com/projects/jquery/lightbox/ for more informations about this jQuery plugin
*/
#jquery-overlay {
position:absolute;
top:0;
left:0;
z-index:90;
width:100%;
height:500px;}
#jquery-lightbox {
position:absolute;
top:0;
left:0;
width:100%;
z-index:100;
text-align:center;
line-height:0;}
#jquery-lightbox img {
margin:0 auto;}
#lightbox-container-image-box {
position:relative;
background-color:#fff;
width:250px;
height:250px;
margin:0 auto;}
#lightbox-container-image {
padding:5px 0;}
#lightbox-loading {
position:absolute;
top:40%;
left:0%;
height:25%;
width:100%;
text-align:center;
line-height:0;}
#lightbox-nav {
position:absolute;
top:0;
left:0;
height:100%;
width:100%;
z-index:10;}
#lightbox-container-image-box > #lightbox-nav {
left:0;}
#lightbox-nav a {
outline:none;}
#lightbox-nav-btnPrev, #lightbox-nav-btnNext {
width:49%;
height:100%;
zoom:1;
display:block;
border-bottom:0 none;}
#lightbox-nav-btnPrev {
left:0;
float:left;}
#lightbox-nav-btnNext {
right:0;
float:right;}
#lightbox-container-image-data-box {
font:10px Verdana, Helvetica, sans-serif;
background-color:#fff;
margin:0 auto;
line-height:1.4em;
overflow:auto;
width:100%;
padding:0 10px 0;}
#lightbox-container-image-data {
padding:0 10px;
color:#666;}
#lightbox-container-image-data #lightbox-image-details {
width:70%;
float:left;
text-align:left;}
#lightbox-image-details-caption {
font-weight:bold;}
#lightbox-image-details-currentNumber {
display:block;
clear:left;
padding-bottom:1.0em;}
#lightbox-secNav-btnClose {
width:66px;
float:right;
padding:0 0.7em 0.7em 0;
border-bottom:0 none;}
/branches/v1.0-pithivier/tools/galerie/actions/galerie/presentation/images/lightbox-btn-close.fr.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-pithivier/tools/galerie/actions/galerie/presentation/images/lightbox-btn-close.fr.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-pithivier/tools/galerie/actions/galerie/presentation/images/lightbox-btn-prev.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-pithivier/tools/galerie/actions/galerie/presentation/images/lightbox-btn-prev.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-pithivier/tools/galerie/actions/galerie/presentation/images/lightbox-btn-next.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-pithivier/tools/galerie/actions/galerie/presentation/images/lightbox-btn-next.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-pithivier/tools/galerie/actions/galerie/presentation/images/lightbox-btn-prev.fr.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-pithivier/tools/galerie/actions/galerie/presentation/images/lightbox-btn-prev.fr.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-pithivier/tools/galerie/actions/galerie/presentation/images/lightbox-btn-next.fr.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-pithivier/tools/galerie/actions/galerie/presentation/images/lightbox-btn-next.fr.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-pithivier/tools/galerie/actions/galerie/presentation/images/lightbox-ico-loading.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-pithivier/tools/galerie/actions/galerie/presentation/images/lightbox-ico-loading.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-pithivier/tools/galerie/actions/galerie/presentation/images/lightbox-btn-close.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-pithivier/tools/galerie/actions/galerie/presentation/images/lightbox-btn-close.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-pithivier/tools/galerie/actions/galerie/presentation/images/lightbox-blank.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-pithivier/tools/galerie/actions/galerie/presentation/images/lightbox-blank.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-pithivier/tools/galerie/actions/galerie/presentation/scripts/jquery-1.3.2.min.js
New file
0,0 → 1,19
/*
* jQuery JavaScript Library v1.3.2
* http://jquery.com/
*
* Copyright (c) 2009 John Resig
* Dual licensed under the MIT and GPL licenses.
* http://docs.jquery.com/License
*
* Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
* Revision: 6246
*/
(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
/*
* Sizzle CSS Selector Engine - v0.9.3
* Copyright 2009, The Dojo Foundation
* Released under the MIT, BSD, and GPL Licenses.
* More information: http://sizzlejs.com/
*/
(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.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\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML=' <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<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>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();
/branches/v1.0-pithivier/tools/galerie/actions/galerie/presentation/scripts/jquery.galerie-0.1.js
New file
0,0 → 1,862
/**
* jQuery lightBox plugin
* This jQuery plugin was inspired and based on Lightbox 2 by Lokesh Dhakar (http://www.huddletogether.com/projects/lightbox2/)
* and adapted to me for use like a plugin from jQuery.
* @name jquery-lightbox-0.4.js
* @author Leandro Vieira Pinho - http://leandrovieira.com
* @version 0.4
* @date November 17, 2007
* @category jQuery plugin
* @copyright (c) 2007 Leandro Vieira Pinho (leandrovieira.com)
* @license CC Attribution-No Derivative Works 2.5 Brazil - http://creativecommons.org/licenses/by-nd/2.5/br/deed.en_US
* @example Visit http://leandrovieira.com/projects/jquery/lightbox/ for more informations about this jQuery plugin
*/
 
// Offering a Custom Alias suport - More info: http://docs.jquery.com/Plugins/Authoring#Custom_Alias
(function($) {
/**
*/
$.fn.lightBox = function(settings) {
// Settings to configure the jQuery lightBox plugin how you like
settings = jQuery.extend({
// Configuration related to overlay
overlayBgColor: '#000', // (string) Background color to overlay; inform a hexadecimal value like: #RRGGBB. Where RR, GG, and BB are the hexadecimal values for the red, green, and blue values of the color.
overlayOpacity: 0.8, // (integer) Opacity value to overlay; inform: 0.X. Where X are number from 0 to 9
// Configuration related to images
imageLoading: 'tools/galerie/actions/galerie/presentation/images/lightbox-ico-loading.gif', // (string) Path and the name of the loading icon
imageBtnPrev: 'tools/galerie/actions/galerie/presentation/images/lightbox-btn-prev.fr.gif', // (string) Path and the name of the prev button image
imageBtnNext: 'tools/galerie/actions/galerie/presentation/images/lightbox-btn-next.fr.gif', // (string) Path and the name of the next button image
imageBtnClose: 'tools/galerie/actions/galerie/presentation/images/lightbox-btn-close.fr.gif', // (string) Path and the name of the close btn
imageBlank: 'tools/galerie/actions/galerie/presentation/images/lightbox-blank.gif', // (string) Path and the name of a blank image (one pixel)
// Configuration related to container image box
containerBorderSize: 10, // (integer) If you adjust the padding in the CSS for the container, #lightbox-container-image-box, you will need to update this value
containerResizeSpeed: 400, // (integer) Specify the resize duration of container image. These number are miliseconds. 400 is default.
// Configuration related to texts in caption. For example: Image 2 of 8. You can alter either "Image" and "of" texts.
txtImage: 'Image', // (string) Specify text "Image"
txtOf: 'de', // (string) Specify text "of"
// Configuration related to keyboard navigation
keyToClose: 'c', // (string) (c = close) Letter to close the jQuery lightBox interface. Beyond this letter, the letter X and the SCAPE key is used to.
keyToPrev: 'p', // (string) (p = previous) Letter to show the previous image
keyToNext: 'n', // (string) (n = next) Letter to show the next image.
// Don´t alter these variables in any way
imageArray: [],
activeImage: 0
},settings);
// Caching the jQuery object with all elements matched
var jQueryMatchedObj = this; // This, in this context, refer to jQuery object
/**
*/
function _initialize() {
_start(this,jQueryMatchedObj); // This, in this context, refer to object (link) which the user have clicked
return false; // Avoid the browser following the link
};
/**
*/
function _start(objClicked,jQueryMatchedObj) {
// Hime some elements to avoid conflict with overlay in IE. These elements appear above the overlay.
$('embed, object, select').css({ 'visibility' : 'hidden' });
// Call the function to create the markup structure; style some elements; assign events in some elements.
_set_interface();
// Unset total images in imageArray
settings.imageArray.length = 0;
// Unset image active information
settings.activeImage = 0;
// We have an image set? Or just an image? Let´s see it.
if ( jQueryMatchedObj.length == 1 ) {
settings.imageArray.push(new Array(objClicked.getAttribute('href'),objClicked.getAttribute('title')));
} else {
// Add an Array (as many as we have), with href and title atributes, inside the Array that storage the images references
for ( var i = 0; i < jQueryMatchedObj.length; i++ ) {
settings.imageArray.push(new Array(jQueryMatchedObj[i].getAttribute('href'),jQueryMatchedObj[i].getAttribute('title')));
}
}
while ( settings.imageArray[settings.activeImage][0] != objClicked.getAttribute('href') ) {
settings.activeImage++;
}
// Call the function that prepares image exibition
_set_image_to_view();
};
/**
*/
function _set_interface() {
// Apply the HTML markup into body tag
$('body').append('<div id="jquery-overlay"></div><div id="jquery-lightbox"><div id="lightbox-container-image-box"><div id="lightbox-container-image"><img id="lightbox-image"><div style="" id="lightbox-nav"><a href="#" id="lightbox-nav-btnPrev"></a><a href="#" id="lightbox-nav-btnNext"></a></div><div id="lightbox-loading"><a href="#" id="lightbox-loading-link"><img src="' + settings.imageLoading + '"></a></div></div></div><div id="lightbox-container-image-data-box"><div id="lightbox-container-image-data"><div id="lightbox-image-details"><span id="lightbox-image-details-caption"></span><span id="lightbox-image-details-currentNumber"></span></div><div id="lightbox-secNav"><a href="#" id="lightbox-secNav-btnClose"><img src="' + settings.imageBtnClose + '"></a></div></div></div></div>');
// Get page sizes
var arrPageSizes = ___getPageSize();
// Style overlay and show it
$('#jquery-overlay').css({
backgroundColor: settings.overlayBgColor,
opacity: settings.overlayOpacity,
width: arrPageSizes[0],
height: arrPageSizes[1]
}).fadeIn();
// Get page scroll
var arrPageScroll = ___getPageScroll();
// Calculate top and left offset for the jquery-lightbox div object and show it
$('#jquery-lightbox').css({
top: arrPageScroll[1] + (arrPageSizes[3] / 10),
left: arrPageScroll[0]
}).show();
// Assigning click events in elements to close overlay
$('#jquery-overlay,#jquery-lightbox').click(function() {
_finish();
});
// Assign the _finish function to lightbox-loading-link and lightbox-secNav-btnClose objects
$('#lightbox-loading-link,#lightbox-secNav-btnClose').click(function() {
_finish();
return false;
});
// If window was resized, calculate the new overlay dimensions
$(window).resize(function() {
// Get page sizes
var arrPageSizes = ___getPageSize();
// Style overlay and show it
$('#jquery-overlay').css({
width: arrPageSizes[0],
height: arrPageSizes[1]
});
// Get page scroll
var arrPageScroll = ___getPageScroll();
// Calculate top and left offset for the jquery-lightbox div object and show it
$('#jquery-lightbox').css({
top: arrPageScroll[1] + (arrPageSizes[3] / 10),
left: arrPageScroll[0]
});
});
};
/**
*/
function _set_image_to_view() { // show the loading
// Show the loading
$('#lightbox-loading').show();
// Hide some elements
$('#lightbox-image,#lightbox-nav,#lightbox-nav-btnPrev,#lightbox-nav-btnNext,#lightbox-container-image-data-box,#lightbox-image-details-currentNumber').hide();
// Image preload process
var objImagePreloader = new Image();
objImagePreloader.onload = function() {
$('#lightbox-image').attr('src',settings.imageArray[settings.activeImage][0]);
// Perfomance an effect in the image container resizing it
_resize_container_image_box(objImagePreloader.width,objImagePreloader.height);
// clear onLoad, IE behaves irratically with animated gifs otherwise
objImagePreloader.onload=function(){};
};
objImagePreloader.src = settings.imageArray[settings.activeImage][0];
};
/**
*/
function _resize_container_image_box(intImageWidth,intImageHeight) {
// Get current width and height
var intCurrentWidth = $('#lightbox-container-image-box').width();
var intCurrentHeight = $('#lightbox-container-image-box').height();
// Get the width and height of the selected image plus the padding
var intWidth = (intImageWidth + (settings.containerBorderSize * 2)); // Plus the image´s width and the left and right padding value
var intHeight = (intImageHeight + (settings.containerBorderSize * 2)); // Plus the image´s height and the left and right padding value
// Diferences
var intDiffW = intCurrentWidth - intWidth;
var intDiffH = intCurrentHeight - intHeight;
// Perfomance the effect
$('#lightbox-container-image-box').animate({ width: intWidth, height: intHeight },settings.containerResizeSpeed,function() { _show_image(); });
if ( ( intDiffW == 0 ) && ( intDiffH == 0 ) ) {
if ( $.browser.msie ) {
___pause(250);
} else {
___pause(100);
}
}
$('#lightbox-nav-btnPrev,#lightbox-nav-btnNext').css({ height: intImageHeight + (settings.containerBorderSize * 2) });
$('#lightbox-container-image-data-box').css({ width: intImageWidth });
};
/**
*/
function _show_image() {
$('#lightbox-loading').hide();
$('#lightbox-image').fadeIn(function() {
_show_image_data();
_set_navigation();
});
_preload_neighbor_images();
};
/**
*/
function _show_image_data() {
$('#lightbox-container-image-data-box').slideDown('fast');
$('#lightbox-image-details-caption').hide();
if ( settings.imageArray[settings.activeImage][1] ) {
$('#lightbox-image-details-caption').html(settings.imageArray[settings.activeImage][1]).show();
}
// If we have a image set, display 'Image X of X'
if ( settings.imageArray.length > 1 ) {
$('#lightbox-image-details-currentNumber').html(settings.txtImage + ' ' + ( settings.activeImage + 1 ) + ' ' + settings.txtOf + ' ' + settings.imageArray.length).show();
}
};
/**
*/
function _set_navigation() {
$('#lightbox-nav').show();
 
// Instead to define this configuration in CSS file, we define here. And it´s need to IE. Just.
$('#lightbox-nav-btnPrev,#lightbox-nav-btnNext').css({ 'background' : 'transparent url(' + settings.imageBlank + ') no-repeat' });
// Show the prev button, if not the first image in set
if ( settings.activeImage != 0 ) {
// Show the images button for Next buttons
$('#lightbox-nav-btnPrev').unbind().hover(function() {
$(this).css({ 'background' : 'url(' + settings.imageBtnPrev + ') left 15% no-repeat' });
},function() {
$(this).css({ 'background' : 'transparent url(' + settings.imageBlank + ') no-repeat' });
}).show().bind('click',function() {
settings.activeImage = settings.activeImage - 1;
_set_image_to_view();
return false;
});
}
// Show the next button, if not the last image in set
if ( settings.activeImage != ( settings.imageArray.length -1 ) ) {
// Show the images button for Next buttons
$('#lightbox-nav-btnNext').unbind().hover(function() {
$(this).css({ 'background' : 'url(' + settings.imageBtnNext + ') right 15% no-repeat' });
},function() {
$(this).css({ 'background' : 'transparent url(' + settings.imageBlank + ') no-repeat' });
}).show().bind('click',function() {
settings.activeImage = settings.activeImage + 1;
_set_image_to_view();
return false;
});
}
// Enable keyboard navigation
_enable_keyboard_navigation();
};
/**
*/
function _enable_keyboard_navigation() {
$(document).keydown(function(objEvent) {
_keyboard_action(objEvent);
});
};
/**
*/
function _disable_keyboard_navigation() {
$(document).unbind();
};
/**
*/
function _keyboard_action(objEvent) {
// To ie
if ( objEvent == null ) {
keycode = event.keyCode;
escapeKey = 27;
// To Mozilla
} else {
keycode = objEvent.keyCode;
escapeKey = objEvent.DOM_VK_ESCAPE;
}
// Get the key in lower case form
key = String.fromCharCode(keycode).toLowerCase();
// Verify the keys to close the ligthBox
if ( ( key == settings.keyToClose ) || ( key == 'x' ) || ( keycode == escapeKey ) ) {
_finish();
}
// Verify the key to show the previous image
if ( ( key == settings.keyToPrev ) || ( keycode == 37 ) ) {
// If we´re not showing the first image, call the previous
if ( settings.activeImage != 0 ) {
settings.activeImage = settings.activeImage - 1;
_set_image_to_view();
_disable_keyboard_navigation();
}
}
// Verify the key to show the next image
if ( ( key == settings.keyToNext ) || ( keycode == 39 ) ) {
// If we´re not showing the last image, call the next
if ( settings.activeImage != ( settings.imageArray.length - 1 ) ) {
settings.activeImage = settings.activeImage + 1;
_set_image_to_view();
_disable_keyboard_navigation();
}
}
};
/**
*/
function _preload_neighbor_images() {
if ( (settings.imageArray.length -1) > settings.activeImage ) {
objNext = new Image();
objNext.src = settings.imageArray[settings.activeImage + 1][0];
}
if ( settings.activeImage > 0 ) {
objPrev = new Image();
objPrev.src = settings.imageArray[settings.activeImage -1][0];
}
};
/**
*/
function _finish() {
$('#jquery-lightbox').remove();
$('#jquery-overlay').fadeOut(function() { $('#jquery-overlay').remove(); });
// Show some elements to avoid conflict with overlay in IE. These elements appear above the overlay.
$('embed, object, select').css({ 'visibility' : 'visible' });
};
/**
*/
function ___getPageSize() {
var xScroll, yScroll;
if (window.innerHeight && window.scrollMaxY) {
xScroll = window.innerWidth + window.scrollMaxX;
yScroll = window.innerHeight + window.scrollMaxY;
} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
xScroll = document.body.scrollWidth;
yScroll = document.body.scrollHeight;
} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
xScroll = document.body.offsetWidth;
yScroll = document.body.offsetHeight;
}
var windowWidth, windowHeight;
if (self.innerHeight) { // all except Explorer
if(document.documentElement.clientWidth){
windowWidth = document.documentElement.clientWidth;
} else {
windowWidth = self.innerWidth;
}
windowHeight = self.innerHeight;
} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
windowWidth = document.documentElement.clientWidth;
windowHeight = document.documentElement.clientHeight;
} else if (document.body) { // other Explorers
windowWidth = document.body.clientWidth;
windowHeight = document.body.clientHeight;
}
// for small pages with total height less then height of the viewport
if(yScroll < windowHeight){
pageHeight = windowHeight;
} else {
pageHeight = yScroll;
}
// for small pages with total width less then width of the viewport
if(xScroll < windowWidth){
pageWidth = xScroll;
} else {
pageWidth = windowWidth;
}
arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight)
return arrayPageSize;
};
/**
*/
function ___getPageScroll() {
var xScroll, yScroll;
if (self.pageYOffset) {
yScroll = self.pageYOffset;
xScroll = self.pageXOffset;
} else if (document.documentElement && document.documentElement.scrollTop) { // Explorer 6 Strict
yScroll = document.documentElement.scrollTop;
xScroll = document.documentElement.scrollLeft;
} else if (document.body) {// all other Explorers
yScroll = document.body.scrollTop;
xScroll = document.body.scrollLeft;
}
arrayPageScroll = new Array(xScroll,yScroll)
return arrayPageScroll;
};
/**
*/
function ___pause(ms) {
var date = new Date();
curDate = null;
do { var curDate = new Date(); }
while ( curDate - date < ms);
};
// Return the jQuery object for chaining. The unbind method is used to avoid click conflict when the plugin is called more than once
return this.unbind('click').click(_initialize);
};
})(jQuery); // Call and execute the function immediately passing the jQuery object
 
/**
* jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
*
* Uses the built In easIng capabilities added In jQuery 1.1
* to offer multiple easIng options
*
* @copyright (c) 2007 George Smith
* @license Licensed under the MIT License: http://www.opensource.org/licenses/mit-license.php
*/
 
// t: current time, b: begInnIng value, c: change In value, d: duration
jQuery.easing['jswing'] = jQuery.easing['swing'];
 
jQuery.extend( jQuery.easing,
{
def: 'easeOutQuad',
swing: function (x, t, b, c, d) {
//alert(jQuery.easing.default);
return jQuery.easing[jQuery.easing.def](x, t, b, c, d);
},
easeInQuad: function (x, t, b, c, d) {
return c*(t/=d)*t + b;
},
easeOutQuad: function (x, t, b, c, d) {
return -c *(t/=d)*(t-2) + b;
},
easeInOutQuad: function (x, t, b, c, d) {
if ((t/=d/2) < 1) return c/2*t*t + b;
return -c/2 * ((--t)*(t-2) - 1) + b;
},
easeInCubic: function (x, t, b, c, d) {
return c*(t/=d)*t*t + b;
},
easeOutCubic: function (x, t, b, c, d) {
return c*((t=t/d-1)*t*t + 1) + b;
},
easeInOutCubic: function (x, t, b, c, d) {
if ((t/=d/2) < 1) return c/2*t*t*t + b;
return c/2*((t-=2)*t*t + 2) + b;
},
easeInQuart: function (x, t, b, c, d) {
return c*(t/=d)*t*t*t + b;
},
easeOutQuart: function (x, t, b, c, d) {
return -c * ((t=t/d-1)*t*t*t - 1) + b;
},
easeInOutQuart: function (x, t, b, c, d) {
if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
return -c/2 * ((t-=2)*t*t*t - 2) + b;
},
easeInQuint: function (x, t, b, c, d) {
return c*(t/=d)*t*t*t*t + b;
},
easeOutQuint: function (x, t, b, c, d) {
return c*((t=t/d-1)*t*t*t*t + 1) + b;
},
easeInOutQuint: function (x, t, b, c, d) {
if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
return c/2*((t-=2)*t*t*t*t + 2) + b;
},
easeInSine: function (x, t, b, c, d) {
return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
},
easeOutSine: function (x, t, b, c, d) {
return c * Math.sin(t/d * (Math.PI/2)) + b;
},
easeInOutSine: function (x, t, b, c, d) {
return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
},
easeInExpo: function (x, t, b, c, d) {
return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
},
easeOutExpo: function (x, t, b, c, d) {
return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
},
easeInOutExpo: function (x, t, b, c, d) {
if (t==0) return b;
if (t==d) return b+c;
if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
},
easeInCirc: function (x, t, b, c, d) {
return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
},
easeOutCirc: function (x, t, b, c, d) {
return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
},
easeInOutCirc: function (x, t, b, c, d) {
if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
},
easeInElastic: function (x, t, b, c, d) {
var s=1.70158;var p=0;var a=c;
if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
if (a < Math.abs(c)) { a=c; var s=p/4; }
else var s = p/(2*Math.PI) * Math.asin (c/a);
return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
},
easeOutElastic: function (x, t, b, c, d) {
var s=1.70158;var p=0;var a=c;
if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
if (a < Math.abs(c)) { a=c; var s=p/4; }
else var s = p/(2*Math.PI) * Math.asin (c/a);
return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
},
easeInOutElastic: function (x, t, b, c, d) {
var s=1.70158;var p=0;var a=c;
if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5);
if (a < Math.abs(c)) { a=c; var s=p/4; }
else var s = p/(2*Math.PI) * Math.asin (c/a);
if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
},
easeInBack: function (x, t, b, c, d, s) {
if (s == undefined) s = 1.70158;
return c*(t/=d)*t*((s+1)*t - s) + b;
},
easeOutBack: function (x, t, b, c, d, s) {
if (s == undefined) s = 1.70158;
return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
},
easeInOutBack: function (x, t, b, c, d, s) {
if (s == undefined) s = 1.70158;
if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
},
easeInBounce: function (x, t, b, c, d) {
return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;
},
easeOutBounce: function (x, t, b, c, d) {
if ((t/=d) < (1/2.75)) {
return c*(7.5625*t*t) + b;
} else if (t < (2/2.75)) {
return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
} else if (t < (2.5/2.75)) {
return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
} else {
return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
}
},
easeInOutBounce: function (x, t, b, c, d) {
if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
}
});
 
/**
* jQuery SliderViewer Plugin
* @name jquery.slideviewer.1.1.js
* @author Gian Carlo Mingati - http://www.gcmingati.net/wordpress/wp-content/lab/jquery/imagestrip/imageslide-plugin.html
* @version 1.1
* @date October 6, 2007
* @category jQuery plugin
* @copyright (c) 2007 Gian Carlo Mingati (gcmingati.net)
* @license ?
* @example Visit http://www.gcmingati.net/wordpress/wp-content/lab/jquery/imagestrip/imageslide-plugin.html for more informations about this jQuery plugin
*/
 
jQuery(function(){
jQuery("div.svw").prepend("<img src='http://www.gcmingati.net/wordpress/wp-content/uploads/svwloader.gif' class='ldrgif' alt='loading...'/ >");
});
var j = 0;
jQuery.fn.slideView = function(settings) {
settings = jQuery.extend({
easeFunc: "easeInOutExpo", /* <-- easing function names changed in jquery.easing.1.2.js */
easeTime: 750,
largeur: 0,
toolTip: true
}, settings);
return this.each(function(){
var container = jQuery(this);
container.find("img.ldrgif").remove(); // removes the preloader gif
container.removeClass("svw").addClass("stripViewer");
var pictWidth = container.find("img").width();
if (settings.largeur != 0) {
// Comme IE 6 et 7 pose problème nous utilisons une largeur spécifié par le squelette...
pictWidth = settings.largeur;
}
var pictHeight = container.find("img").height();
var pictEls = container.find("li").size();
var stripViewerWidth = pictWidth*pictEls;
container.find("ul").css("width" , stripViewerWidth); //assegnamo la larghezza alla lista UL
container.css("width" , pictWidth);
container.css("height" , pictHeight);
container.each(function(i) {
jQuery(this).after("<div id='stripTransmitter" + j + "' class='stripTransmitter'><ul><\/ul><\/div>");
jQuery(this).find("li").each(function(n) {
// Si l'image n'a pas de commentaire, on laisse vide. Sinon, on met le commentaire dans le title.
if (jQuery(this).find("img").attr("title") == undefined) {
jQuery("div#stripTransmitter" + j + " ul").append("<li><a title=' ' href='#'>"+(n+1)+"<\/a><\/li>");
} else {
jQuery("div#stripTransmitter" + j + " ul").append("<li><a title='" + jQuery(this).find("img").attr("title") + "' href='#'>"+(n+1)+"<\/a><\/li>");
}
});
// Insertion de l'emplacement des commentaires.
jQuery("div#stripTransmitter" + j).after("<p id='galerieCommentaire" + j + "' class='galerieCommentaire'><\/p>");
jQuery("p#galerieCommentaire"+j).css("width", pictWidth);
jQuery("div#stripTransmitter" + j + " a").each(function(z) {
jQuery(this).bind("click", function(){
jQuery(this).addClass("current").parent().parent().find("a").not(jQuery(this)).removeClass("current"); // wow!
var cnt = - (pictWidth*z);
// Originale : jQuery(this).parent().parent().parent().prev('.stripViewer').find("ul").animate({ left: cnt}, settings.easeTime, settings.easeFunc);
jQuery(this).parent().parent().parent().prevAll('.stripViewer').find("ul").animate({ left: cnt}, settings.easeTime, settings.easeFunc);
// Sur clic d'un numéro d'image, affichage de la valeur du title de l'image dans l'espace commentaire
jQuery(this).parent().parent().parent().next(".galerieCommentaire").html(jQuery(this).attr("title"));
return false;
});
});
jQuery("div#stripTransmitter" + j).css("width" , pictWidth);
jQuery("div#stripTransmitter" + j + " a:firsts").addClass("current");
// Quand la galerie est chargée, avant les clics sur les numéros d'image, on affiche l'attribut title du premier élément
jQuery("p#galerieCommentaire" + j).html(jQuery("div#stripTransmitter" + j + " a:eq(0)").attr("title"));
if(settings.toolTip){
container.next(".stripTransmitter ul").find("a").tooltip();
}
});
j++;
});
};
 
/*
* jQuery Tooltip plugin 1.2
*
* http://bassistance.de/jquery-plugins/jquery-plugin-tooltip/
* http://docs.jquery.com/Plugins/Tooltip
*
* Copyright (c) 2006 - 2008 Jörn Zaefferer
*
* $Id: jquery.tooltip.js 4569 2008-01-31 19:36:35Z joern.zaefferer $
*
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*/
;(function($) {
// the tooltip element
var helper = {},
// the current tooltipped element
current,
// the title of the current element, used for restoring
title,
// timeout id for delayed tooltips
tID,
// IE 5.5 or 6
IE = $.browser.msie && /MSIE\s(5\.5|6\.)/.test(navigator.userAgent),
// flag for mouse tracking
track = false;
$.tooltip = {
blocked: false,
defaults: {
delay: 200,
showURL: true,
extraClass: "",
top: 15,
left: 15,
id: "tooltip"
},
block: function() {
$.tooltip.blocked = !$.tooltip.blocked;
}
};
$.fn.extend({
tooltip: function(settings) {
settings = $.extend({}, $.tooltip.defaults, settings);
createHelper(settings);
return this.each(function() {
$.data(this, "tooltip-settings", settings);
// copy tooltip into its own expando and remove the title
this.tooltipText = this.title;
$(this).removeAttr("title");
// also remove alt attribute to prevent default tooltip in IE
this.alt = "";
})
.hover(save, hide)
.click(hide);
},
fixPNG: IE ? function() {
return this.each(function () {
var image = $(this).css('backgroundImage');
if (image.match(/^url\(["']?(.*\.png)["']?\)$/i)) {
image = RegExp.$1;
$(this).css({
'backgroundImage': 'none',
'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='" + image + "')"
}).each(function () {
var position = $(this).css('position');
if (position != 'absolute' && position != 'relative')
$(this).css('position', 'relative');
});
}
});
} : function() { return this; },
unfixPNG: IE ? function() {
return this.each(function () {
$(this).css({'filter': '', backgroundImage: ''});
});
} : function() { return this; },
hideWhenEmpty: function() {
return this.each(function() {
$(this)[ $(this).html() ? "show" : "hide" ]();
});
},
url: function() {
return this.attr('href') || this.attr('src');
}
});
function createHelper(settings) {
// there can be only one tooltip helper
if( helper.parent )
return;
// create the helper, h3 for title, div for url
helper.parent = $('<div id="' + settings.id + '"><h3></h3><div class="body"></div><div class="url"></div></div>')
// add to document
.appendTo(document.body)
// hide it at first
.hide();
// apply bgiframe if available
if ( $.fn.bgiframe )
helper.parent.bgiframe();
// save references to title and url elements
helper.title = $('h3', helper.parent);
helper.body = $('div.body', helper.parent);
helper.url = $('div.url', helper.parent);
}
function settings(element) {
return $.data(element, "tooltip-settings");
}
// main event handler to start showing tooltips
function handle(event) {
// show helper, either with timeout or on instant
if( settings(this).delay )
tID = setTimeout(show, settings(this).delay);
else
show();
// if selected, update the helper position when the mouse moves
track = !!settings(this).track;
$(document.body).bind('mousemove', update);
// update at least once
update(event);
}
// save elements title before the tooltip is displayed
function save() {
// if this is the current source, or it has no title (occurs with click event), stop
if ( $.tooltip.blocked || this == current || (!this.tooltipText && !settings(this).bodyHandler) )
return;
 
// save current
current = this;
title = this.tooltipText;
if ( settings(this).bodyHandler ) {
helper.title.hide();
var bodyContent = settings(this).bodyHandler.call(this);
if (bodyContent.nodeType || bodyContent.jquery) {
helper.body.empty().append(bodyContent)
} else {
helper.body.html( bodyContent );
}
helper.body.show();
} else if ( settings(this).showBody ) {
var parts = title.split(settings(this).showBody);
helper.title.html(parts.shift()).show();
helper.body.empty();
for(var i = 0, part; part = parts[i]; i++) {
if(i > 0)
helper.body.append("<br/>");
helper.body.append(part);
}
helper.body.hideWhenEmpty();
} else {
helper.title.html(title).show();
helper.body.hide();
}
// if element has href or src, add and show it, otherwise hide it
if( settings(this).showURL && $(this).url() )
helper.url.html( $(this).url().replace('http://', '') ).show();
else
helper.url.hide();
// add an optional class for this tip
helper.parent.addClass(settings(this).extraClass);
 
// fix PNG background for IE
if (settings(this).fixPNG )
helper.parent.fixPNG();
handle.apply(this, arguments);
}
// delete timeout and show helper
function show() {
tID = null;
helper.parent.show();
update();
}
/**
* callback for mousemove
* updates the helper position
* removes itself when no current element
*/
function update(event) {
if($.tooltip.blocked)
return;
// stop updating when tracking is disabled and the tooltip is visible
if ( !track && helper.parent.is(":visible")) {
$(document.body).unbind('mousemove', update)
}
// if no current element is available, remove this listener
if( current == null ) {
$(document.body).unbind('mousemove', update);
return;
}
// remove position helper classes
helper.parent.removeClass("viewport-right").removeClass("viewport-bottom");
var left = helper.parent[0].offsetLeft;
var top = helper.parent[0].offsetTop;
if(event) {
// position the helper 15 pixel to bottom right, starting from mouse position
left = event.pageX + settings(current).left;
top = event.pageY + settings(current).top;
helper.parent.css({
left: left + 'px',
top: top + 'px'
});
}
var v = viewport(),
h = helper.parent[0];
// check horizontal position
if(v.x + v.cx < h.offsetLeft + h.offsetWidth) {
left -= h.offsetWidth + 20 + settings(current).left;
helper.parent.css({left: left + 'px'}).addClass("viewport-right");
}
// check vertical position
if(v.y + v.cy < h.offsetTop + h.offsetHeight) {
top -= h.offsetHeight + 20 + settings(current).top;
helper.parent.css({top: top + 'px'}).addClass("viewport-bottom");
}
}
function viewport() {
return {
x: $(window).scrollLeft(),
y: $(window).scrollTop(),
cx: $(window).width(),
cy: $(window).height()
};
}
// hide helper and restore added classes and the title
function hide(event) {
if($.tooltip.blocked)
return;
// clear timeout if possible
if(tID)
clearTimeout(tID);
// no more current element
current = null;
helper.parent.hide().removeClass( settings(this).extraClass );
if( settings(this).fixPNG )
helper.parent.unfixPNG();
}
$.fn.Tooltip = $.fn.tooltip;
})(jQuery);
/branches/v1.0-pithivier/tools/galerie/actions/galerie/presentation/scripts/showthumb.php
New file
0,0 → 1,100
<?php
// Vérification de la présence d'un chemin vers l'image
if($_GET['img'] == '') {
exit;
}
 
// Récupération de paramêtres
$_image_ = urldecode( $_GET['img'] );
$_dossier = dirname($_image_).'/cache/';
$_fichier = pathinfo($_image_);
$_fichier['filename'] = trim(basename($_image_, $_fichier['extension']), '.');
$_width_min_ = intval($_GET['width']);
$_height_min_ = intval($_GET['height']);
$_quality_ = intval($_GET['quality']);
$_centrage = false;
if (isset($_GET['centrage'])) {
$_centrage = (bool)$_GET['centrage'];
}
 
// Création du dossier de cache
if (!is_dir($_dossier)) {
mkdir($_dossier);
}
// Création du nom du fichier de cache
$fichier_cache = $_dossier.$_fichier['filename'].'_w'.$_width_min_.'_q'.$_quality_.'.'.$_fichier['extension'];
//echo $fichier_cache;
// Recherche de la présence d'une image en cache ou création de celle-ci
if (file_exists($fichier_cache)) {
switch (strtolower($_fichier['extension'])) {
case 'jpg' :
header('Content-type: image/jpg');
Imagejpeg(ImageCreateFromJpeg($fichier_cache));
break;
case 'gif' :
header('Content-type: image/gif');
Imagegif(ImageCreateFromGif($fichier_cache));
break;
case 'png' :
header('Content-type: image/png');
Imagepng(ImageCreateFromPng($fichier_cache));
break;
}
} else {
// Calcul de la hauteur et de la largeur
$info = getimagesize($_image_);
if ($info[0] == '') {
exit();
}
$new_w = $_width_min_;
$new_h = (int)($info[1]*($new_w/$info[0]));
if(($_height_min_) AND ($new_h > $_height_min_)) {
$new_h = $_height_min_;
$new_w = (int)($info[0]*($new_h/$info[1]));
}
// Définition des points d'origine de destination
$dst_x = 0;
$dst_y = 0;
$dst_l = $new_w;
$dst_h = $new_h;
if ($_centrage != false) {
$dst_x = (int)(($_width_min_ - $new_w) / 2);
$dst_y = (int)(($_height_min_ - $new_h) / 2);
$dst_l = $_width_min_;
$dst_h = $_height_min_;
}
// Création de l'image
switch (strtolower($_fichier['extension'])) {
case 'jpg' :
header("Content-type: image/jpg");
$dst_img = imagecreatetruecolor($dst_l, $dst_h);
$c_fond = imagecolorallocate($dst_img, 255, 255, 255);
imagefill($dst_img, 0, 0, $c_fond);
$src_img = ImageCreateFromJpeg($_image_);
imagecopyresampled($dst_img,$src_img,$dst_x,$dst_y,0,0,$new_w,$new_h,ImageSX($src_img),ImageSY($src_img));
$img_cache = Imagejpeg($dst_img, $fichier_cache, $_quality_);
$img = Imagejpeg($dst_img, '', $_quality_);
break;
case 'gif' :
header("Content-type: image/gif");
$dst_img=ImageCreate($new_w,$new_h);
$src_img=ImageCreateFromGif($_image_);
ImagePaletteCopy($dst_img,$src_img);
ImageCopyResized($dst_img,$src_img,$dst_x,$dst_y,0,0,$new_w,$new_h,ImageSX($src_img),ImageSY($src_img));
$img_cache = Imagegif($dst_img, $fichier_cache, $_quality_);
$img = Imagegif($dst_img,'', $_quality_);
break;
case 'png' :
header("Content-type: image/png");
$dst_img=ImageCreate($new_w,$new_h);
$src_img=ImageCreateFromPng($_image_);
ImagePaletteCopy($dst_img,$src_img);
ImageCopyResized($dst_img,$src_img,$dst_x,$dst_y,0,0,$new_w,$new_h,ImageSX($src_img),ImageSY($src_img));
$img_cache = Imagepng($dst_img, $fichier_cache, $_quality_);
$img = Imagepng($dst_img,'', $_quality_);
break;
}
}
?>
/branches/v1.0-pithivier/tools/galerie/actions/galerie/bibliotheque/metadonnees.fonct.php
New file
0,0 → 1,151
<?php
/*vim: set expandtab tabstop=4 shiftwidth=4: */
// +------------------------------------------------------------------------------------------------------+
// | PHP version 5.1 |
// +------------------------------------------------------------------------------------------------------+
// | Copyright (C) 1999-2006 Tela Botanica (accueil@tela-botanica.org) |
// +------------------------------------------------------------------------------------------------------+
// | This file is part of v2.pierredupontdugard.com. |
// | |
// | v2.pierredupontdugard.com is free software; you can redistribute it and/or modify |
// | it under the terms of the GNU General Public License as published by |
// | the Free Software Foundation; either version 2 of the License, or |
// | (at your option) any later version. |
// | |
// | v2.pierredupontdugard.com is distributed in the hope that it will be useful, |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
// | GNU General Public License for more details. |
// | |
// | You should have received a copy of the GNU General Public License |
// | along with Foobar; if not, write to the Free Software |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
// +------------------------------------------------------------------------------------------------------+
// CVS : $Id$
/**
* v2.pierredupontdugard.com - metadonnees.fonct.php
*
* Description :
*
*@package v2.pierredupontdugard.com
//Auteur original :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
//Autres auteurs :
*@author Aucun
*@copyright Tela-Botanica 1999-2008
*@version $Revision$ $Date$
// +------------------------------------------------------------------------------------------------------+
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTETE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
 
// +------------------------------------------------------------------------------------------------------+
// | CORPS du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
/**
* returns informations from IPTC metadata, mapping is done at the beginning
* of the function
*
* @param string $filename
* @return array
*/
function get_iptc_data($filename, $map)
{
$result = array();
 
$imginfo = array();
if (false == @getimagesize($filename, $imginfo) ) {
return $result;
}
 
if (isset($imginfo['APP13'])) {
$iptc = iptcparse($imginfo['APP13']);
if (is_array($iptc)) {
$rmap = array_flip($map);
foreach (array_keys($rmap) as $iptc_key) {
if (isset($iptc[$iptc_key][0])) {
if ($iptc_key == '2#025') {
$value = implode(',', array_map('clean_iptc_value',$iptc[$iptc_key]));
} else {
$value = clean_iptc_value($iptc[$iptc_key][0]);
}
 
foreach (array_keys($map, $iptc_key) as $pwg_key) {
$result[$pwg_key] = $value;
}
}
}
}
}
return $result;
}
 
/**
* return a cleaned IPTC value
*
* @param string value
* @return string
*/
function clean_iptc_value($value)
{
// strip leading zeros (weird Kodak Scanner software)
while ( isset($value[0]) and $value[0] == chr(0)) {
$value = substr($value, 1);
}
// remove binary nulls
$value = str_replace(chr(0x00), ' ', $value);
 
return $value;
}
 
/**
* returns informations from EXIF metadata, mapping is done at the beginning
* of the function
*
* @param string $filename
* @return array
*/
function get_exif_data($filename, $map)
{
$result = array();
if (!function_exists('read_exif_data')) {
die('Exif extension not available, admin should disable exif use');
}
 
// Read EXIF data
if ($exif = @read_exif_data($filename)) {
foreach ($map as $key => $field) {
if (strpos($field, ';') === false) {
if (isset($exif[$field])) {
if ($field == 'UserComment') {
$result[$key] = substr($exif[$field], 8);
// Récupère l'encodage du champ et supprime les caractères NULL de complétion
$result[$key.'_encodage'] = substr($exif[$field], 0, strpos($exif[$field] , chr(0)));
} else {
$result[$key] = $exif[$field];
}
}
} else {
$tokens = explode(';', $field);
if (isset($exif[$tokens[0]][$tokens[1]])) {
$result[$key] = $exif[$tokens[0]][$tokens[1]];
}
}
}
}
 
return $result;
}
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log$
*
* +-- Fin du code ----------------------------------------------------------------------------------------+
*/
?>
/branches/v1.0-pithivier/tools/galerie/actions/galerie/configuration/gal_config.inc.php
New file
0,0 → 1,101
<?php
/*vim: set expandtab tabstop=4 shiftwidth=4: */
// +------------------------------------------------------------------------------------------------------+
// | PHP version 5.1 |
// +------------------------------------------------------------------------------------------------------+
// | Copyright (C) 1999-2006 Tela Botanica (accueil@tela-botanica.org) |
// +------------------------------------------------------------------------------------------------------+
// | This file is part of papyrus_bp. |
// | |
// | Foobar is free software; you can redistribute it and/or modify |
// | it under the terms of the GNU General Public License as published by |
// | the Free Software Foundation; either version 2 of the License, or |
// | (at your option) any later version. |
// | |
// | Foobar is distributed in the hope that it will be useful, |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
// | GNU General Public License for more details. |
// | |
// | You should have received a copy of the GNU General Public License |
// | along with Foobar; if not, write to the Free Software |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
// +------------------------------------------------------------------------------------------------------+
// CVS : $Id: gall_config.inc.php,v 1.1 2006-12-07 17:29:20 jp_milcent Exp $
/**
* papyrus_bp - gall_config.inc.php
*
* Description :
*
*@package papyrus_bp
//Auteur original :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
//Autres auteurs :
*@author Aucun
*@copyright Tela-Botanica 1999-2006
*@version $Revision: 1.1 $ $Date: 2006-12-07 17:29:20 $
// +------------------------------------------------------------------------------------------------------+
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTÊTE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
$GLOBALS['_GALERIE_'] = array();
 
// +------------------------------------------------------------------------------------------------------+
// | CORPS du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
/** Constante stockant la valeur de la langue par défaut pour l'applette GALL.*/
define('GAL_I18N_DEFAUT', 'fr');
 
/** L'url à partir de laquelle l'applette est appelée.*/
define('GAL_URL', $this->GetConfigValue('base_url'));
 
// Chemin vers les dossiers de l'applette
/** Chemin vers la racine du site.*/
define('GAL_CHEMIN_RACINE', $_SERVER['DOCUMENT_ROOT'].DS);
/** Constante "dynamique" stockant le chemin relatif de base de l'application.*/
define('GAL_CHEMIN_APPLI_RELATIF', 'tools'.DS.'galerie'.DS.'actions'.DS);
/** Chemin vers l'applette Gallerie de Papyrus.*/
define('GAL_CHEMIN_APPLETTE', GAL_CHEMIN_APPLI.'galerie'.DS);
/** Chemin relatif vers l'applette Gallerie de Papyrus.*/
define('GAL_CHEMIN_APPLETTE_RELATIF', GAL_CHEMIN_APPLI_RELATIF.'galerie'.DS);
/** Chemin vers le dossier de Présentation.*/
define('GAL_CHEMIN_PRESENTATION', GAL_CHEMIN_APPLETTE.'presentation'.DS);
/** Chemin relatif vers le dossier de Présentation.*/
define('GAL_CHEMIN_PRESENTATION_RELATIF', GAL_CHEMIN_APPLETTE_RELATIF.'presentation'.DS);
/** Chemin vers les fichiers js de l'applette Gallerie de Papyrus.*/
define('GAL_CHEMIN_SCRIPTS', GAL_CHEMIN_PRESENTATION.'scripts'.DS);
/** Chemin relatif vers les fichiers js de l'applette Gallerie de Papyrus.*/
define('GAL_CHEMIN_SCRIPTS_RELATIF', GAL_CHEMIN_PRESENTATION_RELATIF.'scripts'.DS);
/** Chemin vers les fichiers css de l'applette Gallerie de Papyrus.*/
define('GAL_CHEMIN_STYLES', GAL_CHEMIN_PRESENTATION.'styles'.DS);
/** Chemin relatif vers les fichiers css de l'applette Gallerie de Papyrus.*/
define('GAL_CHEMIN_STYLES_RELATIF', GAL_CHEMIN_PRESENTATION_RELATIF.'styles'.DS);
/** Chemin vers les fichiers images de l'applette Gallerie de Papyrus.*/
define('GAL_CHEMIN_IMAGES', GAL_CHEMIN_PRESENTATION.'images'.DS);
/** Chemin vers les fichiers squelettes de l'applette Gallerie de Papyrus.*/
define('GAL_CHEMIN_SQUELETTE', GAL_CHEMIN_PRESENTATION.'squelettes'.DS);
 
// Configuration du rendu
/** Nom du fichier de squelette à utiliser pour la liste des pages.*/
define('GAL_SQUELETTE_LISTE', 'gal_liste_ss_inclusion.tpl.html');
 
 
/* +--Fin du code ----------------------------------------------------------------------------------------+
*
* $Log: gall_config.inc.php,v $
* Revision 1.1 2006-12-07 17:29:20 jp_milcent
* Ajout de l'applette Gallerie dans Client car elle n'a pas un rapport direct avec Papyrus.
*
* Revision 1.2 2006/12/07 16:25:23 jp_milcent
* Ajout de la gestion de messages d'erreur.
* Ajout de la gestion des squelettes.
*
* Revision 1.1 2006/12/07 15:39:47 jp_milcent
* Ajout de l'applette Gallerie.
*
*
* +-- Fin du code ----------------------------------------------------------------------------------------+
*/
?>
/branches/v1.0-pithivier/tools/galerie/actions/header__.php
New file
0,0 → 1,16
<?php
 
if (!defined("WIKINI_VERSION"))
{
die ("acc&egrave;s direct interdit");
}
 
$plugin_output_new=preg_replace ('/<\/head>/',
'
<link rel="stylesheet" type="text/css" href="tools/galerie/actions/galerie/presentation/styles/jquery.galerie-0.1.css" media="screen" />
<script type="text/javascript" src="tools/galerie/actions/galerie/presentation/scripts/jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="tools/galerie/actions/galerie/presentation/scripts/jquery.galerie-0.1.js"></script>
</head>
',
$plugin_output_new);
?>
/branches/v1.0-pithivier/tools/api/desc.xml
New file
0,0 → 1,6
<?xml version="1.0" encoding="ISO-8859-1"?>
<plugin name="api" version="0.1" active="1">
<author>Jean-Pascal MILCENT</author>
<label>API REST</label>
<desc>Permet de controler un wikini à distance à l'aide d'une API REST.</desc>
</plugin>
/branches/v1.0-pithivier/tools/api/index.php
New file
0,0 → 1,7
<?php
// Administration
// V�rification de s�curit�
if (!defined("TOOLS_MANAGER")) {
die ("acc&egrave;s direct interdit");
}
?>
/branches/v1.0-pithivier/tools/api/rest/index.php
New file
0,0 → 1,49
<?php
// Encodage : UTF-8
// Permet d'afficher le temps d'execution du service
$temps_debut = (isset($_GET['chrono']) && $_GET['chrono'] == 1) ? microtime(true) : '';
// +-------------------------------------------------------------------------------------------------------------------+
/**
* Serveur
*
* Description : initialise le chargement et l'exécution des services web.
*
//Auteur original :
* @author auteur <aut@tela-botanica.org>
* @copyright Tela-Botanica 1999-2008
* @licence GPL v3 & CeCILL v2
* @version $Id$
*/
// +-------------------------------------------------------------------------------------------------------------------+
 
// Le fichier autoload.inc.php du Framework de Tela Botanica doit être appelée avant tout autre chose dans l'application.
// Sinon, rien ne sera chargé.
// Chemin du fichier chargeant le framework requis
$framework = dirname(__FILE__).DIRECTORY_SEPARATOR.'framework.php';
 
if (!file_exists($framework)) {
$e = "Veuillez paramétrer l'emplacement et la version du Framework dans le fichier $framework";
trigger_error($e, E_USER_ERROR);
} else {
// Inclusion du Framework
require_once $framework;
// Ajout d'information concernant cette application
Framework::setCheminAppli(__FILE__);// Obligatoire
Framework::setInfoAppli(Config::get('info'));
// Transformation de l'url du handler wikini en url pour le serveur REST
// TODO : améliorer la gestion de l'url entre le wikini et le serveur REST
$_SERVER['REQUEST_URI'] = Config::get('serveur.baseURL').$_GET['api'];
$_SERVER['QUERY_STRING'] = $_GET['params'] ? $_GET['params'] : '';
// Initialisation et lancement du serveur
$Serveur = new RestServeur();
$Serveur->executer();
// Affiche le temps d'execution du service
if (isset($_GET['chrono']) && $_GET['chrono'] == 1) {
$temps_fin = microtime(true);
echo 'Temps d\'execution : '.round($temps_fin - $temps_debut, 4);
}
}
?>
/branches/v1.0-pithivier/tools/api/rest/framework.php
New file
0,0 → 1,7
<?php
// Inclusion du Framework
// Renomer ce fichier en "framework.php"
// Indiquer ci-dessous le chemin absolu vers le fichier Framework.php de la bonne version du Framework
$chemin = '/home/'.$_ENV['USER'].'/web/framework_3/framework/Framework.php';
require_once $chemin;
?>
/branches/v1.0-pithivier/tools/api/rest/modules/0.5/Exemple.php
New file
0,0 → 1,51
<?php
// declare(encoding='UTF-8');
/**
* Classe d'exemple de service web du projet eFlore
* Source des données : {NOM_DU_PROJET} {ADRESSE_WEB_DONNEES_DU_PROJET}
* Paramètres du service :
* - param1 : explication de l'utilisation du param1
* - param2 : explication de l'utilisation du param2
* Exemple :
* http://localhost/{CODE_DU_PROJET}/services/0.1/Exemple?param1=val1&param2=val2
*
* @category php 5.2
* @package lion1906
* @author {PRENOM} {NOM}<{PRENOM}@tela-botanica.org>
* @copyright Copyright (c) 2011, Tela Botanica (accueil@tela-botanica.org)
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
* @version $Id$
*/
class Exemple extends Service {
public function consulter($ressources, $parametres) {
$verifOk = $this->verifierParametres($parametres);
if ($verifOk) {
// Débuter ici le code du service
$retour = $this->formaterEnJson(array('info' => 'OK'));
//print_r($retour);
return $retour;
} else {
RestServeur::envoyerEnteteStatutHttp(RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
}
}
private function verifierParametres($parametres) {
$ok = true;
extract($parametres);
if ($param1 != '' && !preg_match('/^val1$/', $param1)) {
$message = "La valeur du param1 n'est pas bonne. Seul 'val1' est accepté.";
$this->ajouterMessage($message);
$ok = false;
}
if ($param1 != '' && !preg_match('/^val1$/', $param2)) {
$message = "La valeur du param2 n'est pas bonne Seul 'val2' est accepté.";
$this->ajouterMessage($message);
$ok = false;
}
return $ok;
}
}
?>
/branches/v1.0-pithivier/tools/api/rest/modules/0.5/Service.php
New file
0,0 → 1,38
<?php
abstract class Service extends RestService {
//+----------------------------------------------------------------------------------------------------------------+
// GESTION de l'ENVOIE au NAVIGATEUR
 
protected function formaterEnJsonp($donnees = null, $encodage = 'utf-8') {
$contenu = $_GET['callback'].'('.json_encode($donnees).');';
return $this->preparerEnvoie($contenu, 'text/html', $encodage);
}
protected function formaterEnJson($donnees = null, $encodage = 'utf-8') {
$contenu = json_encode($donnees);
return $this->preparerEnvoie($contenu, 'application/json', $encodage);
}
private function preparerEnvoie($sortie = 'OK', $mime = 'text/html', $encodage = 'utf-8') {
$this->envoyerEnteteContenu($encodage, $mime);
return $sortie;
}
 
private function envoyerEnteteContenu($encodage, $mime) {
if (!is_null($mime) && !is_null($encodage)) {
header("Content-Type: $mime; charset=$encodage");
} else if (!is_null($mime) && is_null($encodage)) {
header("Content-Type: $mime");
}
}
protected function envoyerAuth($message_accueil, $message_echec) {
header('HTTP/1.0 401 Unauthorized');
header('WWW-Authenticate: Basic realm="'.mb_convert_encoding($message_accueil, 'ISO-8859-1', 'UTF-8').'"');
header('Content-type: text/plain; charset=UTF-8');
print $message_echec;
exit(0);
}
}
?>
/branches/v1.0-pithivier/tools/api/rest/configurations/config.defaut.ini
New file
0,0 → 1,49
; Encodage : UTF-8
 
; +------------------------------------------------------------------------------------------------------+
; URLs
; Le séparateur utilisé par le framework lorsqu'il génère des URL pour séparer les arguments.
; Pour remettre les valeurs par défaut, utitliser : "php:ini_get('arg_separator.output')"
url_arg_separateur_sortie = "&"
 
; +------------------------------------------------------------------------------------------------------+
; Info sur l'application
info.nom = "Services web des données {NOM_DU_PROJET} (Tela Botanica)"
; Abréviation de l'application
info.abr = "WS-{CODE_DU_PROJET}"
; Version du Framework nécessaire au fonctionnement de cette application
info.framework.version = 0.3
;Encodage de l'application
encodage_appli = "UTF-8"
 
; +------------------------------------------------------------------------------------------------------+
; Débogage
; Indique si oui ou non on veut afficher le débogage.
debogage = true
; Indique si oui ou non on veut lancer le chronométrage
chronometrage = false
 
; +------------------------------------------------------------------------------------------------------+
; Spécifique aux services
serveur.baseURL = /{CODE_DU_PROJET}/
serveur.baseAlternativeURL = service:eflore:{CODE_DU_PROJET}/
 
+------------------------------------------------------------------------------------------------------+
; Paramètrage de la base de données.
; bdd_abstraction : abstraction de la base de données.
; bdd_protocole : Protocole de la base de données.
; bdd_serveur : Nom du serveur de bases de données.
; bdd_utilisateur : Nom de l'utilisateur de la base de données.
; bdd_mot_de_passe : Mot de passe de l'utilisateur de la base de données.
; bdd_nom : Nom de la base de données principale.
; bdd_encodage : Encodage de la base de données principale. Normalement le même que l'application mais au format base de
; données : voir ici : http://dev.mysql.com/doc/refman/5.0/en/charset-charsets.html
; et là: http://www.postgresql.org/docs/8.1/static/multibyte.html pour les correspondances
bdd_abstraction = pdo
bdd_protocole = mysql
bdd_serveur = localhost
bdd_utilisateur = "telabotap"
bdd_mot_de_passe = ""
bdd_nom = "tb_eflore"
bdd_encodage = "utf8"
/branches/v1.0-pithivier/tools/api/rest/configurations/config.ini
New file
0,0 → 1,29
; Encodage : UTF-8
 
; +------------------------------------------------------------------------------------------------------+
; URLs
; Le séparateur utilisé par le framework lorsqu'il génère des URL pour séparer les arguments.
; Pour remettre les valeurs par défaut, utitliser : "php:ini_get('arg_separator.output')"
url_arg_separateur_sortie = "&"
 
; +------------------------------------------------------------------------------------------------------+
; Info sur l'application
info.nom = "Services web de WIKINI (Tela Botanica)"
; Abréviation de l'application
info.abr = "WS-WIKINI"
; Version du Framework nécessaire au fonctionnement de cette application
info.framework.version = 0.3
;Encodage de l'application
encodage_appli = "UTF-8"
 
; +------------------------------------------------------------------------------------------------------+
; Débogage
; Indique si oui ou non on veut afficher le débogage.
debogage = true
; Indique si oui ou non on veut lancer le chronométrage
chronometrage = false
 
; +------------------------------------------------------------------------------------------------------+
; Spécifique aux services
serveur.baseURL = "/yeswiki/"
serveur.baseAlternativeURL = "/yeswiki/api/rest/"
/branches/v1.0-pithivier/tools/api/rest/framework.defaut.php
New file
0,0 → 1,7
<?php
// Inclusion du Framework
// Renomer ce fichier en "framework.php"
// Indiquer ci-dessous le chemin absolu vers le fichier Framework.php de la bonne version du Framework
$chemin = '/home/'.$_ENV['USER'].'/www/commun/tbframework/0.3/Framework.php';
require_once $chemin;
?>
/branches/v1.0-pithivier/tools/api/handlers/page/api.php
New file
0,0 → 1,24
<?php
// declare(encoding='UTF-8');
/**
* Handler renvoyant au navigateur le contenu HTML de la page wiki.
*
* @category PHP 5.2
* @package Framework
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright Copyright (c) 2009, Tela Botanica (accueil@tela-botanica.org)
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL-v3
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL-v2
* @version $Id$
*/
//Vérification de sécurité
if (!eregi("wakka.php", $_SERVER['PHP_SELF'])) {
die ("Acc&eacute;s direct interdit");
}
$chemin = dirname(__FILE__).DIRECTORY_SEPARATOR.'../../rest/index.php';
if (!file_exists($chemin)) {
$e = "Veuillez paramétrer l'emplacement de l'api : $chemin";
} else {
include $chemin;
}
?>
/branches/v1.0-pithivier/tools/cms_ppdg_style/wakka.basic.css
New file
0,0 → 1,121
/* GENERAL */
body {
background-color: white;
color: black;
font-family: Arial, Helvetica, sans-serif, 'Lucida Grande', Verdana, Geneva, Lucida;
}
a {
color: #bca46e;
font-weight: bold;}
h1, h2, h3, h4, h5, form {
margin: 0;
padding: 0;
}
ul, ol {
margin-top: 0;
padding-top: 0;
padding-bottom: 0;}
tt {
color: Navy;}
address{
font-size: 1.2em;}
/* ENTÊTE */
.header {
padding: 10px;
padding-top: 0;}
#site_titre h1 {
font-size:1.6em;
padding:0;
margin:0;
}
/* PAGE */
.page {
background-color: white;
padding: 10px;}
h1 {
color: white;
font-size: 1.7em;
font-weight: bold;}
h2 {
margin: 2px 2px 2px 20px;
color: black;
font-size: 1.5em;
font-weight: bold;}
h3 {
margin: 2px 2px 2px 40px;
color: black;
font-size: 1.3em;
font-weight: bold;}
h4 {
margin: 2px 2px 2px 60px;
color: black;
font-size: 1.1em;
font-style: italic;}
.page li {
padding-bottom: 0.8em;}
/* ADMINISTRATION :*/
.edit {
width: 100%;
height: 400px;}
.footer {
clear: both;
background-color: #DDDDDD;
padding: 5px;
border: 1px inset;}
.prev_alert {
background-color: red;
color: white;
font-size: 1.7em;
font-weight: bold;
margin-bottom: 5px;}
/* DIVERS */
.commentsheader{
visibility:hidden;}
.error {
color: #CC3333;
font-weight: bold;}
.indent {
margin-left: 40px;}
.additions {
color: #008800;}
.deletions {
color: #880000;}
.add {
font-weight: bold;
color:#c00;
text-decoration: underline; }
.del {
font-style: italic;
color:#c00;
text-decoration: line-through;}
.code {
background: #FFFFFF;
border: solid #888888 2px;
font-family: "Courier New", Courier;
color: black;
font-size: 0.8em;
width: 100%;
height: 400px;
overflow: scroll;
padding: 3px;}
.revisioninfo {
color: #AAAAAA;
padding-bottom: 20px;}
.copyright {
font-size: 0.8em;
color: #AAAAAA;
text-align: right;}
.copyright a {
color: #AAAAAA;}
.searchbox {
background: #FFFFF8;
border: 0;
border-bottom: 1px solid #CCCCAA;
padding: 0;
margin: 0;}
.hr_clear{
clear:both;
display:none;}
.debug {
font-size: 0.8em;
color: #888888;}
/branches/v1.0-pithivier/tools/cms_ppdg_style/wakka.css
New file
0,0 → 1,190
/* GENERAL */
body {
background: url(../../bibliotheque/images/graphisme/navigation_fond.jpg) repeat-y top left;}
body, form{
margin: 0;
padding: 0;}
ol, ul {
margin: 0.5em;
padding: 0;}
a {
text-decoration:none;
border-bottom: 1px dotted black;}
a:hover {
text-decoration: underline;
border-bottom: 0 none;
font-weight: bold;}
img {
display:block;
margin: 5px 10px;
border-style: solid;
border-bottom-color: #333333;
border-right-color: #555555;
border-left-color: #BBBBBB;
border-top-color: #DDDDDD;}
.missingpage+a {
display:none;}
.titre_a_droite {
text-align: right;}
/* MENU GAUCHE */
#navigation {
background-color: #eec860;}
#menu {
position: absolute;
top: 116px;
left: 0;
width: 150px;
margin: 5px 5px 0 5px;
background: url(../../bibliotheque/images/graphisme/menu_contenu.jpg) repeat-y;
background-color: #f5d58f;
border: none;
font-size: small;
font-weight: bold;}
#menu br {
margin:0;
padding:0;}
#menu li {
margin:0;
padding:5px 0 0 0;}
#menu ul {
margin-top:0;
list-style-type: none;}
#menu ul ul {
margin: 0 0 0 5px;
list-style-type: none;}
#menu_debut, #menu_fin {
display: none;}
#menu .indent{
margin-left: 5px;}
#menu a {
color: white;
font-size: 1.1em;
font-weight: bold;}
#titre_menu {
margin:0;
padding:0;
background: url(../../bibliotheque/images/graphisme/menu_haut.jpg) no-repeat top left;}
#titre_contenu {
height:30px;
width:150px;
margin:0;
padding:0;
background: url(../../bibliotheque/images/graphisme/menu_bas.jpg) no-repeat bottom left;}
 
/* ENTÊTE */
#entete {
position: absolute;
top: 0;
left: 0;
margin: 0;
padding: 0;
height: 116px;
width: 100%;
background: url(../../bibliotheque/images/graphisme/entete_fond.jpg) repeat-x;
background-color: #eec860;}
#logo {
position: absolute;
top: 0;
left: 0;
height: 88px;
width: 105px;
margin: 5px;
padding: 0;}
#logo img{
margin:0;
padding:0;
border:none;}
#logo a {
border-bottom: 0 none;}
#site_titre {
position: absolute;
top: 5px;
left: 178px;
height: 87px;
width: 440px;
padding:0.8em 0 0 0;
margin:0;
background: url(../../bibliotheque/images/graphisme/entete_titre_fond.jpg) no-repeat;}
#site_titre h1 {
text-align: center;
text-transform:uppercase;
color:white;
font-weight:bold;}
#commun {
position: absolute;
top: 65px;
right: 5px;}
#commun a {
color: black;}
#aller_menu, #aller_contenu {
display: none;}
#moteur_recherche {
position: absolute;
top: 35px;
right: 5px;
margin: 0;}
#moteur_recherche input {
background: #FFFFF8;}
 
/* CORPS */
#corps {
position: absolute;
top: 116px;
left: 178px;
margin: 0;
padding: 0;
min-height: 332px;
width:auto;
min-width:400px;
background: url(../../bibliotheque/images/graphisme/arche.jpg) no-repeat top left;}
 
/* PAGE */
.page {
background-color: transparent;
height:100%;
min-height: 332px;
padding: 1em;
text-align: justify;}
.page h1 {
padding:5px;
background-color: #bca46e;
text-align: center;
text-transform:uppercase;}
.page h2, #titre_menu, #titre_contenu {
clear: both;
text-transform:uppercase;}
.page h3 {
clear: both;}
.page h4 {
clear: both;}
 
/* DIVERS */
.commentsheader{
display:none;}
.nettoyeur, .copyright {
clear:both;
margin: 0;
padding: 0;}
 
/* CONTRIBUTION ACTION ATTACH */
/* - les images */
.attach_maj{display:none;}
/* marge de 0.5 em autour de l'image*/
.attach_margin05em { margin: 0.5em;}
/* marge de 1em autour de l'image*/
.attach_margin1em { margin: 1em;}
/* bloc flotant ? gauche */
.attach_left {float: left;}
/* bloc flotant ? droite */
.attach_right {float: right;}
/* bloc flotant centré */
.attach_center {text-align:center;}
/* pas de bordure */
.attach_noborder {border-width: 0;}
/* aligenement vertical au milieu */
.attach_vmiddle {vertical-align: text-bottom;}
 
/* CONTRIBUTION ACeditor */
.image_left, .flotant_gauche {float: left;} /* bloc flotant ? gauche */
.image_right, .flotant_droit {float: right;} /* bloc flotant ? droite */
.image_center {text-align:center;} /* bloc centr? */
/branches/v1.0-pithivier/tools/cms_ppdg_style/wakka.admin.css
New file
0,0 → 1,100
/* GENERAL */
.missingpage+a {
display:inline;
}
/* ADMINISTRATION : entête, pieds de page, nom du wiki, nom de la page, formulaire édition */
.footer, .header {
padding: 5px;
margin: 0;
background: #cfcfcf;
border: 1px solid gray;
font-size: 0.8em;
text-align: center;
}
.footer a, .header a {
color:black;
}
.wiki_name {
color: white;
float: left;
font-size: 1.8em;
margin: 0px 0px 0px 100px;
padding: 10px;
}
.page_name {
position: absolute;
top: 5px;
right: 5px;
font-size: 1.4em;
margin: 0;
padding: 0;
}
.edit {
width: 100%;
height: 400px;
}
 
/* CONTRIBUTION ACTION ATTACH */
/* - les images */
/* - les images */
.attach_maj{display:inline;}
 
/* - le gestionnaire des uploads */
.tableFM {border: thin solid Black; width: 100%; }
.tableFM thead { background-color: Silver; font-weight: bold; text-align: center; }
.tableFM tfoot { background-color: Silver; font-weight: bold; text-align: left; }
.tableFM tbody tr { text-align: center; }
.tableFMCol1 { background-color: Aqua; }
.tableFMCol2 { background-color: Yellow; }
 
/* CONTRIBUTION ACeditor */
#toolbar {
margin: 0;
padding: 0;
height:20px;
background: #ccc;
border-top: 1px solid buttonhighlight;
border-left: 1px solid buttonhighlight;
border-bottom: 1px solid buttonshadow;
border-right: 1px solid buttonshadow;
text-align:left;
}
#toolbar img {
margin:0;
}
.buttons {
background: #ccc;
border: 1px solid #ccc;
margin: 1px;
float:left;
}
.raise{
border-top: 1px solid buttonhighlight;
border-left: 1px solid buttonhighlight;
border-bottom: 1px solid buttonshadow;
border-right: 1px solid buttonshadow;
background: #ccc;
margin:1;
float:left;
}
.press {
border-top: 1px solid buttonshadow;
border-left: 1px solid buttonshadow;
border-bottom: 1px solid buttonhighlight;
border-right: 1px solid buttonhighlight;
background: #ccc;
margin:1;
float:left;
}
.ACsearchbox {
background: #FFFFF8;
border: 0;
border-bottom: 1px solid #CCCCAA;
padding: 0;
margin: 0;
font-size:0.8em;
}
.texteChampsImage {
font-size: 0.8em;
}
 
/branches/v1.0-pithivier/tools/cms_ppdg_style/desc.xml
New file
0,0 → 1,6
<?xml version="1.0" encoding="ISO-8859-1"?>
<plugin name="wkppdg_style" version="0.1" active="1">
<author>Jean-Pascal MILCENT</author>
<label>Pierre du Pont du Gard - Styles</label>
<desc>Styles du site de la Pierre du Pont du Gard </desc>
</plugin>
/branches/v1.0-pithivier/tools/cms_ppdg_style/index.php
New file
0,0 → 1,30
<?php
// Administration
 
 
// Vérification de sécurité
if (!defined("TOOLS_MANAGER"))
{
die ("acc&egrave;s direct interdit");
}
 
 
buffer::str(
'
Ajouter les lignes suivantes dans le fichier wakka.css pour personnaliser
votre menu de navigation :
<br>
<code>
.page_table {margin: 0px; padding: 0px ; border: none; height: 100%;width: 100%;}
<br>
.menu_column {background-color: #FFFFCC; vertical-align: top; width: 150px; border: 1px solid #000000;padding:5px;}
<br>
.body_column {vertical-align: top; border: none;padding:5px;}
<br>
</code>
'
 
 
);
 
?>
/branches/v1.0-pithivier/tools/cms_ppdg_style/actions/footer__.php
New file
0,0 → 1,21
<?
if (!defined("WIKINI_VERSION")) {
die ("acc&egrave;s direct interdit");
}
$user = $this->GetUser();
if (!$user) {
$plugin_output_new = preg_replace ('/^.*<\/body>/ms',
'</body>',
$plugin_output_new);
}
 
$plugin_output_new = preg_replace ('/<\/body>/',
'<div class="copyright">
S.A.R.L. La Pierre du Pont du Gard Authentique - N° SIRET: 339 291 015 00016 -
Fonctionne avec '.$wikini_site_url."\n".
'-'.$this->Link("Identification", "", "Administration")."\n".
'</div>
</body>',
$plugin_output_new);
 
?>
/branches/v1.0-pithivier/tools/cms_ppdg_style/actions/header__.php
New file
0,0 → 1,80
<?php
 
if (!defined("WIKINI_VERSION"))
{
die ("acc&egrave;s direct interdit");
}
$plugin_output_new = preg_replace ('/<link.*style>/ms',
'<!-- STYLE_DEBUT -->
<link rel="stylesheet" type="text/css" media="screen" href="tools/ppdg_style/wakka.basic.css" />
<style type="text/css" media="all">
<!--
@import url(tools/ppdg_style/'.$imported_style.'.css);
-->
</style>
<!-- STYLE_FIN -->',
$plugin_output_new);
 
$user = $this->GetUser();
if ($user) {
$plugin_output_new = preg_replace ('/<!-- STYLE_FIN -->/',
'<style type="text/css" media="all"> @import "tools/ppdg_style/wakka.admin.css";</style>
<!-- STYLE_FIN -->',
$plugin_output_new);
}
 
$plugin_output_new = preg_replace ('/<!-- STYLE_FIN -->/',
'<link rel="stylesheet" type="text/css" media="print" href="tools/ppdg_style/wakka.print.css" />
<!-- STYLE_FIN -->',
$plugin_output_new);
 
$plugin_output_new = preg_replace('/<body (onload="[^"]"|).*$/ms',
'<body $1'.$body_attr.'>
<!-- ENTETE_DEBUT -->
<div id="entete">
<div id="logo">
<a href="/"><img src="bibliotheque/images/graphisme/logo.jpg" alt="Logo de la Carrière la Pierre du Pont du Gard Authentique."/></a>
</div>
<div style="display: none;"><a href="'.$page_addr.'/resetstyle" accesskey="7"></a></div>
<div id="site_titre">
<h1>La pierre du pont du gard authentique</h1>
</div>
<!-- PAGE_NOM -->
<!-- RECHERCHE -->
<!-- COMMUN -->
<!-- ENTETE_FIN -->
<!-- NAVIGATION -->
<!-- ADMIN -->',
$plugin_output_new);
 
if ($user) {
$plugin_output_new = preg_replace ('/<!-- PAGE_NOM -->/',
'<h1 class="page_name">
<a href="'.$page_search.'">'.$page_name.'</a>
</h1>',
$plugin_output_new);
}
 
$plugin_output_new = preg_replace ('/<!-- RECHERCHE -->/',
$this->FormOpen('', 'RechercheTexte', 'get').
'<p id="moteur_recherche">
<input id="phrase" name="phrase" type="text" size="15" value="Rechercher" onclick="javascrip:this.value=\'\';" />
<input id="ok" name="ok" type="submit" value="OK" />
</p>'.
$this->FormClose(),
$plugin_output_new);
 
$plugin_output_new = preg_replace ('/<!-- COMMUN -->/',
'<div id="commun">
<p>
<a href="wakka.php?wiki=PlanDuSite">Plan du Site</a>
<a id="aller_menu" href="#menu">Aller au menu</a>
<a id="aller_contenu" href="#corps">Aller au contenu</a>
</p>
</div>',
$plugin_output_new);
 
$plugin_output_new = preg_replace ('/<!-- ENTETE_FIN -->/',
"</div>\n<!-- ENTETE_FIN -->\n",
$plugin_output_new);
?>
/branches/v1.0-pithivier/tools/cms_ppdg_style/wakka.print.css
New file
0,0 → 1,12
#navigation, #moteur_recherche, #commun, .copyright {
display:none;
}
#logo {
position: relative;
float:left;
}
#corps {
position: relative;
top:116px;
left:0;
}
/branches/v1.0-pithivier/tools/.settings/org.eclipse.php.core.prefs
New file
0,0 → 1,3
#Wed Aug 11 16:16:43 CEST 2010
eclipse.preferences.version=1
include_path=0;/wikini_tools
/branches/v1.0-pithivier/tools/.settings/org.eclipse.core.resources.prefs
New file
0,0 → 1,3
#Wed Aug 11 16:17:35 CEST 2010
eclipse.preferences.version=1
encoding/<project>=ISO-8859-1
/branches/v1.0-pithivier/tools/templates/presentation/templates/moteurrecherche_basic.tpl.html
New file
0,0 → 1,9
<form class="<?php echo $class;?>" method="get" action="<?php echo $url;?>">
<div class="btn-group">
<div class="input-append">
<input type="text" class="search-query has-tooltip" data-placement="bottom" placeholder="<?php echo TEMPLATE_SEARCH_PLACEHOLDER;?>" value="<?php echo $phrase;?>" title="<?php echo TEMPLATE_SEARCH_INPUT_TITLE;?>" accesskey="C" tabindex="1" name="phrase" />
<button type="submit" class="btn search-btn<?php echo $btnclass; ?>"><i class="icon-search<?php echo $iconclass; ?>"></i>&nbsp;</button>
</div>
</div>
<input type="hidden" value="RechercheTexte" name="wiki" />
</form>
/branches/v1.0-pithivier/tools/templates/actions/barreredaction.php
New file
0,0 → 1,79
<?php
if (!defined("WIKINI_VERSION"))
{
die ("acc&egrave;s direct interdit");
}
 
if ($this->HasAccess("write")) {
// on récupère la page et ses valeurs associées
$page = $this->GetParameter('page');
if (empty($page)) {
$page = $this->GetPageTag();
$time = $this->GetPageTime();
$content = $this->page;
} else {
$content = $this->LoadPage($page);
$time = $content["time"];
}
$barreredactionelements['page'] = $page;
$barreredactionelements['linkpage'] = $this->href("", $page);
 
// on choisit le template utilisé
$template = $this->GetParameter('template');
if (empty($template)) {
$template = 'barreredaction_basic.tpl.html';
}
 
// on peut ajouter des classes à la classe par défaut .footer
$barreredactionelements['class'] = ($this->GetParameter('class') ? 'footer '.$this->GetParameter('class') : 'footer');
 
// on ajoute le lien d'édition si l'action est autorisée
if ( $this->HasAccess("write", $page) ) {
$barreredactionelements['linkedit'] = $this->href("edit", $page);
}
 
//
if ( $time ) {
$barreredactionelements['linkrevisions'] = $this->href("revisions", $page);
$barreredactionelements['time'] = date(TEMPLATE_DATE_FORMAT, strtotime($time));
}
 
// if this page exists
if ( $content ) {
// if owner is current user
if ($this->UserIsOwner($page) || $this->UserIsAdmin()) {
$barreredactionelements['owner'] = TEMPLATE_OWNER." : ".TEMPLATE_YOU.' - '.TEMPLATE_PERMISSIONS;
$barreredactionelements['linkacls'] = $this->href("acls", $page);
$barreredactionelements['linkdeletepage'] = $this->href("deletepage", $page);
}
else {
if ($owner = $this->GetPageOwner($page)) {
$barreredactionelements['owner'] = TEMPLATE_OWNER." : ".$owner;
if ($this->UserIsAdmin()) {
$barreredactionelements['linkacls'] = $this->href("acls", $page);
$barreredactionelements['owner'] .= ' - '.TEMPLATE_PERMISSIONS;
}
else {
//$barreredactionelements['linkacls'] = $this->href('', $owner);
}
}
else {
$barreredactionelements['owner'] = TEMPLATE_NO_OWNER.($this->GetUser() ? " - ".TEMPLATE_CLAIM : "");
if ($this->GetUser()) $barreredactionelements['linkacls'] = $this->href("claim", $page);
//else $barreredactionelements['linkacls'] = $this->href("claim", $page);
}
}
 
}
$barreredactionelements['linkreferrers'] = $this->href("referrers", $page);
$barreredactionelements['linkdiaporama'] = $this->href("diaporama", $page);
$barreredactionelements['linkshare'] = $this->href("share", $page);
include_once('tools/templates/libs/squelettephp.class.php');
$barreredactiontemplate = new SquelettePhp('tools/templates/presentation/templates/'.$template);
$barreredactiontemplate->set($barreredactionelements);
echo $barreredactiontemplate->analyser();
}
 
?>
/branches/v1.0-pithivier/tools/pages/desc.xml
New file
0,0 → 1,6
<?xml version="1.0" encoding="ISO-8859-1"?>
<plugin name="nbrepages" version="0.1" active="1">
<author>Jean-Pascal MILCENT</author>
<label>Nombre de pages</label>
<desc>Actions affichant le nombre de page du Wikini.</desc>
</plugin>
/branches/v1.0-pithivier/tools/pages/index.php
New file
0,0 → 1,10
<?php
// Administration
 
 
// Vérification de sécurité
if (!defined("TOOLS_MANAGER"))
{
die ("acc&egrave;s direct interdit");
}
?>
/branches/v1.0-pithivier/tools/pages/actions/nbrepages.php
New file
0,0 → 1,6
<?php
$res = $this->LoadSingle("SELECT count(distinct tag) as nbrPg FROM ".$this->config["table_prefix"]."pages ;");
if ($res) {
echo $res["nbrPg"];
}
?>
/branches/v1.0-pithivier/tools/actions/desc.xml
New file
0,0 → 1,6
<?xml version="1.0" encoding="ISO-8859-1"?>
<plugin name="actions" version="0.1" active="1">
<author>Jean-Pascal MILCENT</author>
<label>Actions supplementaires ou de rempalcement</label>
<desc>Plugin fournissant de nouvelles actions a Wikini.</desc>
</plugin>
/branches/v1.0-pithivier/tools/actions/index.php
New file
0,0 → 1,10
<?php
// Administration
 
 
// Vérification de sécurité
if (!defined("TOOLS_MANAGER"))
{
die ("acc&egrave;s direct interdit");
}
?>
/branches/v1.0-pithivier/tools/actions/actions/usersdeleting.php
New file
0,0 → 1,358
<?php
/*
usersdeleting.php
 
Copyright 2002 Patrick PAUL
Copyright 2003 David DELON
* Copyright 2013 Jean-Pascal MILCENT
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
// Data managment
$origineLink = $this->Href();
$messages = array();
if ($this->UserIsAdmin() === false) {
$msg = "Il est nécessaire d'être administrateur de ce wikini pour accéder à la gestion des utilisateurs.";
$messages[] = array('type' => 'warning', 'txt' => $msg);
} else {
$msg_accueil = "Zone de sécurité renforcé : identifiez vous avec l'identifiant et le mot de passe de connexion à la base de données de ce Wikini";
$msg_echec = "Accès limité aux administrateurs de ce Wikini ayant accès aux paramètres d'installation (identifiant et mot de passe de la base de données).\n".
"Votre tentative d'identification a échoué.\n".
"Actualiser la page pour essayer à nouveau si vous avez en votre possession les paramètres nécessaires.";
$wikiAuthHttp = new WikiAuthHttp($msg_accueil, $msg_echec, $this->config['mysql_user'], $this->config['mysql_password']);
$wikiAuthHttp->authentifier();
$prefix = $this->config['table_prefix'];
// Data update, insert or delete
if (isset($_POST['action'])) {
if ($_POST['action'] == 'deleteUser') {
if (isset($_POST['users']) === false) {
$messages[] = array('type' => 'error', 'txt' => 'Veuillez sélectionner au moins un utilisateur.');
} else {
$usersDeleted = array();
$usersEscaped = array();
foreach ($_POST['users'] as $user_name) {
$usersDeleted[] = $user_name;
$usersEscaped[] = "'".mysql_real_escape_string($user_name)."'";
}
$sqlUsersToDelete = implode(',', $usersEscaped);
}
$queryDeleteUser = "DELETE FROM {$prefix}users ".
"WHERE name IN ($sqlUsersToDelete) ";
$this->Query($queryDeleteUser);
$usersDeleted = implode(', ', $usersDeleted);
if (empty($usersDeleted) == false) {
$msg = "Les utilisateurs suivant ont été supprimés : $usersDeleted.";
$messages[] = array('type' => 'success', 'txt' => $msg);
}
} else if ($_POST['action'] == 'deletePage') {
$deletedPages = array();
if (!empty($_POST['suppr'])) {
foreach ($_POST['suppr'] as $page) {
// Effacement de la page en utilisant la méthode DeleteOrphanedPage
$this->DeleteOrphanedPage($page);
$deletedPages[] = $page;
}
$deletedPages = implode(', ', $deletedPages);
if (empty($deletedPages) == false) {
$msg = "Les pages suivantes ont été supprimées : $deletedPages.";
$messages[] = array('type' => 'success', 'txt' => $msg);
}
}
$restoredPages = array();
if (!empty($_POST['rev'])) {
foreach ($_POST['rev'] as $rev_id) {
// Sélectionne la révision
$id = "'".mysql_real_escape_string($rev_id)."'";
$query = 'SELECT * '.
"FROM {$prefix}pages ".
"WHERE id = $id ".
'LIMIT 1';
$revision = $this->LoadSingle($query);
 
// Fait de la dernière version de cette révision une version archivée
$tag = "'".mysql_real_escape_string($revision['tag'])."'";
$queryUpdate =
"UPDATE {$prefix}pages " .
"SET latest = 'N' ".
"WHERE latest = 'Y' " .
"AND tag = $tag " .
"LIMIT 1";
$this->Query($queryUpdate);
$restoredPages[] = $revision['tag'];
// add new revision
$owner = "'".mysql_real_escape_string($revision['owner'] )."'";
$user = "'".mysql_real_escape_string('WikiAdmin')."'";
$body = "'".mysql_real_escape_string(chop($revision['body']))."'";
$queryInsert = "INSERT INTO {$prefix}pages SET ".
"tag = $tag, ".
"time = NOW(), ".
"owner = $owner, ".
"user = $user, ".
"latest = 'Y', ".
"body = $body";
$this->Query($queryInsert);
}
}
$restoredPages = implode(', ', $restoredPages);
if (empty($restoredPages) == false) {
$msg = "Les pages suivantes ont été restaurées à une version antérieure: $restoredPages.";
$messages[] = array('type' => 'success', 'txt' => $msg);
}
}
}
// Data loading
$queryAllUsers = 'SELECT name, email, motto, revisioncount, changescount, doubleclickedit, signuptime, show_comments '.
"FROM {$prefix}users ".
'ORDER BY signuptime DESC';
$users = $this->LoadAll($queryAllUsers);
$users_infos = array();
foreach($users as $user) {
$user_name = mysql_real_escape_string($user['name']);
$result = $this->LoadSingle("SELECT COUNT(*) AS pages FROM {$prefix}pages WHERE user = '$user_name'");
$user['pages_user'] = $result['pages'];
$result = $this->LoadSingle("SELECT COUNT(*) AS pages FROM {$prefix}pages WHERE latest = 'Y' AND owner = '$user_name'");
$user['pages_owner'] = $result['pages'];
$user['has_pages'] = ($user['pages_user'] != 0 || $user['pages_owner'] != 0) ? true : false;
$user['pages_link'] = $this->Href('', '', "action=seeUserPage&user={$user['name']}");
$users_infos[] = $user;
}
if (count($users_infos) == 0) {
$msg = "Ce Wikini ne possède pas d'utilisateur";
$messages[] = array('type' => 'info', 'txt' => $msg);
}
if (isset($_GET['action'])) {
if ($_GET['action'] == 'seeUserPage' && $_GET['user'] != '') {
$actionLink = $this->Href('', '', "action=seeUserPage&user={$_GET['user']}");
$userPages['name'] = $_GET['user'];
$userName = "'".mysql_real_escape_string($_GET['user'])."'";
$queryAllUserPages = "SELECT tag ".
"FROM {$prefix}pages ".
"WHERE owner = $userName OR ".
" user = $userName ".
"ORDER BY time DESC ";
$pages = $this->LoadAll($queryAllUserPages);
if (count($pages) == 0) {
$msg = "Cet utilisateur ne possède plus aucune page.";
$messages[] = array('type' => 'error', 'txt' => $msg);
} else {
foreach ($pages as $page) {
if (! isset($userPages['pages'][$page['tag']])) {
$pageTag = "'".mysql_real_escape_string($page['tag'])."'";
$infos = $this->LoadSingle("SELECT * FROM {$prefix}pages WHERE tag = $pageTag AND latest = 'Y'");
$infos['link'] = $this->Href('', $page['tag']);
$infos['revisions'] = $this->LoadAll("SELECT * FROM {$prefix}pages WHERE tag = $pageTag ORDER BY time DESC");
$userPages['pages'][$page['tag']] = $infos;
}
}
}
}
}
}
 
// Template HTML
$html = '';
if ($_GET['action'] == 'seeUserPage') {
$html .= '<ul class="breadcrumb">
<li>Retour&nbsp;:&nbsp;</li>
<li><a href="'.$origineLink.'">Gestion des utilisateurs</a> <span class="divider">&gt;</span></li>
<li class="active">Pages utilisateur '.$userPages['name'].'</li>
</ul>';
}
$html .= '<h2>Gestion des utilisateurs</h2>';
 
if (count($messages) != 0) {
foreach ($messages as $msg) {
$html .= '<p class="alert alert-'.$msg['type'].'">';
$html .= $msg['txt'].'<br />';
$html .= '</p>';
}
}
if ($this->UserIsAdmin()) {
if ($_GET['action'] == 'seeUserPage' && isset($userPages)) {
if (count($userPages['pages']) > 0) {
$html .= '<h3 id="user-pages-modal-label">'."Pages de l'utilisateur {$userPages['name']}".'</h3>'.
'<p class="alert alert-info">Sélectionnez une ou plusieurs pages à supprimer et/ou versions à restaurer puis cliquer sur le bouton en bas de page.</p>';
$html .= '<form action="'.$actionLink.'" method="post">';
$html .= '<table class="table table-bordered">
<thead>
<tr>
<th>[supprimer] Page</th>
<th>Propriétaire</th>
<th>[restaurer] Version du</th>
<th>Auteur modification</th>
</tr>
</thead>';
foreach ($userPages['pages'] as $page) {
$html .= '<tr class="success">'.
'<td>'.
'<span class="has-tooltip" title="Supprimer la page '.$page['tag'].' et toutes ses versions !">'.
'<input name="suppr[]" value="'.$page['tag'].'" type="checkbox"/>'.
'</span> '.
'<a href="'.$page['link'].'">'.
$page['tag'].
'</a>'.
'</td>'.
'<td>'.$page['owner'].'</td>'.
'<td>'.$page['time'].'</td>'.
'<td>'.$page['user'].'</td>'.
'</tr>';
$revisionsNbre = count($page['revisions']);
if ($revisionsNbre != 0) {
for ($i = 1; $i < $revisionsNbre; $i++) {
$revision = $page['revisions'][$i];
$html .= '<tr>'.
'<td>&nbsp;</td>'.
'<td>'.$revision['owner'].'</td>'.
'<td>'.
'<span class="has-tooltip" title="Restaurer la version du '.$revision['time'].' de la page '.$page["tag"].'">'.
'<input name="rev[]" value="'.$revision['id'].'" type="checkbox"/> '.
'</span>'.
$revision['time'].
'</td>'.
'<td>'.$revision['user'].'</td>'.
'</tr>';
}
}
}
$html .= '</table>
<div class="form-actions">
<button class="btn btn-danger has-tooltip" type="submit" name="action" value="deletePage" title="Supprime les pages sélectionnés ou restaure des anciennes versions">
Supprimer des pages et/ou restaurer des versions
</button>
</div>
</form>';
}
} else {
$html .= '<form action="'.$origineLink.'" method="post">';
$html .= '<p class="alert alert-info">Sélectionnez un ou plusieurs utilisateurs à supprimer puis cliquer sur le bouton supprimer en bas de page.</p>
<table class="table table-striped table-hover table-bordered table-condensed">
<thead>
<tr>
<th>&nbsp;</th>
<th>Nom & Devise</th>
<th>Courriel</th>
<th>Inscription</th>
<th>
<span class="has-tooltip" title="Nombre de pages (hors archive) dont l\'utilisateur est le propriétaire.">Pages proprio.</span>
/
<span class="has-tooltip" title="Nombre de pages toutes versions confondues modifiées par l\'utilisateur.">Modif.</span>
</th>
<th>
<span class="has-tooltip" title="Nombre de révisions visible par l\'utilisateur">révisions</span> /
<span class="has-tooltip" title="Nombre de changements visible par l\'utilisateur">changements</span> /
<span class="has-tooltip" title="L\'utilisateur peut éditer les page en réalisant un double clic.">clic</span> /
<span class="has-tooltip" title="L\'utilisateur veut voir les commentaires sur la page.">commentaire</span>
</th>
</tr>
</thead>
<tbody>';
if (isset($users_infos)) {
foreach ($users_infos as $user) {
$html .= '<tr>
<td><input type="checkbox" name="users[]" value="'.$user['name'].'"/></td>
<td>'.
$user['name'].
(empty($user['motto']) ? '' : '<br /><em><cite>'.$user['motto'].'</cite></em>').
'</td>
<td><a href="mailto:'.$user['email'].'">'.$user['email'].'</a></td>
<td>'.$user['signuptime'].'</td>
<td>'.
($user['has_pages'] ? '<a href="'.$user['pages_link'].'">' : '').
$user['pages_owner'].' / '.$user['pages_user'].
($user['has_pages'] ? '</a>' : '').
'</td>
<td>'.$user['revisioncount'].' / '.$user['changescount'].' / '.$user['doubleclickedit'].' / '.$user['show_comments'].'</td>
</tr>';
}
}
$html .= '</tbody>
</table>
<div class="form-actions">
<button class="btn btn-danger has-tooltip" type="submit" name="action" value="deleteUser" title="Supprime les utilisateurs sélectionnés de la base de données">
Supprimer des utilisateurs
</button>
</div>
</form>';
}
}
 
// Sortie
echo isset($this->config['encoding']) ? mb_convert_encoding($html, $this->config['encoding'], 'iso-8859-15') : $html;
 
// Functions & class
class WikiAuthHttp {
private $message_accueil;
private $message_echec;
private $identifiant;
private $mot_de_passe;
public function __construct($message_accueil, $message_echec, $identifiant, $mot_de_passe) {
$this->message_accueil = $message_accueil;
$this->message_echec = $message_echec;
$this->identifiant = $identifiant;
$this->mot_de_passe = $mot_de_passe;
}
public function authentifier() {
$authentifie = $this->etreAutorise();
if ($authentifie === false) {
$this->envoyerAuth();
}
return $authentifie;
}
 
private function envoyerAuth() {
header('HTTP/1.0 401 Unauthorized');
header('WWW-Authenticate: Basic realm="'.$this->message_accueil.'"');
header('Content-type: text/plain; charset=ISO-8859-15');
print $this->message_echec;
exit(0);
}
 
private function etreAutorise() {
$identifiant = $this->getAuthIdentifiant();
$mdp = $this->getAuthMotDePasse();
$autorisation = ($identifiant == $this->identifiant && $mdp == $this->mot_de_passe) ? true : false;
return $autorisation;
}
 
private function getAuthIdentifiant() {
$id = (isset($_SERVER['PHP_AUTH_USER'])) ? $_SERVER['PHP_AUTH_USER'] : null;
return $id;
}
 
private function getAuthMotDePasse() {
$mdp = (isset($_SERVER['PHP_AUTH_PW'])) ? $_SERVER['PHP_AUTH_PW'] : null;
return $mdp;
}
}
?>
/branches/v1.0-pithivier/tools/actions/actions/recentchangesrss.php
New file
0,0 → 1,173
<?php
/*
recentchangesrss.php
 
Copyright 2003 David DELON
Copyright 2005-2007 Didier LOISEAU
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
if (!defined("WIKINI_VERSION"))
{
die ("acc&egrave;s direct interdit");
}
 
if ($this->GetMethod() != 'xml') {
echo 'Pour obtenir le fil RSS des derniers changements, utilisez l\'adresse suivante: ';
echo $this->Link($this->Href('xml'));
return;
}
 
 
if (!function_exists("rssdiff")) {
 
function rssdiff($tag,$idfirst,$idlast) {
 
require_once 'includes/diff/side.class.php';
require_once 'includes/diff/diff.class.php';
require_once 'includes/diff/diffformatter.class.php';
 
$output='';
global $wiki;
// TODO : cache ?
 
if ($idfirst==$idlast) {
$previousdiff=$wiki->LoadSingle("select id from ".$wiki->config["table_prefix"]."pages where tag = '".mysql_escape_string($tag)."' and id < $idfirst order by time desc limit 1");
if ($previousdiff) {
$idlast=$previousdiff['id'];
}
else {
return;
}
 
}
 
$pageA = $wiki->LoadPageById($idfirst);
$pageB = $wiki->LoadPageById($idlast);
 
 
$bodyA = explode("\n", $pageA["body"]);
$bodyB = explode("\n", $pageB["body"]);
 
$added = array_diff($bodyA, $bodyB);
$deleted = array_diff($bodyB, $bodyA);
if (!isset($output)) $output = '';
 
$output .= "<br />\n";
$output .= "<br />\n";
$output .= "<b>Comparaison de <a href=\"".$wiki->href("", "", "time=".urlencode($pageA["time"]))."\">".$pageA["time"]."</a> &agrave; <a href=\"".$wiki->href("", "", "time=".urlencode($pageB["time"]))."\">".$pageB["time"]."</a></b><br />\n";
 
$wiki->RegisterInclusion($tag);
if ($added)
{
// remove blank lines
$output .= "<br />\n<b>Ajouts:</b><br />\n";
$output .= "<div class=\"additions\">".(implode("\n", $added))."</div>";
}
 
if ($deleted)
{
$output .= "<br />\n<b>Suppressions:</b><br />\n";
$output .= "<div class=\"deletions\">".(implode("\n", $deleted))."</div>";
}
$wiki->UnregisterLastInclusion();
 
if (!$added && !$deleted)
{
$output .= "<br />\nPas de diff&eacute;rences.";
}
return $output;
 
}
}
 
if (isset($_GET['max']) && is_numeric($_GET['max'])) {
$max = ($_GET['max'] < 1000) ? $_GET['max'] : 1000;
} else if ($user = $this->GetUser()) {
$max = $user["changescount"];
} else {
$max = 50;
}
$pages = $this->LoadAll("SELECT id, tag, time, user, owner FROM ".$this->config["table_prefix"]."pages WHERE comment_on = '' ORDER BY time DESC LIMIT $max");
$last_users = $this->LoadAll('SELECT name, signuptime, motto FROM '.$this->GetConfigValue('table_prefix').'users ORDER BY signuptime DESC LIMIT '.$max);
if ($pages || $last_users) {
 
if (!($link = $this->GetParameter("link"))) $link=$this->GetConfigValue("root_page");
$output = '<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">' . "\n";
$output .= "<channel>\n";
$output .= "<atom:link href=\"".$this->Href("xml")."\" rel=\"self\" type=\"application/rss+xml\" />\n";
$output .= "<title> ". htmlspecialchars($this->GetConfigValue("wakka_name"), ENT_COMPAT, TEMPLATES_DEFAULT_CHARSET) . "</title>\n";
$output .= "<link>" . $this->Href(false, $link) . "</link>\n";
$output .= "<description>$max derniers changements sur " . htmlspecialchars($this->GetConfigValue("wakka_name"), ENT_COMPAT, TEMPLATES_DEFAULT_CHARSET) . "</description>\n";
$output .= "<language>fr</language>\n";
$output .= '<generator>WikiNi ' . WIKINI_VERSION . "</generator>\n";
 
$items = array();
if ($pages) {
foreach ($pages as $page) {
$page['diff'] = rssdiff($page["tag"], $page["id"], $page["id"]);
 
$items[strtotime($page['time'])] = array('type' => 'page', 'content' => $page);
}
}
 
if ($last_users) {
foreach ($last_users as $user) {
$items[strtotime($user['signuptime'])] = array('type' => 'user', 'content' => $user);
}
}
krsort($items);
 
foreach ($items as $item) {
$type = $item['type'];
if ($type == 'page') {
$page = $item['content'];
 
$output .= "<item>\n";
$output .= "<title>" . htmlspecialchars($page["tag"], ENT_COMPAT, TEMPLATES_DEFAULT_CHARSET) . "</title>\n";
$output .= '<dc:creator>' . htmlspecialchars($page["user"], ENT_COMPAT, TEMPLATES_DEFAULT_CHARSET) . "</dc:creator>\n";
$output .= '<pubDate>' . gmdate('D, d M Y H:i:s \G\M\T', strtotime($page['time'])) . "</pubDate>\n";
$output .= "<description>" . htmlspecialchars(
'Modification de ' . $this->ComposeLinkToPage($page["tag"]).
' (' . $this->ComposeLinkToPage($page["tag"], 'revisions', 'historique') . ')'.
' --- par ' . $page["user"].
$page['diff']).
"</description>\n";
$output .= "<dc:format>text/html</dc:format>";
 
$itemurl = $this->href(false, $page["tag"], "time=" . htmlspecialchars(rawurlencode($page["time"]), ENT_COMPAT, TEMPLATES_DEFAULT_CHARSET));
$output .= '<guid>' . $itemurl . "</guid>\n";
$output .= "</item>\n";
} else if ($type == 'user') {
$user = $item['content'];
$itemurl = $this->Href('', $user['name']);
 
$output .= '<item>'."\n";
$output .= '<title>'.'Utilisateur '.htmlspecialchars($user['name']).' - inscription le '.$user['signuptime'].'</title>'."\n";
$output .= '<link>'.$itemurl.'</link>'."\n";
$output .= '<pubDate>' . gmdate('D, d M Y H:i:s \G\M\T', strtotime($user['signuptime'])) . "</pubDate>\n";
$output .= '<description>'.'L\'utilisateur '.htmlspecialchars($user['name']).' s\'est inscrit le '.$user['signuptime'];
if (!empty($user['motto'])) {
$output .= ' avec pour devise "'.htmlspecialchars($user['motto']).'"';
}
$output .= '</description>'."\n";
$output .= '<guid>'.$itemurl.'</guid>'."\n";
$output .= '</item>'."\n";
}
}
$output .= "</channel>\n";
$output .= "</rss>\n";
echo $output;
}
?>
/branches/v1.0-pithivier/tools/handlers/desc.xml
New file
0,0 → 1,6
<?xml version="1.0" encoding="ISO-8859-1"?>
<plugin name="handlers" version="0.1" active="1">
<author>Jean-Pascal MILCENT</author>
<label>Handlers supplementaires</label>
<desc>Plugin fournissant de nouveaux handlers a Wikini.</desc>
</plugin>
/branches/v1.0-pithivier/tools/handlers/index.php
New file
0,0 → 1,8
<?php
// Administration
 
// Vérification de sécurité
if (!defined("TOOLS_MANAGER")) {
die ("acc&egrave;s direct interdit");
}
?>
/branches/v1.0-pithivier/tools/handlers/handlers/page/raw_html_txt.php
New file
0,0 → 1,31
<?php
// declare(encoding='ISO-8859-1');
/**
* Handler renvoyant au navigateur le contenu HTML de la page wiki avec un type mime text/plain.
*
* @category PHP 5.2
* @package Framework
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright Copyright (c) 2009, Tela Botanica (accueil@tela-botanica.org)
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL-v3
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL-v2
* @version $Id$
*/
 
 
//Vérification de sécurité
if (!eregi("wakka.php", $_SERVER['PHP_SELF'])) {
die ("Acc&eacute;s direct interdit");
}
 
if ($this->HasAccess('read')) {
if (!$this->page) {
return;
} else {
header("Content-type: text/plain");
echo $this->Format($this->page["body"], "wakka");
}
} else {
return;
}
?>
/branches/v1.0-pithivier/tools/handlers/handlers/page/raw_html.php
New file
0,0 → 1,40
<?php
// declare(encoding='ISO-8859-1');
/**
* Handler renvoyant au navigateur le contenu HTML de la page wiki.
*
* @category PHP 5.2
* @package Framework
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright Copyright (c) 2009, Tela Botanica (accueil@tela-botanica.org)
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL-v3
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL-v2
* @version $Id$
*/
 
 
//Vérification de sécurité
if (!eregi("wakka.php", $_SERVER['PHP_SELF'])) {
die ("Acc&eacute;s direct interdit");
}
if ($this->HasAccess("read")) {
if (!$this->page) {
return;
} else {
header("Content-type: text/html");
// Affichage de la page HTML
$html = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'."\n";
$html .= '<html>'."\n";
$html .= ' <head>'."\n";
$html .= ' <title>'.$this->GetPageTag().'</title>'."\n";
$html .= ' </head>'."\n";
$html .= ' <body>'."\n";
$html .= $this->Format($this->page["body"], "wakka");
$html .= ' </body>'."\n";
$html .= '</html>';
echo $html;
}
} else {
return;
}
?>
/branches/v1.0-pithivier/tools/handlers/handlers/page/deletepage.php
New file
0,0 → 1,110
<?php
/*
$Id: deletepage.php 858 2007-11-22 00:46:30Z nepote $
Copyright 2002 David DELON
Copyright 2003 Eric FELDSTEIN
Copyright 2004 Jean Christophe ANDRÉ
Copyright 2006 Didier Loiseau
Copyright 2007 Charles NÉPOTE
Copyright 2013 Jean-Pascal MILCENT
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
// Vérification de sécurité
if (!defined('WIKINI_VERSION'))
{
die ('Accès direct interdit');
}
print_r($_POST);
if ($this->UserIsOwner() || $this->UserIsAdmin())
{
$deletePage = false;
$tag = $this->GetPageTag();
if ($this->IsOrphanedPage($this->GetPageTag()))
{
if ($_POST['confirme'] == 'Oui') {
$deletePage = true;
}
else
{
$pageLink = $this->Link($tag);
$actionLink = $this->Href('deletepage');
$cancelLink = $this->Href();
 
$msg .= '<form action="'.$actionLink.'" method="post" style="display: inline">'."\n".
'<p class="alert alert-warning">Voulez-vous supprimer définitivement la page '.$pageLink.' &nbsp;?<br/>'."\n".
'<button class="btn btn-danger" name="confirme" value="Oui" type="submit">Oui</button>'."\n".
'<a class="btn" href="'.$cancelLink.'">Non</a>'."\n".
'</p>'."\n".
'</form>'."\n";
}
}
else
{
if ($_POST['confirme'] == 'Oui') {
$deletePage = true;
}
else
{
$pageTag = $this->GetPageTag();
$tablePrefix = $this->config["table_prefix"];
$query = "SELECT DISTINCT from_tag ".
"FROM {$tablePrefix}links ".
"WHERE to_tag = '$pageTag'";
$linkedFrom = $this->LoadAll($query);
$pageLink = $this->ComposeLinkToPage($this->tag, "", "", 0);
 
$msg = '<p><em>Cette page n\'est pas orpheline.</em></p>'."\n".
'<p>Pages ayant un lien vers '.$pageLink.' :</p>'."\n".
'<ul>'."\n";
foreach ($linkedFrom as $page)
{
$currentPageLink = $this->ComposeLinkToPage($page['from_tag'], '', '', 0);
$msg .= '<li>'.$currentPageLink.'</li>'."\n";
}
$msg .= '</ul>'."\n";
 
if ($this->UserIsAdmin()) {
$actionLink = $this->Href('deletepage');
$cancelLink = $this->Href();
$msg .= '<form action="'.$actionLink.'" method="post" style="display: inline">'."\n".
'<p class="alert alert-warning">En tant qu\'administrateur, vous pouvez supprimer malgré tout la page.<br/>'.
'Cela laissera des liens de type "page à créer" dans les pages listées ci-dessus.<br/>'.
'Voulez-vous supprimer définitivement la page '.$pageLink.' &nbsp;?<br/>'."\n".
'<button class="btn btn-danger" name="confirme" value="Oui" type="submit">Oui</button>'."\n".
'<a class="btn" href="'.$cancelLink.'">Non</a>'."\n".
'</p>'."\n".
'</form>'."\n";
}
}
}
 
if ($deletePage == true) {
$this->DeleteOrphanedPage($tag);
$this->LogAdministrativeAction($this->GetUserName(), "Suppression de la page ->\"\"" . $tag . "\"\"");
$msg = '<p class="alert alert-info">'."La page ${tag} a été définitivement supprimée.".'</p>';
}
}
else
{
$msg = '<p class="alert alert-warning"><em>'."Vous n'êtes pas le propriétaire de cette page.".'</em></p>'."\n";
}
 
echo $this->Header();
echo '<div class="page">'."\n";
echo $msg;
echo '</div>'."\n";
echo $this->Footer();
?>
/branches/v1.0-pithivier/tools/handlers/handlers/page/api.php
New file
0,0 → 1,24
<?php
// declare(encoding='UTF-8');
/**
* Handler renvoyant au navigateur le contenu HTML de la page wiki.
*
* @category PHP 5.2
* @package Framework
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright Copyright (c) 2009, Tela Botanica (accueil@tela-botanica.org)
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL-v3
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL-v2
* @version $Id$
*/
//Vérification de sécurité
if (!eregi("wakka.php", $_SERVER['PHP_SELF'])) {
die ("Acc&eacute;s direct interdit");
}
$chemin = dirname(__FILE__).DIRECTORY_SEPARATOR.'../../rest/index.php';
if (!file_exists($chemin)) {
$e = "Veuillez paramétrer l'emplacement de l'api : $chemin";
} else {
include $chemin;
}
?>
/branches/v1.0-pithivier/tools/cms_navigation/desc.xml
New file
0,0 → 1,6
<?xml version="1.0" encoding="ISO-8859-1"?>
<plugin name="wknavigation" version="0.1" active="1">
<author>Philippe Drouot</author>
<label>Navigation</label>
<desc>Menu de navigation pour Wikini</desc>
</plugin>
/branches/v1.0-pithivier/tools/cms_navigation/index.php
New file
0,0 → 1,30
<?php
// Administration
 
 
// Vérification de sécurité
if (!defined("TOOLS_MANAGER"))
{
die ("acc&egrave;s direct interdit");
}
 
 
buffer::str(
'
Ajouter les lignes suivantes dans le fichier wakka.css pour personnaliser
votre menu de navigation :
<br>
<code>
.page_table {margin: 0px; padding: 0px ; border: none; height: 100%;width: 100%;}
<br>
.menu_column {background-color: #FFFFCC; vertical-align: top; width: 150px; border: 1px solid #000000;padding:5px;}
<br>
.body_column {vertical-align: top; border: none;padding:5px;}
<br>
</code>
'
 
 
);
 
?>
/branches/v1.0-pithivier/tools/cms_navigation/actions/footer__.php
New file
0,0 → 1,12
<?
 
if (!defined("WIKINI_VERSION"))
{
die ("acc&egrave;s direct interdit");
}
 
$menu_page=$this->config["menu_page"];
if (isset($menu_page) and ($menu_page!="")) {
$plugin_output_new = preg_replace ('/<\/body>/','</div><!-- Fermeture du div corps -->'."\n".'</body>', $plugin_output_new);
}
?>
/branches/v1.0-pithivier/tools/cms_navigation/actions/header__.php
New file
0,0 → 1,45
<?php
 
if (!defined("WIKINI_VERSION")) {
die ("acc&egrave;s direct interdit");
}
 
if (version_compare(phpversion(), '5.0') < 0) {
eval('
if (!function_exists("clone")) {
function clone($object) {
return $object;
}
}
');
}
 
$user = $this->GetUser();
$menu_page = $this->config["menu_page"];
$menu_page_admin = $this->config["menu_page_admin"];
if (isset($menu_page) and ($menu_page!="")) {
// Ajout Menu de Navigation
$wikiMenu = clone($this);
$wikiMenu->tag = $menu_page;
$wikiMenu->tag_admin = $menu_page_admin;
$wikiMenu->SetPage($wikiMenu->LoadPage($wikiMenu->tag));
$menu_normal = $wikiMenu->Format($wikiMenu->page['body'], 'wakka');
$menu_admin = '';
if ($user) {
$wikiMenu->tag = $menu_page_admin;
$wikiMenu->SetPage($wikiMenu->LoadPage($wikiMenu->tag));
$menu_admin = $wikiMenu->Format($wikiMenu->page['body'], 'wakka');
}
$plugin_output_new = preg_replace ('/<!-- NAVIGATION -->/',
'<div id="navigation">'.
' <div id="menu">'."\n".
' <h2 id="titre_menu"><span id="menu_debut"> Menu </span></h2>'."\n".
$menu_normal.$menu_admin.
"\n".' <h2 id="titre_contenu"><span id="menu_fin"> Contenu </span></h2>'.
"\n".' </div>'."\n".
"\n".'</div>'."\n".
'<div id="corps">'."\n",
$plugin_output_new);
}
?>
/branches/v1.0-pithivier/tools/cms_navigation/wiki.php
New file
0,0 → 1,24
<?php
// Partie publique
if (!defined("WIKINI_VERSION"))
{
die ("acc&egrave;s direct interdit");
}
$wakkaConfig['menu_page'] = 'PageMenu';
$wakkaConfig['menu_page_admin'] = 'PageMenuAdmin';
$wakkaConfig['banniere_page'] = 'PageBanniere';
 
 
// Surcharge fonction LoadRecentlyChanged : suppression remplissage cache car affecte le rendu de la navigation.
$wikiClasses [] = 'Navigation';
$wikiClassesContent [] = '
function LoadRecentlyChanged($limit=50)
{
$limit= (int) $limit;
if ($pages = $this->LoadAll("select id, tag, time, user, owner from ".$this->config["table_prefix"]."pages where latest = \'Y\' and comment_on = \'\' order by time desc limit $limit"))
{
return $pages;
}
}
';
?>
/branches/v1.0-pithivier/tools/cms/desc.xml
New file
0,0 → 1,6
<?xml version="1.0" encoding="ISO-8859-1"?>
<plugin name="wkzcms" version="0.1" active="1">
<author>Jean-Pascal MILCENT</author>
<label>Actions pour transformer Wikini en CMS</label>
<desc>Deux actions permettant de transformer un Wikini en CMS.</desc>
</plugin>
/branches/v1.0-pithivier/tools/cms/index.php
New file
0,0 → 1,10
<?php
// Administration
 
 
// Vérification de sécurité
if (!defined("TOOLS_MANAGER"))
{
die ("acc&egrave;s direct interdit");
}
?>
/branches/v1.0-pithivier/tools/cms/actions/header__.php
New file
0,0 → 1,23
<?php
 
if (!defined("WIKINI_VERSION"))
{
die ("acc&egrave;s direct interdit");
}
 
$user = $this->GetUser();
$root_page = $this->ComposeLinkToPage($this->config["root_page"]);
$navigation_links = $this->config["navigation_links"] ? $this->Format($this->config["navigation_links"]) : "";
$user_name = $this->Format($this->GetUserName());
$disconnect_link = $this->GetUser() ? '(<a href="' . $this->href('', 'Identification', 'action=logout') . "\">D&eacute;connexion</a>)\n" : '';
 
if ($user) {
$plugin_output_new = preg_replace ('/<!-- ADMIN -->/',
'<div class="header">'.
$root_page.' :: '.$navigation_links.' :: '.'Vous &ecirc;tes '.$user_name.' '.$disconnect_link.
'</div>
<div class="page"',
$plugin_output_new);
}
 
?>
/branches/v1.0-pithivier/tools/cms/actions/identification.php
New file
0,0 → 1,203
<?php
if ($_REQUEST["action"] == "logout") {
echo 'ici';
$this->LogoutUser();
$this->SetMessage("Vous êtes maintenant déconnecté !");
$this->Redirect($this->href());
} else if ($user = $this->GetUser()) {
// is user trying to update?
if ($_REQUEST["action"] == "update")
{
$this->Query("update ".$this->config["table_prefix"]."users set ".
"email = '".mysql_escape_string($_POST["email"])."', ".
"doubleclickedit = '".mysql_escape_string($_POST["doubleclickedit"])."', ".
"show_comments = '".mysql_escape_string($_POST["show_comments"])."', ".
"revisioncount = '".mysql_escape_string($_POST["revisioncount"])."', ".
"changescount = '".mysql_escape_string($_POST["changescount"])."', ".
"motto = '".mysql_escape_string($_POST["motto"])."' ".
"where name = '".$user["name"]."' limit 1");
$this->SetUser($this->LoadUser($user["name"]));
// forward
$this->SetMessage("Paramètres sauvegardés !");
$this->Redirect($this->href());
}
if ($_REQUEST["action"] == "changepass")
{
// check password
$password = $_POST["password"];
if (preg_match("/ /", $password)) $error = "Les espaces ne sont pas permis dans les mots de passe.";
else if (strlen($password) < 5) $error = "Password too short.";
else if ($user["password"] != md5($_POST["oldpass"])) $error = "Mauvais mot de passe.";
else
{
$this->Query("update ".$this->config["table_prefix"]."users set "."password = md5('".mysql_escape_string($password)."') "."where name = '".$user["name"]."'");
$this->SetMessage("Mot de passe changé !");
$user["password"]=md5($password);
$this->SetUser($user);
$this->Redirect($this->href());
}
}
// user is logged in; display config form
print($this->FormOpen());
?>
<input type="hidden" name="action" value="update" />
<table>
<tr>
<td align="right"></td>
<td>Hello, <?php echo $this->Link($user["name"]) ?>!</td>
</tr>
<tr>
<td align="right">Votre adresse e-mail :</td>
<td><input name="email" value="<?php echo htmlentities($user["email"]) ?>" size="40" /></td>
</tr>
<tr>
<td align="right">Edition en Doublecliquant :</td>
<td><input type="hidden" name="doubleclickedit" value="N" /><input type="checkbox" name="doubleclickedit" value="Y" <?php echo $user["doubleclickedit"] == "Y" ? "checked=\"checked\"" : "" ?> /></td>
</tr>
<tr>
<td align="right">Montrer les commentaires par default :</td>
<td><input type="hidden" name="show_comments" value="N" /><input type="checkbox" name="show_comments" value="Y" <?php echo $user["show_comments"] == "Y" ? "checked\"checked\"" : "" ?> /></td>
</tr>
<tr>
<td align="right">Nombre maximum de derniers commentaires :</td>
<td><input name="changescount" value="<?php echo htmlentities($user["changescount"]) ?>" size="40" /></td>
</tr>
<tr>
<td align="right">Nombre maximum de versions :</td>
<td><input name="revisioncount" value="<?php echo htmlentities($user["revisioncount"]) ?>" size="40" /></td>
</tr>
<tr>
<td align="right">Votre devise :</td>
<td><input name="motto" value="<?php echo htmlentities($user["motto"]) ?>" size="40" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Mise à jour" /> <input type="button" value="Déconnection" onClick="document.location='<?php echo $this->href("", "", "action=logout"); ?>'" /></td>
</tr>
 
<?php
print($this->FormClose());
 
print($this->FormOpen());
?>
<input type="hidden" name="action" value="changepass" />
 
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td align="right"></td>
<td><?php echo $this->Format("Changement de mot de passe"); ?></td>
</tr>
<?php
if ($error)
{
print("<tr><td></td><td><div class=\"error\">".$this->Format($error)."</div></td></tr>\n");
}
?>
<tr>
<td align="right">Votre ancien mot de passe :</td>
<td><input type="password" name="oldpass" size="40" /></td>
</tr>
<tr>
<td align="right">Nouveau mot de passe :</td>
<td><input type="password" name="password" size="40" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Changer" size="40" /></td>
</tr>
</table>
<?php
print($this->FormClose());
 
} else {
// user is not logged in
// is user trying to log in or register?
if ($_REQUEST["action"] == "login")
{
// if user name already exists, check password
if ($existingUser = $this->LoadUser($_POST["name"]))
{
// check password
if ($existingUser["password"] == md5($_POST["password"]))
{
$this->SetUser($existingUser, $_POST["remember"]);
$this->Redirect($this->href());
}
else
{
$error = "Mauvais mot de passe !";
}
}
// otherwise, create new account
else
{
$name = trim($_POST["name"]);
$email = trim($_POST["email"]);
$password = $_POST["password"];
$confpassword = $_POST["confpassword"];
 
// check if name is WikkiName style
if (!$this->IsWikiName($name)) $error = "Votre nom d'utilisateur dois être formaté en NomWiki.";
else if (!$email) $error = "Vous devez spécifier une adresse e-mail.";
else if (!preg_match("/^.+?\@.+?\..+$/", $email)) $error = "Ceci ne ressemble pas à une adresse e-mail.";
else if ($confpassword != $password) $error = "Les mots de passe n'étaient pas identiques";
else if (preg_match("/ /", $password)) $error = "Les espaces ne sont pas permis dans un mot de passe.";
else if (strlen($password) < 5) $error = "Mot de passe trop court. Un mot de passe doit contenir au minimum 5 caractères alphanumériques.";
else
{
$this->Query("insert into ".$this->config["table_prefix"]."users set ".
"signuptime = now(), ".
"name = '".mysql_escape_string($name)."', ".
"email = '".mysql_escape_string($email)."', ".
"password = md5('".mysql_escape_string($_POST["password"])."')");
 
// log in
$this->SetUser($this->LoadUser($name));
 
// forward
$this->Redirect($this->href());
}
}
}
print($this->FormOpen());
?>
<input type="hidden" name="action" value="login" />
<table>
<tr>
<td align="right"></td>
<td><?php echo $this->Format("Si vous êtes déjà enregistré, identifiez-vous ici"); ?></td>
</tr>
<?php
if ($error)
{
print("<tr><td></td><td><div class=\"error\">".$this->Format($error)."</div></td></tr>\n");
}
?>
<tr>
<td align="right">Votre NomWiki :</td>
<td><input name="name" size="40" value="<?php echo $name ?>" /></td>
</tr>
<tr>
<td align="right">Mot de passe (5 caractères minimum) :</td>
<td><input type="password" name="password" size="40" />
<input type="hidden" name="remember" value="0" /><input type="checkbox" name="remember" value="1" /> <?php echo $this->Format("Se souvenir de moi.") ?> </td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Identification" size="40" /></td>
</tr>
</table>
<?php
print($this->FormClose());
}
?>
 
/branches/v1.0-pithivier/tools/cms/actions/textsearch.php
New file
0,0 → 1,111
<?php
/*
textsearch.php
Copyright (c) 2002, Hendrik Mans <hendrik@mans.de>
Copyright 2002, 2003 David DELON
Copyright 2002 Patrick PAUL
Copyright 2004 Jean Christophe ANDRÉ
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
derived from this software without specific prior written permission.
 
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
 
// Contient les pages pouvant être affiché
$tab_pages_ok = array('Accueil', 'Historique', 'Pierres', 'Materiaux', 'ProduitsSemiFinis', 'ProduitsFinis', 'Contacts', 'Telechargement');
 
// label à afficher devant la zone de saisie
$label = $this->GetParameter('label', 'Ce que vous souhaitez chercher&nbsp;: ');
// largeur de la zone de saisie
$size = $this->GetParameter('size', '40');
// texte du bouton
$button = $this->GetParameter('button', 'Chercher');
// texte à chercher
$phrase = $this->GetParameter('phrase', false);
// séparateur entre les éléments trouvés
$separator = $this->GetParameter('separator', false);
 
// se souvenir si c'était un paramètre de l'action ou du CGI
$paramPhrase = $phrase;
// récupérer le paramètre du CGI le cas échéant
if (!$phrase) $phrase = $_REQUEST['phrase'];
 
// s'il y a un paramètre d'action "phrase", on affiche uniquement le résultat
// dans le cas contraire, présenter une zone de saisie
if (!$paramPhrase)
{
echo $this->FormOpen('', '', 'get');
if ($label)
{
echo $this->Format($label), ' ';
}
echo '<input name="phrase" size="', htmlspecialchars($size), '" value="', htmlentities($phrase), '" />';
if ($button)
{
echo '&nbsp;<input type="submit" value="', htmlspecialchars($button), '" />';
}
echo "\n", $this->FormClose();
}
 
if ($phrase) {
if ($results = $this->FullTextSearch($phrase)) {
if ($separator) {
$separator = htmlspecialchars($separator);
if (!$paramPhrase) {
echo '<p>R&eacute;sultat(s) de la recherche de "', htmlspecialchars($phrase), '"&nbsp;: ';
}
foreach ($results as $i => $page) {
if ($i > 0) echo $separator;
echo $this->ComposeLinkToPage($page['tag']);
}
if (!$paramPhrase) {
echo '</p>', "\n";
}
} else {
$ok = false;
foreach ($results as $i => $page) {
foreach ($tab_pages_ok as $tag) {
if ($page["tag"] == $tag) {
$ok = true;
}
}
}
if ($ok) {
echo '<p><strong>R&eacute;sultat(s) de la recherche de "', htmlspecialchars($phrase), '"&nbsp;:</strong></p>', "\n",
'<ol>', "\n";
foreach ($results as $i => $page) {
foreach ($tab_pages_ok as $tag) {
if ($page["tag"] == $tag) {
echo "<li>", $this->ComposeLinkToPage($page["tag"]), "</li>\n";
}
}
}
echo "</ol>\n";
}
}
} else {
if (!$paramPhrase)
{
echo "<p>Aucun r&eacute;sultat pour \"", htmlspecialchars($phrase), "\". :-(</p>";
}
}
}
?>
/branches/v1.0-pithivier/tools/cms/actions/ajoutadmin.php
New file
0,0 → 1,70
<?php
 
// is user trying to log in or register?
if ($_REQUEST["action"] == "ajout") {
$name = trim($_POST["name"]);
$email = trim($_POST["email"]);
$password = $_POST["password"];
$confpassword = $_POST["confpassword"];
// check if name is WikkiName style
if (! $this->IsWikiName($name) ) $error = "Votre nom d'utilisateur dois être formaté en NomWiki.";
else if (!$email) $error = "Vous devez spécifier une adresse e-mail.";
else if (!preg_match("/^.+?\@.+?\..+$/", $email)) $error = "Ceci ne ressemble pas à une adresse e-mail.";
else if ($confpassword != $password) $error = "Les mots de passe n'étaient pas identiques";
else if (preg_match("/ /", $password)) $error = "Les espaces ne sont pas permis dans un mot de passe.";
else if (strlen($password) < 5) $error = "Mot de passe trop court. Un mot de passe doit contenir au minimum 5 caractères alphanumériques.";
else {
$reussite = "L'administrateur a bien été ajouté !";
$this->Query( "insert into ".$this->config["table_prefix"]."users set ".
"signuptime = now(), ".
"name = '".mysql_escape_string($name)."', ".
"email = '".mysql_escape_string($email)."', ".
"password = md5('".mysql_escape_string($_POST["password"])."')");
// log in
//$this->SetUser($this->LoadUser($name));
// forward
//$this->Redirect($this->href());
}
}
 
print($this->FormOpen());
?>
<input type="hidden" name="action" value="ajout" />
<table>
<tr>
<td align="left" colspan="2"><?php echo $this->Format("Pour ajouter un administrateur renseigner les champs ci-dessous:"); ?></td>
</tr>
<?php
if ($error) {
print('<tr><td></td><td><div class="error">'.$this->Format($error)."</div></td></tr>\n");
}
if ($reussite) {
echo('<tr><td></td><td><div class="reussite">'.$this->Format($reussite)."</div></td></tr>\n");
}
?>
<tr>
<td align="right">Votre NomWiki :</td>
<td><input name="name" size="40" value="<?php echo $name ?>" /></td>
</tr>
<tr>
<td align="right">Mot de passe (5 caractères minimum) :</td>
<td><input type="password" name="password" size="40" /></td>
</tr>
<tr>
<td align="right">Confirmation du mot de passe :</td>
<td><input type="password" name="confpassword" size="40" /></td>
</tr>
<tr>
<td align="right">Adresse e-mail :</td>
<td><input name="email" size="40" value="<?php echo $email ?>" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Nouveau compte" size="40" /></td>
</tr>
</table>
<?php
print($this->FormClose());
?>
 
/branches/v1.0-pithivier/tools
New file
Property changes:
Added: svn:ignore
+.buildpath
+.project
/branches/v1.0-pithivier/doc/readme.txt
New file
0,0 → 1,12
## Pour installer l'api wiki
1/ copiez le dossier api de ce projet dans le répertoire monwikini/tools/api de wikini (ou bien monwikini/api)
 
2/ configurez l'emplacement du framework en renommant le fichier framework.defaut.php en framework.php (attention, framework
version 0.3 nécessaire)
 
3/ renommez le fichier config.defaut.ini du dossier api/rest/configurations en config.ini et en modifiant les variables
de configuration décrites dans le fichier.
 
4/ copier le fichier wakka.php et renommez la copie en api.php à la racine du wiki. Prenez soin de commenter la dernière
ligne appelant la méthode run du wiki.
 
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property
/branches/v1.0-pithivier/themes/bootstrap/images/favicon.ico
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-pithivier/themes/bootstrap/images/favicon.ico
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-pithivier/themes/bootstrap/images/favicon.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/branches/v1.0-pithivier/themes/bootstrap/images/favicon.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/branches/v1.0-pithivier/themes/bootstrap/images/apple-touch-icon.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/branches/v1.0-pithivier/themes/bootstrap/images/apple-touch-icon.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/branches/v1.0-pithivier/themes/bootstrap/squelettes/2cols-left-tb-flore.tpl.html
New file
0,0 → 1,82
<!doctype html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7" lang="{{configuration param="lang"}}"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8" lang="{{configuration param="lang"}}"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9" lang="{{configuration param="lang"}}"> <![endif]-->
<!--[if gt IE 8]><!-->
<html class="no-js" lang="{{configuration param="lang"}}"> <!--<![endif]-->
<head lang="fr">
<!-- HTML Metas -->
<meta charset="{{configuration param="charset"}}">
{{metarobots}}
<meta name="keywords" content="{{configuration param="meta_keywords"}}" />
<meta name="description" content="{{configuration param="meta_description"}}" />
<meta name="viewport" content="width=device-width" />
 
<!-- Title of the page -->
<title>{{configuration param="wakka_name"}} : {{currentpage}}</title>
<!-- Favicons -->
<link rel="shortcut icon" type="image/x-icon" href="{{configuration param="theme_path"}}images/favicon.ico" />
<link rel="apple-touch-icon" href="{{configuration param="theme_path"}}images/apple-touch-icon.png" />
<link rel="icon" type="image/png" href="{{configuration param="theme_path"}}images/favicon.png" />
{{linkstyle othercss="bootstrap/bootstrap-responsive.min.css"}}
<link rel="stylesheet" href="{{configuration param="theme_path"}}styles/flore.css" />
{{linkrss}}
</head>
 
<body {{parambody}}>
<div class="navbar navbar-fixed-top">
<div class="navbar-inner">
<div class="container-fluid">
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</a>
<a class="brand" rel="tooltip" data-placement="right" href="/" title="Retour à l'accueil du site.">
<img src="{{configuration param="theme_path"}}images/favicon.png" alt="Logo Tela Botanica" />
</a>
<a class="brand" href="{{configuration param="base_url"}}{{configuration param="root_page"}}" rel="tooltip" data-placement="right" title="Retour à la page principale de ce Wikini.">
{{configuration param="wakka_name"}}
</a>
<nav class="nav-collapse">
{{include page="PageMenuHaut" class="topnavpage" doubleclic="1" actif="1"}}
<div class="clear"></div>
</nav><!--/.nav-collapse -->
</div>
</div>
</div>
 
<div class="container-fluid main-body" role="main">
<div class="row-fluid">
<div class="span3">
<nav class="well sidebar-nav">
{{include page="PageMenu" doubleclic="1" actif="1"}}
</nav><!--/.well -->
</div><!--/span-->
<div class="span9" {{doubleclic}}>
{WIKINI_PAGE}
</div><!--/span-->
</div><!--/row-->
<div class="row-fluid">
<div class="span3"><!-- Bizare, ne devrait pas être nécessaire --></div>
<div class="offset3 span9">
{{barreredaction class="form-actions"}}
</div>
</div>
<footer>
{{include page="PageFooter" doubleclic="1"}}
</footer><!-- end of footer -->
</div><!--/.fluid-container-->
 
{{linkjavascript}}
<script type="text/javascript">
$(document).ready(function() {
$('a[rel="tooltip"], .has-tooltip').tooltip();
});
</script>
</body>
</html>
/branches/v1.0-pithivier/themes/bootstrap/squelettes/2cols-left-tb.tpl.html
New file
0,0 → 1,80
<!doctype html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7" lang="{{configuration param="lang"}}"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8" lang="{{configuration param="lang"}}"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9" lang="{{configuration param="lang"}}"> <![endif]-->
<!--[if gt IE 8]><!-->
<html class="no-js" lang="{{configuration param="lang"}}"> <!--<![endif]-->
<head lang="fr">
<!-- HTML Metas -->
<meta charset="{{configuration param="charset"}}">
{{metarobots}}
<meta name="keywords" content="{{configuration param="meta_keywords"}}" />
<meta name="description" content="{{configuration param="meta_description"}}" />
<meta name="viewport" content="width=device-width" />
 
<!-- Title of the page -->
<title>{{configuration param="wakka_name"}} : {{currentpage}}</title>
<!-- Favicons -->
<link rel="shortcut icon" type="image/x-icon" href="{{configuration param="theme_path"}}images/favicon.ico" />
<link rel="apple-touch-icon" href="{{configuration param="theme_path"}}images/apple-touch-icon.png" />
<link rel="icon" type="image/png" href="{{configuration param="theme_path"}}images/favicon.png" />
{{linkstyle othercss="bootstrap/bootstrap-responsive.min.css"}}
{{linkrss}}
</head>
 
<body {{parambody}}>
<div class="navbar navbar-fixed-top">
<div class="navbar-inner">
<div class="container-fluid">
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</a>
<a class="brand" rel="tooltip" data-placement="right" href="/" title="Retour à l'accueil du site.">
<img src="{{configuration param="theme_path"}}images/favicon.png" alt="Logo Tela Botanica" />
</a>
<a class="brand" href="{{configuration param="base_url"}}{{configuration param="root_page"}}" rel="tooltip" data-placement="right" title="Retour à la page principale de ce Wikini.">
{{configuration param="wakka_name"}}
</a>
<nav class="nav-collapse">
{{include page="PageMenuHaut" class="topnavpage" doubleclic="1" actif="1"}}
<div class="clear"></div>
</nav><!--/.nav-collapse -->
</div>
</div>
</div>
 
<div class="container-fluid main-body" role="main">
<div class="row-fluid">
<div class="span3">
<nav class="well sidebar-nav">
{{include page="PageMenu" doubleclic="1" actif="1"}}
</nav><!--/.well -->
</div><!--/span-->
<div class="span9" {{doubleclic}}>
{WIKINI_PAGE}
</div><!--/span-->
</div><!--/row-->
<div class="row-fluid">
<div class="span3"><!-- Bizare, ne devrait pas être nécessaire --></div>
<div class="offset3 span9">
{{barreredaction class="form-actions"}}
</div>
</div>
<footer>
{{include page="PageFooter" doubleclic="1"}}
</footer><!-- end of footer -->
</div><!--/.fluid-container-->
 
{{linkjavascript}}
<script type="text/javascript">
$(document).ready(function() {
$('a[rel="tooltip"], .has-tooltip').tooltip();
});
</script>
</body>
</html>
/branches/v1.0-pithivier/themes/bootstrap/styles/bootstrap/telabotanica/bootstrap.min.css
New file
0,0 → 1,858
/* generated by BootTheme (http://www.boottheme.com) */
.clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0;}
.clearfix:after{clear:both;}
.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;}
.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}
article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;}
audio,canvas,video{display:inline-block;*display:inline;*zoom:1;}
audio:not([controls]){display:none;}
html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;}
a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
a:hover,a:active{outline:0;}
sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;}
sup{top:-0.5em;}
sub{bottom:-0.25em;}
img{max-width:100%;width:auto\9;height:auto;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic;}
#map_canvas img,.google-maps img{max-width:none;}
button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;}
button,input{*overflow:visible;line-height:normal;}
button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;}
button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;}
label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer;}
input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield;}
input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;}
textarea{overflow:auto;vertical-align:top;}
@media print{*{text-shadow:none !important;color:#000 !important;background:transparent !important;box-shadow:none !important;} a,a:visited{text-decoration:underline;} a[href]:after{content:" (" attr(href) ")";} abbr[title]:after{content:" (" attr(title) ")";} .ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:"";} pre,blockquote{border:1px solid #999;page-break-inside:avoid;} thead{display:table-header-group;} tr,img{page-break-inside:avoid;} img{max-width:100% !important;} @page {margin:0.5cm;}p,h2,h3{orphans:3;widows:3;} h2,h3{page-break-after:avoid;}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333333;background-color:#ffffff;}
a{color:#598000;text-decoration:none;}
a:hover,a:focus{color:#faab3c;text-decoration:underline;}
.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);}
.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px;}
.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;}
.row:after{clear:both;}
[class*="span"]{float:left;min-height:1px;margin-left:20px;}
.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;}
.span12{width:940px;}
.span11{width:860px;}
.span10{width:780px;}
.span9{width:700px;}
.span8{width:620px;}
.span7{width:540px;}
.span6{width:460px;}
.span5{width:380px;}
.span4{width:300px;}
.span3{width:220px;}
.span2{width:140px;}
.span1{width:60px;}
.offset12{margin-left:980px;}
.offset11{margin-left:900px;}
.offset10{margin-left:820px;}
.offset9{margin-left:740px;}
.offset8{margin-left:660px;}
.offset7{margin-left:580px;}
.offset6{margin-left:500px;}
.offset5{margin-left:420px;}
.offset4{margin-left:340px;}
.offset3{margin-left:260px;}
.offset2{margin-left:180px;}
.offset1{margin-left:100px;}
.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;}
.row-fluid:after{clear:both;}
.row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;}
.row-fluid [class*="span"]:first-child{margin-left:0;}
.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%;}
.row-fluid .span12{width:100%;*width:99.94680851063829%;}
.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%;}
.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%;}
.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%;}
.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%;}
.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%;}
.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%;}
.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%;}
.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%;}
.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%;}
.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%;}
.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%;}
.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%;}
.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%;}
.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%;}
.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%;}
.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%;}
.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%;}
.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%;}
.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%;}
.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%;}
.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%;}
.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%;}
.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%;}
.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%;}
.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%;}
.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%;}
.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%;}
.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%;}
.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%;}
.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%;}
.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%;}
.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%;}
.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%;}
.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%;}
.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%;}
[class*="span"].hide,.row-fluid [class*="span"].hide{display:none;}
[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right;}
.container{margin-right:auto;margin-left:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";line-height:0;}
.container:after{clear:both;}
.container-fluid{padding-right:20px;padding-left:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";line-height:0;}
.container-fluid:after{clear:both;}
p{margin:0 0 10px;}
.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px;}
small{font-size:85%;}
strong{font-weight:bold;}
em{font-style:italic;}
cite{font-style:normal;}
.muted{color:#999999;}
a.muted:hover,a.muted:focus{color:#808080;}
.text-warning{color:#c09853;}
a.text-warning:hover,a.text-warning:focus{color:#a47e3c;}
.text-error{color:#b94a48;}
a.text-error:hover,a.text-error:focus{color:#953b39;}
.text-info{color:#3a87ad;}
a.text-info:hover,a.text-info:focus{color:#2d6987;}
.text-success{color:#468847;}
a.text-success:hover,a.text-success:focus{color:#356635;}
.text-left{text-align:left;}
.text-right{text-align:right;}
.text-center{text-align:center;}
h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999999;}
h1,h2,h3{line-height:40px;}
h1{font-size:38.5px;}
h2{font-size:31.5px;}
h3{font-size:24.5px;}
h4{font-size:17.5px;}
h5{font-size:14px;}
h6{font-size:11.9px;}
h1 small{font-size:24.5px;}
h2 small{font-size:17.5px;}
h3 small{font-size:14px;}
h4 small{font-size:14px;}
.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eeeeee;}
ul,ol{padding:0;margin:0 0 10px 25px;}
ul ul,ul ol,ol ol,ol ul{margin-bottom:0;}
li{line-height:20px;}
ul.unstyled,ol.unstyled{margin-left:0;list-style:none;}
ul.inline,ol.inline{margin-left:0;list-style:none;}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;*zoom:1;padding-left:5px;padding-right:5px;}
dl{margin-bottom:20px;}
dt,dd{line-height:20px;}
dt{font-weight:bold;}
dd{margin-left:10px;}
.dl-horizontal{*zoom:1;}.dl-horizontal:before,.dl-horizontal:after{display:table;content:"";line-height:0;}
.dl-horizontal:after{clear:both;}
.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.dl-horizontal dd{margin-left:180px;}
hr{margin:20px 0;border:0;border-top:1px solid #eeeeee;border-bottom:1px solid #ffffff;}
abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999999;}
abbr.initialism{font-size:90%;text-transform:uppercase;}
blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25;}
blockquote small{display:block;line-height:20px;color:#999999;}blockquote small:before{content:'\2014 \00A0';}
blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;}
blockquote.pull-right small:before{content:'';}
blockquote.pull-right small:after{content:'\00A0 \2014';}
q:before,q:after,blockquote:before,blockquote:after{content:"";}
address{display:block;margin-bottom:20px;font-style:normal;line-height:20px;}
code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;white-space:nowrap;}
pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}pre.prettyprint{margin-bottom:20px;}
pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0;}
.pre-scrollable{max-height:340px;overflow-y:scroll;}
form{margin:0 0 20px;}
fieldset{padding:0;margin:0;border:0;}
legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333333;border:0;border-bottom:1px solid #e5e5e5;}legend small{font-size:15px;color:#999999;}
label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px;}
input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;}
label{display:block;margin-bottom:5px;}
select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555555;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;vertical-align:middle;}
input,textarea,.uneditable-input{width:206px;}
textarea{height:auto;}
textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#ffffff;border:1px solid #cccccc;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear .2s, box-shadow linear .2s;-moz-transition:border linear .2s, box-shadow linear .2s;-o-transition:border linear .2s, box-shadow linear .2s;transition:border linear .2s, box-shadow linear .2s;}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82, 168, 236, 0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);}
input[type="radio"],input[type="checkbox"]{margin:4px 0 0;*margin-top:0;margin-top:1px \9;line-height:normal;}
input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto;}
select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px;}
select{width:220px;border:1px solid #cccccc;background-color:#ffffff;}
select[multiple],select[size]{height:auto;}
select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
.uneditable-input,.uneditable-textarea{color:#999999;background-color:#fcfcfc;border-color:#cccccc;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;}
.uneditable-input{overflow:hidden;white-space:nowrap;}
.uneditable-textarea{width:auto;height:auto;}
input:-moz-placeholder,textarea:-moz-placeholder{color:#999999;}
input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999999;}
input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999999;}
.radio,.checkbox{min-height:20px;padding-left:20px;}
.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px;}
.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;}
.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle;}
.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;}
.input-mini{width:60px;}
.input-small{width:90px;}
.input-medium{width:150px;}
.input-large{width:210px;}
.input-xlarge{width:270px;}
.input-xxlarge{width:530px;}
input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0;}
.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block;}
input,textarea,.uneditable-input{margin-left:0;}
.controls-row [class*="span"]+[class*="span"]{margin-left:20px;}
input.span12,textarea.span12,.uneditable-input.span12{width:926px;}
input.span11,textarea.span11,.uneditable-input.span11{width:846px;}
input.span10,textarea.span10,.uneditable-input.span10{width:766px;}
input.span9,textarea.span9,.uneditable-input.span9{width:686px;}
input.span8,textarea.span8,.uneditable-input.span8{width:606px;}
input.span7,textarea.span7,.uneditable-input.span7{width:526px;}
input.span6,textarea.span6,.uneditable-input.span6{width:446px;}
input.span5,textarea.span5,.uneditable-input.span5{width:366px;}
input.span4,textarea.span4,.uneditable-input.span4{width:286px;}
input.span3,textarea.span3,.uneditable-input.span3{width:206px;}
input.span2,textarea.span2,.uneditable-input.span2{width:126px;}
input.span1,textarea.span1,.uneditable-input.span1{width:46px;}
.controls-row{*zoom:1;}.controls-row:before,.controls-row:after{display:table;content:"";line-height:0;}
.controls-row:after{clear:both;}
.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left;}
.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px;}
input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eeeeee;}
input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent;}
.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;}
.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;}
.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;}
.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;}
.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;}
.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;}
.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;}
.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;}
.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;}
.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;}
.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;}
.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;}
.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad;}
.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad;}
.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;}
.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad;}
input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;}
.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1;}.form-actions:before,.form-actions:after{display:table;content:"";line-height:0;}
.form-actions:after{clear:both;}
.help-block,.help-inline{color:#595959;}
.help-block{display:block;margin-bottom:10px;}
.help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px;}
.input-append,.input-prepend{display:inline-block;margin-bottom:10px;vertical-align:middle;font-size:0;white-space:nowrap;}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px;}
.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2;}
.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#eeeeee;border:1px solid #ccc;}
.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546;}
.input-prepend .add-on,.input-prepend .btn{margin-right:-1px;}
.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}
.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px;}
.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}
.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
.input-prepend.input-append .btn-group:first-child{margin-left:0;}
input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}
.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;}
.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;}
.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;}
.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;}
.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;*zoom:1;margin-bottom:0;vertical-align:middle;}
.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none;}
.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block;}
.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0;}
.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle;}
.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0;}
.control-group{margin-bottom:10px;}
legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate;}
.form-horizontal .control-group{margin-bottom:20px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";line-height:0;}
.form-horizontal .control-group:after{clear:both;}
.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right;}
.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0;}.form-horizontal .controls:first-child{*padding-left:180px;}
.form-horizontal .help-block{margin-bottom:0;}
.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px;}
.form-horizontal .form-actions{padding-left:180px;}
table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0;}
.table{width:100%;margin-bottom:20px;}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #dddddd;}
.table th{font-weight:bold;}
.table thead th{vertical-align:bottom;}
.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0;}
.table tbody+tbody{border-top:2px solid #dddddd;}
.table .table{background-color:#ffffff;}
.table-condensed th,.table-condensed td{padding:4px 5px;}
.table-bordered{border:1px solid #dddddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th,.table-bordered td{border-left:1px solid #dddddd;}
.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;}
.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;}
.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;}
.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;}
.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomleft:0;border-bottom-left-radius:0;}
.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;-moz-border-radius-bottomright:0;border-bottom-right-radius:0;}
.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;}
.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;}
.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9;}
.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5;}
table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0;}
.table td.span1,.table th.span1{float:none;width:44px;margin-left:0;}
.table td.span2,.table th.span2{float:none;width:124px;margin-left:0;}
.table td.span3,.table th.span3{float:none;width:204px;margin-left:0;}
.table td.span4,.table th.span4{float:none;width:284px;margin-left:0;}
.table td.span5,.table th.span5{float:none;width:364px;margin-left:0;}
.table td.span6,.table th.span6{float:none;width:444px;margin-left:0;}
.table td.span7,.table th.span7{float:none;width:524px;margin-left:0;}
.table td.span8,.table th.span8{float:none;width:604px;margin-left:0;}
.table td.span9,.table th.span9{float:none;width:684px;margin-left:0;}
.table td.span10,.table th.span10{float:none;width:764px;margin-left:0;}
.table td.span11,.table th.span11{float:none;width:844px;margin-left:0;}
.table td.span12,.table th.span12{float:none;width:924px;margin-left:0;}
.table tbody tr.success>td{background-color:#dff0d8;}
.table tbody tr.error>td{background-color:#f2dede;}
.table tbody tr.warning>td{background-color:#fcf8e3;}
.table tbody tr.info>td{background-color:#d9edf7;}
.table-hover tbody tr.success:hover>td{background-color:#d0e9c6;}
.table-hover tbody tr.error:hover>td{background-color:#ebcccc;}
.table-hover tbody tr.warning:hover>td{background-color:#faf2cc;}
.table-hover tbody tr.info:hover>td{background-color:#c4e3f3;}
[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../../../images/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat;margin-top:1px;}
.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../../../images/glyphicons-halflings-white.png");}
.icon-glass{background-position:0 0;}
.icon-music{background-position:-24px 0;}
.icon-search{background-position:-48px 0;}
.icon-envelope{background-position:-72px 0;}
.icon-heart{background-position:-96px 0;}
.icon-star{background-position:-120px 0;}
.icon-star-empty{background-position:-144px 0;}
.icon-user{background-position:-168px 0;}
.icon-film{background-position:-192px 0;}
.icon-th-large{background-position:-216px 0;}
.icon-th{background-position:-240px 0;}
.icon-th-list{background-position:-264px 0;}
.icon-ok{background-position:-288px 0;}
.icon-remove{background-position:-312px 0;}
.icon-zoom-in{background-position:-336px 0;}
.icon-zoom-out{background-position:-360px 0;}
.icon-off{background-position:-384px 0;}
.icon-signal{background-position:-408px 0;}
.icon-cog{background-position:-432px 0;}
.icon-trash{background-position:-456px 0;}
.icon-home{background-position:0 -24px;}
.icon-file{background-position:-24px -24px;}
.icon-time{background-position:-48px -24px;}
.icon-road{background-position:-72px -24px;}
.icon-download-alt{background-position:-96px -24px;}
.icon-download{background-position:-120px -24px;}
.icon-upload{background-position:-144px -24px;}
.icon-inbox{background-position:-168px -24px;}
.icon-play-circle{background-position:-192px -24px;}
.icon-repeat{background-position:-216px -24px;}
.icon-refresh{background-position:-240px -24px;}
.icon-list-alt{background-position:-264px -24px;}
.icon-lock{background-position:-287px -24px;}
.icon-flag{background-position:-312px -24px;}
.icon-headphones{background-position:-336px -24px;}
.icon-volume-off{background-position:-360px -24px;}
.icon-volume-down{background-position:-384px -24px;}
.icon-volume-up{background-position:-408px -24px;}
.icon-qrcode{background-position:-432px -24px;}
.icon-barcode{background-position:-456px -24px;}
.icon-tag{background-position:0 -48px;}
.icon-tags{background-position:-25px -48px;}
.icon-book{background-position:-48px -48px;}
.icon-bookmark{background-position:-72px -48px;}
.icon-print{background-position:-96px -48px;}
.icon-camera{background-position:-120px -48px;}
.icon-font{background-position:-144px -48px;}
.icon-bold{background-position:-167px -48px;}
.icon-italic{background-position:-192px -48px;}
.icon-text-height{background-position:-216px -48px;}
.icon-text-width{background-position:-240px -48px;}
.icon-align-left{background-position:-264px -48px;}
.icon-align-center{background-position:-288px -48px;}
.icon-align-right{background-position:-312px -48px;}
.icon-align-justify{background-position:-336px -48px;}
.icon-list{background-position:-360px -48px;}
.icon-indent-left{background-position:-384px -48px;}
.icon-indent-right{background-position:-408px -48px;}
.icon-facetime-video{background-position:-432px -48px;}
.icon-picture{background-position:-456px -48px;}
.icon-pencil{background-position:0 -72px;}
.icon-map-marker{background-position:-24px -72px;}
.icon-adjust{background-position:-48px -72px;}
.icon-tint{background-position:-72px -72px;}
.icon-edit{background-position:-96px -72px;}
.icon-share{background-position:-120px -72px;}
.icon-check{background-position:-144px -72px;}
.icon-move{background-position:-168px -72px;}
.icon-step-backward{background-position:-192px -72px;}
.icon-fast-backward{background-position:-216px -72px;}
.icon-backward{background-position:-240px -72px;}
.icon-play{background-position:-264px -72px;}
.icon-pause{background-position:-288px -72px;}
.icon-stop{background-position:-312px -72px;}
.icon-forward{background-position:-336px -72px;}
.icon-fast-forward{background-position:-360px -72px;}
.icon-step-forward{background-position:-384px -72px;}
.icon-eject{background-position:-408px -72px;}
.icon-chevron-left{background-position:-432px -72px;}
.icon-chevron-right{background-position:-456px -72px;}
.icon-plus-sign{background-position:0 -96px;}
.icon-minus-sign{background-position:-24px -96px;}
.icon-remove-sign{background-position:-48px -96px;}
.icon-ok-sign{background-position:-72px -96px;}
.icon-question-sign{background-position:-96px -96px;}
.icon-info-sign{background-position:-120px -96px;}
.icon-screenshot{background-position:-144px -96px;}
.icon-remove-circle{background-position:-168px -96px;}
.icon-ok-circle{background-position:-192px -96px;}
.icon-ban-circle{background-position:-216px -96px;}
.icon-arrow-left{background-position:-240px -96px;}
.icon-arrow-right{background-position:-264px -96px;}
.icon-arrow-up{background-position:-289px -96px;}
.icon-arrow-down{background-position:-312px -96px;}
.icon-share-alt{background-position:-336px -96px;}
.icon-resize-full{background-position:-360px -96px;}
.icon-resize-small{background-position:-384px -96px;}
.icon-plus{background-position:-408px -96px;}
.icon-minus{background-position:-433px -96px;}
.icon-asterisk{background-position:-456px -96px;}
.icon-exclamation-sign{background-position:0 -120px;}
.icon-gift{background-position:-24px -120px;}
.icon-leaf{background-position:-48px -120px;}
.icon-fire{background-position:-72px -120px;}
.icon-eye-open{background-position:-96px -120px;}
.icon-eye-close{background-position:-120px -120px;}
.icon-warning-sign{background-position:-144px -120px;}
.icon-plane{background-position:-168px -120px;}
.icon-calendar{background-position:-192px -120px;}
.icon-random{background-position:-216px -120px;width:16px;}
.icon-comment{background-position:-240px -120px;}
.icon-magnet{background-position:-264px -120px;}
.icon-chevron-up{background-position:-288px -120px;}
.icon-chevron-down{background-position:-313px -119px;}
.icon-retweet{background-position:-336px -120px;}
.icon-shopping-cart{background-position:-360px -120px;}
.icon-folder-close{background-position:-384px -120px;width:16px;}
.icon-folder-open{background-position:-408px -120px;width:16px;}
.icon-resize-vertical{background-position:-432px -119px;}
.icon-resize-horizontal{background-position:-456px -118px;}
.icon-hdd{background-position:0 -144px;}
.icon-bullhorn{background-position:-24px -144px;}
.icon-bell{background-position:-48px -144px;}
.icon-certificate{background-position:-72px -144px;}
.icon-thumbs-up{background-position:-96px -144px;}
.icon-thumbs-down{background-position:-120px -144px;}
.icon-hand-right{background-position:-144px -144px;}
.icon-hand-left{background-position:-168px -144px;}
.icon-hand-up{background-position:-192px -144px;}
.icon-hand-down{background-position:-216px -144px;}
.icon-circle-arrow-right{background-position:-240px -144px;}
.icon-circle-arrow-left{background-position:-264px -144px;}
.icon-circle-arrow-up{background-position:-288px -144px;}
.icon-circle-arrow-down{background-position:-312px -144px;}
.icon-globe{background-position:-336px -144px;}
.icon-wrench{background-position:-360px -144px;}
.icon-tasks{background-position:-384px -144px;}
.icon-filter{background-position:-408px -144px;}
.icon-briefcase{background-position:-432px -144px;}
.icon-fullscreen{background-position:-456px -144px;}
.dropup,.dropdown{position:relative;}
.dropdown-toggle{*margin-bottom:-3px;}
.dropdown-toggle:active,.open .dropdown-toggle{outline:0;}
.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000000;border-right:4px solid transparent;border-left:4px solid transparent;content:"";}
.dropdown .caret{margin-top:8px;margin-left:2px;}
.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#ffffff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;}.dropdown-menu.pull-right{right:0;left:auto;}
.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;}
.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333333;white-space:nowrap;}
.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{text-decoration:none;color:#ffffff;background-color:#527600;background-image:-moz-linear-gradient(top, #598000, #476700);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#598000), to(#476700));background-image:-webkit-linear-gradient(top, #598000, #476700);background-image:-o-linear-gradient(top, #598000, #476700);background-image:linear-gradient(to bottom, #598000, #476700);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff598000', endColorstr='#ff476700', GradientType=0);}
.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#527600;background-image:-moz-linear-gradient(top, #598000, #476700);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#598000), to(#476700));background-image:-webkit-linear-gradient(top, #598000, #476700);background-image:-o-linear-gradient(top, #598000, #476700);background-image:linear-gradient(to bottom, #598000, #476700);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff598000', endColorstr='#ff476700', GradientType=0);}
.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999999;}
.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:default;}
.open{*z-index:1000;}.open>.dropdown-menu{display:block;}
.pull-right>.dropdown-menu{right:0;left:auto;}
.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000000;content:"";}
.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px;}
.dropdown-submenu{position:relative;}
.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px;}
.dropdown-submenu:hover>.dropdown-menu{display:block;}
.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0;}
.dropdown-submenu>a:after{display:block;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#cccccc;margin-top:5px;margin-right:-10px;}
.dropdown-submenu:hover>a:after{border-left-color:#ffffff;}
.dropdown-submenu.pull-left{float:none;}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px;}
.dropdown .dropdown-menu .nav-header{padding-left:20px;padding-right:20px;}
.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);}
.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;}.fade.in{opacity:1;}
.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;}.collapse.in{height:auto;}
.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover,.close:focus{color:#000000;text-decoration:none;cursor:pointer;opacity:0.4;filter:alpha(opacity=40);}
button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none;}
.btn{display:inline-block;*display:inline;*zoom:1;padding:4px 12px;margin-bottom:0;font-size:14px;line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333333;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #ffffff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #ffffff, #e6e6e6);background-image:-o-linear-gradient(top, #ffffff, #e6e6e6);background-image:linear-gradient(to bottom, #ffffff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #cccccc;*border:0;border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333333;background-color:#e6e6e6;*background-color:#d9d9d9;}
.btn:active,.btn.active{background-color:#cccccc \9;}
.btn:first-child{*margin-left:0;}
.btn:hover,.btn:focus{color:#333333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;}
.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);}
.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px;}
.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0;}
.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px;}
.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
.btn-block{display:block;width:100%;padding-left:0;padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}
.btn-block+.btn-block{margin-top:5px;}
input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%;}
.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255, 255, 255, 0.75);}
.btn-primary{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#488000;background-image:-moz-linear-gradient(top, #598000, #2e8000);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#598000), to(#2e8000));background-image:-webkit-linear-gradient(top, #598000, #2e8000);background-image:-o-linear-gradient(top, #598000, #2e8000);background-image:linear-gradient(to bottom, #598000, #2e8000);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff598000', endColorstr='#ff2e8000', GradientType=0);border-color:#2e8000 #2e8000 #133400;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#2e8000;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#ffffff;background-color:#2e8000;*background-color:#256700;}
.btn-primary:active,.btn-primary.active{background-color:#1c4d00 \9;}
.btn-warning{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#f89406;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#ffffff;background-color:#f89406;*background-color:#df8505;}
.btn-warning:active,.btn-warning.active{background-color:#c67605 \9;}
.btn-danger{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(to bottom, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#bd362f;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#ffffff;background-color:#bd362f;*background-color:#a9302a;}
.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;}
.btn-success{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(to bottom, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#51a351;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#ffffff;background-color:#51a351;*background-color:#499249;}
.btn-success:active,.btn-success.active{background-color:#408140 \9;}
.btn-info{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(to bottom, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#2f96b4;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#ffffff;background-color:#2f96b4;*background-color:#2a85a0;}
.btn-info:active,.btn-info.active{background-color:#24748c \9;}
.btn-inverse{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#363636;background-image:-moz-linear-gradient(top, #444444, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));background-image:-webkit-linear-gradient(top, #444444, #222222);background-image:-o-linear-gradient(top, #444444, #222222);background-image:linear-gradient(to bottom, #444444, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#222222;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#ffffff;background-color:#222222;*background-color:#151515;}
.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9;}
button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;}
button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px;}
button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px;}
button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px;}
.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
.btn-link{border-color:transparent;cursor:pointer;color:#598000;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
.btn-link:hover,.btn-link:focus{color:#faab3c;text-decoration:underline;background-color:transparent;}
.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333333;text-decoration:none;}
.btn-group{position:relative;display:inline-block;*display:inline;*zoom:1;font-size:0;vertical-align:middle;white-space:nowrap;*margin-left:.3em;}.btn-group:first-child{*margin-left:0;}
.btn-group+.btn-group{margin-left:5px;}
.btn-toolbar{font-size:0;margin-top:10px;margin-bottom:10px;}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px;}
.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
.btn-group>.btn+.btn{margin-left:-1px;}
.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px;}
.btn-group>.btn-mini{font-size:10.5px;}
.btn-group>.btn-small{font-size:11.9px;}
.btn-group>.btn-large{font-size:17.5px;}
.btn-group>.btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;}
.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;}
.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;}
.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2;}
.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;}
.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);*padding-top:5px;*padding-bottom:5px;}
.btn-group>.btn-mini+.dropdown-toggle{padding-left:5px;padding-right:5px;*padding-top:2px;*padding-bottom:2px;}
.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px;}
.btn-group>.btn-large+.dropdown-toggle{padding-left:12px;padding-right:12px;*padding-top:7px;*padding-bottom:7px;}
.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);}
.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6;}
.btn-group.open .btn-primary.dropdown-toggle{background-color:#2e8000;}
.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406;}
.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f;}
.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351;}
.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4;}
.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222222;}
.btn .caret{margin-top:8px;margin-left:0;}
.btn-large .caret{margin-top:6px;}
.btn-large .caret{border-left-width:5px;border-right-width:5px;border-top-width:5px;}
.btn-mini .caret,.btn-small .caret{margin-top:8px;}
.dropup .btn-large .caret{border-bottom-width:5px;}
.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;}
.btn-group-vertical{display:inline-block;*display:inline;*zoom:1;}
.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
.btn-group-vertical>.btn+.btn{margin-left:0;margin-top:-1px;}
.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}
.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}
.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0;}
.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;}
.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
.alert,.alert h4{color:#c09853;}
.alert h4{margin:0;}
.alert .close{position:relative;top:-2px;right:-21px;line-height:20px;}
.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847;}
.alert-success h4{color:#468847;}
.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;color:#b94a48;}
.alert-danger h4,.alert-error h4{color:#b94a48;}
.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad;}
.alert-info h4{color:#3a87ad;}
.alert-block{padding-top:14px;padding-bottom:14px;}
.alert-block>p,.alert-block>ul{margin-bottom:0;}
.alert-block p+p{margin-top:5px;}
.nav{margin-left:0;margin-bottom:20px;list-style:none;}
.nav>li>a{display:block;}
.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eeeeee;}
.nav>li>a>img{max-width:none;}
.nav>.pull-right{float:right;}
.nav-header{display:block;padding:3px 15px;font-size:13px;font-weight:bold;line-height:20px;color:#999999;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);text-transform:uppercase;}
.nav li+.nav-header{margin-top:9px;}
.nav-list{padding-left:15px;padding-right:15px;margin-bottom:0;}
.nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);}
.nav-list>li>a{padding:3px 15px;}
.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#598000;}
.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px;}
.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;}
.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";line-height:0;}
.nav-tabs:after,.nav-pills:after{clear:both;}
.nav-tabs>li,.nav-pills>li{float:left;}
.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;}
.nav-tabs{border-bottom:1px solid #ddd;}
.nav-tabs>li{margin-bottom:-1px;}
.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eeeeee #eeeeee #dddddd;}
.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;}
.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#ffffff;background-color:#598000;}
.nav-stacked>li{float:none;}
.nav-stacked>li>a{margin-right:0;}
.nav-tabs.nav-stacked{border-bottom:0;}
.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;}
.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{border-color:#ddd;z-index:2;}
.nav-pills.nav-stacked>li>a{margin-bottom:3px;}
.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;}
.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;}
.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
.nav .dropdown-toggle .caret{border-top-color:#598000;border-bottom-color:#598000;margin-top:6px;}
.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#faab3c;border-bottom-color:#faab3c;}
.nav-tabs .dropdown-toggle .caret{margin-top:8px;}
.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff;}
.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555555;border-bottom-color:#555555;}
.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer;}
.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#ffffff;background-color:#999999;border-color:#999999;}
.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;opacity:1;filter:alpha(opacity=100);}
.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999999;}
.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";line-height:0;}
.tabbable:after{clear:both;}
.tab-content{overflow:auto;}
.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0;}
.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;}
.tab-content>.active,.pill-content>.active{display:block;}
.tabs-below>.nav-tabs{border-top:1px solid #ddd;}
.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0;}
.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-bottom-color:transparent;border-top-color:#ddd;}
.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd;}
.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none;}
.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;}
.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;}
.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}
.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eeeeee #dddddd #eeeeee #eeeeee;}
.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;}
.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;}
.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eeeeee #eeeeee #eeeeee #dddddd;}
.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;}
.nav>.disabled>a{color:#999999;}
.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;background-color:transparent;cursor:default;}
.navbar{overflow:visible;margin-bottom:20px;*position:relative;*z-index:2;}
.navbar-inner{min-height:40px;padding-left:20px;padding-right:20px;background-color:#94bd3e;background-image:-moz-linear-gradient(top, #9ac342, #8cb339);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#9ac342), to(#8cb339));background-image:-webkit-linear-gradient(top, #9ac342, #8cb339);background-image:-o-linear-gradient(top, #9ac342, #8cb339);background-image:linear-gradient(to bottom, #9ac342, #8cb339);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff9ac342', endColorstr='#ff8cb339', GradientType=0);border:1px solid #68842a;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 4px rgba(0, 0, 0, 0.065);-moz-box-shadow:0 1px 4px rgba(0, 0, 0, 0.065);box-shadow:0 1px 4px rgba(0, 0, 0, 0.065);*zoom:1;}.navbar-inner:before,.navbar-inner:after{display:table;content:"";line-height:0;}
.navbar-inner:after{clear:both;}
.navbar .container{width:auto;}
.nav-collapse.collapse{height:auto;overflow:visible;}
.navbar .brand{float:left;display:block;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#ffffff;text-shadow:0 1px 0 #9ac342;}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none;}
.navbar-text{margin-bottom:0;line-height:40px;color:#5c5950;}
.navbar-link{color:#ffffff;}.navbar-link:hover,.navbar-link:focus{color:#333333;}
.navbar .divider-vertical{height:40px;margin:0 9px;border-left:1px solid #8cb339;border-right:1px solid #9ac342;}
.navbar .btn,.navbar .btn-group{margin-top:5px;}
.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0;}
.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";line-height:0;}
.navbar-form:after{clear:both;}
.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;}
.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0;}
.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;}
.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap;}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0;}
.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0;}.navbar-search .search-query{margin-bottom:0;padding:4px 14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}
.navbar-static-top{position:static;margin-bottom:0;}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0;}
.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px;}
.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0;}
.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;}
.navbar-fixed-top{top:0;}
.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,.1);box-shadow:0 1px 10px rgba(0,0,0,.1);}
.navbar-fixed-bottom{bottom:0;}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,.1);box-shadow:0 -1px 10px rgba(0,0,0,.1);}
.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;}
.navbar .nav.pull-right{float:right;margin-right:0;}
.navbar .nav>li{float:left;}
.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#ffffff;text-decoration:none;text-shadow:0 1px 0 #9ac342;}
.navbar .nav .dropdown-toggle .caret{margin-top:8px;}
.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{background-color:transparent;color:#333333;text-decoration:none;}
.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555555;text-decoration:none;background-color:#7d9f33;-webkit-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);-moz-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);}
.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#86ab36;background-image:-moz-linear-gradient(top, #8cb339, #7d9f33);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#8cb339), to(#7d9f33));background-image:-webkit-linear-gradient(top, #8cb339, #7d9f33);background-image:-o-linear-gradient(top, #8cb339, #7d9f33);background-image:linear-gradient(to bottom, #8cb339, #7d9f33);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff8cb339', endColorstr='#ff7d9f33', GradientType=0);border-color:#7d9f33 #7d9f33 #4f6520;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#7d9f33;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#ffffff;background-color:#7d9f33;*background-color:#6e8c2c;}
.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#5f7926 \9;}
.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);}
.btn-navbar .icon-bar+.icon-bar{margin-top:3px;}
.navbar .nav>li>.dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;}
.navbar .nav>li>.dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;}
.navbar-fixed-bottom .nav>li>.dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0, 0, 0, 0.2);border-bottom:0;bottom:-7px;top:auto;}
.navbar-fixed-bottom .nav>li>.dropdown-menu:after{border-top:6px solid #ffffff;border-bottom:0;bottom:-6px;top:auto;}
.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333333;border-bottom-color:#333333;}
.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{background-color:#7d9f33;color:#555555;}
.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;}
.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555555;border-bottom-color:#555555;}
.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{left:auto;right:0;}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{left:auto;right:12px;}
.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{left:auto;right:13px;}
.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{left:auto;right:100%;margin-left:0;margin-right:-1px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px;}
.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top, #222222, #111111);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));background-image:-webkit-linear-gradient(top, #222222, #111111);background-image:-o-linear-gradient(top, #222222, #111111);background-image:linear-gradient(to bottom, #222222, #111111);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);border-color:#252525;}
.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999999;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#ffffff;}
.navbar-inverse .brand{color:#999999;}
.navbar-inverse .navbar-text{color:#999999;}
.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{background-color:transparent;color:#ffffff;}
.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#ffffff;background-color:#111111;}
.navbar-inverse .navbar-link{color:#999999;}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#ffffff;}
.navbar-inverse .divider-vertical{border-left-color:#111111;border-right-color:#222222;}
.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{background-color:#111111;color:#ffffff;}
.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;}
.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999999;border-bottom-color:#999999;}
.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;}
.navbar-inverse .navbar-search .search-query{color:#ffffff;background-color:#515151;border-color:#111111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none;}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#cccccc;}
.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#cccccc;}
.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#cccccc;}
.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;}
.navbar-inverse .btn-navbar{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e0e0e;background-image:-moz-linear-gradient(top, #151515, #040404);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));background-image:-webkit-linear-gradient(top, #151515, #040404);background-image:-o-linear-gradient(top, #151515, #040404);background-image:linear-gradient(to bottom, #151515, #040404);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);border-color:#040404 #040404 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#040404;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#ffffff;background-color:#040404;*background-color:#000000;}
.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000000 \9;}
.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.breadcrumb>li{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 0 #ffffff;}.breadcrumb>li>.divider{padding:0 5px;color:#ccc;}
.breadcrumb>.active{color:#999999;}
.pagination{margin:20px 0;}
.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);}
.pagination ul>li{display:inline;}
.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#ffffff;border:1px solid #dddddd;border-left-width:0;}
.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5;}
.pagination ul>.active>a,.pagination ul>.active>span{color:#999999;cursor:default;}
.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999999;background-color:transparent;cursor:default;}
.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;}
.pagination-centered{text-align:center;}
.pagination-right{text-align:right;}
.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px;}
.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;}
.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;}
.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-top-left-radius:3px;-moz-border-radius-topleft:3px;border-top-left-radius:3px;-webkit-border-bottom-left-radius:3px;-moz-border-radius-bottomleft:3px;border-bottom-left-radius:3px;}
.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;-moz-border-radius-bottomright:3px;border-bottom-right-radius:3px;}
.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px;}
.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px;}
.pager{margin:20px 0;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";line-height:0;}
.pager:after{clear:both;}
.pager li{display:inline;}
.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}
.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5;}
.pager .next>a,.pager .next>span{float:right;}
.pager .previous>a,.pager .previous>span{float:left;}
.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999999;background-color:#fff;cursor:default;}
.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;}
.modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);}
.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;outline:none;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;}
.modal.fade.in{top:50%;}
.modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;}
.modal-header h3{margin:0;line-height:30px;}
.modal-body{position:relative;overflow-y:auto;max-height:400px;padding:15px;}
.modal-form{margin-bottom:0;}
.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";line-height:0;}
.modal-footer:after{clear:both;}
.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0;}
.modal-footer .btn-group .btn+.btn{margin-left:-1px;}
.modal-footer .btn-block+.btn-block{margin-left:0;}
.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);}
.tooltip.top{margin-top:-3px;padding:5px 0;}
.tooltip.right{margin-left:3px;padding:0 5px;}
.tooltip.bottom{margin-top:3px;padding:5px 0;}
.tooltip.left{margin-left:-3px;padding:0 5px;}
.tooltip-inner{max-width:200px;padding:8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid;}
.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000;}
.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000;}
.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000;}
.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000;}
.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#ffffff;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);white-space:normal;}.popover.top{margin-top:-10px;}
.popover.right{margin-left:10px;}
.popover.bottom{margin-top:10px;}
.popover.left{margin-left:-10px;}
.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0;}.popover-title:empty{display:none;}
.popover-content{padding:9px 14px;}
.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid;}
.popover .arrow{border-width:11px;}
.popover .arrow:after{border-width:10px;content:"";}
.popover.top .arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0, 0, 0, 0.25);bottom:-11px;}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#ffffff;}
.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0, 0, 0, 0.25);}.popover.right .arrow:after{left:1px;bottom:-10px;border-left-width:0;border-right-color:#ffffff;}
.popover.bottom .arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0, 0, 0, 0.25);top:-11px;}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#ffffff;}
.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0, 0, 0, 0.25);}.popover.left .arrow:after{right:1px;border-right-width:0;border-left-color:#ffffff;bottom:-10px;}
.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";line-height:0;}
.thumbnails:after{clear:both;}
.row-fluid .thumbnails{margin-left:0;}
.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px;}
.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;}
a.thumbnail:hover,a.thumbnail:focus{border-color:#598000;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);}
.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;}
.thumbnail .caption{padding:9px;color:#555555;}
.media,.media-body{overflow:hidden;*overflow:visible;zoom:1;}
.media,.media .media{margin-top:15px;}
.media:first-child{margin-top:0;}
.media-object{display:block;}
.media-heading{margin:0 0 5px;}
.media>.pull-left{margin-right:10px;}
.media>.pull-right{margin-left:10px;}
.media-list{margin-left:0;list-style:none;}
.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#ffffff;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#999999;}
.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
.badge{padding-left:9px;padding-right:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px;}
.label:empty,.badge:empty{display:none;}
a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer;}
.label-important,.badge-important{background-color:#b94a48;}
.label-important[href],.badge-important[href]{background-color:#953b39;}
.label-warning,.badge-warning{background-color:#f89406;}
.label-warning[href],.badge-warning[href]{background-color:#c67605;}
.label-success,.badge-success{background-color:#468847;}
.label-success[href],.badge-success[href]{background-color:#356635;}
.label-info,.badge-info{background-color:#3a87ad;}
.label-info[href],.badge-info[href]{background-color:#2d6987;}
.label-inverse,.badge-inverse{background-color:#333333;}
.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a;}
.btn .label,.btn .badge{position:relative;top:-1px;}
.btn-mini .label,.btn-mini .badge{top:0;}
@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-o-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(to bottom, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
.progress .bar{width:0%;height:100%;color:#ffffff;float:left;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(to bottom, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;}
.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);}
.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;}
.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;}
.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(to bottom, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);}
.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(to bottom, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);}
.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(to bottom, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);}
.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);}
.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
.accordion{margin-bottom:20px;}
.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
.accordion-heading{border-bottom:0;}
.accordion-heading .accordion-toggle{display:block;padding:8px 15px;}
.accordion-toggle{cursor:pointer;}
.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;}
.carousel{position:relative;margin-bottom:20px;line-height:1;}
.carousel-inner{overflow:hidden;width:100%;position:relative;}
.carousel-inner>.item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1;}
.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block;}
.carousel-inner>.active{left:0;}
.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%;}
.carousel-inner>.next{left:100%;}
.carousel-inner>.prev{left:-100%;}
.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0;}
.carousel-inner>.active.left{left:-100%;}
.carousel-inner>.active.right{left:100%;}
.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;}
.carousel-control:hover,.carousel-control:focus{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);}
.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none;}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255, 255, 255, 0.25);border-radius:5px;}
.carousel-indicators .active{background-color:#fff;}
.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:15px;background:#333333;background:rgba(0, 0, 0, 0.75);}
.carousel-caption h4,.carousel-caption p{color:#ffffff;line-height:20px;}
.carousel-caption h4{margin:0 0 5px;}
.carousel-caption p{margin-bottom:0;}
.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eeeeee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;color:inherit;letter-spacing:-1px;}
.hero-unit li{line-height:30px;}
.pull-right{float:right;}
.pull-left{float:left;}
.hide{display:none;}
.show{display:block;}
.invisible{visibility:hidden;}
.affix{position:fixed;}
/branches/v1.0-pithivier/themes/bootstrap/styles/telabotanica.css
New file
0,0 → 1,63
@import url('bootstrap/telabotanica/bootstrap.min.css');
 
.main-body {
padding-top: 65px;
}
 
.navbar nav li ul {
display: none;
}
 
.topnavpage {
width:100%;
}
 
.footer a {
margin: 0 8px;
}
 
@media (max-width:767px) {
.main-body {
padding-top:0;
}
}
@media (min-width: 768px) and (max-width: 980px) {
.main-body {
padding-top:0;
}
}
@media (min-width: 980px) {
.modal {
width:800px;
margin-left:-400px;
}
}
 
.navbar-search .btn-group {
margin-top:0;
margin-right:10px;
}
.nav-header{
text-transform:none;
}
.nav li + .nav-header {
margin-top:0;
}
 
 
.sidebar-nav {
padding: 5px;
}
.sidebar-nav .active-link {
background-color: rgb(238,238,238);
color: rgb(250,171,60);
}
 
.toc.well {
margin: 45px 2px;
padding: 5px;
top: 5px;
}
.toc.well .toc-title{
margin: 2px;
}
/branches/v1.0-pithivier/themes/bootstrap/styles/flore.css
New file
0,0 → 1,84
*[lang]:after {
content:" ("attr(lang)")";
color:#888;
background-color:inherit;
font-style:italic;
size:80%;}
strong[class]:hover,em[class]:hover,abr[class]:hover,span:hover{
background-color:white;
display:block-inline;
cursor:crosshair;
font-style:normal !important;}
strong[class]:hover:before,em[class]:hover:before,abr[class]:hover:before,span:hover:before{
content:"[";
font-weight:bold;}
strong[class]:hover:after,em[class]:hover:after,abr[class]:hover:after,span:hover:after{
content:"]->"attr(class);
font-weight:bold;
font-style:normal !important;
color:black;}
 
/* Mise en forme similaire au texte d'origine */
.petite-majuscule{
font-variant:small-caps;}
 
/* Zones d'informations générales */
.txt-original{
width:350px;
text-align:justify;
white-space:pre-wrap;
line-height:1.6em;
font-size:1em;}
.txt-original:before{
content:"Texte original : ";}
.source:before{
content:"Source : ";}
 
 
/* TODO : trouver des correspondances avec les ontologies du TDWG */
.nn{
font-weight:bold;}
.nom-vernaculaire{
background-color:#d9ffb2;
border:0.1em solid #d9ffb2;}
.utilisation{
background-color:#d9b2ff;
border:0.1em solid #d9b2ff;}
.floraison{
background-color:#b2e3ff;
border:0.1em solid #b2e3ff;}
 
 
/* TaxonName Ontologie TDWG */
.taxonName{
background-color:#ffecb2;
border:0.1em solid #ffecb2;}
.uninomial, .genusPart, .infragenericEpithet, .specificEpithet, .infraspecificEpithet {
font-style:italic;}
.taxonName .publicationCitation{
border:0.1em dotted #ffecb2;}
 
/* SPMInfoItems Ontologie TDWG */
.description{
background-color:#ffcfb2;
border:0.1em solid #ffcfb2;}
.habitat{
background-color:#f5b2ff;
border:0.1em solid #f5b2ff;}
.distribution{
background-color:#ccf;
border:0.1em solid #ccf;}
 
/* PublicationCitation Ontologie TDWG */
.publicationCitation{
background-color:#f6ffb2;
border:0.1em solid #f6ffb2;}
/* PublicationCitation : autorship */
.publicationCitation .authorship{
}
/* PublicationCitation : short title */
.publicationCitation .shortTitle{
font-style:italic;}
/* PublicationCitation : pages */
.publicationCitation .pages{
}
/branches/v1.0-pithivier/CHANGELOG
New file
0,0 → 1,3
[2015-05-28] création branche 1.0-pithivier
* premier branchement du trunk sans trop regarder
* introduit la compatibilité avec smart-form
/branches/v1.0-pithivier/api/rest/modules/0.5/Pages.php
New file
0,0 → 1,371
<?php
// declare(encoding='UTF-8');
/**
* Web service de consultation d'un page wiki
*
* @category php 5.2
* @package wapi
* @author Aurélien Peronnet < aurelien@tela-botanica.org>
* @author Jean-Pascal Milcent < jpm@tela-botanica.org>
* @copyright Copyright (c) 2011, Tela Botanica (accueil@tela-botanica.org)
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
* @version $Id$
*/
class Pages extends Service {
private $wiki = null;
private $pageNom = null;
private $section = null;
private $creerPage = false;
private $templateDefaut = null;
private $retour = 'txt';
private $formats_retour = array('text/plain','text/html');
private $format_texte;
const MIME_JSON = 'application/json';
const MIME_HTML = 'text/html';
const MIME_TEXT = 'text/plain';
public function consulter($ressources, $parametres) {
try {
$this->definirValeurParDefautDesParametres();
$this->verifierParametres($parametres);
$this->analyserParametres($ressources, $parametres);
$page = $this->consulterPage($this->pageNom, $this->section);
if($page == null && $this->creerPage) {
$this->creerPageAPartirTemplate($this->pageNom, $this->templateDefaut);
$page = $this->consulterPage($this->pageNom, $this->section);
}
$retour = $this->formaterRetour($page);
$this->envoyerContenuJson($retour);
} catch (Exception $e) {
$this->envoyerErreur($e);
}
}
private function definirValeurParDefautDesParametres() {
if (isset($this->parametres['txt_format']) == false) {
$this->parametres['txt_format'] = 'text/plain';
}
}
private function verifierParametres($parametres) {
$erreurs = array();
if (isset($parametres['txt_format'])) {
if(!in_array($parametres['txt_format'], $this->formats_retour)) {
$message = "La valeur du paramètre 'txt.format' peut seulement prendre les valeurs : text/plain et text/html.";
$erreurs[] = $message;
}
}
if (isset($parametres['txt_section_position']) && !is_numeric($parametres['txt_section_position'])) {
$message = "La valeur du paramètre 'txt.section.position' peut seulement prendre des valeurs numeriques";
$erreurs[] = $message;
}
if (isset($parametres['txt_section_titre']) && trim($parametres['txt_section_titre']) == '') {
$message = "La valeur du paramètre 'txt.section.titre' ne peut pas être vide si celui-ci est présent";
$erreurs[] = $message;
}
if (isset($parametres['txt_section_titre']) && trim($parametres['txt_section_titre']) == '') {
$message = "La valeur du paramètre 'txt.section.titre' ne peut pas être vide si celui-ci est présent";
$erreurs[] = $message;
}
if (isset($parametres['txt_template']) && trim($parametres['txt_template']) == '') {
$message = "La valeur du paramètre 'txt_template' ne peut pas être vide si celui-ci est présent";
$erreurs[] = $message;
}
if (count($erreurs) > 0) {
$message = implode('<br />', $erreurs);
$code = RestServeur::HTTP_CODE_MAUVAISE_REQUETE;
throw new Exception($message, $code);
}
}
private function analyserParametres($ressources, $parametres) {
$this->pageNom = $ressources[0];
if (isset($parametres['txt_section_titre'])) {
$this->section = $parametres['txt_section_titre'];
}
if (isset($parametres['txt_section_position'])) {
$this->section = $parametres['txt_section_position'];
}
if (isset($parametres['txt_format'])) {
$this->retour = $parametres['txt_format'];
}
if (isset($parametres['txt_template'])) {
$this->creerPage = true;
$this->templateDefaut = $parametres['txt_template'];
}
}
private function consulterPage($page, $section = null) {
$this->wiki = Registre::get('wikiApi');
// La variable globale wiki est déclarée par les wiki et leurs plugins
// un bug lié à certains plugin impose de la redéclarer et la réaffecter
global $wiki;
$wiki = $this->wiki;
$this->wiki->setPageCourante($this->pageNom);
$page = $this->wiki->LoadPage($page);
if ($page != null) {
// attention les wikis sont souvent en ISO !
$page["body"] = $this->convertirTexteWikiVersEncodageAppli($page['body']);
if($section != null) {
$sections_tab = explode(',', $section);
if(count($sections_tab) > 1) {
foreach($sections_tab as $section_t) {
$page["sections"][$section_t] = $this->decouperPageSection($page["body"], $section_t);
}
} else {
$page["body"] = $this->decouperPageSection($page["body"], $section);
}
}
}
return $page;
}
private function decouperPageSection($contenu_page, $section) {
$section_retour = '';
if (is_numeric($section)) {
$section_retour = $this->getSectionParNumero($contenu_page, $section);
} else {
$section_retour = $this->getSectionParTitre($contenu_page, $section, false);
}
return $section_retour;
}
public function getSectionParNumero($page, $num) {
preg_match_all('/(=[=]+[ ]*)(.[.^=]*)+[ ]*=[=]+[.]*/i', $page, $sections, PREG_OFFSET_CAPTURE);
$sectionTxt = '';
$debut_section = 0;
$lg_page = strlen($page);
$fin_section = $lg_page;
if ($num <= count($sections[1]) && $num > 0) {
$debut_section = $sections[1][$num - 1][1];
$separateur = trim($sections[1][$num - 1][0]);
$separateur_trouve = false;
for ($i = $num; $i < count($sections[1]); $i++) {
$fin_section = $sections[1][$i][1];
if($separateur == trim($sections[1][$i][0])) {
$separateur_trouve = true;
break;
}
}
$fin_section = $separateur_trouve ? $fin_section : $lg_page;
$sectionTxt = substr($page, $debut_section, $fin_section - $debut_section);
} else {
$sectionTxt = '';
}
 
return $sectionTxt;
}
public function getSectionParTitre($page, $titre, $inclure_titre = false) {
$section = '';
$reg_exp = '/((=[=]+)[ ]*'.preg_quote(trim($titre), '/').'[ ]*=[=]+)[.]*/i';
$match = preg_split($reg_exp, $page, 2, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
if (count($match) > 3) {
$section = explode(trim($match[2]), $match[3], 2);
$section = $section[0];
$section = ($inclure_titre) ? $match[1].$section : $section;
} elseif (count($match) == 3) {
$section = explode(trim($match[1]), $match[2], 2);
$section = $section[0];
$section = ($inclure_titre) ? $match[0].$section : $section;
} else {
$section = "";
}
return $section;
}
private function formaterRetour($page) {
 
$mime = null;
$texte = '';
switch ($this->retour) {
case self::MIME_HTML:
$texte = $this->wiki->Format($page["body"], "wakka");
if(!empty($page["sections"])) {
foreach($page["sections"] as &$page_section) {
$page_section = $this->wiki->Format($page_section, "wakka");
}
}
$mime = self::MIME_HTML;
break;
default:
$texte = $page["body"];
$mime = self::MIME_TEXT;
}
$url = $this->wiki->Href("", $this->pageNom);
$retour = array('id' => $this->pageNom,
'titre' => $this->pageNom,
'mime' => $mime,
'texte' => $texte,
'sections' => $page["sections"],
'href' => $url);
return $retour;
}
private function creerPageAPartirTemplate($tag_page_a_creer, $tag_template) {
$page_template = $this->consulterPage($tag_template);
$corps_nouvelle_page = ($page_template != null) ? $page_template['body'] : '';
// si le template n'existe pas, la page créée sera vide
$ecriture = $this->ecrirePage($tag_page_a_creer, $corps_nouvelle_page);
return $ecriture;
}
public function ajouter($ressources, $requeteDonnees) {
return $this->modifier($ressources, $requeteDonnees);
}
public function modifier($ressources, $requeteDonnees) {
 
$requeteDonnees['pageTag'] = $ressources[0];
$this->verifierParametresEcriture($requeteDonnees);
$this->analyserParametresEcriture($requeteDonnees);
$this->wiki = Registre::get('wikiApi');
$this->wiki->setPageCourante($this->pageNom);
$texte = $requeteDonnees['pageContenu'];
$page = $this->consulterPage($this->pageNom);
if ($page != null) {
$corps = ($this->section != null) ? $this->remplacerSection($this->section, $texte, $page['body']) : $texte;
} else {
$corps = $texte;
}
$ecriture = $this->ecrirePage($this->pageNom, $corps);
if ($ecriture) {
$this->envoyerCreationEffectuee();
} else {
$message = 'Impossible de créer ou modifier la page';
$code = RestServeur::HTTP_CODE_ERREUR;
throw new Exception($message, $code);
}
return $ecriture;
}
/**
*
* Si la section demandée existe dans la page, renvoie un tableau contenant le numéro de caractère de
* début de la section, après son titre, ainsi que la longeur du titre
* @param string $titre de la section
* @param string $page contenu de la page wiki
* @return tableau associatif tel que décrit ici
*/
private function getInformationsPositionSection($titre, $page) {
preg_match_all('/(=[=]+[ ]*'.preg_quote(trim($titre), '/').'[ ]*=[=]+[.]*)/i', $page, $sections, PREG_OFFSET_CAPTURE);
$longueur_titre = 0;
$debut_section_apres_titre = 0;
if (count($sections) > 0 && is_array($sections[0]) && count($sections[0][0]) >= 2) {
$longueur_titre = mb_strlen($sections[0][0][0]);
$debut_section_apres_titre = $sections[0][0][1] + $longueur_titre;
}
// ATTENTION : début contient le numéro du caractere de début de la section, après le titre
$infos = array('debut' => $debut_section_apres_titre,
'longueur_titre' => $longueur_titre
);
return $infos;
}
private function remplacerSection($titre_section, $section_remplacement, $corps) {
// insertion d'un saut de ligne pour empêcher de casser le titre, lorsque le titre
// suivant vient directement après la section, sans saut de ligne ni espace
$section_remplacement = "\n".$section_remplacement."\n";
$section_page_originale = $this->getSectionParTitre($corps, $titre_section, true);
$infos_section = $this->getInformationsPositionSection($titre_section, $corps);
$nb_caracteres_a_remplacer = mb_strlen($section_page_originale) - $infos_section['longueur_titre'];
$nouveau_contenu = substr_replace($corps, $section_remplacement, $infos_section['debut'], $nb_caracteres_a_remplacer);
return $nouveau_contenu;
}
private function ecrirePage($nom_page, $contenu) {
$texte_encode = $this->convertirTexteAppliVersEncodageWiki($contenu);
$ecriture = $this->wiki->SavePage($nom_page, $texte_encode, "", true);
return $ecriture;
}
private function analyserParametresEcriture($parametres) {
$this->pageNom = $parametres['pageTag'];
$this->section = isset($parametres['pageSectionTitre']) ? $parametres['pageSectionTitre'] : null;
}
private function verifierParametresEcriture($parametres) {
$erreurs = array();
if (!isset($parametres['pageContenu'])) {
$message = "Le paramètre pageContenu est obligatoire";
$erreurs[] = $message;
}
if (!isset($parametres['pageTag']) || trim($parametres['pageTag']) == '') {
$message = "Le paramètre pageTag est obligatoire";
$erreurs[] = $message;
}
if (isset($parametres['pageSectionTitre']) && $parametres['pageSectionTitre'] == '') {
$message = "Le paramètre pageSectionTitre ne doit pas être vide s'il est présent";
$erreurs[] = $message;
}
if (count($erreurs) > 0) {
$message = implode('<br />', $erreurs);
$code = RestServeur::HTTP_CODE_MAUVAISE_REQUETE;
throw new Exception($message, $code);
}
}
private function convertirTexteWikiVersEncodageAppli($texte) {
if (Config::get('encodage_appli') != Config::get('encodage_wiki')) {
$texte = mb_convert_encoding($texte,Config::get('encodage_appli'),Config::get('encodage_wiki'));
}
return $texte;
}
private function convertirTexteAppliVersEncodageWiki($texte) {
if (Config::get('encodage_appli') != Config::get('encodage_wiki')) {
$texte = mb_convert_encoding($texte,Config::get('encodage_wiki'),Config::get('encodage_appli'));
}
return $texte;
}
}
?>
/branches/v1.0-pithivier/api/rest/modules/0.5/Service.php
New file
0,0 → 1,45
<?php
abstract class Service extends RestService {
 
//+----------------------------------------------------------------------------------------------------------------+
// GESTION de l'ENVOIE au NAVIGATEUR
 
protected function formaterEnJsonp($donnees = null, $encodage = 'utf-8') {
$contenu = $_GET['callback'].'('.json_encode($donnees).');';
return $contenu;
}
 
private function envoyerEnteteContenu($encodage, $mime) {
if (!is_null($mime) && !is_null($encodage)) {
header("Content-Type: $mime; charset=$encodage");
} else if (!is_null($mime) && is_null($encodage)) {
header("Content-Type: $mime");
}
}
 
public function envoyerContenuJson($donnees = null, $encodage = 'utf-8') {
$contenu = json_encode($donnees);
$this->envoyerEnteteContenu($encodage, 'application/json');
echo $contenu;
exit;
}
 
protected function envoyerAuth($message_accueil, $message_echec) {
header('HTTP/1.0 401 Unauthorized');
header('WWW-Authenticate: Basic realm="'.mb_convert_encoding($message_accueil, 'ISO-8859-1', 'UTF-8').'"');
header('Content-type: text/plain; charset=UTF-8');
print $message_echec;
exit(0);
}
 
protected function envoyerErreur($e) {
RestServeur::envoyerEnteteStatutHttp($e->getCode());
echo $e->getMessage();
}
 
protected function envoyerCreationEffectuee() {
header('HTTP/1.1 201 Created');
echo "OK";
}
}
?>
/branches/v1.0-pithivier/api/rest/configurations/config.defaut.ini
New file
0,0 → 1,36
; Encodage : UTF-8
 
; +------------------------------------------------------------------------------------------------------+
; URLs
; Le séparateur utilisé par le framework lorsqu'il génère des URL pour séparer les arguments.
; Pour remettre les valeurs par défaut, utitliser : "php:ini_get('arg_separator.output')"
url_arg_separateur_sortie = "&"
 
; +------------------------------------------------------------------------------------------------------+
; Info sur l'application
info.nom = "Services web de WIKINI (Tela Botanica)"
; Abréviation de l'application
info.abr = "WS-WIKINI"
; Version du Framework nécessaire au fonctionnement de cette application
info.framework.version = 0.3
;Encodage de l'application
encodage_appli = "UTF-8"
encodage_wiki = "ISO-8859-15"
 
; +------------------------------------------------------------------------------------------------------+
; Débogage
; Indique si oui ou non on veut afficher le débogage.
debogage = true
; Indique sous quelle forme les méssages de débogage doivent s'afficher :
; - "php:Debug::MODE_ECHO" : le message est affiché en utilisant echo
; - "php:Debug::MODE_NOTICE" : le message est affiché en utilisant une erreur de type notice
; - "php:Debug::MODE_ENTETE_HTTP" : les messages sont envoyés dans un entête HTTP "X_REST_DEBOGAGE".
; - "Autre valeur" : les messages sont formatés puis retournés par la méthode de débogage utilisée.
debogage_mode = "php:Debug::MODE_ENTETE_HTTP"
; Indique si oui ou non on veut lancer le chronométrage
chronometrage = false
 
; +------------------------------------------------------------------------------------------------------+
; Spécifique aux services
serveur.baseURL = "/yeswiki/api/rest/"
serveur.baseAlternativeURL = "/yeswiki/api/rest/"
/branches/v1.0-pithivier/api/rest/configurations
New file
Property changes:
Added: svn:ignore
+config.ini
/branches/v1.0-pithivier/api/rest/framework.defaut.php
New file
0,0 → 1,7
<?php
// Inclusion du Framework
// Renomer ce fichier en "framework.php"
// Indiquer ci-dessous le chemin absolu vers le fichier Framework.php de la bonne version du Framework
$chemin = '/home/'.$_ENV['USER'].'/www/commun/tbframework/0.3/Framework.php';
require_once $chemin;
?>
/branches/v1.0-pithivier/api/rest/.htaccess
New file
0,0 → 1,9
<files *.ini>
order deny,allow
deny from all
</files>
 
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.*$ index.php/
/branches/v1.0-pithivier/api/rest/bibliotheque/WikiApi.php
New file
0,0 → 1,41
<?php
class WikiApi {
 
private $page = null;
private $wikiObjet = null;
private $cheminWiki = null;
private $cheminApi = null;
 
public function __construct($cheminWiki, $cheminApi) {
$this->cheminWiki = $cheminWiki;
$this->cheminApi = $cheminApi;
}
 
private function initialiser() {
if ($this->page != null) {
$_REQUEST['wiki'] = $this->page;
}
 
ini_set('include_path',ini_get('include_path').':'.$this->cheminWiki.':');
chdir($this->cheminWiki);
include 'api.php';
$this->wikiObjet = $wiki;
chdir($this->cheminApi);
}
 
public function setPageCourante($page) {
$this->page = $page;
}
 
public function __call($methodeNom, $arguments) {
if ($this->wikiObjet == null) {
$this->initialiser();
}
 
chdir($this->cheminWiki);
$retour = call_user_func_array(array($this->wikiObjet, $methodeNom), $arguments);
chdir($this->cheminApi);
return $retour;
}
}
?>
/branches/v1.0-pithivier/api/rest/index.php
New file
0,0 → 1,52
<?php
 
// Permet d'afficher le temps d'execution du service
$temps_debut = (isset($_GET['chrono']) && $_GET['chrono'] == 1) ? microtime(true) : '';
// +-------------------------------------------------------------------------------------------------------------------+
/**
* Serveur REST Wikini
*
* Initialise le chargement et l'exécution des services web.
* Encodage : UTF-8
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright Tela-Botanica 1999-2008
* @licence GPL v3 & CeCILL v2
*/
 
// Le fichier autoload.inc.php du Framework de Tela Botanica doit être appelée avant tout autre chose dans l'application.
// Sinon, rien ne sera chargé.
// Chemin du fichier chargeant le framework requis
$framework = dirname(__FILE__).DIRECTORY_SEPARATOR.'framework.php';
 
if (!file_exists($framework)) {
$e = "Veuillez paramétrer l'emplacement et la version du Framework dans le fichier $framework";
trigger_error($e, E_USER_ERROR);
} else {
// Inclusion du Framework
require_once $framework;
// Ajout d'information concernant cette application
Framework::setCheminAppli(__FILE__);// Obligatoire
Framework::setInfoAppli(Config::get('info'));
 
// Transformation de l'url du handler wikini en url pour le serveur REST
// TODO : améliorer la gestion de l'url entre le wikini et le serveur REST
//$_SERVER['REQUEST_URI'] = Config::get('serveur.baseURL').$_GET['api'];
//$_SERVER['QUERY_STRING'] = $_GET['params'] ? $_GET['params'] : '';
 
// Création de l'objet Wiki qui sera transmis au service via le Registre
Registre::set('cheminApi', getcwd());
Registre::set('cheminWiki', realpath(dirname(__FILE__).DS.'..'.DS.'..'.DS).DS);
$wikiApi = new WikiApi(Registre::get('cheminWiki'), Registre::get('cheminApi'));
Registre::set('wikiApi', $wikiApi);
 
// Initialisation et lancement du serveur
$Serveur = new RestServeur();
$Serveur->executer();
 
// Affiche le temps d'execution du service
if (isset($_GET['chrono']) && $_GET['chrono'] == 1) {
$temps_fin = microtime(true);
echo 'Temps d\'execution : '.round($temps_fin - $temps_debut, 4);
}
}
?>
/branches/v1.0-pithivier/api/rest
New file
Property changes:
Added: svn:ignore
+framework.php
/branches/v1.0-pithivier/api/scripts/modules/migration_smart_flore/MigrationSmartFlore.php
New file
0,0 → 1,109
<?php
// declare(encoding='UTF-8');
/**
*
* @category wiki/smart'Flore
* @package Scripts
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2015 Tela Botanica <accueil@tela-botanica.org>
*/
 
class MigrationSmartFlore extends Script {
 
protected $mode_verbeux = false;
// Paramêtres autorisées lors de l'appel au script en ligne de commande
protected $parametres_autorises = array(
'-n' => array(true, true, 'Nom du fichier ou du dossier à traiter'));
public function executer() {
// L'obligation de mettre un paramètre -a donnée par le framework
// n'a pas de sens, ça ne doit pas être obligatoire !!!
$cmd = $this->getParametre('a');
$this->mode_verbeux = $this->getParametre('v');
switch($cmd) {
case 'tous' :
$this->migrerFormatSmartFlore();
break;
default:
}
}
protected function migrerFormatSmartFlore() {
 
$sections = array("Fiche simplifiée Smart'flore", "Introduction","Comment la reconnaître ?","Son histoire","Ses usages","Écologie & habitat","Ce qu'il faut savoir...","Sources");
$nouvelles_sections = array(
"Description" => array("Introduction","Comment la reconnaître ?","Son histoire"),
"Usages" => array("Ses usages", "Ce qu'il faut savoir..."),
"Écologie & habitat" => array("Écologie & habitat"),
"Sources" => array("Sources")
);
$where_section = 'body NOT LIKE "';
$nouvelles_sections_k = array_keys($nouvelles_sections);
foreach($nouvelles_sections_k as $nouvelle_section_k) {
// Encore et toujours de l'iso (d'ailleurs si on ne fait pas de conversion la requete se comporte
// très bizarrement et renvoie des résultats en trop une fois le script déjà exécuté)
$where_section .= '%'.addslashes(ManipulationPage::convertirTexteAppliVersEncodageWiki($nouvelle_section_k)).'%';
}
$where_section = $where_section.'"';
$this->wiki = Registre::get('wikiApi');
$requete = 'SELECT * FROM '.$this->wiki->GetConfigValue('table_prefix').'pages WHERE latest = "Y" '.
'AND tag LIKE "SmartFlore%nt%" '.
'AND '.$where_section;
 
$pages = $this->wiki->LoadAll($requete);
$pages_fmt = array();
echo "Nombre de pages à migrer : ".count($pages)."\n";
 
if(!empty($pages)) {
$manipulation = new ManipulationPage($this->wiki, $pages[0]);
echo "Migration en cours... \n";
foreach($pages as &$page) {
$page_fmt = array();
// On capte l'entête de la page situé avant la première section pour le recopier
// dans les nouvelles pages (il contient les backlinks et les noms)
$delim_entete = strpos($page["body"], "==== Introduction ====");
if($delim_entete === false) {
$delim_entete = strpos($page["body"], "====Introduction====");
}
// Attention l'entete est en iso, il faut le convertir manuellement
$entete = $manipulation->convertirTexteWikiVersEncodageAppli(substr($page["body"], 0, $delim_entete));
// Par contre ici consulterPageSectionsFormatees est gentil et fait la conversion vers l'encodage de l'appli pour nous
$manipulation->consulterPageSectionsFormatees($page, implode(',', $sections));
// Fusion des anciennes sections dans les nouvelles
foreach($nouvelles_sections as $nom_nouvelle_section => $sections_a_fusionner) {
$page_fmt[$nom_nouvelle_section] = '===='.$nom_nouvelle_section.'====';
foreach($sections_a_fusionner as $section_a_fusionner) {
if(isset($page['sections'][$section_a_fusionner])) {
$page_fmt[$nom_nouvelle_section] .= $page['sections'][$section_a_fusionner];
}
}
}
$corps = $entete."\n".implode("\n", $page_fmt);
$manipulation->ecrirePage($page["tag"], $corps);
}
}
echo "Migration effectuée \n";
// Le exit est là pour empecher l'affichage d'être pollué par les erreurs
// dûes à certaines antédiluviennités de wikini
exit;
}
// http://stackoverflow.com/questions/834303/startswith-and-endswith-functions-in-php
protected function endsWith($haystack, $needle) {
// search forward starting from end minus needle length characters
return $needle === "" || (($temp = strlen($haystack) - strlen($needle)) >= 0 && strpos($haystack, $needle, $temp) !== FALSE);
}
}
/branches/v1.0-pithivier/api/scripts/configurations/config.defaut.ini
New file
0,0 → 1,2
encodage_appli = "UTF-8"
encodage_wiki = "ISO-8859-15"
/branches/v1.0-pithivier/api/scripts/configurations
New file
Property changes:
Added: svn:ignore
+config.ini
/branches/v1.0-pithivier/api/scripts/framework.defaut.php
New file
0,0 → 1,6
<?php
// Inclusion du Framework
// Renomer ce fichier en "framework.php"
// Indiquer ci-dessous le chemin absolu vers le fichier autoload.inc.php de la bonne version du Framework
require_once '/home/www/commun/framework/0.3/Framework.php';
?>
/branches/v1.0-pithivier/api/scripts/bibliotheque/ManipulationPage.php
New file
0,0 → 1,191
<?php
// declare(encoding='UTF-8');
/**
* Librairie de consultation d'une page wiki
*
* @category php 5.2
* @package wapi
* @author Aurélien Peronnet < aurelien@tela-botanica.org>
* @copyright Copyright (c) 2015, Tela Botanica (accueil@tela-botanica.org)
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
* @version $Id$
*/
class ManipulationPage {
// C'est dommage cette classe fait doublon avec la classe contenue dans le dossier rest
// il faudrait faire une factorisation de tout ça
private $wiki = null;
private $pageNom = null;
private $section = null;
private $creerPage = false;
private $templateDefaut = null;
public function __construct($wiki, $pageNom) {
// Cette construction bizarre sert à éviter des bugs issus du comportement de wikini
$this->wiki = $wiki;
global $wiki;
$wiki = $this->wiki;
$this->pageNom = $pageNom;
$this->wiki->setPageCourante($this->pageNom);
}
public function consulterPage($page, $section = null) {
$page = $this->wiki->LoadPage($page);
if ($page != null) {
$this->consulterPageSectionsFormatees($page, $section);
}
return $page;
}
public function consulterPageSectionsFormatees(&$page, $section) {
// attention les wikis sont souvent en ISO !
$page["body"] = $this->convertirTexteWikiVersEncodageAppli($page['body']);
if($section != null) {
$sections_tab = explode(',', $section);
if(count($sections_tab) > 1) {
foreach($sections_tab as $section_t) {
$page["sections"][$section_t] = $this->decouperPageSection($page["body"], $section_t);
}
} else {
$page["body"] = $this->decouperPageSection($page["body"], $section);
}
}
}
public function decouperPageSection($contenu_page, $section) {
$section_retour = '';
if (is_numeric($section)) {
$section_retour = $this->getSectionParNumero($contenu_page, $section);
} else {
$section_retour = $this->getSectionParTitre($contenu_page, $section, false);
}
return $section_retour;
}
public function getSectionParNumero($page, $num) {
preg_match_all('/(=[=]+[ ]*)(.[.^=]*)+[ ]*=[=]+[.]*/i', $page, $sections, PREG_OFFSET_CAPTURE);
$sectionTxt = '';
$debut_section = 0;
$lg_page = strlen($page);
$fin_section = $lg_page;
if ($num <= count($sections[1]) && $num > 0) {
$debut_section = $sections[1][$num - 1][1];
$separateur = trim($sections[1][$num - 1][0]);
$separateur_trouve = false;
for ($i = $num; $i < count($sections[1]); $i++) {
$fin_section = $sections[1][$i][1];
if($separateur == trim($sections[1][$i][0])) {
$separateur_trouve = true;
break;
}
}
$fin_section = $separateur_trouve ? $fin_section : $lg_page;
$sectionTxt = substr($page, $debut_section, $fin_section - $debut_section);
} else {
$sectionTxt = '';
}
 
return $sectionTxt;
}
public function getSectionParTitre($page, $titre, $inclure_titre = false) {
$section = '';
$reg_exp = '/((=[=]+)[ ]*'.preg_quote(trim($titre), '/').'[ ]*=[=]+)[.]*/i';
$match = preg_split($reg_exp, $page, 2, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
if (count($match) > 3) {
$section = explode(trim($match[2]), $match[3], 2);
$section = $section[0];
$section = ($inclure_titre) ? $match[1].$section : $section;
} elseif (count($match) == 3) {
$section = explode(trim($match[1]), $match[2], 2);
$section = $section[0];
$section = ($inclure_titre) ? $match[0].$section : $section;
} else {
$section = "";
}
return $section;
}
private function creerPageAPartirTemplate($tag_page_a_creer, $tag_template) {
$page_template = $this->consulterPage($tag_template);
$corps_nouvelle_page = ($page_template != null) ? $page_template['body'] : '';
// si le template n'existe pas, la page créée sera vide
$ecriture = $this->ecrirePage($tag_page_a_creer, $corps_nouvelle_page);
return $ecriture;
}
/**
*
* Si la section demandée existe dans la page, renvoie un tableau contenant le numéro de caractère de
* début de la section, après son titre, ainsi que la longeur du titre
* @param string $titre de la section
* @param string $page contenu de la page wiki
* @return tableau associatif tel que décrit ici
*/
private function getInformationsPositionSection($titre, $page) {
preg_match_all('/(=[=]+[ ]*'.preg_quote(trim($titre), '/').'[ ]*=[=]+[.]*)/i', $page, $sections, PREG_OFFSET_CAPTURE);
$longueur_titre = 0;
$debut_section_apres_titre = 0;
if (count($sections) > 0 && is_array($sections[0]) && count($sections[0][0]) >= 2) {
$longueur_titre = mb_strlen($sections[0][0][0]);
$debut_section_apres_titre = $sections[0][0][1] + $longueur_titre;
}
// ATTENTION : début contient le numéro du caractere de début de la section, après le titre
$infos = array('debut' => $debut_section_apres_titre,
'longueur_titre' => $longueur_titre
);
return $infos;
}
private function remplacerSection($titre_section, $section_remplacement, $corps) {
// insertion d'un saut de ligne pour empêcher de casser le titre, lorsque le titre
// suivant vient directement après la section, sans saut de ligne ni espace
$section_remplacement = "\n".$section_remplacement."\n";
$section_page_originale = $this->getSectionParTitre($corps, $titre_section, true);
$infos_section = $this->getInformationsPositionSection($titre_section, $corps);
$nb_caracteres_a_remplacer = mb_strlen($section_page_originale) - $infos_section['longueur_titre'];
$nouveau_contenu = substr_replace($corps, $section_remplacement, $infos_section['debut'], $nb_caracteres_a_remplacer);
return $nouveau_contenu;
}
public function ecrirePage($nom_page, $contenu) {
$texte_encode = $this->convertirTexteAppliVersEncodageWiki($contenu);
$ecriture = $this->wiki->SavePage($nom_page, $texte_encode, "", true);
return $ecriture;
}
public static function convertirTexteWikiVersEncodageAppli($texte) {
if (Config::get('encodage_appli') != Config::get('encodage_wiki')) {
$texte = mb_convert_encoding($texte,Config::get('encodage_appli'),Config::get('encodage_wiki'));
}
return $texte;
}
public static function convertirTexteAppliVersEncodageWiki($texte) {
if (Config::get('encodage_appli') != Config::get('encodage_wiki')) {
$texte = mb_convert_encoding($texte,Config::get('encodage_wiki'),Config::get('encodage_appli'));
}
return $texte;
}
}
?>
/branches/v1.0-pithivier/api/scripts/bibliotheque/WikiApi.php
New file
0,0 → 1,54
<?php
class WikiApi {
private $page = null;
private $wikiObjet = null;
private $cheminWiki = null;
private $cheminApi = null;
public function __construct($cheminWiki, $cheminApi) {
$this->cheminWiki = $cheminWiki;
$this->cheminApi = $cheminApi;
$this->initialiser();
}
private function initialiser() {
if ($this->page != null) {
$_REQUEST['wiki'] = $this->page;
}
ini_set('include_path',ini_get('include_path').':'.$this->cheminWiki.':');
chdir($this->cheminWiki);
include 'api.php';
$this->wikiObjet = $wiki;
chdir($this->cheminApi);
}
public function setPageCourante($page) {
$this->page = $page;
}
public function chargerClasseWiki($classe) {
$chemins = array($this->cheminWiki.'/tools/', $this->cheminWiki.'/formatters/');
foreach ($chemins as $chemin) {
$chemin = $chemin.$classe.'.php';
if (file_exists($chemin)) {
require_once $chemin;
$classeTrouvee = true;
}
}
}
public function __call($methodeNom, $arguments) {
 
if ($this->wikiObjet == null) {
$this->initialiser();
}
chdir($this->cheminWiki);
$retour = call_user_func_array(array($this->wikiObjet, $methodeNom), $arguments);
chdir($this->cheminApi);
return $retour;
}
}
?>
/branches/v1.0-pithivier/api/scripts/cli.php
New file
0,0 → 1,44
<?php
// Encodage : UTF-8
// +-------------------------------------------------------------------------------------------------------------------+
/**
* Initialise le chargement et l'exécution des scripts
*
* Lancer ce fichier en ligne de commande avec :
* <code>/opt/lampp/bin/php cli.php mon_script -a test</code>
*
* @category CEL
* @package Scripts
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
 
// Le fichier Framework.php du Framework de Tela Botanica doit être appelée avant tout autre chose dans l'application.
// Sinon, rien ne sera chargé.
// Chemin du fichier chargeant le framework requis
$framework = dirname(__FILE__).DIRECTORY_SEPARATOR.'framework.php';
if (!file_exists($framework)) {
$e = "Veuillez paramétrer l'emplacement et la version du Framework dans le fichier $framework";
trigger_error($e, E_USER_ERROR);
} else {
// Inclusion du Framework
require_once $framework;
 
// Ajout d'information concernant cette application
Framework::setCheminAppli(__FILE__);// Obligatoire
Framework::setInfoAppli(Config::get('info'));
// Création de l'objet Wiki qui sera transmis au service via le Registre
Registre::set('cheminApi', getcwd());
Registre::set('cheminWiki', realpath(dirname(__FILE__).DS.'..'.DS.'..'.DS).DS);
//require_once(getcwd().DS.'bibliotheque'.DS.'WikiApi.php');
$wikiApi = new WikiApi(Registre::get('cheminWiki'), Registre::get('cheminApi'));
Registre::set('wikiApi', $wikiApi);
 
// Initialisation et lancement du script appelé en ligne de commande
Cli::executer();
}
/branches/v1.0-pithivier/api/scripts
New file
Property changes:
Added: svn:ignore
+framework.php
/branches/v1.0-pithivier
New file
Property changes:
Added: svn:ignore
+.buildpath
+.project
+.settings