sourceml devient un plugin mtweb sourceml.0.15
authordj3c1t <dj3c1t@free.fr>
Sun, 23 Jun 2013 20:02:45 +0000 (22:02 +0200)
committerdj3c1t <dj3c1t@free.fr>
Sun, 23 Jun 2013 20:02:45 +0000 (22:02 +0200)
135 files changed:
app/config.xml [new file with mode: 0644]
app/controllers/admin/cache.php [new file with mode: 0644]
app/controllers/admin/licences.php [new file with mode: 0644]
app/controllers/admin/maintenance.php [new file with mode: 0644]
app/controllers/admin/sourceml.php [new file with mode: 0644]
app/controllers/content/sources.php [new file with mode: 0644]
app/controllers/forms/sourceml.php [new file with mode: 0644]
app/controllers/sources/album.php [new file with mode: 0644]
app/controllers/sources/groupe.php [new file with mode: 0644]
app/controllers/sources/morceau.php [new file with mode: 0644]
app/controllers/sources/piste.php [new file with mode: 0644]
app/controllers/users/albums.php [new file with mode: 0644]
app/controllers/users/groupes.php [new file with mode: 0644]
app/controllers/users/morceaux.php [new file with mode: 0644]
app/controllers/users/pistes.php [new file with mode: 0644]
app/controllers/users/sources.php [new file with mode: 0644]
app/data/modules/share/sml_data_sources_cache.php [new file with mode: 0644]
app/data/modules/share/sml_data_sources_xml.php [new file with mode: 0644]
app/data/modules/share/sml_data_sources_xml_format.php [new file with mode: 0644]
app/data/modules/share/sml_data_sources_xml_pathes.php [new file with mode: 0644]
app/data/modules/sql/sml_data_authors.php [new file with mode: 0644]
app/data/modules/sql/sml_data_licences.php [new file with mode: 0644]
app/data/modules/sql/sml_data_source_groupes.php [new file with mode: 0644]
app/data/modules/sql/sml_data_sources.php [new file with mode: 0644]
app/data/modules/sql/sml_data_sources_cache_db.php [new file with mode: 0644]
app/helpers/mw_helper_sourceml_out.php [new file with mode: 0644]
app/observers/mw_observer_sourceml.php [new file with mode: 0644]
app/out/default/config.xml [new file with mode: 0644]
app/out/default/css/actions/forms_sourceml.css [new file with mode: 0644]
app/out/default/css/actions/sources.css [new file with mode: 0644]
app/out/default/css/actions/users_albums.css [new file with mode: 0644]
app/out/default/css/actions/users_groupes.css [new file with mode: 0644]
app/out/default/css/actions/users_morceaux.css [new file with mode: 0644]
app/out/default/css/actions/users_pistes.css [new file with mode: 0644]
app/out/default/css/colorbox.css [new file with mode: 0644]
app/out/default/css/colors.css [new file with mode: 0644]
app/out/default/css/sourceml_accounts.css [new file with mode: 0644]
app/out/default/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png [new file with mode: 0644]
app/out/default/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png [new file with mode: 0644]
app/out/default/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png [new file with mode: 0644]
app/out/default/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png [new file with mode: 0644]
app/out/default/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png [new file with mode: 0644]
app/out/default/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png [new file with mode: 0644]
app/out/default/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png [new file with mode: 0644]
app/out/default/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png [new file with mode: 0644]
app/out/default/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png [new file with mode: 0644]
app/out/default/css/ui-lightness/images/ui-icons_222222_256x240.png [new file with mode: 0644]
app/out/default/css/ui-lightness/images/ui-icons_228ef1_256x240.png [new file with mode: 0644]
app/out/default/css/ui-lightness/images/ui-icons_ef8c08_256x240.png [new file with mode: 0644]
app/out/default/css/ui-lightness/images/ui-icons_ffd27a_256x240.png [new file with mode: 0644]
app/out/default/css/ui-lightness/images/ui-icons_ffffff_256x240.png [new file with mode: 0644]
app/out/default/css/ui-lightness/jquery-ui-1.8.12.custom.css [new file with mode: 0644]
app/out/default/icons/ajax-loader.gif [new file with mode: 0644]
app/out/default/icons/ecouter.png [new file with mode: 0644]
app/out/default/icons/pause.png [new file with mode: 0644]
app/out/default/icons/play.png [new file with mode: 0644]
app/out/default/icons/player_loading.gif [new file with mode: 0644]
app/out/default/icons/stop.png [new file with mode: 0644]
app/out/default/images/colorbox/border.png [new file with mode: 0644]
app/out/default/images/colorbox/controls.png [new file with mode: 0644]
app/out/default/images/colorbox/ie6/borderBottomCenter.png [new file with mode: 0644]
app/out/default/images/colorbox/ie6/borderBottomLeft.png [new file with mode: 0644]
app/out/default/images/colorbox/ie6/borderBottomRight.png [new file with mode: 0644]
app/out/default/images/colorbox/ie6/borderMiddleLeft.png [new file with mode: 0644]
app/out/default/images/colorbox/ie6/borderMiddleRight.png [new file with mode: 0644]
app/out/default/images/colorbox/ie6/borderTopCenter.png [new file with mode: 0644]
app/out/default/images/colorbox/ie6/borderTopLeft.png [new file with mode: 0644]
app/out/default/images/colorbox/ie6/borderTopRight.png [new file with mode: 0644]
app/out/default/images/colorbox/loading.gif [new file with mode: 0644]
app/out/default/images/colorbox/loading_background.png [new file with mode: 0644]
app/out/default/images/colorbox/overlay.png [new file with mode: 0644]
app/out/default/js/actions/admin_cache.js [new file with mode: 0644]
app/out/default/js/actions/admin_sourceml.js [new file with mode: 0644]
app/out/default/js/actions/sources.js [new file with mode: 0644]
app/out/default/js/actions/users.js [new file with mode: 0644]
app/out/default/js/actions/users_groupes.js [new file with mode: 0644]
app/out/default/js/jquery-ui-1.8.12.custom.min.js [new file with mode: 0644]
app/out/default/js/jquery.colorbox-min.js [new file with mode: 0644]
app/out/default/layouts/admin.xml [new file with mode: 0644]
app/out/default/layouts/content.xml [new file with mode: 0644]
app/out/default/layouts/forms.xml [new file with mode: 0644]
app/out/default/layouts/sources.xml [new file with mode: 0644]
app/out/default/layouts/users.xml [new file with mode: 0644]
app/out/default/sources.php [new file with mode: 0644]
app/out/default/views/admin/cache.php [new file with mode: 0644]
app/out/default/views/admin/licences/add.php [new file with mode: 0644]
app/out/default/views/admin/licences/edit.php [new file with mode: 0644]
app/out/default/views/admin/licences/list.php [new file with mode: 0644]
app/out/default/views/admin/maintenance.php [new file with mode: 0644]
app/out/default/views/admin/sourceml.php [new file with mode: 0644]
app/out/default/views/content/sources/sources.php [new file with mode: 0644]
app/out/default/views/content/sources/xml_form.php [new file with mode: 0644]
app/out/default/views/forms/sourceml/contact_author.php [new file with mode: 0644]
app/out/default/views/sources/album/ariane.php [new file with mode: 0644]
app/out/default/views/sources/album/list.php [new file with mode: 0644]
app/out/default/views/sources/album/view.php [new file with mode: 0644]
app/out/default/views/sources/ariane.php [new file with mode: 0644]
app/out/default/views/sources/colonne.php [new file with mode: 0644]
app/out/default/views/sources/current_album.php [new file with mode: 0644]
app/out/default/views/sources/current_album_box.php [new file with mode: 0644]
app/out/default/views/sources/entete_groupe.php [new file with mode: 0644]
app/out/default/views/sources/groupe/ariane.php [new file with mode: 0644]
app/out/default/views/sources/groupe/list.php [new file with mode: 0644]
app/out/default/views/sources/groupe/view.php [new file with mode: 0644]
app/out/default/views/sources/groupe_box.php [new file with mode: 0644]
app/out/default/views/sources/lien_contact.php [new file with mode: 0644]
app/out/default/views/sources/logo_groupe.php [new file with mode: 0644]
app/out/default/views/sources/menu_albums.php [new file with mode: 0644]
app/out/default/views/sources/morceau/ariane.php [new file with mode: 0644]
app/out/default/views/sources/morceau/list.php [new file with mode: 0644]
app/out/default/views/sources/morceau/view.php [new file with mode: 0644]
app/out/default/views/sources/navig_menu.php [new file with mode: 0644]
app/out/default/views/sources/nom_groupe.php [new file with mode: 0644]
app/out/default/views/sources/piste/ariane.php [new file with mode: 0644]
app/out/default/views/sources/piste/list.php [new file with mode: 0644]
app/out/default/views/sources/piste/view.php [new file with mode: 0644]
app/out/default/views/sources/source.php [new file with mode: 0644]
app/out/default/views/sources/source/arbo.php [new file with mode: 0644]
app/out/default/views/sources/source/documents.php [new file with mode: 0644]
app/out/default/views/sources/source/header.php [new file with mode: 0644]
app/out/default/views/sources/source/menu_source.php [new file with mode: 0644]
app/out/default/views/sources/source/metas.php [new file with mode: 0644]
app/out/default/views/users/albums/add.php [new file with mode: 0644]
app/out/default/views/users/albums/edit.php [new file with mode: 0644]
app/out/default/views/users/albums/list.php [new file with mode: 0644]
app/out/default/views/users/groupes/add.php [new file with mode: 0644]
app/out/default/views/users/groupes/edit.php [new file with mode: 0644]
app/out/default/views/users/groupes/list.php [new file with mode: 0644]
app/out/default/views/users/morceaux/add.php [new file with mode: 0644]
app/out/default/views/users/morceaux/edit.php [new file with mode: 0644]
app/out/default/views/users/morceaux/list.php [new file with mode: 0644]
app/out/default/views/users/pistes/add.php [new file with mode: 0644]
app/out/default/views/users/pistes/edit.php [new file with mode: 0644]
app/out/default/views/users/pistes/list.php [new file with mode: 0644]
mw_sourceml.php [new file with mode: 0644]

diff --git a/app/config.xml b/app/config.xml
new file mode 100644 (file)
index 0000000..67903bd
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<config>
+
+  <params>
+    <parent>parent</parent>
+    <status>status</status>
+    <groupe>groupe</groupe>
+    <album>album</album>
+    <morceau>morceau</morceau>
+    <piste>piste</piste>
+    <xml>xml</xml>
+    <derivation>derivation</derivation>
+    <reference>reference</reference>
+  </params>
+
+</config>
\ No newline at end of file
diff --git a/app/controllers/admin/cache.php b/app/controllers/admin/cache.php
new file mode 100644 (file)
index 0000000..b45330a
--- /dev/null
@@ -0,0 +1,37 @@
+<?php
+
+  class mw_admin_cache extends mw_controller{
+
+    function index(){
+      $env = $this->env();
+      $data = $env->data();
+      if(($CONFIG = $env->get_CONFIG()) !== false){
+        if(!isset($CONFIG["cache_actif"])) $CONFIG["cache_actif"] = "0";
+        if(!isset($CONFIG["cache_maj_auto"])) $CONFIG["cache_maj_auto"] = "0";
+        if(!isset($CONFIG["cache_time"])) $CONFIG["cache_time"] = "72";
+        $env->set_out("config", $CONFIG);
+        if($_POST){
+          $env->set_out("config", $_POST);
+          if(preg_match("/^[0-9]+$/", $_POST["cache_time"])){
+            $CONTINUE = true;
+            if($CONTINUE && $data->set_config("cache_actif", $_POST["cache_actif"]));
+            else $CONTINUE = false;
+            if($CONTINUE && $data->set_config("cache_maj_auto", $_POST["cache_maj_auto"]));
+            else $CONTINUE = false;
+            if($CONTINUE && $data->set_config("cache_time", $_POST["cache_time"]));
+            else $CONTINUE = false;
+            if($CONTINUE) $env->redirect(
+              $env->url("admin/cache"),
+              "la configuration du cache a &eacute;t&eacute; enregistr&eacute;e"
+            );
+            else $env->erreur("Impossible d'enregistrer la configuration du cache");
+          }
+          else $env->message("dur&eacute;e de validit&eacute; du cache doit &ecirc;tre un nombre");
+        }
+      }
+      else $env->erreur("Impossible de lire la configuration du cache");
+    }
+
+  }
+
+?>
\ No newline at end of file
diff --git a/app/controllers/admin/licences.php b/app/controllers/admin/licences.php
new file mode 100644 (file)
index 0000000..0ea28df
--- /dev/null
@@ -0,0 +1,86 @@
+<?php
+
+  class mw_admin_licences extends mw_controller
+  {
+    function index(){
+      $env = $this->env();
+      $data = $env->data();
+      if($env->set_out("licences", $data->licences()) !== false)
+      {
+      }
+      else $env->erreur("impossible de lire la liste des licences");
+    }
+
+    function add(){
+      $env = $this->env();
+      $data = $env->data();
+      if($_POST)
+      { $env->set_out("licence", $_POST);
+        if($_POST["nom"])
+        { if
+          ( $data->add_licence
+            ( $_POST["nom"],
+              $_POST["url"]
+            )
+          )
+          $env->redirect
+          ( $env->url("admin/licences"),
+            "la licence <strong>".$_POST["nom"]."</strong> a &eacute;t&eacute; ajout&eacute;e"
+          );
+          else $env->erreur("Impossible d'ajouter la licence");
+        }
+        else $env->message("merci de pr&eacute;ciser un nom");
+      }
+    }
+
+    function edit(){
+      $env = $this->env();
+      $data = $env->data();
+      if($env->set_out("licence", $data->licence($_GET[$env->param("id")])))
+      { if($_POST)
+        { if($_POST["nom"])
+          { $licence = $env->out("licence");
+            $env->set_out("licence", $_POST);
+            if
+            ( $data->set_licence
+              ( $_GET[$env->param("id")],
+                $_POST["nom"],
+                $_POST["url"]
+              )
+            )
+            $env->redirect
+            ( $env->url("admin/licences"),
+              "la licence <strong>".$licence["nom"]."</strong> a &eacute;t&eacute; modifi&eacute;e"
+            );
+            else $env->erreur("Impossible de mettre &agrave; jour la licence");
+          }
+          else $env->message("Merci de pr&eacute;ciser un nom");
+        }
+      }
+      else $env->erreur("impossible de lire la licence");
+    }
+
+    function del(){
+      $env = $this->env();
+      $data = $env->data();
+      if($env->set_out("licence", $data->licence($_GET[$env->param("id")])))
+      { $licence = $env->out("licence");
+        if(($res = $data->del_licence($_GET[$env->param("id")])) !== false)
+        { if($res === 1) $env->redirect
+          ( $env->url("admin/licences"),
+            "Des sources sur ce site utilisent cette licence, elle n'a pas &eacute;t&eacute; supprim&eacute;e.",
+            5
+          );
+          else $env->redirect
+          ( $env->url("admin/licences"),
+            "la licence <strong>".$licence["nom"]."</strong> a &eacute;t&eacute; supprim&eacute;e"
+          );
+        }
+        else $env->erreur("Impossible de supprimer la licence");
+      }
+      else $env->erreur("Impossible de lire les informations de cette licence");
+    }
+
+  }
+
+?>
\ No newline at end of file
diff --git a/app/controllers/admin/maintenance.php b/app/controllers/admin/maintenance.php
new file mode 100644 (file)
index 0000000..7791b50
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+
+  class mw_admin_maintenance extends mw_controller
+  {
+    function index(){
+    }
+
+    function empty_cache(){
+      $env = $this->env();
+      $data = $env->data();
+      if($data->empty_source_cache())
+      { $env->redirect
+        ( $env->url("admin/maintenance"),
+          "le cache a &eacute;t&eacute; vid&eacute;"
+        );
+      }
+      else $env->erreur("Impossible de vider le cache");
+    }
+
+    function maj_all_xml(){
+      $env = $this->env();
+      $data = $env->data();
+      if($data->maj_source_xml_all())
+      { $env->redirect
+        ( $env->url("admin/maintenance"),
+          "les fichiers XML des sources ont &eacute;t&eacute; mis &agrave; jour"
+        );
+      }
+      else $env->erreur("Impossible de mettre &agrave; jour les fichiers XML des sources");
+    }
+
+  }
+
+?>
\ No newline at end of file
diff --git a/app/controllers/admin/sourceml.php b/app/controllers/admin/sourceml.php
new file mode 100644 (file)
index 0000000..cc674c1
--- /dev/null
@@ -0,0 +1,97 @@
+<?php
+
+  class mw_admin_sourceml extends mw_controller
+  {
+
+    var $groupes;
+    var $albums;
+    var $status;
+    var $album_status_id;
+
+    function validate(){
+      $env = $this->env();
+      $data = $env->data();
+      if(($this->status = $data->source_status()) === false)
+      { return "Impossible de lire la liste des status de source";
+      }
+      foreach($this->status as $id_source_status => $source_status)
+      { if($source_status["nom"] == "album") $this->album_status_id = $id_source_status;
+        if(isset($this->album_status_id) && isset($this->morceau_status_id)) break;
+      }
+      if(!isset($this->album_status_id)) return "Type de source inconnu: album";
+      if(($this->groupes = $data->groupes()) === false)
+      { return "Impossible de lire la liste des groupes";
+      }
+      $select = array("status" => $this->album_status_id);
+      if(($this->albums = $data->sources($select)) === false) return "impossible de lire la liste des albums";
+      return true;
+    }
+
+    function index(){
+      $env = $this->env();
+      $data = $env->data();
+      if(!($groupes = $this->groupes)){
+        $env->erreur("Impossible de lire la liste des groupes");
+        return;
+      }
+      if(!($albums = $this->albums)){
+        $env->erreur("Impossible de lire la liste des albums");
+        return;
+      }
+      if(($CONFIG = $env->get_CONFIG()) === false){
+        $env->erreur("Impossible de lire la configuration");
+        return;
+      }
+      if($_POST){
+        if($_POST["start_action"] == "sources/groupe"){
+          if(!$data->set_config("start_action", "sources/groupe")){
+            $env->erreur("impossible d'enregistrer la configuration");
+            return;
+          }
+        }
+        elseif($_POST["start_action"] == "sources/groupe/view"){
+          $params = array("id" => $_POST["groupe_param"]);
+          if(
+                !$data->set_config("start_action", "sources/groupe/view")
+            ||  !$data->set_config("start_action_params", @serialize($params))
+          ){
+            $env->erreur("impossible d'enregistrer la configuration");
+            return;
+          }
+        }
+        elseif($_POST["start_action"] == "sources/album/view"){
+          $params = array("album" => $_POST["album_param"]);
+          if(
+                !$data->set_config("start_action", "sources/album/view")
+            ||  !$data->set_config("start_action_params", @serialize($params))
+          ){
+            $env->erreur("impossible d'enregistrer la configuration");
+            return;
+          }
+        }
+        elseif(
+              isset($CONFIG["start_action"])
+          &&  (
+                ($CONFIG["start_action"] == "sources/groupe")
+            ||  ($CONFIG["start_action"] == "sources/groupe/view")
+            ||  ($CONFIG["start_action"] == "sources/album/view")
+          )
+        ){
+          if(!$data->set_config("start_action", "")){
+            $env->erreur("impossible d'enregistrer la configuration");
+            return;
+          }
+        }
+        $env->redirect(
+          $env->url("admin/sourceml"),
+          "la configuration a été enregistrée"
+        );
+      }
+      $env->set_out("groupes", $this->groupes);
+      $env->set_out("albums", $this->albums);
+      $env->set_out("config", $CONFIG);
+    }
+
+  }
+
+?>
\ No newline at end of file
diff --git a/app/controllers/content/sources.php b/app/controllers/content/sources.php
new file mode 100644 (file)
index 0000000..f76d956
--- /dev/null
@@ -0,0 +1,277 @@
+<?php
+
+  class mw_content_sources extends mw_controller
+  {
+    var $status;
+    var $album_status_id;
+    var $morceau_status_id;
+    var $piste_status_id;
+    var $url_params;
+    var $source_param;
+    var $licences;
+
+    var $groupe;
+    var $source;
+    var $source_controller;
+
+    var $validation_result;
+
+    function validate(){
+      $env = $this->env();
+      $this->validation_result = true;
+      $this->validate_status($env);
+      $this->validate_licences($env);
+      return true;
+    }
+
+    function validate_status(){
+      $env = $this->env();
+      if($this->validation_result === true)
+      { $data = $env->data();
+        if(($this->status = $data->source_status()) !== false)
+        { foreach($this->status as $id_source_status => $source_status)
+          { if($source_status["nom"] == "album") $this->album_status_id = $id_source_status;
+            if($source_status["nom"] == "morceau") $this->morceau_status_id = $id_source_status;
+            if($source_status["nom"] == "piste") $this->piste_status_id = $id_source_status;
+            if(isset($this->album_status_id) && isset($this->morceau_status_id) && isset($this->piste_status_id)) break;
+          }
+          if(!isset($this->album_status_id)) $this->validation_result = "Type de source inconnu: album";
+          elseif(!isset($this->morceau_status_id)) $this->validation_result = "Type de source inconnu: morceau";
+          elseif(!isset($this->piste_status_id)) $this->validation_result = "Type de source inconnu: piste";
+        }
+        else $this->validation_result = "Impossible de lire la liste des status de source";
+      }
+    }
+
+    function validate_licences(){
+      $env = $this->env();
+      if($this->validation_result === true)
+      { $data = $env->data();
+        if(($this->licences = $data->licences()) !== false)
+        { $env->set_out("licences", $this->licences);
+        }
+        else $this->validation_result = "Impossible de lire la liste des licences";
+      }
+    }
+
+    function validate_source(){
+      $env = $this->env();
+      if($this->validation_result === true)
+      { $data = $env->data();
+        if(isset($_GET[$env->param("id")]) && $_GET[$env->param("id")])
+        { if($this->source = $data->source($_GET[$env->param("id")]))
+          {
+          }
+          else $this->validation_result = "Impossible de lire les informations de la source";
+        }
+        else $this->validation_result = "parametre source manquant";
+      }
+    }
+
+    function validate_groupes(){
+      $env = $this->env();
+      if($this->validation_result === true)
+      { $data = $env->data();
+        if(($groupes = $data->groupes()) !== false)
+        { $env->set_out("groupes", $groupes);
+          if(isset($_GET[$env->param("groupe")]) && $_GET[$env->param("groupe")])
+          { if(($this->groupe = $data->groupe($_GET[$env->param("groupe")])) !== false)
+            { $env->set_out("groupe", $groupe);
+            }
+            else $this->validation_result = "Impossible de lire les informations du groupe";
+          }
+        }
+        else $this->validation_result = "Impossible de lire la liste des groupes";
+      }
+    }
+
+    function sources(){
+      $env = $this->env();
+      $this->validate_source($env);
+      if($this->validation_result === true)
+      { $data = $env->data();
+        $sources = array("list" => array(), "total" => 0);
+        if($this->source)
+        { if(($source_ariane = $data->source_ariane($this->source["id"])) !== false)
+          { $this->url_params = array();
+            foreach($source_ariane as $id_composition => $composition)
+            { if($composition["status"] == $this->morceau_status_id) $this->url_params["morceau"] = $id_composition;
+              elseif($composition["status"] == $this->album_status_id) $this->url_params["album"] = $id_composition;
+            }
+            if($this->source["status"] == $this->morceau_status_id)
+            { $this->source_param = $env->set_out("source_param", "piste");
+              $this->source_controller = $env->set_out("source_controller", "piste");
+              $this->url_params["morceau"] = $this->source["id"];
+            }
+            elseif($this->source["status"] == $this->album_status_id)
+            { $this->source_param = $env->set_out("source_param", "morceau");
+              $this->source_controller = $env->set_out("source_controller", "morceau");
+              $this->url_params["album"] = $this->source["id"];
+            }
+            $env->set_out("url_params", $this->url_params);
+            if(($_sources = $data->source_compositions(array("id_composition" => $this->source["id"]))) !== false)
+            { if(isset($_sources[$this->source["id"]]) && $_sources[$this->source["id"]])
+              { foreach($_sources[$this->source["id"]] as $id_source)
+                { if(($sources["list"][$id_source] = $data->source($id_source, true)) !== false)
+                  { $sources["total"]++;
+                  }
+                  else
+                  { $this->erreur("Impossible de lire les informations de l'une des sources");
+                    break;
+                  }
+                }
+              }
+              $sources["list"] = $data->ordonne($sources["list"], "ordre");
+              $env->set_out("sources", $sources);
+            }
+            else $this->erreur("Impossible de lire la liste des sources");
+          }
+          else $this->erreur("Impossible de lire le fil d'ariane");
+        }
+        else $this->erreur("Impossible de lire les informations de la source");
+      }
+      else $this->erreur($this->validation_result);
+    }
+
+    function derivations(){
+      $env = $this->env();
+      $this->validate_source($env);
+      if($this->validation_result === true)
+      { $data = $env->data();
+        $derivations = array("list" => array(), "total" => 0);
+        if($this->source)
+        { if(($source_ariane = $data->source_ariane($this->source["id"])) !== false)
+          { $this->url_params = array();
+            foreach($source_ariane as $id_composition => $composition)
+            { if($composition["status"] == $this->morceau_status_id) $this->url_params["morceau"] = $id_composition;
+              elseif($composition["status"] == $this->album_status_id) $this->url_params["album"] = $id_composition;
+            }
+            if($this->source["status"] == $this->piste_status_id)
+            { $this->source_param = $env->set_out("source_param", "piste");
+              $this->source_controller = $env->set_out("source_controller", "piste");
+              $this->url_params["piste"] = $this->source["id"];
+            }
+            elseif($this->source["status"] == $this->morceau_status_id)
+            { $this->source_param = $env->set_out("source_param", "morceau");
+              $this->source_controller = $env->set_out("source_controller", "morceau");
+              $this->url_params["morceau"] = $this->source["id"];
+            }
+            $env->set_out("url_params", $this->url_params);
+            if(($_derivations = $data->source_derivations(array("derivation" => $this->source["id"]))) !== false)
+            { foreach($_derivations as $id_derivation => $derivation)
+              { if(($derivations["list"][$id_derivation] = $data->source($id_derivation, true)) !== false)
+                { $derivations["total"]++;
+                }
+                else
+                { $this->erreur("Impossible de lire les informations de l'une des derivations");
+                  break;
+                }
+              }
+              $derivations["list"] = $data->ordonne($derivations["list"], "ordre");
+              $env->set_out("sources", $derivations);
+            }
+            else $this->erreur("Impossible de lire la liste des derivations");
+          }
+          else $this->validation_result = "Impossible de lire le fil d'ariane";
+        }
+        else $this->erreur("Impossible de lire les informations de la source");
+      }
+      else $this->erreur($this->validation_result);
+    }
+
+    function xml_form(){
+      $env = $this->env();
+      if(isset($_GET[$env->param("form")]))
+      { $data = $env->data();
+        $form_params = array();
+        if(isset($_GET[$env->param("derivation")]))
+        { if($_GET[$env->param("form")] == "edit")
+          { if(($source_derivation = $data->source_derivation($_GET[$env->param("derivation")])) !== false)
+            { $source = array
+              ( "id" => $source_derivation["id"],
+                "xml" => array
+                ( "url" => $source_derivation["derivation"],
+                  "content" => "",
+                  "use_edit_content" => false
+                )
+              );
+              $derivation_edit_file = $data->derivation_edit_xml_path($source_derivation["id_source"], $source_derivation["id"]);
+              if(file_exists($derivation_edit_file))
+              { if(($derivation_edit_content = $data->get_edit_derivation_content($source_derivation["id_source"], $source_derivation["id"])) !== false)
+                { if(($source = $data->source_xml_read($source_derivation["derivation"], $derivation_edit_content)) !==false)
+                  { $source["xml"] = array
+                    ( "url" => $source_derivation["derivation"],
+                      "content" => $derivation_edit_content,
+                      "use_edit_content" => true
+                    );
+                  }
+                  else $this->erreur("Impossible de lire le XML de la source");
+                }
+                else $this->erreur("Impossible de lire le XML de la source");
+              }
+              else
+              { if(($source = $data->source_xml_read($source_derivation["derivation"])) === false)
+                { $source = $data->empty_source();
+                }
+              }
+              $source["id_source"] = $source_derivation["id_source"];
+              $source["id"] = $_GET[$env->param("derivation")];
+              $form_params["maj_url"] = $env->url("users/morceaux/maj_xml", array("id" => $_GET[$env->param("derivation")], "xml" => "derivation"));
+            }
+          }
+          elseif($_GET[$env->param("form")] == "add"){
+            $source = $data->empty_source();
+            $source["id"] = $_GET[$env->param("derivation")];
+            $source["xml"] = array(
+              "use_edit_content" => false,
+              "content" => ""
+            );
+          }
+          $form_params["name"] = "derivation";
+          $form_params["label"] = "d&eacute;rive de &raquo; ";
+          $form_params["can_delete"] = true;
+          $form_params["id"] = $_GET[$env->param("derivation")];
+        }
+        elseif(isset($_GET[$env->param("reference")]))
+        { 
+        }
+        $env->set_out("form_params", $form_params);
+        $env->set_out("xml_form_source", $source);
+      }
+      else $this->erreur("Parametres invalides pour le formulaire");
+    }
+
+    function xml(){
+      $env = $this->env();
+      $this->validate_source($env);
+      if($this->validation_result === true)
+      { $data = $env->data();
+        $xml = "";
+        if($this->source)
+        { if($this->source = $data->load_source($this->source))
+          { $xml =
+             "<pre>"
+            .htmlentities
+            ( $this->source["reference"] ? $this->source["reference"]["xml"]["content"] : $this->source["xml"]["content"],
+              ENT_COMPAT,
+              "UTF-8"
+            )
+            ."</pre>";
+          }
+          else $this->erreur("Impossible de lire les informations XML de la source");
+        }
+        else $this->erreur("Impossible de lire les informations de la source");
+      }
+      else $this->erreur($this->validation_result);
+      echo $xml;
+      exit;
+    }
+
+    function erreur($content)
+    { echo $content;
+      exit;
+    }
+
+  }
+
+?>
\ No newline at end of file
diff --git a/app/controllers/forms/sourceml.php b/app/controllers/forms/sourceml.php
new file mode 100644 (file)
index 0000000..46fc014
--- /dev/null
@@ -0,0 +1,97 @@
+<?php
+
+  class mw_forms_sourceml extends mw_controller{
+
+    var $forms_contact_mod;
+
+    function validate(){
+      $env = $this->env();
+      if($this->forms_contact_mod = $env->get_controller("forms/contact")){
+        return $this->forms_contact_mod->validate();
+      }
+      return "impossible de trouver le controlleur forms/contact";
+    }
+
+    function contact_author(){
+      $env = $this->env();
+      if(file_exists($env->path("mw_dir")."libs/ptitcaptcha.php")) require_once $env->path("mw_dir")."libs/ptitcaptcha.php";
+      $data = $env->data();
+      if(($status = $data->source_status()) !== false)
+      { foreach($status as $id_source_status => $source_status)
+        { if($source_status["nom"] == "album") $album_status_id = $id_source_status;
+          if(isset($album_status_id)) break;
+        }
+        if(isset($album_status_id))
+        { if($groupe = $data->groupe($_GET[$env->param("id")]))
+          { if($groupe["contact_form"] && $groupe["email"])
+            { $env->set_out("groupe", $groupe);
+              $select = array("status" => $album_status_id);
+              $select["id_groupe"] = $groupe["id"];
+              if(($albums = $data->sources($select)) !== false)
+              { $env->set_out("albums", $albums);
+                if($_POST)
+                { if
+                  ( $this->send
+                    ( $env,
+                      $_POST["email"],
+                      "[".$env->config("site_name")." - ".$groupe["nom"]."] nouveau message",
+                      $_POST["message"],
+                      $groupe["email"],
+                      $groupe["captcha"]
+                    )
+                  )
+                  { $env->redirect
+                    ( $env->url("sources/groupe/view", array("id" => $_GET[$env->param("id")])),
+                      "Le message a &eacute;t&eacute; envoy&eacute;"
+                    );
+                  }
+                }
+              }
+              else $env->erreur("impossible de lire la liste des albums");
+            }
+            else
+            { $env->run("sources/groupe/view", array("get" => array("id" => $groupe["id"])));
+              return;
+            }
+          }
+          else $env->erreur("Impossible de lire les informations du groupe");
+        }
+        else $env->erreur("Type de source inconnu: album");
+      }
+      else $env->erreur("Impossible de lire la liste des status de source");
+    }
+
+    function send(&$env, $from, $titre, $message, $dest, $captcha)
+    { $env->set_out("ENVOYE", false);
+      if($captcha && !class_exists("PtitCaptchaHelper")){
+        $env->erreur("fichier du captcha introuvable");
+        return false;
+      }
+      if(!$captcha || PtitCaptchaHelper::checkCaptcha())
+      { if($from)
+        { if($dest)
+          { if
+            ( mail
+              ( $dest,
+                $titre,
+                $message,
+                 "From: ".$from."\r\n"
+                ."Reply-To: ".$from."\r\n"
+              )
+            )
+            { $env->set_out("ENVOYE", true);
+              return true;
+            }
+            else $env->erreur("Erreur &agrave; l'envoi du mail");
+          }
+          else $env->erreur("Impossible de trouver l'email du destinataire");
+        }
+        else $env->message("merci de pr&eacute;ciser un email");
+      }
+      else $env->message("anti-spam incorrect");
+      return false;
+    }
+
+  }
+
+?>
\ No newline at end of file
diff --git a/app/controllers/sources/album.php b/app/controllers/sources/album.php
new file mode 100644 (file)
index 0000000..3640ac8
--- /dev/null
@@ -0,0 +1,79 @@
+<?php
+
+  class mw_sources_album extends mw_controller
+  {
+    var $content_sources_mod;
+
+    function validate(){
+      $env = $this->env();
+      if($this->content_sources_mod = $env->get_controller("content/sources"))
+      { $this->content_sources_mod->validation_result = true;
+        $this->content_sources_mod->validate_status($env);
+        $this->content_sources_mod->validate_licences($env);
+        return $this->content_sources_mod->validation_result;
+      }
+      return "impossible de valider le module";
+    }
+
+    function index(){
+      $env = $this->env();
+      $data = $env->data();
+      if(isset($this->content_sources_mod->licences) && $this->content_sources_mod->licences !== false)
+      { $env->set_out("licences", $this->content_sources_mod->licences);
+        if(($groupes = $data->groupes()) !== false)
+        { $env->set_out("groupes", $groupes);
+          $select = array();
+          $select["status"] = $this->content_sources_mod->album_status_id;
+          $select["order_by"] = "ordre";
+          if(isset($_GET[$env->param("groupe")]) && $_GET[$env->param("groupe")]) $select["id_groupe"] = $_GET[$env->param("groupe")];
+          $select["start"] = isset($_GET[$env->param("start")]) && $_GET[$env->param("start")] ? $_GET[$env->param("start")] : 0;
+          if(($albums = $data->sources($select)) !== false)
+          { $env->set_out("albums", $albums);
+            if(isset($_GET[$env->param("groupe")]) && $_GET[$env->param("groupe")])
+            { if(($groupe = $data->groupe($_GET[$env->param("groupe")])) !== false)
+              { $env->set_out("groupe", $groupe);
+              }
+              else $env->erreur("Impossible de lire les informations du groupe");
+            }
+          }
+          else $env->erreur("Impossible de lire la liste des albums");
+        }
+        else $env->erreur("Impossible de lire la liste des groupes");
+      }
+    }
+
+    function view(){
+      $env = $this->env();
+      $data = $env->data();
+      if(isset($this->content_sources_mod->licences) && $this->content_sources_mod->licences !== false)
+      { $env->set_out("licences", $this->content_sources_mod->licences);
+        if(isset($_GET[$env->param("album")]) && $_GET[$env->param("album")])
+        { if($album = $data->source($_GET[$env->param("album")], true))
+          { $env->set_out("album", $album);
+            if($groupe = $data->get_admin_groupe($album["groupes"]))
+            { $env->set_out("groupe", $groupe);
+              $select = array("status" => $this->content_sources_mod->album_status_id);
+              $select["id_groupe"] = $groupe["id"];
+              if(($albums = $data->sources($select)) !== false)
+              { $env->set_out("albums", $albums);
+                $select = array("status" => $this->content_sources_mod->morceau_status_id);
+                $select["id_composition"] = $album["id"];
+                $select["start"] = isset($_GET[$env->param("start")]) && $_GET[$env->param("start")] ? $_GET[$env->param("start")] : 0;
+                if(($morceaux = $data->sources($select)) !== false)
+                { $env->set_out("morceaux", $morceaux);
+                }
+                else $env->erreur("impossible de lire la liste des morceaux");
+              }
+              else $env->erreur("impossible de lire la liste des albums");
+            }
+            else $env->erreur("Impossible de lire les informations du groupe");
+          }
+          else $env->erreur("Impossible de lire les informations de l'album");
+        }
+        else $env->erreur("parametre d'album manquant");
+      }
+    }
+
+  }
+
+?>
\ No newline at end of file
diff --git a/app/controllers/sources/groupe.php b/app/controllers/sources/groupe.php
new file mode 100644 (file)
index 0000000..3400d7e
--- /dev/null
@@ -0,0 +1,55 @@
+<?php
+
+  class mw_sources_groupe extends mw_controller
+  {
+    var $content_sources_mod;
+
+    function validate(){
+      $env = $this->env();
+      if($this->content_sources_mod = $env->get_controller("content/sources"))
+      { $this->content_sources_mod->validation_result = true;
+        $this->content_sources_mod->validate_status($env);
+        $this->content_sources_mod->validate_licences($env);
+        return $this->content_sources_mod->validation_result;
+      }
+      return "impossible de valider le module";
+    }
+
+    function index(){
+      $env = $this->env();
+      $data = $env->data();
+      if
+      ( ( $groupes = $data->groupes
+          ( null,
+            isset($_GET[$env->param("start")]) ? $_GET[$env->param("start")] : 0
+          )
+        ) !== false
+      ) $env->set_out("groupes", $groupes);
+      else $env->erreur("Impossible de lire la liste des groupes");
+    }
+
+    function view(){
+      $env = $this->env();
+      $data = $env->data();
+      if(isset($this->content_sources_mod->licences) && $this->content_sources_mod->licences !== false)
+      { $env->set_out("licences", $this->content_sources_mod->licences);
+        if(isset($_GET[$env->param("id")]) && $_GET[$env->param("id")])
+        { if(($groupe = $data->groupe($_GET[$env->param("id")])) !== false)
+          { $env->set_out("groupe", $groupe);
+            $select = array("status" => $this->content_sources_mod->album_status_id);
+            $select["id_groupe"] = $groupe["id"];
+            if(($albums = $data->sources($select)) !== false)
+            { $env->set_out("albums", $albums);
+            }
+            else $env->erreur("impossible de lire la liste des albums");
+          }
+          else $env->erreur("Impossible de lire les informations du groupe");
+        }
+        else $env->erreur("parametre de groupe manquant");
+      }
+      else $env->erreur("Impossible de lire la liste des licences");
+    }
+
+  }
+
+?>
\ No newline at end of file
diff --git a/app/controllers/sources/morceau.php b/app/controllers/sources/morceau.php
new file mode 100644 (file)
index 0000000..802430a
--- /dev/null
@@ -0,0 +1,109 @@
+<?php
+
+  class mw_sources_morceau extends mw_controller
+  {
+    var $content_sources_mod;
+
+    function validate(){
+      $env = $this->env();
+      if($this->content_sources_mod = $env->get_controller("content/sources"))
+      { $this->content_sources_mod->validation_result = true;
+        $this->content_sources_mod->validate_status($env);
+        $this->content_sources_mod->validate_licences($env);
+        return $this->content_sources_mod->validation_result;
+      }
+      return "impossible de valider le module";
+    }
+
+    function index(){
+      $env = $this->env();
+      $data = $env->data();
+      if($this->content_sources_mod->licences !== false)
+      { $env->set_out("licences", $this->content_sources_mod->licences);
+        if(($groupes = $data->groupes()) !== false)
+        { $env->set_out("groupes", $groupes);
+          $groupe = null;
+          $album = null;
+          if(isset($_GET[$env->param("groupe")]) && $_GET[$env->param("groupe")])
+          { if(isset($groupes["list"][$_GET[$env->param("groupe")]]))
+            { $groupe = $groupes["list"][$_GET[$env->param("groupe")]];
+              $env->set_out("groupe", $groupe);
+            }
+            else $groupe = false;
+          }
+          if($groupe !== false)
+          { if(isset($_GET[$env->param("album")]) && $_GET[$env->param("album")])
+            { if(($album = $data->source($_GET[$env->param("album")], true)) !== false)
+              { $env->set_out("album", $album);
+                if(!isset($groupe))
+                { $groupe = $data->get_admin_groupe($album["groupes"]);
+                  if(!$groupe) $groupe = false;
+                }
+              }
+            }
+          }
+          if($groupe !== false)
+          { $env->set_out("groupe", $groupe);
+            if($album !== false)
+            { $select = array("status" => $this->content_sources_mod->album_status_id);
+              if(isset($groupe)) $select["id_groupe"] = $groupe["id"];
+              if(($albums = $data->sources($select)) !== false)
+              { $env->set_out("albums", $albums);
+                $select = array();
+                $select["status"] = $this->content_sources_mod->morceau_status_id;
+                $select["order_by"] = "ordre";
+                if(isset($groupe)) $select["id_groupe"] = $groupe["id"];
+                if(isset($_GET[$env->param("album")])) $select["id_composition"] = $_GET[$env->param("album")];
+                $select["start"] = isset($_GET[$env->param("start")]) && $_GET[$env->param("start")] ? $_GET[$env->param("start")] : 0;
+                if(($morceaux = $data->sources($select, true)) !== false) $env->set_out("morceaux", $morceaux);
+                else $env->erreur("Impossible de lire la liste des morceaux");
+              }
+              else $env->erreur("impossible de lire la liste des albums");
+            }
+            else $env->erreur("Impossible de lire les informations de l'album");
+          }
+          else $env->erreur("Impossible de lire les informations du groupe");
+        }
+        else $env->erreur("Impossible de lire la liste des groupes");
+      }
+      else $env->erreur("Impossible de lire la liste des licences");
+    }
+
+    function view(){
+      $env = $this->env();
+      $data = $env->data();
+      if($this->content_sources_mod->licences !== false)
+      { $env->set_out("licences", $this->content_sources_mod->licences);
+        if(isset($_GET[$env->param("morceau")]) && $_GET[$env->param("morceau")])
+        { if($morceau = $data->source($_GET[$env->param("morceau")], true))
+          { $env->set_out("morceau", $morceau);
+            if($groupe = $data->get_admin_groupe($morceau["groupes"]))
+            { $env->set_out("groupe", $groupe);
+              $select = array("status" => $this->content_sources_mod->album_status_id);
+              $select["id_groupe"] = $groupe["id"];
+              if(($albums = $data->sources($select)) !== false)
+              { $env->set_out("albums", $albums);
+                if(($ariane = $data->source_ariane($morceau["id"])) !== false)
+                { $ariane = array_reverse($ariane);
+                  $album = null;
+                  foreach($ariane as $id_ariane => $source_ariane)
+                  { if(!isset($album)) $album = $source_ariane;
+                  }
+                  if($album) $env->set_out("album", $album);
+                }
+                else $env->erreur("Impossible de lire le fil d'ariane");
+              }
+              else $env->erreur("impossible de lire la liste des albums");
+            }
+            else $env->erreur("Impossible de lire les informations du groupe");
+          }
+          else $env->erreur("Impossible de lire les informations du morceau");
+        }
+        else $env->erreur("identifiant de morceau manquant");
+      }
+      else $env->erreur("Impossible de lire la liste des licences");
+    }
+
+  }
+
+?>
\ No newline at end of file
diff --git a/app/controllers/sources/piste.php b/app/controllers/sources/piste.php
new file mode 100644 (file)
index 0000000..668892f
--- /dev/null
@@ -0,0 +1,114 @@
+<?php
+
+  class mw_sources_piste extends mw_controller
+  {
+    var $content_sources_mod;
+
+    function validate(){
+      $env = $this->env();
+      if($this->content_sources_mod = $env->get_controller("content/sources"))
+      { $this->content_sources_mod->validation_result = true;
+        $this->content_sources_mod->validate_status($env);
+        $this->content_sources_mod->validate_licences($env);
+        return $this->content_sources_mod->validation_result;
+      }
+      return "impossible de valider le module";
+    }
+
+    function index(){
+      $env = $this->env();
+      $data = $env->data();
+      if(isset($this->content_sources_mod->licences) && $this->content_sources_mod->licences !== false)
+      { $env->set_out("licences", $this->content_sources_mod->licences);
+        if(($groupes = $data->groupes()) !== false)
+        { $env->set_out("groupes", $groupes);
+          $groupe = null;
+          $morceau = null;
+          if(isset($_GET[$env->param("groupe")]) && $_GET[$env->param("groupe")])
+          { if(isset($groupes["list"][$_GET[$env->param("groupe")]]))
+            { $groupe = $groupes["list"][$_GET[$env->param("groupe")]];
+              $env->set_out("groupe", $groupe);
+            }
+            else $groupe = false;
+          }
+          if($groupe !== false)
+          { if(isset($_GET[$env->param("morceau")]) && $_GET[$env->param("morceau")])
+            { if(($morceau = $data->source($_GET[$env->param("morceau")], true)) !== false)
+              { $env->set_out("morceau", $morceau);
+                if(!isset($groupe))
+                { $groupe = $data->get_admin_groupe($morceau["groupes"]);
+                  if(!$groupe) $groupe = false;
+                }
+              }
+            }
+          }
+          if($groupe !== false)
+          { $env->set_out("groupe", $groupe);
+            if($morceau !== false)
+            { $select = array("status" => $this->content_sources_mod->morceau_status_id);
+              if(isset($groupe)) $select["id_groupe"] = $groupe["id"];
+              if(($morceaux = $data->sources($select)) !== false)
+              { $env->set_out("morceaux", $morceaux);
+                $select = array();
+                $select["status"] = $this->content_sources_mod->piste_status_id;
+                $select["order_by"] = "ordre";
+                if(isset($groupe)) $select["id_groupe"] = $groupe["id"];
+                if(isset($_GET[$env->param("morceau")])) $select["id_composition"] = $_GET[$env->param("morceau")];
+                $select["start"] = isset($_GET[$env->param("start")]) && $_GET[$env->param("start")] ? $_GET[$env->param("start")] : 0;
+                if(($pistes = $data->sources($select, true)) !== false) $env->set_out("pistes", $pistes);
+                else $env->erreur("Impossible de lire la liste des pistes");
+              }
+              else $env->erreur("impossible de lire la liste des morceaux");
+            }
+            else $env->erreur("Impossible de lire les informations du morceau");
+          }
+          else $env->erreur("Impossible de lire les informations du groupe");
+        }
+        else $erreur = "impossible de lire la liste des groupes";
+      }
+      else $env->erreur("impossible de lire la liste des licences");
+    }
+
+    function view(){
+      $env = $this->env();
+      $data = $env->data();
+      if(isset($this->content_sources_mod->licences) && $this->content_sources_mod->licences !== false)
+      { $env->set_out("licences", $this->content_sources_mod->licences);
+        if(isset($_GET[$env->param("piste")]) && $_GET[$env->param("piste")])
+        { if($piste = $data->source($_GET[$env->param("piste")], true))
+          { $env->set_out("piste", $piste);
+            if($groupe = $data->get_admin_groupe($piste["groupes"]))
+            { $env->set_out("groupe", $groupe);
+              $select = array("status" => $this->content_sources_mod->album_status_id);
+              $select["id_groupe"] = $groupe["id"];
+              if(($albums = $data->sources($select)) !== false)
+              { $env->set_out("albums", $albums);
+                if(($ariane = $data->source_ariane($piste["id"])) !== false)
+                { $ariane = array_reverse($ariane);
+                  $morceau = null;
+                  $album = null;
+                  foreach($ariane as $id_ariane => $source_ariane)
+                  { if(!isset($morceau)) $morceau = $source_ariane;
+                    else
+                    { if(!isset($album)) $album = $source_ariane;
+                    }
+                  }
+                  if($morceau) $env->set_out("morceau", $morceau);
+                  if($album) $env->set_out("album", $album);
+                }
+                else $env->erreur("Impossible de lire le fil d'ariane");
+              }
+              else $env->erreur("impossible de lire la liste des albums");
+            }
+            else $env->erreur("Impossible de lire les informations du groupe");
+          }
+          else $env->erreur("Impossible de lire les informations de la source");
+        }
+        else $env->erreur("parametre de piste manquant");
+      }
+      else $env->erreur("impossible de lire la liste des licences");
+    }
+
+  }
+
+?>
\ No newline at end of file
diff --git a/app/controllers/users/albums.php b/app/controllers/users/albums.php
new file mode 100644 (file)
index 0000000..b26e200
--- /dev/null
@@ -0,0 +1,260 @@
+<?php
+
+  class mw_users_albums extends mw_controller
+  {
+    var $groupes;
+    var $album;
+    var $user;
+    var $status;
+    var $album_status_id;
+
+    function validate(){
+      $env = $this->env();
+      $data = $env->data();
+      if(($this->status = $data->source_status()) !== false)
+      { foreach($this->status as $id_source_status => $source_status)
+        { if($source_status["nom"] == "album")
+          { $this->album_status_id = $id_source_status;
+            break;
+          }
+        }
+        if(isset($this->album_status_id))
+        { if($this->user = $env->user())
+          { if(($this->groupes = $data->groupes($this->user["id"])) !== false)
+            { $env->set_out("groupes", $this->groupes);
+              if($env->etat("action") == "edit" || $env->etat("action") == "del")
+              { if(($this->album = $data->source($_GET[$env->param("id")], true)) !== false && $this->album)
+                {
+                }
+                else return "Impossible de lire les informations de l'album";
+              }
+              if($env->etat("action") == "add" || $env->etat("action") == "edit")
+              { if(($this->licences = $data->licences()) !== false)
+                { $env->set_out("licences", $this->licences);
+                }
+                else return "Impossible de lire la liste des licences";
+              }
+            }
+            else return "Impossible de lire la liste des groupes";
+          }
+          else return "Vous devez &ecirc;tre identifier pour acc&eacute;der &agrave; cette page";
+        }
+        else return "Type de source inconnu: album";
+      }
+      else return "Impossible de lire la liste des status de source";
+      return true;
+    }
+
+    function index(){
+      $env = $this->env();
+      $data = $env->data();
+      $select = array();
+      $select["status"] = $this->album_status_id;
+      $select["id_user"] = $this->user["id"];
+      $select["order_by"] = "ordre";
+      $select["start"] = isset($_GET[$env->param("start")]) && $_GET[$env->param("start")] ? $_GET[$env->param("start")] : 0;
+      if(isset($_GET[$env->param("groupe")]) && $_GET[$env->param("groupe")]) $select["id_groupe"] = $_GET[$env->param("groupe")];
+      if(($albums = $data->sources($select)) !== false)
+      { foreach($albums["list"] as $id_album => $album)
+        { $albums["list"][$id_album]["permissions"] = $data->source_permissions($albums["list"][$id_album], $this->user["id"]);
+        }
+        if($_POST)
+        { $OK = true;
+          foreach($albums["list"] as $id_album => $album)
+          { if(isset($_POST["ordre_".$id_album]))
+            { if($data->set_source_info($id_album, "ordre", $_POST["ordre_".$id_album]) === false)
+              { $OK = false;
+                break;
+              }
+            }
+          }
+          if($OK)
+          { $get_params = array();
+            if(isset($_GET[$env->param("groupe")]) && $_GET[$env->param("groupe")]) $get_params["groupe"] = $_GET[$env->param("groupe")];
+            $env->redirect
+            ( $env->url("users/albums", $get_params),
+              "l'ordre des albums a &eacute;t&eacute; enregistr&eacute;"
+            );
+          }
+          else $env->erreur("Impossible d'enregistrer l'ordre des albums");
+        }
+        $env->set_out("albums", $albums);
+      }
+      else $env->erreur("Impossible de lire la liste des albums");
+    }
+
+    function add(){
+      $env = $this->env();
+      $data = $env->data();
+      if($data->check_user_uploads_dir())
+      { $web_path = $env->path("web");
+        $upload_dir = $env->path("content")."uploads/".$this->user["id"];
+        $_SESSION["upload_dir"] = $web_path.($web_path ? "" : "/").$upload_dir;
+        $this->album = $data->empty_source();
+        $source_infos = array
+        ( "date_inscription" => date("Y")."-".date("m")."-".date("d"),
+          "ordre" => 0
+        );
+        if($_POST)
+        { if(($groupe = $data->groupe($_POST["id_groupe"])) !== false)
+          { $groupe["id_groupe_status"] = $data->id_groupe_status_admin();
+            $env->set_out("groupe", $groupe);
+            $this->album["groupes"] = array($groupe["id"] => $groupe);
+            $this->album["titre"] = trim($_POST["titre"]);
+            $this->album["licence"] = array
+            ( "id" => $_POST["licence"]
+            );
+            $source_infos["date_creation"] = $_POST["annee_date_creation"]."-".$_POST["mois_date_creation"]."-".$_POST["jour_date_creation"];
+            $source_infos["description"] = $_POST["description"];
+            foreach($_POST as $post_key => $post_value)
+            { if(substr($post_key, 0, 13) == "document_nom_")
+              { if($id_document = substr($post_key, 13))
+                { $this->album["documents"][$id_document] = array
+                  ( "nom" => $_POST["document_nom_".$id_document],
+                    "url" => $_POST["document_url_".$id_document]
+                  );
+                }
+              }
+            }
+            if($this->album["titre"])
+            { if(($image = $data->upload("image", $upload_dir)) !== false)
+              { if($image) $source_infos["image"] = $this->user["id"]."/".$image;
+                if
+                ( $data->add_source
+                  ( $this->album["groupes"],
+                    $this->album["titre"],
+                    $this->album_status_id,
+                    $this->album["licence"]["id"],
+                    $this->album["documents"],
+                    $this->album["reference"],
+                    $this->album["derivations"],
+                    $source_infos
+                  )
+                ) $env->redirect
+                ( $env->url("users/albums"),
+                  "l'album a &eacute;t&eacute; ajout&eacute;"
+                );
+                else $env->erreur("Impossible d'ajouter l'album");
+              }
+              else $env->erreur("Impossible d'uploader l'image");
+            }
+            else $env->message("merci de pr&eacute;ciser un titre pour l'album");
+          }
+          else $env->erreur("Impossible de lire les informations du groupe");
+        }
+        foreach($source_infos as $info_key => $info_value) $this->album[$info_key] = $info_value;
+        $env->set_out("album", $this->album);
+      }
+      else $env->erreur("Impossible de creer le repertoire utilisateur");
+    }
+
+    function edit(){
+      $env = $this->env();
+      $data = $env->data();
+      $this->album["premissions"] = $data->source_permissions($this->album, $this->user["id"]);
+      if($this->album["premissions"]["editeur"])
+      { if($data->check_user_uploads_dir())
+        { $web_path = $env->path("web");
+          $upload_dir = $env->path("content")."uploads/".$this->user["id"];
+          $_SESSION["upload_dir"] = $web_path.($web_path ? "" : "/").$upload_dir;
+          $source_infos = array
+          ( "date_inscription" => $this->album["date_inscription"],
+            "ordre" => $this->album["ordre"],
+            "date_creation" => $this->album["date_creation"],
+            "description" => $this->album["description"],
+            "image" => $this->album["image"]
+          );
+          $env->set_out("groupe", $data->get_admin_groupe($this->album["groupes"]));
+          if($_POST)
+          { if(($groupe = $data->groupe($_POST["id_groupe"])) !== false)
+            { $env->set_out("groupe", $groupe);
+              $groupe["id_groupe_status"] = $data->id_groupe_status_admin();
+              $this->album["groupes"] = array($groupe["id"] => $groupe);
+              $this->album["titre"] = trim($_POST["titre"]);
+              $this->album["licence"] = array
+              ( "id" => $_POST["licence"]
+              );
+              $source_infos["date_creation"] = $_POST["annee_date_creation"]."-".$_POST["mois_date_creation"]."-".$_POST["jour_date_creation"];
+              $source_infos["description"] = $_POST["description"];
+              foreach($_POST as $post_key => $post_value)
+              { if(substr($post_key, 0, 13) == "document_nom_")
+                { if($id_document = substr($post_key, 13))
+                  { $this->album["documents"][$id_document] = array
+                    ( "nom" => $_POST["document_nom_".$id_document],
+                      "url" => $_POST["document_url_".$id_document]
+                    );
+                  }
+                }
+              }
+              if($this->album["titre"])
+              { if(isset($_POST["del_image"]))
+                { if($this->album["image"])
+                  { if(@unlink($env->path("content")."uploads/".$this->album["image"])) $this->album["image"] = "";
+                    else
+                    { $this->album["image"] = false;
+                      $env->erreur("Impossible d'effacer l'image");
+                    }
+                  }
+                  else $this->album["image"] = "";
+                }
+                else
+                { if(($up_image = $data->upload("image", $upload_dir)) !== false)
+                  { if($up_image) $this->album["image"] = $this->user["id"]."/".$up_image;
+                  }
+                  else
+                  { $env->erreur("Impossible d'uploader l'image");
+                    return;
+                  }
+                }
+                if($this->album["image"] !== false)
+                { if($this->album["image"]) $source_infos["image"] = $this->album["image"];
+                  if
+                  ( $data->set_source
+                    ( $this->album["id"],
+                      $this->album["groupes"],
+                      $this->album["titre"],
+                      $this->album_status_id,
+                      $this->album["licence"]["id"],
+                      $this->album["documents"],
+                      $this->album["reference"],
+                      $this->album["derivations"],
+                      $source_infos
+                    )
+                  ) $env->redirect
+                  ( $env->url("users/albums/edit", array("id" => $this->album["id"])),
+                    "l'album a &eacute;t&eacute; modifi&eacute;"
+                  );
+                  else $env->erreur("Impossible de modifier l'album");
+                }
+                else $env->erreur("Impossible d'uploader l'image");
+              }
+              else $env->message("merci de pr&eacute;ciser un titre pour l'album");
+            }
+            else $env->erreur("Impossible de lire les informations du groupe");
+          }
+          $env->set_out("album", $this->album);
+        }
+        else $env->erreur("Impossible de creer le repertoire utilisateur");
+      }
+      else $env->erreur("Vous n'avez pas la permission de modifier cet album");
+    }
+
+    function del(){
+      $env = $this->env();
+      $data = $env->data();
+      $this->album["premissions"] = $data->source_permissions($this->album, $this->user["id"]);
+      if($this->album["premissions"]["admin"])
+      { if($data->del_source($this->album["id"]))
+        { $env->redirect
+          ( $env->url("users/albums"),
+            "l'album a &eacute;t&eacute; supprim&eacute;"
+          );
+        }
+        else $env->erreur("Impossible de supprimer l'album");
+      }
+      else $env->erreur("Vous n'avez pas la permission de supprimer cet album");
+    }
+
+  }
+
+?>
\ No newline at end of file
diff --git a/app/controllers/users/groupes.php b/app/controllers/users/groupes.php
new file mode 100644 (file)
index 0000000..8730e2c
--- /dev/null
@@ -0,0 +1,183 @@
+<?php
+
+  class mw_users_groupes extends mw_controller
+  {
+
+    var $groupe;
+    var $user;
+
+    function validate(){
+      $env = $this->env();
+      $data = $env->data();
+      if($this->user = $env->user())
+      { if($env->etat("action") == "edit" || $env->etat("action") == "del")
+        { if
+          ( ( $this->groupe = $data->groupe
+              ( $_GET[$env->param("id")]
+              )
+            ) !== false
+            && $this->groupe
+          )
+          { if($this->groupe["id_user"] == $this->user["id"])
+            { return true;
+            }
+            else return "Vous n'est pas autoris&eacute; &agrave; modifier ce groupe";
+          }
+          else return "Impossible de lire les informations du groupe";
+        }
+        else return true;
+      }
+      return "Vous devez &ecirc;tre identifier pour acc&eacute;der &agrave; cette page";
+    }
+
+    function index(){
+      $env = $this->env();
+      $data = $env->data();
+      if
+      ( $env->set_out
+        ( "groupes",
+          $data->groupes
+          ( $this->user["id"],
+            isset($_GET[$env->param("start")]) ? $_GET[$env->param("start")] : 0
+          )
+        ) !== false
+      )
+      {
+      }
+      else $env->erreur("Impossible de lire la liste des groupes");
+    }
+
+    function add(){
+      $env = $this->env();
+      $data = $env->data();
+      if($data->check_user_uploads_dir())
+      { $web_path = $env->path("web");
+        $upload_dir = $env->path("content")."uploads/".$this->user["id"];
+        $_SESSION["upload_dir"] = $web_path.($web_path ? "" : "/").$upload_dir;
+        if($_POST)
+        { $env->set_out("groupe", $_POST);
+          if(($image = $data->upload("image", $upload_dir)) !== false){
+            if(trim($_POST["nom"]))
+            { if(($exists = $data->groupe_exists($_POST["nom"])) !== false)
+              { if(!isset($_POST["contact_form"]) || trim($_POST["email"]))
+                { if($exists == 0)
+                  { if
+                    ( $data->add_groupe
+                      ( $this->user["id"],
+                        $_POST["nom"],
+                        $image ? $this->user["id"]."/".$image : null,
+                        $_POST["description"],
+                        $_POST["email"],
+                        isset($_POST["contact_form"]) ? 1 : 0,
+                        isset($_POST["captcha"]) ? 1 : 0
+                      )
+                    ) $env->redirect
+                    ( $env->url("users/groupes"),
+                      "le groupe a &eacute;t&eacute; ajout&eacute;"
+                    );
+                    else $env->erreur("Impossible d'ajouter le groupe");
+                  }
+                  else $env->message("Un groupe avec ce nom existe d&eacute;j&agrave;");
+                }
+                else $env->message("merci de pr&eacute;ciser un email pour le formulaire de contact");
+              }
+              else $env->erreur("Impossible de savoir si le groupe existe d&eacute;j&agrave;");
+            }
+            else $env->message("merci de pr&eacute;ciser un nom pour le groupe");
+          }
+          else $env->erreur("Impossible d'uploader l'image");
+        }
+      }
+      else $env->erreur("Impossible de creer le repertoire utilisateur");
+    }
+
+    function edit(){
+      $env = $this->env();
+      $data = $env->data();
+      if($data->check_user_uploads_dir())
+      { $web_path = $env->path("web");
+        $upload_dir = $env->path("content")."uploads/".$this->user["id"];
+        $_SESSION["upload_dir"] = $web_path.($web_path ? "" : "/").$upload_dir;
+        if($env->set_out("groupe", $this->groupe))
+        { $groupe = $env->out("groupe");
+          if($_POST)
+          { $id = $groupe["id"];
+            $nom = $groupe["nom"];
+            $image = $groupe["image"];
+            $_POST["image"] = $image ? $_SESSION["upload_dir"]."/".$image : "";
+            $env->set_out("groupe", $_POST);
+            if(isset($_POST["del_image"]))
+            { if($image)
+              { if(@unlink($env->path("content")."uploads/".$image)) $image = "";
+                else
+                { $image = false;
+                  $env->erreur("Impossible d'effacer l'image");
+                }
+              }
+              else $image = "";
+            }
+            else
+            { if(($new_image = $data->upload("image", $upload_dir)) !== false)
+              { if($new_image) $image = $this->user["id"]."/".$new_image;
+              }
+              else $env->erreur("Impossible d'uploader l'image");
+            }
+            if($image !== false)
+            { if(trim($_POST["nom"]))
+              { if(($exists = $data->groupe_exists($_POST["nom"], $this->groupe["id"])) !== false)
+                { if(!$exists)
+                  { if(!isset($_POST["contact_form"]) || trim($_POST["email"]))
+                    { if
+                      ( $data->set_groupe
+                        ( $id,
+                          $_POST["nom"],
+                          $image,
+                          $_POST["description"],
+                          $_POST["email"],
+                          isset($_POST["contact_form"]) ? 1 : 0,
+                          isset($_POST["captcha"]) ? 1 : 0
+                        )
+                      ) $env->redirect
+                      ( $env->url("users/groupes/edit", array("id" => $_GET[$env->param("id")])),
+                        "le groupe a &eacute;t&eacute; modifi&eacute;"
+                      );
+                      else $env->erreur("Impossible de modifier le groupe");
+                    }
+                    else $env->message("merci de pr&eacute;ciser un email pour le formulaire de contact");
+                  }
+                  else $env->message("Un groupe avec ce nom existe d&eacute;j&agrave;");
+                }
+                else $env->erreur("Impossible de savoir si le groupe existe d&eacute;j&agrave;");
+              }
+              else $env->message("merci de pr&eacute;ciser un nom pour le groupe");
+            }
+          }
+          else
+          { $env->set_out("groupe", $groupe);
+          }
+        }
+        else $env->erreur("Impossible de lire les informations du groupe");
+      }
+      else $env->erreur("Impossible de creer le repertoire utilisateur");
+    }
+
+    function del(){
+      $env = $this->env();
+      $data = $env->data();
+      if(($res = $data->del_groupe($this->groupe["id"])) !== false)
+      { if($res === 1) $env->redirect
+        ( $env->url("users/groupes"),
+          "Ce groupe a des sources sur ce site, il n'a pas &eacute;t&eacute; supprim&eacute;.",
+          5
+        );
+        else $env->redirect
+        ( $env->url("users/groupes"),
+          "le groupe a &eacute;t&eacute; supprim&eacute;"
+        );
+      }
+      else $env->erreur("Impossible de supprimer le groupe");
+    }
+
+  }
+
+?>
\ No newline at end of file
diff --git a/app/controllers/users/morceaux.php b/app/controllers/users/morceaux.php
new file mode 100644 (file)
index 0000000..ba58bda
--- /dev/null
@@ -0,0 +1,435 @@
+<?php
+
+  class mw_users_morceaux extends mw_controller
+  {
+    var $groupes;
+    var $albums;
+    var $morceau;
+    var $user;
+
+    var $status;
+    var $album_status_id;
+    var $morceau_status_id;
+
+    function validate(){
+      $env = $this->env();
+      $data = $env->data();
+      if(($this->status = $data->source_status()) !== false)
+      { foreach($this->status as $id_source_status => $source_status)
+        { if($source_status["nom"] == "album") $this->album_status_id = $id_source_status;
+          if($source_status["nom"] == "morceau") $this->morceau_status_id = $id_source_status;
+          if(isset($this->album_status_id) && isset($this->morceau_status_id)) break;
+        }
+        if(isset($this->album_status_id) && isset($this->morceau_status_id))
+        { if($this->user = $env->user())
+          { if(($this->groupes = $data->groupes($this->user["id"])) !== false){
+              $env->set_out("groupes", $this->groupes);
+              $this->albums = array();
+              if($this->groupes["total"] > 0)
+              { $select = array();
+                $select["status"] = $this->album_status_id;
+                $select["id_user"] = $this->user["id"];
+                foreach($this->groupes["list"] as $id_groupe => $groupe)
+                { $select["id_groupe"] = $id_groupe;
+                  if(($albums = $data->sources($select)) !== false)
+                  { $this->albums[$id_groupe] = $albums["list"];
+                  }
+                  else $this->albums = false;
+                }
+              }
+              if($this->albums !== false)
+              { $env->set_out("albums", $this->albums);
+                if($env->etat("action") == "edit" || $env->etat("action") == "del" || $env->etat("action") == "maj_xml")
+                { if($this->morceau = $data->source($_GET[$env->param("id")], true))
+                  { 
+                  }
+                  else return "Impossible de lire les informations du morceau";
+                }
+                if($env->etat("action") == "add" || $env->etat("action") == "edit")
+                { if(($this->licences = $data->licences()) !== false)
+                  { $env->set_out("licences", $this->licences);
+                  }
+                  else return "Impossible de lire la liste des licences";
+                }
+              }
+              else return "Impossible de lire la liste des albums";
+            }
+            else return "Impossible de lire la liste des groupes";
+          }
+          else return "Vous devez &ecirc;tre identifier pour acc&eacute;der &agrave; cette page";
+        }
+        else
+        { if(!isset($this->album_status_id)) return "Type de source inconnu: album";
+          return "Type de source inconnu: morceau";
+        }
+      }
+      else return "Impossible de lire la liste des status de source";
+      return true;
+    }
+
+    function index(){
+      $env = $this->env();
+      $data = $env->data();
+      $select = array();
+      $select["status"] = $this->morceau_status_id;
+      $select["id_user"] = $this->user["id"];
+      $select["order_by"] = "ordre";
+      $select["start"] = isset($_GET[$env->param("start")]) && $_GET[$env->param("start")] ? $_GET[$env->param("start")] : 0;
+      if(isset($_GET[$env->param("groupe")]) && $_GET[$env->param("groupe")]) $select["id_groupe"] = $_GET[$env->param("groupe")];
+      if(isset($_GET[$env->param("album")])) $select["id_composition"] = $_GET[$env->param("album")];
+      if(($morceaux = $data->sources($select)) !== false)
+      { foreach($morceaux["list"] as $id_morceau => $morceau)
+        { $morceaux["list"][$id_morceau]["permissions"] = $data->source_permissions($morceau, $this->user["id"]);
+        }
+        if($_POST)
+        { $OK = true;
+          foreach($morceaux["list"] as $id_morceau => $morceau)
+          { if(isset($_POST["ordre_".$id_morceau]))
+            { if($data->set_source_info($morceau["id"], "ordre", $_POST["ordre_".$id_morceau]) === false)
+              { $OK = false;
+                break;
+              }
+            }
+          }
+          if($OK)
+          { $get_params = array();
+            if(isset($_GET[$env->param("groupe")]) && $_GET[$env->param("groupe")]) $get_params["groupe"] = $_GET[$env->param("groupe")];
+            if(isset($_GET[$env->param("album")]) && $_GET[$env->param("album")]) $get_params["album"] = $_GET[$env->param("album")];
+            $env->redirect
+            ( $env->url("users/morceaux", $get_params),
+              "l'ordre des morceaux a &eacute;t&eacute; enregistr&eacute;"
+            );
+          }
+          else $env->erreur("Impossible d'enregistrer l'ordre des morceaux");
+        }
+        $env->set_out("groupes", $this->groupes);
+        $env->set_out("albums", $this->albums);
+        $env->set_out("morceaux", $morceaux);
+      }
+      else $env->erreur("Impossible de lire la liste des morceaux");
+    }
+
+    function add(){
+      $env = $this->env();
+      $data = $env->data();
+      if($data->check_user_uploads_dir())
+      { $web_path = $env->path("web");
+        $_SESSION["upload_dir"] = $web_path.($web_path ? "" : "/").$env->path("content")."uploads/".$this->user["id"];
+        $this->morceau = $data->empty_source();
+        $users_sources_mod = $env->get_controller("users/sources");
+        $source_infos = array
+        ( "date_inscription" => date("Y")."-".date("m")."-".date("d"),
+          "ordre" => 0
+        );
+        if($_POST)
+        { if(($groupe = $data->groupe($_POST["id_groupe"])) !== false)
+          { $groupe["id_groupe_status"] = $data->id_groupe_status_admin();
+            $this->morceau["groupes"] = array($groupe["id"] => $groupe);
+            if($_POST["album"])
+            { if($album = $data->source($_POST["album"], true))
+              { $album["permissions"] = $data->source_permissions($album, $this->user["id"]);
+                if(!$album["permissions"]["contributeur"])
+                { $env->erreur("vous n'avez pas la permission d'ajouter un morceau dans cet album");
+                  return;
+                }
+              }
+              else
+              { $env->erreur("impossible de lire les informations de l'album");
+                return;
+              }
+              $this->morceau["album"] = $_POST["album"];
+            }
+            if($_POST["is_derivation"])
+            { foreach($_POST as $key => $value)
+              { if(substr($key, 0, 14) == "derivation_id_")
+                { $id_source_derivation = substr($key, 14);
+                  $xml_url = trim($_POST["derivation_".$id_source_derivation]);
+                  $this->morceau["derivations"][$id_source_derivation] = $users_sources_mod->get_source_from_xml
+                  ( $env,
+                    $xml_url,
+                    ( $_POST["use_edit_derivation_content_".$id_source_derivation] ?
+                        $_POST["edit_derivation_content_".$id_source_derivation]
+                      : ($xml_url ? $data->get_source_xml_from_url($xml_url) : "")
+                    ),
+                    $_POST["use_edit_derivation_content_".$id_source_derivation] ? true : false
+                  );
+                }
+              }
+            }
+            if($_POST["is_reference"])
+            { $xml_url = trim($_POST["reference"]);
+              $this->morceau["reference"] = $users_sources_mod->get_source_from_xml
+              ( $env,
+                $xml_url,
+                ( $_POST["use_edit_reference_content"] ?
+                    $_POST["edit_reference_content"]
+                  : ($xml_url ? $data->get_source_xml_from_url($xml_url) : "")
+                ),
+                $_POST["use_edit_reference_content"] ? true : false
+              );
+            }
+            else
+            { if($this->morceau["titre"] = trim($_POST["titre"]))
+              { $this->morceau["licence"] = array
+                ( "id" => $_POST["licence"]
+                );
+                $source_infos["date_creation"] = $_POST["annee_date_creation"]."-".$_POST["mois_date_creation"]."-".$_POST["jour_date_creation"];
+                $source_infos["description"] = $_POST["description"];
+                foreach($_POST as $post_key => $post_value)
+                { if(substr($post_key, 0, 13) == "document_nom_")
+                  { if($id_document = substr($post_key, 13))
+                    { $this->morceau["documents"][$id_document] = array
+                      ( "nom" => $_POST["document_nom_".$id_document],
+                        "url" => $_POST["document_url_".$id_document]
+                      );
+                    }
+                  }
+                }
+              }
+              else $env->message("merci de pr&eacute;ciser un titre pour le morceau");
+            }
+            if(!$env->out("messages") && !$env->out("erreur"))
+            { if
+              ( ( $id_source = $data->add_source
+                  ( $this->morceau["groupes"],
+                    $this->morceau["titre"],
+                    $this->morceau_status_id,
+                    $this->morceau["licence"]["id"],
+                    $this->morceau["documents"],
+                    $this->morceau["reference"],
+                    $this->morceau["derivations"],
+                    $source_infos
+                  )
+                ) !== false
+              )
+              { if($_POST["album"])
+                { if($data->set_source_composition($id_source, $_POST["album"]))
+                  { $env->redirect
+                    ( $env->url("users/morceaux"),
+                      "le morceau a &eacute;t&eacute; ajout&eacute;"
+                    );
+                  }
+                  else $env->erreur("Le morceau a &eacute;t&eacute; ajout&eacute; mais impossible de l'associer &agrave; cet album");
+                }
+                else $env->redirect
+                ( $env->url("users/morceaux"),
+                  "le morceau a &eacute;t&eacute; ajout&eacute;"
+                );
+              }
+              else $env->erreur("Impossible d'ajouter le morceau");
+            }
+          }
+          else $env->erreur("Impossible de lire les informations du groupe");
+        }
+        $env->set_out("morceau", $this->morceau);
+      }
+      else $env->erreur("Impossible de creer le repertoire utilisateur");
+    }
+
+    function edit(){
+      $env = $this->env();
+      $data = $env->data();
+      $this->morceau["premissions"] = $data->source_permissions($this->morceau, $this->user["id"]);
+      if(!$this->morceau["premissions"]["editeur"])
+      { $env->erreur("vous n'avez la permission d'editer ce morceau");
+        return;
+      }
+      if($data->check_user_uploads_dir())
+      { $web_path = $env->path("web");
+        $_SESSION["upload_dir"] = $web_path.($web_path ? "" : "/").$env->path("content")."uploads/".$this->user["id"];
+        if(($compositions = $data->source_compositions(array("id_source" => $this->morceau["id"]))) !== false)
+        { if($compositions) foreach($compositions[$this->morceau["id"]] as $id_album) { $this->morceau["album"] = $id_album; break; }
+          $env->set_out("groupe", $data->get_admin_groupe($this->morceau["groupes"]));
+          if($_POST)
+          { $source_infos = array
+            ( "date_inscription" => $_POST["date_inscription"],
+              "ordre" => isset($this->morceau["ordre"]) ? $this->morceau["ordre"] : 0
+            );
+            $this->morceau = $data->empty_source(array("id" => $this->morceau["id"]));
+            $users_sources_mod = $env->get_controller("users/sources");
+            if(!($groupe = $data->groupe($_POST["id_groupe"])))
+            { $env->erreur("Impossible de lire les informations du groupe");
+              return;
+            }
+            $env->set_out("groupe", $groupe);
+            $groupe["id_groupe_status"] = $data->id_groupe_status_admin();
+            $this->morceau["groupes"] = array($groupe["id"] => $groupe);
+            $this->morceau["derivations"] = array();
+            if($_POST["album"])
+            { if($album = $data->source($_POST["album"], true))
+              { $album["permissions"] = $data->source_permissions($album, $this->user["id"]);
+                if(!$album["permissions"]["contributeur"])
+                { $env->erreur("vous n'avez pas la permission d'ajouter un morceau dans cet album");
+                  return;
+                }
+              }
+              else
+              { $env->erreur("Impossible de lire les informations de l'album");
+                return;
+              }
+              $this->morceau["album"] = $_POST["album"];
+            }
+            if($_POST["is_derivation"])
+            { foreach($_POST as $key => $value)
+              { if(substr($key, 0, 14) == "derivation_id_")
+                { $id_source_derivation = substr($key, 14);
+                  $xml_url = trim($_POST["derivation_".$id_source_derivation]);
+                  $this->morceau["derivations"][$id_source_derivation] = $users_sources_mod->get_source_from_xml
+                  ( $env,
+                    $xml_url,
+                    ( $_POST["use_edit_derivation_content_".$id_source_derivation] ?
+                        $_POST["edit_derivation_content_".$id_source_derivation]
+                      : ($xml_url ? $data->get_source_xml_from_url($xml_url) : "")
+                    ),
+                    $_POST["use_edit_derivation_content_".$id_source_derivation] ? true : false
+                  );
+                }
+              }
+            }
+            if($_POST["is_reference"])
+            { $xml_url = trim($_POST["reference"]);
+              $this->morceau["reference"] = $users_sources_mod->get_source_from_xml
+              ( $env,
+                $xml_url,
+                ( $_POST["use_edit_reference_content"] ?
+                    $_POST["edit_reference_content"]
+                  : ($xml_url ? $data->get_source_xml_from_url($xml_url) : "")
+                ),
+                $_POST["use_edit_reference_content"] ? true : false
+              );
+            }
+            else
+            { if($this->morceau["titre"] = trim($_POST["titre"]))
+              { $this->morceau["licence"] = array
+                ( "id" => $_POST["licence"]
+                );
+                $source_infos["date_creation"] = $_POST["annee_date_creation"]."-".$_POST["mois_date_creation"]."-".$_POST["jour_date_creation"];
+                $source_infos["description"] = $_POST["description"];
+                foreach($_POST as $post_key => $post_value)
+                { if(substr($post_key, 0, 13) == "document_nom_")
+                  { if($id_document = substr($post_key, 13))
+                    { $this->morceau["documents"][$id_document] = array
+                      ( "nom" => $_POST["document_nom_".$id_document],
+                        "url" => $_POST["document_url_".$id_document]
+                      );
+                    }
+                  }
+                }
+              }
+              else $env->message("merci de pr&eacute;ciser un titre pour le morceau");
+            }
+            if(!$env->out("messages") && !$env->out("erreur"))
+            { if
+              ( ( $data->set_source
+                  ( $this->morceau["id"],
+                    $this->morceau["groupes"],
+                    $this->morceau["titre"],
+                    $this->morceau_status_id,
+                    $this->morceau["licence"]["id"],
+                    $this->morceau["documents"],
+                    $this->morceau["reference"],
+                    $this->morceau["derivations"],
+                    $source_infos
+                  )
+                ) !== false
+              )
+              { if($data->del_source_compositions(array("id_source" => $this->morceau["id"])))
+                { if($_POST["album"])
+                  { if($data->set_source_composition($this->morceau["id"], $_POST["album"]))
+                    { $env->redirect
+                      ( $env->url("users/morceaux/edit", array("id" => $this->morceau["id"])),
+                        "le morceau a &eacute;t&eacute; modifi&eacute;"
+                      );
+                    }
+                    else $env->erreur("Le morceau a &eacute;t&eacute; modifi&eacute; mais impossible de l'associer &agrave; cet album");
+                  }
+                  else $env->redirect
+                  ( $env->url("users/morceaux/edit", array("id" => $this->morceau["id"])),
+                    "le morceau a &eacute;t&eacute; modifi&eacute;"
+                  );
+                }
+                else $env->erreur("Le morceau a &eacute;t&eacute; modifi&eacute; mais impossible de l'associer &agrave; cet album");
+              }
+              else $env->erreur("Impossible de modifier le morceau");
+            }
+          }
+        }
+        else $env->erreur("Impossible de lire la liste des compositions");
+        $env->set_out("morceau", $this->morceau);
+      }
+      else $env->erreur("Impossible de creer le repertoire utilisateur");
+    }
+
+    function maj_xml(){
+      $data = $env->data();
+      $this->morceau["premissions"] = $data->source_permissions($this->morceau, $this->user["id"]);
+      if(!$this->morceau["premissions"]["editeur"])
+      { $env->erreur("vous n'avez la permission d'editer ce morceau");
+        return;
+      }
+      if
+      (    isset($_GET[$env->param("id")])
+        && isset($_GET[$env->param("xml")])
+        && ($_GET[$env->param("xml")] == "derviation" ? isset($_GET[$env->param("derivation")]) : true)
+      )
+      { $xml_url = "";
+        if($_GET[$env->param("xml")] == "derivation")
+        { if(isset($this->morceau["derivations"][$_GET[$env->param("derivation")]]["xml"]["url"]))
+          $xml_url = $this->morceau["derivations"][$_GET[$env->param("derivation")]]["xml"]["url"];
+        }
+        elseif($_GET[$env->param("xml")] == "reference")
+        { if(isset($this->morceau["reference"]["xml"]["url"]))
+          $xml_url = $this->morceau["reference"]["xml"]["url"];
+        }
+        $erreur = "";
+        if($xml_url)
+        { if(($res = $data->maj_source_cache($xml_url)) !== false)
+          { if($res === true)
+            { if($this->morceau = $data->source($this->morceau["id"]))
+              { $env->redirect
+                ( $env->url("users/morceaux/edit", array("id" => $this->morceau["id"])),
+                  "Les informations du fichier XML ont &eacute;t&eacute; mises &agrave; jour",
+                  2
+                );
+                return;
+              }
+              else $erreur =
+               "le contenu du fichier XML a &eacute;t&eacute; mis &agrave; jour"
+              .", mais impossible de lire les informations du morceau";
+            }
+            else
+            { switch($res)
+              { case -1: $env->message("Impossible de lire le contenu du fichier XML"); break;
+                case -2: $env->message("Le fichier XML indiqu&eacute; ne contient pas un fichier de source valide"); break;
+                default: $erreur = "Erreur inconnue (?)"; break;
+              }
+            }
+          }
+          else $erreur = "Impossible de mettre &agrave; jour le contenu du fichier XML dans le cache";
+        }
+        else $env->message("Pas d'URL pour ce fichier XML. Impossible de recharger les informations");
+        if($erreur) $env->erreur($erreur);
+        else $env->run("users/morceaux/edit", array("id" => $this->morceau["id"]));
+      }
+      else $env->erreur("parametre de fichier xml manquant");
+    }
+
+    function del(){
+      $env = $this->env();
+      $data = $env->data();
+      $this->morceau["premissions"] = $data->source_permissions($this->morceau, $this->user["id"]);
+      if($this->morceau["premissions"]["admin"])
+      { if($data->del_source($this->morceau["id"]))
+        { $env->redirect
+          ( $env->url("users/morceaux"),
+            "le morceau a &eacute;t&eacute; supprim&eacute;"
+          );
+        }
+        else $env->erreur("Impossible de supprimer le morceau");
+      }
+      else $env->erreur("vous n'avez la permission d'effacer ce morceau");
+    }
+
+  }
+
+?>
\ No newline at end of file
diff --git a/app/controllers/users/pistes.php b/app/controllers/users/pistes.php
new file mode 100644 (file)
index 0000000..8d3d1ea
--- /dev/null
@@ -0,0 +1,478 @@
+<?php
+
+  class mw_users_pistes extends mw_controller
+  {
+    var $groupes;
+    var $albums;
+    var $morceaux;
+    var $piste;
+    var $user;
+
+    var $status;
+    var $album_status_id;
+    var $morceau_status_id;
+    var $piste_status_id;
+
+    function validate(){
+      $env = $this->env();
+      $data = $env->data();
+      if(($this->status = $data->source_status()) !== false)
+      { foreach($this->status as $id_source_status => $source_status)
+        { if($source_status["nom"] == "album") $this->album_status_id = $id_source_status;
+          if($source_status["nom"] == "morceau") $this->morceau_status_id = $id_source_status;
+          if($source_status["nom"] == "piste") $this->piste_status_id = $id_source_status;
+          if(isset($this->album_status_id) && isset($this->morceau_status_id) && isset($this->piste_status_id)) break;
+        }
+        if(isset($this->album_status_id) && isset($this->morceau_status_id) && isset($this->piste_status_id))
+        { if($this->user = $env->user())
+          { if(($this->groupes = $data->groupes($this->user["id"])) !== false)
+            { $env->set_out("groupes", $this->groupes);
+              $this->albums = array();
+              $this->morceaux = array();
+              if($this->groupes["total"] > 0)
+              { foreach($this->groupes["list"] as $id_groupe => $groupe)
+                { $this->albums[$id_groupe] = array();
+                  $select = array
+                  ( "status" => $this->album_status_id,
+                    "id_user" => $this->user["id"],
+                    "id_groupe" => $id_groupe
+                  );
+                  if(($albums = $data->sources($select)) !== false)
+                  { $this->albums[$id_groupe] = $albums["list"];
+                  }
+                  else
+                  { $this->albums = false;
+                    break;
+                  }
+
+                  $this->morceaux[$id_groupe] = array();
+                  $select = array
+                  ( "status" => $this->morceau_status_id,
+                    "id_user" => $this->user["id"],
+                    "id_groupe" => $id_groupe
+                  );
+                  if(($morceaux = $data->sources($select)) !== false)
+                  { foreach($morceaux["list"] as $id_morceau => $morceau)
+                    { if(($compositions = $data->source_compositions(array("id_source" => $id_morceau))) !== false)
+                      { if($compositions) foreach($compositions[$id_morceau] as $_id_album) { $morceaux["list"][$id_morceau]["album"] = $_id_album; break; }
+                        if(!isset($morceaux["list"][$id_morceau]["album"])) $morceaux["list"][$id_morceau]["album"] = 0;
+                      }
+                      else
+                      { $this->morceaux = false;
+                        break;
+                      }
+                    }
+                    if($this->morceaux !== false)
+                    { foreach($morceaux["list"] as $id_morceau => $morceau)
+                      { if(!isset($this->morceaux[$id_groupe][$morceau["album"]])) $this->morceaux[$id_groupe][$morceau["album"]] = array();
+                        $this->morceaux[$id_groupe][$morceau["album"]][$id_morceau] = $morceau;
+                      }
+                    }
+                  }
+                  else
+                  { $this->morceaux = false;
+                    break;
+                  }
+                  if($this->morceaux === false) break;
+                }
+              }
+              if($this->albums !== false && $this->morceaux !== false)
+              { $env->set_out("albums", $this->albums);
+                $env->set_out("morceaux", $this->morceaux);
+                if($env->etat("action") == "edit" || $env->etat("action") == "del" || $env->etat("action") == "maj_xml")
+                { if(($this->piste = $data->source($_GET[$env->param("id")], true)) !== false && $this->piste)
+                  {
+                  }
+                  else return "Impossible de lire les informations de la source";
+                }
+                if($env->etat("action") == "add" || $env->etat("action") == "edit")
+                { if(($this->licences = $data->licences()) !== false)
+                  { $env->set_out("licences", $this->licences);
+                  }
+                  else return "Impossible de lire la liste des licences";
+                }
+              }
+              else return "Impossible de lire la liste des albums";
+            }
+            else return "Impossible de lire la liste des groupes";
+          }
+          else return "Vous devez &ecirc;tre identifier pour acc&eacute;der &agrave; cette page";
+        }
+        else
+        { if(!isset($this->album_status_id)) return "Type de source inconnu: album";
+          return "Type de source inconnu: morceau";
+        }
+      }
+      else return "Impossible de lire la liste des status de source";
+      return true;
+    }
+
+    function index(){
+      $env = $this->env();
+      $data = $env->data();
+      $select = array();
+      $select["status"] = $this->piste_status_id;
+      $select["id_user"] = $this->user["id"];
+      $select["order_by"] = "ordre";
+      if(isset($_GET[$env->param("groupe")]) && $_GET[$env->param("groupe")]) $select["id_groupe"] = $_GET[$env->param("groupe")];
+      if(isset($_GET[$env->param("morceau")]) && $_GET[$env->param("morceau")]) $select["id_composition"] = $_GET[$env->param("morceau")];
+      $select["start"] = isset($_GET[$env->param("start")]) && $_GET[$env->param("start")] ? $_GET[$env->param("start")] : 0;
+      if(($pistes = $data->sources($select)) !== false)
+      { foreach($pistes["list"] as $id_piste => $piste)
+        { $pistes["list"][$id_piste]["permissions"] = $data->source_permissions($piste, $this->user["id"]);
+        }
+        if($_POST)
+        { $OK = true;
+          foreach($pistes["list"] as $id_piste => $piste)
+          { if(isset($_POST["ordre_".$id_piste]))
+            { if($data->set_source_info($piste["id"], "ordre", $_POST["ordre_".$id_piste]) === false)
+              { $OK = false;
+                break;
+              }
+            }
+          }
+          if($OK)
+          { $get_params = array();
+            if(isset($_GET[$env->param("groupe")]) && $_GET[$env->param("groupe")]) $get_params["groupe"] = $_GET[$env->param("groupe")];
+            if(isset($_GET[$env->param("morceau")]) && $_GET[$env->param("morceau")]) $get_params["morceau"] = $_GET[$env->param("morceau")];
+            $env->redirect
+            ( $env->url("users/pistes", $get_params),
+              "l'ordre des sources a &eacute;t&eacute; enregistr&eacute;"
+            );
+          }
+          else $env->erreur("Impossible d'enregistrer l'ordre des sources");
+        }
+        $env->set_out("pistes", $pistes);
+      }
+      else $env->erreur("Impossible de lire la liste des sources");
+    }
+
+    function add(){
+      $env = $this->env();
+      $data = $env->data();
+      if($data->check_user_uploads_dir())
+      { $web_path = $env->path("web");
+        $_SESSION["upload_dir"] = $web_path.($web_path ? "" : "/").$env->path("content")."uploads/".$this->user["id"];
+        $this->piste = $data->empty_source();
+        $users_sources_mod = $env->get_controller("users/sources");
+        $source_infos = array
+        ( "date_inscription" => date("Y")."-".date("m")."-".date("d"),
+          "ordre" => 0
+        );
+        if($_POST)
+        { if(($groupe = $data->groupe($_POST["id_groupe"])) !== false)
+          { $groupe["id_groupe_status"] = $data->id_groupe_status_admin();
+            $this->piste["groupes"] = array($groupe["id"] => $groupe);
+            $env->set_out("groupe", $groupe);
+          }
+          else
+          { $env->erreur("Impossible de lire les informations du groupe");
+            return;
+          }
+          if($_POST["morceau"])
+          { if($morceau = $data->source($_POST["morceau"], true))
+            { $morceau["permissions"] = $data->source_permissions($morceau, $this->user["id"]);
+              if(!$morceau["permissions"]["contributeur"])
+              { $env->erreur("vous n'avez pas la permission d'ajouter une source dans ce morceau");
+                return;
+              }
+            }
+            else
+            { $env->erreur("impossible de lire les informations du morceau");
+              return;
+            }
+            $this->piste["morceau"] = $_POST["morceau"];
+          }
+          if(isset($_POST["is_derivation"]))
+          { foreach($_POST as $key => $value)
+            { if(substr($key, 0, 14) == "derivation_id_")
+              { $id_source_derivation = substr($key, 14);
+                $xml_url = trim($_POST["derivation_".$id_source_derivation]);
+                $this->piste["derivations"][$id_source_derivation] = $users_sources_mod->get_source_from_xml
+                ( $env,
+                  $xml_url,
+                  ( $_POST["use_edit_derivation_content_".$id_source_derivation] ?
+                      $_POST["edit_derivation_content_".$id_source_derivation]
+                    : ($xml_url ? $data->get_source_xml_from_url($xml_url) : "")
+                  ),
+                  $_POST["use_edit_derivation_content_".$id_source_derivation] ? true : false
+                );
+              }
+            }
+          }
+          if(isset($_POST["is_reference"]))
+          { $xml_url = trim($_POST["reference"]);
+            $this->piste["reference"] = $users_sources_mod->get_source_from_xml
+            ( $env,
+              $xml_url,
+              ( $_POST["use_edit_reference_content"] ?
+                  $_POST["edit_reference_content"]
+                : ($xml_url ? $data->get_source_xml_from_url($xml_url) : "")
+              ),
+              $_POST["use_edit_reference_content"] ? true : false
+            );
+          }
+          else
+          { if($this->piste["titre"] = trim($_POST["titre"]))
+            { $this->piste["licence"] = array
+              ( "id" => $_POST["licence"]
+              );
+              $source_infos["date_creation"] = $_POST["annee_date_creation"]."-".$_POST["mois_date_creation"]."-".$_POST["jour_date_creation"];
+              $source_infos["description"] = $_POST["description"];
+              foreach($_POST as $post_key => $post_value)
+              { if(substr($post_key, 0, 13) == "document_nom_")
+                { if($id_document = substr($post_key, 13))
+                  { $this->piste["documents"][$id_document] = array
+                    ( "nom" => $_POST["document_nom_".$id_document],
+                      "url" => $_POST["document_url_".$id_document]
+                    );
+                  }
+                }
+              }
+            }
+            else $env->message("merci de pr&eacute;ciser un titre pour la source");
+          }
+          if(!$env->out("messages") && !$env->out("erreur"))
+          { if
+            ( ( $id_source = $data->add_source
+                ( $this->piste["groupes"],
+                  $this->piste["titre"],
+                  $this->piste_status_id,
+                  $this->piste["licence"]["id"],
+                  $this->piste["documents"],
+                  $this->piste["reference"],
+                  $this->piste["derivations"],
+                  $source_infos
+                )
+              ) !== false
+            )
+            { if($_POST["morceau"])
+              { if($data->set_source_composition($id_source, $_POST["morceau"]))
+                { $env->redirect
+                  ( $env->url("users/pistes"),
+                    "la source a &eacute;t&eacute; ajout&eacute;e"
+                  );
+                }
+                else $env->erreur("La source a &eacute;t&eacute; ajout&eacute;e mais impossible de l'associer &agrave; ce morceau");
+              }
+              else $env->redirect
+              ( $env->url("users/pistes"),
+                "la source a &eacute;t&eacute; ajout&eacute;e"
+              );
+            }
+            else $env->erreur("Impossible d'ajouter la source");
+          }
+        }
+        $env->set_out("piste", $this->piste);
+      }
+      else $env->erreur("Impossible de creer le repertoire utilisateur");
+    }
+
+    function edit(){
+      $env = $this->env();
+      $data = $env->data();
+      $this->piste["premissions"] = $data->source_permissions($this->piste, $this->user["id"]);
+      if(!$this->piste["premissions"]["editeur"])
+      { $env->erreur("vous n'avez la permission d'editer cette source");
+        return;
+      }
+      if($data->check_user_uploads_dir())
+      { $web_path = $env->path("web");
+        $_SESSION["upload_dir"] = $web_path.($web_path ? "" : "/").$env->path("content")."uploads/".$this->user["id"];
+        if(($compositions = $data->source_compositions(array("id_source" => $this->piste["id"]))) !== false)
+        { if($compositions) foreach($compositions[$this->piste["id"]] as $id_morceau) { $this->piste["morceau"] = $id_morceau; break; }
+          $env->set_out("groupe", $data->get_admin_groupe($this->piste["groupes"]));
+          if($_POST)
+          { $source_infos = array
+            ( "date_inscription" => $_POST["date_inscription"],
+              "ordre" => isset($this->piste["ordre"]) ? $this->piste["ordre"] : 0
+            );
+            $this->piste = $data->empty_source(array("id" => $this->piste["id"]));
+            $users_sources_mod = $env->get_controller("users/sources");
+            if(!($groupe = $data->groupe($_POST["id_groupe"])))
+            { $env->erreur("Impossible de lire les informations du groupe");
+              return;
+            }
+            $env->set_out("groupe", $groupe);
+            $groupe["id_groupe_status"] = $data->id_groupe_status_admin();
+            $this->piste["groupes"] = array($groupe["id"] => $groupe);
+            $this->piste["derivations"] = array();
+            if($_POST["morceau"])
+            { if($morceau = $data->source($_POST["morceau"], true))
+              { $morceau["permissions"] = $data->source_permissions($morceau, $this->user["id"]);
+                if(!$morceau["permissions"]["contributeur"])
+                { $env->erreur("vous n'avez pas la permission d'ajouter une source dans ce morceau");
+                  return;
+                }
+              }
+              else
+              { $env->erreur("impossible de lire les informations du morceau");
+                return;
+              }
+              $this->piste["morceau"] = $_POST["morceau"];
+            }
+            if(isset($_POST["is_derivation"]))
+            { foreach($_POST as $key => $value)
+              { if(substr($key, 0, 14) == "derivation_id_")
+                { $id_source_derivation = substr($key, 14);
+                  $xml_url = trim($_POST["derivation_".$id_source_derivation]);
+                  $this->piste["derivations"][$id_source_derivation] = $users_sources_mod->get_source_from_xml
+                  ( $env,
+                    $xml_url,
+                    ( $_POST["use_edit_derivation_content_".$id_source_derivation] ?
+                        $_POST["edit_derivation_content_".$id_source_derivation]
+                      : ($xml_url ? $data->get_source_xml_from_url($xml_url) : "")
+                    ),
+                    $_POST["use_edit_derivation_content_".$id_source_derivation] ? true : false
+                  );
+                }
+              }
+            }
+            if(isset($_POST["is_reference"]))
+            { $xml_url = trim($_POST["reference"]);
+              $this->piste["reference"] = $users_sources_mod->get_source_from_xml
+              ( $env,
+                $xml_url,
+                ( $_POST["use_edit_reference_content"] ?
+                    $_POST["edit_reference_content"]
+                  : ($xml_url ? $data->get_source_xml_from_url($xml_url) : "")
+                ),
+                $_POST["use_edit_reference_content"] ? true : false
+              );
+            }
+            else
+            { if($this->piste["titre"] = trim($_POST["titre"]))
+              { $this->piste["licence"] = array
+                ( "id" => $_POST["licence"]
+                );
+                $source_infos["date_creation"] = $_POST["annee_date_creation"]."-".$_POST["mois_date_creation"]."-".$_POST["jour_date_creation"];
+                $source_infos["description"] = $_POST["description"];
+                foreach($_POST as $post_key => $post_value)
+                { if(substr($post_key, 0, 13) == "document_nom_")
+                  { if($id_document = substr($post_key, 13))
+                    { $this->piste["documents"][$id_document] = array
+                      ( "nom" => $_POST["document_nom_".$id_document],
+                        "url" => $_POST["document_url_".$id_document]
+                      );
+                    }
+                  }
+                }
+              }
+              else $env->message("merci de pr&eacute;ciser un titre pour la source");
+            }
+            if(!$env->out("messages") && !$env->out("erreur"))
+            { if
+              ( ( $data->set_source
+                  ( $this->piste["id"],
+                    $this->piste["groupes"],
+                    $this->piste["titre"],
+                    $this->piste_status_id,
+                    $this->piste["licence"]["id"],
+                    $this->piste["documents"],
+                    $this->piste["reference"],
+                    $this->piste["derivations"],
+                    $source_infos
+                  )
+                ) !== false
+              )
+              { if($data->del_source_compositions(array("id_source" => $this->piste["id"])))
+                { if($_POST["morceau"])
+                  { if($data->set_source_composition($this->piste["id"], $_POST["morceau"]))
+                    { $env->redirect
+                      ( $env->url("users/pistes/edit", array("id" => $this->piste["id"])),
+                        "la source a &eacute;t&eacute; modifi&eacute;e"
+                      );
+                    }
+                    else $env->erreur("La source a &eacute;t&eacute; modifi&eacute;e mais impossible de l'associer &agrave; ce morceau");
+                  }
+                  else $env->redirect
+                  ( $env->url("users/pistes/edit", array("id" => $this->piste["id"])),
+                    "la source a &eacute;t&eacute; modifi&eacute;e"
+                  );
+                }
+                else $env->erreur("La source a &eacute;t&eacute; modifi&eacute;e mais impossible de l'associer &agrave; ce morceau");
+              }
+              else $env->erreur("Impossible de modifier la source");
+            }
+          }
+        }
+        else $env->erreur("Impossible de lire la liste des compositions");
+        $env->set_out("piste", $this->piste);
+      }
+      else $env->erreur("Impossible de creer le repertoire utilisateur");
+    }
+
+    function maj_xml(){
+      $env = $this->env();
+      $data = $env->data();
+      $this->piste["premissions"] = $data->source_permissions($this->piste, $this->user["id"]);
+      if(!$this->piste["premissions"]["editeur"])
+      { $env->erreur("vous n'avez la permission d'editer cette source");
+        return;
+      }
+      if
+      (    isset($_GET[$env->param("id")])
+        && isset($_GET[$env->param("xml")])
+        && ($_GET[$env->param("xml")] == "derviation" ? isset($_GET[$env->param("derivation")]) : true)
+      )
+      { $xml_url = "";
+        if($_GET[$env->param("xml")] == "derivation")
+        { if(isset($this->piste["derivations"][$_GET[$env->param("derivation")]]["xml"]["url"]))
+          $xml_url = $this->piste["derivations"][$_GET[$env->param("derivation")]]["xml"]["url"];
+        }
+        elseif($_GET[$env->param("xml")] == "reference")
+        { if(isset($this->piste["reference"]["xml"]["url"]))
+          $xml_url = $this->piste["reference"]["xml"]["url"];
+        }
+        $erreur = "";
+        if($xml_url)
+        { if(($res = $data->maj_source_cache($xml_url)) !== false)
+          { if($res === true)
+            { if($this->piste = $data->source($this->piste["id"]))
+              { $env->redirect
+                ( $env->url("users/pistes/edit", array("id" => $this->piste["id"])),
+                  "Les informations du fichier XML ont &eacute;t&eacute; mises &agrave; jour",
+                  2
+                );
+                return;
+              }
+              else $erreur =
+               "le contenu du fichier XML a &eacute;t&eacute; mis &agrave; jour"
+              .", mais impossible de lire les informations de la source";
+            }
+            else
+            { switch($res)
+              { case -1: $env->message("Impossible de lire le contenu du fichier XML"); break;
+                case -2: $env->message("Le fichier XML indiqu&eacute; ne contient pas un fichier de source valide"); break;
+                default: $erreur = "Erreur inconnue (?)"; break;
+              }
+            }
+          }
+          else $erreur = "Impossible de mettre &agrave; jour le contenu du fichier XML dans le cache";
+        }
+        else $env->message("Pas d'URL pour ce fichier XML. Impossible de recharger les informations");
+        if($erreur) $env->erreur($erreur);
+        else $env->run("users/pistes/edit", array("id" => $this->piste["id"]));
+      }
+      else $env->erreur("parametre de fichier xml manquant");
+    }
+
+    function del(){
+      $env = $this->env();
+      $data = $env->data();
+      $this->piste["premissions"] = $data->source_permissions($this->piste, $this->user["id"]);
+      if($this->piste["premissions"]["admin"])
+      { if($data->del_source($this->piste["id"]))
+        { $env->redirect
+          ( $env->url("users/pistes"),
+            "la source a &eacute;t&eacute; supprim&eacute;e"
+          );
+        }
+        else $env->erreur("Impossible de supprimer la source");
+      }
+      else $env->erreur("vous n'avez la permission d'effacer cette source");
+    }
+
+  }
+
+?>
\ No newline at end of file
diff --git a/app/controllers/users/sources.php b/app/controllers/users/sources.php
new file mode 100644 (file)
index 0000000..f962924
--- /dev/null
@@ -0,0 +1,58 @@
+<?php
+
+  class mw_users_sources extends mw_controller
+  {
+
+    function validate(){
+      return "Controleur interne - appel interne uniquement";
+    }
+
+    function get_source_from_xml(&$env, $xml_url, $xml_content, $xml_use_edit_content)
+    { $data = $env->data();
+      $source = $data->empty_source();
+      $source_xml = array
+      ( "url" => $xml_url,
+        "content" => $xml_content,
+        "use_edit_content" => $xml_use_edit_content
+      );
+      if($source_xml["url"])
+      { if($source_xml["content"])
+        { if
+          ( ( $source = $data->source_xml_read
+              ( $source_xml["url"],
+                $source_xml["content"]
+              )
+            ) === false
+          )
+          { $source = $data->empty_source();
+            $env->message
+            ( "Code XML invalide pour :"
+             ."<br /><strong>".$source_xml["url"]."</strong>"
+            );
+          }
+        }
+        else
+        { if($source_xml["content"] === false)
+          { $env->message
+            ( "Impossible de lire le contenu du fichier XML pour :"
+             ."<br /><strong>".$source_xml["url"]."</strong>"
+            );
+          }
+          else
+          { $env->message
+            ( "Le contenu du fichier XML est vide pour :"
+             ."<br /><strong>".$source_xml["url"]."</strong>"
+            );
+          }
+        }
+      }
+      else
+      { $env->message("Merci de pr&eacute;ciser l'ULR du fichier XML");
+      }
+      $source["xml"] = $source_xml;
+      return $source;
+    }
+
+  }
+
+?>
\ No newline at end of file
diff --git a/app/data/modules/share/sml_data_sources_cache.php b/app/data/modules/share/sml_data_sources_cache.php
new file mode 100644 (file)
index 0000000..e09f824
--- /dev/null
@@ -0,0 +1,238 @@
+<?php
+
+  class sml_data_sources_cache extends mw_data
+  {
+
+    /*
+     * retourne le contenu XML dont l'URL d'origine est $url
+     *
+     * si le contenu n'est pas dans le cache, cette fonction
+     * ira le lire et l'ajoutera dans le cache
+     *
+     * si le contenu est dans cache mais que sa date de validite
+     * est depassee, le contenu sera mis a jour
+     *
+     * $url : l'URL d'origine du fichier XML
+     *
+     * $IGNORE_UPDATE : si VRAI et qu'un contenu correspondant est
+     * dans le cache, c'est ce contenu qui sera fourni, meme si
+     * sa date de validite est depassee
+     *
+     */
+    function get_source_xml_from_cache($url, $IGNORE_UPDATE = false)
+    { $env = $this->env();
+      $sgbd = $this->sgbd();
+      if(($cache_infos = $this->source_cache_infos_db($url)) !== false)
+      { if($cache_infos)
+        { if($env->config("cache_maj_auto"))
+          { if(($need_update = $this->cache_need_update($cache_infos["last_update"], $env->config("cache_time") * 60 * 60)) !== false)
+            { if(!$IGNORE_UPDATE && $need_update)
+              { if($this->buffer =  @file_get_contents($url))
+                { if($this->parse_source_xml($this->buffer))
+                  { if($this->del_source_cache($cache_infos["id"], $cache_infos["id_source"]))
+                    { if($this->add_source_cache($url, $this->buffer)) return $this->buffer;
+                    }
+                  }
+                  else return -1;
+                }
+                else return -1;
+              }
+              else return @file_get_contents($env->path("content")."cache/sources/".$cache_infos["id_source"].".xml");
+            }
+          }
+        }
+        else
+        { if($this->buffer =  @file_get_contents($url))
+          { if($this->parse_source_xml($this->buffer))
+            { if(!$this->add_source_cache($url, $this->buffer)) return false;
+            }
+            return $this->buffer;
+          }
+        }
+      }
+      return false;
+    }
+
+    /*
+     * retourne 1 si $last_update + $cache_time est
+     * superieur ou egal a la date courante, 0 sinon
+     *
+     * retourne FAUX si le formta de $last_update ou
+     * de $cache_time est incorrect
+     *
+     * $last_update : date au format Y-m-d H:i:s
+     *
+     * $cache_time : duree, en secondes
+     *
+     */
+    function cache_need_update($last_update, $cache_time)
+    { $v_last_update = explode(" ", $last_update);
+      if(count($v_last_update) == 2)
+      { $v_date = explode("-", $v_last_update[0]);
+        if(count($v_date) == 3)
+        { $v_time = explode(":", $v_last_update[1]);
+          if(count($v_time) == 3)
+          { if
+            (    preg_match("/^[0-9]+$/", $v_date[0])
+              && preg_match("/^[0-9]+$/", $v_date[1])
+              && preg_match("/^[0-9]+$/", $v_date[2])
+              && preg_match("/^[0-9]+$/", $v_time[0])
+              && preg_match("/^[0-9]+$/", $v_time[1])
+              && preg_match("/^[0-9]+$/", $v_time[2])
+              && preg_match("/^[0-9]+$/", $cache_time)
+            )
+            { return (time() - mktime($v_time[0], $v_time[1], $v_time[2], $v_date[1], $v_date[2], $v_date[0])) < $cache_time ? 0 : 1;
+            }
+          }
+        }
+      }
+      return false;
+    }
+
+    /*
+     * ajoute un contenu xml dans le cache
+     *
+     * $url : l'URL du fichier XML d'origine
+     *
+     * $xml_content : le contenu du fichier XML
+     *
+     */
+    function add_source_cache($url, $xml_content)
+    { $env = $this->env();
+      $sgbd = $this->sgbd();
+      if(($cache_index = $this->inc_sources_cache_index()) !== false)
+      { if($fh = @fopen($env->path("content")."cache/sources/".$cache_index.".xml", "w+"))
+        { $res = false;
+          if(@fwrite($fh, $this->buffer))
+          { @fclose($fh);
+            $res = $this->add_source_cache_db($url, $cache_index);
+          }
+          @fclose($fh);
+          return $res;
+        }
+      }
+      return false;
+    }
+
+    /*
+     * met a jour le cache pour le fichier XML dont l'URL d'origine est $url
+     *
+     * retourne :
+     *
+     *   VRAI si tout se passe bien
+     *   -1 si l'URL est introuvable
+     *   -2 si le contenu a cette URL n'est pas un fichier XML de source
+     *   FAUX si le cache n'a pas pu etre mis a jour avec les nouvelles infos
+     *
+     */
+    function maj_source_cache($url)
+    { if($this->buffer =  @file_get_contents($url))
+      { if($this->parse_source_xml($this->buffer))
+        { if(($cache_infos = $this->source_cache_infos_db($url)) !== false)
+          { if($cache_infos)
+            { if($this->del_source_cache($cache_infos["id"], $cache_infos["id_source"]))
+              { if($this->add_source_cache($url, $this->buffer)) return true;
+              }
+            }
+            else
+            { if($this->add_source_cache($url, $this->buffer)) return true;
+            }
+          }
+          return false;
+        }
+        else return -2;
+      }
+      else return -1;
+    }
+
+    /*
+     * vide le cache
+     *
+     */
+    function empty_source_cache()
+    { $OK = true;
+      if(($cache = $this->source_cache_db()) !== false)
+      { foreach($cache as $id_cache => $cache_infos)
+        { if(!$this->del_source_cache($id_cache, $cache_infos["id_source"]))
+          { $OK = false;
+            $break;
+          }
+        }
+      }
+      else $OK = false;
+      return $OK;
+    }
+
+    /*
+     * efface un contenu XML du cache
+     *
+     * $id_cache_data : l'index des informations de cache
+     * dans le dossier data
+     *
+     * $id_xml_cache : l'index du contenu XML dans le cache
+     *
+     */
+    function del_source_cache($id_cache_data, $id_xml_cache)
+    { $env = $this->env();
+      if($this->del_source_cache_db($id_cache_data))
+      { if(@unlink($env->path("content")."cache/sources/".$id_xml_cache.".xml")) return true;
+      }
+      return false;
+    }
+
+    /*
+     * initialise le cache
+     * cette fonction verifie que les dossiers du cache existent
+     * et les cree sinon
+     *
+     */
+    function init_sources_cache()
+    { $env = $this->env();
+      if(!is_dir($env->path("content")."cache")) @mkdir($env->path("content")."cache");
+      if(is_dir($env->path("content")."cache"))
+      { if(!is_dir($env->path("content")."cache/sources")) @mkdir($env->path("content")."cache/sources");
+        if(is_dir($env->path("content")."cache/sources"))
+        { return true;
+        }
+      }
+      return "impossible d'initialiser le cache";
+    }
+
+    /*
+     * incremente l'index du cache et retourne le nouvel index
+     *
+     */
+    function inc_sources_cache_index()
+    { clearstatcache();
+      $env = $this->env();
+      $cache_index = false;
+      if(is_dir($env->path("content")."cache/sources") && is_writable($env->path("content")."cache/sources"))
+      { if(!file_exists($env->path("content")."cache/sources/.index"))
+        { if($fh = @fopen($env->path("content")."cache/sources/.index", "w+"))
+          { if(@fwrite($fh, "0")) $cache_index = 0;
+            @fclose($fh);
+          }
+        }
+        else
+        { if(($cache_index = @file_get_contents($env->path("content")."cache/sources/.index")) !== false)
+          { if(preg_match("/^[0-9]+$/", $cache_index))
+            { $cache_index = (int)$cache_index;
+            }
+            else $cache_index = false;
+          }
+        }
+      }
+      if($cache_index !== false)
+      { $cache_index++;
+        if($fh = @fopen($env->path("content")."cache/sources/.index", "w+"))
+        { if(!@fwrite($fh, (string)$cache_index)) $cache_index = false;
+          @fclose($fh);
+        }
+        else $cache_index = false;
+      }
+      return $cache_index;
+    }
+
+  }
+
+?>
\ No newline at end of file
diff --git a/app/data/modules/share/sml_data_sources_xml.php b/app/data/modules/share/sml_data_sources_xml.php
new file mode 100644 (file)
index 0000000..1cf0cc4
--- /dev/null
@@ -0,0 +1,207 @@
+<?php
+
+  class sml_data_sources_xml extends mw_data
+  {
+
+    function get_source_xml_from_url($url, $IGNORE_UPDATE = false)
+    { $env = $this->env();
+      if($env->config("cache_actif")) return $this->get_source_xml_from_cache($url, $IGNORE_UPDATE);
+      else return @file_get_contents($url);
+    }
+
+    # ----------------------------------------------------------------------------------------
+    #                                                                               XML source
+    #
+
+    function set_source_xml($id, $params = array())
+    { $env = $this->env();
+      $OK = false;
+      if(strlen($id) > 0 && ($fh = @fopen($this->source_xml_path($id), "wb")) !== false){
+        if(($content = $this->source_xml_content($id, $params)) !== false){
+          if(@fwrite($fh, $content)) $OK = true;
+        }
+        @fclose($fh);
+      }
+      return $OK;
+    }
+
+    function maj_source_xml_groupe($groupe)
+    { $OK = true;
+      if($groupe !== false)
+      { $sgbd = $this->sgbd();
+        $env = $this->env();
+        if(($sources = $this->sources(array("id_groupe" => $groupe["id"]))) !== false)
+        { foreach($sources["list"] as $id_source => $source)
+          { if(!$this->set_source_xml($source["id"], array("source" => $source)))
+            { $OK = false;
+              break;
+            }
+          }
+        }
+        else $OK = false;
+      }
+      else $OK = false;
+      return $OK;
+    }
+
+    function maj_source_xml_licence($licence)
+    { $OK = true;
+      if($licence !== false)
+      { $sgbd = $this->sgbd();
+        $env = $this->env();
+        if(($sources = $this->sources(array("id_licence" => $licence["id"]))) !== false)
+        { foreach($sources["list"] as $id_source => $source)
+          { if(!$this->set_source_xml($source["id"], array("source" => $source)))
+            { $OK = false;
+              break;
+            }
+          }
+        }
+        else $OK = false;
+      }
+      else $OK = false;
+      return $OK;
+    }
+
+    function maj_source_xml_all()
+    { $OK = true;
+      $sgbd = $this->sgbd();
+      $env = $this->env();
+      if(($sources = $this->sources(array())) !== false)
+      { foreach($sources["list"] as $id_source => $source)
+        { if(!$this->set_source_xml($source["id"], array("source" => $source)))
+          { $OK = false;
+            break;
+          }
+        }
+      }
+      else $OK = false;
+      return $OK;
+    }
+
+    function get_source_xml($id_source)
+    { $source_file = $this->source_xml_path($id_source);
+      if(file_exists($source_file))
+      { return @file_get_contents($source_file);
+      }
+      return "";
+    }
+
+    function del_source_xml($id_source)
+    { $env = $this->env();
+      if(file_exists($this->source_xml_path($id_source)))
+      { return
+           $this->del_edit_derivations(array("id_source" => $id_source))
+        && $this->del_edit_reference_content($id_source)
+        && @unlink($this->source_xml_path($id_source));
+      }
+      return true;
+    }
+
+    # ----------------------------------------------------------------------------------------
+    #                                                                   edition XML derivation
+    #
+
+    function set_edit_derivation_content($id_source, $id_source_derivation, $content)
+    { $env = $this->env();
+      $derivations_dir = $this->derivations_edit_xml_dir_path();
+      if(!file_exists($derivations_dir) || !is_dir($derivations_dir)) @mkdir($derivations_dir);
+      if(file_exists($derivations_dir) && is_dir($derivations_dir))
+      { $derivations_dir = $this->derivations_edit_xml_dir_path($id_source);
+        if(!file_exists($derivations_dir) || !is_dir($derivations_dir)) @mkdir($derivations_dir);
+        if(file_exists($derivations_dir) && is_dir($derivations_dir))
+        { if($fh = @fopen($this->derivation_edit_xml_path($id_source, $id_source_derivation), "w+"))
+          { if(@fwrite($fh, $content))
+            { @fclose($fh);
+              return true;
+            }
+            @fclose($fh);
+          }
+        }
+      }
+      return false;
+    }
+    
+    function get_edit_derivation_content($id_source, $id_source_derivation)
+    { $env = $this->env();
+      $derivation_file = $this->derivation_edit_xml_path($id_source, $id_source_derivation);
+      $derivation_content = "";
+      if(file_exists($derivation_file))
+      { $derivation_content = @file_get_contents($derivation_file);
+      }
+      return $derivation_content;
+    }
+
+    function del_edit_derivation_content($id_source, $id_source_derivation)
+    { $env = $this->env();
+      $derivation_file = $this->derivation_edit_xml_path($id_source, $id_source_derivation);
+      $OK = true;
+      if(file_exists($derivation_file))
+      { $OK = @unlink($derivation_file);
+      }
+      return $OK;
+    }
+
+    function del_edit_derivations($id_source)
+    { $env = $this->env();
+      $derivations_dir = $this->derivations_edit_xml_dir_path($id_source);
+      $OK = true;
+      if(is_dir($derivations_dir))
+      { if($dh = opendir($derivations_dir))
+        { while($OK && (($file = readdir($dh)) !== false))
+          { if(preg_match("/^.+\.xml$/", $file))
+            { $OK = @unlink($derivations_dir.$file) && $OK;
+            }
+          }
+          closedir($dh);
+//          $OK = @rmdir($derivations_dir) && $OK;
+          @rmdir($derivations_dir);
+        }
+        else $OK = false;
+      }
+      return $OK;
+    }
+
+    # ----------------------------------------------------------------------------------------
+    #                                                                    edition XML reference
+    #
+
+    function set_edit_reference_content($id_source, $content)
+    { $env = $this->env();
+      $references_dir = $this->reference_edit_xml_dir_path();
+      if(!file_exists($references_dir) || !is_dir($references_dir)) @mkdir($references_dir);
+      if(file_exists($references_dir) && is_dir($references_dir))
+      { if($fh = @fopen($this->reference_edit_xml_path($id_source), "w+"))
+        { if(@fwrite($fh, $content))
+          { @fclose($fh);
+            return true;
+          }
+          @fclose($fh);
+        }
+      }
+      return false;
+    }
+
+    function get_edit_reference_content($id_source)
+    { $env = $this->env();
+      $reference_file = $this->reference_edit_xml_path($id_source);
+      $reference_content = "";
+      if(file_exists($reference_file))
+      { $reference_content = @file_get_contents($reference_file);
+      }
+      return $reference_content;
+    }
+
+    function del_edit_reference_content($id_source)
+    { $env = $this->env();
+      $reference_file = $this->reference_edit_xml_path($id_source);
+      $OK = true;
+      if(file_exists($reference_file))
+      { $OK = @unlink($reference_file);
+      }
+      return $OK;
+    }
+
+  }
+
+?>
\ No newline at end of file
diff --git a/app/data/modules/share/sml_data_sources_xml_format.php b/app/data/modules/share/sml_data_sources_xml_format.php
new file mode 100644 (file)
index 0000000..0847036
--- /dev/null
@@ -0,0 +1,178 @@
+<?php
+
+  class sml_data_sources_xml_format extends mw_data
+  {
+
+    var $status;
+    var $source;
+    var $groupes;
+    var $licence;
+    var $sources;
+    var $xml_content;
+
+    # ----------------------------------------------------------------------------------------
+    #                                                                            data vers XML
+    #
+
+    function source_xml_content($id, $params = array())
+    { $env = $this->env();
+      $content = false;
+      $this->status = isset($this->status) ? $this->status : $this->source_status();
+      if($this->status !== false)
+      { $this->source = isset($params["source"]) ? $params["source"] : $this->source($id, true);
+        if($this->source !== false)
+        { if($this->source["groupes"]) $this->groupes = $this->source["groupes"];
+          if(isset($params["groupes"])) $this->groupes = $params["groupes"];
+          if(!isset($this->groupes)) $this->groupes = $this->source_groupes($id);
+          if($this->groupes !== false)
+          { $this->licence = isset($params["licence"]) ? $params["licence"] : $this->licence($this->source["licence"]["id"]);
+            if($this->licence !== false)
+            { if(($this->sources = $this->source_compositions(array("id_composition" => $id))) !== false)
+              { $content = "<source>\n";
+                if($this->source["derivations"])
+                { foreach($this->source["derivations"] as $id_derivation => $derivation)
+                  { $content .= "  <derivation><![CDATA[".$derivation["xml"]["url"]."]]></derivation>\n";
+                  }
+                }
+                if($this->source["reference"]) $content .= "  <reference><![CDATA[".$this->source["reference"]["xml"]["url"]."]]></reference>\n";
+                else
+                { $content .=
+                   "  <titre><![CDATA[".$this->source["titre"]."]]></titre>\n"
+                  ."  <from><![CDATA[http://".$_SERVER["SERVER_NAME"].$env->url("sources/".$this->status[$this->source["status"]]["nom"]."/view", array($this->status[$this->source["status"]]["nom"] => $id))."]]></from>\n";
+                  $HAS_AUTHOR = false;
+                  foreach($this->groupes as $id_groupe => $groupe)
+                  { if($groupe["nom"] && $groupe["id_groupe_status"])
+                    { if
+                      (    $groupe["id_groupe_status"] == $this->id_groupe_status_admin()
+                        || $groupe["id_groupe_status"] == $this->id_groupe_status_editeur()
+                      )
+                      { $content .= "  <auteur><![CDATA[".$groupe["nom"]."]]></auteur>\n";
+                        $HAS_AUTHOR = true;
+                      }
+                    }
+                    else return false;
+                  }
+                  if(!$HAS_AUTHOR) return false;
+                  foreach($this->source["documents"] as $id_document => $document)
+                  { $content .=
+                     "  <document>\n"
+                    ."    <nom><![CDATA[".$document["nom"]."]]></nom>\n"
+                    ."    <url><![CDATA[".$document["url"]."]]></url>\n"
+                    ."  </document>\n";
+                  }
+                  if($this->licence)
+                  { $content .=
+                     "  <licence url=\"".$this->licence["url"]."\"><![CDATA[".$this->licence["nom"]."]]></licence>\n";
+                  }
+                  if(isset($this->sources[$id]))
+                  { foreach($this->sources[$id] as $id_source)
+                    { $content .= "  <source src=\"".$this->source_xml_url($id_source)."\" />\n";
+                    }
+                  }
+                }
+                $content .= "</source>";
+              }
+            }
+          }
+        }
+      }
+      return $content;
+    }
+
+    # ----------------------------------------------------------------------------------------
+    #                                                                            XML vers data
+    #
+
+    function parse_source_xml($xml_content)
+    { if(!isset($this->sxml)) $this->sxml = new sxml();
+      $this->sxml->parse($xml_content);
+      return isset($this->sxml->data["source"][0]);
+    }
+
+    function empty_source($params = array())
+    { $source = array
+      ( "auteurs" => array(),
+        "titre" => "",
+        "from" => "",
+        "licence" => array
+        ( "nom" => "",
+          "url" => ""
+        ),
+        "documents" => array(),
+        "derivations" => array(),
+        "reference" => array(),
+        "xml" => array
+        ( "url" => "",
+          "content" => "",
+          "use_edit_content" => false
+        )
+      );
+      foreach($params as $key => $value) $source[$key] = $value;
+      return $source;
+    }
+
+    function source_xml_read($url, $xml_content = null)
+    { $source = $this->empty_source();
+      if($this->xml_content = (isset($xml_content) ? $xml_content : $this->get_source_xml_from_url($url)))
+      { if($this->xml_content === -1) $this->xml_content = $this->get_source_xml_from_url($url, true);
+        $source["xml"] = array
+        ( "url" => $url,
+          "content" => $this->xml_content,
+          "use_edit_content" => false
+        );
+        if($this->parse_source_xml($this->xml_content))
+        { $this->buffer = $this->sxml->data["source"][0];
+          foreach($this->buffer["subs"] as $key => $value)
+          { if($key == "auteur")
+            { $source["auteurs"][] = array
+              ( "nom" => $value[0]["data"]
+              );
+            }
+            elseif($key == "document")
+            { foreach($value as $id_document => $document)
+              { $source["documents"][$id_document] = array
+                ( "nom" => $document["subs"]["nom"][0]["data"],
+                  "url" => $document["subs"]["url"][0]["data"]
+                );
+              }
+            }
+            elseif($key == "derivation")
+            { $source["derivations"][] = array
+              ( "xml" => array
+                ( "url" => $value[0]["data"],
+                  "content" => "",
+                  "use_edit_content" => false
+                )
+              );
+            }
+            elseif($key == "reference")
+            { $source["reference"] = array
+              ( "xml" => array
+                ( "url" => $value[0]["data"],
+                  "content" => "",
+                  "use_edit_content" => false
+                )
+              );
+            }
+            elseif($key == "licence")
+            { $source["licence"] = array
+              ( "nom" => $value[0]["data"],
+                "url" => $value[0]["attrs"]["url"]
+              );
+            }
+            else
+            { $source[$key] = $value[0]["data"];
+            }
+          }
+          $source["auteur"] = "";
+          foreach($source["auteurs"] as $auteur) $source["auteur"] .= ($source["auteur"] ? ", " : "").$auteur["nom"];
+        }
+        else return false;
+      }
+      else return false;
+      return $source;
+    }
+
+  }
+
+?>
\ No newline at end of file
diff --git a/app/data/modules/share/sml_data_sources_xml_pathes.php b/app/data/modules/share/sml_data_sources_xml_pathes.php
new file mode 100644 (file)
index 0000000..f49d891
--- /dev/null
@@ -0,0 +1,66 @@
+<?php
+
+  class sml_data_sources_xml_pathes extends mw_data{
+
+    function init_source_xml_pathes(){
+      $env = $this->env();
+      $sources_dir = $env->path("content")."sources/";
+      if(!is_dir($sources_dir)){
+        if(file_exists($sources_dir)) return false;
+        @mkdir($sources_dir);
+      }
+      if(!is_dir($sources_dir)) return false;
+      $references_dir = $env->path("content")."sources/references/";
+      if(!is_dir($references_dir)){
+        if(file_exists($references_dir)) return false;
+        @mkdir($references_dir);
+      }
+      if(!is_dir($references_dir)) return false;
+      $derivations_dir = $env->path("content")."sources/derivations/";
+      if(!is_dir($derivations_dir)){
+        if(file_exists($derivations_dir)) return false;
+        @mkdir($derivations_dir);
+      }
+      if(!is_dir($derivations_dir)) return false;
+      return true;
+    }
+
+    function source_xml_path($id_source){
+      if(!$this->init_source_xml_pathes()) return false;
+      $env = $this->env();
+      return $env->path("content")."sources/".$id_source.".xml";
+    }
+
+    function reference_edit_xml_dir_path(){
+      if(!$this->init_source_xml_pathes()) return false;
+      $env = $this->env();
+      return $env->path("content")."sources/references/";
+    }
+
+    function reference_edit_xml_path($id_source){
+      if(!$this->init_source_xml_pathes()) return false;
+      $env = $this->env();
+      return $this->reference_edit_xml_dir_path().$id_source.".xml";
+    }
+
+    function derivations_edit_xml_dir_path($id_source = null){
+      if(!$this->init_source_xml_pathes()) return false;
+      $env = $this->env();
+      return $env->path("content")."sources/derivations/".(isset($id_source) ? $id_source."/" : "");
+    }
+
+    function derivation_edit_xml_path($id_source, $id_source_derivation){
+      if(!$this->init_source_xml_pathes()) return false;
+      $env = $this->env();
+      return $this->derivations_edit_xml_dir_path($id_source).$id_source_derivation.".xml";
+    }
+
+    function source_xml_url($id_source){
+      if(!$this->init_source_xml_pathes()) return false;
+      $env = $this->env();
+      return "http://".$_SERVER["SERVER_NAME"].$env->path("web").$this->source_xml_path($id_source);
+    }
+
+  }
+
+?>
\ No newline at end of file
diff --git a/app/data/modules/sql/sml_data_authors.php b/app/data/modules/sql/sml_data_authors.php
new file mode 100644 (file)
index 0000000..72779a8
--- /dev/null
@@ -0,0 +1,147 @@
+<?php
+
+  class sml_data_authors extends mw_data
+  {
+
+    # ----------------------------------------------------------------------------------------
+    #                                                                                  groupes
+    #
+
+    function groupes($id_user = null, $start = null, $alpha = null){
+      $sgbd = $this->sgbd();
+      $env = $this->env();
+      $groupes = array("list" => array(), "total" => 0);
+      try{
+        $SELECT = "SELECT *";
+        $FROM = " FROM #--sml_authors";
+        $WHERE = "";
+        $WHERE .= (isset($id_user) ? ($WHERE ? " AND" : " WHERE")." id_user=".$id_user : "");
+        $WHERE .= (isset($alpha) ? ($WHERE ? " AND" : " WHERE")." LEFT(login, 1)=".$this->eq($alpha) : "");
+        $LIMIT = (isset($start) && $env->config("max_list") ? " LIMIT ".$env->config("max_list")." OFFSET ".$start : "");
+        $sql = "SELECT count(*) as n FROM(".$SELECT.$FROM.$WHERE.") res";
+        $rst = $sgbd->query($sql);
+        if($v_rst = $sgbd->fetch_assoc($rst)) $groupes["total"] = $v_rst["n"];
+        $sgbd->free_result($rst);
+        if($groupes["total"] > 0){
+          $sql = "SELECT * FROM(".$SELECT.$FROM.$WHERE.$LIMIT.") res";
+          $rst = $sgbd->query($sql);
+          while($v_rst = $sgbd->fetch_assoc($rst)){
+            $groupes["list"][$v_rst["id"]] = $v_rst;
+            $groupes["list"][$v_rst["id"]]["image_uri"] = (
+              $v_rst["image"] ?
+                $env->path("content")."uploads/".$v_rst["image"]
+              : ""
+            );
+          }
+          $sgbd->free_result($rst);
+        }
+      }
+      catch(Exception $e){
+        return false;
+      }
+      return $groupes;
+    }
+
+    function groupe($id){
+      $sgbd = $this->sgbd();
+      $env = $this->env();
+      $groupe = array();
+      try{
+        $sql = "SELECT * from #--sml_authors WHERE id=".$this->eq($id);
+        $rst = $sgbd->query($sql);
+        if($v_rst = $sgbd->fetch_assoc($rst)){
+          $groupe = $v_rst;
+          $groupe["image_uri"] = (
+            $groupe["image"] ?
+              $env->path("content")."uploads/".$groupe["image"]
+            : ""
+          );
+        }
+        $sgbd->free_result($rst);
+      }
+      catch(Exception $e) { return false; }
+      return $groupe;
+    }
+
+    function groupe_exists($nom, $other_than_id = null){
+      $sgbd = $this->sgbd();
+      $EXISTS = 0;
+      try{
+        $sql = "SELECT count(*) as n from #--sml_authors WHERE nom=".$this->eq($nom);
+        if(isset($other_than_id)) $sql .= " AND id!=".$this->eq($other_than_id);
+        $rst = $sgbd->query($sql);
+        if($v_rst = $sgbd->fetch_assoc($rst)) $EXISTS = $v_rst["n"];
+        $sgbd->free_result($rst);
+      }
+      catch(Exception $e){
+        return false;
+      }
+      return $EXISTS;
+    }
+
+    function add_groupe($id_user, $nom, $image, $description, $email, $contact_form, $captcha){
+      $sgbd = $this->sgbd();
+      try{
+        $sql =
+         "INSERT INTO #--sml_authors(id_user, nom, image, description, email, contact_form, captcha) VALUES"
+        ."( ".$this->eq($id_user)
+        .", ".$this->eq($nom)
+        .", ".$this->eq($image)
+        .", ".$this->eq($description)
+        .", ".$this->eq($email)
+        .", ".$this->eq($contact_form)
+        .", ".$this->eq($captcha)
+        .")";
+        $sgbd->query($sql);
+      }
+      catch(Exception $e){
+        return false;
+      }
+      return true;
+    }
+
+    function set_groupe($id, $nom, $image, $description, $email, $contact_form, $captcha){
+      if(($groupe = $this->groupe($id)) === false) return false;
+      $sgbd = $this->sgbd();
+      try{
+        $sql =
+         "UPDATE #--sml_authors SET"
+        ."  nom=".$this->eq($nom)
+        .", image=".$this->eq($image)
+        .", description=".$this->eq($description)
+        .", email=".$this->eq($email)
+        .", contact_form=".$this->eq($contact_form)
+        .", captcha=".$this->eq($captcha)
+        ." WHERE id=".$id;
+        $sgbd->query($sql);
+      }
+      catch(Exception $e){
+        return false;
+      }
+      if($nom != $groupe["nom"]){
+        $groupe["nom"] = $nom;
+        if(!$this->maj_source_xml_groupe($groupe)) return false;
+      }
+      return true;
+    }
+
+    function del_groupe($id){
+      $sgbd = $this->sgbd();
+      try{
+        $sql = "SELECT count(*) as n FROM #--sml_sources_authors WHERE id_author=".$this->eq($id);
+        $rst = $sgbd->query($sql);
+        if($v_rst = $sgbd->fetch_assoc($rst)) $HAS_SOURCES = $v_rst["n"];
+        $sgbd->free_result($rst);
+        if($HAS_SOURCES) return 1;
+        $sql = "DELETE FROM #--sml_authors WHERE id=".$this->eq($id);
+        $sgbd->query($sql);
+      }
+      catch(Exception $e){
+        return false;
+      }
+      return true;
+    }
+
+  }
+
+?>
\ No newline at end of file
diff --git a/app/data/modules/sql/sml_data_licences.php b/app/data/modules/sql/sml_data_licences.php
new file mode 100644 (file)
index 0000000..90445bb
--- /dev/null
@@ -0,0 +1,95 @@
+<?php
+
+  class sml_data_licences extends mw_data{
+
+    function licences($start = null){
+      $sgbd = $this->sgbd();
+      $env = $this->env();
+      $licences = array("list" => array(), "total" => 0);
+      try{
+        $SELECT = "SELECT *";
+        $FROM = " FROM #--sml_licences";
+        $WHERE = "";
+        $LIMIT = (isset($start) && $env->config("max_list") ? " LIMIT ".$env->config("max_list")." OFFSET ".$start : "");
+        $sql = "SELECT count(*) as n FROM(".$SELECT.$FROM.$WHERE.") res";
+        $rst = $sgbd->query($sql);
+        if($v_rst = $sgbd->fetch_assoc($rst)) $licences["total"] = $v_rst["n"];
+        $sgbd->free_result($rst);
+        if($licences["total"] > 0){
+          $sql = "SELECT * FROM(".$SELECT.$FROM.$WHERE.$LIMIT.") res";
+          $rst = $sgbd->query($sql);
+          while($v_rst = $sgbd->fetch_assoc($rst)) $licences["list"][$v_rst["id"]] = $v_rst;
+          $sgbd->free_result($rst);
+        }
+      }
+      catch(Exception $e) { $licences = false; }
+      return $licences;
+    }
+
+    function licence($id){
+      $sgbd = $this->sgbd();
+      $licence = array();
+      try{
+        $sql = "SELECT * from #--sml_licences WHERE id=".$this->eq($id);
+        $rst = $sgbd->query($sql);
+        if($v_rst = $sgbd->fetch_assoc($rst)) $licence = $v_rst;
+        $sgbd->free_result($rst);
+      }
+      catch(Exception $e) { $licence = false; }
+      return $licence;
+    }
+
+    function add_licence($nom, $url){
+      $sgbd = $this->sgbd();
+      try{
+        $sql =
+         "INSERT INTO #--sml_licences(nom, url) VALUES"
+        ."( ".$this->eq($nom)
+        .", ".$this->eq($url)
+        .")";
+        $sgbd->query($sql);
+      }
+      catch(Exception $e) { return false; }
+      return true;
+    }
+
+    function set_licence($id, $nom, $url){
+      if(($licence = $this->licence($id)) !== false){
+        $sgbd = $this->sgbd();
+        try{
+          $sql =
+           "UPDATE #--sml_licences SET"
+          ."  nom=".$this->eq($nom)
+          .", url=".$this->eq($url)
+          ." WHERE id=".$id;
+          $sgbd->query($sql);
+          if($nom != $licence["nom"] || $url != $licence["url"]){
+            $licence["nom"] = $nom;
+            $licence["url"] = $url;
+            if(!$this->maj_source_xml_licence($licence)) return false;
+          }
+        }
+        catch(Exception $e) { return false; }
+        return true;
+      }
+      return false;
+    }
+
+    function del_licence($id){
+      $sgbd = $this->sgbd();
+      try{
+        $sql = "SELECT count(*) as n FROM #--sml_sources WHERE licence=".$this->eq($id);
+        $rst = $sgbd->query($sql);
+        if($v_rst = $sgbd->fetch_assoc($rst)) $USED = $v_rst["n"];
+        $sgbd->free_result($rst);
+        if($USED) return 1;
+        $sql = "DELETE FROM #--sml_licences WHERE id=".$this->eq($id);
+        $sgbd->query($sql);
+      }
+      catch(Exception $e) { return false; }
+      return true;
+    }
+
+  }
+
+?>
\ No newline at end of file
diff --git a/app/data/modules/sql/sml_data_source_groupes.php b/app/data/modules/sql/sml_data_source_groupes.php
new file mode 100644 (file)
index 0000000..de997f9
--- /dev/null
@@ -0,0 +1,131 @@
+<?php
+
+  class sml_data_source_groupes extends mw_data
+  {
+
+    function init_groupe_status(){
+      return true;
+    }
+
+    function source_groupes($id_source)
+    { $env = $this->env();
+      $sgbd = $this->sgbd();
+      try{
+        $sql =
+         "SELECT #--sml_authors.*"
+         .", #--sml_sources_authors.id_sources_access as id_groupe_status"
+        ." FROM #--sml_authors, #--sml_sources_authors"
+        ." WHERE #--sml_sources_authors.id_author=#--sml_authors.id"
+        ." AND #--sml_sources_authors.id_source=".$this->eq($id_source);
+        $rst = $sgbd->query($sql);
+        $groupes = array();
+        while($v_rst = $sgbd->fetch_assoc($rst))
+        { $v_rst["image_uri"] =
+          ( $v_rst["image"] ?
+            $env->path("content")."uploads/".$v_rst["image"]
+            : ""
+          );
+          $groupes[$v_rst["id"]] = $v_rst;
+        }
+        $sgbd->free_result($rst);
+      }
+      catch(Exception $e) { return false; }
+      return $groupes;
+    }
+
+    function add_source_groupe($id_source, $id_groupe, $id_groupe_status)
+    { $sgbd = $this->sgbd();
+      try{
+        $sql =
+         "INSERT INTO #--sml_sources_authors(id_source, id_author, id_sources_access) VALUES"
+        ."( ".$this->eq($id_source)
+        .", ".$this->eq($id_groupe)
+        .", ".$this->eq($id_groupe_status)
+        .")";
+        $sgbd->query($sql);
+      }
+      catch(Exception $e) { return false; }
+      return true;
+    }
+
+    function set_source_groupe($id, $id_groupe_status)
+    { if(($groupe = $this->groupe($id)) !== false)
+      { $sgbd = $this->sgbd();
+        try{
+          $sql =
+           "UPDATE #--sml_sources_authors SET"
+          ."  id_sources_access=".$this->eq($id_groupe_status)
+          ." WHERE id=".$id;
+          $sgbd->query($sql);
+        }
+        catch(Exception $e) { return false; }
+        return true;
+      }
+      return false;
+    }
+
+    function del_source_groupes($id_source)
+    { $sgbd = $this->sgbd();
+      try{
+        $sql = "DELETE FROM #--sml_sources_authors WHERE id_source=".$this->eq($id_source);
+        $sgbd->query($sql);
+      }
+      catch(Exception $e) { return false; }
+      return true;
+    }
+
+    function del_source_groupe($id)
+    { $sgbd = $this->sgbd();
+      try{
+        $sql = "DELETE FROM #--sml_sources_authors WHERE id=".$this->eq($id);
+        $sgbd->query($sql);
+      }
+      catch(Exception $e) { return false; }
+      return true;
+    }
+
+// --------------------------------------------------------------------
+
+    function id_groupe_status_admin()        { return 1; }
+    function id_groupe_status_editeur()      { return 2; }
+    function id_groupe_status_contributeur() { return 3; }
+
+    function get_admin_groupe($groupes)
+    { $groupe = array();
+      if(is_array($groupes)) foreach($groupes as $source_groupe)
+      { if($source_groupe["id_groupe_status"] == $this->id_groupe_status_admin())
+        { $groupe = $source_groupe;
+          break;
+        }
+      }
+      return $groupe;
+    }
+
+    function source_permissions($source, $id_user)
+    { $permissions = array
+      ( "admin" => false,
+        "editeur" => false,
+        "contributeur" => false
+      );
+      foreach($source["groupes"] as $id_groupe => $source_groupe)
+      { if($source_groupe["id_user"] == $id_user)
+        { if($source_groupe["id_groupe_status"] == $this->id_groupe_status_admin())
+          { $permissions["admin"] = true;
+            $permissions["editeur"] = true;
+            $permissions["contributeur"] = true;
+          }
+          elseif($source_groupe["id_groupe_status"] == $this->id_groupe_status_editeur())
+          { $permissions["editeur"] = true;
+            $permissions["contributeur"] = true;
+          }
+          elseif($source_groupe["id_groupe_status"] == $this->id_groupe_status_contributeur())
+          { $permissions["contributeur"] = true;
+          }
+        }
+      }
+      return $permissions;
+    }
+
+  }
+
+?>
\ No newline at end of file
diff --git a/app/data/modules/sql/sml_data_sources.php b/app/data/modules/sql/sml_data_sources.php
new file mode 100644 (file)
index 0000000..8e8056e
--- /dev/null
@@ -0,0 +1,817 @@
+<?php
+
+  class sml_data_sources extends mw_data{
+
+    var $status;
+
+    # ----------------------------------------------------------------------------------------
+    #                                                                         status de source
+    #
+
+    function source_status(){
+      if(!isset($this->status)) $this->status = $this->init_sources_status();
+      return $this->status;
+    }
+
+    function init_sources_status(){
+      $sgbd = $this->sgbd();
+      $env = $this->env();
+      $status = array();
+      try{
+        $sql = "SELECT * FROM #--sml_classes";
+        $rst = $sgbd->query($sql);
+        while($v_rst = $sgbd->fetch_assoc($rst)) $status[$v_rst["id"]] = $v_rst;
+        $sgbd->free_result($rst);
+      }
+      catch(Exception $e) { $status = false; }
+      return $status;
+    }
+
+    # ----------------------------------------------------------------------------------------
+    #                                                                                  sources
+    #
+
+    function init_sources_table(){
+      return true;
+    }
+
+    function sources($params){
+      $start = isset($params["start"]) ? $params["start"] : null;
+      $id_user = isset($params["id_user"]) ? $params["id_user"] : null;
+      $id_groupe = isset($params["id_groupe"]) ? $params["id_groupe"] : null;
+      $status = isset($params["status"]) ? $params["status"] : null;
+      $id_source = isset($params["id_source"]) ? $params["id_source"] : null;
+      $id_composition = isset($params["id_composition"]) ? $params["id_composition"] : null;
+      $id_source_derivation = isset($params["id_source_derivation"]) ? $params["id_source_derivation"] : null;
+      $id_licence = isset($params["id_licence"]) ? $params["id_licence"] : null;
+      $order_by = isset($params["order_by"]) ? $params["order_by"] : "ordre";
+      $order = isset($params["order"]) ? $params["order"] : "ASC";
+      $sgbd = $this->sgbd();
+      $env = $this->env();
+      $ORDER_FIELD_EXISTS = false;
+      $ORDER_FROM_SOURCES_INFOS = !$ORDER_FIELD_EXISTS;
+      $sources = array("list" => array(), "total" => 0);
+      $COUNT_SELECT = "SELECT count(*) as n";
+      $SELECT = "SELECT #--sml_sources.*, #--sml_sources.id_class as status";
+      if($ORDER_FROM_SOURCES_INFOS){
+        if($order_by == "ordre"){
+          $SELECT .= ", (0 + #--sml_sources_infos.`value`) as ordre";
+        }
+        else{
+          $SELECT .= ", #--sml_sources_infos.`value` as ".$this->eq($order_by, false);
+        }
+      }
+      $FROM = "#--sml_sources";
+      if(isset($id_user)) $FROM .= ", #--sml_authors, #--sml_sources_authors";
+      elseif(isset($id_groupe)) $FROM .= ", #--sml_sources_authors";
+      if(isset($id_source)) $FROM .= ", #--sml_source_compositions";
+      elseif(isset($id_composition) && $id_composition) $FROM .= ", #--sml_source_compositions";
+      if(isset($id_source_derivation)) $FROM .= ", #--sml_source_derivations";
+      $FROM = " FROM (".$FROM.")";
+      if($ORDER_FROM_SOURCES_INFOS){
+        $FROM .=
+          " LEFT JOIN #--sml_sources_infos"
+         ." ON (#--sml_sources_infos.id_source=#--sml_sources.id AND #--sml_sources_infos.`key`=".$this->eq($order_by).")";
+      }
+      $WHERE = "";
+      if(isset($id_user)) $WHERE .=
+       ($WHERE ? " AND " : " WHERE ")
+      ." #--sml_sources.id=#--sml_sources_authors.id_source"
+      ." AND #--sml_sources_authors.id_author=#--sml_authors.id"
+      ." AND #--sml_authors.id_user=".$this->eq($id_user)
+      ." AND #--sml_sources_authors.id_sources_access=".$this->id_groupe_status_admin();
+      if(isset($id_groupe)) $WHERE .=
+       ($WHERE ? " AND " : " WHERE ")
+      ." #--sml_sources.id=#--sml_sources_authors.id_source"
+      ." AND #--sml_sources_authors.id_author=".$this->eq($id_groupe)
+      ." AND #--sml_sources_authors.id_sources_access=".$this->id_groupe_status_admin();
+      if(isset($status)) $WHERE .=
+       ($WHERE ? " AND " : " WHERE ")
+      ." #--sml_sources.id_class=".$this->eq($status);
+      if(isset($id_source)) $WHERE .=
+       ($WHERE ? " AND " : " WHERE ")
+      ." #--sml_sources.id=#--sml_source_compositions.id_composition"
+      ." AND #--sml_source_compositions.id_source=".$this->eq($id_source);
+      elseif(isset($id_composition))
+      { if($id_composition)
+        { $WHERE .=
+           ($WHERE ? " AND " : " WHERE ")
+          ." #--sml_sources.id=#--sml_source_compositions.id_source"
+          ." AND #--sml_source_compositions.id_composition=".$this->eq($id_composition);
+        }
+        else
+        { if(($sources_ids = $this->source_compositions(array("id_composition" => ""))) !== false)
+          { if($sources_ids)
+            { $NOT_IN = "";
+              foreach($sources_ids as $in_source_id) $NOT_IN .= ($NOT_IN ? "," : "").$in_source_id;
+              $WHERE .= ($WHERE ? " AND " : " WHERE ")." #--sml_sources.id NOT IN(".$NOT_IN.")";
+            }
+          }
+          else return false;
+        }
+      }
+      if(isset($id_source_derivation)) $WHERE .=
+       ($WHERE ? " AND " : " WHERE ")
+      ." #--sml_sources.id=#--sml_source_derivations.id_source"
+      ." AND #--sml_source_derivations.derivation=".$this->eq($this->source_xml_url($id_source_derivation));
+      if(isset($id_licence)) $WHERE .=
+       ($WHERE ? " AND " : " WHERE ")
+      ." #--sml_sources.licence=".$this->eq($id_licence);
+      $ORDER_BY = " ORDER BY ".$order_by." ".$order;
+      $LIMIT = (isset($start) && $env->config("max_list") ? " LIMIT ".$env->config("max_list")." OFFSET ".$start : "");
+      try{
+        $sql = $COUNT_SELECT.$FROM.$WHERE;
+        $rst = $sgbd->query($sql);
+        if($v_rst = $sgbd->fetch_assoc($rst)) $sources["total"] = $v_rst["n"];
+        $sgbd->free_result($rst);
+        if($sources["total"])
+        { $sql = $SELECT.$FROM.$WHERE.$ORDER_BY.$LIMIT;
+          $rst = $sgbd->query($sql);
+          $OK = true;
+          while($v_rst = $sgbd->fetch_assoc($rst)){
+            if(($sources["list"][$v_rst["id"]] = $this->load_source($v_rst)) === false){
+              $OK = false;
+              break;
+            }
+          }
+          $sgbd->free_result($rst);
+          if(!$OK) return false;
+        }
+      }
+      catch(Exception $e) { $sources = false; }
+      return $sources;
+    }
+
+    function source($id, $load = false){
+      $sgbd = $this->sgbd();
+      try{
+        $sql = "SELECT #--sml_sources.*, #--sml_sources.id_class as status FROM #--sml_sources WHERE id=".$this->eq($id);
+        $rst = $sgbd->query($sql);
+        $source = array();
+        if($v_rst = $sgbd->fetch_assoc($rst)){
+          $source = $load ? $this->load_source($v_rst) : $this->get_source_from_v_rst($v_rst);
+        }
+        $sgbd->free_result($rst);
+      }
+      catch(Exception $e) { $source = false; }
+      return $source;
+    }
+
+    function get_source_from_v_rst($v_rst){
+      $sgbd = $this->sgbd();
+      $source = $this->empty_source();
+      foreach($v_rst as $rst_key => $rst_value) $source[$rst_key] = $rst_value;
+      try{
+        $si_sql = "SELECT * FROM #--sml_sources_infos WHERE id_source=".$this->eq($source["id"]);
+        $si_rst = $sgbd->query($si_sql);
+        while($v_si_rst = $sgbd->fetch_assoc($si_rst)){
+          if(!isset($source[$v_si_rst["key"]])) $source[$v_si_rst["key"]] = $v_si_rst["value"];
+        }
+        $sgbd->free_result($si_rst);
+        if($source["reference"]){
+          if(!is_array($source["reference"])){
+            $reference_url = $source["reference"];
+            $source["reference"] = $this->empty_source();
+            $source["reference"]["xml"]["url"] = $reference_url;
+          }
+        }
+        else{
+          if(!is_array($source["licence"])){
+            $source["licence"] = array(
+              "id" => $source["licence"]
+            );
+          }
+        }
+      }
+      catch(Exception $e) { $source = false; }
+      return $source;
+    }
+
+    function load_source($source){
+      $env = $this->env();
+      if(!isset($source["id"])) return false;
+      $source = $this->get_source_from_v_rst($source);
+      $source["xml"] = array
+      ( "url" => $this->source_xml_url($source["id"]),
+        "content" => $this->get_source_xml($source["id"])
+      );
+      $source["documents"] = array();
+      if(($source["groupes"] = $this->source_groupes($source["id"])) === false) return false;
+      $source["image_uri"] =
+      ( isset($source["image"]) && $source["image"] ?
+        $env->path("content")."uploads/".$source["image"]
+        : ""
+      );
+      if(($source["has_sources"] = $this->has_sources($source["id"])) === false) return false;
+      if(($source["has_derivations"] = $this->source_derivations(array("derivation" => $source["id"]))) === false) return false;
+      if(($source["derivations"] = $this->source_derivations(array("id_source" => $source["id"]))) === false) return false;
+      if(($source["reference"] = $this->source_reference($source)) === false) return false;
+      if(!$source["reference"])
+      { if(($source["documents"] = $this->source_documents($source["id"])) === false) return false;
+      }
+      return $source;
+    }
+
+    function add_source
+    ( $groupes,
+      $titre,
+      $status,
+      $licence,
+      $documents = array(),
+      $reference = array(),
+      $derivations = array(),
+      $infos = array()
+    )
+    { $sgbd = $this->sgbd();
+      $source = array
+      ( "groupes" => $groupes,
+        "titre" => $reference ? null : $titre,
+        "status" => $status,
+        "licence" => $reference ? null : $licence,
+        "reference" => $reference ? $reference : null,
+        "date_creation" => isset($infos["date_creation"]) ? $infos["date_creation"] : null,
+        "date_inscription" => isset($infos["date_inscription"]) ? $infos["date_inscription"] : date("Y-m-d")
+      );
+      try{
+        $sql =
+         "INSERT INTO #--sml_sources(id_class, reference, titre, licence, date_creation, date_inscription)"
+        ." VALUES"
+        ."( ".$this->eq($source["status"])
+        .", ".$this->eq($source["reference"] ? $source["reference"]["xml"]["url"] : null)
+        .", ".$this->eq($source["titre"])
+        .", ".$this->eq($source["licence"])
+        .", ".$this->eq($source["date_creation"])
+        .", ".$this->eq($source["date_inscription"])
+        .")";
+        $sgbd->query($sql);
+        $id = $sgbd->insert_id();
+        foreach($source["groupes"] as $id_groupe => $groupe)
+        { if($groupe["id"] && $groupe["id_groupe_status"])
+          { if(!$this->add_source_groupe($id, $groupe["id"], $groupe["id_groupe_status"])) return false;
+          }
+          else return false;
+        }
+        if(isset($infos["date_creation"])) unset($infos["date_creation"]);
+        if(isset($infos["date_inscription"])) unset($infos["date_inscription"]);
+        foreach($infos as $key => $value){
+          $sql =
+           "INSERT INTO #--sml_sources_infos(id_source, `key`,`value`)"
+          ." VALUES"
+          ."( ".$this->eq($id)
+          .", ".$this->eq($key)
+          .", ".$this->eq($value)
+          .")";
+          $sgbd->query($sql);
+        }
+      }
+      catch(Exception $e) { return false; }
+      foreach($derivations as $source_derivation)
+      { if
+        ( ( $id_source_derivation = $this->add_source_derivation
+            ( $id,
+              $source_derivation["xml"]["url"],
+              $source_derivation["xml"]["use_edit_content"] ? $source_derivation["xml"]["content"] : ""
+            )
+          ) === false
+        )
+        { return false;
+        }
+      }
+      if($reference)
+      { if($reference["xml"]["use_edit_content"])
+        { if(!$this->set_edit_reference_content($id, $reference["xml"]["content"]))
+          { return false;
+          }
+        }
+      }
+      else
+      { foreach($documents as $document)
+        { if(!$this->add_source_document($id, $document)) return false;
+        }
+      }
+      if(!$this->set_source_xml($id)) return false;
+      return $id;
+    }
+
+    function set_source
+    ( $id,
+      $groupes,
+      $titre,
+      $status,
+      $licence,
+      $documents = array(),
+      $reference = array(),
+      $derivations = array(),
+      $infos = array()
+    )
+    { if($source = $this->source($id))
+      { $sgbd = $this->sgbd();
+        $source = array
+        ( "groupes" => $groupes,
+          "titre" => $reference ? null : $titre,
+          "licence" => $reference ? null : $licence,
+          "reference" => $reference ? $reference : null,
+          "date_creation" => isset($infos["date_creation"]) ? $infos["date_creation"] : null
+        );
+        try{
+          $sql =
+           "UPDATE #--sml_sources SET"
+          ."  reference=".$this->eq($source["reference"] ? $source["reference"]["xml"]["url"] : null)
+          .", titre=".$this->eq($source["titre"])
+          .", licence=".$this->eq($source["licence"])
+          .", date_creation=".$this->eq($source["date_creation"])
+          ." WHERE id=".$this->eq($id);
+          $sgbd->query($sql);
+          if(!$this->del_source_groupes($id)) return false;
+          foreach($source["groupes"] as $id_groupe => $groupe)
+          { if($groupe["id"] && $groupe["id_groupe_status"]){
+              if(!$this->add_source_groupe($id, $groupe["id"], $groupe["id_groupe_status"])) return false;
+            }
+            else return false;
+          }
+          $sql = "DELETE FROM #--sml_sources_infos WHERE id_source=".$this->eq($id);
+          $sgbd->query($sql);
+          if(isset($infos["date_creation"])) unset($infos["date_creation"]);
+          if(isset($infos["date_inscription"])) unset($infos["date_inscription"]);
+          foreach($infos as $key => $value)
+          { $sql =
+             "INSERT INTO #--sml_sources_infos(id_source, `key`,`value`)"
+            ." VALUES"
+            ."( ".$this->eq($id)
+            .", ".$this->eq($key)
+            .", ".$this->eq($value)
+            .")";
+            $sgbd->query($sql);
+          }
+        }
+        catch(Exception $e) { return false; }
+        if(!$this->del_source_derivations($id)) return false;
+        if(!$this->del_edit_reference_content($id)) return false;
+        if(!$this->del_source_documents($id)) return false;
+        foreach($derivations as $source_derivation)
+        { if
+          ( ( $id_source_derivation = $this->add_source_derivation
+              ( $id,
+                $source_derivation["xml"]["url"],
+                $source_derivation["xml"]["use_edit_content"] ? $source_derivation["xml"]["content"] : ""
+              )
+            ) === false
+          )
+          { return false;
+          }
+        }
+        if($reference)
+        { if($reference["xml"]["use_edit_content"])
+          { if(!$this->set_edit_reference_content($id, $reference["xml"]["content"]))
+            { return false;
+            }
+          }
+        }
+        else{
+          foreach($documents as $document){
+            if(!$this->add_source_document($id, $document)) return false;
+          }
+        }
+        if(!$this->set_source_xml($id)) return false;
+        return true;
+      }
+      return false;
+    }
+
+    function set_source_info($id_source, $key, $value){
+      $sgbd = $this->sgbd();
+      try{
+        $sql =
+         "SELECT id FROM #--sml_sources_infos"
+        ." WHERE id_source=".$this->eq($id_source)
+        ." AND `key`=".$this->eq($key);
+        $rst = $sgbd->query($sql);
+        $id = null;
+        if($v_rst = $sgbd->fetch_assoc($rst)) $id = $v_rst["id"];
+        $sgbd->free_result($rst);
+        if(isset($id)) $sql =
+         "UPDATE #--sml_sources_infos SET"
+        ." `value`=".$this->eq($value)
+        ." WHERE id=".$this->eq($id);
+        else $sql =
+         "INSERT INTO #--sml_sources_infos(id_source, `key`,`value`)"
+        ." VALUES"
+        ."( ".$this->eq($id_source)
+        .", ".$this->eq($key)
+        .", ".$this->eq($value)
+        .")";
+        $sgbd->query($sql);
+        if(!isset($id)) $id = $sgbd->insert_id();
+      }
+      catch(Exception $e) { return false; }
+      return $id;
+    }
+
+    function del_source($id){
+      $sgbd = $this->sgbd();
+      if(!$this->del_source_compositions(array("id_source" => $id, "id_composition" => $id))) return false;
+      if(!$this->del_edit_reference_content($id)) return false;
+      if(!$this->del_source_derivations($id)) return false;
+      if(!$this->del_source_xml($id)) return false;
+      if(!$this->del_source_documents($id)) return false;
+      if(!$this->del_source_groupes($id)) return false;
+      try{
+        $sql = "DELETE FROM #--sml_sources_infos WHERE id_source=".$this->eq($id);
+        $sgbd->query($sql);
+        $sql = "DELETE FROM #--sml_sources WHERE id=".$this->eq($id);
+        $sgbd->query($sql);
+      }
+      catch(Exception $e) { return false; }
+      return true;
+    }
+
+    # ----------------------------------------------------------------------------------------
+    #                                                                   derivations de sources
+    #
+
+    function init_source_derivations()
+    { $sgbd = $this->sgbd();
+      $rst = $sgbd->table_exists("#--sml_source_derivations");
+      if(isset($rst))
+      { if(!$rst)
+        { return
+           "table manquante"
+          ."<br />"
+          ."<br />"
+          ."<pre>"
+          ."(table_prefix)source_derivations :\n"
+          ."\n"
+          ."  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,\n"
+          ."  id_source INT NOT NULL,\n"
+          ."  derivation VARCHAR NOT NULL\n"
+          ."\n"
+          ."</pre>";
+        }
+      }
+      else return "impossible de chercher la table #--sml_source_derivations";
+      return true;
+    }
+
+    function source_derivations($params)
+    { $sgbd = $this->sgbd();
+      $env = $this->env();
+      $derivations = array();
+      // sources dont "id_source" est une derivation
+      if(isset($params["id_source"])){
+        try{
+          $sql =
+           "SELECT *"
+          ." FROM #--sml_source_derivations"
+          ." WHERE #--sml_source_derivations.id_source=".$this->eq($params["id_source"]);
+          $rst = $sgbd->query($sql);
+          while($v_rst = $sgbd->fetch_assoc($rst))
+          { $derivations[$v_rst["id"]] = array();
+            $derivation_edit_file = $this->derivation_edit_xml_path($v_rst["id_source"], $v_rst["id"]);
+            if(file_exists($derivation_edit_file))
+            { if(($derivation_edit_content = $this->get_edit_derivation_content($v_rst["id_source"], $v_rst["id"])) !== false)
+              { if(($derivations[$v_rst["id"]] = $this->source_xml_read($v_rst["derivation"], $derivation_edit_content)) !==false)
+                { $derivations[$v_rst["id"]]["xml"] = array
+                  ( "url" => $v_rst["derivation"],
+                    "content" => $derivation_edit_content,
+                    "use_edit_content" => true
+                  );
+                }
+                else return false;
+              }
+              else return false;
+            }
+            else
+            { if(($derivations[$v_rst["id"]] = $this->source_xml_read($v_rst["derivation"])) !==false)
+              { $derivations[$v_rst["id"]]["id_source"] = $v_rst["id_source"];
+              }
+              else $derivations[$v_rst["id"]] = $this->empty_source();
+            }
+            $derivations[$v_rst["id"]]["id_source"] = $v_rst["id_source"];
+          }
+          $sgbd->free_result($rst);
+        }
+        catch(Exception $e) { return false; }
+        return $derivations;
+      }
+      // sources qui derivent de "derivation"
+      elseif(isset($params["derivation"]))
+      { $source_xml_url = $params["derivation"];
+        if(preg_match("/^[0-9]+$/", $source_xml_url)) $source_xml_url = $this->source_xml_url($source_xml_url);
+        try{
+          $sql =
+           "SELECT #--sml_sources.*"
+          ." FROM #--sml_sources, #--sml_source_derivations"
+          ." WHERE #--sml_sources.id=#--sml_source_derivations.id_source"
+          ." AND #--sml_source_derivations.derivation=".$this->eq($source_xml_url);
+          $rst = $sgbd->query($sql);
+          if(!isset($rst)) return false;
+          while($v_rst = $sgbd->fetch_assoc($rst)) $derivations[$v_rst["id"]] = $v_rst;
+          $sgbd->free_result($rst);
+        }
+        catch(Exception $e) { return false; }
+        return $derivations;
+      }
+      return false;
+    }
+
+    function source_derivation($id){
+      $sgbd = $this->sgbd();
+      $env = $this->env();
+      $derivation = array();
+      try{
+        $sql =
+         "SELECT *"
+        ." FROM #--sml_source_derivations"
+        ." WHERE #--sml_source_derivations.id=".$this->eq($id);
+        $rst = $sgbd->query($sql);
+        if($v_rst = $sgbd->fetch_assoc($rst)) $derivation = $v_rst;
+        $sgbd->free_result($rst);
+      }
+      catch(Exception $e) { return false; }
+      return $derivation;
+    }
+
+    function add_source_derivation($id_source, $derivation, $edit_content = "")
+    { $sgbd = $this->sgbd();
+      try{
+        $sql =
+         "INSERT INTO #--sml_source_derivations(id_source, derivation)"
+        ." VALUES"
+        ."( ".$this->eq($id_source)
+        .", ".$this->eq($derivation)
+        .")";
+        $sgbd->query($sql);
+        $id_source_derivation = $sgbd->insert_id();
+      }
+      catch(Exception $e) { return false; }
+      if($edit_content)
+      { if(!$this->set_edit_derivation_content($id_source, $id_source_derivation, $edit_content))
+        { return false;
+        }
+      }
+      return $id_source_derivation;
+    }
+
+    function set_source_derivation($id_source_derivation, $id_source, $derivation, $edit_content = "")
+    { $sgbd = $this->sgbd();
+      try{
+        $sql =
+         "UPDATE #--sml_source_derivations SET"
+        ."  id_source=".$this->eq($id_source)
+        .", derivation=".$this->eq($derivation)
+        ." WHERE id=".$this->eq($id_source_derivation);
+        $sgbd->query($sql);
+      }
+      catch(Exception $e) { return false; }
+      if($edit_content)
+      { if(!$this->set_edit_derivation_content($id_source, $id_source_derivation, $edit_content))
+        { return false;
+        }
+      }
+      return true;
+    }
+
+    function del_source_derivation($id_source_derivation)
+    { if(($derivation = $this->source_derivation($id_source_derivation)) !== false)
+      { if(($derivations = $this->source_derivations(array("id_source" => $derivation["id_source"]))) !== false)
+        { $sgbd = $this->sgbd();
+          try{
+            $sql = "DELETE FROM #--sml_source_derivations WHERE id=".$this->eq($id_source_derivation);
+            $sgbd->query($sql);
+          }
+          catch(Exception $e) { return false; }
+          if(count($derivations) > 1)
+          { return $this->del_edit_derivation_content($derivation["id_source"], $id_source_derivation);
+          }
+          else return $this->del_edit_derivations($derivation["id_source"]);
+        }
+      }
+      return false;
+    }
+
+    function del_source_derivations($id_source)
+    { $sgbd = $this->sgbd();
+      try{
+        $sql = "DELETE FROM #--sml_source_derivations WHERE id_source=".$this->eq($id_source);
+        $sgbd->query($sql);
+      }
+      catch(Exception $e) { return false; }
+      return $this->del_edit_derivations($id_source);
+    }
+
+    # ----------------------------------------------------------------------------------------
+    #                                                                               references
+    #
+
+    function source_reference($source)
+    { $reference = array();
+      if($source["reference"])
+      { if(!is_array($source["reference"]))
+        { $source["reference"] = array
+          ( "url" => $source["reference"],
+            "content" => "",
+            "use_edit_content" => false
+          );
+        }
+        $reference_edit_file = $this->reference_edit_xml_path($source["id"]);
+        if(file_exists($reference_edit_file))
+        { if(($reference_edit_content = $this->get_edit_reference_content($source["id"])) !== false)
+          { if(($reference = $this->source_xml_read($source["reference"], $reference_edit_content)) !==false)
+            { $reference["xml"] = array
+              ( "url" => $source["reference"]["xml"]["url"],
+                "content" => $reference_edit_content,
+                "use_edit_content" => true
+              );
+            }
+            else return false;
+          }
+          else return false;
+        }
+        else
+        { if(($reference = $this->source_xml_read($source["reference"]["xml"]["url"])) ===false)
+          { $reference = $this->empty_source();
+          }
+        }
+      }
+      return $reference;
+    }
+
+    # ----------------------------------------------------------------------------------------
+    #                                                                                documents
+    #
+
+    function source_documents($id_source)
+    { $sgbd = $this->sgbd();
+      $documents = array();
+      try{
+        $sql = "SELECT * FROM #--sml_source_documents WHERE id_source=".$this->eq($id_source);
+        $rst = $sgbd->query($sql);
+        if(!isset($rst)) return false;
+        while($v_rst = $sgbd->fetch_assoc($rst)) $documents[$v_rst["id"]] = $v_rst;
+        $sgbd->free_result($rst);
+      }
+      catch(Exception $e) { return false; }
+      return $documents;
+    }
+
+    function add_source_document($id_source, $document)
+    { $sgbd = $this->sgbd();
+      try{
+        $sql =
+         "INSERT INTO #--sml_source_documents(id_source, nom, url)"
+        ." VALUES"
+        ."( ".$this->eq($id_source)
+        .", ".$this->eq($document["nom"])
+        .", ".$this->eq($document["url"])
+        .")";
+        $sgbd->query($sql);
+      }
+      catch(Exception $e) { return false; }
+      return $sgbd->insert_id();
+    }
+
+    function del_source_documents($id_source)
+    { $sgbd = $this->sgbd();
+      try{
+        $sql = "DELETE FROM #--sml_source_documents WHERE id_source=".$this->eq($id_source);
+        $sgbd->query($sql);
+      }
+      catch(Exception $e) { return false; }
+      return true;
+    }
+
+    # ----------------------------------------------------------------------------------------
+    #                                                                  compositions de sources
+    #
+
+    function source_compositions($params)
+    { $id_source = isset($params["id_source"]) ? $params["id_source"] : null;  
+      $id_composition = isset($params["id_composition"]) ? $params["id_composition"] : null;
+      $sgbd = $this->sgbd();
+      $env = $this->env();
+      $compositions = array();
+      if(isset($id_source)){
+        try{
+          $sql = "SELECT * FROM #--sml_source_compositions WHERE id_source=".$this->eq($id_source);
+          $rst = $sgbd->query($sql);
+          while($v_rst = $sgbd->fetch_assoc($rst))
+          { if(!isset($compositions[$v_rst["id_source"]])) $compositions[$v_rst["id_source"]] = array();
+            $compositions[$v_rst["id_source"]][] = $v_rst["id_composition"];
+          }
+          $sgbd->free_result($rst);
+        }
+        catch(Exception $e) { return false; }
+        return $compositions;
+      }
+      elseif(isset($id_composition))
+      { if($id_composition){
+          try{
+            $sql =
+             "SELECT * FROM #--sml_source_compositions WHERE id_composition=".$this->eq($id_composition);
+            $rst = $sgbd->query($sql);
+            while($v_rst = $sgbd->fetch_assoc($rst))
+            { if(!isset($compositions[$v_rst["id_composition"]])) $compositions[$v_rst["id_composition"]] = array();
+              $compositions[$v_rst["id_composition"]][] = $v_rst["id_source"];
+            }
+            $sgbd->free_result($rst);
+          }
+          catch(Exception $e) { return false; }
+          return $compositions;
+        }
+        else{
+          try{
+            $sql =
+             "SELECT DISTINCT id_source FROM #--sml_source_compositions";
+            $rst = $sgbd->query($sql);
+            while($v_rst = $sgbd->fetch_assoc($rst)) $compositions[] = $v_rst["id_source"];
+            $sgbd->free_result($rst);
+          }
+          catch(Exception $e) { return false; }
+          return $compositions;
+        }
+      }
+      return false;
+    }
+
+    function set_source_composition($id_source, $id_composition){
+      $sgbd = $this->sgbd();
+      try{
+        $sql =
+         "INSERT INTO #--sml_source_compositions(id_source, id_composition) VALUES"
+        ."( ".$this->eq($id_source)
+        .", ".$this->eq($id_composition)
+        .")";
+        $sgbd->query($sql);
+      }
+      catch(Exception $e) { return false; }
+      return $this->set_source_xml($id_composition);
+    }
+
+    function del_source_compositions($params){
+      $res = true;
+      $id_source = isset($params["id_source"]) ? $params["id_source"] : null;  
+      $id_composition = isset($params["id_composition"]) ? $params["id_composition"] : null;
+      $to_delete = array();
+      $to_update = array();
+      if(isset($id_composition)) $to_update[] = $id_composition;
+      $sgbd = $this->sgbd();
+      if(isset($id_source)){
+        try{
+          $sql = "SELECT * FROM #--sml_source_compositions WHERE id_source=".$this->eq($id_source);
+          $rst = $sgbd->query($sql);
+          while($v_rst = $sgbd->fetch_assoc($rst)) $to_update[] = $v_rst["id_composition"];
+          $sgbd->free_result($rst);
+        }
+        catch(Exception $e) { return false; }
+      }
+      try{
+        $sql = "DELETE FROM #--sml_source_compositions";
+        $WHERE = "";
+        $WHERE .= (isset($id_source) ? ($WHERE ? " OR " : " WHERE ")."id_source=".$this->eq($id_source) : "");
+        $WHERE .= (isset($id_composition) ? ($WHERE ? " OR " : " WHERE ")."id_composition=".$this->eq($id_composition) : "");
+        $sql .= $WHERE;
+        $sgbd->query($sql);
+      }
+      catch(Exception $e) { return false; }
+      foreach($to_update as $id_source_xml){
+        if(!$this->set_source_xml($id_source_xml)) return false;
+      }
+      return true;
+    }
+
+    function has_sources($id_composition)
+    { $sgbd = $this->sgbd();
+      $env = $this->env();
+      try{
+        $sql = "SELECT count(*) as n FROM #--sml_source_compositions WHERE id_composition=".$this->eq($id_composition);
+        $rst = $sgbd->query($sql);
+        $has_sources = 0;
+        if($v_rst = $sgbd->fetch_assoc($rst)) $has_sources = $v_rst["n"];
+        $sgbd->free_result($rst);
+      }
+      catch(Exception $e) { return false; }
+      return $has_sources;
+    }
+
+    function source_ariane($id_source, $ariane = array())
+    { if(($compositions = $this->source_compositions(array("id_source" => $id_source))) !== false)
+      { if(isset($compositions[$id_source]) && $compositions[$id_source])
+        { foreach($compositions[$id_source] as $id_composition)
+          { if(($ariane = $this->source_ariane($id_composition, $ariane)) !== false)
+            { if(($ariane[$id_composition] = $this->source($id_composition)) !== false)
+              {
+              }
+              else $ariane = false;
+            }
+            else $ariane = false;
+            break;
+          }
+        }
+      }
+      else $ariane = false;
+      return $ariane;
+    }
+
+  }
+
+?>
\ No newline at end of file
diff --git a/app/data/modules/sql/sml_data_sources_cache_db.php b/app/data/modules/sql/sml_data_sources_cache_db.php
new file mode 100644 (file)
index 0000000..2497e58
--- /dev/null
@@ -0,0 +1,59 @@
+<?php
+
+  class sml_data_sources_cache_db extends mw_data{
+
+    function source_cache_db(){
+      $sgbd = $this->sgbd();
+      $cache = array();
+      try{
+        $sql = "SELECT * FROM #--sml_source_cache";
+        $rst = $sgbd->query($sql);
+        while($v_rst = $sgbd->fetch_assoc($rst)) $cache[$v_rst["id"]] = $v_rst;
+        $sgbd->free_result($rst);
+      }
+      catch(Exception $e) { $cache = false; }
+      return $cache;
+    }
+
+    function source_cache_infos_db($url){
+      $sgbd = $this->sgbd();
+      $cache_infos = array();
+      try{
+        $sql = "SELECT * FROM #--sml_source_cache WHERE url=".$this->eq($url);
+        $rst = $sgbd->query($sql);
+        if($v_rst = $sgbd->fetch_assoc($rst)) $cache_infos = $v_rst;
+        $sgbd->free_result($rst);
+      }
+      catch(Exception $e) { $cache_infos = false; }
+      return $cache_infos;
+    }
+
+    function add_source_cache_db($url, $cache_index){
+      $sgbd = $this->sgbd();
+      try{
+        $sql =
+         "INSERT INTO #--sml_source_cache(url, id_source, last_update) VALUES"
+        ."( ".$this->eq($url)
+        .", ".$cache_index
+        .", '".date("Y-m-d H:i:s")."'"
+        .")";
+        $sgbd->query($sql);
+      }
+      catch(Exception $e) { return false; }
+      return true;
+    }
+
+    function del_source_cache_db($id_cache_data){
+      $env = $this->env();
+      $sgbd = $this->sgbd();
+      try{
+        $sql = "DELETE FROM #--sml_source_cache WHERE id=".$this->eq($id_cache_data);
+        $sgbd->query($sql);
+      }
+      catch(Exception $e) { return false; }
+      return true;
+    }
+
+  }
+
+?>
\ No newline at end of file
diff --git a/app/helpers/mw_helper_sourceml_out.php b/app/helpers/mw_helper_sourceml_out.php
new file mode 100644 (file)
index 0000000..a1f962b
--- /dev/null
@@ -0,0 +1,33 @@
+<?php
+
+  class mw_helper_sourceml_out extends mw_helper{
+
+    function aff_date($date){
+      if(preg_match("/([0-9]{2,4})-([0-9]{1,2})-([0-9]{1,2})/", $date, $regs)){
+        $date = $regs[3]." ".$this->mois($regs[2])." ".$regs[1];
+      }
+      return $date;
+    }
+  
+    function mois($n){
+      switch($n){
+        case 1:  $mois = "jan"; break;
+        case 2:  $mois = "fev"; break;
+        case 3:  $mois = "mars"; break;
+        case 4:  $mois = "avr"; break;
+        case 5:  $mois = "mai"; break;
+        case 6:  $mois = "juin"; break;
+        case 7:  $mois = "juil"; break;
+        case 8:  $mois = "aout"; break;
+        case 9:  $mois = "sept"; break;
+        case 10: $mois = "oct"; break;
+        case 11: $mois = "nov"; break;
+        case 12: $mois = "dec"; break;
+        default: $mois = $n;
+      }
+      return $mois;
+    }
+
+  }
+
+?>
\ No newline at end of file
diff --git a/app/observers/mw_observer_sourceml.php b/app/observers/mw_observer_sourceml.php
new file mode 100644 (file)
index 0000000..924c1b4
--- /dev/null
@@ -0,0 +1,48 @@
+<?php
+
+  class mw_observer_sourceml extends mw_observer{
+
+    function before_action(){
+      $env = $this->env();
+      $out_config = $env->get_out_config();
+      $out_config["groupe_view_albums"] = array(
+        "type" => "checkbox",
+        "default" => 0,
+        "text" => "Lister les albums sur la page d'un groupe"
+      );
+      $out_config["colonne_logo_groupe"] = array(
+        "type" => "checkbox",
+        "default" => 1,
+        "text" => "Afficher le logo du groupe courant dans la colonne"
+      );
+      $out_config["albums_menu"] = array(
+        "type" => "checkbox",
+        "default" => 1,
+        "text" => "Afficher les albums du groupe courant dans la colonne"
+      );
+      $out_config["nom_groupe"] = array(
+        "type" => "checkbox",
+        "default" => 1,
+        "text" => "Afficher le nom du groupe courant dans la colonne"
+      );
+      $env->set_out_config($out_config);
+    }
+
+    function after_action(){
+      $env = $this->env();
+      if($env->etat("mod") == "users"){
+        $env->add_js_file($env->path("mw_path")."libs/tiny_mce/tiny_mce.js");
+        $env->add_js_file($env->path("mw_path")."libs/tiny_mce/plugins/tinybrowser/tb_tinymce.js.php");
+      }
+      if($env->etat("mod") == "sources"){
+        $env->add_js_file($env->out_url("js/jquery-1.8.3.min.js"));
+        $env->add_js_file($env->out_url("js/jquery.colorbox-min.js"));
+        $env->add_js_file($env->out_url("js/jquery-ui-1.8.12.custom.min.js"));
+        $env->add_css_file($env->out_url("css/colorbox.css"));
+        $env->add_css_file($env->out_url("css/ui-lightness/jquery-ui-1.8.12.custom.css"));
+      }
+    }
+
+  }
+
+?>
\ No newline at end of file
diff --git a/app/out/default/config.xml b/app/out/default/config.xml
new file mode 100644 (file)
index 0000000..315e9ed
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<config>
+
+  <groupe_view_albums type="checkbox" default="0"><![CDATA[Lister les albums sur la page d'un groupe]]></groupe_view_albums>
+  <colonne_logo_groupe type="checkbox" default="1"><![CDATA[Afficher le logo du groupe courant dans la colonne]]></colonne_logo_groupe>
+  <albums_menu type="checkbox" default="1"><![CDATA[Afficher les albums du groupe courant dans la colonne]]></albums_menu>
+  <nom_groupe type="checkbox" default="1"><![CDATA[Afficher le nom du groupe courant dans la colonne]]></nom_groupe>
+
+</config>
diff --git a/app/out/default/css/actions/forms_sourceml.css b/app/out/default/css/actions/forms_sourceml.css
new file mode 100644 (file)
index 0000000..a5ceae3
--- /dev/null
@@ -0,0 +1 @@
+@import url("sources.css");
\ No newline at end of file
diff --git a/app/out/default/css/actions/sources.css b/app/out/default/css/actions/sources.css
new file mode 100644 (file)
index 0000000..bee10b0
--- /dev/null
@@ -0,0 +1,463 @@
+/* ------------------------------- liste groupes ----------- */
+
+ul.groupes
+{ list-style-type: none;
+}
+
+ul.groupes li
+{ margin: 10px 10px 10px 100px;
+  padding: 0px;
+/*  float: left;*/
+  width: 370px;
+}
+
+ul.groupes li h4
+{ font-size: 16px;
+  margin: 0px;
+  padding: 0px;
+}
+
+ul.groupes li h4 a
+{ display: block;
+  padding: 5px;
+  width: 370px;
+  height: 100px;
+}
+
+ul.groupes li h4 a img
+{ display: block;
+  float: left;
+}
+
+ul.groupes li h4 a span
+{ float: right;
+  display: block;
+  padding: 3px;
+  text-align: right;
+  width: 238px;
+}
+
+ul.groupes li .infos li
+{ margin: 0px 0px 0px 5px;
+  padding: 0px;
+}
+
+/* ------------------------------- page groupe ----------- */
+
+.description
+{ padding: 15px 50px 15px 50px;
+  font-size: 0.9em;
+}
+
+.description p
+{ text-align: justify;
+}
+
+/* ------------------------------- page album ----------- */
+
+p#play_all
+{
+}
+
+p#play_all a
+{ display: block;
+  float: right;
+  margin: 0px 20px 15px 25px;
+  padding: 5px 7px 5px 37px;
+  line-height: 25px;
+}
+
+/* ------------------------------- groupe box (colonne) --- */
+
+.logo_groupe
+{ text-align: center;
+  height: 150px;
+  width: 220px;
+}
+
+#colonne ul#album_links
+{ margin: 32px 18px 0px 0px;
+}
+
+#colonne ul#album_links li
+{ list-style-type: none;
+  margin: 0px;
+  padding: 0px;
+}
+
+#colonne ul#album_links li a
+{ display: block;
+  padding: 5px 5px 0px 5px;
+}
+
+#colonne ul.menu_albums
+{ list-style-type: none;
+  margin-left: 0px;
+  margin: 0px 0px 10px 0px;
+}
+
+#colonne ul.menu_albums li
+{ margin-left: 0px;
+  width: 220px;
+  margin: 5px 0px 5px 0px;
+}
+
+#colonne ul.menu_albums li a
+{ display: block;
+  height: 90px;
+  padding: 5px;
+}
+
+#colonne ul.menu_albums li a span
+{ display: block;
+  float: right;
+  padding: 10px 5px 0px 5px;
+}
+
+ul#lien_contact
+{ margin: 20px 18px 0px 0px;
+  padding: 0px;
+}
+
+ul#lien_contact li
+{ list-style-type: none;
+  margin: 0px;
+  padding: 0px;
+}
+
+ul#lien_contact li a
+{ display: block;
+  text-align: right;
+  padding: 5px 5px 0px 5px;
+}
+
+/* ------------------------------- albums (page groupe) --- */
+
+#center ul.menu_albums
+{ margin: 32px 18px 0px 0px;
+}
+
+#center ul.menu_albums li
+{ list-style-type: none;
+  margin: 0px;
+  padding: 0px;
+}
+
+#center ul.menu_albums li a
+{ display: block;
+  padding: 5px 5px 0px 5px;
+}
+
+#center h3.menu_albums
+{ margin: 0px 0px 10px 10px;
+}
+
+#center ul.menu_albums
+{ list-style-type: none;
+  margin-left: 0px;
+  margin: 0px 0px 10px 10px;
+}
+
+#center ul.menu_albums li
+{ margin-left: 0px;
+  width: 220px;
+  margin: 5px 0px 5px 10px;
+/*  float: left;*/
+}
+
+#center ul.menu_albums li a
+{ display: block;
+  height: 90px;
+  padding: 5px;
+}
+
+#center ul.menu_albums li a span
+{ display: block;
+  float: right;
+  padding: 10px 5px 0px 5px;
+  max-width: 100px;
+}
+
+/* ------------------------ blocs source -------------------- */
+
+ul.sources
+{ list-style-type: none;
+}
+
+ul.sources li
+{ margin: 10px 5px 0px 5px;
+  padding: 5px;
+}
+
+.playing_download
+{ padding: 5px;
+  margin-top: 10px;
+}
+
+.sources h5
+{ font-size: 1em;
+  padding: 3px 10px 3px 10px;
+}
+
+.sources h5 span
+{ font-weight: normal;
+}
+
+.sources h5 span.small
+{ font-size: 0.9em
+}
+
+.sources h5 .auteur
+{ float: right;
+  font-weight: normal;
+}
+
+.licence
+{ float: right;
+  margin: 3px 10px 0px 0px;
+  text-align: right;
+}
+
+ul.documents
+{ list-style-type: none;
+}
+
+ul.documents li
+{ margin: 0px;
+  padding: 0px;
+  clear: left;
+}
+
+/* ------ player */
+
+.loading_player{
+  opacity: 0.5;
+  background-image: url(../../icons/player_loading.gif);
+  background-position: center;
+  background-repeat: no-repeat;
+}
+
+.player_progress
+{ width: 100%;
+  height: 5px;
+  font-size: 1px;
+  line-height: 1px;
+  overflow: hidden;
+  margin: 0px 0px 0px 0px;
+  position: relative;
+  cursor: pointer;
+}
+
+.player_progress .loaded
+{ width: 0;
+  height: 5px;
+}
+
+.player_progress .position
+{ width: 0;
+  height: 5px;
+  position: absolute;
+  top: 0px;
+}
+
+.player_controls, .no_player
+{ margin: 2px 5px 0 0;
+  float: left;
+  width: 40px;
+}
+
+.player_controls a
+{ text-decoration: none;
+}
+
+.player_controls a.pause
+{ display: none;
+}
+
+.player_controls a.stop
+{ display: none;
+}
+
+/* ------ pistes / derivations */
+
+.block_list_toggle
+{ font-weight: normal;
+  font-size: 0.8em;
+  position: relative;
+  top: -2px;
+}
+
+.pistes
+{ margin: 0px 13px 10px 45px;
+  padding-left: 0px;
+}
+
+.derivation
+{ margin: 0px 13px 10px 45px;
+  padding-left: 0px;
+}
+
+.source_arbo h3
+{ padding-left: 35px;
+}
+
+.derivation h3
+{ font-size: 1em;
+  padding-left: 35px;
+  font-weight: normal;
+}
+
+.pistes h3
+{ font-size: 1em;
+  padding-left: 35px;
+  font-weight: normal;
+}
+
+.no_source
+{ margin: 5px 5px 10px 15px;
+  font-style: italic;
+  font-size: 0.9em;
+}
+
+.source_arbo ul.menu_source
+{ margin: 5px 0px 0px 0px;
+  padding: 0px;
+  list-style-type: none;
+}
+
+.source_arbo ul.menu_source li
+{ margin: 0px;
+  padding: 0px;
+}
+
+/* ------------------------------- liste groupes ----------- */
+
+ul.groupes li h4 a
+{ border: solid 1px #d9d9d9;
+  border-radius: 3px 3px 3px 3px;
+  -moz-border-radius: 3px 3px 3px 3px;
+}
+
+/* ------------------------------- page album ----------- */
+
+p#play_all a
+{ border: solid 1px #c0c0c0;
+  border-radius: 3px 3px 3px 3px;
+  -moz-border-radius: 3px 3px 3px 3px;
+  background-image: url("../icons/ecouter.png");
+  background-repeat: no-repeat;
+  background-position: 6px 6px;
+  background-color: #ffffff;
+}
+
+/* ----------------------------------- sources --------- */
+
+ul.albums li a
+{ border: solid 1px #555555;
+}
+
+.logo_groupe
+{ /*border: solid 1px #e9e9e9;*/
+  background-color: #ffffff;
+  border-radius: 3px 3px 3px 3px;
+  -moz-border-radius: 3px 3px 3px 3px;
+}
+
+ul#lien_contact li a
+{ border-bottom: solid 1px #d9d9d9;
+}
+
+#colonne ul#album_links
+{ /*border-bottom: solid 1px #333333;*/
+}
+
+#colonne ul#album_links li
+{
+}
+
+#colonne ul.menu_albums li
+{ border: solid 1px #d9d9d9;
+  background-color: #ffffff;
+}
+
+#center ul.menu_albums li
+{ border: solid 1px #d9d9d9;
+  float: left;
+}
+
+.track
+{ border: solid 1px #ffffff;
+  border-radius: 3px 3px 3px 3px;
+  -moz-border-radius: 3px 3px 3px 3px;
+}
+
+.track h5
+{ background-color: #ffffff;
+  border-radius: 3px 3px 0px 0px;
+  -moz-border-radius: 3px 3px 0px 0px;
+}
+
+.playing_track
+{ border: solid 1px #dedede;
+  background-color: #ffffff;
+  border-radius: 3px 3px 3px 3px;
+  -moz-border-radius: 3px 3px 3px 3px;
+}
+
+.player_progress
+{ background-color: #ececec;
+}
+
+.player_progress .loaded
+{ background-color: #dedede;
+}
+
+.player_progress .position
+{ background-color: #999999;
+}
+
+.player_controls a img
+{ border: none;
+}
+
+.source_arbo ul.menu_source
+{ float: right;
+  margin: 0px 10px 1px 0px;
+}
+
+.source_arbo ul.menu_source li
+{ float: right;
+  padding: 1px;
+}
+
+.source_arbo ul.menu_source li a
+{ display: block;
+  text-align: center;
+  background-color: #151515;
+  border-radius: 3px 3px 0px 0px;
+  -moz-border-radius: 3px 3px 0px 0px;
+  padding: 2px 5px 2px 5px;
+}
+
+.source_arbo ul.menu_source li a:hover
+{
+}
+
+.source_arbo ul.menu_source li.icon a
+{ border: none;
+  padding: 2px 2px 2px 2px;
+}
+
+.pistes
+{ border-left: none;
+}
+
+.derivation
+{ border-left: none;
+}
+
+.loading
+{ background-image: url("../icons/ajax-loader.gif");
+  background-repeat: no-repeat;
+  background-position: 5px 5px;
+}
\ No newline at end of file
diff --git a/app/out/default/css/actions/users_albums.css b/app/out/default/css/actions/users_albums.css
new file mode 100644 (file)
index 0000000..24a7ae0
--- /dev/null
@@ -0,0 +1 @@
+@import url("../sourceml_accounts.css");
\ No newline at end of file
diff --git a/app/out/default/css/actions/users_groupes.css b/app/out/default/css/actions/users_groupes.css
new file mode 100644 (file)
index 0000000..24a7ae0
--- /dev/null
@@ -0,0 +1 @@
+@import url("../sourceml_accounts.css");
\ No newline at end of file
diff --git a/app/out/default/css/actions/users_morceaux.css b/app/out/default/css/actions/users_morceaux.css
new file mode 100644 (file)
index 0000000..24a7ae0
--- /dev/null
@@ -0,0 +1 @@
+@import url("../sourceml_accounts.css");
\ No newline at end of file
diff --git a/app/out/default/css/actions/users_pistes.css b/app/out/default/css/actions/users_pistes.css
new file mode 100644 (file)
index 0000000..24a7ae0
--- /dev/null
@@ -0,0 +1 @@
+@import url("../sourceml_accounts.css");
\ No newline at end of file
diff --git a/app/out/default/css/colorbox.css b/app/out/default/css/colorbox.css
new file mode 100644 (file)
index 0000000..89fea1c
--- /dev/null
@@ -0,0 +1,67 @@
+#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto; text-align: left;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+
+#cboxOverlay{background:url(../images/colorbox/overlay.png) repeat 0 0;}
+#colorbox{}
+
+    #cboxTopLeft{width:21px; height:21px;}
+    #cboxTopRight{width:21px; height:21px;}
+    #cboxBottomLeft{width:21px; height:21px;}
+    #cboxBottomRight{width:21px; height:21px;}
+    #cboxMiddleLeft{width:21px;}
+    #cboxMiddleRight{width:21px;}
+    #cboxTopCenter{height:21px;}
+    #cboxBottomCenter{height:21px;}
+    #cboxContent{background:#ffffff; overflow:hidden; color: #555555; padding: 10px 10px 0px 10px; border-radius: 3px 3px 3px 3px; -moz-border-radius: 3px 3px 3px 3px;}
+        #cboxError{padding:50px; border:1px solid #ccc;}
+        #cboxLoadedContent{margin-bottom:28px;}
+        #cboxTitle{position:absolute; bottom:4px; left:0; text-align:center; width:100%; color:#949494;}
+        #cboxCurrent{position:absolute; bottom:4px; left:58px; color:#949494;}
+        #cboxSlideshow{position:absolute; bottom:4px; right:30px; color:#0092ef;}
+        #cboxPrevious{position:absolute; bottom:0; left:0; background:url(../images/colorbox/controls.png) no-repeat -75px 0; width:25px; height:25px; text-indent:-9999px;}
+        #cboxPrevious.hover{background-position:-75px -25px;}
+        #cboxNext{position:absolute; bottom:0; left:27px; background:url(../images/colorbox/controls.png) no-repeat -50px 0; width:25px; height:25px; text-indent:-9999px;}
+        #cboxNext.hover{background-position:-50px -25px;}
+        #cboxLoadingOverlay{}
+        #cboxLoadingGraphic{background:url(../images/colorbox/loading.gif) no-repeat center center;}
+        #cboxClose{position:absolute; bottom:0; right:0; background:url(../images/colorbox/controls.png) no-repeat -25px 0; width:25px; height:25px; text-indent:-9999px;}
+        #cboxClose.hover{background-position:-25px -25px;}
+
+.cboxIE #cboxTopLeft,
+.cboxIE #cboxTopCenter,
+.cboxIE #cboxTopRight,
+.cboxIE #cboxBottomLeft,
+.cboxIE #cboxBottomCenter,
+.cboxIE #cboxBottomRight,
+.cboxIE #cboxMiddleLeft,
+.cboxIE #cboxMiddleRight {
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF);
+}
+
+.cboxIE6 #cboxTopLeft{background:url(../images/colorbox/ie6/borderTopLeft.png);}
+.cboxIE6 #cboxTopCenter{background:url(../images/colorbox/ie6/borderTopCenter.png);}
+.cboxIE6 #cboxTopRight{background:url(../images/colorbox/ie6/borderTopRight.png);}
+.cboxIE6 #cboxBottomLeft{background:url(../images/colorbox/ie6/borderBottomLeft.png);}
+.cboxIE6 #cboxBottomCenter{background:url(../images/colorbox/ie6/borderBottomCenter.png);}
+.cboxIE6 #cboxBottomRight{background:url(../images/colorbox/ie6/borderBottomRight.png);}
+.cboxIE6 #cboxMiddleLeft{background:url(../images/colorbox/ie6/borderMiddleLeft.png);}
+.cboxIE6 #cboxMiddleRight{background:url(../images/colorbox/ie6/borderMiddleRight.png);}
+
+.cboxIE6 #cboxTopLeft,
+.cboxIE6 #cboxTopCenter,
+.cboxIE6 #cboxTopRight,
+.cboxIE6 #cboxBottomLeft,
+.cboxIE6 #cboxBottomCenter,
+.cboxIE6 #cboxBottomRight,
+.cboxIE6 #cboxMiddleLeft,
+.cboxIE6 #cboxMiddleRight {
+    _behavior: expression(this.src = this.src ? this.src : this.currentStyle.backgroundImage.split('"')[1], this.style.background = "none", this.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src=" + this.src + ", sizingMethod='scale')");
+}
diff --git a/app/out/default/css/colors.css b/app/out/default/css/colors.css
new file mode 100644 (file)
index 0000000..9b50de8
--- /dev/null
@@ -0,0 +1,324 @@
+body
+{ background-color: #ffffff;
+  color: #333333;
+}
+
+a
+{ text-decoration: none;
+  color: #000066;
+}
+
+a img
+{ border: none;
+}
+
+a:hover
+{ color: #c0c0c0;
+}
+
+.navig
+{ color: #333333;
+  border: solid 1px #c0c0c0;
+  background-color: #ffffff;
+  border-radius: 3px 3px 3px 3px;
+  -moz-border-radius: 3px 3px 3px 3px;
+}
+
+.loading
+{ background-image: url("../icons/ajax-loader.gif");
+  background-repeat: no-repeat;
+  background-position: 5px 5px;
+}
+
+/* ------------------------- messages --------------- */
+
+.messages
+{ border: solid 1px #c0c0c0;
+}
+
+.erreur
+{ border: solid 1px #c0c0c0;
+}
+
+.redirect_message div
+{ border: solid 1px #c0c0c0;
+}
+
+/* ------------------------- blocs generaux --------- */
+
+#header
+{ padding-top: 10px;
+}
+
+#header .content
+{ border-bottom: solid 1px #d9d9d9;
+}
+
+#colonne
+{ /*border-right: dashed 1px #555555; */
+}
+
+#footer .content
+{ border-top: solid 1px #e9e9e9;
+}
+
+#footer .content p
+{ color: #777777;
+}
+
+/* ----------------------------------- menu top ----- */
+
+#menu_top ul.menu li a
+{ border: solid 1px #e9e9e9;
+  background-color: #ffffff;
+}
+
+#menu_top ul.menu li ul li a
+{ border-top: none;
+  border-right: solid 1px #333333;
+  border-bottom: none;
+  border-left: solid 1px #333333;
+  background-color: #050505;
+}
+
+#menu_top ul.menu li ul li.last a
+{ border-top: none;
+  border-right: solid 1px #333333;
+  border-bottom: solid 1px #333333;
+  border-left: solid 1px #333333;
+  background-color: #050505;
+}
+
+/* ----------------------------------- admin --------- */
+
+table.admin tr.hl td
+{ border: solid 1px #d1d1d1;
+}
+
+table.admin tr.hl:hover
+{ background-color: #f9f9f9;
+}
+
+input[type=text], input[type=file], input[type=password], textarea, select
+{ border: solid 1px #999999;
+  color: #333333;
+}
+
+input[type=submit], a.button
+{ border: solid 1px #d1d1d1;
+  border-radius: 3px 3px 3px 3px;
+  -moz-border-radius: 3px 3px 3px 3px;
+}
+
+input[type=submit]:hover, a.button:hover
+{ border: solid 1px #d1d1d1;
+  border-radius: 3px 3px 3px 3px;
+  -moz-border-radius: 3px 3px 3px 3px;
+}
+
+ul.admin
+{ border-bottom: dashed 1px #c0c0c0;
+}
+
+ul.admin_form_head
+{ border: solid 1px #c0c0c0;
+  border-radius: 3px 3px 3px 3px;
+  -moz-border-radius: 3px 3px 3px 3px;
+}
+
+ul.admin_form_content ul.admin
+{ border-bottom: none;
+}
+
+ul.admin li a
+{ border: solid 1px #d1d1d1;
+}
+
+.admin_source_infos ul.admin li a
+{ border: none;
+  background-color: #101010;
+  color: #c0c0c0;
+}
+
+ul.admin li a.add
+{ background-image: url("../icons/add.gif");
+  background-repeat: no-repeat;
+  background-position: 3px 6px;
+  border: solid 1px #d1d1d1;
+}
+
+ul.admin li a:hover
+{
+}
+
+.admin_source_infos
+{ border: solid 1px #c0c0c0;
+/*  background-color: #0a0a0a;*/
+  border-radius: 3px 3px 3px 3px;
+  -moz-border-radius: 3px 3px 3px 3px;
+}
+
+.admin_source_infos ul.admin li a:hover
+{ border: none;
+  background-color: #333333;
+  color: #c0c0c0;
+}
+
+#documents .document
+{ border: solid 1px #c0c0c0;
+}
+
+/* ------------------------------- plugins ----------- */
+
+ul.plugins li
+{ border: solid 1px #c0c0c0;
+}
+
+ul.plugins li.enabled
+{ background-color: #ffffff;
+}
+
+ul.plugins li.disabled
+{ background-color: #f7f7f7;
+}
+
+ul.plugins li.uninstalled
+{ background-color: #e5e5e5;
+}
+
+ul.plugins li ul.plugin_links li
+{ border-top: none;
+  border-right: none;
+  border-bottom: none;
+  border-left: solid 1px #c0c0c0;
+}
+
+ul.plugins li ul.plugin_links li input
+{ border: solid 1px #c0c0c0;
+}
+
+/* ------------------------------- liste groupes ----------- */
+
+ul.groupes li h4 a
+{ border: solid 1px #d9d9d9;
+  border-radius: 3px 3px 3px 3px;
+  -moz-border-radius: 3px 3px 3px 3px;
+}
+
+/* ------------------------------- page album ----------- */
+
+p#play_all a
+{ border: solid 1px #c0c0c0;
+  border-radius: 3px 3px 3px 3px;
+  -moz-border-radius: 3px 3px 3px 3px;
+  background-image: url("../icons/ecouter.png");
+  background-repeat: no-repeat;
+  background-position: 6px 6px;
+  background-color: #ffffff;
+}
+
+/* ----------------------------------- sources --------- */
+
+ul.albums li a
+{ border: solid 1px #555555;
+}
+
+.logo_groupe
+{ /*border: solid 1px #e9e9e9;*/
+  background-color: #ffffff;
+  border-radius: 3px 3px 3px 3px;
+  -moz-border-radius: 3px 3px 3px 3px;
+}
+
+ul#lien_contact li a
+{ border-bottom: solid 1px #d9d9d9;
+}
+
+#colonne ul#album_links
+{ /*border-bottom: solid 1px #333333;*/
+}
+
+#colonne ul#album_links li
+{
+}
+
+#colonne ul.menu_albums li
+{ border: solid 1px #d9d9d9;
+  background-color: #ffffff;
+}
+
+#center ul.menu_albums li
+{ border: solid 1px #d9d9d9;
+  float: left;
+}
+
+.track
+{ border: solid 1px #ffffff;
+  border-radius: 3px 3px 3px 3px;
+  -moz-border-radius: 3px 3px 3px 3px;
+}
+
+.track h5
+{ background-color: #ffffff;
+  border-radius: 3px 3px 0px 0px;
+  -moz-border-radius: 3px 3px 0px 0px;
+}
+
+.playing_track
+{ border: solid 1px #dedede;
+  background-color: #ffffff;
+  border-radius: 3px 3px 3px 3px;
+  -moz-border-radius: 3px 3px 3px 3px;
+}
+
+.player_progress
+{ background-color: #ececec;
+}
+
+.player_progress .loaded
+{ background-color: #dedede;
+}
+
+.player_progress .position
+{ background-color: #999999;
+}
+
+.player_controls a img
+{ border: none;
+}
+
+.source_arbo ul.menu_source
+{ float: right;
+  margin: 0px 10px 1px 0px;
+}
+
+.source_arbo ul.menu_source li
+{ float: right;
+  padding: 1px;
+}
+
+.source_arbo ul.menu_source li a
+{ display: block;
+  text-align: center;
+  background-color: #151515;
+  border-radius: 3px 3px 0px 0px;
+  -moz-border-radius: 3px 3px 0px 0px;
+  padding: 2px 5px 2px 5px;
+}
+
+.source_arbo ul.menu_source li a:hover
+{
+}
+
+.source_arbo ul.menu_source li.icon a
+{ border: none;
+  padding: 2px 2px 2px 2px;
+}
+
+.pistes
+{ border-left: none;
+}
+
+.derivation
+{ border-left: none;
+}
diff --git a/app/out/default/css/sourceml_accounts.css b/app/out/default/css/sourceml_accounts.css
new file mode 100644 (file)
index 0000000..02e316a
--- /dev/null
@@ -0,0 +1,65 @@
+img.logo{
+  max-width: 100%;
+  height: auto;
+}
+
+.document
+{ margin: 5px;
+  padding: 5px;
+}
+
+.document .delete
+{ float: right;
+}
+
+.document .clear
+{ height: 5px;
+}
+
+.xml_edit_content
+{ display: block;
+  margin: 5px 10px 30px 0px;
+  text-align: right;
+}
+
+.xml_edit_content textarea
+{ width: 97%;
+}
+
+ul.xml_infos
+{ margin: 10px 10px 0px 20px;
+}
+
+ul.xml_infos li
+{ padding: 5px;
+  margin: 0px 0px 0px 20px;
+}
+
+.admin_source_infos{
+  border: solid 1px #c0c0c0;
+  border-radius: 3px 3px 3px 3px;
+  -moz-border-radius: 3px 3px 3px 3px;
+  margin: 0px 10px 10px 20px;
+  padding: 10px;
+}
+
+.admin_source_infos ul.admin li a:hover
+{ border: none;
+  background-color: #333333;
+  color: #c0c0c0;
+}
+
+.admin_source_infos ul.admin_source_head
+{ list-style-type: none;
+  margin: 0px 0px 0px 0px;
+  text-align: right;
+  padding-bottom: 10px;
+  padding-top: 5px;
+}
+
+
+#documents .document
+{ border: solid 1px #c0c0c0;
+}
+
+
diff --git a/app/out/default/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png b/app/out/default/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png
new file mode 100644 (file)
index 0000000..29460f0
Binary files /dev/null and b/app/out/default/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png differ
diff --git a/app/out/default/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png b/app/out/default/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png
new file mode 100644 (file)
index 0000000..64ece57
Binary files /dev/null and b/app/out/default/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png differ
diff --git a/app/out/default/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png b/app/out/default/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png
new file mode 100644 (file)
index 0000000..abdc010
Binary files /dev/null and b/app/out/default/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png differ
diff --git a/app/out/default/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png b/app/out/default/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png
new file mode 100644 (file)
index 0000000..9b383f4
Binary files /dev/null and b/app/out/default/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png differ
diff --git a/app/out/default/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png b/app/out/default/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png
new file mode 100644 (file)
index 0000000..a23baad
Binary files /dev/null and b/app/out/default/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png differ
diff --git a/app/out/default/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png b/app/out/default/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png
new file mode 100644 (file)
index 0000000..42ccba2
Binary files /dev/null and b/app/out/default/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png differ
diff --git a/app/out/default/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png b/app/out/default/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png
new file mode 100644 (file)
index 0000000..39d5824
Binary files /dev/null and b/app/out/default/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png differ
diff --git a/app/out/default/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png b/app/out/default/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
new file mode 100644 (file)
index 0000000..f127367
Binary files /dev/null and b/app/out/default/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png differ
diff --git a/app/out/default/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png b/app/out/default/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png
new file mode 100644 (file)
index 0000000..359397a
Binary files /dev/null and b/app/out/default/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png differ
diff --git a/app/out/default/css/ui-lightness/images/ui-icons_222222_256x240.png b/app/out/default/css/ui-lightness/images/ui-icons_222222_256x240.png
new file mode 100644 (file)
index 0000000..b273ff1
Binary files /dev/null and b/app/out/default/css/ui-lightness/images/ui-icons_222222_256x240.png differ
diff --git a/app/out/default/css/ui-lightness/images/ui-icons_228ef1_256x240.png b/app/out/default/css/ui-lightness/images/ui-icons_228ef1_256x240.png
new file mode 100644 (file)
index 0000000..a641a37
Binary files /dev/null and b/app/out/default/css/ui-lightness/images/ui-icons_228ef1_256x240.png differ
diff --git a/app/out/default/css/ui-lightness/images/ui-icons_ef8c08_256x240.png b/app/out/default/css/ui-lightness/images/ui-icons_ef8c08_256x240.png
new file mode 100644 (file)
index 0000000..85e63e9
Binary files /dev/null and b/app/out/default/css/ui-lightness/images/ui-icons_ef8c08_256x240.png differ
diff --git a/app/out/default/css/ui-lightness/images/ui-icons_ffd27a_256x240.png b/app/out/default/css/ui-lightness/images/ui-icons_ffd27a_256x240.png
new file mode 100644 (file)
index 0000000..e117eff
Binary files /dev/null and b/app/out/default/css/ui-lightness/images/ui-icons_ffd27a_256x240.png differ
diff --git a/app/out/default/css/ui-lightness/images/ui-icons_ffffff_256x240.png b/app/out/default/css/ui-lightness/images/ui-icons_ffffff_256x240.png
new file mode 100644 (file)
index 0000000..42f8f99
Binary files /dev/null and b/app/out/default/css/ui-lightness/images/ui-icons_ffffff_256x240.png differ
diff --git a/app/out/default/css/ui-lightness/jquery-ui-1.8.12.custom.css b/app/out/default/css/ui-lightness/jquery-ui-1.8.12.custom.css
new file mode 100644 (file)
index 0000000..3f7bf90
--- /dev/null
@@ -0,0 +1,578 @@
+/*
+ * jQuery UI CSS Framework 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+.ui-helper-clearfix { display: inline-block; }
+/* required comment for clearfix to work in Opera \*/
+* html .ui-helper-clearfix { height:1%; }
+.ui-helper-clearfix { display:block; }
+/* end clearfix */
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
+
+
+/*
+ * jQuery UI CSS Framework 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ *
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
+ */
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1.1em; }
+.ui-widget .ui-widget { font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1em; }
+.ui-widget-content { border: 1px solid #dddddd; background: #eeeeee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x; color: #333333; }
+.ui-widget-content a { color: #333333; }
+.ui-widget-header { border: 1px solid #e78f08; background: #f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; }
+.ui-widget-header a { color: #ffffff; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #cccccc; background: #f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1c94c4; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #1c94c4; text-decoration: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #fbcb09; background: #fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #c77405; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #c77405; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #fbd850; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #eb8f00; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #eb8f00; text-decoration: none; }
+.ui-widget :active { outline: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fed22f; background: #ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x; color: #363636; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat; color: #ffffff; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-header .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); }
+.ui-state-default .ui-icon { background-image: url(images/ui-icons_ef8c08_256x240.png); }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); }
+.ui-state-active .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); }
+.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_228ef1_256x240.png); }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_ffd27a_256x240.png); }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; }
+.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
+.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
+.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
+.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+.ui-corner-right {  -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
+.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; }
+
+/* Overlays */
+.ui-widget-overlay { background: #666666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat; opacity: .50;filter:Alpha(Opacity=50); }
+.ui-widget-shadow { margin: -5px 0 0 -5px; padding: 5px; background: #000000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }/*
+ * jQuery UI Resizable 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizable#theming
+ */
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;
+       /* http://bugs.jqueryui.com/ticket/7233
+        - Resizable: resizable handles fail to work in IE if transparent and content overlaps
+       */
+       background-image:url(data:);
+}
+.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
+.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
+.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*
+ * jQuery UI Selectable 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectable#theming
+ */
+.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
+/*
+ * jQuery UI Accordion 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion#theming
+ */
+/* IE/Win - Fix animation bug - #4615 */
+.ui-accordion { width: 100%; }
+.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
+.ui-accordion .ui-accordion-li-fix { display: inline; }
+.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
+.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
+.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
+.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
+.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
+.ui-accordion .ui-accordion-content-active { display: block; }
+/*
+ * jQuery UI Autocomplete 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete#theming
+ */
+.ui-autocomplete { position: absolute; cursor: default; }      
+
+/* workarounds */
+* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
+
+/*
+ * jQuery UI Menu 1.8.12
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu#theming
+ */
+.ui-menu {
+       list-style:none;
+       padding: 2px;
+       margin: 0;
+       display:block;
+       float: left;
+}
+.ui-menu .ui-menu {
+       margin-top: -3px;
+}
+.ui-menu .ui-menu-item {
+       margin:0;
+       padding: 0;
+       zoom: 1;
+       float: left;
+       clear: left;
+       width: 100%;
+}
+.ui-menu .ui-menu-item a {
+       text-decoration:none;
+       display:block;
+       padding:.2em .4em;
+       line-height:1.5;
+       zoom:1;
+}
+.ui-menu .ui-menu-item a.ui-state-hover,
+.ui-menu .ui-menu-item a.ui-state-active {
+       font-weight: normal;
+       margin: -1px;
+}
+/*
+ * jQuery UI Button 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button#theming
+ */
+.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
+.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
+button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
+.ui-button-icons-only { width: 3.4em; } 
+button.ui-button-icons-only { width: 3.7em; } 
+
+/*button text element */
+.ui-button .ui-button-text { display: block; line-height: 1.4;  }
+.ui-button-text-only .ui-button-text { padding: .4em 1em; }
+.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
+.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
+.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
+.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+/* no icon support for input elements, provide padding by default */
+input.ui-button { padding: .4em 1em; }
+
+/*button icon element(s) */
+.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
+.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
+.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
+.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+
+/*button sets*/
+.ui-buttonset { margin-right: 7px; }
+.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+
+/* workarounds */
+button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
+/*
+ * jQuery UI Dialog 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog#theming
+ */
+.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
+.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative;  }
+.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } 
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
+.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
+.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
+.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }
+/*
+ * jQuery UI Slider 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider#theming
+ */
+.ui-slider { position: relative; text-align: left; }
+.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
+.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
+
+.ui-slider-horizontal { height: .8em; }
+.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
+.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
+.ui-slider-horizontal .ui-slider-range-min { left: 0; }
+.ui-slider-horizontal .ui-slider-range-max { right: 0; }
+
+.ui-slider-vertical { width: .8em; height: 100px; }
+.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
+.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
+.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
+.ui-slider-vertical .ui-slider-range-max { top: 0; }/*
+ * jQuery UI Tabs 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs#theming
+ */
+.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
+.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
+.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
+.ui-tabs .ui-tabs-hide { display: none !important; }
+/*
+ * jQuery UI Datepicker 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker#theming
+ */
+.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
+.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
+.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
+.ui-datepicker .ui-datepicker-prev { left:2px; }
+.ui-datepicker .ui-datepicker-next { right:2px; }
+.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
+.ui-datepicker .ui-datepicker-next-hover { right:1px; }
+.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month, 
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
+.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
+.ui-datepicker td { border: 0; padding: 1px; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
+.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi { width:auto; }
+.ui-datepicker-multi .ui-datepicker-group { float:left; }
+.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
+.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
+.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
+.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
+.ui-datepicker-row-break { clear:both; width:100%; }
+
+/* RTL support */
+.ui-datepicker-rtl { direction: rtl; }
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+
+/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
+.ui-datepicker-cover {
+    display: none; /*sorry for IE5*/
+    display/**/: block; /*sorry for IE5*/
+    position: absolute; /*must have*/
+    z-index: -1; /*must have*/
+    filter: mask(); /*must have*/
+    top: -4px; /*must have*/
+    left: -4px; /*must have*/
+    width: 200px; /*must have*/
+    height: 200px; /*must have*/
+}/*
+ * jQuery UI Progressbar 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar#theming
+ */
+.ui-progressbar { height:2em; text-align: left; }
+.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
\ No newline at end of file
diff --git a/app/out/default/icons/ajax-loader.gif b/app/out/default/icons/ajax-loader.gif
new file mode 100644 (file)
index 0000000..09d621e
Binary files /dev/null and b/app/out/default/icons/ajax-loader.gif differ
diff --git a/app/out/default/icons/ecouter.png b/app/out/default/icons/ecouter.png
new file mode 100644 (file)
index 0000000..bd25923
Binary files /dev/null and b/app/out/default/icons/ecouter.png differ
diff --git a/app/out/default/icons/pause.png b/app/out/default/icons/pause.png
new file mode 100644 (file)
index 0000000..1caa14b
Binary files /dev/null and b/app/out/default/icons/pause.png differ
diff --git a/app/out/default/icons/play.png b/app/out/default/icons/play.png
new file mode 100644 (file)
index 0000000..e4ff37a
Binary files /dev/null and b/app/out/default/icons/play.png differ
diff --git a/app/out/default/icons/player_loading.gif b/app/out/default/icons/player_loading.gif
new file mode 100644 (file)
index 0000000..45cd0c0
Binary files /dev/null and b/app/out/default/icons/player_loading.gif differ
diff --git a/app/out/default/icons/stop.png b/app/out/default/icons/stop.png
new file mode 100644 (file)
index 0000000..2a3134d
Binary files /dev/null and b/app/out/default/icons/stop.png differ
diff --git a/app/out/default/images/colorbox/border.png b/app/out/default/images/colorbox/border.png
new file mode 100644 (file)
index 0000000..f463a10
Binary files /dev/null and b/app/out/default/images/colorbox/border.png differ
diff --git a/app/out/default/images/colorbox/controls.png b/app/out/default/images/colorbox/controls.png
new file mode 100644 (file)
index 0000000..051b4a6
Binary files /dev/null and b/app/out/default/images/colorbox/controls.png differ
diff --git a/app/out/default/images/colorbox/ie6/borderBottomCenter.png b/app/out/default/images/colorbox/ie6/borderBottomCenter.png
new file mode 100644 (file)
index 0000000..0d4475e
Binary files /dev/null and b/app/out/default/images/colorbox/ie6/borderBottomCenter.png differ
diff --git a/app/out/default/images/colorbox/ie6/borderBottomLeft.png b/app/out/default/images/colorbox/ie6/borderBottomLeft.png
new file mode 100644 (file)
index 0000000..2775eba
Binary files /dev/null and b/app/out/default/images/colorbox/ie6/borderBottomLeft.png differ
diff --git a/app/out/default/images/colorbox/ie6/borderBottomRight.png b/app/out/default/images/colorbox/ie6/borderBottomRight.png
new file mode 100644 (file)
index 0000000..f7f5137
Binary files /dev/null and b/app/out/default/images/colorbox/ie6/borderBottomRight.png differ
diff --git a/app/out/default/images/colorbox/ie6/borderMiddleLeft.png b/app/out/default/images/colorbox/ie6/borderMiddleLeft.png
new file mode 100644 (file)
index 0000000..a2d63d1
Binary files /dev/null and b/app/out/default/images/colorbox/ie6/borderMiddleLeft.png differ
diff --git a/app/out/default/images/colorbox/ie6/borderMiddleRight.png b/app/out/default/images/colorbox/ie6/borderMiddleRight.png
new file mode 100644 (file)
index 0000000..fd7c3e8
Binary files /dev/null and b/app/out/default/images/colorbox/ie6/borderMiddleRight.png differ
diff --git a/app/out/default/images/colorbox/ie6/borderTopCenter.png b/app/out/default/images/colorbox/ie6/borderTopCenter.png
new file mode 100644 (file)
index 0000000..2937a9c
Binary files /dev/null and b/app/out/default/images/colorbox/ie6/borderTopCenter.png differ
diff --git a/app/out/default/images/colorbox/ie6/borderTopLeft.png b/app/out/default/images/colorbox/ie6/borderTopLeft.png
new file mode 100644 (file)
index 0000000..f9d458b
Binary files /dev/null and b/app/out/default/images/colorbox/ie6/borderTopLeft.png differ
diff --git a/app/out/default/images/colorbox/ie6/borderTopRight.png b/app/out/default/images/colorbox/ie6/borderTopRight.png
new file mode 100644 (file)
index 0000000..74b8583
Binary files /dev/null and b/app/out/default/images/colorbox/ie6/borderTopRight.png differ
diff --git a/app/out/default/images/colorbox/loading.gif b/app/out/default/images/colorbox/loading.gif
new file mode 100644 (file)
index 0000000..09d621e
Binary files /dev/null and b/app/out/default/images/colorbox/loading.gif differ
diff --git a/app/out/default/images/colorbox/loading_background.png b/app/out/default/images/colorbox/loading_background.png
new file mode 100644 (file)
index 0000000..6ae83e6
Binary files /dev/null and b/app/out/default/images/colorbox/loading_background.png differ
diff --git a/app/out/default/images/colorbox/overlay.png b/app/out/default/images/colorbox/overlay.png
new file mode 100644 (file)
index 0000000..ddf9e09
Binary files /dev/null and b/app/out/default/images/colorbox/overlay.png differ
diff --git a/app/out/default/js/actions/admin_cache.js b/app/out/default/js/actions/admin_cache.js
new file mode 100644 (file)
index 0000000..f7241db
--- /dev/null
@@ -0,0 +1,30 @@
+$(document).ready
+( function()
+  { init_cache_radios();
+  }
+);
+
+function init_cache_radios()
+{ $("#cache_actif_oui").click
+  ( function()
+    { $("#li_cache_maj_auto").slideDown(200);
+      if($("#cache_maj_auto_oui").get(0).checked) $("#li_cache_time").slideDown(200);
+    }
+  );
+  $("#cache_actif_non").click
+  ( function()
+    { $("#li_cache_maj_auto").slideUp(200);
+      $("#li_cache_time").slideUp(200);
+    }
+  );
+  $("#cache_maj_auto_oui").click
+  ( function()
+    { $("#li_cache_time").slideDown(200);
+    }
+  );
+  $("#cache_maj_auto_non").click
+  ( function()
+    { $("#li_cache_time").slideUp(200);
+    }
+  );
+}
diff --git a/app/out/default/js/actions/admin_sourceml.js b/app/out/default/js/actions/admin_sourceml.js
new file mode 100644 (file)
index 0000000..e492f57
--- /dev/null
@@ -0,0 +1,17 @@
+function select_start_action(start_action)
+{ if(start_action == "sources/groupe")
+  { $("#groupe_param").css("display", "none");
+    $("#album_param").css("display", "none");
+    return;
+  }
+  if(start_action == "sources/groupe/view")
+  { $("#groupe_param").css("display", "inline");
+    $("#album_param").css("display", "none");
+    return;
+  }
+  if(start_action == "sources/album/view")
+  { $("#groupe_param").css("display", "none");
+    $("#album_param").css("display", "inline");
+    return;
+  }
+}
diff --git a/app/out/default/js/actions/sources.js b/app/out/default/js/actions/sources.js
new file mode 100644 (file)
index 0000000..670a016
--- /dev/null
@@ -0,0 +1,380 @@
+$(document).ready(
+  function(){
+    init_show_xml_links();
+    init_players("*");
+    init_player_listener();
+  }
+);
+
+// -----------------------------------------------------------------
+//                                                      player audio
+//
+
+var current_document = false;
+var autoplay_next = false;
+
+function init_players(target){
+  $(target == "*" ? "audio" : target + " audio").each
+  ( function()
+    { var audio_elt = $(this).get(0);
+      var CAN_PLAY = false;
+      var id_document = $(this).attr("id").substring(6);
+      var id_source = null;
+      if((k = id_document.indexOf("_")) != -1) id_source = id_document.substring(0, k);
+      if(id_source){
+        $(this).find("source").each(
+          function(){
+            if(audio_elt.canPlayType($(this).attr("type"))) CAN_PLAY = true;
+         }
+        );
+        if(CAN_PLAY){
+          audio_elt.addEventListener("ended", track_ended, false);
+          $("#player_" + id_document + " .play").click(function() { play(id_document); return false; });
+          $("#player_" + id_document + " .play").css("display", "inline");
+          $("#player_" + id_document + " .pause").click(function() { pause(); return false; });
+          $("#player_" + id_document + " .pause").css("display", "none");
+          $("#player_" + id_document + " .stop").click(function() { stop(); return false; });
+          $("#player_" + id_document + " .stop").css("display", "none");
+          $("#document_" + id_document + " .no_player").remove();
+        }
+      }
+      if(!CAN_PLAY) $("#player_" + id_document).remove();
+    }
+  );
+  $(target == "*" ? ".track" : target + " .track").each(
+    function(){
+      if($(this).find(".player").size()){
+        var id_source = $(this).attr("id").substring(6);
+        $(this).find(".player_progress").first().click(
+          function(e){
+            if((progress_width = $(this).width()) != 0){
+              play_source_from(id_source, (100 * (e.pageX - this.offsetLeft)) / progress_width);
+            }
+          }
+        );
+      }
+      else $(this).find(".player_progress").first().css("cursor", "default");
+    }
+  );
+}
+
+function init_player_listener(){
+  setInterval("player_listener_update()", 300);
+}
+
+function player_listener_update(){
+  if(
+       (current_document != false)
+    && (source_id = get_current_source_id())
+    && (current_audio = $("#audio_" + current_document).get(0))
+    && ($("#track_" + source_id + " .player_progress").size())
+  ){
+    $("#track_" + source_id + " .player_progress .position").not(
+      "#track_" + source_id + " .pistes .player_progress .position").not(
+      "#track_" + source_id + " .derivation .player_progress .position").css(
+        "width",
+        Math.round((100 * current_audio.currentTime) / current_audio.duration) + "%"
+    );
+  }
+}
+
+function get_current_source_id(){
+  if(current_document != false){
+    if($("#document_" + current_document).size()){
+      var source_document_id = $("#document_" + current_document).attr("id").substring(9);
+      if((k = source_document_id.indexOf("_")) != -1){
+        return source_document_id.substring(0, k);
+      }
+    }
+  }
+  return false;
+}
+
+function play_all(){
+  autoplay_next = play_first_source();
+}
+
+function play_first_source(){
+  var FOUND = false;
+  $(".track").not(".pistes .track").not(".derivation .track").each(
+    function(){
+      if(!FOUND){
+        $(this).find(".documents li").not(".pistes .documents li").not(".derivation .documents li").each(
+          function(){
+            if(!FOUND){
+              var source_document_id = $(this).attr("id").substring(9);
+              if(source_document_id.length > 0){
+                if($("#player_" + source_document_id).size()){
+                  FOUND = true;
+                  play(source_document_id);
+                }
+              }
+            }
+          }
+        );
+      }
+    }
+  );
+  return FOUND;
+}
+
+function play_next_source(){
+  var FOUND = false;
+  if(current_document != false){
+    if($("#document_" + current_document).size()){
+      var current_source_document_id = $("#document_" + current_document).attr("id");
+      var current_source_id = get_current_source_id();
+      if(current_source_id != false){
+        var CURRENT_FOUND = false;
+        $(".track").not(".pistes .track").not(".derivation .track").each(
+          function(){
+            if(!FOUND){
+              if(CURRENT_FOUND){
+                $(this).find(".documents li").not(".pistes .documents li").not(".derivation .documents li").each(
+                  function(){
+                    if(!FOUND){
+                      var source_document_id = $(this).attr("id").substring(9);
+                      if(source_document_id.length > 0){
+                        if($("#player_" + source_document_id).size()){
+                          FOUND = true;
+                          play(source_document_id);
+                        }
+                      }
+                    }
+                  }
+                );
+              }
+              else{
+                if(current_source_id == $(this).attr("id").substring("6")){
+                  CURRENT_FOUND = true;
+                }
+              }
+            }
+          }
+        );
+      }
+    }
+  }
+  return FOUND;
+}
+
+function play(id_document){
+  if(current_document == id_document){
+    if($("#audio_" + current_document).get(0).paused){
+      gui_state("playing");
+      $("#audio_" + current_document).get(0).play();
+    }
+  }
+  else{
+    if(current_document != false){
+      var audio_elt = $("#audio_" + current_document).get(0);
+      audio_elt.pause();
+      audio_elt.currentTime = 0;
+      gui_state("stoped");
+    }
+    current_document = id_document;
+    _play(0);
+  }
+}
+
+function play_source_from(id_source, position){
+  if(
+       (current_document != false)
+    && (current_source_id = get_current_source_id())
+    && (id_source == current_source_id)
+  ){
+    _play(position);
+  }
+  else{
+    stop();
+    var FOUND = false;
+    $("#track_" + id_source + " .documents li").each(
+      function(){
+        if(!FOUND){
+          var source_document_id = $(this).attr("id").substring(9);
+          if(source_document_id.length > 0){
+            if($("#player_" + source_document_id).size()){
+              FOUND = true;
+              current_document = source_document_id;
+              _play(position);
+            }
+          }
+        }
+      }
+    );
+  }
+}
+
+function _play(position){
+  if(current_document != false){
+    var audio_elt = $("#audio_" + current_document).get(0);
+    audio_elt.preload = "auto";
+    audio_elt.addEventListener("loadeddata", track_loadeddata, false);
+    audio_elt.addEventListener("canplaythrough", track_canplaythrough, false);
+    audio_elt.addEventListener("playing", track_playing, false);
+    gui_state("loading");
+    audio_elt.position = position;
+    audio_elt.load();
+  }
+}
+
+function track_loadeddata(event){
+  var audio_elt = event.target;
+  audio_elt.removeEventListener("loadeddata", track_loadeddata, false);
+  if(current_document != false){
+    audio_elt.currentTime = audio_elt.position ? (audio_elt.position * audio_elt.duration) / 100 : 0;
+  }
+}
+
+function track_canplaythrough(event){
+  var audio_elt = event.target;
+  audio_elt.removeEventListener("canplaythrough", track_canplaythrough, false);
+  audio_elt.play();
+}
+
+function track_playing(event){
+  var audio_elt = event.target;
+  audio_elt.removeEventListener("playing", track_playing, false);
+  gui_state("playing");
+}
+
+function pause(){
+  if(current_document != false){
+    var audio_elt = $("#audio_" + current_document).get(0);
+    audio_elt.pause();
+    gui_state("paused");
+  }
+}
+
+function stop(){
+  if(current_document != false){
+    var audio_elt = $("#audio_" + current_document).get(0);
+    audio_elt.pause();
+    audio_elt.currentTime = 0;
+    gui_state("stoped");
+    current_document = false;
+  }
+  autoplay_next = false;
+}
+
+function track_ended(){
+  gui_state("stoped");
+  var current_audio = $("#audio_" + current_document).get(0);
+  current_audio.pause();
+  if(current_audio.currentTime) current_audio.currentTime = 0;
+  if(autoplay_next) autoplay_next = play_next_source();
+}
+
+function gui_state(state){
+  gui_blur();
+  if(current_document != false){
+    var source_id = get_current_source_id();
+    $("#track_" + source_id).removeClass("loading_player");
+    if(state == "playing"){
+      $("#player_" + current_document).find(".play").css("display", "none");
+      $("#player_" + current_document).find(".pause").css("display", "inline");
+      $("#player_" + current_document).find(".stop").css("display", "inline");
+      $("#track_" + source_id).removeClass("track");
+      $("#track_" + source_id).addClass("playing_track");
+    }
+    else if(state == "paused"){
+      $("#player_" + current_document).find(".play").get(0).style.display = "inline";
+      $("#player_" + current_document).find(".pause").get(0).style.display = "none";
+      $("#player_" + current_document).find(".stop").get(0).style.display = "inline";
+      $("#track_" + source_id).removeClass("track");
+      $("#track_" + source_id).addClass("playing_track");
+    }
+    else if(state == "stoped"){
+      $("#player_" + current_document).find(".play").get(0).style.display = "inline";
+      $("#player_" + current_document).find(".pause").get(0).style.display = "none";
+      $("#player_" + current_document).find(".stop").get(0).style.display = "none";
+      $("#track_" + source_id).removeClass("playing_track");
+      $("#track_" + source_id).addClass("track");
+      $("#track_" + source_id + " .player_progress .position").not(
+        "#track_" + source_id + " .pistes .player_progress .position").not(
+        "#track_" + source_id + " .derivation .player_progress .position").css("width", "0%");
+    }
+    else if(state == "loading"){
+      $("#track_" + source_id).addClass("loading_player");
+    }
+  }
+}
+
+function gui_blur(){
+  if((current_document != false) && $("#player_" + current_document).size()){
+    $("#player_" + current_document).find(".play").get(0).blur();
+    $("#player_" + current_document).find(".pause").get(0).blur();
+    $("#player_" + current_document).find(".stop").get(0).blur();
+  }
+}
+
+// -----------------------------------------------------------------
+//                                                        source xml
+//
+
+var loaded = false;
+var show_xml_links = {};
+
+function show_xml(id){
+  alert(xml_contents[id]);
+}
+
+function init_show_xml_links(){
+  for(var i in show_xml_links){
+    $("#show_xml_" + i).colorbox();
+  }
+  loaded = true;
+}
+
+function set_show_xml_links(i){
+  if(loaded) $("#show_xml_" + i).colorbox();
+  else show_xml_links[i] = true;
+}
+
+// -----------------------------------------------------------------
+//                                             sources / derivations
+//
+
+function toggle_source_list(id_block){
+  var content = $("#source_list_" + id_block + " .pistes").html();
+  if(content.length > 0){
+    $("#source_list_" + id_block).slideUp(200);
+    $("#source_list_" + id_block + " .pistes").empty();
+    $("#toggle_sources_list_" + id_block + ".block_list_toggle").html("[+]");
+  }
+  else{
+    $("#source_list_" + id_block).slideDown(200);
+    $("#toggle_sources_list_" + id_block + ".block_list_toggle").html("[-]");
+    $("#source_list_" + id_block + " .pistes").html("<div class=\"loading\"><span>en chargement...</span></div>");
+    $.ajax({
+      url: mw_site_url + "index.php?e=content/sources/sources&id=" + id_block,
+      dataType: "html",
+      success: function(content){
+        $("#source_list_" + id_block + " .pistes").html(content);
+        init_players("#source_list_" + id_block + " .pistes");
+      }
+    });
+  }
+}
+
+function toggle_derivation_list(id_block){
+  var content = $("#derivation_list_" + id_block + " .derivation").html();
+  if(content.length > 0){
+    $("#derivation_list_" + id_block).slideUp(200);
+    $("#derivation_list_" + id_block + " .derivation").empty();
+    $("#toggle_derivation_list_" + id_block + ".block_list_toggle").html("[+]");
+  }
+  else{
+    $("#derivation_list_" + id_block).slideDown(200);
+    $("#toggle_derivation_list_" + id_block + ".block_list_toggle").html("[-]");
+    $("#derivation_list_" + id_block + " .derivation").html("<div class=\"loading\"><span>en chargement...</span></div>");
+    $.ajax({
+      url: mw_site_url + "index.php?e=content/sources/derivations&id=" + id_block,
+      dataType: "html",
+      success: function(content){
+        $("#derivation_list_" + id_block + " .derivation").html(content);
+        init_players("#derivation_list_" + id_block + " .derivation");
+      }
+    });
+  }
+}
diff --git a/app/out/default/js/actions/users.js b/app/out/default/js/actions/users.js
new file mode 100644 (file)
index 0000000..3927192
--- /dev/null
@@ -0,0 +1,158 @@
+$(document).ready
+( function()
+  { init_reference_select();
+    init_tinymce();
+    init_derivations();
+    init_reference();
+  }
+);
+
+var last_document_id = 1;
+
+function select_groupe(id_groupe)
+{ var content =
+    "<label for=\"album\">album</label>"
+  + "<p>"
+  + "<select name=\"album\" id=\"album\">"
+  + "<option value=\"0\" selected=\"selected\">hors album</option>";
+  for(var id_album in albums["" + id_groupe])
+  { content +=
+      "<option value=\"" + id_album + "\">" + albums["" + id_groupe]["" + id_album] + "</option>";
+  }
+  content +=
+    "</select>"
+  + "</p>";
+  $("#album_select").html(content);
+}
+
+function select_morceaux_groupe(id_groupe)
+{ var content =
+    "<label for=\"morceau\">morceau</label>"
+  + "<p>"
+  + "<select name=\"morceau\" id=\"morceau\">"
+  + "<option value=\"0\" selected=\"selected\">hors morceau</option>";
+  for(var id_album in morceaux["" + id_groupe])
+  { for(var id_morceau in morceaux["" + id_groupe]["" + id_album])
+    { content +=
+        "<option value=\"" + id_morceau + "\">" + morceaux["" + id_groupe]["" + id_album]["" + id_morceau] + "</option>";
+    }
+  }
+  content +=
+    "</select>"
+  + "</p>";
+  $("#morceau_select").html(content);
+}
+
+function init_reference_select()
+{ $("#is_derivation").click
+  ( function()
+    { if($(this).get(0).checked) $("#derivation_input").slideDown(200);
+      else $("#derivation_input").slideUp(200);
+    }
+  );
+  $("#is_reference").click
+  ( function()
+    { if($(this).get(0).checked)
+      { $("#original_form").slideUp(200);
+        $("#reference_form").slideDown(200);
+      }
+      else 
+      { $("#reference_form").slideUp(200);
+        $("#original_form").slideDown(200);
+      }
+    }
+  );
+}
+
+function add_document()
+{ last_document_id++;
+  var id_document = last_document_id;
+  var content = "<div class=\"document\" id=\"document_" + id_document + "\">\n"
+              + "  <div class=\"delete\"><a href=\"#\" onclick=\"del_document('" + id_document + "'); return false;\">Enlever ce fichier</a></div>\n"
+              + "  <label for=\"document_nom_" + id_document + "\">nom</label>\n"
+              + "  <input type=\"text\" class=\"long_text\" name=\"document_nom_" + id_document + "\" id=\"document_nom_" + id_document + "\" value=\"\" />\n"
+              + "  <div class=\"clear\"><!-- --></div>\n"
+              + "  <label for=\"document_url_" + id_document + "\">url</label>\n"
+              + "  <input type=\"text\" size=\"48\" name=\"document_url_" + id_document + "\" id=\"document_url_" + id_document + "\" value=\"\" />\n"
+              + "</div>\n";
+  $("#documents").append(content);
+}
+
+function del_document(id_document)
+{ $("#document_" + id_document).remove();
+}
+
+function init_tinymce()
+{ $(".tinymce").each
+  ( function()
+    { tinyMCE.execCommand("mceAddControl", true, $(this).attr("id"));
+    }
+  );
+}
+
+function init_toggle_edit_derivation_content(id_derivation)
+{ $("#derivation_edit_" + id_derivation + " .use_edit_derivation_content").click
+  ( function()
+    { var id_derivation_content = $(this).attr("id");
+      if(id_derivation_content.length > 28)
+      { id_derivation_content = id_derivation_content.substr(28);
+        if($(this).get(0).checked)
+        { $("#derivation_edit_" + id_derivation_content + " span").slideDown(200);
+        }
+        else
+        { $("#derivation_edit_" + id_derivation_content + " span").slideUp(200);
+        }
+      }
+    }
+  );
+}
+
+function init_derivations()
+{ if(typeof(derivations) != "undefined")
+  { for(var id_derivation in derivations)
+    { init_toggle_edit_derivation_content(id_derivation);
+      $("#derivation_infos_" + id_derivation).slideDown(200);
+    }
+  }
+}
+
+function init_toggle_edit_reference_content(){
+  $("#reference_edit .use_edit_reference_content").click(
+    function(){
+      if($(this).get(0).checked){
+        $("#reference_edit span").slideDown(200);
+      }
+      else{
+        $("#reference_edit span").slideUp(200);
+      }
+    }
+  );
+}
+
+function init_reference()
+{ init_toggle_edit_reference_content();
+  if(typeof(is_reference) != "undefined")
+  { if(is_reference) $("#reference_form").slideDown(200);
+  }
+}
+
+function add_derivation(id_source, id_source_derivation)
+{ if(!id_source)
+  { index_derivation++;
+    id_source_derivation = index_derivation;
+  }
+  $.ajax
+  ( { url: mw_site_url + "index.php?e=content/sources/xml_form&id=" + id_source + "&derivation=" + id_source_derivation + "&form=" + (id_source ? "edit" : "add"),
+      dataType: "html",
+      success: function(content)
+      { $("#derivations_items").append(content);
+        init_toggle_edit_derivation_content(id_source_derivation);
+        $("#derivation_infos_" + id_source_derivation).slideDown(200);
+      }
+    }
+  );
+}
+
+function del_sml_xf(id_xf)
+{ $("#" + id_xf).slideUp(200, function () { $(this).remove(); });
+}
diff --git a/app/out/default/js/actions/users_groupes.js b/app/out/default/js/actions/users_groupes.js
new file mode 100644 (file)
index 0000000..31a5f59
--- /dev/null
@@ -0,0 +1,28 @@
+$(document).ready(
+  function(){
+    init_contact_form_ckeckbox();
+  }
+);
+
+function select_groupe(id_groupe){
+  var content =
+    "<label for=\"album\">album</label>"
+  + "<select name=\"album\" id=\"album\">"
+  + "<option value=\"0\" selected=\"selected\">hors album</option>";
+  for(var id_album in albums["" + id_groupe])
+  { content +=
+      "<option value=\"" + id_album + "\">" + albums["" + id_groupe]["" + id_album] + "</option>";
+  }
+  content +=
+    "</select>";
+  $("#album_select").html(content);
+}
+
+function init_contact_form_ckeckbox(){
+  $("#contact_form").click(
+    function(){
+      if($(this).get(0).checked) $("#email_li").slideDown(200);
+      else $("#email_li").slideUp(200);
+    }
+  );
+}
diff --git a/app/out/default/js/jquery-ui-1.8.12.custom.min.js b/app/out/default/js/jquery-ui-1.8.12.custom.min.js
new file mode 100644 (file)
index 0000000..1b1c88f
--- /dev/null
@@ -0,0 +1,783 @@
+/*!
+ * jQuery UI 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI
+ */
+(function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.12",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,
+NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,
+"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");
+if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f,
+"border"+this+"Width",true))||0;if(m)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h,
+d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");if("area"===b){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&k(a)}return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"==b?a.href||!isNaN(d):!isNaN(d))&&k(a)},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}});
+c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&&
+b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&c.ui.isOverAxis(b,e,i)}})}})(jQuery);
+;/*!
+ * jQuery UI Widget 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+(function(b,j){if(b.cleanData){var k=b.cleanData;b.cleanData=function(a){for(var c=0,d;(d=a[c])!=null;c++)b(d).triggerHandler("remove");k(a)}}else{var l=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add([this]).each(function(){b(this).triggerHandler("remove")});return l.call(b(this),a,c)})}}b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h,
+a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend(true,{},c.options);b[e][a].prototype=b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.charAt(0)==="_")return h;
+e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==j){h=i;return false}}):this.each(function(){var g=b.data(this,a);g?g.option(d||{})._init():b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){b.data(c,this.widgetName,this);this.element=b(c);this.options=b.extend(true,{},this.options,
+this._getCreateOptions(),a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},
+widget:function(){return this.element},option:function(a,c){var d=a;if(arguments.length===0)return b.extend({},this.options);if(typeof a==="string"){if(c===j)return this.options[a];d={};d[a]=c}this._setOptions(d);return this},_setOptions:function(a){var c=this;b.each(a,function(d,e){c._setOption(d,e)});return this},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},
+enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a=b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery);
+;/*!
+ * jQuery UI Mouse 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Mouse
+ *
+ * Depends:
+ *     jquery.ui.widget.js
+ */
+(function(b){b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var a=this;this.element.bind("mousedown."+this.widgetName,function(c){return a._mouseDown(c)}).bind("click."+this.widgetName,function(c){if(true===b.data(c.target,a.widgetName+".preventClickEvent")){b.removeData(c.target,a.widgetName+".preventClickEvent");c.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(a){a.originalEvent=
+a.originalEvent||{};if(!a.originalEvent.mouseHandled){this._mouseStarted&&this._mouseUp(a);this._mouseDownEvent=a;var c=this,e=a.which==1,f=typeof this.options.cancel=="string"?b(a.target).parents().add(a.target).filter(this.options.cancel).length:false;if(!e||f||!this._mouseCapture(a))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){c.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a)){this._mouseStarted=
+this._mouseStart(a)!==false;if(!this._mouseStarted){a.preventDefault();return true}}true===b.data(a.target,this.widgetName+".preventClickEvent")&&b.removeData(a.target,this.widgetName+".preventClickEvent");this._mouseMoveDelegate=function(d){return c._mouseMove(d)};this._mouseUpDelegate=function(d){return c._mouseUp(d)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);a.preventDefault();return a.originalEvent.mouseHandled=
+true}},_mouseMove:function(a){if(b.browser.msie&&!(document.documentMode>=9)&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);return a.preventDefault()}if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);
+if(this._mouseStarted){this._mouseStarted=false;a.target==this._mouseDownEvent.target&&b.data(a.target,this.widgetName+".preventClickEvent",true);this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery);
+;/*
+ * jQuery UI Position 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Position
+ */
+(function(c){c.ui=c.ui||{};var n=/left|center|right/,o=/top|center|bottom/,t=c.fn.position,u=c.fn.offset;c.fn.position=function(b){if(!b||!b.of)return t.apply(this,arguments);b=c.extend({},b);var a=c(b.of),d=a[0],g=(b.collision||"flip").split(" "),e=b.offset?b.offset.split(" "):[0,0],h,k,j;if(d.nodeType===9){h=a.width();k=a.height();j={top:0,left:0}}else if(d.setTimeout){h=a.width();k=a.height();j={top:a.scrollTop(),left:a.scrollLeft()}}else if(d.preventDefault){b.at="left top";h=k=0;j={top:b.of.pageY,
+left:b.of.pageX}}else{h=a.outerWidth();k=a.outerHeight();j=a.offset()}c.each(["my","at"],function(){var f=(b[this]||"").split(" ");if(f.length===1)f=n.test(f[0])?f.concat(["center"]):o.test(f[0])?["center"].concat(f):["center","center"];f[0]=n.test(f[0])?f[0]:"center";f[1]=o.test(f[1])?f[1]:"center";b[this]=f});if(g.length===1)g[1]=g[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(b.at[0]==="right")j.left+=h;else if(b.at[0]==="center")j.left+=h/2;if(b.at[1]==="bottom")j.top+=
+k;else if(b.at[1]==="center")j.top+=k/2;j.left+=e[0];j.top+=e[1];return this.each(function(){var f=c(this),l=f.outerWidth(),m=f.outerHeight(),p=parseInt(c.curCSS(this,"marginLeft",true))||0,q=parseInt(c.curCSS(this,"marginTop",true))||0,v=l+p+(parseInt(c.curCSS(this,"marginRight",true))||0),w=m+q+(parseInt(c.curCSS(this,"marginBottom",true))||0),i=c.extend({},j),r;if(b.my[0]==="right")i.left-=l;else if(b.my[0]==="center")i.left-=l/2;if(b.my[1]==="bottom")i.top-=m;else if(b.my[1]==="center")i.top-=
+m/2;i.left=Math.round(i.left);i.top=Math.round(i.top);r={left:i.left-p,top:i.top-q};c.each(["left","top"],function(s,x){c.ui.position[g[s]]&&c.ui.position[g[s]][x](i,{targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(i,{using:b.using}))})};c.ui.position={fit:{left:function(b,a){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();b.left=
+d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0];b.left+=
+a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d=c(b),
+g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery);
+;/*
+ * jQuery UI Draggable 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Draggables
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.mouse.js
+ *     jquery.ui.widget.js
+ */
+(function(d){d.widget("ui.draggable",d.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper==
+"original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(a){var b=
+this.options;if(this.helper||b.disabled||d(a.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(a);if(!this.handle)return false;return true},_mouseStart:function(a){var b=this.options;this.helper=this._createHelper(a);this._cacheHelperProportions();if(d.ui.ddmanager)d.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-
+this.margins.top,left:this.offset.left-this.margins.left};d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this.position=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);b.containment&&this._setContainment();if(this._trigger("start",a)===false){this._clear();return false}this._cacheHelperProportions();
+d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(a,true);return true},_mouseDrag:function(a,b){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!b){b=this._uiHash();if(this._trigger("drag",a,b)===false){this._mouseUp({});return false}this.position=b.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||
+this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);return false},_mouseStop:function(a){var b=false;if(d.ui.ddmanager&&!this.options.dropBehaviour)b=d.ui.ddmanager.drop(this,a);if(this.dropped){b=this.dropped;this.dropped=false}if((!this.element[0]||!this.element[0].parentNode)&&this.options.helper=="original")return false;if(this.options.revert=="invalid"&&!b||this.options.revert=="valid"&&b||this.options.revert===true||d.isFunction(this.options.revert)&&
+this.options.revert.call(this.element,b)){var c=this;d(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){c._trigger("stop",a)!==false&&c._clear()})}else this._trigger("stop",a)!==false&&this._clear();return false},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(a){var b=!this.options.handle||!d(this.options.handle,this.element).length?true:false;d(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==
+a.target)b=true});return b},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a])):b.helper=="clone"?this.element.clone():this.element;a.parents("body").length||a.appendTo(b.appendTo=="parent"?this.element[0].parentNode:b.appendTo);a[0]!=this.element[0]&&!/(fixed|absolute)/.test(a.css("position"))&&a.css("position","absolute");return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||
+0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],
+this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-
+(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),
+height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[(a.containment=="document"?0:d(window).scrollLeft())-this.offset.relative.left-this.offset.parent.left,(a.containment=="document"?0:d(window).scrollTop())-this.offset.relative.top-this.offset.parent.top,(a.containment=="document"?0:d(window).scrollLeft())+d(a.containment=="document"?
+document:window).width()-this.helperProportions.width-this.margins.left,(a.containment=="document"?0:d(window).scrollTop())+(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)&&a.containment.constructor!=Array){var b=d(a.containment)[0];if(b){a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),
+10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0),a.top+(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0),a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),
+10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom]}}else if(a.containment.constructor==Array)this.containment=a.containment},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&
+d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],
+this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName),e=a.pageX,g=a.pageY;if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.left<this.containment[0])e=this.containment[0]+this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+this.offset.click.top;if(a.pageX-this.offset.click.left>this.containment[2])e=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=
+this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;e=this.originalPageX+Math.round((e-this.originalPageX)/b.grid[0])*b.grid[0];e=this.containment?!(e-this.offset.click.left<this.containment[0]||e-this.offset.click.left>this.containment[2])?
+e:!(e-this.offset.click.left<this.containment[0])?e-b.grid[0]:e+b.grid[0]:e}}return{top:g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop()),left:e-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():
+f?0:c.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove();this.helper=null;this.cancelHelperRemoval=false},_trigger:function(a,b,c){c=c||this._uiHash();d.ui.plugin.call(this,a,[b,c]);if(a=="drag")this.positionAbs=this._convertPositionTo("absolute");return d.Widget.prototype._trigger.call(this,a,b,c)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,
+offset:this.positionAbs}}});d.extend(d.ui.draggable,{version:"1.8.12"});d.ui.plugin.add("draggable","connectToSortable",{start:function(a,b){var c=d(this).data("draggable"),f=c.options,e=d.extend({},b,{item:c.element});c.sortables=[];d(f.connectToSortable).each(function(){var g=d.data(this,"sortable");if(g&&!g.options.disabled){c.sortables.push({instance:g,shouldRevert:g.options.revert});g.refreshPositions();g._trigger("activate",a,e)}})},stop:function(a,b){var c=d(this).data("draggable"),f=d.extend({},
+b,{item:c.element});d.each(c.sortables,function(){if(this.instance.isOver){this.instance.isOver=0;c.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert)this.instance.options.revert=true;this.instance._mouseStop(a);this.instance.options.helper=this.instance.options._helper;c.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})}else{this.instance.cancelHelperRemoval=false;this.instance._trigger("deactivate",a,f)}})},drag:function(a,b){var c=
+d(this).data("draggable"),f=this;d.each(c.sortables,function(){this.instance.positionAbs=c.positionAbs;this.instance.helperProportions=c.helperProportions;this.instance.offset.click=c.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;this.instance.currentItem=d(f).clone().appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return b.helper[0]};
+a.target=this.instance.currentItem[0];this.instance._mouseCapture(a,true);this.instance._mouseStart(a,true,true);this.instance.offset.click.top=c.offset.click.top;this.instance.offset.click.left=c.offset.click.left;this.instance.offset.parent.left-=c.offset.parent.left-this.instance.offset.parent.left;this.instance.offset.parent.top-=c.offset.parent.top-this.instance.offset.parent.top;c._trigger("toSortable",a);c.dropped=this.instance.element;c.currentItem=c.element;this.instance.fromOutside=c}this.instance.currentItem&&
+this.instance._mouseDrag(a)}else if(this.instance.isOver){this.instance.isOver=0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",a,this.instance._uiHash(this.instance));this.instance._mouseStop(a,true);this.instance.options.helper=this.instance.options._helper;this.instance.currentItem.remove();this.instance.placeholder&&this.instance.placeholder.remove();c._trigger("fromSortable",a);c.dropped=false}})}});d.ui.plugin.add("draggable","cursor",
+{start:function(){var a=d("body"),b=d(this).data("draggable").options;if(a.css("cursor"))b._cursor=a.css("cursor");a.css("cursor",b.cursor)},stop:function(){var a=d(this).data("draggable").options;a._cursor&&d("body").css("cursor",a._cursor)}});d.ui.plugin.add("draggable","iframeFix",{start:function(){var a=d(this).data("draggable").options;d(a.iframeFix===true?"iframe":a.iframeFix).each(function(){d('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+
+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(d(this).offset()).appendTo("body")})},stop:function(){d("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});d.ui.plugin.add("draggable","opacity",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("opacity"))b._opacity=a.css("opacity");a.css("opacity",b.opacity)},stop:function(a,b){a=d(this).data("draggable").options;a._opacity&&d(b.helper).css("opacity",
+a._opacity)}});d.ui.plugin.add("draggable","scroll",{start:function(){var a=d(this).data("draggable");if(a.scrollParent[0]!=document&&a.scrollParent[0].tagName!="HTML")a.overflowOffset=a.scrollParent.offset()},drag:function(a){var b=d(this).data("draggable"),c=b.options,f=false;if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!="HTML"){if(!c.axis||c.axis!="x")if(b.overflowOffset.top+b.scrollParent[0].offsetHeight-a.pageY<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop+
+c.scrollSpeed;else if(a.pageY-b.overflowOffset.top<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop-c.scrollSpeed;if(!c.axis||c.axis!="y")if(b.overflowOffset.left+b.scrollParent[0].offsetWidth-a.pageX<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft+c.scrollSpeed;else if(a.pageX-b.overflowOffset.left<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft-c.scrollSpeed}else{if(!c.axis||c.axis!="x")if(a.pageY-d(document).scrollTop()<
+c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()-c.scrollSpeed);else if(d(window).height()-(a.pageY-d(document).scrollTop())<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()+c.scrollSpeed);if(!c.axis||c.axis!="y")if(a.pageX-d(document).scrollLeft()<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()-c.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()+
+c.scrollSpeed)}f!==false&&d.ui.ddmanager&&!c.dropBehaviour&&d.ui.ddmanager.prepareOffsets(b,a)}});d.ui.plugin.add("draggable","snap",{start:function(){var a=d(this).data("draggable"),b=a.options;a.snapElements=[];d(b.snap.constructor!=String?b.snap.items||":data(draggable)":b.snap).each(function(){var c=d(this),f=c.offset();this!=a.element[0]&&a.snapElements.push({item:this,width:c.outerWidth(),height:c.outerHeight(),top:f.top,left:f.left})})},drag:function(a,b){for(var c=d(this).data("draggable"),
+f=c.options,e=f.snapTolerance,g=b.offset.left,n=g+c.helperProportions.width,m=b.offset.top,o=m+c.helperProportions.height,h=c.snapElements.length-1;h>=0;h--){var i=c.snapElements[h].left,k=i+c.snapElements[h].width,j=c.snapElements[h].top,l=j+c.snapElements[h].height;if(i-e<g&&g<k+e&&j-e<m&&m<l+e||i-e<g&&g<k+e&&j-e<o&&o<l+e||i-e<n&&n<k+e&&j-e<m&&m<l+e||i-e<n&&n<k+e&&j-e<o&&o<l+e){if(f.snapMode!="inner"){var p=Math.abs(j-o)<=e,q=Math.abs(l-m)<=e,r=Math.abs(i-n)<=e,s=Math.abs(k-g)<=e;if(p)b.position.top=
+c._convertPositionTo("relative",{top:j-c.helperProportions.height,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",{top:l,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:i-c.helperProportions.width}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:k}).left-c.margins.left}var t=p||q||r||s;if(f.snapMode!="outer"){p=Math.abs(j-m)<=e;q=Math.abs(l-o)<=e;r=Math.abs(i-g)<=e;s=Math.abs(k-n)<=e;if(p)b.position.top=
+c._convertPositionTo("relative",{top:j,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",{top:l-c.helperProportions.height,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:i}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:k-c.helperProportions.width}).left-c.margins.left}if(!c.snapElements[h].snapping&&(p||q||r||s||t))c.options.snap.snap&&c.options.snap.snap.call(c.element,a,d.extend(c._uiHash(),
+{snapItem:c.snapElements[h].item}));c.snapElements[h].snapping=p||q||r||s||t}else{c.snapElements[h].snapping&&c.options.snap.release&&c.options.snap.release.call(c.element,a,d.extend(c._uiHash(),{snapItem:c.snapElements[h].item}));c.snapElements[h].snapping=false}}}});d.ui.plugin.add("draggable","stack",{start:function(){var a=d(this).data("draggable").options;a=d.makeArray(d(a.stack)).sort(function(c,f){return(parseInt(d(c).css("zIndex"),10)||0)-(parseInt(d(f).css("zIndex"),10)||0)});if(a.length){var b=
+parseInt(a[0].style.zIndex)||0;d(a).each(function(c){this.style.zIndex=b+c});this[0].style.zIndex=b+a.length}}});d.ui.plugin.add("draggable","zIndex",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("zIndex"))b._zIndex=a.css("zIndex");a.css("zIndex",b.zIndex)},stop:function(a,b){a=d(this).data("draggable").options;a._zIndex&&d(b.helper).css("zIndex",a._zIndex)}})})(jQuery);
+;/*
+ * jQuery UI Droppable 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Droppables
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.widget.js
+ *     jquery.ui.mouse.js
+ *     jquery.ui.draggable.js
+ */
+(function(d){d.widget("ui.droppable",{widgetEventPrefix:"drop",options:{accept:"*",activeClass:false,addClasses:true,greedy:false,hoverClass:false,scope:"default",tolerance:"intersect"},_create:function(){var a=this.options,b=a.accept;this.isover=0;this.isout=1;this.accept=d.isFunction(b)?b:function(c){return c.is(b)};this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};d.ui.ddmanager.droppables[a.scope]=d.ui.ddmanager.droppables[a.scope]||[];d.ui.ddmanager.droppables[a.scope].push(this);
+a.addClasses&&this.element.addClass("ui-droppable")},destroy:function(){for(var a=d.ui.ddmanager.droppables[this.options.scope],b=0;b<a.length;b++)a[b]==this&&a.splice(b,1);this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable");return this},_setOption:function(a,b){if(a=="accept")this.accept=d.isFunction(b)?b:function(c){return c.is(b)};d.Widget.prototype._setOption.apply(this,arguments)},_activate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&&
+this.element.addClass(this.options.activeClass);b&&this._trigger("activate",a,this.ui(b))},_deactivate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass);b&&this._trigger("deactivate",a,this.ui(b))},_over:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.addClass(this.options.hoverClass);
+this._trigger("over",a,this.ui(b))}},_out:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("out",a,this.ui(b))}},_drop:function(a,b){var c=b||d.ui.ddmanager.current;if(!c||(c.currentItem||c.element)[0]==this.element[0])return false;var e=false;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var g=
+d.data(this,"droppable");if(g.options.greedy&&!g.options.disabled&&g.options.scope==c.options.scope&&g.accept.call(g.element[0],c.currentItem||c.element)&&d.ui.intersect(c,d.extend(g,{offset:g.element.offset()}),g.options.tolerance)){e=true;return false}});if(e)return false;if(this.accept.call(this.element[0],c.currentItem||c.element)){this.options.activeClass&&this.element.removeClass(this.options.activeClass);this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("drop",
+a,this.ui(c));return this.element}return false},ui:function(a){return{draggable:a.currentItem||a.element,helper:a.helper,position:a.position,offset:a.positionAbs}}});d.extend(d.ui.droppable,{version:"1.8.12"});d.ui.intersect=function(a,b,c){if(!b.offset)return false;var e=(a.positionAbs||a.position.absolute).left,g=e+a.helperProportions.width,f=(a.positionAbs||a.position.absolute).top,h=f+a.helperProportions.height,i=b.offset.left,k=i+b.proportions.width,j=b.offset.top,l=j+b.proportions.height;
+switch(c){case "fit":return i<=e&&g<=k&&j<=f&&h<=l;case "intersect":return i<e+a.helperProportions.width/2&&g-a.helperProportions.width/2<k&&j<f+a.helperProportions.height/2&&h-a.helperProportions.height/2<l;case "pointer":return d.ui.isOver((a.positionAbs||a.position.absolute).top+(a.clickOffset||a.offset.click).top,(a.positionAbs||a.position.absolute).left+(a.clickOffset||a.offset.click).left,j,i,b.proportions.height,b.proportions.width);case "touch":return(f>=j&&f<=l||h>=j&&h<=l||f<j&&h>l)&&(e>=
+i&&e<=k||g>=i&&g<=k||e<i&&g>k);default:return false}};d.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(a,b){var c=d.ui.ddmanager.droppables[a.options.scope]||[],e=b?b.type:null,g=(a.currentItem||a.element).find(":data(droppable)").andSelf(),f=0;a:for(;f<c.length;f++)if(!(c[f].options.disabled||a&&!c[f].accept.call(c[f].element[0],a.currentItem||a.element))){for(var h=0;h<g.length;h++)if(g[h]==c[f].element[0]){c[f].proportions.height=0;continue a}c[f].visible=c[f].element.css("display")!=
+"none";if(c[f].visible){e=="mousedown"&&c[f]._activate.call(c[f],b);c[f].offset=c[f].element.offset();c[f].proportions={width:c[f].element[0].offsetWidth,height:c[f].element[0].offsetHeight}}}},drop:function(a,b){var c=false;d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(this.options){if(!this.options.disabled&&this.visible&&d.ui.intersect(a,this,this.options.tolerance))c=c||this._drop.call(this,b);if(!this.options.disabled&&this.visible&&this.accept.call(this.element[0],a.currentItem||
+a.element)){this.isout=1;this.isover=0;this._deactivate.call(this,b)}}});return c},drag:function(a,b){a.options.refreshPositions&&d.ui.ddmanager.prepareOffsets(a,b);d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(!(this.options.disabled||this.greedyChild||!this.visible)){var c=d.ui.intersect(a,this,this.options.tolerance);if(c=!c&&this.isover==1?"isout":c&&this.isover==0?"isover":null){var e;if(this.options.greedy){var g=this.element.parents(":data(droppable):eq(0)");if(g.length){e=
+d.data(g[0],"droppable");e.greedyChild=c=="isover"?1:0}}if(e&&c=="isover"){e.isover=0;e.isout=1;e._out.call(e,b)}this[c]=1;this[c=="isout"?"isover":"isout"]=0;this[c=="isover"?"_over":"_out"].call(this,b);if(e&&c=="isout"){e.isout=0;e.isover=1;e._over.call(e,b)}}}})}}})(jQuery);
+;/*
+ * jQuery UI Resizable 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.mouse.js
+ *     jquery.ui.widget.js
+ */
+(function(e){e.widget("ui.resizable",e.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1E3},_create:function(){var b=this,a=this.options;this.element.addClass("ui-resizable");e.extend(this,{_aspectRatio:!!a.aspectRatio,aspectRatio:a.aspectRatio,originalElement:this.element,
+_proportionallyResizeElements:[],_helper:a.helper||a.ghost||a.animate?a.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){/relative/.test(this.element.css("position"))&&e.browser.opera&&this.element.css({position:"relative",top:"auto",left:"auto"});this.element.wrap(e('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),
+top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=
+this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!e(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",
+nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var c=this.handles.split(",");this.handles={};for(var d=0;d<c.length;d++){var f=e.trim(c[d]),g=e('<div class="ui-resizable-handle '+("ui-resizable-"+f)+'"></div>');/sw|se|ne|nw/.test(f)&&g.css({zIndex:++a.zIndex});"se"==f&&g.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[f]=".ui-resizable-"+f;this.element.append(g)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor==
+String)this.handles[i]=e(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=e(this.handles[i],this.element),k=0;k=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,k);this._proportionallyResize()}e(this.handles[i])}};this._renderAxis(this.element);this._handles=e(".ui-resizable-handle",this.element).disableSelection();
+this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();e(this.element).addClass("ui-resizable-autohide").hover(function(){e(this).removeClass("ui-resizable-autohide");b._handles.show()},function(){if(!b.resizing){e(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(c){e(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};
+if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a=false;for(var c in this.handles)if(e(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(),
+d=this.element;this.resizing=true;this.documentScroll={top:e(document).scrollTop(),left:e(document).scrollLeft()};if(d.is(".ui-draggable")||/absolute/.test(d.css("position")))d.css({position:"absolute",top:c.top,left:c.left});e.browser.opera&&/relative/.test(d.css("position"))&&d.css({position:"relative",top:"auto",left:"auto"});this._renderProxy();c=m(this.helper.css("left"));var f=m(this.helper.css("top"));if(a.containment){c+=e(a.containment).scrollLeft()||0;f+=e(a.containment).scrollTop()||0}this.offset=
+this.helper.offset();this.position={left:c,top:f};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:c,top:f};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio:
+this.originalSize.width/this.originalSize.height||1;a=e(".ui-resizable-"+this.axis).css("cursor");e("body").css("cursor",a=="auto"?this.axis+"-resize":a);d.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,d=this._change[this.axis];if(!d)return false;c=d.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize",
+b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false},_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var d=this._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName);d=f&&e.ui.hasScroll(d[0],"left")?0:c.sizeDiff.height;
+f=f?0:c.sizeDiff.width;f={width:c.helper.width()-f,height:c.helper.height()-d};d=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var g=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(e.extend(f,{top:g,left:d}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}e("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");
+this._propagate("stop",b);this._helper&&this.helper.remove();return false},_updateCache:function(b){this.offset=this.helper.offset();if(l(b.left))this.position.left=b.left;if(l(b.top))this.position.top=b.top;if(l(b.height))this.size.height=b.height;if(l(b.width))this.size.width=b.width},_updateRatio:function(b){var a=this.position,c=this.size,d=this.axis;if(b.height)b.width=c.height*this.aspectRatio;else if(b.width)b.height=c.width/this.aspectRatio;if(d=="sw"){b.left=a.left+(c.width-b.width);b.top=
+null}if(d=="nw"){b.top=a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this.options,c=this.axis,d=l(b.width)&&a.maxWidth&&a.maxWidth<b.width,f=l(b.height)&&a.maxHeight&&a.maxHeight<b.height,g=l(b.width)&&a.minWidth&&a.minWidth>b.width,h=l(b.height)&&a.minHeight&&a.minHeight>b.height;if(g)b.width=a.minWidth;if(h)b.height=a.minHeight;if(d)b.width=a.maxWidth;if(f)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+
+this.size.height,k=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(g&&k)b.left=i-a.minWidth;if(d&&k)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(f&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a<this._proportionallyResizeElements.length;a++){var c=this._proportionallyResizeElements[a];if(!this.borderDif){var d=
+[c.css("borderTopWidth"),c.css("borderRightWidth"),c.css("borderBottomWidth"),c.css("borderLeftWidth")],f=[c.css("paddingTop"),c.css("paddingRight"),c.css("paddingBottom"),c.css("paddingLeft")];this.borderDif=e.map(d,function(g,h){g=parseInt(g,10)||0;h=parseInt(f[h],10)||0;return g+h})}e.browser.msie&&(e(b).is(":hidden")||e(b).parents(":hidden").length)||c.css({height:b.height()-this.borderDif[0]-this.borderDif[2]||0,width:b.width()-this.borderDif[1]-this.borderDif[3]||0})}},_renderProxy:function(){var b=
+this.options;this.elementOffset=this.element.offset();if(this._helper){this.helper=this.helper||e('<div style="overflow:hidden;"></div>');var a=e.browser.msie&&e.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,
+a){return{width:this.originalSize.width+a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+c}},se:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,
+c]))},ne:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){e.ui.plugin.call(this,b,[a,this.ui()]);b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,
+originalPosition:this.originalPosition}}});e.extend(e.ui.resizable,{version:"1.8.12"});e.ui.plugin.add("resizable","alsoResize",{start:function(){var b=e(this).data("resizable").options,a=function(c){e(c).each(function(){var d=e(this);d.data("resizable-alsoresize",{width:parseInt(d.width(),10),height:parseInt(d.height(),10),left:parseInt(d.css("left"),10),top:parseInt(d.css("top"),10),position:d.css("position")})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=
+b.alsoResize[0];a(b.alsoResize)}else e.each(b.alsoResize,function(c){a(c)});else a(b.alsoResize)},resize:function(b,a){var c=e(this).data("resizable");b=c.options;var d=c.originalSize,f=c.originalPosition,g={height:c.size.height-d.height||0,width:c.size.width-d.width||0,top:c.position.top-f.top||0,left:c.position.left-f.left||0},h=function(i,j){e(i).each(function(){var k=e(this),q=e(this).data("resizable-alsoresize"),p={},r=j&&j.length?j:k.parents(a.originalElement[0]).length?["width","height"]:["width",
+"height","top","left"];e.each(r,function(n,o){if((n=(q[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(e.browser.opera&&/relative/.test(k.css("position"))){c._revertToRelativePosition=true;k.css({position:"absolute",top:"auto",left:"auto"})}k.css(p)})};typeof b.alsoResize=="object"&&!b.alsoResize.nodeType?e.each(b.alsoResize,function(i,j){h(i,j)}):h(b.alsoResize)},stop:function(){var b=e(this).data("resizable"),a=b.options,c=function(d){e(d).each(function(){var f=e(this);f.css({position:f.data("resizable-alsoresize").position})})};
+if(b._revertToRelativePosition){b._revertToRelativePosition=false;typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?e.each(a.alsoResize,function(d){c(d)}):c(a.alsoResize)}e(this).removeData("resizable-alsoresize")}});e.ui.plugin.add("resizable","animate",{stop:function(b){var a=e(this).data("resizable"),c=a.options,d=a._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName),g=f&&e.ui.hasScroll(d[0],"left")?0:a.sizeDiff.height;f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height-
+g};g=parseInt(a.element.css("left"),10)+(a.position.left-a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(e.extend(f,h&&g?{top:h,left:g}:{}),{duration:c.animateDuration,easing:c.animateEasing,step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};d&&d.length&&e(d[0]).css({width:i.width,
+height:i.height});a._updateCache(i);a._propagate("resize",b)}})}});e.ui.plugin.add("resizable","containment",{start:function(){var b=e(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof e?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement=e(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}}else{var d=
+e(a),f=[];e(["Top","Right","Left","Bottom"]).each(function(i,j){f[i]=m(d.css("padding"+j))});b.containerOffset=d.offset();b.containerPosition=d.position();b.containerSize={height:d.innerHeight()-f[3],width:d.innerWidth()-f[1]};c=b.containerOffset;var g=b.containerSize.height,h=b.containerSize.width;h=e.ui.hasScroll(a,"left")?a.scrollWidth:h;g=e.ui.hasScroll(a)?a.scrollHeight:g;b.parentData={element:a,left:c.left,top:c.top,width:h,height:g}}}},resize:function(b){var a=e(this).data("resizable"),c=a.options,
+d=a.containerOffset,f=a.position;b=a._aspectRatio||b.shiftKey;var g={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))g=d;if(f.left<(a._helper?d.left:0)){a.size.width+=a._helper?a.position.left-d.left:a.position.left-g.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?d.left:0}if(f.top<(a._helper?d.top:0)){a.size.height+=a._helper?a.position.top-d.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?
+d.top:0}a.offset.left=a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-g.left:a.offset.left-g.left)+a.sizeDiff.width);d=Math.abs((a._helper?a.offset.top-g.top:a.offset.top-d.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);g=/relative|absolute/.test(a.containerElement.css("position"));if(f&&g)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=
+a.size.width/a.aspectRatio}if(d+a.size.height>=a.parentData.height){a.size.height=a.parentData.height-d;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=e(this).data("resizable"),a=b.options,c=b.containerOffset,d=b.containerPosition,f=b.containerElement,g=e(b.helper),h=g.offset(),i=g.outerWidth()-b.sizeDiff.width;g=g.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g});b._helper&&!a.animate&&
+/static/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g})}});e.ui.plugin.add("resizable","ghost",{start:function(){var b=e(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25,display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=e(this).data("resizable");
+b.ghost&&b.ghost.css({position:"relative",height:b.size.height,width:b.size.width})},stop:function(){var b=e(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});e.ui.plugin.add("resizable","grid",{resize:function(){var b=e(this).data("resizable"),a=b.options,c=b.size,d=b.originalSize,f=b.originalPosition,g=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-d.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-d.height)/
+(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else if(/^(ne)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}else{if(/^(sw)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else{b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}b.position.left=f.left-h}}});var m=function(b){return parseInt(b,10)||0},l=function(b){return!isNaN(parseInt(b,10))}})(jQuery);
+;/*
+ * jQuery UI Selectable 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectables
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.mouse.js
+ *     jquery.ui.widget.js
+ */
+(function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var c=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(c.options.filter,c.element[0]);f.each(function(){var d=e(this),b=d.offset();e.data(this,"selectable-item",{element:this,$element:d,left:b.left,top:b.top,right:b.left+d.outerWidth(),bottom:b.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"),
+selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e("<div class='ui-selectable-helper'></div>")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(c){var f=this;this.opos=[c.pageX,
+c.pageY];if(!this.options.disabled){var d=this.options;this.selectees=e(d.filter,this.element[0]);this._trigger("start",c);e(d.appendTo).append(this.helper);this.helper.css({left:c.clientX,top:c.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!c.metaKey){b.$element.removeClass("ui-selected");b.selected=false;b.$element.addClass("ui-unselecting");b.unselecting=true;f._trigger("unselecting",
+c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){var g=!c.metaKey||!b.$element.hasClass("ui-selected");b.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");b.unselecting=!g;b.selecting=g;(b.selected=g)?f._trigger("selecting",c,{selecting:b.element}):f._trigger("unselecting",c,{unselecting:b.element});return false}})}},_mouseDrag:function(c){var f=this;this.dragged=true;if(!this.options.disabled){var d=
+this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.right<b||a.top>i||a.bottom<g);else if(d.tolerance=="fit")k=a.left>b&&a.right<h&&a.top>g&&a.bottom<i;if(k){if(a.selected){a.$element.removeClass("ui-selected");a.selected=false}if(a.unselecting){a.$element.removeClass("ui-unselecting");
+a.unselecting=false}if(!a.selecting){a.$element.addClass("ui-selecting");a.selecting=true;f._trigger("selecting",c,{selecting:a.element})}}else{if(a.selecting)if(c.metaKey&&a.startselected){a.$element.removeClass("ui-selecting");a.selecting=false;a.$element.addClass("ui-selected");a.selected=true}else{a.$element.removeClass("ui-selecting");a.selecting=false;if(a.startselected){a.$element.addClass("ui-unselecting");a.unselecting=true}f._trigger("unselecting",c,{unselecting:a.element})}if(a.selected)if(!c.metaKey&&
+!a.startselected){a.$element.removeClass("ui-selected");a.selected=false;a.$element.addClass("ui-unselecting");a.unselecting=true;f._trigger("unselecting",c,{unselecting:a.element})}}}});return false}},_mouseStop:function(c){var f=this;this.dragged=false;e(".ui-unselecting",this.element[0]).each(function(){var d=e.data(this,"selectable-item");d.$element.removeClass("ui-unselecting");d.unselecting=false;d.startselected=false;f._trigger("unselected",c,{unselected:d.element})});e(".ui-selecting",this.element[0]).each(function(){var d=
+e.data(this,"selectable-item");d.$element.removeClass("ui-selecting").addClass("ui-selected");d.selecting=false;d.selected=true;d.startselected=true;f._trigger("selected",c,{selected:d.element})});this._trigger("stop",c);this.helper.remove();return false}});e.extend(e.ui.selectable,{version:"1.8.12"})})(jQuery);
+;/*
+ * jQuery UI Sortable 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Sortables
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.mouse.js
+ *     jquery.ui.widget.js
+ */
+(function(d){d.widget("ui.sortable",d.ui.mouse,{widgetEventPrefix:"sort",options:{appendTo:"parent",axis:false,connectWith:false,containment:false,cursor:"auto",cursorAt:false,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:"original",items:"> *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){this.containerCache={};this.element.addClass("ui-sortable");
+this.refresh();this.floating=this.items.length?/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData("sortable-item");return this},_setOption:function(a,b){if(a==="disabled"){this.options[a]=
+b;this.widget()[b?"addClass":"removeClass"]("ui-sortable-disabled")}else d.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(a,b){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(a);var c=null,e=this;d(a.target).parents().each(function(){if(d.data(this,"sortable-item")==e){c=d(this);return false}});if(d.data(a.target,"sortable-item")==e)c=d(a.target);if(!c)return false;if(this.options.handle&&!b){var f=false;
+d(this.options.handle,c).find("*").andSelf().each(function(){if(this==a.target)f=true});if(!f)return false}this.currentItem=c;this._removeCurrentsFromItems();return true},_mouseStart:function(a,b,c){b=this.options;var e=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-
+this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};
+this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();b.containment&&this._setContainment();if(b.cursor){if(d("body").css("cursor"))this._storedCursor=d("body").css("cursor");d("body").css("cursor",b.cursor)}if(b.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",b.opacity)}if(b.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",b.zIndex)}if(this.scrollParent[0]!=
+document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start",a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",a,e._uiHash(this));if(d.ui.ddmanager)d.ui.ddmanager.current=this;d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a);
+return true},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var b=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageY<b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop+b.scrollSpeed;else if(a.pageY-this.overflowOffset.top<
+b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop-b.scrollSpeed;if(this.overflowOffset.left+this.scrollParent[0].offsetWidth-a.pageX<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft+b.scrollSpeed;else if(a.pageX-this.overflowOffset.left<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft-b.scrollSpeed}else{if(a.pageY-d(document).scrollTop()<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()-
+b.scrollSpeed);else if(d(window).height()-(a.pageY-d(document).scrollTop())<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()+b.scrollSpeed);if(a.pageX-d(document).scrollLeft()<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()-b.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()+b.scrollSpeed)}c!==false&&d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,
+a)}this.positionAbs=this._convertPositionTo("absolute");if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";for(b=this.items.length-1;b>=0;b--){c=this.items[b];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!d.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!d.ui.contains(this.element[0],
+e):true)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(a,c);else break;this._trigger("change",a,this._uiHash());break}}this._contactContainers(a);d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);this._trigger("sort",a,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(a,b){if(a){d.ui.ddmanager&&!this.options.dropBehaviour&&d.ui.ddmanager.drop(this,a);if(this.options.revert){var c=this;b=c.placeholder.offset();
+c.reverting=true;d(this.helper).animate({left:b.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:b.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(a)})}else this._clear(a,b);return false}},cancel:function(){var a=this;if(this.dragging){this._mouseUp({target:null});this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):
+this.currentItem.show();for(var b=this.containers.length-1;b>=0;b--){this.containers[b]._trigger("deactivate",null,a._uiHash(this));if(this.containers[b].containerCache.over){this.containers[b]._trigger("out",null,a._uiHash(this));this.containers[b].containerCache.over=0}}}if(this.placeholder){this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();d.extend(this,{helper:null,
+dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?d(this.domPosition.prev).after(this.currentItem):d(this.domPosition.parent).prepend(this.currentItem)}return this},serialize:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};d(b).each(function(){var e=(d(a.item||this).attr(a.attribute||"id")||"").match(a.expression||/(.+)[-=_](.+)/);if(e)c.push((a.key||e[1]+"[]")+"="+(a.key&&a.expression?e[1]:e[2]))});!c.length&&a.key&&c.push(a.key+"=");return c.join("&")},
+toArray:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};b.each(function(){c.push(d(a.item||this).attr(a.attribute||"id")||"")});return c},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,g=a.left,h=g+a.width,i=a.top,k=i+a.height,j=this.offset.click.top,l=this.offset.click.left;j=e+j>i&&e+j<k&&b+l>g&&b+l<h;return this.options.tolerance=="pointer"||this.options.forcePointerForContainers||
+this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>a[this.floating?"width":"height"]?j:g<b+this.helperProportions.width/2&&c-this.helperProportions.width/2<h&&i<e+this.helperProportions.height/2&&f-this.helperProportions.height/2<k},_intersectsWithPointer:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left,a.width);b=b&&a;a=this._getDragVerticalDirection();
+var c=this._getDragHorizontalDirection();if(!b)return false;return this.floating?c&&c=="right"||a=="down"?2:1:a&&(a=="down"?2:1)},_intersectsWithSides:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top+a.height/2,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left+a.width/2,a.width);var c=this._getDragVerticalDirection(),e=this._getDragHorizontalDirection();return this.floating&&e?e=="right"&&a||e=="left"&&!a:c&&(c=="down"&&b||c=="up"&&!b)},
+_getDragVerticalDirection:function(){var a=this.positionAbs.top-this.lastPositionAbs.top;return a!=0&&(a>0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a);this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(a){var b=[],c=[],e=this._connectWith();
+if(e&&a)for(a=e.length-1;a>=0;a--)for(var f=d(e[a]),g=f.length-1;g>=0;g--){var h=d.data(f[g],"sortable");if(h&&h!=this&&!h.options.disabled)c.push([d.isFunction(h.options.items)?h.options.items.call(h.element):d(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}c.push([d.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):d(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),
+this]);for(a=c.length-1;a>=0;a--)c[a][0].each(function(){b.push(this)});return d(b)},_removeCurrentsFromItems:function(){for(var a=this.currentItem.find(":data(sortable-item)"),b=0;b<this.items.length;b++)for(var c=0;c<a.length;c++)a[c]==this.items[b].item[0]&&this.items.splice(b,1)},_refreshItems:function(a){this.items=[];this.containers=[this];var b=this.items,c=[[d.isFunction(this.options.items)?this.options.items.call(this.element[0],a,{item:this.currentItem}):d(this.options.items,this.element),
+this]],e=this._connectWith();if(e)for(var f=e.length-1;f>=0;f--)for(var g=d(e[f]),h=g.length-1;h>=0;h--){var i=d.data(g[h],"sortable");if(i&&i!=this&&!i.options.disabled){c.push([d.isFunction(i.options.items)?i.options.items.call(i.element[0],a,{item:this.currentItem}):d(i.options.items,i.element),i]);this.containers.push(i)}}for(f=c.length-1;f>=0;f--){a=c[f][1];e=c[f][0];h=0;for(g=e.length;h<g;h++){i=d(e[h]);i.data("sortable-item",a);b.push({item:i,instance:a,width:0,height:0,left:0,top:0})}}},refreshPositions:function(a){if(this.offsetParent&&
+this.helper)this.offset.parent=this._getParentOffset();for(var b=this.items.length-1;b>=0;b--){var c=this.items[b];if(!(c.instance!=this.currentContainer&&this.currentContainer&&c.item[0]!=this.currentItem[0])){var e=this.options.toleranceElement?d(this.options.toleranceElement,c.item):c.item;if(!a){c.width=e.outerWidth();c.height=e.outerHeight()}e=e.offset();c.left=e.left;c.top=e.top}}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(b=
+this.containers.length-1;b>=0;b--){e=this.containers[b].element.offset();this.containers[b].containerCache.left=e.left;this.containers[b].containerCache.top=e.top;this.containers[b].containerCache.width=this.containers[b].element.outerWidth();this.containers[b].containerCache.height=this.containers[b].element.outerHeight()}return this},_createPlaceholder:function(a){var b=a||this,c=b.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f=
+d(document.createElement(b.currentItem[0].nodeName)).addClass(e||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!e)f.style.visibility="hidden";return f},update:function(f,g){if(!(e&&!c.forcePlaceholderSize)){g.height()||g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10));g.width()||g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")||
+0,10))}}}}b.placeholder=d(c.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);c.placeholder.update(b,b.placeholder)},_contactContainers:function(a){for(var b=null,c=null,e=this.containers.length-1;e>=0;e--)if(!d.ui.contains(this.currentItem[0],this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(b&&d.ui.contains(this.containers[e].element[0],b.element[0]))){b=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out",
+a,this._uiHash(this));this.containers[e].containerCache.over=0}if(b)if(this.containers.length===1){this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){b=1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],g=this.items.length-1;g>=0;g--)if(d.ui.contains(this.containers[c].element[0],this.items[g].item[0])){var h=this.items[g][this.containers[c].floating?"left":"top"];if(Math.abs(h-
+f)<b){b=Math.abs(h-f);e=this.items[g]}}if(e||this.options.dropOnEmpty){this.currentContainer=this.containers[c];e?this._rearrange(a,e,null,true):this._rearrange(a,null,this.containers[c].element,true);this._trigger("change",a,this._uiHash());this.containers[c]._trigger("change",a,this._uiHash(this));this.options.placeholder.update(this.currentContainer,this.placeholder);this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}}},_createHelper:function(a){var b=
+this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a,this.currentItem])):b.helper=="clone"?this.currentItem.clone():this.currentItem;a.parents("body").length||d(b.appendTo!="parent"?b.appendTo:this.currentItem[0].parentNode)[0].appendChild(a[0]);if(a[0]==this.currentItem[0])this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")};if(a[0].style.width==
+""||b.forceHelperSize)a.width(this.currentItem.width());if(a[0].style.height==""||b.forceHelperSize)a.height(this.currentItem.height());return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=
+this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a=
+{top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.currentItem.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),
+10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,d(a.containment=="document"?
+document:window).width()-this.helperProportions.width-this.margins.left,(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)){var b=d(a.containment)[0];a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"),
+10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(a,b){if(!b)b=
+this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&
+this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0]))this.offset.relative=this._getRelativeOffset();
+var f=a.pageX,g=a.pageY;if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.left<this.containment[0])f=this.containment[0]+this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+this.offset.click.top;if(a.pageX-this.offset.click.left>this.containment[2])f=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-
+this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;f=this.originalPageX+Math.round((f-this.originalPageX)/b.grid[0])*b.grid[0];f=this.containment?!(f-this.offset.click.left<this.containment[0]||f-this.offset.click.left>this.containment[2])?f:!(f-this.offset.click.left<this.containment[0])?f-b.grid[0]:f+b.grid[0]:f}}return{top:g-
+this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:c.scrollTop()),left:f-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:c.scrollLeft())}},_rearrange:function(a,b,c,e){c?c[0].appendChild(this.placeholder[0]):b.item[0].parentNode.insertBefore(this.placeholder[0],
+this.direction=="down"?b.item[0]:b.item[0].nextSibling);this.counter=this.counter?++this.counter:1;var f=this,g=this.counter;window.setTimeout(function(){g==f.counter&&f.refreshPositions(!e)},0)},_clear:function(a,b){this.reverting=false;var c=[];!this._noFinalSort&&this.currentItem[0].parentNode&&this.placeholder.before(this.currentItem);this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var e in this._storedCSS)if(this._storedCSS[e]=="auto"||this._storedCSS[e]=="static")this._storedCSS[e]=
+"";this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();this.fromOutside&&!b&&c.push(function(f){this._trigger("receive",f,this._uiHash(this.fromOutside))});if((this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0])&&!b)c.push(function(f){this._trigger("update",f,this._uiHash())});if(!d.ui.contains(this.element[0],this.currentItem[0])){b||c.push(function(f){this._trigger("remove",
+f,this._uiHash())});for(e=this.containers.length-1;e>=0;e--)if(d.ui.contains(this.containers[e].element[0],this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive",g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update",g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this,
+this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out",g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over=0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop",
+a,this._uiHash());for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}return false}b||this._trigger("beforeStop",a,this._uiHash());this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.helper[0]!=this.currentItem[0]&&this.helper.remove();this.helper=null;if(!b){for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}this.fromOutside=false;return true},_trigger:function(){d.Widget.prototype._trigger.apply(this,arguments)===false&&this.cancel()},
+_uiHash:function(a){var b=a||this;return{helper:b.helper,placeholder:b.placeholder||d([]),position:b.position,originalPosition:b.originalPosition,offset:b.positionAbs,item:b.currentItem,sender:a?a.element:null}}});d.extend(d.ui.sortable,{version:"1.8.12"})})(jQuery);
+;/*
+ * jQuery UI Accordion 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.widget.js
+ */
+(function(c){c.widget("ui.accordion",{options:{active:0,animated:"slide",autoHeight:true,clearStyle:false,collapsible:false,event:"click",fillSpace:false,header:"> li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var a=this,b=a.options;a.running=0;a.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix");
+a.headers=a.element.find(b.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){b.disabled||c(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){b.disabled||c(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){b.disabled||c(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){b.disabled||c(this).removeClass("ui-state-focus")});a.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");
+if(b.navigation){var d=a.element.find("a").filter(b.navigationFilter).eq(0);if(d.length){var h=d.closest(".ui-accordion-header");a.active=h.length?h:d.closest(".ui-accordion-content").prev()}}a.active=a._findActive(a.active||b.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");a.active.next().addClass("ui-accordion-content-active");a._createIcons();a.resize();a.element.attr("role","tablist");a.headers.attr("role","tab").bind("keydown.accordion",
+function(f){return a._keydown(f)}).next().attr("role","tabpanel");a.headers.not(a.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide();a.active.length?a.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):a.headers.eq(0).attr("tabIndex",0);c.browser.safari||a.headers.find("a").attr("tabIndex",-1);b.event&&a.headers.bind(b.event.split(" ").join(".accordion ")+".accordion",function(f){a._clickHandler.call(a,f,this);f.preventDefault()})},_createIcons:function(){var a=
+this.options;if(a.icons){c("<span></span>").addClass("ui-icon "+a.icons.header).prependTo(this.headers);this.active.children(".ui-icon").toggleClass(a.icons.header).toggleClass(a.icons.headerSelected);this.element.addClass("ui-accordion-icons")}},_destroyIcons:function(){this.headers.children(".ui-icon").remove();this.element.removeClass("ui-accordion-icons")},destroy:function(){var a=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("tabIndex");
+this.headers.find("a").removeAttr("tabIndex");this._destroyIcons();var b=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");if(a.autoHeight||a.fillHeight)b.css("height","");return c.Widget.prototype.destroy.call(this)},_setOption:function(a,b){c.Widget.prototype._setOption.apply(this,arguments);a=="active"&&this.activate(b);if(a=="icons"){this._destroyIcons();
+b&&this._createIcons()}if(a=="disabled")this.headers.add(this.headers.next())[b?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(a){if(!(this.options.disabled||a.altKey||a.ctrlKey)){var b=c.ui.keyCode,d=this.headers.length,h=this.headers.index(a.target),f=false;switch(a.keyCode){case b.RIGHT:case b.DOWN:f=this.headers[(h+1)%d];break;case b.LEFT:case b.UP:f=this.headers[(h-1+d)%d];break;case b.SPACE:case b.ENTER:this._clickHandler({target:a.target},a.target);
+a.preventDefault()}if(f){c(a.target).attr("tabIndex",-1);c(f).attr("tabIndex",0);f.focus();return false}return true}},resize:function(){var a=this.options,b;if(a.fillSpace){if(c.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}b=this.element.parent().height();c.browser.msie&&this.element.parent().css("overflow",d);this.headers.each(function(){b-=c(this).outerHeight(true)});this.headers.next().each(function(){c(this).height(Math.max(0,b-c(this).innerHeight()+
+c(this).height()))}).css("overflow","auto")}else if(a.autoHeight){b=0;this.headers.next().each(function(){b=Math.max(b,c(this).height("").height())}).height(b)}return this},activate:function(a){this.options.active=a;a=this._findActive(a)[0];this._clickHandler({target:a},a);return this},_findActive:function(a){return a?typeof a==="number"?this.headers.filter(":eq("+a+")"):this.headers.not(this.headers.not(a)):a===false?c([]):this.headers.filter(":eq(0)")},_clickHandler:function(a,b){var d=this.options;
+if(!d.disabled)if(a.target){a=c(a.currentTarget||b);b=a[0]===this.active[0];d.active=d.collapsible&&b?false:this.headers.index(a);if(!(this.running||!d.collapsible&&b)){var h=this.active;j=a.next();g=this.active.next();e={options:d,newHeader:b&&d.collapsible?c([]):a,oldHeader:this.active,newContent:b&&d.collapsible?c([]):j,oldContent:g};var f=this.headers.index(this.active[0])>this.headers.index(a[0]);this.active=b?c([]):a;this._toggle(j,g,e,b,f);h.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);
+if(!b){a.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected);a.next().addClass("ui-accordion-content-active")}}}else if(d.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);this.active.next().addClass("ui-accordion-content-active");var g=this.active.next(),
+e={options:d,newHeader:c([]),oldHeader:d.active,newContent:c([]),oldContent:g},j=this.active=c([]);this._toggle(j,g,e)}},_toggle:function(a,b,d,h,f){var g=this,e=g.options;g.toShow=a;g.toHide=b;g.data=d;var j=function(){if(g)return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data);g.running=b.size()===0?a.size():b.size();if(e.animated){d={};d=e.collapsible&&h?{toShow:c([]),toHide:b,complete:j,down:f,autoHeight:e.autoHeight||e.fillSpace}:{toShow:a,toHide:b,complete:j,down:f,autoHeight:e.autoHeight||
+e.fillSpace};if(!e.proxied)e.proxied=e.animated;if(!e.proxiedDuration)e.proxiedDuration=e.duration;e.animated=c.isFunction(e.proxied)?e.proxied(d):e.proxied;e.duration=c.isFunction(e.proxiedDuration)?e.proxiedDuration(d):e.proxiedDuration;h=c.ui.accordion.animations;var i=e.duration,k=e.animated;if(k&&!h[k]&&!c.easing[k])k="slide";h[k]||(h[k]=function(l){this.slide(l,{easing:k,duration:i||700})});h[k](d)}else{if(e.collapsible&&h)a.toggle();else{b.hide();a.show()}j(true)}b.prev().attr({"aria-expanded":"false",
+"aria-selected":"false",tabIndex:-1}).blur();a.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(!this.running){this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");if(this.toHide.length)this.toHide.parent()[0].className=this.toHide.parent()[0].className;this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion,{version:"1.8.12",
+animations:{slide:function(a,b){a=c.extend({easing:"swing",duration:300},a,b);if(a.toHide.size())if(a.toShow.size()){var d=a.toShow.css("overflow"),h=0,f={},g={},e;b=a.toShow;e=b[0].style.width;b.width(parseInt(b.parent().width(),10)-parseInt(b.css("paddingLeft"),10)-parseInt(b.css("paddingRight"),10)-(parseInt(b.css("borderLeftWidth"),10)||0)-(parseInt(b.css("borderRightWidth"),10)||0));c.each(["height","paddingTop","paddingBottom"],function(j,i){g[i]="hide";j=(""+c.css(a.toShow[0],i)).match(/^([\d+-.]+)(.*)$/);
+f[i]={value:j[1],unit:j[2]||"px"}});a.toShow.css({height:0,overflow:"hidden"}).show();a.toHide.filter(":hidden").each(a.complete).end().filter(":visible").animate(g,{step:function(j,i){if(i.prop=="height")h=i.end-i.start===0?0:(i.now-i.start)/(i.end-i.start);a.toShow[0].style[i.prop]=h*f[i.prop].value+f[i.prop].unit},duration:a.duration,easing:a.easing,complete:function(){a.autoHeight||a.toShow.css("height","");a.toShow.css({width:e,overflow:d});a.complete()}})}else a.toHide.animate({height:"hide",
+paddingTop:"hide",paddingBottom:"hide"},a);else a.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},a)},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1E3:200})}}})})(jQuery);
+;/*
+ * jQuery UI Autocomplete 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.widget.js
+ *     jquery.ui.position.js
+ */
+(function(d){var e=0;d.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:false,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var a=this,b=this.element[0].ownerDocument,g;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!(a.options.disabled||a.element.attr("readonly"))){g=
+false;var f=d.ui.keyCode;switch(c.keyCode){case f.PAGE_UP:a._move("previousPage",c);break;case f.PAGE_DOWN:a._move("nextPage",c);break;case f.UP:a._move("previous",c);c.preventDefault();break;case f.DOWN:a._move("next",c);c.preventDefault();break;case f.ENTER:case f.NUMPAD_ENTER:if(a.menu.active){g=true;c.preventDefault()}case f.TAB:if(!a.menu.active)return;a.menu.select(c);break;case f.ESCAPE:a.element.val(a.term);a.close(c);break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){if(a.term!=
+a.element.val()){a.selectedItem=null;a.search(null,c)}},a.options.delay);break}}}).bind("keypress.autocomplete",function(c){if(g){g=false;c.preventDefault()}}).bind("focus.autocomplete",function(){if(!a.options.disabled){a.selectedItem=null;a.previous=a.element.val()}}).bind("blur.autocomplete",function(c){if(!a.options.disabled){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(c);a._change(c)},150)}});this._initSource();this.response=function(){return a._response.apply(a,arguments)};
+this.menu=d("<ul></ul>").addClass("ui-autocomplete").appendTo(d(this.options.appendTo||"body",b)[0]).mousedown(function(c){var f=a.menu.element[0];d(c.target).closest(".ui-menu-item").length||setTimeout(function(){d(document).one("mousedown",function(h){h.target!==a.element[0]&&h.target!==f&&!d.ui.contains(f,h.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,f){f=f.item.data("item.autocomplete");false!==a._trigger("focus",c,{item:f})&&/^key/.test(c.originalEvent.type)&&
+a.element.val(f.value)},selected:function(c,f){var h=f.item.data("item.autocomplete"),i=a.previous;if(a.element[0]!==b.activeElement){a.element.focus();a.previous=i;setTimeout(function(){a.previous=i;a.selectedItem=h},1)}false!==a._trigger("select",c,{item:h})&&a.element.val(h.value);a.term=a.element.val();a.close(c);a.selectedItem=h},blur:function(){a.menu.element.is(":visible")&&a.element.val()!==a.term&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");
+d.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");this.menu.element.remove();d.Widget.prototype.destroy.call(this)},_setOption:function(a,b){d.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(d(b||"body",this.element[0].ownerDocument)[0]);a==="disabled"&&
+b&&this.xhr&&this.xhr.abort()},_initSource:function(){var a=this,b,g;if(d.isArray(this.options.source)){b=this.options.source;this.source=function(c,f){f(d.ui.autocomplete.filter(b,c.term))}}else if(typeof this.options.source==="string"){g=this.options.source;this.source=function(c,f){a.xhr&&a.xhr.abort();a.xhr=d.ajax({url:g,data:c,dataType:"json",autocompleteRequest:++e,success:function(h){this.autocompleteRequest===e&&f(h)},error:function(){this.autocompleteRequest===e&&f([])}})}}else this.source=
+this.options.source},search:function(a,b){a=a!=null?a:this.element.val();this.term=this.element.val();if(a.length<this.options.minLength)return this.close(b);clearTimeout(this.closing);if(this._trigger("search",b)!==false)return this._search(a)},_search:function(a){this.pending++;this.element.addClass("ui-autocomplete-loading");this.source({term:a},this.response)},_response:function(a){if(!this.options.disabled&&a&&a.length){a=this._normalize(a);this._suggest(a);this._trigger("open")}else this.close();
+this.pending--;this.pending||this.element.removeClass("ui-autocomplete-loading")},close:function(a){clearTimeout(this.closing);if(this.menu.element.is(":visible")){this.menu.element.hide();this.menu.deactivate();this._trigger("close",a)}},_change:function(a){this.previous!==this.element.val()&&this._trigger("change",a,{item:this.selectedItem})},_normalize:function(a){if(a.length&&a[0].label&&a[0].value)return a;return d.map(a,function(b){if(typeof b==="string")return{label:b,value:b};return d.extend({label:b.label||
+b.value,value:b.value||b.label},b)})},_suggest:function(a){var b=this.menu.element.empty().zIndex(this.element.zIndex()+1);this._renderMenu(b,a);this.menu.deactivate();this.menu.refresh();b.show();this._resizeMenu();b.position(d.extend({of:this.element},this.options.position));this.options.autoFocus&&this.menu.next(new d.Event("mouseover"))},_resizeMenu:function(){var a=this.menu.element;a.outerWidth(Math.max(a.width("").outerWidth(),this.element.outerWidth()))},_renderMenu:function(a,b){var g=this;
+d.each(b,function(c,f){g._renderItem(a,f)})},_renderItem:function(a,b){return d("<li></li>").data("item.autocomplete",b).append(d("<a></a>").text(b.label)).appendTo(a)},_move:function(a,b){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b);else this.search(null,b)},widget:function(){return this.menu.element}});d.extend(d.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,
+"\\$&")},filter:function(a,b){var g=new RegExp(d.ui.autocomplete.escapeRegex(b),"i");return d.grep(a,function(c){return g.test(c.label||c.value||c)})}})})(jQuery);
+(function(d){d.widget("ui.menu",{_create:function(){var e=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(a){if(d(a.target).closest(".ui-menu-item a").length){a.preventDefault();e.select(a)}});this.refresh()},refresh:function(){var e=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex",
+-1).mouseenter(function(a){e.activate(a,d(this).parent())}).mouseleave(function(){e.deactivate()})},activate:function(e,a){this.deactivate();if(this.hasScroll()){var b=a.offset().top-this.element.offset().top,g=this.element.attr("scrollTop"),c=this.element.height();if(b<0)this.element.attr("scrollTop",g+b);else b>=c&&this.element.attr("scrollTop",g+b-c+a.height())}this.active=a.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",e,{item:a})},
+deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");this._trigger("blur");this.active=null}},next:function(e){this.move("next",".ui-menu-item:first",e)},previous:function(e){this.move("prev",".ui-menu-item:last",e)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(e,a,b){if(this.active){e=this.active[e+"All"](".ui-menu-item").eq(0);
+e.length?this.activate(b,e):this.activate(b,this.element.children(a))}else this.activate(b,this.element.children(a))},nextPage:function(e){if(this.hasScroll())if(!this.active||this.last())this.activate(e,this.element.children(".ui-menu-item:first"));else{var a=this.active.offset().top,b=this.element.height(),g=this.element.children(".ui-menu-item").filter(function(){var c=d(this).offset().top-a-b+d(this).height();return c<10&&c>-10});g.length||(g=this.element.children(".ui-menu-item:last"));this.activate(e,
+g)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(e){if(this.hasScroll())if(!this.active||this.first())this.activate(e,this.element.children(".ui-menu-item:last"));else{var a=this.active.offset().top,b=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var g=d(this).offset().top-a+b-d(this).height();return g<10&&g>-10});result.length||(result=this.element.children(".ui-menu-item:first"));
+this.activate(e,result)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()<this.element.attr("scrollHeight")},select:function(e){this._trigger("selected",e,{item:this.active})}})})(jQuery);
+;/*
+ * jQuery UI Button 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.widget.js
+ */
+(function(a){var g,i=function(b){a(":ui-button",b.target.form).each(function(){var c=a(this).data("button");setTimeout(function(){c.refresh()},1)})},h=function(b){var c=b.name,d=b.form,f=a([]);if(c)f=d?a(d).find("[name='"+c+"']"):a("[name='"+c+"']",b.ownerDocument).filter(function(){return!this.form});return f};a.widget("ui.button",{options:{disabled:null,text:true,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button",
+i);if(typeof this.options.disabled!=="boolean")this.options.disabled=this.element.attr("disabled");this._determineButtonType();this.hasTitle=!!this.buttonElement.attr("title");var b=this,c=this.options,d=this.type==="checkbox"||this.type==="radio",f="ui-state-hover"+(!d?" ui-state-active":"");if(c.label===null)c.label=this.buttonElement.html();if(this.element.is(":disabled"))c.disabled=true;this.buttonElement.addClass("ui-button ui-widget ui-state-default ui-corner-all").attr("role","button").bind("mouseenter.button",
+function(){if(!c.disabled){a(this).addClass("ui-state-hover");this===g&&a(this).addClass("ui-state-active")}}).bind("mouseleave.button",function(){c.disabled||a(this).removeClass(f)}).bind("focus.button",function(){a(this).addClass("ui-state-focus")}).bind("blur.button",function(){a(this).removeClass("ui-state-focus")});d&&this.element.bind("change.button",function(){b.refresh()});if(this.type==="checkbox")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).toggleClass("ui-state-active");
+b.buttonElement.attr("aria-pressed",b.element[0].checked)});else if(this.type==="radio")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");b.buttonElement.attr("aria-pressed",true);var e=b.element[0];h(e).not(e).map(function(){return a(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed",false)});else{this.buttonElement.bind("mousedown.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");
+g=this;a(document).one("mouseup",function(){g=null})}).bind("mouseup.button",function(){if(c.disabled)return false;a(this).removeClass("ui-state-active")}).bind("keydown.button",function(e){if(c.disabled)return false;if(e.keyCode==a.ui.keyCode.SPACE||e.keyCode==a.ui.keyCode.ENTER)a(this).addClass("ui-state-active")}).bind("keyup.button",function(){a(this).removeClass("ui-state-active")});this.buttonElement.is("a")&&this.buttonElement.keyup(function(e){e.keyCode===a.ui.keyCode.SPACE&&a(this).click()})}this._setOption("disabled",
+c.disabled)},_determineButtonType:function(){this.type=this.element.is(":checkbox")?"checkbox":this.element.is(":radio")?"radio":this.element.is("input")?"input":"button";if(this.type==="checkbox"||this.type==="radio"){var b=this.element.parents().filter(":last"),c="label[for="+this.element.attr("id")+"]";this.buttonElement=b.find(c);if(!this.buttonElement.length){b=b.length?b.siblings():this.element.siblings();this.buttonElement=b.filter(c);if(!this.buttonElement.length)this.buttonElement=b.find(c)}this.element.addClass("ui-helper-hidden-accessible");
+(b=this.element.is(":checked"))&&this.buttonElement.addClass("ui-state-active");this.buttonElement.attr("aria-pressed",b)}else this.buttonElement=this.element},widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible");this.buttonElement.removeClass("ui-button ui-widget ui-state-default ui-corner-all ui-state-hover ui-state-active  ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only").removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html());
+this.hasTitle||this.buttonElement.removeAttr("title");a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments);if(b==="disabled")c?this.element.attr("disabled",true):this.element.removeAttr("disabled");this._resetButton()},refresh:function(){var b=this.element.is(":disabled");b!==this.options.disabled&&this._setOption("disabled",b);if(this.type==="radio")h(this.element[0]).each(function(){a(this).is(":checked")?a(this).button("widget").addClass("ui-state-active").attr("aria-pressed",
+true):a(this).button("widget").removeClass("ui-state-active").attr("aria-pressed",false)});else if(this.type==="checkbox")this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed",true):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed",false)},_resetButton:function(){if(this.type==="input")this.options.label&&this.element.val(this.options.label);else{var b=this.buttonElement.removeClass("ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only"),
+c=a("<span></span>").addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,f=d.primary&&d.secondary,e=[];if(d.primary||d.secondary){if(this.options.text)e.push("ui-button-text-icon"+(f?"s":d.primary?"-primary":"-secondary"));d.primary&&b.prepend("<span class='ui-button-icon-primary ui-icon "+d.primary+"'></span>");d.secondary&&b.append("<span class='ui-button-icon-secondary ui-icon "+d.secondary+"'></span>");if(!this.options.text){e.push(f?"ui-button-icons-only":
+"ui-button-icon-only");this.hasTitle||b.attr("title",c)}}else e.push("ui-button-text-only");b.addClass(e.join(" "))}}});a.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c);a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass("ui-corner-left").end().filter(":last").addClass("ui-corner-right").end().end()},
+destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");a.Widget.prototype.destroy.call(this)}})})(jQuery);
+;/*
+ * jQuery UI Dialog 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.widget.js
+ *  jquery.ui.button.js
+ *     jquery.ui.draggable.js
+ *     jquery.ui.mouse.js
+ *     jquery.ui.position.js
+ *     jquery.ui.resizable.js
+ */
+(function(c,l){var m={buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},n={maxHeight:true,maxWidth:true,minHeight:true,minWidth:true},o=c.attrFn||{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true,click:true};c.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,
+position:{my:"center",at:"center",collision:"fit",using:function(a){var b=c(this).css(a).offset().top;b<0&&c(this).css("top",a.top-b)}},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");if(typeof this.originalTitle!=="string")this.originalTitle="";this.options.title=this.options.title||this.originalTitle;var a=this,b=a.options,d=b.title||"&#160;",e=c.ui.dialog.getTitleId(a.element),g=(a.uiDialog=c("<div></div>")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+
+b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog","aria-labelledby":e}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var f=(a.uiDialogTitlebar=c("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),
+h=c('<a href="#"></a>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i);return false}).appendTo(f);(a.uiDialogTitlebarCloseText=c("<span></span>")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("<span></span>").addClass("ui-dialog-title").attr("id",
+e).html(d).prependTo(f);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose=b.beforeclose;f.find("*").add(f).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");
+a.uiDialog.remove();a.originalTitle&&a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d,e;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog");b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!==
+b.uiDialog[0]){e=c(this).css("z-index");isNaN(e)||(d=Math.max(d,e))}});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,e=d.options;if(e.modal&&!a||!e.stack&&!e.modal)return d._trigger("focus",b);if(e.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=e.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.attr("scrollTop"),scrollLeft:d.element.attr("scrollLeft")};c.ui.dialog.maxZ+=
+1;d.uiDialog.css("z-index",c.ui.dialog.maxZ);d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;a._size();a._position(b.position);d.show(b.show);a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(e){if(e.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),f=g.filter(":first");g=g.filter(":last");if(e.target===g[0]&&!e.shiftKey){f.focus(1);return false}else if(e.target===
+f[0]&&e.shiftKey){g.focus(1);return false}}});c(a.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus();a._isOpen=true;a._trigger("open");return a}},_createButtons:function(a){var b=this,d=false,e=c("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=c("<div></div>").addClass("ui-dialog-buttonset").appendTo(e);b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a,
+function(){return!(d=true)});if(d){c.each(a,function(f,h){h=c.isFunction(h)?{click:h,text:f}:h;var i=c('<button type="button"></button>').click(function(){h.click.apply(b.element[0],arguments)}).appendTo(g);c.each(h,function(j,k){if(j!=="click")j in o?i[j](k):i.attr(j,k)});c.fn.button&&i.button()});e.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(f){return{position:f.position,offset:f.offset}}var b=this,d=b.options,e=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",
+handle:".ui-dialog-titlebar",containment:"document",start:function(f,h){g=d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");b._trigger("dragStart",f,a(h))},drag:function(f,h){b._trigger("drag",f,a(h))},stop:function(f,h){d.position=[h.position.left-e.scrollLeft(),h.position.top-e.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);b._trigger("dragStop",f,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(f){return{originalPosition:f.originalPosition,
+originalSize:f.originalSize,position:f.position,size:f.size}}a=a===l?this.options.resizable:a;var d=this,e=d.options,g=d.uiDialog.css("position");a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function(f,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",f,b(h))},resize:function(f,h){d._trigger("resize",
+f,b(h))},stop:function(f,h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c(this).width();d._trigger("resizeStop",f,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(a){var b=[],d=[0,0],e;if(a){if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "):
+[a[0],a[1]];if(b.length===1)b[1]=b[0];c.each(["left","top"],function(g,f){if(+b[g]===b[g]){d[g]=b[g];b[g]=f}});a={my:b.join(" "),at:b.join(" "),offset:d.join(" ")}}a=c.extend({},c.ui.dialog.prototype.options.position,a)}else a=c.ui.dialog.prototype.options.position;(e=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(c.extend({of:window},a));e||this.uiDialog.hide()},_setOptions:function(a){var b=this,d={},e=false;c.each(a,function(g,f){b._setOption(g,f);
+if(g in m)e=true;if(g in n)d[g]=f});e&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",d)},_setOption:function(a,b){var d=this,e=d.uiDialog;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"):
+e.removeClass("ui-dialog-disabled");break;case "draggable":var g=e.is(":data(draggable)");g&&!b&&e.draggable("destroy");!g&&b&&d._makeDraggable();break;case "position":d._position(b);break;case "resizable":(g=e.is(":data(resizable)"))&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||"&#160;"));break}c.Widget.prototype._setOption.apply(d,arguments)},_size:function(){var a=
+this.options,b,d,e=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0});if(a.minWidth>a.width)a.width=a.minWidth;b=this.uiDialog.css({height:"auto",width:a.width}).height();d=Math.max(0,a.minHeight-b);if(a.height==="auto")if(c.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();a=this.element.css("height","auto").height();e||this.uiDialog.hide();this.element.height(Math.max(a,d))}else this.element.height(Math.max(a.height-
+b,0));this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.12",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),
+create:function(a){if(this.instances.length===0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&c(document).bind(c.ui.dialog.overlay.events,function(d){if(c(d.target).zIndex()<c.ui.dialog.overlay.maxZ)return false})},1);c(document).bind("keydown.dialog-overlay",function(d){if(a.options.closeOnEscape&&d.keyCode&&d.keyCode===c.ui.keyCode.ESCAPE){a.close(d);d.preventDefault()}});c(window).bind("resize.dialog-overlay",c.ui.dialog.overlay.resize)}var b=(this.oldInstances.pop()||c("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),
+height:this.height()});c.fn.bgiframe&&b.bgiframe();this.instances.push(b);return b},destroy:function(a){var b=c.inArray(a,this.instances);b!=-1&&this.oldInstances.push(this.instances.splice(b,1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var d=0;c.each(this.instances,function(){d=Math.max(d,this.css("z-index"))});this.maxZ=d},height:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);
+b=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return a<b?c(window).height()+"px":a+"px"}else return c(document).height()+"px"},width:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth);b=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);return a<b?c(window).width()+"px":a+"px"}else return c(document).width()+"px"},resize:function(){var a=c([]);c.each(c.ui.dialog.overlay.instances,
+function(){a=a.add(this)});a.css({width:0,height:0}).css({width:c.ui.dialog.overlay.width(),height:c.ui.dialog.overlay.height()})}});c.extend(c.ui.dialog.overlay.prototype,{destroy:function(){c.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);
+;/*
+ * jQuery UI Slider 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.mouse.js
+ *     jquery.ui.widget.js
+ */
+(function(d){d.widget("ui.slider",d.ui.mouse,{widgetEventPrefix:"slide",options:{animate:false,distance:0,max:100,min:0,orientation:"horizontal",range:false,step:1,value:0,values:null},_create:function(){var b=this,a=this.options;this._mouseSliding=this._keySliding=false;this._animateOff=true;this._handleIndex=null;this._detectOrientation();this._mouseInit();this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget ui-widget-content ui-corner-all");a.disabled&&this.element.addClass("ui-slider-disabled ui-disabled");
+this.range=d([]);if(a.range){if(a.range===true){this.range=d("<div></div>");if(!a.values)a.values=[this._valueMin(),this._valueMin()];if(a.values.length&&a.values.length!==2)a.values=[a.values[0],a.values[0]]}else this.range=d("<div></div>");this.range.appendTo(this.element).addClass("ui-slider-range");if(a.range==="min"||a.range==="max")this.range.addClass("ui-slider-range-"+a.range);this.range.addClass("ui-widget-header")}d(".ui-slider-handle",this.element).length===0&&d("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle");
+if(a.values&&a.values.length)for(;d(".ui-slider-handle",this.element).length<a.values.length;)d("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle");this.handles=d(".ui-slider-handle",this.element).addClass("ui-state-default ui-corner-all");this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(c){c.preventDefault()}).hover(function(){a.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(a.disabled)d(this).blur();
+else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(c){d(this).data("index.ui-slider-handle",c)});this.handles.keydown(function(c){var e=true,f=d(this).data("index.ui-slider-handle"),h,g,i;if(!b.options.disabled){switch(c.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:e=
+false;if(!b._keySliding){b._keySliding=true;d(this).addClass("ui-state-active");h=b._start(c,f);if(h===false)return}break}i=b.options.step;h=b.options.values&&b.options.values.length?(g=b.values(f)):(g=b.value());switch(c.keyCode){case d.ui.keyCode.HOME:g=b._valueMin();break;case d.ui.keyCode.END:g=b._valueMax();break;case d.ui.keyCode.PAGE_UP:g=b._trimAlignValue(h+(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:g=b._trimAlignValue(h-(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(h===
+b._valueMax())return;g=b._trimAlignValue(h+i);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(h===b._valueMin())return;g=b._trimAlignValue(h-i);break}b._slide(c,f,g);return e}}).keyup(function(c){var e=d(this).data("index.ui-slider-handle");if(b._keySliding){b._keySliding=false;b._stop(c,e);b._change(c,e);d(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider");
+this._mouseDestroy();return this},_mouseCapture:function(b){var a=this.options,c,e,f,h,g;if(a.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:b.pageX,y:b.pageY});e=this._valueMax()-this._valueMin()+1;h=this;this.handles.each(function(i){var j=Math.abs(c-h.values(i));if(e>j){e=j;f=d(this);g=i}});if(a.range===true&&this.values(1)===a.min){g+=1;f=d(this.handles[g])}if(this._start(b,
+g)===false)return false;this._mouseSliding=true;h._handleIndex=g;f.addClass("ui-state-active").focus();a=f.offset();this._clickOffset=!d(b.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:b.pageX-a.left-f.width()/2,top:b.pageY-a.top-f.height()/2-(parseInt(f.css("borderTopWidth"),10)||0)-(parseInt(f.css("borderBottomWidth"),10)||0)+(parseInt(f.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(b,g,c);return this._animateOff=true},_mouseStart:function(){return true},
+_mouseDrag:function(b){var a=this._normValueFromMouse({x:b.pageX,y:b.pageY});this._slide(b,this._handleIndex,a);return false},_mouseStop:function(b){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(b,this._handleIndex);this._change(b,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(b){var a;
+if(this.orientation==="horizontal"){a=this.elementSize.width;b=b.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{a=this.elementSize.height;b=b.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}a=b/a;if(a>1)a=1;if(a<0)a=0;if(this.orientation==="vertical")a=1-a;b=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+a*b)},_start:function(b,a){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value=
+this.values(a);c.values=this.values()}return this._trigger("start",b,c)},_slide:function(b,a,c){var e;if(this.options.values&&this.options.values.length){e=this.values(a?0:1);if(this.options.values.length===2&&this.options.range===true&&(a===0&&c>e||a===1&&c<e))c=e;if(c!==this.values(a)){e=this.values();e[a]=c;b=this._trigger("slide",b,{handle:this.handles[a],value:c,values:e});this.values(a?0:1);b!==false&&this.values(a,c,true)}}else if(c!==this.value()){b=this._trigger("slide",b,{handle:this.handles[a],
+value:c});b!==false&&this.value(c)}},_stop:function(b,a){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(a);c.values=this.values()}this._trigger("stop",b,c)},_change:function(b,a){if(!this._keySliding&&!this._mouseSliding){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(a);c.values=this.values()}this._trigger("change",b,c)}},value:function(b){if(arguments.length){this.options.value=
+this._trimAlignValue(b);this._refreshValue();this._change(null,0)}else return this._value()},values:function(b,a){var c,e,f;if(arguments.length>1){this.options.values[b]=this._trimAlignValue(a);this._refreshValue();this._change(null,b)}else if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;e=arguments[0];for(f=0;f<c.length;f+=1){c[f]=this._trimAlignValue(e[f]);this._change(null,f)}this._refreshValue()}else return this.options.values&&this.options.values.length?this._values(b):
+this.value();else return this._values()},_setOption:function(b,a){var c,e=0;if(d.isArray(this.options.values))e=this.options.values.length;d.Widget.prototype._setOption.apply(this,arguments);switch(b){case "disabled":if(a){this.handles.filter(".ui-state-focus").blur();this.handles.removeClass("ui-state-hover");this.handles.attr("disabled","disabled");this.element.addClass("ui-disabled")}else{this.handles.removeAttr("disabled");this.element.removeClass("ui-disabled")}break;case "orientation":this._detectOrientation();
+this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation);this._refreshValue();break;case "value":this._animateOff=true;this._refreshValue();this._change(null,0);this._animateOff=false;break;case "values":this._animateOff=true;this._refreshValue();for(c=0;c<e;c+=1)this._change(null,c);this._animateOff=false;break}},_value:function(){var b=this.options.value;return b=this._trimAlignValue(b)},_values:function(b){var a,c;if(arguments.length){a=this.options.values[b];
+return a=this._trimAlignValue(a)}else{a=this.options.values.slice();for(c=0;c<a.length;c+=1)a[c]=this._trimAlignValue(a[c]);return a}},_trimAlignValue:function(b){if(b<=this._valueMin())return this._valueMin();if(b>=this._valueMax())return this._valueMax();var a=this.options.step>0?this.options.step:1,c=(b-this._valueMin())%a;alignValue=b-c;if(Math.abs(c)*2>=a)alignValue+=c>0?a:-a;return parseFloat(alignValue.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},
+_refreshValue:function(){var b=this.options.range,a=this.options,c=this,e=!this._animateOff?a.animate:false,f,h={},g,i,j,l;if(this.options.values&&this.options.values.length)this.handles.each(function(k){f=(c.values(k)-c._valueMin())/(c._valueMax()-c._valueMin())*100;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";d(this).stop(1,1)[e?"animate":"css"](h,a.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(k===0)c.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},a.animate);
+if(k===1)c.range[e?"animate":"css"]({width:f-g+"%"},{queue:false,duration:a.animate})}else{if(k===0)c.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},a.animate);if(k===1)c.range[e?"animate":"css"]({height:f-g+"%"},{queue:false,duration:a.animate})}g=f});else{i=this.value();j=this._valueMin();l=this._valueMax();f=l!==j?(i-j)/(l-j)*100:0;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";this.handle.stop(1,1)[e?"animate":"css"](h,a.animate);if(b==="min"&&this.orientation==="horizontal")this.range.stop(1,
+1)[e?"animate":"css"]({width:f+"%"},a.animate);if(b==="max"&&this.orientation==="horizontal")this.range[e?"animate":"css"]({width:100-f+"%"},{queue:false,duration:a.animate});if(b==="min"&&this.orientation==="vertical")this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},a.animate);if(b==="max"&&this.orientation==="vertical")this.range[e?"animate":"css"]({height:100-f+"%"},{queue:false,duration:a.animate})}}});d.extend(d.ui.slider,{version:"1.8.12"})})(jQuery);
+;/*
+ * jQuery UI Tabs 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.widget.js
+ */
+(function(d,p){function u(){return++v}function w(){return++x}var v=0,x=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"<div></div>",remove:null,select:null,show:null,spinner:"<em>Loading&#8230;</em>",tabTemplate:"<li><a href='#{href}'><span>#{label}</span></a></li>"},_create:function(){this._tabify(true)},_setOption:function(b,e){if(b=="selected")this.options.collapsible&&
+e==this.options.selected||this.select(e);else{this.options[b]=e;this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[b].concat(d.makeArray(arguments)))},_ui:function(b,e){return{tab:b,panel:e,index:this.anchors.index(b)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b=
+d(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(b){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var a=this,c=this.options,h=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=d(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);this.anchors.each(function(g,f){var i=d(f).attr("href"),l=i.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]||
+(q=d("base")[0])&&l===q.href)){i=f.hash;f.href=i}if(h.test(i))a.panels=a.panels.add(a.element.find(a._sanitizeSelector(i)));else if(i&&i!=="#"){d.data(f,"href.tabs",i);d.data(f,"load.tabs",i.replace(/#.*$/,""));i=a._tabId(f);f.href="#"+i;f=a.element.find("#"+i);if(!f.length){f=d(c.panelTemplate).attr("id",i).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else c.disabled.push(g)});if(b){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all");
+this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(c.selected===p){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){c.selected=g;return false}});if(typeof c.selected!=="number"&&c.cookie)c.selected=parseInt(a._cookie(),10);if(typeof c.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)c.selected=
+this.lis.index(this.lis.filter(".ui-tabs-selected"));c.selected=c.selected||(this.lis.length?0:-1)}else if(c.selected===null)c.selected=-1;c.selected=c.selected>=0&&this.anchors[c.selected]||c.selected<0?c.selected:0;c.disabled=d.unique(c.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return a.lis.index(g)}))).sort();d.inArray(c.selected,c.disabled)!=-1&&c.disabled.splice(d.inArray(c.selected,c.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active");
+if(c.selected>=0&&this.anchors.length){a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[c.selected],a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash))[0]))});this.load(c.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.panels=null})}else c.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"));
+this.element[c.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");c.cookie&&this._cookie(c.selected,c.cookie);b=0;for(var j;j=this.lis[b];b++)d(j)[d.inArray(b,c.disabled)!=-1&&!d(j).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");c.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(c.event!=="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+
+g)};this.lis.bind("mouseover.tabs",function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(c.fx)if(d.isArray(c.fx)){m=c.fx[0];o=c.fx[1]}else m=o=c.fx;var r=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal",
+function(){e(f,o);a._trigger("show",null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")};
+this.anchors.bind(c.event+".tabs",function(){var g=this,f=d(g).closest("li"),i=a.panels.filter(":not(.ui-tabs-hide)"),l=a.element.find(a._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a.panels.filter(":animated").length||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}c.selected=a.anchors.index(this);a.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected=
+-1;c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){s(g,i)}).dequeue("tabs");this.blur();return false}else if(!i.length){c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this));this.blur();return false}c.cookie&&a._cookie(c.selected,c.cookie);if(l.length){i.length&&a.element.queue("tabs",function(){s(g,i)});a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier.";
+d.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(b){if(typeof b=="string")b=this.anchors.index(this.anchors.filter("[href$="+b+"]"));return b},destroy:function(){var b=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e=
+d.data(this,"href.tabs");if(e)this.href=e;var a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){a.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});b.cookie&&this._cookie(null,b.cookie);return this},add:function(b,
+e,a){if(a===p)a=this.anchors.length;var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,b).replace(/#\{label\}/g,e));b=!b.indexOf("#")?b.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var j=c.element.find("#"+b);j.length||(j=d(h.panelTemplate).attr("id",b).data("destroy.tabs",true));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]);
+j.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");j.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){c._trigger("show",null,c._ui(c.anchors[0],c.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[a],this.panels[a]));return this},remove:function(b){b=this._getIndex(b);var e=this.options,a=this.lis.eq(b).remove(),c=this.panels.eq(b).remove();
+if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(b+(b+1<this.anchors.length?1:-1));e.disabled=d.map(d.grep(e.disabled,function(h){return h!=b}),function(h){return h>=b?--h:h});this._tabify();this._trigger("remove",null,this._ui(a.find("a")[0],c[0]));return this},enable:function(b){b=this._getIndex(b);var e=this.options;if(d.inArray(b,e.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=b});this._trigger("enable",null,
+this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(b){b=this._getIndex(b);var e=this.options;if(b!=e.selected){this.lis.eq(b).addClass("ui-state-disabled");e.disabled.push(b);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[b],this.panels[b]))}return this},select:function(b){b=this._getIndex(b);if(b==-1)if(this.options.collapsible&&this.options.selected!=-1)b=this.options.selected;else return this;this.anchors.eq(b).trigger(this.options.event+".tabs");return this},
+load:function(b){b=this._getIndex(b);var e=this,a=this.options,c=this.anchors.eq(b)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(a.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){e.element.find(e._sanitizeSelector(c.hash)).html(k);e._cleanup();a.cache&&d.data(c,
+"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.error(k,n,b,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this},
+url:function(b,e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.12"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k<a.anchors.length?k:0)},b);j&&j.stopPropagation()});e=a._unrotate||(a._unrotate=!e?function(j){j.clientX&&
+a.rotate(null)}:function(){t=c.selected;h()});if(b){this.element.bind("tabsshow",h);this.anchors.bind(c.event+".tabs",e);h()}else{clearTimeout(a.rotation);this.element.unbind("tabsshow",h);this.anchors.unbind(c.event+".tabs",e);delete this._rotate;delete this._unrotate}return this}})})(jQuery);
+;/*
+ * jQuery UI Datepicker 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ */
+(function(d,A){function K(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._inDialog=this._datepickerShowing=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass=
+"ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su",
+"Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",
+minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false};d.extend(this._defaults,this.regional[""]);this.dpDiv=d('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}function F(a,b){d.extend(a,b);for(var c in b)if(b[c]==
+null||b[c]==A)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.12"}});var y=(new Date).getTime();d.extend(K.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){F(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=f}}}e=a.nodeName.toLowerCase();
+f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:d('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}},
+_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&&
+b.append.remove();if(c){b.append=d('<span class="'+this._appendClass+'">'+c+"</span>");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c=="focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("<img/>").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('<button type="button"></button>').addClass(this._triggerClass).html(f==
+""?c:d("<img/>").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;g<f.length;g++)if(f[g].length>h){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a,
+c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b),
+true);this._updateDatepicker(b);this._updateAlternate(b);b.dpDiv.show()}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+=1;this._dialogInput=d('<input type="text" id="'+("dp"+this.uuid)+'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}F(a.settings,e||{});
+b=b&&b.constructor==Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);
+this._showDatepicker(this._dialogInput[0]);d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",
+this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().removeClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,
+function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().addClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:
+f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false;for(var b=0;b<this._disabledInputs.length;b++)if(this._disabledInputs[b]==a)return true;return false},_getInst:function(a){try{return d.data(a,"datepicker")}catch(b){throw"Missing instance data for this datepicker";}},_optionDatepicker:function(a,b,c){var e=this._getInst(a);if(arguments.length==2&&typeof b=="string")return b=="defaults"?d.extend({},d.datepicker._defaults):e?b=="all"?d.extend({},
+e.settings):this._get(e,b):null;var f=b||{};if(typeof b=="string"){f={};f[b]=c}if(e){this._curInst==e&&this._hideDatepicker();var h=this._getDateDatepicker(a,true),i=this._getMinMaxDate(e,"min"),g=this._getMinMaxDate(e,"max");F(e.settings,f);if(i!==null&&f.dateFormat!==A&&f.minDate===A)e.settings.minDate=this._formatDate(e,i);if(g!==null&&f.dateFormat!==A&&f.maxDate===A)e.settings.maxDate=this._formatDate(e,g);this._attachments(d(a),e);this._autoSize(e);this._setDateDatepicker(a,h);this._updateDatepicker(e)}},
+_changeDatepicker:function(a,b,c){this._optionDatepicker(a,b,c)},_refreshDatepicker:function(a){(a=this._getInst(a))&&this._updateDatepicker(a)},_setDateDatepicker:function(a,b){if(a=this._getInst(a)){this._setDate(a,b);this._updateDatepicker(a);this._updateAlternate(a)}},_getDateDatepicker:function(a,b){(a=this._getInst(a))&&!a.inline&&this._setDateFromField(a,b);return a?this._getDate(a):null},_doKeyDown:function(a){var b=d.datepicker._getInst(a.target),c=true,e=b.dpDiv.is(".ui-datepicker-rtl");
+b._keyEvent=true;if(d.datepicker._datepickerShowing)switch(a.keyCode){case 9:d.datepicker._hideDatepicker();c=false;break;case 13:c=d("td."+d.datepicker._dayOverClass+":not(."+d.datepicker._currentClass+")",b.dpDiv);c[0]?d.datepicker._selectDay(a.target,b.selectedMonth,b.selectedYear,c[0]):d.datepicker._hideDatepicker();return false;case 27:d.datepicker._hideDatepicker();break;case 33:d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),
+"M");break;case 34:d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 35:if(a.ctrlKey||a.metaKey)d.datepicker._clearDate(a.target);c=a.ctrlKey||a.metaKey;break;case 36:if(a.ctrlKey||a.metaKey)d.datepicker._gotoToday(a.target);c=a.ctrlKey||a.metaKey;break;case 37:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?+1:-1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?
+-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 38:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,-7,"D");c=a.ctrlKey||a.metaKey;break;case 39:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?-1:+1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 40:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,
++7,"D");c=a.ctrlKey||a.metaKey;break;default:c=false}else if(a.keyCode==36&&a.ctrlKey)d.datepicker._showDatepicker(this);else c=false;if(c){a.preventDefault();a.stopPropagation()}},_doKeyPress:function(a){var b=d.datepicker._getInst(a.target);if(d.datepicker._get(b,"constrainInput")){b=d.datepicker._possibleChars(d.datepicker._get(b,"dateFormat"));var c=String.fromCharCode(a.charCode==A?a.keyCode:a.charCode);return a.ctrlKey||a.metaKey||c<" "||!b||b.indexOf(c)>-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);
+if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target||a;if(a.nodeName.toLowerCase()!="input")a=d("input",a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);
+d.datepicker._curInst&&d.datepicker._curInst!=b&&d.datepicker._curInst.dpDiv.stop(true,true);var c=d.datepicker._get(b,"beforeShow");F(b.settings,c?c.apply(a,[a,b]):{});b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value="";if(!d.datepicker._pos){d.datepicker._pos=d.datepicker._findPos(a);d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=
+document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.empty();b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);c=d.datepicker._checkOffset(b,c,e);b.dpDiv.css({position:d.datepicker._inDialog&&d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");
+var f=d.datepicker._get(b,"duration"),h=function(){d.datepicker._datepickerShowing=true;var i=b.dpDiv.find("iframe.ui-datepicker-cover");if(i.length){var g=d.datepicker._getBorders(b.dpDiv);i.css({left:-g[0],top:-g[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex(d(a).zIndex()+1);d.effects&&d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=
+b}}},_updateDatepicker:function(a){var b=this,c=d.datepicker._getBorders(a.dpDiv);a.dpDiv.empty().append(this._generateHTML(a));var e=a.dpDiv.find("iframe.ui-datepicker-cover");e.length&&e.css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()});a.dpDiv.find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout",function(){d(this).removeClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).removeClass("ui-datepicker-prev-hover");
+this.className.indexOf("ui-datepicker-next")!=-1&&d(this).removeClass("ui-datepicker-next-hover")}).bind("mouseover",function(){if(!b._isDisabledDatepicker(a.inline?a.dpDiv.parent()[0]:a.input[0])){d(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");d(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).addClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).addClass("ui-datepicker-next-hover")}}).end().find("."+
+this._dayOverClass+" a").trigger("mouseover").end();c=this._getNumberOfMonths(a);e=c[1];e>1?a.dpDiv.addClass("ui-datepicker-multi-"+e).css("width",17*e+"em"):a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");a.dpDiv[(c[0]!=1||c[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&
+a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var f=a.yearshtml;setTimeout(function(){f===a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);f=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth():
+0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),j=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>j&&j>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a),
+"isRTL");a&&(a.type=="hidden"||a.nodeType!=1||d.expr.filters.hidden(a));)a=a[b?"previousSibling":"nextSibling"];a=d(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);this._curInst=null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?
+"fadeOut":"hide"](a?c:null,e);a||e();if(a=this._get(b,"onClose"))a.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(d.datepicker._curInst){a=
+d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=
+d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e._selectingMonthYear=false;e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c==
+"M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){var b=this._getInst(d(a)[0]);b.input&&b._selectingMonthYear&&setTimeout(function(){b.input.focus()},0);b._selectingMonthYear=!b._selectingMonthYear},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=d("a",e).html();f.selectedMonth=f.currentMonth=
+b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=d(a);this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker();
+this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=a.getTime();a.setMonth(0);
+a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null;var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;e=typeof e!="string"?e:(new Date).getFullYear()%100+parseInt(e,10);for(var f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?
+c.monthNames:null)||this._defaults.monthNames,j=c=-1,l=-1,u=-1,k=false,o=function(p){(p=z+1<a.length&&a.charAt(z+1)==p)&&z++;return p},m=function(p){var v=o(p);p=new RegExp("^\\d{1,"+(p=="@"?14:p=="!"?20:p=="y"&&v?4:p=="o"?3:2)+"}");p=b.substring(s).match(p);if(!p)throw"Missing number at position "+s;s+=p[0].length;return parseInt(p[0],10)},n=function(p,v,H){p=o(p)?H:v;for(v=0;v<p.length;v++)if(b.substr(s,p[v].length).toLowerCase()==p[v].toLowerCase()){s+=p[v].length;return v+1}throw"Unknown name at position "+
+s;},r=function(){if(b.charAt(s)!=a.charAt(z))throw"Unexpected literal at position "+s;s++},s=0,z=0;z<a.length;z++)if(k)if(a.charAt(z)=="'"&&!o("'"))k=false;else r();else switch(a.charAt(z)){case "d":l=m("d");break;case "D":n("D",f,h);break;case "o":u=m("o");break;case "m":j=m("m");break;case "M":j=n("M",i,g);break;case "y":c=m("y");break;case "@":var w=new Date(m("@"));c=w.getFullYear();j=w.getMonth()+1;l=w.getDate();break;case "!":w=new Date((m("!")-this._ticksTo1970)/1E4);c=w.getFullYear();j=w.getMonth()+
+1;l=w.getDate();break;case "'":if(o("'"))r();else k=true;break;default:r()}if(c==-1)c=(new Date).getFullYear();else if(c<100)c+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c<=e?0:-100);if(u>-1){j=1;l=u;do{e=this._getDaysInMonth(c,j-1);if(l<=e)break;j++;l-=e}while(1)}w=this._daylightSavingAdjust(new Date(c,j-1,l));if(w.getFullYear()!=c||w.getMonth()+1!=j||w.getDate()!=l)throw"Invalid date";return w},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",
+RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:null)||this._defaults.monthNames;var i=function(o){(o=k+1<a.length&&
+a.charAt(k+1)==o)&&k++;return o},g=function(o,m,n){m=""+m;if(i(o))for(;m.length<n;)m="0"+m;return m},j=function(o,m,n,r){return i(o)?r[m]:n[m]},l="",u=false;if(b)for(var k=0;k<a.length;k++)if(u)if(a.charAt(k)=="'"&&!i("'"))u=false;else l+=a.charAt(k);else switch(a.charAt(k)){case "d":l+=g("d",b.getDate(),2);break;case "D":l+=j("D",b.getDay(),e,f);break;case "o":l+=g("o",(b.getTime()-(new Date(b.getFullYear(),0,0)).getTime())/864E5,3);break;case "m":l+=g("m",b.getMonth()+1,2);break;case "M":l+=j("M",
+b.getMonth(),h,c);break;case "y":l+=i("y")?b.getFullYear():(b.getYear()%100<10?"0":"")+b.getYear()%100;break;case "@":l+=b.getTime();break;case "!":l+=b.getTime()*1E4+this._ticksTo1970;break;case "'":if(i("'"))l+="'";else u=true;break;default:l+=a.charAt(k)}return l},_possibleChars:function(a){for(var b="",c=false,e=function(h){(h=f+1<a.length&&a.charAt(f+1)==h)&&f++;return h},f=0;f<a.length;f++)if(c)if(a.charAt(f)=="'"&&!e("'"))c=false;else b+=a.charAt(f);else switch(a.charAt(f)){case "d":case "m":case "y":case "@":b+=
+"0123456789";break;case "D":case "M":return null;case "'":if(e("'"))b+="'";else c=true;break;default:b+=a.charAt(f)}return b},_get:function(a,b){return a.settings[b]!==A?a.settings[b]:this._defaults[b]},_setDateFromField:function(a,b){if(a.input.val()!=a.lastVal){var c=this._get(a,"dateFormat"),e=a.lastVal=a.input?a.input.val():null,f,h;f=h=this._getDefaultDate(a);var i=this._getFormatConfig(a);try{f=this.parseDate(c,e,i)||h}catch(g){this.log(g);e=b?"":e}a.selectedDay=f.getDate();a.drawMonth=a.selectedMonth=
+f.getMonth();a.drawYear=a.selectedYear=f.getFullYear();a.currentDay=e?f.getDate():0;a.currentMonth=e?f.getMonth():0;a.currentYear=e?f.getFullYear():0;this._adjustInstDate(a)}},_getDefaultDate:function(a){return this._restrictMinMax(a,this._determineDate(a,this._get(a,"defaultDate"),new Date))},_determineDate:function(a,b,c){var e=function(h){var i=new Date;i.setDate(i.getDate()+h);return i},f=function(h){try{return d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),h,d.datepicker._getFormatConfig(a))}catch(i){}var g=
+(h.toLowerCase().match(/^c/)?d.datepicker._getDate(a):null)||new Date,j=g.getFullYear(),l=g.getMonth();g=g.getDate();for(var u=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,k=u.exec(h);k;){switch(k[2]||"d"){case "d":case "D":g+=parseInt(k[1],10);break;case "w":case "W":g+=parseInt(k[1],10)*7;break;case "m":case "M":l+=parseInt(k[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(j,l));break;case "y":case "Y":j+=parseInt(k[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(j,l));break}k=u.exec(h)}return new Date(j,
+l,g)};if(b=(b=b==null||b===""?c:typeof b=="string"?f(b):typeof b=="number"?isNaN(b)?c:e(b):new Date(b.getTime()))&&b.toString()=="Invalid Date"?c:b){b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0)}return this._daylightSavingAdjust(b)},_daylightSavingAdjust:function(a){if(!a)return null;a.setHours(a.getHours()>12?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=
+a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),
+b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),j=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay?new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),k=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=
+this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=k&&n<k?k:n;this._daylightSavingAdjust(new Date(m,g,1))>n;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-j,1)),this._getFormatConfig(a));n=this._canAdjustMonth(a,-1,m,g)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._adjustDate('#"+a.id+"', -"+j+", 'M');\" title=\""+n+'"><span class="ui-icon ui-icon-circle-triangle-'+
+(c?"e":"w")+'">'+n+"</span></a>":f?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>";var r=this._get(a,"nextText");r=!h?r:this.formatDate(r,this._daylightSavingAdjust(new Date(m,g+j,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._adjustDate('#"+a.id+"', +"+j+", 'M');\" title=\""+r+'"><span class="ui-icon ui-icon-circle-triangle-'+
+(c?"w":"e")+'">'+r+"</span></a>":f?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+r+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+r+"</span></a>";j=this._get(a,"currentText");r=this._get(a,"gotoCurrent")&&a.currentDay?u:b;j=!h?j:this.formatDate(j,r,this._getFormatConfig(a));h=!a.inline?'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_'+y+'.datepicker._hideDatepicker();">'+this._get(a,
+"closeText")+"</button>":"";e=e?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(c?h:"")+(this._isInRange(a,r)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._gotoToday('#"+a.id+"');\">"+j+"</button>":"")+(c?"":h)+"</div>":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;j=this._get(a,"showWeek");r=this._get(a,"dayNames");this._get(a,"dayNamesShort");var s=this._get(a,"dayNamesMin"),z=
+this._get(a,"monthNames"),w=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),v=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var L=this._getDefaultDate(a),I="",D=0;D<i[0];D++){for(var M="",E=0;E<i[1];E++){var N=this._daylightSavingAdjust(new Date(m,g,a.selectedDay)),t=" ui-corner-all",x="";if(l){x+='<div class="ui-datepicker-group';if(i[1]>1)switch(E){case 0:x+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-
+1:x+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:x+=" ui-datepicker-group-middle";t="";break}x+='">'}x+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+t+'">'+(/all|left/.test(t)&&D==0?c?f:n:"")+(/all|right/.test(t)&&D==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,k,o,D>0||E>0,z,w)+'</div><table class="ui-datepicker-calendar"><thead><tr>';var B=j?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":"";for(t=0;t<7;t++){var q=
+(t+h)%7;B+="<th"+((t+h+6)%7>=5?' class="ui-datepicker-week-end"':"")+'><span title="'+r[q]+'">'+s[q]+"</span></th>"}x+=B+"</tr></thead><tbody>";B=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay,B);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;B=l?6:Math.ceil((t+B)/7);q=this._daylightSavingAdjust(new Date(m,g,1-t));for(var O=0;O<B;O++){x+="<tr>";var P=!j?"":'<td class="ui-datepicker-week-col">'+this._get(a,"calculateWeek")(q)+"</td>";for(t=0;t<7;t++){var G=
+p?p.apply(a.input?a.input[0]:null,[q]):[true,""],C=q.getMonth()!=g,J=C&&!H||!G[0]||k&&q<k||o&&q>o;P+='<td class="'+((t+h+6)%7>=5?" ui-datepicker-week-end":"")+(C?" ui-datepicker-other-month":"")+(q.getTime()==N.getTime()&&g==a.selectedMonth&&a._keyEvent||L.getTime()==q.getTime()&&L.getTime()==N.getTime()?" "+this._dayOverClass:"")+(J?" "+this._unselectableClass+" ui-state-disabled":"")+(C&&!v?"":" "+G[1]+(q.getTime()==u.getTime()?" "+this._currentClass:"")+(q.getTime()==b.getTime()?" ui-datepicker-today":
+""))+'"'+((!C||v)&&G[2]?' title="'+G[2]+'"':"")+(J?"":' onclick="DP_jQuery_'+y+".datepicker._selectDay('#"+a.id+"',"+q.getMonth()+","+q.getFullYear()+', this);return false;"')+">"+(C&&!v?"&#xa0;":J?'<span class="ui-state-default">'+q.getDate()+"</span>":'<a class="ui-state-default'+(q.getTime()==b.getTime()?" ui-state-highlight":"")+(q.getTime()==u.getTime()?" ui-state-active":"")+(C?" ui-priority-secondary":"")+'" href="#">'+q.getDate()+"</a>")+"</td>";q.setDate(q.getDate()+1);q=this._daylightSavingAdjust(q)}x+=
+P+"</tr>"}g++;if(g>11){g=0;m++}x+="</tbody></table>"+(l?"</div>"+(i[0]>0&&E==i[1]-1?'<div class="ui-datepicker-row-break"></div>':""):"");M+=x}I+=M}I+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>':"");a._keyEvent=false;return I},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var j=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),k='<div class="ui-datepicker-title">',
+o="";if(h||!j)o+='<span class="ui-datepicker-month">'+i[b]+"</span>";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='<select class="ui-datepicker-month" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+a.id+"', this, 'M');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+a.id+"');\">";for(var n=0;n<12;n++)if((!i||n>=e.getMonth())&&(!m||n<=f.getMonth()))o+='<option value="'+n+'"'+(n==b?' selected="selected"':"")+">"+g[n]+"</option>";o+="</select>"}u||(k+=o+(h||!(j&&
+l)?"&#xa0;":""));if(!a.yearshtml){a.yearshtml="";if(h||!l)k+='<span class="ui-datepicker-year">'+c+"</span>";else{g=this._get(a,"yearRange").split(":");var r=(new Date).getFullYear();i=function(s){s=s.match(/c[+-].*/)?c+parseInt(s.substring(1),10):s.match(/[+-].*/)?r+parseInt(s,10):parseInt(s,10);return isNaN(s)?r:s};b=i(g[0]);g=Math.max(b,i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(a.yearshtml+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+
+a.id+"', this, 'Y');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+a.id+"');\">";b<=g;b++)a.yearshtml+='<option value="'+b+'"'+(b==c?' selected="selected"':"")+">"+b+"</option>";a.yearshtml+="</select>";if(d.browser.mozilla)k+='<select class="ui-datepicker-year"><option value="'+c+'" selected="selected">'+c+"</option></select>";else{k+=a.yearshtml;a.yearshtml=null}}}k+=this._get(a,"yearSuffix");if(u)k+=(h||!(j&&l)?"&#xa0;":"")+o;k+="</div>";return k},_adjustInstDate:function(a,b,c){var e=
+a.drawYear+(c=="Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&b<c?c:b;return b=a&&b>a?a:b},_notifyChange:function(a){var b=this._get(a,
+"onChangeMonthYear");if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a);
+c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,
+"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker=
+function(a){if(!this.length)return this;if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,
+[this[0]].concat(b));return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new K;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.12";window["DP_jQuery_"+y]=d})(jQuery);
+;/*
+ * jQuery UI Progressbar 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar
+ *
+ * Depends:
+ *   jquery.ui.core.js
+ *   jquery.ui.widget.js
+ */
+(function(b,d){b.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()});this.valueDiv=b("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element);this.oldValue=this._value();this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow");
+this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===d)return this._value();this._setOption("value",a);return this},_setOption:function(a,c){if(a==="value"){this.options.value=c;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100*
+this._value()/this.options.max},_refreshValue:function(){var a=this.value(),c=this._percentage();if(this.oldValue!==a){this.oldValue=a;this._trigger("change")}this.valueDiv.toggle(a>this.min).toggleClass("ui-corner-right",a===this.options.max).width(c.toFixed(0)+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.12"})})(jQuery);
+;/*
+ * jQuery UI Effects 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/
+ */
+jQuery.effects||function(f,j){function n(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1],
+16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return o.transparent;return o[f.trim(c).toLowerCase()]}function s(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return n(b)}function p(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,
+a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function q(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in t||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function u(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function k(c,a,b,d){if(typeof c=="object"){d=
+a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:b in f.fx.speeds?f.fx.speeds[b]:f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}function m(c){if(!c||typeof c==="number"||f.fx.speeds[c])return true;if(typeof c==="string"&&!f.effects[c])return true;return false}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor",
+"borderTopColor","borderColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=s(b.elem,a);b.end=n(b.end);b.colorInit=true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var o={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,
+0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,
+211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},r=["add","remove","toggle"],t={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b,
+d){if(f.isFunction(b)){d=b;b=null}return this.queue("fx",function(){var e=f(this),g=e.attr("style")||" ",h=q(p.call(this)),l,v=e.attr("className");f.each(r,function(w,i){c[i]&&e[i+"Class"](c[i])});l=q(p.call(this));e.attr("className",v);e.animate(u(h,l),a,b,function(){f.each(r,function(w,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments)});h=f.queue(this);l=h.splice(h.length-1,1)[0];
+h.splice(1,0,l);f.dequeue(this)})};f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,
+a):f.effects.animateClass.apply(this,[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.12",save:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.data("ec.storage."+a[b],c[0].style[a[b]])},restore:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.css(a[b],c.data("ec.storage."+a[b]))},setMode:function(c,a){if(a=="toggle")a=c.is(":hidden")?"show":"hide";return a},getBaseline:function(c,
+a){var b;switch(c[0]){case "top":b=0;break;case "middle":b=0.5;break;case "bottom":b=1;break;default:b=c[0]/a.height}switch(c[1]){case "left":c=0;break;case "center":c=0.5;break;case "right":c=1;break;default:c=c[1]/a.width}return{x:c,y:b}},createWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent();var a={width:c.outerWidth(true),height:c.outerHeight(true),"float":c.css("float")},b=f("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",
+border:"none",margin:0,padding:0});c.wrap(b);b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(d,e){a[e]=c.css(e);if(isNaN(parseInt(a[e],10)))a[e]="auto"});c.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}return b.css(a).show()},removeWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent().replaceWith(c);
+return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=k.apply(this,arguments),b={options:a[1],duration:a[2],callback:a[3]};a=b.options.mode;var d=f.effects[c];if(f.fx.off||!d)return a?this[a](b.duration,b.callback):this.each(function(){b.callback&&b.callback.call(this)});return d.call(this,b)},_show:f.fn.show,show:function(c){if(m(c))return this._show.apply(this,arguments);
+else{var a=k.apply(this,arguments);a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(m(c))return this._hide.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(m(c)||typeof c==="boolean"||f.isFunction(c))return this.__toggle.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c),
+b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,
+a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(c,a,b,d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,
+a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,10*(a/e-1))+b},easeOutExpo:function(c,a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==
+e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=
+g/(2*Math.PI)*Math.asin(d/h);return-(h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g))+b},easeOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return h*Math.pow(2,-10*a)*Math.sin((a*e-c)*2*Math.PI/g)+d+b},easeInOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e/2)==2)return b+d;g||(g=e*0.3*1.5);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/
+h);if(a<1)return-0.5*h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)+b;return h*Math.pow(2,-10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)*0.5+d+b},easeInBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*(a/=e)*a*((g+1)*a-g)+b},easeOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*((a=a/e-1)*a*((g+1)*a+g)+1)+b},easeInOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;if((a/=e/2)<1)return d/2*a*a*(((g*=1.525)+1)*a-g)+b;return d/2*((a-=2)*a*(((g*=1.525)+1)*a+g)+2)+b},easeInBounce:function(c,
+a,b,d,e){return d-f.easing.easeOutBounce(c,e-a,0,d,e)+b},easeOutBounce:function(c,a,b,d,e){return(a/=e)<1/2.75?d*7.5625*a*a+b:a<2/2.75?d*(7.5625*(a-=1.5/2.75)*a+0.75)+b:a<2.5/2.75?d*(7.5625*(a-=2.25/2.75)*a+0.9375)+b:d*(7.5625*(a-=2.625/2.75)*a+0.984375)+b},easeInOutBounce:function(c,a,b,d,e){if(a<e/2)return f.easing.easeInBounce(c,a*2,0,d,e)*0.5+b;return f.easing.easeOutBounce(c,a*2-e,0,d,e)*0.5+d*0.5+b}})}(jQuery);
+;/*
+ * jQuery UI Effects Blind 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Blind
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function(b){b.effects.blind=function(c){return this.queue(function(){var a=b(this),g=["position","top","bottom","left","right"],f=b.effects.setMode(a,c.options.mode||"hide"),d=c.options.direction||"vertical";b.effects.save(a,g);a.show();var e=b.effects.createWrapper(a).css({overflow:"hidden"}),h=d=="vertical"?"height":"width";d=d=="vertical"?e.height():e.width();f=="show"&&e.css(h,0);var i={};i[h]=f=="show"?d:0;e.animate(i,c.duration,c.options.easing,function(){f=="hide"&&a.hide();b.effects.restore(a,
+g);b.effects.removeWrapper(a);c.callback&&c.callback.apply(a[0],arguments);a.dequeue()})})}})(jQuery);
+;/*
+ * jQuery UI Effects Bounce 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Bounce
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function(e){e.effects.bounce=function(b){return this.queue(function(){var a=e(this),l=["position","top","bottom","left","right"],h=e.effects.setMode(a,b.options.mode||"effect"),d=b.options.direction||"up",c=b.options.distance||20,m=b.options.times||5,i=b.duration||250;/show|hide/.test(h)&&l.push("opacity");e.effects.save(a,l);a.show();e.effects.createWrapper(a);var f=d=="up"||d=="down"?"top":"left";d=d=="up"||d=="left"?"pos":"neg";c=b.options.distance||(f=="top"?a.outerHeight({margin:true})/3:a.outerWidth({margin:true})/
+3);if(h=="show")a.css("opacity",0).css(f,d=="pos"?-c:c);if(h=="hide")c/=m*2;h!="hide"&&m--;if(h=="show"){var g={opacity:1};g[f]=(d=="pos"?"+=":"-=")+c;a.animate(g,i/2,b.options.easing);c/=2;m--}for(g=0;g<m;g++){var j={},k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing);c=h=="hide"?c*2:c/2}if(h=="hide"){g={opacity:0};g[f]=(d=="pos"?"-=":"+=")+c;a.animate(g,i/2,b.options.easing,function(){a.hide();e.effects.restore(a,l);e.effects.removeWrapper(a);
+b.callback&&b.callback.apply(this,arguments)})}else{j={};k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing,function(){e.effects.restore(a,l);e.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments)})}a.queue("fx",function(){a.dequeue()});a.dequeue()})}})(jQuery);
+;/*
+ * jQuery UI Effects Clip 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Clip
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function(b){b.effects.clip=function(e){return this.queue(function(){var a=b(this),i=["position","top","bottom","left","right","height","width"],f=b.effects.setMode(a,e.options.mode||"hide"),c=e.options.direction||"vertical";b.effects.save(a,i);a.show();var d=b.effects.createWrapper(a).css({overflow:"hidden"});d=a[0].tagName=="IMG"?d:a;var g={size:c=="vertical"?"height":"width",position:c=="vertical"?"top":"left"};c=c=="vertical"?d.height():d.width();if(f=="show"){d.css(g.size,0);d.css(g.position,
+c/2)}var h={};h[g.size]=f=="show"?c:0;h[g.position]=f=="show"?0:c/2;d.animate(h,{queue:false,duration:e.duration,easing:e.options.easing,complete:function(){f=="hide"&&a.hide();b.effects.restore(a,i);b.effects.removeWrapper(a);e.callback&&e.callback.apply(a[0],arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Drop 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Drop
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function(c){c.effects.drop=function(d){return this.queue(function(){var a=c(this),h=["position","top","bottom","left","right","opacity"],e=c.effects.setMode(a,d.options.mode||"hide"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a);var f=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var g=d.options.distance||(f=="top"?a.outerHeight({margin:true})/2:a.outerWidth({margin:true})/2);if(e=="show")a.css("opacity",0).css(f,b=="pos"?-g:g);var i={opacity:e==
+"show"?1:0};i[f]=(e=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+g;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){e=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Explode 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Explode
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function(j){j.effects.explode=function(a){return this.queue(function(){var c=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3,d=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3;a.options.mode=a.options.mode=="toggle"?j(this).is(":visible")?"hide":"show":a.options.mode;var b=j(this).show().css("visibility","hidden"),g=b.offset();g.top-=parseInt(b.css("marginTop"),10)||0;g.left-=parseInt(b.css("marginLeft"),10)||0;for(var h=b.outerWidth(true),i=b.outerHeight(true),e=0;e<c;e++)for(var f=
+0;f<d;f++)b.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+
+e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery);
+;/*
+ * jQuery UI Effects Fade 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fade
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Fold 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fold
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","bottom","left","right"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1],
+10)/100*f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery);
+;/*
+ * jQuery UI Effects Highlight 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Highlight
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&&
+this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Pulsate 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Pulsate
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c<times;c++){b.animate({opacity:animateTo},duration,a.options.easing);animateTo=(animateTo+1)%2}b.animate({opacity:animateTo},duration,
+a.options.easing,function(){animateTo==0&&b.hide();a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()}).dequeue()})}})(jQuery);
+;/*
+ * jQuery UI Effects Scale 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Scale
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function(c){c.effects.puff=function(b){return this.queue(function(){var a=c(this),e=c.effects.setMode(a,b.options.mode||"hide"),g=parseInt(b.options.percent,10)||150,h=g/100,i={height:a.height(),width:a.width()};c.extend(b.options,{fade:true,mode:e,percent:e=="hide"?g:100,from:e=="hide"?i:{height:i.height*h,width:i.width*h}});a.effect("scale",b.options,b.duration,b.callback);a.dequeue()})};c.effects.scale=function(b){return this.queue(function(){var a=c(this),e=c.extend(true,{},b.options),g=c.effects.setMode(a,
+b.options.mode||"effect"),h=parseInt(b.options.percent,10)||(parseInt(b.options.percent,10)==0?0:g=="hide"?0:100),i=b.options.direction||"both",f=b.options.origin;if(g!="effect"){e.origin=f||["middle","center"];e.restore=true}f={height:a.height(),width:a.width()};a.from=b.options.from||(g=="show"?{height:0,width:0}:f);h={y:i!="horizontal"?h/100:1,x:i!="vertical"?h/100:1};a.to={height:f.height*h.y,width:f.width*h.x};if(b.options.fade){if(g=="show"){a.from.opacity=0;a.to.opacity=1}if(g=="hide"){a.from.opacity=
+1;a.to.opacity=0}}e.from=a.from;e.to=a.to;e.mode=g;a.effect("size",e,b.duration,b.callback);a.dequeue()})};c.effects.size=function(b){return this.queue(function(){var a=c(this),e=["position","top","bottom","left","right","width","height","overflow","opacity"],g=["position","top","bottom","left","right","overflow","opacity"],h=["width","height","overflow"],i=["fontSize"],f=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],k=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],
+p=c.effects.setMode(a,b.options.mode||"effect"),n=b.options.restore||false,m=b.options.scale||"both",l=b.options.origin,j={height:a.height(),width:a.width()};a.from=b.options.from||j;a.to=b.options.to||j;if(l){l=c.effects.getBaseline(l,j);a.from.top=(j.height-a.from.height)*l.y;a.from.left=(j.width-a.from.width)*l.x;a.to.top=(j.height-a.to.height)*l.y;a.to.left=(j.width-a.to.width)*l.x}var d={from:{y:a.from.height/j.height,x:a.from.width/j.width},to:{y:a.to.height/j.height,x:a.to.width/j.width}};
+if(m=="box"||m=="both"){if(d.from.y!=d.to.y){e=e.concat(f);a.from=c.effects.setTransition(a,f,d.from.y,a.from);a.to=c.effects.setTransition(a,f,d.to.y,a.to)}if(d.from.x!=d.to.x){e=e.concat(k);a.from=c.effects.setTransition(a,k,d.from.x,a.from);a.to=c.effects.setTransition(a,k,d.to.x,a.to)}}if(m=="content"||m=="both")if(d.from.y!=d.to.y){e=e.concat(i);a.from=c.effects.setTransition(a,i,d.from.y,a.from);a.to=c.effects.setTransition(a,i,d.to.y,a.to)}c.effects.save(a,n?e:g);a.show();c.effects.createWrapper(a);
+a.css("overflow","hidden").css(a.from);if(m=="content"||m=="both"){f=f.concat(["marginTop","marginBottom"]).concat(i);k=k.concat(["marginLeft","marginRight"]);h=e.concat(f).concat(k);a.find("*[width]").each(function(){child=c(this);n&&c.effects.save(child,h);var o={height:child.height(),width:child.width()};child.from={height:o.height*d.from.y,width:o.width*d.from.x};child.to={height:o.height*d.to.y,width:o.width*d.to.x};if(d.from.y!=d.to.y){child.from=c.effects.setTransition(child,f,d.from.y,child.from);
+child.to=c.effects.setTransition(child,f,d.to.y,child.to)}if(d.from.x!=d.to.x){child.from=c.effects.setTransition(child,k,d.from.x,child.from);child.to=c.effects.setTransition(child,k,d.to.x,child.to)}child.css(child.from);child.animate(child.to,b.duration,b.options.easing,function(){n&&c.effects.restore(child,h)})})}a.animate(a.to,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){a.to.opacity===0&&a.css("opacity",a.from.opacity);p=="hide"&&a.hide();c.effects.restore(a,
+n?e:g);c.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Shake 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Shake
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function(d){d.effects.shake=function(a){return this.queue(function(){var b=d(this),j=["position","top","bottom","left","right"];d.effects.setMode(b,a.options.mode||"effect");var c=a.options.direction||"left",e=a.options.distance||20,l=a.options.times||3,f=a.duration||a.options.duration||140;d.effects.save(b,j);b.show();d.effects.createWrapper(b);var g=c=="up"||c=="down"?"top":"left",h=c=="up"||c=="left"?"pos":"neg";c={};var i={},k={};c[g]=(h=="pos"?"-=":"+=")+e;i[g]=(h=="pos"?"+=":"-=")+e*2;k[g]=
+(h=="pos"?"-=":"+=")+e*2;b.animate(c,f,a.options.easing);for(e=1;e<l;e++)b.animate(i,f,a.options.easing).animate(k,f,a.options.easing);b.animate(i,f,a.options.easing).animate(c,f/2,a.options.easing,function(){d.effects.restore(b,j);d.effects.removeWrapper(b);a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()});b.dequeue()})}})(jQuery);
+;/*
+ * jQuery UI Effects Slide 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Slide
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function(c){c.effects.slide=function(d){return this.queue(function(){var a=c(this),h=["position","top","bottom","left","right"],f=c.effects.setMode(a,d.options.mode||"show"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a).css({overflow:"hidden"});var g=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var e=d.options.distance||(g=="top"?a.outerHeight({margin:true}):a.outerWidth({margin:true}));if(f=="show")a.css(g,b=="pos"?isNaN(e)?"-"+e:-e:e);
+var i={};i[g]=(f=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+e;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){f=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Transfer 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Transfer
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function(e){e.effects.transfer=function(a){return this.queue(function(){var b=e(this),c=e(a.options.to),d=c.offset();c={top:d.top,left:d.left,height:c.innerHeight(),width:c.innerWidth()};d=b.offset();var f=e('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments);
+b.dequeue()})})}})(jQuery);
+;
\ No newline at end of file
diff --git a/app/out/default/js/jquery.colorbox-min.js b/app/out/default/js/jquery.colorbox-min.js
new file mode 100644 (file)
index 0000000..b795ee8
--- /dev/null
@@ -0,0 +1,4 @@
+// ColorBox v1.3.16 - a full featured, light-weight, customizable lightbox based on jQuery 1.3+\r
+// Copyright (c) 2011 Jack Moore - jack@colorpowered.com\r
+// Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php\r
+(function(a,b,c){function ba(b){if(!T){O=b,Z(a.extend(J,a.data(O,e))),x=a(O),P=0,J.rel!=="nofollow"&&(x=a("."+V).filter(function(){var b=a.data(this,e).rel||this.rel;return b===J.rel}),P=x.index(O),P===-1&&(x=x.add(O),P=x.length-1));if(!R){R=S=!0,q.show();if(J.returnFocus)try{O.blur(),a(O).one(k,function(){try{this.focus()}catch(a){}})}catch(c){}p.css({opacity:+J.opacity,cursor:J.overlayClose?"pointer":"auto"}).show(),J.w=X(J.initialWidth,"x"),J.h=X(J.initialHeight,"y"),U.position(0),n&&y.bind("resize."+o+" scroll."+o,function(){p.css({width:y.width(),height:y.height(),top:y.scrollTop(),left:y.scrollLeft()})}).trigger("resize."+o),$(g,J.onOpen),I.add(C).hide(),H.html(J.close).show()}U.load(!0)}}function _(){var a,b=f+"Slideshow_",c="click."+f,d,e,g;J.slideshow&&x[1]&&(d=function(){E.text(J.slideshowStop).unbind(c).bind(i,function(){if(P<x.length-1||J.loop)a=setTimeout(U.next,J.slideshowSpeed)}).bind(h,function(){clearTimeout(a)}).one(c+" "+j,e),q.removeClass(b+"off").addClass(b+"on"),a=setTimeout(U.next,J.slideshowSpeed)},e=function(){clearTimeout(a),E.text(J.slideshowStart).unbind([i,h,j,c].join(" ")).one(c,d),q.removeClass(b+"on").addClass(b+"off")},J.slideshowAuto?d():e())}function $(b,c){c&&c.call(O),a.event.trigger(b)}function Z(b){for(var c in b)a.isFunction(b[c])&&c.substring(0,2)!=="on"&&(b[c]=b[c].call(O));b.rel=b.rel||O.rel||"nofollow",b.href=a.trim(b.href||a(O).attr("href")),b.title=b.title||O.title}function Y(a){return J.photo||/\.(gif|png|jpg|jpeg|bmp)(?:\?([^#]*))?(?:#(\.*))?$/i.test(a)}function X(a,b){b=b==="x"?y.width():y.height();return typeof a=="string"?Math.round(/%/.test(a)?b/100*parseInt(a,10):parseInt(a,10)):a}function W(c,d){var e=b.createElement("div");c&&(e.id=f+c),e.style.cssText=d||!1;return a(e)}var d={transition:"elastic",speed:300,width:!1,initialWidth:"600",innerWidth:!1,maxWidth:!1,height:!1,initialHeight:"450",innerHeight:!1,maxHeight:!1,scalePhotos:!0,scrolling:!0,inline:!1,html:!1,iframe:!1,fastIframe:!0,photo:!1,href:!1,title:!1,rel:!1,opacity:.9,preloading:!0,current:"image {current} of {total}",previous:"previous",next:"next",close:"close",open:!1,returnFocus:!0,loop:!0,slideshow:!1,slideshowAuto:!0,slideshowSpeed:2500,slideshowStart:"start slideshow",slideshowStop:"stop slideshow",onOpen:!1,onLoad:!1,onComplete:!1,onCleanup:!1,onClosed:!1,overlayClose:!0,escKey:!0,arrowKey:!0},e="colorbox",f="cbox",g=f+"_open",h=f+"_load",i=f+"_complete",j=f+"_cleanup",k=f+"_closed",l=f+"_purge",m=a.browser.msie&&!a.support.opacity,n=m&&a.browser.version<7,o=f+"_IE6",p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J={},K,L,M,N,O,P,Q,R,S,T=!1,U,V=f+"Element";U=a.fn[e]=a[e]=function(b,c){var f=this,g;if(!f[0]&&f.selector)return f;b=b||{},c&&(b.onComplete=c);if(!f[0]||f.selector===undefined)f=a("<a/>"),b.open=!0;f.each(function(){a.data(this,e,a.extend({},a.data(this,e)||d,b)),a(this).addClass(V)}),g=b.open,a.isFunction(g)&&(g=g.call(f)),g&&ba(f[0]);return f},U.init=function(){y=a(c),q=W().attr({id:e,"class":m?f+(n?"IE6":"IE"):""}),p=W("Overlay",n?"position:absolute":"").hide(),r=W("Wrapper"),s=W("Content").append(z=W("LoadedContent","width:0; height:0; overflow:hidden"),B=W("LoadingOverlay").add(W("LoadingGraphic")),C=W("Title"),D=W("Current"),F=W("Next"),G=W("Previous"),E=W("Slideshow").bind(g,_),H=W("Close")),r.append(W().append(W("TopLeft"),t=W("TopCenter"),W("TopRight")),W(!1,"clear:left").append(u=W("MiddleLeft"),s,v=W("MiddleRight")),W(!1,"clear:left").append(W("BottomLeft"),w=W("BottomCenter"),W("BottomRight"))).children().children().css({"float":"left"}),A=W(!1,"position:absolute; width:9999px; visibility:hidden; display:none"),a("body").prepend(p,q.append(r,A)),s.children().hover(function(){a(this).addClass("hover")},function(){a(this).removeClass("hover")}).addClass("hover"),K=t.height()+w.height()+s.outerHeight(!0)-s.height(),L=u.width()+v.width()+s.outerWidth(!0)-s.width(),M=z.outerHeight(!0),N=z.outerWidth(!0),q.css({"padding-bottom":K,"padding-right":L}).hide(),F.click(function(){U.next()}),G.click(function(){U.prev()}),H.click(function(){U.close()}),I=F.add(G).add(D).add(E),s.children().removeClass("hover"),a("."+V).live("click",function(a){a.button!==0&&typeof a.button!="undefined"||a.ctrlKey||a.shiftKey||a.altKey||(a.preventDefault(),ba(this))}),p.click(function(){J.overlayClose&&U.close()}),a(b).bind("keydown."+f,function(a){var b=a.keyCode;R&&J.escKey&&b===27&&(a.preventDefault(),U.close()),R&&J.arrowKey&&x[1]&&(b===37?(a.preventDefault(),G.click()):b===39&&(a.preventDefault(),F.click()))})},U.remove=function(){q.add(p).remove(),a("."+V).die("click").removeData(e).removeClass(V)},U.position=function(a,c){function g(a){t[0].style.width=w[0].style.width=s[0].style.width=a.style.width,B[0].style.height=B[1].style.height=s[0].style.height=u[0].style.height=v[0].style.height=a.style.height}var d,e=Math.max(b.documentElement.clientHeight-J.h-M-K,0)/2+y.scrollTop(),f=Math.max(y.width()-J.w-N-L,0)/2+y.scrollLeft();d=q.width()===J.w+N&&q.height()===J.h+M?0:a,r[0].style.width=r[0].style.height="9999px",q.dequeue().animate({width:J.w+N,height:J.h+M,top:e,left:f},{duration:d,complete:function(){g(this),S=!1,r[0].style.width=J.w+N+L+"px",r[0].style.height=J.h+M+K+"px",c&&c()},step:function(){g(this)}})},U.resize=function(a){if(R){a=a||{},a.width&&(J.w=X(a.width,"x")-N-L),a.innerWidth&&(J.w=X(a.innerWidth,"x")),z.css({width:J.w}),a.height&&(J.h=X(a.height,"y")-M-K),a.innerHeight&&(J.h=X(a.innerHeight,"y"));if(!a.innerHeight&&!a.height){var b=z.wrapInner("<div style='overflow:auto'></div>").children();J.h=b.height(),b.replaceWith(b.children())}z.css({height:J.h}),U.position(J.transition==="none"?0:J.speed)}},U.prep=function(b){function h(b){U.position(b,function(){var b,d,g,h,j=x.length,k,n;!R||(n=function(){B.hide(),$(i,J.onComplete)},m&&Q&&z.fadeIn(100),C.html(J.title).add(z).show(),j>1?(typeof J.current=="string"&&D.html(J.current.replace(/\{current\}/,P+1).replace(/\{total\}/,j)).show(),F[J.loop||P<j-1?"show":"hide"]().html(J.next),G[J.loop||P?"show":"hide"]().html(J.previous),b=P?x[P-1]:x[j-1],g=P<j-1?x[P+1]:x[0],J.slideshow&&E.show(),J.preloading&&(h=a.data(g,e).href||g.href,d=a.data(b,e).href||b.href,h=a.isFunction(h)?h.call(g):h,d=a.isFunction(d)?d.call(b):d,Y(h)&&(a("<img/>")[0].src=h),Y(d)&&(a("<img/>")[0].src=d))):I.hide(),J.iframe?(k=a("<iframe/>").addClass(f+"Iframe")[0],J.fastIframe?n():a(k).load(n),k.name=f+ +(new Date),k.src=J.href,J.scrolling||(k.scrolling="no"),m&&(k.frameBorder=0,k.allowTransparency="true"),a(k).appendTo(z).one(l,function(){k.src="//about:blank"})):n(),J.transition==="fade"?q.fadeTo(c,1,function(){q[0].style.filter=""}):q[0].style.filter="",y.bind("resize."+f,function(){U.position(0)}))})}function g(){J.h=J.h||z.height(),J.h=J.mh&&J.mh<J.h?J.mh:J.h;return J.h}function d(){J.w=J.w||z.width(),J.w=J.mw&&J.mw<J.w?J.mw:J.w;return J.w}if(!!R){var c=J.transition==="none"?0:J.speed;y.unbind("resize."+f),z.remove(),z=W("LoadedContent").html(b),z.hide().appendTo(A.show()).css({width:d(),overflow:J.scrolling?"auto":"hidden"}).css({height:g()}).prependTo(s),A.hide(),a(Q).css({"float":"none"}),n&&a("select").not(q.find("select")).filter(function(){return this.style.visibility!=="hidden"}).css({visibility:"hidden"}).one(j,function(){this.style.visibility="inherit"}),J.transition==="fade"?q.fadeTo(c,0,function(){h(0)}):h(c)}},U.load=function(b){var c,d,g=U.prep;S=!0,Q=!1,O=x[P],b||Z(a.extend(J,a.data(O,e))),$(l),$(h,J.onLoad),J.h=J.height?X(J.height,"y")-M-K:J.innerHeight&&X(J.innerHeight,"y"),J.w=J.width?X(J.width,"x")-N-L:J.innerWidth&&X(J.innerWidth,"x"),J.mw=J.w,J.mh=J.h,J.maxWidth&&(J.mw=X(J.maxWidth,"x")-N-L,J.mw=J.w&&J.w<J.mw?J.w:J.mw),J.maxHeight&&(J.mh=X(J.maxHeight,"y")-M-K,J.mh=J.h&&J.h<J.mh?J.h:J.mh),c=J.href,B.show(),J.inline?(W().hide().insertBefore(a(c)[0]).one(l,function(){a(this).replaceWith(z.children())}),g(a(c))):J.iframe?g(" "):J.html?g(J.html):Y(c)?(a(Q=new Image).addClass(f+"Photo").error(function(){J.title=!1,g(W("Error").text("This image could not be loaded"))}).load(function(){var a;Q.onload=null,J.scalePhotos&&(d=function(){Q.height-=Q.height*a,Q.width-=Q.width*a},J.mw&&Q.width>J.mw&&(a=(Q.width-J.mw)/Q.width,d()),J.mh&&Q.height>J.mh&&(a=(Q.height-J.mh)/Q.height,d())),J.h&&(Q.style.marginTop=Math.max(J.h-Q.height,0)/2+"px"),x[1]&&(P<x.length-1||J.loop)&&(Q.style.cursor="pointer",Q.onclick=function(){U.next()}),m&&(Q.style.msInterpolationMode="bicubic"),setTimeout(function(){g(Q)},1)}),setTimeout(function(){Q.src=c},1)):c&&A.load(c,function(b,c,d){g(c==="error"?W("Error").text("Request unsuccessful: "+d.statusText):a(this).contents())})},U.next=function(){!S&&x[1]&&(P<x.length-1||J.loop)&&(P=P<x.length-1?P+1:0,U.load())},U.prev=function(){!S&&x[1]&&(P||J.loop)&&(P=P?P-1:x.length-1,U.load())},U.close=function(){R&&!T&&(T=!0,R=!1,$(j,J.onCleanup),y.unbind("."+f+" ."+o),p.fadeTo(200,0),q.stop().fadeTo(300,0,function(){q.add(p).css({opacity:1,cursor:"auto"}).hide(),$(l),z.remove(),setTimeout(function(){T=!1,$(k,J.onClosed)},1)}))},U.element=function(){return a(O)},U.settings=d,a(U.init)})(jQuery,document,this);
\ No newline at end of file
diff --git a/app/out/default/layouts/admin.xml b/app/out/default/layouts/admin.xml
new file mode 100644 (file)
index 0000000..f2efa16
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<layout>
+
+  <admin page="admin.php">
+    <licences>
+      <index content="views/admin/licences/list.php" />
+      <add content="views/admin/licences/add.php" />
+      <edit content="views/admin/licences/edit.php" />
+    </licences>
+    <sourceml content="views/admin/sourceml.php" />
+    <cache content="views/admin/cache.php" />
+    <maintenance content="views/admin/maintenance.php" />
+  </admin>
+
+</layout>
\ No newline at end of file
diff --git a/app/out/default/layouts/content.xml b/app/out/default/layouts/content.xml
new file mode 100644 (file)
index 0000000..ce41c27
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<layout>
+
+  <content page="content.php">
+    <sources>
+      <sources content="views/content/sources/sources.php" />
+      <derivations content="views/content/sources/sources.php" />
+      <xml_form content="views/content/sources/xml_form.php" />
+    </sources>
+  </content>
+
+</layout>
\ No newline at end of file
diff --git a/app/out/default/layouts/forms.xml b/app/out/default/layouts/forms.xml
new file mode 100644 (file)
index 0000000..5d94174
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<layout>
+
+  <forms page="index.php">
+    <sourceml>
+      <contact_author page="sources.php" content="views/forms/sourceml/contact_author.php" />
+    </sourceml>
+  </forms>
+
+</layout>
\ No newline at end of file
diff --git a/app/out/default/layouts/sources.xml b/app/out/default/layouts/sources.xml
new file mode 100644 (file)
index 0000000..f1b18b0
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<layout>
+
+  <sources page="sources.php">
+    <groupe content="views/sources/groupe/list.php">
+      <view content="views/sources/groupe/view.php" />
+    </groupe>
+    <album content="views/sources/album/list.php">
+      <view content="views/sources/album/view.php" />
+    </album>
+    <morceau content="views/sources/morceau/list.php">
+      <view content="views/sources/morceau/view.php" />
+    </morceau>
+    <piste content="views/sources/piste/list.php">
+      <view content="views/sources/piste/view.php" />
+    </piste>
+  </sources>
+
+</layout>
\ No newline at end of file
diff --git a/app/out/default/layouts/users.xml b/app/out/default/layouts/users.xml
new file mode 100644 (file)
index 0000000..127e597
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<layout>
+
+  <users page="index.php">
+    <groupes page="compte.php" content="views/users/groupes/list.php">
+      <add content="views/users/groupes/add.php" />
+      <edit content="views/users/groupes/edit.php" />
+    </groupes>
+    <albums page="compte.php" content="views/users/albums/list.php">
+      <add content="views/users/albums/add.php" />
+      <edit content="views/users/albums/edit.php" />
+    </albums>
+    <morceaux page="compte.php" content="views/users/morceaux/list.php">
+      <add content="views/users/morceaux/add.php" />
+      <edit content="views/users/morceaux/edit.php" />
+    </morceaux>
+    <pistes page="compte.php" content="views/users/pistes/list.php">
+      <add content="views/users/pistes/add.php" />
+      <add_source content="views/users/pistes/add_source.php" />
+      <edit content="views/users/pistes/edit.php" />
+    </pistes>
+  </users>
+
+</layout>
\ No newline at end of file
diff --git a/app/out/default/sources.php b/app/out/default/sources.php
new file mode 100644 (file)
index 0000000..0f9a870
--- /dev/null
@@ -0,0 +1,38 @@
+<!doctype html>
+<html>
+  <head>
+<?php require $this->out_file("views/head.php"); ?>
+  </head>
+  <body>
+
+    <header id="main_header">
+      <div class="content">
+<?php require $this->out_file("views/header.php"); ?>
+     </div>
+    </header>
+
+    <div id="main">
+      <div class="content">
+
+<?php if($this->out_config("colonne")) : ?>
+        <div id="colonne">
+<?php require $this->out_file("views/sources/colonne.php"); ?>
+        </div>
+<?php endif; ?>
+
+        <div id="center"<?php echo $this->out_config("colonne") ? "" : " class=\"no_colonne\""; ?>>
+<?php require $this->out_file("views/messages.php"); ?>
+<?php if($layout["content"] && $this->out_file_exists($layout["content"])) require $this->out_file($layout["content"]); ?>
+        </div>
+
+      </div>
+    </div>
+
+    <footer id="main_footer">
+      <div class="content">
+<?php require $this->out_file("views/footer.php"); ?>
+     </div>
+    </footer>
+
+  </body>
+</html>
diff --git a/app/out/default/views/admin/cache.php b/app/out/default/views/admin/cache.php
new file mode 100644 (file)
index 0000000..3f1e70d
--- /dev/null
@@ -0,0 +1,37 @@
+<h2>Gestion du cache</h2>
+
+<p class="info">
+  Pour les fichiers XML externes (r&eacute;f&eacute;rences et d&eacute;rivations).
+</p>
+
+<form name="config_form" action="<?php echo $this->url("admin/cache") ?>" method="post">
+  <fieldset>
+    <ul>
+      <li>
+        <label for="cache_actif">utiliser le cache</label>
+        <div class="form_input">
+                <input type="radio" name="cache_actif" id="cache_actif_oui" value="1"<?php echo $this->out["config"]["cache_actif"] ? " checked=\"checked\"" : "" ?> /> oui
+          <br /><input type="radio" name="cache_actif" id="cache_actif_non" value="0"<?php echo $this->out["config"]["cache_actif"] ? "" : " checked=\"checked\"" ?> /> non
+        </div>
+      </li>
+      <li id="li_cache_maj_auto" <?php echo $this->out["config"]["cache_actif"] ? "" : " style=\"display: none\"" ?>>
+        <label for="cache_maj_auto">mise &agrave; jour du cache</label>
+        <div class="form_input">
+                <input type="radio" name="cache_maj_auto" id="cache_maj_auto_oui" value="1"<?php echo $this->out["config"]["cache_maj_auto"] ? " checked=\"checked\"" : "" ?> /> automatique
+          <br /><input type="radio" name="cache_maj_auto" id="cache_maj_auto_non" value="0"<?php echo $this->out["config"]["cache_maj_auto"] ? "" : " checked=\"checked\"" ?> /> manuelle
+        </div>
+      </li>
+      <li id="li_cache_time" <?php echo $this->out["config"]["cache_actif"] && $this->out["config"]["cache_maj_auto"] ? "" : " style=\"display: none\"" ?>>
+        <label for="cache_time">dur&eacute;e de validit&eacute; du cache</label>
+        <div class="form_input">
+          <input type="text" size="5" name="cache_time" id="cache_time" value="<?php echo $this->out["config"]["cache_time"] ?>" /> heures
+        </div>
+      </li>
+      <li>
+        <div class="form_single_button">
+          <input type="submit" value="Enregistrer" />
+        </div>
+      </li>
+    </ul>
+  </fieldset>
+</form>
diff --git a/app/out/default/views/admin/licences/add.php b/app/out/default/views/admin/licences/add.php
new file mode 100644 (file)
index 0000000..bd54fa7
--- /dev/null
@@ -0,0 +1,29 @@
+<h2>Nouvelle licence</h2>
+
+<ul class="buttons">
+  <li><a href="<?php echo $this->url("admin/licences") ?>">Retour &agrave; la liste des licences</a></li>
+</ul>
+
+<form name="licence_form" action="<?php echo $this->url("admin/licences/add") ?>" method="post">
+  <fieldset>
+    <ul>
+      <li>
+        <label for="nom">nom</label>
+        <div class="form_input">
+          <input size="45" type="text" name="nom" id="nom" value="<?php echo isset($this->out["licence"]["nom"]) ? $this->out["licence"]["nom"] : "" ?>" />
+        </div>
+      </li>
+      <li>
+        <label for="url">url</label>
+        <div class="form_input">
+          <input size="45" type="text" name="url" id="url" value="<?php echo isset($this->out["licence"]["url"]) ? $this->out["licence"]["url"] : "" ?>" />
+        </div>
+      </li>
+      <li>
+        <div class="form_single_button">
+          <input type="submit" value="Ajouter" />
+        </div>
+      </li>
+    </ul>
+  </fieldset>
+</form>
\ No newline at end of file
diff --git a/app/out/default/views/admin/licences/edit.php b/app/out/default/views/admin/licences/edit.php
new file mode 100644 (file)
index 0000000..5d9112b
--- /dev/null
@@ -0,0 +1,29 @@
+<h2>Modifier une licence</h2>
+
+<ul class="buttons">
+  <li><a href="<?php echo $this->url("admin/licences") ?>">Retour &agrave; la liste des licences</a></li>
+</ul>
+
+<form name="licence_form" action="<?php echo $this->url("admin/licences/edit", array("id" => $_GET[$this->param("id")])) ?>" method="post">
+  <fieldset>
+    <ul>
+      <li>
+        <label for="nom">nom</label>
+        <div class="form_input">
+          <input size="45" type="text" name="nom" id="nom" value="<?php echo $this->out["licence"]["nom"] ?>" />
+        </div>
+      </li>
+      <li>
+        <label for="url">url</label>
+        <div class="form_input">
+          <input size="45" type="text" name="url" id="url" value="<?php echo $this->out["licence"]["url"] ?>" />
+        </div>
+      </li>
+      <li>
+        <div class="form_single_button">
+          <input type="submit" value="Enregistrer" />
+        </div>
+      </li>
+    </ul>
+  </fieldset>
+</form>
\ No newline at end of file
diff --git a/app/out/default/views/admin/licences/list.php b/app/out/default/views/admin/licences/list.php
new file mode 100644 (file)
index 0000000..9952799
--- /dev/null
@@ -0,0 +1,32 @@
+<h2>Les licences</h2>
+
+<ul class="buttons">
+  <li><a class="add" href="<?php echo $this->url("admin/licences/add") ?>">Nouvelle licence</a></li>
+</ul>
+
+<?php if($this->out["licences"]["list"]) : ?>
+<table class="admin">
+  <tr>
+    <th>nom</th>
+    <th align="center" colspan="2">actions</th>
+  </tr>
+<?php foreach($this->out["licences"]["list"] as $id_licence => $licence) : ?>
+  <tr class="hl">
+    <td><?php echo $licence["nom"] ?></td>
+    <td class="action">
+    <a href="<?php echo $this->url("admin/licences/edit", array("id" => $id_licence)) ?>"
+       class="admin_link"
+       title="modifier cette licence"><img src="<?php echo $this->out_url("icons/edit.gif") ?>" /></a>
+    </td>
+    <td class="action">
+    <a href="<?php echo $this->url("admin/licences/del", array("id" => $id_licence)) ?>"
+       class="admin_link"
+       title="supprimer cette licence"><img src="<?php echo $this->out_url("icons/del.gif") ?>"
+       onclick="return confirm('Supprimer cette licence ?')"/></a>
+    </td>
+  </tr>
+<?php endforeach; ?>
+</table>
+<?php else : ?>
+  <p>Aucune licence pour le moment...</p>
+<?php endif; ?>
\ No newline at end of file
diff --git a/app/out/default/views/admin/maintenance.php b/app/out/default/views/admin/maintenance.php
new file mode 100644 (file)
index 0000000..54ab459
--- /dev/null
@@ -0,0 +1,22 @@
+<h2>Maintenance</h2>
+
+<br />
+<h3>Cache</h3>
+
+<ul class="admin">
+  <li><a href="<?php echo $this->url("admin/maintenance/empty_cache") ?>">Vider le cache</a></li>
+</ul>
+
+<br />
+<h3>Fichiers XML des sources</h3>
+
+<br />
+<p>
+  Si vous avez migr&eacute; votre site ou que d'une mani&egrave;re ou d'une autre, l'URL de votre installation de
+  sourceML a chang&eacute;, vous devriez mettre &agrave; jour les fichiers XML des sources, pour qu'ils prennent
+  en compte votre nouvelle URL.
+</p>
+
+<ul class="admin">
+  <li><a href="<?php echo $this->url("admin/maintenance/maj_all_xml") ?>">Mettre &agrave; jour les fichiers XML</a></li>
+</ul>
\ No newline at end of file
diff --git a/app/out/default/views/admin/sourceml.php b/app/out/default/views/admin/sourceml.php
new file mode 100644 (file)
index 0000000..c48e1bf
--- /dev/null
@@ -0,0 +1,45 @@
+<h2>Configuration de SourceML</h2>
+
+<form name="config_form" action="<?php echo $this->url("admin/sourceml") ?>" method="post">
+  <fieldset>
+    <ul class="form">
+      <li>
+        <label for="start_action">Accueil du site</label>
+        <div class="form_input">
+          <select name="start_action" id="start_action" onchange="select_start_action(this.options[this.selectedIndex].value)">
+            <option value="sources/groupe"<?php echo "sources/groupe" == $this->out["config"]["start_action"] ? " selected" : "" ?>>Liste des groupes</option>
+  <?php if($this->out["groupes"]["list"]) : ?>
+            <option value="sources/groupe/view"<?php echo "sources/groupe/view" == $this->out["config"]["start_action"] ? " selected" : "" ?>>Un groupe</option>
+  <?php endif; ?>
+  <?php if($this->out["albums"]["list"]) : ?>
+            <option value="sources/album/view"<?php echo "sources/album/view" == $this->out["config"]["start_action"] ? " selected" : "" ?>>Un album</option>
+  <?php endif; ?>
+            <option value=""<?php echo substr($this->out["config"]["start_action"], 0, 7) == "sources" ? "" : " selected" ?>>Accueil par défaut du site</option>
+          </select>
+  
+  <?php if($this->out["groupes"]["list"]) : ?>
+          <select name="groupe_param" id="groupe_param"<?php if($this->out["config"]["start_action"] != "sources/groupe/view") : ?> style="display:none;"<?php endif; ?>>
+          <?php foreach($this->out["groupes"]["list"] as $id_groupe => $groupe) : ?>
+            <option value="<?php echo $id_groupe ?>"<?php echo $this->out["config"]["start_action_params"]["id"] == $id_groupe ? " selected=\"selected\"" : "" ?>><?php echo $groupe["nom"] ?></option>
+          <?php endforeach; ?>
+          </select>
+  <?php endif; ?>
+  
+  <?php if($this->out["albums"]["list"]) : ?>
+          <select name="album_param" id="album_param"<?php if($this->out["config"]["start_action"] != "sources/album/view") : ?> style="display:none;"<?php endif; ?>>
+          <?php foreach($this->out["albums"]["list"] as $id_album => $album) : ?>
+            <option value="<?php echo $id_album ?>"<?php echo $this->out["config"]["start_action_params"]["album"] == $id_album ? " selected=\"selected\"" : "" ?>><?php echo $album["titre"] ?></option>
+          <?php endforeach; ?>
+          </select>
+  <?php endif; ?>
+        </div>
+      </li>
+      <li>
+        <div class="form_single_button">
+          <input type="submit" value="Enregistrer" />
+        </div>
+      </li>
+    </ul>
+  </fieldset>
+
+</form>
diff --git a/app/out/default/views/content/sources/sources.php b/app/out/default/views/content/sources/sources.php
new file mode 100644 (file)
index 0000000..a8efbef
--- /dev/null
@@ -0,0 +1,23 @@
+<?php
+
+  if($sources = $this->out["sources"]["list"]) :
+  $url_params = $this->out["url_params"];
+  foreach($sources as $id_source => $source) :
+    $url_params[$this->out["source_param"]] = $id_source;
+
+?>
+<ul class="sources">
+<?php
+
+  $source["url"] = $this->url("sources/".$this->out["source_controller"]."/view", $url_params);
+  require $this->out_file("views/sources/source.php");
+
+?>
+</ul>
+<?php
+
+  endforeach;
+  else : echo "<p class=\"no_source\">pas de source</p>";
+  endif;
+
+?>
\ No newline at end of file
diff --git a/app/out/default/views/content/sources/xml_form.php b/app/out/default/views/content/sources/xml_form.php
new file mode 100644 (file)
index 0000000..f4b8925
--- /dev/null
@@ -0,0 +1,77 @@
+<?php
+
+  $out = $this->get_out();
+
+  $xml_name = isset($out["form_params"]["name"]) ? $out["form_params"]["name"] : "sml_xn";
+  $xml_label = isset($out["form_params"]["label"]) ? $out["form_params"]["label"] : "";
+  $xml_maj_url = isset($out["form_params"]["maj_url"]) ? $out["form_params"]["maj_url"] : "";
+  $xml_id = isset($out["form_params"]["id"]) ? $out["form_params"]["id"] : "";
+  $xml_id_suffix = isset($out["form_params"]["id"]) ? "_".$out["form_params"]["id"] : "";
+  $xml_can_delete = isset($out["form_params"]["can_delete"]) ? $out["form_params"]["can_delete"] : false;
+  $source = $this->out("xml_form_source");
+  if(!$source) $source = $data->empty_source();
+
+?>
+<div class="admin_source_infos" id="<?php echo $xml_name ?>_infos<?php echo $xml_id_suffix ?>">
+
+  <?php if($xml_id) : ?>
+  <input type="hidden" name="<?php echo $xml_name ?>_id<?php echo $xml_id_suffix ?>" value="on" />
+  <?php endif; ?>
+
+  <div>
+    <ul class="admin_source_head">
+    <?php if(isset($source["xml"]) && $source["xml"]) : ?>
+      <li class="admin_form_title"><?php echo $xml_label ?><a href="<?php echo $source["from"] ?>"><strong><?php echo $source["titre"] ?></strong></a></li>
+    <?php endif; ?>
+    <?php if($xml_maj_url && $this->config("cache_actif")) : ?>
+      <li><a href="<?php echo $xml_maj_url ?>">Recharger</a></li>
+    <?php endif; ?>
+    <?php if($xml_can_delete) : ?>
+      <li><a href="#" onclick="del_sml_xf('<?php echo $xml_name ?>_infos<?php echo $xml_id_suffix ?>'); return false;">Enlever</a></li>
+    <?php endif; ?>
+    </ul>
+    <div class="admin_source_url">URL du fichier XML
+    : <input type="text" id="<?php echo $xml_name ?><?php echo $xml_id_suffix ?>" name="<?php echo $xml_name ?><?php echo $xml_id_suffix ?>" size="40" value="<?php echo isset($source["xml"]["url"]) ? $source["xml"]["url"] : "" ?>" />
+    </div>
+  </div>
+
+  <?php if($source["titre"] && $source["xml"]) : ?>
+  <ul class="xml_infos">
+    <li>
+      source :
+      <a href="<?php echo $source["from"] ?>">
+        <?php echo $source["titre"] ?>
+        (<?php echo $source["auteur"] ?>)
+      </a>
+    </li>
+    <li>
+      xml :
+      <a href="<?php echo $source["xml"]["url"] ?>"><?php echo $source["xml"]["url"] ?></a>
+    </li>
+    <?php if($source["licence"]) : ?>
+    <li>licence : <a href="<?php echo $source["licence"]["url"] ?>"><?php echo $source["licence"]["nom"] ?></a></li>
+    <?php endif; ?>
+    <?php if($source["documents"]) : ?>
+    <li>
+      fichiers :
+      <ul>
+      <?php foreach($source["documents"] as $id_document => $document) : ?>
+        <li><a href="<?php echo $document["url"] ?>"><?php echo $document["nom"] ?></a></li>
+      <?php endforeach; ?>
+      </ul>
+    </li>
+    <?php endif; ?>
+  </ul>
+  <?php endif; ?>
+
+  <div>
+    <span id="<?php echo $xml_name ?>_edit<?php echo $xml_id_suffix ?>" class="xml_edit_content">
+      Editer le contenu du fichier XML
+      <input type="checkbox" class="use_edit_<?php echo $xml_name ?>_content" id="use_edit_<?php echo $xml_name ?>_content<?php echo $xml_id_suffix ?>" name="use_edit_<?php echo $xml_name ?>_content<?php echo $xml_id_suffix ?>"<?php echo $source["xml"]["use_edit_content"] ? " checked=\"checked\"" : "" ?> />
+      <span<?php echo $source["xml"]["use_edit_content"] ? "" : " style=\"display:none\"" ?>>
+        <textarea name="edit_<?php echo $xml_name ?>_content<?php echo $xml_id_suffix ?>" id="edit_<?php echo $xml_name ?>_content<?php echo $xml_id_suffix ?>" cols="64" rows="15" wrap="off"><?php echo $source["xml"]["content"] ?></textarea>
+      </span>
+    </span>
+  </div>
+
+</div>
diff --git a/app/out/default/views/forms/sourceml/contact_author.php b/app/out/default/views/forms/sourceml/contact_author.php
new file mode 100644 (file)
index 0000000..5aac027
--- /dev/null
@@ -0,0 +1,39 @@
+<div id="contact">
+
+  <h2><a href="#" onclick="return false;">Envoyer un message &agrave; <?php echo $this->out["groupe"]["nom"] ?></a></h2>
+
+  <form action="<?php echo $this->url("forms/sourceml/contact_author", array("id" => $this->out["groupe"]["id"])) ?>" method="post">
+    </fieldset>
+      <ul class="form">
+        <li>
+          <label for="email">email</label>
+          <div class="form_input">
+            <input type="text" name="email" id="email" value="<?php echo isset($_POST["email"]) ? $_POST["email"] : "" ?>" />
+          </div>
+        </li>
+        <li>
+          <label for="message">message</label>
+          <div class="form_input">
+            <textarea name="message" id="message" rows="16" cols="50"><?php echo isset($_POST["message"]) ? $_POST["message"] : "" ?></textarea>
+          </div>
+        </li>
+  <?php if($this->out["groupe"]["captcha"]) : ?>
+        <li>
+          <label for="ptitcaptcha_entry">anti-spam</label>
+          <div class="form_input">
+            <?php echo PtitCaptchaHelper::generateImgTags($this->path("mw_path")."libs/") ?>
+            <?php echo PtitCaptchaHelper::generateHiddenTags() ?>
+            <?php echo PtitCaptchaHelper::generateInputTags() ?>
+          </div>
+        </li>
+  <?php endif; ?>
+        <li class="buttons">
+          <div class="form_single_button">
+            <input type="submit" value="Envoyer" />
+          </div>
+        </li>
+      </ul>
+    </fieldset>
+  </form>
+
+</div>
diff --git a/app/out/default/views/sources/album/ariane.php b/app/out/default/views/sources/album/ariane.php
new file mode 100644 (file)
index 0000000..3ea943e
--- /dev/null
@@ -0,0 +1,13 @@
+<h2>Albums</h2>
+<?php $ariane_params = array(); ?>
+<?php $FIRST = true; ?>
+<h2>
+<?php if(isset($this->out["groupe"]) && $this->out["groupe"]) : $ariane_params["groupe"] = $this->out["groupe"]["id"]; ?>
+  <?php if($FIRST) : $FIRST = false; else : ?>&raquo;<?php endif; ?>
+  <a href="<?php echo $this->url("sources/groupe/view", array("id" => $this->out["groupe"]["id"])) ?>"><?php echo $this->out["groupe"]["nom"] ?></a>
+<?php endif; ?>
+<?php if(isset($this->out["album"]) && $this->out["album"]) : ?>
+  <?php if($FIRST) : $FIRST = false; else : ?>&raquo;<?php endif; ?>
+  <a href="<?php echo $this->url("sources/album/view", array("album" => $this->out["album"]["id"])) ?>"><?php echo $this->out["album"]["titre"] ?></a>
+<?php endif; ?>
+</h2>
diff --git a/app/out/default/views/sources/album/list.php b/app/out/default/views/sources/album/list.php
new file mode 100644 (file)
index 0000000..05328e1
--- /dev/null
@@ -0,0 +1,52 @@
+<?php require $this->out_file("views/sources/album/ariane.php"); ?>
+
+<?php if($this->out["groupes"]["total"] > 1) : ?>
+
+<ul class="buttons">
+  <li>
+    <select onchange="document.location=this.options[this.selectedIndex].value;">
+      <option value="<?php echo $this->url("sources/album") ?>"<?php echo $_GET[$this->param("groupe")] == "0" ? " selected=\"selected\"" : "" ?>>Tous les groupes</option>
+      <?php foreach($this->out["groupes"]["list"] as $id_groupe => $groupe) : ?>
+      <option value="<?php echo $this->url("sources/album", array("groupe" => $id_groupe)) ?>"<?php echo $_GET[$this->param("groupe")] == $id_groupe ? " selected=\"selected\"" : "" ?>><?php echo $groupe["nom"] ?></option>
+      <?php endforeach; ?>
+    </select>
+  </li>
+</ul>
+
+<?php endif; ?>
+
+<?php if(false && $this->out["groupe"]) : ?>
+<div class="description">
+<?php echo $this->out["groupe"]["description"] ?>
+</div>
+<?php endif; ?>
+
+<div class="clear"><!-- --></div>
+
+<?php
+
+  if($this->out["albums"]["list"]) :
+  $source_status = "album";
+  $url_params = array();
+
+?>
+
+<?php $items = "albums"; $legend = "albums"; require $this->out_file("views/navig.php"); ?>
+
+<ul class="sources">
+<?php
+
+  foreach($this->out["albums"]["list"] as $id_source => $source)
+  { $url_params["album"] = $id_source;
+    $source["url"] = $this->url("sources/album/view", $url_params);
+    require $this->out_file("views/sources/source.php");
+  }
+
+?>
+</ul>
+
+<?php $items = "albums"; $legend = "albums"; require $this->out_file("views/navig.php"); ?>
+
+<?php else : ?>
+<p>Aucun album pour le moment</p>
+<?php endif; ?>
diff --git a/app/out/default/views/sources/album/view.php b/app/out/default/views/sources/album/view.php
new file mode 100644 (file)
index 0000000..5cf73de
--- /dev/null
@@ -0,0 +1,96 @@
+<h2>
+  <a href="<?php echo $this->url("sources/album/view", array("album" => $this->out["album"]["id"])) ?>">
+    <?php echo $this->out["album"]["reference"] ? $this->out["album"]["reference"]["titre"] : $this->out["album"]["titre"] ?>
+  </a>
+  &nbsp;
+</h2>
+
+<?php
+
+  if
+  (    $this->out["album"]["image_uri"]
+    && file_exists($this->out["album"]["image_uri"])
+    && ($img_size = $data->img_size($this->out["album"]["image_uri"], 150, 150)) !== false
+  ) :
+  $margin_top = floor((150 - $img_size["height"]) / 2);
+  $album_image_uri = $this->path("web").$this->out["album"]["image_uri"];
+?>
+<p>
+  <img src="<?php echo $album_image_uri ?>"
+       width="<?php echo $img_size["width"] ?>"
+       height="<?php echo $img_size["height"] ?>"
+       style="margin-top:<?php echo $margin_top ?>px"
+       alt="" />
+</p>
+<?php endif; ?>
+
+
+<ul class="sources">
+<?php
+
+  $source_status = "album";
+  $source = $this->out["album"];
+  $display_name = false;
+  require $this->out_file("views/sources/source.php");
+
+?>
+</ul>
+
+<div class="description">
+<?php echo $this->out["album"]["description"] ?>
+</div>
+
+<div class="clear"><!-- --></div>
+
+<?php
+
+  if($this->out["morceaux"]["list"]) :
+  $source_status = "morceau";
+  $url_params = array("album" => $this->out["album"]["id"]);
+
+?>
+
+<h3>Morceaux</h3>
+
+<?php
+
+  $HAS_MP3_DOCUMENT = false;
+  foreach($this->out["morceaux"]["list"] as $id_source => $source)
+  { $documents = $source["reference"] ? $source["reference"]["documents"] : $source["documents"];
+    if($documents)
+    { foreach($documents as $id_document => $document)
+      { if(strtolower(substr($document["url"], -4)) == ".mp3")
+        { $HAS_MP3_DOCUMENT = true;
+          break;
+        }
+      }
+    }
+    if($HAS_MP3_DOCUMENT) break;
+  }
+  if($HAS_MP3_DOCUMENT) :
+
+?>
+
+<p id="play_all"><a href="#" onclick="play_all(); return false;">Ecouter l'album</a></p>
+<div class="clear"><!-- --></div>
+
+<?php endif; ?>
+
+<?php $items = "morceaux"; $legend = "morceaux"; require $this->out_file("views/navig.php"); ?>
+
+<ul class="sources source_arbo">
+<?php
+
+  foreach($this->out["morceaux"]["list"] as $id_source => $source)
+  { $url_params["morceau"] = $id_source;
+    $source["url"] = $this->url("sources/morceau/view", $url_params);
+    $display_name = true;
+    require $this->out_file("views/sources/source.php");
+  }
+
+?>
+</ul>
+
+<?php $items = "morceaux"; $legend = "morceaux"; require $this->out_file("views/navig.php"); ?>
+
+<?php endif; ?>
\ No newline at end of file
diff --git a/app/out/default/views/sources/ariane.php b/app/out/default/views/sources/ariane.php
new file mode 100644 (file)
index 0000000..7b11ef1
--- /dev/null
@@ -0,0 +1,21 @@
+<h2>Pistes</h2>
+<?php $ariane_params = array(); ?>
+<?php $FIRST = true; ?>
+<h2>
+<?php if(isset($this->out["groupe"]) && $this->out["groupe"]) : $ariane_params["groupe"] = $this->out["groupe"]["id"]; ?>
+  <?php if($FIRST) : $FIRST = false; else : ?>&raquo;<?php endif; ?>
+  <a href="<?php echo $this->url("sources/groupe/view", array("id" => $this->out["groupe"]["id"])) ?>"><?php echo $this->out["groupe"]["nom"] ?></a>
+<?php endif; ?>
+<?php if(isset($this->out["album"]) && $this->out["album"]) : $ariane_params["album"] = $this->out["album"]["id"]; ?>
+  <?php if($FIRST) : $FIRST = false; else : ?>&raquo;<?php endif; ?>
+  <a href="<?php echo $this->url("sources/album/view", $ariane_params) ?>"><?php echo $this->out["album"]["titre"] ?></a>
+<?php endif; ?>
+<?php if(isset($this->out["morceau"]) && $this->out["morceau"]) : $ariane_params["morceau"] = $this->out["morceau"]["id"]; ?>
+  <?php if($FIRST) : $FIRST = false; else : ?>&raquo;<?php endif; ?>
+  <a href="<?php echo $this->url("sources/morceau/view", $ariane_params) ?>"><?php echo $this->out["morceau"]["titre"] ?></a>
+<?php endif; ?>
+<?php if(isset($this->out["piste"]) && $this->out["piste"]) : $ariane_params["piste"] = $this->out["piste"]["id"]; ?>
+  <?php if($FIRST) : $FIRST = false; else : ?>&raquo;<?php endif; ?>
+  <a href="<?php echo $this->url("sources/piste/view", $ariane_params) ?>"><?php echo $this->out["piste"]["titre"] ?></a>
+<?php endif; ?>
+</h2>
diff --git a/app/out/default/views/sources/colonne.php b/app/out/default/views/sources/colonne.php
new file mode 100644 (file)
index 0000000..f2a22e1
--- /dev/null
@@ -0,0 +1,8 @@
+<?php
+
+  require $this->out_file("views/sources/groupe_box.php");
+//  require $this->out_file("views/sources/navig_menu.php");
+
+?>
+
+<br />
diff --git a/app/out/default/views/sources/current_album.php b/app/out/default/views/sources/current_album.php
new file mode 100644 (file)
index 0000000..f0af20f
--- /dev/null
@@ -0,0 +1,31 @@
+<?php if(isset($this->out["album"]) && $this->out["album"]) : $album = $this->out["album"]; ?>
+
+<ul id="album_links">
+  <li><a href="<?php echo $this->url("sources/album/view", array("album" => $album["id"])) ?>">album</a></li>
+</ul>
+
+<ul class="menu_albums">
+  <li><a href="<?php echo $this->url("sources/album/view", array("album" => $album["id"])) ?>" title="<?php echo str_replace("\"", "&quot;", $album["titre"]) ?>">
+
+  <?php
+
+    if
+    (    $album["image_uri"]
+      && file_exists($album["image_uri"])
+      && ($img_size = $data->img_size($album["image_uri"], 90, 90)) !== false
+    ) :
+    $margin_top = floor((90 - $img_size["height"]) / 2);
+
+  ?>
+    <img src="<?php echo $this->path("web").$album["image_uri"]; ?>"
+         width="<?php echo $img_size["width"] ?>"
+         height="<?php echo $img_size["height"] ?>"
+         style="margin-top:<?php echo $margin_top ?>px" />
+  <?php endif; ?>
+  <span><?php echo $album["titre"] ?></span>
+  </a></li>
+</ul>
+
+<div class="clear"><!-- --></div>
+
+<?php endif; ?>
diff --git a/app/out/default/views/sources/current_album_box.php b/app/out/default/views/sources/current_album_box.php
new file mode 100644 (file)
index 0000000..5a2dcdb
--- /dev/null
@@ -0,0 +1,11 @@
+<?php if($this->etat("mod") == "sources" && $this->etat("controller") == "groupe" && $this->etat("action") == "view") : ?>
+
+<?php if($this->out_config("nom_groupe")) require $this->out_file("views/sources/nom_groupe.php"); ?>
+
+<?php if($this->out_config("colonne_logo_groupe")) require $this->out_file("views/sources/logo_groupe.php"); ?>
+
+<?php endif; ?>
+
+<?php if($this->out_config("albums_menu")) require $this->out_file("views/sources/current_album.php"); ?>
+
+<?php require $this->out_file("views/sources/lien_contact.php"); ?>
diff --git a/app/out/default/views/sources/entete_groupe.php b/app/out/default/views/sources/entete_groupe.php
new file mode 100644 (file)
index 0000000..26d9055
--- /dev/null
@@ -0,0 +1,27 @@
+      <?php if(isset($this->out["albums"]) && $this->out["albums"]["list"]) : ?>
+      <ul class="menu_albums">
+      <?php foreach($this->out["albums"]["list"] as $id_album => $album) : ?>
+        <li><a href="<?php echo $this->url("sources/album/view", array("album" => $id_album)) ?>" title="<?php echo str_replace("\"", "&quot;", $album["titre"]) ?>">
+
+        <?php
+
+          if
+          (    $album["image_uri"]
+            && file_exists($album["image_uri"])
+            && ($img_size = $data->img_size($album["image_uri"], 90, 90)) !== false
+          ) :
+          $margin_top = floor((90 - $img_size["height"]) / 2);
+
+        ?>
+          <img src="<?php echo $this->path("web").$album["image_uri"]; ?>"
+               width="<?php echo $img_size["width"] ?>"
+               height="<?php echo $img_size["height"] ?>"
+               style="margin-top:<?php echo $margin_top ?>px" />
+        <?php else : ?>
+          <span><?php echo $album["titre"] ?></span>
+        <?php endif; ?>
+        </a></li>
+      <?php endforeach; ?>
+      </ul>
+      <div class="clear"><!-- --></div>
+      <?php endif; ?>
diff --git a/app/out/default/views/sources/groupe/ariane.php b/app/out/default/views/sources/groupe/ariane.php
new file mode 100644 (file)
index 0000000..d3ce4ba
--- /dev/null
@@ -0,0 +1,11 @@
+<h2>Groupes</h2>
+<?php $ariane_params = array(); ?>
+<?php $FIRST = true; ?>
+<h2>
+
+<?php if(isset($this->out["groupe"]) && $this->out["groupe"]) : $ariane_params["groupe"] = $this->out["groupe"]["id"]; ?>
+  <?php if($FIRST) : $FIRST = false; else : ?>&raquo;<?php endif; ?>
+  <a href="<?php echo $this->url("sources/groupe/view", array("id" => $this->out["groupe"]["id"])) ?>"><?php echo $this->out["groupe"]["nom"] ?></a>
+<?php endif; ?>
+
+</h2>
diff --git a/app/out/default/views/sources/groupe/list.php b/app/out/default/views/sources/groupe/list.php
new file mode 100644 (file)
index 0000000..85bb7cc
--- /dev/null
@@ -0,0 +1,38 @@
+<?php if($this->out["groupes"]["list"]) : ?>
+
+<?php $items = "groupes"; $legend = "groupes"; require $this->out_file("views/navig.php"); ?>
+
+<ul class="groupes">
+  
+<?php foreach($this->out["groupes"]["list"] as $id_groupe => $groupe) : ?>
+  <li>
+    <h4>
+      <a href="<?php echo $this->url("sources/groupe/view", array("id" => $id_groupe)) ?>">
+        <?php
+
+          $data = $this->data();
+          if
+          (    $groupe["image_uri"]
+            && file_exists($groupe["image_uri"])
+            && ($img_size = $data->img_size($groupe["image_uri"], 120, 100)) !== false
+          ) :
+          $margin_top = floor((100 - $img_size["height"]) / 2);
+
+        ?>
+        <img src="<?php echo $this->path("web").$groupe["image_uri"]; ?>"
+             width="<?php echo $img_size["width"] ?>"
+             height="<?php echo $img_size["height"] ?>"
+             style="margin-top:<?php echo $margin_top ?>px"
+             alt="" />
+        <?php endif; ?>
+        <span><?php echo $groupe["nom"] ?></span>
+        <br class="clear" />
+      </a>
+    </h4>
+  </li>
+<?php endforeach; ?>
+</ul>
+
+<?php $items = "groupes"; $legend = "groupes"; require $this->out_file("views/navig.php"); ?>
+
+<?php endif; ?>
diff --git a/app/out/default/views/sources/groupe/view.php b/app/out/default/views/sources/groupe/view.php
new file mode 100644 (file)
index 0000000..7daaf59
--- /dev/null
@@ -0,0 +1,42 @@
+<div class="description">
+<?php echo $this->out["groupe"]["description"] ?>
+</div>
+
+<div class="clear"><!-- --></div>
+<br />
+<?php
+
+  if
+  ( $this->out_config("groupe_view_albums")
+    && $this->out["albums"]["list"]
+  ) :
+
+?>
+
+<h3 class="menu_albums">Albums</h3>
+<ul class="menu_albums">
+<?php foreach($this->out["albums"]["list"] as $id_album => $album) : ?>
+  <li><a href="<?php echo $this->url("sources/album/view", array("album" => $id_album)) ?>" title="<?php echo str_replace("\"", "&quot;", $album["titre"]) ?>">
+
+  <?php
+
+    if
+    (    $album["image_uri"]
+      && file_exists($album["image_uri"])
+      && ($img_size = $data->img_size($album["image_uri"], 90, 90)) !== false
+    ) :
+    $margin_top = floor((90 - $img_size["height"]) / 2);
+
+  ?>
+    <img src="<?php echo $this->path("web").$album["image_uri"]; ?>"
+         width="<?php echo $img_size["width"] ?>"
+         height="<?php echo $img_size["height"] ?>"
+         style="margin-top:<?php echo $margin_top ?>px"
+         alt="" />
+  <?php endif; ?>
+  <span><?php echo $album["titre"] ?></span>
+  </a></li>
+<?php endforeach; ?>
+</ul>
+<div class="clear"><!-- --></div>
+<?php endif; ?>
diff --git a/app/out/default/views/sources/groupe_box.php b/app/out/default/views/sources/groupe_box.php
new file mode 100644 (file)
index 0000000..76b0b9a
--- /dev/null
@@ -0,0 +1,9 @@
+<?php
+
+  if($this->out_config("nom_groupe")) require $this->out_file("views/sources/nom_groupe.php");
+  if($this->out_config("colonne_logo_groupe")) require $this->out_file("views/sources/logo_groupe.php");
+  if(($this->etat("controller") == "groupe") && $this->out_config("groupe_view_albums")) $this->set_config(array("out_albums_menu" => ""));
+  if($this->out_config("albums_menu")) require $this->out_file("views/sources/menu_albums.php");
+  require $this->out_file("views/sources/lien_contact.php");
+
+?>
\ No newline at end of file
diff --git a/app/out/default/views/sources/lien_contact.php b/app/out/default/views/sources/lien_contact.php
new file mode 100644 (file)
index 0000000..ee0804a
--- /dev/null
@@ -0,0 +1,8 @@
+<?php if(isset($this->out["groupe"]) && $this->out["groupe"] && $this->out["groupe"]["contact_form"]) : ?>
+<ul id="lien_contact">
+  <li><a href="<?php echo $this->url("forms/sourceml/contact_author", array("id" => $this->out["groupe"]["id"])) ?>">
+    contact
+  </a></li>
+</ul>
+<div class="clear"><!-- --></div>
+<?php endif; ?>
diff --git a/app/out/default/views/sources/logo_groupe.php b/app/out/default/views/sources/logo_groupe.php
new file mode 100644 (file)
index 0000000..87faa7b
--- /dev/null
@@ -0,0 +1,22 @@
+<?php
+
+  if(
+       isset($this->out["groupe"])
+    && $this->out["groupe"]
+    && $this->out["groupe"]["image_uri"]
+    && file_exists($this->out["groupe"]["image_uri"])
+    && ($img_size = $data->img_size($this->out["groupe"]["image_uri"], 200, 130)) !== false
+  ) :
+  $margin_top = floor((150 - $img_size["height"]) / 2);
+
+?>
+<div class="logo_groupe">
+  <a href="<?php echo $this->url("sources/groupe/view", array("id" => $this->out["groupe"]["id"])) ?>">
+  <img src="<?php echo $this->path("web").$this->out["groupe"]["image_uri"]; ?>"
+       width="<?php echo $img_size["width"] ?>"
+       height="<?php echo $img_size["height"] ?>"
+       style="margin-top:<?php echo $margin_top ?>px"
+       alt="" />
+  </a>
+</div>
+<?php endif; ?>
diff --git a/app/out/default/views/sources/menu_albums.php b/app/out/default/views/sources/menu_albums.php
new file mode 100644 (file)
index 0000000..a8b4616
--- /dev/null
@@ -0,0 +1,37 @@
+<?php
+
+  if(
+       isset($this->out["groupe"])
+    && $this->out["groupe"]
+    && $this->out["albums"]["list"]
+  ) :
+
+?>
+<ul id="album_links">
+  <li><a href="<?php echo $this->url("sources/album", array("groupe" => $this->out["groupe"]["id"])) ?>">albums</a></li>
+</ul>
+<ul class="menu_albums">
+<?php foreach($this->out["albums"]["list"] as $id_album => $album) : ?>
+  <li><a href="<?php echo $this->url("sources/album/view", array("album" => $id_album)) ?>" title="<?php echo str_replace("\"", "&quot;", $album["titre"]) ?>">
+
+  <?php
+
+    if
+    (    $album["image_uri"]
+      && file_exists($album["image_uri"])
+      && ($img_size = $data->img_size($album["image_uri"], 90, 90)) !== false
+    ) :
+    $margin_top = floor((90 - $img_size["height"]) / 2);
+
+  ?>
+    <img src="<?php echo $this->path("web").$album["image_uri"]; ?>"
+         width="<?php echo $img_size["width"] ?>"
+         height="<?php echo $img_size["height"] ?>"
+         style="margin-top:<?php echo $margin_top ?>px" />
+  <?php endif; ?>
+  <span><?php echo $album["titre"] ?></span>
+  </a></li>
+<?php endforeach; ?>
+</ul>
+<div class="clear"><!-- --></div>
+<?php endif; ?>
diff --git a/app/out/default/views/sources/morceau/ariane.php b/app/out/default/views/sources/morceau/ariane.php
new file mode 100644 (file)
index 0000000..732c8fa
--- /dev/null
@@ -0,0 +1,18 @@
+<h2>Morceaux</h2>
+<?php $ariane_params = array(); ?>
+<?php $FIRST = true; ?>
+<h2>
+<?php if(isset($this->out["groupe"]) && $this->out["groupe"]) : $ariane_params["groupe"] = $this->out["groupe"]["id"]; ?>
+  <?php if($FIRST) : $FIRST = false; else : ?>&raquo;<?php endif; ?>
+  <a href="<?php echo $this->url("sources/groupe/view", array("id" => $this->out["groupe"]["id"])) ?>"><?php echo $this->out["groupe"]["nom"] ?></a>
+<?php endif; ?>
+<?php if(isset($this->out["album"]) && $this->out["album"]) : $ariane_params["album"] = $this->out["album"]["id"]; ?>
+  <?php $ariane_params["album"] = $this->out["album"]["id"]; ?>
+  <?php if($FIRST) : $FIRST = false; else : ?>&raquo;<?php endif; ?>
+  <a href="<?php echo $this->url("sources/album/view", $ariane_params) ?>"><?php echo $this->out["album"]["titre"] ?></a>
+<?php endif; ?>
+<?php if(isset($this->out["morceau"]) && $this->out["morceau"]) : $ariane_params["morceau"] = $this->out["morceau"]["id"]; ?>
+  <?php if($FIRST) : $FIRST = false; else : ?>&raquo;<?php endif; ?>
+  <a href="<?php echo $this->url("sources/morceau/view", $ariane_params) ?>"><?php echo $this->out["morceau"]["titre"] ?></a>
+<?php endif; ?>
+</h2>
diff --git a/app/out/default/views/sources/morceau/list.php b/app/out/default/views/sources/morceau/list.php
new file mode 100644 (file)
index 0000000..0a326c1
--- /dev/null
@@ -0,0 +1,84 @@
+<?php require $this->out_file("views/sources/morceau/ariane.php"); ?>
+
+<?php
+
+  if(
+        (isset($this->out["groupes"]) && $this->out["groupes"]["total"] > 0)
+    ||  (isset($this->out["albums"]) && $this->out["albums"]["total"] > 0)
+  ) :
+
+?>
+
+<ul class="buttons">
+
+<?php if($this->out["groupes"]["total"] > 1) : ?>
+  <li>
+<?php
+
+  $url_params = array();
+  if(isset($_GET[$this->param("album")]) && !$_GET[$this->param("album")]) $url_params["album"] = "";
+
+?>
+    <select onchange="document.location=this.options[this.selectedIndex].value;">
+      <option value="<?php echo $this->url("sources/morceau", $url_params) ?>"<?php echo $_GET[$this->param("groupe")] == "0" ? " selected=\"selected\"" : "" ?>>Tous les groupes</option>
+      <?php foreach($this->out["groupes"]["list"] as $id_groupe => $groupe) : $url_params["groupe"] = $id_groupe; ?>
+      <option value="<?php echo $this->url("sources/morceau", $url_params) ?>"<?php echo $this->out["groupe"] &&  $this->out["groupe"]["id"] == $id_groupe ? " selected=\"selected\"" : "" ?>><?php echo $groupe["nom"] ?></option>
+      <?php endforeach; ?>
+    </select>
+  </li>
+<?php endif; ?>
+<?php if($this->out["albums"]["total"] > 0) : ?>
+  <li>
+    <span id="album_select">
+<?php
+
+  $url_params = array();
+  if(isset($this->out["groupe"])) $url_params["groupe"] = $this->out["groupe"]["id"];
+
+?>
+    <select onchange="document.location=this.options[this.selectedIndex].value;">
+      <option value="<?php echo $this->url("sources/morceau", $url_params) ?>"<?php echo !isset($_GET[$this->param("album")]) ? " selected=\"selected\"" : "" ?>>Tous les morceaux</option>
+<?php $url_params["album"] = ""; ?>
+      <option value="<?php echo $this->url("sources/morceau", $url_params) ?>"<?php echo isset($_GET[$this->param("album")]) && !$_GET[$this->param("album")] ? " selected=\"selected\"" : "" ?>>Hors album</option>
+      <?php foreach($this->out["albums"]["list"] as $id_album => $album) : $url_params["album"] = $id_album; ?>
+      <option value="<?php echo $this->url("sources/morceau", $url_params) ?>"<?php echo $_GET[$this->param("album")] == $id_album ? " selected=\"selected\"" : "" ?>>Album: <?php echo $album["titre"] ?></option>
+      <?php endforeach; ?>
+    </select>
+    </span>
+  </li>
+<?php endif; ?>
+</ul>
+
+<?php endif; ?>
+
+<div class="clear"><!-- --></div>
+
+<?php
+
+  if($this->out["morceaux"]["list"]) :
+  $source_status = "morceau";
+  $url_params = array();
+  if($this->out["groupe"]) $url_params["groupe"] = $this->out["groupe"]["id"];
+  if(isset($this->out["album"]) && $this->out["album"]) $url_params["album"] = $this->out["album"]["id"];
+
+?>
+
+<?php $items = "morceaux"; $legend = "morceaux"; require $this->out_file("views/navig.php"); ?>
+
+<ul class="sources source_arbo">
+<?php
+
+  foreach($this->out["morceaux"]["list"] as $id_source => $source)
+  { $url_params["morceau"] = $id_source;
+    $source["url"] = $this->url("sources/morceau/view", $url_params);
+    require $this->out_file("views/sources/source.php");
+  }
+
+?>
+</ul>
+
+<?php $items = "morceaux"; $legend = "morceaux"; require $this->out_file("views/navig.php"); ?>
+
+<?php else : ?>
+<p>Aucun morceau pour le moment</p>
+<?php endif; ?>
diff --git a/app/out/default/views/sources/morceau/view.php b/app/out/default/views/sources/morceau/view.php
new file mode 100644 (file)
index 0000000..99020a1
--- /dev/null
@@ -0,0 +1,56 @@
+<h2>
+<?php $ariane_params = array("morceau" => $this->out["morceau"]["id"]); ?>
+<?php if($this->out["album"]) : $ariane_params["album"] = $this->out["album"]["id"]; ?>
+<a href="<?php echo $this->url("sources/album/view", $ariane_params) ?>">
+<?php echo $this->out["album"]["titre"] ?>
+</a>
+&raquo;
+<?php endif; ?>
+
+<?php if($this->out["morceau"]["reference"]) : ?>
+<span>r&eacute;f&eacute;rence </span>&raquo; <a href="<?php echo $this->out["morceau"]["reference"]["from"] ?>"><strong><?php echo $this->out["morceau"]["reference"]["titre"] ?> (<?php echo $this->out["morceau"]["reference"]["auteur"] ?>)</strong></a>
+<?php else : ?>
+<a href="<?php echo $this->url("sources/morceau/view", $ariane_params) ?>"><?php echo $this->out["morceau"]["titre"] ?></a>
+
+<?php if($this->out["morceau"]["derivations"]) : ?>
+      <br />
+      <span class="small">
+        d&eacute;rive de &raquo;
+<?php $n = 0; foreach($this->out["morceau"]["derivations"] as $derivation) : ?>
+        <?php echo $n ? ", " : "" ?><a href="<?php echo $derivation["from"] ?>"><?php echo $derivation["titre"] ?> (<?php echo $derivation["auteur"] ?>)</a>
+<?php $n++; endforeach; ?>
+      </span>
+<?php endif; ?>
+
+<?php endif; ?>
+
+</h2>
+
+<div class="source_arbo">
+
+<?php
+
+  $morceau = $this->out["morceau"];
+  $display_name = false;
+  $url_params = array("morceau" => $morceau["id"]);
+
+?>
+
+<ul class="sources">
+<?php
+
+  $source = $morceau;
+  $source["url"] = $this->url("sources/morceau/view", $url_params);
+  require $this->out_file("views/sources/source.php");
+
+?>
+</ul>
+
+<?php if(!$display_name) : ?>
+<div class="description">
+  <?php echo $morceau["description"] ?>
+</div>
+<?php endif; ?>
+<div class="clear"><!-- --></div>
+
+</div>
diff --git a/app/out/default/views/sources/navig_menu.php b/app/out/default/views/sources/navig_menu.php
new file mode 100644 (file)
index 0000000..e89592f
--- /dev/null
@@ -0,0 +1,20 @@
+<?php $start_action = $this->config("start_action"); ?>
+<ul class="menu navig_menu">
+<?php if($start_action == "sources/groupe") : ?>
+  <li><a href="<?php echo $this->url("sources/groupe"); ?>">groupes</a></li>
+<?php endif; ?>
+<?php
+
+  $ALBUMS_MENU_ON = false;
+  if($start_action == "sources/album/view")
+  { if(isset($this->out["albums"]["total"]) && $this->out["albums"]["total"] > 1) $ALBUMS_MENU_ON = true;
+  }
+  else $ALBUMS_MENU_ON = true;
+  if($ALBUMS_MENU_ON) :
+
+?>
+  <li><a href="<?php echo $this->url("sources/album"); ?>">albums</a></li>
+<?php endif; ?>
+  <li><a href="<?php echo $this->url("sources/morceau"); ?>">morceaux</a></li>
+  <li><a href="<?php echo $this->url("sources/piste"); ?>">sources</a></li>
+</ul>
diff --git a/app/out/default/views/sources/nom_groupe.php b/app/out/default/views/sources/nom_groupe.php
new file mode 100644 (file)
index 0000000..59ebd6b
--- /dev/null
@@ -0,0 +1,7 @@
+<?php if(isset($this->out["groupe"]) && $this->out["groupe"]) : ?>
+<h2>
+  <a href="<?php echo $this->url("sources/groupe/view", array("id" => $this->out["groupe"]["id"])) ?>">
+    <?php echo $this->out["groupe"]["nom"] ?>
+  </a>
+</h2>
+<?php endif; ?>
diff --git a/app/out/default/views/sources/piste/ariane.php b/app/out/default/views/sources/piste/ariane.php
new file mode 100644 (file)
index 0000000..d8ccd8b
--- /dev/null
@@ -0,0 +1,22 @@
+<h2>Sources</h2>
+
+<?php $ariane_params = array(); ?>
+<?php $FIRST = true; ?>
+<h2>
+<?php if(isset($this->out["groupe"]) && $this->out["groupe"]) : $ariane_params["groupe"] = $this->out["groupe"]["id"]; ?>
+  <?php if($FIRST) : $FIRST = false; else : ?>&raquo;<?php endif; ?>
+  <a href="<?php echo $this->url("sources/groupe/view", array("id" => $this->out["groupe"]["id"])) ?>"><?php echo $this->out["groupe"]["nom"] ?></a>
+<?php endif; ?>
+<?php if(isset($this->out["album"]) && $this->out["album"]) : $ariane_params["album"] = $this->out["album"]["id"]; ?>
+  <?php if($FIRST) : $FIRST = false; else : ?>&raquo;<?php endif; ?>
+  <a href="<?php echo $this->url("sources/album/view", $ariane_params) ?>"><?php echo $this->out["album"]["titre"] ?></a>
+<?php endif; ?>
+<?php if(isset($this->out["morceau"]) && $this->out["morceau"]) : $ariane_params["morceau"] = $this->out["morceau"]["id"]; ?>
+  <?php if($FIRST) : $FIRST = false; else : ?>&raquo;<?php endif; ?>
+  <a href="<?php echo $this->url("sources/morceau/view", $ariane_params) ?>"><?php echo $this->out["morceau"]["reference"] ? $this->out["morceau"]["reference"]["titre"] : $this->out["morceau"]["titre"] ?></a>
+<?php endif; ?>
+<?php if(isset($this->out["piste"]) && $this->out["piste"]) : $ariane_params["piste"] = $this->out["piste"]["id"]; ?>
+  <?php if($FIRST) : $FIRST = false; else : ?>&raquo;<?php endif; ?>
+  <a href="<?php echo $this->url("sources/piste/view", $ariane_params) ?>"><?php echo $this->out["piste"]["titre"] ?></a>
+<?php endif; ?>
+</h2>
diff --git a/app/out/default/views/sources/piste/list.php b/app/out/default/views/sources/piste/list.php
new file mode 100644 (file)
index 0000000..8051535
--- /dev/null
@@ -0,0 +1,83 @@
+<?php require $this->out_file("views/sources/piste/ariane.php"); ?>
+
+<?php
+
+  if(
+        (isset($this->out["groupes"]) && $this->out["groupes"]["total"] > 0)
+    ||  (isset($this->out["albums"]) && $this->out["albums"]["total"] > 0)
+  ) :
+
+?>
+
+<ul class="buttons">
+<?php if($this->out["groupes"]["total"] > 1) : ?>
+  <li>
+<?php
+
+  $url_params = array();
+  if(isset($_GET[$this->param("morceau")]) && !$_GET[$this->param("morceau")]) $url_params["morceau"] = "";
+
+?>
+    <select onchange="document.location=this.options[this.selectedIndex].value;">
+      <option value="<?php echo $this->url("sources/piste", $url_params) ?>"<?php echo $_GET[$this->param("groupe")] == "0" ? " selected=\"selected\"" : "" ?>>Tous les groupes</option>
+      <?php foreach($this->out["groupes"]["list"] as $id_groupe => $groupe) : $url_params["groupe"] = $id_groupe; ?>
+      <option value="<?php echo $this->url("sources/piste", $url_params) ?>"<?php echo $this->out["groupe"] &&  $this->out["groupe"]["id"] == $id_groupe ? " selected=\"selected\"" : "" ?>><?php echo $groupe["nom"] ?></option>
+      <?php endforeach; ?>
+    </select>
+  </li>
+<?php endif; ?>
+<?php if($this->out["morceaux"]["total"] > 0) : ?>
+  <li>
+    <span id="album_select">
+<?php
+
+  $url_params = array();
+  if(isset($this->out["groupe"])) $url_params["groupe"] = $this->out["groupe"]["id"];
+
+?>
+    <select onchange="document.location=this.options[this.selectedIndex].value;">
+      <option value="<?php echo $this->url("sources/piste", $url_params) ?>"<?php echo $_GET[$this->param("morceau")] == "0" ? " selected=\"selected\"" : "" ?>>Toutes les sources</option>
+<?php $url_params["morceau"] = ""; ?>
+      <option value="<?php echo $this->url("sources/piste", $url_params) ?>"<?php echo isset($_GET[$this->param("morceau")]) && !$_GET[$this->param("morceau")] ? " selected=\"selected\"" : "" ?>>Hors morceau</option>
+      <?php foreach($this->out["morceaux"]["list"] as $id_morceau => $morceau) : $url_params["morceau"] = $id_morceau; ?>
+      <option value="<?php echo $this->url("sources/piste", $url_params) ?>"<?php echo $_GET[$this->param("morceau")] == $id_morceau ? " selected=\"selected\"" : "" ?>><?php echo $morceau["reference"] ? $morceau["reference"]["titre"] : $morceau["titre"] ?></option>
+      <?php endforeach; ?>
+    </select>
+    </span>
+  </li>
+<?php endif; ?>
+</ul>
+
+<?php endif; ?>
+
+<div class="clear"><!-- --></div>
+
+<?php
+
+  if($this->out["pistes"]["list"]) :
+  $source_status = "piste";
+  $url_params = array();
+  if(isset($this->out["groupe"]) && $this->out["groupe"]) $url_params["groupe"] = $this->out["groupe"]["id"];
+  if(isset($this->out["morceau"]) && $this->out["morceau"]) $url_params["morceau"] = $this->out["morceau"]["id"];
+
+?>
+
+<?php $items = "pistes"; $legend = "sources"; require $this->out_file("views/navig.php"); ?>
+
+<ul class="sources source_arbo">
+<?php
+
+  foreach($this->out["pistes"]["list"] as $id_source => $source)
+  { $url_params["piste"] = $id_source;
+    $source["url"] = $this->url("sources/piste/view", $url_params);
+    require $this->out_file("views/sources/source.php");
+  }
+
+?>
+</ul>
+
+<?php $items = "pistes"; $legend = "sources"; require $this->out_file("views/navig.php"); ?>
+
+<?php else : ?>
+<p>Aucune source pour le moment</p>
+<?php endif; ?>
diff --git a/app/out/default/views/sources/piste/view.php b/app/out/default/views/sources/piste/view.php
new file mode 100644 (file)
index 0000000..5d089a0
--- /dev/null
@@ -0,0 +1,64 @@
+<h2>
+<?php $ariane_params = array("piste" => $this->out["piste"]["id"]); ?>
+<?php if($this->out["album"]) : $ariane_params["album"] = $this->out["album"]["id"]; ?>
+<a href="<?php echo $this->url("sources/album/view", $ariane_params) ?>">
+<?php echo $this->out["album"]["titre"] ?>
+</a>
+&raquo;
+<?php endif; ?>
+
+<?php if($this->out["morceau"]) : $ariane_params["morceau"] = $this->out["morceau"]["id"]; ?>
+<a href="<?php echo $this->url("sources/morceau/view", $ariane_params) ?>">
+<?php echo $this->out["morceau"]["reference"] ? $this->out["morceau"]["reference"]["titre"] : $this->out["morceau"]["titre"] ?>
+</a>
+&raquo;
+<?php endif; ?>
+
+
+<?php if($this->out["piste"]["reference"]) : ?>
+<span>r&eacute;f&eacute;rence </span>&raquo; <a href="<?php echo $this->out["piste"]["reference"]["from"] ?>"><strong><?php echo $this->out["piste"]["reference"]["titre"] ?> (<?php echo $this->out["piste"]["reference"]["auteur"] ?>)</strong></a>
+<?php else : ?>
+<a href="<?php echo $this->url("sources/piste/view", $ariane_params) ?>"><?php echo $this->out["piste"]["titre"] ?></a>
+
+<?php if($this->out["piste"]["derivations"]) : ?>
+      <br />
+      <span class="small">
+        d&eacute;rive de &raquo;
+<?php $n = 0; foreach($this->out["piste"]["derivations"] as $derivation) : ?>
+        <?php echo $n ? ", " : "" ?><a href="<?php echo $derivation["from"] ?>"><?php echo $derivation["titre"] ?> (<?php echo $derivation["auteur"] ?>)</a>
+<?php $n++; endforeach; ?>
+      </span>
+<?php endif; ?>
+
+<?php endif; ?>
+
+</h2>
+
+<div class="source_arbo">
+
+<?php
+
+  $piste = $this->out["piste"];
+  $display_name = false;
+  $url_params = array("piste" => $piste["id"]);
+
+?>
+
+<ul class="sources">
+<?php
+
+  $source = $piste;
+  $source["url"] = $this->url("sources/piste/view", $url_params);
+  require $this->out_file("views/sources/source.php");
+
+?>
+</ul>
+
+<?php if(!$display_name) : ?>
+<div class="description">
+  <?php echo $piste["description"] ?>
+</div>
+<?php endif; ?>
+<div class="clear"><!-- --></div>
+
+</div>
diff --git a/app/out/default/views/sources/source.php b/app/out/default/views/sources/source.php
new file mode 100644 (file)
index 0000000..1107918
--- /dev/null
@@ -0,0 +1,22 @@
+<?php if($source) : ?>
+
+<li class="track" id="track_<?php echo $source["id"] ?>">
+
+<?php
+
+//  require $this->out_file("views/sources/source/menu_source.php");
+  require $this->out_file("views/sources/source/header.php");
+  require $this->out_file("views/sources/source/metas.php");
+  require $this->out_file("views/sources/source/documents.php");
+
+?>
+  <div class="clear"><!-- --></div>
+<?php
+
+  require $this->out_file("views/sources/source/arbo.php");
+
+?>
+
+</li>
+
+<?php endif; ?>
diff --git a/app/out/default/views/sources/source/arbo.php b/app/out/default/views/sources/source/arbo.php
new file mode 100644 (file)
index 0000000..f9a0bc6
--- /dev/null
@@ -0,0 +1,21 @@
+<?php if($source["status"] != 1 && $source["has_sources"]) : ?>
+<h3>
+  <a id="toggle_sources_list_<?php echo $source["id"] ?>"
+     href="#"
+     class="block_list_toggle"
+     onclick="toggle_source_list('<?php echo $source["id"] ?>'); return false;">[+]</a>
+  Sources
+</h3>
+<div id="source_list_<?php echo $source["id"] ?>"><div class="pistes"></div></div>
+<?php endif; ?>
+
+<?php if($source["status"] != 1 && $source["has_derivations"]) : ?>
+<h3>
+  <a id="toggle_derivation_list_<?php echo $source["id"] ?>"
+     href="#"
+     class="block_list_toggle"
+     onclick="toggle_derivation_list('<?php echo $source["id"] ?>'); return false;">[+]</a>
+  D&eacute;rivations
+</h3>
+<div id="derivation_list_<?php echo $source["id"] ?>"><div class="derivation"></div></div>
+<?php endif; ?>
diff --git a/app/out/default/views/sources/source/documents.php b/app/out/default/views/sources/source/documents.php
new file mode 100644 (file)
index 0000000..56af9e0
--- /dev/null
@@ -0,0 +1,47 @@
+<?php
+
+  $documents = $source["reference"] ? $source["reference"]["documents"] : $source["documents"];
+  if($documents) :
+
+?>
+
+
+  <ul class="documents">
+  <?php
+
+    foreach($documents as $id_document => $document) :
+    $ext = "";
+    $audio_type = "";
+    if(($k = strrpos($document["url"], ".")) !== false) $ext = strtolower(substr($document["url"], $k + 1));
+    switch($ext){
+      case "ogg":
+        $audio_type = "audio/ogg";
+        break;
+      case "mp3":
+        $audio_type = "audio/mp3";
+        break;
+    }
+
+  ?>
+
+    <li id="document_<?php echo $source["id"]."_".$id_document ?>">
+      <?php if($audio_type) : ?>
+      <div class="player_controls player" id="player_<?php echo $source["id"]."_".$id_document ?>">
+        <a class="play" href="#"><img src="<?php echo $this->out_url("icons/play.png") ?>" alt="play" /></a>
+        <a class="pause" href="#"><img src="<?php echo $this->out_url("icons/pause.png") ?>" alt="pause" /></a>
+        <a class="stop" href="#"><img src="<?php echo $this->out_url("icons/stop.png") ?>" alt="stop" /></a>
+        <audio id="audio_<?php echo $source["id"]."_".$id_document ?>" preload="none">
+          <source src="<?php echo $document["url"] ?>" type="<?php echo $audio_type ?>">
+        </audio>
+      </div>
+      <?php endif; ?>
+      <div class="no_player"><!-- --></div>
+      <a href="<?php echo $document["url"] ?>"><?php echo $document["nom"]; ?></a>
+    </li>
+
+  <?php endforeach; ?>
+  </ul>
+
+  <div class="clear"><!-- --></div>
+
+  <?php endif; ?>
diff --git a/app/out/default/views/sources/source/header.php b/app/out/default/views/sources/source/header.php
new file mode 100644 (file)
index 0000000..6910161
--- /dev/null
@@ -0,0 +1,44 @@
+<?php
+
+  if($source["reference"])
+  { $groupe = array
+    ( "nom" => $source["reference"]["auteur"],
+      "url" => $source["reference"]["from"]
+    );
+  }
+  else
+  { $groupe = $data->get_admin_groupe($source["groupes"]);
+    if($groupe) $groupe["url"] = $this->url("sources/groupe/view", array("id" => $groupe["id"]));
+  }
+
+?>
+
+  <h5>
+
+<?php if($groupe) : ?><a class="auteur" href="<?php echo $groupe["url"] ?>"><?php echo $groupe["nom"] ?></a><?php endif; ?>
+
+<?php if(!isset($display_name) || $display_name) : ?>
+
+<?php if($source["reference"]) : ?>
+    <span>r&eacute;f&eacute;rence &raquo; <a href="<?php echo $source["reference"]["from"] ?>"><strong><?php echo $source["reference"]["titre"] ?> (<?php echo $groupe["nom"] ?>)</strong></a></span>
+<?php else : ?>
+    <a href="<?php echo $source["url"] ?>"><?php echo $source["titre"] ?></a>
+<?php endif; ?>
+<?php if($source["derivations"]) : ?>
+    <br />
+    <span class="small">
+      d&eacute;rive de &raquo;
+<?php $n = 0; foreach($source["derivations"] as $derivation) : ?>
+      <?php echo $n ? ", " : "" ?><a href="<?php echo $derivation["from"] ?>"><strong><?php echo $derivation["titre"] ?> (<?php echo $derivation["auteur"] ?>)</strong></a>
+<?php $n++; endforeach; ?>
+    </span>
+<?php endif; ?>
+
+<?php endif; ?>
+    <br class="clear" />
+  </h5>
+
+  <div class="player_progress">
+    <div class="loaded"><!-- --></div>
+    <div class="position"><!-- --></div>
+  </div>
diff --git a/app/out/default/views/sources/source/menu_source.php b/app/out/default/views/sources/source/menu_source.php
new file mode 100644 (file)
index 0000000..8370828
--- /dev/null
@@ -0,0 +1,58 @@
+<?php
+
+  $user = $this->user();
+  if($user && ($source["status"] == 2 || $source["status"] == 3)) :
+
+?>
+
+<ul class="menu_source">
+
+<?php
+
+  // si c'est un morceau
+  if($source["status"] == 2) :
+
+?>
+
+<?php if($this->status_ok("users/morceaux/del")) : ?>
+<?php if($source["id_user"] == $user["id"]) : ?>
+  <li class="icon"><a href="<?php echo $this->url("users/morceaux/del", array("id" => $source["id"])) ?>"
+                      onclick="return confirm('Supprimer ce morceau ?')"><img src="<?php echo $this->out_url("icons/del.gif") ?>" /></a></li>
+<?php endif; ?>
+<?php endif; ?>
+
+<?php if($this->status_ok("users/morceaux/edit")) : ?>
+<?php if($source["id_user"] == $user["id"]) : ?>
+  <li class="icon"><a href="<?php echo $this->url("users/morceaux/edit", array("id" => $source["id"])) ?>"><img src="<?php echo $this->out_url("icons/edit.gif") ?>" /></a></li>
+<?php endif; ?>
+<?php endif; ?>
+
+<?php endif; ?>
+
+
+<?php
+
+  // si c'est une piste
+  if($source["status"] == 3) :
+
+?>
+
+<?php if($this->status_ok("users/pistes/del")) : ?>
+<?php if($source["id_user"] == $user["id"]) : ?>
+  <li class="icon"><a href="<?php echo $this->url("users/pistes/del", array("id" => $source["id"])) ?>"
+                      onclick="return confirm('Supprimer cette source ?')"><img src="<?php echo $this->out_url("icons/del.gif") ?>" /></a></li>
+<?php endif; ?>
+<?php endif; ?>
+
+<?php if($this->status_ok("users/pistes/edit")) : ?>
+<?php if($source["id_user"] == $user["id"]) : ?>
+  <li class="icon"><a href="<?php echo $this->url("users/pistes/edit", array("id" => $source["id"])) ?>"><img src="<?php echo $this->out_url("icons/edit.gif") ?>" /></a></li>
+<?php endif; ?>
+<?php endif; ?>
+
+<?php endif; ?>
+
+
+</ul>
+<div class="clear"><!-- --></div>
+<?php endif; ?>
diff --git a/app/out/default/views/sources/source/metas.php b/app/out/default/views/sources/source/metas.php
new file mode 100644 (file)
index 0000000..9e5a331
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+
+  $sml_helper_out = $this->helper("mw_helper_sourceml_out");
+
+  $metas =
+  ( $source["reference"] ?
+      array
+      ( "licence_name" => isset($source["reference"]["licence"]["nom"]) ? $source["reference"]["licence"]["nom"] : "",
+        "licence_url" => isset($source["reference"]["licence"]["url"]) ? $source["reference"]["licence"]["url"] : "",
+        "date_creation" => $source["reference"]["date_creation"],
+        "xml_url" => $source["reference"]["xml"]["url"]
+      )
+    : array
+      ( "licence_name" =>
+        ( isset($source["licence"]["id"]) && isset($this->out["licences"]["list"][$source["licence"]["id"]]) ?
+            $this->out["licences"]["list"][$source["licence"]["id"]]["nom"]
+          : ""
+        ),
+        "licence_url" =>
+        ( isset($source["licence"]["id"]) && isset($this->out["licences"]["list"][$source["licence"]["id"]]) ?
+            $this->out["licences"]["list"][$source["licence"]["id"]]["url"]
+          : ""
+        ),
+        "date_creation" => $source["date_creation"],
+        "xml_url" => $data->source_xml_url($source["id"])
+      )
+  );
+
+?>
+
+  <div class="licence">
+  <?php if($metas["licence_name"] && $metas["licence_url"]) : ?>
+    <a href="<?php echo $metas["licence_url"] ?>"><?php echo $metas["licence_name"] ?></a>
+    <br />
+  <?php endif; ?>
+    <?php echo $sml_helper_out->aff_date($metas["date_creation"]) ?><br />
+    xml &raquo;
+      <a href="<?php echo $metas["xml_url"] ?>">url</a>
+    | <a id="show_xml_<?php echo $source["id"] ?>" href="<?php echo $this->url("content/sources/xml", array("id" => $source["id"])) ?>">voir</a>
+    <script type="text/javascript">set_show_xml_links(<?php echo $source["id"] ?>)</script>
+  </div>
diff --git a/app/out/default/views/users/albums/add.php b/app/out/default/views/users/albums/add.php
new file mode 100644 (file)
index 0000000..1d44877
--- /dev/null
@@ -0,0 +1,126 @@
+<?php require $this->out_file("views/tinymce.init.js.php"); ?>
+
+<h2>Nouvel album</h2>
+
+<ul class="buttons">
+  <li><a href="<?php echo $this->url("users/albums") ?>">Retour &agrave; la liste des albums</a></li>
+</ul>
+
+<?php if($this->out["groupes"]["total"] > 0) : ?>
+
+<form name="album_form" action="<?php echo $this->url("users/albums/add") ?>" method="post" enctype="multipart/form-data">
+  <fieldset>
+    <ul class="form">
+  
+      <li>
+        <label for="id_groupe">groupe</label>
+        <div class="form_input">
+          <select name="id_groupe" id="id_groupe">
+          <?php foreach($this->out["groupes"]["list"] as $id_groupe => $groupe) : ?>
+            <option value="<?php echo $id_groupe ?>"<?php echo $this->out["groupe"]["id"] == $id_groupe ? "selected=\"selected\"" : "" ?>><?php echo $groupe["nom"] ?></option>
+          <?php endforeach; ?>
+          </select>
+        </div>
+      </li>
+  
+      <li>
+        <label for="titre">titre</label>
+        <div class="form_input">
+          <input type="text" class="long_text" name="titre" id="titre" value="<?php echo $this->out["album"]["titre"] ?>" />
+        </div>
+      </li>
+  
+      <li>
+        <label for="image">icone</label>
+        <div class="form_input">
+          <input type="file" name="image" />
+        </div>
+      </li>
+  
+      <li>
+        <label for="licence">licence</label>
+        <div class="form_input">
+          <select name="licence" id="licence">
+            <option value="0"<?php echo $this->out["album"]["licence"]["id"] == 0 ? "selected=\"selected\"" : "" ?>>licences pr&eacute;cis&eacute;es dans le contenu</option>
+          <?php foreach($this->out["licences"]["list"] as $id_licence => $licence) : ?>
+            <option value="<?php echo $id_licence ?>"<?php echo $this->out["album"]["licence"]["id"] == $id_licence ? "selected=\"selected\"" : "" ?>><?php echo $licence["nom"] ?></option>
+          <?php endforeach; ?>
+          </select>
+        </div>
+      </li>
+  
+      <li>
+        <label for="date_creation">date de cr&eacute;ation</label>
+        <div class="form_input">
+    <?php
+    
+      $date_creation =
+      ( isset($this->out["album"]["date_creation"]) && $this->out["album"]["date_creation"] ?
+          explode("-", $this->out["album"]["date_creation"])
+        : array(0 => date("Y"), 1 => date("m"), 2 => date("d"))
+      );
+    
+    ?>
+          jour
+          <select name="jour_date_creation">
+    <?php for($j = 1; $j <=31; $j++) : ?>
+            <option value="<?php echo $j ?>"<?php echo $date_creation[2] == $j ? " selected=\"selected\"" : ""?>><?php echo $j ?></option>
+    <?php endfor; ?>
+          </select>
+          mois
+          <select name="mois_date_creation">
+    <?php for($m = 1; $m <=12; $m++) : ?>
+           <option value="<?php echo $m ?>"<?php echo $date_creation[1] == $m ? " selected=\"selected\"" : ""?>><?php echo $m ?></option>
+    <?php endfor; ?>
+          </select>
+          ann&eacute;e
+          <input type="text" size="4" name="annee_date_creation" value="<?php echo $date_creation[0] ?>">
+        </div>
+      </li>
+  
+      <li>
+        <h3><label>Fichiers</label> <a href="#" onclick="add_document(); return false;">Ajouter un fichier</a></h3>
+      </li>
+  
+      <li>
+        <div id="documents">
+  
+  <?php if($this->out["album"]) : foreach($this->out["album"]["documents"] as $id_document => $document) : ?>
+  
+          <div class="document" id="document_<?php echo $id_document ?>">
+            <div class="delete"><a href="#" onclick="del_document('<?php echo $id_document ?>'); return false;">Enlever ce fichier</a></div>
+            <label for="document_nom_<?php echo $id_document ?>">nom</label>
+            <input type="text" class="long_text" name="document_nom_<?php echo $id_document ?>" id="document_nom_<?php echo $id_document ?>" value="<?php echo $document["nom"] ?>" />
+            <div class="clear"><!-- --></div>
+            <label for="document_url_<?php echo $id_document ?>">url</label>
+            <input type="text" size="48" name="document_url_<?php echo $id_document ?>" id="document_url_<?php echo $id_document ?>" value="<?php echo $document["url"] ?>" />
+          </div>
+          <script type="text/javascript">if(last_document_id <= <?php echo $id_document ?>) last_document_id = <?php echo $id_document ?> + 1; </script>
+  
+  <?php endforeach; endif; ?>
+  
+        </div>
+      </li>
+  
+      <li>
+        <h3><label for="description">description</label></h3>
+      </li>
+      <li>
+        <textarea class="tinymce" cols="70" rows="10" name="description" id="description"><?php echo isset($this->out["album"]["description"]) ? $this->out["album"]["description"] : "" ?></textarea>
+      </li>
+
+      <li>
+        <div class="form_buttons">
+          <input type="submit" value="Ajouter" />
+        </div>
+      </li>
+    </ul>
+  </fieldset>
+</form>
+
+<?php else : ?>
+
+<p>Vous ne g&eacute;rez aucun groupe pour le moment.</p>
+<p>Pour ajouter un album, vous devez d'abord <a href="<?php echo $this->url("users/groupes/add") ?>">cr&eacute;er un groupe</a>.</p>
+
+<?php endif; ?>
diff --git a/app/out/default/views/users/albums/edit.php b/app/out/default/views/users/albums/edit.php
new file mode 100644 (file)
index 0000000..e1132d1
--- /dev/null
@@ -0,0 +1,128 @@
+<?php require $this->out_file("views/tinymce.init.js.php"); ?>
+
+<h2>Modifier un album</h2>
+
+<ul class="buttons">
+  <li><a href="<?php echo $this->url("users/albums") ?>">Retour &agrave; la liste des albums</a></li>
+</ul>
+
+<?php if($this->out["groupes"]["total"] > 0) : ?>
+
+<form name="album_form" action="<?php echo $this->url("users/albums/edit", array("id" => $_GET[$this->param("id")])) ?>" method="post" enctype="multipart/form-data">
+  <fieldset>
+    <ul class="form">
+  
+      <li>
+        <label for="id_groupe">groupe</label>
+        <div class="form_input">
+          <select name="id_groupe" id="id_groupe">
+          <?php foreach($this->out["groupes"]["list"] as $id_groupe => $groupe) : ?>
+            <option value="<?php echo $id_groupe ?>"<?php echo $this->out["groupe"]["id"] == $id_groupe ? "selected=\"selected\"" : "" ?>><?php echo $groupe["nom"] ?></option>
+          <?php endforeach; ?>
+          </select>
+        </div>
+      </li>
+  
+      <li>
+        <label for="titre">titre</label>
+        <div class="form_input">
+          <input type="text" class="long_text" name="titre" id="titre" value="<?php echo $this->out["album"]["titre"] ?>" />
+        </div>
+      </li>
+  
+      <li>
+        <label for="image">icone</label>
+        <div class="form_input">
+          <?php if($this->out["album"]["image"]) : ?>
+          <img class="logo" src="<?php echo $this->out["album"]["image_uri"] ?>" /><br /><br />
+          <input type="checkbox" name="del_image" /> effacer l'icone<br /><br />
+          <?php endif; ?>
+          <input type="file" name="image" />
+        </div>
+      </li>
+  
+      <li>
+        <label for="licence">licence</label>
+        <div class="form_input">
+          <select name="licence" id="licence">
+            <option value="0"<?php echo $this->out["album"]["licence"] == 0 ? "selected=\"selected\"" : "" ?>>licences pr&eacute;cis&eacute;es dans le contenu</option>
+          <?php foreach($this->out["licences"]["list"] as $id_licence => $licence) : ?>
+            <option value="<?php echo $id_licence ?>"<?php echo $this->out["album"]["licence"]["id"] == $id_licence ? "selected=\"selected\"" : "" ?>><?php echo $licence["nom"] ?></option>
+          <?php endforeach; ?>
+          </select>
+        </div>
+      </li>
+  
+      <li>
+        <label for="date_creation">date de cr&eacute;ation</label>
+        <div class="form_input">
+    <?php
+    
+      $date_creation =
+      ( $this->out["album"]["date_creation"] ?
+          explode("-", $this->out["album"]["date_creation"])
+        : array(0 => date("Y"), 1 => date("m"), 2 => date("d"))
+      );
+    
+    ?>
+          jour
+          <select name="jour_date_creation">
+    <?php for($j = 1; $j <=31; $j++) : ?>
+            <option value="<?php echo $j ?>"<?php echo $date_creation[2] == $j ? " selected=\"selected\"" : ""?>><?php echo $j ?></option>
+    <?php endfor; ?>
+          </select>
+          mois
+          <select name="mois_date_creation">
+    <?php for($m = 1; $m <=12; $m++) : ?>
+           <option value="<?php echo $m ?>"<?php echo $date_creation[1] == $m ? " selected=\"selected\"" : ""?>><?php echo $m ?></option>
+    <?php endfor; ?>
+          </select>
+          ann&eacute;e
+          <input type="text" size="4" name="annee_date_creation" value="<?php echo $date_creation[0] ?>">
+        </div>
+      </li>
+  
+      <li>
+        <h3><label>Fichiers</label> <a href="#" onclick="add_document(); return false;">Ajouter un fichier</a></h3>
+      </li>
+  
+      <li>
+        <div id="documents">
+  
+  <?php if($this->out["album"]) : foreach($this->out["album"]["documents"] as $id_document => $document) : ?>
+  
+          <div class="document" id="document_<?php echo $id_document ?>">
+            <div class="delete"><a href="#" onclick="del_document('<?php echo $id_document ?>'); return false;">Enlever ce fichier</a></div>
+            <label for="document_nom_<?php echo $id_document ?>">nom</label>
+            <input type="text" class="long_text" name="document_nom_<?php echo $id_document ?>" id="document_nom_<?php echo $id_document ?>" value="<?php echo $document["nom"] ?>" />
+            <div class="clear"><!-- --></div>
+            <label for="document_url_<?php echo $id_document ?>">url</label>
+            <input type="text" size="48" name="document_url_<?php echo $id_document ?>" id="document_url_<?php echo $id_document ?>" value="<?php echo $document["url"] ?>" />
+          </div>
+          <script type="text/javascript">if(last_document_id <= <?php echo $id_document ?>) last_document_id = <?php echo $id_document ?> + 1; </script>
+  
+  <?php endforeach; endif; ?>
+  
+        </div>
+      </li>
+      <li>
+        <label for="description">description</label>
+      </li>
+      <li>
+        <textarea class="tinymce" cols="70" rows="10" name="description" id="description"><?php echo $this->out["album"]["description"] ?></textarea>
+      </li>
+      <li>
+        <div class="form_buttons">
+          <input type="submit" value="Enregistrer" />
+        </div>
+      </li>
+    </ul>
+  </fieldset>
+</form>
+
+<?php else : ?>
+
+<p>Vous ne g&eacute;rez aucun groupe pour le moment.</p>
+<p>Pour ajouter un album, vous devez d'abord <a href="<?php echo $this->url("users/groupes/add") ?>">cr&eacute;er un groupe</a>.</p>
+
+<?php endif; ?>
diff --git a/app/out/default/views/users/albums/list.php b/app/out/default/views/users/albums/list.php
new file mode 100644 (file)
index 0000000..bd1ba9c
--- /dev/null
@@ -0,0 +1,86 @@
+<h2>Albums</h2>
+
+<ul class="buttons">
+  <li><a class="add" href="<?php echo $this->url("users/albums/add") ?>">Nouvel album</a></li>
+</ul>
+
+<?php if($this->out["groupes"]["total"] > 0) : ?>
+
+<ul class="filters">
+  <li>
+    <select onchange="document.location=this.options[this.selectedIndex].value;">
+      <option value="<?php echo $this->url("users/albums") ?>"<?php echo $_GET[$this->param("groupe")] == "0" ? " selected=\"selected\"" : "" ?>>Tous les groupes</option>
+      <?php foreach($this->out["groupes"]["list"] as $id_groupe => $groupe) : ?>
+      <option value="<?php echo $this->url("users/albums", array("groupe" => $id_groupe)) ?>"<?php echo $_GET[$this->param("groupe")] == $id_groupe ? " selected=\"selected\"" : "" ?>><?php echo $groupe["nom"] ?></option>
+      <?php endforeach; ?>
+    </select>
+  </li>
+</ul>
+
+<?php endif; ?>
+
+<?php if($this->out["albums"]["list"]) : ?>
+
+<?php $items = "albums"; $legend = "albums"; require $this->out_file("views/navig.php"); ?>
+
+<?php
+
+  $get_params = array();
+  if(isset($_GET[$this->param("groupe")]) && $_GET[$this->param("groupe")]) $get_params["groupe"] = $_GET[$this->param("groupe")];
+
+?>
+<form name="sources_form" action="<?php echo $this->url("users/albums", $get_params) ?>" method="post">
+  <fieldset>
+    <table class="admin">
+      <tr>
+        <th>titre</th>
+        <th>ordre</th>
+        <th align="center" colspan="2">actions</th>
+      </tr>
+    <?php foreach($this->out["albums"]["list"] as $id_album => $album) : ?>
+      <tr class="hl">
+        <td>
+    <?php if($album["reference"]) : ?>
+          <?php echo $album["reference"]["titre"] ?> <span>[ r&eacute;f&eacute;rence &raquo; <a href="<?php echo $album["reference"]["from"] ?>"><?php echo $album["reference"]["auteur"] ?></a> ]</span>
+    <?php else : ?>
+          <?php echo $album["titre"] ?>
+    <?php endif; ?>
+        </td>
+        <td class="action"><input type="text" name="ordre_<?php echo $id_album ?>" value="<?php echo isset($album["ordre"]) ? $album["ordre"] : 0 ?>" size="3" /></td>
+        <td class="action">
+    <?php if($album["permissions"]["editeur"]) : ?>
+        <a href="<?php echo $this->url("users/albums/edit", array("id" => $id_album)) ?>"
+           class="admin_link"
+           title="modifier cet album"><img src="<?php echo $this->out_url("icons/edit.gif") ?>" /></a>
+    <?php else : ?>
+        &nbsp;
+    <?php endif; ?>
+        </td>
+        <td class="action">
+    <?php if($album["permissions"]["admin"]) : ?>
+        <a href="<?php echo $this->url("users/albums/del", array("id" => $id_album)) ?>"
+           class="admin_link"
+           title="supprimer cet album"><img src="<?php echo $this->out_url("icons/del.gif") ?>"
+           onclick="return confirm('Supprimer cet album ?')"/></a>
+    <?php else : ?>
+        &nbsp;
+    <?php endif; ?>
+        </td>
+      </tr>
+    <?php endforeach; ?>
+    </table>
+    <ul class="form">
+      <li class="buttons">
+        <div class="form_buttons">
+          <input type="submit" value="Enregistrer l'ordre" />
+        </div>
+      </li>
+    </ul>
+  </fieldset>
+</form>
+
+<?php $items = "albums"; $legend = "albums"; require $this->out_file("views/navig.php"); ?>
+
+<?php else : ?>
+<p>Aucun album pour le moment</p>
+<?php endif; ?>
diff --git a/app/out/default/views/users/groupes/add.php b/app/out/default/views/users/groupes/add.php
new file mode 100644 (file)
index 0000000..48920f6
--- /dev/null
@@ -0,0 +1,50 @@
+<?php require $this->out_file("views/tinymce.init.js.php"); ?>
+
+<h2>Nouveau groupe</h2>
+
+<ul class="buttons">
+  <li><a href="<?php echo $this->url("users/groupes") ?>">Retour &agrave; la liste des groupes</a></li>
+</ul>
+
+<form name="groupe_form" action="<?php echo $this->url("users/groupes/add") ?>" method="post" enctype="multipart/form-data">
+  <fieldset>
+    <ul class="form">
+      <li>
+        <label for="nom">nom</label>
+        <div class="form_input">
+          <input type="text" name="nom" id="nom" value="<?php echo $this->out["groupe"]["nom"] ?>" />
+        </div>
+      </li>
+      <li>
+        <label for="image">logo</label>
+        <div class="form_input">
+          <input type="file" name="image" />
+        </div>
+      </li>
+      <li>
+        <label for="contact_form">formulaire de contact</label>
+        <div class="form_input">
+          <input type="checkbox" name="contact_form" id="contact_form"<?php echo $this->out["groupe"]["contact_form"] ? " checked=\"checked\"" : "" ?> />
+        </div>
+      </li>
+      <li id="email_li"<?php echo $this->out["groupe"]["contact_form"] ? "" : " style=\"display:none;\"" ?>>
+        <label for="email">email</label>
+        <div class="form_input">
+          <input type="text" name="email" id="email" value="<?php echo $this->out["groupe"]["email"] ?>" /><br />
+          <br /><input type="checkbox" name="captcha" id="captcha"<?php echo $this->out["groupe"]["captcha"] ? " checked=\"checked\"" : "" ?> /> anti-spam
+        </div>
+      </li>
+      <li>
+        <label for="description">description</label>
+      </li>
+      <li>
+        <textarea class="tinymce" cols="70" rows="10" name="description" id="description"><?php echo $this->out["groupe"]["description"] ?></textarea>
+      </li>
+      <li>
+        <div class="form_buttons">
+          <input type="submit" value="Ajouter" />
+        </div>
+      </li>
+    </ul>
+  </fieldset>
+</form>
diff --git a/app/out/default/views/users/groupes/edit.php b/app/out/default/views/users/groupes/edit.php
new file mode 100644 (file)
index 0000000..3b9a03a
--- /dev/null
@@ -0,0 +1,54 @@
+<?php require $this->out_file("views/tinymce.init.js.php"); ?>
+
+<h2>Modifier un groupe</h2>
+
+<ul class="buttons">
+  <li><a href="<?php echo $this->url("users/groupes") ?>">Retour &agrave; la liste des groupes</a></li>
+</ul>
+
+<form name="groupe_form" action="<?php echo $this->url("users/groupes/edit", array("id" => $_GET[$this->param("id")])) ?>" method="post" enctype="multipart/form-data">
+  <fieldset>
+    <ul>
+      <li>
+        <label for="nom">nom</label>
+        <div class="form_input">
+          <input type="text" name="nom" id="nom" value="<?php echo $this->out["groupe"]["nom"] ?>" />
+        </div>
+      </li>
+      <li>
+        <label for="image">logo</label>
+        <div class="form_input">
+          <?php if($this->out["groupe"]["image"]) : ?>
+          <img class="logo" src="<?php echo $this->out["groupe"]["image_uri"] ?>" /><br /><br />
+          <input type="checkbox" name="del_image" /> effacer le logo<br /><br />
+          <?php endif; ?>
+          <input type="file" name="image" />
+        </div>
+      </li>
+      <li>
+        <label for="contact_form">formulaire de contact</label>
+        <div class="form_input">
+          <input type="checkbox" name="contact_form" id="contact_form"<?php echo $this->out["groupe"]["contact_form"] ? " checked=\"checked\"" : "" ?> />
+        </div>
+      </li>
+      <li id="email_li"<?php echo $this->out["groupe"]["contact_form"] ? "" : " style=\"display:none;\"" ?>>
+        <label for="email">email</label>
+        <div class="form_input">
+          <input type="text" name="email" id="email" value="<?php echo $this->out["groupe"]["email"] ?>" /><br />
+          <br /><input type="checkbox" name="captcha" id="captcha"<?php echo $this->out["groupe"]["captcha"] ? " checked=\"checked\"" : "" ?> /> anti-spam
+        </div>
+      </li>
+      <li>
+        <label for="description">pr&eacute;sentation</label>
+      </li>
+      <li>
+        <textarea class="tinymce" cols="70" rows="10" name="description" id="description"><?php echo $this->out["groupe"]["description"] ?></textarea>
+      </li>
+      <li>
+        <div class="form_buttons">
+          <input type="submit" value="Enregistrer" />
+        </div>
+      </li>
+    </ul>
+  </fieldset>
+</form>
diff --git a/app/out/default/views/users/groupes/list.php b/app/out/default/views/users/groupes/list.php
new file mode 100644 (file)
index 0000000..2afd879
--- /dev/null
@@ -0,0 +1,38 @@
+<h2>Groupes</h2>
+
+<ul class="buttons">
+  <li><a class="add" href="<?php echo $this->url("users/groupes/add") ?>">Nouveau groupe</a></li>
+</ul>
+
+<?php if($this->out["groupes"]["list"]) : ?>
+
+<?php $items = "groupes"; $legend = "groupes"; require $this->out_file("views/navig.php"); ?>
+
+<table class="admin">
+  <tr>
+    <th>nom</th>
+    <th align="center" colspan="2">actions</th>
+  </tr>
+<?php foreach($this->out["groupes"]["list"] as $id_groupe => $groupe) : ?>
+  <tr class="hl">
+    <td><?php echo $groupe["nom"] ?></td>
+    <td class="action">
+    <a href="<?php echo $this->url("users/groupes/edit", array("id" => $id_groupe)) ?>"
+       class="admin_link"
+       title="modifier ce groupe"><img src="<?php echo $this->out_url("icons/edit.gif") ?>" /></a>
+    </td>
+    <td class="action">
+    <a href="<?php echo $this->url("users/groupes/del", array("id" => $id_groupe)) ?>"
+       class="admin_link"
+       title="supprimer ce groupe"><img src="<?php echo $this->out_url("icons/del.gif") ?>"
+       onclick="return confirm('Supprimer ce groupe ?')"/></a>
+    </td>
+  </tr>
+<?php endforeach; ?>
+</table>
+
+<?php $items = "groupes"; $legend = "groupes"; require $this->out_file("views/navig.php"); ?>
+
+<?php else : ?>
+<p>Aucun groupe pour le moment</p>
+<?php endif; ?>
diff --git a/app/out/default/views/users/morceaux/add.php b/app/out/default/views/users/morceaux/add.php
new file mode 100644 (file)
index 0000000..ec9b692
--- /dev/null
@@ -0,0 +1,259 @@
+<?php require $this->out_file("views/tinymce.init.js.php"); ?>
+
+<h2>Nouveau morceau</h2>
+
+<script type="text/javascript">
+
+var albums = {};
+<?php foreach($this->out["albums"] as $id_groupe => $albums) : ?>
+albums["<?php echo $id_groupe ?>"] = {};
+<?php foreach($albums as $id_album => $album) : ?>
+albums["<?php echo $id_groupe ?>"]["<?php echo $id_album ?>"] = "<?php echo $album["titre"] ?>";
+<?php endforeach; ?>
+<?php endforeach; ?>
+var derivations = {};
+<?php
+
+  $index_derivation = 1;
+  foreach($this->out["morceau"]["derivations"] as $id_derivation => $derivation) :
+  if($id_derivation >= $index_derivation) $index_derivation = $id_derivation + 1;
+
+?>
+derivations[<?php echo $id_derivation ?>] = true;
+<?php endforeach; ?>
+var index_derivation = <?php echo $index_derivation ?>;
+var is_reference = <?php echo $this->out["morceau"]["reference"] ? "true" : "false" ?>;
+
+</script>
+
+<ul class="buttons">
+  <li><a href="<?php echo $this->url("users/morceaux") ?>">Retour &agrave; la liste des morceaux</a></li>
+</ul>
+
+<?php if($this->out["groupes"]["total"] > 0) : ?>
+
+<form name="morceau_form" action="<?php echo $this->url("users/morceaux/add") ?>" method="post">
+  <fieldset>
+    <ul class="form">
+  
+      <li>
+        <label for="id_groupe">groupe</label>
+        <div class="form_input">
+          <select name="id_groupe" id="id_groupe" onchange="select_groupe(this.options[this.selectedIndex].value)">
+          <?php
+  
+            $current_groupe = null;
+            $first_groupe = null;
+            foreach($this->out["groupes"]["list"] as $id_groupe => $groupe) :
+            $selected = false;
+            if(!isset($first_groupe)) $first_groupe = $id_groupe;
+            if($this->out["groupe"]["id"] == $id_groupe)
+            { $current_groupe = $id_groupe;
+              $selected = true;
+            }
+  
+          ?>
+            <option value="<?php echo $id_groupe ?>"<?php echo $selected ? "selected=\"selected\"" : "" ?>><?php echo $groupe["nom"] ?></option>
+          <?php
+  
+            endforeach;
+            if(!isset($current_groupe)) $current_groupe = $first_groupe;
+  
+          ?>
+          </select>
+        </div>
+      </li>
+  
+      <li>
+        <div id="album_select">
+          <label for="album">album</label>
+          <div class="form_input">
+            <select name="album" id="album">
+              <option value="0"<?php echo $_GET[$this->param("album")] == "0" ? " selected=\"selected\"" : "" ?>>hors album</option>
+              <?php if($this->out["albums"][$current_groupe]) : ?>
+              <?php foreach($this->out["albums"][$current_groupe] as $id_album => $album) : ?>
+              <option value="<?php echo $id_album ?>"<?php echo $this->out["morceau"]["album"] == $id_album ? " selected=\"selected\"" : "" ?>><?php echo $album["titre"] ?></option>
+              <?php endforeach; ?>
+              <?php endif; ?>
+            </select>
+          </div>
+        </div>
+      </li>
+    </ul>
+  
+    <ul class="admin_form_head">
+      <li>
+        <label for="is_derivation">ce morceau est une d&eacute;rivation</label>
+        <div class="form_input">
+          <input type="checkbox" id="is_derivation" name="is_derivation"<?php echo $this->out["morceau"]["derivations"] ? " checked=\"checked\"" : "" ?> />
+        </div>
+      </li>
+    </ul>
+  
+    <ul class="admin_form_content" id="derivation_input"<?php echo $this->out["morceau"]["derivations"] ? "" : " style=\"display:none;\"" ?>>
+  
+      <li>
+  
+        <div id="derivations_list" class="form_values">
+  
+          <div id="derivations_items">
+          <?php
+  
+            foreach($this->out["morceau"]["derivations"] as $id_derivation => $derivation)
+            { $this->set_out
+              ( "form_params",
+                array
+                ( "name" => "derivation",
+                  "label" => "d&eacute;rive de &raquo; ",
+                  "can_delete" => true,
+                  "id" => $id_derivation
+                )
+              );
+              $this->set_out("xml_form_source", $derivation);
+              require $this->out_file("views/content/sources/xml_form.php");
+            }
+  
+          ?>
+          </div>
+  
+          <ul class="admin">
+            <li><a class="add" href="#" onclick="add_derivation('', false, '', false); return false;">Ajouter une source de d&eacute;rivation</a></li>
+          </ul>
+  
+        </div>
+  
+      </li>
+  
+    </ul>
+  
+    <ul class="admin_form_head">
+      <li>
+        <label for="is_reference">ce morceau est une r&eacute;f&eacute;rence</label>
+        <div class="form_input">
+          <input type="checkbox" id="is_reference" name="is_reference"<?php echo $this->out["morceau"]["reference"] ? " checked=\"checked\"" : "" ?> />
+        </div>
+      </li>
+    </ul>
+  
+    <ul class="admin_form_content" id="reference_form" class="form"<?php echo $this->out["morceau"]["reference"] ? "" : " style=\"display: none\"" ?>>
+  
+      <li id="reference_input">
+  
+        <?php
+  
+          $this->set_out
+          ( "form_params",
+            array
+            ( "name" => "reference",
+              "label" => "r&eacute;f&eacute;rence &raquo; ",
+              "can_delete" => false
+            )
+          );
+          $this->set_out("xml_form_source", $this->out["morceau"]["reference"]);
+          require $this->out_file("views/content/sources/xml_form.php");
+  
+        ?>
+  
+      </li>
+  
+    </ul>
+  
+    <ul id="original_form" class="form"<?php echo $this->out["morceau"]["reference"] ? " style=\"display: none\"" : "" ?>>
+  
+      <li>
+        <label for="titre">titre</label>
+        <div class="form_input">
+          <input type="text" class="long_text" name="titre" id="titre" value="<?php echo $this->out["morceau"]["titre"] ?>" />
+        </div>
+      </li>
+  
+      <li>
+        <label for="licence">licence</label>
+        <div class="form_input">
+          <select name="licence" id="licence">
+          <?php foreach($this->out["licences"]["list"] as $id_licence => $licence) : ?>
+            <option value="<?php echo $id_licence ?>"<?php echo $this->out["morceau"]["licence"]["id"] == $id_licence ? "selected=\"selected\"" : "" ?>><?php echo $licence["nom"] ?></option>
+          <?php endforeach; ?>
+          </select>
+        </div>
+      </li>
+  
+      <li>
+        <label for="date_creation">date de cr&eacute;ation</label>
+        <div class="form_input">
+  <?php
+  
+    $date_creation =
+    ( isset($this->out["morceau"]["date_creation"]) && $this->out["morceau"]["date_creation"] ?
+        explode("-", $this->out["morceau"]["date_creation"])
+      : array(0 => date("Y"), 1 => date("m"), 2 => date("d"))
+    );
+  
+  ?>
+          jour
+          <select name="jour_date_creation">
+  <?php for($j = 1; $j <=31; $j++) : ?>
+            <option value="<?php echo $j ?>"<?php echo $date_creation[2] == $j ? " selected=\"selected\"" : ""?>><?php echo $j ?></option>
+  <?php endfor; ?>
+          </select>
+          mois
+          <select name="mois_date_creation">
+  <?php for($m = 1; $m <=12; $m++) : ?>
+           <option value="<?php echo $m ?>"<?php echo $date_creation[1] == $m ? " selected=\"selected\"" : ""?>><?php echo $m ?></option>
+  <?php endfor; ?>
+          </select>
+          ann&eacute;e
+          <input type="text" size="4" name="annee_date_creation" value="<?php echo $date_creation[0] ?>">
+  
+        </div>
+      </li>
+  
+      <li>
+        <h3><label>Fichiers</label> <a href="#" onclick="add_document(); return false;">Ajouter un fichier</a></h3>
+      </li>
+  
+      <li>
+        <div id="documents">
+  
+  <?php if($this->out["morceau"]) : foreach($this->out["morceau"]["documents"] as $id_document => $document) : ?>
+  
+          <div class="document" id="document_<?php echo $id_document ?>">
+            <div class="delete"><a href="#" onclick="del_document('<?php echo $id_document ?>'); return false;">Enlever ce fichier</a></div>
+            <label for="document_nom_<?php echo $id_document ?>">nom</label>
+            <input type="text" class="long_text" name="document_nom_<?php echo $id_document ?>" id="document_nom_<?php echo $id_document ?>" value="<?php echo $document["nom"] ?>" />
+            <div class="clear"><!-- --></div>
+            <label for="document_url_<?php echo $id_document ?>">url</label>
+            <input type="text" size="40" name="document_url_<?php echo $id_document ?>" id="document_url_<?php echo $id_document ?>" value="<?php echo $document["url"] ?>" />
+          </div>
+          <script type="text/javascript">if(last_document_id <= <?php echo $id_document ?>) last_document_id = <?php echo $id_document ?> + 1; </script>
+  
+  <?php endforeach; endif; ?>
+  
+        </div>
+      </li>
+  
+      <li>
+        <label for="description">description</label>
+      </li>
+      <li>
+        <textarea class="tinymce" cols="70" rows="10" name="description" id="description"><?php echo isset($this->out["morceau"]["description"]) ? $this->out["morceau"]["description"] : "" ?></textarea>
+      </li>
+  
+    </ul>
+  
+    <ul class="form">
+      <li>
+        <div class="form_buttons">
+          <input type="submit" value="Ajouter" />
+        </div>
+      </li>
+    </ul>
+  </fieldset>
+</form>
+
+<?php else : ?>
+
+<p>Vous ne g&eacute;rez aucun groupe pour le moment.</p>
+<p>Pour ajouter un morceau, vous devez d'abord <a href="<?php echo $this->url("users/groupes/add") ?>">cr&eacute;er un groupe</a>.</p>
+
+<?php endif; ?>
diff --git a/app/out/default/views/users/morceaux/edit.php b/app/out/default/views/users/morceaux/edit.php
new file mode 100644 (file)
index 0000000..39d4c81
--- /dev/null
@@ -0,0 +1,266 @@
+<?php require $this->out_file("views/tinymce.init.js.php"); ?>
+
+<h2>Modifier un morceau</h2>
+
+<script type="text/javascript">
+
+var albums = {};
+<?php foreach($this->out["albums"] as $id_groupe => $albums) : ?>
+albums["<?php echo $id_groupe ?>"] = {};
+<?php foreach($albums as $id_album => $album) : ?>
+albums["<?php echo $id_groupe ?>"]["<?php echo $id_album ?>"] = "<?php echo $album["titre"] ?>";
+<?php endforeach; ?>
+<?php endforeach; ?>
+var derivations = {};
+<?php
+
+  $index_derivation = 1;
+  foreach($this->out["morceau"]["derivations"] as $id_derivation => $derivation) :
+  if($id_derivation >= $index_derivation) $index_derivation = $id_derivation + 1;
+
+?>
+derivations[<?php echo $id_derivation ?>] = true;
+<?php endforeach; ?>
+var index_derivation = <?php echo $index_derivation ?>;
+var is_reference = <?php echo $this->out["morceau"]["reference"] ? "true" : "false" ?>;
+
+</script>
+
+<ul class="buttons">
+  <li><a href="<?php echo $this->url("users/morceaux") ?>">Retour &agrave; la liste des morceaux</a></li>
+</ul>
+
+<?php if($this->out["groupes"]["total"] > 0) : ?>
+
+<form name="morceau_form" action="<?php echo $this->url("users/morceaux/edit", array("id" => $_GET[$this->param("id")])) ?>" method="post">
+  <fieldset>
+    <input type="hidden" name="date_inscription" value="<?php echo $this->out["morceau"]["date_inscription"] ?>" />
+
+    <ul class="form">
+  
+      <li>
+        <label for="id_groupe">groupe</label>
+        <div class="form_input">
+          <select name="id_groupe" id="id_groupe" onchange="select_groupe(this.options[this.selectedIndex].value)">
+          <?php
+  
+            $current_groupe = null;
+            $first_groupe = null;
+            foreach($this->out["groupes"]["list"] as $id_groupe => $groupe) :
+            $selected = false;
+            if(!isset($first_groupe)) $first_groupe = $id_groupe;
+            if($this->out["groupe"]["id"] == $id_groupe)
+            { $current_groupe = $id_groupe;
+              $selected = true;
+            }
+  
+          ?>
+            <option value="<?php echo $id_groupe ?>"<?php echo $selected ? "selected=\"selected\"" : "" ?>><?php echo $groupe["nom"] ?></option>
+          <?php
+  
+            endforeach;
+            if(!isset($current_groupe)) $current_groupe = $first_groupe;
+  
+          ?>
+          </select>
+        </div>
+      </li>
+  
+      <li>
+        <div id="album_select">
+          <label for="album">album</label>
+          <div class="form_input">
+            <select name="album" id="album">
+              <option value="0"<?php echo $_GET[$this->param("album")] == "0" ? " selected=\"selected\"" : "" ?>>hors album</option>
+              <?php if($this->out["albums"][$current_groupe]) : ?>
+              <?php foreach($this->out["albums"][$current_groupe] as $id_album => $album) : ?>
+              <option value="<?php echo $id_album ?>"<?php echo $this->out["morceau"]["album"] == $id_album ? " selected=\"selected\"" : "" ?>><?php echo $album["titre"] ?></option>
+              <?php endforeach; ?>
+              <?php endif; ?>
+            </select>
+          </div>
+        </div>
+      </li>
+    </ul>
+  
+    <ul class="admin_form_head">
+      <li>
+        <label for="is_derivation">ce morceau est une d&eacute;rivation</label>
+        <div class="form_input">
+          <input type="checkbox" id="is_derivation" name="is_derivation"<?php echo $this->out["morceau"]["derivations"] ? " checked=\"checked\"" : "" ?> />
+        </div>
+      </li>
+    </ul>
+  
+    <ul class="admin_form_content" id="derivation_input"<?php echo $this->out["morceau"]["derivations"] ? "" : " style=\"display:none;\"" ?>>
+  
+      <li>
+  
+        <div id="derivations_list" class="form_values">
+  
+          <div id="derivations_items">
+          <?php
+  
+            foreach($this->out["morceau"]["derivations"] as $id_derivation => $derivation)
+            { $this->set_out
+              ( "form_params",
+                array
+                ( "maj_url" => $this->url("users/morceaux/maj_xml", array("id" => $this->out["morceau"]["id"], "derivation" => $id_derivation, "xml" => "derivation")),
+                  "name" => "derivation",
+                  "label" => "d&eacute;rive de &raquo; ",
+                  "can_delete" => true,
+                  "id" => $id_derivation
+                )
+              );
+              $this->set_out("xml_form_source", $derivation);
+              require $this->out_file("views/content/sources/xml_form.php");
+            }
+  
+          ?>
+          </div>
+  
+          <ul class="admin">
+            <li><a class="add" href="#" onclick="add_derivation('', false, '', false); return false;">Ajouter une source de d&eacute;rivation</a></li>
+          </ul>
+  
+        </div>
+  
+      </li>
+  
+    </ul>
+  
+    <ul class="admin_form_head">
+      <li>
+        <label for="is_reference">ce morceau est une r&eacute;f&eacute;rence</label>
+        <div class="form_input">
+          <input type="checkbox" id="is_reference" name="is_reference"<?php echo $this->out["morceau"]["reference"] ? " checked=\"checked\"" : "" ?> />
+        </div>
+      </li>
+    </ul>
+  
+    <ul class="admin_form_content" id="reference_form" class="form"<?php echo $this->out["morceau"]["reference"] ? "" : " style=\"display: none\"" ?>>
+  
+      <li id="reference_input">
+  
+        <?php
+  
+          $this->set_out
+          ( "form_params",
+            array
+            ( "maj_url" =>
+              ( $this->out["morceau"]["reference"] && $this->config("cache_actif") ?
+                  $this->url("users/morceaux/maj_xml", array("id" => $this->out["morceau"]["id"], "xml" => "reference"))
+                : ""
+              ),
+              "name" => "reference",
+              "label" => "r&eacute;f&eacute;rence &raquo; ",
+              "can_delete" => false
+            )
+          );
+          $this->set_out("xml_form_source", $this->out["morceau"]["reference"]);
+          require $this->out_file("views/content/sources/xml_form.php");
+  
+        ?>
+
+      </li>
+  
+    </ul>
+  
+    <ul id="original_form" class="form"<?php echo $this->out["morceau"]["reference"] ? " style=\"display: none\"" : "" ?>>
+  
+      <li>
+        <label for="titre">titre</label>
+        <div class="form_input">
+          <input type="text" class="long_text" name="titre" id="titre" value="<?php echo $this->out["morceau"]["titre"] ?>" />
+        </div>
+      </li>
+  
+      <li>
+        <label for="licence">licence</label>
+        <div class="form_input">
+          <select name="licence" id="licence">
+          <?php foreach($this->out["licences"]["list"] as $id_licence => $licence) : ?>
+            <option value="<?php echo $id_licence ?>"<?php echo $this->out["morceau"]["licence"]["id"] == $id_licence ? "selected=\"selected\"" : "" ?>><?php echo $licence["nom"] ?></option>
+          <?php endforeach; ?>
+          </select>
+        </div>
+      </li>
+  
+      <li>
+        <label for="date_creation">date de cr&eacute;ation</label>
+        <div class="form_input">
+  <?php
+  
+    $date_creation =
+    ( $this->out["morceau"]["date_creation"] ?
+        explode("-", $this->out["morceau"]["date_creation"])
+      : array(0 => date("Y"), 1 => date("m"), 2 => date("d"))
+    );
+  
+  ?>
+          jour
+          <select name="jour_date_creation">
+  <?php for($j = 1; $j <=31; $j++) : ?>
+            <option value="<?php echo $j ?>"<?php echo $date_creation[2] == $j ? " selected=\"selected\"" : ""?>><?php echo $j ?></option>
+  <?php endfor; ?>
+          </select>
+          mois
+          <select name="mois_date_creation">
+  <?php for($m = 1; $m <=12; $m++) : ?>
+           <option value="<?php echo $m ?>"<?php echo $date_creation[1] == $m ? " selected=\"selected\"" : ""?>><?php echo $m ?></option>
+  <?php endfor; ?>
+          </select>
+          ann&eacute;e
+          <input type="text" size="4" name="annee_date_creation" value="<?php echo $date_creation[0] ?>">
+        </div>
+      </li>
+  
+      <li>
+        <h3><label>Fichiers</label> <a href="#" onclick="add_document(); return false;">Ajouter un fichier</a></h3>
+      </li>
+  
+      <li>
+        <div id="documents">
+  
+  <?php if($this->out["morceau"]) : foreach($this->out["morceau"]["documents"] as $id_document => $document) : ?>
+  
+          <div class="document" id="document_<?php echo $id_document ?>">
+            <div class="delete"><a href="#" onclick="del_document('<?php echo $id_document ?>'); return false;">Enlever ce fichier</a></div>
+            <label for="document_nom_<?php echo $id_document ?>">nom</label>
+            <input type="text" class="long_text" name="document_nom_<?php echo $id_document ?>" id="document_nom_<?php echo $id_document ?>" value="<?php echo $document["nom"] ?>" />
+            <div class="clear"><!-- --></div>
+            <label for="document_url_<?php echo $id_document ?>">url</label>
+            <input type="text" size="48" name="document_url_<?php echo $id_document ?>" id="document_url_<?php echo $id_document ?>" value="<?php echo $document["url"] ?>" />
+          </div>
+          <script type="text/javascript">if(last_document_id <= <?php echo $id_document ?>) last_document_id = <?php echo $id_document ?> + 1; </script>
+  
+  <?php endforeach; endif; ?>
+  
+        </div>
+      </li>
+  
+      <li>
+        <label for="description">description</label>
+      </li>
+      <li>
+        <textarea class="tinymce" cols="70" rows="10" name="description" id="description"><?php echo $this->out["morceau"]["description"] ?></textarea>
+      </li>
+  
+    </ul>
+  
+    <ul class="form">
+      <li class="buttons">
+        <div class="form_buttons">
+          <input type="submit" value="Enregistrer" />
+        </div>
+      </li>
+    </ul>
+  </fieldset>
+</form>
+
+<?php else : ?>
+
+<p>Vous ne g&eacute;rez aucun groupe pour le moment.</p>
+<p>Pour ajouter un morceau, vous devez d'abord <a href="<?php echo $this->url("users/groupes/add") ?>">cr&eacute;er un groupe</a>.</p>
+
+<?php endif; ?>
diff --git a/app/out/default/views/users/morceaux/list.php b/app/out/default/views/users/morceaux/list.php
new file mode 100644 (file)
index 0000000..37e200e
--- /dev/null
@@ -0,0 +1,142 @@
+<?php
+
+  $albums = array();
+  if(isset($_GET[$this->param("groupe")]) && $_GET[$this->param("groupe")] && is_array($this->out["albums"][$_GET[$this->param("groupe")]]))
+  { foreach($this->out["albums"][$_GET[$this->param("groupe")]] as $id_album => $album)
+    { $albums[$id_album] = $album;
+    }
+  }
+  else
+  { foreach($this->out["albums"] as $id_groupe => $_albums)
+    { foreach($this->out["albums"][$id_groupe] as $id_album => $album)
+      { $albums[$id_album] = $album;
+      }
+    }
+  }
+
+?>
+
+<h2>Morceaux</h2>
+
+<ul class="buttons">
+  <li><a class="add" href="<?php echo $this->url("users/morceaux/add") ?>">Nouveau morceau</a></li>
+</ul>
+
+<?php if($this->out["groupes"]["total"] > 0 || (isset($this->out["albums"]["total"]) && $this->out["albums"]["total"] > 0)) : ?>
+
+<ul class="filters">
+<?php if($this->out["groupes"]["total"] > 0) : ?>
+  <li>
+<?php
+
+  $url_params = array();
+  if(isset($_GET[$this->param("album")]) && !$_GET[$this->param("album")]) $url_params["album"] = "";
+
+?>
+    <select onchange="document.location=this.options[this.selectedIndex].value;">
+      <option value="<?php echo $this->url("users/morceaux", $url_params) ?>"<?php echo $_GET[$this->param("groupe")] == "0" ? " selected=\"selected\"" : "" ?>>Tous les groupes</option>
+      <?php foreach($this->out["groupes"]["list"] as $id_groupe => $groupe) : $url_params["groupe"] = $id_groupe; ?>
+      <option value="<?php echo $this->url("users/morceaux", $url_params) ?>"<?php echo $_GET[$this->param("groupe")] == $id_groupe ? " selected=\"selected\"" : "" ?>><?php echo $groupe["nom"] ?></option>
+      <?php endforeach; ?>
+    </select>
+  </li>
+<?php endif; ?>
+<?php if($albums) : ?>
+  <li>
+    <span id="album_select">
+<?php
+
+  $url_params = array();
+  if(isset($_GET[$this->param("groupe")])) $url_params["groupe"] = $_GET[$this->param("groupe")];
+
+?>
+    <select onchange="document.location=this.options[this.selectedIndex].value;">
+      <option value="<?php echo $this->url("users/morceaux", $url_params) ?>"<?php echo !isset($_GET[$this->param("album")]) ? " selected=\"selected\"" : "" ?>>Tous les morceaux</option>
+<?php $url_params["album"] = ""; ?>
+      <option value="<?php echo $this->url("users/morceaux", $url_params) ?>"<?php echo isset($_GET[$this->param("album")]) && !$_GET[$this->param("album")] ? " selected=\"selected\"" : "" ?>>Hors album</option>
+      <?php foreach($albums as $id_album => $album) : $url_params["album"] = $id_album; ?>
+      <option value="<?php echo $this->url("users/morceaux", $url_params) ?>"<?php echo $_GET[$this->param("album")] == $id_album ? " selected=\"selected\"" : "" ?>>Album: <?php echo $album["reference"] ? $album["reference"]["titre"] : $album["titre"] ?></option>
+      <?php endforeach; ?>
+    </select>
+    </span>
+  </li>
+<?php endif; ?>
+</ul>
+
+<?php endif; ?>
+
+<?php if($this->out["morceaux"]["list"]) : ?>
+
+<?php $items = "morceaux"; $legend = "morceaux"; require $this->out_file("views/navig.php"); ?>
+
+<?php
+
+  $get_params = array();
+  if(isset($_GET[$this->param("groupe")]) && $_GET[$this->param("groupe")]) $get_params["groupe"] = $_GET[$this->param("groupe")];
+  if(isset($_GET[$this->param("album")]) && $_GET[$this->param("album")]) $get_params["album"] = $_GET[$this->param("album")];
+
+?>
+<form name="sources_form" action="<?php echo $this->url("users/morceaux", $get_params) ?>" method="post">
+  <fieldset>
+    <table class="admin">
+      <tr>
+        <th>titre</th>
+        <th>ordre</th>
+        <th align="center" colspan="2">actions</th>
+      </tr>
+    <?php foreach($this->out["morceaux"]["list"] as $id_morceau => $morceau) : ?>
+      <tr class="hl">
+        <td>
+    <?php if($morceau["reference"]) : ?>
+          r&eacute;f&eacute;rence &raquo; <a href="<?php echo $morceau["reference"]["from"] ?>"><?php echo $morceau["reference"]["titre"] ?> (<?php echo $morceau["reference"]["auteur"] ?>)</a>
+    <?php else : ?>
+          <a href="<?php echo $this->url("users/morceaux/edit", array("id" => $id_morceau)) ?>"><?php echo $morceau["titre"] ?></a>
+    <?php endif; ?>
+    <?php if($morceau["derivations"]) : ?>
+          <br />
+          <span class="small">
+            d&eacute;rive de &raquo;
+    <?php $n = 0; foreach($morceau["derivations"] as $derivation) : ?>
+            <?php echo $n ? ", " : "" ?><a href="<?php echo $derivation["from"] ?>"><?php echo $derivation["titre"] ?> (<?php echo $derivation["auteur"] ?>)</a>
+    <?php $n++; endforeach; ?>
+          </span>
+    <?php endif; ?>
+        </td>
+        <td class="action"><input type="text" name="ordre_<?php echo $id_morceau ?>" value="<?php echo isset($morceau["ordre"]) ? $morceau["ordre"] : 0 ?>" size="3" /></td>
+        <td class="action">
+    <?php if($morceau["permissions"]["editeur"]) : ?>
+        <a href="<?php echo $this->url("users/morceaux/edit", array("id" => $id_morceau)) ?>"
+           class="admin_link"
+           title="modifier ce morceau"><img src="<?php echo $this->out_url("icons/edit.gif") ?>" /></a>
+    <?php else : ?>
+        &nbsp;
+    <?php endif; ?>
+        </td>
+        <td class="action">
+    <?php if($morceau["permissions"]["admin"]) : ?>
+        <a href="<?php echo $this->url("users/morceaux/del", array("id" => $id_morceau)) ?>"
+           class="admin_link"
+           title="supprimer ce morceau"><img src="<?php echo $this->out_url("icons/del.gif") ?>"
+           onclick="return confirm('Supprimer ce morceau ?')"/></a>
+    <?php else : ?>
+        &nbsp;
+    <?php endif; ?>
+        </td>
+      </tr>
+    <?php endforeach; ?>
+    </table>
+    <ul class="form">
+      <li class="buttons">
+        <div class="form_buttons">
+          <input type="submit" value="Enregistrer l'ordre" />
+        </div>
+      </li>
+    </ul>
+  </fieldset>
+</form>
+
+<?php $items = "morceaux"; $legend = "morceaux"; require $this->out_file("views/navig.php"); ?>
+
+<?php else : ?>
+<p>Aucun morceau pour le moment</p>
+<?php endif; ?>
diff --git a/app/out/default/views/users/pistes/add.php b/app/out/default/views/users/pistes/add.php
new file mode 100644 (file)
index 0000000..bfe82eb
--- /dev/null
@@ -0,0 +1,264 @@
+<?php require $this->out_file("views/tinymce.init.js.php"); ?>
+
+<h2>Nouvelle source</h2>
+
+<script type="text/javascript">
+
+var morceaux = {};
+<?php foreach($this->out["morceaux"] as $id_groupe => $albums) : ?>
+morceaux["<?php echo $id_groupe ?>"] = {};
+<?php foreach($albums as $id_album => $_morceaux) : ?>
+morceaux["<?php echo $id_groupe ?>"]["<?php echo $id_album ?>"] = {};
+<?php foreach($_morceaux as $id_morceau => $_morceau) : ?>
+morceaux["<?php echo $id_groupe ?>"]["<?php echo $id_album ?>"]["<?php echo $id_morceau ?>"] = "<?php echo $_morceau["reference"] ? $_morceau["reference"]["titre"] : $_morceau["titre"] ?>";
+<?php endforeach; ?>
+<?php endforeach; ?>
+<?php endforeach; ?>
+var derivations = {};
+<?php
+
+  $index_derivation = 1;
+  foreach($this->out["piste"]["derivations"] as $id_derivation => $derivation) :
+  if($id_derivation >= $index_derivation) $index_derivation = $id_derivation + 1;
+
+?>
+derivations[<?php echo $id_derivation ?>] = true;
+<?php endforeach; ?>
+var index_derivation = <?php echo $index_derivation ?>;
+var is_reference = <?php echo $this->out["piste"]["reference"] ? "true" : "false" ?>;
+
+</script>
+
+<ul class="buttons">
+  <li><a href="<?php echo $this->url("users/pistes") ?>">Retour &agrave; la liste des sources</a></li>
+</ul>
+
+<?php if($this->out["groupes"]["total"] > 0) : ?>
+
+<form name="morceau_form" action="<?php echo $this->url("users/pistes/add") ?>" method="post">
+  <fieldset>
+    <ul class="form">
+  
+      <li>
+        <label for="id_groupe">groupe</label>
+        <div class="form_input">
+          <select name="id_groupe" id="id_groupe" onchange="select_morceaux_groupe(this.options[this.selectedIndex].value)">
+          <?php
+  
+            $current_groupe = null;
+            $first_groupe = null;
+            foreach($this->out["groupes"]["list"] as $id_groupe => $groupe) :
+            $selected = false;
+            if(!isset($first_groupe)) $first_groupe = $id_groupe;
+            if($this->out["groupe"]["id"] == $id_groupe)
+            { $current_groupe = $id_groupe;
+              $selected = true;
+            }
+  
+          ?>
+            <option value="<?php echo $id_groupe ?>"<?php echo $selected ? "selected=\"selected\"" : "" ?>><?php echo $groupe["nom"] ?></option>
+          <?php
+  
+            endforeach;
+            if(!isset($current_groupe)) $current_groupe = $first_groupe;
+  
+          ?>
+          </select>
+        </div>
+      </li>
+  
+      <li>
+        <div id="morceau_select">
+          <label for="morceau">morceau</label>
+          <div class="form_input">
+            <select name="morceau" id="morceau">
+              <option value="0"<?php echo $_GET[$this->param("morceau")] == "0" ? " selected=\"selected\"" : "" ?>>hors morceau</option>
+              <?php if($this->out["morceaux"][$current_groupe]) : ?>
+              <?php foreach($this->out["morceaux"][$current_groupe] as $id_album => $album) : ?>
+              <?php foreach($this->out["morceaux"][$current_groupe][$id_album] as $id_morceau => $morceau) : ?>
+              <option value="<?php echo $id_morceau ?>"<?php echo $this->out["piste"]["morceau"] == $id_morceau ? " selected=\"selected\"" : "" ?>><?php echo $morceau["reference"] ? $morceau["reference"]["titre"] : $morceau["titre"] ?></option>
+              <?php endforeach; ?>
+              <?php endforeach; ?>
+              <?php endif; ?>
+            </select>
+          </div>
+        </div>
+      </li>
+    </ul>
+  
+    <ul class="admin_form_head">
+      <li>
+        <label for="is_derivation">cette source est une d&eacute;rivation</label>
+        <div class="form_input">
+          <input type="checkbox" id="is_derivation" name="is_derivation"<?php echo $this->out["piste"]["derivations"] ? " checked=\"checked\"" : "" ?> />
+        </div>
+      </li>
+    </ul>
+  
+    <ul class="admin_form_content" id="derivation_input"<?php echo $this->out["piste"]["derivations"] ? "" : " style=\"display:none;\"" ?>>
+  
+      <li>
+  
+        <div id="derivations_list" class="form_values">
+  
+          <div id="derivations_items">
+          <?php
+  
+            foreach($this->out["piste"]["derivations"] as $id_derivation => $derivation)
+            { $this->set_out
+              ( "form_params",
+                array
+                ( "name" => "derivation",
+                  "label" => "d&eacute;rive de &raquo; ",
+                  "can_delete" => true,
+                  "id" => $id_derivation
+                )
+              );
+              $this->set_out("xml_form_source", $derivation);
+              require $this->out_file("views/content/sources/xml_form.php");
+            }
+  
+          ?>
+          </div>
+  
+          <ul class="admin">
+            <li><a class="add" href="#" onclick="add_derivation('', false, '', false); return false;">Ajouter une source de d&eacute;rivation</a></li>
+          </ul>
+  
+        </div>
+  
+      </li>
+  
+    </ul>
+  
+    <ul class="admin_form_head">
+      <li>
+        <label for="is_reference">cette source est une r&eacute;f&eacute;rence</label>
+        <div class="form_input">
+          <input type="checkbox" id="is_reference" name="is_reference"<?php echo $this->out["piste"]["reference"] ? " checked=\"checked\"" : "" ?> />
+        </div>
+      </li>
+    </ul>
+  
+    <ul class="admin_form_content" id="reference_form" class="form"<?php echo $this->out["piste"]["reference"] ? "" : " style=\"display: none\"" ?>>
+  
+      <li id="reference_input">
+  
+        <?php
+  
+          $this->set_out
+          ( "form_params",
+            array
+            ( "name" => "reference",
+              "label" => "r&eacute;f&eacute;rence &raquo; ",
+              "can_delete" => false
+            )
+          );
+          $this->set_out("xml_form_source", $this->out["piste"]["reference"]);
+          require $this->out_file("views/content/sources/xml_form.php");
+  
+        ?>
+  
+      </li>
+  
+    </ul>
+  
+    <ul id="original_form" class="form"<?php echo $this->out["piste"]["reference"] ? " style=\"display: none\"" : "" ?>>
+  
+      <li>
+        <label for="titre">titre</label>
+        <div class="form_input">
+          <input type="text" class="long_text" name="titre" id="titre" value="<?php echo $this->out["piste"]["titre"] ?>" />
+        </div>
+      </li>
+  
+      <li>
+        <label for="licence">licence</label>
+        <div class="form_input">
+          <select name="licence" id="licence">
+          <?php foreach($this->out["licences"]["list"] as $id_licence => $licence) : ?>
+            <option value="<?php echo $id_licence ?>"<?php echo $this->out["piste"]["licence"]["id"] == $id_licence ? "selected=\"selected\"" : "" ?>><?php echo $licence["nom"] ?></option>
+          <?php endforeach; ?>
+          </select>
+        </div>
+      </li>
+  
+      <li>
+        <label for="date_creation">date de cr&eacute;ation</label>
+        <div class="form_input">
+  <?php
+  
+    $date_creation =
+    ( isset($this->out["piste"]["date_creation"]) && $this->out["piste"]["date_creation"] ?
+        explode("-", $this->out["piste"]["date_creation"])
+      : array(0 => date("Y"), 1 => date("m"), 2 => date("d"))
+    );
+  
+  ?>
+          jour
+          <select name="jour_date_creation">
+  <?php for($j = 1; $j <=31; $j++) : ?>
+            <option value="<?php echo $j ?>"<?php echo $date_creation[2] == $j ? " selected=\"selected\"" : ""?>><?php echo $j ?></option>
+  <?php endfor; ?>
+          </select>
+          mois
+          <select name="mois_date_creation">
+  <?php for($m = 1; $m <=12; $m++) : ?>
+           <option value="<?php echo $m ?>"<?php echo $date_creation[1] == $m ? " selected=\"selected\"" : ""?>><?php echo $m ?></option>
+  <?php endfor; ?>
+          </select>
+          ann&eacute;e
+          <input type="text" size="4" name="annee_date_creation" value="<?php echo $date_creation[0] ?>">
+  
+        </div>
+      </li>
+  
+      <li>
+        <h3><label>Fichiers</label> <a href="#" onclick="add_document(); return false;">Ajouter un fichier</a></h3>
+      </li>
+  
+      <li>
+        <div id="documents">
+  
+  <?php if($this->out["piste"]) : foreach($this->out["piste"]["documents"] as $id_document => $document) : ?>
+  
+          <div class="document" id="document_<?php echo $id_document ?>">
+            <div class="delete"><a href="#" onclick="del_document('<?php echo $id_document ?>'); return false;">Enlever ce fichier</a></div>
+            <label for="document_nom_<?php echo $id_document ?>">nom</label>
+            <input type="text" class="long_text" name="document_nom_<?php echo $id_document ?>" id="document_nom_<?php echo $id_document ?>" value="<?php echo $document["nom"] ?>" />
+            <div class="clear"><!-- --></div>
+            <label for="document_url_<?php echo $id_document ?>">url</label>
+            <input type="text" size="48" name="document_url_<?php echo $id_document ?>" id="document_url_<?php echo $id_document ?>" value="<?php echo $document["url"] ?>" />
+          </div>
+          <script type="text/javascript">if(last_document_id <= <?php echo $id_document ?>) last_document_id = <?php echo $id_document ?> + 1; </script>
+  
+  <?php endforeach; endif; ?>
+  
+        </div>
+      </li>
+  
+      <li>
+        <label for="description">description</label>
+      </li>
+      <li>
+        <textarea class="tinymce" cols="70" rows="10" name="description" id="description"><?php echo isset($this->out["piste"]["description"]) ? $this->out["piste"]["description"] : "" ?></textarea>
+      </li>
+  
+    </ul>
+  
+    <ul class="form">
+      <li class="buttons">
+        <div class="form_buttons">
+          <input type="submit" value="Ajouter" />
+        </div>
+      </li>
+    </ul>
+  </fieldset>
+</form>
+
+<?php else : ?>
+
+<p>Vous ne g&eacute;rez aucun groupe pour le moment.</p>
+<p>Pour ajouter une piste, vous devez d'abord <a href="<?php echo $this->url("users/groupes/add") ?>">cr&eacute;er un groupe</a>.</p>
+
+<?php endif; ?>
diff --git a/app/out/default/views/users/pistes/edit.php b/app/out/default/views/users/pistes/edit.php
new file mode 100644 (file)
index 0000000..be94c15
--- /dev/null
@@ -0,0 +1,272 @@
+<?php require $this->out_file("views/tinymce.init.js.php"); ?>
+
+<h2>Modifier une source</h2>
+
+<script type="text/javascript">
+
+var morceaux = {};
+<?php foreach($this->out["morceaux"] as $id_groupe => $albums) : ?>
+morceaux["<?php echo $id_groupe ?>"] = {};
+<?php foreach($albums as $id_album => $_morceaux) : ?>
+morceaux["<?php echo $id_groupe ?>"]["<?php echo $id_album ?>"] = {};
+<?php foreach($_morceaux as $id_morceau => $_morceau) : ?>
+morceaux["<?php echo $id_groupe ?>"]["<?php echo $id_album ?>"]["<?php echo $id_morceau ?>"] = "<?php echo $_morceau["titre"] ?>";
+<?php endforeach; ?>
+<?php endforeach; ?>
+<?php endforeach; ?>
+var derivations = {};
+<?php
+
+  $index_derivation = 1;
+  foreach($this->out["piste"]["derivations"] as $id_derivation => $derivation) :
+  if($id_derivation >= $index_derivation) $index_derivation = $id_derivation + 1;
+
+?>
+derivations[<?php echo $id_derivation ?>] = true;
+<?php endforeach; ?>
+var index_derivation = <?php echo $index_derivation ?>;
+var is_reference = <?php echo $this->out["piste"]["reference"] ? "true" : "false" ?>;
+
+</script>
+
+<ul class="buttons">
+  <li><a href="<?php echo $this->url("users/pistes") ?>">Retour &agrave; la liste des sources</a></li>
+</ul>
+
+<?php if($this->out["groupes"]["total"] > 0) : ?>
+
+<form name="piste_form" action="<?php echo $this->url("users/pistes/edit", array("id" => $_GET[$this->param("id")])) ?>" method="post">
+  <fieldset>
+
+    <input type="hidden" name="date_inscription" value="<?php echo $this->out["piste"]["date_inscription"] ?>" />
+  
+    <ul class="form">
+  
+      <li>
+        <label for="id_groupe">groupe</label>
+        <div class="form_input">
+          <select name="id_groupe" id="id_groupe" onchange="select_morceaux_groupe(this.options[this.selectedIndex].value)">
+          <?php
+  
+            $current_groupe = null;
+            $first_groupe = null;
+            foreach($this->out["groupes"]["list"] as $id_groupe => $groupe) :
+            $selected = false;
+            if(!isset($first_groupe)) $first_groupe = $id_groupe;
+            if($this->out["groupe"]["id"] == $id_groupe)
+            { $current_groupe = $id_groupe;
+              $selected = true;
+            }
+  
+          ?>
+            <option value="<?php echo $id_groupe ?>"<?php echo $selected ? "selected=\"selected\"" : "" ?>><?php echo $groupe["nom"] ?></option>
+          <?php
+  
+            endforeach;
+            if(!isset($current_groupe)) $current_groupe = $first_groupe;
+  
+          ?>
+          </select>
+        </div>
+      </li>
+  
+      <li>
+        <div id="morceau_select">
+          <label for="morceau">morceau</label>
+          <div class="form_input">
+            <select name="morceau" id="morceau">
+              <option value="0"<?php echo $_GET[$this->param("morceau")] == "0" ? " selected=\"selected\"" : "" ?>>hors morceau</option>
+              <?php if($this->out["morceaux"][$current_groupe]) : ?>
+              <?php foreach($this->out["morceaux"][$current_groupe] as $id_album => $album) : ?>
+              <?php foreach($this->out["morceaux"][$current_groupe][$id_album] as $id_morceau => $morceau) : ?>
+              <option value="<?php echo $id_morceau ?>"<?php echo $this->out["piste"]["morceau"] == $id_morceau ? " selected=\"selected\"" : "" ?>><?php echo $morceau["reference"] ? $morceau["reference"]["titre"] : $morceau["titre"] ?></option>
+              <?php endforeach; ?>
+              <?php endforeach; ?>
+              <?php endif; ?>
+            </select>
+          </div>
+        </div>
+      </li>
+    </ul>
+  
+    <ul class="admin_form_head">
+      <li>
+        <label for="is_derivation">cette source est une d&eacute;rivation</label>
+        <div class="form_input">
+          <input type="checkbox" id="is_derivation" name="is_derivation"<?php echo $this->out["piste"]["derivations"] ? " checked=\"checked\"" : "" ?> />
+        </div>
+      </li>
+    </ul>
+  
+    <ul class="admin_form_content" id="derivation_input"<?php echo $this->out["piste"]["derivations"] ? "" : " style=\"display:none;\"" ?>>
+  
+      <li>
+  
+        <div id="derivations_list" class="form_values">
+  
+          <div id="derivations_items">
+          <?php
+  
+            foreach($this->out["piste"]["derivations"] as $id_derivation => $derivation)
+            { $this->set_out
+              ( "form_params",
+                array
+                ( "maj_url" => $this->url("users/pistes/maj_xml", array("id" => $this->out["piste"]["id"], "derivation" => $id_derivation, "xml" => "derivation")),
+                  "name" => "derivation",
+                  "label" => "d&eacute;rive de &raquo; ",
+                  "can_delete" => true,
+                  "id" => $id_derivation
+                )
+              );
+              $this->set_out("xml_form_source", $derivation);
+              require $this->out_file("views/content/sources/xml_form.php");
+            }
+  
+          ?>
+          </div>
+  
+          <ul class="admin">
+            <li><a class="add" href="#" onclick="add_derivation('', false, '', false); return false;">Ajouter une source de d&eacute;rivation</a></li>
+          </ul>
+  
+        </div>
+  
+      </li>
+  
+    </ul>
+  
+    <ul class="admin_form_head">
+      <li>
+        <label for="is_reference">cette source est une r&eacute;f&eacute;rence</label>
+        <div class="form_input">
+          <input type="checkbox" id="is_reference" name="is_reference"<?php echo $this->out["piste"]["reference"] ? " checked=\"checked\"" : "" ?> />
+        </div>
+      </li>
+    </ul>
+  
+    <ul class="admin_form_content" id="reference_form" class="form"<?php echo $this->out["piste"]["reference"] ? "" : " style=\"display: none\"" ?>>
+  
+      <li id="reference_input">
+  
+        <?php
+  
+          $this->set_out
+          ( "form_params",
+            array
+            ( "maj_url" =>
+              ( $this->out["piste"]["reference"] && $this->config("cache_actif") ?
+                  $this->url("users/pistes/maj_xml", array("id" => $this->out["piste"]["id"], "xml" => "reference"))
+                : ""
+              ),
+              "name" => "reference",
+              "label" => "r&eacute;f&eacute;rence &raquo; ",
+              "can_delete" => false
+            )
+          );
+          $this->set_out("xml_form_source", $this->out["piste"]["reference"]);
+          require $this->out_file("views/content/sources/xml_form.php");
+  
+        ?>
+  
+      </li>
+  
+    </ul>
+  
+    <ul id="original_form" class="form"<?php echo $this->out["piste"]["reference"] ? " style=\"display: none\"" : "" ?>>
+  
+      <li>
+        <label for="titre">titre</label>
+        <div class="form_input">
+          <input type="text" class="long_text" name="titre" id="titre" value="<?php echo $this->out["piste"]["titre"] ?>" /></p>
+        </div>
+      </li>
+  
+      <li>
+        <label for="licence">licence</label>
+        <div class="form_input">
+          <select name="licence" id="licence">
+          <?php foreach($this->out["licences"]["list"] as $id_licence => $licence) : ?>
+            <option value="<?php echo $id_licence ?>"<?php echo $this->out["piste"]["licence"]["id"] == $id_licence ? "selected=\"selected\"" : "" ?>><?php echo $licence["nom"] ?></option>
+          <?php endforeach; ?>
+          </select>
+        </div>
+      </li>
+  
+      <li>
+        <label for="date_creation">date de cr&eacute;ation</label>
+        <div class="form_input">
+  <?php
+  
+    $date_creation =
+    ( $this->out["piste"]["date_creation"] ?
+        explode("-", $this->out["piste"]["date_creation"])
+      : array(0 => date("Y"), 1 => date("m"), 2 => date("d"))
+    );
+  
+  ?>
+          jour
+          <select name="jour_date_creation">
+  <?php for($j = 1; $j <=31; $j++) : ?>
+            <option value="<?php echo $j ?>"<?php echo $date_creation[2] == $j ? " selected=\"selected\"" : ""?>><?php echo $j ?></option>
+  <?php endfor; ?>
+          </select>
+          mois
+          <select name="mois_date_creation">
+  <?php for($m = 1; $m <=12; $m++) : ?>
+           <option value="<?php echo $m ?>"<?php echo $date_creation[1] == $m ? " selected=\"selected\"" : ""?>><?php echo $m ?></option>
+  <?php endfor; ?>
+          </select>
+          ann&eacute;e
+          <input type="text" size="4" name="annee_date_creation" value="<?php echo $date_creation[0] ?>">
+        </div>
+      </li>
+  
+      <li>
+        <h3><label>Fichiers</label> <a href="#" onclick="add_document(); return false;">Ajouter un fichier</a></h3>
+      </li>
+  
+      <li>
+        <div id="documents">
+  
+  <?php if($this->out["piste"]) : foreach($this->out["piste"]["documents"] as $id_document => $document) : ?>
+  
+          <div class="document" id="document_<?php echo $id_document ?>">
+            <div class="delete"><a href="#" onclick="del_document('<?php echo $id_document ?>'); return false;">Enlever ce fichier</a></div>
+            <label for="document_nom_<?php echo $id_document ?>">nom</label>
+            <input type="text" class="long_text" name="document_nom_<?php echo $id_document ?>" id="document_nom_<?php echo $id_document ?>" value="<?php echo $document["nom"] ?>" />
+            <div class="clear"><!-- --></div>
+            <label for="document_url_<?php echo $id_document ?>">url</label>
+            <input type="text" size="48" name="document_url_<?php echo $id_document ?>" id="document_url_<?php echo $id_document ?>" value="<?php echo $document["url"] ?>" />
+          </div>
+          <script type="text/javascript">if(last_document_id <= <?php echo $id_document ?>) last_document_id = <?php echo $id_document ?> + 1; </script>
+  
+  <?php endforeach; endif; ?>
+  
+        </div>
+      </li>
+  
+      <li>
+        <label for="description">description</label>
+      </li>
+      <li>
+        <textarea class="tinymce" cols="70" rows="10" name="description" id="description"><?php echo $this->out["piste"]["description"] ?></textarea>
+      </li>
+  
+    </ul>
+  
+    <ul class="form">
+      <li class="buttons">
+        <div class="form_buttons">
+          <input type="submit" value="Enregistrer" />
+        </div>
+      </li>
+    </ul>
+  </fieldset>
+</form>
+
+<?php else : ?>
+
+<p>Vous ne g&eacute;rez aucun groupe pour le moment.</p>
+<p>Pour ajouter une piste, vous devez d'abord <a href="<?php echo $this->url("users/groupes/add") ?>">cr&eacute;er un groupe</a>.</p>
+
+<?php endif; ?>
diff --git a/app/out/default/views/users/pistes/list.php b/app/out/default/views/users/pistes/list.php
new file mode 100644 (file)
index 0000000..a02b4a5
--- /dev/null
@@ -0,0 +1,174 @@
+<?php
+
+  $albums = array();
+  if(isset($_GET[$this->param("groupe")]) && $_GET[$this->param("groupe")] && is_array($this->out["albums"][$_GET[$this->param("groupe")]]))
+  { foreach($this->out["albums"][$_GET[$this->param("groupe")]] as $id_album => $album)
+    { $albums[$id_album] = $album;
+    }
+  }
+  else
+  { foreach($this->out["albums"] as $id_groupe => $_albums)
+    { foreach($this->out["albums"][$id_groupe] as $id_album => $album)
+      { $albums[$id_album] = $album;
+      }
+    }
+  }
+
+  $morceaux = array();
+  if(isset($_GET[$this->param("groupe")]) && $_GET[$this->param("groupe")])
+  { $id_groupe = $_GET[$this->param("groupe")];
+    if(is_array($this->out["morceaux"][$id_groupe]))
+    { foreach($this->out["morceaux"][$id_groupe] as $id_album => $_morceaux)
+      { if(isset($_GET[$this->param("album")]) && $_GET[$this->param("album")])
+        { if($id_album == $_GET[$this->param("album")])
+          { foreach($this->out["morceaux"][$id_groupe][$id_album] as $id_morceau => $morceau)
+            { $morceaux[$id_morceau] = $morceau;
+            }
+          }
+        }
+        else
+        { foreach($this->out["morceaux"][$id_groupe] as $id_album => $_morceaux)
+          { foreach($this->out["morceaux"][$id_groupe][$id_album] as $id_morceau => $morceau)
+            { $morceaux[$id_morceau] = $morceau;
+            }
+          }
+        }
+      }
+    }
+  }
+  else
+  { foreach($this->out["morceaux"] as $id_groupe => $_albums)
+    { foreach($this->out["morceaux"][$id_groupe] as $id_album => $_morceaux)
+      { foreach($this->out["morceaux"][$id_groupe][$id_album] as $id_morceau => $morceau)
+        { $morceaux[$id_morceau] = $morceau;
+        }
+      }
+    }
+  }
+
+?>
+
+<h2>Sources</h2>
+
+<ul class="buttons">
+  <li><a class="add" href="<?php echo $this->url("users/pistes/add") ?>">Nouvelle source</a></li>
+</ul>
+
+<?php if($this->out["groupes"]["total"] > 0) : ?>
+
+<ul class="filters">
+<?php if($this->out["groupes"]["total"] > 0) : ?>
+  <li>
+    <select onchange="document.location=this.options[this.selectedIndex].value;">
+      <option value="<?php echo $this->url("users/pistes") ?>"<?php echo $_GET[$this->param("groupe")] == "0" ? " selected=\"selected\"" : "" ?>>Tous les groupes</option>
+      <?php foreach($this->out["groupes"]["list"] as $id_groupe => $groupe) : ?>
+      <option value="<?php echo $this->url("users/pistes", array("groupe" => $id_groupe)) ?>"<?php echo $_GET[$this->param("groupe")] == $id_groupe ? " selected=\"selected\"" : "" ?>><?php echo $groupe["nom"] ?></option>
+      <?php endforeach; ?>
+    </select>
+  </li>
+<?php endif; ?>
+<?php if(false && $albums) : ?>
+  <li>
+    <span id="album_select">
+    <select onchange="document.location=this.options[this.selectedIndex].value;">
+      <option value="<?php echo $this->url("users/pistes") ?>"<?php echo $_GET[$this->param("album")] == "0" ? " selected=\"selected\"" : "" ?>>Tous les albums</option>
+      <?php foreach($albums as $id_album => $album) : ?>
+      <option value="<?php echo $this->url("users/pistes", array("album" => $id_album)) ?>"<?php echo $_GET[$this->param("album")] == $id_album ? " selected=\"selected\"" : "" ?>><?php echo $album["reference"] ? $album["reference"]["titre"] : $album["titre"] ?></option>
+      <?php endforeach; ?>
+    </select>
+    </span>
+  </li>
+<?php endif; ?>
+
+<?php if($morceaux) : ?>
+  <li>
+    <span id="morceau_select">
+    <select onchange="document.location=this.options[this.selectedIndex].value;">
+      <option value="<?php echo $this->url("users/pistes") ?>"<?php echo $_GET[$this->param("morceau")] == "0" ? " selected=\"selected\"" : "" ?>>Tous les morceaux</option>
+      <?php foreach($morceaux as $id_morceau => $morceau) : ?>
+      <option value="<?php echo $this->url("users/pistes", array("morceau" => $id_morceau)) ?>"<?php echo $_GET[$this->param("morceau")] == $id_morceau ? " selected=\"selected\"" : "" ?>><?php echo $morceau["reference"] ? $morceau["reference"]["titre"] : $morceau["titre"] ?></option>
+      <?php endforeach; ?>
+    </select>
+    </span>
+  </li>
+<?php endif; ?>
+
+</ul>
+
+<?php endif; ?>
+
+<?php if($this->out["pistes"]["list"]) : ?>
+
+<?php $items = "pistes"; $legend = "sources"; require $this->out_file("views/navig.php"); ?>
+
+<?php
+
+  $get_params = array();
+  if(isset($_GET[$this->param("groupe")]) && $_GET[$this->param("groupe")]) $get_params["groupe"] = $_GET[$this->param("groupe")];
+  if(isset($_GET[$this->param("morceau")]) && $_GET[$this->param("morceau")]) $get_params["morceau"] = $_GET[$this->param("morceau")];
+
+?>
+<form name="sources_form" action="<?php echo $this->url("users/pistes", $get_params) ?>" method="post">
+  <fieldset>
+    <table class="admin">
+      <tr>
+        <th>titre</th>
+        <th>ordre</th>
+        <th align="center" colspan="2">actions</th>
+      </tr>
+    <?php foreach($this->out["pistes"]["list"] as $id_piste => $piste) : ?>
+      <tr class="hl">
+        <td>
+    <?php if($piste["reference"]) : ?>
+          r&eacute;f&eacute;rence &raquo; <a href="<?php echo $piste["reference"]["from"] ?>"><?php echo $piste["reference"]["titre"] ?> (<?php echo $piste["reference"]["auteur"] ?>)</a>
+    <?php else : ?>
+          <a href="<?php echo $this->url("users/pistes/edit", array("id" => $id_piste)) ?>"><?php echo $piste["titre"] ?></a>
+    <?php endif; ?>
+    <?php if($piste["derivations"]) : ?>
+          <br />
+          <span class="small">
+            d&eacute;rive de &raquo;
+    <?php $n = 0; foreach($piste["derivations"] as $derivation) : ?>
+            <?php echo $n ? ", " : "" ?><a href="<?php echo $derivation["from"] ?>"><?php echo $derivation["titre"] ?> (<?php echo $derivation["auteur"] ?>)</a>
+    <?php $n++; endforeach; ?>
+          </span>
+    <?php endif; ?>
+        </td>
+        <td class="action"><input type="text" name="ordre_<?php echo $id_piste ?>" value="<?php echo isset($piste["ordre"]) ? $piste["ordre"] : 0 ?>" size="3" /></td>
+        <td class="action">
+    <?php if($piste["permissions"]["editeur"]) : ?>
+        <a href="<?php echo $this->url("users/pistes/edit", array("id" => $id_piste)) ?>"
+           class="admin_link"
+           title="modifier cette source"><img src="<?php echo $this->out_url("icons/edit.gif") ?>" /></a>
+    <?php else : ?>
+        &nbsp;
+    <?php endif; ?>
+        </td>
+        <td class="action">
+    <?php if($piste["permissions"]["admin"]) : ?>
+        <a href="<?php echo $this->url("users/pistes/del", array("id" => $id_piste)) ?>"
+           class="admin_link"
+           title="supprimer cette source"
+           onclick="return confirm('Supprimer cette source ?')"><img src="<?php echo $this->out_url("icons/del.gif") ?>" /></a>
+    <?php else : ?>
+        &nbsp;
+    <?php endif; ?>
+        </td>
+      </tr>
+    <?php endforeach; ?>
+    </table>
+    <ul class="form">
+      <li class="buttons">
+        <div class="form_buttons">
+          <input type="submit" value="Enregistrer l'ordre" />
+        </div>
+      </li>
+    </ul>
+  </fieldset>
+</form>
+
+<?php $items = "pistes"; $legend = "sources"; require $this->out_file("views/navig.php"); ?>
+
+<?php else : ?>
+<p>Aucune source pour le moment</p>
+<?php endif; ?>
diff --git a/mw_sourceml.php b/mw_sourceml.php
new file mode 100644 (file)
index 0000000..ef62f77
--- /dev/null
@@ -0,0 +1,331 @@
+<?php
+
+  class mw_sourceml extends mw_plugin{
+
+    function title(){
+      return "SourceML";
+    }
+
+    function description(){
+      return "Publication de sources musicales";
+    }
+
+    function init($env){
+
+      $env->set_link("admin/sourceml", $env->url("admin/sourceml"), "SourceML", 50);
+      $env->set_link("admin/sourceml/licences", $env->url("admin/licences"), "Licences", 10);
+      $env->set_link("admin/sourceml/cache", $env->url("admin/cache"), "Cache", 20);
+      $env->set_link("admin/sourceml/maintenance", $env->url("admin/maintenance"), "Maintenance", 30);
+
+      $env->set_link("users/authors", $env->url("users/groupes"), "Auteurs", 30);
+      $env->set_link("users/albums", $env->url("users/albums"), "Albums", 31);
+      $env->set_link("users/morceaux", $env->url("users/morceaux"), "Morceaux", 32);
+      $env->set_link("users/pistes", $env->url("users/pistes"), "Sources", 33);
+
+      $env->set_link("menu_top/groupes", $env->url("sources/groupe"), "Auteurs", 10);
+      $env->set_link("menu_top/albums", $env->url("sources/album"), "Albums", 11);
+      $env->set_link("menu_top/morceaux", $env->url("sources/morceau"), "Morceaux", 12);
+      $env->set_link("menu_top/pistes", $env->url("sources/piste"), "Sources", 13);
+
+      return true;
+    }
+
+    function enable($env){
+      return true;
+    }
+
+    function disable($env){
+      return true;
+    }
+
+    // ---------------------------------------------------------------------------------
+    //                                                                           install
+    //
+
+    function install($env){
+      if(
+            $env->bdd("sgbd") == "mysql"
+        ||  $env->bdd("sgbd") == "pdo_mysql"
+      ) return $this->install_mysql($env);
+      return false;
+    }
+
+    function install_mysql($env){
+      $data = $env->data();
+      $sgbd = $data->sgbd();
+      try{
+        $EXISTS =
+            $sgbd->table_exists("#--sml_authors")
+        ||  $sgbd->table_exists("#--sml_classes")
+        ||  $sgbd->table_exists("#--sml_licences")
+        ||  $sgbd->table_exists("#--sml_sources")
+        ||  $sgbd->table_exists("#--sml_sources_access")
+        ||  $sgbd->table_exists("#--sml_sources_authors")
+        ||  $sgbd->table_exists("#--sml_sources_infos")
+        ||  $sgbd->table_exists("#--sml_source_cache")
+        ||  $sgbd->table_exists("#--sml_source_compositions")
+        ||  $sgbd->table_exists("#--sml_source_derivations")
+        ||  $sgbd->table_exists("#--sml_source_documents");
+      }
+      catch(Exception $e){
+        return "impossible de savoir si les tables existent deja";
+      }
+      if($EXISTS){
+        return "des tables existent deja en base. installation annulee";
+      }
+      try{
+        $sql =
+         "SET SQL_MODE=\"NO_AUTO_VALUE_ON_ZERO\"";
+        $sgbd->query($sql);
+
+        $sql =
+         "CREATE TABLE `#--sml_authors`("
+        ."  `id` int(11) NOT NULL AUTO_INCREMENT,"
+        ."  `id_user` int(11) NOT NULL,"
+        ."  `nom` varchar(255) NOT NULL,"
+        ."  `image` varchar(255) DEFAULT NULL,"
+        ."  `description` text,"
+        ."  `email` varchar(255) NOT NULL,"
+        ."  `contact_form` tinyint(4) NOT NULL,"
+        ."  `captcha` tinyint(4) NOT NULL,"
+        ."  PRIMARY KEY (`id`),"
+        ."  KEY `id_user` (`id_user`)"
+        .") DEFAULT CHARSET=utf8 AUTO_INCREMENT=1";
+        $sgbd->query($sql);
+
+        $sql =
+         "CREATE TABLE `#--sml_classes`("
+        ."  `id` int(11) NOT NULL AUTO_INCREMENT,"
+        ."  `nom` varchar(255) NOT NULL,"
+        ."  PRIMARY KEY (`id`)"
+        .") DEFAULT CHARSET=utf8 AUTO_INCREMENT=1";
+        $sgbd->query($sql);
+
+        $sql =
+         "CREATE TABLE `#--sml_licences`("
+        ."  `id` int(11) NOT NULL AUTO_INCREMENT,"
+        ."  `nom` varchar(255) NOT NULL,"
+        ."  `url` varchar(255) NOT NULL,"
+        ."  PRIMARY KEY (`id`)"
+        .") DEFAULT CHARSET=utf8 AUTO_INCREMENT=1";
+        $sgbd->query($sql);
+
+        $sql =
+         "CREATE TABLE `#--sml_sources`("
+        ."  `id` int(11) NOT NULL AUTO_INCREMENT,"
+        ."  `id_class` int(11) NOT NULL,"
+        ."  `reference` varchar(255) DEFAULT NULL,"
+        ."  `titre` varchar(255) DEFAULT NULL,"
+        ."  `licence` int(11) DEFAULT NULL,"
+        ."  `date_creation` date DEFAULT NULL,"
+        ."  `date_inscription` datetime NOT NULL,"
+        ."  PRIMARY KEY (`id`),"
+        ."  KEY `id_class` (`id_class`),"
+        ."  KEY `licence` (`licence`)"
+        .") DEFAULT CHARSET=utf8 AUTO_INCREMENT=1";
+        $sgbd->query($sql);
+
+        $sql =
+         "CREATE TABLE `#--sml_sources_access`("
+        ."  `id` int(11) NOT NULL AUTO_INCREMENT,"
+        ."  `nom` varchar(255) NOT NULL,"
+        ."  `intitule` varchar(255) NOT NULL,"
+        ."  PRIMARY KEY (`id`)"
+        .") DEFAULT CHARSET=utf8 AUTO_INCREMENT=1";
+        $sgbd->query($sql);
+
+        $sql =
+         "CREATE TABLE `#--sml_sources_authors`("
+        ."  `id` int(11) NOT NULL AUTO_INCREMENT,"
+        ."  `id_source` int(11) NOT NULL,"
+        ."  `id_author` int(11) NOT NULL,"
+        ."  `id_sources_access` int(11) NOT NULL,"
+        ."  PRIMARY KEY (`id`),"
+        ."  KEY `id_object` (`id_source`),"
+        ."  KEY `id_author` (`id_author`),"
+        ."  KEY `id_sources_access` (`id_sources_access`)"
+        .") DEFAULT CHARSET=utf8 AUTO_INCREMENT=1";
+        $sgbd->query($sql);
+
+        $sql =
+         "CREATE TABLE `#--sml_sources_infos`("
+        ."  `id` int(11) NOT NULL AUTO_INCREMENT,"
+        ."  `id_source` int(11) NOT NULL,"
+        ."  `key` varchar(255) NOT NULL,"
+        ."  `value` text NOT NULL,"
+        ."  PRIMARY KEY (`id`),"
+        ."  KEY `id_source` (`id_source`)"
+        .") DEFAULT CHARSET=utf8 AUTO_INCREMENT=1";
+        $sgbd->query($sql);
+
+        $sql =
+         "CREATE TABLE `#--sml_source_cache`("
+        ."  `id` int(11) NOT NULL AUTO_INCREMENT,"
+        ."  `url` varchar(255) NOT NULL,"
+        ."  `id_source` int(11) NOT NULL,"
+        ."  `last_update` datetime NOT NULL,"
+        ."  PRIMARY KEY (`id`)"
+        .") DEFAULT CHARSET=utf8 AUTO_INCREMENT=1";
+        $sgbd->query($sql);
+
+        $sql =
+         "CREATE TABLE `#--sml_source_compositions`("
+        ."  `id` int(11) NOT NULL AUTO_INCREMENT,"
+        ."  `id_source` int(11) NOT NULL,"
+        ."  `id_composition` int(11) NOT NULL,"
+        ."  PRIMARY KEY (`id`),"
+        ."  KEY `id_source` (`id_source`),"
+        ."  KEY `id_composition` (`id_composition`)"
+        .") DEFAULT CHARSET=utf8 AUTO_INCREMENT=1";
+        $sgbd->query($sql);
+
+        $sql =
+         "CREATE TABLE `#--sml_source_derivations`("
+        ."  `id` int(11) NOT NULL AUTO_INCREMENT,"
+        ."  `id_source` int(11) NOT NULL,"
+        ."  `derivation` varchar(255) NOT NULL,"
+        ."  PRIMARY KEY (`id`),"
+        ."  KEY `derivation` (`derivation`)"
+        .") DEFAULT CHARSET=utf8 AUTO_INCREMENT=1";
+        $sgbd->query($sql);
+
+        $sql =
+         "CREATE TABLE `#--sml_source_documents`("
+        ."  `id` int(11) NOT NULL AUTO_INCREMENT,"
+        ."  `id_source` int(11) NOT NULL,"
+        ."  `nom` varchar(255) NOT NULL,"
+        ."  `url` varchar(255) NOT NULL,"
+        ."  PRIMARY KEY (`id`),"
+        ."  KEY `id_source` (`id_source`)"
+        .") DEFAULT CHARSET=utf8 AUTO_INCREMENT=1";
+        $sgbd->query($sql);
+
+      }
+      catch(Exception $e){
+        return "imposible de creer les tables en base";
+      }
+      try{
+        $sql =
+         "INSERT INTO `#--sml_licences` (`id`, `nom`, `url`) VALUES"
+        ."(1, 'Creative commons by-sa 2.0', 'http://creativecommons.org/licenses/by-sa/2.0/deed.fr'),"
+        ."(2, 'Creative Commons by-nc-nd 2.5', 'http://creativecommons.org/licenses/by-nc-nd/2.5/'),"
+        ."(3, 'Creative Commons by-nc-sa 2.5', 'http://creativecommons.org/licenses/by-nc-sa/2.5/'),"
+        ."(4, 'Creative Commons by-nc 2.5', 'http://creativecommons.org/licenses/by-nc/2.5/'),"
+        ."(5, 'Creative Commons by-nd 2.5', 'http://creativecommons.org/licenses/by-nd/2.5/'),"
+        ."(6, 'Creative Commons by-sa 2.5', 'http://creativecommons.org/licenses/by-sa/2.5/'),"
+        ."(7, 'Creative Commons by 2.5', 'http://creativecommons.org/licenses/by/2.5/'),"
+        ."(8, 'Licence Art Libre', 'http://artlibre.org/licence/lal/'),"
+        ."(9, 'Licence C Reaction', 'http://morne.free.fr/Necktar7/creactionfr.htm'),"
+        ."(10, 'Yellow OpenMusic License', 'http://openmusic.linuxtag.org/yellow.html'),"
+        ."(11, 'Green OpenMusic License', 'http://openmusic.linuxtag.org/green.html')";
+        $sgbd->query($sql);
+
+        $sql =
+         "INSERT INTO `#--sml_classes` (`id`, `nom`) VALUES"
+        ."(1, 'album'),"
+        ."(2, 'morceau'),"
+        ."(3, 'piste')";
+        $sgbd->query($sql);
+
+        $sql =
+         "INSERT INTO `mw_sml_sources_access` (`id`, `nom`, `intitule`) VALUES"\r
+        ."(1, 'admin', 'administrateur'),"\r
+        ."(2, 'editeur', 'éditeur'),"\r
+        ."(3, 'contributeur', 'contributeur')";
+        $sgbd->query($sql);
+
+      }
+      catch(Exception $e){
+        return "les tables ont ete ajoutees en base mais impossible d'y enregistrer les valeurs par defaut.";
+      }
+      return true;
+    }
+
+    // ---------------------------------------------------------------------------------
+    //                                                                         uninstall
+    //
+
+    function uninstall($env){
+      if(
+            $env->bdd("sgbd") == "mysql"
+        ||  $env->bdd("sgbd") == "pdo_mysql"
+      ) return $this->uninstall_mysql($env);
+      return false;
+    }
+
+    function uninstall_mysql($env){
+      $data = $env->data();
+      $sgbd = $data->sgbd();
+      if(!$this->disable($env)) return "impossible de desactiver le plugin";
+      try{
+        $sgbd->query("DROP TABLE #--sml_authors");
+      }
+      catch(Exception $e){
+        return "impossible de supprimer la table #--sml_authors";
+      }
+      try{
+        $sgbd->query("DROP TABLE #--sml_classes");
+      }
+      catch(Exception $e){
+        return "impossible de supprimer la table #--sml_classes";
+      }
+      try{
+        $sgbd->query("DROP TABLE #--sml_licences");
+      }
+      catch(Exception $e){
+        return "impossible de supprimer la table #--sml_licences";
+      }
+      try{
+        $sgbd->query("DROP TABLE #--sml_sources");
+      }
+      catch(Exception $e){
+        return "impossible de supprimer la table #--sml_sources";
+      }
+      try{
+        $sgbd->query("DROP TABLE #--sml_sources_access");
+      }
+      catch(Exception $e){
+        return "impossible de supprimer la table #--sml_sources_access";
+      }
+      try{
+        $sgbd->query("DROP TABLE #--sml_sources_authors");
+      }
+      catch(Exception $e){
+        return "impossible de supprimer la table #--sml_sources_authors";
+      }
+      try{
+        $sgbd->query("DROP TABLE #--sml_sources_infos");
+      }
+      catch(Exception $e){
+        return "impossible de supprimer la table #--sml_sources_infos";
+      }
+      try{
+        $sgbd->query("DROP TABLE #--sml_source_cache");
+      }
+      catch(Exception $e){
+        return "impossible de supprimer la table #--sml_source_cache";
+      }
+      try{
+        $sgbd->query("DROP TABLE #--sml_source_compositions");
+      }
+      catch(Exception $e){
+        return "impossible de supprimer la table #--sml_source_compositions";
+      }
+      try{
+        $sgbd->query("DROP TABLE #--sml_source_derivations");
+      }
+      catch(Exception $e){
+        return "impossible de supprimer la table #--sml_source_derivations";
+      }
+      try{
+        $sgbd->query("DROP TABLE #--sml_source_documents");
+      }
+      catch(Exception $e){
+        return "impossible de supprimer la table #--sml_source_documents";
+      }
+      return true;
+    }
+
+  }
+
+?>
\ No newline at end of file